From 21ef50cf1dd7df0c493d01b8adeed9026ef5b42b Mon Sep 17 00:00:00 2001 From: Nikolay Kostyurin Date: Fri, 6 Jul 2018 00:38:29 +0200 Subject: [PATCH] add html5 preset, some files structure changes --- packages/bbob-cli/README.md | 4 ++ packages/bbob-cli/package.json | 35 +++++---- packages/bbob-cli/{lib => test}/cli.test.js | 0 packages/{bbob => bbob-core}/.gitignore | 0 packages/{bbob => bbob-core}/.npmignore | 0 packages/bbob-core/README.md | 11 +++ packages/bbob-core/lib/index.js | 20 ++++++ packages/bbob-core/package.json | 38 ++++++++++ packages/bbob-core/test/index.test.js | 0 packages/bbob-html/index.js | 58 --------------- packages/bbob-html/index.test.js | 6 -- packages/bbob-html/lib/index.js | 61 ++++++++++++++++ packages/bbob-html/package.json | 5 +- packages/bbob-html/test/index.test.js | 27 +++++++ packages/bbob-preset-html5/.gitignore | 3 + packages/bbob-preset-html5/.npmignore | 6 ++ packages/bbob-preset-html5/README.md | 1 + packages/bbob-preset-html5/lib/index.js | 72 +++++++++++++++++++ packages/bbob-preset-html5/package.json | 37 ++++++++++ packages/bbob-preset-html5/test/index.test.js | 15 ++++ packages/bbob/index.js | 3 - 21 files changed, 322 insertions(+), 80 deletions(-) create mode 100644 packages/bbob-cli/README.md rename packages/bbob-cli/{lib => test}/cli.test.js (100%) rename packages/{bbob => bbob-core}/.gitignore (100%) rename packages/{bbob => bbob-core}/.npmignore (100%) create mode 100644 packages/bbob-core/README.md create mode 100644 packages/bbob-core/lib/index.js create mode 100644 packages/bbob-core/package.json create mode 100644 packages/bbob-core/test/index.test.js delete mode 100644 packages/bbob-html/index.js delete mode 100644 packages/bbob-html/index.test.js create mode 100644 packages/bbob-html/lib/index.js create mode 100644 packages/bbob-html/test/index.test.js create mode 100644 packages/bbob-preset-html5/.gitignore create mode 100644 packages/bbob-preset-html5/.npmignore create mode 100644 packages/bbob-preset-html5/README.md create mode 100644 packages/bbob-preset-html5/lib/index.js create mode 100644 packages/bbob-preset-html5/package.json create mode 100644 packages/bbob-preset-html5/test/index.test.js delete mode 100644 packages/bbob/index.js diff --git a/packages/bbob-cli/README.md b/packages/bbob-cli/README.md new file mode 100644 index 0000000..b95e210 --- /dev/null +++ b/packages/bbob-cli/README.md @@ -0,0 +1,4 @@ +# bbob-cli + +Convert BBCode to HTML + diff --git a/packages/bbob-cli/package.json b/packages/bbob-cli/package.json index 26daf67..0669a66 100644 --- a/packages/bbob-cli/package.json +++ b/packages/bbob-cli/package.json @@ -6,15 +6,6 @@ "bin": { "bbob": "bbob.js" }, - "scripts": { - "test": "../../node_modules/.bin/jest --", - "cover": "../../node_modules/.bin/jest --coverage" - }, - "author": "Nikolay Kostyurin ", - "license": "MIT", - "publishConfig": { - "registry": "https://registry.npmjs.org/" - }, "directories": { "lib": "lib" }, @@ -22,8 +13,28 @@ "@bbob/parser": "^1.0.3", "commander": "^2.15.1" }, - "devDependencies": { - "jest": "^23.1.0", - "xbbcode-parser": "^0.1.2" + "repository": { + "type": "git", + "url": "git+https://github.com/JiLiZART/bbob.git" + }, + "keywords": [ + "bbob", + "cli", + "bbcode", + "pipe" + ], + "bugs": { + "url": "https://github.com/JiLiZART/bbob/issues" + }, + "homepage": "https://github.com/JiLiZART/bbob#readme", + "scripts": { + "test": "../../node_modules/.bin/jest --", + "cover": "../../node_modules/.bin/jest --coverage", + "lint": "../../node_modules/.bin/eslint ." + }, + "author": "Nikolay Kostyurin ", + "license": "MIT", + "publishConfig": { + "registry": "https://registry.npmjs.org/" } } diff --git a/packages/bbob-cli/lib/cli.test.js b/packages/bbob-cli/test/cli.test.js similarity index 100% rename from packages/bbob-cli/lib/cli.test.js rename to packages/bbob-cli/test/cli.test.js diff --git a/packages/bbob/.gitignore b/packages/bbob-core/.gitignore similarity index 100% rename from packages/bbob/.gitignore rename to packages/bbob-core/.gitignore diff --git a/packages/bbob/.npmignore b/packages/bbob-core/.npmignore similarity index 100% rename from packages/bbob/.npmignore rename to packages/bbob-core/.npmignore diff --git a/packages/bbob-core/README.md b/packages/bbob-core/README.md new file mode 100644 index 0000000..949984e --- /dev/null +++ b/packages/bbob-core/README.md @@ -0,0 +1,11 @@ +# bbob + +## Usage + +```js +const bbob = require('@bbob/core'); +const presetHTML5 = require('@bbob/preset-html5'); +const code = `[i]Text[/i]`; + +const processor = bbob([presetHTML5]).process(code, {sync: true}) +``` diff --git a/packages/bbob-core/lib/index.js b/packages/bbob-core/lib/index.js new file mode 100644 index 0000000..e1ed651 --- /dev/null +++ b/packages/bbob-core/lib/index.js @@ -0,0 +1,20 @@ +class BBob { + constructor(plugins) { + } + + parse() { + + } + + stringify() { + + } + + process(input) { + + } +} + +module.exports = function bbob(...plugins) { + return new BBob(plugins); +}; diff --git a/packages/bbob-core/package.json b/packages/bbob-core/package.json new file mode 100644 index 0000000..55cd45b --- /dev/null +++ b/packages/bbob-core/package.json @@ -0,0 +1,38 @@ +{ + "name": "@bbob/core", + "version": "1.0.0", + "description": "BBob is a tool to transform BBCode markup useing presets", + "main": "lib/index.js", + "directories": { + "lib": "lib" + }, + "dependencies": { + "@bbob/parser": "*", + "@bbob/html": "*", + "@bbob/preset-html5": "*" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/JiLiZART/bbob.git" + }, + "keywords": [ + "bbcode", + "parser", + "html", + "transform" + ], + "bugs": { + "url": "https://github.com/JiLiZART/bbob/issues" + }, + "homepage": "https://github.com/JiLiZART/bbob#readme", + "scripts": { + "test": "../../node_modules/.bin/jest --", + "cover": "../../node_modules/.bin/jest --coverage", + "lint": "../../node_modules/.bin/eslint ." + }, + "author": "Nikolay Kostyurin ", + "license": "MIT", + "publishConfig": { + "registry": "https://registry.npmjs.org/" + } +} diff --git a/packages/bbob-core/test/index.test.js b/packages/bbob-core/test/index.test.js new file mode 100644 index 0000000..e69de29 diff --git a/packages/bbob-html/index.js b/packages/bbob-html/index.js deleted file mode 100644 index 97ed3ab..0000000 --- a/packages/bbob-html/index.js +++ /dev/null @@ -1,58 +0,0 @@ -function attrs(obj) { - let attr = ''; - - Object.keys(obj).forEach((key) => { - if (typeof obj[key] === 'boolean' && obj[key]) { - attr += ` ${key}`; - } else if (typeof obj[key] === 'number') { - attr += ` ${key}="${obj[key]}"`; - } else if (typeof obj[key] === 'string') { - attr += ` ${key}="${obj[key].replace(/"/g, '"')}"`; - } - }); - - return attr; -} - -function traverse(tree, cb) { - if (Array.isArray(tree)) { - tree.forEach((_, i) => { - traverse(cb(tree[i]), cb); - }); - } else if (typeof tree === 'object' && tree.content) { - traverse(tree.content, cb); - } - - return tree; -} - -function render(ast) { - function html(tree) { - let result = ''; - - traverse([].concat(tree), (node) => { - if (!node) return; - - if (typeof node === 'string' || typeof node === 'number') { - result += node; - - return; - } - - if (typeof node === 'object') { - result += `<${node.tag} ${attrs(node.attrs)}>`; - } - - // treat as new root tree if node is an array - if (Array.isArray(node)) { - result += html(node); - } - }); - - return result; - } - - return html(ast); -} - -module.exports = render; diff --git a/packages/bbob-html/index.test.js b/packages/bbob-html/index.test.js deleted file mode 100644 index 9d914c7..0000000 --- a/packages/bbob-html/index.test.js +++ /dev/null @@ -1,6 +0,0 @@ - -describe('bbob-html', () => { - test('render proper markup', () => { - - }); -}); diff --git a/packages/bbob-html/lib/index.js b/packages/bbob-html/lib/index.js new file mode 100644 index 0000000..ebc7d81 --- /dev/null +++ b/packages/bbob-html/lib/index.js @@ -0,0 +1,61 @@ +function escapeQuote(value) { + return value.replace(/"/g, '"'); +} + +function attrValue(name, value) { + if (typeof value === 'boolean' && value) { + return `${name}`; + } else if (typeof value === 'number') { + return `${name}="${value}"`; + } else if (typeof value === 'string') { + return `${name}="${escapeQuote(value)}"`; + } else if (typeof value === 'object') { + return `${name}="${escapeQuote(JSON.stringify(value))}"`; + } + return ''; +} + +/** + * Transforms attrs to html params string + * @param values + */ +const attrs = values => + Object.keys(values) + .reduce((arr, key) => [...arr, attrValue(key, values[key])], ['']) + .join(' '); + +function traverse(tree, cb) { + if (Array.isArray(tree)) { + tree.forEach((_, i) => { + traverse(cb(tree[i]), cb); + }); + } else if (typeof tree === 'object' && tree.content) { + traverse(tree.content, cb); + } + + return tree; +} + +function renderNodes(nodes) { + return [].concat(nodes).reduce((r, node) => r + renderNode(node), ''); +} + +function renderNode(node) { + if (!node) return; + + if (typeof node === 'string' || typeof node === 'number') { + return node; + } + + if (typeof node === 'object') { + return `<${node.tag}${attrs(node.attrs)}>${renderNodes(node.content)}`; + } + + if (Array.isArray(node)) { + return renderNodes(node); + } + + return ''; +} + +module.exports = renderNodes; diff --git a/packages/bbob-html/package.json b/packages/bbob-html/package.json index dbc6cdb..aacf8fa 100644 --- a/packages/bbob-html/package.json +++ b/packages/bbob-html/package.json @@ -2,7 +2,10 @@ "name": "@bbob/html", "version": "1.0.1", "description": "HTML renderer for BBCode pareser BBob", - "main": "index.js", + "main": "lib/index.js", + "devDependencies": { + "@bbob/parser": "*" + }, "scripts": { "test": "../../node_modules/.bin/jest --", "cover": "../../node_modules/.bin/jest --coverage", diff --git a/packages/bbob-html/test/index.test.js b/packages/bbob-html/test/index.test.js new file mode 100644 index 0000000..d714075 --- /dev/null +++ b/packages/bbob-html/test/index.test.js @@ -0,0 +1,27 @@ +const render = require('../lib/index'); +const parse = require('@bbob/parser'); + +const process = input => render(parse(input)); + +describe('@bbob/html', () => { + test('render bbcode tag with single param as html tag', () => { + const input = '[url=https://ru.wikipedia.org]Text[/url]'; + const result = 'Text'; + + expect(process(input)).toBe(result); + }); + + test('render bbcode tag with multiple params as html tag', () => { + const input = '[url href=https://ru.wikipedia.org target=_blank text="Foo Bar"]Text[/url]'; + const result = 'Text'; + + expect(process(input)).toBe(result); + }); + + test('render bbcode tag without params as html tag', () => { + const input = '[url]https://ru.wikipedia.org[/url]'; + const result = 'https://ru.wikipedia.org'; + + expect(process(input)).toBe(result); + }); +}); diff --git a/packages/bbob-preset-html5/.gitignore b/packages/bbob-preset-html5/.gitignore new file mode 100644 index 0000000..141d036 --- /dev/null +++ b/packages/bbob-preset-html5/.gitignore @@ -0,0 +1,3 @@ +package-lock.json +coverage +dist \ No newline at end of file diff --git a/packages/bbob-preset-html5/.npmignore b/packages/bbob-preset-html5/.npmignore new file mode 100644 index 0000000..97fe0e2 --- /dev/null +++ b/packages/bbob-preset-html5/.npmignore @@ -0,0 +1,6 @@ +package-lock.json +coverage +src +dist +!lib +*.test.js diff --git a/packages/bbob-preset-html5/README.md b/packages/bbob-preset-html5/README.md new file mode 100644 index 0000000..cf002f7 --- /dev/null +++ b/packages/bbob-preset-html5/README.md @@ -0,0 +1 @@ +Preset to render BBCode to HTML tags diff --git a/packages/bbob-preset-html5/lib/index.js b/packages/bbob-preset-html5/lib/index.js new file mode 100644 index 0000000..a0a9f8d --- /dev/null +++ b/packages/bbob-preset-html5/lib/index.js @@ -0,0 +1,72 @@ +// [b]bolded text[/b] => bolded text +// [i]italicized text[/i] => italicized text +// [u]underlined text[/u] => underlined text +// [s]strikethrough text[/s] => strikethrough text +// [url]https://en.wikipedia.org[/url] => https://en.wikipedia.org +// [url=http://step.pgc.edu/]ECAT[/url] => ECAT +// [img]https://upload.wikimedia.org/wikipedia/commons/thumb/4/47/Go-home-2.svg/100px-Go-home-2.svg.png[/img] => +// [quote="author"]quoted text[/quote] =>

quoted text

+// [code]monospaced text[/code] =>
monospaced text
+// [style size="15px"]Large Text[/style] => Large Text +// [style color="red"]Red Text[/style] => Red Text + +/** + [list] + [*]Entry 1 + [*]Entry 2 + [/list] + + [list] + *Entry 1 + *Entry 2 + [/list] + + =>
  • Entry 1
  • Entry 2
+ + */ + +/** + [table] + [tr] + [td]table 1[/td] + [td]table 2[/td] + [/tr] + [tr] + [td]table 3[/td] + [td]table 4[/td] + [/tr] + [/table] + =>
table 1table 2
table 3table 4
+ */ + +// [b]bolded text[/b] => bolded text + + +const processors = { + b: node => ({ + tag: 'span', + attrs: { + style: 'font-weight: bold;', + }, + content: node.content, + }), + i: node => ({ + tag: 'span', + attrs: { + style: 'font-style: italic;', + }, + content: node.content, + }), +}; + +module.exports = function html5Preset(opts = {}) { + return function process(tree) { + tree.walk((node) => { + if (node.tag && processors[node.tag]) { + return processors[node.tag](node, opts); + } + + return node; + }); + }; +}; diff --git a/packages/bbob-preset-html5/package.json b/packages/bbob-preset-html5/package.json new file mode 100644 index 0000000..6b68127 --- /dev/null +++ b/packages/bbob-preset-html5/package.json @@ -0,0 +1,37 @@ +{ + "name": "@bbob/preset-html5", + "version": "1.0.0", + "description": "HTML5 Preset to transform BBCode to HTML", + "main": "lib/index.js", + "directories": { + "lib": "lib" + }, + "devDependencies": { + "@bbob/core": "*" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/JiLiZART/bbob.git" + }, + "keywords": [ + "bbcode", + "preset", + "html5", + "bbode", + "transform" + ], + "bugs": { + "url": "https://github.com/JiLiZART/bbob/issues" + }, + "homepage": "https://github.com/JiLiZART/bbob#readme", + "scripts": { + "test": "../../node_modules/.bin/jest --", + "cover": "../../node_modules/.bin/jest --coverage", + "lint": "../../node_modules/.bin/eslint ." + }, + "author": "Nikolay Kostyurin ", + "license": "MIT", + "publishConfig": { + "registry": "https://registry.npmjs.org/" + } +} diff --git a/packages/bbob-preset-html5/test/index.test.js b/packages/bbob-preset-html5/test/index.test.js new file mode 100644 index 0000000..e5fdc2f --- /dev/null +++ b/packages/bbob-preset-html5/test/index.test.js @@ -0,0 +1,15 @@ +const preset = require('../lib/index'); +const bbob = require('@bbob/core'); + +const processor = bbob([ + preset(), +]); + +describe('bbob-preset-html5', () => { + test('render [url]', () => { + const input = '[url=https://ru.wikipedia.org]Text[/url]'; + const result = 'Text'; + + expect(processor.process(input, { sync: true })).toBe(result); + }); +}); diff --git a/packages/bbob/index.js b/packages/bbob/index.js deleted file mode 100644 index f7334f5..0000000 --- a/packages/bbob/index.js +++ /dev/null @@ -1,3 +0,0 @@ -function BBob() { - -}