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 START_TAG = '<';
+const END_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)}${node.tag}>`;
+ 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;
}