ragaskar-jsdoc_helper 0.0.2.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.
Files changed (116) hide show
  1. data/README.rdoc +64 -0
  2. data/bin/jsdoc_helper +8 -0
  3. data/ext/jsdoc-toolkit/README.txt +146 -0
  4. data/ext/jsdoc-toolkit/app/frame.js +33 -0
  5. data/ext/jsdoc-toolkit/app/frame/Chain.js +102 -0
  6. data/ext/jsdoc-toolkit/app/frame/Dumper.js +144 -0
  7. data/ext/jsdoc-toolkit/app/frame/Hash.js +84 -0
  8. data/ext/jsdoc-toolkit/app/frame/Link.js +148 -0
  9. data/ext/jsdoc-toolkit/app/frame/Namespace.js +10 -0
  10. data/ext/jsdoc-toolkit/app/frame/Opt.js +134 -0
  11. data/ext/jsdoc-toolkit/app/frame/Reflection.js +26 -0
  12. data/ext/jsdoc-toolkit/app/frame/String.js +93 -0
  13. data/ext/jsdoc-toolkit/app/frame/Testrun.js +129 -0
  14. data/ext/jsdoc-toolkit/app/handlers/FOODOC.js +26 -0
  15. data/ext/jsdoc-toolkit/app/handlers/XMLDOC.js +26 -0
  16. data/ext/jsdoc-toolkit/app/handlers/XMLDOC/DomReader.js +159 -0
  17. data/ext/jsdoc-toolkit/app/handlers/XMLDOC/XMLDoc.js +16 -0
  18. data/ext/jsdoc-toolkit/app/handlers/XMLDOC/XMLParse.js +292 -0
  19. data/ext/jsdoc-toolkit/app/lib/JSDOC.js +101 -0
  20. data/ext/jsdoc-toolkit/app/lib/JSDOC/DocComment.js +200 -0
  21. data/ext/jsdoc-toolkit/app/lib/JSDOC/DocTag.js +294 -0
  22. data/ext/jsdoc-toolkit/app/lib/JSDOC/JsDoc.js +126 -0
  23. data/ext/jsdoc-toolkit/app/lib/JSDOC/JsPlate.js +109 -0
  24. data/ext/jsdoc-toolkit/app/lib/JSDOC/Lang.js +144 -0
  25. data/ext/jsdoc-toolkit/app/lib/JSDOC/Parser.js +107 -0
  26. data/ext/jsdoc-toolkit/app/lib/JSDOC/PluginManager.js +33 -0
  27. data/ext/jsdoc-toolkit/app/lib/JSDOC/Symbol.js +643 -0
  28. data/ext/jsdoc-toolkit/app/lib/JSDOC/SymbolSet.js +229 -0
  29. data/ext/jsdoc-toolkit/app/lib/JSDOC/TextStream.js +41 -0
  30. data/ext/jsdoc-toolkit/app/lib/JSDOC/Token.js +18 -0
  31. data/ext/jsdoc-toolkit/app/lib/JSDOC/TokenReader.js +332 -0
  32. data/ext/jsdoc-toolkit/app/lib/JSDOC/TokenStream.js +133 -0
  33. data/ext/jsdoc-toolkit/app/lib/JSDOC/Util.js +32 -0
  34. data/ext/jsdoc-toolkit/app/lib/JSDOC/Walker.js +459 -0
  35. data/ext/jsdoc-toolkit/app/main.js +111 -0
  36. data/ext/jsdoc-toolkit/app/plugins/commentSrcJson.js +20 -0
  37. data/ext/jsdoc-toolkit/app/plugins/frameworkPrototype.js +16 -0
  38. data/ext/jsdoc-toolkit/app/plugins/functionCall.js +10 -0
  39. data/ext/jsdoc-toolkit/app/plugins/publishSrcHilite.js +62 -0
  40. data/ext/jsdoc-toolkit/app/plugins/symbolLink.js +9 -0
  41. data/ext/jsdoc-toolkit/app/plugins/tagParamConfig.js +31 -0
  42. data/ext/jsdoc-toolkit/app/plugins/tagSynonyms.js +43 -0
  43. data/ext/jsdoc-toolkit/app/run.js +348 -0
  44. data/ext/jsdoc-toolkit/app/t/TestDoc.js +144 -0
  45. data/ext/jsdoc-toolkit/app/t/runner.js +13 -0
  46. data/ext/jsdoc-toolkit/app/test.js +307 -0
  47. data/ext/jsdoc-toolkit/app/test/addon.js +24 -0
  48. data/ext/jsdoc-toolkit/app/test/anon_inner.js +14 -0
  49. data/ext/jsdoc-toolkit/app/test/augments.js +31 -0
  50. data/ext/jsdoc-toolkit/app/test/augments2.js +26 -0
  51. data/ext/jsdoc-toolkit/app/test/borrows.js +41 -0
  52. data/ext/jsdoc-toolkit/app/test/borrows2.js +23 -0
  53. data/ext/jsdoc-toolkit/app/test/config.js +22 -0
  54. data/ext/jsdoc-toolkit/app/test/constructs.js +18 -0
  55. data/ext/jsdoc-toolkit/app/test/encoding.js +10 -0
  56. data/ext/jsdoc-toolkit/app/test/encoding_other.js +12 -0
  57. data/ext/jsdoc-toolkit/app/test/event.js +54 -0
  58. data/ext/jsdoc-toolkit/app/test/functions_anon.js +39 -0
  59. data/ext/jsdoc-toolkit/app/test/functions_nested.js +33 -0
  60. data/ext/jsdoc-toolkit/app/test/global.js +13 -0
  61. data/ext/jsdoc-toolkit/app/test/globals.js +25 -0
  62. data/ext/jsdoc-toolkit/app/test/ignore.js +10 -0
  63. data/ext/jsdoc-toolkit/app/test/inner.js +16 -0
  64. data/ext/jsdoc-toolkit/app/test/jsdoc_test.js +477 -0
  65. data/ext/jsdoc-toolkit/app/test/lend.js +33 -0
  66. data/ext/jsdoc-toolkit/app/test/memberof.js +19 -0
  67. data/ext/jsdoc-toolkit/app/test/memberof_constructor.js +17 -0
  68. data/ext/jsdoc-toolkit/app/test/name.js +19 -0
  69. data/ext/jsdoc-toolkit/app/test/namespace_nested.js +23 -0
  70. data/ext/jsdoc-toolkit/app/test/nocode.js +13 -0
  71. data/ext/jsdoc-toolkit/app/test/oblit_anon.js +20 -0
  72. data/ext/jsdoc-toolkit/app/test/overview.js +20 -0
  73. data/ext/jsdoc-toolkit/app/test/param_inline.js +37 -0
  74. data/ext/jsdoc-toolkit/app/test/params_optional.js +8 -0
  75. data/ext/jsdoc-toolkit/app/test/prototype.js +17 -0
  76. data/ext/jsdoc-toolkit/app/test/prototype_nested.js +9 -0
  77. data/ext/jsdoc-toolkit/app/test/prototype_oblit.js +13 -0
  78. data/ext/jsdoc-toolkit/app/test/prototype_oblit_constructor.js +24 -0
  79. data/ext/jsdoc-toolkit/app/test/public.js +10 -0
  80. data/ext/jsdoc-toolkit/app/test/shared.js +42 -0
  81. data/ext/jsdoc-toolkit/app/test/shared2.js +2 -0
  82. data/ext/jsdoc-toolkit/app/test/shortcuts.js +22 -0
  83. data/ext/jsdoc-toolkit/app/test/static_this.js +13 -0
  84. data/ext/jsdoc-toolkit/app/test/synonyms.js +31 -0
  85. data/ext/jsdoc-toolkit/app/test/tosource.js +23 -0
  86. data/ext/jsdoc-toolkit/app/test/variable_redefine.js +14 -0
  87. data/ext/jsdoc-toolkit/changes.txt +75 -0
  88. data/ext/jsdoc-toolkit/conf/sample.conf +31 -0
  89. data/ext/jsdoc-toolkit/java/build.xml +36 -0
  90. data/ext/jsdoc-toolkit/java/build_1.4.xml +36 -0
  91. data/ext/jsdoc-toolkit/java/classes/js.jar +0 -0
  92. data/ext/jsdoc-toolkit/java/src/JsDebugRun.java +21 -0
  93. data/ext/jsdoc-toolkit/java/src/JsRun.java +21 -0
  94. data/ext/jsdoc-toolkit/jsdebug.jar +0 -0
  95. data/ext/jsdoc-toolkit/jsrun.jar +0 -0
  96. data/ext/jsdoc-toolkit/out/jsdoc/files.html +216 -0
  97. data/ext/jsdoc-toolkit/out/jsdoc/index.html +210 -0
  98. data/ext/jsdoc-toolkit/out/jsdoc/symbols/_global_.html +306 -0
  99. data/ext/jsdoc-toolkit/out/jsdoc/symbols/src/lib_test.js.html +13 -0
  100. data/ext/jsdoc-toolkit/templates/jsdoc/allclasses.tmpl +17 -0
  101. data/ext/jsdoc-toolkit/templates/jsdoc/allfiles.tmpl +56 -0
  102. data/ext/jsdoc-toolkit/templates/jsdoc/class.tmpl +646 -0
  103. data/ext/jsdoc-toolkit/templates/jsdoc/index.tmpl +39 -0
  104. data/ext/jsdoc-toolkit/templates/jsdoc/publish.js +184 -0
  105. data/ext/jsdoc-toolkit/templates/jsdoc/static/default.css +162 -0
  106. data/ext/jsdoc-toolkit/templates/jsdoc/static/header.html +2 -0
  107. data/ext/jsdoc-toolkit/templates/jsdoc/static/index.html +19 -0
  108. data/ext/jsdoc-toolkit/templates/jsdoc/symbol.tmpl +35 -0
  109. data/lib/jsdoc_helper.rb +50 -0
  110. data/lib/jsdoc_helper/rake/task.rb +43 -0
  111. data/lib/jsdoc_helper/rake/task/runner.rb +85 -0
  112. data/spec/jsdoc_helper/jsdoc_helper_spec.rb +4 -0
  113. data/spec/jsdoc_helper/rake/task/runner_spec.rb +45 -0
  114. data/spec/jsdoc_helper/support/file_helper_spec.rb +93 -0
  115. data/spec/spec_helper.rb +25 -0
  116. metadata +168 -0
@@ -0,0 +1,229 @@
1
+ /** @constructor */
2
+ JSDOC.SymbolSet = function() {
3
+ this.init();
4
+ }
5
+
6
+ JSDOC.SymbolSet.prototype.init = function() {
7
+ this._index = new Hash();
8
+ }
9
+
10
+ JSDOC.SymbolSet.prototype.keys = function() {
11
+ return this._index.keys();
12
+ }
13
+
14
+ JSDOC.SymbolSet.prototype.hasSymbol = function(alias) {
15
+ return this._index.hasKey(alias);
16
+ }
17
+
18
+ JSDOC.SymbolSet.prototype.addSymbol = function(symbol) {
19
+ if (this.hasSymbol(symbol.alias)) {
20
+ LOG.warn("Overwriting symbol documentation for: "+symbol.alias + ".");
21
+ }
22
+ this._index.set(symbol.alias, symbol);
23
+ }
24
+
25
+ JSDOC.SymbolSet.prototype.getSymbol = function(alias) {
26
+ if (this.hasSymbol(alias)) return this._index.get(alias);
27
+ }
28
+
29
+ JSDOC.SymbolSet.prototype.getSymbolByName = function(name) {
30
+ for (var p = this._index.first(); p; p = this._index.next()) {
31
+ var symbol = p.value;
32
+ if (symbol.name == name) return symbol;
33
+ }
34
+ }
35
+
36
+ JSDOC.SymbolSet.prototype.toArray = function() {
37
+ return this._index.values();
38
+ }
39
+
40
+ JSDOC.SymbolSet.prototype.deleteSymbol = function(alias) {
41
+ if (!this.hasSymbol(alias)) return;
42
+ this._index.drop(alias);
43
+ }
44
+
45
+ JSDOC.SymbolSet.prototype.renameSymbol = function(oldName, newName) {
46
+ // todo: should check if oldname or newname already exist
47
+ this._index.replace(oldName, newName);
48
+ this._index.get(newName).alias = newName;
49
+ return newName;
50
+ }
51
+
52
+ JSDOC.SymbolSet.prototype.relate = function() {
53
+ this.resolveBorrows();
54
+ this.resolveMemberOf();
55
+ this.resolveAugments();
56
+ }
57
+
58
+ JSDOC.SymbolSet.prototype.resolveBorrows = function() {
59
+ for (var p = this._index.first(); p; p = this._index.next()) {
60
+ var symbol = p.value;
61
+ if (symbol.is("FILE") || symbol.is("GLOBAL")) continue;
62
+
63
+ var borrows = symbol.inherits;
64
+ for (var i = 0; i < borrows.length; i++) {
65
+ var borrowed = this.getSymbol(borrows[i].alias);
66
+ if (!borrowed) {
67
+ LOG.warn("Can't borrow undocumented "+borrows[i].alias+".");
68
+ continue;
69
+ }
70
+
71
+ var borrowAsName = borrows[i].as;
72
+ var borrowAsAlias = borrowAsName;
73
+ if (!borrowAsName) {
74
+ LOG.warn("Malformed @borrow, 'as' is required.");
75
+ continue;
76
+ }
77
+
78
+ if (borrowAsName.length > symbol.alias.length && borrowAsName.indexOf(symbol.alias) == 0) {
79
+ borrowAsName = borrowAsName.replace(borrowed.alias, "")
80
+ }
81
+ else {
82
+ var joiner = "";
83
+ if (borrowAsName.charAt(0) != "#") joiner = ".";
84
+ borrowAsAlias = borrowed.alias + joiner + borrowAsName;
85
+ }
86
+
87
+ borrowAsName = borrowAsName.replace(/^[#.]/, "");
88
+
89
+ if (this.hasSymbol(borrowAsAlias)) continue;
90
+
91
+ var clone = borrowed.clone();
92
+ clone.name = borrowAsName;
93
+ clone.alias = borrowAsAlias;
94
+ this.addSymbol(clone);
95
+ }
96
+ }
97
+ }
98
+
99
+ JSDOC.SymbolSet.prototype.resolveMemberOf = function() {
100
+ for (var p = this._index.first(); p; p = this._index.next()) {
101
+ var symbol = p.value;
102
+ if (symbol.is("FILE") || symbol.is("GLOBAL")) continue;
103
+
104
+ // the memberOf value was provided in the @memberOf tag
105
+ else if (symbol.memberOf) {
106
+
107
+ // like foo.bar is a memberOf foo
108
+ if (symbol.alias.indexOf(symbol.memberOf) == 0) {
109
+ var memberMatch = new RegExp("^("+symbol.memberOf+")[.#-]?(.+)$");
110
+ var aliasParts = symbol.alias.match(memberMatch);
111
+
112
+ if (aliasParts) {
113
+ symbol.memberOf = aliasParts[1];
114
+ symbol.name = aliasParts[2];
115
+ }
116
+
117
+ var nameParts = symbol.name.match(memberMatch);
118
+
119
+ if (nameParts) {
120
+ symbol.name = nameParts[2];
121
+ }
122
+ }
123
+ // like bar is a memberOf foo
124
+ else {
125
+ var joiner = symbol.memberOf.charAt(symbol.memberOf.length-1);
126
+ if (!/[.#-]/.test(joiner)) symbol.memberOf += ".";
127
+ this.renameSymbol(symbol.alias, symbol.memberOf + symbol.name);
128
+ }
129
+ }
130
+ // the memberOf must be calculated
131
+ else {
132
+ var parts = symbol.alias.match(/^(.*[.#-])([^.#-]+)$/);
133
+ if (parts) {
134
+ symbol.memberOf = parts[1];
135
+ symbol.name = parts[2];
136
+ }
137
+ }
138
+
139
+ // set isStatic, isInner
140
+ if (symbol.memberOf) {
141
+ switch (symbol.memberOf.charAt(symbol.memberOf.length-1)) {
142
+ case '#' :
143
+ symbol.isStatic = false;
144
+ symbol.isInner = false;
145
+ break;
146
+ case '.' :
147
+ symbol.isStatic = true;
148
+ symbol.isInner = false;
149
+ break;
150
+ case '-' :
151
+ symbol.isStatic = false;
152
+ symbol.isInner = true;
153
+ break;
154
+ default: // memberOf ends in none of the above
155
+ symbol.isStatic = true;
156
+ break;
157
+ }
158
+ }
159
+
160
+ // unowned methods and fields belong to the global object
161
+ if (!symbol.is("CONSTRUCTOR") && !symbol.isNamespace && symbol.memberOf == "") {
162
+ symbol.memberOf = "_global_";
163
+ }
164
+
165
+ // clean up
166
+ if (symbol.memberOf.match(/[.#-]$/)) {
167
+ symbol.memberOf = symbol.memberOf.substr(0, symbol.memberOf.length-1);
168
+ }
169
+ // add to parent's methods or properties list
170
+ if (symbol.memberOf) {
171
+
172
+ var container = this.getSymbol(symbol.memberOf);
173
+ if (!container) {
174
+ if (JSDOC.Lang.isBuiltin(symbol.memberOf)) container = JSDOC.Parser.addBuiltin(symbol.memberOf);
175
+ else {
176
+ LOG.warn("Trying to document "+symbol.name +" as a member of undocumented symbol "+symbol.memberOf+".");
177
+ }
178
+ }
179
+
180
+ if (container) container.addMember(symbol);
181
+ }
182
+ }
183
+ }
184
+
185
+ JSDOC.SymbolSet.prototype.resolveAugments = function() {
186
+ for (var p = this._index.first(); p; p = this._index.next()) {
187
+ var symbol = p.value;
188
+
189
+ if (symbol.alias == "_global_" || symbol.is("FILE")) continue;
190
+ JSDOC.SymbolSet.prototype.walk.apply(this, [symbol]);
191
+ }
192
+ }
193
+
194
+ JSDOC.SymbolSet.prototype.walk = function(symbol) {
195
+ var augments = symbol.augments;
196
+ for(var i = 0; i < augments.length; i++) {
197
+ var contributer = this.getSymbol(augments[i]);
198
+ if (!contributer && JSDOC.Lang.isBuiltin(''+augments[i])) {
199
+ contributer = new JSDOC.Symbol("_global_."+augments[i], [], augments[i], new JSDOC.DocComment("Built in."));
200
+ contributer.isNamespace = true;
201
+ contributer.srcFile = "";
202
+ contributer.isPrivate = false;
203
+ JSDOC.Parser.addSymbol(contributer);
204
+ }
205
+
206
+ if (contributer) {
207
+ if (contributer.augments.length) {
208
+ JSDOC.SymbolSet.prototype.walk.apply(this, [contributer]);
209
+ }
210
+
211
+ symbol.inheritsFrom.push(contributer.alias);
212
+ //if (!isUnique(symbol.inheritsFrom)) {
213
+ // LOG.warn("Can't resolve augments: Circular reference: "+symbol.alias+" inherits from "+contributer.alias+" more than once.");
214
+ //}
215
+ //else {
216
+ var cmethods = contributer.methods;
217
+ var cproperties = contributer.properties;
218
+
219
+ for (var ci = 0, cl = cmethods.length; ci < cl; ci++) {
220
+ if (!cmethods[ci].isStatic) symbol.inherit(cmethods[ci]);
221
+ }
222
+ for (var ci = 0, cl = cproperties.length; ci < cl; ci++) {
223
+ if (!cproperties[ci].isStatic) symbol.inherit(cproperties[ci]);
224
+ }
225
+ //}
226
+ }
227
+ else LOG.warn("Can't augment contributer: "+augments[i]+", not found.");
228
+ }
229
+ }
@@ -0,0 +1,41 @@
1
+
2
+ /**
3
+ @constructor
4
+ */
5
+ JSDOC.TextStream = function(text) {
6
+ if (typeof(text) == "undefined") text = "";
7
+ text = ""+text;
8
+ this.text = text;
9
+ this.cursor = 0;
10
+ }
11
+
12
+ JSDOC.TextStream.prototype.look = function(n) {
13
+ if (typeof n == "undefined") n = 0;
14
+
15
+ if (this.cursor+n < 0 || this.cursor+n >= this.text.length) {
16
+ var result = new String("");
17
+ result.eof = true;
18
+ return result;
19
+ }
20
+ return this.text.charAt(this.cursor+n);
21
+ }
22
+
23
+ JSDOC.TextStream.prototype.next = function(n) {
24
+ if (typeof n == "undefined") n = 1;
25
+ if (n < 1) return null;
26
+
27
+ var pulled = "";
28
+ for (var i = 0; i < n; i++) {
29
+ if (this.cursor+i < this.text.length) {
30
+ pulled += this.text.charAt(this.cursor+i);
31
+ }
32
+ else {
33
+ var result = new String("");
34
+ result.eof = true;
35
+ return result;
36
+ }
37
+ }
38
+
39
+ this.cursor += n;
40
+ return pulled;
41
+ }
@@ -0,0 +1,18 @@
1
+ if (typeof JSDOC == "undefined") JSDOC = {};
2
+
3
+ /**
4
+ @constructor
5
+ */
6
+ JSDOC.Token = function(data, type, name) {
7
+ this.data = data;
8
+ this.type = type;
9
+ this.name = name;
10
+ }
11
+
12
+ JSDOC.Token.prototype.toString = function() {
13
+ return "<"+this.type+" name=\""+this.name+"\">"+this.data+"</"+this.type+">";
14
+ }
15
+
16
+ JSDOC.Token.prototype.is = function(what) {
17
+ return this.name === what || this.type === what;
18
+ }
@@ -0,0 +1,332 @@
1
+ if (typeof JSDOC == "undefined") JSDOC = {};
2
+
3
+ /**
4
+ @class Search a {@link JSDOC.TextStream} for language tokens.
5
+ */
6
+ JSDOC.TokenReader = function() {
7
+ this.keepDocs = true;
8
+ this.keepWhite = false;
9
+ this.keepComments = false;
10
+ }
11
+
12
+ /**
13
+ @type {JSDOC.Token[]}
14
+ */
15
+ JSDOC.TokenReader.prototype.tokenize = function(/**JSDOC.TextStream*/stream) {
16
+ var tokens = [];
17
+ /**@ignore*/ tokens.last = function() { return tokens[tokens.length-1]; }
18
+ /**@ignore*/ tokens.lastSym = function() {
19
+ for (var i = tokens.length-1; i >= 0; i--) {
20
+ if (!(tokens[i].is("WHIT") || tokens[i].is("COMM"))) return tokens[i];
21
+ }
22
+ }
23
+
24
+ while (!stream.look().eof) {
25
+ if (this.read_mlcomment(stream, tokens)) continue;
26
+ if (this.read_slcomment(stream, tokens)) continue;
27
+ if (this.read_dbquote(stream, tokens)) continue;
28
+ if (this.read_snquote(stream, tokens)) continue;
29
+ if (this.read_regx(stream, tokens)) continue;
30
+ if (this.read_numb(stream, tokens)) continue;
31
+ if (this.read_punc(stream, tokens)) continue;
32
+ if (this.read_newline(stream, tokens)) continue;
33
+ if (this.read_space(stream, tokens)) continue;
34
+ if (this.read_word(stream, tokens)) continue;
35
+
36
+ // if execution reaches here then an error has happened
37
+ tokens.push(new JSDOC.Token(stream.next(), "TOKN", "UNKNOWN_TOKEN"));
38
+ }
39
+ return tokens;
40
+ }
41
+
42
+ /**
43
+ @returns {Boolean} Was the token found?
44
+ */
45
+ JSDOC.TokenReader.prototype.read_word = function(/**JSDOC.TokenStream*/stream, tokens) {
46
+ var found = "";
47
+ while (!stream.look().eof && JSDOC.Lang.isWordChar(stream.look())) {
48
+ found += stream.next();
49
+ }
50
+
51
+ if (found === "") {
52
+ return false;
53
+ }
54
+ else {
55
+ var name;
56
+ if ((name = JSDOC.Lang.keyword(found))) tokens.push(new JSDOC.Token(found, "KEYW", name));
57
+ else tokens.push(new JSDOC.Token(found, "NAME", "NAME"));
58
+ return true;
59
+ }
60
+ }
61
+
62
+ /**
63
+ @returns {Boolean} Was the token found?
64
+ */
65
+ JSDOC.TokenReader.prototype.read_punc = function(/**JSDOC.TokenStream*/stream, tokens) {
66
+ var found = "";
67
+ var name;
68
+ while (!stream.look().eof && JSDOC.Lang.punc(found+stream.look())) {
69
+ found += stream.next();
70
+ }
71
+
72
+ if (found === "") {
73
+ return false;
74
+ }
75
+ else {
76
+ tokens.push(new JSDOC.Token(found, "PUNC", JSDOC.Lang.punc(found)));
77
+ return true;
78
+ }
79
+ }
80
+
81
+ /**
82
+ @returns {Boolean} Was the token found?
83
+ */
84
+ JSDOC.TokenReader.prototype.read_space = function(/**JSDOC.TokenStream*/stream, tokens) {
85
+ var found = "";
86
+
87
+ while (!stream.look().eof && JSDOC.Lang.isSpace(stream.look())) {
88
+ found += stream.next();
89
+ }
90
+
91
+ if (found === "") {
92
+ return false;
93
+ }
94
+ else {
95
+ if (this.collapseWhite) found = " ";
96
+ if (this.keepWhite) tokens.push(new JSDOC.Token(found, "WHIT", "SPACE"));
97
+ return true;
98
+ }
99
+ }
100
+
101
+ /**
102
+ @returns {Boolean} Was the token found?
103
+ */
104
+ JSDOC.TokenReader.prototype.read_newline = function(/**JSDOC.TokenStream*/stream, tokens) {
105
+ var found = "";
106
+
107
+ while (!stream.look().eof && JSDOC.Lang.isNewline(stream.look())) {
108
+ found += stream.next();
109
+ }
110
+
111
+ if (found === "") {
112
+ return false;
113
+ }
114
+ else {
115
+ if (this.collapseWhite) found = "\n";
116
+ if (this.keepWhite) tokens.push(new JSDOC.Token(found, "WHIT", "NEWLINE"));
117
+ return true;
118
+ }
119
+ }
120
+
121
+ /**
122
+ @returns {Boolean} Was the token found?
123
+ */
124
+ JSDOC.TokenReader.prototype.read_mlcomment = function(/**JSDOC.TokenStream*/stream, tokens) {
125
+ if (stream.look() == "/" && stream.look(1) == "*") {
126
+ var found = stream.next(2);
127
+
128
+ while (!stream.look().eof && !(stream.look(-1) == "/" && stream.look(-2) == "*")) {
129
+ found += stream.next();
130
+ }
131
+
132
+ // to start doclet we allow /** or /*** but not /**/ or /****
133
+ if (/^\/\*\*([^\/]|\*[^*])/.test(found) && this.keepDocs) tokens.push(new JSDOC.Token(found, "COMM", "JSDOC"));
134
+ else if (this.keepComments) tokens.push(new JSDOC.Token(found, "COMM", "MULTI_LINE_COMM"));
135
+ return true;
136
+ }
137
+ return false;
138
+ }
139
+
140
+ /**
141
+ @returns {Boolean} Was the token found?
142
+ */
143
+ JSDOC.TokenReader.prototype.read_slcomment = function(/**JSDOC.TokenStream*/stream, tokens) {
144
+ var found;
145
+ if (
146
+ (stream.look() == "/" && stream.look(1) == "/" && (found=stream.next(2)))
147
+ ||
148
+ (stream.look() == "<" && stream.look(1) == "!" && stream.look(2) == "-" && stream.look(3) == "-" && (found=stream.next(4)))
149
+ ) {
150
+
151
+ while (!stream.look().eof && !JSDOC.Lang.isNewline(stream.look())) {
152
+ found += stream.next();
153
+ }
154
+
155
+ if (this.keepComments) {
156
+ tokens.push(new JSDOC.Token(found, "COMM", "SINGLE_LINE_COMM"));
157
+ }
158
+ return true;
159
+ }
160
+ return false;
161
+ }
162
+
163
+ /**
164
+ @returns {Boolean} Was the token found?
165
+ */
166
+ JSDOC.TokenReader.prototype.read_dbquote = function(/**JSDOC.TokenStream*/stream, tokens) {
167
+ if (stream.look() == "\"") {
168
+ // find terminator
169
+ var string = stream.next();
170
+
171
+ while (!stream.look().eof) {
172
+ if (stream.look() == "\\") {
173
+ if (JSDOC.Lang.isNewline(stream.look(1))) {
174
+ do {
175
+ stream.next();
176
+ } while (!stream.look().eof && JSDOC.Lang.isNewline(stream.look()));
177
+ string += "\\\n";
178
+ }
179
+ else {
180
+ string += stream.next(2);
181
+ }
182
+ }
183
+ else if (stream.look() == "\"") {
184
+ string += stream.next();
185
+ tokens.push(new JSDOC.Token(string, "STRN", "DOUBLE_QUOTE"));
186
+ return true;
187
+ }
188
+ else {
189
+ string += stream.next();
190
+ }
191
+ }
192
+ }
193
+ return false; // error! unterminated string
194
+ }
195
+
196
+ /**
197
+ @returns {Boolean} Was the token found?
198
+ */
199
+ JSDOC.TokenReader.prototype.read_snquote = function(/**JSDOC.TokenStream*/stream, tokens) {
200
+ if (stream.look() == "'") {
201
+ // find terminator
202
+ var string = stream.next();
203
+
204
+ while (!stream.look().eof) {
205
+ if (stream.look() == "\\") { // escape sequence
206
+ string += stream.next(2);
207
+ }
208
+ else if (stream.look() == "'") {
209
+ string += stream.next();
210
+ tokens.push(new JSDOC.Token(string, "STRN", "SINGLE_QUOTE"));
211
+ return true;
212
+ }
213
+ else {
214
+ string += stream.next();
215
+ }
216
+ }
217
+ }
218
+ return false; // error! unterminated string
219
+ }
220
+
221
+ /**
222
+ @returns {Boolean} Was the token found?
223
+ */
224
+ JSDOC.TokenReader.prototype.read_numb = function(/**JSDOC.TokenStream*/stream, tokens) {
225
+ if (stream.look() === "0" && stream.look(1) == "x") {
226
+ return this.read_hex(stream, tokens);
227
+ }
228
+
229
+ var found = "";
230
+
231
+ while (!stream.look().eof && JSDOC.Lang.isNumber(found+stream.look())){
232
+ found += stream.next();
233
+ }
234
+
235
+ if (found === "") {
236
+ return false;
237
+ }
238
+ else {
239
+ if (/^0[0-7]/.test(found)) tokens.push(new JSDOC.Token(found, "NUMB", "OCTAL"));
240
+ else tokens.push(new JSDOC.Token(found, "NUMB", "DECIMAL"));
241
+ return true;
242
+ }
243
+ }
244
+ /*t:
245
+ requires("../lib/JSDOC/TextStream.js");
246
+ requires("../lib/JSDOC/Token.js");
247
+ requires("../lib/JSDOC/Lang.js");
248
+
249
+ plan(3, "testing JSDOC.TokenReader.prototype.read_numb");
250
+
251
+ //// setup
252
+ var src = "function foo(num){while (num+8.0 >= 0x20 && num < 0777){}}";
253
+ var tr = new JSDOC.TokenReader();
254
+ var tokens = tr.tokenize(new JSDOC.TextStream(src));
255
+
256
+ var hexToken, octToken, decToken;
257
+ for (var i = 0; i < tokens.length; i++) {
258
+ if (tokens[i].name == "HEX_DEC") hexToken = tokens[i];
259
+ if (tokens[i].name == "OCTAL") octToken = tokens[i];
260
+ if (tokens[i].name == "DECIMAL") decToken = tokens[i];
261
+ }
262
+ ////
263
+
264
+ is(decToken.data, "8.0", "decimal number is found in source.");
265
+ is(hexToken.data, "0x20", "hexdec number is found in source (issue #99).");
266
+ is(octToken.data, "0777", "octal number is found in source.");
267
+ */
268
+
269
+ /**
270
+ @returns {Boolean} Was the token found?
271
+ */
272
+ JSDOC.TokenReader.prototype.read_hex = function(/**JSDOC.TokenStream*/stream, tokens) {
273
+ var found = stream.next(2);
274
+
275
+ while (!stream.look().eof) {
276
+ if (JSDOC.Lang.isHexDec(found) && !JSDOC.Lang.isHexDec(found+stream.look())) { // done
277
+ tokens.push(new JSDOC.Token(found, "NUMB", "HEX_DEC"));
278
+ return true;
279
+ }
280
+ else {
281
+ found += stream.next();
282
+ }
283
+ }
284
+ return false;
285
+ }
286
+
287
+ /**
288
+ @returns {Boolean} Was the token found?
289
+ */
290
+ JSDOC.TokenReader.prototype.read_regx = function(/**JSDOC.TokenStream*/stream, tokens) {
291
+ var last;
292
+ if (
293
+ stream.look() == "/"
294
+ &&
295
+ (
296
+
297
+ (
298
+ !(last = tokens.lastSym()) // there is no last, the regex is the first symbol
299
+ ||
300
+ (
301
+ !last.is("NUMB")
302
+ && !last.is("NAME")
303
+ && !last.is("RIGHT_PAREN")
304
+ && !last.is("RIGHT_BRACKET")
305
+ )
306
+ )
307
+ )
308
+ ) {
309
+ var regex = stream.next();
310
+
311
+ while (!stream.look().eof) {
312
+ if (stream.look() == "\\") { // escape sequence
313
+ regex += stream.next(2);
314
+ }
315
+ else if (stream.look() == "/") {
316
+ regex += stream.next();
317
+
318
+ while (/[gmi]/.test(stream.look())) {
319
+ regex += stream.next();
320
+ }
321
+
322
+ tokens.push(new JSDOC.Token(regex, "REGX", "REGX"));
323
+ return true;
324
+ }
325
+ else {
326
+ regex += stream.next();
327
+ }
328
+ }
329
+ // error: unterminated regex
330
+ }
331
+ return false;
332
+ }