forked from freeCodeCamp/devdocs
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdoc.coffee
More file actions
147 lines (117 loc) · 3.18 KB
/
Copy pathdoc.coffee
File metadata and controls
147 lines (117 loc) · 3.18 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
class app.models.Doc extends app.Model
# Attributes: name, slug, type, version, release, db_size, mtime, links
constructor: ->
super
@reset @
@slug_without_version = @slug.split('~')[0]
@fullName = "#{@name}" + if @version then " #{@version}" else ''
@icon = @slug_without_version
@short_version = @version.split(' ')[0] if @version
@text = @toEntry().text
reset: (data) ->
@resetEntries data.entries
@resetTypes data.types
return
resetEntries: (entries) ->
@entries = new app.collections.Entries(entries)
@entries.each (entry) => entry.doc = @
return
resetTypes: (types) ->
@types = new app.collections.Types(types)
@types.each (type) => type.doc = @
return
fullPath: (path = '') ->
path = "/#{path}" unless path[0] is '/'
"/#{@slug}#{path}"
fileUrl: (path) ->
"#{app.config.docs_origin}#{@fullPath(path)}?#{@mtime}"
dbUrl: ->
"#{app.config.docs_origin}/#{@slug}/#{app.config.db_filename}?#{@mtime}"
indexUrl: ->
"#{app.indexHost()}/#{@slug}/#{app.config.index_filename}?#{@mtime}"
toEntry: ->
return @entry if @entry
@entry = new app.models.Entry
doc: @
name: @fullName
path: 'index'
@entry.addAlias(@name) if @version
@entry
findEntryByPathAndHash: (path, hash) ->
if hash and entry = @entries.findBy 'path', "#{path}##{hash}"
entry
else if path is 'index'
@toEntry()
else
@entries.findBy 'path', path
load: (onSuccess, onError, options = {}) ->
return if options.readCache and @_loadFromCache(onSuccess)
callback = (data) =>
@reset data
onSuccess()
@_setCache data if options.writeCache
return
ajax
url: @indexUrl()
success: callback
error: onError
clearCache: ->
app.localStorage.del @slug
return
_loadFromCache: (onSuccess) ->
return unless data = @_getCache()
callback = =>
@reset data
onSuccess()
return
setTimeout callback, 0
true
_getCache: ->
return unless data = app.localStorage.get @slug
if data[0] is @mtime
return data[1]
else
@clearCache()
return
_setCache: (data) ->
app.localStorage.set @slug, [@mtime, data]
return
install: (onSuccess, onError, onProgress) ->
return if @installing
@installing = true
error = =>
@installing = null
onError()
return
success = (data) =>
@installing = null
app.db.store @, data, onSuccess, error
return
ajax
url: @dbUrl()
success: success
error: error
progress: onProgress
timeout: 3600
return
uninstall: (onSuccess, onError) ->
return if @installing
@installing = true
success = =>
@installing = null
onSuccess()
return
error = =>
@installing = null
onError()
return
app.db.unstore @, success, error
return
getInstallStatus: (callback) ->
app.db.version @, (value) ->
callback installed: !!value, mtime: value
return
isOutdated: (status) ->
return false if not status
isInstalled = status.installed or app.settings.get('autoInstall')
isInstalled and @mtime isnt status.mtime