diff --git a/packages/bbob-html/README.md b/packages/bbob-html/README.md index d4d006e..034c4f3 100644 --- a/packages/bbob-html/README.md +++ b/packages/bbob-html/README.md @@ -1,2 +1,2 @@ -# bbob-html -> Converts bbob-parser AST tree to html +#@bbob/html +> Converts @bbob/parser AST tree to html diff --git a/packages/bbob-html/src/index.js b/packages/bbob-html/src/index.js index 2d68395..5423329 100644 --- a/packages/bbob-html/src/index.js +++ b/packages/bbob-html/src/index.js @@ -9,6 +9,11 @@ const attrs = values => .reduce((arr, key) => [...arr, attrValue(key, values[key])], ['']) .join(' '); +const SELFCLOSE_END_TAG = '/>'; +const CLOSE_START_TAG = ''; + const renderNode = (node, { stripTags = false }) => { if (!node) return ''; const type = typeof node; @@ -24,11 +29,11 @@ const renderNode = (node, { stripTags = false }) => { } if (node.content === null) { - return `<${node.tag}${attrs(node.attrs)} />`; + return [START_TAG, node.tag, attrs(node.attrs), SELFCLOSE_END_TAG].join(''); } // eslint-disable-next-line no-use-before-define - return `<${node.tag}${attrs(node.attrs)}>${renderNodes(node.content)}`; + return [START_TAG, node.tag, attrs(node.attrs), END_TAG, renderNodes(node.content), CLOSE_START_TAG, node.tag, END_TAG].join(''); } if (Array.isArray(node)) { diff --git a/packages/bbob-preset-html5/src/index.js b/packages/bbob-preset-html5/src/index.js index c3cd801..ce2c53c 100644 --- a/packages/bbob-preset-html5/src/index.js +++ b/packages/bbob-preset-html5/src/index.js @@ -1,25 +1,5 @@ /* eslint-disable indent */ -import { isTagNode } from '@bbob/plugin-helper'; +import { createPreset } from '@bbob/preset'; import defaultTags from './defaultTags'; -function process(tags, tree, core) { - tree.walk(node => (isTagNode(node) && tags[node.tag] - ? tags[node.tag](node, core) - : node)); -} - -function html5Preset(opts = {}) { - const tags = Object.assign({}, defaultTags, opts.tags || {}); - - return (tree, core) => process(tags, tree, core); -} - -function extend(callback) { - const tags = callback(defaultTags); - - return () => (tree, core) => process(tags, tree, core); -} - -html5Preset.extend = extend; - -export default html5Preset; +export default createPreset(defaultTags); diff --git a/packages/bbob-preset-html5/test/index.test.js b/packages/bbob-preset-html5/test/index.test.js index 09c64b9..201bf43 100644 --- a/packages/bbob-preset-html5/test/index.test.js +++ b/packages/bbob-preset-html5/test/index.test.js @@ -45,7 +45,7 @@ describe('@bbob/preset-html5', () => { test('[img]https://upload.wikimedia.org/wikipedia/commons/thumb/4/47/Go-home-2.svg/100px-Go-home-2.svg.png[/img]', () => { const input = '[img]https://upload.wikimedia.org/wikipedia/commons/thumb/4/47/Go-home-2.svg/100px-Go-home-2.svg.png[/img]'; - const result = ''; + const result = ''; expect(parse(input)).toBe(result); }); diff --git a/packages/bbob-preset/README.md b/packages/bbob-preset/README.md new file mode 100644 index 0000000..3dfb828 --- /dev/null +++ b/packages/bbob-preset/README.md @@ -0,0 +1,24 @@ +#@bbob/preset +Base function for create presets to process bbcode AST to HTML or Framework specific tags + +## Install + +```bash +npm i @bbob/preset +``` +### API + +**For plain HTML** + +```js +import { createPreset } from '@bbob/core' + +import { createPreset } from '@bbob/preset' + +const options = { + onlyAllowTags: ['url', 'h'], + onError: (err) => console.warn(err.message, err.lineNumber, err.columnNumber) +}; +const pre = parse('[url=https://github.com]hello world![/url]', options) +``` +## Usage diff --git a/packages/bbob-preset/src/index.js b/packages/bbob-preset/src/index.js index 2f1652f..963c7ae 100644 --- a/packages/bbob-preset/src/index.js +++ b/packages/bbob-preset/src/index.js @@ -1,25 +1,24 @@ /* eslint-disable indent */ import { isTagNode } from '@bbob/plugin-helper'; -function process(tags, tree, ...rest) { +function process(tags, tree, core) { tree.walk(node => (isTagNode(node) && tags[node.tag] - ? tags[node.tag](node, ...rest) + ? tags[node.tag](node, core) : node)); } /** - * @param tags + * @param defTags * @return {function(*=, *=)} */ -function createPreset(tags) { - const instance = (tree, ...rest) => process(tags, tree, ...rest); - - instance.extend = (callback) => { - const newTags = callback(tags); - - return () => createPreset(newTags); +function createPreset(defTags) { + const instance = (opts = {}) => { + instance.options = Object.assign(instance.options || {}, opts); + return (tree, core) => process(defTags, tree, core); }; + instance.extend = callback => createPreset(callback(defTags, instance.options)); + return instance; }