試下給phpbb增加兩個打開code的bbcode

分享身边的点滴趣事
回复
头像
ejsoon
圈圈精英
圈圈精英
帖子: 4188
注册时间: 2022年 11月 18日 17:36
为圈友点赞: 165 次
被圈友点赞: 195 次
联系:

試下給phpbb增加兩個打開code的bbcode

帖子 ejsoon »

https://ejsoon.vip/
弈趣極光:享受思維樂趣
头像
ejsoon
圈圈精英
圈圈精英
帖子: 4188
注册时间: 2022年 11月 18日 17:36
为圈友点赞: 165 次
被圈友点赞: 195 次
联系:

Re: 試下給phpbb增加兩個打開code的bbcode

帖子 ejsoon »

代码: 全选

<img width="36" height="36"
     src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxIiBoZWlnaHQ9IjEiPjxyZWN0IHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGZpbGw9IiMwMDAiLz48L3N2Zz4="
     onload="(function(img){
       var box=img.previousElementSibling;
       while(box&&!(box.tagName==='DIV'&&box.classList.contains('codebox'))){box=box.previousElementSibling;}
       if(!box){img.remove();return;}
       var code=box.querySelector('code');
       if(!code){img.remove();return;}
       var html=code.innerHTML.trim();
       if(!(/^(&lt;svg[\s>]|<svg[\s>])/i.test(html))){img.remove();return;}
       var tempDiv=document.createElement('div');
       tempDiv.innerHTML=html;
       var svgEl=tempDiv.querySelector('svg');
       if(!svgEl){img.remove();return;}
       var w=svgEl.getAttribute('width');
       var h=svgEl.getAttribute('height');
       if(w)img.setAttribute('width',w);
       if(h)img.setAttribute('height',h);
       var svgString=svgEl.outerHTML;
       var b64=window.btoa(unescape(encodeURIComponent(svgString)));
       img.src='data:image/svg+xml;base64,'+b64;
     })(this)">
https://ejsoon.vip/
弈趣極光:享受思維樂趣
头像
ejsoon
圈圈精英
圈圈精英
帖子: 4188
注册时间: 2022年 11月 18日 17:36
为圈友点赞: 165 次
被圈友点赞: 195 次
联系:

Re: 試下給phpbb增加兩個打開code的bbcode

帖子 ejsoon »

代码: 全选

你可以這樣寫(已幫你把所有程式都塞進 `onload`,而且只用英文):

```html
<img width="36" height="36"
     src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxIiBoZWlnaHQ9IjEiPjxyZWN0IHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGZpbGw9IiMwMDAiLz48L3N2Zz4="
     onload="
        (function(img){
            // 1. get previous div.codebox
            var box = img.previousElementSibling;
            while (box && !(box.tagName === 'DIV' && box.classList.contains('codebox'))) {
                box = box.previousElementSibling;
            }
            if (!box) { img.parentNode.removeChild(img); return; }

            // 2. get innerHTML of <code> inside it
            var code = box.querySelector('code');
            if (!code) { img.parentNode.removeChild(img); return; }

            var html = code.innerHTML || '';
            // 3. check if it looks like svg (starts with &lt;svg)
            var trimmed = html.trim();
            if (trimmed.indexOf('&lt;svg') !== 0) {
                img.parentNode.removeChild(img);
                return;
            }

            // decode &lt; &gt; back to < >
            var svgText = trimmed
                .replace(/&lt;/g, '<')
                .replace(/&gt;/g, '>')
                .replace(/&amp;/g, '&');

            // try to read width/height from svg tag
            var mWidth  = svgText.match(/width\s*=\s*['\"]([^'\"]+)['\"]/i);
            var mHeight = svgText.match(/height\s*=\s*['\"]([^'\"]+)['\"]/i);
            if (mWidth && mHeight) {
                img.setAttribute('width',  mWidth[1]);
                img.setAttribute('height', mHeight[1]);
            } else {
                // no width/height: remove and stop
                img.parentNode.removeChild(img);
                return;
            }

            // 4. convert svg text to base64 and set src
            var b64;
            try {
                b64 = btoa(unescape(encodeURIComponent(svgText)));
            } catch (e) {
                // in case of failure, remove img
                img.parentNode.removeChild(img);
                return;
            }
            img.src = 'data:image/svg+xml;base64,' + b64;
        })(this);
     ">
```

如果你想再縮短或改成單行版也可以,我可以幫你壓縮。
https://ejsoon.vip/
弈趣極光:享受思維樂趣
头像
ejsoon
圈圈精英
圈圈精英
帖子: 4188
注册时间: 2022年 11月 18日 17:36
为圈友点赞: 165 次
被圈友点赞: 195 次
联系:

Re: 試下給phpbb增加兩個打開code的bbcode

帖子 ejsoon »

代码: 全选

<img width="36" height="36"
     src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxIiBoZWlnaHQ9IjEiPjxyZWN0IHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGZpbGw9IiMwMDAiLz48L3N2Zz4="
     onload="
        (function(img){
            // 1. get previous div.codebox
            var box = img.previousElementSibling;
            while (box && !(box.tagName === 'DIV' && box.classList.contains('codebox'))) {
                box = box.previousElementSibling;
            }
            if (!box) { img.parentNode.removeChild(img); return; }

            // 2. get innerHTML of <code> inside it
            var code = box.querySelector('code');
            if (!code) { img.parentNode.removeChild(img); return; }

            var html = code.innerHTML || '';
            // 3. check if it looks like svg (starts with &lt;svg)
            var trimmed = html.trim();
            if (trimmed.indexOf('&lt;svg') !== 0) {
                img.parentNode.removeChild(img);
                return;
            }

            // decode &lt; &gt; &amp; back to < > &
            var reLt = new RegExp('&lt;', 'g');
            var reGt = new RegExp('&gt;', 'g');
            var reAmp = new RegExp('&amp;', 'g');
            var svgText = trimmed
                .replace(reLt, '<')
                .replace(reGt, '>')
                .replace(reAmp, '&');

            // try to read width/height from svg tag
            var reWidth  = new RegExp('width\\s*=\\s*[\'\\\"]([^\'\\\"]+)[\'\\\"]', 'i');
            var reHeight = new RegExp('height\\s*=\\s*[\'\\\"]([^\'\\\"]+)[\'\\\"]', 'i');
            var mWidth  = svgText.match(reWidth);
            var mHeight = svgText.match(reHeight);
            if (mWidth && mHeight) {
                img.setAttribute('width',  mWidth[1]);
                img.setAttribute('height', mHeight[1]);
            } else {
                // no width/height: remove and stop
                img.parentNode.removeChild(img);
                return;
            }

            // 4. convert svg text to base64 and set src
            var b64;
            try {
                b64 = btoa(unescape(encodeURIComponent(svgText)));
            } catch (e) {
                img.parentNode.removeChild(img);
                return;
            }
            img.src = 'data:image/svg+xml;base64,' + b64;
        })(this);
     ">
https://ejsoon.vip/
弈趣極光:享受思維樂趣
头像
ejsoon
圈圈精英
圈圈精英
帖子: 4188
注册时间: 2022年 11月 18日 17:36
为圈友点赞: 165 次
被圈友点赞: 195 次
联系:

Re: 試下給phpbb增加兩個打開code的bbcode

帖子 ejsoon »

代码: 全选

<img width="36" height="36" 
     src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxIiBoZWlnaHQ9IjEiPjxyZWN0IHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGZpbGw9IiMwMDAiLz48L3N2Zz4=" 
     onload="
        (function(img){
            try {
                // 1. Find the first previous 'div.codebox'
                var codebox = img.previousElementSibling;
                while(codebox && !codebox.classList.contains('codebox')){
                    codebox = codebox.previousElementSibling;
                }
                if(!codebox) return;

                // 2. Get <code> innerHTML
                var codeElem = codebox.querySelector('code');
                if(!codeElem) return;
                var codeHTML = codeElem.innerHTML;

                // 3. Check if it starts with &lt;svg
                if(!codeHTML.trim().startsWith('&lt;svg')){
                    img.remove();
                    return;
                }

                // 4. Replace &lt; and &gt; with < and >
                var svgText = codeHTML.replace(/&lt;/g,'<').replace(/&gt;/g,'>');

                // 5. Parse SVG
                var parser = new DOMParser();
                var doc = parser.parseFromString(svgText,'image/svg+xml');
                var svg = doc.documentElement;
                if(svg.hasAttribute('width') && svg.hasAttribute('height')){
                    img.width = svg.getAttribute('width');
                    img.height = svg.getAttribute('height');
                }

                // 6. Convert SVG to base64 and assign to img.src
                var serializer = new XMLSerializer();
                var svgStr = serializer.serializeToString(svg);
                var b64 = btoa(unescape(encodeURIComponent(svgStr)));
                img.src = 'data:image/svg+xml;base64,' + b64;

            } catch(e) {
                console.error(e);
                img.remove();
            }
        })(this);
     ">
https://ejsoon.vip/
弈趣極光:享受思維樂趣
回复

在线用户

正浏览此版面之用户: 没有注册用户 和 2 访客