CINXE.COM

Module:template parser - Wiktionary, the free dictionary

<!DOCTYPE html> <html class="client-nojs" lang="en" dir="ltr"> <head> <meta charset="UTF-8"> <title>Module:template parser - Wiktionary, the free dictionary</title> <script>(function(){var className="client-js";var cookie=document.cookie.match(/(?:^|; )enwiktionarymwclientpreferences=([^;]+)/);if(cookie){cookie[1].split('%2C').forEach(function(pref){className=className.replace(new RegExp('(^| )'+pref.replace(/-clientpref-\w+$|[^\w-]+/g,'')+'-clientpref-\\w+( |$)'),'$1'+pref+'$2');});}document.documentElement.className=className;}());RLCONF={"wgBreakFrames":false,"wgSeparatorTransformTable":["",""],"wgDigitTransformTable":["",""],"wgDefaultDateFormat":"dmy","wgMonthNames":["","January","February","March","April","May","June","July","August","September","October","November","December"],"wgRequestId":"a65a701d-9e86-4b5f-a169-223ff469508b","wgCanonicalNamespace":"Module","wgCanonicalSpecialPageName":false,"wgNamespaceNumber":828,"wgPageName":"Module:template_parser","wgTitle":"template parser","wgCurRevisionId":82737511,"wgRevisionId":82737511,"wgArticleId":8033819,"wgIsArticle":true,"wgIsRedirect":false,"wgAction":"view","wgUserName":null,"wgUserGroups":["*" ],"wgCategories":["Templates and modules with outdated documentation","Wikitext parsing modules"],"wgPageViewLanguage":"en","wgPageContentLanguage":"en","wgPageContentModel":"Scribunto","wgRelevantPageName":"Module:template_parser","wgRelevantArticleId":8033819,"wgIsProbablyEditable":false,"wgRelevantPageIsProbablyEditable":false,"wgRestrictionEdit":["templateeditor"],"wgRestrictionMove":["templateeditor"],"wgNoticeProject":"wiktionary","wgCiteReferencePreviewsActive":true,"wgMediaViewerOnClick":true,"wgMediaViewerEnabledByDefault":true,"wgVisualEditor":{"pageLanguageCode":"en","pageLanguageDir":"ltr","pageVariantFallbacks":"en"},"wgMFDisplayWikibaseDescriptions":{"search":true,"watchlist":true,"tagline":false,"nearby":true},"wgWMESchemaEditAttemptStepOversample":false,"wgWMEPageLength":60000,"wgCentralAuthMobileDomain":false,"wgEditSubmitButtonLabelPublish":true,"wgULSPosition":"interlanguage","wgULSisCompactLinksEnabled":true,"wgVector2022LanguageInHeader":false, "wgULSisLanguageSelectorEmpty":false,"wgWikibaseItemId":"Q107326219","wgCheckUserClientHintsHeadersJsApi":["brands","architecture","bitness","fullVersionList","mobile","model","platform","platformVersion"]};RLSTATE={"ext.gadget.LanguagesAndScripts":"ready","ext.gadget.Palette":"ready","ext.gadget.Site":"ready","ext.globalCssJs.user.styles":"ready","site.styles":"ready","user.styles":"ready","ext.globalCssJs.user":"ready","user":"ready","user.options":"loading","ext.pygments":"ready","skins.vector.styles.legacy":"ready","ext.visualEditor.desktopArticleTarget.noscript":"ready","codex-search-styles":"ready","ext.uls.interlanguage":"ready","wikibase.client.init":"ready","ext.wikimediaBadges":"ready"};RLPAGEMODULES=["ext.pygments.view","site","mediawiki.page.ready","skins.vector.legacy.js","ext.centralNotice.geoIP","ext.centralNotice.startUp","ext.gadget.LegacyScripts","ext.gadget.DocTabs","ext.gadget.RevdelInfo","ext.gadget.PagePreviews","ext.gadget.Edittools", "ext.gadget.defaultVisibilityToggles","ext.gadget.UnsupportedTitles","ext.gadget.WiktGadgetPrefs","ext.urlShortener.toolbar","ext.centralauth.centralautologin","mmv.bootstrap","ext.visualEditor.desktopArticleTarget.init","ext.visualEditor.targetLoader","ext.echo.centralauth","ext.eventLogging","ext.wikimediaEvents","ext.navigationTiming","ext.uls.compactlinks","ext.uls.interface","ext.checkUser.clientHints","wikibase.sidebar.tracking"];</script> <script>(RLQ=window.RLQ||[]).push(function(){mw.loader.impl(function(){return["user.options@12s5i",function($,jQuery,require,module){mw.user.tokens.set({"patrolToken":"+\\","watchToken":"+\\","csrfToken":"+\\"}); }];});});</script> <link rel="stylesheet" href="/w/load.php?lang=en&amp;modules=codex-search-styles%7Cext.pygments%2CwikimediaBadges%7Cext.uls.interlanguage%7Cext.visualEditor.desktopArticleTarget.noscript%7Cskins.vector.styles.legacy%7Cwikibase.client.init&amp;only=styles&amp;skin=vector"> <script async="" src="/w/load.php?lang=en&amp;modules=startup&amp;only=scripts&amp;raw=1&amp;skin=vector"></script> <meta name="ResourceLoaderDynamicStyles" content=""> <link rel="stylesheet" href="/w/load.php?lang=en&amp;modules=ext.gadget.LanguagesAndScripts%2CPalette%2CSite&amp;only=styles&amp;skin=vector"> <link rel="stylesheet" href="/w/load.php?lang=en&amp;modules=site.styles&amp;only=styles&amp;skin=vector"> <meta name="generator" content="MediaWiki 1.44.0-wmf.4"> <meta name="referrer" content="origin"> <meta name="referrer" content="origin-when-cross-origin"> <meta name="robots" content="max-image-preview:standard"> <meta name="format-detection" content="telephone=no"> <meta name="viewport" content="width=1120"> <meta property="og:site_name" content="Wiktionary"> <meta property="og:title" content="Module:template parser - Wiktionary, the free dictionary"> <meta property="og:type" content="website"> <link rel="preconnect" href="//upload.wikimedia.org"> <link rel="alternate" media="only screen and (max-width: 640px)" href="//en.m.wiktionary.org/wiki/Module:template_parser"> <link rel="apple-touch-icon" href="/static/apple-touch/wiktionary/en.png"> <link rel="icon" href="/static/favicon/wiktionary/en.ico"> <link rel="search" type="application/opensearchdescription+xml" href="/w/rest.php/v1/search" title="Wiktionary (en)"> <link rel="EditURI" type="application/rsd+xml" href="//en.wiktionary.org/w/api.php?action=rsd"> <link rel="canonical" href="https://en.wiktionary.org/wiki/Module:template_parser"> <link rel="license" href="https://creativecommons.org/licenses/by-sa/4.0/deed.en"> <link rel="alternate" type="application/atom+xml" title="Wiktionary Atom feed" href="/w/index.php?title=Special:RecentChanges&amp;feed=atom"> <link rel="dns-prefetch" href="//meta.wikimedia.org" /> <link rel="dns-prefetch" href="//login.wikimedia.org"> </head> <body class="skin-vector-legacy mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-828 ns-subject page-Module_template_parser rootpage-Module_template_parser skin-vector action-view"><div id="mw-page-base" class="noprint"></div> <div id="mw-head-base" class="noprint"></div> <div id="content" class="mw-body" role="main"> <a id="top"></a> <div id="siteNotice"><!-- CentralNotice --></div> <div class="mw-indicators"> </div> <h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-namespace">Module</span><span class="mw-page-title-separator">:</span><span class="mw-page-title-main">template parser</span></h1> <div id="bodyContent" class="vector-body"> <div id="siteSub" class="noprint">From Wiktionary, the free dictionary</div> <div id="contentSub"><div id="mw-content-subtitle"></div></div> <div id="contentSub2"></div> <div id="jump-to-nav"></div> <a class="mw-jump-link" href="#mw-head">Jump to navigation</a> <a class="mw-jump-link" href="#searchInput">Jump to search</a> <div id="mw-content-text" class="mw-body-content"><div class="mw-content-ltr mw-parser-output" lang="en" dir="ltr"><div class="documentation" style="display:block; clear:both"> <hr /> <dl class="plainlinks" style="font-size: smaller;"><dd><i style="font-size: larger;">The following <a href="/wiki/Help:Documenting_templates_and_modules" title="Help:Documenting templates and modules">documentation</a> is located at <a href="/wiki/Module:template_parser/documentation" title="Module:template parser/documentation">Module:template parser/documentation</a>. <sup>[<a class="external text" href="https://en.wiktionary.org/w/index.php?title=Module:template_parser/documentation&amp;action=edit">edit</a>]</sup></i></dd><dd> <i>Useful links</i>: <a href="/wiki/Special:PrefixIndex/Module:template_parser/" title="Special:PrefixIndex/Module:template parser/">subpage list</a> • <a class="external text" href="https://en.wiktionary.org/w/index.php?title=Special%3AWhatLinksHere%2FModule%3Atemplate_parser&amp;hideredirs=1&amp;hidetrans=1">links</a> • <a class="external text" href="https://en.wiktionary.org/w/index.php?title=Special%3AWhatLinksHere%2FModule%3Atemplate_parser&amp;hidelinks=1&amp;hideredirs=1">transclusions</a> • <a href="/wiki/Module:template_parser/testcases" title="Module:template parser/testcases">testcases</a> • <a href="/w/index.php?title=Module:template_parser/sandbox&amp;action=edit&amp;redlink=1" class="new" title="Module:template parser/sandbox (page does not exist)">sandbox</a></dd></dl> <style data-mw-deduplicate="TemplateStyles:r82267123">.mw-parser-output .maintenance-box{width:90%;margin:0.75em auto;border-width:1px;border-style:dashed;padding:0.25em}.mw-parser-output .request-box{width:90%;margin:0.75em auto;border:1px dashed var(--border-color-base,#999999);padding:0.25em;background:var(--background-color-base,#FFFFFF)}body.skin-minerva .mw-parser-output .request-box table{margin-top:0.25em;margin-bottom:0.25em}.mw-parser-output .maintenance-box-blue{background-color:#E6E6FF;border-color:#000061}.mw-parser-output .maintenance-box-red{background-color:#FFE6E6;border-color:#610000}.mw-parser-output .maintenance-box-yellow{background-color:#FFFFE6;border-color:#616100}.mw-parser-output .maintenance-box-grey{background-color:#F2F2F2;border-color:#303030}.mw-parser-output .maintenance-box-orange{background-color:#FFF2E6;border-color:#612F00}@media screen{html.skin-theme-clientpref-night .mw-parser-output .maintenance-box-blue{background-color:#1D1D44;border-color:#73737F}html.skin-theme-clientpref-night .mw-parser-output .maintenance-box-red{background-color:#441D1D;border-color:#7F7373}html.skin-theme-clientpref-night .mw-parser-output .maintenance-box-yellow{background-color:#323216;border-color:#7F7F73}html.skin-theme-clientpref-night .mw-parser-output .maintenance-box-grey{background-color:#303030;border-color:#797979}html.skin-theme-clientpref-night .mw-parser-output .maintenance-box-orange{background-color:#44301D;border-color:#7F7973}}@media screen and (prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .maintenance-box-blue{background-color:#1D1D44;border-color:#73737F}html.skin-theme-clientpref-os .mw-parser-output .maintenance-box-red{background-color:#441D1D;border-color:#7F7373}html.skin-theme-clientpref-os .mw-parser-output .maintenance-box-yellow{background-color:#323216;border-color:#7F7F73}html.skin-theme-clientpref-os .mw-parser-output .maintenance-box-grey{background-color:#303030;border-color:#797979}html.skin-theme-clientpref-os .mw-parser-output .maintenance-box-orange{background-color:#44301D;border-color:#7F7973}}</style><div class="noprint maintenance-box maintenance-box-yellow"> <table> <tbody><tr> <td rowspan="2"><span typeof="mw:File"><a href="/wiki/File:Text-x-generic_with_pencil.svg" class="mw-file-description"><img src="//upload.wikimedia.org/wikipedia/commons/thumb/2/20/Text-x-generic_with_pencil.svg/40px-Text-x-generic_with_pencil.svg.png" decoding="async" width="40" height="40" class="mw-file-element" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/2/20/Text-x-generic_with_pencil.svg/60px-Text-x-generic_with_pencil.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/2/20/Text-x-generic_with_pencil.svg/80px-Text-x-generic_with_pencil.svg.png 2x" data-file-width="48" data-file-height="48" /></a></span> </td> <th style="text-align: left;">This documentation is out of date. </th></tr> <tr> <td>The <a href="/wiki/Help:Documenting_templates_and_modules" title="Help:Documenting templates and modules">documentation</a> on this page or section no longer reflects its current state, and some information may be missing or incorrect. Please help by editing the <a href="/wiki/Module:template_parser/documentation" title="Module:template parser/documentation">documentation page</a>, and adding information about undocumented features, while removing information that is no longer applicable. </td></tr></tbody></table></div> <p>This module provides functions for parsing and finding template invocations found in wikitext. </p> <dl><dt><code style="white-space:pre-wrap;" class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="n">parseTemplate</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="n">not_transcluded</span><span class="p">)</span></code></dt> <dd>Parses <tt>text</tt> as a template invocation and returns a pair of values, the template name and the arguments (containing anonymous, numbered and named arguments). If the text could not be parsed as a template invocation, the function returns <tt>nil</tt>. The parser will correctly parse any wikitext given as template arguments (such as subtemplates, arguments, tables etc), but if the string does not form a valid template in markup, then it will return <code>nil</code>.</dd> <dt><code style="white-space:pre-wrap;" class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="n">findTemplates</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="n">not_transcluded</span><span class="p">)</span></code></dt> <dd>Finds all template invocations in the text. This is designed to be used as an iterator in <tt>for</tt> statements, and returns four values for each invocation:</dd></dl> <ol><li>The template name.</li> <li>The template arguments.</li> <li>The full template invocation as it appears in the original text.</li> <li>The index the template appears at within the given text; as with Lua in general, the beginning of the text is index 1.</li></ol> <p>For convenience, template names will be normalized in two ways: </p> <ol><li>They are preprocessed, which means that any templates (<code style="white-space:pre-wrap">&#123;&#123; &#125;&#125;</code>) and parameters (<code style="white-space:pre-wrap">&#123;&#123;&#123; &#125;&#125;&#125;</code>) they contain will be resolved.</li> <li>Any redirects will be converted to their canonical equivalents (e.g. <code style="white-space:pre-wrap">&#123;&#123;<a href="/wiki/Template:link#top" title="Template:link">l</a>&#125;&#125;</code> is treated as <code style="white-space:pre-wrap">&#123;&#123;<a href="/wiki/Template:link#top" title="Template:link">link</a>&#125;&#125;</code>).</li></ol> <p>Note that any templates with invalid names (after preprocessing) will be skipped over. For performance reasons, preprocessing is only applied to the keys in a template's table of arguments, so it should be applied (selectively) to the values by the calling module when needed. </p><p>Note that the parser will respect <code style="white-space:pre-wrap">&lt;<a href="https://www.mediawiki.org/wiki/Transclusion#Partial_transclusion" class="extiw" title="mw:Transclusion">noinclude</a>&gt;</code>, <code style="white-space:pre-wrap">&lt;<a href="https://www.mediawiki.org/wiki/Transclusion#Partial_transclusion" class="extiw" title="mw:Transclusion">includeonly</a>&gt;</code> and <code style="white-space:pre-wrap">&lt;<a href="https://www.mediawiki.org/wiki/Transclusion#Partial_transclusion" class="extiw" title="mw:Transclusion">onlyinclude</a>&gt;</code> tags. By default, <tt>text</tt> is treated as though it has been <a href="https://www.mediawiki.org/wiki/Transclusion" class="extiw" title="mw:Transclusion">transcluded</a>, which means that text between <code style="white-space:pre-wrap">&lt;<a href="https://www.mediawiki.org/wiki/Transclusion#Partial_transclusion" class="extiw" title="mw:Transclusion">noinclude</a>&gt;</code> tags will be ignored, and <code style="white-space:pre-wrap">&lt;<a href="https://www.mediawiki.org/wiki/Transclusion#Partial_transclusion" class="extiw" title="mw:Transclusion">onlyinclude</a>&gt;</code> tags will be respected if present. If the parameter <tt>not_transcluded</tt> is set to <code style="white-space:pre-wrap;" class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="kc">true</span></code>, then <tt>text</tt> will be treated as though it has not been transcluded, which means text between <code style="white-space:pre-wrap">&lt;<a href="https://www.mediawiki.org/wiki/Transclusion#Partial_transclusion" class="extiw" title="mw:Transclusion">includeonly</a>&gt;</code> tags will be ignored instead. </p><p>Although the parser is very accurate, some discrepancies may still exist between it and the native parser in certain cases. </p> <br style="clear: both;" /></div> <div class="mw-highlight mw-highlight-lang-lua mw-content-ltr mw-highlight-lines" dir="ltr"><pre><span></span><span id="L-1"><a href="#L-1"><span class="linenos" data-line="1"></span></a><span class="cm">--[[</span> </span><span id="L-2"><a href="#L-2"><span class="linenos" data-line="2"></span></a><span class="cm">NOTE: This module works by using recursive backtracking to build a node tree, which can then be traversed as necessary.</span> </span><span id="L-3"><a href="#L-3"><span class="linenos" data-line="3"></span></a> </span><span id="L-4"><a href="#L-4"><span class="linenos" data-line="4"></span></a><span class="cm">Because it is called by a number of high-use modules, it has been optimised for speed using a profiler, since it is used to scrape data from large numbers of pages very quickly. To that end, it rolls some of its own methods in cases where this is faster than using a function from one of the standard libraries. Please DO NOT &quot;simplify&quot; the code by removing these, since you are almost guaranteed to slow things down, which could seriously impact performance on pages which call this module hundreds or thousands of times.</span> </span><span id="L-5"><a href="#L-5"><span class="linenos" data-line="5"></span></a> </span><span id="L-6"><a href="#L-6"><span class="linenos" data-line="6"></span></a><span class="cm">It has also been designed to emulate the native parser&#39;s behaviour as much as possible, which in some cases means replicating bugs or unintuitive behaviours in that code; these should not be &quot;fixed&quot;, since it is important that the outputs are the same. Most of these originate from deficient regular expressions, which can&#39;t be used here, so the bugs have to be manually reintroduced as special cases (e.g. onlyinclude tags being case-sensitive and whitespace intolerant, unlike all other tags). If any of these are fixed, this module should also be updated accordingly.</span> </span><span id="L-7"><a href="#L-7"><span class="linenos" data-line="7"></span></a><span class="cm">]]</span> </span><span id="L-8"><a href="#L-8"><span class="linenos" data-line="8"></span></a><span class="kd">local</span> <span class="n">export</span> <span class="o">=</span> <span class="p">{}</span> </span><span id="L-9"><a href="#L-9"><span class="linenos" data-line="9"></span></a> </span><span id="L-10"><a href="#L-10"><span class="linenos" data-line="10"></span></a><span class="kd">local</span> <span class="n">data_module</span> <span class="o">=</span> <span class="s2">&quot;Module:template parser/data&quot;</span> </span><span id="L-11"><a href="#L-11"><span class="linenos" data-line="11"></span></a><span class="kd">local</span> <span class="n">magic_words_data_module</span> <span class="o">=</span> <span class="s2">&quot;Module:data/magic words&quot;</span> </span><span id="L-12"><a href="#L-12"><span class="linenos" data-line="12"></span></a><span class="kd">local</span> <span class="n">pages_module</span> <span class="o">=</span> <span class="s2">&quot;Module:pages&quot;</span> </span><span id="L-13"><a href="#L-13"><span class="linenos" data-line="13"></span></a><span class="kd">local</span> <span class="n">parser_extension_tags_data_module</span> <span class="o">=</span> <span class="s2">&quot;Module:data/parser extension tags&quot;</span> </span><span id="L-14"><a href="#L-14"><span class="linenos" data-line="14"></span></a><span class="kd">local</span> <span class="n">parser_module</span> <span class="o">=</span> <span class="s2">&quot;Module:parser&quot;</span> </span><span id="L-15"><a href="#L-15"><span class="linenos" data-line="15"></span></a><span class="kd">local</span> <span class="n">string_utilities_module</span> <span class="o">=</span> <span class="s2">&quot;Module:string utilities&quot;</span> </span><span id="L-16"><a href="#L-16"><span class="linenos" data-line="16"></span></a><span class="kd">local</span> <span class="n">table_module</span> <span class="o">=</span> <span class="s2">&quot;Module:table&quot;</span> </span><span id="L-17"><a href="#L-17"><span class="linenos" data-line="17"></span></a> </span><span id="L-18"><a href="#L-18"><span class="linenos" data-line="18"></span></a><span class="kd">local</span> <span class="nb">require</span> <span class="o">=</span> <span class="nb">require</span> </span><span id="L-19"><a href="#L-19"><span class="linenos" data-line="19"></span></a> </span><span id="L-20"><a href="#L-20"><span class="linenos" data-line="20"></span></a><span class="kd">local</span> <span class="n">m_parser</span> <span class="o">=</span> <span class="nb">require</span><span class="p">(</span><span class="n">parser_module</span><span class="p">)</span> </span><span id="L-21"><a href="#L-21"><span class="linenos" data-line="21"></span></a><span class="kd">local</span> <span class="n">mw</span> <span class="o">=</span> <span class="n">mw</span> </span><span id="L-22"><a href="#L-22"><span class="linenos" data-line="22"></span></a><span class="kd">local</span> <span class="n">mw_title</span> <span class="o">=</span> <span class="n">mw</span><span class="p">.</span><span class="n">title</span> </span><span id="L-23"><a href="#L-23"><span class="linenos" data-line="23"></span></a><span class="kd">local</span> <span class="n">mw_uri</span> <span class="o">=</span> <span class="n">mw</span><span class="p">.</span><span class="n">uri</span> </span><span id="L-24"><a href="#L-24"><span class="linenos" data-line="24"></span></a><span class="kd">local</span> <span class="n">string</span> <span class="o">=</span> <span class="n">string</span> </span><span id="L-25"><a href="#L-25"><span class="linenos" data-line="25"></span></a><span class="kd">local</span> <span class="n">table</span> <span class="o">=</span> <span class="n">table</span> </span><span id="L-26"><a href="#L-26"><span class="linenos" data-line="26"></span></a> </span><span id="L-27"><a href="#L-27"><span class="linenos" data-line="27"></span></a><span class="kd">local</span> <span class="n">anchor_encode</span> <span class="o">=</span> <span class="n">mw_uri</span><span class="p">.</span><span class="n">anchorEncode</span> </span><span id="L-28"><a href="#L-28"><span class="linenos" data-line="28"></span></a><span class="kd">local</span> <span class="n">build_template</span> <span class="c1">-- defined as export.buildTemplate below</span> </span><span id="L-29"><a href="#L-29"><span class="linenos" data-line="29"></span></a><span class="kd">local</span> <span class="n">class_else_type</span> <span class="o">=</span> <span class="n">m_parser</span><span class="p">.</span><span class="n">class_else_type</span> </span><span id="L-30"><a href="#L-30"><span class="linenos" data-line="30"></span></a><span class="kd">local</span> <span class="n">concat</span> <span class="o">=</span> <span class="nb">table.concat</span> </span><span id="L-31"><a href="#L-31"><span class="linenos" data-line="31"></span></a><span class="kd">local</span> <span class="n">encode_uri</span> <span class="o">=</span> <span class="n">mw_uri</span><span class="p">.</span><span class="n">encode</span> </span><span id="L-32"><a href="#L-32"><span class="linenos" data-line="32"></span></a><span class="kd">local</span> <span class="n">find</span> <span class="o">=</span> <span class="nb">string.find</span> </span><span id="L-33"><a href="#L-33"><span class="linenos" data-line="33"></span></a><span class="kd">local</span> <span class="n">format</span> <span class="o">=</span> <span class="nb">string.format</span> </span><span id="L-34"><a href="#L-34"><span class="linenos" data-line="34"></span></a><span class="kd">local</span> <span class="n">gsub</span> <span class="o">=</span> <span class="nb">string.gsub</span> </span><span id="L-35"><a href="#L-35"><span class="linenos" data-line="35"></span></a><span class="kd">local</span> <span class="n">html_create</span> <span class="o">=</span> <span class="n">mw</span><span class="p">.</span><span class="n">html</span><span class="p">.</span><span class="n">create</span> </span><span id="L-36"><a href="#L-36"><span class="linenos" data-line="36"></span></a><span class="kd">local</span> <span class="n">insert</span> <span class="o">=</span> <span class="nb">table.insert</span> </span><span id="L-37"><a href="#L-37"><span class="linenos" data-line="37"></span></a><span class="kd">local</span> <span class="n">is_node</span> <span class="o">=</span> <span class="n">m_parser</span><span class="p">.</span><span class="n">is_node</span> </span><span id="L-38"><a href="#L-38"><span class="linenos" data-line="38"></span></a><span class="kd">local</span> <span class="n">load_data</span> <span class="o">=</span> <span class="n">mw</span><span class="p">.</span><span class="n">loadData</span> </span><span id="L-39"><a href="#L-39"><span class="linenos" data-line="39"></span></a><span class="kd">local</span> <span class="n">lower</span> <span class="o">=</span> <span class="nb">string.lower</span> </span><span id="L-40"><a href="#L-40"><span class="linenos" data-line="40"></span></a><span class="kd">local</span> <span class="n">make_title</span> <span class="o">=</span> <span class="n">mw_title</span><span class="p">.</span><span class="n">makeTitle</span> <span class="c1">-- unconditionally adds the specified namespace prefix</span> </span><span id="L-41"><a href="#L-41"><span class="linenos" data-line="41"></span></a><span class="kd">local</span> <span class="n">match</span> <span class="o">=</span> <span class="nb">string.match</span> </span><span id="L-42"><a href="#L-42"><span class="linenos" data-line="42"></span></a><span class="kd">local</span> <span class="n">new_title</span> <span class="o">=</span> <span class="n">mw_title</span><span class="p">.</span><span class="n">new</span> <span class="c1">-- specified namespace prefix is only added if the input doesn&#39;t contain one</span> </span><span id="L-43"><a href="#L-43"><span class="linenos" data-line="43"></span></a><span class="kd">local</span> <span class="nb">next</span> <span class="o">=</span> <span class="nb">next</span> </span><span id="L-44"><a href="#L-44"><span class="linenos" data-line="44"></span></a><span class="kd">local</span> <span class="nb">pairs</span> <span class="o">=</span> <span class="nb">pairs</span> </span><span id="L-45"><a href="#L-45"><span class="linenos" data-line="45"></span></a><span class="kd">local</span> <span class="n">parse</span> <span class="c1">-- defined as export.parse below</span> </span><span id="L-46"><a href="#L-46"><span class="linenos" data-line="46"></span></a><span class="kd">local</span> <span class="n">parse_template_name</span> <span class="c1">-- defined below</span> </span><span id="L-47"><a href="#L-47"><span class="linenos" data-line="47"></span></a><span class="kd">local</span> <span class="nb">pcall</span> <span class="o">=</span> <span class="nb">pcall</span> </span><span id="L-48"><a href="#L-48"><span class="linenos" data-line="48"></span></a><span class="kd">local</span> <span class="n">rep</span> <span class="o">=</span> <span class="nb">string.rep</span> </span><span id="L-49"><a href="#L-49"><span class="linenos" data-line="49"></span></a><span class="kd">local</span> <span class="n">reverse</span> <span class="o">=</span> <span class="nb">string.reverse</span> </span><span id="L-50"><a href="#L-50"><span class="linenos" data-line="50"></span></a><span class="kd">local</span> <span class="nb">select</span> <span class="o">=</span> <span class="nb">select</span> </span><span id="L-51"><a href="#L-51"><span class="linenos" data-line="51"></span></a><span class="kd">local</span> <span class="n">sub</span> <span class="o">=</span> <span class="nb">string.sub</span> </span><span id="L-52"><a href="#L-52"><span class="linenos" data-line="52"></span></a><span class="kd">local</span> <span class="n">title_equals</span> <span class="o">=</span> <span class="n">mw_title</span><span class="p">.</span><span class="n">equals</span> </span><span id="L-53"><a href="#L-53"><span class="linenos" data-line="53"></span></a><span class="kd">local</span> <span class="nb">tostring</span> <span class="o">=</span> <span class="n">m_parser</span><span class="p">.</span><span class="n">tostring</span> </span><span id="L-54"><a href="#L-54"><span class="linenos" data-line="54"></span></a><span class="kd">local</span> <span class="nb">type</span> <span class="o">=</span> <span class="nb">type</span> </span><span id="L-55"><a href="#L-55"><span class="linenos" data-line="55"></span></a><span class="kd">local</span> <span class="n">umatch</span> <span class="o">=</span> <span class="n">mw</span><span class="p">.</span><span class="n">ustring</span><span class="p">.</span><span class="n">match</span> </span><span id="L-56"><a href="#L-56"><span class="linenos" data-line="56"></span></a> </span><span id="L-57"><a href="#L-57"><span class="linenos" data-line="57"></span></a><span class="cm">--[==[</span> </span><span id="L-58"><a href="#L-58"><span class="linenos" data-line="58"></span></a><span class="cm">Loaders for functions in other modules, which overwrite themselves with the target function when called. This ensures modules are only loaded when needed, retains the speed/convenience of locally-declared pre-loaded functions, and has no overhead after the first call, since the target functions are called directly in any subsequent calls.]==]</span> </span><span id="L-59"><a href="#L-59"><span class="linenos" data-line="59"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">decode_entities</span><span class="p">(...)</span> </span><span id="L-60"><a href="#L-60"><span class="linenos" data-line="60"></span></a> <span class="n">decode_entities</span> <span class="o">=</span> <span class="nb">require</span><span class="p">(</span><span class="n">string_utilities_module</span><span class="p">).</span><span class="n">decode_entities</span> </span><span id="L-61"><a href="#L-61"><span class="linenos" data-line="61"></span></a> <span class="kr">return</span> <span class="n">decode_entities</span><span class="p">(...)</span> </span><span id="L-62"><a href="#L-62"><span class="linenos" data-line="62"></span></a> <span class="kr">end</span> </span><span id="L-63"><a href="#L-63"><span class="linenos" data-line="63"></span></a> </span><span id="L-64"><a href="#L-64"><span class="linenos" data-line="64"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">encode_entities</span><span class="p">(...)</span> </span><span id="L-65"><a href="#L-65"><span class="linenos" data-line="65"></span></a> <span class="n">encode_entities</span> <span class="o">=</span> <span class="nb">require</span><span class="p">(</span><span class="n">string_utilities_module</span><span class="p">).</span><span class="n">encode_entities</span> </span><span id="L-66"><a href="#L-66"><span class="linenos" data-line="66"></span></a> <span class="kr">return</span> <span class="n">encode_entities</span><span class="p">(...)</span> </span><span id="L-67"><a href="#L-67"><span class="linenos" data-line="67"></span></a> <span class="kr">end</span> </span><span id="L-68"><a href="#L-68"><span class="linenos" data-line="68"></span></a> </span><span id="L-69"><a href="#L-69"><span class="linenos" data-line="69"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">is_valid_title</span><span class="p">(...)</span> </span><span id="L-70"><a href="#L-70"><span class="linenos" data-line="70"></span></a> <span class="n">is_valid_title</span> <span class="o">=</span> <span class="nb">require</span><span class="p">(</span><span class="n">pages_module</span><span class="p">).</span><span class="n">is_valid_title</span> </span><span id="L-71"><a href="#L-71"><span class="linenos" data-line="71"></span></a> <span class="kr">return</span> <span class="n">is_valid_title</span><span class="p">(...)</span> </span><span id="L-72"><a href="#L-72"><span class="linenos" data-line="72"></span></a> <span class="kr">end</span> </span><span id="L-73"><a href="#L-73"><span class="linenos" data-line="73"></span></a> </span><span id="L-74"><a href="#L-74"><span class="linenos" data-line="74"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">pattern_escape</span><span class="p">(...)</span> </span><span id="L-75"><a href="#L-75"><span class="linenos" data-line="75"></span></a> <span class="n">pattern_escape</span> <span class="o">=</span> <span class="nb">require</span><span class="p">(</span><span class="n">string_utilities_module</span><span class="p">).</span><span class="n">pattern_escape</span> </span><span id="L-76"><a href="#L-76"><span class="linenos" data-line="76"></span></a> <span class="kr">return</span> <span class="n">pattern_escape</span><span class="p">(...)</span> </span><span id="L-77"><a href="#L-77"><span class="linenos" data-line="77"></span></a> <span class="kr">end</span> </span><span id="L-78"><a href="#L-78"><span class="linenos" data-line="78"></span></a> </span><span id="L-79"><a href="#L-79"><span class="linenos" data-line="79"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">php_trim</span><span class="p">(...)</span> </span><span id="L-80"><a href="#L-80"><span class="linenos" data-line="80"></span></a> <span class="n">php_trim</span> <span class="o">=</span> <span class="nb">require</span><span class="p">(</span><span class="n">string_utilities_module</span><span class="p">).</span><span class="n">php_trim</span> </span><span id="L-81"><a href="#L-81"><span class="linenos" data-line="81"></span></a> <span class="kr">return</span> <span class="n">php_trim</span><span class="p">(...)</span> </span><span id="L-82"><a href="#L-82"><span class="linenos" data-line="82"></span></a> <span class="kr">end</span> </span><span id="L-83"><a href="#L-83"><span class="linenos" data-line="83"></span></a> </span><span id="L-84"><a href="#L-84"><span class="linenos" data-line="84"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">replacement_escape</span><span class="p">(...)</span> </span><span id="L-85"><a href="#L-85"><span class="linenos" data-line="85"></span></a> <span class="n">replacement_escape</span> <span class="o">=</span> <span class="nb">require</span><span class="p">(</span><span class="n">string_utilities_module</span><span class="p">).</span><span class="n">replacement_escape</span> </span><span id="L-86"><a href="#L-86"><span class="linenos" data-line="86"></span></a> <span class="kr">return</span> <span class="n">replacement_escape</span><span class="p">(...)</span> </span><span id="L-87"><a href="#L-87"><span class="linenos" data-line="87"></span></a> <span class="kr">end</span> </span><span id="L-88"><a href="#L-88"><span class="linenos" data-line="88"></span></a> </span><span id="L-89"><a href="#L-89"><span class="linenos" data-line="89"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">scribunto_param_key</span><span class="p">(...)</span> </span><span id="L-90"><a href="#L-90"><span class="linenos" data-line="90"></span></a> <span class="n">scribunto_param_key</span> <span class="o">=</span> <span class="nb">require</span><span class="p">(</span><span class="n">string_utilities_module</span><span class="p">).</span><span class="n">scribunto_param_key</span> </span><span id="L-91"><a href="#L-91"><span class="linenos" data-line="91"></span></a> <span class="kr">return</span> <span class="n">scribunto_param_key</span><span class="p">(...)</span> </span><span id="L-92"><a href="#L-92"><span class="linenos" data-line="92"></span></a> <span class="kr">end</span> </span><span id="L-93"><a href="#L-93"><span class="linenos" data-line="93"></span></a> </span><span id="L-94"><a href="#L-94"><span class="linenos" data-line="94"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">shallowcopy</span><span class="p">(...)</span> </span><span id="L-95"><a href="#L-95"><span class="linenos" data-line="95"></span></a> <span class="n">shallowcopy</span> <span class="o">=</span> <span class="nb">require</span><span class="p">(</span><span class="n">table_module</span><span class="p">).</span><span class="n">shallowcopy</span> </span><span id="L-96"><a href="#L-96"><span class="linenos" data-line="96"></span></a> <span class="kr">return</span> <span class="n">shallowcopy</span><span class="p">(...)</span> </span><span id="L-97"><a href="#L-97"><span class="linenos" data-line="97"></span></a> <span class="kr">end</span> </span><span id="L-98"><a href="#L-98"><span class="linenos" data-line="98"></span></a> </span><span id="L-99"><a href="#L-99"><span class="linenos" data-line="99"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">sorted_pairs</span><span class="p">(...)</span> </span><span id="L-100"><a href="#L-100"><span class="linenos" data-line="100"></span></a> <span class="n">sorted_pairs</span> <span class="o">=</span> <span class="nb">require</span><span class="p">(</span><span class="n">table_module</span><span class="p">).</span><span class="n">sortedPairs</span> </span><span id="L-101"><a href="#L-101"><span class="linenos" data-line="101"></span></a> <span class="kr">return</span> <span class="n">sorted_pairs</span><span class="p">(...)</span> </span><span id="L-102"><a href="#L-102"><span class="linenos" data-line="102"></span></a> <span class="kr">end</span> </span><span id="L-103"><a href="#L-103"><span class="linenos" data-line="103"></span></a> </span><span id="L-104"><a href="#L-104"><span class="linenos" data-line="104"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">split</span><span class="p">(...)</span> </span><span id="L-105"><a href="#L-105"><span class="linenos" data-line="105"></span></a> <span class="n">split</span> <span class="o">=</span> <span class="nb">require</span><span class="p">(</span><span class="n">string_utilities_module</span><span class="p">).</span><span class="n">split</span> </span><span id="L-106"><a href="#L-106"><span class="linenos" data-line="106"></span></a> <span class="kr">return</span> <span class="n">split</span><span class="p">(...)</span> </span><span id="L-107"><a href="#L-107"><span class="linenos" data-line="107"></span></a> <span class="kr">end</span> </span><span id="L-108"><a href="#L-108"><span class="linenos" data-line="108"></span></a> </span><span id="L-109"><a href="#L-109"><span class="linenos" data-line="109"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">table_len</span><span class="p">(...)</span> </span><span id="L-110"><a href="#L-110"><span class="linenos" data-line="110"></span></a> <span class="n">table_len</span> <span class="o">=</span> <span class="nb">require</span><span class="p">(</span><span class="n">table_module</span><span class="p">).</span><span class="n">length</span> </span><span id="L-111"><a href="#L-111"><span class="linenos" data-line="111"></span></a> <span class="kr">return</span> <span class="n">table_len</span><span class="p">(...)</span> </span><span id="L-112"><a href="#L-112"><span class="linenos" data-line="112"></span></a> <span class="kr">end</span> </span><span id="L-113"><a href="#L-113"><span class="linenos" data-line="113"></span></a> </span><span id="L-114"><a href="#L-114"><span class="linenos" data-line="114"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">uupper</span><span class="p">(...)</span> </span><span id="L-115"><a href="#L-115"><span class="linenos" data-line="115"></span></a> <span class="n">uupper</span> <span class="o">=</span> <span class="nb">require</span><span class="p">(</span><span class="n">string_utilities_module</span><span class="p">).</span><span class="n">upper</span> </span><span id="L-116"><a href="#L-116"><span class="linenos" data-line="116"></span></a> <span class="kr">return</span> <span class="n">uupper</span><span class="p">(...)</span> </span><span id="L-117"><a href="#L-117"><span class="linenos" data-line="117"></span></a> <span class="kr">end</span> </span><span id="L-118"><a href="#L-118"><span class="linenos" data-line="118"></span></a> </span><span id="L-119"><a href="#L-119"><span class="linenos" data-line="119"></span></a><span class="cm">--[==[</span> </span><span id="L-120"><a href="#L-120"><span class="linenos" data-line="120"></span></a><span class="cm">Loaders for objects, which load data (or some other object) into some variable, which can then be accessed as &quot;foo or get_foo()&quot;, where the function get_foo sets the object to &quot;foo&quot; and then returns it. This ensures they are only loaded when needed, and avoids the need to check for the existence of the object each time, since once &quot;foo&quot; has been set, &quot;get_foo&quot; will not be called again.]==]</span> </span><span id="L-121"><a href="#L-121"><span class="linenos" data-line="121"></span></a> <span class="kd">local</span> <span class="n">data</span> </span><span id="L-122"><a href="#L-122"><span class="linenos" data-line="122"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">get_data</span><span class="p">()</span> </span><span id="L-123"><a href="#L-123"><span class="linenos" data-line="123"></span></a> <span class="n">data</span><span class="p">,</span> <span class="n">get_data</span> <span class="o">=</span> <span class="n">load_data</span><span class="p">(</span><span class="n">data_module</span><span class="p">),</span> <span class="kc">nil</span> </span><span id="L-124"><a href="#L-124"><span class="linenos" data-line="124"></span></a> <span class="kr">return</span> <span class="n">data</span> </span><span id="L-125"><a href="#L-125"><span class="linenos" data-line="125"></span></a> <span class="kr">end</span> </span><span id="L-126"><a href="#L-126"><span class="linenos" data-line="126"></span></a> </span><span id="L-127"><a href="#L-127"><span class="linenos" data-line="127"></span></a> <span class="kd">local</span> <span class="n">frame</span> </span><span id="L-128"><a href="#L-128"><span class="linenos" data-line="128"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">get_frame</span><span class="p">()</span> </span><span id="L-129"><a href="#L-129"><span class="linenos" data-line="129"></span></a> <span class="n">frame</span><span class="p">,</span> <span class="n">get_frame</span> <span class="o">=</span> <span class="n">mw</span><span class="p">.</span><span class="n">getCurrentFrame</span><span class="p">(),</span> <span class="kc">nil</span> </span><span id="L-130"><a href="#L-130"><span class="linenos" data-line="130"></span></a> <span class="kr">return</span> <span class="n">frame</span> </span><span id="L-131"><a href="#L-131"><span class="linenos" data-line="131"></span></a> <span class="kr">end</span> </span><span id="L-132"><a href="#L-132"><span class="linenos" data-line="132"></span></a> </span><span id="L-133"><a href="#L-133"><span class="linenos" data-line="133"></span></a> <span class="kd">local</span> <span class="n">magic_words</span> </span><span id="L-134"><a href="#L-134"><span class="linenos" data-line="134"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">get_magic_words</span><span class="p">()</span> </span><span id="L-135"><a href="#L-135"><span class="linenos" data-line="135"></span></a> <span class="n">magic_words</span><span class="p">,</span> <span class="n">get_magic_words</span> <span class="o">=</span> <span class="n">load_data</span><span class="p">(</span><span class="n">magic_words_data_module</span><span class="p">),</span> <span class="kc">nil</span> </span><span id="L-136"><a href="#L-136"><span class="linenos" data-line="136"></span></a> <span class="kr">return</span> <span class="n">magic_words</span> </span><span id="L-137"><a href="#L-137"><span class="linenos" data-line="137"></span></a> <span class="kr">end</span> </span><span id="L-138"><a href="#L-138"><span class="linenos" data-line="138"></span></a> </span><span id="L-139"><a href="#L-139"><span class="linenos" data-line="139"></span></a> <span class="kd">local</span> <span class="n">parser_extension_tags</span> </span><span id="L-140"><a href="#L-140"><span class="linenos" data-line="140"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">get_parser_extension_tags</span><span class="p">()</span> </span><span id="L-141"><a href="#L-141"><span class="linenos" data-line="141"></span></a> <span class="n">parser_extension_tags</span><span class="p">,</span> <span class="n">get_parser_extension_tags</span> <span class="o">=</span> <span class="n">load_data</span><span class="p">(</span><span class="n">parser_extension_tags_data_module</span><span class="p">),</span> <span class="kc">nil</span> </span><span id="L-142"><a href="#L-142"><span class="linenos" data-line="142"></span></a> <span class="kr">return</span> <span class="n">parser_extension_tags</span> </span><span id="L-143"><a href="#L-143"><span class="linenos" data-line="143"></span></a> <span class="kr">end</span> </span><span id="L-144"><a href="#L-144"><span class="linenos" data-line="144"></span></a> </span><span id="L-145"><a href="#L-145"><span class="linenos" data-line="145"></span></a><span class="kd">local</span> <span class="n">Parser</span><span class="p">,</span> <span class="n">Node</span> <span class="o">=</span> <span class="n">m_parser</span><span class="p">.</span><span class="n">new</span><span class="p">()</span> </span><span id="L-146"><a href="#L-146"><span class="linenos" data-line="146"></span></a> </span><span id="L-147"><a href="#L-147"><span class="linenos" data-line="147"></span></a><span class="c1">------------------------------------------------------------------------------------</span> </span><span id="L-148"><a href="#L-148"><span class="linenos" data-line="148"></span></a><span class="c1">--</span> </span><span id="L-149"><a href="#L-149"><span class="linenos" data-line="149"></span></a><span class="c1">-- Nodes</span> </span><span id="L-150"><a href="#L-150"><span class="linenos" data-line="150"></span></a><span class="c1">--</span> </span><span id="L-151"><a href="#L-151"><span class="linenos" data-line="151"></span></a><span class="c1">------------------------------------------------------------------------------------</span> </span><span id="L-152"><a href="#L-152"><span class="linenos" data-line="152"></span></a> </span><span id="L-153"><a href="#L-153"><span class="linenos" data-line="153"></span></a><span class="n">Node</span><span class="p">.</span><span class="n">keys_to_remove</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;handler&quot;</span><span class="p">,</span> <span class="s2">&quot;head&quot;</span><span class="p">,</span> <span class="s2">&quot;pattern&quot;</span><span class="p">,</span> <span class="s2">&quot;route&quot;</span><span class="p">,</span> <span class="s2">&quot;step&quot;</span><span class="p">}</span> </span><span id="L-154"><a href="#L-154"><span class="linenos" data-line="154"></span></a> </span><span id="L-155"><a href="#L-155"><span class="linenos" data-line="155"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">expand</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">frame_args</span><span class="p">)</span> </span><span id="L-156"><a href="#L-156"><span class="linenos" data-line="156"></span></a> <span class="kr">return</span> <span class="n">is_node</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span> <span class="ow">and</span> <span class="n">obj</span><span class="p">:</span><span class="n">expand</span><span class="p">(</span><span class="n">frame_args</span><span class="p">)</span> <span class="ow">or</span> <span class="n">obj</span> </span><span id="L-157"><a href="#L-157"><span class="linenos" data-line="157"></span></a><span class="kr">end</span> </span><span id="L-158"><a href="#L-158"><span class="linenos" data-line="158"></span></a><span class="n">export</span><span class="p">.</span><span class="n">expand</span> <span class="o">=</span> <span class="n">expand</span> </span><span id="L-159"><a href="#L-159"><span class="linenos" data-line="159"></span></a> </span><span id="L-160"><a href="#L-160"><span class="linenos" data-line="160"></span></a><span class="kr">function</span> <span class="nc">Node</span><span class="p">:</span><span class="nf">expand</span><span class="p">(</span><span class="n">frame_args</span><span class="p">)</span> </span><span id="L-161"><a href="#L-161"><span class="linenos" data-line="161"></span></a> <span class="kd">local</span> <span class="n">output</span> <span class="o">=</span> <span class="p">{}</span> </span><span id="L-162"><a href="#L-162"><span class="linenos" data-line="162"></span></a> <span class="kr">for</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="o">#</span><span class="n">self</span> <span class="kr">do</span> </span><span id="L-163"><a href="#L-163"><span class="linenos" data-line="163"></span></a> <span class="n">output</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">expand</span><span class="p">(</span><span class="n">self</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">frame_args</span><span class="p">)</span> </span><span id="L-164"><a href="#L-164"><span class="linenos" data-line="164"></span></a> <span class="kr">end</span> </span><span id="L-165"><a href="#L-165"><span class="linenos" data-line="165"></span></a> <span class="kr">return</span> <span class="n">concat</span><span class="p">(</span><span class="n">output</span><span class="p">)</span> </span><span id="L-166"><a href="#L-166"><span class="linenos" data-line="166"></span></a><span class="kr">end</span> </span><span id="L-167"><a href="#L-167"><span class="linenos" data-line="167"></span></a> </span><span id="L-168"><a href="#L-168"><span class="linenos" data-line="168"></span></a><span class="kd">local</span> <span class="n">Wikitext</span> <span class="o">=</span> <span class="n">Node</span><span class="p">:</span><span class="n">new_class</span><span class="p">(</span><span class="s2">&quot;wikitext&quot;</span><span class="p">)</span> </span><span id="L-169"><a href="#L-169"><span class="linenos" data-line="169"></span></a> </span><span id="L-170"><a href="#L-170"><span class="linenos" data-line="170"></span></a><span class="c1">-- force_node ensures the output will always be a node.</span> </span><span id="L-171"><a href="#L-171"><span class="linenos" data-line="171"></span></a><span class="kr">function</span> <span class="nc">Wikitext</span><span class="p">:</span><span class="nf">new</span><span class="p">(</span><span class="n">this</span><span class="p">,</span> <span class="n">force_node</span><span class="p">)</span> </span><span id="L-172"><a href="#L-172"><span class="linenos" data-line="172"></span></a> <span class="kr">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">this</span><span class="p">)</span> <span class="o">~=</span> <span class="s2">&quot;table&quot;</span> <span class="kr">then</span> </span><span id="L-173"><a href="#L-173"><span class="linenos" data-line="173"></span></a> <span class="kr">return</span> <span class="n">force_node</span> <span class="ow">and</span> <span class="n">Node</span><span class="p">.</span><span class="n">new</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="p">{</span><span class="n">this</span><span class="p">})</span> <span class="ow">or</span> <span class="n">this</span> </span><span id="L-174"><a href="#L-174"><span class="linenos" data-line="174"></span></a> <span class="kr">elseif</span> <span class="o">#</span><span class="n">this</span> <span class="o">==</span> <span class="mi">1</span> <span class="kr">then</span> </span><span id="L-175"><a href="#L-175"><span class="linenos" data-line="175"></span></a> <span class="kd">local</span> <span class="n">this1</span> <span class="o">=</span> <span class="n">this</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> </span><span id="L-176"><a href="#L-176"><span class="linenos" data-line="176"></span></a> <span class="kr">return</span> <span class="n">force_node</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">is_node</span><span class="p">(</span><span class="n">this1</span><span class="p">)</span> <span class="ow">and</span> <span class="n">Node</span><span class="p">.</span><span class="n">new</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">this</span><span class="p">)</span> <span class="ow">or</span> <span class="n">this1</span> </span><span id="L-177"><a href="#L-177"><span class="linenos" data-line="177"></span></a> <span class="kr">end</span> </span><span id="L-178"><a href="#L-178"><span class="linenos" data-line="178"></span></a> <span class="kd">local</span> <span class="n">success</span><span class="p">,</span> <span class="n">str</span> <span class="o">=</span> <span class="nb">pcall</span><span class="p">(</span><span class="n">concat</span><span class="p">,</span> <span class="n">this</span><span class="p">)</span> </span><span id="L-179"><a href="#L-179"><span class="linenos" data-line="179"></span></a> <span class="kr">if</span> <span class="n">success</span> <span class="kr">then</span> </span><span id="L-180"><a href="#L-180"><span class="linenos" data-line="180"></span></a> <span class="kr">return</span> <span class="n">force_node</span> <span class="ow">and</span> <span class="n">Node</span><span class="p">.</span><span class="n">new</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="p">{</span><span class="n">str</span><span class="p">})</span> <span class="ow">or</span> <span class="n">str</span> </span><span id="L-181"><a href="#L-181"><span class="linenos" data-line="181"></span></a> <span class="kr">end</span> </span><span id="L-182"><a href="#L-182"><span class="linenos" data-line="182"></span></a> <span class="kr">return</span> <span class="n">Node</span><span class="p">.</span><span class="n">new</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">this</span><span class="p">)</span> </span><span id="L-183"><a href="#L-183"><span class="linenos" data-line="183"></span></a><span class="kr">end</span> </span><span id="L-184"><a href="#L-184"><span class="linenos" data-line="184"></span></a> </span><span id="L-185"><a href="#L-185"><span class="linenos" data-line="185"></span></a><span class="c1">-- First value is the parameter name.</span> </span><span id="L-186"><a href="#L-186"><span class="linenos" data-line="186"></span></a><span class="c1">-- Second value is the parameter&#39;s default value.</span> </span><span id="L-187"><a href="#L-187"><span class="linenos" data-line="187"></span></a><span class="c1">-- Any additional values are ignored: e.g. &quot;{{{a|b|c}}}&quot; is parameter &quot;a&quot; with default value &quot;b&quot; (*not* &quot;b|c&quot;).</span> </span><span id="L-188"><a href="#L-188"><span class="linenos" data-line="188"></span></a><span class="kd">local</span> <span class="n">Parameter</span> <span class="o">=</span> <span class="n">Node</span><span class="p">:</span><span class="n">new_class</span><span class="p">(</span><span class="s2">&quot;parameter&quot;</span><span class="p">)</span> </span><span id="L-189"><a href="#L-189"><span class="linenos" data-line="189"></span></a> </span><span id="L-190"><a href="#L-190"><span class="linenos" data-line="190"></span></a><span class="kr">function</span> <span class="nc">Parameter</span><span class="p">:</span><span class="nf">new</span><span class="p">(</span><span class="n">this</span><span class="p">)</span> </span><span id="L-191"><a href="#L-191"><span class="linenos" data-line="191"></span></a> <span class="kd">local</span> <span class="n">this2</span> <span class="o">=</span> <span class="n">this</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> </span><span id="L-192"><a href="#L-192"><span class="linenos" data-line="192"></span></a> <span class="kr">if</span> <span class="n">class_else_type</span><span class="p">(</span><span class="n">this2</span><span class="p">)</span> <span class="o">==</span> <span class="s2">&quot;argument&quot;</span> <span class="kr">then</span> </span><span id="L-193"><a href="#L-193"><span class="linenos" data-line="193"></span></a> <span class="n">insert</span><span class="p">(</span><span class="n">this2</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="s2">&quot;=&quot;</span><span class="p">)</span> </span><span id="L-194"><a href="#L-194"><span class="linenos" data-line="194"></span></a> <span class="n">this2</span> <span class="o">=</span> <span class="n">Wikitext</span><span class="p">:</span><span class="n">new</span><span class="p">(</span><span class="n">this2</span><span class="p">)</span> </span><span id="L-195"><a href="#L-195"><span class="linenos" data-line="195"></span></a> <span class="kr">end</span> </span><span id="L-196"><a href="#L-196"><span class="linenos" data-line="196"></span></a> <span class="kr">return</span> <span class="n">Node</span><span class="p">.</span><span class="n">new</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="p">{</span><span class="n">this</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">this2</span><span class="p">})</span> </span><span id="L-197"><a href="#L-197"><span class="linenos" data-line="197"></span></a><span class="kr">end</span> </span><span id="L-198"><a href="#L-198"><span class="linenos" data-line="198"></span></a> </span><span id="L-199"><a href="#L-199"><span class="linenos" data-line="199"></span></a><span class="kr">function</span> <span class="nc">Parameter</span><span class="p">:</span><span class="nf">__tostring</span><span class="p">()</span> </span><span id="L-200"><a href="#L-200"><span class="linenos" data-line="200"></span></a> <span class="kd">local</span> <span class="n">output</span> <span class="o">=</span> <span class="p">{}</span> </span><span id="L-201"><a href="#L-201"><span class="linenos" data-line="201"></span></a> <span class="kr">for</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="o">#</span><span class="n">self</span> <span class="kr">do</span> </span><span id="L-202"><a href="#L-202"><span class="linenos" data-line="202"></span></a> <span class="n">output</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="nb">tostring</span><span class="p">(</span><span class="n">self</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> </span><span id="L-203"><a href="#L-203"><span class="linenos" data-line="203"></span></a> <span class="kr">end</span> </span><span id="L-204"><a href="#L-204"><span class="linenos" data-line="204"></span></a> <span class="kr">return</span> <span class="s2">&quot;{{{&quot;</span> <span class="o">..</span> <span class="n">concat</span><span class="p">(</span><span class="n">output</span><span class="p">,</span> <span class="s2">&quot;|&quot;</span><span class="p">)</span> <span class="o">..</span> <span class="s2">&quot;}}}&quot;</span> </span><span id="L-205"><a href="#L-205"><span class="linenos" data-line="205"></span></a><span class="kr">end</span> </span><span id="L-206"><a href="#L-206"><span class="linenos" data-line="206"></span></a> </span><span id="L-207"><a href="#L-207"><span class="linenos" data-line="207"></span></a><span class="kr">function</span> <span class="nc">Parameter</span><span class="p">:</span><span class="nf">next</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> </span><span id="L-208"><a href="#L-208"><span class="linenos" data-line="208"></span></a> <span class="n">i</span> <span class="o">=</span> <span class="n">i</span> <span class="o">+</span> <span class="mi">1</span> </span><span id="L-209"><a href="#L-209"><span class="linenos" data-line="209"></span></a> <span class="kr">if</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="mi">2</span> <span class="kr">then</span> </span><span id="L-210"><a href="#L-210"><span class="linenos" data-line="210"></span></a> <span class="kr">return</span> <span class="n">self</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">self</span><span class="p">,</span> <span class="n">i</span> </span><span id="L-211"><a href="#L-211"><span class="linenos" data-line="211"></span></a> <span class="kr">end</span> </span><span id="L-212"><a href="#L-212"><span class="linenos" data-line="212"></span></a><span class="kr">end</span> </span><span id="L-213"><a href="#L-213"><span class="linenos" data-line="213"></span></a> </span><span id="L-214"><a href="#L-214"><span class="linenos" data-line="214"></span></a><span class="kr">function</span> <span class="nc">Parameter</span><span class="p">:</span><span class="nf">get_name</span><span class="p">(</span><span class="n">frame_args</span><span class="p">)</span> </span><span id="L-215"><a href="#L-215"><span class="linenos" data-line="215"></span></a> <span class="kr">return</span> <span class="n">scribunto_param_key</span><span class="p">(</span><span class="n">expand</span><span class="p">(</span><span class="n">self</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">frame_args</span><span class="p">))</span> </span><span id="L-216"><a href="#L-216"><span class="linenos" data-line="216"></span></a><span class="kr">end</span> </span><span id="L-217"><a href="#L-217"><span class="linenos" data-line="217"></span></a> </span><span id="L-218"><a href="#L-218"><span class="linenos" data-line="218"></span></a><span class="kr">function</span> <span class="nc">Parameter</span><span class="p">:</span><span class="nf">get_default</span><span class="p">(</span><span class="n">frame_args</span><span class="p">)</span> </span><span id="L-219"><a href="#L-219"><span class="linenos" data-line="219"></span></a> <span class="kd">local</span> <span class="n">default</span> <span class="o">=</span> <span class="n">self</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> </span><span id="L-220"><a href="#L-220"><span class="linenos" data-line="220"></span></a> <span class="kr">if</span> <span class="n">default</span> <span class="o">~=</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-221"><a href="#L-221"><span class="linenos" data-line="221"></span></a> <span class="kr">return</span> <span class="n">expand</span><span class="p">(</span><span class="n">default</span><span class="p">,</span> <span class="n">frame_args</span><span class="p">)</span> </span><span id="L-222"><a href="#L-222"><span class="linenos" data-line="222"></span></a> <span class="kr">end</span> </span><span id="L-223"><a href="#L-223"><span class="linenos" data-line="223"></span></a> <span class="kr">return</span> <span class="s2">&quot;{{{&quot;</span> <span class="o">..</span> <span class="n">expand</span><span class="p">(</span><span class="n">self</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">frame_args</span><span class="p">)</span> <span class="o">..</span> <span class="s2">&quot;}}}&quot;</span> </span><span id="L-224"><a href="#L-224"><span class="linenos" data-line="224"></span></a><span class="kr">end</span> </span><span id="L-225"><a href="#L-225"><span class="linenos" data-line="225"></span></a> </span><span id="L-226"><a href="#L-226"><span class="linenos" data-line="226"></span></a><span class="kr">function</span> <span class="nc">Parameter</span><span class="p">:</span><span class="nf">expand</span><span class="p">(</span><span class="n">frame_args</span><span class="p">)</span> </span><span id="L-227"><a href="#L-227"><span class="linenos" data-line="227"></span></a> <span class="kr">if</span> <span class="n">frame_args</span> <span class="o">==</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-228"><a href="#L-228"><span class="linenos" data-line="228"></span></a> <span class="kr">return</span> <span class="n">self</span><span class="p">:</span><span class="n">get_default</span><span class="p">()</span> </span><span id="L-229"><a href="#L-229"><span class="linenos" data-line="229"></span></a> <span class="kr">end</span> </span><span id="L-230"><a href="#L-230"><span class="linenos" data-line="230"></span></a> <span class="kd">local</span> <span class="n">name</span> <span class="o">=</span> <span class="n">expand</span><span class="p">(</span><span class="n">self</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">frame_args</span><span class="p">)</span> </span><span id="L-231"><a href="#L-231"><span class="linenos" data-line="231"></span></a> <span class="kd">local</span> <span class="n">val</span> <span class="o">=</span> <span class="n">frame_args</span><span class="p">[</span><span class="n">scribunto_param_key</span><span class="p">(</span><span class="n">name</span><span class="p">)]</span> <span class="c1">-- Parameter in use.</span> </span><span id="L-232"><a href="#L-232"><span class="linenos" data-line="232"></span></a> <span class="kr">if</span> <span class="n">val</span> <span class="o">~=</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-233"><a href="#L-233"><span class="linenos" data-line="233"></span></a> <span class="kr">return</span> <span class="n">val</span> </span><span id="L-234"><a href="#L-234"><span class="linenos" data-line="234"></span></a> <span class="kr">end</span> </span><span id="L-235"><a href="#L-235"><span class="linenos" data-line="235"></span></a> <span class="n">val</span> <span class="o">=</span> <span class="n">self</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="c1">-- Default.</span> </span><span id="L-236"><a href="#L-236"><span class="linenos" data-line="236"></span></a> <span class="kr">if</span> <span class="n">val</span> <span class="o">~=</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-237"><a href="#L-237"><span class="linenos" data-line="237"></span></a> <span class="kr">return</span> <span class="n">expand</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">frame_args</span><span class="p">)</span> </span><span id="L-238"><a href="#L-238"><span class="linenos" data-line="238"></span></a> <span class="kr">end</span> </span><span id="L-239"><a href="#L-239"><span class="linenos" data-line="239"></span></a> <span class="kr">return</span> <span class="s2">&quot;{{{&quot;</span> <span class="o">..</span> <span class="n">name</span> <span class="o">..</span> <span class="s2">&quot;}}}&quot;</span> </span><span id="L-240"><a href="#L-240"><span class="linenos" data-line="240"></span></a><span class="kr">end</span> </span><span id="L-241"><a href="#L-241"><span class="linenos" data-line="241"></span></a> </span><span id="L-242"><a href="#L-242"><span class="linenos" data-line="242"></span></a><span class="kd">local</span> <span class="n">Argument</span> <span class="o">=</span> <span class="n">Node</span><span class="p">:</span><span class="n">new_class</span><span class="p">(</span><span class="s2">&quot;argument&quot;</span><span class="p">)</span> </span><span id="L-243"><a href="#L-243"><span class="linenos" data-line="243"></span></a> </span><span id="L-244"><a href="#L-244"><span class="linenos" data-line="244"></span></a><span class="kr">function</span> <span class="nc">Argument</span><span class="p">:</span><span class="nf">__tostring</span><span class="p">()</span> </span><span id="L-245"><a href="#L-245"><span class="linenos" data-line="245"></span></a> <span class="kr">return</span> <span class="nb">tostring</span><span class="p">(</span><span class="n">self</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span> <span class="o">..</span> <span class="s2">&quot;=&quot;</span> <span class="o">..</span> <span class="nb">tostring</span><span class="p">(</span><span class="n">self</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span> </span><span id="L-246"><a href="#L-246"><span class="linenos" data-line="246"></span></a><span class="kr">end</span> </span><span id="L-247"><a href="#L-247"><span class="linenos" data-line="247"></span></a> </span><span id="L-248"><a href="#L-248"><span class="linenos" data-line="248"></span></a><span class="kr">function</span> <span class="nc">Argument</span><span class="p">:</span><span class="nf">expand</span><span class="p">(</span><span class="n">frame_args</span><span class="p">)</span> </span><span id="L-249"><a href="#L-249"><span class="linenos" data-line="249"></span></a> <span class="kr">return</span> <span class="n">expand</span><span class="p">(</span><span class="n">self</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">frame_args</span><span class="p">)</span> <span class="o">..</span> <span class="s2">&quot;=&quot;</span> <span class="o">..</span> <span class="n">expand</span><span class="p">(</span><span class="n">self</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span> <span class="n">frame_args</span><span class="p">)</span> </span><span id="L-250"><a href="#L-250"><span class="linenos" data-line="250"></span></a><span class="kr">end</span> </span><span id="L-251"><a href="#L-251"><span class="linenos" data-line="251"></span></a> </span><span id="L-252"><a href="#L-252"><span class="linenos" data-line="252"></span></a><span class="kd">local</span> <span class="n">Template</span> <span class="o">=</span> <span class="n">Node</span><span class="p">:</span><span class="n">new_class</span><span class="p">(</span><span class="s2">&quot;template&quot;</span><span class="p">)</span> </span><span id="L-253"><a href="#L-253"><span class="linenos" data-line="253"></span></a> </span><span id="L-254"><a href="#L-254"><span class="linenos" data-line="254"></span></a><span class="kr">function</span> <span class="nc">Template</span><span class="p">:</span><span class="nf">__tostring</span><span class="p">()</span> </span><span id="L-255"><a href="#L-255"><span class="linenos" data-line="255"></span></a> <span class="kd">local</span> <span class="n">output</span> <span class="o">=</span> <span class="p">{}</span> </span><span id="L-256"><a href="#L-256"><span class="linenos" data-line="256"></span></a> <span class="kr">for</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="o">#</span><span class="n">self</span> <span class="kr">do</span> </span><span id="L-257"><a href="#L-257"><span class="linenos" data-line="257"></span></a> <span class="n">output</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="nb">tostring</span><span class="p">(</span><span class="n">self</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> </span><span id="L-258"><a href="#L-258"><span class="linenos" data-line="258"></span></a> <span class="kr">end</span> </span><span id="L-259"><a href="#L-259"><span class="linenos" data-line="259"></span></a> <span class="kr">return</span> <span class="s2">&quot;{{&quot;</span> <span class="o">..</span> <span class="n">concat</span><span class="p">(</span><span class="n">output</span><span class="p">,</span> <span class="s2">&quot;|&quot;</span><span class="p">)</span> <span class="o">..</span> <span class="s2">&quot;}}&quot;</span> </span><span id="L-260"><a href="#L-260"><span class="linenos" data-line="260"></span></a><span class="kr">end</span> </span><span id="L-261"><a href="#L-261"><span class="linenos" data-line="261"></span></a> </span><span id="L-262"><a href="#L-262"><span class="linenos" data-line="262"></span></a><span class="c1">-- Normalize the template name, check it&#39;s a valid template, then memoize results (using false for invalid titles).</span> </span><span id="L-263"><a href="#L-263"><span class="linenos" data-line="263"></span></a><span class="c1">-- Parser functions (e.g. {{#IF:a|b|c}}) need to have the first argument extracted from the title, as it comes after the colon. Because of this, the parser function and first argument are memoized as a table.</span> </span><span id="L-264"><a href="#L-264"><span class="linenos" data-line="264"></span></a><span class="c1">-- FIXME: Some parser functions have special argument handling (e.g. {{#SWITCH:}}).</span> </span><span id="L-265"><a href="#L-265"><span class="linenos" data-line="265"></span></a><span class="kr">do</span> </span><span id="L-266"><a href="#L-266"><span class="linenos" data-line="266"></span></a> <span class="kd">local</span> <span class="n">page_title</span> <span class="o">=</span> <span class="n">mw_title</span><span class="p">.</span><span class="n">getCurrentTitle</span><span class="p">()</span> </span><span id="L-267"><a href="#L-267"><span class="linenos" data-line="267"></span></a> <span class="kd">local</span> <span class="n">namespace_has_subpages</span> <span class="o">=</span> <span class="n">mw</span><span class="p">.</span><span class="n">site</span><span class="p">.</span><span class="n">namespaces</span><span class="p">[</span><span class="n">page_title</span><span class="p">.</span><span class="n">namespace</span><span class="p">].</span><span class="n">hasSubpages</span> </span><span id="L-268"><a href="#L-268"><span class="linenos" data-line="268"></span></a> <span class="kd">local</span> <span class="n">raw_pagename</span> <span class="o">=</span> <span class="n">page_title</span><span class="p">.</span><span class="n">fullText</span> </span><span id="L-269"><a href="#L-269"><span class="linenos" data-line="269"></span></a> </span><span id="L-270"><a href="#L-270"><span class="linenos" data-line="270"></span></a> <span class="kd">local</span> <span class="n">templates</span> <span class="o">=</span> <span class="p">{}</span> </span><span id="L-271"><a href="#L-271"><span class="linenos" data-line="271"></span></a> <span class="kd">local</span> <span class="n">parser_variables</span> <span class="o">=</span> <span class="p">{}</span> </span><span id="L-272"><a href="#L-272"><span class="linenos" data-line="272"></span></a> <span class="kd">local</span> <span class="n">parser_functions</span> <span class="o">=</span> <span class="p">{}</span> </span><span id="L-273"><a href="#L-273"><span class="linenos" data-line="273"></span></a> </span><span id="L-274"><a href="#L-274"><span class="linenos" data-line="274"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">retrieve_magic_word_data</span><span class="p">(</span><span class="n">chunk</span><span class="p">)</span> </span><span id="L-275"><a href="#L-275"><span class="linenos" data-line="275"></span></a> <span class="kd">local</span> <span class="n">mgw_data</span> <span class="o">=</span> <span class="p">(</span><span class="n">magic_words</span> <span class="ow">or</span> <span class="n">get_magic_words</span><span class="p">())[</span><span class="n">chunk</span><span class="p">]</span> </span><span id="L-276"><a href="#L-276"><span class="linenos" data-line="276"></span></a> <span class="kr">if</span> <span class="n">mgw_data</span> <span class="kr">then</span> </span><span id="L-277"><a href="#L-277"><span class="linenos" data-line="277"></span></a> <span class="kr">return</span> <span class="n">mgw_data</span> </span><span id="L-278"><a href="#L-278"><span class="linenos" data-line="278"></span></a> <span class="kr">end</span> </span><span id="L-279"><a href="#L-279"><span class="linenos" data-line="279"></span></a> <span class="kd">local</span> <span class="n">normalized</span> <span class="o">=</span> <span class="n">uupper</span><span class="p">(</span><span class="n">chunk</span><span class="p">)</span> </span><span id="L-280"><a href="#L-280"><span class="linenos" data-line="280"></span></a> <span class="n">mgw_data</span> <span class="o">=</span> <span class="n">magic_words</span><span class="p">[</span><span class="n">normalized</span><span class="p">]</span> </span><span id="L-281"><a href="#L-281"><span class="linenos" data-line="281"></span></a> <span class="kr">if</span> <span class="n">mgw_data</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">mgw_data</span><span class="p">.</span><span class="n">case_sensitive</span> <span class="kr">then</span> </span><span id="L-282"><a href="#L-282"><span class="linenos" data-line="282"></span></a> <span class="kr">return</span> <span class="n">mgw_data</span> </span><span id="L-283"><a href="#L-283"><span class="linenos" data-line="283"></span></a> <span class="kr">end</span> </span><span id="L-284"><a href="#L-284"><span class="linenos" data-line="284"></span></a> <span class="kr">end</span> </span><span id="L-285"><a href="#L-285"><span class="linenos" data-line="285"></span></a> </span><span id="L-286"><a href="#L-286"><span class="linenos" data-line="286"></span></a> <span class="c1">-- Returns the name required to transclude the title object `title` using</span> </span><span id="L-287"><a href="#L-287"><span class="linenos" data-line="287"></span></a> <span class="c1">-- template {{ }} syntax.</span> </span><span id="L-288"><a href="#L-288"><span class="linenos" data-line="288"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">get_template_invocation_name</span><span class="p">(</span><span class="n">title</span><span class="p">)</span> </span><span id="L-289"><a href="#L-289"><span class="linenos" data-line="289"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">is_valid_title</span><span class="p">(</span><span class="n">title</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-290"><a href="#L-290"><span class="linenos" data-line="290"></span></a> <span class="nb">error</span><span class="p">(</span><span class="s2">&quot;Template invocations require a valid page title, which cannot contain an interwiki prefix.&quot;</span><span class="p">)</span> </span><span id="L-291"><a href="#L-291"><span class="linenos" data-line="291"></span></a> <span class="kr">end</span> </span><span id="L-292"><a href="#L-292"><span class="linenos" data-line="292"></span></a> <span class="kd">local</span> <span class="n">namespace</span> <span class="o">=</span> <span class="n">title</span><span class="p">.</span><span class="n">namespace</span> </span><span id="L-293"><a href="#L-293"><span class="linenos" data-line="293"></span></a> <span class="c1">-- If not in the template namespace, include the prefix (or &quot;:&quot; if</span> </span><span id="L-294"><a href="#L-294"><span class="linenos" data-line="294"></span></a> <span class="c1">-- mainspace).</span> </span><span id="L-295"><a href="#L-295"><span class="linenos" data-line="295"></span></a> <span class="kr">if</span> <span class="n">namespace</span> <span class="o">~=</span> <span class="mi">10</span> <span class="kr">then</span> </span><span id="L-296"><a href="#L-296"><span class="linenos" data-line="296"></span></a> <span class="kr">return</span> <span class="n">namespace</span> <span class="o">==</span> <span class="mi">0</span> <span class="ow">and</span> <span class="s2">&quot;:&quot;</span> <span class="o">..</span> <span class="n">title</span><span class="p">.</span><span class="n">text</span> <span class="ow">or</span> <span class="n">title</span><span class="p">.</span><span class="n">prefixedText</span> </span><span id="L-297"><a href="#L-297"><span class="linenos" data-line="297"></span></a> <span class="kr">end</span> </span><span id="L-298"><a href="#L-298"><span class="linenos" data-line="298"></span></a> <span class="c1">-- If in the template namespace and it shares a name with a magic word,</span> </span><span id="L-299"><a href="#L-299"><span class="linenos" data-line="299"></span></a> <span class="c1">-- it needs the prefix &quot;Template:&quot;.</span> </span><span id="L-300"><a href="#L-300"><span class="linenos" data-line="300"></span></a> <span class="kd">local</span> <span class="n">text</span> <span class="o">=</span> <span class="n">title</span><span class="p">.</span><span class="n">text</span> </span><span id="L-301"><a href="#L-301"><span class="linenos" data-line="301"></span></a> <span class="kd">local</span> <span class="n">colon</span> <span class="o">=</span> <span class="n">find</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="s2">&quot;:&quot;</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="kc">true</span><span class="p">)</span> </span><span id="L-302"><a href="#L-302"><span class="linenos" data-line="302"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">colon</span> <span class="kr">then</span> </span><span id="L-303"><a href="#L-303"><span class="linenos" data-line="303"></span></a> <span class="kd">local</span> <span class="n">mgw_data</span> <span class="o">=</span> <span class="n">retrieve_magic_word_data</span><span class="p">(</span><span class="n">text</span><span class="p">)</span> </span><span id="L-304"><a href="#L-304"><span class="linenos" data-line="304"></span></a> <span class="kr">return</span> <span class="n">mgw_data</span> <span class="ow">and</span> <span class="n">mgw_data</span><span class="p">.</span><span class="n">parser_variable</span> <span class="ow">and</span> <span class="n">title</span><span class="p">.</span><span class="n">prefixedText</span> <span class="ow">or</span> <span class="n">text</span> </span><span id="L-305"><a href="#L-305"><span class="linenos" data-line="305"></span></a> <span class="kr">end</span> </span><span id="L-306"><a href="#L-306"><span class="linenos" data-line="306"></span></a> <span class="kd">local</span> <span class="n">mgw_data</span> <span class="o">=</span> <span class="n">retrieve_magic_word_data</span><span class="p">(</span><span class="n">sub</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">colon</span> <span class="o">-</span> <span class="mi">1</span><span class="p">))</span> </span><span id="L-307"><a href="#L-307"><span class="linenos" data-line="307"></span></a> <span class="kr">if</span> <span class="n">mgw_data</span> <span class="ow">and</span> <span class="p">(</span><span class="n">mgw_data</span><span class="p">.</span><span class="n">parser_function</span> <span class="ow">or</span> <span class="n">mgw_data</span><span class="p">.</span><span class="n">transclusion_modifier</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-308"><a href="#L-308"><span class="linenos" data-line="308"></span></a> <span class="kr">return</span> <span class="n">title</span><span class="p">.</span><span class="n">prefixedText</span> </span><span id="L-309"><a href="#L-309"><span class="linenos" data-line="309"></span></a> <span class="kr">end</span> </span><span id="L-310"><a href="#L-310"><span class="linenos" data-line="310"></span></a> <span class="c1">-- Also if &quot;Template:&quot; is necessary for disambiguation (e.g.</span> </span><span id="L-311"><a href="#L-311"><span class="linenos" data-line="311"></span></a> <span class="c1">-- &quot;Template:Category:Foo&quot; can&#39;t be abbreviated to &quot;Category:Foo&quot;).</span> </span><span id="L-312"><a href="#L-312"><span class="linenos" data-line="312"></span></a> <span class="kd">local</span> <span class="n">check</span> <span class="o">=</span> <span class="n">new_title</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span> </span><span id="L-313"><a href="#L-313"><span class="linenos" data-line="313"></span></a> <span class="kr">return</span> <span class="n">check</span> <span class="ow">and</span> <span class="n">title_equals</span><span class="p">(</span><span class="n">title</span><span class="p">,</span> <span class="n">check</span><span class="p">)</span> <span class="ow">and</span> <span class="n">text</span> <span class="ow">or</span> <span class="n">title</span><span class="p">.</span><span class="n">prefixedText</span> </span><span id="L-314"><a href="#L-314"><span class="linenos" data-line="314"></span></a> <span class="kr">end</span> </span><span id="L-315"><a href="#L-315"><span class="linenos" data-line="315"></span></a> <span class="n">export</span><span class="p">.</span><span class="n">getTemplateInvocationName</span> <span class="o">=</span> <span class="n">get_template_invocation_name</span> </span><span id="L-316"><a href="#L-316"><span class="linenos" data-line="316"></span></a> </span><span id="L-317"><a href="#L-317"><span class="linenos" data-line="317"></span></a> <span class="c1">-- Returns whether a title is a redirect or not. Structured like this to</span> </span><span id="L-318"><a href="#L-318"><span class="linenos" data-line="318"></span></a> <span class="c1">-- allow the use of pcall, since it will throw an error if the expensive</span> </span><span id="L-319"><a href="#L-319"><span class="linenos" data-line="319"></span></a> <span class="c1">-- parser function limit has been reached.</span> </span><span id="L-320"><a href="#L-320"><span class="linenos" data-line="320"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">is_redirect</span><span class="p">(</span><span class="n">title</span><span class="p">)</span> </span><span id="L-321"><a href="#L-321"><span class="linenos" data-line="321"></span></a> <span class="kr">return</span> <span class="n">title</span><span class="p">.</span><span class="n">isRedirect</span> </span><span id="L-322"><a href="#L-322"><span class="linenos" data-line="322"></span></a> <span class="kr">end</span> </span><span id="L-323"><a href="#L-323"><span class="linenos" data-line="323"></span></a> </span><span id="L-324"><a href="#L-324"><span class="linenos" data-line="324"></span></a> <span class="kr">function</span> <span class="nf">parse_template_name</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">has_args</span><span class="p">,</span> <span class="n">fragment</span><span class="p">,</span> <span class="n">force_transclusion</span><span class="p">)</span> </span><span id="L-325"><a href="#L-325"><span class="linenos" data-line="325"></span></a> <span class="kd">local</span> <span class="n">chunks</span><span class="p">,</span> <span class="n">colon</span><span class="p">,</span> <span class="n">start</span><span class="p">,</span> <span class="n">n</span><span class="p">,</span> <span class="n">p</span> <span class="o">=</span> <span class="p">{},</span> <span class="n">find</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="s2">&quot;:&quot;</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="kc">true</span><span class="p">),</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span> </span><span id="L-326"><a href="#L-326"><span class="linenos" data-line="326"></span></a> <span class="kr">while</span> <span class="n">colon</span> <span class="kr">do</span> </span><span id="L-327"><a href="#L-327"><span class="linenos" data-line="327"></span></a> <span class="c1">-- Pattern applies PHP ltrim.</span> </span><span id="L-328"><a href="#L-328"><span class="linenos" data-line="328"></span></a> <span class="kd">local</span> <span class="n">mgw_data</span> <span class="o">=</span> <span class="n">retrieve_magic_word_data</span><span class="p">(</span><span class="n">match</span><span class="p">(</span><span class="n">sub</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">start</span><span class="p">,</span> <span class="n">colon</span> <span class="o">-</span> <span class="mi">1</span><span class="p">),</span> <span class="s2">&quot;[^%z</span><span class="se">\t</span><span class="s2">-</span><span class="se">\v\r</span><span class="s2"> ].*&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="s2">&quot;&quot;</span><span class="p">)</span> </span><span id="L-329"><a href="#L-329"><span class="linenos" data-line="329"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">mgw_data</span> <span class="kr">then</span> </span><span id="L-330"><a href="#L-330"><span class="linenos" data-line="330"></span></a> <span class="kr">break</span> </span><span id="L-331"><a href="#L-331"><span class="linenos" data-line="331"></span></a> <span class="kr">end</span> </span><span id="L-332"><a href="#L-332"><span class="linenos" data-line="332"></span></a> <span class="kd">local</span> <span class="n">priority</span> <span class="o">=</span> <span class="n">mgw_data</span><span class="p">.</span><span class="n">priority</span> </span><span id="L-333"><a href="#L-333"><span class="linenos" data-line="333"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">priority</span> <span class="ow">and</span> <span class="n">priority</span> <span class="o">&gt;</span> <span class="n">p</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-334"><a href="#L-334"><span class="linenos" data-line="334"></span></a> <span class="kd">local</span> <span class="n">pf</span> <span class="o">=</span> <span class="n">mgw_data</span><span class="p">.</span><span class="n">parser_function</span> <span class="ow">and</span> <span class="n">mgw_data</span><span class="p">.</span><span class="n">name</span> <span class="ow">or</span> <span class="kc">nil</span> </span><span id="L-335"><a href="#L-335"><span class="linenos" data-line="335"></span></a> <span class="kr">if</span> <span class="n">pf</span> <span class="kr">then</span> </span><span id="L-336"><a href="#L-336"><span class="linenos" data-line="336"></span></a> <span class="n">n</span> <span class="o">=</span> <span class="n">n</span> <span class="o">+</span> <span class="mi">1</span> </span><span id="L-337"><a href="#L-337"><span class="linenos" data-line="337"></span></a> <span class="n">chunks</span><span class="p">[</span><span class="n">n</span><span class="p">]</span> <span class="o">=</span> <span class="n">pf</span> <span class="o">..</span> <span class="s2">&quot;:&quot;</span> </span><span id="L-338"><a href="#L-338"><span class="linenos" data-line="338"></span></a> <span class="kr">return</span> <span class="n">chunks</span><span class="p">,</span> <span class="s2">&quot;parser function&quot;</span><span class="p">,</span> <span class="n">sub</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">colon</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> </span><span id="L-339"><a href="#L-339"><span class="linenos" data-line="339"></span></a> <span class="kr">end</span> </span><span id="L-340"><a href="#L-340"><span class="linenos" data-line="340"></span></a> <span class="kr">break</span> </span><span id="L-341"><a href="#L-341"><span class="linenos" data-line="341"></span></a> <span class="kr">end</span> </span><span id="L-342"><a href="#L-342"><span class="linenos" data-line="342"></span></a> <span class="n">n</span> <span class="o">=</span> <span class="n">n</span> <span class="o">+</span> <span class="mi">1</span> </span><span id="L-343"><a href="#L-343"><span class="linenos" data-line="343"></span></a> <span class="n">chunks</span><span class="p">[</span><span class="n">n</span><span class="p">]</span> <span class="o">=</span> <span class="n">mgw_data</span><span class="p">.</span><span class="n">name</span> <span class="o">..</span> <span class="s2">&quot;:&quot;</span> </span><span id="L-344"><a href="#L-344"><span class="linenos" data-line="344"></span></a> <span class="n">start</span><span class="p">,</span> <span class="n">p</span> <span class="o">=</span> <span class="n">colon</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">priority</span> </span><span id="L-345"><a href="#L-345"><span class="linenos" data-line="345"></span></a> <span class="n">colon</span> <span class="o">=</span> <span class="n">find</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="s2">&quot;:&quot;</span><span class="p">,</span> <span class="n">start</span><span class="p">,</span> <span class="kc">true</span><span class="p">)</span> </span><span id="L-346"><a href="#L-346"><span class="linenos" data-line="346"></span></a> <span class="kr">end</span> </span><span id="L-347"><a href="#L-347"><span class="linenos" data-line="347"></span></a> <span class="kr">if</span> <span class="n">start</span> <span class="o">&gt;</span> <span class="mi">1</span> <span class="kr">then</span> </span><span id="L-348"><a href="#L-348"><span class="linenos" data-line="348"></span></a> <span class="n">name</span> <span class="o">=</span> <span class="n">sub</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">start</span><span class="p">)</span> </span><span id="L-349"><a href="#L-349"><span class="linenos" data-line="349"></span></a> <span class="kr">end</span> </span><span id="L-350"><a href="#L-350"><span class="linenos" data-line="350"></span></a> <span class="n">name</span> <span class="o">=</span> <span class="n">php_trim</span><span class="p">(</span><span class="n">name</span><span class="p">)</span> </span><span id="L-351"><a href="#L-351"><span class="linenos" data-line="351"></span></a> <span class="c1">-- Parser variables can only take SUBST:/SAFESUBST: as modifiers.</span> </span><span id="L-352"><a href="#L-352"><span class="linenos" data-line="352"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">has_args</span> <span class="ow">and</span> <span class="n">p</span> <span class="o">&lt;=</span> <span class="mi">1</span> <span class="kr">then</span> </span><span id="L-353"><a href="#L-353"><span class="linenos" data-line="353"></span></a> <span class="kd">local</span> <span class="n">mgw_data</span> <span class="o">=</span> <span class="n">retrieve_magic_word_data</span><span class="p">(</span><span class="n">name</span><span class="p">)</span> </span><span id="L-354"><a href="#L-354"><span class="linenos" data-line="354"></span></a> <span class="kd">local</span> <span class="n">pv</span> <span class="o">=</span> <span class="n">mgw_data</span> <span class="ow">and</span> <span class="n">mgw_data</span><span class="p">.</span><span class="n">parser_variable</span> <span class="ow">and</span> <span class="n">mgw_data</span><span class="p">.</span><span class="n">name</span> <span class="ow">or</span> <span class="kc">nil</span> </span><span id="L-355"><a href="#L-355"><span class="linenos" data-line="355"></span></a> <span class="kr">if</span> <span class="n">pv</span> <span class="kr">then</span> </span><span id="L-356"><a href="#L-356"><span class="linenos" data-line="356"></span></a> <span class="n">n</span> <span class="o">=</span> <span class="n">n</span> <span class="o">+</span> <span class="mi">1</span> </span><span id="L-357"><a href="#L-357"><span class="linenos" data-line="357"></span></a> <span class="n">chunks</span><span class="p">[</span><span class="n">n</span><span class="p">]</span> <span class="o">=</span> <span class="n">pv</span> </span><span id="L-358"><a href="#L-358"><span class="linenos" data-line="358"></span></a> <span class="kr">return</span> <span class="n">chunks</span><span class="p">,</span> <span class="s2">&quot;parser variable&quot;</span> </span><span id="L-359"><a href="#L-359"><span class="linenos" data-line="359"></span></a> <span class="kr">end</span> </span><span id="L-360"><a href="#L-360"><span class="linenos" data-line="360"></span></a> <span class="kr">end</span> </span><span id="L-361"><a href="#L-361"><span class="linenos" data-line="361"></span></a> <span class="c1">-- Handle relative template names.</span> </span><span id="L-362"><a href="#L-362"><span class="linenos" data-line="362"></span></a> <span class="kr">if</span> <span class="n">namespace_has_subpages</span> <span class="kr">then</span> </span><span id="L-363"><a href="#L-363"><span class="linenos" data-line="363"></span></a> <span class="c1">-- If the name starts with &quot;/&quot;, it&#39;s treated as a subpage of the</span> </span><span id="L-364"><a href="#L-364"><span class="linenos" data-line="364"></span></a> <span class="c1">-- current page. Final slashes are trimmed, but this can&#39;t affect</span> </span><span id="L-365"><a href="#L-365"><span class="linenos" data-line="365"></span></a> <span class="c1">-- the intervening slash (e.g. {{///}} refers to &quot;{{PAGENAME}}/&quot;).</span> </span><span id="L-366"><a href="#L-366"><span class="linenos" data-line="366"></span></a> <span class="kd">local</span> <span class="n">initial</span> <span class="o">=</span> <span class="n">sub</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span> </span><span id="L-367"><a href="#L-367"><span class="linenos" data-line="367"></span></a> <span class="kr">if</span> <span class="n">initial</span> <span class="o">==</span> <span class="s2">&quot;/&quot;</span> <span class="kr">then</span> </span><span id="L-368"><a href="#L-368"><span class="linenos" data-line="368"></span></a> <span class="n">name</span> <span class="o">=</span> <span class="n">raw_pagename</span> <span class="o">..</span> <span class="p">(</span><span class="n">match</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="s2">&quot;^/.*[^/]&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="s2">&quot;/&quot;</span><span class="p">)</span> </span><span id="L-369"><a href="#L-369"><span class="linenos" data-line="369"></span></a> <span class="c1">-- If it starts with &quot;../&quot;, trim it and any that follow, and go up</span> </span><span id="L-370"><a href="#L-370"><span class="linenos" data-line="370"></span></a> <span class="c1">-- that many subpage levels. Then, treat any additional text as</span> </span><span id="L-371"><a href="#L-371"><span class="linenos" data-line="371"></span></a> <span class="c1">-- a subpage of that page; final slashes are trimmed.</span> </span><span id="L-372"><a href="#L-372"><span class="linenos" data-line="372"></span></a> <span class="kr">elseif</span> <span class="n">initial</span> <span class="o">==</span> <span class="s2">&quot;.&quot;</span> <span class="ow">and</span> <span class="n">sub</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span> <span class="o">==</span> <span class="s2">&quot;./&quot;</span> <span class="kr">then</span> </span><span id="L-373"><a href="#L-373"><span class="linenos" data-line="373"></span></a> <span class="kd">local</span> <span class="n">n</span> <span class="o">=</span> <span class="mi">4</span> </span><span id="L-374"><a href="#L-374"><span class="linenos" data-line="374"></span></a> <span class="kr">while</span> <span class="n">sub</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">n</span><span class="p">,</span> <span class="n">n</span> <span class="o">+</span> <span class="mi">2</span><span class="p">)</span> <span class="o">==</span> <span class="s2">&quot;../&quot;</span> <span class="kr">do</span> </span><span id="L-375"><a href="#L-375"><span class="linenos" data-line="375"></span></a> <span class="n">n</span> <span class="o">=</span> <span class="n">n</span> <span class="o">+</span> <span class="mi">3</span> </span><span id="L-376"><a href="#L-376"><span class="linenos" data-line="376"></span></a> <span class="kr">end</span> </span><span id="L-377"><a href="#L-377"><span class="linenos" data-line="377"></span></a> <span class="c1">-- Retain an initial &quot;/&quot;.</span> </span><span id="L-378"><a href="#L-378"><span class="linenos" data-line="378"></span></a> <span class="n">name</span> <span class="o">=</span> <span class="n">sub</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">n</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> </span><span id="L-379"><a href="#L-379"><span class="linenos" data-line="379"></span></a> <span class="c1">-- Trim the relevant number of subpages from the pagename.</span> </span><span id="L-380"><a href="#L-380"><span class="linenos" data-line="380"></span></a> <span class="kd">local</span> <span class="n">pagename</span><span class="p">,</span> <span class="n">i</span> <span class="o">=</span> <span class="n">reverse</span><span class="p">(</span><span class="n">raw_pagename</span><span class="p">),</span> <span class="mi">0</span> </span><span id="L-381"><a href="#L-381"><span class="linenos" data-line="381"></span></a> <span class="kr">for</span> <span class="n">_</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="n">n</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">/</span> <span class="mi">3</span> <span class="kr">do</span> </span><span id="L-382"><a href="#L-382"><span class="linenos" data-line="382"></span></a> <span class="n">i</span> <span class="o">=</span> <span class="n">find</span><span class="p">(</span><span class="n">pagename</span><span class="p">,</span> <span class="s2">&quot;/&quot;</span><span class="p">,</span> <span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="kc">true</span><span class="p">)</span> </span><span id="L-383"><a href="#L-383"><span class="linenos" data-line="383"></span></a> <span class="c1">-- Fail if there aren&#39;t enough slashes.</span> </span><span id="L-384"><a href="#L-384"><span class="linenos" data-line="384"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">i</span> <span class="kr">then</span> </span><span id="L-385"><a href="#L-385"><span class="linenos" data-line="385"></span></a> <span class="kr">return</span> <span class="kc">nil</span> </span><span id="L-386"><a href="#L-386"><span class="linenos" data-line="386"></span></a> <span class="kr">end</span> </span><span id="L-387"><a href="#L-387"><span class="linenos" data-line="387"></span></a> <span class="kr">end</span> </span><span id="L-388"><a href="#L-388"><span class="linenos" data-line="388"></span></a> <span class="c1">-- Add the subpage text; since the intervening &quot;/&quot; is retained</span> </span><span id="L-389"><a href="#L-389"><span class="linenos" data-line="389"></span></a> <span class="c1">-- in `name`, it can be trimmed along with any other final</span> </span><span id="L-390"><a href="#L-390"><span class="linenos" data-line="390"></span></a> <span class="c1">-- slashes (e.g. {{..///}} refers to &quot;{{BASEPAGENAME}}&quot;.)</span> </span><span id="L-391"><a href="#L-391"><span class="linenos" data-line="391"></span></a> <span class="n">name</span> <span class="o">=</span> <span class="n">reverse</span><span class="p">(</span><span class="n">sub</span><span class="p">(</span><span class="n">pagename</span><span class="p">,</span> <span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">))</span> <span class="o">..</span> <span class="p">(</span><span class="n">match</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="s2">&quot;^.*[^/]&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="s2">&quot;&quot;</span><span class="p">)</span> </span><span id="L-392"><a href="#L-392"><span class="linenos" data-line="392"></span></a> <span class="kr">end</span> </span><span id="L-393"><a href="#L-393"><span class="linenos" data-line="393"></span></a> <span class="kr">end</span> </span><span id="L-394"><a href="#L-394"><span class="linenos" data-line="394"></span></a> <span class="kd">local</span> <span class="n">title</span> <span class="o">=</span> <span class="n">new_title</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span> </span><span id="L-395"><a href="#L-395"><span class="linenos" data-line="395"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">is_valid_title</span><span class="p">(</span><span class="n">title</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-396"><a href="#L-396"><span class="linenos" data-line="396"></span></a> <span class="kr">return</span> <span class="kc">nil</span> </span><span id="L-397"><a href="#L-397"><span class="linenos" data-line="397"></span></a> <span class="kr">end</span> </span><span id="L-398"><a href="#L-398"><span class="linenos" data-line="398"></span></a> <span class="c1">-- If `fragment` is set, save the original title&#39;s fragment, since it</span> </span><span id="L-399"><a href="#L-399"><span class="linenos" data-line="399"></span></a> <span class="c1">-- won&#39;t carry through to any redirect targets.</span> </span><span id="L-400"><a href="#L-400"><span class="linenos" data-line="400"></span></a> <span class="kr">if</span> <span class="n">fragment</span> <span class="kr">then</span> </span><span id="L-401"><a href="#L-401"><span class="linenos" data-line="401"></span></a> <span class="n">fragment</span> <span class="o">=</span> <span class="n">title</span><span class="p">.</span><span class="n">fragment</span> </span><span id="L-402"><a href="#L-402"><span class="linenos" data-line="402"></span></a> <span class="kr">end</span> </span><span id="L-403"><a href="#L-403"><span class="linenos" data-line="403"></span></a> <span class="c1">-- Resolve any redirects. Note that is_valid_title treats interwiki</span> </span><span id="L-404"><a href="#L-404"><span class="linenos" data-line="404"></span></a> <span class="c1">-- titles as invalid, which is correct in this case: if the redirect</span> </span><span id="L-405"><a href="#L-405"><span class="linenos" data-line="405"></span></a> <span class="c1">-- target is an interwiki link, the template won&#39;t fail, but the</span> </span><span id="L-406"><a href="#L-406"><span class="linenos" data-line="406"></span></a> <span class="c1">-- redirect does not get resolved (i.e. the redirect page itself gets</span> </span><span id="L-407"><a href="#L-407"><span class="linenos" data-line="407"></span></a> <span class="c1">-- transcluded, so the template name should not be normalized to the</span> </span><span id="L-408"><a href="#L-408"><span class="linenos" data-line="408"></span></a> <span class="c1">-- target). It also treats titles that only have fragments as invalid</span> </span><span id="L-409"><a href="#L-409"><span class="linenos" data-line="409"></span></a> <span class="c1">-- (e.g. &quot;#foo&quot;), but these can&#39;t be used as redirects anyway.</span> </span><span id="L-410"><a href="#L-410"><span class="linenos" data-line="410"></span></a> <span class="c1">-- title.redirectTarget increments the expensive parser function count,</span> </span><span id="L-411"><a href="#L-411"><span class="linenos" data-line="411"></span></a> <span class="c1">-- but avoids extraneous transclusions polluting template lists and the</span> </span><span id="L-412"><a href="#L-412"><span class="linenos" data-line="412"></span></a> <span class="c1">-- performance hit caused by indiscriminately grabbing redirectTarget.</span> </span><span id="L-413"><a href="#L-413"><span class="linenos" data-line="413"></span></a> <span class="c1">-- However, if the expensive parser function limit has already been hit,</span> </span><span id="L-414"><a href="#L-414"><span class="linenos" data-line="414"></span></a> <span class="c1">-- redirectTarget is used as a fallback. force_transclusion forces the</span> </span><span id="L-415"><a href="#L-415"><span class="linenos" data-line="415"></span></a> <span class="c1">-- use of the fallback.</span> </span><span id="L-416"><a href="#L-416"><span class="linenos" data-line="416"></span></a> <span class="kd">local</span> <span class="n">redirect</span> <span class="o">=</span> <span class="kc">true</span> </span><span id="L-417"><a href="#L-417"><span class="linenos" data-line="417"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">force_transclusion</span> <span class="kr">then</span> </span><span id="L-418"><a href="#L-418"><span class="linenos" data-line="418"></span></a> <span class="kd">local</span> <span class="n">success</span><span class="p">,</span> <span class="n">resolved</span> <span class="o">=</span> <span class="nb">pcall</span><span class="p">(</span><span class="n">is_redirect</span><span class="p">,</span> <span class="n">title</span><span class="p">)</span> </span><span id="L-419"><a href="#L-419"><span class="linenos" data-line="419"></span></a> <span class="kr">if</span> <span class="n">success</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">resolved</span> <span class="kr">then</span> </span><span id="L-420"><a href="#L-420"><span class="linenos" data-line="420"></span></a> <span class="n">redirect</span> <span class="o">=</span> <span class="kc">false</span> </span><span id="L-421"><a href="#L-421"><span class="linenos" data-line="421"></span></a> <span class="kr">end</span> </span><span id="L-422"><a href="#L-422"><span class="linenos" data-line="422"></span></a> <span class="kr">end</span> </span><span id="L-423"><a href="#L-423"><span class="linenos" data-line="423"></span></a> <span class="kr">if</span> <span class="n">redirect</span> <span class="kr">then</span> </span><span id="L-424"><a href="#L-424"><span class="linenos" data-line="424"></span></a> <span class="n">redirect</span> <span class="o">=</span> <span class="n">title</span><span class="p">.</span><span class="n">redirectTarget</span> </span><span id="L-425"><a href="#L-425"><span class="linenos" data-line="425"></span></a> <span class="kr">if</span> <span class="n">is_valid_title</span><span class="p">(</span><span class="n">redirect</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-426"><a href="#L-426"><span class="linenos" data-line="426"></span></a> <span class="n">title</span> <span class="o">=</span> <span class="n">redirect</span> </span><span id="L-427"><a href="#L-427"><span class="linenos" data-line="427"></span></a> <span class="kr">end</span> </span><span id="L-428"><a href="#L-428"><span class="linenos" data-line="428"></span></a> <span class="kr">end</span> </span><span id="L-429"><a href="#L-429"><span class="linenos" data-line="429"></span></a> <span class="kd">local</span> <span class="n">chunk</span> <span class="o">=</span> <span class="n">get_template_invocation_name</span><span class="p">(</span><span class="n">title</span><span class="p">)</span> </span><span id="L-430"><a href="#L-430"><span class="linenos" data-line="430"></span></a> <span class="c1">-- Set the fragment (if applicable).</span> </span><span id="L-431"><a href="#L-431"><span class="linenos" data-line="431"></span></a> <span class="kr">if</span> <span class="n">fragment</span> <span class="kr">then</span> </span><span id="L-432"><a href="#L-432"><span class="linenos" data-line="432"></span></a> <span class="n">chunk</span> <span class="o">=</span> <span class="n">chunk</span> <span class="o">..</span> <span class="s2">&quot;#&quot;</span> <span class="o">..</span> <span class="n">fragment</span> </span><span id="L-433"><a href="#L-433"><span class="linenos" data-line="433"></span></a> <span class="kr">end</span> </span><span id="L-434"><a href="#L-434"><span class="linenos" data-line="434"></span></a> <span class="n">chunks</span><span class="p">[</span><span class="n">n</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">chunk</span> </span><span id="L-435"><a href="#L-435"><span class="linenos" data-line="435"></span></a> <span class="kr">return</span> <span class="n">chunks</span><span class="p">,</span> <span class="s2">&quot;template&quot;</span> </span><span id="L-436"><a href="#L-436"><span class="linenos" data-line="436"></span></a> <span class="kr">end</span> </span><span id="L-437"><a href="#L-437"><span class="linenos" data-line="437"></span></a> </span><span id="L-438"><a href="#L-438"><span class="linenos" data-line="438"></span></a> <span class="c1">-- Note: force_transclusion avoids incrementing the expensive parser</span> </span><span id="L-439"><a href="#L-439"><span class="linenos" data-line="439"></span></a> <span class="c1">-- function count by forcing transclusion instead. This should only be used</span> </span><span id="L-440"><a href="#L-440"><span class="linenos" data-line="440"></span></a> <span class="c1">-- when there is a real risk that the expensive parser function limit of</span> </span><span id="L-441"><a href="#L-441"><span class="linenos" data-line="441"></span></a> <span class="c1">-- 500 will be hit.</span> </span><span id="L-442"><a href="#L-442"><span class="linenos" data-line="442"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">process_name</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">frame_args</span><span class="p">,</span> <span class="n">force_transclusion</span><span class="p">)</span> </span><span id="L-443"><a href="#L-443"><span class="linenos" data-line="443"></span></a> <span class="kd">local</span> <span class="n">name</span> <span class="o">=</span> <span class="n">expand</span><span class="p">(</span><span class="n">self</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">frame_args</span><span class="p">)</span> </span><span id="L-444"><a href="#L-444"><span class="linenos" data-line="444"></span></a> <span class="kd">local</span> <span class="n">has_args</span><span class="p">,</span> <span class="n">norm</span> <span class="o">=</span> <span class="o">#</span><span class="n">self</span> <span class="o">&gt;</span> <span class="mi">1</span> </span><span id="L-445"><a href="#L-445"><span class="linenos" data-line="445"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">has_args</span> <span class="kr">then</span> </span><span id="L-446"><a href="#L-446"><span class="linenos" data-line="446"></span></a> <span class="n">norm</span> <span class="o">=</span> <span class="n">parser_variables</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> </span><span id="L-447"><a href="#L-447"><span class="linenos" data-line="447"></span></a> <span class="kr">if</span> <span class="n">norm</span> <span class="kr">then</span> </span><span id="L-448"><a href="#L-448"><span class="linenos" data-line="448"></span></a> <span class="kr">return</span> <span class="n">norm</span><span class="p">,</span> <span class="s2">&quot;parser variable&quot;</span> </span><span id="L-449"><a href="#L-449"><span class="linenos" data-line="449"></span></a> <span class="kr">end</span> </span><span id="L-450"><a href="#L-450"><span class="linenos" data-line="450"></span></a> <span class="kr">end</span> </span><span id="L-451"><a href="#L-451"><span class="linenos" data-line="451"></span></a> <span class="n">norm</span> <span class="o">=</span> <span class="n">templates</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> </span><span id="L-452"><a href="#L-452"><span class="linenos" data-line="452"></span></a> <span class="kr">if</span> <span class="n">norm</span> <span class="kr">then</span> </span><span id="L-453"><a href="#L-453"><span class="linenos" data-line="453"></span></a> <span class="kd">local</span> <span class="n">pf_arg1</span> <span class="o">=</span> <span class="n">parser_functions</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> </span><span id="L-454"><a href="#L-454"><span class="linenos" data-line="454"></span></a> <span class="kr">return</span> <span class="n">norm</span><span class="p">,</span> <span class="n">pf_arg1</span> <span class="ow">and</span> <span class="s2">&quot;parser function&quot;</span> <span class="ow">or</span> <span class="s2">&quot;template&quot;</span><span class="p">,</span> <span class="n">pf_arg1</span> </span><span id="L-455"><a href="#L-455"><span class="linenos" data-line="455"></span></a> <span class="kr">elseif</span> <span class="n">norm</span> <span class="o">==</span> <span class="kc">false</span> <span class="kr">then</span> </span><span id="L-456"><a href="#L-456"><span class="linenos" data-line="456"></span></a> <span class="kr">return</span> <span class="kc">nil</span> </span><span id="L-457"><a href="#L-457"><span class="linenos" data-line="457"></span></a> <span class="kr">end</span> </span><span id="L-458"><a href="#L-458"><span class="linenos" data-line="458"></span></a> <span class="kd">local</span> <span class="n">chunks</span><span class="p">,</span> <span class="n">subclass</span><span class="p">,</span> <span class="n">pf_arg1</span> <span class="o">=</span> <span class="n">parse_template_name</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">has_args</span><span class="p">,</span> <span class="kc">nil</span><span class="p">,</span> <span class="n">force_transclusion</span><span class="p">)</span> </span><span id="L-459"><a href="#L-459"><span class="linenos" data-line="459"></span></a> <span class="c1">-- Fail if invalid.</span> </span><span id="L-460"><a href="#L-460"><span class="linenos" data-line="460"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">chunks</span> <span class="kr">then</span> </span><span id="L-461"><a href="#L-461"><span class="linenos" data-line="461"></span></a> <span class="n">templates</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="kc">false</span> </span><span id="L-462"><a href="#L-462"><span class="linenos" data-line="462"></span></a> <span class="kr">return</span> <span class="kc">nil</span> </span><span id="L-463"><a href="#L-463"><span class="linenos" data-line="463"></span></a> <span class="kr">end</span> </span><span id="L-464"><a href="#L-464"><span class="linenos" data-line="464"></span></a> <span class="kd">local</span> <span class="n">chunk1</span> <span class="o">=</span> <span class="n">chunks</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> </span><span id="L-465"><a href="#L-465"><span class="linenos" data-line="465"></span></a> <span class="c1">-- Fail on SUBST:.</span> </span><span id="L-466"><a href="#L-466"><span class="linenos" data-line="466"></span></a> <span class="kr">if</span> <span class="n">chunk1</span> <span class="o">==</span> <span class="s2">&quot;SUBST:&quot;</span> <span class="kr">then</span> </span><span id="L-467"><a href="#L-467"><span class="linenos" data-line="467"></span></a> <span class="n">templates</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="kc">false</span> </span><span id="L-468"><a href="#L-468"><span class="linenos" data-line="468"></span></a> <span class="kr">return</span> <span class="kc">nil</span> </span><span id="L-469"><a href="#L-469"><span class="linenos" data-line="469"></span></a> <span class="c1">-- Any modifiers are ignored.</span> </span><span id="L-470"><a href="#L-470"><span class="linenos" data-line="470"></span></a> <span class="kr">elseif</span> <span class="n">subclass</span> <span class="o">==</span> <span class="s2">&quot;parser function&quot;</span> <span class="kr">then</span> </span><span id="L-471"><a href="#L-471"><span class="linenos" data-line="471"></span></a> <span class="kd">local</span> <span class="n">pf</span> <span class="o">=</span> <span class="n">chunks</span><span class="p">[</span><span class="o">#</span><span class="n">chunks</span><span class="p">]</span> </span><span id="L-472"><a href="#L-472"><span class="linenos" data-line="472"></span></a> <span class="n">templates</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">pf</span> </span><span id="L-473"><a href="#L-473"><span class="linenos" data-line="473"></span></a> <span class="n">parser_functions</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">pf_arg1</span> </span><span id="L-474"><a href="#L-474"><span class="linenos" data-line="474"></span></a> <span class="kr">return</span> <span class="n">pf</span><span class="p">,</span> <span class="s2">&quot;parser function&quot;</span><span class="p">,</span> <span class="n">pf_arg1</span> </span><span id="L-475"><a href="#L-475"><span class="linenos" data-line="475"></span></a> <span class="kr">end</span> </span><span id="L-476"><a href="#L-476"><span class="linenos" data-line="476"></span></a> <span class="c1">-- Ignore SAFESUBST:, and treat MSGNW: as a parser function with the pagename as its first argument (ignoring any RAW: that comes after).</span> </span><span id="L-477"><a href="#L-477"><span class="linenos" data-line="477"></span></a> <span class="kr">if</span> <span class="n">chunks</span><span class="p">[</span><span class="n">chunk1</span> <span class="o">==</span> <span class="s2">&quot;SAFESUBST:&quot;</span> <span class="ow">and</span> <span class="mi">2</span> <span class="ow">or</span> <span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="s2">&quot;MSGNW:&quot;</span> <span class="kr">then</span> </span><span id="L-478"><a href="#L-478"><span class="linenos" data-line="478"></span></a> <span class="n">pf_arg1</span> <span class="o">=</span> <span class="n">chunks</span><span class="p">[</span><span class="o">#</span><span class="n">chunks</span><span class="p">]</span> </span><span id="L-479"><a href="#L-479"><span class="linenos" data-line="479"></span></a> <span class="kd">local</span> <span class="n">pf</span> <span class="o">=</span> <span class="s2">&quot;MSGNW:&quot;</span> </span><span id="L-480"><a href="#L-480"><span class="linenos" data-line="480"></span></a> <span class="n">templates</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">pf</span> </span><span id="L-481"><a href="#L-481"><span class="linenos" data-line="481"></span></a> <span class="n">parser_functions</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">pf_arg1</span> </span><span id="L-482"><a href="#L-482"><span class="linenos" data-line="482"></span></a> <span class="kr">return</span> <span class="n">pf</span><span class="p">,</span> <span class="s2">&quot;parser function&quot;</span><span class="p">,</span> <span class="n">pf_arg1</span> </span><span id="L-483"><a href="#L-483"><span class="linenos" data-line="483"></span></a> <span class="kr">end</span> </span><span id="L-484"><a href="#L-484"><span class="linenos" data-line="484"></span></a> <span class="c1">-- Ignore any remaining modifiers, as they&#39;ve done their job.</span> </span><span id="L-485"><a href="#L-485"><span class="linenos" data-line="485"></span></a> <span class="kd">local</span> <span class="n">output</span> <span class="o">=</span> <span class="n">chunks</span><span class="p">[</span><span class="o">#</span><span class="n">chunks</span><span class="p">]</span> </span><span id="L-486"><a href="#L-486"><span class="linenos" data-line="486"></span></a> <span class="kr">if</span> <span class="n">subclass</span> <span class="o">==</span> <span class="s2">&quot;parser variable&quot;</span> <span class="kr">then</span> </span><span id="L-487"><a href="#L-487"><span class="linenos" data-line="487"></span></a> <span class="n">parser_variables</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">output</span> </span><span id="L-488"><a href="#L-488"><span class="linenos" data-line="488"></span></a> <span class="kr">else</span> </span><span id="L-489"><a href="#L-489"><span class="linenos" data-line="489"></span></a> <span class="n">templates</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">output</span> </span><span id="L-490"><a href="#L-490"><span class="linenos" data-line="490"></span></a> <span class="kr">end</span> </span><span id="L-491"><a href="#L-491"><span class="linenos" data-line="491"></span></a> <span class="kr">return</span> <span class="n">output</span><span class="p">,</span> <span class="n">subclass</span> </span><span id="L-492"><a href="#L-492"><span class="linenos" data-line="492"></span></a> <span class="kr">end</span> </span><span id="L-493"><a href="#L-493"><span class="linenos" data-line="493"></span></a> </span><span id="L-494"><a href="#L-494"><span class="linenos" data-line="494"></span></a> <span class="kr">function</span> <span class="nc">Template</span><span class="p">:</span><span class="nf">get_name</span><span class="p">(</span><span class="n">frame_args</span><span class="p">,</span> <span class="n">force_transclusion</span><span class="p">)</span> </span><span id="L-495"><a href="#L-495"><span class="linenos" data-line="495"></span></a> <span class="c1">-- Only return the first return value.</span> </span><span id="L-496"><a href="#L-496"><span class="linenos" data-line="496"></span></a> <span class="kr">return</span> <span class="p">(</span><span class="n">process_name</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">frame_args</span><span class="p">,</span> <span class="n">force_transclusion</span><span class="p">))</span> </span><span id="L-497"><a href="#L-497"><span class="linenos" data-line="497"></span></a> <span class="kr">end</span> </span><span id="L-498"><a href="#L-498"><span class="linenos" data-line="498"></span></a> </span><span id="L-499"><a href="#L-499"><span class="linenos" data-line="499"></span></a> <span class="kr">function</span> <span class="nc">Template</span><span class="p">:</span><span class="nf">get_arguments</span><span class="p">(</span><span class="n">frame_args</span><span class="p">)</span> </span><span id="L-500"><a href="#L-500"><span class="linenos" data-line="500"></span></a> <span class="kd">local</span> <span class="n">name</span><span class="p">,</span> <span class="n">subclass</span><span class="p">,</span> <span class="n">pf_arg1</span> <span class="o">=</span> <span class="n">process_name</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">frame_args</span><span class="p">)</span> </span><span id="L-501"><a href="#L-501"><span class="linenos" data-line="501"></span></a> <span class="kr">if</span> <span class="n">name</span> <span class="o">==</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-502"><a href="#L-502"><span class="linenos" data-line="502"></span></a> <span class="kr">return</span> <span class="kc">nil</span> </span><span id="L-503"><a href="#L-503"><span class="linenos" data-line="503"></span></a> <span class="kr">elseif</span> <span class="n">subclass</span> <span class="o">==</span> <span class="s2">&quot;parser variable&quot;</span> <span class="kr">then</span> </span><span id="L-504"><a href="#L-504"><span class="linenos" data-line="504"></span></a> <span class="kr">return</span> <span class="p">{}</span> </span><span id="L-505"><a href="#L-505"><span class="linenos" data-line="505"></span></a> <span class="kr">end</span> </span><span id="L-506"><a href="#L-506"><span class="linenos" data-line="506"></span></a> <span class="kd">local</span> <span class="n">template_args</span> <span class="o">=</span> <span class="p">{}</span> </span><span id="L-507"><a href="#L-507"><span class="linenos" data-line="507"></span></a> <span class="kr">if</span> <span class="n">subclass</span> <span class="o">==</span> <span class="s2">&quot;parser function&quot;</span> <span class="kr">then</span> </span><span id="L-508"><a href="#L-508"><span class="linenos" data-line="508"></span></a> <span class="n">template_args</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">pf_arg1</span> </span><span id="L-509"><a href="#L-509"><span class="linenos" data-line="509"></span></a> <span class="kr">for</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">2</span><span class="p">,</span> <span class="o">#</span><span class="n">self</span> <span class="kr">do</span> </span><span id="L-510"><a href="#L-510"><span class="linenos" data-line="510"></span></a> <span class="n">template_args</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">expand</span><span class="p">(</span><span class="n">self</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">frame_args</span><span class="p">)</span> <span class="c1">-- Not trimmed.</span> </span><span id="L-511"><a href="#L-511"><span class="linenos" data-line="511"></span></a> <span class="kr">end</span> </span><span id="L-512"><a href="#L-512"><span class="linenos" data-line="512"></span></a> <span class="kr">return</span> <span class="n">template_args</span> </span><span id="L-513"><a href="#L-513"><span class="linenos" data-line="513"></span></a> <span class="kr">end</span> </span><span id="L-514"><a href="#L-514"><span class="linenos" data-line="514"></span></a> <span class="kd">local</span> <span class="n">implicit</span> <span class="o">=</span> <span class="mi">0</span> </span><span id="L-515"><a href="#L-515"><span class="linenos" data-line="515"></span></a> <span class="kr">for</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">2</span><span class="p">,</span> <span class="o">#</span><span class="n">self</span> <span class="kr">do</span> </span><span id="L-516"><a href="#L-516"><span class="linenos" data-line="516"></span></a> <span class="kd">local</span> <span class="n">arg</span> <span class="o">=</span> <span class="n">self</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> </span><span id="L-517"><a href="#L-517"><span class="linenos" data-line="517"></span></a> <span class="kr">if</span> <span class="n">class_else_type</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span> <span class="o">==</span> <span class="s2">&quot;argument&quot;</span> <span class="kr">then</span> </span><span id="L-518"><a href="#L-518"><span class="linenos" data-line="518"></span></a> <span class="n">template_args</span><span class="p">[</span><span class="n">scribunto_param_key</span><span class="p">(</span><span class="n">expand</span><span class="p">(</span><span class="n">arg</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">frame_args</span><span class="p">))]</span> <span class="o">=</span> <span class="n">php_trim</span><span class="p">(</span><span class="n">expand</span><span class="p">(</span><span class="n">arg</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span> <span class="n">frame_args</span><span class="p">))</span> </span><span id="L-519"><a href="#L-519"><span class="linenos" data-line="519"></span></a> <span class="kr">else</span> </span><span id="L-520"><a href="#L-520"><span class="linenos" data-line="520"></span></a> <span class="n">implicit</span> <span class="o">=</span> <span class="n">implicit</span> <span class="o">+</span> <span class="mi">1</span> </span><span id="L-521"><a href="#L-521"><span class="linenos" data-line="521"></span></a> <span class="n">template_args</span><span class="p">[</span><span class="n">implicit</span><span class="p">]</span> <span class="o">=</span> <span class="n">expand</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="n">frame_args</span><span class="p">)</span> <span class="c1">-- Not trimmed.</span> </span><span id="L-522"><a href="#L-522"><span class="linenos" data-line="522"></span></a> <span class="kr">end</span> </span><span id="L-523"><a href="#L-523"><span class="linenos" data-line="523"></span></a> <span class="kr">end</span> </span><span id="L-524"><a href="#L-524"><span class="linenos" data-line="524"></span></a> <span class="kr">return</span> <span class="n">template_args</span> </span><span id="L-525"><a href="#L-525"><span class="linenos" data-line="525"></span></a> <span class="kr">end</span> </span><span id="L-526"><a href="#L-526"><span class="linenos" data-line="526"></span></a><span class="kr">end</span> </span><span id="L-527"><a href="#L-527"><span class="linenos" data-line="527"></span></a> </span><span id="L-528"><a href="#L-528"><span class="linenos" data-line="528"></span></a><span class="c1">-- BIG TODO: manual template expansion.</span> </span><span id="L-529"><a href="#L-529"><span class="linenos" data-line="529"></span></a><span class="kr">function</span> <span class="nc">Template</span><span class="p">:</span><span class="nf">expand</span><span class="p">()</span> </span><span id="L-530"><a href="#L-530"><span class="linenos" data-line="530"></span></a> <span class="kr">return</span> <span class="p">(</span><span class="n">frame</span> <span class="ow">or</span> <span class="n">get_frame</span><span class="p">()):</span><span class="n">preprocess</span><span class="p">(</span><span class="nb">tostring</span><span class="p">(</span><span class="n">self</span><span class="p">))</span> </span><span id="L-531"><a href="#L-531"><span class="linenos" data-line="531"></span></a><span class="kr">end</span> </span><span id="L-532"><a href="#L-532"><span class="linenos" data-line="532"></span></a> </span><span id="L-533"><a href="#L-533"><span class="linenos" data-line="533"></span></a><span class="kd">local</span> <span class="n">Tag</span> <span class="o">=</span> <span class="n">Node</span><span class="p">:</span><span class="n">new_class</span><span class="p">(</span><span class="s2">&quot;tag&quot;</span><span class="p">)</span> </span><span id="L-534"><a href="#L-534"><span class="linenos" data-line="534"></span></a> </span><span id="L-535"><a href="#L-535"><span class="linenos" data-line="535"></span></a><span class="kr">do</span> </span><span id="L-536"><a href="#L-536"><span class="linenos" data-line="536"></span></a> <span class="kd">local</span> <span class="n">php_htmlspecialchars_data</span> </span><span id="L-537"><a href="#L-537"><span class="linenos" data-line="537"></span></a> </span><span id="L-538"><a href="#L-538"><span class="linenos" data-line="538"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">get_php_htmlspecialchars_data</span><span class="p">()</span> </span><span id="L-539"><a href="#L-539"><span class="linenos" data-line="539"></span></a> <span class="n">php_htmlspecialchars_data</span><span class="p">,</span> <span class="n">get_php_htmlspecialchars_data</span> <span class="o">=</span> <span class="p">(</span><span class="n">data</span> <span class="ow">or</span> <span class="n">get_data</span><span class="p">()).</span><span class="n">php_htmlspecialchars</span><span class="p">,</span> <span class="kc">nil</span> </span><span id="L-540"><a href="#L-540"><span class="linenos" data-line="540"></span></a> <span class="kr">return</span> <span class="n">php_htmlspecialchars_data</span> </span><span id="L-541"><a href="#L-541"><span class="linenos" data-line="541"></span></a> <span class="kr">end</span> </span><span id="L-542"><a href="#L-542"><span class="linenos" data-line="542"></span></a> </span><span id="L-543"><a href="#L-543"><span class="linenos" data-line="543"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">php_htmlspecialchars</span><span class="p">(</span><span class="n">str</span><span class="p">,</span> <span class="n">compat</span><span class="p">)</span> </span><span id="L-544"><a href="#L-544"><span class="linenos" data-line="544"></span></a> <span class="kr">return</span> <span class="p">(</span><span class="n">gsub</span><span class="p">(</span><span class="n">str</span><span class="p">,</span> <span class="n">compat</span> <span class="ow">and</span> <span class="s2">&quot;[&amp;</span><span class="se">\&quot;</span><span class="s2">&lt;&gt;]&quot;</span> <span class="ow">or</span> <span class="s2">&quot;[&amp;</span><span class="se">\&quot;</span><span class="s2">&#39;&lt;&gt;]&quot;</span><span class="p">,</span> <span class="n">php_htmlspecialchars_data</span> <span class="ow">or</span> <span class="n">get_php_htmlspecialchars_data</span><span class="p">()))</span> </span><span id="L-545"><a href="#L-545"><span class="linenos" data-line="545"></span></a> <span class="kr">end</span> </span><span id="L-546"><a href="#L-546"><span class="linenos" data-line="546"></span></a> </span><span id="L-547"><a href="#L-547"><span class="linenos" data-line="547"></span></a> <span class="kr">function</span> <span class="nc">Tag</span><span class="p">:</span><span class="nf">__tostring</span><span class="p">()</span> </span><span id="L-548"><a href="#L-548"><span class="linenos" data-line="548"></span></a> <span class="kd">local</span> <span class="n">open_tag</span><span class="p">,</span> <span class="n">attributes</span><span class="p">,</span> <span class="n">n</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;&lt;&quot;</span><span class="p">,</span> <span class="n">self</span><span class="p">.</span><span class="n">name</span><span class="p">},</span> <span class="n">self</span><span class="p">:</span><span class="n">get_attributes</span><span class="p">(),</span> <span class="mi">2</span> </span><span id="L-549"><a href="#L-549"><span class="linenos" data-line="549"></span></a> <span class="kr">for</span> <span class="n">attr</span><span class="p">,</span> <span class="n">value</span> <span class="kr">in</span> <span class="nb">next</span><span class="p">,</span> <span class="n">attributes</span> <span class="kr">do</span> </span><span id="L-550"><a href="#L-550"><span class="linenos" data-line="550"></span></a> <span class="n">n</span> <span class="o">=</span> <span class="n">n</span> <span class="o">+</span> <span class="mi">1</span> </span><span id="L-551"><a href="#L-551"><span class="linenos" data-line="551"></span></a> <span class="n">open_tag</span><span class="p">[</span><span class="n">n</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot; &quot;</span> <span class="o">..</span> <span class="n">php_htmlspecialchars</span><span class="p">(</span><span class="n">attr</span><span class="p">)</span> <span class="o">..</span> <span class="s2">&quot;=</span><span class="se">\&quot;</span><span class="s2">&quot;</span> <span class="o">..</span> <span class="n">php_htmlspecialchars</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="kc">true</span><span class="p">)</span> <span class="o">..</span> <span class="s2">&quot;</span><span class="se">\&quot;</span><span class="s2">&quot;</span> </span><span id="L-552"><a href="#L-552"><span class="linenos" data-line="552"></span></a> <span class="kr">end</span> </span><span id="L-553"><a href="#L-553"><span class="linenos" data-line="553"></span></a> <span class="kr">if</span> <span class="n">self</span><span class="p">.</span><span class="n">self_closing</span> <span class="kr">then</span> </span><span id="L-554"><a href="#L-554"><span class="linenos" data-line="554"></span></a> <span class="kr">return</span> <span class="n">concat</span><span class="p">(</span><span class="n">open_tag</span><span class="p">)</span> <span class="o">..</span> <span class="s2">&quot;/&gt;&quot;</span> </span><span id="L-555"><a href="#L-555"><span class="linenos" data-line="555"></span></a> <span class="kr">end</span> </span><span id="L-556"><a href="#L-556"><span class="linenos" data-line="556"></span></a> <span class="kr">return</span> <span class="n">concat</span><span class="p">(</span><span class="n">open_tag</span><span class="p">)</span> <span class="o">..</span> <span class="s2">&quot;&gt;&quot;</span> <span class="o">..</span> <span class="n">concat</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> <span class="o">..</span> <span class="s2">&quot;&lt;/&quot;</span> <span class="o">..</span> <span class="n">self</span><span class="p">.</span><span class="n">name</span> <span class="o">..</span> <span class="s2">&quot;&gt;&quot;</span> </span><span id="L-557"><a href="#L-557"><span class="linenos" data-line="557"></span></a> <span class="kr">end</span> </span><span id="L-558"><a href="#L-558"><span class="linenos" data-line="558"></span></a> </span><span id="L-559"><a href="#L-559"><span class="linenos" data-line="559"></span></a> <span class="kd">local</span> <span class="n">valid_attribute_name</span> </span><span id="L-560"><a href="#L-560"><span class="linenos" data-line="560"></span></a> </span><span id="L-561"><a href="#L-561"><span class="linenos" data-line="561"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">get_valid_attribute_name</span><span class="p">()</span> </span><span id="L-562"><a href="#L-562"><span class="linenos" data-line="562"></span></a> <span class="n">valid_attribute_name</span><span class="p">,</span> <span class="n">get_valid_attribute_name</span> <span class="o">=</span> <span class="p">(</span><span class="n">data</span> <span class="ow">or</span> <span class="n">get_data</span><span class="p">()).</span><span class="n">valid_attribute_name</span><span class="p">,</span> <span class="kc">nil</span> </span><span id="L-563"><a href="#L-563"><span class="linenos" data-line="563"></span></a> <span class="kr">return</span> <span class="n">valid_attribute_name</span> </span><span id="L-564"><a href="#L-564"><span class="linenos" data-line="564"></span></a> <span class="kr">end</span> </span><span id="L-565"><a href="#L-565"><span class="linenos" data-line="565"></span></a> </span><span id="L-566"><a href="#L-566"><span class="linenos" data-line="566"></span></a> <span class="kr">function</span> <span class="nc">Tag</span><span class="p">:</span><span class="nf">get_attributes</span><span class="p">()</span> </span><span id="L-567"><a href="#L-567"><span class="linenos" data-line="567"></span></a> <span class="kd">local</span> <span class="n">raw</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">attributes</span> </span><span id="L-568"><a href="#L-568"><span class="linenos" data-line="568"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">raw</span> <span class="kr">then</span> </span><span id="L-569"><a href="#L-569"><span class="linenos" data-line="569"></span></a> <span class="n">self</span><span class="p">.</span><span class="n">attributes</span> <span class="o">=</span> <span class="p">{}</span> </span><span id="L-570"><a href="#L-570"><span class="linenos" data-line="570"></span></a> <span class="kr">return</span> <span class="n">self</span><span class="p">.</span><span class="n">attributes</span> </span><span id="L-571"><a href="#L-571"><span class="linenos" data-line="571"></span></a> <span class="kr">elseif</span> <span class="nb">type</span><span class="p">(</span><span class="n">raw</span><span class="p">)</span> <span class="o">==</span> <span class="s2">&quot;table&quot;</span> <span class="kr">then</span> </span><span id="L-572"><a href="#L-572"><span class="linenos" data-line="572"></span></a> <span class="kr">return</span> <span class="n">raw</span> </span><span id="L-573"><a href="#L-573"><span class="linenos" data-line="573"></span></a> <span class="kr">end</span> </span><span id="L-574"><a href="#L-574"><span class="linenos" data-line="574"></span></a> <span class="kr">if</span> <span class="n">sub</span><span class="p">(</span><span class="n">raw</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="o">==</span> <span class="s2">&quot;/&quot;</span> <span class="kr">then</span> </span><span id="L-575"><a href="#L-575"><span class="linenos" data-line="575"></span></a> <span class="n">raw</span> <span class="o">=</span> <span class="n">sub</span><span class="p">(</span><span class="n">raw</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">2</span><span class="p">)</span> </span><span id="L-576"><a href="#L-576"><span class="linenos" data-line="576"></span></a> <span class="kr">end</span> </span><span id="L-577"><a href="#L-577"><span class="linenos" data-line="577"></span></a> <span class="kd">local</span> <span class="n">attributes</span><span class="p">,</span> <span class="n">head</span> <span class="o">=</span> <span class="p">{},</span> <span class="mi">1</span> </span><span id="L-578"><a href="#L-578"><span class="linenos" data-line="578"></span></a> <span class="c1">-- Semi-manual implementation of the native regex.</span> </span><span id="L-579"><a href="#L-579"><span class="linenos" data-line="579"></span></a> <span class="kr">while</span> <span class="kc">true</span> <span class="kr">do</span> </span><span id="L-580"><a href="#L-580"><span class="linenos" data-line="580"></span></a> <span class="kd">local</span> <span class="n">name</span><span class="p">,</span> <span class="n">loc</span> <span class="o">=</span> <span class="n">match</span><span class="p">(</span><span class="n">raw</span><span class="p">,</span> <span class="s2">&quot;([^</span><span class="se">\t\n\f\r</span><span class="s2"> /&gt;][^</span><span class="se">\t\n\f\r</span><span class="s2"> /=&gt;]*)()&quot;</span><span class="p">,</span> <span class="n">head</span><span class="p">)</span> </span><span id="L-581"><a href="#L-581"><span class="linenos" data-line="581"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">name</span> <span class="kr">then</span> </span><span id="L-582"><a href="#L-582"><span class="linenos" data-line="582"></span></a> <span class="kr">break</span> </span><span id="L-583"><a href="#L-583"><span class="linenos" data-line="583"></span></a> <span class="kr">end</span> </span><span id="L-584"><a href="#L-584"><span class="linenos" data-line="584"></span></a> <span class="n">head</span> <span class="o">=</span> <span class="n">loc</span> </span><span id="L-585"><a href="#L-585"><span class="linenos" data-line="585"></span></a> <span class="kd">local</span> <span class="n">value</span> </span><span id="L-586"><a href="#L-586"><span class="linenos" data-line="586"></span></a> <span class="n">loc</span> <span class="o">=</span> <span class="n">match</span><span class="p">(</span><span class="n">raw</span><span class="p">,</span> <span class="s2">&quot;^[</span><span class="se">\t\n\f\r</span><span class="s2"> ]*=[</span><span class="se">\t\n\f\r</span><span class="s2"> ]*()&quot;</span><span class="p">,</span> <span class="n">head</span><span class="p">)</span> </span><span id="L-587"><a href="#L-587"><span class="linenos" data-line="587"></span></a> <span class="kr">if</span> <span class="n">loc</span> <span class="kr">then</span> </span><span id="L-588"><a href="#L-588"><span class="linenos" data-line="588"></span></a> <span class="n">head</span> <span class="o">=</span> <span class="n">loc</span> </span><span id="L-589"><a href="#L-589"><span class="linenos" data-line="589"></span></a> <span class="c1">-- Either &quot;&quot;, &#39;&#39; or the value ends on a space/at the end. Missing</span> </span><span id="L-590"><a href="#L-590"><span class="linenos" data-line="590"></span></a> <span class="c1">-- end quotes are repaired by closing the value at the end.</span> </span><span id="L-591"><a href="#L-591"><span class="linenos" data-line="591"></span></a> <span class="n">value</span><span class="p">,</span> <span class="n">loc</span> <span class="o">=</span> <span class="n">match</span><span class="p">(</span><span class="n">raw</span><span class="p">,</span> <span class="s2">&quot;^</span><span class="se">\&quot;</span><span class="s2">([^</span><span class="se">\&quot;</span><span class="s2">]*)</span><span class="se">\&quot;</span><span class="s2">?()&quot;</span><span class="p">,</span> <span class="n">head</span><span class="p">)</span> </span><span id="L-592"><a href="#L-592"><span class="linenos" data-line="592"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">value</span> <span class="kr">then</span> </span><span id="L-593"><a href="#L-593"><span class="linenos" data-line="593"></span></a> <span class="n">value</span><span class="p">,</span> <span class="n">loc</span> <span class="o">=</span> <span class="n">match</span><span class="p">(</span><span class="n">raw</span><span class="p">,</span> <span class="s2">&quot;^&#39;([^&#39;]*)&#39;?()&quot;</span><span class="p">,</span> <span class="n">head</span><span class="p">)</span> </span><span id="L-594"><a href="#L-594"><span class="linenos" data-line="594"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">value</span> <span class="kr">then</span> </span><span id="L-595"><a href="#L-595"><span class="linenos" data-line="595"></span></a> <span class="n">value</span><span class="p">,</span> <span class="n">loc</span> <span class="o">=</span> <span class="n">match</span><span class="p">(</span><span class="n">raw</span><span class="p">,</span> <span class="s2">&quot;^([^</span><span class="se">\t\n\f\r</span><span class="s2"> ]*)()&quot;</span><span class="p">,</span> <span class="n">head</span><span class="p">)</span> </span><span id="L-596"><a href="#L-596"><span class="linenos" data-line="596"></span></a> <span class="kr">end</span> </span><span id="L-597"><a href="#L-597"><span class="linenos" data-line="597"></span></a> <span class="kr">end</span> </span><span id="L-598"><a href="#L-598"><span class="linenos" data-line="598"></span></a> <span class="n">head</span> <span class="o">=</span> <span class="n">loc</span> </span><span id="L-599"><a href="#L-599"><span class="linenos" data-line="599"></span></a> <span class="kr">end</span> </span><span id="L-600"><a href="#L-600"><span class="linenos" data-line="600"></span></a> <span class="c1">-- valid_attribute_name is a pattern matching a valid attribute name.</span> </span><span id="L-601"><a href="#L-601"><span class="linenos" data-line="601"></span></a> <span class="c1">-- Defined in the data due to its length - see there for more info.</span> </span><span id="L-602"><a href="#L-602"><span class="linenos" data-line="602"></span></a> <span class="kr">if</span> <span class="n">umatch</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">valid_attribute_name</span> <span class="ow">or</span> <span class="n">get_valid_attribute_name</span><span class="p">())</span> <span class="kr">then</span> </span><span id="L-603"><a href="#L-603"><span class="linenos" data-line="603"></span></a> <span class="c1">-- Sanitizer applies PHP strtolower (ASCII-only).</span> </span><span id="L-604"><a href="#L-604"><span class="linenos" data-line="604"></span></a> <span class="n">attributes</span><span class="p">[</span><span class="n">lower</span><span class="p">(</span><span class="n">name</span><span class="p">)]</span> <span class="o">=</span> <span class="n">value</span> <span class="ow">and</span> <span class="n">decode_entities</span><span class="p">(</span> </span><span id="L-605"><a href="#L-605"><span class="linenos" data-line="605"></span></a> <span class="n">php_trim</span><span class="p">((</span><span class="n">gsub</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="s2">&quot;[</span><span class="se">\t\n\r</span><span class="s2"> ]+&quot;</span><span class="p">,</span> <span class="s2">&quot; &quot;</span><span class="p">)))</span> </span><span id="L-606"><a href="#L-606"><span class="linenos" data-line="606"></span></a> <span class="p">)</span> <span class="ow">or</span> <span class="s2">&quot;&quot;</span> </span><span id="L-607"><a href="#L-607"><span class="linenos" data-line="607"></span></a> <span class="kr">end</span> </span><span id="L-608"><a href="#L-608"><span class="linenos" data-line="608"></span></a> <span class="kr">end</span> </span><span id="L-609"><a href="#L-609"><span class="linenos" data-line="609"></span></a> <span class="n">self</span><span class="p">.</span><span class="n">attributes</span> <span class="o">=</span> <span class="n">attributes</span> </span><span id="L-610"><a href="#L-610"><span class="linenos" data-line="610"></span></a> <span class="kr">return</span> <span class="n">attributes</span> </span><span id="L-611"><a href="#L-611"><span class="linenos" data-line="611"></span></a> <span class="kr">end</span> </span><span id="L-612"><a href="#L-612"><span class="linenos" data-line="612"></span></a><span class="kr">end</span> </span><span id="L-613"><a href="#L-613"><span class="linenos" data-line="613"></span></a> </span><span id="L-614"><a href="#L-614"><span class="linenos" data-line="614"></span></a><span class="kr">function</span> <span class="nc">Tag</span><span class="p">:</span><span class="nf">expand</span><span class="p">()</span> </span><span id="L-615"><a href="#L-615"><span class="linenos" data-line="615"></span></a> <span class="kr">return</span> <span class="p">(</span><span class="n">frame</span> <span class="ow">or</span> <span class="n">get_frame</span><span class="p">()):</span><span class="n">preprocess</span><span class="p">(</span><span class="nb">tostring</span><span class="p">(</span><span class="n">self</span><span class="p">))</span> </span><span id="L-616"><a href="#L-616"><span class="linenos" data-line="616"></span></a><span class="kr">end</span> </span><span id="L-617"><a href="#L-617"><span class="linenos" data-line="617"></span></a> </span><span id="L-618"><a href="#L-618"><span class="linenos" data-line="618"></span></a><span class="kd">local</span> <span class="n">Heading</span> <span class="o">=</span> <span class="n">Node</span><span class="p">:</span><span class="n">new_class</span><span class="p">(</span><span class="s2">&quot;heading&quot;</span><span class="p">)</span> </span><span id="L-619"><a href="#L-619"><span class="linenos" data-line="619"></span></a> </span><span id="L-620"><a href="#L-620"><span class="linenos" data-line="620"></span></a><span class="kr">function</span> <span class="nc">Heading</span><span class="p">:</span><span class="nf">new</span><span class="p">(</span><span class="n">this</span><span class="p">)</span> </span><span id="L-621"><a href="#L-621"><span class="linenos" data-line="621"></span></a> <span class="kr">if</span> <span class="o">#</span><span class="n">this</span> <span class="o">&gt;</span> <span class="mi">1</span> <span class="kr">then</span> </span><span id="L-622"><a href="#L-622"><span class="linenos" data-line="622"></span></a> <span class="kd">local</span> <span class="n">success</span><span class="p">,</span> <span class="n">str</span> <span class="o">=</span> <span class="nb">pcall</span><span class="p">(</span><span class="n">concat</span><span class="p">,</span> <span class="n">this</span><span class="p">)</span> </span><span id="L-623"><a href="#L-623"><span class="linenos" data-line="623"></span></a> <span class="kr">if</span> <span class="n">success</span> <span class="kr">then</span> </span><span id="L-624"><a href="#L-624"><span class="linenos" data-line="624"></span></a> <span class="kr">return</span> <span class="n">Node</span><span class="p">.</span><span class="n">new</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="p">{</span> </span><span id="L-625"><a href="#L-625"><span class="linenos" data-line="625"></span></a> <span class="n">str</span><span class="p">,</span> </span><span id="L-626"><a href="#L-626"><span class="linenos" data-line="626"></span></a> <span class="n">level</span> <span class="o">=</span> <span class="n">this</span><span class="p">.</span><span class="n">level</span><span class="p">,</span> </span><span id="L-627"><a href="#L-627"><span class="linenos" data-line="627"></span></a> <span class="n">section</span> <span class="o">=</span> <span class="n">this</span><span class="p">.</span><span class="n">section</span><span class="p">,</span> </span><span id="L-628"><a href="#L-628"><span class="linenos" data-line="628"></span></a> <span class="n">index</span> <span class="o">=</span> <span class="n">this</span><span class="p">.</span><span class="n">index</span> </span><span id="L-629"><a href="#L-629"><span class="linenos" data-line="629"></span></a> <span class="p">})</span> </span><span id="L-630"><a href="#L-630"><span class="linenos" data-line="630"></span></a> <span class="kr">end</span> </span><span id="L-631"><a href="#L-631"><span class="linenos" data-line="631"></span></a> <span class="kr">end</span> </span><span id="L-632"><a href="#L-632"><span class="linenos" data-line="632"></span></a> <span class="kr">return</span> <span class="n">Node</span><span class="p">.</span><span class="n">new</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">this</span><span class="p">)</span> </span><span id="L-633"><a href="#L-633"><span class="linenos" data-line="633"></span></a><span class="kr">end</span> </span><span id="L-634"><a href="#L-634"><span class="linenos" data-line="634"></span></a> </span><span id="L-635"><a href="#L-635"><span class="linenos" data-line="635"></span></a><span class="kr">function</span> <span class="nc">Heading</span><span class="p">:</span><span class="nf">__tostring</span><span class="p">()</span> </span><span id="L-636"><a href="#L-636"><span class="linenos" data-line="636"></span></a> <span class="kd">local</span> <span class="n">eq</span> <span class="o">=</span> <span class="n">rep</span><span class="p">(</span><span class="s2">&quot;=&quot;</span><span class="p">,</span> <span class="n">self</span><span class="p">.</span><span class="n">level</span><span class="p">)</span> </span><span id="L-637"><a href="#L-637"><span class="linenos" data-line="637"></span></a> <span class="kr">return</span> <span class="n">eq</span> <span class="o">..</span> <span class="n">Node</span><span class="p">.</span><span class="n">__tostring</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> <span class="o">..</span> <span class="n">eq</span> </span><span id="L-638"><a href="#L-638"><span class="linenos" data-line="638"></span></a><span class="kr">end</span> </span><span id="L-639"><a href="#L-639"><span class="linenos" data-line="639"></span></a> </span><span id="L-640"><a href="#L-640"><span class="linenos" data-line="640"></span></a><span class="kr">do</span> </span><span id="L-641"><a href="#L-641"><span class="linenos" data-line="641"></span></a> <span class="kd">local</span> <span class="n">expand_node</span> <span class="o">=</span> <span class="n">Node</span><span class="p">.</span><span class="n">expand</span> </span><span id="L-642"><a href="#L-642"><span class="linenos" data-line="642"></span></a> </span><span id="L-643"><a href="#L-643"><span class="linenos" data-line="643"></span></a> <span class="c1">-- Expanded heading names can contain &quot;\n&quot; (e.g. inside nowiki tags), which</span> </span><span id="L-644"><a href="#L-644"><span class="linenos" data-line="644"></span></a> <span class="c1">-- causes any heading containing them to fail. However, in such cases, the</span> </span><span id="L-645"><a href="#L-645"><span class="linenos" data-line="645"></span></a> <span class="c1">-- native parser still treats it as a heading for the purpose of section</span> </span><span id="L-646"><a href="#L-646"><span class="linenos" data-line="646"></span></a> <span class="c1">-- numbers.</span> </span><span id="L-647"><a href="#L-647"><span class="linenos" data-line="647"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">validate_name</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">frame_args</span><span class="p">)</span> </span><span id="L-648"><a href="#L-648"><span class="linenos" data-line="648"></span></a> <span class="kd">local</span> <span class="n">name</span> <span class="o">=</span> <span class="n">expand_node</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">frame_args</span><span class="p">)</span> </span><span id="L-649"><a href="#L-649"><span class="linenos" data-line="649"></span></a> <span class="kr">if</span> <span class="n">find</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="kc">true</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-650"><a href="#L-650"><span class="linenos" data-line="650"></span></a> <span class="kr">return</span> <span class="kc">nil</span> </span><span id="L-651"><a href="#L-651"><span class="linenos" data-line="651"></span></a> <span class="kr">end</span> </span><span id="L-652"><a href="#L-652"><span class="linenos" data-line="652"></span></a> <span class="kr">return</span> <span class="n">name</span> </span><span id="L-653"><a href="#L-653"><span class="linenos" data-line="653"></span></a> <span class="kr">end</span> </span><span id="L-654"><a href="#L-654"><span class="linenos" data-line="654"></span></a> </span><span id="L-655"><a href="#L-655"><span class="linenos" data-line="655"></span></a> <span class="kr">function</span> <span class="nc">Heading</span><span class="p">:</span><span class="nf">get_name</span><span class="p">(</span><span class="n">frame_args</span><span class="p">)</span> </span><span id="L-656"><a href="#L-656"><span class="linenos" data-line="656"></span></a> <span class="kd">local</span> <span class="n">name</span> <span class="o">=</span> <span class="n">validate_name</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">frame_args</span><span class="p">)</span> </span><span id="L-657"><a href="#L-657"><span class="linenos" data-line="657"></span></a> <span class="kr">return</span> <span class="n">name</span> <span class="o">~=</span> <span class="kc">nil</span> <span class="ow">and</span> <span class="n">php_trim</span><span class="p">(</span><span class="n">name</span><span class="p">)</span> <span class="ow">or</span> <span class="kc">nil</span> </span><span id="L-658"><a href="#L-658"><span class="linenos" data-line="658"></span></a> <span class="kr">end</span> </span><span id="L-659"><a href="#L-659"><span class="linenos" data-line="659"></span></a> </span><span id="L-660"><a href="#L-660"><span class="linenos" data-line="660"></span></a> <span class="c1">-- FIXME: account for anchor disambiguation.</span> </span><span id="L-661"><a href="#L-661"><span class="linenos" data-line="661"></span></a> <span class="kr">function</span> <span class="nc">Heading</span><span class="p">:</span><span class="nf">get_anchor</span><span class="p">(</span><span class="n">frame_args</span><span class="p">)</span> </span><span id="L-662"><a href="#L-662"><span class="linenos" data-line="662"></span></a> <span class="kd">local</span> <span class="n">name</span> <span class="o">=</span> <span class="n">validate_name</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">frame_args</span><span class="p">)</span> </span><span id="L-663"><a href="#L-663"><span class="linenos" data-line="663"></span></a> <span class="kr">return</span> <span class="n">name</span> <span class="o">~=</span> <span class="kc">nil</span> <span class="ow">and</span> <span class="n">decode_entities</span><span class="p">(</span><span class="n">anchor_encode</span><span class="p">(</span><span class="n">name</span><span class="p">))</span> <span class="ow">or</span> <span class="kc">nil</span> </span><span id="L-664"><a href="#L-664"><span class="linenos" data-line="664"></span></a> <span class="kr">end</span> </span><span id="L-665"><a href="#L-665"><span class="linenos" data-line="665"></span></a> </span><span id="L-666"><a href="#L-666"><span class="linenos" data-line="666"></span></a> <span class="kr">function</span> <span class="nc">Heading</span><span class="p">:</span><span class="nf">expand</span><span class="p">(</span><span class="n">frame_args</span><span class="p">)</span> </span><span id="L-667"><a href="#L-667"><span class="linenos" data-line="667"></span></a> <span class="kd">local</span> <span class="n">eq</span> <span class="o">=</span> <span class="n">rep</span><span class="p">(</span><span class="s2">&quot;=&quot;</span><span class="p">,</span> <span class="n">self</span><span class="p">.</span><span class="n">level</span><span class="p">)</span> </span><span id="L-668"><a href="#L-668"><span class="linenos" data-line="668"></span></a> <span class="kr">return</span> <span class="n">eq</span> <span class="o">..</span> <span class="n">expand_node</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">frame_args</span><span class="p">)</span> <span class="o">..</span> <span class="n">eq</span> </span><span id="L-669"><a href="#L-669"><span class="linenos" data-line="669"></span></a> <span class="kr">end</span> </span><span id="L-670"><a href="#L-670"><span class="linenos" data-line="670"></span></a><span class="kr">end</span> </span><span id="L-671"><a href="#L-671"><span class="linenos" data-line="671"></span></a> </span><span id="L-672"><a href="#L-672"><span class="linenos" data-line="672"></span></a><span class="c1">------------------------------------------------------------------------------------</span> </span><span id="L-673"><a href="#L-673"><span class="linenos" data-line="673"></span></a><span class="c1">--</span> </span><span id="L-674"><a href="#L-674"><span class="linenos" data-line="674"></span></a><span class="c1">-- Parser</span> </span><span id="L-675"><a href="#L-675"><span class="linenos" data-line="675"></span></a><span class="c1">--</span> </span><span id="L-676"><a href="#L-676"><span class="linenos" data-line="676"></span></a><span class="c1">------------------------------------------------------------------------------------</span> </span><span id="L-677"><a href="#L-677"><span class="linenos" data-line="677"></span></a> </span><span id="L-678"><a href="#L-678"><span class="linenos" data-line="678"></span></a><span class="kr">function</span> <span class="nc">Parser</span><span class="p">:</span><span class="nf">read</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">)</span> </span><span id="L-679"><a href="#L-679"><span class="linenos" data-line="679"></span></a> <span class="kd">local</span> <span class="n">head</span><span class="p">,</span> <span class="n">i</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">head</span><span class="p">,</span> <span class="n">i</span> <span class="ow">or</span> <span class="mi">0</span> </span><span id="L-680"><a href="#L-680"><span class="linenos" data-line="680"></span></a> <span class="kr">return</span> <span class="n">sub</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">text</span><span class="p">,</span> <span class="n">head</span> <span class="o">+</span> <span class="n">i</span><span class="p">,</span> <span class="n">head</span> <span class="o">+</span> <span class="p">(</span><span class="n">j</span> <span class="ow">or</span> <span class="n">i</span><span class="p">))</span> </span><span id="L-681"><a href="#L-681"><span class="linenos" data-line="681"></span></a><span class="kr">end</span> </span><span id="L-682"><a href="#L-682"><span class="linenos" data-line="682"></span></a> </span><span id="L-683"><a href="#L-683"><span class="linenos" data-line="683"></span></a><span class="kr">function</span> <span class="nc">Parser</span><span class="p">:</span><span class="nf">advance</span><span class="p">(</span><span class="n">n</span><span class="p">)</span> </span><span id="L-684"><a href="#L-684"><span class="linenos" data-line="684"></span></a> <span class="n">self</span><span class="p">.</span><span class="n">head</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">head</span> <span class="o">+</span> <span class="p">(</span><span class="n">n</span> <span class="ow">or</span> <span class="n">self</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">].</span><span class="n">step</span> <span class="ow">or</span> <span class="mi">1</span><span class="p">)</span> </span><span id="L-685"><a href="#L-685"><span class="linenos" data-line="685"></span></a><span class="kr">end</span> </span><span id="L-686"><a href="#L-686"><span class="linenos" data-line="686"></span></a> </span><span id="L-687"><a href="#L-687"><span class="linenos" data-line="687"></span></a><span class="kr">function</span> <span class="nc">Parser</span><span class="p">:</span><span class="nf">jump</span><span class="p">(</span><span class="n">head</span><span class="p">)</span> </span><span id="L-688"><a href="#L-688"><span class="linenos" data-line="688"></span></a> <span class="n">self</span><span class="p">.</span><span class="n">head</span> <span class="o">=</span> <span class="n">head</span> </span><span id="L-689"><a href="#L-689"><span class="linenos" data-line="689"></span></a> <span class="n">self</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">].</span><span class="n">nxt</span> <span class="o">=</span> <span class="kc">nil</span> </span><span id="L-690"><a href="#L-690"><span class="linenos" data-line="690"></span></a><span class="kr">end</span> </span><span id="L-691"><a href="#L-691"><span class="linenos" data-line="691"></span></a> </span><span id="L-692"><a href="#L-692"><span class="linenos" data-line="692"></span></a><span class="kr">function</span> <span class="nc">Parser</span><span class="p">:</span><span class="nf">set_pattern</span><span class="p">(</span><span class="n">pattern</span><span class="p">)</span> </span><span id="L-693"><a href="#L-693"><span class="linenos" data-line="693"></span></a> <span class="kd">local</span> <span class="n">layer</span> <span class="o">=</span> <span class="n">self</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> </span><span id="L-694"><a href="#L-694"><span class="linenos" data-line="694"></span></a> <span class="n">layer</span><span class="p">.</span><span class="n">pattern</span> <span class="o">=</span> <span class="n">pattern</span> </span><span id="L-695"><a href="#L-695"><span class="linenos" data-line="695"></span></a> <span class="n">layer</span><span class="p">.</span><span class="n">nxt</span> <span class="o">=</span> <span class="kc">nil</span> </span><span id="L-696"><a href="#L-696"><span class="linenos" data-line="696"></span></a><span class="kr">end</span> </span><span id="L-697"><a href="#L-697"><span class="linenos" data-line="697"></span></a> </span><span id="L-698"><a href="#L-698"><span class="linenos" data-line="698"></span></a><span class="kr">function</span> <span class="nc">Parser</span><span class="p">:</span><span class="nf">consume</span><span class="p">()</span> </span><span id="L-699"><a href="#L-699"><span class="linenos" data-line="699"></span></a> <span class="kd">local</span> <span class="n">layer</span> <span class="o">=</span> <span class="n">self</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> </span><span id="L-700"><a href="#L-700"><span class="linenos" data-line="700"></span></a> <span class="kd">local</span> <span class="n">this</span> <span class="o">=</span> <span class="n">layer</span><span class="p">.</span><span class="n">nxt</span> </span><span id="L-701"><a href="#L-701"><span class="linenos" data-line="701"></span></a> <span class="kr">if</span> <span class="n">this</span> <span class="kr">then</span> </span><span id="L-702"><a href="#L-702"><span class="linenos" data-line="702"></span></a> <span class="n">layer</span><span class="p">.</span><span class="n">nxt</span> <span class="o">=</span> <span class="kc">nil</span> </span><span id="L-703"><a href="#L-703"><span class="linenos" data-line="703"></span></a> <span class="kr">else</span> </span><span id="L-704"><a href="#L-704"><span class="linenos" data-line="704"></span></a> <span class="kd">local</span> <span class="n">text</span><span class="p">,</span> <span class="n">head</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">text</span><span class="p">,</span> <span class="n">self</span><span class="p">.</span><span class="n">head</span> </span><span id="L-705"><a href="#L-705"><span class="linenos" data-line="705"></span></a> <span class="kd">local</span> <span class="n">loc1</span><span class="p">,</span> <span class="n">loc2</span> <span class="o">=</span> <span class="n">find</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="n">layer</span><span class="p">.</span><span class="n">pattern</span><span class="p">,</span> <span class="n">head</span><span class="p">)</span> </span><span id="L-706"><a href="#L-706"><span class="linenos" data-line="706"></span></a> <span class="kr">if</span> <span class="n">loc1</span> <span class="o">==</span> <span class="n">head</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">loc1</span> <span class="kr">then</span> </span><span id="L-707"><a href="#L-707"><span class="linenos" data-line="707"></span></a> <span class="n">this</span> <span class="o">=</span> <span class="n">sub</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="n">head</span><span class="p">,</span> <span class="n">loc2</span><span class="p">)</span> </span><span id="L-708"><a href="#L-708"><span class="linenos" data-line="708"></span></a> <span class="kr">else</span> </span><span id="L-709"><a href="#L-709"><span class="linenos" data-line="709"></span></a> <span class="n">this</span> <span class="o">=</span> <span class="n">sub</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="n">head</span><span class="p">,</span> <span class="n">loc1</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> </span><span id="L-710"><a href="#L-710"><span class="linenos" data-line="710"></span></a> <span class="n">layer</span><span class="p">.</span><span class="n">nxt</span> <span class="o">=</span> <span class="n">sub</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="n">loc1</span><span class="p">,</span> <span class="n">loc2</span><span class="p">)</span> </span><span id="L-711"><a href="#L-711"><span class="linenos" data-line="711"></span></a> <span class="kr">end</span> </span><span id="L-712"><a href="#L-712"><span class="linenos" data-line="712"></span></a> <span class="kr">end</span> </span><span id="L-713"><a href="#L-713"><span class="linenos" data-line="713"></span></a> <span class="n">layer</span><span class="p">.</span><span class="n">step</span> <span class="o">=</span> <span class="o">#</span><span class="n">this</span> </span><span id="L-714"><a href="#L-714"><span class="linenos" data-line="714"></span></a> <span class="kr">return</span> <span class="n">layer</span><span class="p">.</span><span class="n">handler</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">this</span><span class="p">)</span> </span><span id="L-715"><a href="#L-715"><span class="linenos" data-line="715"></span></a><span class="kr">end</span> </span><span id="L-716"><a href="#L-716"><span class="linenos" data-line="716"></span></a> </span><span id="L-717"><a href="#L-717"><span class="linenos" data-line="717"></span></a><span class="c1">-- Template or parameter.</span> </span><span id="L-718"><a href="#L-718"><span class="linenos" data-line="718"></span></a> </span><span id="L-719"><a href="#L-719"><span class="linenos" data-line="719"></span></a><span class="c1">-- Parsed by matching the opening braces innermost-to-outermost (ignoring lone closing braces). Parameters {{{ }}} take priority over templates {{ }} where possible, but a double closing brace will always result in a closure, even if there are 3+ opening braces.</span> </span><span id="L-720"><a href="#L-720"><span class="linenos" data-line="720"></span></a> </span><span id="L-721"><a href="#L-721"><span class="linenos" data-line="721"></span></a><span class="c1">-- For example, &quot;{{{{foo}}}}&quot; (4) is parsed as a parameter enclosed by single braces, and &quot;{{{{{foo}}}}}&quot; (5) is a parameter inside a template. However, &quot;{{{{{foo }} }}}&quot; is a template inside a parameter, due to &quot;}}&quot; forcing the closure of the inner node.</span> </span><span id="L-722"><a href="#L-722"><span class="linenos" data-line="722"></span></a><span class="kr">do</span> </span><span id="L-723"><a href="#L-723"><span class="linenos" data-line="723"></span></a> <span class="c1">-- Handlers.</span> </span><span id="L-724"><a href="#L-724"><span class="linenos" data-line="724"></span></a> <span class="kd">local</span> <span class="n">handle_name</span> </span><span id="L-725"><a href="#L-725"><span class="linenos" data-line="725"></span></a> <span class="kd">local</span> <span class="n">handle_argument</span> </span><span id="L-726"><a href="#L-726"><span class="linenos" data-line="726"></span></a> </span><span id="L-727"><a href="#L-727"><span class="linenos" data-line="727"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">do_template_or_parameter</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">inner_node</span><span class="p">)</span> </span><span id="L-728"><a href="#L-728"><span class="linenos" data-line="728"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">push_sublayer</span><span class="p">(</span><span class="n">handle_name</span><span class="p">)</span> </span><span id="L-729"><a href="#L-729"><span class="linenos" data-line="729"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">set_pattern</span><span class="p">(</span><span class="s2">&quot;[</span><span class="se">\n</span><span class="s2">&lt;[{|}]&quot;</span><span class="p">)</span> </span><span id="L-730"><a href="#L-730"><span class="linenos" data-line="730"></span></a> <span class="c1">-- If a node has already been parsed, nest it at the start of the new</span> </span><span id="L-731"><a href="#L-731"><span class="linenos" data-line="731"></span></a> <span class="c1">-- outer node (e.g. when parsing&quot;{{{{foo}}bar}}&quot;, the template &quot;{{foo}}&quot;</span> </span><span id="L-732"><a href="#L-732"><span class="linenos" data-line="732"></span></a> <span class="c1">-- is parsed first, since it&#39;s the innermost, and becomes the first</span> </span><span id="L-733"><a href="#L-733"><span class="linenos" data-line="733"></span></a> <span class="c1">-- node of the outer template.</span> </span><span id="L-734"><a href="#L-734"><span class="linenos" data-line="734"></span></a> <span class="kr">if</span> <span class="n">inner_node</span> <span class="kr">then</span> </span><span id="L-735"><a href="#L-735"><span class="linenos" data-line="735"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">emit</span><span class="p">(</span><span class="n">inner_node</span><span class="p">)</span> </span><span id="L-736"><a href="#L-736"><span class="linenos" data-line="736"></span></a> <span class="kr">end</span> </span><span id="L-737"><a href="#L-737"><span class="linenos" data-line="737"></span></a> <span class="kr">end</span> </span><span id="L-738"><a href="#L-738"><span class="linenos" data-line="738"></span></a> </span><span id="L-739"><a href="#L-739"><span class="linenos" data-line="739"></span></a> <span class="kr">function</span> <span class="nf">handle_name</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="p">...)</span> </span><span id="L-740"><a href="#L-740"><span class="linenos" data-line="740"></span></a> <span class="n">handle_name</span> <span class="o">=</span> <span class="n">self</span><span class="p">:</span><span class="n">switch</span><span class="p">(</span><span class="n">handle_name</span><span class="p">,</span> <span class="p">{</span> </span><span id="L-741"><a href="#L-741"><span class="linenos" data-line="741"></span></a> <span class="p">[</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">Parser</span><span class="p">.</span><span class="n">heading_block</span><span class="p">,</span> </span><span id="L-742"><a href="#L-742"><span class="linenos" data-line="742"></span></a> <span class="p">[</span><span class="s2">&quot;&lt;&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">Parser</span><span class="p">.</span><span class="n">tag</span><span class="p">,</span> </span><span id="L-743"><a href="#L-743"><span class="linenos" data-line="743"></span></a> <span class="p">[</span><span class="s2">&quot;[&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">Parser</span><span class="p">.</span><span class="n">wikilink_block</span><span class="p">,</span> </span><span id="L-744"><a href="#L-744"><span class="linenos" data-line="744"></span></a> <span class="p">[</span><span class="s2">&quot;{&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">Parser</span><span class="p">.</span><span class="n">braces</span><span class="p">,</span> </span><span id="L-745"><a href="#L-745"><span class="linenos" data-line="745"></span></a> </span><span id="L-746"><a href="#L-746"><span class="linenos" data-line="746"></span></a> <span class="p">[</span><span class="s2">&quot;|&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kr">function</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> </span><span id="L-747"><a href="#L-747"><span class="linenos" data-line="747"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">emit</span><span class="p">(</span><span class="n">Wikitext</span><span class="p">:</span><span class="n">new</span><span class="p">(</span><span class="n">self</span><span class="p">:</span><span class="n">pop_sublayer</span><span class="p">()))</span> </span><span id="L-748"><a href="#L-748"><span class="linenos" data-line="748"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">push_sublayer</span><span class="p">(</span><span class="n">handle_argument</span><span class="p">)</span> </span><span id="L-749"><a href="#L-749"><span class="linenos" data-line="749"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">set_pattern</span><span class="p">(</span><span class="s2">&quot;[</span><span class="se">\n</span><span class="s2">&lt;=[{|}]&quot;</span><span class="p">)</span> </span><span id="L-750"><a href="#L-750"><span class="linenos" data-line="750"></span></a> <span class="kr">end</span><span class="p">,</span> </span><span id="L-751"><a href="#L-751"><span class="linenos" data-line="751"></span></a> </span><span id="L-752"><a href="#L-752"><span class="linenos" data-line="752"></span></a> <span class="p">[</span><span class="s2">&quot;}&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kr">function</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> </span><span id="L-753"><a href="#L-753"><span class="linenos" data-line="753"></span></a> <span class="kr">if</span> <span class="n">self</span><span class="p">:</span><span class="n">read</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="o">==</span> <span class="s2">&quot;}&quot;</span> <span class="kr">then</span> </span><span id="L-754"><a href="#L-754"><span class="linenos" data-line="754"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">emit</span><span class="p">(</span><span class="n">Wikitext</span><span class="p">:</span><span class="n">new</span><span class="p">(</span><span class="n">self</span><span class="p">:</span><span class="n">pop_sublayer</span><span class="p">()))</span> </span><span id="L-755"><a href="#L-755"><span class="linenos" data-line="755"></span></a> <span class="kr">return</span> <span class="n">self</span><span class="p">:</span><span class="n">pop</span><span class="p">()</span> </span><span id="L-756"><a href="#L-756"><span class="linenos" data-line="756"></span></a> <span class="kr">end</span> </span><span id="L-757"><a href="#L-757"><span class="linenos" data-line="757"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">emit</span><span class="p">(</span><span class="s2">&quot;}&quot;</span><span class="p">)</span> </span><span id="L-758"><a href="#L-758"><span class="linenos" data-line="758"></span></a> <span class="kr">end</span><span class="p">,</span> </span><span id="L-759"><a href="#L-759"><span class="linenos" data-line="759"></span></a> </span><span id="L-760"><a href="#L-760"><span class="linenos" data-line="760"></span></a> <span class="p">[</span><span class="s2">&quot;&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">Parser</span><span class="p">.</span><span class="n">fail_route</span><span class="p">,</span> </span><span id="L-761"><a href="#L-761"><span class="linenos" data-line="761"></span></a> <span class="p">[</span><span class="kc">false</span><span class="p">]</span> <span class="o">=</span> <span class="n">Parser</span><span class="p">.</span><span class="n">emit</span> </span><span id="L-762"><a href="#L-762"><span class="linenos" data-line="762"></span></a> <span class="p">})</span> </span><span id="L-763"><a href="#L-763"><span class="linenos" data-line="763"></span></a> <span class="kr">return</span> <span class="n">handle_name</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="p">...)</span> </span><span id="L-764"><a href="#L-764"><span class="linenos" data-line="764"></span></a> <span class="kr">end</span> </span><span id="L-765"><a href="#L-765"><span class="linenos" data-line="765"></span></a> </span><span id="L-766"><a href="#L-766"><span class="linenos" data-line="766"></span></a> <span class="kr">function</span> <span class="nf">handle_argument</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="p">...)</span> </span><span id="L-767"><a href="#L-767"><span class="linenos" data-line="767"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">emit_argument</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> </span><span id="L-768"><a href="#L-768"><span class="linenos" data-line="768"></span></a> <span class="kd">local</span> <span class="n">arg</span> <span class="o">=</span> <span class="n">Wikitext</span><span class="p">:</span><span class="n">new</span><span class="p">(</span><span class="n">self</span><span class="p">:</span><span class="n">pop_sublayer</span><span class="p">())</span> </span><span id="L-769"><a href="#L-769"><span class="linenos" data-line="769"></span></a> <span class="kd">local</span> <span class="n">layer</span> <span class="o">=</span> <span class="n">self</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> </span><span id="L-770"><a href="#L-770"><span class="linenos" data-line="770"></span></a> <span class="kd">local</span> <span class="n">key</span> <span class="o">=</span> <span class="n">layer</span><span class="p">.</span><span class="n">key</span> </span><span id="L-771"><a href="#L-771"><span class="linenos" data-line="771"></span></a> <span class="kr">if</span> <span class="n">key</span> <span class="kr">then</span> </span><span id="L-772"><a href="#L-772"><span class="linenos" data-line="772"></span></a> <span class="n">arg</span> <span class="o">=</span> <span class="n">Argument</span><span class="p">:</span><span class="n">new</span><span class="p">{</span><span class="n">key</span><span class="p">,</span> <span class="n">arg</span><span class="p">}</span> </span><span id="L-773"><a href="#L-773"><span class="linenos" data-line="773"></span></a> <span class="n">layer</span><span class="p">.</span><span class="n">key</span> <span class="o">=</span> <span class="kc">nil</span> </span><span id="L-774"><a href="#L-774"><span class="linenos" data-line="774"></span></a> <span class="kr">end</span> </span><span id="L-775"><a href="#L-775"><span class="linenos" data-line="775"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">emit</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span> </span><span id="L-776"><a href="#L-776"><span class="linenos" data-line="776"></span></a> <span class="kr">end</span> </span><span id="L-777"><a href="#L-777"><span class="linenos" data-line="777"></span></a> </span><span id="L-778"><a href="#L-778"><span class="linenos" data-line="778"></span></a> <span class="n">handle_argument</span> <span class="o">=</span> <span class="n">self</span><span class="p">:</span><span class="n">switch</span><span class="p">(</span><span class="n">handle_argument</span><span class="p">,</span> <span class="p">{</span> </span><span id="L-779"><a href="#L-779"><span class="linenos" data-line="779"></span></a> <span class="p">[</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kr">function</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> </span><span id="L-780"><a href="#L-780"><span class="linenos" data-line="780"></span></a> <span class="kr">return</span> <span class="n">self</span><span class="p">:</span><span class="n">heading_block</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">self</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">].</span><span class="n">key</span> <span class="ow">and</span> <span class="s2">&quot;=&quot;</span> <span class="ow">or</span> <span class="s2">&quot;==&quot;</span><span class="p">)</span> </span><span id="L-781"><a href="#L-781"><span class="linenos" data-line="781"></span></a> <span class="kr">end</span><span class="p">,</span> </span><span id="L-782"><a href="#L-782"><span class="linenos" data-line="782"></span></a> </span><span id="L-783"><a href="#L-783"><span class="linenos" data-line="783"></span></a> <span class="p">[</span><span class="s2">&quot;&lt;&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">Parser</span><span class="p">.</span><span class="n">tag</span><span class="p">,</span> </span><span id="L-784"><a href="#L-784"><span class="linenos" data-line="784"></span></a> </span><span id="L-785"><a href="#L-785"><span class="linenos" data-line="785"></span></a> <span class="p">[</span><span class="s2">&quot;=&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kr">function</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> </span><span id="L-786"><a href="#L-786"><span class="linenos" data-line="786"></span></a> <span class="kd">local</span> <span class="n">key</span> <span class="o">=</span> <span class="n">Wikitext</span><span class="p">:</span><span class="n">new</span><span class="p">(</span><span class="n">self</span><span class="p">:</span><span class="n">pop_sublayer</span><span class="p">())</span> </span><span id="L-787"><a href="#L-787"><span class="linenos" data-line="787"></span></a> <span class="n">self</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">].</span><span class="n">key</span> <span class="o">=</span> <span class="n">key</span> </span><span id="L-788"><a href="#L-788"><span class="linenos" data-line="788"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">push_sublayer</span><span class="p">(</span><span class="n">handle_argument</span><span class="p">)</span> </span><span id="L-789"><a href="#L-789"><span class="linenos" data-line="789"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">set_pattern</span><span class="p">(</span><span class="s2">&quot;[</span><span class="se">\n</span><span class="s2">&lt;[{|}]&quot;</span><span class="p">)</span> </span><span id="L-790"><a href="#L-790"><span class="linenos" data-line="790"></span></a> <span class="kr">end</span><span class="p">,</span> </span><span id="L-791"><a href="#L-791"><span class="linenos" data-line="791"></span></a> </span><span id="L-792"><a href="#L-792"><span class="linenos" data-line="792"></span></a> <span class="p">[</span><span class="s2">&quot;[&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">Parser</span><span class="p">.</span><span class="n">wikilink_block</span><span class="p">,</span> </span><span id="L-793"><a href="#L-793"><span class="linenos" data-line="793"></span></a> <span class="p">[</span><span class="s2">&quot;{&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">Parser</span><span class="p">.</span><span class="n">braces</span><span class="p">,</span> </span><span id="L-794"><a href="#L-794"><span class="linenos" data-line="794"></span></a> </span><span id="L-795"><a href="#L-795"><span class="linenos" data-line="795"></span></a> <span class="p">[</span><span class="s2">&quot;|&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kr">function</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> </span><span id="L-796"><a href="#L-796"><span class="linenos" data-line="796"></span></a> <span class="n">emit_argument</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> </span><span id="L-797"><a href="#L-797"><span class="linenos" data-line="797"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">push_sublayer</span><span class="p">(</span><span class="n">handle_argument</span><span class="p">)</span> </span><span id="L-798"><a href="#L-798"><span class="linenos" data-line="798"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">set_pattern</span><span class="p">(</span><span class="s2">&quot;[</span><span class="se">\n</span><span class="s2">&lt;=[{|}]&quot;</span><span class="p">)</span> </span><span id="L-799"><a href="#L-799"><span class="linenos" data-line="799"></span></a> <span class="kr">end</span><span class="p">,</span> </span><span id="L-800"><a href="#L-800"><span class="linenos" data-line="800"></span></a> </span><span id="L-801"><a href="#L-801"><span class="linenos" data-line="801"></span></a> <span class="p">[</span><span class="s2">&quot;}&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kr">function</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> </span><span id="L-802"><a href="#L-802"><span class="linenos" data-line="802"></span></a> <span class="kr">if</span> <span class="n">self</span><span class="p">:</span><span class="n">read</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="o">==</span> <span class="s2">&quot;}&quot;</span> <span class="kr">then</span> </span><span id="L-803"><a href="#L-803"><span class="linenos" data-line="803"></span></a> <span class="n">emit_argument</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> </span><span id="L-804"><a href="#L-804"><span class="linenos" data-line="804"></span></a> <span class="kr">return</span> <span class="n">self</span><span class="p">:</span><span class="n">pop</span><span class="p">()</span> </span><span id="L-805"><a href="#L-805"><span class="linenos" data-line="805"></span></a> <span class="kr">end</span> </span><span id="L-806"><a href="#L-806"><span class="linenos" data-line="806"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">emit</span><span class="p">(</span><span class="s2">&quot;}&quot;</span><span class="p">)</span> </span><span id="L-807"><a href="#L-807"><span class="linenos" data-line="807"></span></a> <span class="kr">end</span><span class="p">,</span> </span><span id="L-808"><a href="#L-808"><span class="linenos" data-line="808"></span></a> </span><span id="L-809"><a href="#L-809"><span class="linenos" data-line="809"></span></a> <span class="p">[</span><span class="s2">&quot;&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">Parser</span><span class="p">.</span><span class="n">fail_route</span><span class="p">,</span> </span><span id="L-810"><a href="#L-810"><span class="linenos" data-line="810"></span></a> <span class="p">[</span><span class="kc">false</span><span class="p">]</span> <span class="o">=</span> <span class="n">Parser</span><span class="p">.</span><span class="n">emit</span> </span><span id="L-811"><a href="#L-811"><span class="linenos" data-line="811"></span></a> <span class="p">})</span> </span><span id="L-812"><a href="#L-812"><span class="linenos" data-line="812"></span></a> <span class="kr">return</span> <span class="n">handle_argument</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="p">...)</span> </span><span id="L-813"><a href="#L-813"><span class="linenos" data-line="813"></span></a> <span class="kr">end</span> </span><span id="L-814"><a href="#L-814"><span class="linenos" data-line="814"></span></a> </span><span id="L-815"><a href="#L-815"><span class="linenos" data-line="815"></span></a> <span class="kr">function</span> <span class="nc">Parser</span><span class="p">:</span><span class="nf">template_or_parameter</span><span class="p">()</span> </span><span id="L-816"><a href="#L-816"><span class="linenos" data-line="816"></span></a> <span class="kd">local</span> <span class="n">text</span><span class="p">,</span> <span class="n">head</span><span class="p">,</span> <span class="n">node_to_emit</span><span class="p">,</span> <span class="n">failed</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">text</span><span class="p">,</span> <span class="n">self</span><span class="p">.</span><span class="n">head</span> </span><span id="L-817"><a href="#L-817"><span class="linenos" data-line="817"></span></a> <span class="c1">-- Comments/tags interrupt the brace count.</span> </span><span id="L-818"><a href="#L-818"><span class="linenos" data-line="818"></span></a> <span class="kd">local</span> <span class="n">braces</span> <span class="o">=</span> <span class="n">match</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="s2">&quot;^{+()&quot;</span><span class="p">,</span> <span class="n">head</span><span class="p">)</span> <span class="o">-</span> <span class="n">head</span> </span><span id="L-819"><a href="#L-819"><span class="linenos" data-line="819"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">advance</span><span class="p">(</span><span class="n">braces</span><span class="p">)</span> </span><span id="L-820"><a href="#L-820"><span class="linenos" data-line="820"></span></a> <span class="kr">while</span> <span class="kc">true</span> <span class="kr">do</span> </span><span id="L-821"><a href="#L-821"><span class="linenos" data-line="821"></span></a> <span class="kd">local</span> <span class="n">success</span><span class="p">,</span> <span class="n">node</span> <span class="o">=</span> <span class="n">self</span><span class="p">:</span><span class="n">try</span><span class="p">(</span><span class="n">do_template_or_parameter</span><span class="p">,</span> <span class="n">node_to_emit</span><span class="p">)</span> </span><span id="L-822"><a href="#L-822"><span class="linenos" data-line="822"></span></a> <span class="c1">-- Fail means no &quot;}}&quot; or &quot;}}}&quot; was found, so emit any remaining</span> </span><span id="L-823"><a href="#L-823"><span class="linenos" data-line="823"></span></a> <span class="c1">-- unmatched opening braces before any templates/parameters that</span> </span><span id="L-824"><a href="#L-824"><span class="linenos" data-line="824"></span></a> <span class="c1">-- were found.</span> </span><span id="L-825"><a href="#L-825"><span class="linenos" data-line="825"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">success</span> <span class="kr">then</span> </span><span id="L-826"><a href="#L-826"><span class="linenos" data-line="826"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">emit</span><span class="p">(</span><span class="n">rep</span><span class="p">(</span><span class="s2">&quot;{&quot;</span><span class="p">,</span> <span class="n">braces</span><span class="p">))</span> </span><span id="L-827"><a href="#L-827"><span class="linenos" data-line="827"></span></a> <span class="n">failed</span> <span class="o">=</span> <span class="kc">true</span> </span><span id="L-828"><a href="#L-828"><span class="linenos" data-line="828"></span></a> <span class="kr">break</span> </span><span id="L-829"><a href="#L-829"><span class="linenos" data-line="829"></span></a> <span class="c1">-- If there are 3+ opening and closing braces, it&#39;s a parameter.</span> </span><span id="L-830"><a href="#L-830"><span class="linenos" data-line="830"></span></a> <span class="kr">elseif</span> <span class="n">braces</span> <span class="o">&gt;=</span> <span class="mi">3</span> <span class="ow">and</span> <span class="n">self</span><span class="p">:</span><span class="n">read</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span> <span class="o">==</span> <span class="s2">&quot;}&quot;</span> <span class="kr">then</span> </span><span id="L-831"><a href="#L-831"><span class="linenos" data-line="831"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">advance</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span> </span><span id="L-832"><a href="#L-832"><span class="linenos" data-line="832"></span></a> <span class="n">braces</span> <span class="o">=</span> <span class="n">braces</span> <span class="o">-</span> <span class="mi">3</span> </span><span id="L-833"><a href="#L-833"><span class="linenos" data-line="833"></span></a> <span class="n">node</span> <span class="o">=</span> <span class="n">Parameter</span><span class="p">:</span><span class="n">new</span><span class="p">(</span><span class="n">node</span><span class="p">)</span> </span><span id="L-834"><a href="#L-834"><span class="linenos" data-line="834"></span></a> <span class="c1">-- Otherwise, it&#39;s a template.</span> </span><span id="L-835"><a href="#L-835"><span class="linenos" data-line="835"></span></a> <span class="kr">else</span> </span><span id="L-836"><a href="#L-836"><span class="linenos" data-line="836"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">advance</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span> </span><span id="L-837"><a href="#L-837"><span class="linenos" data-line="837"></span></a> <span class="n">braces</span> <span class="o">=</span> <span class="n">braces</span> <span class="o">-</span> <span class="mi">2</span> </span><span id="L-838"><a href="#L-838"><span class="linenos" data-line="838"></span></a> <span class="n">node</span> <span class="o">=</span> <span class="n">Template</span><span class="p">:</span><span class="n">new</span><span class="p">(</span><span class="n">node</span><span class="p">)</span> </span><span id="L-839"><a href="#L-839"><span class="linenos" data-line="839"></span></a> <span class="kr">end</span> </span><span id="L-840"><a href="#L-840"><span class="linenos" data-line="840"></span></a> <span class="kd">local</span> <span class="n">index</span> <span class="o">=</span> <span class="n">head</span> <span class="o">+</span> <span class="n">braces</span> </span><span id="L-841"><a href="#L-841"><span class="linenos" data-line="841"></span></a> <span class="n">node</span><span class="p">.</span><span class="n">index</span> <span class="o">=</span> <span class="n">index</span> </span><span id="L-842"><a href="#L-842"><span class="linenos" data-line="842"></span></a> <span class="n">node</span><span class="p">.</span><span class="n">raw</span> <span class="o">=</span> <span class="n">sub</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="n">index</span><span class="p">,</span> <span class="n">self</span><span class="p">.</span><span class="n">head</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> </span><span id="L-843"><a href="#L-843"><span class="linenos" data-line="843"></span></a> <span class="n">node_to_emit</span> <span class="o">=</span> <span class="n">node</span> </span><span id="L-844"><a href="#L-844"><span class="linenos" data-line="844"></span></a> <span class="c1">-- Terminate once not enough braces remain for further matches.</span> </span><span id="L-845"><a href="#L-845"><span class="linenos" data-line="845"></span></a> <span class="kr">if</span> <span class="n">braces</span> <span class="o">==</span> <span class="mi">0</span> <span class="kr">then</span> </span><span id="L-846"><a href="#L-846"><span class="linenos" data-line="846"></span></a> <span class="kr">break</span> </span><span id="L-847"><a href="#L-847"><span class="linenos" data-line="847"></span></a> <span class="c1">-- Emit any stray opening brace before any matched nodes.</span> </span><span id="L-848"><a href="#L-848"><span class="linenos" data-line="848"></span></a> <span class="kr">elseif</span> <span class="n">braces</span> <span class="o">==</span> <span class="mi">1</span> <span class="kr">then</span> </span><span id="L-849"><a href="#L-849"><span class="linenos" data-line="849"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">emit</span><span class="p">(</span><span class="s2">&quot;{&quot;</span><span class="p">)</span> </span><span id="L-850"><a href="#L-850"><span class="linenos" data-line="850"></span></a> <span class="kr">break</span> </span><span id="L-851"><a href="#L-851"><span class="linenos" data-line="851"></span></a> <span class="kr">end</span> </span><span id="L-852"><a href="#L-852"><span class="linenos" data-line="852"></span></a> <span class="kr">end</span> </span><span id="L-853"><a href="#L-853"><span class="linenos" data-line="853"></span></a> <span class="kr">if</span> <span class="n">node_to_emit</span> <span class="kr">then</span> </span><span id="L-854"><a href="#L-854"><span class="linenos" data-line="854"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">emit</span><span class="p">(</span><span class="n">node_to_emit</span><span class="p">)</span> </span><span id="L-855"><a href="#L-855"><span class="linenos" data-line="855"></span></a> <span class="kr">end</span> </span><span id="L-856"><a href="#L-856"><span class="linenos" data-line="856"></span></a> <span class="kr">return</span> <span class="n">braces</span><span class="p">,</span> <span class="n">failed</span> </span><span id="L-857"><a href="#L-857"><span class="linenos" data-line="857"></span></a> <span class="kr">end</span> </span><span id="L-858"><a href="#L-858"><span class="linenos" data-line="858"></span></a><span class="kr">end</span> </span><span id="L-859"><a href="#L-859"><span class="linenos" data-line="859"></span></a> </span><span id="L-860"><a href="#L-860"><span class="linenos" data-line="860"></span></a><span class="c1">-- Tag.</span> </span><span id="L-861"><a href="#L-861"><span class="linenos" data-line="861"></span></a><span class="kr">do</span> </span><span id="L-862"><a href="#L-862"><span class="linenos" data-line="862"></span></a> <span class="kd">local</span> <span class="n">end_tags</span> </span><span id="L-863"><a href="#L-863"><span class="linenos" data-line="863"></span></a> </span><span id="L-864"><a href="#L-864"><span class="linenos" data-line="864"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">get_end_tags</span><span class="p">()</span> </span><span id="L-865"><a href="#L-865"><span class="linenos" data-line="865"></span></a> <span class="n">end_tags</span><span class="p">,</span> <span class="n">get_end_tags</span> <span class="o">=</span> <span class="p">(</span><span class="n">data</span> <span class="ow">or</span> <span class="n">get_data</span><span class="p">()).</span><span class="n">end_tags</span><span class="p">,</span> <span class="kc">nil</span> </span><span id="L-866"><a href="#L-866"><span class="linenos" data-line="866"></span></a> <span class="kr">return</span> <span class="n">end_tags</span> </span><span id="L-867"><a href="#L-867"><span class="linenos" data-line="867"></span></a> <span class="kr">end</span> </span><span id="L-868"><a href="#L-868"><span class="linenos" data-line="868"></span></a> </span><span id="L-869"><a href="#L-869"><span class="linenos" data-line="869"></span></a> <span class="c1">-- Handlers.</span> </span><span id="L-870"><a href="#L-870"><span class="linenos" data-line="870"></span></a> <span class="kd">local</span> <span class="n">handle_start</span> </span><span id="L-871"><a href="#L-871"><span class="linenos" data-line="871"></span></a> <span class="kd">local</span> <span class="n">handle_tag</span> </span><span id="L-872"><a href="#L-872"><span class="linenos" data-line="872"></span></a> </span><span id="L-873"><a href="#L-873"><span class="linenos" data-line="873"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">do_tag</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> </span><span id="L-874"><a href="#L-874"><span class="linenos" data-line="874"></span></a> <span class="kd">local</span> <span class="n">layer</span> <span class="o">=</span> <span class="n">self</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> </span><span id="L-875"><a href="#L-875"><span class="linenos" data-line="875"></span></a> <span class="n">layer</span><span class="p">.</span><span class="n">handler</span><span class="p">,</span> <span class="n">layer</span><span class="p">.</span><span class="n">index</span> <span class="o">=</span> <span class="n">handle_start</span><span class="p">,</span> <span class="n">self</span><span class="p">.</span><span class="n">head</span> </span><span id="L-876"><a href="#L-876"><span class="linenos" data-line="876"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">set_pattern</span><span class="p">(</span><span class="s2">&quot;[%s/&gt;]&quot;</span><span class="p">)</span> </span><span id="L-877"><a href="#L-877"><span class="linenos" data-line="877"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">advance</span><span class="p">()</span> </span><span id="L-878"><a href="#L-878"><span class="linenos" data-line="878"></span></a> <span class="kr">end</span> </span><span id="L-879"><a href="#L-879"><span class="linenos" data-line="879"></span></a> </span><span id="L-880"><a href="#L-880"><span class="linenos" data-line="880"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">is_ignored_tag</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">this</span><span class="p">)</span> </span><span id="L-881"><a href="#L-881"><span class="linenos" data-line="881"></span></a> <span class="kr">if</span> <span class="n">self</span><span class="p">.</span><span class="n">transcluded</span> <span class="kr">then</span> </span><span id="L-882"><a href="#L-882"><span class="linenos" data-line="882"></span></a> <span class="kr">return</span> <span class="n">this</span> <span class="o">==</span> <span class="s2">&quot;includeonly&quot;</span> </span><span id="L-883"><a href="#L-883"><span class="linenos" data-line="883"></span></a> <span class="kr">end</span> </span><span id="L-884"><a href="#L-884"><span class="linenos" data-line="884"></span></a> <span class="kr">return</span> <span class="n">this</span> <span class="o">==</span> <span class="s2">&quot;noinclude&quot;</span> <span class="ow">or</span> <span class="n">this</span> <span class="o">==</span> <span class="s2">&quot;onlyinclude&quot;</span> </span><span id="L-885"><a href="#L-885"><span class="linenos" data-line="885"></span></a> <span class="kr">end</span> </span><span id="L-886"><a href="#L-886"><span class="linenos" data-line="886"></span></a> </span><span id="L-887"><a href="#L-887"><span class="linenos" data-line="887"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">ignored_tag</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">text</span><span class="p">,</span> <span class="n">head</span><span class="p">)</span> </span><span id="L-888"><a href="#L-888"><span class="linenos" data-line="888"></span></a> <span class="kd">local</span> <span class="n">loc</span> <span class="o">=</span> <span class="n">find</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="s2">&quot;&gt;&quot;</span><span class="p">,</span> <span class="n">head</span><span class="p">,</span> <span class="kc">true</span><span class="p">)</span> </span><span id="L-889"><a href="#L-889"><span class="linenos" data-line="889"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">loc</span> <span class="kr">then</span> </span><span id="L-890"><a href="#L-890"><span class="linenos" data-line="890"></span></a> <span class="kr">return</span> <span class="n">self</span><span class="p">:</span><span class="n">fail_route</span><span class="p">()</span> </span><span id="L-891"><a href="#L-891"><span class="linenos" data-line="891"></span></a> <span class="kr">end</span> </span><span id="L-892"><a href="#L-892"><span class="linenos" data-line="892"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">jump</span><span class="p">(</span><span class="n">loc</span><span class="p">)</span> </span><span id="L-893"><a href="#L-893"><span class="linenos" data-line="893"></span></a> <span class="kd">local</span> <span class="n">tag</span> <span class="o">=</span> <span class="n">self</span><span class="p">:</span><span class="n">pop</span><span class="p">()</span> </span><span id="L-894"><a href="#L-894"><span class="linenos" data-line="894"></span></a> <span class="n">tag</span><span class="p">.</span><span class="n">ignored</span> <span class="o">=</span> <span class="kc">true</span> </span><span id="L-895"><a href="#L-895"><span class="linenos" data-line="895"></span></a> <span class="kr">return</span> <span class="n">tag</span> </span><span id="L-896"><a href="#L-896"><span class="linenos" data-line="896"></span></a> <span class="kr">end</span> </span><span id="L-897"><a href="#L-897"><span class="linenos" data-line="897"></span></a> </span><span id="L-898"><a href="#L-898"><span class="linenos" data-line="898"></span></a> <span class="kr">function</span> <span class="nf">handle_start</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">this</span><span class="p">)</span> </span><span id="L-899"><a href="#L-899"><span class="linenos" data-line="899"></span></a> <span class="kr">if</span> <span class="n">this</span> <span class="o">==</span> <span class="s2">&quot;/&quot;</span> <span class="kr">then</span> </span><span id="L-900"><a href="#L-900"><span class="linenos" data-line="900"></span></a> <span class="kd">local</span> <span class="n">text</span><span class="p">,</span> <span class="n">head</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">text</span><span class="p">,</span> <span class="n">self</span><span class="p">.</span><span class="n">head</span> <span class="o">+</span> <span class="mi">1</span> </span><span id="L-901"><a href="#L-901"><span class="linenos" data-line="901"></span></a> <span class="kd">local</span> <span class="n">this</span> <span class="o">=</span> <span class="n">match</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="s2">&quot;^[^%s/&gt;]+&quot;</span><span class="p">,</span> <span class="n">head</span><span class="p">)</span> </span><span id="L-902"><a href="#L-902"><span class="linenos" data-line="902"></span></a> <span class="kr">if</span> <span class="n">this</span> <span class="ow">and</span> <span class="n">is_ignored_tag</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">lower</span><span class="p">(</span><span class="n">this</span><span class="p">))</span> <span class="kr">then</span> </span><span id="L-903"><a href="#L-903"><span class="linenos" data-line="903"></span></a> <span class="n">head</span> <span class="o">=</span> <span class="n">head</span> <span class="o">+</span> <span class="o">#</span><span class="n">this</span> </span><span id="L-904"><a href="#L-904"><span class="linenos" data-line="904"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">match</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="s2">&quot;^/[^&gt;]&quot;</span><span class="p">,</span> <span class="n">head</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-905"><a href="#L-905"><span class="linenos" data-line="905"></span></a> <span class="kr">return</span> <span class="n">ignored_tag</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">text</span><span class="p">,</span> <span class="n">head</span><span class="p">)</span> </span><span id="L-906"><a href="#L-906"><span class="linenos" data-line="906"></span></a> <span class="kr">end</span> </span><span id="L-907"><a href="#L-907"><span class="linenos" data-line="907"></span></a> <span class="kr">end</span> </span><span id="L-908"><a href="#L-908"><span class="linenos" data-line="908"></span></a> <span class="kr">return</span> <span class="n">self</span><span class="p">:</span><span class="n">fail_route</span><span class="p">()</span> </span><span id="L-909"><a href="#L-909"><span class="linenos" data-line="909"></span></a> <span class="kr">elseif</span> <span class="n">this</span> <span class="o">==</span> <span class="s2">&quot;&quot;</span> <span class="kr">then</span> </span><span id="L-910"><a href="#L-910"><span class="linenos" data-line="910"></span></a> <span class="kr">return</span> <span class="n">self</span><span class="p">:</span><span class="n">fail_route</span><span class="p">()</span> </span><span id="L-911"><a href="#L-911"><span class="linenos" data-line="911"></span></a> <span class="kr">end</span> </span><span id="L-912"><a href="#L-912"><span class="linenos" data-line="912"></span></a> <span class="c1">-- Tags are only case-insensitive with ASCII characters.</span> </span><span id="L-913"><a href="#L-913"><span class="linenos" data-line="913"></span></a> <span class="kd">local</span> <span class="n">raw_name</span> <span class="o">=</span> <span class="n">this</span> </span><span id="L-914"><a href="#L-914"><span class="linenos" data-line="914"></span></a> <span class="n">this</span> <span class="o">=</span> <span class="n">lower</span><span class="p">(</span><span class="n">this</span><span class="p">)</span> </span><span id="L-915"><a href="#L-915"><span class="linenos" data-line="915"></span></a> <span class="kd">local</span> <span class="n">end_tag_pattern</span> <span class="o">=</span> <span class="p">(</span><span class="n">end_tags</span> <span class="ow">or</span> <span class="n">get_end_tags</span><span class="p">())[</span><span class="n">this</span><span class="p">]</span> </span><span id="L-916"><a href="#L-916"><span class="linenos" data-line="916"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">end_tag_pattern</span> <span class="kr">then</span> <span class="c1">-- Validity check.</span> </span><span id="L-917"><a href="#L-917"><span class="linenos" data-line="917"></span></a> <span class="kr">return</span> <span class="n">self</span><span class="p">:</span><span class="n">fail_route</span><span class="p">()</span> </span><span id="L-918"><a href="#L-918"><span class="linenos" data-line="918"></span></a> <span class="kr">end</span> </span><span id="L-919"><a href="#L-919"><span class="linenos" data-line="919"></span></a> <span class="kd">local</span> <span class="n">layer</span> <span class="o">=</span> <span class="n">self</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> </span><span id="L-920"><a href="#L-920"><span class="linenos" data-line="920"></span></a> <span class="kd">local</span> <span class="n">text</span><span class="p">,</span> <span class="n">head</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">text</span><span class="p">,</span> <span class="n">self</span><span class="p">.</span><span class="n">head</span> <span class="o">+</span> <span class="n">layer</span><span class="p">.</span><span class="n">step</span> </span><span id="L-921"><a href="#L-921"><span class="linenos" data-line="921"></span></a> <span class="kr">if</span> <span class="n">match</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="s2">&quot;^/[^&gt;]&quot;</span><span class="p">,</span> <span class="n">head</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-922"><a href="#L-922"><span class="linenos" data-line="922"></span></a> <span class="kr">return</span> <span class="n">self</span><span class="p">:</span><span class="n">fail_route</span><span class="p">()</span> </span><span id="L-923"><a href="#L-923"><span class="linenos" data-line="923"></span></a> <span class="kr">elseif</span> <span class="n">is_ignored_tag</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">this</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-924"><a href="#L-924"><span class="linenos" data-line="924"></span></a> <span class="kr">return</span> <span class="n">ignored_tag</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">text</span><span class="p">,</span> <span class="n">head</span><span class="p">)</span> </span><span id="L-925"><a href="#L-925"><span class="linenos" data-line="925"></span></a> <span class="c1">-- If an onlyinclude tag is not ignored (and cannot be active since it</span> </span><span id="L-926"><a href="#L-926"><span class="linenos" data-line="926"></span></a> <span class="c1">-- would have triggered special handling earlier), it must be plaintext.</span> </span><span id="L-927"><a href="#L-927"><span class="linenos" data-line="927"></span></a> <span class="kr">elseif</span> <span class="n">this</span> <span class="o">==</span> <span class="s2">&quot;onlyinclude&quot;</span> <span class="kr">then</span> </span><span id="L-928"><a href="#L-928"><span class="linenos" data-line="928"></span></a> <span class="kr">return</span> <span class="n">self</span><span class="p">:</span><span class="n">fail_route</span><span class="p">()</span> </span><span id="L-929"><a href="#L-929"><span class="linenos" data-line="929"></span></a> <span class="kr">elseif</span> <span class="n">this</span> <span class="o">==</span> <span class="s2">&quot;noinclude&quot;</span> <span class="ow">or</span> <span class="n">this</span> <span class="o">==</span> <span class="s2">&quot;includeonly&quot;</span> <span class="kr">then</span> </span><span id="L-930"><a href="#L-930"><span class="linenos" data-line="930"></span></a> <span class="n">layer</span><span class="p">.</span><span class="n">ignored</span> <span class="o">=</span> <span class="kc">true</span> <span class="c1">-- Ignored block.</span> </span><span id="L-931"><a href="#L-931"><span class="linenos" data-line="931"></span></a> <span class="n">layer</span><span class="p">.</span><span class="n">raw_name</span> <span class="o">=</span> <span class="n">raw_name</span> </span><span id="L-932"><a href="#L-932"><span class="linenos" data-line="932"></span></a> <span class="kr">end</span> </span><span id="L-933"><a href="#L-933"><span class="linenos" data-line="933"></span></a> <span class="n">layer</span><span class="p">.</span><span class="n">name</span><span class="p">,</span> <span class="n">layer</span><span class="p">.</span><span class="n">handler</span><span class="p">,</span> <span class="n">layer</span><span class="p">.</span><span class="n">end_tag_pattern</span> <span class="o">=</span> <span class="n">this</span><span class="p">,</span> <span class="n">handle_tag</span><span class="p">,</span> <span class="n">end_tag_pattern</span> </span><span id="L-934"><a href="#L-934"><span class="linenos" data-line="934"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">set_pattern</span><span class="p">(</span><span class="s2">&quot;&gt;&quot;</span><span class="p">)</span> </span><span id="L-935"><a href="#L-935"><span class="linenos" data-line="935"></span></a> <span class="kr">end</span> </span><span id="L-936"><a href="#L-936"><span class="linenos" data-line="936"></span></a> </span><span id="L-937"><a href="#L-937"><span class="linenos" data-line="937"></span></a> <span class="kr">function</span> <span class="nf">handle_tag</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">this</span><span class="p">)</span> </span><span id="L-938"><a href="#L-938"><span class="linenos" data-line="938"></span></a> <span class="kr">if</span> <span class="n">this</span> <span class="o">==</span> <span class="s2">&quot;&quot;</span> <span class="kr">then</span> </span><span id="L-939"><a href="#L-939"><span class="linenos" data-line="939"></span></a> <span class="kr">return</span> <span class="n">self</span><span class="p">:</span><span class="n">fail_route</span><span class="p">()</span> </span><span id="L-940"><a href="#L-940"><span class="linenos" data-line="940"></span></a> <span class="kr">elseif</span> <span class="n">this</span> <span class="o">~=</span> <span class="s2">&quot;&gt;&quot;</span> <span class="kr">then</span> </span><span id="L-941"><a href="#L-941"><span class="linenos" data-line="941"></span></a> <span class="n">self</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">].</span><span class="n">attributes</span> <span class="o">=</span> <span class="n">this</span> </span><span id="L-942"><a href="#L-942"><span class="linenos" data-line="942"></span></a> <span class="kr">return</span> </span><span id="L-943"><a href="#L-943"><span class="linenos" data-line="943"></span></a> <span class="kr">elseif</span> <span class="n">self</span><span class="p">:</span><span class="n">read</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="o">==</span> <span class="s2">&quot;/&quot;</span> <span class="kr">then</span> </span><span id="L-944"><a href="#L-944"><span class="linenos" data-line="944"></span></a> <span class="n">self</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">].</span><span class="n">self_closing</span> <span class="o">=</span> <span class="kc">true</span> </span><span id="L-945"><a href="#L-945"><span class="linenos" data-line="945"></span></a> <span class="kr">return</span> <span class="n">self</span><span class="p">:</span><span class="n">pop</span><span class="p">()</span> </span><span id="L-946"><a href="#L-946"><span class="linenos" data-line="946"></span></a> <span class="kr">end</span> </span><span id="L-947"><a href="#L-947"><span class="linenos" data-line="947"></span></a> <span class="kd">local</span> <span class="n">text</span><span class="p">,</span> <span class="n">head</span><span class="p">,</span> <span class="n">layer</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">text</span><span class="p">,</span> <span class="n">self</span><span class="p">.</span><span class="n">head</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">self</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> </span><span id="L-948"><a href="#L-948"><span class="linenos" data-line="948"></span></a> <span class="kd">local</span> <span class="n">loc1</span><span class="p">,</span> <span class="n">loc2</span> <span class="o">=</span> <span class="n">find</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="n">layer</span><span class="p">.</span><span class="n">end_tag_pattern</span><span class="p">,</span> <span class="n">head</span><span class="p">)</span> </span><span id="L-949"><a href="#L-949"><span class="linenos" data-line="949"></span></a> <span class="kr">if</span> <span class="n">loc1</span> <span class="kr">then</span> </span><span id="L-950"><a href="#L-950"><span class="linenos" data-line="950"></span></a> <span class="kr">if</span> <span class="n">loc1</span> <span class="o">&gt;</span> <span class="n">head</span> <span class="kr">then</span> </span><span id="L-951"><a href="#L-951"><span class="linenos" data-line="951"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">emit</span><span class="p">(</span><span class="n">sub</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="n">head</span><span class="p">,</span> <span class="n">loc1</span> <span class="o">-</span> <span class="mi">1</span><span class="p">))</span> </span><span id="L-952"><a href="#L-952"><span class="linenos" data-line="952"></span></a> <span class="kr">end</span> </span><span id="L-953"><a href="#L-953"><span class="linenos" data-line="953"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">jump</span><span class="p">(</span><span class="n">loc2</span><span class="p">)</span> </span><span id="L-954"><a href="#L-954"><span class="linenos" data-line="954"></span></a> <span class="kr">return</span> <span class="n">self</span><span class="p">:</span><span class="n">pop</span><span class="p">()</span> </span><span id="L-955"><a href="#L-955"><span class="linenos" data-line="955"></span></a> <span class="c1">-- noinclude and includeonly will tolerate having no closing tag, but</span> </span><span id="L-956"><a href="#L-956"><span class="linenos" data-line="956"></span></a> <span class="c1">-- only if given in lowercase. This is due to a preprocessor bug, as</span> </span><span id="L-957"><a href="#L-957"><span class="linenos" data-line="957"></span></a> <span class="c1">-- it uses a regex with the /i (case-insensitive) flag to check for</span> </span><span id="L-958"><a href="#L-958"><span class="linenos" data-line="958"></span></a> <span class="c1">-- end tags, but a simple array lookup with lowercase tag names when</span> </span><span id="L-959"><a href="#L-959"><span class="linenos" data-line="959"></span></a> <span class="c1">-- looking up which tags should tolerate no closing tag (exact match</span> </span><span id="L-960"><a href="#L-960"><span class="linenos" data-line="960"></span></a> <span class="c1">-- only, so case-sensitive).</span> </span><span id="L-961"><a href="#L-961"><span class="linenos" data-line="961"></span></a> <span class="kr">elseif</span> <span class="n">layer</span><span class="p">.</span><span class="n">ignored</span> <span class="kr">then</span> </span><span id="L-962"><a href="#L-962"><span class="linenos" data-line="962"></span></a> <span class="kd">local</span> <span class="n">raw_name</span> <span class="o">=</span> <span class="n">layer</span><span class="p">.</span><span class="n">raw_name</span> </span><span id="L-963"><a href="#L-963"><span class="linenos" data-line="963"></span></a> <span class="kr">if</span> <span class="n">raw_name</span> <span class="o">==</span> <span class="s2">&quot;noinclude&quot;</span> <span class="ow">or</span> <span class="n">raw_name</span> <span class="o">==</span> <span class="s2">&quot;includeonly&quot;</span> <span class="kr">then</span> </span><span id="L-964"><a href="#L-964"><span class="linenos" data-line="964"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">jump</span><span class="p">(</span><span class="o">#</span><span class="n">text</span><span class="p">)</span> </span><span id="L-965"><a href="#L-965"><span class="linenos" data-line="965"></span></a> <span class="kr">return</span> <span class="n">self</span><span class="p">:</span><span class="n">pop</span><span class="p">()</span> </span><span id="L-966"><a href="#L-966"><span class="linenos" data-line="966"></span></a> <span class="kr">end</span> </span><span id="L-967"><a href="#L-967"><span class="linenos" data-line="967"></span></a> <span class="kr">end</span> </span><span id="L-968"><a href="#L-968"><span class="linenos" data-line="968"></span></a> <span class="kr">return</span> <span class="n">self</span><span class="p">:</span><span class="n">fail_route</span><span class="p">()</span> </span><span id="L-969"><a href="#L-969"><span class="linenos" data-line="969"></span></a> <span class="kr">end</span> </span><span id="L-970"><a href="#L-970"><span class="linenos" data-line="970"></span></a> </span><span id="L-971"><a href="#L-971"><span class="linenos" data-line="971"></span></a> <span class="kr">function</span> <span class="nc">Parser</span><span class="p">:</span><span class="nf">tag</span><span class="p">()</span> </span><span id="L-972"><a href="#L-972"><span class="linenos" data-line="972"></span></a> <span class="c1">-- HTML comment.</span> </span><span id="L-973"><a href="#L-973"><span class="linenos" data-line="973"></span></a> <span class="kr">if</span> <span class="n">self</span><span class="p">:</span><span class="n">read</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span> <span class="o">==</span> <span class="s2">&quot;!--&quot;</span> <span class="kr">then</span> </span><span id="L-974"><a href="#L-974"><span class="linenos" data-line="974"></span></a> <span class="kd">local</span> <span class="n">text</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">text</span> </span><span id="L-975"><a href="#L-975"><span class="linenos" data-line="975"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">jump</span><span class="p">(</span><span class="nb">select</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="n">find</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="s2">&quot;--&gt;&quot;</span><span class="p">,</span> <span class="n">self</span><span class="p">.</span><span class="n">head</span> <span class="o">+</span> <span class="mi">4</span><span class="p">,</span> <span class="kc">true</span><span class="p">))</span> <span class="ow">or</span> <span class="o">#</span><span class="n">text</span><span class="p">)</span> </span><span id="L-976"><a href="#L-976"><span class="linenos" data-line="976"></span></a> <span class="c1">-- onlyinclude tags (which must be lowercase with no whitespace).</span> </span><span id="L-977"><a href="#L-977"><span class="linenos" data-line="977"></span></a> <span class="kr">elseif</span> <span class="n">self</span><span class="p">.</span><span class="n">onlyinclude</span> <span class="ow">and</span> <span class="n">self</span><span class="p">:</span><span class="n">read</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">13</span><span class="p">)</span> <span class="o">==</span> <span class="s2">&quot;/onlyinclude&gt;&quot;</span> <span class="kr">then</span> </span><span id="L-978"><a href="#L-978"><span class="linenos" data-line="978"></span></a> <span class="kd">local</span> <span class="n">text</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">text</span> </span><span id="L-979"><a href="#L-979"><span class="linenos" data-line="979"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">jump</span><span class="p">(</span><span class="nb">select</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="n">find</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="s2">&quot;&lt;onlyinclude&gt;&quot;</span><span class="p">,</span> <span class="n">self</span><span class="p">.</span><span class="n">head</span> <span class="o">+</span> <span class="mi">14</span><span class="p">,</span> <span class="kc">true</span><span class="p">))</span> <span class="ow">or</span> <span class="o">#</span><span class="n">text</span><span class="p">)</span> </span><span id="L-980"><a href="#L-980"><span class="linenos" data-line="980"></span></a> <span class="kr">else</span> </span><span id="L-981"><a href="#L-981"><span class="linenos" data-line="981"></span></a> <span class="kd">local</span> <span class="n">success</span><span class="p">,</span> <span class="n">tag</span> <span class="o">=</span> <span class="n">self</span><span class="p">:</span><span class="n">try</span><span class="p">(</span><span class="n">do_tag</span><span class="p">)</span> </span><span id="L-982"><a href="#L-982"><span class="linenos" data-line="982"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">success</span> <span class="kr">then</span> </span><span id="L-983"><a href="#L-983"><span class="linenos" data-line="983"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">emit</span><span class="p">(</span><span class="s2">&quot;&lt;&quot;</span><span class="p">)</span> </span><span id="L-984"><a href="#L-984"><span class="linenos" data-line="984"></span></a> <span class="kr">elseif</span> <span class="ow">not</span> <span class="n">tag</span><span class="p">.</span><span class="n">ignored</span> <span class="kr">then</span> </span><span id="L-985"><a href="#L-985"><span class="linenos" data-line="985"></span></a> <span class="n">tag</span><span class="p">.</span><span class="n">end_tag_pattern</span> <span class="o">=</span> <span class="kc">nil</span> </span><span id="L-986"><a href="#L-986"><span class="linenos" data-line="986"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">emit</span><span class="p">(</span><span class="n">Tag</span><span class="p">:</span><span class="n">new</span><span class="p">(</span><span class="n">tag</span><span class="p">))</span> </span><span id="L-987"><a href="#L-987"><span class="linenos" data-line="987"></span></a> <span class="kr">end</span> </span><span id="L-988"><a href="#L-988"><span class="linenos" data-line="988"></span></a> <span class="kr">end</span> </span><span id="L-989"><a href="#L-989"><span class="linenos" data-line="989"></span></a> <span class="kr">end</span> </span><span id="L-990"><a href="#L-990"><span class="linenos" data-line="990"></span></a><span class="kr">end</span> </span><span id="L-991"><a href="#L-991"><span class="linenos" data-line="991"></span></a> </span><span id="L-992"><a href="#L-992"><span class="linenos" data-line="992"></span></a><span class="c1">-- Heading.</span> </span><span id="L-993"><a href="#L-993"><span class="linenos" data-line="993"></span></a><span class="c1">-- The preparser assigns each heading a number, which is used for things like section edit links. The preparser will only do this for heading blocks which aren&#39;t nested inside templates, parameters and parser tags. In some cases (e.g. when template blocks contain untrimmed newlines), a preparsed heading may not be treated as a heading in the final output. That does not affect the preparser, however, which will always count sections based on the preparser heading count, since it can&#39;t know what a template&#39;s final output will be.</span> </span><span id="L-994"><a href="#L-994"><span class="linenos" data-line="994"></span></a><span class="kr">do</span> </span><span id="L-995"><a href="#L-995"><span class="linenos" data-line="995"></span></a> <span class="c1">-- Handlers.</span> </span><span id="L-996"><a href="#L-996"><span class="linenos" data-line="996"></span></a> <span class="kd">local</span> <span class="n">handle_start</span> </span><span id="L-997"><a href="#L-997"><span class="linenos" data-line="997"></span></a> <span class="kd">local</span> <span class="n">handle_body</span> </span><span id="L-998"><a href="#L-998"><span class="linenos" data-line="998"></span></a> <span class="kd">local</span> <span class="n">handle_possible_end</span> </span><span id="L-999"><a href="#L-999"><span class="linenos" data-line="999"></span></a> </span><span id="L-1000"><a href="#L-1000"><span class="linenos" data-line="1000"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">do_heading</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> </span><span id="L-1001"><a href="#L-1001"><span class="linenos" data-line="1001"></span></a> <span class="kd">local</span> <span class="n">layer</span><span class="p">,</span> <span class="n">head</span> <span class="o">=</span> <span class="n">self</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="n">self</span><span class="p">.</span><span class="n">head</span> </span><span id="L-1002"><a href="#L-1002"><span class="linenos" data-line="1002"></span></a> <span class="n">layer</span><span class="p">.</span><span class="n">handler</span><span class="p">,</span> <span class="n">layer</span><span class="p">.</span><span class="n">index</span> <span class="o">=</span> <span class="n">handle_start</span><span class="p">,</span> <span class="n">head</span> </span><span id="L-1003"><a href="#L-1003"><span class="linenos" data-line="1003"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">set_pattern</span><span class="p">(</span><span class="s2">&quot;[</span><span class="se">\t\n</span><span class="s2"> ]&quot;</span><span class="p">)</span> </span><span id="L-1004"><a href="#L-1004"><span class="linenos" data-line="1004"></span></a> <span class="c1">-- Comments/tags interrupt the equals count.</span> </span><span id="L-1005"><a href="#L-1005"><span class="linenos" data-line="1005"></span></a> <span class="kd">local</span> <span class="n">eq</span> <span class="o">=</span> <span class="n">match</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">text</span><span class="p">,</span> <span class="s2">&quot;^=+()&quot;</span><span class="p">,</span> <span class="n">head</span><span class="p">)</span> <span class="o">-</span> <span class="n">head</span> </span><span id="L-1006"><a href="#L-1006"><span class="linenos" data-line="1006"></span></a> <span class="n">layer</span><span class="p">.</span><span class="n">level</span> <span class="o">=</span> <span class="n">eq</span> </span><span id="L-1007"><a href="#L-1007"><span class="linenos" data-line="1007"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">advance</span><span class="p">(</span><span class="n">eq</span><span class="p">)</span> </span><span id="L-1008"><a href="#L-1008"><span class="linenos" data-line="1008"></span></a> <span class="kr">end</span> </span><span id="L-1009"><a href="#L-1009"><span class="linenos" data-line="1009"></span></a> </span><span id="L-1010"><a href="#L-1010"><span class="linenos" data-line="1010"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">do_heading_possible_end</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> </span><span id="L-1011"><a href="#L-1011"><span class="linenos" data-line="1011"></span></a> <span class="kd">local</span> <span class="n">layer</span> <span class="o">=</span> <span class="n">self</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> </span><span id="L-1012"><a href="#L-1012"><span class="linenos" data-line="1012"></span></a> <span class="n">layer</span><span class="p">.</span><span class="n">handler</span> <span class="o">=</span> <span class="n">handle_possible_end</span> </span><span id="L-1013"><a href="#L-1013"><span class="linenos" data-line="1013"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">set_pattern</span><span class="p">(</span><span class="s2">&quot;[</span><span class="se">\n</span><span class="s2">&lt;]&quot;</span><span class="p">)</span> </span><span id="L-1014"><a href="#L-1014"><span class="linenos" data-line="1014"></span></a> <span class="kr">end</span> </span><span id="L-1015"><a href="#L-1015"><span class="linenos" data-line="1015"></span></a> </span><span id="L-1016"><a href="#L-1016"><span class="linenos" data-line="1016"></span></a> <span class="kr">function</span> <span class="nf">handle_start</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="p">...)</span> </span><span id="L-1017"><a href="#L-1017"><span class="linenos" data-line="1017"></span></a> <span class="c1">-- ===== is &quot;=&quot; as an L2; ======== is &quot;==&quot; as an L3 etc.</span> </span><span id="L-1018"><a href="#L-1018"><span class="linenos" data-line="1018"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">newline</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> </span><span id="L-1019"><a href="#L-1019"><span class="linenos" data-line="1019"></span></a> <span class="kd">local</span> <span class="n">layer</span> <span class="o">=</span> <span class="n">self</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> </span><span id="L-1020"><a href="#L-1020"><span class="linenos" data-line="1020"></span></a> <span class="kd">local</span> <span class="n">eq</span> <span class="o">=</span> <span class="n">layer</span><span class="p">.</span><span class="n">level</span> </span><span id="L-1021"><a href="#L-1021"><span class="linenos" data-line="1021"></span></a> <span class="kr">if</span> <span class="n">eq</span> <span class="o">&lt;=</span> <span class="mi">2</span> <span class="kr">then</span> </span><span id="L-1022"><a href="#L-1022"><span class="linenos" data-line="1022"></span></a> <span class="kr">return</span> <span class="n">self</span><span class="p">:</span><span class="n">fail_route</span><span class="p">()</span> </span><span id="L-1023"><a href="#L-1023"><span class="linenos" data-line="1023"></span></a> <span class="kr">end</span> </span><span id="L-1024"><a href="#L-1024"><span class="linenos" data-line="1024"></span></a> <span class="c1">-- Calculate which equals signs determine the heading level.</span> </span><span id="L-1025"><a href="#L-1025"><span class="linenos" data-line="1025"></span></a> <span class="kd">local</span> <span class="n">level_eq</span> <span class="o">=</span> <span class="n">eq</span> <span class="o">-</span> <span class="p">(</span><span class="mi">2</span> <span class="o">-</span> <span class="n">eq</span> <span class="o">%</span> <span class="mi">2</span><span class="p">)</span> </span><span id="L-1026"><a href="#L-1026"><span class="linenos" data-line="1026"></span></a> <span class="n">level_eq</span> <span class="o">=</span> <span class="n">level_eq</span> <span class="o">&gt;</span> <span class="mi">12</span> <span class="ow">and</span> <span class="mi">12</span> <span class="ow">or</span> <span class="n">level_eq</span> </span><span id="L-1027"><a href="#L-1027"><span class="linenos" data-line="1027"></span></a> <span class="c1">-- Emit the excess.</span> </span><span id="L-1028"><a href="#L-1028"><span class="linenos" data-line="1028"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">emit</span><span class="p">(</span><span class="n">rep</span><span class="p">(</span><span class="s2">&quot;=&quot;</span><span class="p">,</span> <span class="n">eq</span> <span class="o">-</span> <span class="n">level_eq</span><span class="p">))</span> </span><span id="L-1029"><a href="#L-1029"><span class="linenos" data-line="1029"></span></a> <span class="n">layer</span><span class="p">.</span><span class="n">level</span> <span class="o">=</span> <span class="n">level_eq</span> <span class="o">/</span> <span class="mi">2</span> </span><span id="L-1030"><a href="#L-1030"><span class="linenos" data-line="1030"></span></a> <span class="kr">return</span> <span class="n">self</span><span class="p">:</span><span class="n">pop</span><span class="p">()</span> </span><span id="L-1031"><a href="#L-1031"><span class="linenos" data-line="1031"></span></a> <span class="kr">end</span> </span><span id="L-1032"><a href="#L-1032"><span class="linenos" data-line="1032"></span></a> </span><span id="L-1033"><a href="#L-1033"><span class="linenos" data-line="1033"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">whitespace</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> </span><span id="L-1034"><a href="#L-1034"><span class="linenos" data-line="1034"></span></a> <span class="kd">local</span> <span class="n">success</span><span class="p">,</span> <span class="n">possible_end</span> <span class="o">=</span> <span class="n">self</span><span class="p">:</span><span class="n">try</span><span class="p">(</span><span class="n">do_heading_possible_end</span><span class="p">)</span> </span><span id="L-1035"><a href="#L-1035"><span class="linenos" data-line="1035"></span></a> <span class="kr">if</span> <span class="n">success</span> <span class="kr">then</span> </span><span id="L-1036"><a href="#L-1036"><span class="linenos" data-line="1036"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">emit</span><span class="p">(</span><span class="n">Wikitext</span><span class="p">:</span><span class="n">new</span><span class="p">(</span><span class="n">possible_end</span><span class="p">))</span> </span><span id="L-1037"><a href="#L-1037"><span class="linenos" data-line="1037"></span></a> <span class="kd">local</span> <span class="n">layer</span> <span class="o">=</span> <span class="n">self</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> </span><span id="L-1038"><a href="#L-1038"><span class="linenos" data-line="1038"></span></a> <span class="n">layer</span><span class="p">.</span><span class="n">handler</span> <span class="o">=</span> <span class="n">handle_body</span> </span><span id="L-1039"><a href="#L-1039"><span class="linenos" data-line="1039"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">set_pattern</span><span class="p">(</span><span class="s2">&quot;[</span><span class="se">\n</span><span class="s2">&lt;=[{]&quot;</span><span class="p">)</span> </span><span id="L-1040"><a href="#L-1040"><span class="linenos" data-line="1040"></span></a> <span class="kr">return</span> <span class="n">self</span><span class="p">:</span><span class="n">consume</span><span class="p">()</span> </span><span id="L-1041"><a href="#L-1041"><span class="linenos" data-line="1041"></span></a> <span class="kr">end</span> </span><span id="L-1042"><a href="#L-1042"><span class="linenos" data-line="1042"></span></a> <span class="kr">return</span> <span class="n">newline</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> </span><span id="L-1043"><a href="#L-1043"><span class="linenos" data-line="1043"></span></a> <span class="kr">end</span> </span><span id="L-1044"><a href="#L-1044"><span class="linenos" data-line="1044"></span></a> </span><span id="L-1045"><a href="#L-1045"><span class="linenos" data-line="1045"></span></a> <span class="n">handle_start</span> <span class="o">=</span> <span class="n">self</span><span class="p">:</span><span class="n">switch</span><span class="p">(</span><span class="n">handle_start</span><span class="p">,</span> <span class="p">{</span> </span><span id="L-1046"><a href="#L-1046"><span class="linenos" data-line="1046"></span></a> <span class="p">[</span><span class="s2">&quot;</span><span class="se">\t</span><span class="s2">&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">whitespace</span><span class="p">,</span> </span><span id="L-1047"><a href="#L-1047"><span class="linenos" data-line="1047"></span></a> <span class="p">[</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">newline</span><span class="p">,</span> </span><span id="L-1048"><a href="#L-1048"><span class="linenos" data-line="1048"></span></a> <span class="p">[</span><span class="s2">&quot; &quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">whitespace</span><span class="p">,</span> </span><span id="L-1049"><a href="#L-1049"><span class="linenos" data-line="1049"></span></a> <span class="p">[</span><span class="s2">&quot;&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">newline</span><span class="p">,</span> </span><span id="L-1050"><a href="#L-1050"><span class="linenos" data-line="1050"></span></a> </span><span id="L-1051"><a href="#L-1051"><span class="linenos" data-line="1051"></span></a> <span class="p">[</span><span class="kc">false</span><span class="p">]</span> <span class="o">=</span> <span class="kr">function</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> </span><span id="L-1052"><a href="#L-1052"><span class="linenos" data-line="1052"></span></a> <span class="c1">-- Emit any excess = signs once we know it&#39;s a conventional heading. Up till now, we couldn&#39;t know if the heading is just a string of = signs (e.g. ========), so it wasn&#39;t guaranteed that the heading text starts after the 6th.</span> </span><span id="L-1053"><a href="#L-1053"><span class="linenos" data-line="1053"></span></a> <span class="kd">local</span> <span class="n">layer</span> <span class="o">=</span> <span class="n">self</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> </span><span id="L-1054"><a href="#L-1054"><span class="linenos" data-line="1054"></span></a> <span class="kd">local</span> <span class="n">eq</span> <span class="o">=</span> <span class="n">layer</span><span class="p">.</span><span class="n">level</span> </span><span id="L-1055"><a href="#L-1055"><span class="linenos" data-line="1055"></span></a> <span class="kr">if</span> <span class="n">eq</span> <span class="o">&gt;</span> <span class="mi">6</span> <span class="kr">then</span> </span><span id="L-1056"><a href="#L-1056"><span class="linenos" data-line="1056"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">emit</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">rep</span><span class="p">(</span><span class="s2">&quot;=&quot;</span><span class="p">,</span> <span class="n">eq</span> <span class="o">-</span> <span class="mi">6</span><span class="p">))</span> </span><span id="L-1057"><a href="#L-1057"><span class="linenos" data-line="1057"></span></a> <span class="n">layer</span><span class="p">.</span><span class="n">level</span> <span class="o">=</span> <span class="mi">6</span> </span><span id="L-1058"><a href="#L-1058"><span class="linenos" data-line="1058"></span></a> <span class="kr">end</span> </span><span id="L-1059"><a href="#L-1059"><span class="linenos" data-line="1059"></span></a> <span class="n">layer</span><span class="p">.</span><span class="n">handler</span> <span class="o">=</span> <span class="n">handle_body</span> </span><span id="L-1060"><a href="#L-1060"><span class="linenos" data-line="1060"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">set_pattern</span><span class="p">(</span><span class="s2">&quot;[</span><span class="se">\n</span><span class="s2">&lt;=[{]&quot;</span><span class="p">)</span> </span><span id="L-1061"><a href="#L-1061"><span class="linenos" data-line="1061"></span></a> <span class="kr">return</span> <span class="n">self</span><span class="p">:</span><span class="n">consume</span><span class="p">()</span> </span><span id="L-1062"><a href="#L-1062"><span class="linenos" data-line="1062"></span></a> <span class="kr">end</span> </span><span id="L-1063"><a href="#L-1063"><span class="linenos" data-line="1063"></span></a> <span class="p">})</span> </span><span id="L-1064"><a href="#L-1064"><span class="linenos" data-line="1064"></span></a> <span class="kr">return</span> <span class="n">handle_start</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="p">...)</span> </span><span id="L-1065"><a href="#L-1065"><span class="linenos" data-line="1065"></span></a> <span class="kr">end</span> </span><span id="L-1066"><a href="#L-1066"><span class="linenos" data-line="1066"></span></a> </span><span id="L-1067"><a href="#L-1067"><span class="linenos" data-line="1067"></span></a> <span class="kr">function</span> <span class="nf">handle_body</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="p">...)</span> </span><span id="L-1068"><a href="#L-1068"><span class="linenos" data-line="1068"></span></a> <span class="n">handle_body</span> <span class="o">=</span> <span class="n">self</span><span class="p">:</span><span class="n">switch</span><span class="p">(</span><span class="n">handle_body</span><span class="p">,</span> <span class="p">{</span> </span><span id="L-1069"><a href="#L-1069"><span class="linenos" data-line="1069"></span></a> <span class="p">[</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">Parser</span><span class="p">.</span><span class="n">fail_route</span><span class="p">,</span> </span><span id="L-1070"><a href="#L-1070"><span class="linenos" data-line="1070"></span></a> <span class="p">[</span><span class="s2">&quot;&lt;&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">Parser</span><span class="p">.</span><span class="n">tag</span><span class="p">,</span> </span><span id="L-1071"><a href="#L-1071"><span class="linenos" data-line="1071"></span></a> </span><span id="L-1072"><a href="#L-1072"><span class="linenos" data-line="1072"></span></a> <span class="p">[</span><span class="s2">&quot;=&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kr">function</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> </span><span id="L-1073"><a href="#L-1073"><span class="linenos" data-line="1073"></span></a> <span class="c1">-- Comments/tags interrupt the equals count.</span> </span><span id="L-1074"><a href="#L-1074"><span class="linenos" data-line="1074"></span></a> <span class="kd">local</span> <span class="n">eq</span> <span class="o">=</span> <span class="n">match</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">text</span><span class="p">,</span> <span class="s2">&quot;^=+&quot;</span><span class="p">,</span> <span class="n">self</span><span class="p">.</span><span class="n">head</span><span class="p">)</span> </span><span id="L-1075"><a href="#L-1075"><span class="linenos" data-line="1075"></span></a> <span class="kd">local</span> <span class="n">eq_len</span> <span class="o">=</span> <span class="o">#</span><span class="n">eq</span> </span><span id="L-1076"><a href="#L-1076"><span class="linenos" data-line="1076"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">advance</span><span class="p">(</span><span class="n">eq_len</span><span class="p">)</span> </span><span id="L-1077"><a href="#L-1077"><span class="linenos" data-line="1077"></span></a> <span class="kd">local</span> <span class="n">success</span><span class="p">,</span> <span class="n">possible_end</span> <span class="o">=</span> <span class="n">self</span><span class="p">:</span><span class="n">try</span><span class="p">(</span><span class="n">do_heading_possible_end</span><span class="p">)</span> </span><span id="L-1078"><a href="#L-1078"><span class="linenos" data-line="1078"></span></a> <span class="kr">if</span> <span class="n">success</span> <span class="kr">then</span> </span><span id="L-1079"><a href="#L-1079"><span class="linenos" data-line="1079"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">emit</span><span class="p">(</span><span class="n">eq</span><span class="p">)</span> </span><span id="L-1080"><a href="#L-1080"><span class="linenos" data-line="1080"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">emit</span><span class="p">(</span><span class="n">Wikitext</span><span class="p">:</span><span class="n">new</span><span class="p">(</span><span class="n">possible_end</span><span class="p">))</span> </span><span id="L-1081"><a href="#L-1081"><span class="linenos" data-line="1081"></span></a> <span class="kr">return</span> <span class="n">self</span><span class="p">:</span><span class="n">consume</span><span class="p">()</span> </span><span id="L-1082"><a href="#L-1082"><span class="linenos" data-line="1082"></span></a> <span class="kr">end</span> </span><span id="L-1083"><a href="#L-1083"><span class="linenos" data-line="1083"></span></a> <span class="kd">local</span> <span class="n">layer</span> <span class="o">=</span> <span class="n">self</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> </span><span id="L-1084"><a href="#L-1084"><span class="linenos" data-line="1084"></span></a> <span class="kd">local</span> <span class="n">level</span> <span class="o">=</span> <span class="n">layer</span><span class="p">.</span><span class="n">level</span> </span><span id="L-1085"><a href="#L-1085"><span class="linenos" data-line="1085"></span></a> <span class="kr">if</span> <span class="n">eq_len</span> <span class="o">&gt;</span> <span class="n">level</span> <span class="kr">then</span> </span><span id="L-1086"><a href="#L-1086"><span class="linenos" data-line="1086"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">emit</span><span class="p">(</span><span class="n">rep</span><span class="p">(</span><span class="s2">&quot;=&quot;</span><span class="p">,</span> <span class="n">eq_len</span> <span class="o">-</span> <span class="n">level</span><span class="p">))</span> </span><span id="L-1087"><a href="#L-1087"><span class="linenos" data-line="1087"></span></a> <span class="kr">elseif</span> <span class="n">level</span> <span class="o">&gt;</span> <span class="n">eq_len</span> <span class="kr">then</span> </span><span id="L-1088"><a href="#L-1088"><span class="linenos" data-line="1088"></span></a> <span class="n">layer</span><span class="p">.</span><span class="n">level</span> <span class="o">=</span> <span class="n">eq_len</span> </span><span id="L-1089"><a href="#L-1089"><span class="linenos" data-line="1089"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">emit</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">rep</span><span class="p">(</span><span class="s2">&quot;=&quot;</span><span class="p">,</span> <span class="n">level</span> <span class="o">-</span> <span class="n">eq_len</span><span class="p">))</span> </span><span id="L-1090"><a href="#L-1090"><span class="linenos" data-line="1090"></span></a> <span class="kr">end</span> </span><span id="L-1091"><a href="#L-1091"><span class="linenos" data-line="1091"></span></a> <span class="kr">return</span> <span class="n">self</span><span class="p">:</span><span class="n">pop</span><span class="p">()</span> </span><span id="L-1092"><a href="#L-1092"><span class="linenos" data-line="1092"></span></a> <span class="kr">end</span><span class="p">,</span> </span><span id="L-1093"><a href="#L-1093"><span class="linenos" data-line="1093"></span></a> </span><span id="L-1094"><a href="#L-1094"><span class="linenos" data-line="1094"></span></a> <span class="p">[</span><span class="s2">&quot;[&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">Parser</span><span class="p">.</span><span class="n">wikilink_block</span><span class="p">,</span> </span><span id="L-1095"><a href="#L-1095"><span class="linenos" data-line="1095"></span></a> </span><span id="L-1096"><a href="#L-1096"><span class="linenos" data-line="1096"></span></a> <span class="p">[</span><span class="s2">&quot;{&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kr">function</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">this</span><span class="p">)</span> </span><span id="L-1097"><a href="#L-1097"><span class="linenos" data-line="1097"></span></a> <span class="kr">return</span> <span class="n">self</span><span class="p">:</span><span class="n">braces</span><span class="p">(</span><span class="s2">&quot;{&quot;</span><span class="p">,</span> <span class="kc">true</span><span class="p">)</span> </span><span id="L-1098"><a href="#L-1098"><span class="linenos" data-line="1098"></span></a> <span class="kr">end</span><span class="p">,</span> </span><span id="L-1099"><a href="#L-1099"><span class="linenos" data-line="1099"></span></a> </span><span id="L-1100"><a href="#L-1100"><span class="linenos" data-line="1100"></span></a> <span class="p">[</span><span class="s2">&quot;&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">Parser</span><span class="p">.</span><span class="n">fail_route</span><span class="p">,</span> </span><span id="L-1101"><a href="#L-1101"><span class="linenos" data-line="1101"></span></a> <span class="p">[</span><span class="kc">false</span><span class="p">]</span> <span class="o">=</span> <span class="n">Parser</span><span class="p">.</span><span class="n">emit</span> </span><span id="L-1102"><a href="#L-1102"><span class="linenos" data-line="1102"></span></a> <span class="p">})</span> </span><span id="L-1103"><a href="#L-1103"><span class="linenos" data-line="1103"></span></a> <span class="kr">return</span> <span class="n">handle_body</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="p">...)</span> </span><span id="L-1104"><a href="#L-1104"><span class="linenos" data-line="1104"></span></a> <span class="kr">end</span> </span><span id="L-1105"><a href="#L-1105"><span class="linenos" data-line="1105"></span></a> </span><span id="L-1106"><a href="#L-1106"><span class="linenos" data-line="1106"></span></a> <span class="kr">function</span> <span class="nf">handle_possible_end</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="p">...)</span> </span><span id="L-1107"><a href="#L-1107"><span class="linenos" data-line="1107"></span></a> <span class="n">handle_possible_end</span> <span class="o">=</span> <span class="n">self</span><span class="p">:</span><span class="n">switch</span><span class="p">(</span><span class="n">handle_possible_end</span><span class="p">,</span> <span class="p">{</span> </span><span id="L-1108"><a href="#L-1108"><span class="linenos" data-line="1108"></span></a> <span class="p">[</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">Parser</span><span class="p">.</span><span class="n">fail_route</span><span class="p">,</span> </span><span id="L-1109"><a href="#L-1109"><span class="linenos" data-line="1109"></span></a> </span><span id="L-1110"><a href="#L-1110"><span class="linenos" data-line="1110"></span></a> <span class="p">[</span><span class="s2">&quot;&lt;&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kr">function</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> </span><span id="L-1111"><a href="#L-1111"><span class="linenos" data-line="1111"></span></a> <span class="kr">if</span> <span class="n">self</span><span class="p">:</span><span class="n">read</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span> <span class="o">~=</span> <span class="s2">&quot;!--&quot;</span> <span class="kr">then</span> </span><span id="L-1112"><a href="#L-1112"><span class="linenos" data-line="1112"></span></a> <span class="kr">return</span> <span class="n">self</span><span class="p">:</span><span class="n">pop</span><span class="p">()</span> </span><span id="L-1113"><a href="#L-1113"><span class="linenos" data-line="1113"></span></a> <span class="kr">end</span> </span><span id="L-1114"><a href="#L-1114"><span class="linenos" data-line="1114"></span></a> <span class="kd">local</span> <span class="n">head</span> <span class="o">=</span> <span class="nb">select</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="n">find</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">text</span><span class="p">,</span> <span class="s2">&quot;--&gt;&quot;</span><span class="p">,</span> <span class="n">self</span><span class="p">.</span><span class="n">head</span> <span class="o">+</span> <span class="mi">4</span><span class="p">,</span> <span class="kc">true</span><span class="p">))</span> </span><span id="L-1115"><a href="#L-1115"><span class="linenos" data-line="1115"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">head</span> <span class="kr">then</span> </span><span id="L-1116"><a href="#L-1116"><span class="linenos" data-line="1116"></span></a> <span class="kr">return</span> <span class="n">self</span><span class="p">:</span><span class="n">pop</span><span class="p">()</span> </span><span id="L-1117"><a href="#L-1117"><span class="linenos" data-line="1117"></span></a> <span class="kr">end</span> </span><span id="L-1118"><a href="#L-1118"><span class="linenos" data-line="1118"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">jump</span><span class="p">(</span><span class="n">head</span><span class="p">)</span> </span><span id="L-1119"><a href="#L-1119"><span class="linenos" data-line="1119"></span></a> <span class="kr">end</span><span class="p">,</span> </span><span id="L-1120"><a href="#L-1120"><span class="linenos" data-line="1120"></span></a> </span><span id="L-1121"><a href="#L-1121"><span class="linenos" data-line="1121"></span></a> <span class="p">[</span><span class="s2">&quot;&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">Parser</span><span class="p">.</span><span class="n">fail_route</span><span class="p">,</span> </span><span id="L-1122"><a href="#L-1122"><span class="linenos" data-line="1122"></span></a> </span><span id="L-1123"><a href="#L-1123"><span class="linenos" data-line="1123"></span></a> <span class="p">[</span><span class="kc">false</span><span class="p">]</span> <span class="o">=</span> <span class="kr">function</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">this</span><span class="p">)</span> </span><span id="L-1124"><a href="#L-1124"><span class="linenos" data-line="1124"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">match</span><span class="p">(</span><span class="n">this</span><span class="p">,</span> <span class="s2">&quot;^[</span><span class="se">\t</span><span class="s2"> ]+()$&quot;</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-1125"><a href="#L-1125"><span class="linenos" data-line="1125"></span></a> <span class="kr">return</span> <span class="n">self</span><span class="p">:</span><span class="n">pop</span><span class="p">()</span> </span><span id="L-1126"><a href="#L-1126"><span class="linenos" data-line="1126"></span></a> <span class="kr">end</span> </span><span id="L-1127"><a href="#L-1127"><span class="linenos" data-line="1127"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">emit</span><span class="p">(</span><span class="n">this</span><span class="p">)</span> </span><span id="L-1128"><a href="#L-1128"><span class="linenos" data-line="1128"></span></a> <span class="kr">end</span> </span><span id="L-1129"><a href="#L-1129"><span class="linenos" data-line="1129"></span></a> <span class="p">})</span> </span><span id="L-1130"><a href="#L-1130"><span class="linenos" data-line="1130"></span></a> <span class="kr">return</span> <span class="n">handle_possible_end</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="p">...)</span> </span><span id="L-1131"><a href="#L-1131"><span class="linenos" data-line="1131"></span></a> <span class="kr">end</span> </span><span id="L-1132"><a href="#L-1132"><span class="linenos" data-line="1132"></span></a> </span><span id="L-1133"><a href="#L-1133"><span class="linenos" data-line="1133"></span></a> <span class="kr">function</span> <span class="nc">Parser</span><span class="p">:</span><span class="nf">heading</span><span class="p">()</span> </span><span id="L-1134"><a href="#L-1134"><span class="linenos" data-line="1134"></span></a> <span class="kd">local</span> <span class="n">success</span><span class="p">,</span> <span class="n">heading</span> <span class="o">=</span> <span class="n">self</span><span class="p">:</span><span class="n">try</span><span class="p">(</span><span class="n">do_heading</span><span class="p">)</span> </span><span id="L-1135"><a href="#L-1135"><span class="linenos" data-line="1135"></span></a> <span class="kr">if</span> <span class="n">success</span> <span class="kr">then</span> </span><span id="L-1136"><a href="#L-1136"><span class="linenos" data-line="1136"></span></a> <span class="kd">local</span> <span class="n">section</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">section</span> <span class="o">+</span> <span class="mi">1</span> </span><span id="L-1137"><a href="#L-1137"><span class="linenos" data-line="1137"></span></a> <span class="n">heading</span><span class="p">.</span><span class="n">section</span> <span class="o">=</span> <span class="n">section</span> </span><span id="L-1138"><a href="#L-1138"><span class="linenos" data-line="1138"></span></a> <span class="n">self</span><span class="p">.</span><span class="n">section</span> <span class="o">=</span> <span class="n">section</span> </span><span id="L-1139"><a href="#L-1139"><span class="linenos" data-line="1139"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">emit</span><span class="p">(</span><span class="n">Heading</span><span class="p">:</span><span class="n">new</span><span class="p">(</span><span class="n">heading</span><span class="p">))</span> </span><span id="L-1140"><a href="#L-1140"><span class="linenos" data-line="1140"></span></a> <span class="kr">return</span> <span class="n">self</span><span class="p">:</span><span class="n">consume</span><span class="p">()</span> </span><span id="L-1141"><a href="#L-1141"><span class="linenos" data-line="1141"></span></a> <span class="kr">else</span> </span><span id="L-1142"><a href="#L-1142"><span class="linenos" data-line="1142"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">emit</span><span class="p">(</span><span class="s2">&quot;=&quot;</span><span class="p">)</span> </span><span id="L-1143"><a href="#L-1143"><span class="linenos" data-line="1143"></span></a> <span class="kr">end</span> </span><span id="L-1144"><a href="#L-1144"><span class="linenos" data-line="1144"></span></a> <span class="kr">end</span> </span><span id="L-1145"><a href="#L-1145"><span class="linenos" data-line="1145"></span></a><span class="kr">end</span> </span><span id="L-1146"><a href="#L-1146"><span class="linenos" data-line="1146"></span></a> </span><span id="L-1147"><a href="#L-1147"><span class="linenos" data-line="1147"></span></a><span class="c1">------------------------------------------------------------------------------------</span> </span><span id="L-1148"><a href="#L-1148"><span class="linenos" data-line="1148"></span></a><span class="c1">--</span> </span><span id="L-1149"><a href="#L-1149"><span class="linenos" data-line="1149"></span></a><span class="c1">-- Block handlers</span> </span><span id="L-1150"><a href="#L-1150"><span class="linenos" data-line="1150"></span></a><span class="c1">--</span> </span><span id="L-1151"><a href="#L-1151"><span class="linenos" data-line="1151"></span></a><span class="c1">------------------------------------------------------------------------------------</span> </span><span id="L-1152"><a href="#L-1152"><span class="linenos" data-line="1152"></span></a> </span><span id="L-1153"><a href="#L-1153"><span class="linenos" data-line="1153"></span></a><span class="c1">-- Block handlers.</span> </span><span id="L-1154"><a href="#L-1154"><span class="linenos" data-line="1154"></span></a> </span><span id="L-1155"><a href="#L-1155"><span class="linenos" data-line="1155"></span></a><span class="c1">-- These are blocks which can affect template/parameter parsing, since they&#39;re also parsed by Parsoid at the same time (even though they aren&#39;t processed until later).</span> </span><span id="L-1156"><a href="#L-1156"><span class="linenos" data-line="1156"></span></a> </span><span id="L-1157"><a href="#L-1157"><span class="linenos" data-line="1157"></span></a><span class="c1">-- All blocks (including templates/parameters) can nest inside each other, but an inner block must be closed before the outer block which contains it. This is why, for example, the wikitext &quot;{{template| [[ }}&quot; will result in an unprocessed template, since the inner &quot;[[&quot; is treated as the opening of a wikilink block, which prevents &quot;}}&quot; from being treated as the closure of the template block. On the other hand, &quot;{{template| [[ ]] }}&quot; will process correctly, since the wikilink block is closed before the template closure. It makes no difference whether the block will be treated as valid or not when it&#39;s processed later on, so &quot;{{template| [[ }} ]] }}&quot; would also work, even though &quot;[[ }} ]]&quot; is not a valid wikilink.</span> </span><span id="L-1158"><a href="#L-1158"><span class="linenos" data-line="1158"></span></a> </span><span id="L-1159"><a href="#L-1159"><span class="linenos" data-line="1159"></span></a><span class="c1">-- Note that nesting also affects pipes and equals signs, in addition to block closures.</span> </span><span id="L-1160"><a href="#L-1160"><span class="linenos" data-line="1160"></span></a> </span><span id="L-1161"><a href="#L-1161"><span class="linenos" data-line="1161"></span></a><span class="c1">-- These blocks can be nested to any degree, so &quot;{{template| [[ [[ [[ ]] }}&quot; will not work, since only one of the three wikilink blocks has been closed. On the other hand, &quot;{{template| [[ [[ [[ ]] ]] ]] }}&quot; will work.</span> </span><span id="L-1162"><a href="#L-1162"><span class="linenos" data-line="1162"></span></a> </span><span id="L-1163"><a href="#L-1163"><span class="linenos" data-line="1163"></span></a><span class="c1">-- All blocks are implicitly closed by the end of the text, since their validity is irrelevant at this stage.</span> </span><span id="L-1164"><a href="#L-1164"><span class="linenos" data-line="1164"></span></a> </span><span id="L-1165"><a href="#L-1165"><span class="linenos" data-line="1165"></span></a><span class="c1">-- Language conversion block.</span> </span><span id="L-1166"><a href="#L-1166"><span class="linenos" data-line="1166"></span></a><span class="c1">-- Opens with &quot;-{&quot; and closes with &quot;}-&quot;. However, templates/parameters take priority, so &quot;-{{&quot; is parsed as &quot;-&quot; followed by the opening of a template/parameter block (depending on what comes after).</span> </span><span id="L-1167"><a href="#L-1167"><span class="linenos" data-line="1167"></span></a><span class="c1">-- Note: Language conversion blocks aren&#39;t actually enabled on the English Wiktionary, but Parsoid still parses them at this stage, so they can affect the closure of outer blocks: e.g. &quot;[[ -{ ]]&quot; is not a valid wikilink block, since the &quot;]]&quot; falls inside the new language conversion block.</span> </span><span id="L-1168"><a href="#L-1168"><span class="linenos" data-line="1168"></span></a><span class="kr">do</span> </span><span id="L-1169"><a href="#L-1169"><span class="linenos" data-line="1169"></span></a> <span class="c1">--Handler.</span> </span><span id="L-1170"><a href="#L-1170"><span class="linenos" data-line="1170"></span></a> <span class="kd">local</span> <span class="n">handle_language_conversion_block</span> </span><span id="L-1171"><a href="#L-1171"><span class="linenos" data-line="1171"></span></a> </span><span id="L-1172"><a href="#L-1172"><span class="linenos" data-line="1172"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">do_language_conversion_block</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> </span><span id="L-1173"><a href="#L-1173"><span class="linenos" data-line="1173"></span></a> <span class="kd">local</span> <span class="n">layer</span> <span class="o">=</span> <span class="n">self</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> </span><span id="L-1174"><a href="#L-1174"><span class="linenos" data-line="1174"></span></a> <span class="n">layer</span><span class="p">.</span><span class="n">handler</span> <span class="o">=</span> <span class="n">handle_language_conversion_block</span> </span><span id="L-1175"><a href="#L-1175"><span class="linenos" data-line="1175"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">set_pattern</span><span class="p">(</span><span class="s2">&quot;[</span><span class="se">\n</span><span class="s2">&lt;[{}]&quot;</span><span class="p">)</span> </span><span id="L-1176"><a href="#L-1176"><span class="linenos" data-line="1176"></span></a> <span class="kr">end</span> </span><span id="L-1177"><a href="#L-1177"><span class="linenos" data-line="1177"></span></a> </span><span id="L-1178"><a href="#L-1178"><span class="linenos" data-line="1178"></span></a> <span class="kr">function</span> <span class="nf">handle_language_conversion_block</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="p">...)</span> </span><span id="L-1179"><a href="#L-1179"><span class="linenos" data-line="1179"></span></a> <span class="n">handle_language_conversion_block</span> <span class="o">=</span> <span class="n">self</span><span class="p">:</span><span class="n">switch</span><span class="p">(</span><span class="n">handle_language_conversion_block</span><span class="p">,</span> <span class="p">{</span> </span><span id="L-1180"><a href="#L-1180"><span class="linenos" data-line="1180"></span></a> <span class="p">[</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">Parser</span><span class="p">.</span><span class="n">heading_block</span><span class="p">,</span> </span><span id="L-1181"><a href="#L-1181"><span class="linenos" data-line="1181"></span></a> <span class="p">[</span><span class="s2">&quot;&lt;&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">Parser</span><span class="p">.</span><span class="n">tag</span><span class="p">,</span> </span><span id="L-1182"><a href="#L-1182"><span class="linenos" data-line="1182"></span></a> <span class="p">[</span><span class="s2">&quot;[&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">Parser</span><span class="p">.</span><span class="n">wikilink_block</span><span class="p">,</span> </span><span id="L-1183"><a href="#L-1183"><span class="linenos" data-line="1183"></span></a> <span class="p">[</span><span class="s2">&quot;{&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">Parser</span><span class="p">.</span><span class="n">braces</span><span class="p">,</span> </span><span id="L-1184"><a href="#L-1184"><span class="linenos" data-line="1184"></span></a> </span><span id="L-1185"><a href="#L-1185"><span class="linenos" data-line="1185"></span></a> <span class="p">[</span><span class="s2">&quot;}&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kr">function</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> </span><span id="L-1186"><a href="#L-1186"><span class="linenos" data-line="1186"></span></a> <span class="kr">if</span> <span class="n">self</span><span class="p">:</span><span class="n">read</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="o">==</span> <span class="s2">&quot;-&quot;</span> <span class="kr">then</span> </span><span id="L-1187"><a href="#L-1187"><span class="linenos" data-line="1187"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">emit</span><span class="p">(</span><span class="s2">&quot;}-&quot;</span><span class="p">)</span> </span><span id="L-1188"><a href="#L-1188"><span class="linenos" data-line="1188"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">advance</span><span class="p">()</span> </span><span id="L-1189"><a href="#L-1189"><span class="linenos" data-line="1189"></span></a> <span class="kr">return</span> <span class="n">self</span><span class="p">:</span><span class="n">pop</span><span class="p">()</span> </span><span id="L-1190"><a href="#L-1190"><span class="linenos" data-line="1190"></span></a> <span class="kr">end</span> </span><span id="L-1191"><a href="#L-1191"><span class="linenos" data-line="1191"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">emit</span><span class="p">(</span><span class="s2">&quot;}&quot;</span><span class="p">)</span> </span><span id="L-1192"><a href="#L-1192"><span class="linenos" data-line="1192"></span></a> <span class="kr">end</span><span class="p">,</span> </span><span id="L-1193"><a href="#L-1193"><span class="linenos" data-line="1193"></span></a> </span><span id="L-1194"><a href="#L-1194"><span class="linenos" data-line="1194"></span></a> <span class="p">[</span><span class="s2">&quot;&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">Parser</span><span class="p">.</span><span class="n">pop</span><span class="p">,</span> </span><span id="L-1195"><a href="#L-1195"><span class="linenos" data-line="1195"></span></a> <span class="p">[</span><span class="kc">false</span><span class="p">]</span> <span class="o">=</span> <span class="n">Parser</span><span class="p">.</span><span class="n">emit</span> </span><span id="L-1196"><a href="#L-1196"><span class="linenos" data-line="1196"></span></a> <span class="p">})</span> </span><span id="L-1197"><a href="#L-1197"><span class="linenos" data-line="1197"></span></a> <span class="kr">return</span> <span class="n">handle_language_conversion_block</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="p">...)</span> </span><span id="L-1198"><a href="#L-1198"><span class="linenos" data-line="1198"></span></a> <span class="kr">end</span> </span><span id="L-1199"><a href="#L-1199"><span class="linenos" data-line="1199"></span></a> </span><span id="L-1200"><a href="#L-1200"><span class="linenos" data-line="1200"></span></a> <span class="kr">function</span> <span class="nc">Parser</span><span class="p">:</span><span class="nf">braces</span><span class="p">(</span><span class="n">this</span><span class="p">,</span> <span class="n">fail_on_unclosed_braces</span><span class="p">)</span> </span><span id="L-1201"><a href="#L-1201"><span class="linenos" data-line="1201"></span></a> <span class="kd">local</span> <span class="n">language_conversion_block</span> <span class="o">=</span> <span class="n">self</span><span class="p">:</span><span class="n">read</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="o">==</span> <span class="s2">&quot;-&quot;</span> </span><span id="L-1202"><a href="#L-1202"><span class="linenos" data-line="1202"></span></a> <span class="kr">if</span> <span class="n">self</span><span class="p">:</span><span class="n">read</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="o">==</span> <span class="s2">&quot;{&quot;</span> <span class="kr">then</span> </span><span id="L-1203"><a href="#L-1203"><span class="linenos" data-line="1203"></span></a> <span class="kd">local</span> <span class="n">braces</span><span class="p">,</span> <span class="n">failed</span> <span class="o">=</span> <span class="n">self</span><span class="p">:</span><span class="n">template_or_parameter</span><span class="p">()</span> </span><span id="L-1204"><a href="#L-1204"><span class="linenos" data-line="1204"></span></a> <span class="c1">-- Headings will fail if they contain an unclosed brace block.</span> </span><span id="L-1205"><a href="#L-1205"><span class="linenos" data-line="1205"></span></a> <span class="kr">if</span> <span class="n">failed</span> <span class="ow">and</span> <span class="n">fail_on_unclosed_braces</span> <span class="kr">then</span> </span><span id="L-1206"><a href="#L-1206"><span class="linenos" data-line="1206"></span></a> <span class="kr">return</span> <span class="n">self</span><span class="p">:</span><span class="n">fail_route</span><span class="p">()</span> </span><span id="L-1207"><a href="#L-1207"><span class="linenos" data-line="1207"></span></a> <span class="c1">-- Language conversion blocks cannot begin &quot;-{{&quot;, but can begin</span> </span><span id="L-1208"><a href="#L-1208"><span class="linenos" data-line="1208"></span></a> <span class="c1">-- &quot;-{{{&quot; iff parsed as &quot;-{&quot; + &quot;{{&quot;.</span> </span><span id="L-1209"><a href="#L-1209"><span class="linenos" data-line="1209"></span></a> <span class="kr">elseif</span> <span class="ow">not</span> <span class="p">(</span><span class="n">language_conversion_block</span> <span class="ow">and</span> <span class="n">braces</span> <span class="o">==</span> <span class="mi">1</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-1210"><a href="#L-1210"><span class="linenos" data-line="1210"></span></a> <span class="kr">return</span> <span class="n">self</span><span class="p">:</span><span class="n">consume</span><span class="p">()</span> </span><span id="L-1211"><a href="#L-1211"><span class="linenos" data-line="1211"></span></a> <span class="kr">end</span> </span><span id="L-1212"><a href="#L-1212"><span class="linenos" data-line="1212"></span></a> <span class="kr">else</span> </span><span id="L-1213"><a href="#L-1213"><span class="linenos" data-line="1213"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">emit</span><span class="p">(</span><span class="n">this</span><span class="p">)</span> </span><span id="L-1214"><a href="#L-1214"><span class="linenos" data-line="1214"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">language_conversion_block</span> <span class="kr">then</span> </span><span id="L-1215"><a href="#L-1215"><span class="linenos" data-line="1215"></span></a> <span class="kr">return</span> </span><span id="L-1216"><a href="#L-1216"><span class="linenos" data-line="1216"></span></a> <span class="kr">end</span> </span><span id="L-1217"><a href="#L-1217"><span class="linenos" data-line="1217"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">advance</span><span class="p">()</span> </span><span id="L-1218"><a href="#L-1218"><span class="linenos" data-line="1218"></span></a> <span class="kr">end</span> </span><span id="L-1219"><a href="#L-1219"><span class="linenos" data-line="1219"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">emit</span><span class="p">(</span><span class="n">Wikitext</span><span class="p">:</span><span class="n">new</span><span class="p">(</span><span class="n">self</span><span class="p">:</span><span class="n">get</span><span class="p">(</span><span class="n">do_language_conversion_block</span><span class="p">)))</span> </span><span id="L-1220"><a href="#L-1220"><span class="linenos" data-line="1220"></span></a> <span class="kr">end</span> </span><span id="L-1221"><a href="#L-1221"><span class="linenos" data-line="1221"></span></a><span class="kr">end</span> </span><span id="L-1222"><a href="#L-1222"><span class="linenos" data-line="1222"></span></a> </span><span id="L-1223"><a href="#L-1223"><span class="linenos" data-line="1223"></span></a><span class="cm">--[==[</span> </span><span id="L-1224"><a href="#L-1224"><span class="linenos" data-line="1224"></span></a><span class="cm">Headings</span> </span><span id="L-1225"><a href="#L-1225"><span class="linenos" data-line="1225"></span></a> </span><span id="L-1226"><a href="#L-1226"><span class="linenos" data-line="1226"></span></a><span class="cm">Opens with &quot;\n=&quot; (or &quot;=&quot; at the start of the text), and closes with &quot;\n&quot; or the end of the text. Note that it doesn&#39;t matter whether the heading will fail to process due to a premature newline (e.g. if there are no closing signs), so at this stage the only thing that matters for closure is the newline or end of text.</span> </span><span id="L-1227"><a href="#L-1227"><span class="linenos" data-line="1227"></span></a> </span><span id="L-1228"><a href="#L-1228"><span class="linenos" data-line="1228"></span></a><span class="cm">Note: Heading blocks are only parsed like this if they occur inside a template, since they do not iterate the preparser&#39;s heading count (i.e. they aren&#39;t proper headings).</span> </span><span id="L-1229"><a href="#L-1229"><span class="linenos" data-line="1229"></span></a> </span><span id="L-1230"><a href="#L-1230"><span class="linenos" data-line="1230"></span></a><span class="cm">Note 2: if directly inside a template argument with no previous equals signs, a newline followed by a single equals sign is parsed as an argument equals sign, not the opening of a new L1 heading block. This does not apply to any other heading levels. As such, {{template|key\n=}}, {{template|key\n=value}} or even {{template|\n=}} will successfully close, but {{template|key\n==}}, {{template|key=value\n=more value}}, {{template\n=}} etc. will not, since in the latter cases the &quot;}}&quot; would fall inside the new heading block.</span> </span><span id="L-1231"><a href="#L-1231"><span class="linenos" data-line="1231"></span></a><span class="cm">]==]</span> </span><span id="L-1232"><a href="#L-1232"><span class="linenos" data-line="1232"></span></a><span class="kr">do</span> </span><span id="L-1233"><a href="#L-1233"><span class="linenos" data-line="1233"></span></a> <span class="c1">--Handler.</span> </span><span id="L-1234"><a href="#L-1234"><span class="linenos" data-line="1234"></span></a> <span class="kd">local</span> <span class="n">handle_heading_block</span> </span><span id="L-1235"><a href="#L-1235"><span class="linenos" data-line="1235"></span></a> </span><span id="L-1236"><a href="#L-1236"><span class="linenos" data-line="1236"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">do_heading_block</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> </span><span id="L-1237"><a href="#L-1237"><span class="linenos" data-line="1237"></span></a> <span class="kd">local</span> <span class="n">layer</span> <span class="o">=</span> <span class="n">self</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> </span><span id="L-1238"><a href="#L-1238"><span class="linenos" data-line="1238"></span></a> <span class="n">layer</span><span class="p">.</span><span class="n">handler</span> <span class="o">=</span> <span class="n">handle_heading_block</span> </span><span id="L-1239"><a href="#L-1239"><span class="linenos" data-line="1239"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">set_pattern</span><span class="p">(</span><span class="s2">&quot;[</span><span class="se">\n</span><span class="s2">&lt;[{]&quot;</span><span class="p">)</span> </span><span id="L-1240"><a href="#L-1240"><span class="linenos" data-line="1240"></span></a> <span class="kr">end</span> </span><span id="L-1241"><a href="#L-1241"><span class="linenos" data-line="1241"></span></a> </span><span id="L-1242"><a href="#L-1242"><span class="linenos" data-line="1242"></span></a> <span class="kr">function</span> <span class="nf">handle_heading_block</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="p">...)</span> </span><span id="L-1243"><a href="#L-1243"><span class="linenos" data-line="1243"></span></a> <span class="n">handle_heading_block</span> <span class="o">=</span> <span class="n">self</span><span class="p">:</span><span class="n">switch</span><span class="p">(</span><span class="n">handle_heading_block</span><span class="p">,</span> <span class="p">{</span> </span><span id="L-1244"><a href="#L-1244"><span class="linenos" data-line="1244"></span></a> <span class="p">[</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kr">function</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> </span><span id="L-1245"><a href="#L-1245"><span class="linenos" data-line="1245"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">newline</span><span class="p">()</span> </span><span id="L-1246"><a href="#L-1246"><span class="linenos" data-line="1246"></span></a> <span class="kr">return</span> <span class="n">self</span><span class="p">:</span><span class="n">pop</span><span class="p">()</span> </span><span id="L-1247"><a href="#L-1247"><span class="linenos" data-line="1247"></span></a> <span class="kr">end</span><span class="p">,</span> </span><span id="L-1248"><a href="#L-1248"><span class="linenos" data-line="1248"></span></a> </span><span id="L-1249"><a href="#L-1249"><span class="linenos" data-line="1249"></span></a> <span class="p">[</span><span class="s2">&quot;&lt;&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">Parser</span><span class="p">.</span><span class="n">tag</span><span class="p">,</span> </span><span id="L-1250"><a href="#L-1250"><span class="linenos" data-line="1250"></span></a> <span class="p">[</span><span class="s2">&quot;[&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">Parser</span><span class="p">.</span><span class="n">wikilink_block</span><span class="p">,</span> </span><span id="L-1251"><a href="#L-1251"><span class="linenos" data-line="1251"></span></a> <span class="p">[</span><span class="s2">&quot;{&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">Parser</span><span class="p">.</span><span class="n">braces</span><span class="p">,</span> </span><span id="L-1252"><a href="#L-1252"><span class="linenos" data-line="1252"></span></a> <span class="p">[</span><span class="s2">&quot;&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">Parser</span><span class="p">.</span><span class="n">pop</span><span class="p">,</span> </span><span id="L-1253"><a href="#L-1253"><span class="linenos" data-line="1253"></span></a> <span class="p">[</span><span class="kc">false</span><span class="p">]</span> <span class="o">=</span> <span class="n">Parser</span><span class="p">.</span><span class="n">emit</span> </span><span id="L-1254"><a href="#L-1254"><span class="linenos" data-line="1254"></span></a> <span class="p">})</span> </span><span id="L-1255"><a href="#L-1255"><span class="linenos" data-line="1255"></span></a> <span class="kr">return</span> <span class="n">handle_heading_block</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="p">...)</span> </span><span id="L-1256"><a href="#L-1256"><span class="linenos" data-line="1256"></span></a> <span class="kr">end</span> </span><span id="L-1257"><a href="#L-1257"><span class="linenos" data-line="1257"></span></a> </span><span id="L-1258"><a href="#L-1258"><span class="linenos" data-line="1258"></span></a> <span class="kr">function</span> <span class="nc">Parser</span><span class="p">:</span><span class="nf">heading_block</span><span class="p">(</span><span class="n">this</span><span class="p">,</span> <span class="n">nxt</span><span class="p">)</span> </span><span id="L-1259"><a href="#L-1259"><span class="linenos" data-line="1259"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">newline</span><span class="p">()</span> </span><span id="L-1260"><a href="#L-1260"><span class="linenos" data-line="1260"></span></a> <span class="n">this</span> <span class="o">=</span> <span class="n">this</span> <span class="o">..</span> <span class="p">(</span><span class="n">nxt</span> <span class="ow">or</span> <span class="s2">&quot;=&quot;</span><span class="p">)</span> </span><span id="L-1261"><a href="#L-1261"><span class="linenos" data-line="1261"></span></a> <span class="kd">local</span> <span class="n">loc</span> <span class="o">=</span> <span class="o">#</span><span class="n">this</span> <span class="o">-</span> <span class="mi">1</span> </span><span id="L-1262"><a href="#L-1262"><span class="linenos" data-line="1262"></span></a> <span class="kr">while</span> <span class="n">self</span><span class="p">:</span><span class="n">read</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">loc</span><span class="p">)</span> <span class="o">==</span> <span class="n">this</span> <span class="kr">do</span> </span><span id="L-1263"><a href="#L-1263"><span class="linenos" data-line="1263"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">advance</span><span class="p">()</span> </span><span id="L-1264"><a href="#L-1264"><span class="linenos" data-line="1264"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">emit</span><span class="p">(</span><span class="n">Wikitext</span><span class="p">:</span><span class="n">new</span><span class="p">(</span><span class="n">self</span><span class="p">:</span><span class="n">get</span><span class="p">(</span><span class="n">do_heading_block</span><span class="p">)))</span> </span><span id="L-1265"><a href="#L-1265"><span class="linenos" data-line="1265"></span></a> <span class="kr">end</span> </span><span id="L-1266"><a href="#L-1266"><span class="linenos" data-line="1266"></span></a> <span class="kr">end</span> </span><span id="L-1267"><a href="#L-1267"><span class="linenos" data-line="1267"></span></a><span class="kr">end</span> </span><span id="L-1268"><a href="#L-1268"><span class="linenos" data-line="1268"></span></a> </span><span id="L-1269"><a href="#L-1269"><span class="linenos" data-line="1269"></span></a><span class="c1">-- Wikilink block.</span> </span><span id="L-1270"><a href="#L-1270"><span class="linenos" data-line="1270"></span></a><span class="c1">-- Opens with &quot;[[&quot; and closes with &quot;]]&quot;.</span> </span><span id="L-1271"><a href="#L-1271"><span class="linenos" data-line="1271"></span></a><span class="kr">do</span> </span><span id="L-1272"><a href="#L-1272"><span class="linenos" data-line="1272"></span></a> <span class="c1">-- Handler.</span> </span><span id="L-1273"><a href="#L-1273"><span class="linenos" data-line="1273"></span></a> <span class="kd">local</span> <span class="n">handle_wikilink_block</span> </span><span id="L-1274"><a href="#L-1274"><span class="linenos" data-line="1274"></span></a> </span><span id="L-1275"><a href="#L-1275"><span class="linenos" data-line="1275"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">do_wikilink_block</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> </span><span id="L-1276"><a href="#L-1276"><span class="linenos" data-line="1276"></span></a> <span class="kd">local</span> <span class="n">layer</span> <span class="o">=</span> <span class="n">self</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> </span><span id="L-1277"><a href="#L-1277"><span class="linenos" data-line="1277"></span></a> <span class="n">layer</span><span class="p">.</span><span class="n">handler</span> <span class="o">=</span> <span class="n">handle_wikilink_block</span> </span><span id="L-1278"><a href="#L-1278"><span class="linenos" data-line="1278"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">set_pattern</span><span class="p">(</span><span class="s2">&quot;[</span><span class="se">\n</span><span class="s2">&lt;[%]{]&quot;</span><span class="p">)</span> </span><span id="L-1279"><a href="#L-1279"><span class="linenos" data-line="1279"></span></a> <span class="kr">end</span> </span><span id="L-1280"><a href="#L-1280"><span class="linenos" data-line="1280"></span></a> </span><span id="L-1281"><a href="#L-1281"><span class="linenos" data-line="1281"></span></a> <span class="kr">function</span> <span class="nf">handle_wikilink_block</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="p">...)</span> </span><span id="L-1282"><a href="#L-1282"><span class="linenos" data-line="1282"></span></a> <span class="n">handle_wikilink_block</span> <span class="o">=</span> <span class="n">self</span><span class="p">:</span><span class="n">switch</span><span class="p">(</span><span class="n">handle_wikilink_block</span><span class="p">,</span> <span class="p">{</span> </span><span id="L-1283"><a href="#L-1283"><span class="linenos" data-line="1283"></span></a> <span class="p">[</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">Parser</span><span class="p">.</span><span class="n">heading_block</span><span class="p">,</span> </span><span id="L-1284"><a href="#L-1284"><span class="linenos" data-line="1284"></span></a> <span class="p">[</span><span class="s2">&quot;&lt;&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">Parser</span><span class="p">.</span><span class="n">tag</span><span class="p">,</span> </span><span id="L-1285"><a href="#L-1285"><span class="linenos" data-line="1285"></span></a> <span class="p">[</span><span class="s2">&quot;[&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">Parser</span><span class="p">.</span><span class="n">wikilink_block</span><span class="p">,</span> </span><span id="L-1286"><a href="#L-1286"><span class="linenos" data-line="1286"></span></a> </span><span id="L-1287"><a href="#L-1287"><span class="linenos" data-line="1287"></span></a> <span class="p">[</span><span class="s2">&quot;]&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kr">function</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> </span><span id="L-1288"><a href="#L-1288"><span class="linenos" data-line="1288"></span></a> <span class="kr">if</span> <span class="n">self</span><span class="p">:</span><span class="n">read</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="o">==</span> <span class="s2">&quot;]&quot;</span> <span class="kr">then</span> </span><span id="L-1289"><a href="#L-1289"><span class="linenos" data-line="1289"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">emit</span><span class="p">(</span><span class="s2">&quot;]]&quot;</span><span class="p">)</span> </span><span id="L-1290"><a href="#L-1290"><span class="linenos" data-line="1290"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">advance</span><span class="p">()</span> </span><span id="L-1291"><a href="#L-1291"><span class="linenos" data-line="1291"></span></a> <span class="kr">return</span> <span class="n">self</span><span class="p">:</span><span class="n">pop</span><span class="p">()</span> </span><span id="L-1292"><a href="#L-1292"><span class="linenos" data-line="1292"></span></a> <span class="kr">end</span> </span><span id="L-1293"><a href="#L-1293"><span class="linenos" data-line="1293"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">emit</span><span class="p">(</span><span class="s2">&quot;]&quot;</span><span class="p">)</span> </span><span id="L-1294"><a href="#L-1294"><span class="linenos" data-line="1294"></span></a> <span class="kr">end</span><span class="p">,</span> </span><span id="L-1295"><a href="#L-1295"><span class="linenos" data-line="1295"></span></a> </span><span id="L-1296"><a href="#L-1296"><span class="linenos" data-line="1296"></span></a> <span class="p">[</span><span class="s2">&quot;{&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">Parser</span><span class="p">.</span><span class="n">braces</span><span class="p">,</span> </span><span id="L-1297"><a href="#L-1297"><span class="linenos" data-line="1297"></span></a> <span class="p">[</span><span class="s2">&quot;&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">Parser</span><span class="p">.</span><span class="n">pop</span><span class="p">,</span> </span><span id="L-1298"><a href="#L-1298"><span class="linenos" data-line="1298"></span></a> <span class="p">[</span><span class="kc">false</span><span class="p">]</span> <span class="o">=</span> <span class="n">Parser</span><span class="p">.</span><span class="n">emit</span> </span><span id="L-1299"><a href="#L-1299"><span class="linenos" data-line="1299"></span></a> <span class="p">})</span> </span><span id="L-1300"><a href="#L-1300"><span class="linenos" data-line="1300"></span></a> <span class="kr">return</span> <span class="n">handle_wikilink_block</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="p">...)</span> </span><span id="L-1301"><a href="#L-1301"><span class="linenos" data-line="1301"></span></a> <span class="kr">end</span> </span><span id="L-1302"><a href="#L-1302"><span class="linenos" data-line="1302"></span></a> </span><span id="L-1303"><a href="#L-1303"><span class="linenos" data-line="1303"></span></a> <span class="kr">function</span> <span class="nc">Parser</span><span class="p">:</span><span class="nf">wikilink_block</span><span class="p">()</span> </span><span id="L-1304"><a href="#L-1304"><span class="linenos" data-line="1304"></span></a> <span class="kr">if</span> <span class="n">self</span><span class="p">:</span><span class="n">read</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="o">==</span> <span class="s2">&quot;[&quot;</span> <span class="kr">then</span> </span><span id="L-1305"><a href="#L-1305"><span class="linenos" data-line="1305"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">emit</span><span class="p">(</span><span class="s2">&quot;[[&quot;</span><span class="p">)</span> </span><span id="L-1306"><a href="#L-1306"><span class="linenos" data-line="1306"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">advance</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span> </span><span id="L-1307"><a href="#L-1307"><span class="linenos" data-line="1307"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">emit</span><span class="p">(</span><span class="n">Wikitext</span><span class="p">:</span><span class="n">new</span><span class="p">(</span><span class="n">self</span><span class="p">:</span><span class="n">get</span><span class="p">(</span><span class="n">do_wikilink_block</span><span class="p">)))</span> </span><span id="L-1308"><a href="#L-1308"><span class="linenos" data-line="1308"></span></a> <span class="kr">else</span> </span><span id="L-1309"><a href="#L-1309"><span class="linenos" data-line="1309"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">emit</span><span class="p">(</span><span class="s2">&quot;[&quot;</span><span class="p">)</span> </span><span id="L-1310"><a href="#L-1310"><span class="linenos" data-line="1310"></span></a> <span class="kr">end</span> </span><span id="L-1311"><a href="#L-1311"><span class="linenos" data-line="1311"></span></a> <span class="kr">end</span> </span><span id="L-1312"><a href="#L-1312"><span class="linenos" data-line="1312"></span></a><span class="kr">end</span> </span><span id="L-1313"><a href="#L-1313"><span class="linenos" data-line="1313"></span></a> </span><span id="L-1314"><a href="#L-1314"><span class="linenos" data-line="1314"></span></a><span class="c1">-- Lines which only contain comments, &quot; &quot; and &quot;\t&quot; are eaten, so long as</span> </span><span id="L-1315"><a href="#L-1315"><span class="linenos" data-line="1315"></span></a><span class="c1">-- they&#39;re bookended by &quot;\n&quot; (i.e. not the first or last line).</span> </span><span id="L-1316"><a href="#L-1316"><span class="linenos" data-line="1316"></span></a><span class="kr">function</span> <span class="nc">Parser</span><span class="p">:</span><span class="nf">newline</span><span class="p">()</span> </span><span id="L-1317"><a href="#L-1317"><span class="linenos" data-line="1317"></span></a> <span class="kd">local</span> <span class="n">text</span><span class="p">,</span> <span class="n">head</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">text</span><span class="p">,</span> <span class="n">self</span><span class="p">.</span><span class="n">head</span> </span><span id="L-1318"><a href="#L-1318"><span class="linenos" data-line="1318"></span></a> <span class="kr">while</span> <span class="kc">true</span> <span class="kr">do</span> </span><span id="L-1319"><a href="#L-1319"><span class="linenos" data-line="1319"></span></a> <span class="kr">repeat</span> </span><span id="L-1320"><a href="#L-1320"><span class="linenos" data-line="1320"></span></a> <span class="kd">local</span> <span class="n">loc</span> <span class="o">=</span> <span class="n">match</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="s2">&quot;^[</span><span class="se">\t</span><span class="s2"> ]*&lt;!%-%-()&quot;</span><span class="p">,</span> <span class="n">head</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> </span><span id="L-1321"><a href="#L-1321"><span class="linenos" data-line="1321"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">loc</span> <span class="kr">then</span> </span><span id="L-1322"><a href="#L-1322"><span class="linenos" data-line="1322"></span></a> <span class="kr">break</span> </span><span id="L-1323"><a href="#L-1323"><span class="linenos" data-line="1323"></span></a> <span class="kr">end</span> </span><span id="L-1324"><a href="#L-1324"><span class="linenos" data-line="1324"></span></a> <span class="n">loc</span> <span class="o">=</span> <span class="nb">select</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="n">find</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="s2">&quot;--&gt;&quot;</span><span class="p">,</span> <span class="n">loc</span><span class="p">,</span> <span class="kc">true</span><span class="p">))</span> </span><span id="L-1325"><a href="#L-1325"><span class="linenos" data-line="1325"></span></a> <span class="n">head</span> <span class="o">=</span> <span class="n">loc</span> <span class="ow">or</span> <span class="n">head</span> </span><span id="L-1326"><a href="#L-1326"><span class="linenos" data-line="1326"></span></a> <span class="kr">until</span> <span class="ow">not</span> <span class="n">loc</span> </span><span id="L-1327"><a href="#L-1327"><span class="linenos" data-line="1327"></span></a> <span class="c1">-- Fail if no comments found.</span> </span><span id="L-1328"><a href="#L-1328"><span class="linenos" data-line="1328"></span></a> <span class="kr">if</span> <span class="n">head</span> <span class="o">==</span> <span class="n">self</span><span class="p">.</span><span class="n">head</span> <span class="kr">then</span> </span><span id="L-1329"><a href="#L-1329"><span class="linenos" data-line="1329"></span></a> <span class="kr">break</span> </span><span id="L-1330"><a href="#L-1330"><span class="linenos" data-line="1330"></span></a> <span class="kr">end</span> </span><span id="L-1331"><a href="#L-1331"><span class="linenos" data-line="1331"></span></a> <span class="n">head</span> <span class="o">=</span> <span class="n">match</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="s2">&quot;^[</span><span class="se">\t</span><span class="s2"> ]*()</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">head</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> </span><span id="L-1332"><a href="#L-1332"><span class="linenos" data-line="1332"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">head</span> <span class="kr">then</span> </span><span id="L-1333"><a href="#L-1333"><span class="linenos" data-line="1333"></span></a> <span class="kr">break</span> </span><span id="L-1334"><a href="#L-1334"><span class="linenos" data-line="1334"></span></a> <span class="kr">end</span> </span><span id="L-1335"><a href="#L-1335"><span class="linenos" data-line="1335"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">jump</span><span class="p">(</span><span class="n">head</span><span class="p">)</span> </span><span id="L-1336"><a href="#L-1336"><span class="linenos" data-line="1336"></span></a> <span class="kr">end</span> </span><span id="L-1337"><a href="#L-1337"><span class="linenos" data-line="1337"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">emit</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span> </span><span id="L-1338"><a href="#L-1338"><span class="linenos" data-line="1338"></span></a><span class="kr">end</span> </span><span id="L-1339"><a href="#L-1339"><span class="linenos" data-line="1339"></span></a> </span><span id="L-1340"><a href="#L-1340"><span class="linenos" data-line="1340"></span></a><span class="kr">do</span> </span><span id="L-1341"><a href="#L-1341"><span class="linenos" data-line="1341"></span></a> <span class="c1">-- Handlers.</span> </span><span id="L-1342"><a href="#L-1342"><span class="linenos" data-line="1342"></span></a> <span class="kd">local</span> <span class="n">handle_start</span> </span><span id="L-1343"><a href="#L-1343"><span class="linenos" data-line="1343"></span></a> <span class="kd">local</span> <span class="n">main_handler</span> </span><span id="L-1344"><a href="#L-1344"><span class="linenos" data-line="1344"></span></a> </span><span id="L-1345"><a href="#L-1345"><span class="linenos" data-line="1345"></span></a> <span class="c1">-- If `transcluded` is true, then the text is checked for a pair of</span> </span><span id="L-1346"><a href="#L-1346"><span class="linenos" data-line="1346"></span></a> <span class="c1">-- onlyinclude tags. If these are found (even if they&#39;re in the wrong</span> </span><span id="L-1347"><a href="#L-1347"><span class="linenos" data-line="1347"></span></a> <span class="c1">-- order), then the start of the page is treated as though it is preceded</span> </span><span id="L-1348"><a href="#L-1348"><span class="linenos" data-line="1348"></span></a> <span class="c1">-- by a closing onlyinclude tag.</span> </span><span id="L-1349"><a href="#L-1349"><span class="linenos" data-line="1349"></span></a> <span class="c1">-- Note 1: unlike other parser extension tags, onlyinclude tags are case-</span> </span><span id="L-1350"><a href="#L-1350"><span class="linenos" data-line="1350"></span></a> <span class="c1">-- sensitive and cannot contain whitespace.</span> </span><span id="L-1351"><a href="#L-1351"><span class="linenos" data-line="1351"></span></a> <span class="c1">-- Note 2: onlyinclude tags *can* be implicitly closed by the end of the</span> </span><span id="L-1352"><a href="#L-1352"><span class="linenos" data-line="1352"></span></a> <span class="c1">-- text, but the hard requirement above means this can only happen if</span> </span><span id="L-1353"><a href="#L-1353"><span class="linenos" data-line="1353"></span></a> <span class="c1">-- either the tags are in the wrong order or there are multiple onlyinclude</span> </span><span id="L-1354"><a href="#L-1354"><span class="linenos" data-line="1354"></span></a> <span class="c1">-- blocks.</span> </span><span id="L-1355"><a href="#L-1355"><span class="linenos" data-line="1355"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">do_parse</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">transcluded</span><span class="p">)</span> </span><span id="L-1356"><a href="#L-1356"><span class="linenos" data-line="1356"></span></a> <span class="kd">local</span> <span class="n">layer</span> <span class="o">=</span> <span class="n">self</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> </span><span id="L-1357"><a href="#L-1357"><span class="linenos" data-line="1357"></span></a> <span class="n">layer</span><span class="p">.</span><span class="n">handler</span> <span class="o">=</span> <span class="n">handle_start</span> </span><span id="L-1358"><a href="#L-1358"><span class="linenos" data-line="1358"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">set_pattern</span><span class="p">(</span><span class="s2">&quot;.&quot;</span><span class="p">)</span> </span><span id="L-1359"><a href="#L-1359"><span class="linenos" data-line="1359"></span></a> <span class="n">self</span><span class="p">.</span><span class="n">section</span> <span class="o">=</span> <span class="mi">0</span> </span><span id="L-1360"><a href="#L-1360"><span class="linenos" data-line="1360"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">transcluded</span> <span class="kr">then</span> </span><span id="L-1361"><a href="#L-1361"><span class="linenos" data-line="1361"></span></a> <span class="kr">return</span> </span><span id="L-1362"><a href="#L-1362"><span class="linenos" data-line="1362"></span></a> <span class="kr">end</span> </span><span id="L-1363"><a href="#L-1363"><span class="linenos" data-line="1363"></span></a> <span class="n">self</span><span class="p">.</span><span class="n">transcluded</span> <span class="o">=</span> <span class="kc">true</span> </span><span id="L-1364"><a href="#L-1364"><span class="linenos" data-line="1364"></span></a> <span class="kd">local</span> <span class="n">text</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">text</span> </span><span id="L-1365"><a href="#L-1365"><span class="linenos" data-line="1365"></span></a> <span class="kr">if</span> <span class="n">find</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="s2">&quot;&lt;/onlyinclude&gt;&quot;</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="kc">true</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-1366"><a href="#L-1366"><span class="linenos" data-line="1366"></span></a> <span class="kd">local</span> <span class="n">head</span> <span class="o">=</span> <span class="n">find</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="s2">&quot;&lt;onlyinclude&gt;&quot;</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="kc">true</span><span class="p">)</span> </span><span id="L-1367"><a href="#L-1367"><span class="linenos" data-line="1367"></span></a> <span class="kr">if</span> <span class="n">head</span> <span class="kr">then</span> </span><span id="L-1368"><a href="#L-1368"><span class="linenos" data-line="1368"></span></a> <span class="n">self</span><span class="p">.</span><span class="n">onlyinclude</span> <span class="o">=</span> <span class="kc">true</span> </span><span id="L-1369"><a href="#L-1369"><span class="linenos" data-line="1369"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">jump</span><span class="p">(</span><span class="n">head</span> <span class="o">+</span> <span class="mi">13</span><span class="p">)</span> </span><span id="L-1370"><a href="#L-1370"><span class="linenos" data-line="1370"></span></a> <span class="kr">end</span> </span><span id="L-1371"><a href="#L-1371"><span class="linenos" data-line="1371"></span></a> <span class="kr">end</span> </span><span id="L-1372"><a href="#L-1372"><span class="linenos" data-line="1372"></span></a> <span class="kr">end</span> </span><span id="L-1373"><a href="#L-1373"><span class="linenos" data-line="1373"></span></a> </span><span id="L-1374"><a href="#L-1374"><span class="linenos" data-line="1374"></span></a> <span class="c1">-- If the first character is &quot;=&quot;, try parsing it as a heading.</span> </span><span id="L-1375"><a href="#L-1375"><span class="linenos" data-line="1375"></span></a> <span class="kr">function</span> <span class="nf">handle_start</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">this</span><span class="p">)</span> </span><span id="L-1376"><a href="#L-1376"><span class="linenos" data-line="1376"></span></a> <span class="kd">local</span> <span class="n">layer</span> <span class="o">=</span> <span class="n">self</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> </span><span id="L-1377"><a href="#L-1377"><span class="linenos" data-line="1377"></span></a> <span class="n">layer</span><span class="p">.</span><span class="n">handler</span> <span class="o">=</span> <span class="n">main_handler</span> </span><span id="L-1378"><a href="#L-1378"><span class="linenos" data-line="1378"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">set_pattern</span><span class="p">(</span><span class="s2">&quot;[</span><span class="se">\n</span><span class="s2">&lt;{]&quot;</span><span class="p">)</span> </span><span id="L-1379"><a href="#L-1379"><span class="linenos" data-line="1379"></span></a> <span class="kr">if</span> <span class="n">this</span> <span class="o">==</span> <span class="s2">&quot;=&quot;</span> <span class="kr">then</span> </span><span id="L-1380"><a href="#L-1380"><span class="linenos" data-line="1380"></span></a> <span class="kr">return</span> <span class="n">self</span><span class="p">:</span><span class="n">heading</span><span class="p">()</span> </span><span id="L-1381"><a href="#L-1381"><span class="linenos" data-line="1381"></span></a> <span class="kr">end</span> </span><span id="L-1382"><a href="#L-1382"><span class="linenos" data-line="1382"></span></a> <span class="kr">return</span> <span class="n">self</span><span class="p">:</span><span class="n">consume</span><span class="p">()</span> </span><span id="L-1383"><a href="#L-1383"><span class="linenos" data-line="1383"></span></a> <span class="kr">end</span> </span><span id="L-1384"><a href="#L-1384"><span class="linenos" data-line="1384"></span></a> </span><span id="L-1385"><a href="#L-1385"><span class="linenos" data-line="1385"></span></a> <span class="kr">function</span> <span class="nf">main_handler</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="p">...)</span> </span><span id="L-1386"><a href="#L-1386"><span class="linenos" data-line="1386"></span></a> <span class="n">main_handler</span> <span class="o">=</span> <span class="n">self</span><span class="p">:</span><span class="n">switch</span><span class="p">(</span><span class="n">main_handler</span><span class="p">,</span> <span class="p">{</span> </span><span id="L-1387"><a href="#L-1387"><span class="linenos" data-line="1387"></span></a> <span class="p">[</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kr">function</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> </span><span id="L-1388"><a href="#L-1388"><span class="linenos" data-line="1388"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">newline</span><span class="p">()</span> </span><span id="L-1389"><a href="#L-1389"><span class="linenos" data-line="1389"></span></a> <span class="kr">if</span> <span class="n">self</span><span class="p">:</span><span class="n">read</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="o">==</span> <span class="s2">&quot;=&quot;</span> <span class="kr">then</span> </span><span id="L-1390"><a href="#L-1390"><span class="linenos" data-line="1390"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">advance</span><span class="p">()</span> </span><span id="L-1391"><a href="#L-1391"><span class="linenos" data-line="1391"></span></a> <span class="kr">return</span> <span class="n">self</span><span class="p">:</span><span class="n">heading</span><span class="p">()</span> </span><span id="L-1392"><a href="#L-1392"><span class="linenos" data-line="1392"></span></a> <span class="kr">end</span> </span><span id="L-1393"><a href="#L-1393"><span class="linenos" data-line="1393"></span></a> <span class="kr">end</span><span class="p">,</span> </span><span id="L-1394"><a href="#L-1394"><span class="linenos" data-line="1394"></span></a> </span><span id="L-1395"><a href="#L-1395"><span class="linenos" data-line="1395"></span></a> <span class="p">[</span><span class="s2">&quot;&lt;&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">Parser</span><span class="p">.</span><span class="n">tag</span><span class="p">,</span> </span><span id="L-1396"><a href="#L-1396"><span class="linenos" data-line="1396"></span></a> </span><span id="L-1397"><a href="#L-1397"><span class="linenos" data-line="1397"></span></a> <span class="p">[</span><span class="s2">&quot;{&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kr">function</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> </span><span id="L-1398"><a href="#L-1398"><span class="linenos" data-line="1398"></span></a> <span class="kr">if</span> <span class="n">self</span><span class="p">:</span><span class="n">read</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="o">==</span> <span class="s2">&quot;{&quot;</span> <span class="kr">then</span> </span><span id="L-1399"><a href="#L-1399"><span class="linenos" data-line="1399"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">template_or_parameter</span><span class="p">()</span> </span><span id="L-1400"><a href="#L-1400"><span class="linenos" data-line="1400"></span></a> <span class="kr">return</span> <span class="n">self</span><span class="p">:</span><span class="n">consume</span><span class="p">()</span> </span><span id="L-1401"><a href="#L-1401"><span class="linenos" data-line="1401"></span></a> <span class="kr">end</span> </span><span id="L-1402"><a href="#L-1402"><span class="linenos" data-line="1402"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">emit</span><span class="p">(</span><span class="s2">&quot;{&quot;</span><span class="p">)</span> </span><span id="L-1403"><a href="#L-1403"><span class="linenos" data-line="1403"></span></a> <span class="kr">end</span><span class="p">,</span> </span><span id="L-1404"><a href="#L-1404"><span class="linenos" data-line="1404"></span></a> </span><span id="L-1405"><a href="#L-1405"><span class="linenos" data-line="1405"></span></a> <span class="p">[</span><span class="s2">&quot;&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">Parser</span><span class="p">.</span><span class="n">pop</span><span class="p">,</span> </span><span id="L-1406"><a href="#L-1406"><span class="linenos" data-line="1406"></span></a> <span class="p">[</span><span class="kc">false</span><span class="p">]</span> <span class="o">=</span> <span class="n">Parser</span><span class="p">.</span><span class="n">emit</span> </span><span id="L-1407"><a href="#L-1407"><span class="linenos" data-line="1407"></span></a> <span class="p">})</span> </span><span id="L-1408"><a href="#L-1408"><span class="linenos" data-line="1408"></span></a> <span class="kr">return</span> <span class="n">main_handler</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="p">...)</span> </span><span id="L-1409"><a href="#L-1409"><span class="linenos" data-line="1409"></span></a> <span class="kr">end</span> </span><span id="L-1410"><a href="#L-1410"><span class="linenos" data-line="1410"></span></a> </span><span id="L-1411"><a href="#L-1411"><span class="linenos" data-line="1411"></span></a> <span class="kr">function</span> <span class="nc">export</span><span class="p">.</span><span class="nf">parse</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="n">transcluded</span><span class="p">)</span> </span><span id="L-1412"><a href="#L-1412"><span class="linenos" data-line="1412"></span></a> <span class="kd">local</span> <span class="n">text_type</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="n">text</span><span class="p">)</span> </span><span id="L-1413"><a href="#L-1413"><span class="linenos" data-line="1413"></span></a> <span class="kr">return</span> <span class="p">(</span><span class="nb">select</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="n">Parser</span><span class="p">:</span><span class="n">parse</span><span class="p">{</span> </span><span id="L-1414"><a href="#L-1414"><span class="linenos" data-line="1414"></span></a> <span class="n">text</span> <span class="o">=</span> <span class="n">text_type</span> <span class="o">==</span> <span class="s2">&quot;string&quot;</span> <span class="ow">and</span> <span class="n">text</span> <span class="ow">or</span> </span><span id="L-1415"><a href="#L-1415"><span class="linenos" data-line="1415"></span></a> <span class="n">text_type</span> <span class="o">==</span> <span class="s2">&quot;number&quot;</span> <span class="ow">and</span> <span class="nb">tostring</span><span class="p">(</span><span class="n">text</span><span class="p">)</span> <span class="ow">or</span> </span><span id="L-1416"><a href="#L-1416"><span class="linenos" data-line="1416"></span></a> <span class="nb">error</span><span class="p">(</span><span class="s2">&quot;bad argument #1 (string expected, got &quot;</span> <span class="o">..</span> <span class="n">text_type</span> <span class="o">..</span> <span class="s2">&quot;)&quot;</span><span class="p">),</span> </span><span id="L-1417"><a href="#L-1417"><span class="linenos" data-line="1417"></span></a> <span class="n">node</span> <span class="o">=</span> <span class="p">{</span><span class="n">Wikitext</span><span class="p">,</span> <span class="kc">true</span><span class="p">},</span> </span><span id="L-1418"><a href="#L-1418"><span class="linenos" data-line="1418"></span></a> <span class="n">route</span> <span class="o">=</span> <span class="p">{</span><span class="n">do_parse</span><span class="p">,</span> <span class="n">transcluded</span><span class="p">}</span> </span><span id="L-1419"><a href="#L-1419"><span class="linenos" data-line="1419"></span></a> <span class="p">}))</span> </span><span id="L-1420"><a href="#L-1420"><span class="linenos" data-line="1420"></span></a> <span class="kr">end</span> </span><span id="L-1421"><a href="#L-1421"><span class="linenos" data-line="1421"></span></a> <span class="n">parse</span> <span class="o">=</span> <span class="n">export</span><span class="p">.</span><span class="n">parse</span> </span><span id="L-1422"><a href="#L-1422"><span class="linenos" data-line="1422"></span></a><span class="kr">end</span> </span><span id="L-1423"><a href="#L-1423"><span class="linenos" data-line="1423"></span></a> </span><span id="L-1424"><a href="#L-1424"><span class="linenos" data-line="1424"></span></a><span class="kr">do</span> </span><span id="L-1425"><a href="#L-1425"><span class="linenos" data-line="1425"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">next_template</span><span class="p">(</span><span class="n">iter</span><span class="p">)</span> </span><span id="L-1426"><a href="#L-1426"><span class="linenos" data-line="1426"></span></a> <span class="kr">while</span> <span class="kc">true</span> <span class="kr">do</span> </span><span id="L-1427"><a href="#L-1427"><span class="linenos" data-line="1427"></span></a> <span class="kd">local</span> <span class="n">node</span> <span class="o">=</span> <span class="n">iter</span><span class="p">()</span> </span><span id="L-1428"><a href="#L-1428"><span class="linenos" data-line="1428"></span></a> <span class="kr">if</span> <span class="n">node</span> <span class="o">==</span> <span class="kc">nil</span> <span class="ow">or</span> <span class="n">class_else_type</span><span class="p">(</span><span class="n">node</span><span class="p">)</span> <span class="o">==</span> <span class="s2">&quot;template&quot;</span> <span class="kr">then</span> </span><span id="L-1429"><a href="#L-1429"><span class="linenos" data-line="1429"></span></a> <span class="kr">return</span> <span class="n">node</span> </span><span id="L-1430"><a href="#L-1430"><span class="linenos" data-line="1430"></span></a> <span class="kr">end</span> </span><span id="L-1431"><a href="#L-1431"><span class="linenos" data-line="1431"></span></a> <span class="kr">end</span> </span><span id="L-1432"><a href="#L-1432"><span class="linenos" data-line="1432"></span></a> <span class="kr">end</span> </span><span id="L-1433"><a href="#L-1433"><span class="linenos" data-line="1433"></span></a> </span><span id="L-1434"><a href="#L-1434"><span class="linenos" data-line="1434"></span></a> <span class="kr">function</span> <span class="nc">export</span><span class="p">.</span><span class="nf">find_templates</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="n">not_transcluded</span><span class="p">)</span> </span><span id="L-1435"><a href="#L-1435"><span class="linenos" data-line="1435"></span></a> <span class="kr">return</span> <span class="n">next_template</span><span class="p">,</span> <span class="n">parse</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="ow">not</span> <span class="n">not_transcluded</span><span class="p">):</span><span class="n">__pairs</span><span class="p">(</span><span class="s2">&quot;next_node&quot;</span><span class="p">)</span> </span><span id="L-1436"><a href="#L-1436"><span class="linenos" data-line="1436"></span></a> <span class="kr">end</span> </span><span id="L-1437"><a href="#L-1437"><span class="linenos" data-line="1437"></span></a><span class="kr">end</span> </span><span id="L-1438"><a href="#L-1438"><span class="linenos" data-line="1438"></span></a> </span><span id="L-1439"><a href="#L-1439"><span class="linenos" data-line="1439"></span></a><span class="kr">do</span> </span><span id="L-1440"><a href="#L-1440"><span class="linenos" data-line="1440"></span></a> <span class="kd">local</span> <span class="n">link_parameter_1</span><span class="p">,</span> <span class="n">link_parameter_2</span> </span><span id="L-1441"><a href="#L-1441"><span class="linenos" data-line="1441"></span></a> </span><span id="L-1442"><a href="#L-1442"><span class="linenos" data-line="1442"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">get_link_parameter_1</span><span class="p">()</span> </span><span id="L-1443"><a href="#L-1443"><span class="linenos" data-line="1443"></span></a> <span class="n">link_parameter_1</span><span class="p">,</span> <span class="n">get_link_parameter_1</span> <span class="o">=</span> <span class="p">(</span><span class="n">data</span> <span class="ow">or</span> <span class="n">get_data</span><span class="p">()).</span><span class="n">template_link_param_1</span><span class="p">,</span> <span class="kc">nil</span> </span><span id="L-1444"><a href="#L-1444"><span class="linenos" data-line="1444"></span></a> <span class="kr">return</span> <span class="n">link_parameter_1</span> </span><span id="L-1445"><a href="#L-1445"><span class="linenos" data-line="1445"></span></a> <span class="kr">end</span> </span><span id="L-1446"><a href="#L-1446"><span class="linenos" data-line="1446"></span></a> </span><span id="L-1447"><a href="#L-1447"><span class="linenos" data-line="1447"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">get_link_parameter_2</span><span class="p">()</span> </span><span id="L-1448"><a href="#L-1448"><span class="linenos" data-line="1448"></span></a> <span class="n">link_parameter_2</span><span class="p">,</span> <span class="n">get_link_parameter_2</span> <span class="o">=</span> <span class="p">(</span><span class="n">data</span> <span class="ow">or</span> <span class="n">get_data</span><span class="p">()).</span><span class="n">template_link_param_2</span><span class="p">,</span> <span class="kc">nil</span> </span><span id="L-1449"><a href="#L-1449"><span class="linenos" data-line="1449"></span></a> <span class="kr">return</span> <span class="n">link_parameter_2</span> </span><span id="L-1450"><a href="#L-1450"><span class="linenos" data-line="1450"></span></a> <span class="kr">end</span> </span><span id="L-1451"><a href="#L-1451"><span class="linenos" data-line="1451"></span></a> </span><span id="L-1452"><a href="#L-1452"><span class="linenos" data-line="1452"></span></a> <span class="c1">-- Generate a link. If the target title doesn&#39;t have a fragment, use &quot;#top&quot;</span> </span><span id="L-1453"><a href="#L-1453"><span class="linenos" data-line="1453"></span></a> <span class="c1">-- (which is an implicit anchor at the top of every page), as this ensures</span> </span><span id="L-1454"><a href="#L-1454"><span class="linenos" data-line="1454"></span></a> <span class="c1">-- self-links still display as links, since bold display is distracting and</span> </span><span id="L-1455"><a href="#L-1455"><span class="linenos" data-line="1455"></span></a> <span class="c1">-- unintuitive for template links.</span> </span><span id="L-1456"><a href="#L-1456"><span class="linenos" data-line="1456"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">link_page</span><span class="p">(</span><span class="n">title</span><span class="p">,</span> <span class="n">display</span><span class="p">)</span> </span><span id="L-1457"><a href="#L-1457"><span class="linenos" data-line="1457"></span></a> <span class="kd">local</span> <span class="n">fragment</span> <span class="o">=</span> <span class="n">title</span><span class="p">.</span><span class="n">fragment</span> </span><span id="L-1458"><a href="#L-1458"><span class="linenos" data-line="1458"></span></a> <span class="kr">if</span> <span class="n">fragment</span> <span class="o">==</span> <span class="s2">&quot;&quot;</span> <span class="kr">then</span> </span><span id="L-1459"><a href="#L-1459"><span class="linenos" data-line="1459"></span></a> <span class="n">fragment</span> <span class="o">=</span> <span class="s2">&quot;top&quot;</span> </span><span id="L-1460"><a href="#L-1460"><span class="linenos" data-line="1460"></span></a> <span class="kr">end</span> </span><span id="L-1461"><a href="#L-1461"><span class="linenos" data-line="1461"></span></a> <span class="kr">return</span> <span class="n">format</span><span class="p">(</span> </span><span id="L-1462"><a href="#L-1462"><span class="linenos" data-line="1462"></span></a> <span class="s2">&quot;[[:%s|%s]]&quot;</span><span class="p">,</span> </span><span id="L-1463"><a href="#L-1463"><span class="linenos" data-line="1463"></span></a> <span class="n">encode_uri</span><span class="p">(</span><span class="n">title</span><span class="p">.</span><span class="n">prefixedText</span> <span class="o">..</span> <span class="s2">&quot;#&quot;</span> <span class="o">..</span> <span class="n">fragment</span><span class="p">,</span> <span class="s2">&quot;WIKI&quot;</span><span class="p">),</span> </span><span id="L-1464"><a href="#L-1464"><span class="linenos" data-line="1464"></span></a> <span class="n">display</span> </span><span id="L-1465"><a href="#L-1465"><span class="linenos" data-line="1465"></span></a> <span class="p">)</span> </span><span id="L-1466"><a href="#L-1466"><span class="linenos" data-line="1466"></span></a> <span class="kr">end</span> </span><span id="L-1467"><a href="#L-1467"><span class="linenos" data-line="1467"></span></a> </span><span id="L-1468"><a href="#L-1468"><span class="linenos" data-line="1468"></span></a> <span class="c1">-- pf_arg1 or pf_arg2 may need to be linked if a given parser function</span> </span><span id="L-1469"><a href="#L-1469"><span class="linenos" data-line="1469"></span></a> <span class="c1">-- treats them as a pagename. If a key exists in `namespace`, the value is</span> </span><span id="L-1470"><a href="#L-1470"><span class="linenos" data-line="1470"></span></a> <span class="c1">-- the namespace for the page: if not 0, then the namespace prefix will</span> </span><span id="L-1471"><a href="#L-1471"><span class="linenos" data-line="1471"></span></a> <span class="c1">-- always be added to the input (e.g. {{#invoke:}} can only target the</span> </span><span id="L-1472"><a href="#L-1472"><span class="linenos" data-line="1472"></span></a> <span class="c1">-- Module: namespace, so inputting &quot;Template:foo&quot; gives</span> </span><span id="L-1473"><a href="#L-1473"><span class="linenos" data-line="1473"></span></a> <span class="c1">-- &quot;Module:Template:foo&quot;, and &quot;Module:foo&quot; gives &quot;Module:Module:foo&quot;).</span> </span><span id="L-1474"><a href="#L-1474"><span class="linenos" data-line="1474"></span></a> <span class="c1">-- However, this isn&#39;t possible with mainspace (namespace 0), so prefixes</span> </span><span id="L-1475"><a href="#L-1475"><span class="linenos" data-line="1475"></span></a> <span class="c1">-- are respected. make_title handles all of this automatically.</span> </span><span id="L-1476"><a href="#L-1476"><span class="linenos" data-line="1476"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">finalize_arg</span><span class="p">(</span><span class="n">pagename</span><span class="p">,</span> <span class="n">namespace</span><span class="p">)</span> </span><span id="L-1477"><a href="#L-1477"><span class="linenos" data-line="1477"></span></a> <span class="kr">if</span> <span class="n">namespace</span> <span class="o">==</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-1478"><a href="#L-1478"><span class="linenos" data-line="1478"></span></a> <span class="kr">return</span> <span class="n">pagename</span> </span><span id="L-1479"><a href="#L-1479"><span class="linenos" data-line="1479"></span></a> <span class="kr">end</span> </span><span id="L-1480"><a href="#L-1480"><span class="linenos" data-line="1480"></span></a> <span class="kd">local</span> <span class="n">title</span> <span class="o">=</span> <span class="n">make_title</span><span class="p">(</span><span class="n">namespace</span><span class="p">,</span> <span class="n">pagename</span><span class="p">)</span> </span><span id="L-1481"><a href="#L-1481"><span class="linenos" data-line="1481"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">title</span> <span class="ow">and</span> <span class="n">is_valid_title</span><span class="p">(</span><span class="n">title</span><span class="p">))</span> <span class="kr">then</span> </span><span id="L-1482"><a href="#L-1482"><span class="linenos" data-line="1482"></span></a> <span class="kr">return</span> <span class="n">pagename</span> </span><span id="L-1483"><a href="#L-1483"><span class="linenos" data-line="1483"></span></a> <span class="kr">end</span> </span><span id="L-1484"><a href="#L-1484"><span class="linenos" data-line="1484"></span></a> <span class="kr">return</span> <span class="n">link_page</span><span class="p">(</span><span class="n">title</span><span class="p">,</span> <span class="n">pagename</span><span class="p">)</span> </span><span id="L-1485"><a href="#L-1485"><span class="linenos" data-line="1485"></span></a> <span class="kr">end</span> </span><span id="L-1486"><a href="#L-1486"><span class="linenos" data-line="1486"></span></a> </span><span id="L-1487"><a href="#L-1487"><span class="linenos" data-line="1487"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">render_title</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span> </span><span id="L-1488"><a href="#L-1488"><span class="linenos" data-line="1488"></span></a> <span class="c1">-- parse_template_name returns a table of transclusion modifiers plus</span> </span><span id="L-1489"><a href="#L-1489"><span class="linenos" data-line="1489"></span></a> <span class="c1">-- the normalized template/magic word name, which will be used as link</span> </span><span id="L-1490"><a href="#L-1490"><span class="linenos" data-line="1490"></span></a> <span class="c1">-- targets. The third return value pf_arg1 is the first argument of a</span> </span><span id="L-1491"><a href="#L-1491"><span class="linenos" data-line="1491"></span></a> <span class="c1">-- a parser function, which comes after the colon (e.g. &quot;foo&quot; in</span> </span><span id="L-1492"><a href="#L-1492"><span class="linenos" data-line="1492"></span></a> <span class="c1">-- &quot;{{#IF:foo|bar|baz}}&quot;). This means args[1] (i.e. the first argument</span> </span><span id="L-1493"><a href="#L-1493"><span class="linenos" data-line="1493"></span></a> <span class="c1">-- that comes after a pipe is actually argument 2, and so on. Note: the</span> </span><span id="L-1494"><a href="#L-1494"><span class="linenos" data-line="1494"></span></a> <span class="c1">-- second parameter of parse_template_name checks if there are any</span> </span><span id="L-1495"><a href="#L-1495"><span class="linenos" data-line="1495"></span></a> <span class="c1">-- arguments, since parser variables cannot take arguments (e.g.</span> </span><span id="L-1496"><a href="#L-1496"><span class="linenos" data-line="1496"></span></a> <span class="c1">-- {{CURRENTYEAR}} is a parser variable, but {{CURRENTYEAR|foo}}</span> </span><span id="L-1497"><a href="#L-1497"><span class="linenos" data-line="1497"></span></a> <span class="c1">-- transcludes &quot;Template:CURRENTYEAR&quot;). In such cases, the returned</span> </span><span id="L-1498"><a href="#L-1498"><span class="linenos" data-line="1498"></span></a> <span class="c1">-- table explicitly includes the &quot;Template:&quot; prefix in the template</span> </span><span id="L-1499"><a href="#L-1499"><span class="linenos" data-line="1499"></span></a> <span class="c1">-- name. The third parameter instructs it to retain any fragment in the</span> </span><span id="L-1500"><a href="#L-1500"><span class="linenos" data-line="1500"></span></a> <span class="c1">-- template name in the returned table, if present.</span> </span><span id="L-1501"><a href="#L-1501"><span class="linenos" data-line="1501"></span></a> <span class="kd">local</span> <span class="n">chunks</span><span class="p">,</span> <span class="n">subclass</span><span class="p">,</span> <span class="n">pf_arg1</span> <span class="o">=</span> <span class="n">parse_template_name</span><span class="p">(</span> </span><span id="L-1502"><a href="#L-1502"><span class="linenos" data-line="1502"></span></a> <span class="n">name</span><span class="p">,</span> </span><span id="L-1503"><a href="#L-1503"><span class="linenos" data-line="1503"></span></a> <span class="n">args</span> <span class="ow">and</span> <span class="nb">pairs</span><span class="p">(</span><span class="n">args</span><span class="p">)(</span><span class="n">args</span><span class="p">)</span> <span class="o">~=</span> <span class="kc">nil</span><span class="p">,</span> </span><span id="L-1504"><a href="#L-1504"><span class="linenos" data-line="1504"></span></a> <span class="kc">true</span> </span><span id="L-1505"><a href="#L-1505"><span class="linenos" data-line="1505"></span></a> <span class="p">)</span> </span><span id="L-1506"><a href="#L-1506"><span class="linenos" data-line="1506"></span></a> <span class="kr">if</span> <span class="n">chunks</span> <span class="o">==</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-1507"><a href="#L-1507"><span class="linenos" data-line="1507"></span></a> <span class="kr">return</span> <span class="n">name</span><span class="p">,</span> <span class="n">args</span> </span><span id="L-1508"><a href="#L-1508"><span class="linenos" data-line="1508"></span></a> <span class="kr">end</span> </span><span id="L-1509"><a href="#L-1509"><span class="linenos" data-line="1509"></span></a> <span class="kd">local</span> <span class="n">chunks_len</span> <span class="o">=</span> <span class="o">#</span><span class="n">chunks</span> </span><span id="L-1510"><a href="#L-1510"><span class="linenos" data-line="1510"></span></a> <span class="c1">-- Additionally, generate the corresponding table `rawchunks`, which</span> </span><span id="L-1511"><a href="#L-1511"><span class="linenos" data-line="1511"></span></a> <span class="c1">-- is a list of colon-separated chunks in the raw input. This is used</span> </span><span id="L-1512"><a href="#L-1512"><span class="linenos" data-line="1512"></span></a> <span class="c1">-- to retrieve the display forms for each chunk.</span> </span><span id="L-1513"><a href="#L-1513"><span class="linenos" data-line="1513"></span></a> <span class="kd">local</span> <span class="n">rawchunks</span> <span class="o">=</span> <span class="n">split</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="s2">&quot;:&quot;</span><span class="p">)</span> </span><span id="L-1514"><a href="#L-1514"><span class="linenos" data-line="1514"></span></a> <span class="kr">for</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="n">chunks_len</span> <span class="o">-</span> <span class="mi">1</span> <span class="kr">do</span> </span><span id="L-1515"><a href="#L-1515"><span class="linenos" data-line="1515"></span></a> <span class="n">chunks</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">format</span><span class="p">(</span> </span><span id="L-1516"><a href="#L-1516"><span class="linenos" data-line="1516"></span></a> <span class="s2">&quot;[[%s|%s]]&quot;</span><span class="p">,</span> </span><span id="L-1517"><a href="#L-1517"><span class="linenos" data-line="1517"></span></a> <span class="n">encode_uri</span><span class="p">((</span><span class="n">magic_words</span> <span class="ow">or</span> <span class="n">get_magic_words</span><span class="p">())[</span><span class="n">sub</span><span class="p">(</span><span class="n">chunks</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">2</span><span class="p">)].</span><span class="n">transclusion_modifier</span><span class="p">,</span> <span class="s2">&quot;WIKI&quot;</span><span class="p">),</span> </span><span id="L-1518"><a href="#L-1518"><span class="linenos" data-line="1518"></span></a> <span class="n">rawchunks</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> </span><span id="L-1519"><a href="#L-1519"><span class="linenos" data-line="1519"></span></a> <span class="p">)</span> </span><span id="L-1520"><a href="#L-1520"><span class="linenos" data-line="1520"></span></a> <span class="kr">end</span> </span><span id="L-1521"><a href="#L-1521"><span class="linenos" data-line="1521"></span></a> <span class="kd">local</span> <span class="n">chunk</span> <span class="o">=</span> <span class="n">chunks</span><span class="p">[</span><span class="n">chunks_len</span><span class="p">]</span> </span><span id="L-1522"><a href="#L-1522"><span class="linenos" data-line="1522"></span></a> <span class="c1">-- If it&#39;s a template, return a link to it with link_page, concatenating</span> </span><span id="L-1523"><a href="#L-1523"><span class="linenos" data-line="1523"></span></a> <span class="c1">-- the remaining chunks in `rawchunks` to form the display text.</span> </span><span id="L-1524"><a href="#L-1524"><span class="linenos" data-line="1524"></span></a> <span class="c1">-- Use new_title with the default namespace 10 (Template:) to generate</span> </span><span id="L-1525"><a href="#L-1525"><span class="linenos" data-line="1525"></span></a> <span class="c1">-- a target title, which is the same setting used for retrieving</span> </span><span id="L-1526"><a href="#L-1526"><span class="linenos" data-line="1526"></span></a> <span class="c1">-- templates (including those in other namespaces, as prefixes override</span> </span><span id="L-1527"><a href="#L-1527"><span class="linenos" data-line="1527"></span></a> <span class="c1">-- the default).</span> </span><span id="L-1528"><a href="#L-1528"><span class="linenos" data-line="1528"></span></a> <span class="kr">if</span> <span class="n">subclass</span> <span class="o">==</span> <span class="s2">&quot;template&quot;</span> <span class="kr">then</span> </span><span id="L-1529"><a href="#L-1529"><span class="linenos" data-line="1529"></span></a> <span class="n">chunks</span><span class="p">[</span><span class="n">chunks_len</span><span class="p">]</span> <span class="o">=</span> <span class="n">link_page</span><span class="p">(</span> </span><span id="L-1530"><a href="#L-1530"><span class="linenos" data-line="1530"></span></a> <span class="n">new_title</span><span class="p">(</span><span class="n">chunk</span><span class="p">,</span> <span class="mi">10</span><span class="p">),</span> </span><span id="L-1531"><a href="#L-1531"><span class="linenos" data-line="1531"></span></a> <span class="n">concat</span><span class="p">(</span><span class="n">rawchunks</span><span class="p">,</span> <span class="s2">&quot;&amp;#58;&quot;</span><span class="p">,</span> <span class="n">chunks_len</span><span class="p">)</span> <span class="c1">-- :</span> </span><span id="L-1532"><a href="#L-1532"><span class="linenos" data-line="1532"></span></a> <span class="p">)</span> </span><span id="L-1533"><a href="#L-1533"><span class="linenos" data-line="1533"></span></a> <span class="kr">return</span> <span class="n">concat</span><span class="p">(</span><span class="n">chunks</span><span class="p">,</span> <span class="s2">&quot;&amp;#58;&quot;</span><span class="p">),</span> <span class="n">args</span> <span class="c1">-- :</span> </span><span id="L-1534"><a href="#L-1534"><span class="linenos" data-line="1534"></span></a> <span class="kr">elseif</span> <span class="n">subclass</span> <span class="o">==</span> <span class="s2">&quot;parser variable&quot;</span> <span class="kr">then</span> </span><span id="L-1535"><a href="#L-1535"><span class="linenos" data-line="1535"></span></a> <span class="n">chunks</span><span class="p">[</span><span class="n">chunks_len</span><span class="p">]</span> <span class="o">=</span> <span class="n">format</span><span class="p">(</span> </span><span id="L-1536"><a href="#L-1536"><span class="linenos" data-line="1536"></span></a> <span class="s2">&quot;[[%s|%s]]&quot;</span><span class="p">,</span> </span><span id="L-1537"><a href="#L-1537"><span class="linenos" data-line="1537"></span></a> <span class="n">encode_uri</span><span class="p">((</span><span class="n">magic_words</span> <span class="ow">or</span> <span class="n">get_magic_words</span><span class="p">())[</span><span class="n">chunk</span><span class="p">].</span><span class="n">parser_variable</span><span class="p">,</span> <span class="s2">&quot;WIKI&quot;</span><span class="p">),</span> </span><span id="L-1538"><a href="#L-1538"><span class="linenos" data-line="1538"></span></a> <span class="n">rawchunks</span><span class="p">[</span><span class="n">chunks_len</span><span class="p">]</span> </span><span id="L-1539"><a href="#L-1539"><span class="linenos" data-line="1539"></span></a> <span class="p">)</span> </span><span id="L-1540"><a href="#L-1540"><span class="linenos" data-line="1540"></span></a> <span class="kr">return</span> <span class="n">concat</span><span class="p">(</span><span class="n">chunks</span><span class="p">,</span> <span class="s2">&quot;&amp;#58;&quot;</span><span class="p">),</span> <span class="n">args</span> <span class="c1">-- :</span> </span><span id="L-1541"><a href="#L-1541"><span class="linenos" data-line="1541"></span></a> <span class="kr">end</span> </span><span id="L-1542"><a href="#L-1542"><span class="linenos" data-line="1542"></span></a> <span class="c1">-- Otherwise, it must be a parser function.</span> </span><span id="L-1543"><a href="#L-1543"><span class="linenos" data-line="1543"></span></a> <span class="kd">local</span> <span class="n">mgw_data</span> <span class="o">=</span> <span class="p">(</span><span class="n">magic_words</span> <span class="ow">or</span> <span class="n">get_magic_words</span><span class="p">())[</span><span class="n">sub</span><span class="p">(</span><span class="n">chunk</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">2</span><span class="p">)]</span> </span><span id="L-1544"><a href="#L-1544"><span class="linenos" data-line="1544"></span></a> <span class="kd">local</span> <span class="n">link</span> <span class="o">=</span> <span class="n">mgw_data</span><span class="p">.</span><span class="n">parser_function</span> <span class="ow">or</span> <span class="n">mgw_data</span><span class="p">.</span><span class="n">transclusion_modifier</span> </span><span id="L-1545"><a href="#L-1545"><span class="linenos" data-line="1545"></span></a> <span class="kd">local</span> <span class="n">pf_arg2</span> <span class="o">=</span> <span class="n">args</span> <span class="ow">and</span> <span class="n">args</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="ow">or</span> <span class="kc">nil</span> </span><span id="L-1546"><a href="#L-1546"><span class="linenos" data-line="1546"></span></a> <span class="c1">-- Some magic words have different links, depending on whether argument</span> </span><span id="L-1547"><a href="#L-1547"><span class="linenos" data-line="1547"></span></a> <span class="c1">-- 2 is specified (e.g. &quot;baz&quot; in {{foo:bar|baz}}).</span> </span><span id="L-1548"><a href="#L-1548"><span class="linenos" data-line="1548"></span></a> <span class="kr">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">link</span><span class="p">)</span> <span class="o">==</span> <span class="s2">&quot;table&quot;</span> <span class="kr">then</span> </span><span id="L-1549"><a href="#L-1549"><span class="linenos" data-line="1549"></span></a> <span class="n">link</span> <span class="o">=</span> <span class="n">pf_arg2</span> <span class="ow">and</span> <span class="n">link</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="ow">or</span> <span class="n">link</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> </span><span id="L-1550"><a href="#L-1550"><span class="linenos" data-line="1550"></span></a> <span class="kr">end</span> </span><span id="L-1551"><a href="#L-1551"><span class="linenos" data-line="1551"></span></a> <span class="n">chunks</span><span class="p">[</span><span class="n">chunks_len</span><span class="p">]</span> <span class="o">=</span> <span class="n">format</span><span class="p">(</span> </span><span id="L-1552"><a href="#L-1552"><span class="linenos" data-line="1552"></span></a> <span class="s2">&quot;[[%s|%s]]&quot;</span><span class="p">,</span> </span><span id="L-1553"><a href="#L-1553"><span class="linenos" data-line="1553"></span></a> <span class="n">encode_uri</span><span class="p">(</span><span class="n">link</span><span class="p">,</span> <span class="s2">&quot;WIKI&quot;</span><span class="p">),</span> </span><span id="L-1554"><a href="#L-1554"><span class="linenos" data-line="1554"></span></a> <span class="n">rawchunks</span><span class="p">[</span><span class="n">chunks_len</span><span class="p">]</span> </span><span id="L-1555"><a href="#L-1555"><span class="linenos" data-line="1555"></span></a> <span class="p">)</span> </span><span id="L-1556"><a href="#L-1556"><span class="linenos" data-line="1556"></span></a> <span class="c1">-- #TAG: has special handling, because documentation links for parser</span> </span><span id="L-1557"><a href="#L-1557"><span class="linenos" data-line="1557"></span></a> <span class="c1">-- extension tags come from [[Module:data/parser extension tags]].</span> </span><span id="L-1558"><a href="#L-1558"><span class="linenos" data-line="1558"></span></a> <span class="kr">if</span> <span class="n">chunk</span> <span class="o">==</span> <span class="s2">&quot;#TAG:&quot;</span> <span class="kr">then</span> </span><span id="L-1559"><a href="#L-1559"><span class="linenos" data-line="1559"></span></a> <span class="c1">-- Tags are only case-insensitive with ASCII characters.</span> </span><span id="L-1560"><a href="#L-1560"><span class="linenos" data-line="1560"></span></a> <span class="kd">local</span> <span class="n">tag</span> <span class="o">=</span> <span class="p">(</span><span class="n">parser_extension_tags</span> <span class="ow">or</span> <span class="n">get_parser_extension_tags</span><span class="p">())[</span><span class="n">lower</span><span class="p">(</span><span class="n">php_trim</span><span class="p">(</span><span class="n">pf_arg1</span><span class="p">))]</span> </span><span id="L-1561"><a href="#L-1561"><span class="linenos" data-line="1561"></span></a> <span class="kr">if</span> <span class="n">tag</span> <span class="kr">then</span> </span><span id="L-1562"><a href="#L-1562"><span class="linenos" data-line="1562"></span></a> <span class="n">pf_arg1</span> <span class="o">=</span> <span class="n">format</span><span class="p">(</span> </span><span id="L-1563"><a href="#L-1563"><span class="linenos" data-line="1563"></span></a> <span class="s2">&quot;[[%s|%s]]&quot;</span><span class="p">,</span> </span><span id="L-1564"><a href="#L-1564"><span class="linenos" data-line="1564"></span></a> <span class="n">encode_uri</span><span class="p">(</span><span class="n">tag</span><span class="p">,</span> <span class="s2">&quot;WIKI&quot;</span><span class="p">),</span> </span><span id="L-1565"><a href="#L-1565"><span class="linenos" data-line="1565"></span></a> <span class="n">pf_arg1</span> </span><span id="L-1566"><a href="#L-1566"><span class="linenos" data-line="1566"></span></a> <span class="p">)</span> </span><span id="L-1567"><a href="#L-1567"><span class="linenos" data-line="1567"></span></a> <span class="kr">end</span> </span><span id="L-1568"><a href="#L-1568"><span class="linenos" data-line="1568"></span></a> <span class="c1">-- Otherwise, finalize pf_arg1 and add it to `chunks`.</span> </span><span id="L-1569"><a href="#L-1569"><span class="linenos" data-line="1569"></span></a> <span class="kr">else</span> </span><span id="L-1570"><a href="#L-1570"><span class="linenos" data-line="1570"></span></a> <span class="n">pf_arg1</span> <span class="o">=</span> <span class="n">finalize_arg</span><span class="p">(</span><span class="n">pf_arg1</span><span class="p">,</span> <span class="p">(</span><span class="n">link_parameter_1</span> <span class="ow">or</span> <span class="n">get_link_parameter_1</span><span class="p">())[</span><span class="n">chunk</span><span class="p">])</span> </span><span id="L-1571"><a href="#L-1571"><span class="linenos" data-line="1571"></span></a> <span class="kr">end</span> </span><span id="L-1572"><a href="#L-1572"><span class="linenos" data-line="1572"></span></a> <span class="n">chunks</span><span class="p">[</span><span class="n">chunks_len</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">pf_arg1</span> </span><span id="L-1573"><a href="#L-1573"><span class="linenos" data-line="1573"></span></a> <span class="c1">-- Finalize pf_arg2 (if applicable), then return.</span> </span><span id="L-1574"><a href="#L-1574"><span class="linenos" data-line="1574"></span></a> <span class="kr">if</span> <span class="n">pf_arg2</span> <span class="kr">then</span> </span><span id="L-1575"><a href="#L-1575"><span class="linenos" data-line="1575"></span></a> <span class="n">args</span> <span class="o">=</span> <span class="n">shallowcopy</span><span class="p">(</span><span class="n">args</span><span class="p">)</span> <span class="c1">-- Avoid destructively modifying args.</span> </span><span id="L-1576"><a href="#L-1576"><span class="linenos" data-line="1576"></span></a> <span class="n">args</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">finalize_arg</span><span class="p">(</span><span class="n">pf_arg2</span><span class="p">,</span> <span class="p">(</span><span class="n">link_parameter_2</span> <span class="ow">or</span> <span class="n">get_link_parameter_2</span><span class="p">())[</span><span class="n">chunk</span><span class="p">])</span> </span><span id="L-1577"><a href="#L-1577"><span class="linenos" data-line="1577"></span></a> <span class="kr">end</span> </span><span id="L-1578"><a href="#L-1578"><span class="linenos" data-line="1578"></span></a> <span class="kr">return</span> <span class="n">concat</span><span class="p">(</span><span class="n">chunks</span><span class="p">,</span> <span class="s2">&quot;&amp;#58;&quot;</span><span class="p">),</span> <span class="n">args</span> <span class="c1">-- :</span> </span><span id="L-1579"><a href="#L-1579"><span class="linenos" data-line="1579"></span></a> <span class="kr">end</span> </span><span id="L-1580"><a href="#L-1580"><span class="linenos" data-line="1580"></span></a> </span><span id="L-1581"><a href="#L-1581"><span class="linenos" data-line="1581"></span></a> <span class="kr">function</span> <span class="nc">export</span><span class="p">.</span><span class="nf">buildTemplate</span><span class="p">(</span><span class="n">title</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span> </span><span id="L-1582"><a href="#L-1582"><span class="linenos" data-line="1582"></span></a> <span class="kd">local</span> <span class="n">output</span> <span class="o">=</span> <span class="p">{</span><span class="n">title</span><span class="p">}</span> </span><span id="L-1583"><a href="#L-1583"><span class="linenos" data-line="1583"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">args</span> <span class="kr">then</span> </span><span id="L-1584"><a href="#L-1584"><span class="linenos" data-line="1584"></span></a> <span class="kr">return</span> <span class="n">output</span> </span><span id="L-1585"><a href="#L-1585"><span class="linenos" data-line="1585"></span></a> <span class="kr">end</span> </span><span id="L-1586"><a href="#L-1586"><span class="linenos" data-line="1586"></span></a> <span class="c1">-- Iterate over all numbered parameters in order, followed by any</span> </span><span id="L-1587"><a href="#L-1587"><span class="linenos" data-line="1587"></span></a> <span class="c1">-- remaining parameters in codepoint order. Implicit parameters are</span> </span><span id="L-1588"><a href="#L-1588"><span class="linenos" data-line="1588"></span></a> <span class="c1">-- used wherever possible, even if explicit numbers are interpolated</span> </span><span id="L-1589"><a href="#L-1589"><span class="linenos" data-line="1589"></span></a> <span class="c1">-- between them (e.g. 0 would go before any implicit parameters, and</span> </span><span id="L-1590"><a href="#L-1590"><span class="linenos" data-line="1590"></span></a> <span class="c1">-- 2.5 between 2 and 3).</span> </span><span id="L-1591"><a href="#L-1591"><span class="linenos" data-line="1591"></span></a> <span class="c1">-- TODO: handle &quot;=&quot; and &quot;|&quot; in params/values.</span> </span><span id="L-1592"><a href="#L-1592"><span class="linenos" data-line="1592"></span></a> <span class="kd">local</span> <span class="n">implicit</span> </span><span id="L-1593"><a href="#L-1593"><span class="linenos" data-line="1593"></span></a> <span class="kr">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="kr">in</span> <span class="n">sorted_pairs</span><span class="p">(</span><span class="n">args</span><span class="p">)</span> <span class="kr">do</span> </span><span id="L-1594"><a href="#L-1594"><span class="linenos" data-line="1594"></span></a> <span class="kr">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">k</span><span class="p">)</span> <span class="o">==</span> <span class="s2">&quot;number&quot;</span> <span class="ow">and</span> <span class="n">k</span> <span class="o">&gt;=</span> <span class="mi">1</span> <span class="ow">and</span> <span class="n">k</span> <span class="o">%</span> <span class="mi">1</span> <span class="o">==</span> <span class="mi">0</span> <span class="kr">then</span> </span><span id="L-1595"><a href="#L-1595"><span class="linenos" data-line="1595"></span></a> <span class="kr">if</span> <span class="n">implicit</span> <span class="o">==</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-1596"><a href="#L-1596"><span class="linenos" data-line="1596"></span></a> <span class="n">implicit</span> <span class="o">=</span> <span class="n">table_len</span><span class="p">(</span><span class="n">args</span><span class="p">)</span> </span><span id="L-1597"><a href="#L-1597"><span class="linenos" data-line="1597"></span></a> <span class="kr">end</span> </span><span id="L-1598"><a href="#L-1598"><span class="linenos" data-line="1598"></span></a> <span class="n">insert</span><span class="p">(</span><span class="n">output</span><span class="p">,</span> <span class="n">k</span> <span class="o">&lt;=</span> <span class="n">implicit</span> <span class="ow">and</span> <span class="n">v</span> <span class="ow">or</span> <span class="n">k</span> <span class="o">..</span> <span class="s2">&quot;=&quot;</span> <span class="o">..</span> <span class="n">v</span><span class="p">)</span> </span><span id="L-1599"><a href="#L-1599"><span class="linenos" data-line="1599"></span></a> <span class="kr">else</span> </span><span id="L-1600"><a href="#L-1600"><span class="linenos" data-line="1600"></span></a> <span class="n">insert</span><span class="p">(</span><span class="n">output</span><span class="p">,</span> <span class="n">k</span> <span class="o">..</span> <span class="s2">&quot;=&quot;</span> <span class="o">..</span> <span class="n">v</span><span class="p">)</span> </span><span id="L-1601"><a href="#L-1601"><span class="linenos" data-line="1601"></span></a> <span class="kr">end</span> </span><span id="L-1602"><a href="#L-1602"><span class="linenos" data-line="1602"></span></a> <span class="kr">end</span> </span><span id="L-1603"><a href="#L-1603"><span class="linenos" data-line="1603"></span></a> <span class="kr">return</span> <span class="n">output</span> </span><span id="L-1604"><a href="#L-1604"><span class="linenos" data-line="1604"></span></a> <span class="kr">end</span> </span><span id="L-1605"><a href="#L-1605"><span class="linenos" data-line="1605"></span></a> <span class="n">build_template</span> <span class="o">=</span> <span class="n">export</span><span class="p">.</span><span class="n">buildTemplate</span> </span><span id="L-1606"><a href="#L-1606"><span class="linenos" data-line="1606"></span></a> </span><span id="L-1607"><a href="#L-1607"><span class="linenos" data-line="1607"></span></a> <span class="kr">function</span> <span class="nc">export</span><span class="p">.</span><span class="nf">templateLink</span><span class="p">(</span><span class="n">title</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">no_link</span><span class="p">)</span> </span><span id="L-1608"><a href="#L-1608"><span class="linenos" data-line="1608"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">no_link</span> <span class="kr">then</span> </span><span id="L-1609"><a href="#L-1609"><span class="linenos" data-line="1609"></span></a> <span class="n">title</span><span class="p">,</span> <span class="n">args</span> <span class="o">=</span> <span class="n">render_title</span><span class="p">(</span><span class="n">title</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span> </span><span id="L-1610"><a href="#L-1610"><span class="linenos" data-line="1610"></span></a> <span class="kr">end</span> </span><span id="L-1611"><a href="#L-1611"><span class="linenos" data-line="1611"></span></a> <span class="kd">local</span> <span class="n">output</span> <span class="o">=</span> <span class="n">build_template</span><span class="p">(</span><span class="n">title</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span> </span><span id="L-1612"><a href="#L-1612"><span class="linenos" data-line="1612"></span></a> <span class="kr">for</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="o">#</span><span class="n">output</span> <span class="kr">do</span> </span><span id="L-1613"><a href="#L-1613"><span class="linenos" data-line="1613"></span></a> <span class="n">output</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">encode_entities</span><span class="p">(</span><span class="n">output</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="s2">&quot;={}&quot;</span><span class="p">,</span> <span class="kc">true</span><span class="p">,</span> <span class="kc">true</span><span class="p">)</span> </span><span id="L-1614"><a href="#L-1614"><span class="linenos" data-line="1614"></span></a> <span class="kr">end</span> </span><span id="L-1615"><a href="#L-1615"><span class="linenos" data-line="1615"></span></a> <span class="kr">return</span> <span class="nb">tostring</span><span class="p">(</span><span class="n">html_create</span><span class="p">(</span><span class="s2">&quot;code&quot;</span><span class="p">)</span> </span><span id="L-1616"><a href="#L-1616"><span class="linenos" data-line="1616"></span></a> <span class="p">:</span><span class="n">css</span><span class="p">(</span><span class="s2">&quot;white-space&quot;</span><span class="p">,</span> <span class="s2">&quot;pre-wrap&quot;</span><span class="p">)</span> </span><span id="L-1617"><a href="#L-1617"><span class="linenos" data-line="1617"></span></a> <span class="p">:</span><span class="n">wikitext</span><span class="p">(</span><span class="s2">&quot;&amp;#123;&amp;#123;&quot;</span> <span class="o">..</span> <span class="n">concat</span><span class="p">(</span><span class="n">output</span><span class="p">,</span> <span class="s2">&quot;&amp;#124;&quot;</span><span class="p">)</span> <span class="o">..</span> <span class="s2">&quot;&amp;#125;&amp;#125;&quot;</span><span class="p">)</span> <span class="c1">-- {{ | }}</span> </span><span id="L-1618"><a href="#L-1618"><span class="linenos" data-line="1618"></span></a> <span class="p">)</span> </span><span id="L-1619"><a href="#L-1619"><span class="linenos" data-line="1619"></span></a> <span class="kr">end</span> </span><span id="L-1620"><a href="#L-1620"><span class="linenos" data-line="1620"></span></a><span class="kr">end</span> </span><span id="L-1621"><a href="#L-1621"><span class="linenos" data-line="1621"></span></a> </span><span id="L-1622"><a href="#L-1622"><span class="linenos" data-line="1622"></span></a><span class="kr">do</span> </span><span id="L-1623"><a href="#L-1623"><span class="linenos" data-line="1623"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">next_parameter</span><span class="p">(</span><span class="n">iter</span><span class="p">)</span> </span><span id="L-1624"><a href="#L-1624"><span class="linenos" data-line="1624"></span></a> <span class="kr">while</span> <span class="kc">true</span> <span class="kr">do</span> </span><span id="L-1625"><a href="#L-1625"><span class="linenos" data-line="1625"></span></a> <span class="kd">local</span> <span class="n">node</span> <span class="o">=</span> <span class="n">iter</span><span class="p">()</span> </span><span id="L-1626"><a href="#L-1626"><span class="linenos" data-line="1626"></span></a> <span class="kr">if</span> <span class="n">node</span> <span class="o">==</span> <span class="kc">nil</span> <span class="ow">or</span> <span class="n">class_else_type</span><span class="p">(</span><span class="n">node</span><span class="p">)</span> <span class="o">==</span> <span class="s2">&quot;parameter&quot;</span> <span class="kr">then</span> </span><span id="L-1627"><a href="#L-1627"><span class="linenos" data-line="1627"></span></a> <span class="kr">return</span> <span class="n">node</span> </span><span id="L-1628"><a href="#L-1628"><span class="linenos" data-line="1628"></span></a> <span class="kr">end</span> </span><span id="L-1629"><a href="#L-1629"><span class="linenos" data-line="1629"></span></a> <span class="kr">end</span> </span><span id="L-1630"><a href="#L-1630"><span class="linenos" data-line="1630"></span></a> <span class="kr">end</span> </span><span id="L-1631"><a href="#L-1631"><span class="linenos" data-line="1631"></span></a> </span><span id="L-1632"><a href="#L-1632"><span class="linenos" data-line="1632"></span></a> <span class="kr">function</span> <span class="nc">export</span><span class="p">.</span><span class="nf">find_parameters</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="n">not_transcluded</span><span class="p">)</span> </span><span id="L-1633"><a href="#L-1633"><span class="linenos" data-line="1633"></span></a> <span class="kr">return</span> <span class="n">next_parameter</span><span class="p">,</span> <span class="n">parse</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="ow">not</span> <span class="n">not_transcluded</span><span class="p">):</span><span class="n">__pairs</span><span class="p">(</span><span class="s2">&quot;next_node&quot;</span><span class="p">)</span> </span><span id="L-1634"><a href="#L-1634"><span class="linenos" data-line="1634"></span></a> <span class="kr">end</span> </span><span id="L-1635"><a href="#L-1635"><span class="linenos" data-line="1635"></span></a> </span><span id="L-1636"><a href="#L-1636"><span class="linenos" data-line="1636"></span></a> <span class="kr">function</span> <span class="nc">export</span><span class="p">.</span><span class="nf">displayParameter</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">default</span><span class="p">)</span> </span><span id="L-1637"><a href="#L-1637"><span class="linenos" data-line="1637"></span></a> <span class="kr">return</span> <span class="nb">tostring</span><span class="p">(</span><span class="n">html_create</span><span class="p">(</span><span class="s2">&quot;code&quot;</span><span class="p">)</span> </span><span id="L-1638"><a href="#L-1638"><span class="linenos" data-line="1638"></span></a> <span class="p">:</span><span class="n">css</span><span class="p">(</span><span class="s2">&quot;white-space&quot;</span><span class="p">,</span> <span class="s2">&quot;pre-wrap&quot;</span><span class="p">)</span> </span><span id="L-1639"><a href="#L-1639"><span class="linenos" data-line="1639"></span></a> <span class="p">:</span><span class="n">wikitext</span><span class="p">(</span><span class="s2">&quot;&amp;#123;&amp;#123;&amp;#123;&quot;</span> <span class="o">..</span> <span class="n">concat</span><span class="p">({</span><span class="n">name</span><span class="p">,</span> <span class="n">default</span><span class="p">},</span> <span class="s2">&quot;&amp;#124;&quot;</span><span class="p">)</span> <span class="o">..</span> <span class="s2">&quot;&amp;#125;&amp;#125;&amp;#125;&quot;</span><span class="p">)</span> <span class="c1">-- {{{ | }}}</span> </span><span id="L-1640"><a href="#L-1640"><span class="linenos" data-line="1640"></span></a> <span class="p">)</span> </span><span id="L-1641"><a href="#L-1641"><span class="linenos" data-line="1641"></span></a> <span class="kr">end</span> </span><span id="L-1642"><a href="#L-1642"><span class="linenos" data-line="1642"></span></a><span class="kr">end</span> </span><span id="L-1643"><a href="#L-1643"><span class="linenos" data-line="1643"></span></a> </span><span id="L-1644"><a href="#L-1644"><span class="linenos" data-line="1644"></span></a><span class="kr">do</span> </span><span id="L-1645"><a href="#L-1645"><span class="linenos" data-line="1645"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">check_level</span><span class="p">(</span><span class="n">level</span><span class="p">)</span> </span><span id="L-1646"><a href="#L-1646"><span class="linenos" data-line="1646"></span></a> <span class="kr">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">level</span><span class="p">)</span> <span class="o">~=</span> <span class="s2">&quot;number&quot;</span> <span class="kr">then</span> </span><span id="L-1647"><a href="#L-1647"><span class="linenos" data-line="1647"></span></a> <span class="nb">error</span><span class="p">(</span><span class="s2">&quot;Heading levels must be numbers.&quot;</span><span class="p">)</span> </span><span id="L-1648"><a href="#L-1648"><span class="linenos" data-line="1648"></span></a> <span class="kr">elseif</span> <span class="n">level</span> <span class="o">&lt;</span> <span class="mi">1</span> <span class="ow">or</span> <span class="n">level</span> <span class="o">&gt;</span> <span class="mi">6</span> <span class="ow">or</span> <span class="n">level</span> <span class="o">%</span> <span class="mi">1</span> <span class="o">~=</span> <span class="mi">0</span> <span class="kr">then</span> </span><span id="L-1649"><a href="#L-1649"><span class="linenos" data-line="1649"></span></a> <span class="nb">error</span><span class="p">(</span><span class="s2">&quot;Heading levels must be integers between 1 and 6.&quot;</span><span class="p">)</span> </span><span id="L-1650"><a href="#L-1650"><span class="linenos" data-line="1650"></span></a> <span class="kr">end</span> </span><span id="L-1651"><a href="#L-1651"><span class="linenos" data-line="1651"></span></a> <span class="kr">return</span> <span class="n">level</span> </span><span id="L-1652"><a href="#L-1652"><span class="linenos" data-line="1652"></span></a> <span class="kr">end</span> </span><span id="L-1653"><a href="#L-1653"><span class="linenos" data-line="1653"></span></a> </span><span id="L-1654"><a href="#L-1654"><span class="linenos" data-line="1654"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">next_heading</span><span class="p">(</span><span class="n">iter</span><span class="p">)</span> </span><span id="L-1655"><a href="#L-1655"><span class="linenos" data-line="1655"></span></a> <span class="kr">while</span> <span class="kc">true</span> <span class="kr">do</span> </span><span id="L-1656"><a href="#L-1656"><span class="linenos" data-line="1656"></span></a> <span class="kd">local</span> <span class="n">node</span> <span class="o">=</span> <span class="n">iter</span><span class="p">()</span> </span><span id="L-1657"><a href="#L-1657"><span class="linenos" data-line="1657"></span></a> <span class="kr">if</span> <span class="n">node</span> <span class="o">==</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-1658"><a href="#L-1658"><span class="linenos" data-line="1658"></span></a> <span class="kr">return</span> <span class="kc">nil</span> </span><span id="L-1659"><a href="#L-1659"><span class="linenos" data-line="1659"></span></a> <span class="kr">elseif</span> <span class="n">class_else_type</span><span class="p">(</span><span class="n">node</span><span class="p">)</span> <span class="o">==</span> <span class="s2">&quot;heading&quot;</span> <span class="kr">then</span> </span><span id="L-1660"><a href="#L-1660"><span class="linenos" data-line="1660"></span></a> <span class="kd">local</span> <span class="n">level</span> <span class="o">=</span> <span class="n">node</span><span class="p">.</span><span class="n">level</span> </span><span id="L-1661"><a href="#L-1661"><span class="linenos" data-line="1661"></span></a> <span class="kr">if</span> <span class="n">level</span> <span class="o">&gt;=</span> <span class="n">iter</span><span class="p">.</span><span class="n">i</span> <span class="ow">and</span> <span class="n">level</span> <span class="o">&lt;=</span> <span class="n">iter</span><span class="p">.</span><span class="n">j</span> <span class="kr">then</span> </span><span id="L-1662"><a href="#L-1662"><span class="linenos" data-line="1662"></span></a> <span class="kr">return</span> <span class="n">node</span> </span><span id="L-1663"><a href="#L-1663"><span class="linenos" data-line="1663"></span></a> <span class="kr">end</span> </span><span id="L-1664"><a href="#L-1664"><span class="linenos" data-line="1664"></span></a> <span class="kr">end</span> </span><span id="L-1665"><a href="#L-1665"><span class="linenos" data-line="1665"></span></a> <span class="kr">end</span> </span><span id="L-1666"><a href="#L-1666"><span class="linenos" data-line="1666"></span></a> <span class="kr">end</span> </span><span id="L-1667"><a href="#L-1667"><span class="linenos" data-line="1667"></span></a> </span><span id="L-1668"><a href="#L-1668"><span class="linenos" data-line="1668"></span></a> <span class="c1">-- FIXME: should headings which contain &quot;\n&quot; be returned? This may depend</span> </span><span id="L-1669"><a href="#L-1669"><span class="linenos" data-line="1669"></span></a> <span class="c1">-- on variable factors, like template expansion. They iterate the heading</span> </span><span id="L-1670"><a href="#L-1670"><span class="linenos" data-line="1670"></span></a> <span class="c1">-- count number, but fail on rendering. However, in some cases a different</span> </span><span id="L-1671"><a href="#L-1671"><span class="linenos" data-line="1671"></span></a> <span class="c1">-- heading might still be rendered due to intermediate equals signs; it</span> </span><span id="L-1672"><a href="#L-1672"><span class="linenos" data-line="1672"></span></a> <span class="c1">-- may even be of a different heading level: e.g., this is parsed as an</span> </span><span id="L-1673"><a href="#L-1673"><span class="linenos" data-line="1673"></span></a> <span class="c1">-- L2 heading with a newline (due to the wikilink block), but renders as the</span> </span><span id="L-1674"><a href="#L-1674"><span class="linenos" data-line="1674"></span></a> <span class="c1">-- L1 heading &quot;=foo[[&quot;. Section edit links are sometimes (but not always)</span> </span><span id="L-1675"><a href="#L-1675"><span class="linenos" data-line="1675"></span></a> <span class="c1">-- present in such cases.</span> </span><span id="L-1676"><a href="#L-1676"><span class="linenos" data-line="1676"></span></a> </span><span id="L-1677"><a href="#L-1677"><span class="linenos" data-line="1677"></span></a> <span class="c1">-- ==[[=</span> </span><span id="L-1678"><a href="#L-1678"><span class="linenos" data-line="1678"></span></a> <span class="c1">-- ]]==</span> </span><span id="L-1679"><a href="#L-1679"><span class="linenos" data-line="1679"></span></a> </span><span id="L-1680"><a href="#L-1680"><span class="linenos" data-line="1680"></span></a> <span class="c1">-- TODO: section numbers for edit links seem to also include headings</span> </span><span id="L-1681"><a href="#L-1681"><span class="linenos" data-line="1681"></span></a> <span class="c1">-- nested inside templates and parameters (but apparently not those in</span> </span><span id="L-1682"><a href="#L-1682"><span class="linenos" data-line="1682"></span></a> <span class="c1">-- parser extension tags - need to test this more). If we ever want to add</span> </span><span id="L-1683"><a href="#L-1683"><span class="linenos" data-line="1683"></span></a> <span class="c1">-- section edit links manually, this will need to be accounted for.</span> </span><span id="L-1684"><a href="#L-1684"><span class="linenos" data-line="1684"></span></a> <span class="kr">function</span> <span class="nc">export</span><span class="p">.</span><span class="nf">find_headings</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">)</span> </span><span id="L-1685"><a href="#L-1685"><span class="linenos" data-line="1685"></span></a> <span class="kd">local</span> <span class="n">iter</span> <span class="o">=</span> <span class="n">parse</span><span class="p">(</span><span class="n">text</span><span class="p">):</span><span class="n">__pairs</span><span class="p">(</span><span class="s2">&quot;next_node&quot;</span><span class="p">)</span> </span><span id="L-1686"><a href="#L-1686"><span class="linenos" data-line="1686"></span></a> <span class="n">iter</span><span class="p">.</span><span class="n">i</span><span class="p">,</span> <span class="n">iter</span><span class="p">.</span><span class="n">j</span> <span class="o">=</span> <span class="n">i</span> <span class="ow">and</span> <span class="n">check_level</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="ow">or</span> <span class="mi">1</span><span class="p">,</span> <span class="n">j</span> <span class="ow">and</span> <span class="n">check_level</span><span class="p">(</span><span class="n">j</span><span class="p">)</span> <span class="ow">or</span> <span class="mi">6</span> </span><span id="L-1687"><a href="#L-1687"><span class="linenos" data-line="1687"></span></a> <span class="kr">return</span> <span class="n">next_heading</span><span class="p">,</span> <span class="n">iter</span> </span><span id="L-1688"><a href="#L-1688"><span class="linenos" data-line="1688"></span></a> <span class="kr">end</span> </span><span id="L-1689"><a href="#L-1689"><span class="linenos" data-line="1689"></span></a><span class="kr">end</span> </span><span id="L-1690"><a href="#L-1690"><span class="linenos" data-line="1690"></span></a> </span><span id="L-1691"><a href="#L-1691"><span class="linenos" data-line="1691"></span></a><span class="kr">do</span> </span><span id="L-1692"><a href="#L-1692"><span class="linenos" data-line="1692"></span></a> <span class="kd">local</span> <span class="kr">function</span> <span class="nf">make_tag</span><span class="p">(</span><span class="n">tag</span><span class="p">)</span> </span><span id="L-1693"><a href="#L-1693"><span class="linenos" data-line="1693"></span></a> <span class="kr">return</span> <span class="nb">tostring</span><span class="p">(</span><span class="n">html_create</span><span class="p">(</span><span class="s2">&quot;code&quot;</span><span class="p">)</span> </span><span id="L-1694"><a href="#L-1694"><span class="linenos" data-line="1694"></span></a> <span class="p">:</span><span class="n">css</span><span class="p">(</span><span class="s2">&quot;white-space&quot;</span><span class="p">,</span> <span class="s2">&quot;pre-wrap&quot;</span><span class="p">)</span> </span><span id="L-1695"><a href="#L-1695"><span class="linenos" data-line="1695"></span></a> <span class="p">:</span><span class="n">wikitext</span><span class="p">(</span><span class="s2">&quot;&amp;lt;&quot;</span> <span class="o">..</span> <span class="n">tag</span> <span class="o">..</span> <span class="s2">&quot;&amp;gt;&quot;</span><span class="p">)</span> </span><span id="L-1696"><a href="#L-1696"><span class="linenos" data-line="1696"></span></a> <span class="p">)</span> </span><span id="L-1697"><a href="#L-1697"><span class="linenos" data-line="1697"></span></a> <span class="kr">end</span> </span><span id="L-1698"><a href="#L-1698"><span class="linenos" data-line="1698"></span></a> </span><span id="L-1699"><a href="#L-1699"><span class="linenos" data-line="1699"></span></a> <span class="c1">-- Note: invalid tags are returned without links.</span> </span><span id="L-1700"><a href="#L-1700"><span class="linenos" data-line="1700"></span></a> <span class="kr">function</span> <span class="nc">export</span><span class="p">.</span><span class="nf">wikitagLink</span><span class="p">(</span><span class="n">tag</span><span class="p">)</span> </span><span id="L-1701"><a href="#L-1701"><span class="linenos" data-line="1701"></span></a> <span class="c1">-- &quot;&gt;&quot; can&#39;t appear in tags (including attributes) since the parser</span> </span><span id="L-1702"><a href="#L-1702"><span class="linenos" data-line="1702"></span></a> <span class="c1">-- unconditionally treats &quot;&gt;&quot; as the end of a tag.</span> </span><span id="L-1703"><a href="#L-1703"><span class="linenos" data-line="1703"></span></a> <span class="kr">if</span> <span class="n">find</span><span class="p">(</span><span class="n">tag</span><span class="p">,</span> <span class="s2">&quot;&gt;&quot;</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="kc">true</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-1704"><a href="#L-1704"><span class="linenos" data-line="1704"></span></a> <span class="kr">return</span> <span class="n">make_tag</span><span class="p">(</span><span class="n">tag</span><span class="p">)</span> </span><span id="L-1705"><a href="#L-1705"><span class="linenos" data-line="1705"></span></a> <span class="kr">end</span> </span><span id="L-1706"><a href="#L-1706"><span class="linenos" data-line="1706"></span></a> <span class="c1">-- Tags must start &quot;&lt;tagname...&quot; or &quot;&lt;/tagname...&quot;, with no whitespace</span> </span><span id="L-1707"><a href="#L-1707"><span class="linenos" data-line="1707"></span></a> <span class="c1">-- after &quot;&lt;&quot; or &quot;&lt;/&quot;.</span> </span><span id="L-1708"><a href="#L-1708"><span class="linenos" data-line="1708"></span></a> <span class="kd">local</span> <span class="n">slash</span><span class="p">,</span> <span class="n">tagname</span><span class="p">,</span> <span class="n">remainder</span> <span class="o">=</span> <span class="n">match</span><span class="p">(</span><span class="n">tag</span><span class="p">,</span> <span class="s2">&quot;^(/?)([^/%s]+)(.*)$&quot;</span><span class="p">)</span> </span><span id="L-1709"><a href="#L-1709"><span class="linenos" data-line="1709"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">tagname</span> <span class="kr">then</span> </span><span id="L-1710"><a href="#L-1710"><span class="linenos" data-line="1710"></span></a> <span class="kr">return</span> <span class="n">make_tag</span><span class="p">(</span><span class="n">tag</span><span class="p">)</span> </span><span id="L-1711"><a href="#L-1711"><span class="linenos" data-line="1711"></span></a> <span class="kr">end</span> </span><span id="L-1712"><a href="#L-1712"><span class="linenos" data-line="1712"></span></a> <span class="c1">-- Tags are only case-insensitive with ASCII characters.</span> </span><span id="L-1713"><a href="#L-1713"><span class="linenos" data-line="1713"></span></a> <span class="kd">local</span> <span class="n">link</span> <span class="o">=</span> <span class="n">lower</span><span class="p">(</span><span class="n">tagname</span><span class="p">)</span> </span><span id="L-1714"><a href="#L-1714"><span class="linenos" data-line="1714"></span></a> <span class="kr">if</span> <span class="p">(</span> </span><span id="L-1715"><a href="#L-1715"><span class="linenos" data-line="1715"></span></a> <span class="c1">-- onlyinclude tags must be lowercase and are whitespace intolerant.</span> </span><span id="L-1716"><a href="#L-1716"><span class="linenos" data-line="1716"></span></a> <span class="n">link</span> <span class="o">==</span> <span class="s2">&quot;onlyinclude&quot;</span> <span class="ow">and</span> <span class="p">(</span><span class="n">link</span> <span class="o">~=</span> <span class="n">tagname</span> <span class="ow">or</span> <span class="n">remainder</span> <span class="o">~=</span> <span class="s2">&quot;&quot;</span><span class="p">)</span> <span class="ow">or</span> </span><span id="L-1717"><a href="#L-1717"><span class="linenos" data-line="1717"></span></a> <span class="c1">-- Closing wikitags (except onlyinclude) can only have whitespace</span> </span><span id="L-1718"><a href="#L-1718"><span class="linenos" data-line="1718"></span></a> <span class="c1">-- after the tag name.</span> </span><span id="L-1719"><a href="#L-1719"><span class="linenos" data-line="1719"></span></a> <span class="n">slash</span> <span class="o">==</span> <span class="s2">&quot;/&quot;</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">match</span><span class="p">(</span><span class="n">remainder</span><span class="p">,</span> <span class="s2">&quot;^%s*()$&quot;</span><span class="p">)</span> <span class="ow">or</span> </span><span id="L-1720"><a href="#L-1720"><span class="linenos" data-line="1720"></span></a> <span class="c1">-- Tagnames cannot be followed immediately by &quot;/&quot;, unless it comes</span> </span><span id="L-1721"><a href="#L-1721"><span class="linenos" data-line="1721"></span></a> <span class="c1">-- at the end (e.g. &quot;&lt;nowiki/&gt;&quot;, but not &quot;&lt;nowiki/ &gt;&quot;).</span> </span><span id="L-1722"><a href="#L-1722"><span class="linenos" data-line="1722"></span></a> <span class="n">remainder</span> <span class="o">~=</span> <span class="s2">&quot;/&quot;</span> <span class="ow">and</span> <span class="n">sub</span><span class="p">(</span><span class="n">remainder</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span> <span class="o">==</span> <span class="s2">&quot;/&quot;</span> </span><span id="L-1723"><a href="#L-1723"><span class="linenos" data-line="1723"></span></a> <span class="p">)</span> <span class="kr">then</span> </span><span id="L-1724"><a href="#L-1724"><span class="linenos" data-line="1724"></span></a> <span class="c1">-- Output with no link.</span> </span><span id="L-1725"><a href="#L-1725"><span class="linenos" data-line="1725"></span></a> <span class="kr">return</span> <span class="n">make_tag</span><span class="p">(</span><span class="n">tag</span><span class="p">)</span> </span><span id="L-1726"><a href="#L-1726"><span class="linenos" data-line="1726"></span></a> <span class="kr">end</span> </span><span id="L-1727"><a href="#L-1727"><span class="linenos" data-line="1727"></span></a> <span class="c1">-- Partial transclusion tags aren&#39;t in the table of parser extension</span> </span><span id="L-1728"><a href="#L-1728"><span class="linenos" data-line="1728"></span></a> <span class="c1">-- tags.</span> </span><span id="L-1729"><a href="#L-1729"><span class="linenos" data-line="1729"></span></a> <span class="kr">if</span> <span class="n">link</span> <span class="o">==</span> <span class="s2">&quot;noinclude&quot;</span> <span class="ow">or</span> <span class="n">link</span> <span class="o">==</span> <span class="s2">&quot;includeonly&quot;</span> <span class="ow">or</span> <span class="n">link</span> <span class="o">==</span> <span class="s2">&quot;onlyinclude&quot;</span> <span class="kr">then</span> </span><span id="L-1730"><a href="#L-1730"><span class="linenos" data-line="1730"></span></a> <span class="n">link</span> <span class="o">=</span> <span class="s2">&quot;mw:Transclusion#Partial transclusion&quot;</span> </span><span id="L-1731"><a href="#L-1731"><span class="linenos" data-line="1731"></span></a> <span class="kr">else</span> </span><span id="L-1732"><a href="#L-1732"><span class="linenos" data-line="1732"></span></a> <span class="n">link</span> <span class="o">=</span> <span class="p">(</span><span class="n">parser_extension_tags</span> <span class="ow">or</span> <span class="n">get_parser_extension_tags</span><span class="p">())[</span><span class="n">link</span><span class="p">]</span> </span><span id="L-1733"><a href="#L-1733"><span class="linenos" data-line="1733"></span></a> <span class="kr">end</span> </span><span id="L-1734"><a href="#L-1734"><span class="linenos" data-line="1734"></span></a> <span class="kr">if</span> <span class="n">link</span> <span class="kr">then</span> </span><span id="L-1735"><a href="#L-1735"><span class="linenos" data-line="1735"></span></a> <span class="n">tag</span> <span class="o">=</span> <span class="n">gsub</span><span class="p">(</span><span class="n">tag</span><span class="p">,</span> <span class="n">pattern_escape</span><span class="p">(</span><span class="n">tagname</span><span class="p">),</span> <span class="s2">&quot;[[&quot;</span> <span class="o">..</span> <span class="n">replacement_escape</span><span class="p">(</span><span class="n">encode_uri</span><span class="p">(</span><span class="n">link</span><span class="p">,</span> <span class="s2">&quot;WIKI&quot;</span><span class="p">))</span> <span class="o">..</span> <span class="s2">&quot;|%0]]&quot;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span> </span><span id="L-1736"><a href="#L-1736"><span class="linenos" data-line="1736"></span></a> <span class="kr">end</span> </span><span id="L-1737"><a href="#L-1737"><span class="linenos" data-line="1737"></span></a> <span class="kr">return</span> <span class="n">make_tag</span><span class="p">(</span><span class="n">tag</span><span class="p">)</span> </span><span id="L-1738"><a href="#L-1738"><span class="linenos" data-line="1738"></span></a> <span class="kr">end</span> </span><span id="L-1739"><a href="#L-1739"><span class="linenos" data-line="1739"></span></a><span class="kr">end</span> </span><span id="L-1740"><a href="#L-1740"><span class="linenos" data-line="1740"></span></a> </span><span id="L-1741"><a href="#L-1741"><span class="linenos" data-line="1741"></span></a><span class="c1">-- For convenience.</span> </span><span id="L-1742"><a href="#L-1742"><span class="linenos" data-line="1742"></span></a><span class="n">export</span><span class="p">.</span><span class="n">class_else_type</span> <span class="o">=</span> <span class="n">class_else_type</span> </span><span id="L-1743"><a href="#L-1743"><span class="linenos" data-line="1743"></span></a> </span><span id="L-1744"><a href="#L-1744"><span class="linenos" data-line="1744"></span></a><span class="kr">return</span> <span class="n">export</span> </span></pre></div> <!-- NewPP limit report Parsed by mw‐web.codfw.main‐f69cdc8f6‐v4897 Cached time: 20241124231507 Cache expiry: 2592000 Reduced expiry: false Complications: [vary‐revision‐sha1] CPU time usage: 0.093 seconds Real time usage: 0.129 seconds Preprocessor visited node count: 151/1000000 Post‐expand include size: 13195/2097152 bytes Template argument size: 453/2097152 bytes Highest expansion depth: 8/100 Expensive parser function count: 7/500 Unstrip recursion depth: 0/20 Unstrip post‐expand size: 2873/5000000 bytes Lua time usage: 0.072/10.000 seconds Lua memory usage: 2167846/104857600 bytes Number of Wikibase entities loaded: 0/400 --> <!-- Transclusion expansion time report (%,ms,calls,template) 100.00% 116.689 1 -total 100.00% 116.689 1 Template:documentation 17.75% 20.717 3 Template:tl 16.57% 19.333 1 Template:documentation_outdated 15.24% 17.779 1 Template:maintenance_box 10.26% 11.975 6 Template:wt 6.51% 7.592 3 Template:code 5.70% 6.647 1 Template:module_cat 5.28% 6.156 1 Template:param --> </div><!--esi <esi:include src="/esitest-fa8a495983347898/content" /> --><noscript><img src="https://login.wikimedia.org/wiki/Special:CentralAutoLogin/start?type=1x1" alt="" width="1" height="1" style="border: none; position: absolute;"></noscript> <div class="printfooter" data-nosnippet="">Retrieved from "<a dir="ltr" href="https://en.wiktionary.org/w/index.php?title=Module:template_parser&amp;oldid=82737511">https://en.wiktionary.org/w/index.php?title=Module:template_parser&amp;oldid=82737511</a>"</div></div> <div id="catlinks" class="catlinks" data-mw="interface"><div id="mw-normal-catlinks" class="mw-normal-catlinks"><a href="/wiki/Special:Categories" title="Special:Categories">Categories</a>: <ul><li><a href="/wiki/Category:Templates_and_modules_with_outdated_documentation" title="Category:Templates and modules with outdated documentation">Templates and modules with outdated documentation</a></li><li><a href="/wiki/Category:Wikitext_parsing_modules" title="Category:Wikitext parsing modules">Wikitext parsing modules</a></li></ul></div></div> </div> </div> <div id="mw-navigation"> <h2>Navigation menu</h2> <div id="mw-head"> <nav id="p-personal" class="mw-portlet mw-portlet-personal vector-user-menu-legacy vector-menu" aria-labelledby="p-personal-label" > <h3 id="p-personal-label" class="vector-menu-heading " > <span class="vector-menu-heading-label">Personal tools</span> </h3> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="pt-anonuserpage" class="mw-list-item"><span title="The user page for the IP address you are editing as">Not logged in</span></li><li id="pt-anontalk" class="mw-list-item"><a href="/wiki/Special:MyTalk" title="Discussion about edits from this IP address [n]" accesskey="n"><span>Talk</span></a></li><li id="pt-anoncontribs" class="mw-list-item"><a href="/wiki/Special:MyContributions" title="A list of edits made from this IP address [y]" accesskey="y"><span>Contributions</span></a></li><li id="pt-createaccount" class="mw-list-item"><a href="/w/index.php?title=Special:CreateAccount&amp;returnto=Module%3Atemplate+parser" title="You are encouraged to create an account and log in; however, it is not mandatory"><span>Create account</span></a></li><li id="pt-login" class="mw-list-item"><a href="/w/index.php?title=Special:UserLogin&amp;returnto=Module%3Atemplate+parser" title="You are encouraged to log in; however, it is not mandatory [o]" accesskey="o"><span>Log in</span></a></li> </ul> </div> </nav> <div id="left-navigation"> <nav id="p-namespaces" class="mw-portlet mw-portlet-namespaces vector-menu-tabs vector-menu-tabs-legacy vector-menu" aria-labelledby="p-namespaces-label" > <h3 id="p-namespaces-label" class="vector-menu-heading " > <span class="vector-menu-heading-label">Namespaces</span> </h3> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-nstab-module" class="selected mw-list-item"><a href="/wiki/Module:template_parser" title="View the module page [c]" accesskey="c"><span>Module</span></a></li><li id="ca-talk" class="new mw-list-item"><a href="/w/index.php?title=Module_talk:template_parser&amp;action=edit&amp;redlink=1" rel="discussion" class="new" title="Discussion about the content page (page does not exist) [t]" accesskey="t"><span>Discussion</span></a></li> </ul> </div> </nav> <nav id="p-variants" class="mw-portlet mw-portlet-variants emptyPortlet vector-menu-dropdown vector-menu" aria-labelledby="p-variants-label" > <input type="checkbox" id="p-variants-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-p-variants" class="vector-menu-checkbox" aria-labelledby="p-variants-label" > <label id="p-variants-label" class="vector-menu-heading " > <span class="vector-menu-heading-label">English</span> </label> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </nav> </div> <div id="right-navigation"> <nav id="p-views" class="mw-portlet mw-portlet-views vector-menu-tabs vector-menu-tabs-legacy vector-menu" aria-labelledby="p-views-label" > <h3 id="p-views-label" class="vector-menu-heading " > <span class="vector-menu-heading-label">Views</span> </h3> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-view" class="selected mw-list-item"><a href="/wiki/Module:template_parser"><span>Read</span></a></li><li id="ca-viewsource" class="mw-list-item"><a href="/w/index.php?title=Module:template_parser&amp;action=edit" title="This page is protected.&#10;You can view its source [e]" accesskey="e"><span>View source</span></a></li><li id="ca-history" class="mw-list-item"><a href="/w/index.php?title=Module:template_parser&amp;action=history" title="Past revisions of this page [h]" accesskey="h"><span>History</span></a></li> </ul> </div> </nav> <nav id="p-cactions" class="mw-portlet mw-portlet-cactions emptyPortlet vector-menu-dropdown vector-menu" aria-labelledby="p-cactions-label" title="More options" > <input type="checkbox" id="p-cactions-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-p-cactions" class="vector-menu-checkbox" aria-labelledby="p-cactions-label" > <label id="p-cactions-label" class="vector-menu-heading " > <span class="vector-menu-heading-label">More</span> </label> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </nav> <div id="p-search" role="search" class="vector-search-box-vue vector-search-box-show-thumbnail vector-search-box-auto-expand-width vector-search-box"> <h3 >Search</h3> <form action="/w/index.php" id="searchform" class="vector-search-box-form"> <div id="simpleSearch" class="vector-search-box-inner" data-search-loc="header-navigation"> <input class="vector-search-box-input" type="search" name="search" placeholder="Search Wiktionary" aria-label="Search Wiktionary" autocapitalize="none" title="Search Wiktionary [f]" accesskey="f" id="searchInput" > <input type="hidden" name="title" value="Special:Search"> <input id="mw-searchButton" class="searchButton mw-fallbackSearchButton" type="submit" name="fulltext" title="Search the pages for this text" value="Search"> <input id="searchButton" class="searchButton" type="submit" name="go" title="Go to a page with this exact name if it exists" value="Go"> </div> </form> </div> </div> </div> <div id="mw-panel" class="vector-legacy-sidebar"> <div id="p-logo" role="banner"> <a class="mw-wiki-logo" href="/wiki/Wiktionary:Main_Page" title="Visit the main page"></a> </div> <nav id="p-navigation" class="mw-portlet mw-portlet-navigation vector-menu-portal portal vector-menu" aria-labelledby="p-navigation-label" > <h3 id="p-navigation-label" class="vector-menu-heading " > <span class="vector-menu-heading-label">Navigation</span> </h3> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="n-mainpage-text" class="mw-list-item"><a href="/wiki/Wiktionary:Main_Page"><span>Main Page</span></a></li><li id="n-portal" class="mw-list-item"><a href="/wiki/Wiktionary:Community_portal" title="About the project, what you can do, where to find things"><span>Community portal</span></a></li><li id="n-requestedarticles" class="mw-list-item"><a href="/wiki/Wiktionary:Requested_entries"><span>Requested entries</span></a></li><li id="n-recentchanges" class="mw-list-item"><a href="/wiki/Special:RecentChanges" title="A list of recent changes in the wiki [r]" accesskey="r"><span>Recent changes</span></a></li><li id="n-randompage" class="mw-list-item"><a href="/wiki/Special:Random" title="Load a random page [x]" accesskey="x"><span>Random entry</span></a></li><li id="n-help" class="mw-list-item"><a href="https://en.wiktionary.org/wiki/Help:Contents" title="The place to find out"><span>Help</span></a></li><li id="n-Glossary" class="mw-list-item"><a href="/wiki/Appendix:Glossary"><span>Glossary</span></a></li><li id="n-sitesupport" class="mw-list-item"><a href="//donate.wikimedia.org/wiki/Special:FundraiserRedirector?utm_source=donate&amp;utm_medium=sidebar&amp;utm_campaign=C13_en.wiktionary.org&amp;uselang=en" title="Support us"><span>Donations</span></a></li><li id="n-contact" class="mw-list-item"><a href="/wiki/Wiktionary:Contact_us"><span>Contact us</span></a></li> </ul> </div> </nav> <nav id="p-tb" class="mw-portlet mw-portlet-tb vector-menu-portal portal vector-menu" aria-labelledby="p-tb-label" > <h3 id="p-tb-label" class="vector-menu-heading " > <span class="vector-menu-heading-label">Tools</span> </h3> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="t-whatlinkshere" class="mw-list-item"><a href="/wiki/Special:WhatLinksHere/Module:template_parser" title="A list of all wiki pages that link here [j]" accesskey="j"><span>What links here</span></a></li><li id="t-recentchangeslinked" class="mw-list-item"><a href="/wiki/Special:RecentChangesLinked/Module:template_parser" rel="nofollow" title="Recent changes in pages linked from this page [k]" accesskey="k"><span>Related changes</span></a></li><li id="t-upload" class="mw-list-item"><a href="//commons.wikimedia.org/wiki/Special:UploadWizard?uselang=en" title="Upload files [u]" accesskey="u"><span>Upload file</span></a></li><li id="t-specialpages" class="mw-list-item"><a href="/wiki/Special:SpecialPages" title="A list of all special pages [q]" accesskey="q"><span>Special pages</span></a></li><li id="t-permalink" class="mw-list-item"><a href="/w/index.php?title=Module:template_parser&amp;oldid=82737511" title="Permanent link to this revision of this page"><span>Permanent link</span></a></li><li id="t-info" class="mw-list-item"><a href="/w/index.php?title=Module:template_parser&amp;action=info" title="More information about this page"><span>Page information</span></a></li><li id="t-urlshortener" class="mw-list-item"><a href="/w/index.php?title=Special:UrlShortener&amp;url=https%3A%2F%2Fen.wiktionary.org%2Fwiki%2FModule%3Atemplate_parser"><span>Get shortened URL</span></a></li><li id="t-urlshortener-qrcode" class="mw-list-item"><a href="/w/index.php?title=Special:QrCode&amp;url=https%3A%2F%2Fen.wiktionary.org%2Fwiki%2FModule%3Atemplate_parser"><span>Download QR code</span></a></li> </ul> </div> </nav> <nav id="p-electronpdfservice-sidebar-portlet-heading" class="mw-portlet mw-portlet-electronpdfservice-sidebar-portlet-heading vector-menu-portal portal vector-menu" aria-labelledby="p-electronpdfservice-sidebar-portlet-heading-label" > <h3 id="p-electronpdfservice-sidebar-portlet-heading-label" class="vector-menu-heading " > <span class="vector-menu-heading-label">Print/export</span> </h3> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="electron-print_pdf" class="mw-list-item"><a href="/w/index.php?title=Special:DownloadAsPdf&amp;page=Module%3Atemplate_parser&amp;action=show-download-screen"><span>Download as PDF</span></a></li><li id="t-print" class="mw-list-item"><a href="javascript:print();" rel="alternate" title="Printable version of this page [p]" accesskey="p"><span>Printable version</span></a></li> </ul> </div> </nav> <nav id="p-wikibase-otherprojects" class="mw-portlet mw-portlet-wikibase-otherprojects vector-menu-portal portal vector-menu" aria-labelledby="p-wikibase-otherprojects-label" > <h3 id="p-wikibase-otherprojects-label" class="vector-menu-heading " > <span class="vector-menu-heading-label">In other projects</span> </h3> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="t-wikibase" class="wb-otherproject-link wb-otherproject-wikibase-dataitem mw-list-item"><a href="https://www.wikidata.org/wiki/Special:EntityPage/Q107326219" title="Link to connected data repository item [g]" accesskey="g"><span>Wikidata item</span></a></li> </ul> </div> </nav> <nav id="p-lang" class="mw-portlet mw-portlet-lang vector-menu-portal portal vector-menu" aria-labelledby="p-lang-label" > <h3 id="p-lang-label" class="vector-menu-heading " > <span class="vector-menu-heading-label">In other languages</span> </h3> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li class="interlanguage-link interwiki-ar mw-list-item"><a href="https://ar.wiktionary.org/wiki/%D9%88%D8%AD%D8%AF%D8%A9:template_parser" title="وحدة:template parser – Arabic" lang="ar" hreflang="ar" data-title="وحدة:template parser" data-language-autonym="العربية" data-language-local-name="Arabic" class="interlanguage-link-target"><span>العربية</span></a></li><li class="interlanguage-link interwiki-bn mw-list-item"><a href="https://bn.wiktionary.org/wiki/%E0%A6%AE%E0%A6%A1%E0%A6%BF%E0%A6%89%E0%A6%B2:template_parser" title="মডিউল:template parser – Bangla" lang="bn" hreflang="bn" data-title="মডিউল:template parser" data-language-autonym="বাংলা" data-language-local-name="Bangla" class="interlanguage-link-target"><span>বাংলা</span></a></li><li class="interlanguage-link interwiki-zh-min-nan mw-list-item"><a href="https://zh-min-nan.wiktionary.org/wiki/%E6%A8%A1%E7%B5%84:templateparser" title="模組:templateparser – Minnan" lang="nan" hreflang="nan" data-title="模組:templateparser" data-language-autonym="閩南語 / Bân-lâm-gú" data-language-local-name="Minnan" class="interlanguage-link-target"><span>閩南語 / Bân-lâm-gú</span></a></li><li class="interlanguage-link interwiki-hsb mw-list-item"><a href="https://hsb.wiktionary.org/wiki/Modul:template_parser" title="Modul:template parser – Upper Sorbian" lang="hsb" hreflang="hsb" data-title="Modul:template parser" data-language-autonym="Hornjoserbsce" data-language-local-name="Upper Sorbian" class="interlanguage-link-target"><span>Hornjoserbsce</span></a></li><li class="interlanguage-link interwiki-id mw-list-item"><a href="https://id.wiktionary.org/wiki/Modul:templateparser" title="Modul:templateparser – Indonesian" lang="id" hreflang="id" data-title="Modul:templateparser" data-language-autonym="Bahasa Indonesia" data-language-local-name="Indonesian" class="interlanguage-link-target"><span>Bahasa Indonesia</span></a></li><li class="interlanguage-link interwiki-ky mw-list-item"><a href="https://ky.wiktionary.org/wiki/%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:template_parser" title="Модуль:template parser – Kyrgyz" lang="ky" hreflang="ky" data-title="Модуль:template parser" data-language-autonym="Кыргызча" data-language-local-name="Kyrgyz" class="interlanguage-link-target"><span>Кыргызча</span></a></li><li class="interlanguage-link interwiki-mt mw-list-item"><a href="https://mt.wiktionary.org/wiki/Module:template_parser" title="Module:template parser – Maltese" lang="mt" hreflang="mt" data-title="Module:template parser" data-language-autonym="Malti" data-language-local-name="Maltese" class="interlanguage-link-target"><span>Malti</span></a></li><li class="interlanguage-link interwiki-mnw mw-list-item"><a href="https://mnw.wiktionary.org/wiki/%E1%80%99%E1%80%9D%E1%80%BA%E1%80%82%E1%80%BB%E1%80%B0:templateparser" title="မဝ်ဂျူ:templateparser – Mon" lang="mnw" hreflang="mnw" data-title="မဝ်ဂျူ:templateparser" data-language-autonym="ဘာသာမန်" data-language-local-name="Mon" class="interlanguage-link-target"><span>ဘာသာမန်</span></a></li><li class="interlanguage-link interwiki-ms mw-list-item"><a href="https://ms.wiktionary.org/wiki/Modul:template_parser" title="Modul:template parser – Malay" lang="ms" hreflang="ms" data-title="Modul:template parser" data-language-autonym="Bahasa Melayu" data-language-local-name="Malay" class="interlanguage-link-target"><span>Bahasa Melayu</span></a></li><li class="interlanguage-link interwiki-my mw-list-item"><a href="https://my.wiktionary.org/wiki/%E1%80%99%E1%80%B1%E1%80%AC%E1%80%BA%E1%80%82%E1%80%BB%E1%80%B0%E1%80%B8:templateparser" title="မော်ဂျူး:templateparser – Burmese" lang="my" hreflang="my" data-title="မော်ဂျူး:templateparser" data-language-autonym="မြန်မာဘာသာ" data-language-local-name="Burmese" class="interlanguage-link-target"><span>မြန်မာဘာသာ</span></a></li><li class="interlanguage-link interwiki-ja mw-list-item"><a href="https://ja.wiktionary.org/wiki/%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB:templateparser" title="モジュール:templateparser – Japanese" lang="ja" hreflang="ja" data-title="モジュール:templateparser" data-language-autonym="日本語" data-language-local-name="Japanese" class="interlanguage-link-target"><span>日本語</span></a></li><li class="interlanguage-link interwiki-uz mw-list-item"><a href="https://uz.wiktionary.org/wiki/Modul:template_parser" title="Modul:template parser – Uzbek" lang="uz" hreflang="uz" data-title="Modul:template parser" data-language-autonym="Oʻzbekcha / ўзбекча" data-language-local-name="Uzbek" class="interlanguage-link-target"><span>Oʻzbekcha / ўзбекча</span></a></li><li class="interlanguage-link interwiki-pa mw-list-item"><a href="https://pa.wiktionary.org/wiki/%E0%A8%AE%E0%A9%8C%E0%A8%A1%E0%A8%BF%E0%A8%8A%E0%A8%B2:template_parser" title="ਮੌਡਿਊਲ:template parser – Punjabi" lang="pa" hreflang="pa" data-title="ਮੌਡਿਊਲ:template parser" data-language-autonym="ਪੰਜਾਬੀ" data-language-local-name="Punjabi" class="interlanguage-link-target"><span>ਪੰਜਾਬੀ</span></a></li><li class="interlanguage-link interwiki-blk mw-list-item"><a href="https://blk.wiktionary.org/wiki/%E1%80%99%E1%80%B1%E1%80%AC%E1%80%BA%E1%80%82%E1%80%BB%E1%80%B0%E1%80%B8:template_parser" title="မော်ဂျူး:template parser – Pa&#039;O" lang="blk" hreflang="blk" data-title="မော်ဂျူး:template parser" data-language-autonym="ပအိုဝ်ႏဘာႏသာႏ" data-language-local-name="Pa&#039;O" class="interlanguage-link-target"><span>ပအိုဝ်ႏဘာႏသာႏ</span></a></li><li class="interlanguage-link interwiki-si mw-list-item"><a href="https://si.wiktionary.org/wiki/Module:template_parser" title="Module:template parser – Sinhala" lang="si" hreflang="si" data-title="Module:template parser" data-language-autonym="සිංහල" data-language-local-name="Sinhala" class="interlanguage-link-target"><span>සිංහල</span></a></li><li class="interlanguage-link interwiki-ckb mw-list-item"><a href="https://ckb.wiktionary.org/wiki/%D9%85%DB%86%D8%AF%DB%8C%D9%88%D9%88%D9%84:template_parser" title="مۆدیوول:template parser – Central Kurdish" lang="ckb" hreflang="ckb" data-title="مۆدیوول:template parser" data-language-autonym="کوردی" data-language-local-name="Central Kurdish" class="interlanguage-link-target"><span>کوردی</span></a></li><li class="interlanguage-link interwiki-sr mw-list-item"><a href="https://sr.wiktionary.org/wiki/%D0%9C%D0%BE%D0%B4%D1%83%D0%BB:template_parser" title="Модул:template parser – Serbian" lang="sr" hreflang="sr" data-title="Модул:template parser" data-language-autonym="Српски / srpski" data-language-local-name="Serbian" class="interlanguage-link-target"><span>Српски / srpski</span></a></li><li class="interlanguage-link interwiki-tl mw-list-item"><a href="https://tl.wiktionary.org/wiki/Module:template_parser" title="Module:template parser – Tagalog" lang="tl" hreflang="tl" data-title="Module:template parser" data-language-autonym="Tagalog" data-language-local-name="Tagalog" class="interlanguage-link-target"><span>Tagalog</span></a></li><li class="interlanguage-link interwiki-shn mw-list-item"><a href="https://shn.wiktionary.org/wiki/%E1%80%99%E1%80%B1%E1%82%83%E1%82%87%E1%81%B5%E1%80%BB%E1%80%B0%E1%80%B8:template_parser" title="မေႃႇၵျူး:template parser – Shan" lang="shn" hreflang="shn" data-title="မေႃႇၵျူး:template parser" data-language-autonym="ၽႃႇသႃႇတႆး " data-language-local-name="Shan" class="interlanguage-link-target"><span>ၽႃႇသႃႇတႆး </span></a></li><li class="interlanguage-link interwiki-th mw-list-item"><a href="https://th.wiktionary.org/wiki/%E0%B8%A1%E0%B8%AD%E0%B8%94%E0%B8%B9%E0%B8%A5:template_parser" title="มอดูล:template parser – Thai" lang="th" hreflang="th" data-title="มอดูล:template parser" data-language-autonym="ไทย" data-language-local-name="Thai" class="interlanguage-link-target"><span>ไทย</span></a></li><li class="interlanguage-link interwiki-tg mw-list-item"><a href="https://tg.wiktionary.org/wiki/%D0%9C%D0%BE%D0%B4%D1%83%D0%BB:template_parser" title="Модул:template parser – Tajik" lang="tg" hreflang="tg" data-title="Модул:template parser" data-language-autonym="Тоҷикӣ" data-language-local-name="Tajik" class="interlanguage-link-target"><span>Тоҷикӣ</span></a></li><li class="interlanguage-link interwiki-vi mw-list-item"><a href="https://vi.wiktionary.org/wiki/M%C3%B4_%C4%91un:template_parser" title="Mô đun:template parser – Vietnamese" lang="vi" hreflang="vi" data-title="Mô đun:template parser" data-language-autonym="Tiếng Việt" data-language-local-name="Vietnamese" class="interlanguage-link-target"><span>Tiếng Việt</span></a></li><li class="interlanguage-link interwiki-yue mw-list-item"><a href="https://yue.wiktionary.org/wiki/%E6%A8%A1%E7%B5%84:templateparser" title="模組:templateparser – Cantonese" lang="yue" hreflang="yue" data-title="模組:templateparser" data-language-autonym="粵語" data-language-local-name="Cantonese" class="interlanguage-link-target"><span>粵語</span></a></li><li class="interlanguage-link interwiki-zh mw-list-item"><a href="https://zh.wiktionary.org/wiki/Module:Template_parser" title="Module:Template parser – Chinese" lang="zh" hreflang="zh" data-title="Module:Template parser" data-language-autonym="中文" data-language-local-name="Chinese" class="interlanguage-link-target"><span>中文</span></a></li> </ul> <div class="after-portlet after-portlet-lang"><span class="wb-langlinks-edit wb-langlinks-link"><a href="https://www.wikidata.org/wiki/Special:EntityPage/Q107326219#sitelinks-wiktionary" title="Edit interlanguage links" class="wbc-editpage">Edit links</a></span></div> </div> </nav> </div> </div> <footer id="footer" class="mw-footer" > <ul id="footer-info"> <li id="footer-info-lastmod"> This page was last edited on 23 November 2024, at 02:30.</li> <li id="footer-info-copyright">Definitions and other text are available under the <a rel="nofollow" class="external text" href="//creativecommons.org/licenses/by-sa/4.0/">Creative Commons Attribution-ShareAlike License</a>; additional terms may apply. By using this site, you agree to the <a class="external text" href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Terms_of_Use">Terms of Use</a> and <a class="external text" href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Privacy_policy">Privacy Policy.</a></li> </ul> <ul id="footer-places"> <li id="footer-places-privacy"><a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Privacy_policy">Privacy policy</a></li> <li id="footer-places-about"><a href="/wiki/Wiktionary:About">About Wiktionary</a></li> <li id="footer-places-disclaimers"><a href="/wiki/Wiktionary:General_disclaimer">Disclaimers</a></li> <li id="footer-places-wm-codeofconduct"><a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Universal_Code_of_Conduct">Code of Conduct</a></li> <li id="footer-places-developers"><a href="https://developer.wikimedia.org">Developers</a></li> <li id="footer-places-statslink"><a href="https://stats.wikimedia.org/#/en.wiktionary.org">Statistics</a></li> <li id="footer-places-cookiestatement"><a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Cookie_statement">Cookie statement</a></li> <li id="footer-places-mobileview"><a href="//en.m.wiktionary.org/w/index.php?title=Module:template_parser&amp;mobileaction=toggle_view_mobile" class="noprint stopMobileRedirectToggle">Mobile view</a></li> </ul> <ul id="footer-icons" class="noprint"> <li id="footer-copyrightico"><a href="https://wikimediafoundation.org/" class="cdx-button cdx-button--fake-button cdx-button--size-large cdx-button--fake-button--enabled"><img src="/static/images/footer/wikimedia-button.svg" width="84" height="29" alt="Wikimedia Foundation" loading="lazy"></a></li> <li id="footer-poweredbyico"><a href="https://www.mediawiki.org/" class="cdx-button cdx-button--fake-button cdx-button--size-large cdx-button--fake-button--enabled"><img src="/w/resources/assets/poweredby_mediawiki.svg" alt="Powered by MediaWiki" width="88" height="31" loading="lazy"></a></li> </ul> </footer> <script>(RLQ=window.RLQ||[]).push(function(){mw.log.warn("This page is using the deprecated ResourceLoader module \"codex-search-styles\".\n[1.43] Use a CodexModule with codexComponents to set your specific components used: https://www.mediawiki.org/wiki/Codex#Using_a_limited_subset_of_components");mw.config.set({"wgHostname":"mw-web.codfw.main-f69cdc8f6-v4897","wgBackendResponseTime":240,"wgPageParseReport":{"limitreport":{"cputime":"0.093","walltime":"0.129","ppvisitednodes":{"value":151,"limit":1000000},"postexpandincludesize":{"value":13195,"limit":2097152},"templateargumentsize":{"value":453,"limit":2097152},"expansiondepth":{"value":8,"limit":100},"expensivefunctioncount":{"value":7,"limit":500},"unstrip-depth":{"value":0,"limit":20},"unstrip-size":{"value":2873,"limit":5000000},"entityaccesscount":{"value":0,"limit":400},"timingprofile":["100.00% 116.689 1 -total","100.00% 116.689 1 Template:documentation"," 17.75% 20.717 3 Template:tl"," 16.57% 19.333 1 Template:documentation_outdated"," 15.24% 17.779 1 Template:maintenance_box"," 10.26% 11.975 6 Template:wt"," 6.51% 7.592 3 Template:code"," 5.70% 6.647 1 Template:module_cat"," 5.28% 6.156 1 Template:param"]},"scribunto":{"limitreport-timeusage":{"value":"0.072","limit":"10.000"},"limitreport-memusage":{"value":2167846,"limit":104857600}},"cachereport":{"origin":"mw-web.codfw.main-f69cdc8f6-v4897","timestamp":"20241124231507","ttl":2592000,"transientcontent":false}}});});</script> </body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10