Bones
Code Helper
Posts: 131
Bones said 0 great things
|
Post by Bones on May 25, 2011 19:54:46 GMT -8
Description:
Create custom UBBC tags for your forum with little or no coding knowledge Browsers tested: Firefox, Chrome, Internet Explorer, Opera and Safari (not exhaustively tested to my satisfaction however, bugs may still exist but time waits for no man!) Preview: Live PreviewCode: Global Footer<script> (function customBBCode(action){ //Create Custom BBcodes For Your Forum var boardHF = "*"; var customBBCodes = {} //["replacement text/function",[post,signature,miniprofile,category,board,thread],"ubbc button icon (optional)" customBBCodes['soundcloud'] = ["%3Cobject height%3D%2281%22 width%3D%22100%25%22%3E%3Cparam name%3D%22movie%22 value%3D%22http%3A//p1.soundcloud.com/player.swf%3Furl%3D%7Bparam%7D%26g%3Dbb%22%3E%3C/param%3E%3Cparam name%3D%22allowscriptaccess%22 value%3D%22always%22%3E %3C/param%3E %3Cembed allowscriptaccess%3D%22always%22 height%3D%2281%22 src%3D%22http%3A//player.soundcloud.com/player.swf%3Furl%3D%7Bparam%7D%26g%3Dbb%22 type%3D%22application/x-shockwave-flash%22 width%3D%22100%25%22%3E %3C/embed%3E%3C/object%3E %3Ca href%3D%22%7Bparam%7D%22%3E%7Bparam%7D%3C/a%3E", [1,1], "http://img.skitch.com/20090727-cs9fpj834egp1ew8b14a9hhs7j.png"]; customBBCodes['user'] = ["function%28bbInputText%2CbbParams%2CbbTag%2Ccontainer%29%7B %0A%09if%28%21bbInputText || bbInputText%3D%3D%22%22%29 return bbTag%3B%0A%09var displayname %3D %28bbParams %26%26 bbParams.displayname%29%3FbbParams.displayname%3AbbInputText%3B%0A%09var group %3D %28bbParams %26%26 bbParams.group%29%3FbbParams.group%3A%22group0%22%3B %0A%09return %27%3Ca href%3D%22/%3Faction%3Dviewprofile%26user%3D%27+bbInputText+%27%22 class%3D%22%27+group+%27%22%3E%27+displayname+%27%3C/a%3E%27%0A%7D", [1,1,0,0,0,0] ,, "user"]; customBBCodes['vimeo'] = ["function%28bbInputText%2CbbParams%2CbbTag%2Ccontainer%29%7B %0A%09if%28%21bbInputText || bbInputText%3D%3D%22%22%29return bbTag%3B%0A%09var emb %3D %27%3Cembed src%3D%22http%3A//www.vimeo.com/moogaloop.swf%3Fclip_id%3D%27 +bbInputText+ %27%26server%3Dwww.vimeo.com%26show_title%3D1%26show_byline%3D1%26show_portrait%3D0%22 allowfullscreen%3D%22true%22 allowscriptaccess%3D%22always%22 pluginspage%3D%22http%3A//www.macromedia.com/go/getflashplayer%22 type%3D%22application/x-shockwave-flash%22 quality%3D%22autohigh%22 wmode%3D%22transparent%22 height%3D%22450px%22 width%3D%22600px%22%3E%27%2C a%0A%09if%28%22object%22 %3D%3D typeof%28bbParams%29%29%0A%09for%28a in bbParams%29%7Bemb %3D emb.replace%28RegExp%28%22%5C%5Cb%22 +a+ %22%3D%5B%5E%5C%5Cs%26%23%3E%5D+%22%29%2Ca+%22%3D%22 + bbParams%5Ba%5D%29%3B %7D %0A%09return emb%3B%0A%7D", [1,1,0,0,1,0], "http://i51.tinypic.com/jzy6ac.png","vimeo"]; var e,t,o,n,bones,bbcodes var lnk,txt,hash=location.hash, codre = /var customBBCodes\s*=\s*\{\}([\w\W]*?)var\se,t,o,n,bones,bbcodes/i, bbfunc = /function.*?\(.*?\)\{[\s\S]+\}/ function dn(tag,attr,children){ if(attr && (attr.constructor===Array||attr.constructor===String) && !children){children=attr; attr=null;} var e = tag.nodeName?tag:document.createElement(tag),a,b; attr=attr?attr:{}; for(a in attr)try{ if(/^(class)$/i.test(a)){a="className";attr[a]=attr[RegExp.$1];}else if(/^for$/i.test(a)){a="htmlFor";} if(/^style$/i.test(a)){ e.style.cssText=attr[a]; }else{ if(/^on/i.test(a)){ if( !this.attrEvent)e[a]= ("function" == typeof( attr[a])?attr[a]:Function(attr[a])); else e.setAttribute(a, attr[a]); }else {e[a]=attr[a];} } }catch(f){} if("string"==typeof(children))e.appendChild(document.createTextNode(children)); else if(children && children[0]){ for(a=0,b=children.length;a<b;a++){ if("string"==typeof children[a]){e.appendChild(document.createTextNode(children[a])); }else if(children[a] && children[a].nodeName){e.appendChild(children[a])} } } return e; } function toArray(a){try{return Array.prototype.slice.call(a)}catch(e){var b,c=[]; for(b=0;b<a.length;b++)c.push(a[b]);return c;}} function addBBRow (bbtag,cellClass){ if(!bbtag)return ""; var a=bbtag,b,c= (cellClass=='windowbg'?-1:1), d= customBBCodes[a]||["",[]] return dn('tr',[dn('td',{className:'windowbg'+(c>0?"":"2"),align:'center'},[dn('input',{type:'checkbox',name:'bbcode_check',id:'check_bbcode_'+a})]) ,dn('td',{className:'windowbg'+(c>0?"":"2"),align:'center'},[dn('a',{href:'#',title:'edit/add description',onclick:"var s=this.parentNode.lastChild,t;t=prompt('Enter a short description for \"'+this.innerHTML+'\"',s.innerHTML);if(t)s.innerHTML=t;return false;"},a),dn('span',{style:'display:none',id:'description_bbcode_'+a},(d[3]||a))]) ,dn('td',{className:'windowbg'+(c>0?"":"2"),width:'60%',style:'padding:4px;'},[dn('textarea',{id:'bbcode_'+a,rows:6,style:'width:100%', defaultValue:unescape(d[0]), value:unescape(d[0]), onchange:"var a=this.parentNode.parentNode.cells[0].firstChild; if(this.defaultValue!=this.value){a.checked=false;a.disabled=true;}else a.disabled=false;"})]) ,dn('td',{className:'windowbg'+(c>0?"":"2")},[ dn('fieldset',[dn('legend','Options') ,dn('table',{width:'100%',border:'0'},[dn('tbody',[dn('tr',[ dn('td',[ dn('input',{type:'checkbox',checked:d[1][0]==0?false:true,defaultChecked:d[1][0]==0?false:true, id:a+"_post_option", name:a+"_options"}), 'Posts/PM' ,dn('br'),dn('input',{type:'checkbox',checked:d[1][1]==0?false:true, defaultChecked:d[1][1]==0?false:true, id:a+"_signature_option", name:a+"_options"}),'Signature' ,dn('br'),dn('input',{type:'checkbox',checked:d[1][2]==0?false:true, defaultChecked:d[1][2]==0?false:true, id:a+"_miniprofile_option", name:a+"_options"}),'Miniprofile' ]) ,dn('td',[ dn('input',{type:'checkbox',checked:d[1][3]==0?false:true, defaultChecked:d[1][3]==0?false:true,id:a+"_category_option", name:a+"_options"}),'Category' ,dn('br'),,dn('input',{type:'checkbox',checked:d[1][4]==0?false:true, defaultChecked:d[1][4]==0?false:true,id:a+"_board_option", name:a+"_options"}),'Board' ,dn('br'),,dn('input',{type:'checkbox',checked:d[1][5]==0?false:true, defaultChecked:d[1][5]==0?false:true,id:a+"_thread_option", name:a+"_options"}),'Thread' ])])])]) ,"Icon: http://",dn('input',{type:'text', value:(d[2]||"").replace(/https?\/\//i,''), defaultValue:(d[2]||"").replace(/https?\/\//i,''),id:'icon_bbcode_'+a, name:a+"_options"}) ])])]) } if (!Array.prototype.filter){ //for IE quirksmode (MDC) Array.prototype.filter = function(fun ){ if (this === void 0 || this === null) throw new TypeError(); var t = Object(this); var len = t.length >>> 0; if (typeof fun !== "function") throw new TypeError(); var res = []; var thisp = arguments[1]; for (var i = 0; i < len; i++){ if (i in t){ var val = t[i]; if (fun.call(thisp, val, i, t)) res.push(val); } } return res; }; } function a2h /*Attribute nodes to hash*/(attr,merge){var a,b={}; for(a in attr)try{if(attr[a] && attr[a].specified)b[attr[a].nodeName]=attr[a].nodeValue;}catch(err){} if(merge)for(a in merge)b[a]=merge[a]; return b;} if(action=="admin"){ for(lnk=document.links,e=lnk.length,t=0;t<e;t++) if(/action=headersfooters$/.test(lnk[t].href)){ lnk[t].parentNode.insertBefore(dn('a', {href:'/?action=headersfooters2&id='+boardHF+'#custombbcodes'},['Custom BBcodes']),lnk[t].nextSibling) lnk[t].parentNode.insertBefore(dn('br'),lnk[t].nextSibling); break; } } if(action=="headersfooters2" && /#?custombbcodes/.test(hash)){ if((e=document.getElementsByName("footer")) && e[0] && e[0].form && e[0].form.id && e[0].form.id.value==boardHF){ if(codre.test(e[0].value) && (t = e[0].value.split(/var customBBCodes\s*=\s*\{\}/)) && t.length==2){ var formHF = e[0].form; t = e[0].form.offsetParent.offsetParent; o = t.offsetParent.offsetParent; while(o=o.previousSibling)if(o.data && /Modify Headers and Footers/.test(o.data)){o.data = "Custom BBCodes"; break;} t.parentNode.insertBefore(dn('table',a2h(t.attributes),[dn('tbody', (function(){ var a, b= [ dn('tr',[dn('td',a2h(t.tBodies[0].rows[0].cells[0].attributes,{colSpan:4}),['Custom BBCodes'])]), dn('tr',[dn('td',{className:'windowbg',colSpan:4},["You can add or remove custom BBCodes for your forum on this page",dn("br"), "TIP: Use {param} in the replacement text to indicate where replacements should occur.",dn("br"),"TIP (advanced): Replace can also accept a function which will be invoked at runtime to generate the replace text for each encountered BBCode of that type"])]), dn('tr',[ dn('td',{className:'catbg',width:'5%',align:'center'},[dn('input',{type:'checkbox',title:'select all',onclick:'for(var a=document.getElementsByName("bbcode_check"),b=0;b<a.length;b++)a[b].checked=this.checked;'})]) ,dn('td',{className:'catbg',align:'center'},'BBCode') ,dn('td',{className:'catbg',colSpan:2},'Replace') ]) ],c=-1; for(a in customBBCodes){ c=0-c; b.push(addBBRow(a,c>0?'windowbg2':'windowbg')); } b.push(dn('tr',[dn('td',a2h(t.tBodies[0].rows[0].cells[0].attributes,{colSpan:4}),[ dn('input',{type:'button',value:'Add New BBCode',id:'addbb'}), dn('input',{type:'button',value:'Delete Selected BBCodes',id:'deletebb',style:'margin-left:30px'}), dn('input',{type:'button',value:'Save Changes',id:'savebb',style:'margin-left:30px'}) ])])) return b; })() )]) ,t); t.style.display="none"; bbcodes = document.getElementsByName("bbcode_check") //IE submitName workaround (dynamically created inputs get "submitName" when "name" is specified) if(bbcodes.length==0){bbcodes = toArray(document.getElementsByTagName('input')).filter(function(val,index,array1){ if(val.type!="checkbox" || !/^check_bbcode_/.test(val.id))return false; else return true; })} document.getElementById('addbb').onclick = function(){ var a = this.parentNode.parentNode, b=prompt('Enter keyword to be used for this BBCode \n(example: enter google to create a [google][/google] BBCode for your forum)'), c if(b&&b.length){ if(!/^\w+[^\d]$/.test(b)){alert('Sorry, but only alphanumeric characters (letters, numbers and underscore) \ncan be used, also tag cannot end in a number, \nplease try again'); return;} if((c=document.getElementById('check_bbcode_'+b)) && c && c.name=="bbcode_check"){alert('A BBcode by that name already exists, please try again');return;} a.parentNode.insertBefore(addBBRow(b,'windowbg'+(a.previousSibling.firstChild.className=="windowbg2"?"":"2")),a) } } document.getElementById('deletebb').onclick = function(){var a,b=[],c,d = e = formHF.footer.value.match(codre)[0], f=RegExp.$1; for(a=0;a<bbcodes.length;a++){ if(bbcodes[a].checked){ b.push([bbcodes[a].id.split('_')[2],bbcodes[a].parentNode.parentNode.getElementsByTagName('textarea')[0].value]) } } if(!b[0])return; if(confirm('Are you sure you want to remove '+(b.length>1?"all selected BBCodes":"the ["+b[0][0]+"] BBCode")+" from your forum?")){ for(a=0;a<b.length;a++){ e = e.replace(RegExp("[\\n\\t]*customBBCodes\\['"+b[a][0]+"'\\]\\s*=\\s*\\[."+escape(b[a][1]).replace(/([+-.|\\\/*{}[\]()?^$])/g,"\\$1")+".+?(\\n|$)"),function(){ var c = document.getElementById('check_bbcode_'+b[a][0]).parentNode.parentNode; c.parentNode.removeChild(c); return ""; }); } if(d != c)formHF.footer.value = formHF.footer.value.replace(d,e); } } document.getElementById('savebb').onclick = function(){ var a,b,c,d = e = formHF.footer.value.match(codre)[0], f=RegExp.$1,g,h, desc,icon,opts; for(a=0;a<bbcodes.length;c=undefined,a++){ b = bbcodes[a].parentNode.parentNode.getElementsByTagName('textarea')[0].value; g = bbcodes[a].id.split('_')[2]; opts = bbcodes[a].parentNode.parentNode.lastChild.getElementsByTagName('input'); for(h=0;h<opts.length;h++)if((opts[h].type=="checkbox" && opts[h].defaultChecked!=opts[h].checked)||(opts[h].type=="text" && opts[h].defaultValue!=opts[h].value)){opts=true;break;} if(customBBCodes[g]==undefined || ((c = unescape(customBBCodes[g][0])) && (b != c || opts==true))){ icon = document.getElementById('icon_bbcode_'+g); desc = document.getElementById('description_bbcode_'+g); if(desc && desc.innerHTML.length)desc = '"'+desc.innerHTML+'"'; else desc = ""; if(icon && icon.value.length)icon = '"http://'+icon.value.replace(/https?:\/\//i,"")+'"'; else icon = ""; if(c==undefined)e = e.replace(/[\n\t]*var e,t,o,n,bones,bbcodes/,"\n\tcustomBBCodes['"+g+"'] = [\""+escape(b)+"\",["+ (document.getElementById(g+"_post_option").checked?"1":"0") +","+ (document.getElementById(g+"_signature_option").checked?"1":"0") +","+ (document.getElementById(g+"_miniprofile_option").checked?"1":"0") +","+ (document.getElementById(g+"_category_option").checked?"1":"0") +","+ (document.getElementById(g+"_board_option").checked?"1":"0") +","+ (document.getElementById(g+"_thread_option").checked?"1":"0") +"],"+icon+","+desc+"];\n\tvar e,t,o,n,bones,bbcodes"); else if(b!="")e = e.replace(RegExp("[\\n\\t]*customBBCodes\\['"+g+"'\\]\\s*=\\s*\\[."+escape(c).replace(/([+-.|\\\/*{}[\]()?^$])/g,"\\$1")+".+?(\\n|$)"), "customBBCodes['"+g+"'] = [\""+escape(b)+"\",["+ (document.getElementById(g+"_post_option").checked?"1":"0") +","+ (document.getElementById(g+"_signature_option").checked?"1":"0") +","+ (document.getElementById(g+"_miniprofile_option").checked?"1":"0") +","+ (document.getElementById(g+"_category_option").checked?"1":"0") +","+ (document.getElementById(g+"_board_option").checked?"1":"0") +","+ (document.getElementById(g+"_thread_option").checked?"1":"0") +"],"+icon+","+desc+"];\n") formHF.footer.value = formHF.footer.value.replace(d,e) } } formHF.submit(); } }else{alert((t&&t.length>2?t.length-1+' copies of the':'no')+' Custom BBCode script detected in footer\nThis needs to be corrected before the code can function properly.')} } } if(document.postForm && document.postForm.color){ for(e in customBBCodes){ if(customBBCodes[e][2] && /http:/i.test(customBBCodes[e][2])) document.postForm.color.parentNode.appendChild(dn('a',{href:'javascript:add("['+e+']","[\/'+e+']")',style:'margin-left:3px'},[dn('img',{src:customBBCodes[e][2], title:(customBBCodes[e][3]||e), alt:(customBBCodes[e][3]||e)})])) } } if(/(display|search2|e?view|recent|(boardindex|home))/.test(action)){ t=[] e = toArray(document.getElementsByTagName('hr')) .filter(function(val,index,array1){ if(val.className=="hr" && val.width=="100%"){ if(val.nextSibling && val.nextSibling.className && val.nextSibling.className == "user_signature"){t.push(val.nextSibling); return false;} if(val.parentNode.nodeName == 'TD' && val.parentNode.colSpan==3 && / google_ad_section_start/.test(val.parentNode.innerHTML)){ t.push(val.parentNode); t.push(val.parentNode.offsetParent.rows[0].cells[1], val.parentNode.offsetParent.parentNode.previousSibling); return false; } }else return false;}) .concat(toArray(document.getElementsByTagName('a')) .filter(function(val,index,array1){ if(/^javascript:/i.test(val.href))return false; if(val.name && val.offsetParent.className=='catbg'){t.push(val.offsetParent); return false;} if(/board=\w+$/.test(val.href) && /windowbg/.test(val.offsetParent.className)){t.push(val.offsetParent); return false;} if(/board=\w+/.test(val.href))return true; return false; })); e=e.concat(t); for(t=0;t<e.length&&(o=e[t]);t++){ for(n in customBBCodes){ bones = new RegExp('\\[('+n+')\\d+(.+?)?\\]([\\w\\W]+?)\\[\\/'+n+'\\d+\\]',"gi"); if(!/<(input|form)/i.test(o.innerHTML) && RegExp('\\['+n+'(.+?)?\\]([\\w\\W]+?)\\[\\/'+n+'\\]',"gi").test(o.innerHTML)){ var htm = o.innerHTML,txt=unescape(customBBCodes[n][0]) ,doPost = customBBCodes[n][1][0], doSig = customBBCodes[n][1][1], doMini = customBBCodes[n][1][2] ,doCat = customBBCodes[n][1][3], doBoard = customBBCodes[n][1][4], doThread = customBBCodes[n][1][5], f; if((doSig==0 && o.className == "user_signature")||(doPost==0 && o.nodeName=='TD')|| (doMini==0 && o.width=="20%" && (o.innerText||o.textContent).match(/Posts:\s*\d/)))continue; if((doCat==0 && o.className == "catbg")||(doBoard==0 && o.onclick && /pb_bubble/.test(o.onclick.toString()))|| (doThread==0 && o.href && /thread=/.test(o.href)))continue; var nest1 = [], nest2 = 1,j,re; htm = htm.replace(new RegExp("\\[(\\/?)("+n+")(?=[\\s\\]])","gi"), function(m,p1,p2,index,fulltext){ var _start=-1,_end=-1 if((_start = fulltext.toLowerCase().lastIndexOf("<blockquote><b>code:",index)) && (_end = fulltext.toLowerCase().lastIndexOf("</blockquote>",index)) && _start != -1 && _end < _start) return m if(p1==""){nest1.push(p2+(nest2++));return "["+nest1[nest1.length-1];}else if(nest1.length){return "["+p1+(nest1.pop());} }) for(j=nest2-1;j;j--){ bones = new RegExp('\\[('+n+')'+j+'(.+?)?\\]([\\w\\W]+?)\\[\\/'+n+j+'\\]',"i"); htm = htm.replace(bones,function(m,p,p0,p1){ var xparams={},a,f; if(p0&&p0.length){ p0=p0.replace(/(^\s+|\s+$)/g,"").replace( /=\s*(['"])(.+?)\1/g, function(m,p,q){return m.replace(p+q+p, p+escape(q)+p)}); p0=p0.split(/\s+/); for(a=0;a<p0.length;a++)xparams[p0[a].split('=')[0]] = unescape((p0[a].split('=')[1]||"")).replace(/(^['"]|['"]$)/g,'') } if(bbfunc.test(txt)){ try{ /*test for ECMA5 strict mode for more secure invocation (can cause more errors)*/ var canStrict = (function(){ "use strict"; return !this; })(); if(canStrict)txt = txt.replace(/(function.*?\(.*?\)\{([\s\S]+?<\!--)?)/,'$1\n"use strict";\n'); f=eval("f="+txt); f = eval(f); return f.call(customBBCodes,p1,xparams,m.replace(RegExp("(\\[\\/?\\w+?)"+j,"g"),"$1"),o); }catch(y){return '<span class="newstitlebg" title="' + p+' function '+ y + (canStrict?' in strict mode':'') + '">' + m.replace(RegExp("(\\[\\/?\\w+?)"+j,"g"),"$1")+'</span>';} }else{ txt= txt.replace(/\{param\}/gi,p1); for(a in xparams)txt = txt.replace(RegExp('\\{'+a+ '\\}',"gi"),xparams[a]); return txt; } }) } o.innerHTML = htm; } } } } })(pb_action) </script> Notes:
- Admin editable code, after installation look in admin panel for "Custom BBCodes" link.
- Code comes with 2 "starter kit" BBcodes: [user] and [vimeo], you can add more of your own or ask your friendly neighborhood coder if they could show you how to setup one you may have in mind.
- BBcode tags should be alphanumeric with the exception that it cannot end with a number (vimeo2 would not be accepted but vimeotwo would)
- The replace code can simply be a string such as an embed code or a function
(the code detects if it is a function and calls it to generate the replace text). If it is a simple string then use {param} wherever there is a need to insert whatever the user chose to put in the tag. For example if a vimeo tag was created using the following embed code:
<embed src="http://www.vimeo.com/moogaloop.swf?clip_id={param}&server=www.vimeo.com&show_title=1&show_byline=1&show_portrait=0" allowfullscreen="true" allowscriptaccess="always" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" quality="autohigh" wmode="transparent" height="450px" width="600px">
When the user posted [vimeo]24088434[/vimeo] that place holder would be replaced with 24088434 which is the id of the vimeo video the user intended.
<embed src="http://www.vimeo.com/moogaloop.swf?clip_id=24088434&server=www.vimeo.com&show_title=1&show_byline=1&show_portrait=0" allowfullscreen="true" allowscriptaccess="always" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" quality="autohigh" wmode="transparent" height="450px" width="600px">
The more advanced method which I used with the [vimeo] tag that ships pre-installed with the code is to use a function to do the processing. This allows for much greater flexibility since the user can now also define extra parameters such as width and height for the video [vimeo width=300px height=225px]24088434[/vimeo].
Here are some things to know if creating a function for a BBCode. Any function used will be sent the following arguments function(bbInputText,bbParams,bbTag,container){/*process tag here*/} - bbInputText - the text the user has inserted into the tag
- bbParams - a hash object with name/value pairs of any additional space-separated params such as width, height the user may have added to the tag.
- bbTag - the full text of the tag itself as posted by the user to allow for more fine tuned processing within the function itself if desired
note: If decision is made to skip a tag then return bbTag to leave untouched or just throw an error, your function is called within an error trap to avoid bringing down the entire code so will return the tag untouched if an error occurs. Tags that encountered an error will be wrapped in span tags with the title set to the error so if your function wanted to limit number of tags per post to 3 it could generate an error after processing 3 by setting the message of the error object to something like "only maximum of 3 allowed"
- container - a reference to the container element where the tag currently being processed is located.
- in addition the this keyword within the function will reference the customBBCodes object where all custom tags are stored allowing for even more latitude such as determining what other BBCodes are installed and redefining the behavior of another BBCode if certain conditions exists or perhaps creating self-mutating BBCodes.
- If you put an url in the icon field when creating a BBCode then that image will be used as a UBBC button on the posting page otherwise that BBCode will have to be manually typed when posting.
Edits:- added ignore for tags that are inside code tags, noubbc tags are however undetectable from the HTML side and can only be inferred by the presence of unconverted standard tags which is too unreliable and imprecise.
- Added ECMA5 support for "strict mode" on function handler invocations for a more secure environment (see page 233 of ECMA5 pdf for guidline on how to write for strict mode).
Also realized that by strategically inserting spaces in the Pre-installed BBCode tags in order to prevent Proboards anti-stretch mangling the code I've inadvertently made them undeletable and unmodifiable from within the code, to remove them they'll need to be manually removed.
- Fixed multiple tags of same type in same location/post bug
|
|