BBob a BBCode processor

BBob is a tool to parse and transform [BBCode](https://en.wikipedia.org/wiki/BBCode) written in pure javascript, no dependencies Build Status codecov CodeFactor BCH compliance Known Vulnerabilities ## Packages | Package | Status | Size | Description | |----------------------|------------------------------------------------------------|---------|---------------------------| | @bbob/core | [![@bbob/core-status]][@bbob/core-package] | ![@bbob/core-size] | Core package | | @bbob/react | [![@bbob/react-status]][@bbob/react-package] | ![@bbob/react-size] | React renderer | | @bbob/preset-react | [![@bbob/preset-react-status]][@bbob/preset-react-package] | ![@bbob/preset-react-size] | React default tags preset | | @bbob/vue2 | [![@bbob/vue2-status]][@bbob/vue2-package] | ![@bbob/vue2-size] | Vue 2 renderer | | @bbob/preset-vue | [![@bbob/preset-vue-status]][@bbob/preset-vue-package] | ![@bbob/preset-react-size] | Vue default tags preset | | @bbob/html | [![@bbob/html-status]][@bbob/html-package] | ![@bbob/html-size] | HTML renderer | | @bbob/preset-html5 | [![@bbob/preset-html5-status]][@bbob/preset-html5-package] | ![@bbob/preset-html5-size] | HTML5 default tags preset | [@bbob/core-status]: https://img.shields.io/npm/v/@bbob/core.svg [@bbob/react-status]: https://img.shields.io/npm/v/@bbob/react.svg [@bbob/preset-react-status]: https://img.shields.io/npm/v/@bbob/preset-react.svg [@bbob/vue2-status]: https://img.shields.io/npm/v/@bbob/vue2.svg [@bbob/preset-vue-status]: https://img.shields.io/npm/v/@bbob/preset-vue.svg [@bbob/html-status]: https://img.shields.io/npm/v/@bbob/html.svg [@bbob/preset-html5-status]: https://img.shields.io/npm/v/@bbob/preset-html5.svg [@bbob/core-size]: https://badgen.net/bundlephobia/minzip/@bbob/core [@bbob/react-size]: https://badgen.net/bundlephobia/minzip/@bbob/react [@bbob/preset-react-size]: https://badgen.net/bundlephobia/minzip/@bbob/preset-react [@bbob/vue2-size]: https://badgen.net/bundlephobia/minzip/@bbob/vue2 [@bbob/preset-vue-size]: https://badgen.net/bundlephobia/minzip/@bbob/preset-vue [@bbob/html-size]: https://badgen.net/bundlephobia/minzip/@bbob/html [@bbob/preset-html5-size]: https://badgen.net/bundlephobia/minzip/@bbob/preset-html5 [@bbob/core-package]: https://npmjs.com/package/@bbob/core [@bbob/react-package]: https://npmjs.com/package/@bbob/react [@bbob/preset-react-package]: https://npmjs.com/package/@bbob/preset-react [@bbob/vue2-package]: https://npmjs.com/package/@bbob/vue2 [@bbob/preset-vue-package]: https://npmjs.com/package/@bbob/preset-vue [@bbob/html-package]: https://npmjs.com/package/@bbob/html [@bbob/preset-html5-package]: https://npmjs.com/package/@bbob/preset-html5 [DEMO Playground](https://codepen.io/JiLiZART/full/vzMvpd) ## Table of contents * [Usage](#usage) * [Basic usage](#basic-usage) * [React usage](#react-usage) * [Vue 2 usage](#vue2-usage) * [Presets](#presets) * [Create your own preset](#create-preset) * [HTML Preset](#html-preset) * [React Preset](#react-preset) * [React usage](#react) * [Component](#react-component) * [Render prop](#react-render) * [PostHTML usage](#posthtml) * [Create Plugin](#plugin) * [Benchmarks](#benchmarks) ### Basic usage ```shell npm i @bbob/core @bbob/html @bbob/preset-html5 ``` ```js import bbobHTML from '@bbob/html' import presetHTML5 from '@bbob/preset-html5' const processed = bbobHTML(`[i]Text[/i]`, presetHTML5()) console.log(processed); // Text ``` ### React usage ```shell npm i @bbob/react @bbob/preset-react ``` ```js import React from 'react' import {render} from 'react-dom' import bbobReactRender from '@bbob/react/es/render' import presetReact from '@bbob/preset-react' const options = { onlyAllowTags: ['i'], enableEscapeTags: true } const content = bbobReactRender(`[i]Text[/i]`, presetReact(), options) console.log(render({content})); // Text ``` ### Vue 2 usage ```shell npm i @bbob/vue2 @bbob/preset-vue ``` ```js import Vue from 'vue' import VueBbob from '@bbob/vue2'; Vue.use(VueBbob); ``` ```html ``` More examples available in examples folder ### Presets Its a way to transform parsed BBCode AST tree to another tree by rules in preset #### Create your own preset ```js import { createPreset } from '@bbob/preset' export default createPreset({ quote: (node) => ({ tag: 'blockquote', attrs: node.attrs, content: [{ tag: 'p', attrs: {}, content: node.content, }], }), }) ``` #### HTML Preset Also you can use predefined preset for HTML ```js import html5Preset from '@bbob/preset-html5/es' import { render } from '@bbob/html/es' import bbob from '@bbob/core' console.log(bbob(html5Preset()).process(`[quote]Text[/quote]`, { render }).html) //

Text

``` #### React Preset Also you can use predefined preset for React ```js import reactPreset from "@bbob/preset-react"; import reactRender from "@bbob/react/es/render"; const preset = reactPreset.extend((tags, options) => ({ ...tags, quote: node => ({ tag: "blockquote", content: node.content }) })); const result = reactRender(`[quote]Text[/quote]`, reactPreset()); /* It produces a VDOM Nodes equal to React.createElement('blockquote', 'Text') */ document.getElementById("root").innerHTML = JSON.stringify(result, 4); ``` [![Edit lp7q9yj0lq](https://codesandbox.io/static/img/play-codesandbox.svg)](https://codesandbox.io/s/lp7q9yj0lq) ### React usage #### Component Or you can use React Component ```js import React from 'react' import { render } from 'react-dom' import BBCode from '@bbob/react/es/Component' import reactPreset from '@bbob/preset-react/es' const MyComponent = () => ( [quote]Text[/quote] ) render() //

Text

``` [![Edit 306pzr9k5p](https://codesandbox.io/static/img/play-codesandbox.svg)](https://codesandbox.io/s/306pzr9k5p) #### Render prop Or pass result as render prop ```js import React from "react"; import { render } from 'react-dom' import reactRender from '@bbob/react/es/render' import reactPreset from '@bbob/preset-react/es' const toReact = input => reactRender(input, reactPreset()) const text = toReact('[b]Super [i]easy[/i][/b] [u]to[/u] render') const App = ({ renderProp }) => ( {text} ) render() // Super easy to render ``` [![Edit x7w52lqmzz](https://codesandbox.io/static/img/play-codesandbox.svg)](https://codesandbox.io/s/jovial-cohen-bvo08) ### PostHTML usage ### Create Plugin ### Benchmarks To test on your machine run ```shell npm run build node benchmark ``` Tested on Node v12.18.3 | Package | Ops/sec | Runs sampled | |----------------------|----------------------|-------------------| | regex/parser | 6.02 ops/sec ±2.77% | (20 runs sampled) | | ya-bbcode | 10.70 ops/sec ±1.94% | (31 runs sampled) | | xbbcode/parser | 107 ops/sec ±2.29% | (69 runs sampled) | | @bbob/parser | 137 ops/sec ±1.11% | (78 runs sampled) |