JSFiddle - React, Tailwind, and code Playground

by Kai

HTML

<textarea></textarea>

CSS

.bbcode-editor {
    width: 100%;
}

.bbcode-toolbar {
    margin: 0;
    list-style-type: none;
    padding: 0;
}

.bbcode-toolbar li {   
    display: inline;
    padding-left: 18px;    
    margin-left: 10px;
    cursor: pointer;
    opacity: 0.5;
}

.bbcode-toolbar li:hover {
    opacity: 1;
}

.bbcode-textarea {
    width: 100%;
    height: 150px;
    padding: 5px;
    border: 1px solid #999;
    resize: vertical;
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    -ie-box-sizing: border-box;
    -o-box-sizing: border-box;
    box-sizing: border-box;
}

.bbcode-preview {
    color: #777;    
    font-family: "Courier New";
    background: #F8F8F8; 
    margin: 0 auto;
    padding: 10px;
}

.bbcode-preview img {
    max-width: 100%;
}

JavaScript

// BBCode.js v0.1 by Kai Mallea
// https://github.com/kaimallea/bbcode
// License: http://www.opensource.org/licenses/mit-license.php
(function(){var d={},i;d.VERSION="0.1";i=function(e){return e.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&#39;").replace(/</g,"&lt;").replace(/>/g,"&gt;")};_render=function(e,d){var a={},f={escape:!0,newlines:!0};if(!e)return"";if(d)for(var g in d)d.hasOwnProperty(g)&&(f[g]=d[g]);f.escape&&(e=i(e));a.bold={re:/\[b\]([\s\S]*?)\[\/b\]/ig,sub:function(a,b){return"<strong>"+b+"</strong>"}};a.italic={re:/\[i\]([\s\S]*?)\[\/i\]/ig,sub:function(a,b){return"<em>"+b+"</em>"}};a.code={re:/\[code\]([\s\S]*?)\[\/code\]/ig,
sub:function(a,b){return"<pre><code>"+b+"</code></pre>"}};a.quote={re:/\[quote\]([\s\S]*?)\[\/quote\]/ig,sub:function(a,b){return"<blockquote><p>"+b+"<p></blockquote>"}};a.quotespecific={re:/\[quote=(?:"|&quot;)(.*?)(?:"|&quot;)\]([\s\S]*?)\[\/quote\]/ig,sub:function(a,b,c){return b+" wrote: <blockquote><p>"+c+"<p></blockquote>"}};a.size={re:/\[size=(\d+)\]([\s\S]*?)\[\/size\]/ig,sub:function(a,b,c){return'<span style="font-size:'+b+'%;">'+c+"</span>"}};a.strikethrough={re:/\[s\]([\s\S]*?)\[\/s\]/ig,
sub:function(a,b){return"<del>"+b+"</del>"}};a.underline={re:/\[u\]([\s\S]*?)\[\/u\]/ig,sub:function(a,b){return'<span style="text-decoration:underline;">'+b+"</span>"}};a.center={re:/\[center\]([\s\S]*?)\[\/center\]/ig,sub:function(a,b){return'<div style="text-align:center;">'+b+"</div>"}};a.color={re:/\[color=([#a-z0-9]+)\]([\s\S]*?)\[\/color\]/ig,sub:function(a,b,c){return'<span style="color:'+b+';">'+c+"</span>"}};a.email={re:/\[email\]([\s\S]*?)\[\/email\]/ig,sub:function(a,b){return'<a href="mailto:'+
b+'">'+b+"</a>"}};a.emailcustom={re:/\[email=(.*?)\]([\s\S]*?)\[\/email\]/ig,sub:function(a,b,c){return'<a href="mailto:'+b+'">'+c+"</a>"}};a.url={re:/\[url\]([\s\S]*?)\[\/url\]/ig,sub:function(a,b){return'<a...