Files
leanote/public/mdeditor/editor/pagedown/Markdown.Sanitizer-min.js
2014-05-07 13:06:24 +08:00

1 line
1.8 KiB
JavaScript

(function(){var output,Converter;if(typeof exports==="object"&&typeof require==="function"){output=exports;Converter=require("./Markdown.Converter").Converter}else{output=window.Markdown;Converter=output.Converter}output.getSanitizingConverter=function(){var converter=new Converter;converter.hooks.chain("postConversion",sanitizeHtml);converter.hooks.chain("postConversion",balanceTags);return converter};function sanitizeHtml(html){return html.replace(/<[^>]*>?/gi,sanitizeTag)}var basic_tag_whitelist=/^(<\/?(b|blockquote|code|del|dd|dl|dt|em|h1|h2|h3|i|kbd|li|ol|p|pre|s|sup|sub|strong|strike|ul)>|<(br|hr)\s?\/?>)$/i;var a_white=/^(<a\shref="((https?|ftp):\/\/|\/)[-A-Za-z0-9+&@#\/%?=~_|!:,.;\(\)]+"(\stitle="[^"<>]+")?\s?>|<\/a>)$/i;var img_white=/^(<img\ssrc="(https?:\/\/|\/)[-A-Za-z0-9+&@#\/%?=~_|!:,.;\(\)]+"(\swidth="\d{1,3}")?(\sheight="\d{1,3}")?(\salt="[^"<>]*")?(\stitle="[^"<>]*")?\s?\/?>)$/i;function sanitizeTag(tag){if(tag.match(basic_tag_whitelist)||tag.match(a_white)||tag.match(img_white))return tag;else return""}function balanceTags(html){if(html=="")return"";var re=/<\/?\w+[^>]*(\s|$|>)/g;var tags=html.toLowerCase().match(re);var tagcount=(tags||[]).length;if(tagcount==0)return html;var tagname,tag;var ignoredtags="<p><img><br><li><hr>";var match;var tagpaired=[];var tagremove=[];var needsRemoval=false;for(var ctag=0;ctag<tagcount;ctag++){tagname=tags[ctag].replace(/<\/?(\w+).*/,"$1");if(tagpaired[ctag]||ignoredtags.search("<"+tagname+">")>-1)continue;tag=tags[ctag];match=-1;if(!/^<\//.test(tag)){for(var ntag=ctag+1;ntag<tagcount;ntag++){if(!tagpaired[ntag]&&tags[ntag]=="</"+tagname+">"){match=ntag;break}}}if(match==-1)needsRemoval=tagremove[ctag]=true;else tagpaired[match]=true}if(!needsRemoval)return html;var ctag=0;html=html.replace(re,function(match){var res=tagremove[ctag]?"":match;ctag++;return res});return html}})();