2
0
mirror of https://github.com/tenrok/BBob.git synced 2026-06-11 18:02:26 +03:00

add html5 preset, some files structure changes

This commit is contained in:
Nikolay Kostyurin
2018-07-06 00:38:29 +02:00
parent 12144415cc
commit 21ef50cf1d
21 changed files with 322 additions and 80 deletions
-58
View File
@@ -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)}></${node.tag}>`;
}
// 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;
-6
View File
@@ -1,6 +0,0 @@
describe('bbob-html', () => {
test('render proper markup', () => {
});
});
+61
View File
@@ -0,0 +1,61 @@
function escapeQuote(value) {
return value.replace(/"/g, '&quot;');
}
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)}</${node.tag}>`;
}
if (Array.isArray(node)) {
return renderNodes(node);
}
return '';
}
module.exports = renderNodes;
+4 -1
View File
@@ -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",
+27
View File
@@ -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 = '<url url="https://ru.wikipedia.org">Text</url>';
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 = '<url url="https://ru.wikipedia.org">Text</url>';
expect(process(input)).toBe(result);
});
test('render bbcode tag without params as html tag', () => {
const input = '[url]https://ru.wikipedia.org[/url]';
const result = '<url>https://ru.wikipedia.org</url>';
expect(process(input)).toBe(result);
});
});