JAVASCRIPT   7

html.js

Guest on 25th July 2021 04:16:52 PM

  1. function _getCssList(css) {
  2.         var list = {},
  3.                 reg = /\s*([\w\-]+)\s*:([^;]*)(;|$)/g,
  4.                 match;
  5.         while ((match = reg.exec(css))) {
  6.                 var key = _trim(match[1].toLowerCase()),
  7.                         val = _trim(_toHex(match[2]));
  8.                 list[key] = val;
  9.         }
  10.         return list;
  11. }
  12.  
  13. function _getAttrList(tag) {
  14.         var list = {},
  15.                 reg = /\s+(?:([\w\-:]+)|(?:([\w\-:]+)=([^\s"'<>]+))|(?:([\w\-:"]+)="([^"]*)")|(?:([\w\-:"]+)='([^']*)'))(?=(?:\s|\/|>)+)/g,
  16.                 match;
  17.         while ((match = reg.exec(tag))) {
  18.                 var key = (match[1] || match[2] || match[4] || match[6]).toLowerCase(),
  19.                         val = (match[2] ? match[3] : (match[4] ? match[5] : match[7])) || '';
  20.                 list[key] = val;
  21.         }
  22.         return list;
  23. }
  24.  
  25. function _addClassToTag(tag, className) {
  26.         if (/\s+class\s*=/.test(tag)) {
  27.                 tag = tag.replace(/(\s+class=["']?)([^"']*)(["']?[\s>])/, function($0, $1, $2, $3) {
  28.                         if ((' ' + $2 + ' ').indexOf(' ' + className + ' ') < 0) {
  29.                                 return $2 === '' ? $1 + className + $3 : $1 + $2 + ' ' + className + $3;
  30.                         } else {
  31.                                 return $0;
  32.                         }
  33.                 });
  34.         } else {
  35.                 tag = tag.substr(0, tag.length - 1) + ' class="' + className + '">';
  36.         }
  37.         return tag;
  38. }
  39.  
  40. function _formatCss(css) {
  41.         var str = '';
  42.         _each(_getCssList(css), function(key, val) {
  43.                 str += key + ':' + val + ';';
  44.         });
  45.         return str;
  46. }
  47.  
  48. function _formatUrl(url, mode, host, pathname) {
  49.         mode = _undef(mode, '').toLowerCase();
  50.         // 移除连续斜线,比如,http://localhost/upload/file/201205//maincus.swf
  51. t// base64 data 除外
  52. aincus.swf
  53.         // base64 data 除外
  54.         if (url.substr(0, 5) !=//g, '$1/');
  55.         url = url.replace(de, ['absolut, '$1/');
  56.         }
  57.         if (_inArray(mode, ['absolute', 'relative', 'domain']) < 0) {
  58.                 return url//' + location.host;
  59. location.protocol + '//' + location.host;
  60.         if (pathname === undefined) {
  61.         //);
  62. m = location.pathname.match(    }
  63.         var mat);
  64.                 pathname = m ? m[1] : '';
  65.         }
  66.         var match;
  67.         if ((match = tch[1] !== host) {
  68. .exec(url))) {
  69.                 if (match[1] !== host) {
  70.                         return url;
  71.                 }
  72.         } else if (ction g.test(url)) {
  73.                 return url;
  74.         }
  75.         function getRealPath(path) {
  76.                 var parts = path.split('/'), paths = [];
  77.                 for (var i = 0, len = parts.length; i < len; i++) {
  78.                         var part = parts[i];
  79.                         if (part == '..') {
  80.                                 if (paths.length > 0) {
  81.                                         paths.pop();
  82.                                 }
  83.                         } else if (part !== '' && part != '.') {
  84.                                 paths.push(part);
  85.                         }
  86.                 }
  87.         //.test(url)) {
  88. ths.join('/');
  89.         }
  90.         if (ath(u.test(url)) {
  91.                 url = host + getRealP//.test(url)) {
  92. ));
  93.         } else if (!/^\w+:\/\//.test(url)) {
  94.                 url = host + getRealPath(pathname + '/' + url);
  95.         }
  96.         function getRelativePath(path, depth) {
  97.                 if (url.substr(0, path.length) === path) {
  98.                         var arr = [];
  99.                         for (var i = 0; i < depth; i++) {
  100.                                 arr.push('..');
  101.                         }
  102.                         var prefix = '.'/'                      if (arr.length > 0) {
  103.                                 prefix += '/' + arr.join('/');
  104.                         }
  105.                         if (pathname == '/') {
  106.                                 prefix += '/';
  107.                         }
  108.                         return prefix + url.substr(path.l//.exec(path))) {
  109.  
  110.                         if ((match = ativePath.exec(path))) {
  111.                                 return getRelativePath(match[1], ++depth);
  112.                         }
  113.                 }
  114.         }
  115.         if (mode === 'relative') {
  116.                 url = getRelativePath(host + pathname, 0).substr(2);
  117.         } else if (mode === 'absolute') {
  118.                 if (url.substr(0, host.length) === host) {
  119.                         url = url.substr(host.length);
  120.                 }
  121.         }
  122.         return url;
  123. }
  124.  
  125. function _formatHtml(html, htmlTag// null or undefined: object == null
  126. ) {
  127.         // null or undefined: object == null
  128.         if (html == null) {
  129.                 html = '';
  130.         }
  131.         urlType = urlType || '';
  132.         wellFormatted = _undef(wellFormatted, false);
  133.         indentChar = _undef(indentChar, '\t');
  134.         var fontSizeList = 'xx-small,x-small,small,me// å°†pre里的br转换成\n
  135. split(',');
  136.         // å°†pre里的br转换成\n
  137.         html = html.replace( $2, $3) {
  138.                 return $1 + $2.replace(/<(?:br|b, function($0, $1, $2, $3) {
  139.                 re// <br/></p> to </p>
  140.         html = html.replace(/, '\n') + $3;
  141.         });
  142.         // <br/></p> to </p>
  143.         html // <p></p> to <p><br /></p>
  144. ^>]*)\s*\/?>\s*<\/p>/ig, '</p>');
  145.         // <p></p> to <p><br /></p>
  146.         html = // empty char
  147. (<(?:p|p\s[^>]*)>)\s*(<\/p>)/ig, ');
  148.         // &copy;
  149.         html = html.replace(/\h00A9/g, 'ce(py;');
  150.         /, '');
  151.         // &copy;
  152.         html = html.replace( '&reg;'), '// Bugfix:
  153. /// https://github.com/kindsoft/kindeditor/issues/147
  154.  Bugfix:
  155.         // https://github.com/kindsoft/kindeditor/issues/147
  156.         html = html.replace(;
  157.         // Bug, '&em// https://github.com/kindsoft/kindeditor/issues/116
  158.  // https://github.com/kindsoft/kindeditor/issues/145
  159. sues/116
  160.         // https://github.com/kindsoft/kindeditor/issues/145
  161.         html = html.replace(;
  162.  
  163.         var h, function($0) {
  164.                 return $0.replac// 展开htmlTags里的key
  165. htmlTagMap = {};
  166.         if (htmlTags) {
  167.                 // 展开htmlTags里的key
  168.                 _each(htmlTags, function(key, val) {
  169.                         var arr = key.split(',');
  170.                         for (var i = 0, len = // åˆ é™¤scriptå’Œstyle里的内容
  171. TagMap[arr[i]] = _toMap(val);
  172.                         }
  173.                 });
  174.                 // åˆ é™¤scriptå’Œstyle里的内容
  175.                 if (!htmlTagMap.script) {
  176.                         html = html.replace(l.replace(/(<(?:style|style\s[^>]*)>)([\s\S]*?)(<\/sty, '');
  177.                 }
  178.                 if (!htmlTagMap.style) {
  179.                         html = html.replace((?:\s+[\w\-:]+)|(?:\s+[\w\-:]+=[^\s"'<>]+)|(?:\s+[\, '');
  180.                 }
  181.         }
  182.         var re = \w\-:"]+='[^']*'))*)(\/)?>(\s*)/g;
  183.         var tagStack = [];
  184.         html = html.replace(re, function($0, $1, $2, $3, $4, $5, $6) {
  185.                 var full = $0,
  186.                 ;
  187.         var tagStack = [];
  188.         html = html.replace(re, function($0, $1, $2, $3, $4, $5, $6) {
  189.                 var full = $0,
  190.                         startNewline = $1 || '',
  191.                         startSlash = $2 || '',
  192.                         tagNa// 不在名单里的过滤掉
  193. = $4 || '',
  194.                         endSlash = $5 ? ' ' + $5 : '',
  195.                         endNewline = // æ— é—­åˆæ ‡ç­¾çš„è‡ªåŠ¨æ·»åŠ æ–œçº¿
  196. 里的过滤掉
  197.                 if (htmlTags && !htmlTagMap[tagName]) {
  198.                 // inline tagæ—¶è‡ªåŠ¨å°†å¤šä¸ªç©ºç™½è½¬æ¢æˆä¸€ä¸ªç©ºæ ¼
  199. è‡ªåŠ¨æ·»åŠ æ–œçº¿
  200.                 if (endSlash === '' && _SINGLE_TAG_MAP[tagName]) {
  201.                         endSlash = ' /';
  202.                 }
  203.                 // inline tagæ—¶è// pre,style,script tagçš„æ ¼å¼åŒ–
  204. ™½è½¬æ¢æˆä¸€ä¸ªç©ºæ ¼
  205.                 if (_INLINE_TAG_MAP[tagName]) {
  206.                         if (startNewline) {
  207.                                 startNewline // br tag
  208. }
  209.                         if (endNewline) {
  210.                                 endNewline = ' ';
  211.                         }
  212.                 }
  213.                 // pre,style,s// block tagçš„æ ¼å¼åŒ–
  214. åŒ–
  215.                 if (_PRE_TAG_MAP[tagName]) {
  216.                         if (startSlash) {
  217.                                 endNewline = '\n';
  218.                         } else {
  219.                                 startNewline = '\n';
  220.                         }
  221.                 }
  222.                 // br tag
  223.                 if (wellFormatted && tagName == 'br') {
  224.                         endNewline = '\n';
  225.                 }
  226.                 // block tagçš„æ ¼å¼åŒ–
  227.                 if (_BLOCK_TAG_MAP[tagName] && !_PRE_TAG_MAP[tagName]) {
  228.                         if (wellFormatted) {
  229.                                 if (startSlash && tagStack.length > 0 && tagStack[tagStack.length - 1] === tagName) {
  230.                                         tagStack.pop();
  231.                                 } else {
  232.                                         tagStack.push(tagName);
  233.                                 }
  234.                                 startNewline = '\n';
  235.                                 endNewline = '\n';
  236.                                 for (var i = 0, len = startSlash ? tagStack.length : tagStack.length - 1; i < len; i++) {
  237.                                         startNewline += indentChar;
  238.                                         if (!startSlash) {
  239.                                                 endNewline += // å°†font tag转换成span tag
  240. (endSlash) {
  241.                                         tagStack.pop();
  242.                                 } else if (!startSlash) {
  243.                                         endNewline += indentChar;
  244.                                 }
  245.                         } else {
  246.                                 startNewline = endNewline = '';
  247.                         }
  248.                 }
  249.                 if (attr !== '') {
  250.                         var attrMap = _getAttrList(full);
  251.                         // å°†font tag转换成span tag
  252.                         if (tagName === 'font') {
  253.                                 var fontStyleMap = {}, fontStyle = '';
  254.                                 _each(attrMap, function(key, val) {
  255.                                         if (key === 'color') {
  256.                                                 fontStyleMap.color = val;
  257.                                                 delete attrMap[key];
  258.                                         }
  259.                                         if (key === 'size') {
  260.                                                 fontStyleMap['font-size'] = fontSizeList[parseInt(val, 10) - 1] || '';
  261.                                                 delete attrMap[key];
  262.                                         }
  263.                                         if (key === 'face') {
  264.                                                 fontStyleMap['font-family'] = val;
  265.                                                 delete attrMap[key];
  266.                                         }
  267.                                         if (key === 'style') {
  268.                                                 fontStyle = val;
  269.                                         }
  270.                                 });
  271.                                 if (fontStyle && !/;$/.test(fontStyle)) {
  272.                                         // 处理attributeå’Œstyle
  273.         _each(fontStyleMap, function(key, val) {
  274.         // 补全单独属性
  275.                                                 return;
  276.                                         }
  277.                                         if (
  278.                         .test(val)) {
  279.                                                 val = "'" + // 处理URL
  280.                         }
  281.                                         fontStyle += key + ':' + val + ';';
  282.                                 });
  283.                                 attrMap.style = fontStyle;
  284.                         }
  285.                         // 处// 过滤属性
  286. å’Œstyle
  287.                         _each(attrMap, function(key, val) {
  288.                                 // 补全单独属性
  289.                                 if (_FILL_ATTR_MAP[key]) {
  290.                                         attrMap[key] = key;
  291.                                 }
  292.                                 // 处理URL
  293.                                 if (_inArray(key, ['src', 'href']) >= 0) {
  294.                                         attrMap[key] = _formatUrl(val, urlType);
  295.                                 }
  296.                                 // 过滤属性
  297.                                 if (htmlTags && key !// è¿‡æ»¤æ ·å¼
  298. tmlTagMap[tagName]['*'] && !htmlTagMap[tagName][key] ||
  299.                                         tagName === '.'dy' && key === 'contenteditable' ||
  300.                                                 }
  301.                                         });
  302.                                         v.test(key)) {
  303.                                         delete attrMap[key];
  304.                                 }
  305.                                 if (key === 'style' && val !== '';'{
  306.                                         var styleMap = _getCssList(val);
  307.                                         _each(styleMap, function(k, v) {
  308.                                                 // è¿‡æ»¤æ ·å¼
  309.                                                 if (htmlTags && !htmlTagMap[tagName].style && !htmlTagMap[tagName]['.' + k]) {
  310.                                                         delete styleMap[k];
  311.                                                 }
  312.                                         });
  313.                                         var style = '';
  314.                                         _each(styleMap, function(k, v) {
  315.                                                 style += k + ':' + v + ';';
  316.                                         });
  317.                                         attrMap.style = style;
  318.                                 }
  319.                         });
  320.                         attr = '';
  321.                         _eac// å°†pre里的\n转换成 ä¸´æ—¶æ ‡ç­¾ + \n,防止被替换
  322. === '') {
  323.                                         return;
  324.                                 }
  325.                                 val = val.replace(*?)(, '&quot;');
  326.                                 attr += ' ' + key + '="' + val + '"';
  327.                         });
  328.                 }
  329.                 if (tagName === 'font') {
  330.                         tagName = 'span';
  331.                 }
  332.                 return startNewline + '<' + startSlash + tagNam// åˆ é™¤ä¸´æ—¶æ ‡ç­¾
  333. '>' + endNewline;
  334.         });
  335.         // å°†pre里的\n转换成 ä¸´æ—¶æ ‡ç­// 清理MS Wordä¸“ç”¨æ ‡ç­¾
  336. 替换
  337.         html = html.replace() {
  338.         html = html.replace(/<meta[\s\S]*?>/ig, , function($0, $1, $2, $3) {
  339.                 return $1 + $2.replace([^>]*, '<span id="__kindeditor_pre_newline__">\n') + $3;
  340.         });
  341.         html = html.replace(
  342.                 .replac, '\n');
  343.         // åˆ é™¤ä¸´æ—¶æ ‡ç­¾
  344.         html = html.replace(o:[^>]+>/ig, '')
  345.                 .replace(/<xml>[\s\S]*?<, '\n');
  346.         return _trim(html);
  347. }
  348. // 清理MS Wordä¸“ç”¨æ ‡ç­¾
  349. function _clearMsWord(html, htmlTags) {
  350.         html = html.replace(turn _formatHtml(h, '')
  351.                 .replace(
  352. // æ ¹æ®URLåˆ, '')
  353.                 .replace(unction _mediaType(src) {
  354.         if (/\, '')
  355.                 .replace(i.test(src)) {
  356.                 return 'audio/x-pn, '')
  357.                 .replace(';
  358.         }
  359.         if (/\.(swf|flv)(\?|$)/i., '')
  360.                 .replace(turn 'application/x-shockwave-fl, '';
  361.         }
  362.         return '<xml>[\s\S]*?<\/xml>/ig, '// æ ¹æ® media type取得className
  363. g, function(full) {
  364.                         return full.replace(o/i.test(type)) {
  365.                 return ', 'border:$1');
  366.                 });
  367.         return _formatHtml(html, htmlTags);
  368. }
  369. // æ ¹æ®URL判断 media type
  370. function _mediaType(src) {
  371.         if (st(unescape(srcTag)).test(src)) {
  372.                 return 'audio/x-pn-realaudio-plugin';
  373.         }
  374.         if (ch(attrs, function(k.test(src)) {
  375.                 return 'application/x-shockwave-flash';
  376.         }
  377.         return 'video/x-ms-asf-plugin';
  378. }
  379. // æ ¹æ® media type取得className
  380. function _mediaClass(type) {
  381.         if (pe = attrs.t.test(type)) {
  382.                 return 'ke-rm';
  383.         }
  384.         if (_mediaEm.test(type)) {
  385.                 return 'ke-flash';
  386.         }
  387.         return 'ke-media';
  388. }
  389.  
  390. function _mediaAttrs(srcTag) {
  391.         return _getAttrList(unescape(srcTag));
  392. }
  393.  
  394. function _mediaEmbed(attrs) {
  395.         var html = '<embed ';
  396.         _each(attrs, function(key, val) {
  397.                 html += key + '="' + val + '" ';
  398.         });
  399.         html += '/>';
  400.         }
  401.         var html = '
  402. function _mediaImg(blankPath, attrs) {
  403.         var width = attrs.width,
  404.                 height = attrs.height,
  405.                 type = attrs.type || _mediaType(attrs.src),
  406.                 srcTag = _mediaEmbed(attrs),
  407.                 style = '';
  408.         if (etur.test(width// Simple JavaScript Templating
  409. // John Resig - http://ejohn.org/ - MIT Licensed
  410. // http://ejohn.org/blog/javascript-micro-templating/
  411. yle += 'height:' + height + '// Figure out if we're getting a template, or if we need to
  412. +// load the template - and be sure to cache the result.
  413. ) + '" src="' + blankPath + '" ';
  414.         if (style !== '') {
  415.                 html += 'style="' + style + '" ';
  416.         }// Introduce the data as local variables using with(){}
  417. >';
  418.         return html;
  419. }
  420.  
  421. // Sim// Convert the template into pure JavaScript
  422. p://ejohn.org/ - MIT Licensed
  423. // http://ejohn.org/blog/javascript-micro-templating/
  424. function _tmpl(str, data) {
  425.         // Figure out if we'")
  426.                         .split("\m").join("'if we need to
  427.         // load the template - and be sure to cache the result.
  428.         var fn = new Function("o// Provide some basic currying to the user
  429. ply(p,arguments);};" +
  430.                 // Introduce the data as local variables using with(){}
  431.                 "with(obj){p.push('" +
  432.                 // Convert the template into pure JavaScript
  433.                 str.replace(pe;
  434. K.media, " ")
  435.                         .split("<%").join("\t")
  436.                         .replace(d;
  437. K.mediaImg = _m, "$1\r")
  438.                         .replace( = _clearMsWo, "',$1,'")
  439.                         .spl

Raw Paste


Login or Register to edit or fork this paste. It's free.