From f8193eda1a77446672806444a8b8b866a0b6e55d Mon Sep 17 00:00:00 2001 From: Tony Brix Date: Fri, 19 Jun 2020 10:33:24 -0500 Subject: [PATCH] add npm run rules --- docs/CONTRIBUTING.md | 25 +++++++++++++++ package.json | 1 + test/rules.js | 74 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 100 insertions(+) create mode 100644 test/rules.js diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md index f5ec82b6a9..56a65f73f8 100644 --- a/docs/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -82,6 +82,31 @@ To see time comparisons between Marked and other popular Markdown libraries: npm run bench ``` +To see the compiled rules from `src/rules.js`: + +```bash +npm run rules +``` + +You can specify one or more `rule path`s to only show certain rules: + +```bash +npm run rules -- block.gfm.item inline.pedantic.br + +{ + block: { + gfm: { + item: /^( *)((?:[*+-]|\\d{1,9}\\.)) ?[^\\n]*(?:\\n(?!\\1(?:[*+-]|\\d{1,9}\\.) ?)[^\\n]*)*/gm + } + }, + inline: { + pedantic: { + br: /^( {2,}|\\\\)\\n(?!\\s*$)/ + } + } +} +``` + To check for (and fix) standardized syntax (lint): ```bash diff --git a/package.json b/package.json index a2fcfe600a..97eef902fc 100644 --- a/package.json +++ b/package.json @@ -62,6 +62,7 @@ "test:lint": "eslint bin/marked .", "test:redos": "node test/vuln-regex.js", "test:update": "node test/update-specs.js", + "rules": "node test/rules.js", "bench": "npm run rollup && node test/bench.js", "lint": "eslint --fix bin/marked .", "build:reset": "git checkout upstream/master lib/marked.js lib/marked.esm.js marked.min.js", diff --git a/test/rules.js b/test/rules.js new file mode 100644 index 0000000000..97bb6ae36d --- /dev/null +++ b/test/rules.js @@ -0,0 +1,74 @@ +const rules = require('../src/rules.js'); + +const COLOR = { + reset: '\x1b[0m', + bright: '\x1b[1m', + dim: '\x1b[2m', + underscore: '\x1b[4m', + blink: '\x1b[5m', + reverse: '\x1b[7m', + hidden: '\x1b[8m', + + fgBlack: '\x1b[30m', + fgRed: '\x1b[31m', + fgGreen: '\x1b[32m', + fgYellow: '\x1b[33m', + fgBlue: '\x1b[34m', + fgMagenta: '\x1b[35m', + fgCyan: '\x1b[36m', + fgWhite: '\x1b[37m', + + bgBlack: '\x1b[40m', + bgRed: '\x1b[41m', + bgGreen: '\x1b[42m', + bgYellow: '\x1b[43m', + bgBlue: '\x1b[44m', + bgMagenta: '\x1b[45m', + bgCyan: '\x1b[46m', + bgWhite: '\x1b[47m' +}; + +function propsToString(obj) { + if (obj === null) { + return null; + } + if (obj.constructor.name === 'Object') { + if (obj.exec && obj.exec.name === 'noopTest') { + return null; + } + for (const prop in obj) { + obj[prop] = propsToString(obj[prop]); + } + return obj; + } + return obj.toString(); +} + +let rulesObj = {}; +if (process.argv.length > 2) { + for (let i = 2; i < process.argv.length; i++) { + const rulePath = process.argv[i].split('.'); + let rulesList = rulesObj; + let rule = rules; + while (rulePath.length > 1) { + const prop = rulePath.shift(); + if (!rulesList[prop]) { + rulesList[prop] = {}; + rulesList = rulesList[prop]; + } + if (rule) { + rule = rule[prop]; + } + } + rulesList[rulePath[0]] = rule && rule[rulePath[0]] ? rule[rulePath[0]] : null; + } +} else { + rulesObj = rules; +} + +rulesObj = propsToString(rulesObj); +let output = JSON.stringify(rulesObj, null, 2); +output = output.replace(/^(\s*)"(.*)": null,?$/gm, `$1${COLOR.fgGreen}$2${COLOR.reset}: undefined`); +output = output.replace(/^(\s*)"(.*)": {$/gm, `$1${COLOR.fgGreen}$2${COLOR.reset}: {`); +output = output.replace(/^(\s*)"(.*)": "(.*)",?$/gm, `$1${COLOR.fgGreen}$2${COLOR.reset}: ${COLOR.fgRed}$3${COLOR.reset}`); +console.log(output, COLOR.reset);