189 lines
56 KiB
JavaScript
189 lines
56 KiB
JavaScript
;(function(){WMDEditor=function(options){this.options=WMDEditor.util.extend({},WMDEditor.defaults,options||{});wmdBase(this,this.options);this.startEditor();};window.WMDEditor=WMDEditor;WMDEditor.defaults={version:2.1,output_format:"markdown",lineLength:40,button_bar:"wmd-button-bar",preview:"wmd-preview",output:"wmd-output",input:"wmd-input",imageDialogText:"<p style='margin-top: 0px'><b>Enter the image URL.</b></p><p>You can also add a title, which will be displayed as a tool tip.</p><p>Example:<br />http://i.imgur.com/1cZl4.jpg</p>",linkDialogText:"<p style='margin-top: 0px'><b>Enter the web address.</b></p><p>You can also add a title, which will be displayed as a tool tip.</p><p>Example:<br />http://www.google.com/</p>",imageDefaultText:"http://",linkDefaultText:"http://",imageDirectory:"images/",helpLink:"/wmd/markdownhelp.html",helpHoverTitle:"Markdown Syntax",helpTarget:"_blank",previewPollInterval:500,pastePollInterval:100,buttons:"bold italic link blockquote code image ol ul heading hr undo redo help",autoFormatting:{list:true,quote:true,code:true,},modifierKeys:{bold:"b",italic:"i",link:"l",quote:"q",code:"k",image:"g",orderedList:"o",unorderedList:"u",heading:"h",horizontalRule:"r",redo:"y",undo:"z"},tagFilter:{enabled:false,allowedTags:/^(<\/?(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,patternLink:/^(<a\shref=("|')(\#\d+|(https?:\/\/|ftp:\/\/|mailto:)[-A-Za-z0-9+&@#\/%?=~_|!:,.;\(\)]+)\2(\stitle="[^"<>]+")?\s?>|<\/a>)$/i,patternImage:/^(<img\ssrc="https?:(\/\/[-A-Za-z0-9+&@#\/%?=~_|!:,.;\(\)]+)"(\swidth="\d{1,3}")?(\sheight="\d{1,3}")?(\salt="[^"<>]*")?(\stitle="[^"<>]*")?\s?\/?>)$/i}};WMDEditor.prototype={getPanels:function(){return{buttonBar:(typeof this.options.button_bar=='string')?document.getElementById(this.options.button_bar):this.options.button_bar,preview:(typeof this.options.preview=='string')?document.getElementById(this.options.preview):this.options.preview,output:(typeof this.options.output=='string')?document.getElementById(this.options.output):this.options.output,input:(typeof this.options.input=='string')?document.getElementById(this.options.input):this.options.input};},startEditor:function(){this.panels=this.getPanels();this.previewMgr=new PreviewManager(this);edit=new this.editor(this.previewMgr.refresh);this.previewMgr.refresh(true);}};var util={isVisible:function(elem){return elem.offsetWidth>0||elem.offsetHeight>0;},addEvent:function(elem,event,listener){if(elem.attachEvent){elem.attachEvent("on"+event,listener);}
|
|
else{elem.addEventListener(event,listener,false);}},removeEvent:function(elem,event,listener){if(elem.detachEvent){elem.detachEvent("on"+event,listener);}
|
|
else{elem.removeEventListener(event,listener,false);}},fixEolChars:function(text){text=text.replace(/\r\n/g,"\n");text=text.replace(/\r/g,"\n");return text;},extendRegExp:function(regex,pre,post){if(pre===null||pre===undefined){pre="";}
|
|
if(post===null||post===undefined){post="";}
|
|
var pattern=regex.toString();var flags="";var result=pattern.match(/\/([gim]*)$/);if(result===null){flags=result[0];}
|
|
else{flags="";}
|
|
pattern=pattern.replace(/(^\/|\/[gim]*$)/g,"");pattern=pre+pattern+post;return new RegExp(pattern,flags);},createImage:function(img){var imgPath=imageDirectory+img;var elem=document.createElement("img");elem.className="wmd-button";elem.src=imgPath;return elem;},prompt:function(text,defaultInputText,makeLinkMarkdown,promptType){var dialog;var background;var input;var titleInput;var newWinCheckbox;if(defaultInputText===undefined){defaultInputText="";}
|
|
var checkEscape=function(key){var code=(key.charCode||key.keyCode);if(code===27){close(true);}};var close=function(isCancel){util.removeEvent(document.body,"keydown",checkEscape);var text=input.value+(titleInput.value?' "'+titleInput.value+'"':'');if(isCancel){text=null;}
|
|
else{text=text.replace('http://http://','http://');text=text.replace('http://https://','https://');text=text.replace('http://ftp://','ftp://');if(promptType=='link'&&newWinCheckbox.checked)text='!'+text;}
|
|
dialog.parentNode.removeChild(dialog);background.parentNode.removeChild(background);makeLinkMarkdown(text);return false;};var createBackground=function(){background=document.createElement("div");background.className="wmd-prompt-background";style=background.style;style.position="absolute";style.top="0";style.zIndex="10000";if(browser.isKonqueror){style.backgroundColor="transparent";}
|
|
else if(browser.isIE){style.filter="alpha(opacity=50)";}
|
|
else{style.opacity="0.5";}
|
|
var pageSize=position.getPageSize();style.height=pageSize[1]+"px";if(browser.isIE){style.left=document.documentElement.scrollLeft;style.width=document.documentElement.clientWidth;}
|
|
else{style.left="0";style.width="100%";}
|
|
document.body.appendChild(background);};var createDialog=function(){dialog=document.createElement("div");dialog.className="wmd-prompt-dialog";dialog.style.padding="10px;";dialog.style.position="fixed";dialog.style.width="400px";dialog.style.zIndex="10001";var question=document.createElement("div");question.innerHTML=text;question.style.padding="5px";dialog.appendChild(question);var form=document.createElement("form");form.onsubmit=function(){return close(false);};var style=form.style;style.padding="0";style.margin="0";style.cssFloat="left";style.width="100%";style.textAlign="center";style.position="relative";dialog.appendChild(form);var label=document.createElement("label");style=label.style;style.display="block";style.width="80%";style.marginLeft=style.marginRight="auto";style.textAlign="left";form.appendChild(label);label.appendChild(document.createTextNode(promptType+" URL:"));input=document.createElement("input");input.type="text";input.value=defaultInputText;style=input.style;style.display="block";style.width="100%";style.marginLeft=style.marginRight="auto";label.appendChild(input);label=document.createElement("label");style=label.style;style.display="block";style.width="80%";style.marginLeft=style.marginRight="auto";style.textAlign="left";form.appendChild(label);label.appendChild(document.createTextNode(promptType+" Title (Hover Text):"));titleInput=document.createElement("input");titleInput.type="text";style=titleInput.style;style.display="block";style.width="100%";style.marginLeft=style.marginRight="auto";label.appendChild(titleInput);if(promptType=='link'){label=document.createElement("label");style=label.style;style.display="block";style.textAlign="center";form.appendChild(label);newWinCheckbox=document.createElement("input");newWinCheckbox.type='checkbox';newWinCheckbox.value='!';label.appendChild(newWinCheckbox);label.appendChild(document.createTextNode(" Have this link open in a new window"));}
|
|
var okButton=document.createElement("input");okButton.type="button";okButton.onclick=function(){return close(false);};okButton.value="OK";style=okButton.style;style.margin="10px";style.display="inline";style.width="7em";var cancelButton=document.createElement("input");cancelButton.type="button";cancelButton.onclick=function(){return close(true);};cancelButton.value="Cancel";style=cancelButton.style;style.margin="10px";style.display="inline";style.width="7em";if(/mac/.test(nav.platform.toLowerCase())){form.appendChild(cancelButton);form.appendChild(okButton);}
|
|
else{form.appendChild(okButton);form.appendChild(cancelButton);}
|
|
util.addEvent(document.body,"keydown",checkEscape);dialog.style.top="50%";dialog.style.left="50%";dialog.style.display="block";if(browser.isIE_5or6){dialog.style.position="absolute";dialog.style.top=document.documentElement.scrollTop+200+"px";dialog.style.left="50%";}
|
|
document.body.appendChild(dialog);dialog.style.marginTop=-(position.getHeight(dialog)/2)+"px";dialog.style.marginLeft=-(position.getWidth(dialog)/2)+"px";};createBackground();window.setTimeout(function(){createDialog();var defTextLen=defaultInputText.length;if(input.selectionStart!==undefined){input.selectionStart=0;input.selectionEnd=defTextLen;}
|
|
else if(input.createTextRange){var range=input.createTextRange();range.collapse(false);range.moveStart("character",-defTextLen);range.moveEnd("character",defTextLen);range.select();}
|
|
input.focus();},0);},extend:function(){function _update(a,b){for(var k in b)if(b.hasOwnProperty(k)){if(typeof a[k]==='object'&&typeof b[k]==='object')_update(a[k],b[k]);else a[k]=b[k];}
|
|
return a;}
|
|
var d={};for(var i=0;i<arguments.length;i++){_update(d,arguments[i]);}
|
|
return d;}};var position={getTop:function(elem,isInner){var result=elem.offsetTop;if(!isInner){while(elem=elem.offsetParent){result+=elem.offsetTop;}}
|
|
return result;},getHeight:function(elem){return elem.offsetHeight||elem.scrollHeight;},getWidth:function(elem){return elem.offsetWidth||elem.scrollWidth;},getPageSize:function(){var scrollWidth,scrollHeight;var innerWidth,innerHeight;if(self.innerHeight&&self.scrollMaxY){scrollWidth=document.body.scrollWidth;scrollHeight=self.innerHeight+self.scrollMaxY;}
|
|
else if(document.body.scrollHeight>document.body.offsetHeight){scrollWidth=document.body.scrollWidth;scrollHeight=document.body.scrollHeight;}
|
|
else{scrollWidth=document.body.offsetWidth;scrollHeight=document.body.offsetHeight;}
|
|
if(self.innerHeight){innerWidth=self.innerWidth;innerHeight=self.innerHeight;}
|
|
else if(document.documentElement&&document.documentElement.clientHeight){innerWidth=document.documentElement.clientWidth;innerHeight=document.documentElement.clientHeight;}
|
|
else if(document.body){innerWidth=document.body.clientWidth;innerHeight=document.body.clientHeight;}
|
|
var maxWidth=Math.max(scrollWidth,innerWidth);var maxHeight=Math.max(scrollHeight,innerHeight);return[maxWidth,maxHeight,innerWidth,innerHeight];}};var TextareaState=function(textarea,wmd){var stateObj=this;var inputArea=textarea;this.init=function(){if(!util.isVisible(inputArea)){return;}
|
|
this.setInputAreaSelectionStartEnd();this.scrollTop=inputArea.scrollTop;if(!this.text&&inputArea.selectionStart||inputArea.selectionStart===0){this.text=inputArea.value;}};this.setInputAreaSelection=function(){if(!util.isVisible(inputArea)){return;}
|
|
if(inputArea.selectionStart!==undefined&&!browser.isOpera){inputArea.focus();inputArea.selectionStart=stateObj.start;inputArea.selectionEnd=stateObj.end;inputArea.scrollTop=stateObj.scrollTop;}
|
|
else if(document.selection){if(typeof(document.activeElement)!="unknown"&&document.activeElement&&document.activeElement!==inputArea){return;}
|
|
inputArea.focus();var range=inputArea.createTextRange();range.moveStart("character",-inputArea.value.length);range.moveEnd("character",-inputArea.value.length);range.moveEnd("character",stateObj.end);range.moveStart("character",stateObj.start);range.select();}};this.setInputAreaSelectionStartEnd=function(){if(inputArea.selectionStart||inputArea.selectionStart===0){stateObj.start=inputArea.selectionStart;stateObj.end=inputArea.selectionEnd;}
|
|
else if(document.selection){stateObj.text=util.fixEolChars(inputArea.value);var range;if(wmd.ieRetardedClick&&wmd.ieCachedRange){range=wmd.ieCachedRange;wmd.ieRetardedClick=false;}
|
|
else{range=document.selection.createRange();}
|
|
var fixedRange=util.fixEolChars(range.text);var marker="\x07";var markedRange=marker+fixedRange+marker;range.text=markedRange;var inputText=util.fixEolChars(inputArea.value);range.moveStart("character",-markedRange.length);range.text=fixedRange;stateObj.start=inputText.indexOf(marker);stateObj.end=inputText.lastIndexOf(marker)-marker.length;var len=stateObj.text.length-util.fixEolChars(inputArea.value).length;if(len){range.moveStart("character",-fixedRange.length);while(len--){fixedRange+="\n";stateObj.end+=1;}
|
|
range.text=fixedRange;}
|
|
this.setInputAreaSelection();}};this.restore=function(){if(stateObj.text!=undefined&&stateObj.text!=inputArea.value){inputArea.value=stateObj.text;}
|
|
this.setInputAreaSelection();inputArea.scrollTop=stateObj.scrollTop;};this.getChunks=function(){var chunk=new Chunks();chunk.before=util.fixEolChars(stateObj.text.substring(0,stateObj.start));chunk.startTag="";chunk.selection=util.fixEolChars(stateObj.text.substring(stateObj.start,stateObj.end));chunk.endTag="";chunk.after=util.fixEolChars(stateObj.text.substring(stateObj.end));chunk.scrollTop=stateObj.scrollTop;return chunk;};this.setChunks=function(chunk){chunk.before=chunk.before+chunk.startTag;chunk.after=chunk.endTag+chunk.after;if(browser.isOpera){chunk.before=chunk.before.replace(/\n/g,"\r\n");chunk.selection=chunk.selection.replace(/\n/g,"\r\n");chunk.after=chunk.after.replace(/\n/g,"\r\n");}
|
|
this.start=chunk.before.length;this.end=chunk.before.length+chunk.selection.length;this.text=chunk.before+chunk.selection+chunk.after;this.scrollTop=chunk.scrollTop;};this.init();};var Chunks=function(){};Chunks.prototype.findTags=function(startRegex,endRegex){var chunkObj=this;var regex;if(startRegex){regex=util.extendRegExp(startRegex,"","$");this.before=this.before.replace(regex,function(match){chunkObj.startTag=chunkObj.startTag+match;return"";});regex=util.extendRegExp(startRegex,"^","");this.selection=this.selection.replace(regex,function(match){chunkObj.startTag=chunkObj.startTag+match;return"";});}
|
|
if(endRegex){regex=util.extendRegExp(endRegex,"","$");this.selection=this.selection.replace(regex,function(match){chunkObj.endTag=match+chunkObj.endTag;return"";});regex=util.extendRegExp(endRegex,"^","");this.after=this.after.replace(regex,function(match){chunkObj.endTag=match+chunkObj.endTag;return"";});}};Chunks.prototype.trimWhitespace=function(remove){this.selection=this.selection.replace(/^(\s*)/,"");if(!remove){this.before+=re.$1;}
|
|
this.selection=this.selection.replace(/(\s*)$/,"");if(!remove){this.after=re.$1+this.after;}};Chunks.prototype.addBlankLines=function(nLinesBefore,nLinesAfter,findExtraNewlines){if(nLinesBefore===undefined){nLinesBefore=1;}
|
|
if(nLinesAfter===undefined){nLinesAfter=1;}
|
|
nLinesBefore++;nLinesAfter++;var regexText;var replacementText;var match=/(^\n*)/.exec(this.selection);this.selection=this.selection.replace(/(^\n*)/,"");this.startTag=this.startTag+(match?match[1]:"");match=/(\n*$)/.exec(this.selection);this.selection=this.selection.replace(/(\n*$)/,"");this.endTag=this.endTag+(match?match[1]:"");match=/(^\n*)/.exec(this.startTag);this.startTag=this.startTag.replace(/(^\n*)/,"");this.before=this.before+(match?match[1]:"");match=/(\n*$)/.exec(this.endTag);this.endTag=this.endTag.replace(/(\n*$)/,"");this.after=this.after+(match?match[1]:"");if(this.before){regexText=replacementText="";while(nLinesBefore--){regexText+="\\n?";replacementText+="\n";}
|
|
if(findExtraNewlines){regexText="\\n*";}
|
|
this.before=this.before.replace(new re(regexText+"$",""),replacementText);}
|
|
if(this.after){regexText=replacementText="";while(nLinesAfter--){regexText+="\\n?";replacementText+="\n";}
|
|
if(findExtraNewlines){regexText="\\n*";}
|
|
this.after=this.after.replace(new re(regexText,""),replacementText);}};var InputPoller=function(textarea,callback,interval){var pollerObj=this;var inputArea=textarea;var lastStart;var lastEnd;var markdown;var killHandle;this.tick=function(){if(!util.isVisible(inputArea)){return;}
|
|
if(inputArea.selectionStart||inputArea.selectionStart===0){var start=inputArea.selectionStart;var end=inputArea.selectionEnd;if(start!=lastStart||end!=lastEnd){lastStart=start;lastEnd=end;if(markdown!=inputArea.value){markdown=inputArea.value;return true;}}}
|
|
return false;};var doTickCallback=function(){if(!util.isVisible(inputArea)){return;}
|
|
if(pollerObj.tick()){callback();}};var assignInterval=function(){killHandle=window.setInterval(doTickCallback,interval);};this.destroy=function(){window.clearInterval(killHandle);};assignInterval();};var PreviewManager=function(wmd){var managerObj=this;var converter;var poller;var timeout;var elapsedTime;var oldInputText;var htmlOut;var maxDelay=3000;var startType="delayed";var setupEvents=function(inputElem,listener){util.addEvent(inputElem,"input",listener);inputElem.onpaste=listener;inputElem.ondrop=listener;util.addEvent(inputElem,"keypress",listener);util.addEvent(inputElem,"keydown",listener);poller=new InputPoller(wmd.panels.input,listener,wmd.options.previewPollInterval);};var getDocScrollTop=function(){var result=0;if(window.innerHeight){result=window.pageYOffset;}
|
|
else if(document.documentElement&&document.documentElement.scrollTop){result=document.documentElement.scrollTop;}
|
|
else if(document.body){result=document.body.scrollTop;}
|
|
return result;};var makePreviewHtml=function(){if(!wmd.panels.preview&&!wmd.panels.output){return;}
|
|
var text=wmd.panels.input.value;if(text&&text==oldInputText){return;}
|
|
else{oldInputText=text;}
|
|
var prevTime=new Date().getTime();if(!converter&&wmd.showdown){converter=new wmd.showdown.converter();}
|
|
if(converter){text=converter.makeHtml(text);}
|
|
var currTime=new Date().getTime();elapsedTime=currTime-prevTime;pushPreviewHtml(text);htmlOut=text;};var applyTimeout=function(){if(timeout){window.clearTimeout(timeout);timeout=undefined;}
|
|
if(startType!=="manual"){var delay=0;if(startType==="delayed"){delay=elapsedTime;}
|
|
if(delay>maxDelay){delay=maxDelay;}
|
|
timeout=window.setTimeout(makePreviewHtml,delay);}};var getScaleFactor=function(panel){if(panel.scrollHeight<=panel.clientHeight){return 1;}
|
|
return panel.scrollTop/(panel.scrollHeight-panel.clientHeight);};var setPanelScrollTops=function(){if(wmd.panels.preview){wmd.panels.preview.scrollTop=(wmd.panels.preview.scrollHeight-wmd.panels.preview.clientHeight)*getScaleFactor(wmd.panels.preview);;}
|
|
if(wmd.panels.output){wmd.panels.output.scrollTop=(wmd.panels.output.scrollHeight-wmd.panels.output.clientHeight)*getScaleFactor(wmd.panels.output);;}};this.refresh=function(requiresRefresh){if(requiresRefresh){oldInputText="";makePreviewHtml();}
|
|
else{applyTimeout();}};this.processingTime=function(){return elapsedTime;};this.output=function(){return htmlOut;};this.setUpdateMode=function(mode){startType=mode;managerObj.refresh();};var isFirstTimeFilled=true;var pushPreviewHtml=function(text){var emptyTop=position.getTop(wmd.panels.input)-getDocScrollTop();if(wmd.panels.output){if(wmd.panels.output.value!==undefined){wmd.panels.output.value=text;}
|
|
else{var newText=text.replace(/&/g,"&");newText=newText.replace(/</g,"<");wmd.panels.output.innerHTML="<pre><code>"+newText+"</code></pre>";}}
|
|
if(wmd.panels.preview){if(wmd.options.tagFilter.enabled){text=text.replace(/<[^<>]*>?/gi,function(tag){return(tag.match(wmd.options.tagFilter.allowedTags)||tag.match(wmd.options.tagFilter.patternLink)||tag.match(wmd.options.tagFilter.patternImage))?tag:"";});}
|
|
wmd.panels.preview.innerHTML=text;}
|
|
setPanelScrollTops();if(isFirstTimeFilled){isFirstTimeFilled=false;return;}
|
|
var fullTop=position.getTop(wmd.panels.input)-getDocScrollTop();if(browser.isIE){window.setTimeout(function(){window.scrollBy(0,fullTop-emptyTop);},0);}
|
|
else{window.scrollBy(0,fullTop-emptyTop);}};var init=function(){setupEvents(wmd.panels.input,applyTimeout);makePreviewHtml();if(wmd.panels.preview){wmd.panels.preview.scrollTop=0;}
|
|
if(wmd.panels.output){wmd.panels.output.scrollTop=0;}};this.destroy=function(){if(poller){poller.destroy();}};init();};var UndoManager=function(wmd,textarea,pastePollInterval,callback){var undoObj=this;var undoStack=[];var stackPtr=0;var mode="none";var lastState;var poller;var timer;var inputStateObj;var setMode=function(newMode,noSave){if(mode!=newMode){mode=newMode;if(!noSave){saveState();}}
|
|
if(!browser.isIE||mode!="moving"){timer=window.setTimeout(refreshState,1);}
|
|
else{inputStateObj=null;}};var refreshState=function(){inputStateObj=new TextareaState(textarea,wmd);poller.tick();timer=undefined;};this.setCommandMode=function(){mode="command";saveState();timer=window.setTimeout(refreshState,0);};this.canUndo=function(){return stackPtr>1;};this.canRedo=function(){if(undoStack[stackPtr+1]){return true;}
|
|
return false;};this.undo=function(){if(undoObj.canUndo()){if(lastState){lastState.restore();lastState=null;}
|
|
else{undoStack[stackPtr]=new TextareaState(textarea,wmd);undoStack[--stackPtr].restore();if(callback){callback();}}}
|
|
mode="none";textarea.focus();refreshState();};this.redo=function(){if(undoObj.canRedo()){undoStack[++stackPtr].restore();if(callback){callback();}}
|
|
mode="none";textarea.focus();refreshState();};var saveState=function(){var currState=inputStateObj||new TextareaState(textarea,wmd);if(!currState){return false;}
|
|
if(mode=="moving"){if(!lastState){lastState=currState;}
|
|
return;}
|
|
if(lastState){if(undoStack[stackPtr-1].text!=lastState.text){undoStack[stackPtr++]=lastState;}
|
|
lastState=null;}
|
|
undoStack[stackPtr++]=currState;undoStack[stackPtr+1]=null;if(callback){callback();}};var handleCtrlYZ=function(event){var handled=false;if(event.ctrlKey||event.metaKey){var keyCode=event.charCode||event.keyCode;var keyCodeChar=String.fromCharCode(keyCode);switch(keyCodeChar){case"y":undoObj.redo();handled=true;break;case"z":if(!event.shiftKey){undoObj.undo();}
|
|
else{undoObj.redo();}
|
|
handled=true;break;}}
|
|
if(handled){if(event.preventDefault){event.preventDefault();}
|
|
if(window.event){window.event.returnValue=false;}
|
|
return;}};var handleModeChange=function(event){if(!event.ctrlKey&&!event.metaKey){var keyCode=event.keyCode;if((keyCode>=33&&keyCode<=40)||(keyCode>=63232&&keyCode<=63235)){setMode("moving");}
|
|
else if(keyCode==8||keyCode==46||keyCode==127){setMode("deleting");}
|
|
else if(keyCode==13){setMode("newlines");}
|
|
else if(keyCode==27){setMode("escape");}
|
|
else if((keyCode<16||keyCode>20)&&keyCode!=91){setMode("typing");}}};var setEventHandlers=function(){util.addEvent(textarea,"keypress",function(event){if((event.ctrlKey||event.metaKey)&&(event.keyCode==89||event.keyCode==90)){event.preventDefault();}});var handlePaste=function(){if(browser.isIE||(inputStateObj&&inputStateObj.text!=textarea.value)){if(timer==undefined){mode="paste";saveState();refreshState();}}};poller=new InputPoller(textarea,handlePaste,pastePollInterval);util.addEvent(textarea,"keydown",handleCtrlYZ);util.addEvent(textarea,"keydown",handleModeChange);util.addEvent(textarea,"mousedown",function(){setMode("moving");});textarea.onpaste=handlePaste;textarea.ondrop=handlePaste;};var init=function(){setEventHandlers();refreshState();saveState();};this.destroy=function(){if(poller){poller.destroy();}};init();};WMDEditor.util=util;WMDEditor.position=position;WMDEditor.TextareaState=TextareaState;WMDEditor.InputPoller=InputPoller;WMDEditor.PreviewManager=PreviewManager;WMDEditor.UndoManager=UndoManager;var doc=window.document;var re=window.RegExp;var nav=window.navigator;function get_browser(){var b={};b.isIE=/msie/.test(nav.userAgent.toLowerCase());b.isIE_5or6=/msie 6/.test(nav.userAgent.toLowerCase())||/msie 5/.test(nav.userAgent.toLowerCase());b.isIE_7plus=b.isIE&&!b.isIE_5or6;b.isOpera=/opera/.test(nav.userAgent.toLowerCase());b.isKonqueror=/konqueror/.test(nav.userAgent.toLowerCase());return b;}
|
|
var browser=get_browser();var wmdBase=function(wmd,wmd_options){wmd.Command={};wmd.Global={};wmd.buttons={};wmd.showdown=window.Showdown;var util=WMDEditor.util;var position=WMDEditor.position;var command=wmd.Command;wmd.ieCachedRange=null;wmd.ieRetardedClick=false;wmd.editor=function(previewRefreshCallback){if(!previewRefreshCallback){previewRefreshCallback=function(){};}
|
|
var inputBox=wmd.panels.input;var offsetHeight=0;var editObj=this;var mainDiv;var mainSpan;var div;var creationHandle;var undoMgr;var doClick=function(button){inputBox.focus();if(button.textOp){if(undoMgr){undoMgr.setCommandMode();}
|
|
var state=new TextareaState(wmd.panels.input,wmd);if(!state){return;}
|
|
var chunks=state.getChunks();var fixupInputArea=function(){inputBox.focus();if(chunks){state.setChunks(chunks);}
|
|
state.restore();previewRefreshCallback();};var useDefaultText=true;var noCleanup=button.textOp(chunks,fixupInputArea,useDefaultText);if(!noCleanup){fixupInputArea();}}
|
|
if(button.execute){button.execute(editObj);}};var setUndoRedoButtonStates=function(){if(undoMgr){if(wmd.buttons["wmd-undo-button"])setupButton(wmd.buttons["wmd-undo-button"],undoMgr.canUndo());if(wmd.buttons["wmd-redo-button"])setupButton(wmd.buttons["wmd-redo-button"],undoMgr.canRedo());}};var setupButton=function(button,isEnabled){if(isEnabled){button.className=button.className.replace(new RegExp("(^|\\s+)disabled(\\s+|$)"),' ');if(browser.isIE){button.onmousedown=function(){wmd.ieRetardedClick=true;wmd.ieCachedRange=document.selection.createRange();};}
|
|
if(!button.isHelp){button.onclick=function(){if(this.onmouseout){this.onmouseout();}
|
|
doClick(this);return false;};}}
|
|
else{button.className+=(button.className?' ':'')+'disabled';button.onmouseover=button.onmouseout=button.onclick=function(){};}};var makeSpritedButtonRow=function(){var buttonBar=(typeof wmd_options.button_bar=='string')?document.getElementById(wmd_options.button_bar||"wmd-button-bar"):wmd_options.button_bar;var normalYShift="0px";var disabledYShift="-20px";var highlightYShift="-40px";var buttonRow=document.createElement("ul");buttonRow.className="wmd-button-row";buttonRow=buttonBar.appendChild(buttonRow);var xoffset=0;function createButton(name,title,textOp){var button=document.createElement("li");wmd.buttons[name]=button;button.className="wmd-button "+name;button.XShift=xoffset+"px";xoffset-=20;if(title)button.title=title;if(textOp)button.textOp=textOp;return button;}
|
|
function addButton(name,title,textOp){var button=createButton(name,title,textOp);setupButton(button,true);buttonRow.appendChild(button);return button;}
|
|
function addSpacer(){var spacer=document.createElement("li");spacer.className="wmd-spacer";buttonRow.appendChild(spacer);return spacer;}
|
|
var modifierKey=(navigator.appVersion.indexOf("Mac")!=-1)?"Cmd":"Ctrl";var buttonlist=wmd_options.buttons.split(' ');for(var i=0;i<buttonlist.length;i++){switch(buttonlist[i]){case"bold":addButton("wmd-bold-button","Strong <strong> "+modifierKey+"+B",command.doBold);break;case"italic":addButton("wmd-italic-button","Emphasis <em> "+modifierKey+"+I",command.doItalic);break;case'link':addButton("wmd-link-button","Hyperlink <a> "+modifierKey+"+L",function(chunk,postProcessing,useDefaultText){return command.doLinkOrImage(chunk,postProcessing,false);});break;case'blockquote':addButton("wmd-quote-button","Blockquote <blockquote> "+modifierKey+"+Q",command.doBlockquote);break;case'code':addButton("wmd-code-button","Code Sample <pre><code> "+modifierKey+"+K",command.doCode);break;case'image':addButton("wmd-image-button","Image <img> "+modifierKey+"+G",function(chunk,postProcessing,useDefaultText){return command.doLinkOrImage(chunk,postProcessing,true);});break;case'ol':addButton("wmd-olist-button","Numbered List <ol> "+modifierKey+"+O",function(chunk,postProcessing,useDefaultText){command.doList(chunk,postProcessing,true,useDefaultText);});break;case'ul':addButton("wmd-ulist-button","Bulleted List <ul> "+modifierKey+"+U",function(chunk,postProcessing,useDefaultText){command.doList(chunk,postProcessing,false,useDefaultText);});break;case'heading':addButton("wmd-heading-button","Heading <h1>/<h2> "+modifierKey+"+H",command.doHeading);break;case'hr':addButton("wmd-hr-button","Horizontal Rule <hr> "+modifierKey+"+R",command.doHorizontalRule);break;case'undo':var undoButton=addButton("wmd-undo-button","Undo - "+modifierKey+"+Z");undoButton.execute=function(manager){manager.undo();};break;case'redo':var redoButton=addButton("wmd-redo-button","Redo - "+modifierKey+"+Y");if(/win/.test(nav.platform.toLowerCase())){redoButton.title="Redo - "+modifierKey+"+Y";}
|
|
else{redoButton.title="Redo - "+modifierKey+"+Shift+Z";}
|
|
redoButton.execute=function(manager){manager.redo();};break;case'help':var helpButton=createButton("wmd-help-button");helpButton.isHelp=true;setupButton(helpButton,true);buttonRow.appendChild(helpButton);var helpAnchor=document.createElement("a");helpAnchor.href=wmd_options.helpLink;helpAnchor.target=wmd_options.helpTarget;helpAnchor.title=wmd_options.helpHoverTitle;helpButton.appendChild(helpAnchor);break;case'':addSpacer();break;}}
|
|
setUndoRedoButtonStates();};var setupEditor=function(){if(/\?noundo/.test(document.location.href)){wmd.nativeUndo=true;}
|
|
if(!wmd.nativeUndo){undoMgr=new UndoManager(wmd,wmd.panels.input,wmd.options.pastePollInterval,function(){previewRefreshCallback();setUndoRedoButtonStates();});}
|
|
makeSpritedButtonRow();var keyEvent="keydown";if(browser.isOpera){keyEvent="keypress";}
|
|
util.addEvent(inputBox,keyEvent,function(key){if(wmd.options.modifierKeys&&(key.ctrlKey||key.metaKey)){var keyCode=key.charCode||key.keyCode;var keyCodeStr=String.fromCharCode(keyCode).toLowerCase();switch(keyCodeStr){case wmd.options.modifierKeys.bold:if(wmd.buttons["wmd-bold-button"])doClick(wmd.buttons["wmd-bold-button"]);else return;break;case wmd.options.modifierKeys.italic:if(wmd.buttons["wmd-italic-button"])doClick(wmd.buttons["wmd-italic-button"]);else return;break;case wmd.options.modifierKeys.link:if(wmd.buttons["wmd-link-button"])doClick(wmd.buttons["wmd-link-button"]);else return;break;case wmd.options.modifierKeys.quote:if(wmd.buttons["wmd-quote-button"])doClick(wmd.buttons["wmd-quote-button"]);else return;break;case wmd.options.modifierKeys.code:if(wmd.buttons["wmd-code-button"])doClick(wmd.buttons["wmd-code-button"]);else return;break;case wmd.options.modifierKeys.image:if(wmd.buttons["wmd-image-button"])doClick(wmd.buttons["wmd-image-button"]);else return;break;case wmd.options.modifierKeys.orderedList:if(wmd.buttons["wmd-olist-button"])doClick(wmd.buttons["wmd-olist-button"]);else return;break;case wmd.options.modifierKeys.unorderedList:if(wmd.buttons["wmd-ulist-button"])doClick(wmd.buttons["wmd-ulist-button"]);else return;break;case wmd.options.modifierKeys.heading:if(wmd.buttons["wmd-heading-button"])doClick(wmd.buttons["wmd-heading-button"]);else return;break;case wmd.options.modifierKeys.horizontalRule:if(wmd.buttons["wmd-hr-button"])doClick(wmd.buttons["wmd-hr-button"]);else return;break;case wmd.options.modifierKeys.redo:if(wmd.buttons["wmd-redo-button"])doClick(wmd.buttons["wmd-redo-button"]);else return;break;case wmd.options.modifierKeys.undo:if(key.shiftKey){if(wmd.buttons["wmd-redo-button"])doClick(wmd.buttons["wmd-redo-button"]);else return;}else{if(wmd.buttons["wmd-undo-button"])doClick(wmd.buttons["wmd-undo-button"]);else return;}
|
|
break;default:return;}
|
|
if(key.preventDefault){key.preventDefault();}
|
|
if(window.event){window.event.returnValue=false;}}});util.addEvent(inputBox,"keyup",function(key){if(!key.shiftKey&&!key.ctrlKey&&!key.metaKey){var keyCode=key.charCode||key.keyCode;if(keyCode===13){fakeButton={};fakeButton.textOp=command.doAutoindent;doClick(fakeButton);}}});if(browser.isIE){util.addEvent(inputBox,"keydown",function(key){var code=key.keyCode;if(code===27){return false;}});}};this.undo=function(){if(undoMgr){undoMgr.undo();}};this.redo=function(){if(undoMgr){undoMgr.redo();}};var init=function(){setupEditor();};this.destroy=function(){if(undoMgr){undoMgr.destroy();}
|
|
if(div.parentNode){div.parentNode.removeChild(div);}
|
|
if(inputBox){inputBox.style.marginTop="";}
|
|
window.clearInterval(creationHandle);};init();};command.prefixes="(?:\\s{4,}|\\s*>|\\s*-\\s+|\\s*\\d+\\.|=|\\+|-|_|\\*|#|\\s*\\[[^\n]]+\\]:)";command.unwrap=function(chunk){var txt=new re("([^\\n])\\n(?!(\\n|"+command.prefixes+"))","g");chunk.selection=chunk.selection.replace(txt,"$1 $2");};command.wrap=function(chunk,len){command.unwrap(chunk);var regex=new re("(.{1,"+len+"})( +|$\\n?)","gm");chunk.selection=chunk.selection.replace(regex,function(line,marked){if(new re("^"+command.prefixes,"").test(line)){return line;}
|
|
return marked+"\n";});chunk.selection=chunk.selection.replace(/\s+$/,"");};command.doBold=function(chunk,postProcessing,useDefaultText){return command.doBorI(chunk,2,"strong text");};command.doItalic=function(chunk,postProcessing,useDefaultText){return command.doBorI(chunk,1,"emphasized text");};command.doBorI=function(chunk,nStars,insertText){chunk.trimWhitespace();chunk.selection=chunk.selection.replace(/\n{2,}/g,"\n");chunk.before.search(/(\**$)/);var starsBefore=re.$1;chunk.after.search(/(^\**)/);var starsAfter=re.$1;var prevStars=Math.min(starsBefore.length,starsAfter.length);if((prevStars>=nStars)&&(prevStars!=2||nStars!=1)){chunk.before=chunk.before.replace(re("[*]{"+nStars+"}$",""),"");chunk.after=chunk.after.replace(re("^[*]{"+nStars+"}",""),"");}
|
|
else if(!chunk.selection&&starsAfter){chunk.after=chunk.after.replace(/^([*_]*)/,"");chunk.before=chunk.before.replace(/(\s?)$/,"");var whitespace=re.$1;chunk.before=chunk.before+starsAfter+whitespace;}
|
|
else{if(!chunk.selection&&!starsAfter){chunk.selection=insertText;}
|
|
var markup=nStars<=1?"*":"**";chunk.before=chunk.before+markup;chunk.after=markup+chunk.after;}
|
|
return;};command.stripLinkDefs=function(text,defsToAdd){text=text.replace(/^[ ]{0,3}\[(\d+)\]:[ \t]*\n?[ \t]*<?(\S+?)>?[ \t]*\n?[ \t]*(?:(\n*)["(](.+?)[")][ \t]*)?(?:\n+|$)/gm,function(totalMatch,id,link,newlines,title){defsToAdd[id]=totalMatch.replace(/\s*$/,"");if(newlines){defsToAdd[id]=totalMatch.replace(/["(](.+?)[")]$/,"");return newlines+title;}
|
|
return"";});return text;};command.addLinkDef=function(chunk,linkDef){var refNumber=0;var defsToAdd={};chunk.before=command.stripLinkDefs(chunk.before,defsToAdd);chunk.selection=command.stripLinkDefs(chunk.selection,defsToAdd);chunk.after=command.stripLinkDefs(chunk.after,defsToAdd);var defs="";var regex=/(\[(?:\[[^\]]*\]|[^\[\]])*\][ ]?(?:\n[ ]*)?\[)(\d+)(\])/g;var addDefNumber=function(def){refNumber++;def=def.replace(/^[ ]{0,3}\[(\d+)\]:/," ["+refNumber+"]:");defs+="\n"+def;};var getLink=function(wholeMatch,link,id,end){if(defsToAdd[id]){addDefNumber(defsToAdd[id]);return link+refNumber+end;}
|
|
return wholeMatch;};chunk.before=chunk.before.replace(regex,getLink);if(linkDef){addDefNumber(linkDef);}
|
|
else{chunk.selection=chunk.selection.replace(regex,getLink);}
|
|
var refOut=refNumber;chunk.after=chunk.after.replace(regex,getLink);if(chunk.after){chunk.after=chunk.after.replace(/\n*$/,"");}
|
|
if(!chunk.after){chunk.selection=chunk.selection.replace(/\n*$/,"");}
|
|
chunk.after+="\n\n"+defs;return refOut;};command.doLinkOrImage=function(chunk,postProcessing,isImage){chunk.trimWhitespace();chunk.findTags(/\s*!?\[/,/\][ ]?(?:\n[ ]*)?(\[.*?\])?/);if(chunk.endTag.length>1){chunk.startTag=chunk.startTag.replace(/!?\[/,"");chunk.endTag="";command.addLinkDef(chunk,null);}
|
|
else{if(/\n\n/.test(chunk.selection)){command.addLinkDef(chunk,null);return;}
|
|
var makeLinkMarkdown=function(link){console.log(link);if(link!==null){chunk.startTag=chunk.endTag="";var linkDef=" [999]: "+link;var num=command.addLinkDef(chunk,linkDef);chunk.startTag=isImage?"![":"[";chunk.endTag="]["+num+"]";if(!chunk.selection){if(isImage){chunk.selection="alt text";}
|
|
else{chunk.selection="link text";}}}
|
|
postProcessing();};if(isImage){util.prompt(wmd_options.imageDialogText,wmd_options.imageDefaultText,makeLinkMarkdown,'Image');}
|
|
else{util.prompt(wmd_options.linkDialogText,wmd_options.linkDefaultText,makeLinkMarkdown,'Link');}
|
|
return true;}};command.doAutoindent=function(chunk,postProcessing,useDefaultText){if(!wmd.options.autoFormatting)return;if(wmd.options.autoFormatting.list)chunk.before=chunk.before.replace(/(\n|^)[ ]{0,3}([*+-]|\d+[.])[ \t]*\n$/,"\n\n");if(wmd.options.autoFormatting.quote)chunk.before=chunk.before.replace(/(\n|^)[ ]{0,3}>[ \t]*\n$/,"\n\n");if(wmd.options.autoFormatting.code)chunk.before=chunk.before.replace(/(\n|^)[ \t]+\n$/,"\n\n");useDefaultText=false;if(/(\n|^)[ ]{0,3}([*+-])[ \t]+.*\n$/.test(chunk.before)){if(command.doList&&wmd.options.autoFormatting.list){command.doList(chunk,postProcessing,false,true);}}
|
|
if(/(\n|^)[ ]{0,3}(\d+[.])[ \t]+.*\n$/.test(chunk.before)){if(command.doList&&wmd.options.autoFormatting.list){command.doList(chunk,postProcessing,true,true);}}
|
|
if(/(\n|^)[ ]{0,3}>[ \t]+.*\n$/.test(chunk.before)){if(command.doBlockquote&&wmd.options.autoFormatting.quote){command.doBlockquote(chunk,postProcessing,useDefaultText);}}
|
|
if(/(\n|^)(\t|[ ]{4,}).*\n$/.test(chunk.before)){if(command.doCode&&wmd.options.autoFormatting.code){command.doCode(chunk,postProcessing,useDefaultText);}}};command.doBlockquote=function(chunk,postProcessing,useDefaultText){chunk.selection=chunk.selection.replace(/^(\n*)([^\r]+?)(\n*)$/,function(totalMatch,newlinesBefore,text,newlinesAfter){chunk.before+=newlinesBefore;chunk.after=newlinesAfter+chunk.after;return text;});chunk.before=chunk.before.replace(/(>[ \t]*)$/,function(totalMatch,blankLine){chunk.selection=blankLine+chunk.selection;return"";});var defaultText=useDefaultText?"Blockquote":"";chunk.selection=chunk.selection.replace(/^(\s|>)+$/,"");chunk.selection=chunk.selection||defaultText;if(chunk.before){chunk.before=chunk.before.replace(/\n?$/,"\n");}
|
|
if(chunk.after){chunk.after=chunk.after.replace(/^\n?/,"\n");}
|
|
chunk.before=chunk.before.replace(/(((\n|^)(\n[ \t]*)*>(.+\n)*.*)+(\n[ \t]*)*$)/,function(totalMatch){chunk.startTag=totalMatch;return"";});chunk.after=chunk.after.replace(/^(((\n|^)(\n[ \t]*)*>(.+\n)*.*)+(\n[ \t]*)*)/,function(totalMatch){chunk.endTag=totalMatch;return"";});var replaceBlanksInTags=function(useBracket){var replacement=useBracket?"> ":"";if(chunk.startTag){chunk.startTag=chunk.startTag.replace(/\n((>|\s)*)\n$/,function(totalMatch,markdown){return"\n"+markdown.replace(/^[ ]{0,3}>?[ \t]*$/gm,replacement)+"\n";});}
|
|
if(chunk.endTag){chunk.endTag=chunk.endTag.replace(/^\n((>|\s)*)\n/,function(totalMatch,markdown){return"\n"+markdown.replace(/^[ ]{0,3}>?[ \t]*$/gm,replacement)+"\n";});}};if(/^(?![ ]{0,3}>)/m.test(chunk.selection)){command.wrap(chunk,wmd_options.lineLength-2);chunk.selection=chunk.selection.replace(/^/gm,"> ");replaceBlanksInTags(true);chunk.addBlankLines();}
|
|
else{chunk.selection=chunk.selection.replace(/^[ ]{0,3}> ?/gm,"");command.unwrap(chunk);replaceBlanksInTags(false);if(!/^(\n|^)[ ]{0,3}>/.test(chunk.selection)&&chunk.startTag){chunk.startTag=chunk.startTag.replace(/\n{0,2}$/,"\n\n");}
|
|
if(!/(\n|^)[ ]{0,3}>.*$/.test(chunk.selection)&&chunk.endTag){chunk.endTag=chunk.endTag.replace(/^\n{0,2}/,"\n\n");}}
|
|
if(!/\n/.test(chunk.selection)){chunk.selection=chunk.selection.replace(/^(> *)/,function(wholeMatch,blanks){chunk.startTag+=blanks;return"";});}};command.doCode=function(chunk,postProcessing,useDefaultText){var hasTextBefore=/\S[ ]*$/.test(chunk.before);var hasTextAfter=/^[ ]*\S/.test(chunk.after);if((!hasTextAfter&&!hasTextBefore)||/\n/.test(chunk.selection)){chunk.before=chunk.before.replace(/[ ]{4}$/,function(totalMatch){chunk.selection=totalMatch+chunk.selection;return"";});var nLinesBefore=1;var nLinesAfter=1;if(/\n(\t|[ ]{4,}).*\n$/.test(chunk.before)||chunk.after===""){nLinesBefore=0;}
|
|
if(/^\n(\t|[ ]{4,})/.test(chunk.after)){nLinesAfter=0;}
|
|
chunk.addBlankLines(nLinesBefore,nLinesAfter);if(!chunk.selection){chunk.startTag=" ";chunk.selection=useDefaultText?"enter code here":"";}
|
|
else{if(/^[ ]{0,3}\S/m.test(chunk.selection)){chunk.selection=chunk.selection.replace(/^/gm," ");}
|
|
else{chunk.selection=chunk.selection.replace(/^[ ]{4}/gm,"");}}}
|
|
else{chunk.trimWhitespace();chunk.findTags(/`/,/`/);if(!chunk.startTag&&!chunk.endTag){chunk.startTag=chunk.endTag="`";if(!chunk.selection){chunk.selection=useDefaultText?"enter code here":"";}}
|
|
else if(chunk.endTag&&!chunk.startTag){chunk.before+=chunk.endTag;chunk.endTag="";}
|
|
else{chunk.startTag=chunk.endTag="";}}};command.doList=function(chunk,postProcessing,isNumberedList,useDefaultText){var previousItemsRegex=/(\n|^)(([ ]{0,3}([*+-]|\d+[.])[ \t]+.*)(\n.+|\n{2,}([*+-].*|\d+[.])[ \t]+.*|\n{2,}[ \t]+\S.*)*)\n*$/;var nextItemsRegex=/^\n*(([ ]{0,3}([*+-]|\d+[.])[ \t]+.*)(\n.+|\n{2,}([*+-].*|\d+[.])[ \t]+.*|\n{2,}[ \t]+\S.*)*)\n*/;var bullet="-";var num=1;var getItemPrefix=function(){var prefix;if(isNumberedList){prefix=" "+num+". ";num++;}
|
|
else{prefix=" "+bullet+" ";}
|
|
return prefix;};var getPrefixedItem=function(itemText){if(isNumberedList===undefined){isNumberedList=/^\s*\d/.test(itemText);}
|
|
itemText=itemText.replace(/^[ ]{0,3}([*+-]|\d+[.])\s/gm,function(_){return getItemPrefix();});return itemText;};chunk.findTags(/(\n|^)*[ ]{0,3}([*+-]|\d+[.])\s+/,null);if(chunk.before&&!/\n$/.test(chunk.before)&&!/^\n/.test(chunk.startTag)){chunk.before+=chunk.startTag;chunk.startTag="";}
|
|
if(chunk.startTag){var hasDigits=/\d+[.]/.test(chunk.startTag);chunk.startTag="";chunk.selection=chunk.selection.replace(/\n[ ]{4}/g,"\n");command.unwrap(chunk);chunk.addBlankLines();if(hasDigits){chunk.after=chunk.after.replace(nextItemsRegex,getPrefixedItem);}
|
|
if(isNumberedList==hasDigits){return;}}
|
|
var nLinesBefore=1;chunk.before=chunk.before.replace(previousItemsRegex,function(itemText){if(/^\s*([*+-])/.test(itemText)){bullet=re.$1;}
|
|
nLinesBefore=/[^\n]\n\n[^\n]/.test(itemText)?1:0;return getPrefixedItem(itemText);});if(!chunk.selection){chunk.selection=useDefaultText?"List item":" ";}
|
|
var prefix=getItemPrefix();var nLinesAfter=1;chunk.after=chunk.after.replace(nextItemsRegex,function(itemText){nLinesAfter=/[^\n]\n\n[^\n]/.test(itemText)?1:0;return getPrefixedItem(itemText);});chunk.trimWhitespace(true);chunk.addBlankLines(nLinesBefore,nLinesAfter,true);chunk.startTag=prefix;var spaces=prefix.replace(/./g," ");command.wrap(chunk,wmd_options.lineLength-spaces.length);chunk.selection=chunk.selection.replace(/\n/g,"\n"+spaces);};command.doHeading=function(chunk,postProcessing,useDefaultText){chunk.selection=chunk.selection.replace(/\s+/g," ");chunk.selection=chunk.selection.replace(/(^\s+|\s+$)/g,"");if(!chunk.selection){chunk.startTag="## ";chunk.selection="Heading";chunk.endTag=" ##";return;}
|
|
var headerLevel=0;chunk.findTags(/#+[ ]*/,/[ ]*#+/);if(/#+/.test(chunk.startTag)){headerLevel=re.lastMatch.length;}
|
|
chunk.startTag=chunk.endTag="";chunk.findTags(null,/\s?(-+|=+)/);if(/=+/.test(chunk.endTag)){headerLevel=1;}
|
|
if(/-+/.test(chunk.endTag)){headerLevel=2;}
|
|
chunk.startTag=chunk.endTag="";chunk.addBlankLines(1,1);var headerLevelToCreate=headerLevel==0?2:headerLevel-1;if(headerLevelToCreate>0){var headerChar=headerLevelToCreate>=2?"-":"=";var len=chunk.selection.length;if(len>wmd_options.lineLength){len=wmd_options.lineLength;}
|
|
chunk.endTag="\n";while(len--){chunk.endTag+=headerChar;}}};command.doHorizontalRule=function(chunk,postProcessing,useDefaultText){chunk.startTag="----------\n";chunk.selection="";chunk.addBlankLines(2,1,true);};};})();function setup_wmd(options){return new WMDEditor(options);}
|
|
Showdown={};Showdown.converter=function(){var g_urls;var g_titles;var g_html_blocks;var g_list_level=0;this.makeHtml=function(text){g_urls=[];g_titles=[];g_html_blocks=[];text=text.replace(/~/g,"~T");text=text.replace(/\$/g,"~D");text=text.replace(/\r\n/g,"\n");text=text.replace(/\r/g,"\n");text="\n\n"+text+"\n\n";text=_Detab(text);text=text.replace(/^[ \t]+$/mg,"");text=_HashHTMLBlocks(text);text=_StripLinkDefinitions(text);text=_RunBlockGamut(text);text=_UnescapeSpecialChars(text);text=text.replace(/~D/g,"$$");text=text.replace(/~T/g,"~");text=text.replace(/https?\:\/\/[^"\s<>]*[^.,;'">\:\s<>\)\]\!]/g,function(wholeMatch,matchIndex){var left=text.slice(Math.max(0,text.lastIndexOf('\n',matchIndex)),matchIndex);var right=text.slice(matchIndex);if(left.match(/<([a-z]+)\s[^>]+>?$/)&&right.match(/^[^>]*>/)){return wholeMatch;}
|
|
return"<a href='"+wholeMatch+"'>"+wholeMatch+"</a>";});text=text.replace(/[a-z0-9_\-+=.]+@[a-z0-9\-]+(\.[a-z0-9\-]+)+/ig,function(wholeMatch,m1,matchIndex){var left=text.slice(Math.max(0,text.lastIndexOf('\n',matchIndex)),matchIndex);if(left.match(/<([a-z]+)\s[^>]+>?$/)||left.match(/mailto\:$/)){return wholeMatch;}
|
|
return"<a href='mailto:"+wholeMatch+"'>"+wholeMatch+"</a>";});return text;};var _StripLinkDefinitions=function(text){text=text.replace(/^[ ]{0,3}\[(.+)\]:[ \t]*\n?[ \t]*<?(\S+?)>?[ \t]*\n?[ \t]*(?:(\n*)["(](.+?)[")][ \t]*)?(?:\n+)/gm,function(wholeMatch,m1,m2,m3,m4){m1=m1.toLowerCase();g_urls[m1]=_EncodeAmpsAndAngles(m2);if(m3){return m3+m4;}else if(m4){g_titles[m1]=m4.replace(/"/g,""");}
|
|
return"";});return text;};var _HashHTMLBlocks=function(text){text=text.replace(/\n/g,"\n\n");var block_tags_a="p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del";var block_tags_b="p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math";text=text.replace(/^(<(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del)\b[^\r]*?\n<\/\2>[ \t]*(?=\n+))/gm,hashElement);text=text.replace(/^(<(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math)\b[^\r]*?.*<\/\2>[ \t]*(?=\n+)\n)/gm,hashElement);text=text.replace(/(\n[ ]{0,3}(<(hr)\b([^<>])*?\/?>)[ \t]*(?=\n{2,}))/g,hashElement);text=text.replace(/(\n\n[ ]{0,3}<!(--[^\r]*?--\s*)+>[ \t]*(?=\n{2,}))/g,hashElement);text=text.replace(/(?:\n\n)([ ]{0,3}(?:<([?%])[^\r]*?\2>)[ \t]*(?=\n{2,}))/g,hashElement);text=text.replace(/\n\n/g,"\n");return text;};var hashElement=function(wholeMatch,m1){var blockText=m1;blockText=blockText.replace(/\n\n/g,"\n");blockText=blockText.replace(/^\n/,"");blockText=blockText.replace(/\n+$/g,"");blockText="\n\n~K"+(g_html_blocks.push(blockText)-1)+"K\n\n";return blockText;};var _RunBlockGamut=function(text){text=_DoHeaders(text);var key=hashBlock("<hr />");text=text.replace(/^[ ]{0,2}([ ]?\*[ ]?){3,}[ \t]*$/gm,key);text=text.replace(/^[ ]{0,2}([ ]?\-[ ]?){3,}[ \t]*$/gm,key);text=text.replace(/^[ ]{0,2}([ ]?\_[ ]?){3,}[ \t]*$/gm,key);text=_DoLists(text);text=_DoCodeBlocks(text);text=_DoBlockQuotes(text);text=_HashHTMLBlocks(text);text=_FormParagraphs(text);return text;};var _RunSpanGamut=function(text){text=_DoCodeSpans(text);text=_EscapeSpecialCharsWithinTagAttributes(text);text=_EncodeBackslashEscapes(text);text=_DoImages(text);text=_DoAnchors(text);text=_DoAutoLinks(text);text=_EncodeAmpsAndAngles(text);text=_ConvertExtraSpecialCharacters(text);text=_DoItalicsAndBold(text);text=text.replace(/ {2,}\n/g," <br />\n");return text;};var _EscapeSpecialCharsWithinTagAttributes=function(text){var regex=/(<[a-z\/!$]("[^"]*"|'[^']*'|[^'">])*>|<!(--.*?--\s*)+>)/gi;text=text.replace(regex,function(wholeMatch){var tag=wholeMatch.replace(/(.)<\/?code>(?=.)/g,"$1`");tag=escapeCharacters(tag,"\\`*_");return tag;});return text;};var _DoAnchors=function(text){text=text.replace(/(\[((?:\[[^\]]*\]|[^\[\]])*)\][ ]?(?:\n[ ]*)?\[(.*?)\])()()()()/g,writeAnchorTag);text=text.replace(/(\[((?:\[[^\]]*\]|[^\[\]])*)\]\([ \t]*()<?(.*?)>?[ \t]*((['"])(.*?)\6[ \t]*)?\))/g,writeAnchorTag);text=text.replace(/(\[([^\[\]]+)\])()()()()()/g,writeAnchorTag);return text;};var writeAnchorTag=function(wholeMatch,m1,m2,m3,m4,m5,m6,m7){if(m7===undefined)m7="";var whole_match=m1;var link_text=m2;var link_id=m3.toLowerCase();var url=m4;var title=m7;var blank_target=false;if(url===""){if(link_id===""){link_id=link_text.toLowerCase().replace(/ ?\n/g," ");}else{if(link_id[0]=="!"){blank_target=true;link_id=link_id.substr(1);}}
|
|
url="#"+link_id;if(g_urls[link_id]!==undefined){url=g_urls[link_id];if(g_titles[link_id]!==undefined){title=g_titles[link_id];}
|
|
if(url[0]=="!"){blank_target=true;url=url.substr(1);}}
|
|
else{if(whole_match.search(/\(\s*\)$/m)>-1){url="";}else{return whole_match;}}}else{if(url[0]=="!"){blank_target=true;url=url.substr(1);}}
|
|
url=escapeCharacters(url,"*_");var result="<a href=\""+url+"\"";if(title!==""){title=title.replace(/"/g,""");title=escapeCharacters(title,"*_");result+=" title=\""+title+"\"";}
|
|
if(blank_target){result+=" target=\"_blank\"";}
|
|
result+=">"+link_text+"</a>";return result;};var _DoImages=function(text){text=text.replace(/(!\[(.*?)\][ ]?(?:\n[ ]*)?\[(.*?)\])()()()()/g,writeImageTag);text=text.replace(/(!\[(.*?)\]\s?\([ \t]*()<?(\S+?)>?[ \t]*((['"])(.*?)\6[ \t]*)?\))/g,writeImageTag);return text;};var writeImageTag=function(wholeMatch,m1,m2,m3,m4,m5,m6,m7){var whole_match=m1;var alt_text=m2;var link_id=m3.toLowerCase();var url=m4;var title=m7;if(!title)title="";if(url===""){if(link_id===""){link_id=alt_text.toLowerCase().replace(/ ?\n/g," ");}
|
|
url="#"+link_id;if(g_urls[link_id]!==undefined){url=g_urls[link_id];if(g_titles[link_id]!==undefined){title=g_titles[link_id];}}
|
|
else{return whole_match;}}
|
|
alt_text=alt_text.replace(/"/g,""");url=escapeCharacters(url,"*_");var result="<img src=\""+url+"\" alt=\""+alt_text+"\"";title=title.replace(/"/g,""");title=escapeCharacters(title,"*_");result+=" title=\""+title+"\"";result+=" />";return result;};var _DoHeaders=function(text){text=text.replace(/^(.+)[ \t]*\n=+[ \t]*\n+/gm,function(wholeMatch,m1){return hashBlock("<h1>"+_RunSpanGamut(m1)+"</h1>");});text=text.replace(/^(.+)[ \t]*\n-+[ \t]*\n+/gm,function(matchFound,m1){return hashBlock("<h2>"+_RunSpanGamut(m1)+"</h2>");});text=text.replace(/^(\#{1,6})[ \t]*(.+?)[ \t]*\#*\n+/gm,function(wholeMatch,m1,m2){var h_level=m1.length;return hashBlock("<h"+h_level+">"+_RunSpanGamut(m2)+"</h"+h_level+">");});return text;};var _ProcessListItems;var _DoLists=function(text){text+="~0";var whole_list=/^(([ ]{0,3}([*+\-]|\d+[.])[ \t]+)[^\r]+?(~0|\n{2,}(?=\S)(?![ \t]*(?:[*+\-]|\d+[.])[ \t]+)))/gm;if(g_list_level){text=text.replace(whole_list,function(wholeMatch,m1,m2){var list=m1;var list_type=(m2.search(/[*+\-]/g)>-1)?"ul":"ol";list=list.replace(/\n{2,}/g,"\n\n\n");var result=_ProcessListItems(list);result=result.replace(/\s+$/,"");result="<"+list_type+">"+result+"</"+list_type+">\n";return result;});}else{whole_list=/(\n\n|^\n?)(([ ]{0,3}([*+\-]|\d+[.])[ \t]+)[^\r]+?(~0|\n{2,}(?=\S)(?![ \t]*(?:[*+\-]|\d+[.])[ \t]+)))/g;text=text.replace(whole_list,function(wholeMatch,m1,m2,m3){var runup=m1;var list=m2;var list_type=(m3.search(/[*+\-]/g)>-1)?"ul":"ol";list=list.replace(/\n{2,}/g,"\n\n\n");var result=_ProcessListItems(list);result=runup+"<"+list_type+">\n"+result+"</"+list_type+">\n";return result;});}
|
|
text=text.replace(/~0/,"");return text;};_ProcessListItems=function(list_str){g_list_level++;list_str=list_str.replace(/\n{2,}$/,"\n");list_str+="~0";list_str=list_str.replace(/(\n)?(^[ \t]*)([*+\-]|\d+[.])[ \t]+([^\r]+?(\n{1,2}))(?=\n*(~0|\2([*+\-]|\d+[.])[ \t]+))/gm,function(wholeMatch,m1,m2,m3,m4){var item=m4;var leading_line=m1;var leading_space=m2;if(leading_line||(item.search(/\n{2,}/)>-1)){item=_RunBlockGamut(_Outdent(item));}
|
|
else{item=_DoLists(_Outdent(item));item=item.replace(/\n$/,"");item=_RunSpanGamut(item);}
|
|
return"<li>"+item+"</li>\n";});list_str=list_str.replace(/~0/g,"");g_list_level--;return list_str;};var _DoCodeBlocks=function(text){text+="~0";text=text.replace(/(?:\n\n|^)((?:(?:[ ]{4}|\t).*\n+)+)(\n*[ ]{0,3}[^ \t\n]|(?=~0))/g,function(wholeMatch,m1,m2){var codeblock=m1;var nextChar=m2;codeblock=_EncodeCode(_Outdent(codeblock));codeblock=_Detab(codeblock);codeblock=codeblock.replace(/^\n+/g,"");codeblock=codeblock.replace(/\n+$/g,"");codeblock="<pre><code>"+codeblock+"\n</code></pre>";return hashBlock(codeblock)+nextChar;});text=text.replace(/~0/,"");return text;};var hashBlock=function(text){text=text.replace(/(^\n+|\n+$)/g,"");return"\n\n~K"+(g_html_blocks.push(text)-1)+"K\n\n";};var _DoCodeSpans=function(text){text=text.replace(/(^|[^\\])(`+)([^\r]*?[^`])\2(?!`)/gm,function(wholeMatch,m1,m2,m3,m4){var c=m3;c=c.replace(/^([ \t]*)/g,"");c=c.replace(/[ \t]*$/g,"");c=_EncodeCode(c);return m1+"<code>"+c+"</code>";});text=text.replace(/(^|[^\\])(\^{2})([^\r]*?[^\^]{2})\2(?!\^)/gm,function(wholeMatch,m1,m2,m3,m4){var c=m3;c=c.replace(/^([ \t]*)/g,"");c=c.replace(/[ \t]*$/g,"");c=_EncodeCode(c);return m1+"<sup>"+c+"</sup>";});text=text.replace(/(^|[^\\])(,{2})([^\r]*?[^,]{2})\2(?!,)/gm,function(wholeMatch,m1,m2,m3,m4){var c=m3;c=c.replace(/^([ \t]*)/g,"");c=c.replace(/[ \t]*$/g,"");c=_EncodeCode(c);return m1+"<sub>"+c+"</sub>";});text=text.replace(/(^|[^\\])(~T~T)([^\r]*?[^~]{2})\2(?!~)/gm,function(wholeMatch,m1,m2,m3,m4){var c=m3;c=c.replace(/^([ \t]*)/g,"");c=c.replace(/[ \t]*$/g,"");c=_EncodeCode(c);return m1+"<strike>"+c+"</strike>";});return text;};var _EncodeCode=function(text){text=text.replace(/&/g,"&");text=text.replace(/</g,"<");text=text.replace(/>/g,">");text=text.replace(/\u2026/g,'…').replace(/\u00AB/g,'«').replace(/\u00BB/g,'»').replace(/\u201C/g,'“').replace(/\u201D/g,'”').replace(/\u2018/g,'‘').replace(/\u2019/g,'’').replace(/\u2014/g,'—').replace(/\u2013/g,'–').replace(/\u2022/g,'•').replace(/\u2122/g,'™').replace(/\u00A9/g,'©').replace(/\u00AE/g,'®');text=escapeCharacters(text,"*_{}[]\\",false);return text;};var _DoItalicsAndBold=function(text){if(true){text=text.replace(/(\*\*)(?=\S)([^\r]*?\S[*]*)\1/g,"<strong>$2</strong>");text=text.replace(/(\w)_(\w)/g,"$1~E95E$2");text=text.replace(/(\*)(?=\S)([^\r]*?\S)\1/g,"<em>$2</em>");text=text.replace(/(_)(?=\S)([^\r]*?\S)\1/g,"<u>$2</u>");}else{text=text.replace(/(\*\*|__)(?=\S)([^\r]*?\S[*_]*)\1/g,"<strong>$2</strong>");text=text.replace(/(\w)_(\w)/g,"$1~E95E$2");text=text.replace(/(\*|_)(?=\S)([^\r]*?\S)\1/g,"<em>$2</em>");}
|
|
return text;};var _DoBlockQuotes=function(text){text=text.replace(/((^[ \t]*>[ \t]?.+\n(.+\n)*\n*)+)/gm,function(wholeMatch,m1){var bq=m1;bq=bq.replace(/^[ \t]*>[ \t]?/gm,"~0");bq=bq.replace(/~0/g,"");bq=bq.replace(/^[ \t]+$/gm,"");bq=_RunBlockGamut(bq);bq=bq.replace(/(^|\n)/g,"$1 ");bq=bq.replace(/(\s*<pre>[^\r]+?<\/pre>)/gm,function(wholeMatch,m1){var pre=m1;pre=pre.replace(/^ {2}/mg,"~0");pre=pre.replace(/~0/g,"");return pre;});return hashBlock("<blockquote>\n"+bq+"\n</blockquote>");});return text;};var _FormParagraphs=function(text){text=text.replace(/^\n+/g,"");text=text.replace(/\n+$/g,"");var i;var grafs=text.split(/\n{2,}/g);var grafsOut=[];var end=grafs.length;for(i=0;i<end;i++){var str=grafs[i];var p_tag='<p>';if(str.search(/~K(\d+)K/g)>=0){grafsOut.push(str);}
|
|
else if(str.search(/\S/)>=0){str=_RunSpanGamut(str);if(str.substr(0,2)==='->'){if(str.substr(-5)==='<-'){p_tag='<p align="center">';str=str.slice(2,-5);}else{p_tag='<p align="right">';str=str.substring(2);}}
|
|
str=str.replace(/\n/g,"<br />");str=str.replace(/^([ \t]*)/g,p_tag);str+="</p>";grafsOut.push(str);}}
|
|
end=grafsOut.length;for(i=0;i<end;i++){while(grafsOut[i].search(/~K(\d+)K/)>=0){var blockText=g_html_blocks[RegExp.$1];blockText=blockText.replace(/\$/g,"$$$$");grafsOut[i]=grafsOut[i].replace(/~K\d+K/,blockText);}}
|
|
return grafsOut.join("\n\n");};var _EncodeAmpsAndAngles=function(text){text=text.replace(/&(?!#?[xX]?(?:[0-9a-fA-F]+|\w+);)/g,"&");text=text.replace(/<(?![a-z\/?\$!])/gi,"<");text=text.replace(/\u2026/g,'…').replace(/\u00AB/g,'«').replace(/\u00BB/g,'»').replace(/\u201C/g,'“').replace(/\u201D/g,'”').replace(/\u2018/g,'‘').replace(/\u2019/g,'’').replace(/\u2014/g,'—').replace(/\u2013/g,'–').replace(/\u2022/g,'•').replace(/\u2122/g,'™').replace(/\u00A9/g,'©').replace(/\u00AE/g,'®');return text;};var _ConvertExtraSpecialCharacters=function(text){text=text.replace(/\.\.\./g,'…').replace(/\(c\)/g,'©').replace(/\(r\)/g,'®').replace(/\(tm\)/g,'™').replace(/\-\-/g,'—');return text;};var _EncodeBackslashEscapes=function(text){text=text.replace(/\\(\\)/g,escapeCharacters_callback);text=text.replace(/\\([`*_{}\[\]()>#+-.!])/g,escapeCharacters_callback);return text;};var _DoAutoLinks=function(text){text=text.replace(/(?:")<((https?|ftp|dict):[^'">\s]+)>/gi,"<a href=\"$1\">$1</a>");text=text.replace(/<(?:mailto:)?([\-.\w]+\@[\-a-z0-9]+(\.[\-a-z0-9]+)*\.[a-z]+)>/gi,function(wholeMatch,m1){return _EncodeEmailAddress(_UnescapeSpecialChars(m1));});return text;};var _EncodeEmailAddress=function(addr){function char2hex(ch){var hexDigits='0123456789ABCDEF';var dec=ch.charCodeAt(0);return(hexDigits.charAt(dec>>4)+hexDigits.charAt(dec&15));}
|
|
var encode=[function(ch){return"&#"+ch.charCodeAt(0)+";";},function(ch){return"&#x"+char2hex(ch)+";";},function(ch){return ch;}];addr="mailto:"+addr;addr=addr.replace(/./g,function(ch){if(ch=="@"){ch=encode[Math.floor(Math.random()*2)](ch);}else if(ch!=":"){var r=Math.random();ch=(r>0.9?encode[2](ch):r>0.45?encode[1](ch):encode[0](ch));}
|
|
return ch;});addr="<a href=\""+addr+"\">"+addr+"</a>";addr=addr.replace(/">.+:/g,"\">");return addr;};var _UnescapeSpecialChars=function(text){text=text.replace(/~E(\d+)E/g,function(wholeMatch,m1){var charCodeToReplace=parseInt(m1,10);return String.fromCharCode(charCodeToReplace);});return text;};var _Outdent=function(text){text=text.replace(/^(\t|[ ]{1,4})/gm,"~0");text=text.replace(/~0/g,"");return text;};var _Detab=function(text){text=text.replace(/\t(?=\t)/g," ");text=text.replace(/\t/g,"~A~B");text=text.replace(/~B(.+?)~A/g,function(wholeMatch,m1,m2){var leadingText=m1;var numSpaces=4-leadingText.length%4;for(var i=0;i<numSpaces;i++)leadingText+=" ";return leadingText;});text=text.replace(/~A/g," ");text=text.replace(/~B/g,"");return text;};var escapeCharacters=function(text,charsToEscape,afterBackslash){var regexString="(["+charsToEscape.replace(/([\[\]\\])/g,"\\$1")+"])";if(afterBackslash){regexString="\\\\"+regexString;}
|
|
var regex=new RegExp(regexString,"g");text=text.replace(regex,escapeCharacters_callback);return text;};var escapeCharacters_callback=function(wholeMatch,m1){var charCodeToEscape=m1.charCodeAt(0);return"~E"+charCodeToEscape+"E";};}; |