- Notifications
You must be signed in to change notification settings - Fork20
⚡️Blazing fast js bbcode parser, that transforms and parses bbcode to AST and transform it to HTML, React, Vue with plugin support in pure javascript, no dependencies
License
JiLiZART/BBob
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
BBob is a tool to parse and transform [BBCode](https://en.wikipedia.org/wiki/BBCode)written in pure javascript, no dependencies
npm i @bbob/html @bbob/preset-html5
importbbobHTMLfrom'@bbob/html'importpresetHTML5from'@bbob/preset-html5'constprocessed=bbobHTML(`[i]Text[/i]`,presetHTML5())console.log(processed);// <span>Text</span>
npm i @bbob/react @bbob/preset-react
importReactfrom'react'importBBCodefrom'@bbob/react';importpresetReactfrom'@bbob/preset-react';constplugins=[presetReact()];exportdefault()=>(<BBCodeplugins={plugins}> [table] [tr] [td]table 1[/td] [td]table 2[/td] [/tr] [tr] [td]table 3[/td] [td]table 4[/td] [/tr] [/table]</BBCode>)
import{render}from'@bbob/react'exportdefault()=>render(`[table] [tr] [td]table 1[/td] [td]table 2[/td] [/tr] [tr] [td]table 3[/td] [td]table 4[/td] [/tr][/table]`)
npm i @bbob/vue2 @bbob/preset-vue
importVuefrom'vue'importVueBbobfrom'@bbob/vue2';Vue.use(VueBbob);
<template><divclass="html"><h2>Generated HTML here</h2><bbob-bbcodecontainer="div":plugins="plugins">{{ bbcode }}</bbob-bbcode></div></template><script>importVuefrom'vue'importpresetfrom'@bbob/preset-vue'exportdefaultVue.extend({name:'App',data(){return{bbcode:'Text [b]bolded[/b] and [i]Some Name[/i]',plugins:[preset()],}}})</script>
More examples available inexamples folder
Parse only allowed tags
importbbobHTMLfrom'@bbob/html'importpresetHTML5from'@bbob/preset-html5'constprocessed=bbobHTML(`[i][b]Text[/b][/i]`,presetHTML5(),{onlyAllowTags:['i']})console.log(processed);// <span>[b]Text[/b]</span>
Enable context free mode that ignores parsing all tags inside given tags
importbbobHTMLfrom'@bbob/html'importpresetHTML5from'@bbob/preset-html5'constprocessed=bbobHTML(`[b]Text[/b][code][b]Text[/b][/code]`,presetHTML5(),{contextFreeTags:['code']})console.log(processed);// <span>Text</span><pre>[b]Text[/b]</pre>
Enable escape support for tags
importbbobHTMLfrom'@bbob/html'importpresetHTML5from'@bbob/preset-html5'constprocessed=bbobHTML(`[b]Text[/b]'\\[b\\]Text\\[/b\\]'`,presetHTML5(),{enableEscapeTags:true})console.log(processed);// <span>Text</span>[b]Text[/b]
Allows to parse case insensitive tags like[h1]some[/H1]
-><h1>some</h1>
importbbobHTMLfrom'@bbob/html'importpresetHTML5from'@bbob/preset-html5'constprocessed=bbobHTML(`[h1]some[/H1]`,presetHTML5(),{caseFreeTags:true})console.log(processed);// <h1>some</h1>
importbbobHTMLfrom'@bbob/html'importpresetHTML5from'@bbob/preset-html5'constprocessed=bbobHTML(`[b]Text[/b]'\\[b\\]Text\\[/b\\]'`,presetHTML5(),{enableEscapeTags:true})console.log(processed);// <span>Text</span>[b]Text[/b]
Its a way to transform parsed BBCode AST tree to another tree by rules in preset
import{createPreset}from'@bbob/preset'exportdefaultcreatePreset({quote:(node)=>({tag:'blockquote',attrs:node.attrs,content:[{tag:'p',attrs:{},content:node.content,}],}),})
Also you can use predefined preset for HTML
importhtml5Presetfrom'@bbob/preset-html5/es'import{render}from'@bbob/html/es'importbbobfrom'@bbob/core'console.log(bbob(html5Preset()).process(`[quote]Text[/quote]`,{ render}).html)// <blockquote><p>Text</p></blockquote>
Also you can use predefined preset for React
importreactPresetfrom"@bbob/preset-react";importreactRenderfrom"@bbob/react/es/render";constpreset=reactPreset.extend((tags,options)=>({ ...tags,quote:node=>({tag:"blockquote",content:node.content})}));constresult=reactRender(`[quote]Text[/quote]`,reactPreset());/*It produces a VDOM Nodes equal toReact.createElement('blockquote', 'Text')*/document.getElementById("root").innerHTML=JSON.stringify(result,4);
Or you can use React Component
importReactfrom'react'import{render}from'react-dom'importBBCodefrom'@bbob/react/es/Component'importreactPresetfrom'@bbob/preset-react/es'constMyComponent=()=>(<BBCodeplugins={[reactPreset()]}options={{onlyAllowTags:['i']}}> [quote]Text[/quote]</BBCode>)render(<MyComponent/>)// <div><blockquote><p>Text</p></blockquote></div>
Or pass result as render prop
importReactfrom"react";import{render}from'react-dom'importreactRenderfrom'@bbob/react/es/render'importreactPresetfrom'@bbob/preset-react/es'consttoReact=input=>reactRender(input,reactPreset())consttext=toReact('[b]Super [i]easy[/i][/b] [u]to[/u] render')constApp=({ renderProp})=>(<span>{text}</span>)render(<App/>)// <span><span>Super <span>easy</span></span> <span>to</span> render</span>
For example lets parse all strings that similar to links like "https://some-site.com"
import{createRoot}from"react-dom/client";importBBCodefrom"@bbob/react/es/Component";importTagNodefrom"@bbob/plugin-helper/es/TagNode";import{isStringNode}from"@bbob/plugin-helper/es";constURL_RE=newRegExp(`([--:\\w?@%&+~#=]+\\/*\\.[a-z]{2,4}\\/{0,2})((?:[?&](?:\\w+)=(?:\\w+))+|[^^).|,][--:\\w?@%&+~#=()_]+)?`,"g");constisValidUrl=(url)=>URL_RE.test(url);constlinkParsePlugin=(tree)=>{returntree.walk((node)=>{if(isStringNode(node)&&isValidUrl(node)){returnTagNode.create("a",{href:node},`Url to:${node}`);}returnnode;});};constrootElement=document.getElementById("root");constroot=createRoot(rootElement);root.render(<BBCodeplugins={[linkParsePlugin]}> https://github.com/JiLiZART/BBob Other text without link</BBCode>);
To test on your machine run
npm run buildnode benchmark
Tested on Node v20.11.1
Package | Ops/sec |
---|---|
regex/parser | 6 ops/sec |
ya-bbcode | 11 ops/sec |
xbbcode/parser | 102 ops/sec |
@bbob/parser | 174 ops/sec |
Checkout Benckmark job results
You can support this projecti with donation in:
Bitcoin:bc1qx34sx3zmfd5e2km607p8s8t30d4rt33d2l9pwt
USDT(TRC20):TT94uVjJho8n47xbdfNYz6vdebgmKFpxAT
Also thanks to support
Developed with <3 using JetBrains
About
⚡️Blazing fast js bbcode parser, that transforms and parses bbcode to AST and transform it to HTML, React, Vue with plugin support in pure javascript, no dependencies