关于JSDoc插件
目录
创建并启用插件
创建并启用新JSDoc插件,需要两个步骤:
- 创建一个包含你的插件代码的JavaScript模块.
- 将该模块添加到JSDoc配置文件的
plugins
数组中。你可以指定一个绝对或相对路径。如果使用相对路径,JSDoc按照相对于配置文件所在的目录,当前的工作目录和JSDoc安装目录的顺序搜索插件。
例如,如果你的插件是在当前工作目录下,plugins/shout.js
文件中定义的,你应该在JSDoc配置文件中的plugins
数组中添加字符串plugins/shout
。
JSDoc按配置文件plugins数组中列出的顺序执行的插件。
创建JSDoc3插件
JSDoc 3的插件系统广泛的控制着解析过程。一个插件可以通过执行以下任何一项操作,影响解析结果:
- 定义事件处理程序
- 定义标签
- 定义一个抽象语法树节点的访问者
事件处理程序
最高级别,一个插件可以注册具体命名事件的处理程序,让JSDoc触发。 JSDoc将一个事件对象传递给处理程序。你的插件模块要导出一个包含处理程序的handlers
对象,像这样:
JSDoc触发事件的顺序和底层代码是一样。
事件处理程序插件可以通过设置事件对象的stopPropagation
属性(e.stopPropagation =
true
)停止运行后面的插件。一个插件可以通过设置preventDefault
属性(e.preventDefault = true
)阻止触发事件。
事件: parseBegin
JSDoc开始加载和解析源文件之前,parseBegin
事件被触发。你的插件可以通过修改事件的内容,来控制哪些文件将被JSDoc解析。
注意:此事件在JSDoc3.2及更高版本有效。
该事件对象包含下列属性:
sourcefiles
:源文件的路径数组,这些源文件将被解析。
事件: fileBegin
当解析器即将解析一个文件fileBegin
事件触发。如果需要,你的插件可以使用此事件触发每个文件的初始化。
该事件对象包含下列属性:
filename
:文件的名称。
事件: beforeParse
beforeParse
事件在解析开始之前被触发。插件可以使用此方法来修改将被解析的源代码。例如,你的插件可以添加一个JSDoc注释,也可以删除不是有效JavaScript的预处理标记。
该事件对象包含下列属性:
filename
:文件的名称。source
:文件的内容。
下面是为一个函数增加了一个虚拟的doclet到源文件的例子,这样它会被解析并添加到文档。这样做,文档的方法就可以提供给用户,但在被文档化的源代码中不可能出现,如由外部超类所提供的方法:
事件: jsdocCommentFound
每当JSDoc注释被发现,jsdocCommentFound
事件就会被触发。注释可以或不与任何代码相关联。您可以在注释被处理之前使用此事件修改注释的内容。
该事件对象包含下列属性:
filename
: 该文件的名称。comment
:JSDoc注释的文本。lineno
: 注释被发现的行号。columnno
: The column number on which the comment was found. Available in JSDoc 3.5.0 and later.
事件: symbolFound
当解析器在代码中遇到一个可能需要被文档化的标识符时,symbolFound
事件就会被触发。例如,解析器会为源文件中每个变量,函数和对象字面量触发一个symbolFound
事件。
该事件对象包含下列属性:
filename
:该文件的名称。comment
:与标识符相关联的任何注释文本。id
:标识符的唯一ID。lineno
:标识符被发现的行号。columnno
: The column number on which the symbol was found. Available in JSDoc 3.5.0 and later.range
:包含标识符相关联的源文件中第一个和最后一个字符的数字索引的一个数组。astnode
:抽象语法树中标识符的节点。code
:有关该代码的详细信息的对象。这个对象通常包含name
,type
, 和node
属性。对象也可能具有value
,paramnames
, 或funcscope
属性,这取决于标识符。
事件: newDoclet
newDoclet
事件是最高级别的事件。新的doclet已被创建时,它就会被触发。这意味着一个JSDoc注释或标识符已被处理,并且实际传递给模板的doclet已被创建。
该事件对象包含下列属性:
doclet
: 已被创建的新 doclet 。
所述的doclet的属性取决于doclet表示的注释或标识符。你可能会看到一些共同的属性包括:
comment
: JSDoc注释文本,或者,如果标识符没被描述,那么该值是一个空字符串。meta
: 对象,描述doclet如何关联源文件(例如,在源文件中的位置)。description
: 被记录的标识符的说明。kind
: 被记录的标识符的种类(例如,class
或者function
)。name
: 标识符的短名称(例如,myMethod
)。longname
: 全名,其中包含成员信息(例如,MyClass#myMethod
)。memberof
: 该标识符所读的模块,命名空间或类(例如,MyClass
),或者,如果该标识符没有父级,那么该值是一个空字符串。scope
:标识符在其父级内的作用域范围(例如,global
,static
,instance
,或inner
).undocumented
: 如果标识符没有JSDoc注释,设置为true
。defaultvalue
: 标识符的默认值。type
: 包含关于标识符类型详细信息的对象。params
: 包含参数列表的对象。tags
: 对象,包含JSDoc不识别的标记列表。只有当JSDoc的配置文件中allowUnknownTags
设置为true
时可用。
To see the doclets that JSDoc generates for your code, run JSDoc with the -X
command-line option.
下面是一个newDoclet 处理程序的一个例子说明:
事件: fileComplete
T当解析器解析完一个文件时,fileComplete
事件就会被触发。你的插件可以使用这个事件来触发每个文件的清理。
该事件对象包含下列属性:
filename
: 文件名称.source
: 该文件的内容.
事件: parseComplete
JSDoc解析所有指定的源文件之后,parseComplete
事件就会被触发
注意: 此事件在JSDoc3.2及更高版本会被触发。
该事件对象包含下列属性:
sourcefiles
: 被解析的源代码文件的路径数组。doclets
: doclet对象的数组。 See thenewDoclet
event for details about the properties that each doclet can contain. Available in JSDoc 3.2.1 and later.
事件: processingComplete
JSDoc更新反映继承和借来的标识符的解析结果后,processingComplete
事件被触发。
注意: 此事件在JSDoc3.2.1及更高版本中会被触发。
该事件对象包含下列属性:
doclets
: doclet对象的数组. See thenewDoclet
event for details about the properties that each doclet can contain.
标签定义(Tag Definitions)
添加标签到标签字典是影响文档生成的一个中级方式。在一个newDoclet
事件被触发前,JSDoc注释块被解析以确定可能存在的说明和任何JSDoc标签。当一个标签被发现,如果它已在标签字典被定义,它就会被赋予一个修改doclet的机会。
插件可以通过导出一个defineTags
函数来定义标签。该函数将传递一个可用于定义标签的字典,像这样:
字典(The Dictionary)
字典提供了以下方法:
defineTag(title, opts)
: 用于定义标签。 T第一个参数是标签的名称(例如,param
oroverview
). 第二个参数是一个包含标签选项的对象。 可以包含以下任一选项;每个选项的默认值都是false
:canHaveType (boolean)
: Set totrue
if the tag text can include a type expression (such as{string}
in@param {string} name - Description
).canHaveName (boolean)
: Set totrue
if the tag text can include a name (such asname
in@param {string} name - Description
).isNamespace (boolean)
: Set totrue
if the tag should be applied to the doclet's longname as a namespace. For example, the@module
tag sets this option totrue
, and using the tag@module myModuleName
results in the longnamemodule:myModuleName
.mustHaveValue (boolean)
: Set totrue
if the tag must have a value (such asTheName
in@name TheName
).mustNotHaveDescription (boolean)
: Set totrue
if the tag may have a value but must not have a description (such asTheDescription
in@tag {typeExpr} TheDescription
).mustNotHaveValue (boolean)
: Set totrue
if the tag must not have a value.onTagged (function)
: A callback function executed when the tag is found. The function is passed two parameters: the doclet and the tag object.
lookUp(tagName)
: Retrieve a tag object by name. Returns the tag object, including its options, orfalse
if the tag is not defined.isNamespace(tagName)
: Returnstrue
if the tag is applied to a doclet's longname as a namespace.normalise(tagName)
: Returns the canonical name of a tag. For example, the@const
tag is a synonym for@constant
; as a result, if you callnormalise('const')
, it returns the stringconstant
.normalize(tagName)
: Synonym fornormalise
. Available in JSDoc 3.3.0 and later.
A tag's onTagged
callback can modify the contents of the doclet or tag.
The defineTag
method returns a Tag
object, which has a synonym
method that can be used to
declare a synonym for the tag.
Node Visitors
At the lowest level, plugin authors can process each node in the abstract syntax tree (AST) by defining a node visitor that will visit each node. By using a node-visitor plugin, you can modify comments and trigger parser events for any arbitrary piece of code.
Plugins can define a node visitor by exporting an astNodeVisitor
object that contains a
visitNode
function, like so:
The function is called on each node with the following parameters:
node
: The AST node. AST nodes are JavaScript objects that use the format defined by the ESTree spec. You can use AST Explorer to see the AST that will be created for your source code. As of version 3.5.0, JSDoc uses the current version of the Babylon parser with all plugins enabled.e
: The event. If the node is one that the parser handles, the event object will already be populated with the same things described in thesymbolFound
event above. Otherwise, it will be an empty object on which to set various properties.parser
: The JSDoc parser instance.currentSourceName
: The name of the file being parsed.
Making things happen
The primary reasons to implement a node visitor are to be able to document things that aren't
normally documented (like function calls that create classes) or to auto generate documentation for
code that isn't documented. For instance, a plugin might look for calls to a _trigger
method since
it knows that means an event is fired and then generate documentation for the event.
To make things happen, the visitNode
function should modify properties of the event parameter. In
general the goal is to construct a comment and then get an event to fire. After the parser lets all
of the node visitors have a look at the node, it looks to see if the event object has a comment
property and an event
property. If it has both, the event named in the event property is fired.
The event is usually symbolFound
or jsdocCommentFound
, but theoretically, a plugin could define
its own events and handle them.
As with event-handler plugins, a node-visitor plugin can stop later plugins from running by setting
a stopPropagation
property on the event object (e.stopPropagation = true
). A plugin can stop the
event from firing by setting a preventDefault
property (e.preventDefault = true
).
Reporting Errors
If your plugin needs to report an error, use one of the following methods in the jsdoc/util/logger
module:
logger.warn
: Warn the user about a possible problem.logger.error
: Report an error from which the plugin can recover.logger.fatal
: Report an error that should cause JSDoc to stop running.
Using these methods creates a better user experience than simply throwing an error.
Note: Do not use the jsdoc/util/error
module to report errors. This module is deprecated and
will be removed in a future version of JSDoc.