From a888f880c5f7654ae5aded1da13654e264a4f06f Mon Sep 17 00:00:00 2001 From: Anton Shchekota Date: Sat, 24 Apr 2021 22:20:45 +0300 Subject: [PATCH] fix: add gfm format for remark fixed #1374 Plugins for remark was reworks because @link should be catch by first then autolink --- __tests__/__snapshots__/test.js.snap | 80 ++++++++++++++++++ __tests__/fixture/html/nested.input.js | 8 ++ __tests__/lib/parse.js | 7 +- __tests__/lib/parsers/javascript.js | 7 +- package.json | 5 +- src/remark-jsDoc-link.js | 91 +++++++++++++++++++-- src/remark-parse.js | 12 +-- src/remark-remove-position.js | 16 +++- yarn.lock | 108 ++++++++++++++++++++++++- 9 files changed, 301 insertions(+), 33 deletions(-) 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 1Col 2Col 3
    Dat 1Dat 2Dat 3
    Dat 4Dat 5Dat 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"