forked from ariabuckles/simple-markdown
-
Notifications
You must be signed in to change notification settings - Fork 0
/
simple-markdown.min.js
1 lines (1 loc) · 20 KB
/
simple-markdown.min.js
1
(function(){var CR_NEWLINE_R=/\r\n?/g;var TAB_R=/\t/g;var FORMFEED_R=/\f/g;var preprocess=function(source){return source.replace(CR_NEWLINE_R,"\n").replace(FORMFEED_R,"").replace(TAB_R," ")};var parserFor=function(rules){var ruleList=Object.keys(rules);ruleList.forEach(function(type){var order=rules[type].order;if((typeof order!=="number"||!isFinite(order))&&typeof console!=="undefined"){console.warn("simple-markdown: Invalid order for rule `"+type+"`: "+order)}});ruleList.sort(function(typeA,typeB){var orderA=rules[typeA].order;var orderB=rules[typeB].order;if(orderA!==orderB){return orderA-orderB}else if(typeA<typeB){return-1}else if(typeA>typeB){return 1}else{return 0}});var nestedParse=function(source,state){var result=[];state=state||{};var prevCapture="";while(source){var i=0;while(i<ruleList.length){var ruleType=ruleList[i];var rule=rules[ruleType];var capture;if(rule.match){capture=rule.match(source,state,prevCapture)}else{capture=rule.regex.exec(source)}if(capture){var currCaptureString=capture[0];source=source.substring(currCaptureString.length);var parsed=rule.parse(capture,nestedParse,state);if(parsed.type==null){parsed.type=ruleType}result.push(parsed);prevCapture=currCaptureString;break}i++}if(i===ruleList.length){throw new Error("could not find rule to match content: "+source)}}return result};var outerParse=function(source,state){return nestedParse(preprocess(source),state)};return outerParse};var inlineRegex=function(regex){var match=function(source,state){if(state.inline){return regex.exec(source)}else{return null}};match.regex=regex;return match};var blockRegex=function(regex){var match=function(source,state){if(state.inline){return null}else{return regex.exec(source)}};match.regex=regex;return match};var anyScopeRegex=function(regex){var match=function(source,state){return regex.exec(source)};match.regex=regex;return match};var reactFor=function(outputFunc){var nestedOutput=function(ast,state){state=state||{};if(Array.isArray(ast)){var oldKey=state.key;var result=[];var lastWasString=false;for(var i=0;i<ast.length;i++){state.key=i;var nodeOut=nestedOutput(ast[i],state);var isString=typeof nodeOut==="string";if(isString&&lastWasString){result[result.length-1]+=nodeOut}else{result.push(nodeOut)}lastWasString=isString}state.key=oldKey;return result}else{return outputFunc(ast,nestedOutput,state)}};return nestedOutput};var htmlFor=function(outputFunc){var nestedOutput=function(ast,state){state=state||{};if(Array.isArray(ast)){return ast.map(function(node){return nestedOutput(node,state)}).join("")}else{return outputFunc(ast,nestedOutput,state)}};return nestedOutput};var TYPE_SYMBOL=typeof Symbol==="function"&&Symbol.for&&Symbol.for("react.element")||60103;var reactElement=function(element){element._store={validated:true,originalProps:element.props};return element};var htmlTag=function(tagName,content,attributes,isClosed){attributes=attributes||{};isClosed=typeof isClosed!=="undefined"?isClosed:true;var attributeString="";for(var attr in attributes){if(Object.prototype.hasOwnProperty.call(attributes,attr)&&attributes[attr]){attributeString+=" "+attr+'="'+attributes[attr]+'"'}}var unclosedTag="<"+tagName+attributeString+">";if(isClosed){return unclosedTag+content+"</"+tagName+">"}else{return unclosedTag}};var EMPTY_PROPS={};var sanitizeUrl=function(url){if(url==null){return null}try{var prot=decodeURIComponent(url).replace(/[^A-Za-z0-9\/:]/g,"").toLowerCase();if(prot.indexOf("javascript:")===0){return null}}catch(e){return null}return url};var parseInline=function(parse,content,state){var isCurrentlyInline=state.inline||false;state.inline=true;var result=parse(content,state);state.inline=isCurrentlyInline;return result};var parseBlock=function(parse,content,state){var isCurrentlyInline=state.inline||false;state.inline=false;var result=parse(content+"\n\n",state);state.inline=isCurrentlyInline;return result};var parseCaptureInline=function(capture,parse,state){return{content:parseInline(parse,capture[1],state)}};var ignoreCapture=function(){return{}};var LIST_BULLET="(?:[*+-]|\\d+\\.)";var LIST_ITEM_PREFIX="( *)("+LIST_BULLET+") +";var LIST_ITEM_PREFIX_R=new RegExp("^"+LIST_ITEM_PREFIX);var LIST_ITEM_R=new RegExp(LIST_ITEM_PREFIX+"[^\\n]*(?:\\n"+"(?!\\1"+LIST_BULLET+" )[^\\n]*)*(\n|$)","gm");var BLOCK_END_R=/\n{2,}$/;var LIST_BLOCK_END_R=BLOCK_END_R;var LIST_ITEM_END_R=/ *\n+$/;var LIST_R=new RegExp("^( *)("+LIST_BULLET+") "+"[\\s\\S]+?(?:\n{2,}(?! )"+"(?!\\1"+LIST_BULLET+" )\\n*"+"|\\s*\n*$)");var LIST_LOOKBEHIND_R=/^$|\n *$/;var TABLES=function(){var TABLE_HEADER_TRIM=/^ *| *\| *$/g;var TABLE_ALIGN_TRIM=/^ *|\| *$/g;var TABLE_CELLS_TRIM=/(?: *\| *)?\n$/;var NPTABLE_CELLS_TRIM=/\n$/;var PLAIN_TABLE_ROW_TRIM=/^ *\| *| *\| *$/g;var TABLE_ROW_SPLIT=/ *\| */;var TABLE_RIGHT_ALIGN=/^ *-+: *$/;var TABLE_CENTER_ALIGN=/^ *:-+: *$/;var TABLE_LEFT_ALIGN=/^ *:-+ *$/;var parseTableAlignCapture=function(alignCapture){if(TABLE_RIGHT_ALIGN.test(alignCapture)){return"right"}else if(TABLE_CENTER_ALIGN.test(alignCapture)){return"center"}else if(TABLE_LEFT_ALIGN.test(alignCapture)){return"left"}else{return null}};var parseTableHeader=function(capture,parse,state){var headerText=capture[1].replace(TABLE_HEADER_TRIM,"").split(TABLE_ROW_SPLIT);return headerText.map(function(text){return parse(text,state)})};var parseTableAlign=function(capture,parse,state){var alignText=capture[2].replace(TABLE_ALIGN_TRIM,"").split(TABLE_ROW_SPLIT);return alignText.map(parseTableAlignCapture)};var parseTableCells=function(capture,parse,state){var rowsText=capture[3].replace(TABLE_CELLS_TRIM,"").split("\n");return rowsText.map(function(rowText){var cellText=rowText.replace(PLAIN_TABLE_ROW_TRIM,"").split(TABLE_ROW_SPLIT);return cellText.map(function(text){return parse(text,state)})})};var parseNpTableCells=function(capture,parse,state){var rowsText=capture[3].replace(NPTABLE_CELLS_TRIM,"").split("\n");return rowsText.map(function(rowText){var cellText=rowText.split(TABLE_ROW_SPLIT);return cellText.map(function(text){return parse(text,state)})})};var parseTable=function(capture,parse,state){state.inline=true;var header=parseTableHeader(capture,parse,state);var align=parseTableAlign(capture,parse,state);var cells=parseTableCells(capture,parse,state);state.inline=false;return{type:"table",header:header,align:align,cells:cells}};var parseNpTable=function(capture,parse,state){state.inline=true;var header=parseTableHeader(capture,parse,state);var align=parseTableAlign(capture,parse,state);var cells=parseNpTableCells(capture,parse,state);state.inline=false;return{type:"table",header:header,align:align,cells:cells}};return{parseTable:parseTable,parseNpTable:parseNpTable,NPTABLE_REGEX:/^ *(\S.*\|.*)\n *([-:]+ *\|[-| :]*)\n((?:.*\|.*(?:\n|$))*)\n*/}}();var LINK_INSIDE="(?:\\[[^\\]]*\\]|[^\\]]|\\](?=[^\\[]*\\]))*";var LINK_HREF_AND_TITLE="\\s*<?([^\\s]*?)>?(?:\\s+['\"]([\\s\\S]*?)['\"])?\\s*";var AUTOLINK_MAILTO_CHECK_R=/mailto:/i;var parseRef=function(capture,state,refNode){var ref=(capture[2]||capture[1]).replace(/\s+/g," ").toLowerCase();if(state._defs&&state._defs[ref]){var def=state._defs[ref];refNode.target=def.target;refNode.title=def.title}state._refs=state._refs||{};state._refs[ref]=state._refs[ref]||[];state._refs[ref].push(refNode);return refNode};var defaultRules={heading:{match:blockRegex(/^ *(#{1,6}) *([^\n]+?) *#* *(?:\n *)+\n/),parse:function(capture,parse,state){return{level:capture[1].length,content:parseInline(parse,capture[2],state)}},react:function(node,output,state){return reactElement({type:"h"+node.level,key:state.key,props:{children:output(node.content,state)},$$typeof:TYPE_SYMBOL,_store:null})},html:function(node,output,state){return htmlTag("h"+node.level,output(node.content,state))}},nptable:{match:blockRegex(TABLES.NPTABLE_REGEX),regex:TABLES.NPTABLE_REGEX,parse:TABLES.parseNpTable},lheading:{match:blockRegex(/^([^\n]+)\n *(=|-){3,} *(?:\n *)+\n/),parse:function(capture,parse,state){return{type:"heading",level:capture[2]==="="?1:2,content:parseInline(parse,capture[1],state)}}},hr:{match:blockRegex(/^( *[-*_]){3,} *(?:\n *)+\n/),parse:ignoreCapture,react:function(node,output,state){return reactElement({type:"hr",key:state.key,props:EMPTY_PROPS,$$typeof:TYPE_SYMBOL,_store:null})},html:function(node,output,state){return"<hr>"}},codeBlock:{match:blockRegex(/^(?: [^\n]+\n*)+(?:\n *)+\n/),parse:function(capture,parse,state){var content=capture[0].replace(/^ /gm,"").replace(/\n+$/,"");return{lang:undefined,content:content}},react:function(node,output,state){var className=node.lang?"markdown-code-"+node.lang:undefined;return reactElement({type:"pre",key:state.key,props:{children:reactElement({type:"code",props:{className:className,children:node.content},$$typeof:TYPE_SYMBOL,_store:null})},$$typeof:TYPE_SYMBOL,_store:null})},html:function(node,output,state){var className=node.lang?"markdown-code-"+node.lang:undefined;var codeBlock=htmlTag("code",node.content,{"class":className});return htmlTag("pre",codeBlock)}},fence:{match:blockRegex(/^ *(`{3,}|~{3,}) *(\S+)? *\n([\s\S]+?)\s*\1 *(?:\n *)+\n/),parse:function(capture,parse,state){return{type:"codeBlock",lang:capture[2]||undefined,content:capture[3]}}},blockQuote:{match:blockRegex(/^( *>[^\n]+(\n[^\n]+)*\n*)+\n{2,}/),parse:function(capture,parse,state){var content=capture[0].replace(/^ *> ?/gm,"");return{content:parse(content,state)}},react:function(node,output,state){return reactElement({type:"blockquote",key:state.key,props:{children:output(node.content,state)},$$typeof:TYPE_SYMBOL,_store:null})},html:function(node,output,state){return htmlTag("blockquote",output(node.content,state))}},list:{match:function(source,state,prevCapture){var isStartOfLine=LIST_LOOKBEHIND_R.test(prevCapture);var isListBlock=state._list||!state.inline;if(isStartOfLine&&isListBlock){return LIST_R.exec(source)}else{return null}},parse:function(capture,parse,state){var bullet=capture[2];var ordered=bullet.length>1;var start=ordered?+bullet:undefined;var items=capture[0].replace(LIST_BLOCK_END_R,"\n").match(LIST_ITEM_R);var lastItemWasAParagraph=false;var itemContent=items.map(function(item,i){var space=LIST_ITEM_PREFIX_R.exec(item)[0].length;var spaceRegex=new RegExp("^ {1,"+space+"}","gm");var content=item.replace(spaceRegex,"").replace(LIST_ITEM_PREFIX_R,"");var isLastItem=i===items.length-1;var containsBlocks=content.indexOf("\n\n")!==-1;var thisItemIsAParagraph=containsBlocks||isLastItem&&lastItemWasAParagraph;lastItemWasAParagraph=thisItemIsAParagraph;var oldStateInline=state.inline;var oldStateList=state._list;state._list=true;var adjustedContent;if(thisItemIsAParagraph){state.inline=false;adjustedContent=content.replace(LIST_ITEM_END_R,"\n\n")}else{state.inline=true;adjustedContent=content.replace(LIST_ITEM_END_R,"")}var result=parse(adjustedContent,state);state.inline=oldStateInline;state._list=oldStateList;return result});return{ordered:ordered,start:start,items:itemContent}},react:function(node,output,state){var ListWrapper=node.ordered?"ol":"ul";return reactElement({type:ListWrapper,key:state.key,props:{start:node.start,children:node.items.map(function(item,i){return reactElement({type:"li",key:i,props:{children:output(item,state)},$$typeof:TYPE_SYMBOL,_store:null})})},$$typeof:TYPE_SYMBOL,_store:null})},html:function(node,output,state){var listItems=node.items.map(function(item){return htmlTag("li",output(item,state))}).join("");var listTag=node.ordered?"ol":"ul";var attributes={start:node.start};return htmlTag(listTag,listItems,attributes)}},def:{match:blockRegex(/^ *\[([^\]]+)\]: *<?([^\s>]*)>?(?: +["(]([^\n]+)[")])? *\n(?: *\n)?/),parse:function(capture,parse,state){var def=capture[1].replace(/\s+/g," ").toLowerCase();var target=capture[2];var title=capture[3];if(state._refs&&state._refs[def]){state._refs[def].forEach(function(refNode){refNode.target=target;refNode.title=title})}state._defs=state._defs||{};state._defs[def]={target:target,title:title};return{def:def,target:target,title:title}},react:function(){return null},html:function(){return null}},table:{match:blockRegex(/^ *\|(.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/),parse:TABLES.parseTable,react:function(node,output,state){var getStyle=function(colIndex){return node.align[colIndex]==null?{}:{textAlign:node.align[colIndex]}};var headers=node.header.map(function(content,i){return reactElement({type:"th",key:i,props:{style:getStyle(i),children:output(content,state)},$$typeof:TYPE_SYMBOL,_store:null})});var rows=node.cells.map(function(row,r){return reactElement({type:"tr",key:r,props:{children:row.map(function(content,c){return reactElement({type:"td",key:c,props:{style:getStyle(c),children:output(content,state)},$$typeof:TYPE_SYMBOL,_store:null})})},$$typeof:TYPE_SYMBOL,_store:null})});return reactElement({type:"table",key:state.key,props:{children:[reactElement({type:"thead",key:"thead",props:{children:reactElement({type:"tr",props:{children:headers},$$typeof:TYPE_SYMBOL,_store:null})},$$typeof:TYPE_SYMBOL,_store:null}),reactElement({type:"tbody",key:"tbody",props:{children:rows},$$typeof:TYPE_SYMBOL,_store:null})]},$$typeof:TYPE_SYMBOL,_store:null})},html:function(node,output,state){var getStyle=function(colIndex){return node.align[colIndex]==null?"":"text-align:"+node.align[colIndex]+";"};var headers=node.header.map(function(content,i){return htmlTag("th",output(content,state),{style:getStyle(i)})}).join("");var rows=node.cells.map(function(row){var cols=row.map(function(content,c){return htmlTag("td",output(content,state),{style:getStyle(c)})}).join("");return htmlTag("tr",cols)}).join("");var thead=htmlTag("thead",htmlTag("tr",headers));var tbody=htmlTag("tbody",rows);return htmlTag("table",thead+tbody)}},newline:{match:blockRegex(/^(?:\n *)*\n/),parse:ignoreCapture,react:function(node,output,state){return"\n"},html:function(node,output,state){return"\n"}},paragraph:{match:blockRegex(/^((?:[^\n]|\n(?! *\n))+)(?:\n *)+\n/),parse:parseCaptureInline,react:function(node,output,state){return reactElement({type:"div",key:state.key,props:{className:"paragraph",children:output(node.content,state)},$$typeof:TYPE_SYMBOL,_store:null})},html:function(node,output,state){var attributes={"class":"paragraph"};return htmlTag("div",output(node.content,state),attributes)}},escape:{match:inlineRegex(/^\\([^0-9A-Za-z\s])/),parse:function(capture,parse,state){return{type:"text",content:capture[1]}}},autolink:{match:inlineRegex(/^<([^ >]+:\/[^ >]+)>/),parse:function(capture,parse,state){return{type:"link",content:[{type:"text",content:capture[1]}],target:capture[1]}}},mailto:{match:inlineRegex(/^<([^ >]+@[^ >]+)>/),parse:function(capture,parse,state){var address=capture[1];var target=capture[1];if(!AUTOLINK_MAILTO_CHECK_R.test(target)){target="mailto:"+target}return{type:"link",content:[{type:"text",content:address}],target:target}}},url:{match:inlineRegex(/^(https?:\/\/[^\s<]+[^<.,:;"')\]\s])/),parse:function(capture,parse,state){return{type:"link",content:[{type:"text",content:capture[1]}],target:capture[1],title:undefined}}},link:{match:inlineRegex(new RegExp("^\\[("+LINK_INSIDE+")\\]\\("+LINK_HREF_AND_TITLE+"\\)")),parse:function(capture,parse,state){var link={content:parse(capture[1],state),target:capture[2],title:capture[3]};return link},react:function(node,output,state){return reactElement({type:"a",key:state.key,props:{href:sanitizeUrl(node.target),title:node.title,children:output(node.content,state)},$$typeof:TYPE_SYMBOL,_store:null})},html:function(node,output,state){var attributes={href:sanitizeUrl(node.target),title:node.title};return htmlTag("a",output(node.content,state),attributes)}},image:{match:inlineRegex(new RegExp("^!\\[("+LINK_INSIDE+")\\]\\("+LINK_HREF_AND_TITLE+"\\)")),parse:function(capture,parse,state){var image={alt:capture[1],target:capture[2],title:capture[3]};return image},react:function(node,output,state){return reactElement({type:"img",key:state.key,props:{src:sanitizeUrl(node.target),alt:node.alt,title:node.title},$$typeof:TYPE_SYMBOL,_store:null})},html:function(node,output,state){var attributes={src:sanitizeUrl(node.target),alt:node.alt,title:node.title};return htmlTag("img","",attributes,false)}},reflink:{match:inlineRegex(new RegExp("^\\[("+LINK_INSIDE+")\\]"+"\\s*\\[([^\\]]*)\\]")),parse:function(capture,parse,state){return parseRef(capture,state,{type:"link",content:parse(capture[1],state)})}},refimage:{match:inlineRegex(new RegExp("^!\\[("+LINK_INSIDE+")\\]"+"\\s*\\[([^\\]]*)\\]")),parse:function(capture,parse,state){return parseRef(capture,state,{type:"image",alt:capture[1]})}},strong:{match:inlineRegex(/^\*\*([\s\S]+?)\*\*(?!\*)/),parse:parseCaptureInline,react:function(node,output,state){return reactElement({type:"strong",key:state.key,props:{children:output(node.content,state)},$$typeof:TYPE_SYMBOL,_store:null})},html:function(node,output,state){return htmlTag("strong",output(node.content,state))}},u:{match:inlineRegex(/^__([\s\S]+?)__(?!_)/),parse:parseCaptureInline,react:function(node,output,state){return reactElement({type:"u",key:state.key,props:{children:output(node.content,state)},$$typeof:TYPE_SYMBOL,_store:null})},html:function(node,output,state){return htmlTag("u",output(node.content,state))}},em:{match:inlineRegex(new RegExp("^\\b_"+"((?:__|\\\\[\\s\\S]|[^\\\\_])+?)_"+"\\b"+"|"+"^\\*(?=\\S)("+"(?:\\*\\*|\\s+[^\\*\\s]|[^\\s\\*])*?"+"[^\\s\\*])\\*(?!\\*)")),parse:function(capture,parse,state){return{content:parse(capture[2]||capture[1],state)}},react:function(node,output,state){return reactElement({type:"em",key:state.key,props:{children:output(node.content,state)},$$typeof:TYPE_SYMBOL,_store:null})},html:function(node,output,state){return htmlTag("em",output(node.content,state))}},del:{match:inlineRegex(/^~~(?=\S)([\s\S]*?\S)~~/),parse:parseCaptureInline,react:function(node,output,state){return reactElement({type:"del",key:state.key,props:{children:output(node.content,state)},$$typeof:TYPE_SYMBOL,_store:null})},html:function(node,output,state){return htmlTag("del",output(node.content,state))}},inlineCode:{match:inlineRegex(/^(`+)\s*([\s\S]*?[^`])\s*\1(?!`)/),parse:function(capture,parse,state){return{content:capture[2]}},react:function(node,output,state){return reactElement({type:"code",key:state.key,props:{children:node.content},$$typeof:TYPE_SYMBOL,_store:null})},html:function(node,output,state){return htmlTag("code",node.content)}},br:{match:anyScopeRegex(/^ {2,}\n/),parse:ignoreCapture,react:function(node,output,state){return reactElement({type:"br",key:state.key,props:EMPTY_PROPS,$$typeof:TYPE_SYMBOL,_store:null})},html:function(node,output,state){return"<br>"}},text:{match:inlineRegex(/^[\s\S]+?(?=[^0-9A-Za-z\s\u00c0-\uffff]|\n\n| {2,}\n|\w+:\S|$)/),parse:function(capture,parse,state){return{content:capture[0]}},react:function(node,output,state){return node.content},html:function(node,output,state){return node.content}}};Object.keys(defaultRules).forEach(function(type,i){defaultRules[type].order=i});var ruleOutput=function(rules,property){if(!property&&typeof console!=="undefined"){console.warn("simple-markdown ruleOutput should take 'react' or "+"'html' as the second argument.")}property=property||"react";var nestedRuleOutput=function(ast,outputFunc,state){return rules[ast.type][property](ast,outputFunc,state)};return nestedRuleOutput};var defaultRawParse=parserFor(defaultRules);var defaultBlockParse=function(source){return defaultRawParse(source+"\n\n",{inline:false})};var defaultInlineParse=function(source){return defaultRawParse(source,{inline:true})};var defaultImplicitParse=function(source){return defaultRawParse(source,{inline:!BLOCK_END_R.test(source)})};var defaultReactOutput=reactFor(ruleOutput(defaultRules,"react"));var defaultHtmlOutput=htmlFor(ruleOutput(defaultRules,"html"));var SimpleMarkdown={defaultRules:defaultRules,parserFor:parserFor,ruleOutput:ruleOutput,reactFor:reactFor,htmlFor:htmlFor,inlineRegex:inlineRegex,blockRegex:blockRegex,anyScopeRegex:anyScopeRegex,parseInline:parseInline,parseBlock:parseBlock,defaultRawParse:defaultRawParse,defaultBlockParse:defaultBlockParse,defaultInlineParse:defaultInlineParse,defaultImplicitParse:defaultImplicitParse,defaultReactOutput:defaultReactOutput,defaultHtmlOutput:defaultHtmlOutput,preprocess:preprocess,sanitizeUrl:sanitizeUrl,defaultParse:defaultImplicitParse,outputFor:reactFor,defaultOutput:defaultReactOutput};if(typeof module!=="undefined"&&module.exports){module.exports=SimpleMarkdown}else if(typeof global!=="undefined"){global.SimpleMarkdown=SimpleMarkdown}else{window.SimpleMarkdown=SimpleMarkdown}})();