docurium 0.2.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 71812ecb30297e3f3daff81995d8b13c54649865
4
- data.tar.gz: cd1dfe89589e3db6b00ef97abb5aa9da622e42cc
3
+ metadata.gz: 8ff36a5dfaa610fcbfda3a707dfb7c6e94cc6730
4
+ data.tar.gz: 9cea6cf8f7717f47466332302614fb4c16d399d4
5
5
  SHA512:
6
- metadata.gz: eaa4734cffba5765d08f3d4fbdfebb22398664b7f9b8a5e0fb4ee988ef81b8f2576b9776a06210c4ccb43a1b0a1177c2fec1f52bf53c05f0774047440b50b6fe
7
- data.tar.gz: 05ebf8712479b3c8f7fa87d6d52bb3df9bdff1e062010dd4292ffad5f08c0fcef7c2373df87ba32460ad03411af5273cd95ee77a0340ff9fc31c0f62b23ab3be
6
+ metadata.gz: e168acd3e40157a48634b4482b4675cf91b7e88e51776b9d10801086be68fb2287cfa9ee10cf805fcdb6143fc112ac413599f66e18986f6ff6e6064e0043c199
7
+ data.tar.gz: 0c979249a408c30c10f11bf78f6a18bedbc02ee5d3164ea9aec056f576faf6d37eddfde9e16c82c6e93adf9a9f81cd19eab4c386f09d4485f5c208cfee7895b2
data/README.md CHANGED
@@ -29,7 +29,10 @@ Run the `cm` binary and pass it your Docurium config file.
29
29
  git_index_get
30
30
  git_repository_path
31
31
  git_tree_entry_byindex
32
- * output html in docs/
32
+ * writing to branch gh-pages
33
+ wrote tree 87f0f3cb1622b9dc3d6d5d39106e863608b3b504
34
+ wrote commit 5cee46f4d491e9611abab218604db893b70202f3
35
+ updated gh-pages
33
36
 
34
37
  Docurium will tell you if you have unmatched @params entries in header docs and if you've changed signatures in functions in HEAD, just to help you know what's happening and if you've written your docs properly.
35
38
 
@@ -48,7 +51,7 @@ The Docurium config file looks like this:
48
51
  }
49
52
  }
50
53
 
51
- You can either have a `branch` or an `output` entry - `branch` will write your docs directly into a Git branch, `output` will write them to a subdirectory.
54
+ Docurium will write your docs directly into the specified Git branch.
52
55
 
53
56
  # Installing
54
57
 
data/docurium.gemspec CHANGED
@@ -11,8 +11,7 @@ Gem::Specification.new do |s|
11
11
  s.homepage = "https://github.com/libgit2/docurium"
12
12
  s.summary = "A simpler, prettier Doxygen replacement."
13
13
  s.description = s.summary
14
-
15
- s.rubyforge_project = 'docurium'
14
+ s.license = 'MIT'
16
15
 
17
16
  s.add_dependency "version_sorter", "~>1.1.0"
18
17
  s.add_dependency "mustache", ">= 0.99.4"
@@ -1,3 +1,3 @@
1
1
  class Docurium
2
- Version = VERSION = '0.2.2'
2
+ Version = VERSION = '0.3.0'
3
3
  end
data/site/css/style.css CHANGED
@@ -71,6 +71,11 @@ div.sidebar-shell {
71
71
  div.sidebar-module {
72
72
  width: 232px;
73
73
  }
74
+
75
+ .hidden {
76
+ display: none;
77
+ }
78
+
74
79
  .content {
75
80
  width: 660px;
76
81
  }
data/site/index.html CHANGED
@@ -1,5 +1,5 @@
1
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
2
- <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
1
+ <!DOCTYPE html>
2
+ <html>
3
3
  <head>
4
4
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
5
5
  <title>API Documentation</title>
@@ -12,9 +12,256 @@
12
12
  <script src="js/underscore.js" type="text/javascript"></script>
13
13
  <script src="js/backbone.js" type="text/javascript"></script>
14
14
  <script src="js/docurium.js" type="text/javascript"></script>
15
+
16
+ <!-- Changelog -->
17
+ <script type="text/template" id="changelog-item-template">
18
+ <p>
19
+ <ul>
20
+ <% _.each(dels, function(elem) { %>
21
+ <li class="deletes"><%= elem %></li>
22
+ <% }) %>
23
+ </ul>
24
+ </p>
25
+ <p>
26
+ <ul>
27
+ <% _.each(adds, function(elem) { %>
28
+ <li class="adds"><a href="#<%= elem.link %>"><%= elem.text %></a></li>
29
+ <% }) %>
30
+ </ul>
31
+ </p>
32
+ </script>
33
+
34
+ <script type="text/template" id="changelog-template">
35
+ <h1>Function Changelog</h1>
36
+ <% _.each(versions, function(version) { %>
37
+ <h3><%= version.title %></h3>
38
+ <div class="changelog">
39
+ <%= version.listing %>
40
+ </div>
41
+ <% }) %>
42
+ </script>
43
+
44
+ <!-- Version picker -->
45
+ <script type="text/template" id="version-picker-template">
46
+ <% _.each(versions, function(version) { %>
47
+ <li><a href="#<%= version %>"><%= version %></a></li>
48
+ <% }) %>
49
+ <li><a href="#p/changelog">Changelog</a></li>
50
+ </script>
51
+
15
52
  </head>
16
53
 
17
54
  <body class="documentation">
55
+
56
+ <!-- Sidebar where the groups and types appear -->
57
+ <script type="text/template" id="type-list-template">
58
+ <li>
59
+ <li><span class="divide"><%= title %></span></li>
60
+ <% _.each(elements, function(e) { %>
61
+ <li>
62
+ <a href="#<%= e.link %>" ref="<%= e.ref %>" class="type", id="typeItem<%= e.name %>">
63
+ <%= e.name %>
64
+ </a>
65
+ </li>
66
+ <% }) %>
67
+ </li>
68
+ </script>
69
+ <script type="text/template" id="file-list-template">
70
+ <li>
71
+ <h3><a href="#">Functions</a></h3>
72
+ <ul>
73
+ <% _.each(funs, function(fun, i) { %>
74
+ <li>
75
+ <a href="#<%= fun.link %>" ref="<%= i %>" class="group" id="groupItem<%= fun.name %>">
76
+ <%= fun.name %>&nbsp;<small>(<%= fun.num %>)</small>
77
+ </a>
78
+ </li>
79
+ <% }) %>
80
+ </ul>
81
+ </li>
82
+ <li>
83
+ <h3><a href="#">Types</a></h3>
84
+ <ul class="hidden" id="types-list" />
85
+ </li>
86
+ <li>
87
+ <h3><a href="#">Files</a></h3>
88
+ <ul class="hidden">
89
+ <% _.each(files, function(file) { %>
90
+ <li>
91
+ <a target="github" href="<%= file.url %>"><%= file.name %></a>
92
+ </li>
93
+ <% }) %>
94
+ </ul>
95
+ </li>
96
+ <li>
97
+ <h3><a href="#">Examples</a></h3>
98
+ <ul>
99
+ <% _.each(examples, function(example) { %>
100
+ <li>
101
+ <a href="<%= example.path %>"><%= example.name %></a>
102
+ </li>
103
+ <% }) %>
104
+ </ul>
105
+ </li>
106
+ </script>
107
+
108
+ <!-- Listing of the details of a single function -->
109
+ <script type="text/template" id="function-args-template">
110
+ <table class="funcTable">
111
+ <% _.each(args, function(arg) { %>
112
+ <tr>
113
+ <td valign="top" nowrap="true"><%= arg.link %></td>
114
+ <td valign="top" class="var"><%= arg.name %></td>
115
+ <td class="comment"><%= arg.comment %></td>
116
+ </tr>
117
+ <% }) %>
118
+ </table>
119
+ </script>
120
+ <script type="text/template" id="function-template">
121
+ <h1 class="funcTitle"><%= name %></h1>
122
+ <h3 class="funcDesc"><%= data.description %></h3>
123
+ <!-- The args table -->
124
+ <%= argsTemplate({args: args}) %>
125
+ <div class="returns">
126
+ <h3>returns</h3>
127
+ <table class="funcTable">
128
+ <tr>
129
+ <td valign="top"><%= returns.link %></td>
130
+ <td class="comment"><%= returns.comment %></td>
131
+ </tr>
132
+ </table>
133
+ </div>
134
+ <div><%= data.comments %></div>
135
+ <!-- function signature -->
136
+ <div class="example">
137
+ <h3>signature</h3>
138
+ <code class="params"><%= sig %></code>
139
+ </div>
140
+ <!-- function history -->
141
+ <div class="signatures">
142
+ <h3>versions</h3>
143
+ <ul>
144
+ <% _.each(sigs, function(sig) { %>
145
+ <li><a href="<%= sig.url %>" class="<%= sig.klass %>"><%= sig.name %></a></li>
146
+ <% }) %>
147
+ </ul>
148
+ </div>
149
+ <div class="fileLink">Defined in: <a href="<%= fileLink %>"> <%= data.file %></a></div>
150
+ <% if (data.examples) { %>
151
+ <div class="funcEx">Used in examples:
152
+ <ul>
153
+ <% _.each(data.examples, function(uses, filename) { %>
154
+ <li>
155
+ <strong><%= filename %></strong>
156
+ <% _.each(uses, function(use, i) { %>
157
+ <a href="<%= use %>">[<%= i + 1 %>]</a>
158
+ <% }) %> <!-- loop over the uses -->
159
+ </li>
160
+ <% }) %> <!-- loop over the files -->
161
+ </ul>
162
+ </div>
163
+ <% } %> <!-- if we have examples -->
164
+ <div class="also">
165
+ Also in <a href="<%= alsoGroup %>"><%= groupName %></a> group: <br/>
166
+ <% _.each(_.initial(alsoLinks), function(link) { %>
167
+ <a href="<%= link.url %>"><%= link.name %></a>,
168
+ <% }) %>
169
+ <% var link = _.last(alsoLinks) %>
170
+ <a href="<%= link.url %>"><%= link.name %></a>
171
+ </div>
172
+ </script>
173
+
174
+ <!-- main page, list of groups and their functions -->
175
+ <script type="text/template" id="index-template">
176
+ <h1>Public API Functions</h1>
177
+ <% _.each(groups, function(group) { %>
178
+ <h2 class="funcGroup"><%= group.name %></h2>
179
+ <p class="functionList">
180
+ <% _.each(_.initial(group.funs), function(fun) { %>
181
+ <a href="<%= fun.url %>" class="<%= fun.klass %>"><%= fun.name %></a>
182
+ <% }) %> <!-- loop through all but the last function -->
183
+ <% var fun = _.last(group.funs) %>
184
+ <a href="<%= fun.url %>" class="<%= fun.klass %>"><%= fun.name %></a>
185
+ </p>
186
+ <% }) %> <!-- loop through the groups -->
187
+ </script>
188
+
189
+ <!-- listing for a particular type -->
190
+ <script type="text/template" id="type-template">
191
+ <h1 class="funcTitle"><%= tname %><small><%= data.type %></small></h1>
192
+ <p><%= data.value %></p>
193
+ <% if (data.comments) { %>
194
+ <div><%= data.comments %></div>
195
+ <% } %>
196
+ <% if (data.block) { %>
197
+ <pre><%= data.block %></pre>
198
+ <% } %>
199
+ <% if (returns.length > 0) { %>
200
+ <h3>Returns</h3>
201
+ <% _.each(_.initial(returns), function(fun) { %>
202
+ <a href="<%= fun.url %>"><%= fun.name %></a>
203
+ <% }) %> <!-- loop over each 'return' -->
204
+ <% var fun = _.last(returns) %>
205
+ <a href="<%= fun.url %>"><%= fun.name %></a>
206
+ <% } %> <!-- if we have 'returns' -->
207
+
208
+ <% if (needs.length > 0) { %>
209
+ <h3>Argument In</h3>
210
+ <% _.each(_.initial(needs), function(fun) { %>
211
+ <a href="<%= fun.url %>"><%= fun.name %></a>
212
+ <% }) %> <!-- loop over each 'need' -->
213
+ <% var fun = _.last(needs) %>
214
+ <a href="<%= fun.url %>"><%= fun.name %></a>
215
+ <% } %> <!-- if we have 'needs' -->
216
+
217
+ <div class="fileLink">
218
+ Defined in:
219
+ <a href="<%= fileLink.url %>"><%= fileLink.name %></a>
220
+ </div>
221
+ </script>
222
+
223
+ <script type="text/template" id="group-template">
224
+ <h1><%= gname %> functions</h1>
225
+ <!-- table with all the functions -->
226
+ <table class="methods">
227
+ <% _.each(functions, function(fun) { %>
228
+ <tr>
229
+ <td valign="top" nowrap="true">
230
+ <%= fun.returns %>
231
+ </td>
232
+ <td valign="top" class="methodName">
233
+ <a href="<%= fun.url %>"><%= fun.name %></a>
234
+ </td>
235
+ <td>
236
+ <% _.each(fun.args, function(arg) { %>
237
+ <%= arg.type %> <%= arg.name %><br/>
238
+ <% }) %> <!-- loop over the args of a function -->
239
+ </td>
240
+ </tr>
241
+ <% }) %> <!-- loop over the functions -->
242
+ </table>
243
+ <!-- list of the functions with the descriptions -->
244
+ <% _.each(functions, function(fun) { %>
245
+ <h2><a href="<%= fun.url %>"><%= fun.name %></a><small>(<%= fun.argline %>)</small></h2>
246
+ <div class="description">
247
+ <%= fun.description %>
248
+ <%= fun.comments %>
249
+ </div>
250
+ <% }) %> <!-- loop over the functions -->
251
+ </script>
252
+
253
+ <script type="text/template" id="search-template">
254
+ <h1>Search Results</h1>
255
+ <table>
256
+ <% _.each(results, function(result) { %>
257
+ <tr>
258
+ <td><a href="<%= result.url %>"><%= result.name %></a></td>
259
+ <td><%= result.match %></td>
260
+ </tr>
261
+ <% }) %>
262
+ </table>
263
+ </script>
264
+
18
265
  <div id="not-footer">
19
266
  <div id="header-wrapper">
20
267
  <div id="header">
@@ -29,14 +276,14 @@
29
276
 
30
277
  <div id="wrapper">
31
278
 
32
- <div class="content"></div>
279
+ <div id="content" class="content"></div>
33
280
 
34
281
  <div id="js-help-sidebar" class="sidebar-shell">
35
282
  <div class="sidebar-module">
36
283
  <ul class="subgroup" id="versions">
37
284
  <li>
38
285
  <h3 id="version-picker">Version: <span id="version"></span></h3>
39
- <ul id="version-list"></ul>
286
+ <ul id="version-list" class="hidden"></ul>
40
287
  </li>
41
288
  </ul>
42
289
  </div> <!-- /sidebar-module -->
@@ -53,7 +300,7 @@
53
300
  <div id="footer-wrapper">
54
301
  <div id="footer">
55
302
  <div class="left-col">
56
- Powered by <a href="https://github.com/schacon/docurium">Docurium</a><br/>
303
+ Powered by <a href="https://github.com/libgit2/docurium">Docurium</a><br/>
57
304
  Sponsored by GitHub<br/>
58
305
  <br/>
59
306
  </div>
data/site/js/docurium.js CHANGED
@@ -1,618 +1,574 @@
1
1
  $(function() {
2
- // our document model - stores the datastructure generated from docurium
3
- var Docurium = Backbone.Model.extend({
4
-
5
- defaults: {'version': 'unknown'},
6
-
2
+ var FileListModel = Backbone.Model.extend({
7
3
  initialize: function() {
8
- this.loadVersions()
4
+ var docurium = this.get('docurium')
5
+ this.listenTo(docurium, 'change:data', this.extract)
9
6
  },
10
7
 
11
- loadVersions: function() {
12
- $.getJSON("project.json", function(data) {
13
- docurium.set({'versions': data.versions, 'github': data.github, 'signatures': data.signatures, 'name': data.name, 'groups': data.groups})
14
- if(data.name) {
15
- $('#site-title').text(data.name + ' API')
16
- document.title = data.name + ' API'
17
- }
18
- docurium.setVersionPicker()
19
- docurium.setVersion()
20
- })
21
- },
8
+ extract: function() {
9
+ var docurium = this.get('docurium')
10
+ var data = docurium.get('data')
11
+ var version = docurium.get('version')
22
12
 
23
- setVersionPicker: function () {
24
- vers = docurium.get('versions')
25
- $('#version-list').empty().hide()
26
- for(var i in vers) {
27
- version = vers[i]
28
- vlink = $('<a>').attr('href', '#' + version).append(version).click( function() {
29
- $('#version-list').hide(100)
30
- })
31
- $('#version-list').append($('<li>').append(vlink))
32
- }
33
- vlink = $('<a>').attr('href', '#' + 'p/changelog').append("Changelog").click ( function () {
34
- $('#version-list').hide(100)
13
+ // Function groups
14
+ var funs = _.map(data['groups'], function(group, i) {
15
+ var name = group[0]
16
+ var link = groupLink(name, version)
17
+ return {name: name, link: link, num: group[1].length}
35
18
  })
36
- $('#version-list').append($('<li>').append(vlink))
37
- },
38
19
 
39
- setVersion: function (version) {
40
- if(!version) {
41
- version = _.first(docurium.get('versions'))
20
+ // Types
21
+ var getName = function(type) {
22
+ var name = type[0];
23
+ var link = typeLink(name, version);
24
+ return {link: link, name: name};
42
25
  }
43
- if(docurium.get('version') != version) {
44
- docurium.set({'version': version})
45
- $('#site-title').attr('href', '#' + version)
46
- docurium.loadDoc()
26
+
27
+ var enums = _.filter(data['types'], function(type) {
28
+ return type[1]['block'] && type[1]['type'] == 'enum';
29
+ }).map(getName)
30
+
31
+ var structs = _.filter(data['types'], function(type) {
32
+ return type[1]['block'] && type[1]['type'] != 'enum'
33
+ }).map(getName)
34
+
35
+ var opaques = _.filter(data['types'], function(type) {
36
+ return !type[1]['block']
37
+ }).map(getName)
38
+
39
+ // File Listing
40
+ var files = _.map(data['files'], function(file) {
41
+ var url = this.github_file(file['file'])
42
+ return {url: url, name: file['file']}
43
+ }, docurium)
44
+
45
+ // Examples List
46
+ var examples = []
47
+ if(data['examples'] && (data['examples'].length > 0)) {
48
+ examples = _.map(data['examples'], function(file) {
49
+ return {name: file[0], path: file[1]}
50
+ })
47
51
  }
52
+
53
+ this.set('data', {funs: funs, enums: enums, structs: structs, opaques: opaques,
54
+ files: files, examples: examples})
48
55
  },
56
+ })
49
57
 
50
- loadDoc: function() {
51
- version = this.get('version')
52
- $.ajax({
53
- url: version + '.json',
54
- context: this,
55
- dataType: 'json',
56
- success: function(data){
57
- this.set({'data': data})
58
- Backbone.history.start()
59
- }
60
- })
58
+ var FileListView = Backbone.View.extend({
59
+ el: $('#files-list'),
60
+
61
+ template: _.template($('#file-list-template').html()),
62
+
63
+ typeTemplate: _.template($('#type-list-template').html()),
64
+
65
+ events: {
66
+ 'click h3': 'toggleList',
61
67
  },
62
68
 
63
- collapseSection: function(data) {
64
- $(this).next().toggle(100)
69
+ toggleList: function(e) {
70
+ $(e.currentTarget).next().toggle(100)
65
71
  return false
66
72
  },
67
73
 
68
- showIndexPage: function(replace) {
69
- version = docurium.get('version')
70
- ws.navigate(version, {replace: replace})
71
-
72
- data = docurium.get('data')
73
- content = $('.content')
74
- content.empty()
75
-
76
- content.append($('<h1>').append("Public API Functions"))
77
-
78
- sigHist = docurium.get('signatures')
79
-
80
- // Function Groups
81
- for (var i in data['groups']) {
82
- group = data['groups'][i]
83
- content.append($('<h2>').addClass('funcGroup').append(group[0]))
84
- list = $('<p>').addClass('functionList')
85
- for(var j in group[1]) {
86
- fun = group[1][j]
87
- link = $('<a>').attr('href', '#' + groupLink(group[0], fun)).append(fun)
88
- if(sigHist[fun].changes[version]) {
89
- link.addClass('changed')
90
- }
91
- if(version == _.first(sigHist[fun].exists)) {
92
- link.addClass('introd')
93
- }
94
- list.append(link)
95
- if(j < group[1].length - 1) {
96
- list.append(', ')
97
- }
98
- }
99
- content.append(list)
100
- }
74
+ initialize: function() {
75
+ this.listenTo(this.model, 'change:data', this.render)
101
76
  },
102
77
 
103
- getGroup: function(gname) {
104
- var groups = docurium.get('data')['groups']
105
- for(var i in groups) {
106
- if(groups[i][0] == gname) {
107
- return groups[i]
108
- }
109
- }
78
+ render: function() {
79
+ var data = this.model.get('data')
80
+
81
+ var enumList = this.typeTemplate({title: 'Enums', elements: data.enums})
82
+ var structList = this.typeTemplate({title: 'Structs', elements: data.structs})
83
+ var opaquesList = this.typeTemplate({title: 'Opaque Structs', elements: data.opaques})
84
+ var menu = $(this.template({funs: data.funs, files: data.files, examples: data.examples}))
85
+
86
+ $('#types-list', menu).append(enumList, structList, opaquesList)
87
+
88
+ this.$el.html(menu)
89
+ return this
110
90
  },
91
+ })
111
92
 
112
- showFun: function(gname, fname) {
113
- group = docurium.getGroup(gname)
93
+ var VersionView = Backbone.View.extend({
94
+ el: $('#version'),
114
95
 
115
- fdata = docurium.get('data')['functions']
116
- gname = group[0]
117
- functions = group[1]
96
+ initialize: function() {
97
+ this.listenTo(this.model, 'change:version', this.render)
98
+ this.listenTo(this.model, 'change:name', this.renderName)
99
+ this.title = $('#site-title')
100
+ },
118
101
 
119
- document.body.scrollTop = document.documentElement.scrollTop = 0;
120
- content = $('.content')
121
- content.empty()
102
+ render: function() {
103
+ var version = this.model.get('version')
104
+ this.$el.text(version)
105
+ this.title.attr('href', '#' + version)
106
+ return this
107
+ },
122
108
 
123
- // Show Function Name
124
- content.append($('<h1>').addClass('funcTitle').append(fname))
125
- if(fdata[fname]['description']) {
126
- sub = content.append($('<h3>').addClass('funcDesc').append( ' ' + fdata[fname]['description'] ))
127
- }
109
+ renderName: function() {
110
+ var name = this.model.get('name')
111
+ var title = name + ' API'
112
+ this.title.text(title)
113
+ document.title = title
114
+ return this
115
+ },
116
+ })
128
117
 
129
- // Show Function Arguments
130
- argtable = $('<table>').addClass('funcTable')
131
- args = fdata[fname]['args']
132
- for(var i=0; i<args.length; i++) {
133
- arg = args[i]
134
- row = $('<tr>')
135
- row.append($('<td>').attr('valign', 'top').attr('nowrap', true).append(this.hotLink(arg.type)))
136
- row.append($('<td>').attr('valign', 'top').addClass('var').append(arg.name))
137
- row.append($('<td>').addClass('comment').append(arg.comment))
138
- argtable.append(row)
139
- }
140
- content.append(argtable)
141
-
142
- // Show Function Return Value
143
- retdiv = $('<div>').addClass('returns')
144
- retdiv.append($('<h3>').append("returns"))
145
- rettable = $('<table>').addClass('funcTable')
146
- retrow = $('<tr>')
147
- rettable.append(retrow)
148
- retdiv.append(rettable)
149
-
150
- ret = fdata[fname]['return']
151
- retrow.append($('<td>').attr('valign', 'top').append(this.hotLink(ret.type)))
152
- if(ret.comment) {
153
- retrow.append($('<td>').addClass('comment').append(ret.comment))
154
- }
155
- content.append(retdiv)
156
-
157
- // Show Non-Parsed Function Comments
158
- if (fdata[fname]['comments'])
159
- content.append($('<div>').append(fdata[fname]['comments']))
160
-
161
- // Show Function Signature
162
- ex = $('<code>').addClass('params')
163
- ex.append(this.hotLink(fdata[fname]['return']['type'] + ' ' + fname + '(' + fdata[fname]['argline'] + ');'))
164
- example = $('<div>').addClass('example')
165
- example.append($('<h3>').append("signature"))
166
- example.append(ex)
167
- content.append(example)
168
-
169
- // Show Function History
170
- sigs = $('<div>').addClass('signatures')
171
- sigs.append($('<h3>').append("versions"))
172
- sigHist = docurium.get('signatures')[fname]
173
- var list = $('<ul>')
174
- for(var i in sigHist.exists) {
175
- ver = sigHist.exists[i]
176
- link = $('<a>').attr('href', '#' + groupLink(gname, fname, ver)).append(ver)
177
- if(sigHist.changes[ver]) {
178
- link.addClass('changed')
179
- }
180
- if(ver == docurium.get('version')) {
181
- link.addClass('current')
182
- }
183
- list.append($('<li>').append(link))
184
- }
185
- sigs.append(list)
186
- content.append(sigs)
187
-
188
- // Link to Function Def on GitHub
189
- link = this.github_file(fdata[fname].file, fdata[fname].line, fdata[fname].lineto)
190
- flink = $('<a>').attr('target', 'github').attr('href', link).append(fdata[fname].file)
191
- content.append($('<div>').addClass('fileLink').append("Defined in: ").append(flink))
192
-
193
- // Show where this is used in the examples
194
- if(ex = fdata[fname].examples) {
195
- also = $('<div>').addClass('funcEx')
196
- also.append("Used in examples: ")
197
- for( fname in ex ) {
198
- lines = ex[fname]
199
- line = $('<li>')
200
- line.append($('<strong>').append(fname))
201
- for( var i in lines ) {
202
- flink = $('<a>').attr('href', lines[i]).append(' [' + (parseInt(i) + 1) + '] ')
203
- line.append(flink)
204
- }
205
- also.append(line)
206
- }
207
- content.append(also)
208
- }
118
+ var VersionPickerView = Backbone.View.extend({
119
+ el: $('#versions'),
209
120
 
210
- // Show other functions in this group
211
- also = $('<div>').addClass('also')
212
- flink = $('<a href="#' + docurium.get('version') + '/group/' + group[0] + '">' + group[0] + '</a>')
213
- flink.click( docurium.showGroup )
214
- also.append("Also in ")
215
- also.append(flink)
216
- also.append(" group: <br/>")
217
-
218
- for(i=0; i<functions.length; i++) {
219
- f = functions[i]
220
- d = fdata[f]
221
- link = $('<a>').attr('href', '#' + groupLink(gname, f)).append(f)
222
- also.append(link)
223
- also.append(', ')
224
- }
225
- content.append(also)
121
+ list: $('#version-list'),
226
122
 
123
+ template: _.template($('#version-picker-template').html()),
227
124
 
228
- this.addHotlinks()
125
+ initialize: function() {
126
+ this.listenTo(this.model, 'change:versions', this.render)
229
127
  },
230
128
 
231
- showChangeLog: function() {
232
- content = $('.content')
233
- content.empty()
234
- content.append($('<h1>').append("Function Changelog"))
129
+ events: {
130
+ 'click #version-picker': 'toggleList',
131
+ 'click': 'hideList',
132
+ },
133
+
134
+ hideList: function() {
135
+ this.list.hide(100)
136
+ },
137
+
138
+ toggleList: function(e) {
139
+ $(e.currentTarget).next().toggle(100)
140
+ return false
141
+ },
142
+
143
+ render: function() {
144
+ var vers = this.model.get('versions')
145
+ list = this.template({versions: vers})
146
+ this.list.html(list)
147
+ return this
148
+ },
149
+ })
150
+
151
+ var ChangelogView = Backbone.View.extend({
152
+ template: _.template($('#changelog-template').html()),
153
+
154
+ itemTemplate: _.template($('#changelog-item-template').html()),
155
+
156
+ initialize: function() {
235
157
  // for every version, show which functions added, removed, changed - from HEAD down
236
- versions = docurium.get('versions')
237
- sigHist = docurium.get('signatures')
158
+ var versions = this.model.get('versions')
159
+ var sigHist = this.model.get('signatures')
238
160
 
239
- lastVer = _.first(versions)
161
+ var lastVer = _.first(versions)
240
162
 
241
163
  // fill changelog struct
242
- changelog = {}
164
+ var changelog = {}
243
165
  for(var i in versions) {
244
- version = versions[i]
166
+ var version = versions[i]
245
167
  changelog[version] = {'deletes': [], 'changes': [], 'adds': []}
246
168
  }
247
169
 
248
170
  // figure out the adds, deletes and changes
249
- for(var func in sigHist) {
250
- lastv = _.last(sigHist[func].exists)
251
- firstv = _.first(sigHist[func].exists)
252
- if (func != '__attribute__') {
253
- changelog[firstv]['adds'].push(func)
254
- }
255
- if(lastv && (lastv != lastVer)) {
256
- vi = _.indexOf(versions, lastv)
257
- delv = versions[vi - 1]
258
- changelog[delv]['deletes'].push(func)
259
- }
260
- for(var v in sigHist[func].changes) {
261
- changelog[v]['changes'].push(func)
262
- }
263
- }
171
+ _.forEach(sigHist, function(func, fname) {
172
+ var lastv = _.last(func.exists)
173
+ var firstv = _.first(func.exists)
174
+ changelog[firstv]['adds'].push(fname)
175
+
176
+ // figure out where it was deleted or changed
177
+ if (lastv && (lastv != lastVer)) {
178
+ var vi = _.indexOf(versions,lastv)
179
+ var delv = versions[vi-1]
180
+ changelog[delv]['deletes'].push(fname)
181
+
182
+ _.forEach(func.changes, function(_, v) {
183
+ changelog[v]['changes'].push(fname)
184
+ })
185
+ }
186
+ })
264
187
 
265
- // display the data
266
- for(var i in versions) {
267
- version = versions[i]
268
- content.append($('<h3>').append(version))
269
- cl = $('<div>').addClass('changelog')
270
-
271
- console.log(version)
272
-
273
- for(var type in changelog[version]) {
274
- adds = changelog[version][type]
275
- adds.sort()
276
- addsection = $('<p>')
277
- for(var j in adds) {
278
- add = adds[j]
279
- if(type != 'deletes') {
280
- gname = docurium.groupOf(add)
281
- addlink = $('<a>').attr('href', '#' + groupLink(gname, add, version)).append(add)
282
- } else {
283
- addlink = add
284
- }
285
- addsection.append($('<li>').addClass(type).append(addlink))
286
- }
287
- cl.append(addsection)
288
- }
289
- content.append(cl)
290
- }
188
+ var vers = _.map(versions, function(version) {
189
+ var deletes = changelog[version]['deletes']
190
+ deletes.sort()
191
+
192
+ var additions = changelog[version]['adds']
193
+ additions.sort()
194
+ var adds = _.map(additions, function(add) {
195
+ var gname = this.model.groupOf(add)
196
+ return {link: functionLink(gname, add, version), text: add}
197
+ }, this)
198
+
199
+ return {title: version, listing: this.itemTemplate({dels: deletes, adds: adds})}
200
+ }, this)
201
+
202
+ this.el = this.template({versions: vers})
291
203
  },
292
204
 
293
- showType: function(data, manual) {
294
- if(manual) {
295
- id = '#typeItem' + domSafe(manual)
296
- ref = parseInt($(id).attr('ref'))
297
- } else {
298
- ref = parseInt($(this).attr('ref'))
299
- }
300
- tdata = docurium.get('data')['types'][ref]
301
- tname = tdata[0]
302
- data = tdata[1]
205
+ render: function() {
206
+ return this
207
+ }
208
+ })
209
+
210
+ var FunctionModel = Backbone.Model.extend({
211
+ initialize: function() {
212
+ var gname = this.get('gname')
213
+ var fname = this.get('fname')
214
+ var docurium = this.get('docurium')
215
+
216
+ var group = docurium.getGroup(gname)
217
+
218
+ var fdata = docurium.get('data')['functions']
219
+ var functions = group[1]
220
+
221
+ // Function Arguments
222
+ var args = _.map(fdata[fname]['args'], function(arg) {
223
+ return {link: this.hotLink(arg.type), name: arg.name, comment: arg.comment}
224
+ }, docurium)
225
+
226
+ var data = fdata[fname]
227
+ // function return value
228
+ var ret = data['return']
229
+ var returns = {link: docurium.hotLink(ret.type), comment: ret.comment}
230
+ // function signature
231
+ var sig = docurium.hotLink(ret.type) + ' ' + fname + '(' + data['argline'] + ');'
232
+ // version history
233
+ var sigHist = docurium.get('signatures')[fname]
234
+ var version = docurium.get('version')
235
+ var sigs = _.map(sigHist.exists, function(ver) {
236
+ var klass = []
237
+ if (sigHist.changes[ver])
238
+ klass.push('changed')
239
+ if (ver == version)
240
+ klass.push('current')
241
+
242
+ return {url: '#' + functionLink(gname, fname, ver), name: ver, klass: klass.join(' ')}
243
+ })
244
+ // GitHub link
245
+ var fileLink = docurium.github_file(data.file, data.line, data.lineto)
246
+ // link to the group
247
+ var version = docurium.get('version')
248
+ var alsoGroup = '#' + groupLink(group[0], version)
249
+ var alsoLinks = _.map(functions, function(f) {
250
+ return {url: '#' + functionLink(gname, f, version), name: f}
251
+ })
252
+
253
+ this.set('data', {name: fname, data: data, args: args, returns: returns, sig: sig,
254
+ sigs: sigs, fileLink: fileLink, groupName: gname,
255
+ alsoGroup: alsoGroup, alsoLinks: alsoLinks})
256
+ }
257
+ })
303
258
 
304
- ws.navigate(typeLink(tname))
259
+ var FunctionView = Backbone.View.extend({
260
+ template: _.template($('#function-template').html()),
261
+ argsTemplate: _.template($('#function-args-template').html()),
262
+
263
+ render: function() {
305
264
  document.body.scrollTop = document.documentElement.scrollTop = 0;
265
+ var data = this.model.get('data')
266
+ data.argsTemplate = this.argsTemplate
267
+ var cont = this.template(data)
306
268
 
307
- content = $('.content')
308
- content.empty()
309
- content.append($('<h1>').addClass('funcTitle').append(tname).append($("<small>").append(data.type)))
269
+ this.el = cont
270
+ return this
271
+ },
272
+ })
310
273
 
311
- content.append($('<p>').append(data.value))
274
+ var GroupCollection = Backbone.Collection.extend({
275
+ initialize: function(o) {
276
+ this.docurium = o.docurium
277
+ this.listenTo(this.docurium, 'change:data', this.refill)
278
+ },
312
279
 
313
- if(data.comments) {
314
- content.append($('<div>').append(data.comments))
315
- }
280
+ refill: function(o, doc) {
281
+ var data = o.changed.data
282
+ var sigHist = this.docurium.get('signatures')
283
+ var version = this.docurium.get('version')
316
284
 
317
- if(data.block) {
318
- content.append($('<pre>').append(data.block))
319
- }
285
+ var groups = _.map(data.groups, function(group) {
286
+ var gname = group[0]
287
+ var funs = _.map(group[1], function(fun) {
288
+ var klass = ''
289
+ if (sigHist[fun].changes[version])
290
+ klass = 'changed'
320
291
 
321
- var ret = data.used.returns
322
- if (ret.length > 0) {
323
- content.append($('<h3>').append('Returns'))
324
- }
325
- for(var i=0; i<ret.length; i++) {
326
- gname = docurium.groupOf(ret[i])
327
- flink = $('<a>').attr('href', '#' + groupLink(gname, ret[i])).append(ret[i])
328
- flink.click( docurium.showFun )
329
- content.append(flink)
330
- content.append(', ')
331
- }
292
+ if (version == _.first(sigHist[fun].exists))
293
+ klass = 'introd'
332
294
 
333
- var needs = data.used.needs
334
- if (needs.length > 0) {
335
- content.append($('<h3>').append('Argument In'))
336
- }
337
- for(var i=0; i<needs.length; i++) {
338
- gname = docurium.groupOf(needs[i])
339
- flink = $('<a>').attr('href', '#' + groupLink(gname, needs[i])).append(needs[i])
340
- flink.click( docurium.showFun )
341
- content.append(flink)
342
- content.append(', ')
343
- }
295
+ return {name: fun, url: '#' + functionLink(gname, fun, version), klass: klass}
296
+ })
297
+ return {name: gname, funs: funs}
298
+ })
344
299
 
345
- link = docurium.github_file(data.file, data.line, data.lineto)
346
- flink = $('<a>').attr('target', 'github').attr('href', link).append(data.file)
347
- content.append($('<div>').addClass('fileLink').append("Defined in: ").append(flink))
300
+ this.reset(groups)
301
+ },
302
+ })
348
303
 
349
- return false
304
+ var MainListView = Backbone.View.extend({
305
+ template: _.template($('#index-template').html()),
306
+
307
+ initialize: function() {
308
+ this.listenTo(this.collection, 'reset', this.render)
350
309
  },
351
310
 
352
- showGroup: function(data, manual, flink) {
353
- if(manual) {
354
- id = '#groupItem' + manual
355
- ref = parseInt($(id).attr('ref'))
356
- } else {
357
- ref = parseInt($(this).attr('ref'))
358
- }
359
- group = docurium.get('data')['groups'][ref]
360
- fdata = docurium.get('data')['functions']
361
- gname = group[0]
311
+ render: function() {
312
+ this.el = this.template({groups: this.collection.toJSON()})
313
+ this.trigger('redraw')
314
+ return this
315
+ },
316
+ })
362
317
 
363
- ws.navigate(groupLink(gname));
364
- document.body.scrollTop = document.documentElement.scrollTop = 0;
318
+ var TypeModel = Backbone.Model.extend({
319
+ initialize: function() {
320
+ var typename = this.get('typename')
321
+ var docurium = this.get('docurium')
322
+ var version = docurium.get('version')
323
+ var types = docurium.get('data')['types']
324
+ var tdata = _.find(types, function(g) {
325
+ return g[0] == typename
326
+ })
327
+ var tname = tdata[0]
328
+ var data = tdata[1]
365
329
 
366
- functions = group[1]
367
- $('.content').empty()
368
- $('.content').append($('<h1>').append(gname + ' functions'))
369
-
370
- table = $('<table>').addClass('methods')
371
- for(i=0; i<functions.length; i++) {
372
- f = functions[i]
373
- d = fdata[f]
374
- row = $('<tr>')
375
- row.append($('<td>').attr('nowrap', true).attr('valign', 'top').append(d['return']['type'].substring(0, 20)))
376
- link = $('<a>').attr('href', '#' + groupLink(gname, f)).append(f)
377
- row.append($('<td>').attr('valign', 'top').addClass('methodName').append( link ))
378
- args = d['args']
379
- argtd = $('<td>')
380
- for(j=0; j<args.length; j++) {
381
- argtd.append(args[j].type + ' ' + args[j].name)
382
- argtd.append($('<br>'))
383
- }
384
- row.append(argtd)
385
- table.append(row)
330
+ var toPair = function(fun) {
331
+ var gname = this.groupOf(fun)
332
+ var url = '#' + functionLink(gname, fun, version)
333
+ return {name: fun, url: url}
386
334
  }
387
- $('.content').append(table)
388
-
389
- for(var i=0; i<functions.length; i++) {
390
- f = functions[i]
391
- argsText = '( ' + fdata[f]['argline'] + ' )'
392
- link = $('<a>').attr('href', '#' + groupLink(gname, f)).append(f)
393
- $('.content').append($('<h2>').append(link).append($('<small>').append(argsText)))
394
- description = fdata[f]['description']
395
- if(fdata[f]['comments'])
396
- description += "\n\n" + fdata[f]['comments']
397
-
398
- $('.content').append($('<div>').addClass('description').append(description))
399
- }
400
- return false
335
+
336
+ var returns = _.map(data.used.returns, toPair, docurium)
337
+ var needs = _.map(data.used.needs, toPair, docurium)
338
+ var fileLink = {name: data.file, url: docurium.github_file(data.file, data.line, data.lineto)}
339
+
340
+ this.set('data', {tname: tname, data: data, returns: returns, needs: needs, fileLink: fileLink})
341
+ }
342
+ })
343
+
344
+ var TypeView = Backbone.View.extend({
345
+ template: _.template($('#type-template').html()),
346
+
347
+ render: function() {
348
+ var content = this.template(this.model.get('data'))
349
+ this.el = content
350
+ return this
351
+ }
352
+ })
353
+
354
+ var GroupView = Backbone.View.extend({
355
+ template: _.template($('#group-template').html()),
356
+
357
+ initialize: function(o) {
358
+ var group = o.group
359
+ var gname = group[0]
360
+ var fdata = o.functions
361
+ var version = o.version
362
+
363
+ this.functions = _.map(group[1], function(name) {
364
+ var url = '#' + functionLink(gname, name, version)
365
+ var d = fdata[name]
366
+ return {name: name, url: url, returns: d['return']['type'], argline: d['argline'],
367
+ description: d['description'], comments: d['comments'], args: d['args']}
368
+ })
401
369
  },
402
370
 
403
- // look for structs and link them
404
- hotLink: function(text) {
405
- types = this.get('data')['types']
406
- for(var i=0; i<types.length; i++) {
407
- type = types[i]
408
- typeName = type[0]
409
- typeData = type[1]
410
- re = new RegExp(typeName + ' ', 'gi');
411
- link = '<a ref="' + i.toString() + '" class="typeLink' + domSafe(typeName) + '" href="#">' + typeName + '</a> '
412
- text = text.replace(re, link)
371
+ render: function() {
372
+ var content = this.template({gname: this.gname, functions: this.functions})
373
+
374
+ this.el = content
375
+ return this
376
+ },
377
+ })
378
+
379
+ var SearchFieldView = Backbone.View.extend({
380
+ tagName: 'input',
381
+
382
+ el: $('#search-field'),
383
+
384
+ events: {
385
+ 'keyup': function() {
386
+ this.trigger('keyup')
387
+ if (this.$el.val() == '')
388
+ this.trigger('empty')
413
389
  }
414
- return text
415
390
  },
391
+ })
416
392
 
417
- groupOf: function (func) {
418
- return this.get('groups')[func]
393
+ var SearchCollection = Backbone.Collection.extend({
394
+ defaults: {
395
+ value: '',
419
396
  },
420
397
 
421
- addHotlinks: function() {
422
- types = this.get('data')['types']
423
- for(var i=0; i<types.length; i++) {
424
- type = types[i]
425
- typeName = type[0]
426
- className = '.typeLink' + domSafe(typeName)
427
- $(className).click( this.showType )
428
- }
398
+ initialize: function(o) {
399
+ this.field = o.field
400
+ this.docurium = o.docurium
401
+
402
+ this.listenTo(this.field, 'keyup', this.keyup)
429
403
  },
430
404
 
431
- refreshView: function() {
432
- data = this.get('data')
433
-
434
- // Function Groups
435
- menu = $('<li>')
436
- title = $('<h3><a href="#">Functions</a></h3>').click( this.collapseSection )
437
- menu.append(title)
438
- list = $('<ul>')
439
- _.each(data['groups'], function(group, i) {
440
- flink = $('<a href="#" ref="' + i.toString() + '" id="groupItem' + group[0] + '">' + group[0] + ' &nbsp;<small>(' + group[1].length + ')</small></a>')
441
- flink.click( this.showGroup )
442
- fitem = $('<li>')
443
- fitem.append(flink)
444
- list.append(fitem)
445
- }, this)
446
- menu.append(list)
405
+ keyup: function() {
406
+ var newValue = this.field.$el.val()
407
+ if (this.value == newValue || newValue.length < 3)
408
+ return
447
409
 
448
- // Types
449
- title = $('<h3><a href="#">Types</a></h3>').click( this.collapseSection )
450
- menu.append(title)
451
- list = $('<ul>')
452
-
453
- fitem = $('<li>')
454
- fitem.append($('<span>').addClass('divide').append("Enums"))
455
- list.append(fitem)
456
-
457
- _.each(data['types'], function(group, i) {
458
- if(group[1]['block'] && group[1]['type'] == 'enum') {
459
- flink = $('<a href="#" ref="' + i.toString() + '" id="typeItem' + domSafe(group[0]) + '">' + group[0] + '</a>')
460
- flink.click( this.showType )
461
- fitem = $('<li>')
462
- fitem.append(flink)
463
- list.append(fitem)
410
+ this.value = newValue
411
+ this.refreshSearch()
412
+ },
413
+
414
+ refreshSearch: function() {
415
+ var docurium = this.docurium
416
+ var value = this.value
417
+
418
+ var data = docurium.get('data')
419
+ var searchResults = []
420
+
421
+ var version = docurium.get('version')
422
+ // look for functions (name, comment, argline)
423
+ _.forEach(data.functions, function(f, name) {
424
+ var gname = docurium.groupOf(name)
425
+ // look in the function name first
426
+ if (name.search(value) > -1) {
427
+ var gl = functionLink(gname, name, version)
428
+ var url = '#' + gl
429
+ searchResults.push({url: url, name: name, match: 'function', navigate: gl})
430
+ return
464
431
  }
465
- }, this)
466
432
 
467
- fitem = $('<li>')
468
- fitem.append($('<span>').addClass('divide').append("Structs"))
469
- list.append(fitem)
470
-
471
- _.each(data['types'], function(group, i) {
472
- if(group[1]['block'] && group[1]['type'] != 'enum') {
473
- flink = $('<a href="#" ref="' + i.toString() + '" id="typeItem' + domSafe(group[0]) + '">' + group[0] + '</a>')
474
- flink.click( this.showType )
475
- fitem = $('<li>')
476
- fitem.append(flink)
477
- list.append(fitem)
433
+ // if we didn't find it there, let's look in the argline
434
+ if (f.argline && f.argline.search(value) > -1) {
435
+ var gl = functionLink(gname, name, version)
436
+ var url = '#' + gl
437
+ searchResults.push({url: url, name: name, match: f.argline, navigate: gl})
478
438
  }
479
- }, this)
439
+ })
480
440
 
481
- fitem = $('<li>')
482
- fitem.append($('<span>').addClass('divide').append("Opaque Structs"))
483
- list.append(fitem)
484
-
485
- _.each(data['types'], function(group, i) {
486
- if(!group[1]['block']) {
487
- flink = $('<a href="#" ref="' + i.toString() + '" id="typeItem' + domSafe(group[0]) + '">' + group[0] + '</a>')
488
- flink.click( this.showType )
489
- fitem = $('<li>')
490
- fitem.append(flink)
491
- list.append(fitem)
441
+ // look for types
442
+ data.types.forEach(function(type) {
443
+ var name = type[0]
444
+ var tl = typeLink(name, version)
445
+ var url = '#' + tl
446
+ if (name.search(value) > -1) {
447
+ searchResults.push({url: url, name: name, match: type[1].type, navigate: tl})
492
448
  }
493
- }, this)
494
- list.hide()
495
- menu.append(list)
449
+ })
496
450
 
497
- // File Listing
498
- title = $('<h3><a href="#">Files</a></h3>').click( this.collapseSection )
499
- menu.append(title)
500
- filelist = $('<ul>')
501
- _.each(data['files'], function(file) {
502
- url = this.github_file(file['file'])
503
- flink = $('<a target="github" href="' + url + '">' + file['file'] + '</a>')
504
- fitem = $('<li>')
505
- fitem.append(flink)
506
- filelist.append(fitem)
507
- }, this)
508
- filelist.hide()
509
- menu.append(filelist)
451
+ this.reset(searchResults)
452
+ },
453
+ })
510
454
 
511
- // Examples List
512
- if(data['examples'] && (data['examples'].length > 0)) {
513
- title = $('<h3><a href="#">Examples</a></h3>').click( this.collapseSection )
514
- menu.append(title)
515
- filelist = $('<ul>')
516
- _.each(data['examples'], function(file) {
517
- fname = file[0]
518
- fpath = file[1]
519
- flink = $('<a>').attr('href', fpath).append(fname)
520
- fitem = $('<li>')
521
- fitem.append(flink)
522
- filelist.append(fitem)
523
- }, this)
524
- menu.append(filelist)
525
- }
455
+ var SearchView = Backbone.View.extend({
456
+ template: _.template($('#search-template').html()),
526
457
 
527
- list = $('#files-list')
528
- list.empty()
529
- list.append(menu)
530
- },
458
+ // initialize: function() {
459
+ // this.listenTo(this.model, 'reset', this.render)
460
+ // },
531
461
 
532
- github_file: function(file, line, lineto) {
533
- url = "https://github.com/" + docurium.get('github')
534
- url += "/blob/" + docurium.get('version') + '/' + data.prefix + '/' + file
535
- if(line) {
536
- url += '#L' + line.toString()
537
- if(lineto) {
538
- url += '-' + lineto.toString()
539
- }
540
- } else {
541
- url += '#files'
462
+ render: function() {
463
+ var content = this.template({results: this.collection.toJSON()})
464
+ this.el = content
465
+ }
466
+ })
467
+
468
+ var MainView = Backbone.View.extend({
469
+ el: $('#content'),
470
+
471
+ setActive: function(view) {
472
+ view.render()
473
+
474
+ if (this.activeView) {
475
+ this.stopListening()
476
+ this.activeView.remove()
542
477
  }
543
- return url
478
+
479
+ this.activeView = view
480
+ // make sure we know when the view wants to render again
481
+ this.listenTo(view, 'redraw', this.render)
482
+
483
+ this.$el.html(view.el)
484
+
485
+ // move back to the top when we switch views
486
+ document.body.scrollTop = document.documentElement.scrollTop = 0;
544
487
  },
545
488
 
546
- search: function(data) {
547
- var searchResults = []
548
- var value = $('#search-field').val()
489
+ render: function() {
490
+ this.$el.html(this.activeView.el)
491
+ },
492
+ })
549
493
 
550
- if (value.length < 3) {
551
- docurium.showIndexPage(false)
552
- return
553
- }
494
+ // our document model - stores the datastructure generated from docurium
495
+ var Docurium = Backbone.Model.extend({
554
496
 
555
- this.searchResults = []
497
+ defaults: {'version': 'unknown'},
556
498
 
557
- ws.navigate(searchLink(value))
499
+ initialize: function() {
500
+ this.loadVersions()
501
+ this.bind('change:version', this.loadDoc)
502
+ },
558
503
 
559
- data = docurium.get('data')
504
+ loadVersions: function() {
505
+ $.getJSON("project.json").then(function(data) {
506
+ docurium.set({'versions': data.versions, 'github': data.github, 'signatures': data.signatures, 'name': data.name, 'groups': data.groups})
507
+ docurium.setVersion()
508
+ })
509
+ },
560
510
 
561
- // look for functions (name, comment, argline)
562
- for (var name in data.functions) {
563
- f = data.functions[name]
564
- if (name.search(value) > -1) {
565
- gname = docurium.groupOf(name)
566
- var flink = $('<a>').attr('href', '#' + groupLink(gname, name)).append(name)
567
- searchResults.push(['fun-' + name, flink, 'function'])
568
- }
569
- if (f.argline) {
570
- if (f.argline.search(value) > -1) {
571
- gname = docurium.groupOf(name)
572
- var flink = $('<a>').attr('href', '#' + groupLink(gname, name)).append(name)
573
- searchResults.push(['fun-' + name, flink, f.argline])
574
- }
575
- }
511
+ setVersion: function (version) {
512
+ if(!version) {
513
+ version = _.first(docurium.get('versions'))
576
514
  }
577
- for (var i in data.types) {
578
- var type = data.types[i]
579
- name = type[0]
580
- if (name.search(value) > -1) {
581
- var link = $('<a>').attr('href', '#' + typeLink(name)).append(name)
582
- searchResults.push(['type-' + name, link, type[1].type])
583
- }
515
+ docurium.set({version: version})
516
+ },
517
+
518
+ loadDoc: function() {
519
+ version = this.get('version')
520
+ $.getJSON(version + '.json').then(function(data) {
521
+ docurium.set({data: data})
522
+ })
523
+ },
524
+
525
+ getGroup: function(gname) {
526
+ var groups = docurium.get('data')['groups']
527
+ return _.find(groups, function(g) {
528
+ return g[0] == gname
529
+ })
530
+ },
531
+
532
+ // look for structs and link them
533
+ hotLink: function(text) {
534
+ types = this.get('data')['types']
535
+ var version = this.get('version')
536
+ for(var i=0; i<types.length; i++) {
537
+ type = types[i]
538
+ typeName = type[0]
539
+ typeData = type[1]
540
+ re = new RegExp(typeName + ' ', 'gi');
541
+ var link = $('<a>').attr('href', '#' + typeLink(typeName, version)).append(typeName)[0]
542
+ text = text.replace(re, link.outerHTML + ' ')
584
543
  }
544
+ return text
545
+ },
585
546
 
586
- // look for types
587
- // look for files
588
- content = $('.content')
589
- content.empty()
590
-
591
- content.append($('<h1>').append("Search Results"))
592
- table = $("<table>")
593
- var shown = {}
594
- for (var i in searchResults) {
595
- row = $("<tr>")
596
- result = searchResults[i]
597
- if (!shown[result[0]]) {
598
- link = result[1]
599
- match = result[2]
600
- row.append($('<td>').append(link))
601
- row.append($('<td>').append(match))
602
- table.append(row)
603
- shown[result[0]] = true
547
+ groupOf: function (func) {
548
+ return this.get('groups')[func]
549
+ },
550
+
551
+ github_file: function(file, line, lineto) {
552
+ var data = this.get('data')
553
+ url = ['https://github.com', docurium.get('github'),
554
+ 'blob', docurium.get('version'), data.prefix, file].join('/')
555
+ if(line) {
556
+ url += '#L' + line.toString()
557
+ if(lineto) {
558
+ url += '-' + lineto.toString()
604
559
  }
560
+ } else {
561
+ url += '#files'
605
562
  }
606
- content.append(table)
607
-
608
- }
609
563
 
564
+ return url
565
+ },
610
566
  })
611
567
 
612
568
  var Workspace = Backbone.Router.extend({
613
569
 
614
570
  routes: {
615
- "": "main",
571
+ "": "index",
616
572
  ":version": "main",
617
573
  ":version/group/:group": "group",
618
574
  ":version/type/:type": "showtype",
@@ -621,77 +577,114 @@ $(function() {
621
577
  "p/changelog": "changelog",
622
578
  },
623
579
 
580
+ initialize: function(o) {
581
+ this.doc = o.docurium
582
+ this.search = o.search
583
+ this.mainView = o.mainView
584
+ this.groups = o.groups
585
+ },
586
+
587
+ index: function() {
588
+ // set the default version
589
+ this.doc.setVersion()
590
+ // and replate our URL with it, to avoid a back-button loop
591
+ this.navigate(this.doc.get('version'), {replace: true, trigger: true})
592
+ },
593
+
624
594
  main: function(version) {
625
- docurium.setVersion(version)
626
- // when asking for '/', replace with 'HEAD' instead of redirecting
627
- var replace = version == undefined
628
- docurium.showIndexPage(replace)
595
+ this.doc.setVersion(version)
596
+ var view = new MainListView({collection: this.groups})
597
+ this.mainView.setActive(view)
629
598
  },
630
599
 
631
600
  group: function(version, gname) {
632
- docurium.setVersion(version)
633
- docurium.showGroup(null, gname)
601
+ this.doc.setVersion(version)
602
+ var group = this.doc.getGroup(gname)
603
+ var fdata = this.doc.get('data')['functions']
604
+ var version = this.doc.get('version')
605
+ var view = new GroupView({group: group, functions: fdata, version: version})
606
+ this.mainView.setActive(view)
634
607
  },
635
608
 
636
609
  groupFun: function(version, gname, fname) {
637
- docurium.setVersion(version)
638
- docurium.showFun(gname, fname)
610
+ this.doc.setVersion(version)
611
+ var model = new FunctionModel({docurium: this.doc, gname: gname, fname: fname})
612
+ var view = new FunctionView({model: model})
613
+ this.mainView.setActive(view)
639
614
  },
640
615
 
641
616
  showtype: function(version, tname) {
642
- docurium.setVersion(version)
643
- docurium.showType(null, tname)
617
+ this.doc.setVersion(version)
618
+ var model = new TypeModel({docurium: this.doc, typename: tname})
619
+ var view = new TypeView({model: model})
620
+ this.mainView.setActive(view)
644
621
  },
645
622
 
646
623
  search: function(version, query) {
647
- docurium.setVersion(version)
648
- $('#search-field').val(query)
649
- docurium.search()
624
+ this.doc.setVersion(version)
625
+ var view = new SearchView({collection: this.search})
626
+ $('#search-field').val(query).keyup()
627
+ this.mainView.setActive(view)
650
628
  },
651
629
 
652
630
  changelog: function(version, tname) {
653
- docurium.setVersion()
654
- docurium.showChangeLog()
631
+ // let's wait to process it until it's asked, and let's only do
632
+ // it once
633
+ if (this.changelogView == undefined) {
634
+ this.changelogView = new ChangelogView({model: this.doc})
635
+ }
636
+ this.doc.setVersion()
637
+ this.mainView.setActive(this.ChangelogView)
655
638
  },
656
-
657
639
  });
658
640
 
659
- function groupLink(gname, fname, version) {
660
- if(!version) {
661
- version = docurium.get('version')
662
- }
663
- if(fname) {
641
+ function functionLink(gname, fname, version) {
664
642
  return version + "/group/" + gname + '/' + fname
665
- } else {
666
- return version + "/group/" + gname
667
- }
668
643
  }
669
644
 
670
- function typeLink(tname) {
671
- return docurium.get('version') + "/type/" + tname
645
+ function groupLink(gname, version) {
646
+ return version + "/group/" + gname
672
647
  }
673
648
 
674
- function searchLink(tname) {
675
- return docurium.get('version') + "/search/" + tname
649
+ function typeLink(tname, version) {
650
+ return version + "/type/" + tname
676
651
  }
677
652
 
678
- function domSafe(str) {
679
- return str.replace('_', '-')
653
+ function searchLink(term, version) {
654
+ return version + "/search/" + term
680
655
  }
681
656
 
682
-
683
- window.docurium = new Docurium
684
- window.ws = new Workspace
657
+ //_.templateSettings.variable = 'rc'
685
658
 
686
- docurium.bind('change:version', function(model, version) {
687
- $('#version').text(version)
688
- })
689
- docurium.bind('change:data', function(model, data) {
690
- model.refreshView()
659
+ var docurium = new Docurium
660
+
661
+ var searchField = new SearchFieldView({id: 'search-field'})
662
+ var searchCol = new SearchCollection({docurium: docurium, field: searchField})
663
+ var groupCol = new GroupCollection({docurium: docurium})
664
+
665
+ var mainView = new MainView()
666
+
667
+ var router = new Workspace({docurium: docurium, search: searchCol, mainView: mainView,
668
+ groups: groupCol})
669
+
670
+ searchField.on('empty', function() {
671
+ router.navigate(docurium.get('version'), {trigger: true})
691
672
  })
692
673
 
693
- $('#search-field').keyup( docurium.search )
674
+ docurium.once('change:data', function() {Backbone.history.start()})
694
675
 
695
- $('#version-picker').click( docurium.collapseSection )
676
+ var fileList = new FileListModel({docurium: docurium})
677
+ var fileListView = new FileListView({model: fileList})
678
+ var versionView = new VersionView({model: docurium})
679
+ var versionPickerView = new VersionPickerView({model: docurium})
696
680
 
681
+ searchCol.on('reset', function(col, prev) {
682
+ if (col.length == 1) {
683
+ router.navigate(col.pluck('navigate')[0], {trigger: true, replace: true})
684
+ } else {
685
+ var version = docurium.get('version')
686
+ // FIXME: this keeps recreating the view
687
+ router.navigate(searchLink(col.value, version), {trigger: true})
688
+ }
689
+ })
697
690
  })