Best JavaScript code snippet using playwright-internal
t2tformatterplugin.tiddly
Source:t2tformatterplugin.tiddly  
1/***2|''Name:''|T2tFormatterPlugin|3|''Description:''|Allows Tiddlers to use [[txt2tags|http://txt2tags.org/markup.html]] formatting|4|''Author:''|David Young (david (dot) a (dot) young (at) gmail (dot) com)|5|''Credit:''|Copied and modified from Martin Budden's http://www.martinswiki.com/#ExampleFormatterPlugin |6|''CodeRepository:''|NA |7|''Version:''|0.4|8|''Status:''|Rough Draft|9|''Date:''|Jul 5, 2011|10|''Comments:''|Please make comments at http://groups.google.co.uk/group/TiddlyWikiDev |11|''License:''|NA |12|''~CoreVersion:''|2.6.1|13! Installation Instructions14Apply the following tags to this tiddler:15* systemConfig16* excludeLists17* excludeSearch18You can make a tiddler with the tag ''t2t'' and the Txt2Tags markup will be used instead of TiddlyWiki markup. You can eliminate the need to manually tag by modifying your ''Create New Tiddler'' macro in your [[MainMenu]] to set the //wikiformat// field to ''t2t'':19{{{20<<newTiddler21label: "New t2t"22title: "New t2t tiddler"23fields: "wikiformat:t2t"24prompt: "Create a new tiddler using the t2t formatter">>25}}}26You should also get into [[AdvancedOptions]] or //backstage -> Tweaks -> chkInsertTabs// because that lets you hit the tab button in the tiddly text field.  Tab will still move your cursor around the page, from title input to tiddly text input, etc. It only effects the text field.  Vital for t2t blockquote syntax (prepending with tabs).27!Features/ Progress28| ''Markup'' | ''Feature'' | ''Status'' | ''Version'' | ''Comment'' |29| several | \n vs. \r in input | ''WAITING'' | NA |Applied to tagged and raw, but I am uncertain if this is OK.<br>Emailed twdev mailing list. |30| ''FONT/INLINE'' |||||31|{{{**}}}''bold''{{{**}}} | All | ''OK'' | 0.1 |Hasn't been heavily tested on any platform. |32|{{{//}}}//italic//{{{//}}} | All | ''OK'' | 0.1 |Hasn't been heavily tested on any platform. |33|{{{__}}}__under__{{{__}}} | All | ''OK'' | 0.1 |Hasn't been heavily tested on any platform. |34|{{{--}}}--strike--{{{--}}} | All | ''OK'' | 0.1 |Hasn't been heavily tested on any platform.|35|{{{^^}}}^^super^^{{{^^}}} | All | ''OK'' | 0.1 |Hasn't been heavily tested on any platform.<br>Not Official Markup.|36|{{{,,}}}~~sub~~{{{,,}}} | All | ''OK'' | 0.1 |Hasn't been heavily tested on any platform.<br>Not Official Markup.|37|{{{``monospace``}}} | All | ''OK'' | 0.1 |Hasn't been heavily tested on any platform.|38|{{{''}}}tagged/html{{{''}}} | All | ''OK'' | 0.1 |Hasn't been heavily tested on any platform.|39|{{{""}}}raw{{{""}}} | All | ''OK'' | 0.1 |Hasn't been heavily tested on any platform.<br>Overrides WikiWords and Markup.|40| ''SINGLE-LINE'' |||||41|{{{``` monospace}}} | All | ''OK'' | 0.1 |Hasn't been heavily tested on any platform. |42|{{{'''}}} tagged/html | All | ''OK'' | 0.1 |Hasn't been heavily tested on any platform. |43|{{{"""}}} raw | All | ''OK'' | 0.1 |Hasn't been heavily tested on any platform. |44|{{{%}}}comments | ALL | ''OK'' | 0.1 |Hasn't been heavily tested on any platform. |45| ''BLOCKS'' |||||46|{{{```}}}<br>{{{monospace}}}<br>{{{```}}} | All | ''OK'' | 0.1 |Hasn't been heavily tested on any platform. |47|{{{'''}}}<br>tagged/html<br>{{{'''}}} | All | ''OK'' | 0.1 |Hasn't been heavily tested on any platform. |48|{{{"""}}}<br>raw<br>{{{"""}}} | All | ''OK'' | 0.1 |Hasn't been heavily tested on any platform. |49|{{{%%%}}}<br>comments<br>{{{%%%}}} | All | ''OK'' | 0.1 |Hasn't been heavily tested on any platform |50|\t<html>    </html>block<br>\t<html>    </html>quotes | All | ''OK'' | 0.1 |Hasn't been heavily tested on any platform.<br>Tiddlywiki interprets all markup inside the block; unlike txt2tags (only some markup). |51| ''HEADERS'' |||||52|{{{=}}}un-numbered{{{=}}} | ALL | ''OK'' | 0.1 |Hasn't been heavily tested on any platform. |53|{{{+}}}numbered{{{+}}} | HEADING | ''OK'' | 0.1 |Hasn't been heavily tested on any platform. |54|{{{+}}}numbered{{{+}}} | NUMBERING | ''OK'' | 0.1 |Hasn't been heavily tested on any platform.<br>Unknown if array length modification or array[6] reassignment is faster on a per-iteration basis. |55| ''MISC'' |||||56|horizontal rule<br>{{{--------------------}}} | RULE | ''OK'' | 0.1 |Hasn't been heavily tested on any platform. |57|{{{====================}}}<br>{{{____________________}}}| THICKNESS | ''??'' | 0.1 |The alternative rules are interpreted and classes //heavy// or //light// are assigned; but my theme doesn't use them so I can't tell.<br>Maybe tiddlywiki doesn't use those css classes at all?<br>If so, delete this functionality. |58|Paragraphs | ALL | ''CAN'T FIX'' | 0.1 |Multiple newlines are concatenated into {{{<p><\p>}}}.<br>Visually they appear correctly (line spacing, etc), but it isn't a real paragraph.<br>If you try to make {{{<p>}}} elements wrap the text, then they are nested improperly if you look at the html.<br>This nesting lead to a stack busting on tiddlers if you have around 200 paragraphs or more.<br>This resulted in content truncation, so {{{<p><\p>}}} it shall be.<br>Historical bug in tiddlywiki's core, so I can't do much about it.<br>This is certainly a kludge, maybe {{{<br><br>}}} would be better, but that seems equally kludgy and all block-type syntax must be careful. |59| ''LISTS'' |||||60|{{{- }}}unordered | ALL | ''OK'' | 0.1 |t2t allows complex lists (paragraphs inside list items).<br>Can't figure out a good regex to match "X blank lines" that works with paragraph.<br>Interim solution: terminate list with empty item. |61|{{{+ }}}ordered | ALL | ''OK'' | 0.1 |t2t allows complex lists (paragraphs inside list items).<br>Can't figure out a good regex to match "X blank lines" that works with paragraph.<br>Interim solution: terminate list with empty item.<br>INTERFERES WITH NUMBERED HEADINGS. |62|{{{: }}}word<br><html>    </html>definitions | ALL | ''TIDDLY'' | NA |Difficult to pull off since "definition" part of t2t uses whitespaces.<br>Interim solution: use tiddlywiki ; word \n : definition format. |63| ''COMPLEX'' |||||64|~WikiWords | ALL | ''TIDDLY'' | 0.1 |Self-updating link to core formatter.<br>Not Official Markup. |65|{{{<<macros>>}}} | ALL | ''TIDDLY'' | 0.1 |Self-updating link to core formatter.<br>By changing the header syntax, the {{{<<tiddler##section>>}}} section transclusion macro won't work.<br>Not Official Markup. |66|http url recognition | ALL | ''TIDDLY'' | 0.1 |Self-updating link to core formatter.<br>Not Official Markup. |67|email recognition | ALL | ''NA'' | NA |Is this at all worth it?  t2t will mask or convert to mailto...<br>don't take this lightly- it wrecked the works last time. |68|{{{[}}}links{{{]}}} | ALL | ''OK'' | 0.1 |Links to internal tiddlers (as long as their title has no spaces), links to external websites |69|{{{[}}}named links{{{]}}} | ALL | ''OK'' | 0.1 |Links to internal tiddlers (as long as their title has no spaces), links to external websites |70|'image-related' | ALL | ''OK'' | 0.1 |an image or image link supports whitespace-alignment.<br>If the {{{[}}} starts at the newline, the image will float to the left (equivalent to the {{{<}}} markup in tiddly images).<br>If the {{{]}}} ends the line, the image will float to the right (equivalent to the {{{>}}} markup in tiddly images).<br>If the image is both the start and end of line, it is neither left nor right.<br>No centering image support yet. |71|{{{[}}}images{{{]}}} | ALL | ''OK'' | 0.1 |Supports .png .gif .jpg .jpeg, just grep for IMAGE-EXTENSION-REGEX in this tiddler to expand the list.<br>Works for local and external image files |72|{{{[[image] links]}}} | ALL | ''OK'' | 0.1 |A twist here is that the link can have spaces in the name, but I don't recommend trying that. |73|{{{|}}}tables{{{|}}} | ALL | ''TIDDLY'' | 0.1 |Tiddlywiki tables are supported. Self-updating link to core formatter. |74***/75//{{{76//REGEXES found in txt2tags.py:1920 (getRegexes)77// Ensure that the plugin is only installed once.78if(!version.extensions.T2tFormatterPlugin) {79version.extensions.T2tFormatterPlugin = {installed:true};80//Should test this backwards until I find the revision that is actually useless81if(version.major < 2 || (version.major == 2 && version.minor < 6))82	{alertAndThrow('T2tFormatterPlugin requires TiddlyWiki 2.6 or later.');}83t2tFormatter = {}; // 'namespace' for local functions84t2tDebug = function(out,str)85{86	createTiddlyText(out,str.replace(/\n/mg,'\\n').replace(/\r/mg,'RR'));87	createTiddlyElement(out,'br');88};89/*90wikify = function(source,output,highlightRegExp,tiddler)91{92	if(source && source !== '') {93		var w = new Wikifier(source,getParser(tiddler),highlightRegExp,tiddler);94		w.output = tiddler ? createTiddlyElement(output,'p') : output;95		w.subWikifyUnterm(w.output);96	}97};98*/99// COPY from EnclosedTextHelper Tiddlywiki v2.6.1 line 2923100// If the lookaheadRegexp fails, use the string in "restore:"101// define the element "restore:" as the static string equal to your102// "match:"'s result.103//104// If your markup rules are more complex/less dynamic (like ==headers==);105// then you must copy this and make up your own combo of parenthesis.106config.formatterHelpers.nonDestructiveEnclosedTextHelper = function(w)107{108	this.lookaheadRegExp.lastIndex = w.matchStart;109	var lookaheadMatch = this.lookaheadRegExp.exec(w.source);110	if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {111		//Everything that uses this function is a one-liner syntax112		/*113		var text = lookaheadMatch[1];114		if(config.browser.isIE)115			text = text.replace(/\n/g,"\r");116		createTiddlyElement(w.output,this.element,null,null,text);117		*/118		//createTiddlyElement(w.output,this.element,null,null,lookaheadMatch[1]);119		w.subWikifyTerm(createTiddlyElement(w.output,this.element),this.termRegExp);120		w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;121	} else {122		w.output.appendChild(document.createTextNode(w.matchText));123	}124};125/*126// Like nonDestructiveEnclosedTextHelper, only you can define what is127// restored with a regular expression instead of a static string.128// This is helpful for when the "match" is more dynamic. Just define129// element "restoreRegExp:" and the first parenthesis in it will be used130// to restore the consumed "match" text.131// NOTE: this comes at the cost of ANOTHER grepping of your input!132config.formatterHelpers.nonDestructiveEnclosedTextHelperRegEx = function(w)133{134	this.lookaheadRegExp.lastIndex = w.matchStart;135	var lookaheadMatch = this.lookaheadRegExp.exec(w.source);136	if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {137		var text = lookaheadMatch[1];138		if(config.browser.isIE)139			text = text.replace(/\n/g,"\r");140		createTiddlyElement(w.output,this.element,null,null,text);141		w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;142	} else {143		this.restoreRegExp.lastIndex = w.matchStart;144		var restoreMatch = this.restoreRegExp.exec(w.source);145		if (restoreMatch && restoreMatch.index == w.matchStart) {146			w.output.appendChild(document.createTextNode(restoreMatch[1]));147		} else {148			//shouldn't be possible!149			//Only if you don't define restoreRegExp: properly150			w.output.appendChild(document.createTextNode("### SYNTAX ERROR ###"));151		}152	}153};154*/155/*156config.formatterHelpers.setAttributesFromParams = function(e,p)157{158	var re = /\s*(.*?)=(?:(?:"(.*?)")|(?:'(.*?)')|((?:\w|%|#)*))/mg;159	var match = re.exec(p);160	while(match) {161		var s = match[1].unDash();162		if(s=='bgcolor') {163			s = 'backgroundColor';164		}165		try {166			if(match[2]) {167				e.setAttribute(s,match[2]);168			} else if(match[3]) {169				e.setAttribute(s,match[3]);170			} else {171				e.setAttribute(s,match[4]);172			}173		}174		catch(ex) {}175		match = re.exec(p);176	}177};178*/179config.t2tFormatters = [180//SPEED: COMBINE ALL BEAUTIFIERS LIKE TIDDLY DOES ALREADY181// bold uses syntax **bold** no whitespace in the bookends.182{183	name: 't2tBold',184	match: '\\*\\*',185	element: 'strong',186	lookaheadRegExp: /\*\*([^\s](|.*?[^\s])\**)\*\*/mg,187	termRegExp: /(\*\*)/mg,188	handler: config.formatterHelpers.nonDestructiveEnclosedTextHelper189},190// italic uses //italic//191{192	name: 't2tItalic',193	match: '//',194	element: 'em',195	lookaheadRegExp: /\/\/([^\s](|.*?[^\s])[\/]*)(\/\/)/mg,196	termRegExp: /(\/\/)/mg,197	handler: config.formatterHelpers.nonDestructiveEnclosedTextHelper198},199// Horizontal rules can be made up of 20 or more - characters on a line with200// whitespace on the ends. Alternatively 20 or more _ characters is accepted.201// 20 or more = characters also work, but that makes a "thicker" horizontal rule202// see t2tHeavyRule.203{204	name: 't2tRule',205	match: '^[ \\t]*[-_]{20,}[ \\t]*$',206	handler: function(w)207	{208		createTiddlyElement(w.output,'hr',null,'light');209	}210},211// Default tiddler theme doesn't differentiate between heavy and light.212// TODO: Try some other themes otherwise roll this into t2tRule.213{214	name: 't2tHeavyRule',215	match: '^[ \\t]*={20,}[ \\t]*$',216	handler: function(w)217	{218		createTiddlyElement(w.output,'hr',null,'heavy');219	}220},221// underline uses __underline__222{223	name: 't2tUnderline',224	match: '__',225	element: 'ins',226	lookaheadRegExp: /__([^\s](|.*?[^\s])_*)__/mg,227	termRegExp: /(__)/mg,228	handler: config.formatterHelpers.nonDestructiveEnclosedTextHelper229},230// strikethrough uses --strike--231{232	name: 't2tStrike',233	match: '--',234	element: 'del',235	lookaheadRegExp: /--([^\s](|.*?[^\s])-*)--/mg,236	termRegExp: /(--)/mg,237	handler: config.formatterHelpers.nonDestructiveEnclosedTextHelper238},239/*240// superscript uses ^^super^^241// this is unofficial242{243	name: 't2tSuperscript',244	match: '\\^\\^',245	element: 'sup',246	lookaheadRegExp: /\^\^([^\s](|.*?[^\s])\^*)\^\^/mg,247	handler: config.formatterHelpers.nonDestructiveEnclosedTextHelper248},249// subscript uses ,,sub,,250// this is unofficial251{252	name: 't2tSubscript',253	match: ',,',254	element: 'sub',255	lookaheadRegExp: /,,([^\s](|.*?[^\s]),*),,/mg,256	handler: config.formatterHelpers.nonDestructiveEnclosedTextHelper257},258*/259// Monospace uses different variants of backticks260// blocks are bordered with lines containing only 3 backticks261// ```262{263	name: 't2tMonospaceBlock',264	match: '^```[ \\t]*$',265	lookaheadRegExp: /^```[ \t]*(?:\n?((?:.|\n)*?\n)```[ \t]*$)|((?:.|\n)*$)/gm,266	handler: function(w) {267		this.lookaheadRegExp.lastIndex = w.matchStart;268		var lookaheadMatch = this.lookaheadRegExp.exec(w.source);269		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {270			if (lookaheadMatch[1]) {271				var text = lookaheadMatch[1];272			} else {273				var text = lookaheadMatch[2].substr(w.matchLength+1);274			}275			if(config.browser.isIE)276				text = text.replace(/\n/g,"\r");277			createTiddlyElement(w.output,"pre",null,null,text);278			w.nextMatch = this.lookaheadRegExp.lastIndex;279		} else  w.output.appendChild(document.createTextNode(w.matchText));280	}281},282// lines prefixed with 3 backticks are preformatted blocks as well283// one block per line! putting backtic-prefixed lines consecutively will284// result in 2 preformatted blocks!285//SPEED: this can be like tiddly's termregexp syntax like a "Heading"286{287	name: 't2tMonospaceLine',288	match: '^``` ',289	lookaheadRegExp: /^``` ((?:.)*?)$/mg,290	element: 'pre',291	handler: config.formatterHelpers.enclosedTextHelper292},293// inline monospaced text ``like this``.294// terminates at the first newline without matching backtics.295// this version uses code instead of pre.296{297	name: 't2tMonospace',298	match: '``',299	element: 'code',300	lookaheadRegExp: /``([^\s](|.*?[^\s])`*)``/mg,301	termRegExp: /(``)/mg,302	handler: config.formatterHelpers.nonDestructiveEnclosedTextHelper303},304//t2tCommentblock305{306	name: 't2tCommentBlock',307	match: '^%%%[ \\t]*\\n',308	//emptyblock but no unclosed trailer309	//lookaheadRegExp: /^%%%[ \t]*((?:.|\n)*?)\n%%%[ \t]*(\n|$)/mg,310	//                           match next %%% line   OR match to EOF311	lookaheadRegExp: /^%%%[ \t]*(?:(?:[.|\n]*?)\n%%%[ \t]*$)|(?:[.\n]*$)/gm,312	handler: function(w)313	{314		this.lookaheadRegExp.lastIndex = w.matchStart;315		var lookaheadMatch = this.lookaheadRegExp.exec(w.source);316		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {317			w.nextMatch = this.lookaheadRegExp.lastIndex;318		} else  w.output.appendChild(document.createTextNode(w.matchText));319	}320},321//SPEED: this can be like tiddly's termregexp syntax like a "Heading"322{323	name: 't2tCommentLine',324	match: '^%' ,325	lookaheadRegExp: /^%.*?$/mg,326	handler: function(w)327	{328		this.lookaheadRegExp.lastIndex = w.matchStart;329		var lookaheadMatch = this.lookaheadRegExp.exec(w.source);330		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {331			w.nextMatch = this.lookaheadRegExp.lastIndex;332		} else  w.output.appendChild(document.createTextNode(w.matchText));333	}334},335// nonstandard br insertion336// I like tex's \\337{338	name: 't2tLineBreak',339	match: '\\\\\\\\',340	handler: function(w)341	{342		createTiddlyElement(w.output,'br');343	}344},345//TODO: tagged text doesn't get the \n \r IE replacement... test in IE346// t2t tagged text is "passthrough" so what you type is passed on to347// the html interpreter. t2t formatting isn't converted into html.348// Raw html is interpreted by your browser.349// Tagged uses various forms of single-quotes.350// multi-line blocks are bordered by lines containing only '''351{352	name: 't2tTaggedBlock',353	match: '^\'\'\'[ \\t]*$',354	lookaheadRegExp: /^'''[ \t]*(?:((?:.|\n)*?\n)'''[ \t]*$)|((?:.|\n)*$)/gm,355	handler: function(w)356	{357		this.lookaheadRegExp.lastIndex = w.matchStart;358		var lookaheadMatch = this.lookaheadRegExp.exec(w.source);359		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {360			if (lookaheadMatch[1]) {361				var text = lookaheadMatch[1];362			} else {363				var text = lookaheadMatch[2].substr(w.matchLength+1);364			}365			if(config.browser.isIE)366				text = text.replace(/\n/g,"\r");367			createTiddlyElement(w.output,"span").innerHTML = text;368			w.nextMatch = this.lookaheadRegExp.lastIndex;369		} else  w.output.appendChild(document.createTextNode(w.matchText));370	}371},372// Single lines prepended with ''' will be considered "tagged"373// Unlike monospace, tagged isn't really a "block" so having multiple374// pre-pended lines won't look any different than one multi-line block.375//SPEED: this can be like tiddly's termregexp syntax like a "Heading"376{377	name: 't2tTaggedLine',378	match: '^\'\'\' ',379	lookaheadRegExp: /^''' ((?:.)*?)$/mg,380	handler: function(w)381	{382		this.lookaheadRegExp.lastIndex = w.matchStart;383		var lookaheadMatch = this.lookaheadRegExp.exec(w.source);384		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {385			createTiddlyElement(w.output,"span").innerHTML = lookaheadMatch[1];386			w.nextMatch = this.lookaheadRegExp.lastIndex;387		} else  w.output.appendChild(document.createTextNode(w.matchText));388	}389},390// inline tagged text is wrapped ''in 2 single quotes''.  This type ends at391// the newline if there is no matching ''.392{393	name: 't2tTagged',394	match: '\'\'',395	lookaheadRegExp: /''([^\s](|.*?[^\s])'*)''/mg,396	handler: function(w)397	{398		this.lookaheadRegExp.lastIndex = w.matchStart;399		var lookaheadMatch = this.lookaheadRegExp.exec(w.source);400		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {401			createTiddlyElement(w.output,"span").innerHTML = lookaheadMatch[1];402			w.nextMatch = this.lookaheadRegExp.lastIndex;403		} else  w.output.appendChild(document.createTextNode(w.matchText));404	}405},406//TODO: RAW text doesn't get the \n \r IE replacement... test in IE407// t2t Raw text ignores t2t formatting (any wiki formatting); but characters408// are still 'escaped' out to be displayed by the brower.409// e.g. ""**bold**"" isn't made bold; you see the astrices; while lines using410// html tags will convert angle brackets to < >411// This is synonymous with nowiki412// Blocks of raw text are bordered with blank lines of 3 double quotes.413{414	name: 't2tRawBlock',415	match: '^\\"\\"\\"[ \\t]*$',416	lookaheadRegExp: /^"""[ \t]*(?:((?:.|\n)*?\n)"""[ \t]*$)|((?:.|\n)*$)/gm,417	handler: function(w)418	{419		this.lookaheadRegExp.lastIndex = w.matchStart;420		var lookaheadMatch = this.lookaheadRegExp.exec(w.source);421		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {422			if (lookaheadMatch[1]) {423				var text = lookaheadMatch[1];424			} else {425				var text = lookaheadMatch[2].substr(w.matchLength+1);426			}427			//rawblock may not work with this properly?428			if(config.browser.isIE)429				text = text.replace(/\n/g,"\r");430			createTiddlyElement(w.output,"span",null,null,text);431			w.nextMatch = this.lookaheadRegExp.lastIndex;432		} else  w.output.appendChild(document.createTextNode(w.matchText));433	}434},435// Any line prepended with 3 double quotes is interpreted as raw.436// Unlike monospace, raw isn't really a "block" so consecutive pre-pended lines437// will have no difference with a multi-line block.438//SPEED: this can be like tiddly's termregexp syntax like a "Heading"439{440	name: 't2tRawLine',441	match: '^\\"\\"\\" ',442	lookaheadRegExp: /^""" ((?:.)*?)$/mg,443	handler: function(w)444	{445		this.lookaheadRegExp.lastIndex = w.matchStart;446		var lookaheadMatch = this.lookaheadRegExp.exec(w.source);447		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {448			createTiddlyElement(w.output,'span',null,null,lookaheadMatch[1]);449			w.nextMatch = this.lookaheadRegExp.lastIndex;450		} else  w.output.appendChild(document.createTextNode(w.matchText));451	}452},453// The in-line format uses 2 double quotes ""raw"".454// The end of the line terminates raw if there is no matching "".455{456	name: 't2tRaw',457	match: '\\"\\"',458	lookaheadRegExp: /""([^\s](|.*?[^\s])"*)""/mg,459	handler: function(w)460	{461		this.lookaheadRegExp.lastIndex = w.matchStart;462		var lookaheadMatch = this.lookaheadRegExp.exec(w.source);463		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {464			createTiddlyElement(w.output,'span',null,null,lookaheadMatch[1]);465			w.nextMatch = this.lookaheadRegExp.lastIndex;466		} else  w.output.appendChild(document.createTextNode(w.matchText));467	}468},469// Section headings are bookended by matching sets of = signs.470// It must all be on one line471//SPEED: simplify match472{473	name: 't2tHeading',474	//no whitespace at the start475	//match: '^ *={1,6}[^=\n]',476	//lookaheadRegExp: /^ *(={1,6})([^=\n][^\n]*[^=\n])\1[ \t]*$/mg,477	match: '^={1,6}[^ =\n]',478	lookaheadRegExp: /^(={1,6})([^ =\n][^\n]*[^=\n])\1[ \t]*$/mg,479	handler: function(w)480	{481		this.lookaheadRegExp.lastIndex = w.matchStart;482		var lookaheadMatch = this.lookaheadRegExp.exec(w.source);483		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {484			//headings in t2t don't allow markup inside, so we DO NOT use the subwikifyterm here.485			createTiddlyElement(w.output,'h'+lookaheadMatch[1].length,null,null,lookaheadMatch[2]);486			w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;487		} else  w.output.appendChild(document.createTextNode(w.matchText));488	}489},490/*491//This breaks everything.  T2T converts emails into mailto:s or it masks them:492// dave@gmail.com --> <dave (AT) gmail dOT com>493{494	name: 't2tEmailHiding',495	match: '[\\w]+(\\.[\\w\\-\\+_]+)*\\@[\\w\\-\\+_]+\\.[\\w\\-\\+_]+(\\.[\\w\\-\\+_]+)*',496	lookaheadRegExp: /([\w]+(?:\.[\w\-\+_]+)*)\@([\w\-\+_]+\.[\w\-\+_]+(?:\.[\w\-\+_]+)*)/mg,497	handler: function(w)498	{499		this.lookaheadRegExp.lastIndex = w.matchStart;500		var lookaheadMatch = this.lookaheadRegExp.exec(w.source);501		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {502			var text = '<' + lookaheadMatch[1] + " (AT) " + lookaheadMatch[2] + '>';503			text = text.replace(/\./g," DOT ");504			createTiddlyElement(w.output,"span",null,null,text);505			w.nextMatch = this.lookaheadRegExp.lastIndex;506		}507	}508},509*/510// push-pop version keeps the array sized to whatever it should be.  This is511// probably faster than the array reassignment (below this function) especially512// in the simplest and more likely use case: only using top-level headings.513// In practice, though, 10k numbered headings takes forever in BOTH cases.514// HTML doesn't have an inherent number scheme for header tags. Just treat515// them as unnumbered for now.516// SPEED: simplify match. see what termregexp can do.517{518	name: 't2tNumberedHeading',519	//no whitespace at the start.520	//match: '^ *\\+{1,6}[^\\+\\n]',521	//lookaheadRegExp: /^ *(\+{1,6})([^\+\n][^\n]*[^\+\n])\1[ \t]*$/mg,522	match: '^\\+{1,6}[^ \\+\\n]',523	lookaheadRegExp: /^(\+{1,6})([^ \+\n][^\n]*[^\+\n])\1[ \t]*$/mg,524	handler: function(w)525	{526		if (! w.numheading) {527			w.numheading = [0,0];528		}529		this.lookaheadRegExp.lastIndex = w.matchStart;530		var lookaheadMatch = this.lookaheadRegExp.exec(w.source);531		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {532			var text = lookaheadMatch[2];533			// since length=1 == arrayindex 0534			var headingindex = lookaheadMatch[1].length - 1;535			// since length1 means we want 2 items in the array536			var targetlength = headingindex + 2;537			//add or remove values until numheading.length = lookaheadMatch[1].length538			//push 0's first to add539			for (var i = w.numheading.length; i < targetlength; i++) 540				w.numheading.push(0);541			//removing is eashy, you can just change length and it truncates array (garbage later)542			w.numheading.length = targetlength;543			//increment this heading544			w.numheading[headingindex]++;545			//reset the next level down to 0546			w.numheading[headingindex + 1] = 0;547			text = " " + text;548			for (headingindex; headingindex >= 0; headingindex--) {549				text = w.numheading[headingindex] + "." + text;550			}551			createTiddlyElement(w.output,'h'+lookaheadMatch[1].length,null,null,text);552			w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;553		} else  w.output.appendChild(document.createTextNode(w.matchText));554	}555},556// t2t concatenates newlines to make paragraphs.557// WARNING: tiddly doesn't support this very well; the appearance is558// OK but the dynamic HTML has oddly-nested paragraphs.559{560	name: 't2tParagraph',561	match: '\\n{2,}',562	handler: function(w)563	{564		//do you like stack overflows in your html engine?565		//try making 200 paragraphs with this.566		//createTiddlyElement(w.output,'p');567		//Looks ok-ish, but now you have manual BR's mixed in568		//with the implied whitespace by an <h1> or <quote>.569		//createTiddlyElement(w.output,'br');570		//createTiddlyElement(w.output,'br');571		//ohh this is so wrong to do, but it works pretty well.572		//no stack explosions, and it looks visually correct.573		createTiddlyElement(w.output,"span").innerHTML = "<p></p>";574	}575},576{577	name: 't2tLinkImg',578	match:  '(?:^\\[)|(?:\\[)',579	// ([^\n\r]*?) matches 2 separate entities: [foo] and [soft]580	// ([^\n\r]*) matches entity: [(foo] and [soft)]581	// use *? or include [] us unallowed chaaracters582	lookaheadRegExp: /(?:(^\[)|(?:\[))(?:(\[([^\[\]\n\r\f]+)\] ?([^\n\r\[\]]*))|([^\s\[\]]+)|(([^\[\]\n\r\f]+) ([^\[\]\s]+)))(?:(\]$)|(?:\]))/mg,583	handler: function(w)584	{585		this.lookaheadRegExp.lastIndex = w.matchStart;586		var lookaheadMatch = this.lookaheadRegExp.exec(w.source);587		if(lookaheadMatch && lookaheadMatch.index == w.matchStart)588		{589			//first and last group match for alignment to be used for images.590			if (lookaheadMatch[1] && (! lookaheadMatch[9]))591			{592				var imagealign = "left";593			}594			else if ( (! lookaheadMatch[1]) && lookaheadMatch[9])595			{596				var imagealign = "right";597			}598			//alignment discovered, now see what type of bracket link.599			// [[image] link]600			//2 = imglink; 3 img 4 link601			if (lookaheadMatch[2])602			{603				var e = w.output;604				// 4 may not exist, it could just be an image formatted [[image]]605				if (lookaheadMatch[4]) {606					var link = lookaheadMatch[4];607					e = config.formatterHelpers.isExternalLink(link) ?608						createExternalLink(w.output,link) :609						createTiddlyLink(w.output,link,false,null,w.isStatic,w.tiddler);610					addClass(e,"imageLink");611				}612				var img = createTiddlyElement(e,"img");613				if (imagealign) img.align = imagealign;614				img.src = lookaheadMatch[3];615				img.title = lookaheadMatch[4];616				img.setAttribute("alt",lookaheadMatch[4]);617				w.nextMatch = this.lookaheadRegExp.lastIndex;618				/*619				if (align)620				{621					alert( align+"-ed image\nfile: '"+lookaheadMatch[3]+"'\nurl: '"+lookaheadMatch[4]+"'");622				} else {623					alert( "unaligned image\nfile: '"+lookaheadMatch[3]+"'\nurl: '"+lookaheadMatch[4]+"'");624				}625				*/626			}627			// [link] or [image] 628			//5 = url or img629			else if (lookaheadMatch[5])630			{631				// IMAGE-EXTENSION-REGEX632				if (/\.((gif)|(je?pg)|(png)|(bmp)|(tif))$/i.exec(lookaheadMatch[5]))633				{634					//alert("image extension found");635					var e = w.output;636					var img = createTiddlyElement(e,"img");637					if (imagealign) img.align = imagealign;638					img.src = lookaheadMatch[5];639					img.title = lookaheadMatch[5];640					img.setAttribute("alt",lookaheadMatch[5]);641					w.nextMatch = this.lookaheadRegExp.lastIndex;642					/*643					if (align)644					{645						alert( align+"-ed image\nfile: '"+lookaheadMatch[5]+"'");646					} else {647						alert( "unaligned image\nfile: '"+lookaheadMatch[5]+"'");648					}649					*/650				}651				else652				{653					//alert("no image extension found");654					//obviously this isn't an image by the extension, so it is just a link.655					var link = lookaheadMatch[5];656					var e = (config.formatterHelpers.isExternalLink(link)) ?657						createExternalLink(w.output,link) :658						createTiddlyLink(w.output,link,false,null,w.isStatic,w.tiddler);659					createTiddlyText(e,link);660					w.nextMatch = this.lookaheadRegExp.lastIndex;661					//alert("Simple link to url: '"+lookaheadMatch[5]+"'");662				}663			}664			// [some name text linkWithNoSpaces] the existence of a space is the key!665			//6 named link 7 = name 8 = link666			else if (lookaheadMatch[6])667			{668				var text = lookaheadMatch[7];669				var link = lookaheadMatch[8];670				var e = (config.formatterHelpers.isExternalLink(link)) ?671					createExternalLink(w.output,link) :672					createTiddlyLink(w.output,link,false,null,w.isStatic,w.tiddler);673				createTiddlyText(e,text);674				w.nextMatch = this.lookaheadRegExp.lastIndex;675				//alert( "name: '"+lookaheadMatch[8]+"'\nurl: '"+lookaheadMatch[9]+"'");676			} else w.output.appendChild(document.createTextNode(w.matchText));677		} else w.output.appendChild(document.createTextNode(w.matchText));678	}679},680// COPY from tiddlywiki code681{682	name: "t2tList",683	match: "^(?:[ ]*[\\+-;:] )",684	//lookaheadRegExp: /^(?:[ ]*(?:(-)|(\+)|(:)|( )) )/mg,685	lookaheadRegExp: /^(?:[ ]*(?:(-)|(\+)|(;)|(:)) )/mg,686	//http://stackoverflow.com/questions/5531899/regex-do-not-include-a-substring-within-a-group/5531972#5531972687	//                                V~do include this if it matched688	termRegExp: /(\n(?:(?=[ ]*[\+;:-] )|[ ]*[\+;:-]))/mg,689	//                  ^~lookahead for this but don't include it690	handler: function(w)691	{692		//if (! w.lengths) {693		w.lengths = [0];694		//}695		var stack = [w.output];696		var currLevel = 0, currType = null;697		var listLevel, listType, itemType, baseType;698		w.nextMatch = w.matchStart;699		this.lookaheadRegExp.lastIndex = w.nextMatch;700		var lookaheadMatch = this.lookaheadRegExp.exec(w.source);701		while(lookaheadMatch && lookaheadMatch.index == w.nextMatch) {702			if(lookaheadMatch[1]) {703				listType = "ul";704				itemType = "li";705			} else if(lookaheadMatch[2]) {706				listType = "ol";707				itemType = "li";708			} else if(lookaheadMatch[3]) {709				listType = "dl";710				itemType = "dt";711			} else if(lookaheadMatch[4]) {712				listType = "dl";713				itemType = "dd";714			}715			if(!baseType)716				baseType = listType;717			//fill levelstack718			var l = lookaheadMatch[0].length719			while ( w.lengths[w.lengths.length-1] != l ) {720				if ( l > w.lengths[w.lengths.length-1] ) {721					w.lengths.push(l);722					break;723				} else {724					w.lengths.pop();725				}726			}727			listLevel = w.lengths.length-1;728			w.nextMatch += l;729			var t;730			if(listLevel > currLevel) {731				for(t=currLevel; t<listLevel; t++) {732					var target = (currLevel == 0) ? stack[stack.length-1] : stack[stack.length-1].lastChild;733					stack.push(createTiddlyElement(target,listType));734				}735			} else if(listType!=baseType && listLevel==1) {736				w.nextMatch -= lookaheadMatch[0].length;737				return;738			} else if(listLevel < currLevel) {739				for(t=currLevel; t>listLevel; t--)740					stack.pop();741			} else if(listLevel == currLevel && listType != currType) {742				stack.pop();743				stack.push(createTiddlyElement(stack[stack.length-1].lastChild,listType));744			}745			currLevel = listLevel;746			currType = listType;747			var e = createTiddlyElement(stack[stack.length-1],itemType);748			w.subWikifyTerm(e,this.termRegExp);749			this.lookaheadRegExp.lastIndex = w.nextMatch;750			lookaheadMatch = this.lookaheadRegExp.exec(w.source);751		}752	}753},754/*755//array reassignment version.  I think that the up-to-6 assignments per iteration756//could have worse performance that resizing the array.757//see above for array re-sizing.758// HTML doesn't have an inherent number scheme for header tags. Just treat759// them as unnumbered for now.760{761	name: 't2tNumberedHeading',762	match: '^ *\\+{1,6}[^\\+\n]',763	lookaheadRegExp: / *(\+{1,6})([^\+\n][^\n]*[^\+\n])\1[ \t]*$/mg,764	handler: function(w)765	{766		if (! w.numheading) {767			w.numheading = [0,0,0,0,0,0];768		}769		this.lookaheadRegExp.lastIndex = w.matchStart;770		var lookaheadMatch = this.lookaheadRegExp.exec(w.source);771		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {772			var text = lookaheadMatch[2];773			var headingindex = lookaheadMatch[1].length - 1;774			w.numheading[headingindex]++;775			//reset the next levels down to 0776			for(var i = headingindex + 1; i<=5; i++){777				w.numheading[i] = 0;778			}779			text = " " + text;780			for (headingindex; headingindex >= 0; headingindex--) {781				text = w.numheading[headingindex] + "." + text;782			}783			createTiddlyElement(w.output,'h'+lookaheadMatch[1].length,null,null,text);784			w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;785		} else {786			w.output.appendChild(document.createTextNode(w.matchText));787		}788	}789},790*/791// t2t prepends TABs on lines that form blockquotes.792// Consecutive lines of the same depth of tabs are in the same block.793// This is just like tiddly markup, only they use angle brackets.794// Thus, I am ripping this code from a 2.6.1 formatters.795{796	name: 't2tQuoteByLine',797	match: '\\t+',798	lookaheadRegExp: /^\t+/mg,799	termRegExp: /(\n)/mg,800	element: 'blockquote',801	handler: function(w)802	{803		var stack = [w.output];804		var currLevel = 0;805		var newLevel = w.matchLength;806		var t;807		do {808			if(newLevel > currLevel) {809				for(t=currLevel; t<newLevel; t++)810					stack.push(createTiddlyElement(stack[stack.length-1],this.element));811			} else if(newLevel < currLevel) {812				for(t=currLevel; t>newLevel; t--)813					stack.pop();814			}815			currLevel = newLevel;816			w.subWikifyTerm(stack[stack.length-1],this.termRegExp);817			//originally they insert linebreaks... not in t2t818			//createTiddlyElement(stack[stack.length-1],'br');819			//replace the newline that was consumed820			if(config.browser.isIE) {821				var e = document.createTextNode('\r');822			} else {823				var e = document.createTextNode('\n');824			}825			stack[stack.length-1].appendChild(e);826			this.lookaheadRegExp.lastIndex = w.nextMatch;827			var lookaheadMatch = this.lookaheadRegExp.exec(w.source);828			var matched = lookaheadMatch && lookaheadMatch.index == w.nextMatch;829			if(matched) {830				newLevel = lookaheadMatch[0].length;831				w.nextMatch += lookaheadMatch[0].length;832			}833		} while(matched);834	}835},836/*837//COPY from tiddlywiki config.formatters838{839	name: "macro",840	match: "<<",841	////don't start new macro << HERE 842	//lookaheadRegExp: /<<([^>\s(?:<<)]+)(?:\s*)((?:[^>]|(?:>(?!>)))*)>>/mg,843	lookaheadRegExp: /<<([^>\s]+)(?:\s*)((?:[^>]|(?:>(?!>)))*)>>/mg,844	handler: function(w)845	{846		this.lookaheadRegExp.lastIndex = w.matchStart;847		var lookaheadMatch = this.lookaheadRegExp.exec(w.source);848		if(lookaheadMatch && lookaheadMatch.index == w.matchStart && lookaheadMatch[1]) {849			w.nextMatch = this.lookaheadRegExp.lastIndex;850			invokeMacro(w.output,lookaheadMatch[1],lookaheadMatch[2],w,w.tiddler);851		//with this modification for nondestructiveness.852		} else {853			w.output.appendChild(document.createTextNode(w.matchText));854		}855	}856},857*/858];859t2tReuse = function(name)860{861	var i;862	for (i = 0; i < config.formatters.length; i++) {863		if (name == config.formatters[i].name)864			return config.formatters[i];865	}866	return null;867			868};869//attach reused formatters from standard config.formatters.870config.t2tFormatters.push(t2tReuse("macro"));871config.t2tFormatters.push(t2tReuse("wikiLink"));872config.t2tFormatters.push(t2tReuse("urlLink"));873config.t2tFormatters.push(t2tReuse("htmlEntitiesEncoding"));874//config.t2tFormatters.push(t2tReuse("mdash"));875config.t2tFormatters.push(t2tReuse("table"));876/*877var text = "t2tFormatters:\n";878for (var i=0; i < config.t2tFormatters.length; i++)879	text = text + config.t2tFormatters[i].name + "\n";880alert(text);881*/882config.parsers.t2tFormatter = new Formatter(config.t2tFormatters);883config.parsers.t2tFormatter.format = 't2t';884config.parsers.t2tFormatter.formatTag = 't2t';885} // end of 'install only once'886//}}}887/***888vim: ft=javascript...wikitextrules.js
Source:wikitextrules.js  
1/*\2title: $:/plugins/tiddlywiki/tw2parser/wikitextrules.js3type: application/javascript4module-type: module5Rule modules for the wikitext parser6\*/7(function(){8/*jslint node: true, browser: true */9/*global $tw: false */10"use strict";11var macroadapter = require("$:/macros/classic/macroadapter.js");12var textPrimitives = {13	upperLetter: "[A-Z\u00c0-\u00de\u0150\u0170]",14	lowerLetter: "[a-z0-9_\\-\u00df-\u00ff\u0151\u0171]",15	anyLetter:   "[A-Za-z0-9_\\-\u00c0-\u00de\u00df-\u00ff\u0150\u0170\u0151\u0171]",16	anyLetterStrict: "[A-Za-z0-9\u00c0-\u00de\u00df-\u00ff\u0150\u0170\u0151\u0171]",17	sliceSeparator: "::",18	sectionSeparator: "##",19	urlPattern: "(?:file|http|https|mailto|ftp|irc|news|data):[^\\s'\"]+(?:/|\\b)",20	unWikiLink: "~",21	brackettedLink: "\\[\\[([^\\]]+)\\]\\]",22	titledBrackettedLink: "\\[\\[([^\\[\\]\\|]+)\\|([^\\[\\]\\|]+)\\]\\]"23};24textPrimitives.wikiLink = "(?:(?:" + textPrimitives.upperLetter + "+" +25							textPrimitives.lowerLetter + "+" +26							textPrimitives.upperLetter +27							textPrimitives.anyLetter + "*)|(?:" +28							textPrimitives.upperLetter + "{2,}" +29							textPrimitives.lowerLetter + "+))";30textPrimitives.cssLookahead = "(?:(" + textPrimitives.anyLetter +31	"+)\\(([^\\)\\|\\n]+)(?:\\):))|(?:(" + textPrimitives.anyLetter + "+):([^;\\|\\n]+);)";32textPrimitives.cssLookaheadRegExp = new RegExp(textPrimitives.cssLookahead,"mg");33textPrimitives.tiddlerForcedLinkRegExp = new RegExp("(?:" + textPrimitives.titledBrackettedLink + ")|(?:" +34	textPrimitives.brackettedLink + ")|(?:" +35	textPrimitives.urlPattern + ")","mg");36textPrimitives.tiddlerAnyLinkRegExp = new RegExp("("+ textPrimitives.wikiLink + ")|(?:" +37	textPrimitives.titledBrackettedLink + ")|(?:" +38	textPrimitives.brackettedLink + ")|(?:" +39	textPrimitives.urlPattern + ")","mg");40// Helper to add an attribute to an HTML node41var setAttr = function(node,attr,value) {42	if(!node.attributes) {43		node.attributes = {};44	}45	node.attributes[attr] ={type: "string", value:value} ;46};47var inlineCssHelper = function(w) {48	var styles = [];49	textPrimitives.cssLookaheadRegExp.lastIndex = w.nextMatch;50	var lookaheadMatch = textPrimitives.cssLookaheadRegExp.exec(w.source);51	while(lookaheadMatch && lookaheadMatch.index == w.nextMatch) {52		var s,v;53		if(lookaheadMatch[1]) {54			s = lookaheadMatch[1];55			v = lookaheadMatch[2];56		} else {57			s = lookaheadMatch[3];58			v = lookaheadMatch[4];59		}60		if(s=="bgcolor")61			s = "backgroundColor";62		if(s=="float")63			s = "cssFloat";64		styles.push({style: s, value: v});65		w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;66		textPrimitives.cssLookaheadRegExp.lastIndex = w.nextMatch;67		lookaheadMatch = textPrimitives.cssLookaheadRegExp.exec(w.source);68	}69	return styles;70};71var applyCssHelper = function(e,styles) {72	if(styles.length > 0) {73		for(var t=0; t< styles.length; t++) {74			$tw.utils.addStyleToParseTreeNode(e,$tw.utils.roundTripPropertyName(styles[t].style),styles[t].value);75		}76	}77	78};79var enclosedTextHelper = function(w) {80	this.lookaheadRegExp.lastIndex = w.matchStart;81	var lookaheadMatch = this.lookaheadRegExp.exec(w.source);82	if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {83		var text = lookaheadMatch[1];84		w.output.push({type:"element",tag:this.element,85			children:[{type: "text",text: lookaheadMatch[1]}]});86		w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;87	}88};89var insertMacroCall = function(w,output,macroName,paramString) {90	var params = [],91		reParam = /\s*(?:([A-Za-z0-9\-_]+)\s*:)?(?:\s*(?:"""([\s\S]*?)"""|"([^"]*)"|'([^']*)'|\[\[([^\]]*)\]\]|([^"'\s]+)))/mg,92		paramMatch = reParam.exec(paramString);93	while(paramMatch) {94		// Process this parameter95		var paramInfo = {96			value: paramMatch[2] || paramMatch[3] || paramMatch[4] || paramMatch[5] || paramMatch[6]97		};98		if(paramMatch[1]) {99			paramInfo.name = paramMatch[1];100		}101		params.push(paramInfo);102		// Find the next match103		paramMatch = reParam.exec(paramString);104	}105	output.push({106		type: "macrocall",107		name: macroName,108		params: params,109		isBlock: false110	});111}112var isLinkExternal = function(to) {113	var externalRegExp = /(?:file|http|https|mailto|ftp|irc|news|data|skype):[^\s'"]+(?:\/|\b)/i;114	return externalRegExp.test(to);115};116var rules = [117{118	name: "table",119	match: "^\\|(?:[^\\n]*)\\|(?:[fhck]?)$",120	lookaheadRegExp: /^\|([^\n]*)\|([fhck]?)$/mg,121	rowTermRegExp: /(\|(?:[fhck]?)$\n?)/mg,122	cellRegExp: /(?:\|([^\n\|]*)\|)|(\|[fhck]?$\n?)/mg,123	cellTermRegExp: /((?:\x20*)\|)/mg,124	rowTypes: {"c":"caption", "h":"thead", "":"tbody", "f":"tfoot"},125	handler: function(w)126	{127		var table = {type:"element",tag:"table",attributes: {"class": {type: "string", value:"table"}},128					children: []};129		130		w.output.push(table);131		var prevColumns = [];132		var currRowType = null;133		var rowContainer;134		var rowCount = 0;135		w.nextMatch = w.matchStart;136		this.lookaheadRegExp.lastIndex = w.nextMatch;137		var lookaheadMatch = this.lookaheadRegExp.exec(w.source);138		while(lookaheadMatch && lookaheadMatch.index == w.nextMatch) {139			var nextRowType = lookaheadMatch[2];140			if(nextRowType == "k") {141				table.attributes["class"] = lookaheadMatch[1];142				w.nextMatch += lookaheadMatch[0].length+1;143			} else {144				if(nextRowType != currRowType) {145					rowContainer = {type:"element",tag:this.rowTypes[nextRowType],children: []};146					table.children.push(rowContainer);147					currRowType = nextRowType;148				}149				if(currRowType == "c") {150					// Caption151					w.nextMatch++;152					// Move the caption to the first row if it isn't already153					if(table.children.length !== 1) {154						table.children.pop(); // Take rowContainer out of the children array155						table.children.splice(0,0,rowContainer); // Insert it at the bottom						156					}157					rowContainer.attributes={};158					rowContainer.attributes.align = rowCount === 0 ? "top" : "bottom";159					w.subWikifyTerm(rowContainer.children,this.rowTermRegExp);160				} else {161					var theRow = {type:"element",tag:"tr",162						attributes: {"class": {type: "string", value:rowCount%2 ? "oddRow" : "evenRow"}},163						children: []};164					165					rowContainer.children.push(theRow);166					this.rowHandler(w,theRow.children,prevColumns);167					rowCount++;168				}169			}170			this.lookaheadRegExp.lastIndex = w.nextMatch;171			lookaheadMatch = this.lookaheadRegExp.exec(w.source);172		}173	},174	rowHandler: function(w,e,prevColumns)175	{176		var col = 0;177		var colSpanCount = 1;178		var prevCell = null;179		this.cellRegExp.lastIndex = w.nextMatch;180		var cellMatch = this.cellRegExp.exec(w.source);181		while(cellMatch && cellMatch.index == w.nextMatch) {182			if(cellMatch[1] == "~") {183				// Rowspan184				var last = prevColumns[col];185			if(last) {186				last.rowSpanCount++;187				$tw.utils.addAttributeToParseTreeNode(last.element,"rowspan",last.rowSpanCount);188				var vAlign = $tw.utils.getAttributeValueFromParseTreeNode(last.element,"valign","center");189				$tw.utils.addAttributeToParseTreeNode(last.element,"valign",vAlign);190				if(colSpanCount > 1) {191					$tw.utils.addAttributeToParseTreeNode(last.element,"colspan",colSpanCount);192					colSpanCount = 1;193				}194			}195				w.nextMatch = this.cellRegExp.lastIndex-1;196			} else if(cellMatch[1] == ">") {197				// Colspan198				colSpanCount++;199				w.nextMatch = this.cellRegExp.lastIndex-1;200			} else if(cellMatch[2]) {201				// End of row202				if(prevCell && colSpanCount > 1) {203					prevCell.attributes.colspan = colSpanCount;204				}205				w.nextMatch = this.cellRegExp.lastIndex;206				break;207			} else {208				// Cell209				w.nextMatch++;210				var styles = inlineCssHelper(w);211				var spaceLeft = false;212				var chr = w.source.substr(w.nextMatch,1);213				while(chr == " ") {214					spaceLeft = true;215					w.nextMatch++;216					chr = w.source.substr(w.nextMatch,1);217				}218				var cell;219				if(chr == "!") {220					cell = {type:"element",tag:"th",children: []};221					e.push(cell);222					w.nextMatch++;223				} else {224					cell = {type:"element",tag:"td",children: []};225					e.push(cell);226				}227				prevCell = cell;228				prevColumns[col] = {rowSpanCount:1,element:cell};229				if(colSpanCount > 1) {230					$tw.utils.addAttributeToParseTreeNode(cell,"colspan",colSpanCount);231					colSpanCount = 1;232				}233				applyCssHelper(cell,styles);234				w.subWikifyTerm(cell.children,this.cellTermRegExp);235				if (!cell.attributes) cell.attributes ={};236				if(w.matchText.substr(w.matchText.length-2,1) == " ") // spaceRight237					$tw.utils.addAttributeToParseTreeNode(cell,"align",spaceLeft ? "center" : "left");238				else if(spaceLeft)239					$tw.utils.addAttributeToParseTreeNode(cell,"align","right");240				w.nextMatch--;241			}242			col++;243			this.cellRegExp.lastIndex = w.nextMatch;244			cellMatch = this.cellRegExp.exec(w.source);245		}246	}247},248{249	name: "heading",250	match: "^!{1,6}",251	termRegExp: /(\n)/mg,252	handler: function(w)253	{254		var e = {type:"element",tag:"h" + w.matchLength,children: []};255		w.output.push(e);256		w.subWikifyTerm(e.children,this.termRegExp);257	}258},259{260	name: "list",261	match: "^(?:[\\*#;:]+)",262	lookaheadRegExp: /^(?:(?:(\*)|(#)|(;)|(:))+)/mg,263	termRegExp: /(\n)/mg,264	handler: function(w)265	{266		var stack = [w.output];267		var currLevel = 0, currType = null;268		var listLevel, listType, itemType, baseType;269		w.nextMatch = w.matchStart;270		this.lookaheadRegExp.lastIndex = w.nextMatch;271		var lookaheadMatch = this.lookaheadRegExp.exec(w.source);272		while(lookaheadMatch && lookaheadMatch.index == w.nextMatch) {273			if(lookaheadMatch[1]) {274				listType = "ul";275				itemType = "li";276			} else if(lookaheadMatch[2]) {277				listType = "ol";278				itemType = "li";279			} else if(lookaheadMatch[3]) {280				listType = "dl";281				itemType = "dt";282			} else if(lookaheadMatch[4]) {283				listType = "dl";284				itemType = "dd";285			}286			if(!baseType)287				baseType = listType;288			listLevel = lookaheadMatch[0].length;289			w.nextMatch += lookaheadMatch[0].length;290			var t,e;291			if(listLevel > currLevel) {292				for(t=currLevel; t<listLevel; t++) {293					var target = stack[stack.length-1];294					if(currLevel !== 0 && target.children) {295						target = target.children[target.children.length-1];296					}297					e = {type:"element",tag:listType,children: []};298					target.push(e);299					stack.push(e.children);300				}301			} else if(listType!=baseType && listLevel==1) {302				w.nextMatch -= lookaheadMatch[0].length;303				return;304			} else if(listLevel < currLevel) {305				for(t=currLevel; t>listLevel; t--)306					stack.pop();307			} else if(listLevel == currLevel && listType != currType) {308				stack.pop();309				e = {type:"element",tag:listType,children: []};310				stack[stack.length-1].push(e);311				stack.push(e.children);312			}313			currLevel = listLevel;314			currType = listType;315			e = {type:"element",tag:itemType,children: []};316			stack[stack.length-1].push(e);317			w.subWikifyTerm(e.children,this.termRegExp);318			this.lookaheadRegExp.lastIndex = w.nextMatch;319			lookaheadMatch = this.lookaheadRegExp.exec(w.source);320		}321	}322},323{324	name: "quoteByBlock",325	match: "^<<<\\n",326	termRegExp: /(^<<<(\n|$))/mg,327	element: "blockquote",328	handler:  function(w) {329		var e = {type:"element",tag:this.element,children: []};330		w.output.push(e);331		w.subWikifyTerm(e.children,this.termRegExp);332	}333},334{335	name: "quoteByLine",336	match: "^>+",337	lookaheadRegExp: /^>+/mg,338	termRegExp: /(\n)/mg,339	element: "blockquote",340	handler: function(w)341	{342		var stack = [];343		var currLevel = 0;344		var newLevel = w.matchLength;345		var t,matched,e;346		do {347			if(newLevel > currLevel) {348				for(t=currLevel; t<newLevel; t++) {349					var f = stack[stack.length-1];350					e = {type:"element",tag:this.element,children: []};351					stack.push(e);352					if (t ===0){353						w.output.push(e);354					}else {355						f.children.push(e);356						357					}358				}359			} else if(newLevel < currLevel) {360				for(t=currLevel; t>newLevel; t--)361					stack.pop();362			}363			currLevel = newLevel;364			w.subWikifyTerm(stack[stack.length-1].children,this.termRegExp);365			stack[stack.length-1].children.push({type:"element",tag:"br"});366			//e.push({type:"element",tag:"br"});367			this.lookaheadRegExp.lastIndex = w.nextMatch;368			var lookaheadMatch = this.lookaheadRegExp.exec(w.source);369			matched = lookaheadMatch && lookaheadMatch.index == w.nextMatch;370			if(matched) {371				newLevel = lookaheadMatch[0].length;372				w.nextMatch += lookaheadMatch[0].length;373			}374		} while(matched);375	}376},377{378	name: "rule",379	match: "^----+$\\n?|<hr ?/?>\\n?",380	handler: function(w)381	{382		w.output.push({type:"element",tag:"hr"});383	}384},385{386	name: "monospacedByLine",387	match: "^(?:/\\*\\{\\{\\{\\*/|\\{\\{\\{|//\\{\\{\\{|<!--\\{\\{\\{-->)\\n",388	element: "pre",389	handler: function(w)390	{391		switch(w.matchText) {392		case "/*{{{*/\n": // CSS393			this.lookaheadRegExp = /\/\*\{\{\{\*\/\n*((?:^[^\n]*\n)+?)(\n*^\f*\/\*\}\}\}\*\/$\n?)/mg;394			break;395		case "{{{\n": // monospaced block396			this.lookaheadRegExp = /^\{\{\{\n((?:^[^\n]*\n)+?)(^\f*\}\}\}$\n?)/mg;397			break;398		case "//{{{\n": // plugin399			this.lookaheadRegExp = /^\/\/\{\{\{\n\n*((?:^[^\n]*\n)+?)(\n*^\f*\/\/\}\}\}$\n?)/mg;400			break;401		case "<!--{{{-->\n": //template402			this.lookaheadRegExp = /<!--\{\{\{-->\n*((?:^[^\n]*\n)+?)(\n*^\f*<!--\}\}\}-->$\n?)/mg;403			break;404		default:405			break;406		}407		enclosedTextHelper.call(this,w);408	}409},410{411	name: "typedBlock",412		match: "^\\$\\$\\$(?:[^ >\\r\\n]*)\\r?\\n",413	lookaheadRegExp: /^\$\$\$([^ >\r\n]*)\n((?:^[^\n]*\r?\n)+?)(^\f*\$\$\$\r?\n?)/mg,414	//match: "^\\$\\$\\$(?:[^ >\\r\\n]*)(?: *> *([^ \\r\\n]+))?\\r?\\n",415	//lookaheadRegExp: /^\$\$\$([^ >\r\n]*)(?: *> *([^ \r\n]+))\n((?:^[^\n]*\n)+?)(^\f*\$\$\$$\n?)/mg,416	handler: function(w)417	{418		this.lookaheadRegExp.lastIndex = w.matchStart;419		var lookaheadMatch = this.lookaheadRegExp.exec(w.source);420		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {421			// The wikitext parsing infrastructure is horribly unre-entrant422			var parseType = lookaheadMatch[1],423				renderType ,//= this.match[2],424				text = lookaheadMatch[2],425				oldOutput = w.output,426				oldSource = w.source,427				oldNextMatch = w.nextMatch,428				oldChildren = w.children;429			// Parse the block according to the specified type430			var parser = $tw.wiki.parseText(parseType,text.toString(),{defaultType: "text/plain"});431			w.output = oldOutput;432			w.source = oldSource;433			w.nextMatch = oldNextMatch;434			w.children = oldChildren;435			for (var i=0; i<parser.tree.length; i++) {436				w.output.push(parser.tree[i]);437			}438			w.nextMatch = this.lookaheadRegExp.lastIndex;439		}440	}441},442{443	name: "wikifyComment",444	match: "^(?:/\\*\\*\\*|<!---)\\n",445	handler: function(w)446	{447		var termRegExp = (w.matchText == "/***\n") ? (/(^\*\*\*\/\n)/mg) : (/(^--->\n)/mg);448		w.subWikifyTerm(w.output,termRegExp);449	}450},451{452	name: "macro",453	match: "<<",454	lookaheadRegExp: /<<(?:([!@£\$%\^\&\*\(\)`\~'"\|\\\/;\:\.\,\+\=\-\_\{\}])|([^>\s]+))(?:\s*)((?:[^>]|(?:>(?!>)))*)>>/mg,455	handler: function(w)456	{457		this.lookaheadRegExp.lastIndex = w.matchStart;458		var lookaheadMatch = this.lookaheadRegExp.exec(w.source),459			name;460		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {461			name = lookaheadMatch[1] || lookaheadMatch[2];462			var params = lookaheadMatch[3], nameold =name;463			if (name) {464				if (!!macroadapter.paramadapter[name]) {465					params=macroadapter.paramadapter[name](params);466					//alert("going out as "+params);467				}468				if (!!macroadapter.namedapter[name]) {469					name=macroadapter.namedapter[name];470				}471				w.nextMatch = this.lookaheadRegExp.lastIndex;472				insertMacroCall(w,w.output,name,params);473			}474		}475	}476},477{478	name: "prettyLink",479	match: "\\[\\[",480	lookaheadRegExp: /\[\[(.*?)(?:\|(~)?(.*?))?\]\]/mg,481	handler: function(w)482	{483		this.lookaheadRegExp.lastIndex = w.matchStart;484		var lookaheadMatch = this.lookaheadRegExp.exec(w.source);485		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {486			var text = lookaheadMatch[1],487				link = text;488			if(lookaheadMatch[3]) {489				// Pretty bracketted link490				link = lookaheadMatch[3];491			}492	if(isLinkExternal(link)) {493		w.output.push({494			type: "element",495			tag: "a",496			attributes: {497				href: {type: "string", value: link},498				"class": {type: "string", value: "tc-tiddlylink-external"},499				target: {type: "string", value: "_blank"}500			},501			children: [{502				type: "text", text: text503			}]504		});505	} else {506		w.output.push({507			type: "link",508			attributes: {509				to: {type: "string", value: link}510			},511			children: [{512				type: "text", text: text513			}]514		});515	}516			w.nextMatch = this.lookaheadRegExp.lastIndex;517		}518	}519},520{521	name: "wikiLink",522	match: textPrimitives.unWikiLink+"?"+textPrimitives.wikiLink,523	handler: function(w)524	{525		if(w.matchText.substr(0,1) == textPrimitives.unWikiLink) {526			w.outputText(w.output,w.matchStart+1,w.nextMatch);527			return;528		}529		if(w.matchStart > 0) {530			var preRegExp = new RegExp(textPrimitives.anyLetterStrict,"mg");531			preRegExp.lastIndex = w.matchStart-1;532			var preMatch = preRegExp.exec(w.source);533			if(preMatch.index == w.matchStart-1) {534				w.outputText(w.output,w.matchStart,w.nextMatch);535				return;536			}537		}538		if(w.autoLinkWikiWords) {539			w.output.push({540				type: "link",541				attributes: {542					to: {type: "string", value: w.matchText}543				},544				children: [{545					type: "text",546					text: w.source.substring(w.matchStart,w.nextMatch)547				}]548			});549		} else {	550			w.outputText(w.output,w.matchStart,w.nextMatch);551		}552	}553},554{555	name: "urlLink",556	match: textPrimitives.urlPattern,557	handler: function(w)558	{559			w.output.push({560			type: "element",561			tag: "a",562			attributes: {563				href: {type: "string", value: w.matchText},564				"class": {type: "string", value: "tc-tiddlylink-external"},565				target: {type: "string", value: "_blank"}566			},567			children: [{568				type: "text", text: w.source.substring(w.matchStart,w.nextMatch)569			}]570		});571	}572},573{574	name: "image",575	match: "\\[[<>]?[Ii][Mm][Gg]\\[",576	// [<] sequence below is to avoid lessThan-questionMark sequence so TiddlyWikis can be included in PHP files577	lookaheadRegExp: /\[([<]?)(>?)[Ii][Mm][Gg]\[(?:([^\|\]]+)\|)?([^\[\]\|]+)\](?:\[([^\]]*)\])?\]/mg,578	handler: function(w)579	{580		var node = {581			type: "image",582			attributes: {}583		};584		this.lookaheadRegExp.lastIndex = w.matchStart;585		var lookaheadMatch = this.lookaheadRegExp.exec(w.source),586			imageParams = {},587			linkParams = {};588		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {589			if(lookaheadMatch[1]) {590				node.attributes.class = {type: "string", value: "classic-image-left"};591			} else if(lookaheadMatch[2]) {592				node.attributes.class  = {type: "string", value: "classic-image-right"};593			}594			if(lookaheadMatch[3]) {595				node.attributes.tooltip = {type: "string", value: lookaheadMatch[3]};596			}597			node.attributes.source = {type: "string", value: lookaheadMatch[4]};598			if(lookaheadMatch[5]) {599				if(isLinkExternal(lookaheadMatch[5])) {600					w.output.push({601						type: "element",602						tag: "a",603						attributes: {604							href: {type: "string", value:lookaheadMatch[5]},605							"class": {type: "string", value: "tc-tiddlylink-external"},606							target: {type: "string", value: "_blank"}607						},608						children: [node]609					});610				} else {611					w.output.push({612						type: "link",613						attributes: {614							to: {type: "string", value: lookaheadMatch[5]}615						},616						children: [node]617					});618				}619			} else {620				w.output.push(node);621			}622			w.nextMatch = this.lookaheadRegExp.lastIndex;623		}624	}625},626{627	name: "html",628	match: "<[Hh][Tt][Mm][Ll]>",629	lookaheadRegExp: /<[Hh][Tt][Mm][Ll]>((?:.|\n)*?)<\/[Hh][Tt][Mm][Ll]>/mg,630	handler: function(w)631	{632		this.lookaheadRegExp.lastIndex = w.matchStart;633		var lookaheadMatch = this.lookaheadRegExp.exec(w.source);634		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {635			w.output.push({	type:"raw", html:lookaheadMatch[1]});636			w.nextMatch = this.lookaheadRegExp.lastIndex;637		}638	}639},640{641	name: "commentByBlock",642	match: "/%",643	lookaheadRegExp: /\/%((?:.|\n)*?)%\//mg,644	handler: function(w)645	{646		this.lookaheadRegExp.lastIndex = w.matchStart;647		var lookaheadMatch = this.lookaheadRegExp.exec(w.source);648		if(lookaheadMatch && lookaheadMatch.index == w.matchStart)649			w.nextMatch = this.lookaheadRegExp.lastIndex;650	}651},652{653	name: "characterFormat",654	match: "''|//|__|\\^\\^|~~|--(?!\\s|$)|\\{\\{\\{|`",655	handler: function(w)656	{657		var e,lookaheadRegExp,lookaheadMatch;658		switch(w.matchText) {659		case "''":660			e = {type:"element",tag:"strong",children: []};661			w.output.push(e);662			w.subWikifyTerm(e.children,/('')/mg);663			break;664		case "//":665			e = {type:"element",tag:"em",children: []};666			w.output.push(e);667			w.subWikifyTerm(e.children,/(\/\/)/mg);668			break;669		case "__":670			e = {type:"element",tag:"u",children: []};671			w.output.push(e);672			w.subWikifyTerm(e.children,/(__)/mg);673			break;674		case "^^":675			e = {type:"element",tag:"sup",children: []};676			w.output.push(e);677			w.subWikifyTerm(e.children,/(\^\^)/mg);678			break;679		case "~~":680			e = {type:"element",tag:"sub",children: []};681			w.output.push(e);682			w.subWikifyTerm(e.children,/(~~)/mg);683			break;684		case "--":685			e = {type:"element",tag:"strike",children: []};686			w.output.push(e);687			w.subWikifyTerm(e.children,/(--)/mg);688			break;689		case "`":690			lookaheadRegExp = /`((?:.|\n)*?)`/mg;691			lookaheadRegExp.lastIndex = w.matchStart;692			lookaheadMatch = lookaheadRegExp.exec(w.source);693			if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {694				w.output.push({type:"element",tag:"code",695					children:[{type: "text",text: lookaheadMatch[1]}]});696			}697			break;698		case "{{{":699			lookaheadRegExp = /\{\{\{((?:.|\n)*?)\}\}\}/mg;700			lookaheadRegExp.lastIndex = w.matchStart;701			lookaheadMatch = lookaheadRegExp.exec(w.source);702			if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {703				w.output.push({type:"element",tag:"code",704					children:[{type: "text",text: lookaheadMatch[1]}]});705				w.nextMatch = lookaheadRegExp.lastIndex;706			}707			break;708		}709	}710},711{712	name: "customFormat",713	match: "@@|\\{\\{",714	handler: function(w)715	{716		switch(w.matchText) {717		case "@@":718			var e = {type:"element",tag:"span",children: []};719			w.output.push(e);720			var styles = inlineCssHelper(w);721			if(styles.length === 0)722				setAttr(e,"class","marked");723			else724				applyCssHelper(e,styles);725			w.subWikifyTerm(e.children,/(@@)/mg);726			break;727		case "{{":728			var lookaheadRegExp = /\{\{[\s]*([\-\w]+[\-\s\w]*)[\s]*\{(\n?)/mg;729			lookaheadRegExp.lastIndex = w.matchStart;730			var lookaheadMatch = lookaheadRegExp.exec(w.source);731			if(lookaheadMatch) {732				w.nextMatch = lookaheadRegExp.lastIndex;733				e = {type:"element",tag:lookaheadMatch[2] == "\n" ? "div" : "span",734					attributes: {"class": {type: "string", value:lookaheadMatch[1]}},children: []};735				w.output.push(e);736				w.subWikifyTerm(e.children,/(\}\}\})/mg);737			}738			break;739		}740	}741},742{743	name: "mdash",744	match: "--",745	handler: function(w)746	{747		w.output.push({type: "entity", entity: "—"});748	}749},750{751	name: "lineBreak",752	match: "\\n|<br ?/?>",753	handler: function(w)754	{755		w.output.push({type:"element",tag:"br"});756	}757},758{759	name: "rawText",760	match: "\"{3}|<nowiki>",761	lookaheadRegExp: /(?:\"{3}|<nowiki>)((?:.|\n)*?)(?:\"{3}|<\/nowiki>)/mg,762	handler: function(w)763	{764		this.lookaheadRegExp.lastIndex = w.matchStart;765		var lookaheadMatch = this.lookaheadRegExp.exec(w.source);766		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {767			w.output.push({type: "text",text: lookaheadMatch[1]768			});769			w.nextMatch = this.lookaheadRegExp.lastIndex;770		}771	}772},773{774	name: "htmlEntitiesEncoding",775	match: "&#?[a-zA-Z0-9]{2,8};",776	handler: function(w)777	{778		w.output.push({type: "entity", entity: w.matchText});779	}780}781];782exports.rules = rules;...Formatter.js
Source:Formatter.js  
1//--2//-- Standard formatters3//--4config.formatters = [5{6	name: "table",7	match: "^\\|(?:[^\\n]*)\\|(?:[fhck]?)$",8	lookaheadRegExp: /^\|([^\n]*)\|([fhck]?)$/mg,9	rowTermRegExp: /(\|(?:[fhck]?)$\n?)/mg,10	cellRegExp: /(?:\|([^\n\|]*)\|)|(\|[fhck]?$\n?)/mg,11	cellTermRegExp: /((?:\x20*)\|)/mg,12	rowTypes: {"c":"caption", "h":"thead", "":"tbody", "f":"tfoot"},13	handler: function(w)14	{15		var table = createTiddlyElement(w.output,"table",null,"twtable");16		var prevColumns = [];17		var currRowType = null;18		var rowContainer;19		var rowCount = 0;20		var onmouseover = function() {jQuery(this).addClass("hoverRow");};21		var onmouseout = function() {jQuery(this).removeClass("hoverRow");};22		w.nextMatch = w.matchStart;23		this.lookaheadRegExp.lastIndex = w.nextMatch;24		var lookaheadMatch = this.lookaheadRegExp.exec(w.source);25		while(lookaheadMatch && lookaheadMatch.index == w.nextMatch) {26			var nextRowType = lookaheadMatch[2];27			if(nextRowType == "k") {28				table.className = lookaheadMatch[1];29				w.nextMatch += lookaheadMatch[0].length+1;30			} else {31				if(nextRowType != currRowType) {32					rowContainer = createTiddlyElement(table,this.rowTypes[nextRowType]);33					currRowType = nextRowType;34				}35				if(currRowType == "c") {36					// Caption37					w.nextMatch++;38					if(rowContainer != table.firstChild)39						table.insertBefore(rowContainer,table.firstChild);40					rowContainer.setAttribute("align",rowCount == 0?"top":"bottom");41					w.subWikifyTerm(rowContainer,this.rowTermRegExp);42				} else {43					var theRow = createTiddlyElement(rowContainer,"tr",null,rowCount%2?"oddRow":"evenRow");44					theRow.onmouseover = onmouseover;45					theRow.onmouseout = onmouseout;46					this.rowHandler(w,theRow,prevColumns);47					rowCount++;48				}49			}50			this.lookaheadRegExp.lastIndex = w.nextMatch;51			lookaheadMatch = this.lookaheadRegExp.exec(w.source);52		}53	},54	rowHandler: function(w,e,prevColumns)55	{56		var col = 0;57		var colSpanCount = 1;58		var prevCell = null;59		this.cellRegExp.lastIndex = w.nextMatch;60		var cellMatch = this.cellRegExp.exec(w.source);61		while(cellMatch && cellMatch.index == w.nextMatch) {62			if(cellMatch[1] == "~") {63				// Rowspan64				var last = prevColumns[col];65				if(last) {66					last.rowSpanCount++;67					last.element.setAttribute("rowspan",last.rowSpanCount);68					last.element.setAttribute("rowSpan",last.rowSpanCount); // Needed for IE69					last.element.valign = "center";70					if(colSpanCount > 1) {71						last.element.setAttribute("colspan",colSpanCount);72						last.element.setAttribute("colSpan",colSpanCount); // Needed for IE73						colSpanCount = 1;74					}75				}76				w.nextMatch = this.cellRegExp.lastIndex-1;77			} else if(cellMatch[1] == ">") {78				// Colspan79				colSpanCount++;80				w.nextMatch = this.cellRegExp.lastIndex-1;81			} else if(cellMatch[2]) {82				// End of row83				if(prevCell && colSpanCount > 1) {84					prevCell.setAttribute("colspan",colSpanCount);85					prevCell.setAttribute("colSpan",colSpanCount); // Needed for IE86				}87				w.nextMatch = this.cellRegExp.lastIndex;88				break;89			} else {90				// Cell91				w.nextMatch++;92				var styles = config.formatterHelpers.inlineCssHelper(w);93				var spaceLeft = false;94				var chr = w.source.substr(w.nextMatch,1);95				while(chr == " ") {96					spaceLeft = true;97					w.nextMatch++;98					chr = w.source.substr(w.nextMatch,1);99				}100				var cell;101				if(chr == "!") {102					cell = createTiddlyElement(e,"th");103					w.nextMatch++;104				} else {105					cell = createTiddlyElement(e,"td");106				}107				prevCell = cell;108				prevColumns[col] = {rowSpanCount:1,element:cell};109				if(colSpanCount > 1) {110					cell.setAttribute("colspan",colSpanCount);111					cell.setAttribute("colSpan",colSpanCount); // Needed for IE112					colSpanCount = 1;113				}114				config.formatterHelpers.applyCssHelper(cell,styles);115				w.subWikifyTerm(cell,this.cellTermRegExp);116				if(w.matchText.substr(w.matchText.length-2,1) == " ") // spaceRight117					cell.align = spaceLeft ? "center" : "left";118				else if(spaceLeft)119					cell.align = "right";120				w.nextMatch--;121			}122			col++;123			this.cellRegExp.lastIndex = w.nextMatch;124			cellMatch = this.cellRegExp.exec(w.source);125		}126	}127},128{129	name: "heading",130	match: "^!{1,6}",131	termRegExp: /(\n)/mg,132	handler: function(w)133	{134		w.subWikifyTerm(createTiddlyElement(w.output,"h" + w.matchLength),this.termRegExp);135	}136},137{138	name: "list",139	match: "^(?:[\\*#;:]+)",140	lookaheadRegExp: /^(?:(?:(\*)|(#)|(;)|(:))+)/mg,141	termRegExp: /(\n)/mg,142	handler: function(w)143	{144		var stack = [w.output];145		var currLevel = 0, currType = null;146		var listLevel, listType, itemType, baseType;147		w.nextMatch = w.matchStart;148		this.lookaheadRegExp.lastIndex = w.nextMatch;149		var lookaheadMatch = this.lookaheadRegExp.exec(w.source);150		while(lookaheadMatch && lookaheadMatch.index == w.nextMatch) {151			if(lookaheadMatch[1]) {152				listType = "ul";153				itemType = "li";154			} else if(lookaheadMatch[2]) {155				listType = "ol";156				itemType = "li";157			} else if(lookaheadMatch[3]) {158				listType = "dl";159				itemType = "dt";160			} else if(lookaheadMatch[4]) {161				listType = "dl";162				itemType = "dd";163			}164			if(!baseType)165				baseType = listType;166			listLevel = lookaheadMatch[0].length;167			w.nextMatch += lookaheadMatch[0].length;168			var t;169			if(listLevel > currLevel) {170				for(t=currLevel; t<listLevel; t++) {171					var target = (currLevel == 0) ? stack[stack.length-1] : stack[stack.length-1].lastChild;172					stack.push(createTiddlyElement(target,listType));173				}174			} else if(listType!=baseType && listLevel==1) {175				w.nextMatch -= lookaheadMatch[0].length;176				return;177			} else if(listLevel < currLevel) {178				for(t=currLevel; t>listLevel; t--)179					stack.pop();180			} else if(listLevel == currLevel && listType != currType) {181				stack.pop();182				stack.push(createTiddlyElement(stack[stack.length-1].lastChild,listType));183			}184			currLevel = listLevel;185			currType = listType;186			var e = createTiddlyElement(stack[stack.length-1],itemType);187			w.subWikifyTerm(e,this.termRegExp);188			this.lookaheadRegExp.lastIndex = w.nextMatch;189			lookaheadMatch = this.lookaheadRegExp.exec(w.source);190		}191	}192},193{194	name: "quoteByBlock",195	match: "^<<<\\n",196	termRegExp: /(^<<<(\n|$))/mg,197	element: "blockquote",198	handler: config.formatterHelpers.createElementAndWikify199},200{201	name: "quoteByLine",202	match: "^>+",203	lookaheadRegExp: /^>+/mg,204	termRegExp: /(\n)/mg,205	element: "blockquote",206	handler: function(w)207	{208		var stack = [w.output];209		var currLevel = 0;210		var newLevel = w.matchLength;211		var t,matched;212		do {213			if(newLevel > currLevel) {214				for(t=currLevel; t<newLevel; t++)215					stack.push(createTiddlyElement(stack[stack.length-1],this.element));216			} else if(newLevel < currLevel) {217				for(t=currLevel; t>newLevel; t--)218					stack.pop();219			}220			currLevel = newLevel;221			w.subWikifyTerm(stack[stack.length-1],this.termRegExp);222			createTiddlyElement(stack[stack.length-1],"br");223			this.lookaheadRegExp.lastIndex = w.nextMatch;224			var lookaheadMatch = this.lookaheadRegExp.exec(w.source);225			matched = lookaheadMatch && lookaheadMatch.index == w.nextMatch;226			if(matched) {227				newLevel = lookaheadMatch[0].length;228				w.nextMatch += lookaheadMatch[0].length;229			}230		} while(matched);231	}232},233{234	name: "rule",235	match: "^----+$\\n?|<hr ?/?>\\n?",236	handler: function(w)237	{238		createTiddlyElement(w.output,"hr");239	}240},241{242	name: "monospacedByLine",243	match: "^(?:/\\*\\{\\{\\{\\*/|\\{\\{\\{|//\\{\\{\\{|<!--\\{\\{\\{-->)\\n",244	element: "pre",245	handler: function(w)246	{247		switch(w.matchText) {248		case "/*{{{*/\n": // CSS249			this.lookaheadRegExp = /\/\*\{\{\{\*\/\n*((?:^[^\n]*\n)+?)(\n*^\f*\/\*\}\}\}\*\/$\n?)/mg;250			break;251		case "{{{\n": // monospaced block252			this.lookaheadRegExp = /^\{\{\{\n((?:^[^\n]*\n)+?)(^\f*\}\}\}$\n?)/mg;253			break;254		case "//{{{\n": // plugin255			this.lookaheadRegExp = /^\/\/\{\{\{\n\n*((?:^[^\n]*\n)+?)(\n*^\f*\/\/\}\}\}$\n?)/mg;256			break;257		case "<!--{{{-->\n": //template258			this.lookaheadRegExp = /<!--\{\{\{-->\n*((?:^[^\n]*\n)+?)(\n*^\f*<!--\}\}\}-->$\n?)/mg;259			break;260		default:261			break;262		}263		config.formatterHelpers.enclosedTextHelper.call(this,w);264	}265},266{267	name: "wikifyComment",268	match: "^(?:/\\*\\*\\*|<!---)\\n",269	handler: function(w)270	{271		var termRegExp = (w.matchText == "/***\n") ? (/(^\*\*\*\/\n)/mg) : (/(^--->\n)/mg);272		w.subWikifyTerm(w.output,termRegExp);273	}274},275{276	name: "macro",277	match: "<<",278	lookaheadRegExp: /<<([^>\s]+)(?:\s*)((?:[^>]|(?:>(?!>)))*)>>/mg,279	handler: function(w)280	{281		this.lookaheadRegExp.lastIndex = w.matchStart;282		var lookaheadMatch = this.lookaheadRegExp.exec(w.source);283		if(lookaheadMatch && lookaheadMatch.index == w.matchStart && lookaheadMatch[1]) {284			w.nextMatch = this.lookaheadRegExp.lastIndex;285			invokeMacro(w.output,lookaheadMatch[1],lookaheadMatch[2],w,w.tiddler);286		}287	}288},289{290	name: "prettyLink",291	match: "\\[\\[",292	lookaheadRegExp: /\[\[(.*?)(?:\|(~)?(.*?))?\]\]/mg,293	handler: function(w)294	{295		this.lookaheadRegExp.lastIndex = w.matchStart;296		var lookaheadMatch = this.lookaheadRegExp.exec(w.source);297		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {298			var e;299			var text = lookaheadMatch[1];300			if(lookaheadMatch[3]) {301				// Pretty bracketted link302				var link = lookaheadMatch[3];303				e = (!lookaheadMatch[2] && config.formatterHelpers.isExternalLink(link)) ?304						createExternalLink(w.output,link) : createTiddlyLink(w.output,link,false,null,w.isStatic,w.tiddler);305			} else {306				// Simple bracketted link307				e = createTiddlyLink(w.output,text,false,null,w.isStatic,w.tiddler);308			}309			createTiddlyText(e,text);310			w.nextMatch = this.lookaheadRegExp.lastIndex;311		}312	}313},314{315	name: "wikiLink",316	match: config.textPrimitives.unWikiLink+"?"+config.textPrimitives.wikiLink,317	handler: function(w)318	{319		if(w.matchText.substr(0,1) == config.textPrimitives.unWikiLink) {320			w.outputText(w.output,w.matchStart+1,w.nextMatch);321			return;322		}323		if(w.matchStart > 0) {324			var preRegExp = new RegExp(config.textPrimitives.anyLetterStrict,"mg");325			preRegExp.lastIndex = w.matchStart-1;326			var preMatch = preRegExp.exec(w.source);327			if(preMatch.index == w.matchStart-1) {328				w.outputText(w.output,w.matchStart,w.nextMatch);329				return;330			}331		}332		if(w.autoLinkWikiWords || store.isShadowTiddler(w.matchText)) {333			var link = createTiddlyLink(w.output,w.matchText,false,null,w.isStatic,w.tiddler);334			w.outputText(link,w.matchStart,w.nextMatch);335		} else {336			w.outputText(w.output,w.matchStart,w.nextMatch);337		}338	}339},340{341	name: "urlLink",342	match: config.textPrimitives.urlPattern,343	handler: function(w)344	{345		w.outputText(createExternalLink(w.output,w.matchText),w.matchStart,w.nextMatch);346	}347},348{349	name: "image",350	match: "\\[[<>]?[Ii][Mm][Gg]\\[",351	//# [<] sequence below is to avoid lessThan-questionMark sequence so TiddlyWikis can be included in PHP files352	lookaheadRegExp: /\[([<]?)(>?)[Ii][Mm][Gg]\[(?:([^\|\]]+)\|)?([^\[\]\|]+)\](?:\[([^\]]*)\])?\]/mg,353	handler: function(w)354	{355		this.lookaheadRegExp.lastIndex = w.matchStart;356		var lookaheadMatch = this.lookaheadRegExp.exec(w.source);357		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {358			var e = w.output;359			if(lookaheadMatch[5]) {360				var link = lookaheadMatch[5];361				e = config.formatterHelpers.isExternalLink(link) ? createExternalLink(w.output,link) : createTiddlyLink(w.output,link,false,null,w.isStatic,w.tiddler);362				jQuery(e).addClass("imageLink");363			}364			var img = createTiddlyElement(e,"img");365			if(lookaheadMatch[1])366				img.align = "left";367			else if(lookaheadMatch[2])368				img.align = "right";369			if(lookaheadMatch[3]) {370				img.title = lookaheadMatch[3];371				img.setAttribute("alt",lookaheadMatch[3]);372			}373			img.src = lookaheadMatch[4];374			w.nextMatch = this.lookaheadRegExp.lastIndex;375		}376	}377},378{379	name: "html",380	match: "<[Hh][Tt][Mm][Ll]>",381	lookaheadRegExp: /<[Hh][Tt][Mm][Ll]>((?:.|\n)*?)<\/[Hh][Tt][Mm][Ll]>/mg,382	handler: function(w)383	{384		this.lookaheadRegExp.lastIndex = w.matchStart;385		var lookaheadMatch = this.lookaheadRegExp.exec(w.source);386		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {387			createTiddlyElement(w.output,"span").innerHTML = lookaheadMatch[1];388			w.nextMatch = this.lookaheadRegExp.lastIndex;389		}390	}391},392{393	name: "commentByBlock",394	match: "/%",395	lookaheadRegExp: /\/%((?:.|\n)*?)%\//mg,396	handler: function(w)397	{398		this.lookaheadRegExp.lastIndex = w.matchStart;399		var lookaheadMatch = this.lookaheadRegExp.exec(w.source);400		if(lookaheadMatch && lookaheadMatch.index == w.matchStart)401			w.nextMatch = this.lookaheadRegExp.lastIndex;402	}403},404{405	name: "characterFormat",406	match: "''|//|__|\\^\\^|~~|--(?!\\s|$)|\\{\\{\\{",407	handler: function(w)408	{409		switch(w.matchText) {410		case "''":411			w.subWikifyTerm(w.output.appendChild(document.createElement("strong")),/('')/mg);412			break;413		case "//":414			w.subWikifyTerm(createTiddlyElement(w.output,"em"),/(\/\/)/mg);415			break;416		case "__":417			w.subWikifyTerm(createTiddlyElement(w.output,"u"),/(__)/mg);418			break;419		case "^^":420			w.subWikifyTerm(createTiddlyElement(w.output,"sup"),/(\^\^)/mg);421			break;422		case "~~":423			w.subWikifyTerm(createTiddlyElement(w.output,"sub"),/(~~)/mg);424			break;425		case "--":426			w.subWikifyTerm(createTiddlyElement(w.output,"strike"),/(--)/mg);427			break;428		case "{{{":429			var lookaheadRegExp = /\{\{\{((?:.|\n)*?)\}\}\}/mg;430			lookaheadRegExp.lastIndex = w.matchStart;431			var lookaheadMatch = lookaheadRegExp.exec(w.source);432			if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {433				createTiddlyElement(w.output,"code",null,null,lookaheadMatch[1]);434				w.nextMatch = lookaheadRegExp.lastIndex;435			}436			break;437		}438	}439},440{441	name: "customFormat",442	match: "@@|\\{\\{",443	handler: function(w)444	{445		switch(w.matchText) {446		case "@@":447			var e = createTiddlyElement(w.output,"span");448			var styles = config.formatterHelpers.inlineCssHelper(w);449			if(styles.length == 0)450				e.className = "marked";451			else452				config.formatterHelpers.applyCssHelper(e,styles);453			w.subWikifyTerm(e,/(@@)/mg);454			break;455		case "{{":456			var lookaheadRegExp = /\{\{[\s]*([\w]+[\s\w]*)[\s]*\{(\n?)/mg;457			lookaheadRegExp.lastIndex = w.matchStart;458			var lookaheadMatch = lookaheadRegExp.exec(w.source);459			if(lookaheadMatch) {460				w.nextMatch = lookaheadRegExp.lastIndex;461				e = createTiddlyElement(w.output,lookaheadMatch[2] == "\n" ? "div" : "span",null,lookaheadMatch[1]);462				w.subWikifyTerm(e,/(\}\}\})/mg);463			}464			break;465		}466	}467},468{469	name: "mdash",470	match: "--",471	handler: function(w)472	{473		createTiddlyElement(w.output,"span").innerHTML = "—";474	}475},476{477	name: "lineBreak",478	match: "\\n|<br ?/?>",479	handler: function(w)480	{481		createTiddlyElement(w.output,"br");482	}483},484{485	name: "rawText",486	match: "\"{3}|<nowiki>",487	lookaheadRegExp: /(?:\"{3}|<nowiki>)((?:.|\n)*?)(?:\"{3}|<\/nowiki>)/mg,488	handler: function(w)489	{490		this.lookaheadRegExp.lastIndex = w.matchStart;491		var lookaheadMatch = this.lookaheadRegExp.exec(w.source);492		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {493			createTiddlyElement(w.output,"span",null,null,lookaheadMatch[1]);494			w.nextMatch = this.lookaheadRegExp.lastIndex;495		}496	}497},498{499	name: "htmlEntitiesEncoding",500	match: "(?:(?:&#?[a-zA-Z0-9]{2,8};|.)(?:&#?(?:x0*(?:3[0-6][0-9a-fA-F]|1D[c-fC-F][0-9a-fA-F]|20[d-fD-F][0-9a-fA-F]|FE2[0-9a-fA-F])|0*(?:76[89]|7[7-9][0-9]|8[0-7][0-9]|761[6-9]|76[2-7][0-9]|84[0-3][0-9]|844[0-7]|6505[6-9]|6506[0-9]|6507[0-1]));)+|&#?[a-zA-Z0-9]{2,8};)",501	handler: function(w)502	{503		createTiddlyElement(w.output,"span").innerHTML = w.matchText;504	}505}...parser.js
Source:parser.js  
1Object.constructor.prototype.error = function(message, t) {2  t = t || this;3  t.name = "SyntaxError";4  t.message = message;5  throw treturn;6};7RegExp.prototype.bexec = function(str) {8  var i, m;9  i = this.lastIndex;10  m = this.exec(str);11  if (m && m.index === i) {12    return m;13  }14  return null;15};16String.prototype.tokens = function() {17  var RESERVED_WORD, from, getTok, i, key, m, make, n, result, rw, tokens, value;18  from = void 0;19  i = 0;20  n = void 0;21  m = void 0;22  result = [];23  tokens = {24    WHITES: /\s+/g,25    ID: /[a-zA-Z_]\w*/g,26    NUM: /\b\d+(\.\d*)?([eE][+-]?\d+)?\b/g,27    STRING: /('(\\.|[^'])*'|"(\\.|[^"])*")/g,28    ONELINECOMMENT: /\/\/.*/g,29    MULTIPLELINECOMMENT: /\/[*](.|\n)*?[*]\//g,30    COMPARISONOPERATOR: /[<>=!]=|[<>]/g,31    ONECHAROPERATORS: /([=()&|;:,{}[\]])/g,32    ADDOP: /[+-]/g,33    MULTOP: /[*\/]/g34  };35  RESERVED_WORD = {36    p: "P",37    "if": "IF",38    then: "THEN"39  };40  make = function(type, value) {41    return {42      type: type,43      value: value,44      from: from,45      to: i46    };47  };48  getTok = function() {49    var str;50    str = m[0];51    i += str.length;52    return str;53  };54  if (!this) {55    return;56  }57  while (i < this.length) {58    for (key in tokens) {59      value = tokens[key];60      value.lastIndex = i;61    }62    from = i;63    if (m = tokens.WHITES.bexec(this) || (m = tokens.ONELINECOMMENT.bexec(this)) || (m = tokens.MULTIPLELINECOMMENT.bexec(this))) {64      getTok();65    } else if (m = tokens.ID.bexec(this)) {66      rw = RESERVED_WORD[m[0]];67      if (rw) {68        result.push(make(rw, getTok()));69      } else {70        result.push(make("ID", getTok()));71      }72    } else if (m = tokens.NUM.bexec(this)) {73      n = +getTok();74      if (isFinite(n)) {75        result.push(make("NUM", n));76      } else {77        make("NUM", m[0]).error("Bad number");78      }79    } else if (m = tokens.STRING.bexec(this)) {80      result.push(make("STRING", getTok().replace(/^["']|["']$/g, "")));81    } else if (m = tokens.COMPARISONOPERATOR.bexec(this)) {82      result.push(make("COMPARISON", getTok()));83    } else if (m = tokens.ADDOP.bexec(this)) {84      result.push(make("ADDOP", getTok()));85    } else if (m = tokens.MULTOP.bexec(this)) {86      result.push(make("MULTOP", getTok()));87    } else if (m = tokens.ONECHAROPERATORS.bexec(this)) {88      result.push(make(m[0], getTok()));89    } else {90      throw "Syntax error near '" + (this.substr(i)) + "'";91    }92  }93  return result;94};95var parse = function(input) {96  var condition, expression, factor, lookahead, match, statement, statements, term, tokens, tree;97  tokens = input.tokens();98  lookahead = tokens.shift();99  match = function(t) {100    if (lookahead.type === t) {101      lookahead = tokens.shift();102      if (typeof lookahead === "undefined") {103        lookahead = null;104      }105    } else {106      throw ("Syntax Error. Expected " + t + " found '") + lookahead.value + "' near '" + input.substr(lookahead.from) + "'";107    }108  };109programm = function(){110  var result;111  result = block;112  match(".");113  return result;114}115block = function() {116  var result, left, right;117  if (lookahead && lookahead.value === "const") {118    match("const");119    left = {120      type: "ID",121      value: lookahead.value122    };123    match("ID");124    match("=");125    right = lookahead.value;126    match("NUM");127    result = {128      type: "=",129      left: left,130      right: right131    };132    while (lookahead && lookahead.value === "const") {133      match("const");134      result = {135        type: "ID",136        value: lookahead.value137      };138      match("ID");139      match("=");140      right = lookahead.value;141      match("NUM");142      result = {143        type: "=",144        left: left,145        right: right146      };147    }148    match(";");149  };150  else if (lookahead && lookahead.value === "var") {151    match("var");152    result = {153      type: "ID",154      value: lookahead.value155    };156    match("ID");157    while (lookahead && lookahead.value === ",") {158      match(",");159      result = {160        type: "ID",161        value: lookahead.value162      };163      match("ID");164    }165    match(";");166  };167  else if (lookahead && lookahead.value === "procedure")168    while (lookahead && lookahead.value === "procedure") {169      match("procedure");170      result = {171        type: "ID",172        value: lookahead.value173      };174      match("ID");175      match("(");176      while (lookahead && lookahead.value === "var"){177        match("var");178        result = {179        type: "ID",180        value: lookahead.value181      };182      }183      match(")");184      left = block();185    }186    right = statement();187    result = {188        type: "block",189        left: left,190        right: right191      };192      return result;193}194statement = function(){195  var result, right, left;196  if (lookahead && lookahead.type === "ID") {197    left = {198      type: "ID",199      value: lookahead.value200    };201    match("ID");202    match("=");203    right = expression();204    result = {205        type: "=",206        left: left,207        right: right208      };209  };210  else if(lookahead && lookahead.value === "call") {211    match("call");212    result = {213      type: "ID",214      value: lookahead.value215    };216    match("ID")217  };218  else if(lookahead && lookahead.value === "begin") {219    match("begin");220    result = statement();221    while (lookahead && lookahead.value === ";") {222      match(";");223      result = statement();224    }225    match("end");226  };227  else if(lookahead && lookahead.value === "if") {228    match("if");229    left = condition();230    match("then");231    right = statement();232    result = {233      type: "statement",234      left: left,235      right: right236    };237    if(lookahead && lookahead.value === "else"){238      match("else");239      result = statement();240    };241  };242  else if(lookahead && lookahead.value === "while") {243    match("while");244    left = condition();245    match("do");246    right = statement();247    result = {248      type: "statement",249      left: left,250      right: right251    };252  };253  return rasult;254}255condition(){256  var result, right, left, type;257  left = expression();258  type = lookahead.value;259      match("COMPARISON");260  right = expression();261  result = {262      type: type,263      left: left,264      right: right265    };266  return result;267}268  expression = function() {269    var result, right, type;270    result = term();271    while (lookahead && lookahead.type === "ADDOP") {272      type = lookahead.value;273      match("ADDOP");274      right = term();275      result = {276        type: type,277        left: result,278        right: right279      };280    }281    return result;282  };283  term = function() {284    var result, right, type;285    result = factor();286    if (lookahead && lookahead.type === "MULTOP") {287  type = lookahead.value;288      match("MULTOP");289      right = term();290      result = {291        type: type,292        left: result,293        right: right294      };295    }296    return result;297};298  factor = function() {299    var result;300    result = null;301  if (lookahead.type === "ID") {302          result = {303              type: "ID",304              value: lookahead.value305          }306          match("ID");307  };308    else if (lookahead.type === "NUM") {309      result = {310        type: "NUM",311        value: lookahead.value312      };313      match("NUM");314    } else if (lookahead.type === "(") {315        match("(");316        result = expression();317        match(")");318    } else {319      throw "Syntax Error. Expected number or identifier or '(' but found " + (lookahead ? lookahead.value : "end of input") + " near '" + input.substr(lookahead.from) + "'";320    }321    return result;322  };323  tree = expression(input);324  if (lookahead != null) {325    throw "Syntax Error parsing statements. " + "Expected 'end of input' and found '" + input.substr(lookahead.from) + "'";326  }327  return tree;...T10003903.js
Source:T10003903.js  
...43      default: return (false);44   }45}4647function move_lookahead()48{49   i = i + 1;5051   if(i - 1 == document.frmEditor.Texto.value.length)52   {53      return "#";54   }55   else56   {57      return document.frmEditor.Texto.value.substr(i - 1, 1).toUpperCase();58   }59}6061function BuscaProximoToken()62{63   token = "";6465   while(lookahead == " " || lookahead.charCodeAt(0) == 10 || lookahead.charCodeAt(0) == 13 || lookahead.charCodeAt(0) == 9)66      lookahead = move_lookahead();6768   if(Letra(lookahead))69   {70      token = lookahead;71      lookahead = move_lookahead();7273      while(Letra(lookahead) || Numero(lookahead) || lookahead == "_")74      {75         token = token + lookahead;76         lookahead = move_lookahead();77      }78      79      if(token == "VARIAVEIS")80         tipo_token = "T_VARIAVEIS         ";81      else82      if(token == "INICIO")83         tipo_token = "T_INICIO            ";84      else85      if(token == "FIM")86         tipo_token = "T_FIM               ";87      else88      if(token == "ESCREVA")89         tipo_token = "T_ESCREVA           ";90      else91         tipo_token = "T_ID                ";92   }93   else94   {95      if(Numero(lookahead))96      {97         token = "";98         while(Numero(lookahead))99         {100            token = token + lookahead;101            lookahead = move_lookahead();102         }103      104         tipo_token = "T_NUMERO            ";105      }106      else107      {108         switch(lookahead)109         {110            case ",": token = lookahead;111                      lookahead = move_lookahead();112                      tipo_token = "T_VIRGULA           ";113                      break;114115            case ";": token = lookahead;116                      lookahead = move_lookahead();117                      tipo_token = "T_PONTO_VIRGULA     ";118                      break;119120            case "+": token = lookahead;121                      lookahead = move_lookahead();122                      tipo_token = "T_MAIS              ";123                      break;124125            case "-": token = lookahead;126                      lookahead = move_lookahead();127                      tipo_token = "T_MENOS             ";128                      break;129130            case "*": token = lookahead;131                      lookahead = move_lookahead();132                      tipo_token = "T_VEZES             ";133                      break;134135            case "/": token = lookahead;136                      lookahead = move_lookahead();137                      tipo_token = "T_SOBRE             ";138                      break;139140            case "(": token = lookahead;141                      lookahead = move_lookahead();142                      tipo_token = "T_ABREPAR           ";143                      break;144145            case ")": token = lookahead;146                      lookahead = move_lookahead();147                      tipo_token = "T_FECHAPAR          ";148                      break;149150            case ":": token = lookahead;151                      lookahead = move_lookahead();152                      if(lookahead == "=")153                      {154                         token = token + lookahead;155                         lookahead = move_lookahead();156                         tipo_token = "T_ATRIBUICAO        ";157                      }158                      else159                         tipo_token = "T_DOIS_PONTOS       ";160                      break;161162            case "=": token = lookahead;163                      lookahead = move_lookahead();164                      tipo_token = "T_IGUAL             ";165                      break;166167            case "<": token = lookahead;168                      lookahead = move_lookahead();169                      if(lookahead == "=")170                      {171                         token = token + lookahead;172                         lookahead = move_lookahead();173                         tipo_token = "T_MENOR_IGUAL       ";174                      }175                      else176                      if(lookahead == ">")177                      {178                         token = token + lookahead;179                         lookahead = move_lookahead();180                         tipo_token = "T_DIFERENTE         ";181                      }182                      else183                         tipo_token = "T_MENOR             ";184                      break;185186            case ">": token = lookahead;187                      lookahead = move_lookahead();188                      if(lookahead == "=")189                      {190                         token = token + lookahead;191                         lookahead = move_lookahead();192                         tipo_token = "T_MAIOR_IGUAL       ";193                      }194                      else195                         tipo_token = "T_MAIOR             ";196                      break;197198            case "#": token = lookahead;199                      lookahead = move_lookahead();200                      tipo_token = "T_FIM_FONTE         ";201                      break;202203            default: token = lookahead;204                     lookahead = move_lookahead();205                     while(lookahead != " " && lookahead != "#" && lookahead.charCodeAt(0) != 10 && lookahead.charCodeAt(0) != 13 && lookahead.charCodeAt(0) != 9)206                     {207                        token = token + lookahead;208                        lookahead = move_lookahead();209                     }210                     tipo_token = "T_ERRO_LEXICO       ";211         }212      }213   }214}215216function Analisa()217{218   var resultado = "";219220   i = 0;221222   lookahead = move_lookahead();223   BuscaProximoToken();224   while(tipo_token != "T_FIM_FONTE         ")225   {226      resultado = resultado + "<br>Token encontrado: " + tipo_token + " -> '" + token + "'";227      BuscaProximoToken();228   }229   resultado = resultado + "<br>Token encontrado: " + tipo_token + " -> '" + token + "'";230231   //document.write("Resultado da an�lise:<BR><PRE>" + resultado + "</PRE>");      232   document.getElementById('resultado').innerHTML = resultado;
...DynamicParser.js
Source:DynamicParser.js  
1const Associativity = require("./Associativity").Associativity;2const OP = 0;3const ASSOCIATIVITY = 1;4const PRIORITY = 2;5const enableLogging = false;6function log(...args) {7    if (enableLogging) {8        console.log("Parser: ", ...args)9    }10}11function DynamicParser(input) {12    const _operators = {}; // map<string, map<assoc, int>>13    let _input = input;14    let _lexer = input.tokenSource;15    this.isAnonymous = function (token) {16        return ((token.length === 1) && (token[0] === '_')) || ((token.text.length === 1) && (token.text[0] === '_'))17    };18    this.getOperatorPriority = function (operator, associativity) {19        const functor = operator.text || operator;20        if (functor in _operators) {21            const assocPriority = _operators[functor];22            if (associativity in assocPriority) {23                return assocPriority[associativity];24            }25        }26        return 1201;27    };28    this.isOperator = function (operator) {29        return _lexer.isOperator(operator);30    };31    this.addOperator = function (functor, associativity, priority) {32        _lexer.addOperators(functor);33        if (!(functor in _operators)) {34            _operators[functor] = {}35        }36        const assocPriority = _operators[functor];37        assocPriority[associativity] = priority;38    };39    this.isOperatorAssociativity = function (operator, associativity) {40        const functor = operator.text || operator;41        if (functor in _operators) {42            return associativity in _operators[functor];43        }44        return false45    };46    this.mustBeExcluded = function (lookahead, except) {47        for (const e of except) {48            if (this.isOperator(e) && lookahead.text === e) {49                return true;50            }51        }52        return false;53    };54    this.lookaheadFunc = function (f, associativity, priority, except) {55        const lookahead = _input.LT(1);56        log("lookahead: " + lookahead);57        if (!this.isOperator(lookahead.text)) {58            return null;59        }60        if (this.mustBeExcluded(lookahead, except)) {61            return null;62        }63        if (!this.isOperatorAssociativity(lookahead, associativity)) {64            return null;65        }66        return f(this.getOperatorPriority(lookahead, associativity), priority);67    };68    this.lookaheadIs = function (associativity, except) {69        let associativities;70        if (associativity.__proto__ !== Array.prototype) {71            associativities = [associativity];72        } else {73            associativities = associativity;74        }75        const lookahead = _input.LT(1);76        if (this.mustBeExcluded(lookahead, except || [])) {77            return false;78        }79        for (const a of associativities) {80            if (this.isOperatorAssociativity(lookahead, a)) {81                return true;82            }83        }84        return false;85    };86    const _compare = function (x, y) {87        return (x < y) ? -1 : ((x === y) ? 0 : 1);88    };89    this.lookaheadGt = function (associativity, priority, except) {90        let res = this.lookaheadFunc(_compare, associativity, priority, except);91        if (res === null)92            res = -1;93        return res > 0;94    };95    this.lookaheadEq = function (associativity, priority, except) {96        let res = this.lookaheadFunc(_compare, associativity, priority, except);97        if (res === null)98            res = -1;99        return res === 0;100    };101    this.lookaheadNeq = function (associativity, priority, except) {102        let res = this.lookaheadFunc(_compare, associativity, priority, except);103        if (res === null)104            res = 0;105        return res !== 0;106    };107    this.lookaheadGeq = function (associativity, priority, except) {108        let res = this.lookaheadFunc(_compare, associativity, priority, except);109        if (res === null)110            res = -1;111        return res >= 0;112    };113    this.lookaheadLeq = function (associativity, priority, except) {114        let res = this.lookaheadFunc(_compare, associativity, priority, except);115        if (res === null)116            res = 1;117        return res <= 0;118    };119    this.lookaheadLt = function (associativity, priority, except) {120        let res = this.lookaheadFunc(_compare, associativity, priority, except);121        if (res === null)122            res = 1;123        return res < 0;124    };125    this.lookahead = function (associativity, top, bottom, except) {126        let associativities;127        if (associativity.__proto__ !== Array.prototype) {128            associativities = [associativity];129        } else {130            associativities = associativity;131        }132        const lookahead = _input.LT(1);133        if (this.mustBeExcluded(lookahead, except)) {134            return false;135        }136        for (const a of associativities) {137            if (this.isOperatorAssociativity(lookahead, a)) {138                const priority = this.getOperatorPriority(lookahead, a);139                if (priority <= top && priority >= bottom) {140                    return true;141                }142            }143        }144        return false;145    }146}...parse.js
Source:parse.js  
1const inspect = require("util").inspect;2let ins = (x) => inspect(x, {depth:null});3let fs = require("fs");4const WHITES = /^(\s|[#;].*|\/\*(.|\n)*?\*\/)*/;5const STRING = /^"((?:[^"\\]|\\.)*)"/;6const NUMBER = /^([-+]?\d*\.?\d+([eE][-+]?\d+)?)/;7const WORD   = /^([^\s(),"]+)/; // No se niega el dÃgito ni el signo8const LP     = /^([(])/;9const RP     = /^\)/;10const COMMA  = /^(,)/;11const NEWLINE = /\r\n|\r|\n/;12let program;13let lookahead;14let lineno = 1;15let setProgram = function(prg) {16  program = prg;17  lineno = 1;18  return {program, lineno}19};20let getProgram = function() {21  return {program, lineno}22};23function lex() {24    let match;25    match = WHITES.exec(program);26    if (NEWLINE.test(match[0])) {27      lineno += match[0].split(NEWLINE).length-1;28    }29    program = program.slice(match[0].length);30    if (program.length > 0) {31      if (match = STRING.exec(program)) {32        lookahead = { type: "STRING", value: match[1]}33      } else if (match = NUMBER.exec(program)) {34        lookahead = {type: "NUMBER", value: Number(match[1])};35      } else if (match = LP.exec(program)) { 36        lookahead = {type: "LP", value: match[1]};37      } else if (match = COMMA.exec(program)) {38        lookahead = {type: "COMMA", value: match[1]};39      } else if (match = RP.exec(program)) {40        lookahead = {type: "RP", value: match[0]};41      } else if (match = WORD.exec(program)) {42        lookahead = {type: "WORD", value: match[1]};43      } else {44        throw new SyntaxError(`Unexpect syntax line ${lineno}: ${program.slice(0,10)}`);45      }46      program = program.slice(match[0].length);47    }48    else {49      lookahead = null; // End of input reached!50    }51    return lookahead;52}53function parseExpression() {54  let expr;55  // debugger;56  if (lookahead.type == "STRING") {57    expr = {type: "value", value: lookahead.value};58    lex();59    return expr;60  } else if (lookahead.type == "NUMBER") {61    expr = {type: "value", value: lookahead.value};62    lex();63    return expr;64  } else if (lookahead.type == "WORD") {65    expr = {type: "word", name: lookahead.value};66    lex();67    return parseApply(expr);68  } else {69    throw new SyntaxError(`Unexpected syntax line ${lineno}: ${program.slice(0,10)}`);70  }71}72function parseApply(tree) {73  // if (!lookahead) return tree;   // apply: /* vacio */74  // if (lookahead.type !== "LP") return tree; // apply: /* vacio */75  if (!lookahead) return tree; // End of input: apply: /* vacio */76  if ((lookahead.type === "RP")|| (lookahead.type === 'COMMA')) // apply: /* vacio */77    return tree;;78  if (lookahead.type !== "LP") throw new SyntaxError(`Error: Found ${lookahead.type}, Expected ',' or '(' or ')'`);79  lex();80  tree = {type: 'apply', operator: tree, args: []};81  while (lookahead && lookahead.type !== "RP") {82    let arg = parseExpression();83    tree.args.push(arg);84    if (lookahead && lookahead.type == "COMMA") {85      lex();86    } else if (!lookahead || lookahead.type !== "RP") {87      throw new SyntaxError(`Expected ',' or ')'  at line ${lineno}: ... ${program.slice(0,20)}`);88    }89  }90  if (!lookahead)  throw new SyntaxError(`Expected ')'  at line ${lineno}: ... ${program.slice(0,20)}`);91  lex();92  return parseApply(tree);93}94function parse(p) {95  setProgram(p);96  // debugger;97  lex();98  let result = parseExpression();99  //console.log("result = ",inspect(result, {depth: null}));100  if (lookahead !== null) 101    throw new SyntaxError(`Unexpected input after reached the end of parsing ${lineno}: ${program.slice(0,10)}`);102  return result;103}104function parseFromFile(fileName) {105  try {106    let program = fs.readFileSync(fileName, 'utf8');107    let tree = parse(program);108    let json = JSON.stringify(tree, null, "  ");109    fs.writeFileSync(fileName+".evm", json);110  }111  catch (err) {112    console.log(err);113  }114}115module.exports = {116  getProgram,117  lex,118  parse,119  parseApply,120  parseExpression,121  parseFromFile,122  setProgram,...class_lookahead_a_n_n.js
Source:class_lookahead_a_n_n.js  
1var class_lookahead_a_n_n =2[3    [ "entry", "struct_lookahead_a_n_n_1_1entry.html", "struct_lookahead_a_n_n_1_1entry" ],4    [ "point", "struct_lookahead_a_n_n_1_1point.html", "struct_lookahead_a_n_n_1_1point" ],5    [ "entry", "class_lookahead_a_n_n.html#aa9f7a4ac2a0de9f715ed033989cddbd1", null ],6    [ "point", "class_lookahead_a_n_n.html#a05ec40384c098abfb52b1d27068b7130", null ],7    [ "LookaheadANN", "class_lookahead_a_n_n.html#a8dad9151982609ba7121492fbc9c1e8e", null ],8    [ "~LookaheadANN", "class_lookahead_a_n_n.html#a6a3ee4a4d05880f33b50f6bcf45fbba6", null ],9    [ "pre_cycle", "class_lookahead_a_n_n.html#aa5fb8cc158d38a690063e5f1dbf57b65", null ],10    [ "post_cycle", "class_lookahead_a_n_n.html#ae4aedd177125c86bab87b065ef436e7a", null ],11    [ "get_error", "class_lookahead_a_n_n.html#a803e93e772017cafe8eeea159a193335", null ],12    [ "record_packet", "class_lookahead_a_n_n.html#ad2411965565f6e8bcebf95ec8109152d", null ],13    [ "deque_clear", "class_lookahead_a_n_n.html#a093df32811a417287d3f701c4349b794", null ],14    [ "entry_prepare", "class_lookahead_a_n_n.html#a4c6934403b1ba9a94f00e677f8c3acfc", null ],15    [ "entry_train", "class_lookahead_a_n_n.html#af7f7ece48cd10cc164fec00be6427a0c", null ],16    [ "entry_valid", "class_lookahead_a_n_n.html#a2a4ce3ab5ab048de57b8d9176e220495", null ],17    [ "entry_predict", "class_lookahead_a_n_n.html#ad4e596d38b388769e1d095548d25c684", null ],18    [ "ann_filename", "class_lookahead_a_n_n.html#a5de3f10ef60a9de2325b5a10361c846f", null ],19    [ "ann_train", "class_lookahead_a_n_n.html#ad2cf76ca184ae4b5b88fda9e84dd6a65", null ],20    [ "set_pflog", "class_lookahead_a_n_n.html#a919a3e229c6a82e171d7b22e0fc2e439", null ],21    [ "inputfilter", "class_lookahead_a_n_n.html#a844ce45872feb8af9e29d1326cbebf68", null ],22    [ "outputfilter", "class_lookahead_a_n_n.html#ae7fb93c2f106a67f7fca15ef8020b72e", null ],23    [ "outputdefault", "class_lookahead_a_n_n.html#ac67d064cc8498ff32910706b9d2a85fa", null ],24    [ "npoint", "class_lookahead_a_n_n.html#aca783a09f05cc9e1079262793a5736cc", null ],25    [ "nfeature", "class_lookahead_a_n_n.html#a9ba68fb76e80ff47d9500ca6d2246c5e", null ],26    [ "nanninput", "class_lookahead_a_n_n.html#a5bb35b521d95b2d98c610a8e532a0cbb", null ],27    [ "nannoutput", "class_lookahead_a_n_n.html#aa17a34d16491815a6c329a775f479403", null ],28    [ "annlayers", "class_lookahead_a_n_n.html#a27dd9bffe99495d118ecb387d08e0252", null ],29    [ "annlayersz", "class_lookahead_a_n_n.html#a01e1d6f370630f7bd11b34bf7819c725", null ],30    [ "mintrainsetsz", "class_lookahead_a_n_n.html#a710a9588c9806260bbb338856f1f2a23", null ],31    [ "maxtrainepoch", "class_lookahead_a_n_n.html#a5539ce5f0b1c1e5c2134f09b68f7ce50", null ],32    [ "errmomentum", "class_lookahead_a_n_n.html#ade8a1256f77bee1c30e8db3946f98089", null ],33    [ "retrainerr", "class_lookahead_a_n_n.html#a692b2e86325f451cba626c0fcab55f26", null ],34    [ "validinterval", "class_lookahead_a_n_n.html#a5881ed37c4c71a19116bd711f22ce70c", null ],35    [ "ann", "class_lookahead_a_n_n.html#aa1bbed304661ce892c9f420e432d52c2", null ],36    [ "sendbuf", "class_lookahead_a_n_n.html#af6099f461af1d6db8d4a893fa84d789e", null ],37    [ "recvbuf", "class_lookahead_a_n_n.html#ab1ff847a9ecc1daa586da079e17fc02b", null ],38    [ "history", "class_lookahead_a_n_n.html#a8ef26f30815fe61994a279c2b2d39723", null ],39    [ "trainset", "class_lookahead_a_n_n.html#a733c8b9f451973041695efa166713821", null ],40    [ "predicterr", "class_lookahead_a_n_n.html#a7dbef37aa7d61c4dbf8404622dee2d47", null ],41    [ "lastpredict", "class_lookahead_a_n_n.html#a20fb27fb5203a273d0eb4eae1a1e0ef9", null ],42    [ "validcount", "class_lookahead_a_n_n.html#aa0ec0ec14ea3d8b2212198d90c8722a4", null ],43    [ "ve", "class_lookahead_a_n_n.html#a6865634bd149a174807cd272a31889b3", null ],44    [ "pflog", "class_lookahead_a_n_n.html#ab151ea3c0befc373f2ded05406e4ba48", null ]...Using AI Code Generation
1const { chromium } = require('playwright');2(async () => {3  const browser = await chromium.launch();4  const context = await browser.newContext();5  const page = await context.newPage();6  await page.click('input[name="q"]');7  await page.keyboard.type('Playwright');8  await page.keyboard.press('Enter');9  await page.waitForSelector('text=Playwright is a Node library to automate Chromium, Firefox and WebKit with a single API');10  await page.click('text=Playwright is a Node library to automate Chromium, Firefox and WebKit with a single API');11  await page.waitForSelector('text=Install Playwright');12  await page.click('text=Install Playwright');13  await page.waitForSelector('text=Playwright is a Node.js library to automate Chromium, Firefox and WebKit with a single API. It enables cross-browser web automation that is ever-green, capable, reliable and fast.');14  await browser.close();15})();16const { chromium } = require('playwright');17(async () => {18  const browser = await chromium.launch();19  const context = await browser.newContext();20  const page = await context.newPage();21  await page.click('input[name="q"]');22  await page.keyboard.type('Playwright');23  await page.keyboard.press('Enter');24  await page.waitForSelector('text=Playwright is a Node library to automate Chromium, Firefox and WebKit with a single API');25  await page.click('text=Playwright is a Node library to automate Chromium, Firefox and WebKit with a single API');26  await page.waitForSelector('text=Install Playwright');27  await page.click('text=Install Playwright');28  await page.waitForSelector('text=Playwright is a Node.js library to automate Chromium, Firefox and WebKit with a single API. It enables cross-browser web automation that is ever-green, capable, reliable and fast.');29  await browser.close();30})();31const { chromium } = require('playwright');32(async () => {33  const browser = await chromium.launch();34  const context = await browser.newContext();35  const page = await context.newPage();Using AI Code Generation
1const { chromium } = require('playwright');2(async () => {3  const browser = await chromium.launch();4  const context = await browser.newContext();5  const page = await context.newPage();6  await page.waitForSelector('text=I\'m Feeling Lucky');7  await page.click('text=I\'m Feeling Lucky');8  await page.waitForSelector('text=YouTube');9  await page.click('text=YouTube');10  await page.waitForSelector('text=Sign in');11  await page.click('text=Sign in');12  await page.waitForSelector('input[name="identifier"]');13  await page.fill('input[name="identifier"]', 'Using AI Code Generation
1const { chromium } = require('playwright');2(async () => {3  const browser = await chromium.launch();4  const context = await browser.newContext();5  const page = await context.newPage();6  await page.waitForSelector('text=Get Started');7  await page.click('text=Get Started');8  await page.waitForSelector('text=Playwright is a Node.js library to automate Chromium, Firefox and WebKit with a single API');9  await page.screenshot({ path: `example.png` });10  await browser.close();11})();12const { chromium } = require('playwright');13(async () => {14  const browser = await chromium.launch();15  const context = await browser.newContext();16  const page = await context.newPage();17  await page.waitForLoadState('networkidle');18  await page.click('text=Get Started');19  await page.waitForLoadState('networkidle');20  await page.screenshot({ path: `example.png` });21  await browser.close();22})();23const { chromium } = require('playwright');24(async () => {25  const browser = await chromium.launch();26  const context = await browser.newContext();27  const page = await context.newPage();28  await page.waitForSelector('text=Get Started');29  await page.click('text=Get Started');30  const [response] = await Promise.all([31    page.waitForResponse('**/docs/next/api/class-playwright*'),32    page.click('text=API reference'),33  ]);34  await page.screenshot({ path: `example.png` });35  await browser.close();36})();37const { chromium } = require('playwright');38(async () => {39  const browser = await chromium.launch();40  const context = await browser.newContext();41  const page = await context.newPage();42  const [request] = await Promise.all([43    page.waitForEvent('request'),Using AI Code Generation
1const {chromium} = require('playwright');2(async () => {3  const browser = await chromium.launch();4  const context = await browser.newContext();5  const page = await context.newPage();6  await page.waitForSelector('input[name="q"]');7  await page.fill('input[name="q"]', 'Playwright');8  await page.keyboard.press('Enter');9  await page.waitForSelector('text=Playwright');10  const [response] = await Promise.all([11    page.waitForResponse(response => response.url().includes('suggestqueries') && response.status() === 200),12    page.click('text=Playwright'),13  ]);14  console.log(response.url());15  await browser.close();16})();Using AI Code Generation
1const { chromium } = require('playwright');2(async () => {3  const browser = await chromium.launch();4  const context = await browser.newContext();5  const page = await context.newPage();6  await page.route('**/*', route => {7    route.fulfill({8    });9  });10  await page.close();11  await context.close();12  await browser.close();13})();14const { chromium } = require('playwright');15(async () => {16  const browser = await chromium.launch();17  const context = await browser.newContext();18  const page = await context.newPage();19  page.on('request', request => {20    console.log(request.url());21  });22  await page.close();23  await context.close();24  await browser.close();25})();26const { chromium } = require('playwright');27(async () => {28  const browser = await chromium.launch();29  const context = await browser.newContext();30  const page = await context.newPage();31  page.on('response', response => {32    console.log(response.url());33  });34  await page.close();35  await context.close();36  await browser.close();37})();38const {chromium} = require('playwright')');39(async () => {40  const browser = await chromium.launch();41  const context = await browser.newContext();42  const page = await context.newPage();43  page.on('request', request => {44    console.log(request.url());45  });46  page.on('response', response => {47    console.log(response.url());48  });49  await page.close();50  await context.close();51  await browser.close();52})();53const { chromium } = require('playwright');54(async () => {Using AI Code Generation
1const { chromium } = require('playwright;2(async () => {3  const browser = await chromium.launch();4  const context = await browser.newContext();5  const page = await context.newPage();6  await page.waitForSelector('input[name="q"]');7  await page.fill('input[name="q"]', 'Playwright');8  await page.keyboard.press('Enter');9  await page.waitForSelector('text=Playwright');10  const [response] = await Promise.all([11    page.waitForResponse(response => response.url().includes('suggestqueries') && response.status() === 200),12    page.click('text=Playwright'),13  ]);14  console.log(response.url());15  await browser.close();16})();Using AI Code Generation
1const { chromium } = require('playwright-internal');2(async () => {3  const browser = await chromium.launch();4  const context = await browser.newContext();5  const page = await context.newPage();6  await page.fill('input[aria-label="Search"]', 'hello world');7  await page.keyboard.press('Enter');8  await page.waitForNavigation();9  await page.screenshot({ path: 'example.png' });10  await browser.close();11})();12const { chromium } = require('playwright');13(async () => {14  const browser = await chromium.launch();15  const context = await browser.newContext();16  const page = await context.newPage();17  await page.fill('input[aria-label="Search"]', 'hello world');18  await page.keyboard.press('Enter');19  await page.waitForSelector('#search');20  await page.screenshot({ path: 'example.png' });21  await browser.close();22})();23equest() method of Playwright API24const { chromium } = require('playwright');25(async () => {Using AI Code Generation
1const { chromium } = rire('playwright');2(async () => {3  const browser = await chromium.launch();4  const page = await browser.newPage();5  await page.type('input[name="q"]', 'Hello World!');6  await page.click('input[type="submit"]');7  await pag.creensho{ path: `example.png` });8  await browser.close();9}();10const { chromium } = require('playwright');11(async () => { = await chromium.launch();12  const page = await browser.newPage();13  await page.type('input[name="q"]', 'Hello World!');14  await page.waitForSelector('input[type="submit"]');15  await page.click('input[type="submit"]');16  await page.screenshot({ path: `example.png` });17  await browser.close();18})();19const { chromium } = require('playwright');20(async () => {21  const browser = await chromium.launch();22  const page = await browser.newPage();23  await page.type('input[name="q"]', 'Hello World!');24  await page.waitForTimeout(1000);25  await page.click('input[type="submit"]');26  await page.screenshot({ path: `example.png` });27  await browser.close();28})();29const { chromium } = require('playwright');30(async () => {31  const browser = await chromium.launch();32  const page = await browser.newPage();33  await page.type('input[name="q"]', 'Hello World!');34  await page.waitForFunction('document.querySelector("input[type=submit]").disabled === false');35  await page.click('input[type="submit"]');36  await page.screenshot({ path: `example.png` });37  await browser.close();38})();39const { chromium } = require('playwright');40(async () => {41  const browser = await chromium.launch();42  const page = await browser.newPage();43  const browser = await chromium.launch();44  const context = await browser.newContext();45  const page = await context.newPage();46  await page.fill('input[aria-label="Search"]', 'hello world');47  await page.keyboard.press('Enter');48  await page.waitForFunction(() => document.querySelector('#search'));49  await page.screenshot({ path: 'example.png' });50  await browser.close();51})();52const { chromium } = require('playwright');53(async () => {54  const browser = await chromium.launch();55  const context = await browser.newContext();56  const page = await context.newPage();57  await page.fill('input[aria-label="Search"]', 'hello world');58  await page.keyboard.press('Enter');59  await page.screenshot({ path: 'example.png' });60  await browser.close();61})();62const { chromium } = require('playwright');63(async () => {Using AI Code Generation
1const { chromium } = require('playwright');2(async () => {3  const browser = await chromium.launch();4  const page = await browser.newPage();5  await page.type('input[name="q"]', 'Hello World!');6  await page.click('input[type="submit"]');7  await page.screenshot({ path: `example.png` });8  await browser.close();9})();10const { chromium } = require('playwright');11(async () => {12  const browser = await chromium.launch();13  const page = await browser.newPage();14  await page.type('input[name="q"]', 'Hello World!');15  await page.waitForSelector('input[type="submit"]');16  await page.click('input[type="submit"]');17  await page.screenshot({ path: `example.png` });18  await browser.close();19})();20const { chromium } = require('playwright');21(async () => {22  const browser = await chromium.launch();23  const page = await browser.newPage();24  await page.type('input[name="q"]', 'Hello World!');25  await page.waitForTimeout(1000);26  await page.click('input[type="submit"]');27  await page.screenshot({ path: `example.png` });28  await browser.close();29})();30const { chromium } = require('playwright');31(async () => {32  const browser = await chromium.launch();33  const page = await browser.newPage();34  await page.type('input[name="q"]', 'Hello World!');35  await page.waitForFunction('document.querySelector("input[type=submit]").disabled === false');36  await page.click('input[type="submit"]');37  await page.screenshot({ path: `example.png` });38  await browser.close();39})();40const { chromium } = require('playwright');41(async () => {42  const browser = await chromium.launch();43  const page = await browser.newPage();Using AI Code Generation
1const { Page } = require('playwright/lib/server/page');2const { ElementHandle } = require('playwright/lib/server/dom');3const { helper } = require('playwright/lib/helper');4const { assert } = require('console');5Page.prototype.waitForSelector = async function(selector, options = {}) {6  const { timeout = this._timeoutSettings.timeout() } = options;7  const { state = 'visible' } = options;8  const handle = await this.$(selector, options);9  if (!handle) {10    throw new Error(`Unable to locate element: ${selector}`);11  }12  const isEnabled = await handle.evaluate(element => element.isEnabled());13  if (!isEnabled) {14    throw new Error(`Element: ${selector} is not enabled`);15  }16  const isClickable = await handle.evaluate(element => element.isClickable());17  if (!isClickable) {18    throw new Error(`Element: ${selector} is not clickable`);19  }20  await handle.waitForElementState(state, { timeout });21  return handle;22};23ElementHandle.prototype.waitForElementState = async function(state, options = {}) {24  const { timeout = this._timeoutSettings.timeout() } = options;25  const { polling = 'raf' } = options;26  const page = this._context._page;27  const mainFrame = page.mainFrame();28  const frame = this._context.frame;29  const mainExecutionContext = await mainFrame.executionContext();30  const handle = await this.evaluateHandle((element, state) => {31    const { waitForElementState } = require('playwright/lib/server/dom');32    return waitForElementState(element, state);33  }, state);34  const result = await mainExecutionContext._adoptBackendNodeId(await handle._evaluateHandle((node) => node._backendNodeId));35  await handle.dispose();36  return result;37};38helper.waitForEvent = async function(emitter, eventName, predicate, options = {}, timeout) {39  const { timeout: timeoutOverride = timeout } = options;40  let promise = new Promise((resolve, reject) => {41    const listener = (...args) => {42      if (predicateUsing AI Code Generation
1const { Internal } = require('@playwright/test/lib/server/frames');2const { Page } = require('@playwright/test/lib/server/page');3const page = await context.newPage();4await page.waitForSelector('text=Login');5const internalFrame = await Internal.getInternalFrame(page);6const internalPage = await internalFrame._page;7const internalContext = await internalPage._context;8const internalBrowser = await internalContext._browser;9const internalServer = await internalBrowser._server;10const internalPlaywright = await internalServer._playwright;11const internalPlaywrightObject = await internalPlaywright._object;12const internalPlaywrightObject = await internalPlaywright._object;13const internalPlaywrightObject = await internalPlaywright._object;14const internalPlaywrightObject = await internalPlaywright._object;15const internalPlaywrightObject = await internalPlaywright._object;16const internalPlaywrightObject = await internalPlaywright._object;17const internalPlaywrightObject = await internalPlaywright._object;18const internalPlaywrightObject = await internalPlaywright._object;19const internalPlaywrightObject = await internalPlaywright._object;20const internalPlaywrightObject = await internalPlaywright._object;21const internalPlaywrightObject = await internalPlaywright._object;22const internalPlaywrightObject = await internalPlaywright._object;23const internalPlaywrightObject = await internalPlaywright._object;24const internalPlaywrightObject = await internalPlaywright._object;25const internalPlaywrightObject = await internalPlaywright._object;26const internalPlaywrightObject = await internalPlaywright._object;LambdaTest’s Playwright tutorial will give you a broader idea about the Playwright automation framework, its unique features, and use cases with examples to exceed your understanding of Playwright testing. This tutorial will give A to Z guidance, from installing the Playwright framework to some best practices and advanced concepts.
Get 100 minutes of automation test minutes FREE!!
