204 lines
5.5 KiB
JavaScript
204 lines
5.5 KiB
JavaScript
|
if (typeof JSDOC == "undefined") JSDOC = {};
|
||
|
|
||
|
/**
|
||
|
Create a new DocComment. This takes a raw documentation comment,
|
||
|
and wraps it in useful accessors.
|
||
|
@class Represents a documentation comment object.
|
||
|
*/
|
||
|
JSDOC.DocComment = function(/**String*/comment) {
|
||
|
this.init();
|
||
|
if (typeof comment != "undefined") {
|
||
|
this.parse(comment);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
JSDOC.DocComment.prototype.init = function() {
|
||
|
this.isUserComment = true;
|
||
|
this.src = "";
|
||
|
this.meta = "";
|
||
|
this.tagTexts = [];
|
||
|
this.tags = [];
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
@requires JSDOC.DocTag
|
||
|
*/
|
||
|
JSDOC.DocComment.prototype.parse = function(/**String*/comment) {
|
||
|
if (comment == "") {
|
||
|
comment = "/** @desc */";
|
||
|
this.isUserComment = false;
|
||
|
}
|
||
|
|
||
|
this.src = JSDOC.DocComment.unwrapComment(comment);
|
||
|
|
||
|
this.meta = "";
|
||
|
if (this.src.indexOf("#") == 0) {
|
||
|
this.src.match(/#(.+[+-])([\s\S]*)$/);
|
||
|
if (RegExp.$1) this.meta = RegExp.$1;
|
||
|
if (RegExp.$2) this.src = RegExp.$2;
|
||
|
}
|
||
|
|
||
|
if (typeof JSDOC.PluginManager != "undefined") {
|
||
|
JSDOC.PluginManager.run("onDocCommentSrc", this);
|
||
|
}
|
||
|
|
||
|
this.fixDesc();
|
||
|
|
||
|
this.src = JSDOC.DocComment.shared+"\n"+this.src;
|
||
|
|
||
|
this.tagTexts =
|
||
|
this.src
|
||
|
.split(/(^|[\r\n])\s*@/)
|
||
|
.filter(function($){return $.match(/\S/)});
|
||
|
|
||
|
/**
|
||
|
The tags found in the comment.
|
||
|
@type JSDOC.DocTag[]
|
||
|
*/
|
||
|
this.tags = this.tagTexts.map(function($){return new JSDOC.DocTag($)});
|
||
|
|
||
|
if (typeof JSDOC.PluginManager != "undefined") {
|
||
|
JSDOC.PluginManager.run("onDocCommentTags", this);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*t:
|
||
|
plan(5, "testing JSDOC.DocComment");
|
||
|
requires("../frame/String.js");
|
||
|
requires("../lib/JSDOC/DocTag.js");
|
||
|
|
||
|
var com = new JSDOC.DocComment("/**@foo some\n* comment here*"+"/");
|
||
|
is(com.tagTexts[0], "foo some\ncomment here", "first tag text is found.");
|
||
|
is(com.tags[0].title, "foo", "the title is found in a comment with one tag.");
|
||
|
|
||
|
var com = new JSDOC.DocComment("/** @foo first\n* @bar second*"+"/");
|
||
|
is(com.getTag("bar").length, 1, "getTag() returns one tag by that title.");
|
||
|
|
||
|
JSDOC.DocComment.shared = "@author John Smith";
|
||
|
var com = new JSDOC.DocComment("/**@foo some\n* comment here*"+"/");
|
||
|
is(com.tags[0].title, "author", "shared comment is added.");
|
||
|
is(com.tags[1].title, "foo", "shared comment is added to existing tag.");
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
If no @desc tag is provided, this function will add it.
|
||
|
*/
|
||
|
JSDOC.DocComment.prototype.fixDesc = function() {
|
||
|
if (this.meta && this.meta != "@+") return;
|
||
|
if (/^\s*[^@\s]/.test(this.src)) {
|
||
|
this.src = "@desc "+this.src;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*t:
|
||
|
plan(5, "testing JSDOC.DocComment#fixDesc");
|
||
|
|
||
|
var com = new JSDOC.DocComment();
|
||
|
|
||
|
com.src = "this is a desc\n@author foo";
|
||
|
com.fixDesc();
|
||
|
is(com.src, "@desc this is a desc\n@author foo", "if no @desc tag is provided one is added.");
|
||
|
|
||
|
com.src = "x";
|
||
|
com.fixDesc();
|
||
|
is(com.src, "@desc x", "if no @desc tag is provided one is added to a single character.");
|
||
|
|
||
|
com.src = "\nx";
|
||
|
com.fixDesc();
|
||
|
is(com.src, "@desc \nx", "if no @desc tag is provided one is added to return and character.");
|
||
|
|
||
|
com.src = " ";
|
||
|
com.fixDesc();
|
||
|
is(com.src, " ", "if no @desc tag is provided one is not added to just whitespace.");
|
||
|
|
||
|
com.src = "";
|
||
|
com.fixDesc();
|
||
|
is(com.src, "", "if no @desc tag is provided one is not added to empty.");
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
Remove slash-star comment wrapper from a raw comment string.
|
||
|
@type String
|
||
|
*/
|
||
|
JSDOC.DocComment.unwrapComment = function(/**String*/comment) {
|
||
|
if (!comment) return "";
|
||
|
var unwrapped = comment.replace(/(^\/\*\*|\*\/$)/g, "").replace(/^\s*\* ?/gm, "");
|
||
|
return unwrapped;
|
||
|
}
|
||
|
|
||
|
/*t:
|
||
|
plan(5, "testing JSDOC.DocComment.unwrapComment");
|
||
|
|
||
|
var com = "/**x*"+"/";
|
||
|
var unwrapped = JSDOC.DocComment.unwrapComment(com);
|
||
|
is(unwrapped, "x", "a single character jsdoc is found.");
|
||
|
|
||
|
com = "/***x*"+"/";
|
||
|
unwrapped = JSDOC.DocComment.unwrapComment(com);
|
||
|
is(unwrapped, "x", "three stars are allowed in the opener.");
|
||
|
|
||
|
com = "/****x*"+"/";
|
||
|
unwrapped = JSDOC.DocComment.unwrapComment(com);
|
||
|
is(unwrapped, "*x", "fourth star in the opener is kept.");
|
||
|
|
||
|
com = "/**x\n * y\n*"+"/";
|
||
|
unwrapped = JSDOC.DocComment.unwrapComment(com);
|
||
|
is(unwrapped, "x\ny\n", "leading stars and spaces are trimmed.");
|
||
|
|
||
|
com = "/**x\n * y\n*"+"/";
|
||
|
unwrapped = JSDOC.DocComment.unwrapComment(com);
|
||
|
is(unwrapped, "x\n y\n", "only first space after leading stars are trimmed.");
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
Provides a printable version of the comment.
|
||
|
@type String
|
||
|
*/
|
||
|
JSDOC.DocComment.prototype.toString = function() {
|
||
|
return this.src;
|
||
|
}
|
||
|
|
||
|
/*t:
|
||
|
plan(1, "testing JSDOC.DocComment#fixDesc");
|
||
|
var com = new JSDOC.DocComment();
|
||
|
com.src = "foo";
|
||
|
is(""+com, "foo", "stringifying a comment returns the unwrapped src.");
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
Given the title of a tag, returns all tags that have that title.
|
||
|
@type JSDOC.DocTag[]
|
||
|
*/
|
||
|
JSDOC.DocComment.prototype.getTag = function(/**String*/tagTitle) {
|
||
|
return this.tags.filter(function($){return $.title == tagTitle});
|
||
|
}
|
||
|
|
||
|
JSDOC.DocComment.prototype.deleteTag = function(/**String*/tagTitle) {
|
||
|
this.tags = this.tags.filter(function($){return $.title != tagTitle})
|
||
|
}
|
||
|
|
||
|
/*t:
|
||
|
plan(1, "testing JSDOC.DocComment#getTag");
|
||
|
requires("../frame/String.js");
|
||
|
requires("../lib/JSDOC/DocTag.js");
|
||
|
|
||
|
var com = new JSDOC.DocComment("/**@foo some\n* @bar\n* @bar*"+"/");
|
||
|
is(com.getTag("bar").length, 2, "getTag returns expected number of tags.");
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
Used to store the currently shared tag text.
|
||
|
*/
|
||
|
JSDOC.DocComment.shared = "";
|
||
|
|
||
|
/*t:
|
||
|
plan(2, "testing JSDOC.DocComment.shared");
|
||
|
requires("../frame/String.js");
|
||
|
requires("../lib/JSDOC/DocTag.js");
|
||
|
|
||
|
JSDOC.DocComment.shared = "@author Michael";
|
||
|
|
||
|
var com = new JSDOC.DocComment("/**@foo\n* @foo*"+"/");
|
||
|
is(com.getTag("author").length, 1, "getTag returns shared tag.");
|
||
|
is(com.getTag("foo").length, 2, "getTag returns unshared tags too.");
|
||
|
*/
|