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, '');
// &, <, > => 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 + -
显示快捷键?