diff --git a/__tests__/__snapshots__/test.js.snap b/__tests__/__snapshots__/test.js.snap
index 139870905..62b30a73e 100644
--- a/__tests__/__snapshots__/test.js.snap
+++ b/__tests__/__snapshots__/test.js.snap
@@ -1212,6 +1212,16 @@ exports[`html nested.input.js 1`] = `
+
+
+ tableObj
+
+
+
+
+
@@ -2451,6 +2461,76 @@ like a
klass. This needs a
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ tableObj
+
+
+
+
+
+
+
+
+
+Col 1 |
+Col 2 |
+Col 3 |
+
+
+
+
+Dat 1 |
+Dat 2 |
+Dat 3 |
+
+
+Dat 4 |
+Dat 5 |
+Dat 6 |
+
+
+
+
+ tableObj
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/__tests__/fixture/html/nested.input.js b/__tests__/fixture/html/nested.input.js
index abe610c42..a428bc2fd 100644
--- a/__tests__/fixture/html/nested.input.js
+++ b/__tests__/fixture/html/nested.input.js
@@ -158,3 +158,11 @@ var customStreams = {};
customStreams.passthrough = function() {
this.custom = true;
};
+
+/**
+ * | Col 1 | Col 2 | Col 3 |
+ * |-------|-------|-------|
+ * | Dat 1 | Dat 2 | Dat 3 |
+ * | Dat 4 | Dat 5 | Dat 6 |
+ */
+ var tableObj = {};
\ No newline at end of file
diff --git a/__tests__/lib/parse.js b/__tests__/lib/parse.js
index 9bf05d320..8c7209c1c 100644
--- a/__tests__/lib/parse.js
+++ b/__tests__/lib/parse.js
@@ -1,10 +1,7 @@
const parse = require('../../src/parsers/javascript');
-const remarkP = require('remark')().parse;
-const removePosition = require('../../src/remark-remove-position')();
+const removePosition = require('../../src/remark-remove-position');
+const remarkParse = require('remark')().use(removePosition).parse;
const visit = require('unist-util-visit');
-const remarkParse = function (str) {
- return removePosition(remarkP(str));
-};
function pick(obj, props) {
if (Array.isArray(props)) {
diff --git a/__tests__/lib/parsers/javascript.js b/__tests__/lib/parsers/javascript.js
index 25d7baeb5..5f0ec80ee 100644
--- a/__tests__/lib/parsers/javascript.js
+++ b/__tests__/lib/parsers/javascript.js
@@ -1,9 +1,6 @@
-const remarkP = require('remark')().parse;
-const removePosition = require('../../../src/remark-remove-position')();
+const removePosition = require('../../../src/remark-remove-position');
+const remarkParse = require('remark')().use(removePosition).parse;
const parse = require('../../../src/parsers/javascript');
-const remarkParse = function (str) {
- return removePosition(remarkP(str));
-};
function toComments(source, filename, opts) {
source = typeof source === 'string' ? source : '(' + source.toString() + ')';
diff --git a/package.json b/package.json
index 88ecd0ed3..36e3dd9c0 100644
--- a/package.json
+++ b/package.json
@@ -38,6 +38,7 @@
"pify": "^5.0.0",
"read-pkg-up": "^4.0.0",
"remark": "^13.0.0",
+ "remark-gfm": "^1.0.0",
"remark-html": "^13.0.1",
"remark-reference-links": "^5.0.0",
"remark-toc": "^7.2.0",
@@ -55,8 +56,8 @@
"yargs": "^15.3.1"
},
"optionalDependencies": {
- "vue-template-compiler": "^2.6.12",
- "@vue/compiler-sfc": "^3.0.11"
+ "@vue/compiler-sfc": "^3.0.11",
+ "vue-template-compiler": "^2.6.12"
},
"devDependencies": {
"chdir": "0.0.0",
diff --git a/src/remark-jsDoc-link.js b/src/remark-jsDoc-link.js
index 8bb5c0d8e..883a265a2 100644
--- a/src/remark-jsDoc-link.js
+++ b/src/remark-jsDoc-link.js
@@ -1,4 +1,55 @@
const findAndReplace = require('mdast-util-find-and-replace');
+const markdownLineEnding = require('micromark/dist/character/markdown-line-ending');
+
+const link = '@link';
+const tutorial = '@tutorial';
+
+function tokenizeJsDoclink(effects, ok, nok) {
+ let index = 0;
+ let focus = link;
+
+ function atext(code) {
+ if (index !== link.length) {
+ if (focus.charCodeAt(index) === code) {
+ effects.consume(code);
+ index++;
+ return atext;
+ } else if (tutorial.charCodeAt(index) === code) {
+ focus = tutorial;
+ }
+ return nok(code);
+ }
+ if (code === 125) {
+ effects.consume(code);
+ effects.exit('literalJsDoclink');
+ return ok(code);
+ }
+
+ if (markdownLineEnding(code)) {
+ return nok(code);
+ }
+
+ effects.consume(code);
+ return atext;
+ }
+
+ return function (code) {
+ effects.enter('literalJsDoclink');
+ effects.consume(code);
+ return atext;
+ };
+}
+
+const text = {};
+text[123] = {
+ tokenize: tokenizeJsDoclink,
+ previous(code) {
+ return code === null || code === 32 || markdownLineEnding(code);
+ }
+};
+
+const linkRegExp = /\{@link\s+(.+?)(?:[\s|](.*?))?\}/;
+const tutorialRegExp = /\{@tutorial\s+(.+?)(?:[\s|](.*?))?\}/;
/**
* A remark plugin that installs
@@ -10,6 +61,7 @@ const findAndReplace = require('mdast-util-find-and-replace');
* @returns {Function}
*/
module.exports = function () {
+ const data = this.data();
function replace(type) {
return (match, matchUrl, matchValue) => {
return {
@@ -27,10 +79,37 @@ module.exports = function () {
};
}
- return function transform(markdownAST) {
- return findAndReplace(markdownAST, [
- [/\{@link\s+(.+?)(?:[\s|](.*?))?\}/g, replace('link')],
- [/\{@tutorial\s+(.+?)(?:[\s|](.*?))?\}/g, replace('tutorial')]
- ]);
- };
+ add('micromarkExtensions', { text });
+ add('fromMarkdownExtensions', {
+ transforms: [
+ function (markdownAST) {
+ return findAndReplace(markdownAST, [
+ [new RegExp(linkRegExp.source, 'g'), replace('link')],
+ [new RegExp(tutorialRegExp.source, 'g'), replace('tutorial')]
+ ]);
+ }
+ ],
+ enter: {
+ literalJsDoclink(token) {
+ const str = this.sliceSerialize(token);
+ let match = null;
+ if (str.startsWith('{@link')) {
+ match = linkRegExp.exec(str);
+ } else {
+ match = tutorialRegExp.exec(str);
+ }
+
+ this.enter(replace('link')(...match), token);
+ }
+ },
+ exit: {
+ literalJsDoclink(token) {
+ this.exit(token);
+ }
+ }
+ });
+ function add(field, value) {
+ if (data[field]) data[field].push(value);
+ else data[field] = [value];
+ }
};
diff --git a/src/remark-parse.js b/src/remark-parse.js
index ba45b2616..09d7365a4 100644
--- a/src/remark-parse.js
+++ b/src/remark-parse.js
@@ -1,6 +1,7 @@
const remark = require('remark');
-const removePosition = require('./remark-remove-position')();
-const jsDocLink = require('./remark-jsDoc-link')();
+const gfm = require('remark-gfm');
+const removePosition = require('./remark-remove-position');
+const jsDocLink = require('./remark-jsDoc-link');
/**
* Parse a string of Markdown into a Remark
@@ -10,9 +11,4 @@ const jsDocLink = require('./remark-jsDoc-link')();
* @returns {Object} abstract syntax tree
* @private
*/
-module.exports = function (string) {
- const treeAst = remark().parse(string);
- removePosition(treeAst);
- jsDocLink(treeAst);
- return treeAst;
-};
+module.exports = remark().use([jsDocLink, gfm, removePosition]).parse;
diff --git a/src/remark-remove-position.js b/src/remark-remove-position.js
index 425e67a6a..7ba3c5005 100644
--- a/src/remark-remove-position.js
+++ b/src/remark-remove-position.js
@@ -1,8 +1,16 @@
const visit = require('unist-util-visit');
module.exports = function () {
- return function transform(markdownAST) {
- visit(markdownAST, node => delete node.position);
- return markdownAST;
- };
+ const data = this.data();
+ add('fromMarkdownExtensions', {
+ transforms: [
+ function (markdownAST) {
+ visit(markdownAST, node => delete node.position);
+ }
+ ]
+ });
+ function add(field, value) {
+ if (data[field]) data[field].push(value);
+ else data[field] = [value];
+ }
};
diff --git a/yarn.lock b/yarn.lock
index 295ddf31e..3196979b1 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -4535,6 +4535,13 @@ map-visit@^1.0.0:
dependencies:
object-visit "^1.0.0"
+markdown-table@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-2.0.0.tgz#194a90ced26d31fe753d8b9434430214c011865b"
+ integrity sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==
+ dependencies:
+ repeat-string "^1.0.0"
+
mdast-util-definitions@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz#c5c1a84db799173b4dcf7643cda999e440c24db2"
@@ -4542,7 +4549,7 @@ mdast-util-definitions@^4.0.0:
dependencies:
unist-util-visit "^2.0.0"
-mdast-util-find-and-replace@^1.1.1:
+mdast-util-find-and-replace@^1.1.0, mdast-util-find-and-replace@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-1.1.1.tgz#b7db1e873f96f66588c321f1363069abf607d1b5"
integrity sha512-9cKl33Y21lyckGzpSmEQnIDjEfeeWelN5s1kUW1LwdB0Fkuq2u+4GdqcGEygYxJE8GVqCl0741bYXHgamfWAZA==
@@ -4562,6 +4569,48 @@ mdast-util-from-markdown@^0.8.0:
parse-entities "^2.0.0"
unist-util-stringify-position "^2.0.0"
+mdast-util-gfm-autolink-literal@^0.1.0:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-0.1.3.tgz#9c4ff399c5ddd2ece40bd3b13e5447d84e385fb7"
+ integrity sha512-GjmLjWrXg1wqMIO9+ZsRik/s7PLwTaeCHVB7vRxUwLntZc8mzmTsLVr6HW1yLokcnhfURsn5zmSVdi3/xWWu1A==
+ dependencies:
+ ccount "^1.0.0"
+ mdast-util-find-and-replace "^1.1.0"
+ micromark "^2.11.3"
+
+mdast-util-gfm-strikethrough@^0.2.0:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-0.2.3.tgz#45eea337b7fff0755a291844fbea79996c322890"
+ integrity sha512-5OQLXpt6qdbttcDG/UxYY7Yjj3e8P7X16LzvpX8pIQPYJ/C2Z1qFGMmcw+1PZMUM3Z8wt8NRfYTvCni93mgsgA==
+ dependencies:
+ mdast-util-to-markdown "^0.6.0"
+
+mdast-util-gfm-table@^0.1.0:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/mdast-util-gfm-table/-/mdast-util-gfm-table-0.1.6.tgz#af05aeadc8e5ee004eeddfb324b2ad8c029b6ecf"
+ integrity sha512-j4yDxQ66AJSBwGkbpFEp9uG/LS1tZV3P33fN1gkyRB2LoRL+RR3f76m0HPHaby6F4Z5xr9Fv1URmATlRRUIpRQ==
+ dependencies:
+ markdown-table "^2.0.0"
+ mdast-util-to-markdown "~0.6.0"
+
+mdast-util-gfm-task-list-item@^0.1.0:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-0.1.6.tgz#70c885e6b9f543ddd7e6b41f9703ee55b084af10"
+ integrity sha512-/d51FFIfPsSmCIRNp7E6pozM9z1GYPIkSy1urQ8s/o4TC22BZ7DqfHFWiqBD23bc7J3vV1Fc9O4QIHBlfuit8A==
+ dependencies:
+ mdast-util-to-markdown "~0.6.0"
+
+mdast-util-gfm@^0.1.0:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/mdast-util-gfm/-/mdast-util-gfm-0.1.2.tgz#8ecddafe57d266540f6881f5c57ff19725bd351c"
+ integrity sha512-NNkhDx/qYcuOWB7xHUGWZYVXvjPFFd6afg6/e2g+SV4r9q5XUcCbV4Wfa3DLYIiD+xAEZc6K4MGaE/m0KDcPwQ==
+ dependencies:
+ mdast-util-gfm-autolink-literal "^0.1.0"
+ mdast-util-gfm-strikethrough "^0.2.0"
+ mdast-util-gfm-table "^0.1.0"
+ mdast-util-gfm-task-list-item "^0.1.0"
+ mdast-util-to-markdown "^0.6.1"
+
mdast-util-inject@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/mdast-util-inject/-/mdast-util-inject-1.1.0.tgz#db06b8b585be959a2dcd2f87f472ba9b756f3675"
@@ -4583,7 +4632,7 @@ mdast-util-to-hast@^10.0.0:
unist-util-position "^3.0.0"
unist-util-visit "^2.0.0"
-mdast-util-to-markdown@^0.6.0:
+mdast-util-to-markdown@^0.6.0, mdast-util-to-markdown@^0.6.1, mdast-util-to-markdown@~0.6.0:
version "0.6.5"
resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz#b33f67ca820d69e6cc527a93d4039249b504bebe"
integrity sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==
@@ -4700,7 +4749,52 @@ merge-stream@^2.0.0:
resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
-micromark@~2.11.0:
+micromark-extension-gfm-autolink-literal@~0.5.0:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-0.5.7.tgz#53866c1f0c7ef940ae7ca1f72c6faef8fed9f204"
+ integrity sha512-ePiDGH0/lhcngCe8FtH4ARFoxKTUelMp4L7Gg2pujYD5CSMb9PbblnyL+AAMud/SNMyusbS2XDSiPIRcQoNFAw==
+ dependencies:
+ micromark "~2.11.3"
+
+micromark-extension-gfm-strikethrough@~0.6.5:
+ version "0.6.5"
+ resolved "https://registry.yarnpkg.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-0.6.5.tgz#96cb83356ff87bf31670eefb7ad7bba73e6514d1"
+ integrity sha512-PpOKlgokpQRwUesRwWEp+fHjGGkZEejj83k9gU5iXCbDG+XBA92BqnRKYJdfqfkrRcZRgGuPuXb7DaK/DmxOhw==
+ dependencies:
+ micromark "~2.11.0"
+
+micromark-extension-gfm-table@~0.4.0:
+ version "0.4.3"
+ resolved "https://registry.yarnpkg.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-0.4.3.tgz#4d49f1ce0ca84996c853880b9446698947f1802b"
+ integrity sha512-hVGvESPq0fk6ALWtomcwmgLvH8ZSVpcPjzi0AjPclB9FsVRgMtGZkUcpE0zgjOCFAznKepF4z3hX8z6e3HODdA==
+ dependencies:
+ micromark "~2.11.0"
+
+micromark-extension-gfm-tagfilter@~0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-0.3.0.tgz#d9f26a65adee984c9ccdd7e182220493562841ad"
+ integrity sha512-9GU0xBatryXifL//FJH+tAZ6i240xQuFrSL7mYi8f4oZSbc+NvXjkrHemeYP0+L4ZUT+Ptz3b95zhUZnMtoi/Q==
+
+micromark-extension-gfm-task-list-item@~0.3.0:
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-0.3.3.tgz#d90c755f2533ed55a718129cee11257f136283b8"
+ integrity sha512-0zvM5iSLKrc/NQl84pZSjGo66aTGd57C1idmlWmE87lkMcXrTxg1uXa/nXomxJytoje9trP0NDLvw4bZ/Z/XCQ==
+ dependencies:
+ micromark "~2.11.0"
+
+micromark-extension-gfm@^0.3.0:
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/micromark-extension-gfm/-/micromark-extension-gfm-0.3.3.tgz#36d1a4c089ca8bdfd978c9bd2bf1a0cb24e2acfe"
+ integrity sha512-oVN4zv5/tAIA+l3GbMi7lWeYpJ14oQyJ3uEim20ktYFAcfX1x3LNlFGGlmrZHt7u9YlKExmyJdDGaTt6cMSR/A==
+ dependencies:
+ micromark "~2.11.0"
+ micromark-extension-gfm-autolink-literal "~0.5.0"
+ micromark-extension-gfm-strikethrough "~0.6.5"
+ micromark-extension-gfm-table "~0.4.0"
+ micromark-extension-gfm-tagfilter "~0.3.0"
+ micromark-extension-gfm-task-list-item "~0.3.0"
+
+micromark@^2.11.3, micromark@~2.11.0, micromark@~2.11.3:
version "2.11.4"
resolved "https://registry.yarnpkg.com/micromark/-/micromark-2.11.4.tgz#d13436138eea826383e822449c9a5c50ee44665a"
integrity sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==
@@ -5796,6 +5890,14 @@ regexpp@^3.1.0:
resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2"
integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==
+remark-gfm@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/remark-gfm/-/remark-gfm-1.0.0.tgz#9213643001be3f277da6256464d56fd28c3b3c0d"
+ integrity sha512-KfexHJCiqvrdBZVbQ6RopMZGwaXz6wFJEfByIuEwGf0arvITHjiKKZ1dpXujjH9KZdm1//XJQwgfnJ3lmXaDPA==
+ dependencies:
+ mdast-util-gfm "^0.1.0"
+ micromark-extension-gfm "^0.3.0"
+
remark-html@^13.0.1:
version "13.0.1"
resolved "https://registry.yarnpkg.com/remark-html/-/remark-html-13.0.1.tgz#d5b2d8be01203e61fc37403167ca7584879ad675"