jsduck 3.10.0 → 3.10.1
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.
- data/Gemfile +4 -0
- data/Rakefile +10 -7
- data/jsduck.gemspec +7 -3
- data/lib/jsduck/doc_formatter.rb +4 -7
- data/lib/jsduck/guides.rb +5 -3
- data/lib/jsduck/html.rb +25 -0
- data/lib/jsduck/inline_examples.rb +2 -5
- data/lib/jsduck/inline_img.rb +2 -2
- data/lib/jsduck/inline_video.rb +2 -2
- data/lib/jsduck/options.rb +1 -1
- data/lib/jsduck/renderer.rb +3 -3
- data/lib/jsduck/source_file.rb +2 -2
- metadata +52 -10
- data/opt/aside.png +0 -0
- data/opt/comments-server-side/.gitignore +0 -2
- data/opt/comments-server-side/ForumUser.js +0 -80
- data/opt/comments-server-side/app.js +0 -366
- data/opt/comments-server-side/database.js +0 -53
- data/opt/comments-server-side/package.json +0 -19
- data/opt/comments-server-side/util.js +0 -396
- data/opt/example.js +0 -149
data/Gemfile
ADDED
data/Rakefile
CHANGED
@@ -1,13 +1,16 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'rake'
|
3
|
-
require 'json'
|
4
3
|
|
5
4
|
$LOAD_PATH.unshift File.expand_path("../lib", __FILE__)
|
6
5
|
|
6
|
+
def os_is_windows?
|
7
|
+
RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/
|
8
|
+
end
|
9
|
+
|
7
10
|
require 'rspec'
|
8
11
|
require 'rspec/core/rake_task'
|
9
12
|
RSpec::Core::RakeTask.new(:spec) do |spec|
|
10
|
-
spec.rspec_opts = ["--color"]
|
13
|
+
spec.rspec_opts = ["--color"] unless os_is_windows?
|
11
14
|
spec.pattern = "spec/**/*_spec.rb"
|
12
15
|
end
|
13
16
|
|
@@ -176,11 +179,11 @@ class JsDuckRunner
|
|
176
179
|
end
|
177
180
|
|
178
181
|
def add_debug
|
179
|
-
|
182
|
+
add_options(
|
180
183
|
"--extjs-path", "extjs/ext-all-debug.js",
|
181
|
-
"--template-links",
|
182
184
|
"--template", "template",
|
183
|
-
|
185
|
+
)
|
186
|
+
add_options("--template-links") unless os_is_windows?
|
184
187
|
end
|
185
188
|
|
186
189
|
def run
|
@@ -246,7 +249,7 @@ task :touch2 => :sass do
|
|
246
249
|
runner.add_options(
|
247
250
|
"--output", OUT_DIR,
|
248
251
|
"--config", "#{SDK_DIR}/touch/docs/config.json",
|
249
|
-
"--examples-base-url", "touch/examples/production/",
|
252
|
+
"--examples-base-url", "touch-build/examples/production/",
|
250
253
|
"--seo",
|
251
254
|
"--tests"
|
252
255
|
)
|
@@ -255,7 +258,7 @@ task :touch2 => :sass do
|
|
255
258
|
runner.add_comments('touch', '2')
|
256
259
|
runner.run
|
257
260
|
|
258
|
-
system("cp -r #{TOUCH_BUILD} #{OUT_DIR}/touch")
|
261
|
+
system("cp -r #{TOUCH_BUILD} #{OUT_DIR}/touch-build")
|
259
262
|
end
|
260
263
|
|
261
264
|
task :default => :spec
|
data/jsduck.gemspec
CHANGED
@@ -2,8 +2,8 @@ Gem::Specification.new do |s|
|
|
2
2
|
s.required_rubygems_version = ">= 1.3.5"
|
3
3
|
|
4
4
|
s.name = 'jsduck'
|
5
|
-
s.version = '3.10.
|
6
|
-
s.date = '2012-05-
|
5
|
+
s.version = '3.10.1'
|
6
|
+
s.date = '2012-05-11'
|
7
7
|
s.summary = "Simple JavaScript Duckumentation generator"
|
8
8
|
s.description = "Documentation generator for Sencha JS frameworks"
|
9
9
|
s.homepage = "https://github.com/senchalabs/jsduck"
|
@@ -12,7 +12,7 @@ Gem::Specification.new do |s|
|
|
12
12
|
s.rubyforge_project = s.name
|
13
13
|
|
14
14
|
s.files = `git ls-files`.split("\n").find_all do |file|
|
15
|
-
file !~ /spec.rb$/ && file !~ /benchmark/ && file !~ /template\//
|
15
|
+
file !~ /spec.rb$/ && file !~ /benchmark/ && file !~ /template\// && file !~ /opt\//
|
16
16
|
end
|
17
17
|
# Add files not in git
|
18
18
|
s.files += Dir['template-min/**/*']
|
@@ -23,5 +23,9 @@ Gem::Specification.new do |s|
|
|
23
23
|
s.add_dependency 'json'
|
24
24
|
s.add_dependency 'parallel'
|
25
25
|
|
26
|
+
s.add_development_dependency 'rspec'
|
27
|
+
s.add_development_dependency 'rake'
|
28
|
+
s.add_development_dependency 'compass'
|
29
|
+
|
26
30
|
s.require_path = 'lib'
|
27
31
|
end
|
data/lib/jsduck/doc_formatter.rb
CHANGED
@@ -2,10 +2,10 @@
|
|
2
2
|
require 'rubygems'
|
3
3
|
require 'rdiscount'
|
4
4
|
require 'strscan'
|
5
|
-
require 'cgi'
|
6
5
|
require 'jsduck/logger'
|
7
6
|
require 'jsduck/inline_img'
|
8
7
|
require 'jsduck/inline_video'
|
8
|
+
require 'jsduck/html'
|
9
9
|
|
10
10
|
module JsDuck
|
11
11
|
|
@@ -274,7 +274,7 @@ module JsDuck
|
|
274
274
|
when '%-'
|
275
275
|
member ? "-" : ""
|
276
276
|
when '%a'
|
277
|
-
|
277
|
+
HTML.escape(anchor_text||"")
|
278
278
|
else
|
279
279
|
$1
|
280
280
|
end
|
@@ -327,7 +327,7 @@ module JsDuck
|
|
327
327
|
# Blah blah blah some text.
|
328
328
|
#
|
329
329
|
def shorten(input)
|
330
|
-
sent = first_sentence(strip_tags(input))
|
330
|
+
sent = first_sentence(HTML.strip_tags(input).strip)
|
331
331
|
# Use u-modifier to correctly count multi-byte characters
|
332
332
|
chars = sent.scan(/./mu)
|
333
333
|
if chars.length > @max_length
|
@@ -343,15 +343,12 @@ module JsDuck
|
|
343
343
|
|
344
344
|
# Returns true when input should get shortened.
|
345
345
|
def too_long?(input)
|
346
|
-
stripped = strip_tags(input)
|
346
|
+
stripped = HTML.strip_tags(input).strip
|
347
347
|
# for sentence v/s full - compare byte length
|
348
348
|
# for full v/s max - compare char length
|
349
349
|
first_sentence(stripped).length < stripped.length || stripped.scan(/./mu).length > @max_length
|
350
350
|
end
|
351
351
|
|
352
|
-
def strip_tags(str)
|
353
|
-
str.gsub(/<.*?>/, "").strip
|
354
|
-
end
|
355
352
|
end
|
356
353
|
|
357
354
|
end
|
data/lib/jsduck/guides.rb
CHANGED
@@ -4,6 +4,7 @@ require 'jsduck/io'
|
|
4
4
|
require 'jsduck/null_object'
|
5
5
|
require 'jsduck/logger'
|
6
6
|
require 'jsduck/grouped_asset'
|
7
|
+
require 'jsduck/html'
|
7
8
|
require 'fileutils'
|
8
9
|
|
9
10
|
module JsDuck
|
@@ -51,7 +52,7 @@ module JsDuck
|
|
51
52
|
@groups.map do |group|
|
52
53
|
{
|
53
54
|
"title" => group["title"],
|
54
|
-
"items" => group["items"].map {|g| g.select {|k, v| k != :html } }
|
55
|
+
"items" => group["items"].map {|g| Hash[g.select {|k, v| k != :html }] }
|
55
56
|
}
|
56
57
|
end
|
57
58
|
end
|
@@ -111,8 +112,9 @@ module JsDuck
|
|
111
112
|
html.each_line do |line|
|
112
113
|
if line =~ /^<h2>(.*)<\/h2>$/
|
113
114
|
i += 1
|
114
|
-
|
115
|
-
|
115
|
+
text = HTML.strip_tags($1)
|
116
|
+
toc << "<li><a href='#!/guide/#{guide['name']}-section-#{i}'>#{text}</a></li>\n"
|
117
|
+
new_html << "<h2 id='#{guide['name']}-section-#{i}'>#{text}</h2>\n"
|
116
118
|
else
|
117
119
|
new_html << line
|
118
120
|
end
|
data/lib/jsduck/html.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'cgi'
|
2
|
+
|
3
|
+
module JsDuck
|
4
|
+
|
5
|
+
# Helpers for dealing with HTML
|
6
|
+
class HTML
|
7
|
+
|
8
|
+
# Strips tags from HTML text
|
9
|
+
def self.strip_tags(html)
|
10
|
+
html.gsub(/<.*?>/, "")
|
11
|
+
end
|
12
|
+
|
13
|
+
# Escapes HTML, replacing < with < ...
|
14
|
+
def self.escape(html)
|
15
|
+
CGI.escapeHTML(html)
|
16
|
+
end
|
17
|
+
|
18
|
+
# Unescapes HTML, replacing < with < ...
|
19
|
+
def self.unescape(html)
|
20
|
+
CGI.unescapeHTML(html)
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'jsduck/json_duck'
|
2
|
-
require '
|
2
|
+
require 'jsduck/html'
|
3
3
|
|
4
4
|
module JsDuck
|
5
5
|
|
@@ -65,7 +65,7 @@ module JsDuck
|
|
65
65
|
ex = s.scan_until(@end_example_re).sub(@end_example_re, '')
|
66
66
|
|
67
67
|
examples << {
|
68
|
-
:code =>
|
68
|
+
:code => HTML.unescape(HTML.strip_tags(ex)),
|
69
69
|
:options => options,
|
70
70
|
}
|
71
71
|
else
|
@@ -89,9 +89,6 @@ module JsDuck
|
|
89
89
|
hash
|
90
90
|
end
|
91
91
|
|
92
|
-
def strip_tags(str)
|
93
|
-
str.gsub(/<.*?>/, "")
|
94
|
-
end
|
95
92
|
end
|
96
93
|
|
97
94
|
end
|
data/lib/jsduck/inline_img.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require 'jsduck/html'
|
2
2
|
require 'jsduck/logger'
|
3
3
|
|
4
4
|
module JsDuck
|
@@ -42,7 +42,7 @@ module JsDuck
|
|
42
42
|
when '%u'
|
43
43
|
@base_path ? (@base_path + "/" + url) : url
|
44
44
|
when '%a'
|
45
|
-
|
45
|
+
HTML.escape(alt_text||"")
|
46
46
|
else
|
47
47
|
$1
|
48
48
|
end
|
data/lib/jsduck/inline_video.rb
CHANGED
data/lib/jsduck/options.rb
CHANGED
data/lib/jsduck/renderer.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'jsduck/meta_tag_registry'
|
2
|
-
require '
|
2
|
+
require 'jsduck/html'
|
3
3
|
|
4
4
|
module JsDuck
|
5
5
|
|
@@ -267,7 +267,7 @@ module JsDuck
|
|
267
267
|
doc << m[:doc]
|
268
268
|
|
269
269
|
if m[:default] && m[:default] != "undefined"
|
270
|
-
doc << "<p>Defaults to: <code>" +
|
270
|
+
doc << "<p>Defaults to: <code>" + HTML.escape(m[:default]) + "</code></p>"
|
271
271
|
end
|
272
272
|
|
273
273
|
doc << render_meta_data(m[:html_meta], :bottom)
|
@@ -329,7 +329,7 @@ module JsDuck
|
|
329
329
|
p[:optional] ? " (optional)" : "",
|
330
330
|
"<div class='sub-desc'>",
|
331
331
|
p[:doc],
|
332
|
-
p[:default] ? "<p>Defaults to: <code>#{
|
332
|
+
p[:default] ? "<p>Defaults to: <code>#{HTML.escape(p[:default])}</code></p>" : "",
|
333
333
|
p[:properties] && p[:properties].length > 0 ? render_params_and_return(p) : "",
|
334
334
|
"</div>",
|
335
335
|
"</li>",
|
data/lib/jsduck/source_file.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'jsduck/js_parser'
|
2
2
|
require 'jsduck/css_parser'
|
3
3
|
require 'jsduck/merger'
|
4
|
-
require
|
4
|
+
require 'jsduck/html'
|
5
5
|
|
6
6
|
module JsDuck
|
7
7
|
|
@@ -54,7 +54,7 @@ module JsDuck
|
|
54
54
|
# Use #each_line instead of #lines to support Ruby 1.6
|
55
55
|
@contents.each_line do |line|
|
56
56
|
linenr += 1;
|
57
|
-
line =
|
57
|
+
line = HTML.escape(line)
|
58
58
|
# wrap the line in as many spans as there are links to this line number.
|
59
59
|
if @links[linenr]
|
60
60
|
@links[linenr].each do |link|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jsduck
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.10.
|
4
|
+
version: 3.10.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2012-05-
|
13
|
+
date: 2012-05-11 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rdiscount
|
@@ -60,6 +60,54 @@ dependencies:
|
|
60
60
|
- - ! '>='
|
61
61
|
- !ruby/object:Gem::Version
|
62
62
|
version: '0'
|
63
|
+
- !ruby/object:Gem::Dependency
|
64
|
+
name: rspec
|
65
|
+
requirement: !ruby/object:Gem::Requirement
|
66
|
+
none: false
|
67
|
+
requirements:
|
68
|
+
- - ! '>='
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '0'
|
71
|
+
type: :development
|
72
|
+
prerelease: false
|
73
|
+
version_requirements: !ruby/object:Gem::Requirement
|
74
|
+
none: false
|
75
|
+
requirements:
|
76
|
+
- - ! '>='
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: '0'
|
79
|
+
- !ruby/object:Gem::Dependency
|
80
|
+
name: rake
|
81
|
+
requirement: !ruby/object:Gem::Requirement
|
82
|
+
none: false
|
83
|
+
requirements:
|
84
|
+
- - ! '>='
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: '0'
|
87
|
+
type: :development
|
88
|
+
prerelease: false
|
89
|
+
version_requirements: !ruby/object:Gem::Requirement
|
90
|
+
none: false
|
91
|
+
requirements:
|
92
|
+
- - ! '>='
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '0'
|
95
|
+
- !ruby/object:Gem::Dependency
|
96
|
+
name: compass
|
97
|
+
requirement: !ruby/object:Gem::Requirement
|
98
|
+
none: false
|
99
|
+
requirements:
|
100
|
+
- - ! '>='
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '0'
|
103
|
+
type: :development
|
104
|
+
prerelease: false
|
105
|
+
version_requirements: !ruby/object:Gem::Requirement
|
106
|
+
none: false
|
107
|
+
requirements:
|
108
|
+
- - ! '>='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
63
111
|
description: Documentation generator for Sencha JS frameworks
|
64
112
|
email: rene.saarsoo@sencha.com
|
65
113
|
executables:
|
@@ -69,6 +117,7 @@ extra_rdoc_files: []
|
|
69
117
|
files:
|
70
118
|
- .gitignore
|
71
119
|
- COPYING
|
120
|
+
- Gemfile
|
72
121
|
- README.md
|
73
122
|
- Rakefile
|
74
123
|
- bin/compare
|
@@ -104,6 +153,7 @@ files:
|
|
104
153
|
- lib/jsduck/grouped_asset.rb
|
105
154
|
- lib/jsduck/guide_writer.rb
|
106
155
|
- lib/jsduck/guides.rb
|
156
|
+
- lib/jsduck/html.rb
|
107
157
|
- lib/jsduck/icons.rb
|
108
158
|
- lib/jsduck/images.rb
|
109
159
|
- lib/jsduck/index_html.rb
|
@@ -154,14 +204,6 @@ files:
|
|
154
204
|
- lib/jsduck/type_parser.rb
|
155
205
|
- lib/jsduck/videos.rb
|
156
206
|
- lib/jsduck/welcome.rb
|
157
|
-
- opt/aside.png
|
158
|
-
- opt/comments-server-side/.gitignore
|
159
|
-
- opt/comments-server-side/ForumUser.js
|
160
|
-
- opt/comments-server-side/app.js
|
161
|
-
- opt/comments-server-side/database.js
|
162
|
-
- opt/comments-server-side/package.json
|
163
|
-
- opt/comments-server-side/util.js
|
164
|
-
- opt/example.js
|
165
207
|
- template-min/README.md
|
166
208
|
- template-min/template.html
|
167
209
|
- template-min/eg-iframe.html
|
data/opt/aside.png
DELETED
Binary file
|
@@ -1,80 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* Authentication with a vBulletin user database
|
3
|
-
*/
|
4
|
-
|
5
|
-
var crypto = require('crypto'),
|
6
|
-
_ = require('underscore');
|
7
|
-
|
8
|
-
var ForumUser = exports.ForumUser = function(client) {
|
9
|
-
this.client = client;
|
10
|
-
};
|
11
|
-
|
12
|
-
ForumUser.prototype = {
|
13
|
-
|
14
|
-
login: function(username, password, callback) {
|
15
|
-
|
16
|
-
var sql = "SELECT userid, usergroupid, membergroupids, email, username, password, salt FROM user WHERE username = ?",
|
17
|
-
self = this;
|
18
|
-
|
19
|
-
this.client.query(sql, [username],
|
20
|
-
|
21
|
-
function selectCb(err, results, fields) {
|
22
|
-
if (err) {
|
23
|
-
callback(err);
|
24
|
-
return;
|
25
|
-
}
|
26
|
-
|
27
|
-
if (results.length == 0) {
|
28
|
-
callback("No such user");
|
29
|
-
return;
|
30
|
-
}
|
31
|
-
|
32
|
-
if (!self.checkPassword(password, results[0].salt, results[0].password)) {
|
33
|
-
callback("Invalid password");
|
34
|
-
return;
|
35
|
-
}
|
36
|
-
|
37
|
-
var user = self.getUserFromResult(results[0]);
|
38
|
-
|
39
|
-
callback(null, user);
|
40
|
-
}
|
41
|
-
);
|
42
|
-
},
|
43
|
-
|
44
|
-
clientUser: function(user) {
|
45
|
-
|
46
|
-
crypto.createHash('md5').update(user.email).digest("hex");
|
47
|
-
|
48
|
-
return {
|
49
|
-
emailHash: user.email,
|
50
|
-
userName: user.username,
|
51
|
-
userId: user.userid,
|
52
|
-
mod: _.include(user.membergroupids, 7)
|
53
|
-
};
|
54
|
-
},
|
55
|
-
|
56
|
-
checkPassword: function(password, salt, saltedPassword) {
|
57
|
-
|
58
|
-
password = crypto.createHash('md5').update(password).digest("hex") + salt;
|
59
|
-
password = crypto.createHash('md5').update(password).digest("hex");
|
60
|
-
|
61
|
-
return password == saltedPassword;
|
62
|
-
},
|
63
|
-
|
64
|
-
getUserFromResult: function(result) {
|
65
|
-
|
66
|
-
var ids, id;
|
67
|
-
|
68
|
-
if (result.membergroupids) {
|
69
|
-
ids = result.membergroupids.split(',');
|
70
|
-
result.membergroupids = [];
|
71
|
-
for (id in ids) {
|
72
|
-
result.membergroupids.push(Number(ids[id]));
|
73
|
-
}
|
74
|
-
}
|
75
|
-
|
76
|
-
result.moderator = _.include(result.membergroupids, 7);
|
77
|
-
|
78
|
-
return result;
|
79
|
-
}
|
80
|
-
};
|