ubb.js

来自「asp的bbs程序」· JavaScript 代码 · 共 1,023 行 · 第 1/3 页

JS
1,023
字号
            if (width && height) {
                str = '[img=' + width + ',' + height + ']' + src + '[/img]';
            }
            else {
                str = '[img]' + src + '[/img]';
            }
            return str;
        });

        // [list]
        while (/<ul[^\>]*?>(?:(?!<ul[^\>]*?>)[\s\S])*?<\/ul>/i.test(xhtml)) {
            xhtml = xhtml.replace(/<ul[^\>]*?>(?:(?!<ul[^\>]*?>)[\s\S])*?<\/ul>/i, function (str) {
                str = str.replace(/<ul[^\>]*?>/i, '');
                str = str.replace(/<\/ul>/i, '');

                if (/<li[^\>]*?>/i.exec(str)) {
                    var arr = str.split(/<li[^\>]*?>/gi);
                    str = '';
                    for (var i = 0, len = arr.length; i < len; i++) {
                        arr[i] = arr[i].replace(/<\/li>/gi, '');
                        !/^\s*$/i.test(arr[i]) && (str += '[*]' + arr[i]);
                    }
                    //arr = arr.splice(1);
                }
                if (str == '') str = '[*]';
                str = '[list]' + str + '[/list]';

                return str;
            });
        }
        //[list][*]fdsafdsa[*]fdsaf[list=1][*]fdsafdsafds[*]fdsafdsaf[*]fdasfdsf[/list]dsafsd[/list]
        while (/<ol[^\>]*?>(?:(?!<ol[^\>]*?>)[\s\S])*?<\/ol>/i.test(xhtml)) {
            xhtml = xhtml.replace(/<ol[^\>]*?>(?:(?!<ol[^\>]*?>)[\s\S])*?<\/ol>/i, function (str) {
                var type = '1';
                var arr = /<ol\s+type="?([^\>]*?)"?>/i.exec(str);
                if (arr && arr[1]) type = arr[1];

                str = str.replace(/<ol[^\>]*?>/i, '');
                str = str.replace(/<\/ol>/i, '');

                if (/<li[^\>]*?>/i.exec(str)) {
                    arr = str.split(/<li[^\>]*?>/gi);
                    str = '';
                    for (var i = 0, len = arr.length; i < len; i++) {
                        arr[i] = arr[i].replace(/<\/li>/gi, '');
                        !/^\s*$/i.test(arr[i]) && (str += '[*]' + arr[i]);
                    }
                    //arr = arr.splice(1);
                }
                if (str == '') str = '[*]';
                str = '[list=' + type + ']' + str + '[/list]';

                return str;
            });
        }
        
        // [align]
        while (/<(p|div)[^>]+?align="?(?:left|center|right)"?[^>]*?>(?:(?!<\1[^>]+?align="?(?:left|center|right)"?[^>]*?>)[\s\S])*?<\/\1>/i.test(xhtml)) {
            xhtml = xhtml.replace(/<(p|div)[^>]+?align="?(left|center|right)"?[^>]*?>((?:(?!<\1[^>]+?align="?(?:left|center|right)"?[^>]*?>)[\s\S])*?)<\/\1>/i, '[align=$2]$3[/align]');
        }
        while (/<div[^>]+?style="[^"]*?text-align:\x01*(?:left|center|right);?[^"]*?"[^>]*?>(?:<div[^>]*>(?:(?!<\/div>)[\s\S])*<\/div>|(?:(?!<\/?div[^>]*>)[\s\S]))*?<\/div>/i.test(xhtml)) {
            xhtml = xhtml.replace(/<div[^>]+?style="[^"]*?text-align:\x01*(left|center|right);?[^"]*?"[^>]*?>((?:<div[^>]*>(?:(?!<\/div>)[\s\S])*<\/div>|(?:(?!<\/?div[^>]*>)[\s\S]))*?)<\/div>/i, '[align=$1]$2[/align]');
        }

        // [sup], [sub]
        while (/<(sup)>(?:(?!<\1>)[\s\S])*?<\/\1>/i.test(xhtml)) {
            xhtml = xhtml.replace(/<(sup)>((?:(?!<\1>)[\s\S])*?)<\/\1>/i, '[$1]$2[/$1]');
        }
        while (/<(sub)>(?:(?!<\1>)[\s\S])*?<\/\1>/i.test(xhtml)) {
            xhtml = xhtml.replace(/<(sub)>((?:(?!<\1>)[\s\S])*?)<\/\1>/i, '[$1]$2[/$1]');
        }

        // [fly]
        while (/<(marquee)[^>]*?direction="(?:left|right|up|down)"[^>]*?>(?:(?!\1)[\s\S])*?<\/\1>/i.test(xhtml)) {
            xhtml = xhtml.replace(/<(marquee)[^>]*?direction="(left|right|up|down)"[^>]*?>((?:(?!\1)[\s\S])*?)<\/\1>/i, '[fly=$2]$3[/fly]');
        }

        // [indent]
        //xhtml = xhtml.replace(/<blockquote[^>]+class="?(.+)"?[^>]*>()<\/blockquote>/gi, '[quote]$1[/quote]');
        while (/<(blockquote)[^>]*?>(?:(?!\1)[\s\S])*?<\/\1>/i.test(xhtml)) {
            xhtml = xhtml.replace(/<(blockquote)[^>]*?>((?:(?!\1)[\s\S])*?)<\/\1>/i, '[indent]$2[/indent]');
        }

        // 转换<div>,<p>为[br],针对IE,Safari
        //xhtml = xhtml.replace(/<\/div>\s*<div>/ig, '[br]\r\n').replace(/<\/?div>/i, '');
        xhtml = xhtml.replace(/<\/div>\x01*<div>/ig, '\r\n').replace(/<\/?div>/i, '');
        //xhtml = xhtml.replace(/<\/p>\s*<p>/ig, '[br][br]\r\n').replace(/<\/?p>/i, '');
        xhtml = xhtml.replace(/<\/p>\x01*<p>/ig, '\r\n\r\n').replace(/<\/?p>/i, '');

        // 移除脚本
        xhtml = xhtml.replace(/<script[^>]*?>[\s\S]*?<\/script>/gi, '');

        // 移除注释
        xhtml = xhtml.replace(/<!--[\s\S]+?-->/g, '');

        // 取回空格
        xhtml = this.retrieveSpace(xhtml);

        // [table]
        xhtml = this.tableHtmlToUbb(xhtml);

        // 移除未转换标记
        xhtml = this.removeHtmlTag(xhtml);

        // 清除不允许的html标签
        //xhtml = xhtml.replace(Config.NotAllowHtmlTag, '');

        // &amp;, &lt;, &gt; => ubb显示
        xhtml = this.unhtmlEntities(xhtml);

        // [code] restore [safari error]
        xhtml = this.codeRestore(xhtml, codes, 'ubb');

        return xhtml;
    },
    
    // [code] xhtml to ubb
    codeXhtmlToUbb : function (xhtml) {
        // [code] store
        var codes = [];
        xhtml = this.codeStore(xhtml, codes);
        // [code] restore [safari error]
        xhtml = this.codeRestore(xhtml, codes, 'ubb');
        return xhtml;
    },
    
    // 表情转换
    faceHtmlToUbb : function (xhtml) {
        xhtml = xhtml.replace(/<img[^>]+_shortcut="?([^"]+)"?[^>]*>/gi, '$1');
        return xhtml;
    },
    faceUbbToHtml : function (ubb) {
        ubb = ubb.replace(/(\[em:(\d+)\])/gi, function (str, l, r) {
            return '<img src="' + Toolbar.faceList['default'][r] + '" _shortcut="' + l + '" />'
        });
        ubb = ubb.replace(/(\[face:(\d+)\])/gi, function (str, l, r) {
            return '<img src="' + Toolbar.faceList['custom'][r] + '" _shortcut="' + l + '" />'
        });
        return ubb;
    },

    tableUbbToHtml : function (str) {
        var re = /\[table(?:=[^\]]*?)?\](?:(?!\[table(?:=[^\]]*?)?\])[\s\S])*?\[\/table\]/i;
        //var reTr = /\[tr\](?:\s*\[td[^\]]*?\](?:(?!\[td[^\]]*?\])[\s\S])*?\[\/td\]\s*)+?\[\/tr\]/i;
        var reTr = /\[tr\](?:(?!\[tr[^\]]*?\])[\s\S])+?\[\/tr\]/i;
        var reTd = /\[td[^\]]*?\](?:(?!\[td[^\]]*?\])[\s\S])*?\[\/td\]/i;
        var reAttr = /^\[table=((?:[\da-z%#]+,?)+)\]/i;

        while (re.test(str)) {
            str = str.replace(re, function (str) {
                //str = str.replace(/\r\n|\n/g, '');
                var arr = [];
                while (reTr.test(str)) {
                    str = str.replace(reTr, function (str) {
                        /*
                        str = str.replace(/\[tr\]/gi, '<tr>')
                                 .replace(/\[\/tr\]/gi, '</tr>')
                                 .replace(/\[td\]/gi, '<td>')
                                 .replace(/\[\/td\]/gi, '</td>');
                        */
                        var len = arr.length;
                        arr[len] = '<tr>';
                        while (reTd.test(str)) {
                            str = str.replace(reTd, function (str) {
                                var _arr = /\[td[^\]]*?\]([\s\S]*)\[\/td\]/i.exec(str);
                                var content = _arr[1];
                                _arr = /\[td=(\d+)[^\]]*?\]/i.exec(str);
                                var rowspan = _arr ? _arr[1] : 0;
                                _arr = /\[td=\d+,(\d+)\]/i.exec(str);
                                var colspan = _arr ? _arr[1] : 0;
                                str = '<td' + (rowspan ? ' rowspan="' + rowspan + '"' + (colspan ? ' colspan="' + colspan + '"' : '') : '') + '>' + content + '</td>';
                                arr[len] += str;
                                return str;
                            });
                        }
                        arr[len] += '</tr>';
                        str = str.replace(/\[tr\]/gi, '<tr>').replace(/\[\/tr\]/gi, '</tr>');
                        return str;
                    });
                }
                if (arr.length == 0) return '';

                var attr = reAttr.exec(str);
                str = '<table';
                if (attr) {
                    str += ' ';

                    attr = attr[1].split(',');
                    switch (attr.length) {
                        case 1:
                            str += 'width="' + attr[0] + '"';
                            break;
                        case 2:
                            str += 'width="' + attr[0] + '" height="' + attr[1] + '"';
                            break;
                        case 3:
                            str += 'width="' + attr[0] + '" height="' + attr[1] + '" bgcolor="' + attr[2] + '"';
                            break;
                    }
                }
                else {
                    str += ' width="100%"';
                }
                str += ' cellspacing="1" border="1">';
                str += arr.join('') + '</table>';
                //str = str.replace(/\1/g, '\r\n');
                return str;
            });
        }
        return str;
    },

    tableHtmlToUbb : function (str) {
        var re = /<table\s*(?:[^>]*?\s*)?>(?:(?!<table\s*(?:[^>]*?\s*)?>)[\s\S])*?<\/table>/i;
        //var reTr = /<tr>(?:\s*<td[^>]*?>(?:(?!<td[^>]*?>)[\s\S])*?<\/td>\s*)+?<\/tr>/i;
        var reTr = /<tr>(?:(?!<tr[^>]*?>)[\s\S])+?<\/tr>/i;
        var reTd = /<td[^>]*?>(?:(?!<td[^>]*?>)[\s\S])*?<\/td>/i;
        var reAttr = /^<table\s*((?:[a-z]+="?[\d\sa-z%#:;]+"?\s*)+)>/i;
        var reAttr1 = /style="[\s\S]+?"/i;

        while (re.test(str)) {
            str = str.replace(re, function (str) {
                //str = str.replace(/\r\n|\n/g, '');
                var arr = [];
                while (reTr.test(str)) {
                    str = str.replace(reTr, function (str) {
                        /*
                        str = str.replace(/<tr[^\>]*?>/gi, '[tr]')
                                 .replace(/<\/tr>/gi, '[/tr]')
                                 .replace(/<td[^\>]*?>/gi, '[td]')
                                 .replace(/<\/td>/gi, '[/td]');
                        */
                        var len = arr.length;
                        arr[len] = '[tr]';
                        while (reTd.test(str)) {
                            str = str.replace(reTd, function (str) {
                                var _arr = /<td[^>]*?>([\s\S]*)<\/td>/i.exec(str);
                                var content = _arr[1];
                                _arr = /<td[^>]+?rowspan="?(\d+)"?[^>]*?>/i.exec(str);
                                var rowspan = _arr ? _arr[1] : 0;
                                _arr = /<td[^>]+?colspan="?(\d+)"?[^>]*?>/i.exec(str);
                                var colspan = _arr ? _arr[1] : 0;
                                if (rowspan == 1 && colspan == 1) rowspan = 0;
                                str = '[td' + (rowspan ? '=' + rowspan + (colspan ? ',' + colspan : '') : '') + ']' + content + '[/td]';
                                arr[len] += str;
                                return str;
                            });
                        }
                        arr[len] += '[/tr]';
                        str = str.replace(/<tr[^\>]*?>/gi, '[tr]').replace(/<\/tr>/gi, '[/tr]');
                        return str;
                    });
                }
                if (arr.length == 0) return '';

                var attr = reAttr.exec(str);
                str = '[table';
                if (attr) {
                    var w = 0, h = 0, bg = '';

                    if (reAttr1.test(attr[1])) {
                        attr[1] = attr[1].replace(reAttr1, function (_str) {
                            var _arr = /width:\s*(\d+)px/i.exec(_str);
                            if (_arr[1]) {
                                w = _arr[1];
                            }
                            _arr = /height:\s*(\d+)px/i.exec(_str);
                            if (_arr[1]) {
                                h = _arr[1];
                            }
                            return '';
                        });
                    }

                    attr = attr[1].split(/\s+/g);//alert(attr);
                    for (var i = 0, len = attr.length; i < len; i++) {
                        if (attr[i].toLowerCase().indexOf('width') > -1 && !w) {
                            w =  UBB.extractValue(attr[i]);
                        }
                        if (attr[i].toLowerCase().indexOf('height') > -1 && !h) {
                            h = UBB.extractValue(attr[i]);
                        }
                        if (attr[i].toLowerCase().indexOf('bgcolor') > -1 && !bg) {
                            bg = UBB.extractValue(attr[i]);
                        }
                    }
                }
                if (!w && !h) w = '100%';
                str += (w ? '=' + w + (h ? ',' + h + (bg ? ',' + bg : '') : '') : '') + ']';
                str += arr.join('') + '[/table]';
                return str;
            });
        }
        return str;
    },

    /// 转换[quote], [img]
    // 本地cookie保存时,在允许html编码模式下,需要有该方法的逆转方法,
    // 否则[quote]与[img]标签会显示在WYSIWYG与XHTML模式下
    someXhtmlToUbb : function (xhtml) {
        // [quote]
        while (/<div\s+class="maxcode-quote">\s*<dl>\s*<dt>(?:(?!<\/?dt>)[\s\S])+?<\/dt>\s*<dd>(?:(?!<div\s+class="maxcode-quote">)[\s\S])+?<\/dd>\s*<\/dl>\s*<\/div>/i.test(xhtml)) {
            xhtml = xhtml.replace(/<div\s+class="maxcode-quote">\s*<dl>\s*<dt>(?:(?!<\/?dt>)[\s\S])+?<\/dt>\s*<dd>((?:(?!<div\s+class="maxcode-quote">)[\s\S])+?)<\/dd>\s*<\/dl>\s*<\/div>/i, '[quote]$1[/quote]');
        }
        
        // [em:],[face:]
        xhtml = this.faceHtmlToUbb(xhtml);
        
        // [img]
        //xhtml = xhtml.replace(/<img[^>]+?src="([^"]+?)"[^>]*?\/?>/gi, '[img]$1[/img]');
        xhtml = xhtml.replace(/<img[^>]+?src="([^"]+?)"[^>]*?\/?>/gi, function (str, src) {
            //var arr = /src="([^"]+?)"/.exec(str);
            //var src = arr[1];
            var arr;
            
            // Gecko...
            arr = (/width=(\d+)/i.exec(str)) || (/width="(\d+%?)"/i.exec(str));
            var width = arr && arr[1] ? arr[1] : 0;
            arr = (/height=(\d+)/i.exec(str)) || (/height="(\d+%?)"/i.exec(str));
            var height = arr && arr[1] ? arr[1] : 0;
            
            // IE...
            arr = /width:\s*(\d+(?:px|%))/i.exec(str);
            if (arr && arr[1]) width = arr[1].replace('px', '');
            arr = /height:\s*(\d+(?:px|%))/i.exec(str);
            if (arr && arr[1]) height = arr[1].replace('px', '');
            
            if (width && height) {
                str = '[img=' + width + ',' + height + ']' + src + '[/img]';
            }
            else {
                str = '[img]' + src + '[/img]';
            }
            return str;
        });

        return xhtml;
    },

    /// 默认尺寸视频400 x 300px,音频400 x 36px
    // 记录[down]关联文本

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?