bbcode.js
上传用户:wenllgg125
上传日期:2020-04-09
资源大小:7277k
文件大小:21k
源码类别:

SCSI/ASPI

开发平台:

Others

  1. /*
  2. [Discuz!] (C)2001-2009 Comsenz Inc.
  3. This is NOT a freeware, use is subject to license terms
  4. $Id: bbcode.js 17473 2008-12-25 02:10:55Z monkey $
  5. */
  6. var re;
  7. if(isUndefined(codecount)) var codecount = '-1';
  8. if(isUndefined(codehtml)) var codehtml = new Array();
  9. /* Used for Discuz!NT */
  10. function ParseSmilies(){
  11. if (!smilies.length){
  12. return;
  13. }
  14. for (var i = 0; i < smilies.length; i++){
  15. if (smilies[i][0]==arguments[1]){
  16. return smilies[i][1];
  17. }
  18. }
  19. return arguments[0];
  20. }
  21. /* end */
  22. function addslashes(str) {
  23. return preg_replace(['\\', '\'', '\/', '\(', '\)', '\[', '\]', '\{', '\}', '\^', '\$', '\?', '\.', '\*', '\+', '\|'], ['\\', '\'', '\/', '\(', '\)', '\[', '\]', '\{', '\}', '\^', '\$', '\?', '\.', '\*', '\+', '\|'], str);
  24. }
  25. function atag(aoptions, text) {
  26. if(trim(text) == '') {
  27. return '';
  28. }
  29. href = getoptionvalue('href', aoptions);
  30. if(href.substr(0, 11) == 'javascript:') {
  31. return trim(recursion('a', text, 'atag'));
  32. } else if(href.substr(0, 7) == 'mailto:') {
  33. tag = 'email';
  34. href = href.substr(7);
  35. } else {
  36. tag = 'url';
  37. }
  38. return '[' + tag + '=' + href + ']' + trim(recursion('a', text, 'atag')) + '[/' + tag + ']';
  39. }
  40. function bbcode2html(str) {
  41. str = trim(str);
  42. if(str == '') {
  43. return '';
  44. }
  45. if(!fetchCheckbox('bbcodeoff') && allowbbcode) {
  46. str= str.replace(/s*[code]([sS]+?)[/code]s*/ig, function($1, $2) {return parsecode($2);});
  47. }
  48. if(!forumallowhtml || !allowhtml || !fetchCheckbox('htmlon')) {
  49. str = str.replace(/</g, '&lt;');
  50. str = str.replace(/>/g, '&gt;');
  51. if(!fetchCheckbox('parseurloff')) {
  52. str = parseurl(str, 'html', false);
  53. }
  54. }
  55. /* Discuz!NT  start */
  56. /*if(!fetchCheckbox('smileyoff') && allowsmilies) {
  57. for(id in smilies) {
  58. re = new RegExp(addslashes(smilies[id]['code']), "g");
  59. str = str.replace(re, '<img src="./images/smilies/' + smilies[id]['url'] + '" border="0" smilieid="' + id + '" alt="' + smilies[id]['code'] + '" />');
  60. }
  61. }*/
  62. if(!fetchCheckbox('smileyoff') && allowsmilies) {
  63. for(i in smilies_HASH) {
  64. for(id in smilies_HASH[i]) {
  65. try {
  66. var code = smilies_HASH[i][id]['code'];
  67. if (typeof code == 'undefined' || code == '') 
  68. continue;
  69. re = new RegExp(addslashes(code), "g");
  70. var imgstr = '<img src="/editor/images/smilies/' + smilies_HASH[i][id]['url'] + '" border="0" smilieid="' + code + '" alt="" />';
  71. str = str.replace(re, imgstr);
  72. } catch (e) { }
  73. }
  74. }
  75. }
  76. /* Discuz!NT  end */
  77. if(!fetchCheckbox('bbcodeoff') && allowbbcode) {
  78. str= str.replace(/[url]s*(www.|https?://|ftp://|gopher://|news://|telnet://|rtsp://|mms://|callto://|bctp://|ed2k://){1}([^["']+?)s*[/url]/ig, function($1, $2, $3) {return cuturl($2 + $3);});
  79. str= str.replace(/[url=www.([^["']+?)](.+?)[/url]/ig, '<a href="http://www.$1" target="_blank">$2</a>');
  80. str= str.replace(/[url=(https?|ftp|gopher|news|telnet|rtsp|mms|callto|bctp|ed2k){1}://([^["']+?)]([sS]+?)[/url]/ig, '<a href="$1://$2" target="_blank">$3</a>');
  81. str= str.replace(/[email](.*?)[/email]/ig, '<a href="mailto:$1">$1</a>');
  82. str= str.replace(/[email=(.[^[]*)](.*?)[/email]/ig, '<a href="mailto:$1" target="_blank">$2</a>');
  83. str = str.replace(/[color=([^[<]+?)]/ig, '<font color="$1">');
  84. str = str.replace(/[size=(d+?)]/ig, '<font size="$1">');
  85. str = str.replace(/[size=(d+(.d+)?(px|pt|in|cm|mm|pc|em|ex|%)+?)]/ig, '<font style="font-size: $1">');
  86. str = str.replace(/[font=([^[<]+?)]/ig, '<font face="$1">');
  87. str = str.replace(/[align=([^[<]+?)]/ig, '<p align="$1">');
  88. str = str.replace(/[float=([^[<]+?)]/ig, '<br style="clear: both"><span style="float: $1;">');
  89. re = /[table(?:=(d{1,4}%?)(?:,([()%,#w ]+))?)?]s*([sS]+?)s*[/table]/ig;
  90. for (i = 0; i < 4; i++) {
  91. str = str.replace(re, function($1, $2, $3, $4) {return parsetable($2, $3, $4);});
  92. }
  93. str = preg_replace([
  94. '\[\/color\]', '\[\/size\]', '\[\/font\]', '\[\/align\]', '\[b\]', '\[\/b\]',
  95. '\[i\]', '\[\/i\]', '\[u\]', '\[\/u\]', '\[list\]', '\[list=1\]', '\[list=a\]',
  96. '\[list=A\]', '\[\*\]', '\[\/list\]', '\[indent\]', '\[\/indent\]', '\[\/float\]'
  97. ], [
  98. '</font>', '</font>', '</font>', '</p>', '<b>', '</b>', '<i>',
  99. '</i>', '<u>', '</u>', '<ul>', '<ul type=1 class="litype_1">', '<ul type=a class="litype_2">',
  100. '<ul type=A class="litype_3">', '<li>', '</ul>', '<blockquote>', '</blockquote>', '</span>'
  101. ], str, 'g');
  102. }
  103. if(!fetchCheckbox('bbcodeoff')) {
  104. if(allowimgcode) {
  105. str = str.replace(/[localimg=(d{1,4}),(d{1,4})](d+)[/localimg]/ig, function ($1, $2, $3, $4) {if($('attachnew_' + $4)) {var src = $('attachnew_' + $4).value; if(src != '') return '<img style="filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale',src='' + src + '');width:' + $2 + ';height=' + $3 + '" src='images/common/none.gif' border="0" aid="attach_' + $4 + '" alt="" />';}});
  106. str = str.replace(/[img]s*([^[<rn]+?)s*[/img]/ig, '<img src="$1" border="0" alt="" />');
  107. //str = str.replace(/[attachimg](d+)[/attachimg]/ig, function ($1, $2) {eval('var attachimg = $('preview_' + $2 + '')');return '<img src="' + attachimg.src + '" border="0" aid="attachimg_' + $2 + '" width="' + attachimg.clientWidth + '" alt="" />';});
  108. str = str.replace(/[attachimg](d+)[/attachimg]/ig, '<img src="attachment.aspx?attachmentid=$1" border="0" aid="attachimg_$1" alt="" />');
  109. str = str.replace(/[img=(d{1,4})[x|,](d{1,4})]s*([^[<rn]+?)s*[/img]/ig, '<img width="$1" height="$2" src="$3" border="0" alt="" />');
  110. } else {
  111. str = str.replace(/[img]s*([^[<rn]+?)s*[/img]/ig, '<a href="$1" target="_blank">$1</a>');
  112. str = str.replace(/[img=(d{1,4})[x|,](d{1,4})]s*([^[<rn]+?)s*[/img]/ig, '<a href="$1" target="_blank">$1</a>');
  113. }
  114. }
  115. for(var i = 0; i <= codecount; i++) {
  116. str = str.replace("[tDISCUZ_CODE_" + i + "t]", codehtml[i]);
  117. }
  118. if(!forumallowhtml || !allowhtml || !fetchCheckbox('htmlon')) {
  119. str = preg_replace(['t', '   ', '  ', '(rn|n|r)'], ['&nbsp; &nbsp; &nbsp; &nbsp; ', '&nbsp; &nbsp;', '&nbsp;&nbsp;', '<br />'], str);
  120. }
  121. return str;
  122. }
  123. function cuturl(url) {
  124. var length = 65;
  125. var urllink = '<a href="' + (url.toLowerCase().substr(0, 4) == 'www.' ? 'http://' + url : url) + '" target="_blank">';
  126. if(url.length > length) {
  127. url = url.substr(0, parseInt(length * 0.5)) + ' ... ' + url.substr(url.length - parseInt(length * 0.3));
  128. }
  129. urllink += url + '</a>';
  130. return urllink;
  131. }
  132. function dpstag(options, text, tagname) {
  133. if(trim(text) == '') {
  134. return 'n';
  135. }
  136. var pend = parsestyle(options, '', '');
  137. var prepend = pend['prepend'];
  138. var append = pend['append'];
  139. if(in_array(tagname, ['div', 'p'])) {
  140. align = getoptionvalue('align', options);
  141. if(in_array(align, ['left', 'center', 'right'])) {
  142. prepend = '[align=' + align + ']' + prepend;
  143. append += '[/align]';
  144. } else {
  145. append += 'n';
  146. }
  147. }
  148. return prepend + recursion(tagname, text, 'dpstag') + append;
  149. }
  150. function fetchoptionvalue(option, text) {
  151. if((position = strpos(text, option)) !== false) {
  152. delimiter = position + option.length;
  153. if(text.charAt(delimiter) == '"') {
  154. delimchar = '"';
  155. } else if(text.charAt(delimiter) == ''') {
  156. delimchar = ''';
  157. } else {
  158. delimchar = ' ';
  159. }
  160. delimloc = strpos(text, delimchar, delimiter + 1);
  161. if(delimloc === false) {
  162. delimloc = text.length;
  163. } else if(delimchar == '"' || delimchar == ''') {
  164. delimiter++;
  165. }
  166. return trim(text.substr(delimiter, delimloc - delimiter));
  167. } else {
  168. return '';
  169. }
  170. }
  171. function fonttag(fontoptions, text) {
  172. var prepend = '';
  173. var append = '';
  174. var tags = new Array();
  175. tags = {'font' : 'face=', 'size' : 'size=', 'color' : 'color='};
  176. for(bbcode in tags) {
  177. optionvalue = fetchoptionvalue(tags[bbcode], fontoptions);
  178. if(optionvalue) {
  179. prepend += '[' + bbcode + '=' + optionvalue + ']';
  180. append = '[/' + bbcode + ']' + append;
  181. }
  182. }
  183. var pend = parsestyle(fontoptions, prepend, append);
  184. return pend['prepend'] + recursion('font', text, 'fonttag') + pend['append'];
  185. }
  186. function getoptionvalue(option, text) {
  187. re = new RegExp(option + "(s+?)?=(s+?)?["']?(.+?)(["']|$|>)", "ig");
  188. var matches = re.exec(text);
  189. if(matches != null) {
  190. return trim(matches[3]);
  191. }
  192. return '';
  193. }
  194. function html2bbcode(str) {
  195. if((forumallowhtml && allowhtml && fetchCheckbox('htmlon')) || trim(str) == '') {
  196. /*   Discuz!NT Start  */
  197. // str = str.replace(/<img[^>]+smilieid=(["']?)(d+)(1)[^>]*>/ig, function($1, $2, $3) {return smileycode($3);});
  198. //str = str.replace(/<img[^>]+smiliecode=(["']?)(d+)(1)[^>]*>/ig, function($1, $2, $3) {return smileycode($3);});
  199. /*   Discuz!NT Start  */
  200. str = str.replace(/<img([^>]*aid=[^>]*)>/ig, function($1, $2) {return imgtag($2);});
  201. return str;
  202. }
  203. str= str.replace(/s*[code]([sS]+?)[/code]s*/ig, function($1, $2) {return codetag($2);});
  204. str = preg_replace(['<style.*?>[\s\S]*?</style>', '<script.*?>[\s\S]*?</script>', '<noscript.*?>[\s\S]*?</noscript>', '<select.*?>[sS]*?</select>', '<object.*?>[sS]*?</object>', '<!--[\s\S]*?-->', ' on[a-zA-Z]{3,16}\s?=\s?"[\s\S]*?"'], '', str);
  205. str= str.replace(/(rn|n|r)/ig, '');
  206. str= trim(str.replace(/&((#(32|127|160|173))|shy|nbsp);/ig, ' '));
  207. if(!fetchCheckbox('parseurloff')) {
  208. str = parseurl(str, 'bbcode', false);
  209. }
  210. str = str.replace(/<brs+?style=(["']?)clear: both;?(1)[^>]*>/ig, '');
  211. str = str.replace(/<br[^>]*>/ig, "n");
  212. if(!fetchCheckbox('bbcodeoff') && allowbbcode) {
  213. str = preg_replace(['<table([^>]*(width|background|background-color|bgcolor)[^>]*)>', '<table[^>]*>', '<tr[^>]*(?:background|background-color|bgcolor)[:=]\s*(["']?)([()%,#\w]+)(\1)[^>]*>', '<tr[^>]*>', '<t[dh]([^>]*(width|colspan|rowspan)[^>]*)>', '<t[dh][^>]*>', '</t[dh]>', '</tr>', '</table>'], [function($1, $2) {return tabletag($2);}, '[table]', function($1, $2, $3) {return '[tr=' + $3 + ']';}, '[tr]', function($1, $2) {return tdtag($2);}, '[td]', '[/td]', '[/tr]', '[/table]'], str);
  214. str = str.replace(/<h([0-9]+)[^>]*>(.*)</h\1>/ig, "[size=$1]$2[/size]nn");
  215. /*   Discuz!NT Start  */
  216. //str = str.replace(/<img[^>]+smilieid=(["']?)(d+)(1)[^>]*>/ig, function($1, $2, $3) {return smilies[$3]['code'];});
  217. //str = str.replace(/<img[^>]+smilieid=(["']?)(d+)(1)[^>]*>/ig, function($1, $2, $3) {return ParseSmilies($1,$3);});
  218. str = str.replace(/<img[^>]+smilieid=(["']?)([sS]+?)(1)[^>]*>/ig, function($1, $2, $3) {return $3;});
  219. /*   Discuz!NT  End  */
  220. str = str.replace(/<img([^>]*src[^>]*)>/ig, function($1, $2) {return imgtag($2);});
  221. str = str.replace(/<as+?name=(["']?)(.+?)(1)[sS]*?>([sS]*?)</a>/ig, '$4');
  222. str = recursion('b', str, 'simpletag', 'b');
  223. str = recursion('strong', str, 'simpletag', 'b');
  224. str = recursion('i', str, 'simpletag', 'i');
  225. str = recursion('em', str, 'simpletag', 'i');
  226. str = recursion('u', str, 'simpletag', 'u');
  227. str = recursion('a', str, 'atag');
  228. str = recursion('font', str, 'fonttag');
  229. str = recursion('blockquote', str, 'simpletag', 'indent');
  230. str = recursion('ol', str, 'listtag');
  231. str = recursion('ul', str, 'listtag');
  232. str = recursion('div', str, 'dpstag');
  233. str = recursion('p', str, 'dpstag');
  234. str = recursion('span', str, 'dpstag');
  235. }
  236. str = str.replace(/<[/!]*?[^<>]*?>/ig, '');
  237. for(var i = 0; i <= codecount; i++) {
  238. str = str.replace("[tDISCUZ_CODE_" + i + "t]", codehtml[i]);
  239. }
  240. return preg_replace(['&nbsp;', '&lt;', '&gt;', '&amp;'], [' ', '<', '>', '&'], str);
  241. }
  242. function htmlspecialchars(str) {
  243. return preg_replace(['&', '<', '>', '"'], ['&amp;', '&lt;', '&gt;', '&quot;'], str);
  244. }
  245. function imgtag(attributes) {
  246. var width = '';
  247. var height = '';
  248. re = /src=(["']?)([sS]*?)(1)/i;
  249. var matches = re.exec(attributes);
  250. if(matches != null) {
  251. var src = matches[2];
  252. } else {
  253. return '';
  254. }
  255. re = /widths?:s?(d{1,4})(px)?/ig;
  256. var matches = re.exec(attributes);
  257. if(matches != null) {
  258. width = matches[1];
  259. }
  260. re = /heights?:s?(d{1,4})(px)?/ig;
  261. var matches = re.exec(attributes);
  262. if(matches != null) {
  263. height = matches[1];
  264. }
  265. if(!width || !height) {
  266. re = /width=(["']?)(d+)(1)/i;
  267. var matches = re.exec(attributes);
  268. if(matches != null) {
  269. width = matches[2];
  270. }
  271. re = /height=(["']?)(d+)(1)/i;
  272. var matches = re.exec(attributes);
  273. if(matches != null) {
  274. height = matches[2];
  275. }
  276. }
  277. re = /aid=(["']?)attach_(d+)(1)/i;
  278. var matches = re.exec(attributes);
  279. var imgtag = 'img';
  280. if(matches != null) {
  281. imgtag = 'localimg';
  282. src = matches[2];
  283. }
  284. re = /aid=(["']?)attachimg_(d+)(1)/i;
  285. var matches = re.exec(attributes);
  286. if(matches != null) {
  287. return '[attachimg]' + matches[2] + '[/attachimg]';
  288. }
  289. return width > 0 && height > 0 ?
  290. '[' + imgtag + '=' + width + ',' + height + ']' + src + '[/' + imgtag + ']' :
  291. '[img]' + src + '[/img]';
  292. }
  293. function listtag(listoptions, text, tagname) {
  294. text = text.replace(/<li>(([sS](?!</li))*?)(?=</?ol|</?ul|<li|[list|[/list)/ig, '<li>$1</li>') + (is_opera ? '</li>' : '');
  295. text = recursion('li', text, 'litag');
  296. var opentag = '[list]';
  297. var listtype = fetchoptionvalue('type=', listoptions);
  298. listtype = listtype != '' ? listtype : (tagname == 'ol' ? '1' : '');
  299. if(in_array(listtype, ['1', 'a', 'A'])) {
  300. opentag = '[list=' + listtype + ']';
  301. }
  302. return text ? opentag + recursion(tagname, text, 'listtag') + '[/list]' : '';
  303. }
  304. function litag(listoptions, text) {
  305. return '[*]' + text.replace(/(s+)$/g, '');
  306. }
  307. function parsecode(text) {
  308. codecount++;
  309. codehtml[codecount] = '[code]' + htmlspecialchars(text) + '[/code]';
  310. return "[tDISCUZ_CODE_" + codecount + "t]";
  311. }
  312. function parsestyle(tagoptions, prepend, append) {
  313. var searchlist = [
  314. ['align', true, 'text-align:\s*(left|center|right);?', 1],
  315. ['float', true, 'float:\s*(left|right);?', 1],
  316. ['color', true, '^(?:\s|)color:\s*([^;]+);?', 1],
  317. ['font', true, 'font-family:\s*([^;]+);?', 1],
  318. ['size', true, 'font-size:\s*(\d+(\.\d+)?(px|pt|in|cm|mm|pc|em|ex|%|));?', 1],
  319. ['b', false, 'font-weight:\s*(bold);?'],
  320. ['i', false, 'font-style:\s*(italic);?'],
  321. ['u', false, 'text-decoration:\s*(underline);?']
  322. ];
  323. var style = getoptionvalue('style', tagoptions);
  324. re = /^(?:s|)color:s*rgb((d+),s*(d+),s*(d+))(;?)/ig;
  325. style = style.replace(re, function($1, $2, $3, $4, $5) {return("color:#" + parseInt($2).toString(16) + parseInt($3).toString(16) + parseInt($4).toString(16) + $5);});
  326. var len = searchlist.length;
  327. for(var i = 0; i < len; i++) {
  328. re = new RegExp(searchlist[i][2], "ig");
  329. match = re.exec(style);
  330. if(match != null) {
  331. opnvalue = match[searchlist[i][3]];
  332. prepend += '[' + searchlist[i][0] + (searchlist[i][1] == true ? '=' + opnvalue + ']' : ']');
  333. append = '[/' + searchlist[i][0] + ']' + append;
  334. }
  335. }
  336. return {'prepend' : prepend, 'append' : append};
  337. }
  338. function parsetable(width, bgcolor, str) {
  339. if(isUndefined(width)) {
  340. var width = '';
  341. } else {
  342. width = width.substr(width.length - 1, width.length) == '%' ? (width.substr(0, width.length - 1) <= 98 ? width : '98%') : (width <= 560 ? width : '98%');
  343. }
  344. str = str.replace(/[tr(?:=([()%,#w]+))?]s*[td(?:=(d{1,2}),(d{1,2})(?:,(d{1,4}%?))?)?]/ig, function($1, $2, $3, $4, $5) {
  345. return '<tr' + ($2 ? ' style="background: ' + $2 + '"' : '') + '><td' + ($3 ? ' colspan="' + $3 + '"' : '') + ($4 ? ' rowspan="' + $4 + '"' : '') + ($5 ? ' width="' + $5 + '"' : '') + '>';
  346. });
  347. str = str.replace(/[/td]s*[td(?:=(d{1,2}),(d{1,2})(?:,(d{1,4}%?))?)?]/ig, function($1, $2, $3, $4) {
  348. return '</td><td' + ($2 ? ' colspan="' + $2 + '"' : '') + ($3 ? ' rowspan="' + $3 + '"' : '') + ($4 ? ' width="' + $4 + '"' : '') + '>';
  349. });
  350. str = str.replace(/[/td]s*[/tr]/ig, '</td></tr>');
  351. return '<table ' + (width == '' ? '' : 'width="' + width + '" ') + 'class="t_table"' + (isUndefined(bgcolor) ? '' : ' style="background: ' + bgcolor + '"') + '>' + str + '</table>';
  352. }
  353. function preg_replace(search, replace, str, regswitch) {
  354. var regswitch = !regswitch ? 'ig' : regswitch;
  355. var len = search.length;
  356. for(var i = 0; i < len; i++) {
  357. re = new RegExp(search[i], regswitch);
  358. str = str.replace(re, typeof replace == 'string' ? replace : (replace[i] ? replace[i] : replace[0]));
  359. }
  360. return str;
  361. }
  362. function recursion(tagname, text, dofunction, extraargs) {
  363. if(extraargs == null) {
  364. extraargs = '';
  365. }
  366. tagname = tagname.toLowerCase();
  367. var open_tag = '<' + tagname;
  368. var open_tag_len = open_tag.length;
  369. var close_tag = '</' + tagname + '>';
  370. var close_tag_len = close_tag.length;
  371. var beginsearchpos = 0;
  372. do {
  373. var textlower = text.toLowerCase();
  374. var tagbegin = textlower.indexOf(open_tag, beginsearchpos);
  375. if(tagbegin == -1) {
  376. break;
  377. }
  378. var strlen = text.length;
  379. var inquote = '';
  380. var found = false;
  381. var tagnameend = false;
  382. var optionend = 0;
  383. var t_char = '';
  384. for(optionend = tagbegin; optionend <= strlen; optionend++) {
  385. t_char = text.charAt(optionend);
  386. if((t_char == '"' || t_char == "'") && inquote == '') {
  387. inquote = t_char;
  388. } else if((t_char == '"' || t_char == "'") && inquote == t_char) {
  389. inquote = '';
  390. } else if(t_char == '>' && !inquote) {
  391. found = true;
  392. break;
  393. } else if((t_char == '=' || t_char == ' ') && !tagnameend) {
  394. tagnameend = optionend;
  395. }
  396. }
  397. if(!found) {
  398. break;
  399. }
  400. if(!tagnameend) {
  401. tagnameend = optionend;
  402. }
  403. var offset = optionend - (tagbegin + open_tag_len);
  404. var tagoptions = text.substr(tagbegin + open_tag_len, offset)
  405. var acttagname = textlower.substr(tagbegin * 1 + 1, tagnameend - tagbegin - 1);
  406. if(acttagname != tagname) {
  407. beginsearchpos = optionend;
  408. continue;
  409. }
  410. var tagend = textlower.indexOf(close_tag, optionend);
  411. if(tagend == -1) {
  412. break;
  413. }
  414. var nestedopenpos = textlower.indexOf(open_tag, optionend);
  415. while(nestedopenpos != -1 && tagend != -1) {
  416. if(nestedopenpos > tagend) {
  417. break;
  418. }
  419. tagend = textlower.indexOf(close_tag, tagend + close_tag_len);
  420. nestedopenpos = textlower.indexOf(open_tag, nestedopenpos + open_tag_len);
  421. }
  422. if(tagend == -1) {
  423. beginsearchpos = optionend;
  424. continue;
  425. }
  426. var localbegin = optionend + 1;
  427. var localtext = eval(dofunction)(tagoptions, text.substr(localbegin, tagend - localbegin), tagname, extraargs);
  428. text = text.substring(0, tagbegin) + localtext + text.substring(tagend + close_tag_len);
  429. beginsearchpos = tagbegin + localtext.length;
  430. } while(tagbegin != -1);
  431. return text;
  432. }
  433. function simpletag(options, text, tagname, parseto) {
  434. if(trim(text) == '') {
  435. return '';
  436. }
  437. text = recursion(tagname, text, 'simpletag', parseto);
  438. return '[' + parseto + ']' + text + '[/' + parseto + ']';
  439. }
  440. function smileycode(smileyid) {
  441. if(typeof smilies_type != 'object') return;
  442. for(var typeid in smilies_array) {
  443. for(var page in smilies_array[typeid]) {
  444. for(var i in smilies_array[typeid][page]) {
  445. if(smilies_array[typeid][page][i][0] == smileyid) {
  446. return smilies_array[typeid][page][i][1];
  447. break;
  448. }
  449. }
  450. }
  451. }
  452. }
  453. function strpos(haystack, needle, offset) {
  454. if(isUndefined(offset)) {
  455. offset = 0;
  456. }
  457. index = haystack.toLowerCase().indexOf(needle.toLowerCase(), offset);
  458. return index == -1 ? false : index;
  459. }
  460. function tabletag(attributes) {
  461. var width = '';
  462. re = /width=(["']?)(d{1,4}%?)(1)/i;
  463. var matches = re.exec(attributes);
  464. if(matches != null) {
  465. width = matches[2].substr(matches[2].length - 1, matches[2].length) == '%' ?
  466. (matches[2].substr(0, matches[2].length - 1) <= 98 ? matches[2] : '98%') :
  467. (matches[2] <= 560 ? matches[2] : '98%');
  468. } else {
  469. re = /widths?:s?(d{1,4})([px|%])/ig;
  470. var matches = re.exec(attributes);
  471. if(matches != null) {
  472. width = matches[2] == '%' ? (matches[1] <= 98 ? matches[1] : '98%') : (matches[1] <= 560 ? matches[1] : '98%');
  473. }
  474. }
  475. var bgcolor = '';
  476. re = /(?:background|background-color|bgcolor)[:=]s*(["']?)((rgb(d{1,3}%?,s*d{1,3}%?,s*d{1,3}%?))|(#[0-9a-fA-F]{3,6})|([a-zA-Z]{1,20}))(1)/i;
  477. var matches = re.exec(attributes);
  478. if(matches != null) {
  479. bgcolor = matches[2];
  480. width = width ? width : '98%';
  481. }
  482. return bgcolor ? '[table=' + width + ',' + bgcolor + ']' : (width ? '[table=' + width + ']' : '[table]');
  483. }
  484. function tdtag(attributes) {
  485. var colspan = 1;
  486. var rowspan = 1;
  487. var width = '';
  488. re = /colspan=(["']?)(d{1,2})(1)/ig;
  489. var matches = re.exec(attributes);
  490. if(matches != null) {
  491. colspan = matches[2];
  492. }
  493. re = /rowspan=(["']?)(d{1,2})(1)/ig;
  494. var matches = re.exec(attributes);
  495. if(matches != null) {
  496. rowspan = matches[2];
  497. }
  498. re = /width=(["']?)(d{1,4}%?)(1)/ig;
  499. var matches = re.exec(attributes);
  500. if(matches != null) {
  501. width = matches[2];
  502. }
  503. return in_array(width, ['', '0', '100%']) ?
  504. (colspan == 1 && rowspan == 1 ? '[td]' : '[td=' + colspan + ',' + rowspan + ']') :
  505. '[td=' + colspan + ',' + rowspan + ',' + width + ']';
  506. }