/* Common objects :*/ /* row in a list (
  • )*/ function listEntry(nr,rawcontent,content,level ) { this.rawcontent=rawcontent; this.content=content; this.level=level; this.nr=nr; this.listType=""; this.parent=0; this.getListType = function () { return this.rawcontent.substr(this.level-1,1); } } /*internal wiki link */ function internalHyperlink(rawcontent,a_prefix, a_href, a_chapter, a_caption ,internalHyperlinks) { this.rawcontent=rawcontent; this.a_prefix=a_prefix; this.a_href=a_href; this.a_chapter=a_chapter; this.a_caption=a_caption; this.renderInternalHyperLink = function () { var ret=""; if(a_chapter!="") a_chapter="#"+a_chapter; switch (a_prefix) { case "bild": ret+=renderImage(a_href,a_caption,internalHyperlinks); break; case "image": ret+=renderImage(a_href,a_caption,internalHyperlinks); break; case "kategorie": ret+="Kategorie:"+a_caption+""; break; default: //normal hyperlink: ret+=createStartTag("a","href",a_href+a_chapter); if(a_caption=="") ret+=mwLink2Name(a_href); else ret+=a_caption; ret+=createEndTag("a"); break; } return ret; } } /* templates can have options (properties delimited by | ) */ function templateUsed(nr,templateName,templateParams,internalHyperlinks ) { this.nr=nr; this.templateName=templateName; this.templateParams=templateParams; var templateParamArray = templateParams.split(/\|/); var paramCount=templateParamArray.length; var templateOptionName= new Array(paramCount); var templateOptionValue= new Array(paramCount); for(var k=0;k < templateParamArray.length;k++) { var templateOptionDelim=templateParamArray[k].indexOf("="); templateOptionName[k]=""; templateOptionValue[k]=""; if(templateOptionDelim==-1) { templateOptionName[k]=""; templateOptionValue[k]=templateParamArray[k].trim(); } else { templateOptionName[k]=templateParamArray[k].substr(0,templateOptionDelim).trim(); templateOptionValue[k]=templateParamArray[k].substr(templateOptionDelim+1).trim(); } } this.renderTemplate = function () { var ret=""; switch(templateName) { case "ImageTile": ret+=""; if(templateOptionName[0] && templateOptionName[0]=="imgsrc") { ret+=""+templateOptionValue[0].trim(); ret+=""; } if(templateOptionName[1] && templateOptionName[1]=="link" && templateOptionValue[1].trim()!="") { ret+=""+templateOptionValue[1].trim(); var newLink = new internalHyperlink("","", templateOptionValue[1], "", templateOptionValue[1],internalHyperlinks); if(newLink) { internalHyperlinks.push(newLink); //ret+=newLink.renderInternalHyperLink() ; } ret+=""; } if(templateOptionValue[2] && templateOptionValue[2] !="") { caption=templateOptionValue[2]; ret+=""+caption; if(templateOptionName[1] && templateOptionName[1]=="href" && templateOptionValue[1].trim()!="") { var newLink = new internalHyperlink("","", templateOptionValue[1].trim(), "", caption,internalHyperlinks); internalHyperlinks.push(newLink); //ret+=newLink.renderInternalHyperLink() ; } ret+=""; } ret+=""; if(templateOptionName[0] && templateOptionName[0]=="imgsrc") { //register the image src: var newLink = new internalHyperlink("","image", templateOptionValue[0], "", caption,internalHyperlinks); internalHyperlinks.push(newLink); } break; case "Article_img_left": ret+=""; for(var i=0; i < templateOptionName.length;i++) { if(templateOptionName[i]=="imgsrc") { ret+=""+templateOptionValue[i].trim(); ret+=""; } if(templateOptionName[i]=="link") { ret+=""; ret+=templateOptionValue[i]; ret+=""; var newLink = new internalHyperlink("","", templateOptionValue[i].trim(), "", "",internalHyperlinks); internalHyperlinks.push(newLink); } if(templateOptionName[i]=="text") { ret+=""; ret+=templateOptionValue[i]; ret+=""; } } ret+=""; //register the image src: var newLink = new internalHyperlink("","image", templateOptionValue[0], "", templateOptionValue[0],internalHyperlinks); internalHyperlinks.push(newLink); break; case "drawio": var imageFile=this.templateParams+".png"; ret+="imgsrc"+imageFile+""; ret+=""; if(this.templateParams !="") { //register the image src: var newLink = new internalHyperlink("","image", imageFile, "", this.templateParams,internalHyperlinks); internalHyperlinks.push(newLink); } break; case "CardWithImgHeaderandFooter": ret+=""; for(var i=0; i < templateOptionName.length;i++) { if(templateOptionName[i]=="imgsrc") { ret+=""+templateOptionValue[i].trim(); ret+=""; } if(templateOptionName[i]=="link") { ret+=""; ret+=wikiLink2Xml(templateOptionValue[i],internalHyperlinks); ret+=""; } if(templateOptionName[i]=="title") { ret+=""; ret+=templateOptionValue[i]; ret+=""; } if(templateOptionName[i]=="subtitle") { ret+=""; ret+=templateOptionValue[i]; ret+=""; } /*if(templateOptionName[i]=="link1") { ret+=""; ret+=templateOptionValue[i]; ret+=""; } if(templateOptionName[i]=="link2") { ret+=""; ret+=templateOptionValue[i]; ret+=""; }*/ if(templateOptionName[i]=="content") { ret+=""; ret+=templateOptionValue[i]; ret+=""; } } ret+=""; //register the image src: //var newLink = new internalHyperlink("","image", templateOptionValue[0], "", templateOptionValue[0],internalHyperlinks); //internalHyperlinks.push(newLink); break; default: if(templateName.indexOf(" ") > -1) templateName=templateName.replace(" ","_"); ret+="<"+templateName+">"; if(templateParams.indexOf("[[") ==-1) { for(var k=0;k < templateParamArray.length;k++) { ret+=""; ret+=""+templateOptionName[k]+""; ret+=""+templateOptionValue[k]+""; ret+=""; if(templateOptionName[k].trim()=="link") { var newLink = new internalHyperlink("","", templateOptionValue[k].trim(), "", templateOptionValue[k].trim(),internalHyperlinks); internalHyperlinks.push(newLink); } } } else ret+=templateParams+"\n"; ret+=""; break; } ret+=""; return ret; } } /* passages in a tag, are excluded prior to transformation. */ function nowikiPassage(nr,content) { this.content=content; this.nr=nr; this.renderContent = function () { var ret=renderHtmlEntities(this.content); return ret; } } /* "+this.getAnchor()+this.name+""; return ret; }; this.getAnchor = function () { var ret=""; ret+=""; return ret; } } /* inline wiki formatting, e.g. italics*/ function inlineTag(mwsyntax,htmlsyntax ) { this.mwsyntax=mwsyntax; this.htmlsyntax=htmlsyntax; } /* Whole wiki Model*/ var wikiModel = function(mw) { var wikiHtml=""; var nowikiPassages=[]; var internalHyperlinks= []; var headers=[]; var inlineTags= []; var templatesUsed= []; var counterPerLevel=[]; initInlineTags(inlineTags); //First exclude all nowiki passages since they are to be ignored: wikiHtml=maskNowiki(mw,nowikiPassages); wikiHtml=removeComments(wikiHtml); //then identify all REAL xml tags and replace non-xml-"<>" with html entities wikiHtml=parseXmlTags(wikiHtml); //then parse the chapters and fill the headers array wikiHtml=mwChaptersParser(wikiHtml,headers); //then go through the document and identify the sections (lists, tables etc.) //and render them to html wikiHtml=mwTemplatesParser(wikiHtml,templatesUsed,internalHyperlinks); //then sections: wikiHtml=mwSectionsParser(wikiHtml,internalHyperlinks,templatesUsed); //after all paragraph level transformations //the inline tags are replaced, incl. hyperlinks wikiHtml=replaceInlineTags(wikiHtml,inlineTags,internalHyperlinks,templatesUsed); //finally, reinsert all nowiki Passages wikiHtml=reinsertNowiki(wikiHtml,nowikiPassages); //serialize Arrays: var finalChar=-1; var headersStr=""; var headersLevelsStr=""; for (var i=0;i-1) headersStr=headersStr.substring(0,finalChar); finalChar=headersLevelsStr.lastIndexOf("^"); if(finalChar>-1) headersLevelsStr=headersLevelsStr.substring(0,finalChar); var internalHyperlinksStr=""; for (var i=0;i-1) internalHyperlinksStr=internalHyperlinksStr.substring(0,finalChar); var templatesUsedStr=""; var templateOptionsStr=""; for (var i=0;i-1) templateOptionsStr=templateOptionsStr.substring(0,finalChar); return { wikiSrc: mw, wikiHtml: wikiHtml, headersStr:headersStr, headersLevelsStr:headersLevelsStr, internalHyperlinksStr:internalHyperlinksStr, templateOptionsStr:templateOptionsStr }; }; /* main function that transforms an input string in MediaWiki notation to xhtml */ function mw2xhtml(mw) { var newWikiModel = new wikiModel(mw); return newWikiModel.wikiHtml; } /* parse the wiki source for headings they are transformed to HTML headers and saved in an array for later purposes. */ function mwChaptersParser(mwlines,headers) { var ret=""; var startTag=""; var prevStartTag=""; var lines = (typeof mwlines == 'string')? mwlines.replace(/\r/g,'').split(/\n/): mwlines; // lines mw var rownr = lines.length; var headerTag=""; for(var i=0;i

    "; } else { mwSectionsParserOutput+="
    "+lines[i].substr(1,ddlistDelim)+"
    \n"; mwSectionsParserOutput+="
    "+lines[i].substr(ddlistDelim+1)+"
    \n"; } break; case "<": if(iInSection==false) { iInSection=true; sectionStartLine=i; sectionEndLine=getSectionEndDelim(lines,sectionStartLine,lines.length,">"); if(lines[i].indexOf(""); mwSectionsParserOutput+=getSource(lines,sectionStartLine,sectionEndLine); } else if(lines[i].indexOf(""); mwSectionsParserOutput+=getGallery(lines,sectionStartLine,sectionEndLine,internalHyperlinks); } else if(lines[i].indexOf(""); for(var j=i;j<=sectionEndLine;j++) { mwSectionsParserOutput+=lines[j]+"
    "; } } else mwSectionsParserOutput+=lines[i]+"\n"; i=sectionEndLine; iInSection=false; } break; default: if(!iInSection) { if(startTag !="<") mwSectionsParserOutput+="

    "+lines[i]+"

    \n"; else mwSectionsParserOutput+=lines[i]+"\n"; } break; } } return mwSectionsParserOutput; //mwSectionsParser(mwSectionsParserOutput); } /* identify the line where a section ends. In lists or preformatted sections it's the first occurence of a diferent character beginning a line*/ function getSectionEndLine(lines, sectionStartLine,sectionType) { var rownr = lines.length; var endLineFound=false; var getSectionEndLine=sectionStartLine; for(var i=sectionStartLine+1;i-1) { sectionEndDelim=i; endLineFound=true; } } } return sectionEndDelim; } /* transform preformatted sections to
     Sections */
    function getPreformatted(lines, sectionStartLine,sectionEndLine)
    {
    	var getPreformattedOutput="
    ";
    	//alert(sectionStartLine+" "+sectionEndLine);
    	for(var i=sectionStartLine;i<=sectionEndLine;i++)
    	{
    		getPreformattedOutput+=lines[i].trim()+"\n";
    		
    	}
    	getPreformattedOutput+="
    \n"; return getPreformattedOutput; } /* load a template into a content string, and transform it. Result ist a simple dt/dd list with properties TODO: load the real wiki template */ function getTemplate(wikitext, sectionStart,sectionEnd,templatesUsed,internalHyperlinks) { var ret=""; var content=wikitext.substring(sectionStart+2,sectionEnd); var templateName=getTemplateName(content).trim(); var startParams=content.indexOf("|"); if(startParams==-1) startParams=content.indexOf(":"); //Wiki quellcode sample: // {{#navigation:searchStudyStudies}} //becomes: searchStudyStudies if(content.indexOf("[[")>-1 || startParams==-1) { myNewTemplate=new templateUsed(0,templateName,content.substr(templateName.length+1),internalHyperlinks); templatesUsed.push(myNewTemplate); } else { var templateParams = content.substr(startParams+1); myNewTemplate=new templateUsed(0,templateName,templateParams,internalHyperlinks); templatesUsed.push(myNewTemplate); } return myNewTemplate.renderTemplate(); } /* get the first Word, delimited by " " or "|"*/ function getTemplateName(str) { var returnTemplateName=""; var templateNameEnd=-1; var i=0; var endFound=false; do{ var myChar=str.substr(i,1); if(myChar=="|" || myChar=="\n"|| myChar==":") { endFound=true; templateNameEnd=i; } else i++; } while (endFound==false && i<=str.length); if(templateNameEnd==-1) templateNameEnd=str.length; if(str.substr(0,1)=="#") returnTemplateName=str.substr(1,templateNameEnd-1); else returnTemplateName=str.substr(0,templateNameEnd); return returnTemplateName; } function getTemplateClass(templateName) { var ret=""; ret=searchReplace(templateName, " ","_").toLowerCase(); return ret; } /* render a template to a dt/dd list */ function renderTemplate_old(templateName,myNewOption) { //simplified output of Templates: var ret=""; /*switch(templateName) { case "Hinweis": ret+="
    "; ret+=""; for(var i=0;i < templateOptions.length;i++) { if(templateOptions[i].value=="") ret+="\n"; else ret+="\n"; } ret+="
    Hinweis"+templateOptions[i].name+""+templateOptions[i].name+": "+templateOptions[i].value+"
    "; break; case "#navigation": switch(templateOptions){ case "standardReportsHisinone_administrate_bia": ret+="Standardberichte "; break; case "standardReportsHisinonebi": ret+="Abfragen "; default: ret+="Navigation:"+templateOptions+" "; break; } break; default: ret+="
    "+templateName+"
    \n"; for(var i=0;i < templateOptions.length;i++) { if(templateOptions[i].value=="") ret+="
    "+templateOptions[i].name+"
    \n"; else ret+="
    "+templateOptions[i].name+": "+templateOptions[i].value+"
    \n"; } break; } */ var ret=""; return ret; } /* identify sections ... ... HTML */ function getSource(lines, sectionStartLine,sectionEndLine) { var ret="
    "; } function getGallery(lines, sectionStartLine,sectionEndLine,internalHyperlinks) { var ret=""; var startGallery=lines[sectionStartLine].indexOf(">"); ret+=lines[sectionStartLine].substr(0,startGallery+1); //wenn source Element in gleicher Zeile beendet wird: if(sectionStartLine==sectionEndLine) { if(startGallery >-1) { var endGallery=lines[sectionEndLine].indexOf(""); if(endGallery >-1) ret+=getGalleryImage(lines[sectionEndLine].substr(startGallery,endGallery),internalHyperlinks); else ret+=getGalleryImage(lines[sectionEndLine].substr(startGallery),internalHyperlinks); } else ret+=lines[sectionEndLine]; } else { //Gallery über mehrere Zeilen: if(startGallery >-1) ret+=getGalleryImage(lines[sectionStartLine].substr(startGallery+1),internalHyperlinks); else ret+=getGalleryImage(lines[sectionStartLine],internalHyperlinks); for(var i=sectionStartLine+1;i< sectionEndLine;i++) { ret+=getGalleryImage(lines[i],internalHyperlinks)+"\n"; } var endGallery=lines[sectionEndLine].indexOf(""); if(endGallery >-1) ret+=lines[sectionEndLine].substr(0,endGallery); else ret+=lines[sectionEndLine]; } return ret+""; } function getGalleryImage(str,internalHyperlinks) { var ret=""; if(str.trim() !="") { ret+=""; var a_prefix="image"; var a_caption="Bild"; var a_href=""; var imgsrc=""; var remStr=""; if(str.indexOf("|") >-1) { var imgparams = str.split(/\|/); for(var k=0;k < imgparams.length;k++) { if(k==0) imgsrc=imgparams[k]; if(k==1) a_caption=imgparams[k]; if(k==2 && imgparams[k].indexOf("link=")>-1) a_href=imgparams[k].substr(5); } } else { imgsrc=str; } ret+=""+ imgsrc+""; var newLink = new internalHyperlink("",a_prefix, imgsrc, "", a_caption,internalHyperlinks); internalHyperlinks.push(newLink); if(a_href!="") { var newLink2 = new internalHyperlink("","", a_href, "", a_caption); internalHyperlinks.push(newLink2); ret+=""+a_href+""; } else ret+=""+imgsrc+""; if(a_caption.trim() !="") { ret+=""; ret+=a_caption.trim(); ret+=""; } ret+=""; } return ret; } /*render a wiki table to HTML TODO: collapsed cells, cell formatting, table captions*/ function getTable(lines, sectionStartLine,sectionEndLine,internalHyperlinks,templatesUsed) { var ret=""; i++ srcRow=lines[i]; } // first |- is optional if(srcRow.trim()=="|-" ) { i++; srcRow=lines[i]; } ret+=""; if(srcRow.substr(0,1)=="!" ) { //table header var endTrRow=getSectionEndDelim(lines,i,sectionEndLine,"|-")-1; if(endTrRow==-2) endTrRow=sectionEndLine; var trContent=""; for(var k=i;k<= endTrRow;k++) { var str=lines[k]; //duplicate ! if ! in first Col: if(str.substr(0,1)=="!") str="!"+str.trim(); trContent+=str.trim()+"\n"; } var cols = trContent.split(/!!/); var thContent=""; //first elem. of List is emtpy, ignored: for(var k=1;k < cols.length;k++) { thContent=cols[k].trim(); ret+=""+thContent.trim()+""; } i=endTrRow; ret+="\n"; } else { //normal table row, no header: var endTrRow=getSectionEndDelim(lines,i,sectionEndLine,"|-")-1; if(endTrRow==-2) endTrRow=sectionEndLine; var trContent=""; var startTrRow=i; for(var k=i;k<= endTrRow;k++) { var str=lines[k]; if(str.trim()=="") { //ignore empty lines startTrRow++; } else { str=str.replace(/\|\|/g,""); if(str.substr(0,1)=="|") trContent+=""+str.substr(1).trim(); else trContent+="\n"+str.trim(); } } //Cols can be separated by | and || (inline): var cols = trContent.split(""); //first elem. of List is emtpy, ignored: for(var k=1;k < cols.length;k++) { tdContent=cols[k].trim(); if(stringStartsWith(tdContent,"style=") || stringStartsWith(tdContent,"colspan=") ) { tdStyle=tdContent; k++; } else tdStyle=""; ret+=""+getTableCell(cols[k],internalHyperlinks,templatesUsed)+""; } ret+="\n"; i=endTrRow; } } ret+="\n"; return ret; } /* render a table cell. It can contain wiki sections like lists etc., therefore call the getSection Function before rendering the content. */ function getTableCell(str,internalHyperlinks,templatesUsed) { var ret=""; var tdContent=str.trim(); //if(tdContent.substr(0,1)=="|") // tdContent=tdContent.substr(1).trim(); ret=mwSectionsParser(tdContent,internalHyperlinks,templatesUsed); return ret; } /* transform a wiki list to an array of listEntries rendering is quite complicated, because of recursive calls. */ function getList(lines, sectionStartLine,sectionEndLine,listType) { var getListOutput=""; var listEntries= []; listEntries=getListEntries(lines, sectionStartLine,sectionEndLine,listType,listEntries); getListOutput+=getListMarkup(listEntries,-1); return getListOutput; } /*Transform listEntries into HTML:*/ function getListMarkup(listEntries,parent) { var listLength=listEntries.length; var getListMarkupOutput=""; var isFirstElem=true; var listType=""; var firstElemListType=""; var previousElemListType=""; /*if(parent==-1) { listType=listEntries[0].getListType(); previousElemListType=listType; getListMarkupOutput+="<"+getListElement(listType)+">\n"; }*/ //init for(var i=0;i\n"; isFirstElem=false; } if(previousElemListType != listType) { getListMarkupOutput+="\n"; previousElemListType=listType; getListMarkupOutput+="<"+getListElement(listType)+">\n"; } getListMarkupOutput+="
  • "+listEntries[i].content; getListMarkupOutput+=getListMarkup(listEntries,i); getListMarkupOutput+="
  • \n"; } } //Last Element only closed if content if(getListMarkupOutput != "") getListMarkupOutput+="\n"; /*if(parent==-1) getListMarkupOutput+="\n";*/ //else // getListMarkupOutput+="\n"; return getListMarkupOutput; } /*Convert list into an array :*/ function getListEntries(lines, sectionStartLine,sectionEndLine,listType,listEntries) { var getListOutput=""; var counter=0; for(var i=sectionStartLine;i<=sectionEndLine;i++) { counter++; listEntries.push(new listEntry(counter,lines[i],getListEntryContent(lines[i]),getListEntryLevel(lines[i]) )); } //parent ermitteln: for(var i=0;i=0;k--) { if(k >= 0) { currLevel=listEntries[i].level; prevLevel=listEntries[k].level; if(prevLevel < currLevel && parent==-1) parent=k; } } return parent; } function getListElement(listType) { var listElement=""; switch (listType) { case "*": listElement="ul"; break; case "#": listElement="ol"; break; default: listElement=""; break; } return listElement; } /* obsolete: function mwLinesParser(mwlines) { var mwLinesParserOutput=""; var startTag=""; var prevStartTag=""; var lines = (typeof mwlines == 'string')? mwlines.replace(/\r/g,'').split(/\n/): mwlines; // lines mw var rownr = lines.length; var headerTag=""; for(var i=0;i-1) { remStr=str.substr(level); content=remStr.substr(0,remStr.length-level); /* TODO: number=getHeaderNumber(headersCount,headers); parent=... parent_level=... previous_level=... counterPerLevel[]++; */ headersCount++; var newHeader = new header(headersCount,content, level, number); headers.push(newHeader); ret+=newHeader.renderHeader(); } else ret=str; return ret; } function getHeaderNumber(currentHeader,headers) { } /* inline tags like '' are simply replaced by HTML notations. It gets more complicated with hyperlinks [[ */ function replaceInlineTags(str,inlineTags,internalHyperlinks,templatesUsed) { var ret=str; for (var i=0;i> doesn't work yet */ function parseXmlTags(str) { var ret=""; var strlines = str.replace(/\r/g,'').split(/\n/); var rownr = strlines.length; for(var i=0;i-1) { while(foundPos >-1) { var endTag=line.indexOf(">"); if(endTag==-1) { //no valid xml, therefore replace: ret+=line.substr(offset,foundPos)+"<"+line.substr(foundPos+1); line=line.substr(foundPos+1); } else { // var prefix=line.substr(0,endTag); var suffix=line.substr(endTag+1); var xmltest=line.slice(foundPos,endTag+1); var isxml=false; //if there is a space character and no ", and no emtpy XML Tag, then it's no xml if(xmltest=="" || (xmltest.indexOf(" ")>-1 && xmltest.indexOf("\"")==-1 && !stringEndsWith(xmltest.trim()," />"))) { isxml=false; //no valid xml, therefore replace: ret+=prefix+xmltest.replace(//g,">") ; //++suffix line.substr(foundPos+1); line=line.substr(endTag+1); } else { //this is an xml Tag, therefore no replace: ret+=line.substr(0,endTag+1); line=line.substr(endTag+1); foundPos=line.indexOf("<"); if(foundPos==-1) ret+=suffix+"\n"; } } foundPos=line.indexOf("<"); } } else ret+=line; ret+="\n"; } return ret; } /* replace a single inline tag */ function replaceInlineTag(str,searchtag,replacetag) { var ret=""; var foundPos=-1; var remStr=""; foundPos=str.indexOf(searchtag); if(foundPos>-1) { ret+=str.substr(0,foundPos)+createStartTag(replacetag,"",""); remStr=str.substring(foundPos+searchtag.length); foundPos=remStr.indexOf(searchtag); if(foundPos>-1) { ret+=remStr.substr(0,foundPos)+createEndTag(replacetag); ret+=remStr.substr(foundPos+searchtag.length); } else //EndTag existiert nicht: ret+=remStr; //Rekursion: ret=replaceInlineTag(ret,searchtag,replacetag); } else ret=str; return ret; } function parseInlineTemplates(str,templatesUsed) { var ret=""; var templateName=""; var templateValues=""; //TODO var ret2=""; var templateStart=str.indexOf("{{"); if(templateStart !=-1) { ret+=str.substr(0,templateStart); var templateEnd=str.indexOf("}}"); if(templateEnd==-1) { templateEnd=str.length; ret2=""; } else ret2=str.substr(templateEnd+2); templateName=getTemplateName(str.substring(templateStart+2,templateEnd)); templateValues=str.substring(templateStart+3+templateName.length,templateEnd); templatesUsed.push(new templateOption(0,templateName,"",templateValues)); ret+= renderTemplate(templateName,templateOptions)+ret2; return parseInlineTemplates(ret,templatesUsed); } else return str; } /* hyperlinks are quite difficult to transform First internal links enclosed in [...] are identified. Then URLs starting with http... are directly transformed to external links Then external links enclosed in [[...]] are transformed. The order is important. */ function parseHyperlinks(str,internalHyperlinks) { var ret=""; ret=parseInternalLinks(str,internalHyperlinks); ret=parseEmbeddedHyperlink(ret); ret=parseExternalHyperlink(ret); //ret=parseHyperlink(ret,"[","]"," "); //ret=parseHyperlinks(ret); return ret; } /* URLs starting with http... are directly transformed to external links */ function parseEmbeddedHyperlink(str) { var ret=""; var a_href=""; var lastFound=0; var foundPos=str.indexOf("http",lastFound); if(foundPos==-1) return str; do{ ret+=str.substring(lastFound,foundPos); var previousChar=""; var nextChars=""; if(foundPos>0) previousChar=str.substr(foundPos-1,1); if(str.length >foundPos+7) nextChars=str.substr(foundPos+3,5); //should entail "//" as in "https://" if(previousChar !="[" && previousChar !="\"" && nextChars.indexOf("//")>-1 ) { var href_end=getHrefEnd(str,foundPos); if(href_end==-1) { //Link to EOL: a_href=str.substr(foundPos); href_end=str.length; } else { a_href=str.substring(foundPos,href_end); lastFound=href_end; } ret+=""+a_href+""; } else { //not a valid Hyperlink with http://... ret+=str.substr(foundPos,1); lastFound=foundPos+1; } foundPos=str.indexOf("http",lastFound+1); if(foundPos ==-1) ret+=str.substr(lastFound); } while (foundPos >-1); return ret; } /* External links enclosed in [...] are transformed. */ function parseExternalHyperlink(str) { var ret=""; var foundPos=str.indexOf("["); if(foundPos>-1) { var remStr=""; var a_href=""; var a_name=""; ret+=str.substr(0,foundPos); remStr=str.substr(foundPos+1); var linkEnd=remStr.indexOf("]"); //delimiter for external Links can either be "|" or " ": if(linkEnd>-1) foundPos=remStr.substr(0,linkEnd).indexOf("|"); else foundPos=remStr.indexOf("|"); if(foundPos==-1) foundPos=remStr.indexOf(" "); if(foundPos>linkEnd || foundPos==-1) { //this is no external Link: ret+= "__#bracketOpen#__"+remStr.substr(0,linkEnd)+"__#bracketClosed#__"+remStr.substr(linkEnd+1); } else { if(foundPos>-1) { a_href=remStr.substr(0,foundPos).trim(); remStr=remStr.substr(foundPos+1); foundPos=remStr.indexOf("]"); if(foundPos>-1) { a_name=remStr.substr(0,foundPos).trim(); remStr=remStr.substr(foundPos+1); } else { a_name=mwLink2Name(a_href); remStr=""; } } else { //no caption foundPos=remStr.indexOf("]"); if(foundPos>-1) { a_href=remStr.substr(0,foundPos).trim(); remStr=remStr.substr(foundPos+1); } a_name=mwLink2Name(a_href); } //normal link: ret+=createStartTag("a","href",a_href); ret+=a_name; ret+=createEndTag("a"); ret+=remStr; } ret=parseExternalHyperlink(ret); } else ret=str; return ret; } /* internal links enclosed in [...] are transformed and saved in an array for later purposes */ function parseInternalLinks(str,internalHyperlinks) { var ret=""; var foundPos=str.indexOf("[["); if(foundPos>-1) { var remStr=""; var myLink=""; var a_href=""; var a_caption=""; var a_chapter=""; var a_prefix=""; ret+=str.substr(0,foundPos); remStr=str.substr(foundPos+2); foundPos=remStr.indexOf("]]"); if(foundPos != -1) { myLink=remStr.substr(0,remStr.indexOf("]]")); remStr=remStr.substr(remStr.indexOf("]]")+2); } else { //no endTag ->stop Link parsing return ret+"[["+ remStr; } ret+=parseInternalLink(myLink,internalHyperlinks)+remStr; ret=parseInternalLinks(ret,internalHyperlinks); } else ret=str; return ret; } /* recursive call of internal Links transformation */ function parseInternalLink(str,internalHyperlinks) { var ret=""; var remStr=""; var a_href=""; var a_caption=""; var a_chapter=""; var a_prefix=""; if(str.indexOf(":") >-1) { a_prefix=str.substr(0,str.indexOf(":")); remStr=str.substr(str.indexOf(":")+1).trim(); } else remStr=str; switch (a_prefix.toLowerCase()) { case "kategorie": a_caption=remStr; break; default: foundPos=remStr.indexOf("|"); if(foundPos>-1) { //piped link a_href=remStr.substr(0,foundPos).trim(); a_caption=remStr.substr(foundPos+1).trim(); } else a_href=remStr; foundPos=a_href.indexOf("#"); if(foundPos>-1) { a_chapter=a_href.substr(a_href.indexOf("#")+1); a_href=a_href.substr(0,a_href.indexOf("#")); } break; } //Keine Leerzeichen in Links: if(a_href.indexOf(" ")>0) a_href=a_href.replace(/ /g,"_"); //now we've got all attributes: var newLink = new internalHyperlink(str,a_prefix.toLowerCase(), a_href, a_chapter, a_caption,internalHyperlinks); internalHyperlinks.push(newLink); ret=newLink.renderInternalHyperLink(); return ret; } /* images are special types of internal links rendering takes place here */ function renderImage(imgsrc,options,internalHyperlinks) { //options are separated by pipe, the last option is the caption var ret=""; var remStr=""; var optionsArray = options.split("|"); var lastRow = optionsArray.length-1; var imgAttributes="border=\"0\" "; var imgCaption=imgsrc; var a_href=imgsrc; for(var i=0;i<=lastRow;i++) { var option=optionsArray[i]; if(option== "border") { imgAttributes += " class=\"thumbborder\" "; } if(i==lastRow && option.indexOf("=")==-1) imgCaption=option; if(option.indexOf("px") !=-1) { var size1=""; var size2=""; var width=""; var height=""; var size=option.substr(0,option.indexOf("px")); if(size.indexOf("x")==0) { //only height defined: height=size.substr(1); imgAttributes += " height=\""+height+"px\""; } if(size.indexOf("x")==-1) { //only width defined: width=size.substr(0); imgAttributes += " width=\""+width+"px\""; } if(size.indexOf("x")>0) { //width and height defined: var delim=size.indexOf("x"); width=size.substr(0,delim); imgAttributes += " width=\""+width+"px\""; height=size.substr(delim+1); imgAttributes += " height=\""+height+"px\""; } } if(option.indexOf("link=") !=-1) { a_href=option.substr(option.indexOf("=")+1); var newLink = new internalHyperlink("","", a_href, "", a_href,internalHyperlinks); if(newLink) { internalHyperlinks.push(newLink); } } } ret+="\""+imgCaption+"\""; return ret; } /* generic function that creates a HTML tag with attributes */ function createStartTag(elementname,attributename,attritutevalue) { var ret=""; if(!elementname=="") { ret+="<"+elementname; if(attributename.length>0) ret+=" "+attributename+"=\""+attritutevalue+"\""; ret+=">"; } return ret; } /* generic function that creates a HTML end tag */ function createEndTag(elementname) { var ret=""; if(!elementname==("")) ret+=""; return ret; } /* generic function that creates a HTML end tag plus linefeed*/ function endTagWithLineFeed(elementname) { var ret=""; if(!elementname.equals("")) ret+=endTag(elementname)+"\n"; return ret; } /* generic function that searches/replaces a string. Regular expressions may be used. */ function searchReplace(instr,remove, replace) { var ret=""; ret=replaceRegexp(instr,remove,replace,false); return ret; } /* generic function that searches/replaces a string optionally using Regular expressions */ function replaceRegexp(instr,remove, outstr,isRegExp) { var returnString=""; if (instr==null || remove==null || !(typeof instr == 'string') || remove.length==0) return instr; if(isRegExp) { returnString=instr.replace(remove,outstr); } else { var sb = ""; var oldIndex = 0; var newIndex = 0; var remLength = remove.length; while ( (newIndex = instr.indexOf(remove,oldIndex)) > -1) { //copy from last to new appearance sb+=(instr.substring(oldIndex,newIndex)); sb+=outstr; //set old index to end of last apperance. oldIndex = newIndex + remLength; } var inLength = instr.length; //add part after last appearance of string to remove if(oldIndex */ function renderHtmlEntities(str) { return str.replace(/&/g,"&").replace(//g,">") } /* return the first non matching character position between two strings*/ function endTagPos(str, tag) { var i=0; while(str.substr(i,1)==tag && i < str.length) { i++; } return i } function replaceNoRegexp(str,search, replace) { return str.split(search).join(replace); } /* replace a string with space characters to underscore "_". This is used for internal links */ function mwName2Link(str) { return replaceNoRegexp(str," ","_"); } /* replace a string with underscore character "_" to space character This is used for internal links */ function mwLink2Name(str) { return replaceNoRegexp(str,"_"," "); } /* replace passages with placeholders */ function maskNowiki(str,nowikiPassages) { var i=0; var sourceElem=""; if(str.indexOf("")!=-1) { var nowikiStart=str.indexOf(""); while(nowikiStart !=-1) { var nowikiEnd=str.indexOf("",nowikiStart); if(nowikiEnd!=-1) { //nowikiEnd=nowikiEnd+nowikiStart; nowikiPassages.push(new nowikiPassage(i,str.substring(nowikiStart+8,nowikiEnd))); str=str.substr(0,nowikiStart)+"_nowiki_"+i+"_"+ str.substr(nowikiEnd+9); i++; nowikiStart=str.indexOf("",nowikiEnd+10); } else return str; //invalid nowiki use, ignored } } if(str.indexOf("",nowikiStart); var nowikiEnd=str.indexOf("",nowikiStart); if(nowikiEnd!=-1 && sourceStart!=-1) { //nowikiEnd=nowikiEnd+nowikiStart; sourceElem="
    \n"; nowikiPassages.push(new nowikiPassage(i,sourceElem)); str=str.substr(0,nowikiStart)+"_nowiki_"+i+"_\n"+str.substr(nowikiEnd+10); i++; //strStartBeforeNowiki=nowikiEnd+11; nowikiStart=str.indexOf("" */ function escapeHtmlEntities(str) { /*str=str.replace(/&/g,"&"); str=str.replace(/ü/g,"ü"); str=str.replace(/Ü/g,"Ü"); str=str.replace(/ö/g,"ö"); str=str.replace(/Ö/g,"Ö"); str=str.replace(/ä/g,"ä"); str=str.replace(/Ä/g,"Ä"); str=str.replace(/ß/g,"ß");*/ //empty
    -Elements become well-formed XML: str=str.replace(/\/g,"

    "); //reserved delims: str=str.replace(/__#bracketOpen#__/g,"["); str=str.replace(/__#bracketClosed#__/g,"]"); return str; } /* remove all comments from the string */ function removeComments(str) { if(str.indexOf("")>-1) { var srcstr=str; while(srcstr.indexOf("",startPos); srcstr=srcstr.substr(0,startPos)+srcstr.substr(endPos+3); } return srcstr; } else return str; } function getHrefEnd(str,foundPos) { var hrefEnd=-1; var i=foundPos; var endFound=false; do{ var myChar=str.substr(i,1); if(myChar=="<" || myChar==" "|| myChar=="\n") { endFound=true; hrefEnd=i; } else i++; } while (endFound==false); return hrefEnd; } /* find searchstr in str, but not inside [[...]] */ function getCharposOutsideLinks(str,searchstr) { var charpos=-1; var openLink=str.indexOf("[["); var closeLink=str.indexOf("]]"); if(openLink>-1 && closeLink>openLink) { charpos=str.substr(0,openLink).indexOf(searchstr); if(charpos==-1) charpos=str.indexOf(searchstr,closeLink); } else charpos=str.indexOf(searchstr); return charpos; } function stringStartsWith(str,lookfor) { var itDoes=false; if(str.substring(0,lookfor.length)==lookfor) itDoes=true; return itDoes; } function stringEndsWith(str, lookfor) { return str.indexOf(lookfor, str.length - lookfor.length) !== -1; } function wikiLink2Xml(str,internalHyperlinks) { var ret=""; var href="Link"; var linkTypeExternal=true; var linkTagLength=1; if(stringStartsWith(str,"[[")) { linkTypeExternal=false; linkTagLength=2; } var linkContentLeft=str.substr(linkTagLength); var linkContentRight=linkContentLeft.substring(0,linkContentLeft.length-linkTagLength); var firstBlankPos=linkContentRight.indexOf(" "); ret+=""; if(firstBlankPos >0) { href=linkContentRight.substring(0,firstBlankPos); ret+=href; } else ret+=linkContentRight; ret+=""; var linkName=""; ret+=""; if(firstBlankPos>1) { linkName=linkContentRight.substr(firstBlankPos); ret+=linkName.trim(); } ret+=""; if(!linkTypeExternal) { //interne Links verarbeiten var newLink = new internalHyperlink("","", href.trim(), "", linkName,internalHyperlinks); internalHyperlinks.push(newLink); } return ret; }