mirror of
https://github.com/JamesIves/github-pages-deploy-action.git
synced 2023-12-15 20:03:39 +08:00
222 lines
7.4 KiB
Markdown
222 lines
7.4 KiB
Markdown
# comment-parser
|
|
|
|
Generic JSDoc-like comment parser. This library is not intended to be documentation generator, but rather composite unit for it.
|
|
|
|
`npm install comment-parser`
|
|
|
|
Module provides `parse(s: string[, opts: object]): object[]` function which takes `/** ... */` comment string and returns array of objects with parsed data.
|
|
|
|
It is not trying to detect relations between tags or somehow recognize their meaning. Any tag can be used, as long as it satisfies the format.
|
|
|
|
```javascript
|
|
/**
|
|
* Singleline or multiline description text. Line breaks are preserved.
|
|
*
|
|
* @some-tag {Type} name Singleline or multiline description text
|
|
* @some-tag {Type} name.subname Singleline or multiline description text
|
|
* @some-tag {Type} name.subname.subsubname Singleline or
|
|
* multiline description text
|
|
* @some-tag {Type} [optionalName=someDefault]
|
|
* @another-tag
|
|
*/
|
|
```
|
|
|
|
this would be parsed into following
|
|
|
|
```json
|
|
[{
|
|
"tags": [{
|
|
"tag": "some-tag",
|
|
"type": "Type",
|
|
"name": "name",
|
|
"optional": false,
|
|
"description": "Singleline or multiline description text",
|
|
"line": 3,
|
|
"source": "@some-tag {Type} name Singleline or multiline description text"
|
|
}, {
|
|
"tag": "some-tag",
|
|
"type": "Type",
|
|
"name": "name.subname",
|
|
"optional": false,
|
|
"description": "Singleline or multiline description text",
|
|
"line": 4,
|
|
"source": "@some-tag {Type} name.subname Singleline or multiline description text"
|
|
}, {
|
|
"tag": "some-tag",
|
|
"type": "Type",
|
|
"name": "name.subname.subsubname",
|
|
"optional": false,
|
|
"description": "Singleline or\nmultiline description text",
|
|
"line": 5,
|
|
"source": "@some-tag {Type} name.subname.subsubname Singleline or\nmultiline description text"
|
|
}, {
|
|
"tag": "some-tag",
|
|
"type": "Type",
|
|
"name": "optionalName",
|
|
"optional": true,
|
|
"description": "",
|
|
"line": 7,
|
|
"default": "someDefault",
|
|
"source": "@some-tag {Type} [optionalName=someDefault]"
|
|
}, {
|
|
"tag": "another-tag",
|
|
"name": "",
|
|
"optional": false,
|
|
"type": "",
|
|
"description": "",
|
|
"line": 8,
|
|
"source": "@another-tag"
|
|
}],
|
|
"line": 0,
|
|
"description": "Singleline or multiline description text. Line breaks are preserved.",
|
|
"source": "Singleline or multiline description text. Line breaks are preserved.\n\n@some-tag {Type} name Singleline or multiline description text\n@some-tag {Type} name.subname Singleline or multiline description text\n@some-tag {Type} name.subname.subsubname Singleline or\nmultiline description text\n@another-tag"
|
|
}]
|
|
```
|
|
|
|
Below are examples of acceptable comment formats
|
|
|
|
```javascript
|
|
/** online comment */
|
|
|
|
/** first line
|
|
* second line */
|
|
|
|
/**
|
|
No *s on middle lines is acceptable too
|
|
which might be convenient for writing big
|
|
chunks of text.
|
|
|
|
* keeping *s on some lines
|
|
* would work either
|
|
|
|
left bound is determined by opening marker position
|
|
and white space will be trimmed as there was '* '
|
|
*/
|
|
|
|
```
|
|
|
|
Comments starting with `/***` and `/*` are ignored.
|
|
|
|
Also you can parse entire file with `parse.file('path/to/file', callback)` or acquire an instance of [Transform](http://nodejs.org/api/stream.html#stream_class_stream_transform) stream with `parse.stream()`.
|
|
|
|
## Options
|
|
|
|
### `dotted_names: boolean`
|
|
|
|
By default dotted names like `name.subname.subsubname` will be expanded into
|
|
nested sections, this can be prevented by passing `opts.dotted_names = false`.
|
|
|
|
### `trim: boolean`
|
|
|
|
Set this to `false` to avoid the default of trimming whitespace at the start and
|
|
end of each line.
|
|
|
|
### `join: string | number | boolean`
|
|
|
|
If the following lines of a multiline comment do not start with a star, `join` will have the following effect on *tag* `source` (and `description`) when joining the lines together:
|
|
|
|
1. If a string, use that string in place of the leading whitespace (and avoid newlines).
|
|
2. If a non-zero number (e.g., `1`), do no trimming and avoid newlines.
|
|
3. If `undefined`, `false`, or `0`, use the default behavior of not trimming
|
|
but adding a newline.
|
|
4. Otherwise (e.g., if `join` is `true`), replace any leading whitespace with a single space and avoid newlines.
|
|
|
|
Note that if a multi-line comment has lines that start with a star, these will
|
|
be appended with initial whitespace as is and with newlines regardless of the
|
|
`join` setting.
|
|
|
|
Note also that the *comment* `source` will not be changed by this setting.
|
|
|
|
### `fence: string | RegExp | ((source: string) => boolean)`
|
|
|
|
Set to a string or regular expression to toggle state upon finding an
|
|
odd number of matches within a line. Defaults to \`\`\`.
|
|
|
|
If set to a function, it should return `true` to toggle fenced state;
|
|
upon returning `true` the first time, this will prevent subsequent lines
|
|
from being interpreted as starting a new jsdoc tag until such time as the
|
|
function returns `true` again to indicate that the state has toggled
|
|
back.
|
|
|
|
### `parsers: Parser[]` (Custom parsers)
|
|
|
|
In case you need to parse tags in different way you can pass `opts.parsers = [parser1, ..., parserN]`, where each parser is `function name(str:String, data:Object):{source:String, data:Object}`.
|
|
|
|
Each parser function takes string left after previous parsers applied and data produced by them. And returns `null` or `{source: '', data:{}}` where `source` is consumed substring and `data` is a payload with tag node fields.
|
|
|
|
Tag node data is build by merging result bits from all parsers. Here is some example that is not doing actual parsing but is demonstrating the flow:
|
|
|
|
```javascript
|
|
/**
|
|
* Source to be parsed below
|
|
* @tag {type} name Description
|
|
*/
|
|
parse(source, {parsers: [
|
|
// takes entire string
|
|
function parse_tag(str, data) {
|
|
return {source: ' @tag', data: {tag: 'tag'}};
|
|
},
|
|
// parser throwing exception
|
|
function check_tag(str, data) {
|
|
if (allowed_tags.indexOf(data.tag) === -1) {
|
|
throw new Error('Unrecognized tag "' + data.tag + '"');
|
|
}
|
|
},
|
|
// takes the rest of the string after ' @tag''
|
|
function parse_name1(str, data) {
|
|
return {source: ' name', data: {name: 'name1'}};
|
|
},
|
|
// alternative name parser
|
|
function parse_name2(str, data) {
|
|
return {source: ' name', data: {name: 'name2'}};
|
|
}
|
|
]});
|
|
```
|
|
|
|
This would produce following:
|
|
|
|
```json
|
|
[{
|
|
"tags": [{
|
|
"tag": "tag",
|
|
"errors": [
|
|
"check_tag: Unrecognized tag \"tag\""
|
|
],
|
|
"name": "name2",
|
|
"optional": false,
|
|
"type": "",
|
|
"description": "",
|
|
"line": 2,
|
|
"source": "@tag {type} name Description"
|
|
}],
|
|
"line": 0,
|
|
"description": "Source to be parsed below",
|
|
"source": "Source to be parsed below\n@tag {type} name Description"
|
|
}]
|
|
```
|
|
|
|
## Stringifying
|
|
|
|
One may also convert `comment-parser` JSON structures back into strings using
|
|
the `stringify` method (`stringify(o: (object|Array) [, opts: object]): string`).
|
|
|
|
This method accepts the JSON as its first argument and an optional options
|
|
object with an `indent` property set to either a string or a number that
|
|
will be used to determine the number of spaces of indent. The indent of the
|
|
start of the doc block will be one space less than the indent of each line of
|
|
asterisks for the sake of alignment as per usual practice.
|
|
|
|
The `stringify` export delegates to the specialized methods `stringifyBlocks`,
|
|
`stringifyBlock`, and `stringifyTag`, which are available on the `stringify`
|
|
function object.
|
|
|
|
## Packaging
|
|
|
|
`comment-parser` is CommonJS module and was primarely designed to be used with Node. Module `index.js` includes stream and file functionality. Use prser-only module in browser `comment-parser/parse.js`
|
|
|
|
## Contributors
|
|
|
|
```
|
|
> npm info --registry https://registry.npmjs.org comment-parser contributors
|
|
```
|