jsdoc-toolkit 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (111) hide show
  1. data/Rakefile +1 -0
  2. data/VERSION +1 -1
  3. data/jsdoc-toolkit.gemspec +108 -1
  4. data/src/jsdoc-toolkit/jsdoc-toolkit/README.txt +183 -0
  5. data/src/jsdoc-toolkit/jsdoc-toolkit/app/frame.js +33 -0
  6. data/src/jsdoc-toolkit/jsdoc-toolkit/app/frame/Chain.js +102 -0
  7. data/src/jsdoc-toolkit/jsdoc-toolkit/app/frame/Dumper.js +144 -0
  8. data/src/jsdoc-toolkit/jsdoc-toolkit/app/frame/Hash.js +84 -0
  9. data/src/jsdoc-toolkit/jsdoc-toolkit/app/frame/Link.js +153 -0
  10. data/src/jsdoc-toolkit/jsdoc-toolkit/app/frame/Namespace.js +10 -0
  11. data/src/jsdoc-toolkit/jsdoc-toolkit/app/frame/Opt.js +134 -0
  12. data/src/jsdoc-toolkit/jsdoc-toolkit/app/frame/Reflection.js +26 -0
  13. data/src/jsdoc-toolkit/jsdoc-toolkit/app/frame/String.js +93 -0
  14. data/src/jsdoc-toolkit/jsdoc-toolkit/app/frame/Testrun.js +129 -0
  15. data/src/jsdoc-toolkit/jsdoc-toolkit/app/handlers/FOODOC.js +26 -0
  16. data/src/jsdoc-toolkit/jsdoc-toolkit/app/handlers/XMLDOC.js +26 -0
  17. data/src/jsdoc-toolkit/jsdoc-toolkit/app/handlers/XMLDOC/DomReader.js +159 -0
  18. data/src/jsdoc-toolkit/jsdoc-toolkit/app/handlers/XMLDOC/XMLDoc.js +16 -0
  19. data/src/jsdoc-toolkit/jsdoc-toolkit/app/handlers/XMLDOC/XMLParse.js +292 -0
  20. data/src/jsdoc-toolkit/jsdoc-toolkit/app/lib/JSDOC.js +104 -0
  21. data/src/jsdoc-toolkit/jsdoc-toolkit/app/lib/JSDOC/DocComment.js +200 -0
  22. data/src/jsdoc-toolkit/jsdoc-toolkit/app/lib/JSDOC/DocTag.js +294 -0
  23. data/src/jsdoc-toolkit/jsdoc-toolkit/app/lib/JSDOC/JsDoc.js +126 -0
  24. data/src/jsdoc-toolkit/jsdoc-toolkit/app/lib/JSDOC/JsPlate.js +109 -0
  25. data/src/jsdoc-toolkit/jsdoc-toolkit/app/lib/JSDOC/Lang.js +144 -0
  26. data/src/jsdoc-toolkit/jsdoc-toolkit/app/lib/JSDOC/Parser.js +145 -0
  27. data/src/jsdoc-toolkit/jsdoc-toolkit/app/lib/JSDOC/PluginManager.js +33 -0
  28. data/src/jsdoc-toolkit/jsdoc-toolkit/app/lib/JSDOC/Symbol.js +645 -0
  29. data/src/jsdoc-toolkit/jsdoc-toolkit/app/lib/JSDOC/SymbolSet.js +241 -0
  30. data/src/jsdoc-toolkit/jsdoc-toolkit/app/lib/JSDOC/TextStream.js +41 -0
  31. data/src/jsdoc-toolkit/jsdoc-toolkit/app/lib/JSDOC/Token.js +18 -0
  32. data/src/jsdoc-toolkit/jsdoc-toolkit/app/lib/JSDOC/TokenReader.js +332 -0
  33. data/src/jsdoc-toolkit/jsdoc-toolkit/app/lib/JSDOC/TokenStream.js +133 -0
  34. data/src/jsdoc-toolkit/jsdoc-toolkit/app/lib/JSDOC/Util.js +32 -0
  35. data/src/jsdoc-toolkit/jsdoc-toolkit/app/lib/JSDOC/Walker.js +474 -0
  36. data/src/jsdoc-toolkit/jsdoc-toolkit/app/main.js +111 -0
  37. data/src/jsdoc-toolkit/jsdoc-toolkit/app/plugins/commentSrcJson.js +20 -0
  38. data/src/jsdoc-toolkit/jsdoc-toolkit/app/plugins/frameworkPrototype.js +16 -0
  39. data/src/jsdoc-toolkit/jsdoc-toolkit/app/plugins/functionCall.js +10 -0
  40. data/src/jsdoc-toolkit/jsdoc-toolkit/app/plugins/publishSrcHilite.js +62 -0
  41. data/src/jsdoc-toolkit/jsdoc-toolkit/app/plugins/symbolLink.js +10 -0
  42. data/src/jsdoc-toolkit/jsdoc-toolkit/app/plugins/tagParamConfig.js +31 -0
  43. data/src/jsdoc-toolkit/jsdoc-toolkit/app/plugins/tagSynonyms.js +43 -0
  44. data/src/jsdoc-toolkit/jsdoc-toolkit/app/run.js +348 -0
  45. data/src/jsdoc-toolkit/jsdoc-toolkit/app/t/TestDoc.js +144 -0
  46. data/src/jsdoc-toolkit/jsdoc-toolkit/app/t/runner.js +13 -0
  47. data/src/jsdoc-toolkit/jsdoc-toolkit/app/test.js +325 -0
  48. data/src/jsdoc-toolkit/jsdoc-toolkit/app/test/addon.js +24 -0
  49. data/src/jsdoc-toolkit/jsdoc-toolkit/app/test/anon_inner.js +14 -0
  50. data/src/jsdoc-toolkit/jsdoc-toolkit/app/test/augments.js +31 -0
  51. data/src/jsdoc-toolkit/jsdoc-toolkit/app/test/augments2.js +26 -0
  52. data/src/jsdoc-toolkit/jsdoc-toolkit/app/test/borrows.js +46 -0
  53. data/src/jsdoc-toolkit/jsdoc-toolkit/app/test/borrows2.js +23 -0
  54. data/src/jsdoc-toolkit/jsdoc-toolkit/app/test/config.js +22 -0
  55. data/src/jsdoc-toolkit/jsdoc-toolkit/app/test/constructs.js +18 -0
  56. data/src/jsdoc-toolkit/jsdoc-toolkit/app/test/encoding.js +10 -0
  57. data/src/jsdoc-toolkit/jsdoc-toolkit/app/test/encoding_other.js +12 -0
  58. data/src/jsdoc-toolkit/jsdoc-toolkit/app/test/event.js +54 -0
  59. data/src/jsdoc-toolkit/jsdoc-toolkit/app/test/exports.js +14 -0
  60. data/src/jsdoc-toolkit/jsdoc-toolkit/app/test/functions_anon.js +39 -0
  61. data/src/jsdoc-toolkit/jsdoc-toolkit/app/test/functions_nested.js +33 -0
  62. data/src/jsdoc-toolkit/jsdoc-toolkit/app/test/global.js +13 -0
  63. data/src/jsdoc-toolkit/jsdoc-toolkit/app/test/globals.js +25 -0
  64. data/src/jsdoc-toolkit/jsdoc-toolkit/app/test/ignore.js +10 -0
  65. data/src/jsdoc-toolkit/jsdoc-toolkit/app/test/inner.js +16 -0
  66. data/src/jsdoc-toolkit/jsdoc-toolkit/app/test/jsdoc_test.js +477 -0
  67. data/src/jsdoc-toolkit/jsdoc-toolkit/app/test/lend.js +33 -0
  68. data/src/jsdoc-toolkit/jsdoc-toolkit/app/test/memberof.js +19 -0
  69. data/src/jsdoc-toolkit/jsdoc-toolkit/app/test/memberof_constructor.js +17 -0
  70. data/src/jsdoc-toolkit/jsdoc-toolkit/app/test/module.js +17 -0
  71. data/src/jsdoc-toolkit/jsdoc-toolkit/app/test/name.js +19 -0
  72. data/src/jsdoc-toolkit/jsdoc-toolkit/app/test/namespace_nested.js +23 -0
  73. data/src/jsdoc-toolkit/jsdoc-toolkit/app/test/nocode.js +13 -0
  74. data/src/jsdoc-toolkit/jsdoc-toolkit/app/test/oblit_anon.js +20 -0
  75. data/src/jsdoc-toolkit/jsdoc-toolkit/app/test/overview.js +20 -0
  76. data/src/jsdoc-toolkit/jsdoc-toolkit/app/test/param_inline.js +37 -0
  77. data/src/jsdoc-toolkit/jsdoc-toolkit/app/test/params_optional.js +8 -0
  78. data/src/jsdoc-toolkit/jsdoc-toolkit/app/test/prototype.js +17 -0
  79. data/src/jsdoc-toolkit/jsdoc-toolkit/app/test/prototype_nested.js +9 -0
  80. data/src/jsdoc-toolkit/jsdoc-toolkit/app/test/prototype_oblit.js +13 -0
  81. data/src/jsdoc-toolkit/jsdoc-toolkit/app/test/prototype_oblit_constructor.js +24 -0
  82. data/src/jsdoc-toolkit/jsdoc-toolkit/app/test/public.js +10 -0
  83. data/src/jsdoc-toolkit/jsdoc-toolkit/app/test/scripts/code.js +5 -0
  84. data/src/jsdoc-toolkit/jsdoc-toolkit/app/test/scripts/notcode.txt +5 -0
  85. data/src/jsdoc-toolkit/jsdoc-toolkit/app/test/shared.js +42 -0
  86. data/src/jsdoc-toolkit/jsdoc-toolkit/app/test/shared2.js +2 -0
  87. data/src/jsdoc-toolkit/jsdoc-toolkit/app/test/shortcuts.js +22 -0
  88. data/src/jsdoc-toolkit/jsdoc-toolkit/app/test/static_this.js +13 -0
  89. data/src/jsdoc-toolkit/jsdoc-toolkit/app/test/synonyms.js +31 -0
  90. data/src/jsdoc-toolkit/jsdoc-toolkit/app/test/tosource.js +23 -0
  91. data/src/jsdoc-toolkit/jsdoc-toolkit/app/test/variable_redefine.js +14 -0
  92. data/src/jsdoc-toolkit/jsdoc-toolkit/changes.txt +107 -0
  93. data/src/jsdoc-toolkit/jsdoc-toolkit/conf/sample.conf +31 -0
  94. data/src/jsdoc-toolkit/jsdoc-toolkit/java/build.xml +36 -0
  95. data/src/jsdoc-toolkit/jsdoc-toolkit/java/build_1.4.xml +36 -0
  96. data/src/jsdoc-toolkit/jsdoc-toolkit/java/classes/js.jar +0 -0
  97. data/src/jsdoc-toolkit/jsdoc-toolkit/java/src/JsDebugRun.java +21 -0
  98. data/src/jsdoc-toolkit/jsdoc-toolkit/java/src/JsRun.java +21 -0
  99. data/src/jsdoc-toolkit/jsdoc-toolkit/jsdebug.jar +0 -0
  100. data/src/jsdoc-toolkit/jsdoc-toolkit/jsrun.jar +0 -0
  101. data/src/jsdoc-toolkit/jsdoc-toolkit/jsrun.sh +52 -0
  102. data/src/jsdoc-toolkit/jsdoc-toolkit/templates/jsdoc/allclasses.tmpl +17 -0
  103. data/src/jsdoc-toolkit/jsdoc-toolkit/templates/jsdoc/allfiles.tmpl +56 -0
  104. data/src/jsdoc-toolkit/jsdoc-toolkit/templates/jsdoc/class.tmpl +649 -0
  105. data/src/jsdoc-toolkit/jsdoc-toolkit/templates/jsdoc/index.tmpl +39 -0
  106. data/src/jsdoc-toolkit/jsdoc-toolkit/templates/jsdoc/publish.js +200 -0
  107. data/src/jsdoc-toolkit/jsdoc-toolkit/templates/jsdoc/static/default.css +162 -0
  108. data/src/jsdoc-toolkit/jsdoc-toolkit/templates/jsdoc/static/header.html +2 -0
  109. data/src/jsdoc-toolkit/jsdoc-toolkit/templates/jsdoc/static/index.html +19 -0
  110. data/src/jsdoc-toolkit/jsdoc-toolkit/templates/jsdoc/symbol.tmpl +35 -0
  111. metadata +108 -1
@@ -0,0 +1,294 @@
1
+ if (typeof JSDOC == "undefined") JSDOC = {};
2
+
3
+ /**
4
+ @constructor
5
+ */
6
+ JSDOC.DocTag = function(src) {
7
+ this.init();
8
+ if (typeof src != "undefined") {
9
+ this.parse(src);
10
+ }
11
+ }
12
+
13
+ /**
14
+ Create and initialize the properties of this.
15
+ */
16
+ JSDOC.DocTag.prototype.init = function() {
17
+ this.title = "";
18
+ this.type = "";
19
+ this.name = "";
20
+ this.isOptional = false;
21
+ this.defaultValue = "";
22
+ this.desc = "";
23
+
24
+ return this;
25
+ }
26
+
27
+ /**
28
+ Populate the properties of this from the given tag src.
29
+ @param {string} src
30
+ */
31
+ JSDOC.DocTag.prototype.parse = function(src) {
32
+ if (typeof src != "string") throw "src must be a string not "+(typeof src);
33
+
34
+ try {
35
+ src = this.nibbleTitle(src);
36
+ if (JSDOC.PluginManager) {
37
+ JSDOC.PluginManager.run("onDocTagSynonym", this);
38
+ }
39
+
40
+ src = this.nibbleType(src);
41
+
42
+ // only some tags are allowed to have names.
43
+ if (this.title == "param" || this.title == "property" || this.title == "config") { // @config is deprecated
44
+ src = this.nibbleName(src);
45
+ }
46
+ }
47
+ catch(e) {
48
+ if (LOG) LOG.warn(e);
49
+ else throw e;
50
+ }
51
+ this.desc = src; // whatever is left
52
+
53
+ // example tags need to have whitespace preserved
54
+ if (this.title != "example") this.desc = this.desc.trim();
55
+
56
+ if (JSDOC.PluginManager) {
57
+ JSDOC.PluginManager.run("onDocTag", this);
58
+ }
59
+ }
60
+
61
+ /**
62
+ Automatically called when this is stringified.
63
+ */
64
+ JSDOC.DocTag.prototype.toString = function() {
65
+ return this.desc;
66
+ }
67
+
68
+ /*t:
69
+ plan(1, "testing JSDOC.DocTag#toString");
70
+
71
+ var tag = new JSDOC.DocTag("param {object} date A valid date.");
72
+ is(""+tag, "A valid date.", "stringifying a tag returns the desc.");
73
+ */
74
+
75
+ /**
76
+ Find and shift off the title of a tag.
77
+ @param {string} src
78
+ @return src
79
+ */
80
+ JSDOC.DocTag.prototype.nibbleTitle = function(src) {
81
+ if (typeof src != "string") throw "src must be a string not "+(typeof src);
82
+
83
+ var parts = src.match(/^\s*(\S+)(?:\s([\s\S]*))?$/);
84
+
85
+ if (parts && parts[1]) this.title = parts[1];
86
+ if (parts && parts[2]) src = parts[2];
87
+ else src = "";
88
+
89
+ return src;
90
+ }
91
+
92
+ /*t:
93
+ plan(8, "testing JSDOC.DocTag#nibbleTitle");
94
+
95
+ var tag = new JSDOC.DocTag();
96
+
97
+ tag.init().nibbleTitle("aTitleGoesHere");
98
+ is(tag.title, "aTitleGoesHere", "a title can be found in a single-word string.");
99
+
100
+ var src = tag.init().nibbleTitle("aTitleGoesHere and the rest");
101
+ is(tag.title, "aTitleGoesHere", "a title can be found in a multi-word string.");
102
+ is(src, "and the rest", "the rest is returned when the title is nibbled off.");
103
+
104
+ src = tag.init().nibbleTitle("");
105
+ is(tag.title, "", "given an empty string the title is empty.");
106
+ is(src, "", "the rest is empty when the tag is empty.");
107
+
108
+ var src = tag.init().nibbleTitle(" aTitleGoesHere\n a description");
109
+ is(tag.title, "aTitleGoesHere", "leading and trailing spaces are not part of the title.");
110
+ is(src, " a description", "leading spaces (less one) are part of the description.");
111
+
112
+ tag.init().nibbleTitle("a.Title::Goes_Here foo");
113
+ is(tag.title, "a.Title::Goes_Here", "titles with punctuation are allowed.");
114
+ */
115
+
116
+ /**
117
+ Find and shift off the type of a tag.
118
+ @requires frame/String.js
119
+ @param {string} src
120
+ @return src
121
+ */
122
+ JSDOC.DocTag.prototype.nibbleType = function(src) {
123
+ if (typeof src != "string") throw "src must be a string not "+(typeof src);
124
+
125
+ if (src.match(/^\s*\{/)) {
126
+ var typeRange = src.balance("{", "}");
127
+ if (typeRange[1] == -1) {
128
+ throw "Malformed comment tag ignored. Tag type requires an opening { and a closing }: "+src;
129
+ }
130
+ this.type = src.substring(typeRange[0]+1, typeRange[1]).trim();
131
+ this.type = this.type.replace(/\s*,\s*/g, "|"); // multiples can be separated by , or |
132
+ src = src.substring(typeRange[1]+1);
133
+ }
134
+
135
+ return src;
136
+ }
137
+
138
+ /*t:
139
+ plan(5, "testing JSDOC.DocTag.parser.nibbleType");
140
+ requires("../frame/String.js");
141
+
142
+ var tag = new JSDOC.DocTag();
143
+
144
+ tag.init().nibbleType("{String[]} aliases");
145
+ is(tag.type, "String[]", "type can have non-alpha characters.");
146
+
147
+ tag.init().nibbleType("{ aTypeGoesHere } etc etc");
148
+ is(tag.type, "aTypeGoesHere", "type is trimmed.");
149
+
150
+ tag.init().nibbleType("{ oneType, twoType ,\n threeType } etc etc");
151
+ is(tag.type, "oneType|twoType|threeType", "multiple types can be separated by commas.");
152
+
153
+ var error;
154
+ try { tag.init().nibbleType("{widget foo"); }
155
+ catch(e) { error = e; }
156
+ is(typeof error, "string", "malformed tag type throws error.");
157
+ isnt(error.indexOf("Malformed"), -1, "error message tells tag is malformed.");
158
+ */
159
+
160
+ /**
161
+ Find and shift off the name of a tag.
162
+ @requires frame/String.js
163
+ @param {string} src
164
+ @return src
165
+ */
166
+ JSDOC.DocTag.prototype.nibbleName = function(src) {
167
+ if (typeof src != "string") throw "src must be a string not "+(typeof src);
168
+
169
+ src = src.trim();
170
+
171
+ // is optional?
172
+ if (src.charAt(0) == "[") {
173
+ var nameRange = src.balance("[", "]");
174
+ if (nameRange[1] == -1) {
175
+ throw "Malformed comment tag ignored. Tag optional name requires an opening [ and a closing ]: "+src;
176
+ }
177
+ this.name = src.substring(nameRange[0]+1, nameRange[1]).trim();
178
+ this.isOptional = true;
179
+
180
+ src = src.substring(nameRange[1]+1);
181
+
182
+ // has default value?
183
+ var nameAndValue = this.name.split("=");
184
+ if (nameAndValue.length) {
185
+ this.name = nameAndValue.shift().trim();
186
+ this.defaultValue = nameAndValue.join("=");
187
+ }
188
+ }
189
+ else {
190
+ var parts = src.match(/^(\S+)(?:\s([\s\S]*))?$/);
191
+ if (parts) {
192
+ if (parts[1]) this.name = parts[1];
193
+ if (parts[2]) src = parts[2].trim();
194
+ else src = "";
195
+ }
196
+ }
197
+
198
+ return src;
199
+ }
200
+
201
+ /*t:
202
+ requires("../frame/String.js");
203
+ plan(9, "testing JSDOC.DocTag.parser.nibbleName");
204
+
205
+ var tag = new JSDOC.DocTag();
206
+
207
+ tag.init().nibbleName("[foo] This is a description.");
208
+ is(tag.isOptional, true, "isOptional syntax is detected.");
209
+ is(tag.name, "foo", "optional param name is found.");
210
+
211
+ tag.init().nibbleName("[foo] This is a description.");
212
+ is(tag.isOptional, true, "isOptional syntax is detected when no type.");
213
+ is(tag.name, "foo", "optional param name is found when no type.");
214
+
215
+ tag.init().nibbleName("[foo=7] This is a description.");
216
+ is(tag.name, "foo", "optional param name is found when default value.");
217
+ is(tag.defaultValue, 7, "optional param default value is found when default value.");
218
+
219
+ //tag.init().nibbleName("[foo= a value] This is a description.");
220
+ //is(tag.defaultValue, " a value", "optional param default value is found when default value has spaces (issue #112).");
221
+
222
+ tag.init().nibbleName("[foo=[]] This is a description.");
223
+ is(tag.defaultValue, "[]", "optional param default value is found when default value is [] (issue #95).");
224
+
225
+ tag.init().nibbleName("[foo=a=b] This is a description.");
226
+ is(tag.name, "foo", "optional param name is found when default value is a=b.");
227
+ is(tag.defaultValue, "a=b", "optional param default value is found when default value is a=b.")
228
+ */
229
+
230
+ /*t:
231
+ plan(32, "Testing JSDOC.DocTag.parser.");
232
+ requires("../frame/String.js");
233
+
234
+ var tag = new JSDOC.DocTag();
235
+
236
+ is(typeof tag, "object", "JSDOC.DocTag.parser with an empty string returns an object.");
237
+ is(typeof tag.title, "string", "returned object has a string property 'title'.");
238
+ is(typeof tag.type, "string", "returned object has a string property 'type'.");
239
+ is(typeof tag.name, "string", "returned object has a string property 'name'.");
240
+ is(typeof tag.defaultValue, "string", "returned object has a string property 'defaultValue'.");
241
+ is(typeof tag.isOptional, "boolean", "returned object has a boolean property 'isOptional'.");
242
+ is(typeof tag.desc, "string", "returned object has a string property 'desc'.");
243
+
244
+ tag = new JSDOC.DocTag("param {widget} foo");
245
+ is(tag.title, "param", "param title is found.");
246
+ is(tag.name, "foo", "param name is found when desc is missing.");
247
+ is(tag.desc, "", "param desc is empty when missing.");
248
+
249
+ tag = new JSDOC.DocTag("param {object} date A valid date.");
250
+ is(tag.name, "date", "param name is found with a type.");
251
+ is(tag.type, "object", "param type is found.");
252
+ is(tag.desc, "A valid date.", "param desc is found with a type.");
253
+
254
+ tag = new JSDOC.DocTag("param aName a description goes\n here.");
255
+ is(tag.name, "aName", "param name is found without a type.");
256
+ is(tag.desc, "a description goes\n here.", "param desc is found without a type.");
257
+
258
+ tag = new JSDOC.DocTag("param {widget}");
259
+ is(tag.name, "", "param name is empty when it is not given.");
260
+
261
+ tag = new JSDOC.DocTag("param {widget} [foo] This is a description.");
262
+ is(tag.name, "foo", "optional param name is found.");
263
+
264
+ tag = new JSDOC.DocTag("return {aType} This is a description.");
265
+ is(tag.type, "aType", "when return tag has no name, type is found.");
266
+ is(tag.desc, "This is a description.", "when return tag has no name, desc is found.");
267
+
268
+ tag = new JSDOC.DocTag("author Joe Coder <jcoder@example.com>");
269
+ is(tag.title, "author", "author tag has a title.");
270
+ is(tag.type, "", "the author tag has no type.");
271
+ is(tag.name, "", "the author tag has no name.");
272
+ is(tag.desc, "Joe Coder <jcoder@example.com>", "author tag has desc.");
273
+
274
+ tag = new JSDOC.DocTag("private \t\n ");
275
+ is(tag.title, "private", "private tag has a title.");
276
+ is(tag.type, "", "the private tag has no type.");
277
+ is(tag.name, "", "the private tag has no name.");
278
+ is(tag.desc, "", "private tag has no desc.");
279
+
280
+ tag = new JSDOC.DocTag("example\n example(code);\n more();");
281
+ is(tag.desc, " example(code);\n more();", "leading whitespace (less one) in examples code is preserved.");
282
+
283
+ tag = new JSDOC.DocTag("param theName \n");
284
+ is(tag.name, "theName", "name only is found.");
285
+
286
+ tag = new JSDOC.DocTag("type theDesc \n");
287
+ is(tag.desc, "theDesc", "desc only is found.");
288
+
289
+ tag = new JSDOC.DocTag("type {theType} \n");
290
+ is(tag.type, "theType", "type only is found.");
291
+
292
+ tag = new JSDOC.DocTag("");
293
+ is(tag.title, "", "title is empty when tag is empty.");
294
+ */
@@ -0,0 +1,126 @@
1
+ /**
2
+ @constructor
3
+ @param [opt] Used to override the commandline options. Useful for testing.
4
+ @version $Id$
5
+ */
6
+ JSDOC.JsDoc = function(/**object*/ opt) {
7
+ if (opt) {
8
+ JSDOC.opt = opt;
9
+ }
10
+
11
+ if (JSDOC.opt.h) {
12
+ JSDOC.usage();
13
+ quit();
14
+ }
15
+
16
+ // defend against options that are not sane
17
+ if (JSDOC.opt._.length == 0) {
18
+ LOG.warn("No source files to work on. Nothing to do.");
19
+ quit();
20
+ }
21
+ if (JSDOC.opt.t === true || JSDOC.opt.d === true) {
22
+ JSDOC.usage();
23
+ }
24
+
25
+ if (typeof JSDOC.opt.d == "string") {
26
+ if (!JSDOC.opt.d.charAt(JSDOC.opt.d.length-1).match(/[\\\/]/)) {
27
+ JSDOC.opt.d = JSDOC.opt.d+"/";
28
+ }
29
+ LOG.inform("Output directory set to '"+JSDOC.opt.d+"'.");
30
+ IO.mkPath(JSDOC.opt.d);
31
+ }
32
+ if (JSDOC.opt.e) IO.setEncoding(JSDOC.opt.e);
33
+
34
+ // the -r option: scan source directories recursively
35
+ if (typeof JSDOC.opt.r == "boolean") JSDOC.opt.r = 10;
36
+ else if (!isNaN(parseInt(JSDOC.opt.r))) JSDOC.opt.r = parseInt(JSDOC.opt.r);
37
+ else JSDOC.opt.r = 1;
38
+
39
+ // the -D option: define user variables
40
+ var D = {};
41
+ if (JSDOC.opt.D) {
42
+ for (var i = 0; i < JSDOC.opt.D.length; i++) {
43
+ var defineParts = JSDOC.opt.D[i].split(":", 2);
44
+ if (defineParts) D[defineParts[0]] = defineParts[1];
45
+ }
46
+ }
47
+ JSDOC.opt.D = D;
48
+ // combine any conf file D options with the commandline D options
49
+ if (defined(JSDOC.conf)) for (var c in JSDOC.conf.D) {
50
+ if (!defined(JSDOC.opt.D[c])) {
51
+ JSDOC.opt.D[c] = JSDOC.conf.D[c];
52
+ }
53
+ }
54
+
55
+ // Give plugins a chance to initialize
56
+ if (defined(JSDOC.PluginManager)) {
57
+ JSDOC.PluginManager.run("onInit", JSDOC.opt);
58
+ }
59
+
60
+ JSDOC.opt.srcFiles = JSDOC.JsDoc._getSrcFiles();
61
+ JSDOC.JsDoc._parseSrcFiles();
62
+ JSDOC.JsDoc.symbolSet = JSDOC.Parser.symbols;
63
+ }
64
+
65
+ /**
66
+ Retrieve source file list.
67
+ @returns {String[]} The pathnames of the files to be parsed.
68
+ */
69
+ JSDOC.JsDoc._getSrcFiles = function() {
70
+ JSDOC.JsDoc.srcFiles = [];
71
+
72
+ var ext = ["js"];
73
+ if (JSDOC.opt.x) {
74
+ ext = JSDOC.opt.x.split(",").map(function($) {return $.toLowerCase()});
75
+ }
76
+
77
+ for (var i = 0; i < JSDOC.opt._.length; i++) {
78
+ JSDOC.JsDoc.srcFiles = JSDOC.JsDoc.srcFiles.concat(
79
+ IO.ls(JSDOC.opt._[i], JSDOC.opt.r).filter(
80
+ function($) {
81
+ var thisExt = $.split(".").pop().toLowerCase();
82
+
83
+ if (JSDOC.opt.E) {
84
+ for(var n = 0; n < JSDOC.opt.E.length; n++) {
85
+ if ($.match(new RegExp(JSDOC.opt.E[n]))) {
86
+ LOG.inform("Excluding " + $);
87
+ return false; // if the file matches the regex then it's excluded.
88
+ }
89
+ }
90
+ }
91
+
92
+ return (ext.indexOf(thisExt) > -1); // we're only interested in files with certain extensions
93
+ }
94
+ )
95
+ );
96
+ }
97
+
98
+ return JSDOC.JsDoc.srcFiles;
99
+ }
100
+
101
+ JSDOC.JsDoc._parseSrcFiles = function() {
102
+ JSDOC.Parser.init();
103
+ for (var i = 0, l = JSDOC.JsDoc.srcFiles.length; i < l; i++) {
104
+ var srcFile = JSDOC.JsDoc.srcFiles[i];
105
+
106
+ if (JSDOC.opt.v) LOG.inform("Parsing file: " + srcFile);
107
+
108
+ try {
109
+ var src = IO.readFile(srcFile);
110
+ }
111
+ catch(e) {
112
+ LOG.warn("Can't read source file '"+srcFile+"': "+e.message);
113
+ }
114
+
115
+ var tr = new JSDOC.TokenReader();
116
+ var ts = new JSDOC.TokenStream(tr.tokenize(new JSDOC.TextStream(src)));
117
+
118
+ JSDOC.Parser.parse(ts, srcFile);
119
+
120
+ }
121
+ JSDOC.Parser.finish();
122
+
123
+ if (JSDOC.PluginManager) {
124
+ JSDOC.PluginManager.run("onFinishedParsing", JSDOC.Parser.symbols);
125
+ }
126
+ }
@@ -0,0 +1,109 @@
1
+ /**
2
+ @constructor
3
+ */
4
+ JSDOC.JsPlate = function(templateFile) {
5
+ if (templateFile) this.template = IO.readFile(templateFile);
6
+
7
+ this.templateFile = templateFile;
8
+ this.code = "";
9
+ this.parse();
10
+ }
11
+
12
+ JSDOC.JsPlate.prototype.parse = function() {
13
+ this.template = this.template.replace(/\{#[\s\S]+?#\}/gi, "");
14
+ this.code = "var output=\u001e"+this.template;
15
+
16
+ this.code = this.code.replace(
17
+ /<for +each="(.+?)" +in="(.+?)" *>/gi,
18
+ function (match, eachName, inName) {
19
+ return "\u001e;\rvar $"+eachName+"_keys = keys("+inName+");\rfor(var $"+eachName+"_i = 0; $"+eachName+"_i < $"+eachName+"_keys.length; $"+eachName+"_i++) {\rvar $"+eachName+"_last = ($"+eachName+"_i == $"+eachName+"_keys.length-1);\rvar $"+eachName+"_key = $"+eachName+"_keys[$"+eachName+"_i];\rvar "+eachName+" = "+inName+"[$"+eachName+"_key];\routput+=\u001e";
20
+ }
21
+ );
22
+ this.code = this.code.replace(/<if test="(.+?)">/g, "\u001e;\rif ($1) { output+=\u001e");
23
+ this.code = this.code.replace(/<elseif test="(.+?)"\s*\/>/g, "\u001e;}\relse if ($1) { output+=\u001e");
24
+ this.code = this.code.replace(/<else\s*\/>/g, "\u001e;}\relse { output+=\u001e");
25
+ this.code = this.code.replace(/<\/(if|for)>/g, "\u001e;\r};\routput+=\u001e");
26
+ this.code = this.code.replace(
27
+ /\{\+\s*([\s\S]+?)\s*\+\}/gi,
28
+ function (match, code) {
29
+ code = code.replace(/"/g, "\u001e"); // prevent qoute-escaping of inline code
30
+ code = code.replace(/(\r?\n)/g, " ");
31
+ return "\u001e+ ("+code+") +\u001e";
32
+ }
33
+ );
34
+ this.code = this.code.replace(
35
+ /\{!\s*([\s\S]+?)\s*!\}/gi,
36
+ function (match, code) {
37
+ code = code.replace(/"/g, "\u001e"); // prevent qoute-escaping of inline code
38
+ code = code.replace(/(\n)/g, " ");
39
+ return "\u001e; "+code+";\routput+=\u001e";
40
+ }
41
+ );
42
+ this.code = this.code+"\u001e;";
43
+
44
+ this.code = this.code.replace(/(\r?\n)/g, "\\n");
45
+ this.code = this.code.replace(/"/g, "\\\"");
46
+ this.code = this.code.replace(/\u001e/g, "\"");
47
+ }
48
+
49
+ JSDOC.JsPlate.prototype.toCode = function() {
50
+ return this.code;
51
+ }
52
+
53
+ JSDOC.JsPlate.keys = function(obj) {
54
+ var keys = [];
55
+ if (obj.constructor.toString().indexOf("Array") > -1) {
56
+ for (var i = 0; i < obj.length; i++) {
57
+ keys.push(i);
58
+ }
59
+ }
60
+ else {
61
+ for (var i in obj) {
62
+ keys.push(i);
63
+ }
64
+ }
65
+ return keys;
66
+ };
67
+
68
+ JSDOC.JsPlate.values = function(obj) {
69
+ var values = [];
70
+ if (obj.constructor.toString().indexOf("Array") > -1) {
71
+ for (var i = 0; i < obj.length; i++) {
72
+ values.push(obj[i]);
73
+ }
74
+ }
75
+ else {
76
+ for (var i in obj) {
77
+ values.push(obj[i]);
78
+ }
79
+ }
80
+ return values;
81
+ };
82
+
83
+ JSDOC.JsPlate.prototype.process = function(data, compact) {
84
+ var keys = JSDOC.JsPlate.keys;
85
+ var values = JSDOC.JsPlate.values;
86
+
87
+ try {
88
+ eval(this.code);
89
+ }
90
+ catch (e) {
91
+ print(">> There was an error evaluating the compiled code from template: "+this.templateFile);
92
+ print(" The error was on line "+e.lineNumber+" "+e.name+": "+e.message);
93
+ var lines = this.code.split("\r");
94
+ if (e.lineNumber-2 >= 0) print("line "+(e.lineNumber-1)+": "+lines[e.lineNumber-2]);
95
+ print("line "+e.lineNumber+": "+lines[e.lineNumber-1]);
96
+ print("");
97
+ }
98
+
99
+ if (compact) { // patch by mcbain.asm
100
+ // Remove lines that contain only space-characters, usually left by lines in the template
101
+ // which originally only contained JSPlate tags or code. This makes it easier to write
102
+ // non-tricky templates which still put out nice code (not bloated with extra lines).
103
+ // Lines purposely left blank (just a line ending) are left alone.
104
+ output = output.replace(/\s+?(\r?)\n/g, "$1\n");
105
+ }
106
+
107
+ /*debug*///print(this.code);
108
+ return output;
109
+ }