CINXE.COM
Module:parser: difference between revisions - Wiktionary, the free dictionary
<!DOCTYPE html> <html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-sticky-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-disabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-feature-night-mode-disabled skin-theme-clientpref-day vector-toc-not-available" lang="en" dir="ltr"> <head> <meta charset="UTF-8"> <title>Module:parser: difference between revisions - Wiktionary, the free dictionary</title> <script>(function(){var className="client-js vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-sticky-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-disabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-feature-night-mode-disabled skin-theme-clientpref-day vector-toc-not-available";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":"0fb4d978-0658-4f8f-a3bd-23b35fb892a8","wgCanonicalNamespace":"Module","wgCanonicalSpecialPageName":false,"wgNamespaceNumber":828,"wgPageName":"Module:parser","wgTitle":"parser","wgCurRevisionId":82790606,"wgRevisionId":82789053,"wgArticleId":9689400,"wgIsArticle":true,"wgIsRedirect":false,"wgAction":"view","wgUserName":null,"wgUserGroups":["*"],"wgCategories":["Templates and modules needing documentation","Wikitext parsing modules"],"wgPageViewLanguage":"en","wgPageContentLanguage":"en","wgPageContentModel":"Scribunto","wgRelevantPageName":"Module:parser","wgRelevantArticleId":9689400,"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":10000,"extRevisionSliderTimeOffset":0,"wgDiffOldId":82788777,"wgDiffNewId":82789053,"wgEditSubmitButtonLabelPublish":true,"wgULSPosition":"interlanguage","wgULSisCompactLinksEnabled":false,"wgVector2022LanguageInHeader":true,"wgULSisLanguageSelectorEmpty":false,"wgWikibaseItemId":"Q123551062","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.visualEditor.diffPage.init.styles":"ready","oojs-ui.styles.icons-accessibility":"ready","oojs-ui.styles.icons-editing-advanced":"ready","oojs-ui-core.styles":"ready","oojs-ui.styles.indicators":"ready","mediawiki.widgets.styles":"ready","oojs-ui-core.icons":"ready","ext.RevisionSlider.lazyCss":"ready","mediawiki.interface.helpers.styles":"ready","mediawiki.diff.styles":"ready","ext.pygments":"ready","mediawiki.helplink":"ready","skins.vector.search.codex.styles":"ready","skins.vector.styles":"ready","skins.vector.icons":"ready","ext.wikimediamessages.styles":"ready","ext.visualEditor.desktopArticleTarget.noscript":"ready","ext.uls.interlanguage":"ready","wikibase.client.init":"ready","ext.wikimediaBadges":"ready"};RLPAGEMODULES=["ext.visualEditor.diffPage.init","ext.RevisionSlider.lazyJs","mediawiki.diff","ext.pygments.view","site","mediawiki.page.ready","skins.vector.js","ext.centralNotice.geoIP","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.interface","wikibase.client.vector-2022","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&modules=ext.RevisionSlider.lazyCss%7Cext.pygments%2CwikimediaBadges%7Cext.uls.interlanguage%7Cext.visualEditor.desktopArticleTarget.noscript%7Cext.visualEditor.diffPage.init.styles%7Cext.wikimediamessages.styles%7Cmediawiki.diff.styles%7Cmediawiki.helplink%7Cmediawiki.interface.helpers.styles%7Cmediawiki.widgets.styles%7Coojs-ui-core.icons%2Cstyles%7Coojs-ui.styles.icons-accessibility%2Cicons-editing-advanced%2Cindicators%7Cskins.vector.icons%2Cstyles%7Cskins.vector.search.codex.styles%7Cwikibase.client.init&only=styles&skin=vector-2022"> <script async="" src="/w/load.php?lang=en&modules=startup&only=scripts&raw=1&skin=vector-2022"></script> <meta name="ResourceLoaderDynamicStyles" content=""> <link rel="stylesheet" href="/w/load.php?lang=en&modules=ext.gadget.LanguagesAndScripts%2CPalette%2CSite&only=styles&skin=vector-2022"> <link rel="stylesheet" href="/w/load.php?lang=en&modules=site.styles&only=styles&skin=vector-2022"> <meta name="generator" content="MediaWiki 1.44.0-wmf.5"> <meta name="referrer" content="origin"> <meta name="referrer" content="origin-when-cross-origin"> <meta name="robots" content="noindex,nofollow,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:parser: difference between revisions - 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: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: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&feed=atom"> <link rel="dns-prefetch" href="//login.wikimedia.org"> </head> <body class="mw-article-diff skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-828 ns-subject page-Module_parser rootpage-Module_parser skin-vector-2022 action-view"><a class="mw-jump-link" href="#bodyContent">Jump to content</a> <div class="vector-header-container"> <header class="vector-header mw-header"> <div class="vector-header-start"> <nav class="vector-main-menu-landmark" aria-label="Site"> <div id="vector-main-menu-dropdown" class="vector-dropdown vector-main-menu-dropdown vector-button-flush-left vector-button-flush-right" > <input type="checkbox" id="vector-main-menu-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-main-menu-dropdown" class="vector-dropdown-checkbox " aria-label="Main menu" > <label id="vector-main-menu-dropdown-label" for="vector-main-menu-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-menu mw-ui-icon-wikimedia-menu"></span> <span class="vector-dropdown-label-text">Main menu</span> </label> <div class="vector-dropdown-content"> <div id="vector-main-menu-unpinned-container" class="vector-unpinned-container"> <div id="vector-main-menu" class="vector-main-menu vector-pinnable-element"> <div class="vector-pinnable-header vector-main-menu-pinnable-header vector-pinnable-header-unpinned" data-feature-name="main-menu-pinned" data-pinnable-element-id="vector-main-menu" data-pinned-container-id="vector-main-menu-pinned-container" data-unpinned-container-id="vector-main-menu-unpinned-container" > <div class="vector-pinnable-header-label">Main menu</div> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-main-menu.pin">move to sidebar</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-main-menu.unpin">hide</button> </div> <div id="p-navigation" class="vector-menu mw-portlet mw-portlet-navigation" > <div class="vector-menu-heading"> Navigation </div> <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-contact" class="mw-list-item"><a href="/wiki/Wiktionary:Contact_us"><span>Contact us</span></a></li> </ul> </div> </div> </div> </div> </div> </div> </nav> <a href="/wiki/Wiktionary:Main_Page" class="mw-logo"> <img class="mw-logo-icon" src="/static/images/icons/enwiktionary.svg" alt="" aria-hidden="true" height="50" width="50"> <span class="mw-logo-container skin-invert"> <img class="mw-logo-wordmark" alt="Wiktionary" src="/static/images/mobile/copyright/wiktionary-wordmark-en.svg" style="width: 6.6875em; height: 1.1875em;"> <img class="mw-logo-tagline" alt="The Free Dictionary" src="/static/images/mobile/copyright/wiktionary-tagline-en.svg" width="110" height="15" style="width: 6.875em; height: 0.9375em;"> </span> </a> </div> <div class="vector-header-end"> <div id="p-search" role="search" class="vector-search-box-vue vector-search-box-collapses vector-search-box-show-thumbnail vector-search-box-auto-expand-width vector-search-box"> <a href="/wiki/Special:Search" class="cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only search-toggle" title="Search Wiktionary [f]" accesskey="f"><span class="vector-icon mw-ui-icon-search mw-ui-icon-wikimedia-search"></span> <span>Search</span> </a> <div class="vector-typeahead-search-container"> <div class="cdx-typeahead-search cdx-typeahead-search--show-thumbnail cdx-typeahead-search--auto-expand-width"> <form action="/w/index.php" id="searchform" class="cdx-search-input cdx-search-input--has-end-button"> <div id="simpleSearch" class="cdx-search-input__input-wrapper" data-search-loc="header-moved"> <div class="cdx-text-input cdx-text-input--has-start-icon"> <input class="cdx-text-input__input" type="search" name="search" placeholder="Search Wiktionary" aria-label="Search Wiktionary" autocapitalize="none" title="Search Wiktionary [f]" accesskey="f" id="searchInput" > <span class="cdx-text-input__icon cdx-text-input__start-icon"></span> </div> <input type="hidden" name="title" value="Special:Search"> </div> <button class="cdx-button cdx-search-input__end-button">Search</button> </form> </div> </div> </div> <nav class="vector-user-links vector-user-links-wide" aria-label="Personal tools"> <div class="vector-user-links-main"> <div id="p-vector-user-menu-preferences" class="vector-menu mw-portlet emptyPortlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> <div id="p-vector-user-menu-userpage" class="vector-menu mw-portlet emptyPortlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> <nav class="vector-appearance-landmark" aria-label="Appearance"> <div id="vector-appearance-dropdown" class="vector-dropdown " title="Change the appearance of the page's font size, width, and color" > <input type="checkbox" id="vector-appearance-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-appearance-dropdown" class="vector-dropdown-checkbox " aria-label="Appearance" > <label id="vector-appearance-dropdown-label" for="vector-appearance-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-appearance mw-ui-icon-wikimedia-appearance"></span> <span class="vector-dropdown-label-text">Appearance</span> </label> <div class="vector-dropdown-content"> <div id="vector-appearance-unpinned-container" class="vector-unpinned-container"> </div> </div> </div> </nav> <div id="p-vector-user-menu-notifications" class="vector-menu mw-portlet emptyPortlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> <div id="p-vector-user-menu-overflow" class="vector-menu mw-portlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="pt-sitesupport-2" class="user-links-collapsible-item mw-list-item user-links-collapsible-item"><a data-mw="interface" href="//donate.wikimedia.org/wiki/Special:FundraiserRedirector?utm_source=donate&utm_medium=sidebar&utm_campaign=C13_en.wiktionary.org&uselang=en" class=""><span>Donations</span></a> </li> <li id="pt-createaccount-2" class="user-links-collapsible-item mw-list-item user-links-collapsible-item"><a data-mw="interface" href="/w/index.php?title=Special:CreateAccount&returnto=Module%3Aparser&returntoquery=curid%3D9689400%26diff%3D82789053%26oldid%3D82788777" title="You are encouraged to create an account and log in; however, it is not mandatory" class=""><span>Create account</span></a> </li> <li id="pt-login-2" class="user-links-collapsible-item mw-list-item user-links-collapsible-item"><a data-mw="interface" href="/w/index.php?title=Special:UserLogin&returnto=Module%3Aparser&returntoquery=curid%3D9689400%26diff%3D82789053%26oldid%3D82788777" title="You are encouraged to log in; however, it is not mandatory [o]" accesskey="o" class=""><span>Log in</span></a> </li> </ul> </div> </div> </div> <div id="vector-user-links-dropdown" class="vector-dropdown vector-user-menu vector-button-flush-right vector-user-menu-logged-out" title="More options" > <input type="checkbox" id="vector-user-links-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-user-links-dropdown" class="vector-dropdown-checkbox " aria-label="Personal tools" > <label id="vector-user-links-dropdown-label" for="vector-user-links-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-ellipsis mw-ui-icon-wikimedia-ellipsis"></span> <span class="vector-dropdown-label-text">Personal tools</span> </label> <div class="vector-dropdown-content"> <div id="p-personal" class="vector-menu mw-portlet mw-portlet-personal user-links-collapsible-item" title="User menu" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="pt-sitesupport" class="user-links-collapsible-item mw-list-item"><a href="//donate.wikimedia.org/wiki/Special:FundraiserRedirector?utm_source=donate&utm_medium=sidebar&utm_campaign=C13_en.wiktionary.org&uselang=en"><span>Donations</span></a></li><li id="pt-createaccount" class="user-links-collapsible-item mw-list-item"><a href="/w/index.php?title=Special:CreateAccount&returnto=Module%3Aparser&returntoquery=curid%3D9689400%26diff%3D82789053%26oldid%3D82788777" title="You are encouraged to create an account and log in; however, it is not mandatory"><span class="vector-icon mw-ui-icon-userAdd mw-ui-icon-wikimedia-userAdd"></span> <span>Create account</span></a></li><li id="pt-login" class="user-links-collapsible-item mw-list-item"><a href="/w/index.php?title=Special:UserLogin&returnto=Module%3Aparser&returntoquery=curid%3D9689400%26diff%3D82789053%26oldid%3D82788777" title="You are encouraged to log in; however, it is not mandatory [o]" accesskey="o"><span class="vector-icon mw-ui-icon-logIn mw-ui-icon-wikimedia-logIn"></span> <span>Log in</span></a></li> </ul> </div> </div> <div id="p-user-menu-anon-editor" class="vector-menu mw-portlet mw-portlet-user-menu-anon-editor" > <div class="vector-menu-heading"> Pages for logged out editors <a href="/wiki/Help:Introduction" aria-label="Learn more about editing"><span>learn more</span></a> </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <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-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> </ul> </div> </div> </div> </div> </nav> </div> </header> </div> <div class="mw-page-container"> <div class="mw-page-container-inner"> <div class="vector-sitenotice-container"> <div id="siteNotice"><!-- CentralNotice --></div> </div> <div class="vector-column-start"> <div class="vector-main-menu-container"> <div id="mw-navigation"> <nav id="mw-panel" class="vector-main-menu-landmark" aria-label="Site"> <div id="vector-main-menu-pinned-container" class="vector-pinned-container"> </div> </nav> </div> </div> </div> <div class="mw-content-container"> <main id="content" class="mw-body"> <header class="mw-body-header vector-page-titlebar"> <h1 id="firstHeading" class="firstHeading mw-first-heading">Module:parser: difference between revisions</h1> <div id="p-lang-btn" class="vector-dropdown mw-portlet mw-portlet-lang" > <input type="checkbox" id="p-lang-btn-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-p-lang-btn" class="vector-dropdown-checkbox mw-interlanguage-selector" aria-label="Go to an article in another language. Available in 18 languages" > <label id="p-lang-btn-label" for="p-lang-btn-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--action-progressive mw-portlet-lang-heading-18" aria-hidden="true" ><span class="vector-icon mw-ui-icon-language-progressive mw-ui-icon-wikimedia-language-progressive"></span> <span class="vector-dropdown-label-text">18 languages</span> </label> <div class="vector-dropdown-content"> <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:parser" title="وحدة:parser – Arabic" lang="ar" hreflang="ar" data-title="وحدة: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:parser" title="মডিউল:parser – Bangla" lang="bn" hreflang="bn" data-title="মডিউল:parser" data-language-autonym="বাংলা" data-language-local-name="Bangla" class="interlanguage-link-target"><span>বাংলা</span></a></li><li class="interlanguage-link interwiki-bjn mw-list-item"><a href="https://bjn.wiktionary.org/wiki/Modul:parser" title="Modul:parser – Banjar" lang="bjn" hreflang="bjn" data-title="Modul:parser" data-language-autonym="Banjar" data-language-local-name="Banjar" class="interlanguage-link-target"><span>Banjar</span></a></li><li class="interlanguage-link interwiki-hsb mw-list-item"><a href="https://hsb.wiktionary.org/wiki/Modul:parser" title="Modul:parser – Upper Sorbian" lang="hsb" hreflang="hsb" data-title="Modul: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-ky mw-list-item"><a href="https://ky.wiktionary.org/wiki/%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:parser" title="Модуль:parser – Kyrgyz" lang="ky" hreflang="ky" data-title="Модуль: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:parser" title="Module:parser – Maltese" lang="mt" hreflang="mt" data-title="Module: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:parser" title="မဝ်ဂျူ:parser – Mon" lang="mnw" hreflang="mnw" data-title="မဝ်ဂျူ:parser" 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:parser" title="Modul:parser – Malay" lang="ms" hreflang="ms" data-title="Modul: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:parser" title="မော်ဂျူး:parser – Burmese" lang="my" hreflang="my" data-title="မော်ဂျူး:parser" 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:parser" title="モジュール:parser – Japanese" lang="ja" hreflang="ja" data-title="モジュール:parser" data-language-autonym="日本語" data-language-local-name="Japanese" class="interlanguage-link-target"><span>日本語</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:parser" title="ਮੌਡਿਊਲ:parser – Punjabi" lang="pa" hreflang="pa" data-title="ਮੌਡਿਊਲ:parser" data-language-autonym="ਪੰਜਾਬੀ" data-language-local-name="Punjabi" 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:parser" title="Module:parser – Sinhala" lang="si" hreflang="si" data-title="Module: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:parser" title="مۆدیوول:parser – Central Kurdish" lang="ckb" hreflang="ckb" data-title="مۆدیوول: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:parser" title="Модул:parser – Serbian" lang="sr" hreflang="sr" data-title="Модул:parser" data-language-autonym="Српски / srpski" data-language-local-name="Serbian" class="interlanguage-link-target"><span>Српски / srpski</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:parser" title="မေႃႇၵျူး:parser – Shan" lang="shn" hreflang="shn" data-title="မေႃႇၵျူး: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:parser" title="มอดูล:parser – Thai" lang="th" hreflang="th" data-title="มอดูล:parser" data-language-autonym="ไทย" data-language-local-name="Thai" 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:parser" title="Mô đun:parser – Vietnamese" lang="vi" hreflang="vi" data-title="Mô đun: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-zh mw-list-item"><a href="https://zh.wiktionary.org/wiki/Module:Parser" title="Module:Parser – Chinese" lang="zh" hreflang="zh" data-title="Module: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/Q123551062#sitelinks-wiktionary" title="Edit interlanguage links" class="wbc-editpage">Edit links</a></span></div> </div> </div> </div> </header> <div class="vector-page-toolbar"> <div class="vector-page-toolbar-container"> <div id="left-navigation"> <nav aria-label="Namespaces"> <div id="p-associated-pages" class="vector-menu vector-menu-tabs mw-portlet mw-portlet-associated-pages" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-nstab-module" class="selected vector-tab-noicon mw-list-item"><a href="/wiki/Module:parser" title="View the module page [c]" accesskey="c"><span>Module</span></a></li><li id="ca-talk" class="new vector-tab-noicon mw-list-item"><a href="/w/index.php?title=Module_talk:parser&action=edit&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> </div> <div id="vector-variants-dropdown" class="vector-dropdown emptyPortlet" > <input type="checkbox" id="vector-variants-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-variants-dropdown" class="vector-dropdown-checkbox " aria-label="Change language variant" > <label id="vector-variants-dropdown-label" for="vector-variants-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet" aria-hidden="true" ><span class="vector-dropdown-label-text">English</span> </label> <div class="vector-dropdown-content"> <div id="p-variants" class="vector-menu mw-portlet mw-portlet-variants emptyPortlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> </div> </div> </nav> </div> <div id="right-navigation" class="vector-collapsible"> <nav aria-label="Views"> <div id="p-views" class="vector-menu vector-menu-tabs mw-portlet mw-portlet-views" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-view" class="selected vector-tab-noicon mw-list-item"><a href="/wiki/Module:parser"><span>Read</span></a></li><li id="ca-viewsource" class="vector-tab-noicon mw-list-item"><a href="/w/index.php?title=Module:parser&action=edit&oldid=82789053" title="This page is protected. You can view its source [e]" accesskey="e"><span>View source</span></a></li><li id="ca-history" class="vector-tab-noicon mw-list-item"><a href="/w/index.php?title=Module:parser&action=history" title="Past revisions of this page [h]" accesskey="h"><span>View history</span></a></li> </ul> </div> </div> </nav> <nav class="vector-page-tools-landmark" aria-label="Page tools"> <div id="vector-page-tools-dropdown" class="vector-dropdown vector-page-tools-dropdown" > <input type="checkbox" id="vector-page-tools-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-page-tools-dropdown" class="vector-dropdown-checkbox " aria-label="Tools" > <label id="vector-page-tools-dropdown-label" for="vector-page-tools-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet" aria-hidden="true" ><span class="vector-dropdown-label-text">Tools</span> </label> <div class="vector-dropdown-content"> <div id="vector-page-tools-unpinned-container" class="vector-unpinned-container"> <div id="vector-page-tools" class="vector-page-tools vector-pinnable-element"> <div class="vector-pinnable-header vector-page-tools-pinnable-header vector-pinnable-header-unpinned" data-feature-name="page-tools-pinned" data-pinnable-element-id="vector-page-tools" data-pinned-container-id="vector-page-tools-pinned-container" data-unpinned-container-id="vector-page-tools-unpinned-container" > <div class="vector-pinnable-header-label">Tools</div> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-page-tools.pin">move to sidebar</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-page-tools.unpin">hide</button> </div> <div id="p-cactions" class="vector-menu mw-portlet mw-portlet-cactions emptyPortlet vector-has-collapsible-items" title="More options" > <div class="vector-menu-heading"> Actions </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-more-view" class="selected vector-more-collapsible-item mw-list-item"><a href="/wiki/Module:parser"><span>Read</span></a></li><li id="ca-more-viewsource" class="vector-more-collapsible-item mw-list-item"><a href="/w/index.php?title=Module:parser&action=edit&oldid=82789053"><span>View source</span></a></li><li id="ca-more-history" class="vector-more-collapsible-item mw-list-item"><a href="/w/index.php?title=Module:parser&action=history"><span>View history</span></a></li> </ul> </div> </div> <div id="p-tb" class="vector-menu mw-portlet mw-portlet-tb" > <div class="vector-menu-heading"> General </div> <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: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: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:parser&oldid=82789053" 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:parser&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&url=https%3A%2F%2Fen.wiktionary.org%2Fw%2Findex.php%3Ftitle%3DModule%3Aparser%26curid%3D9689400%26diff%3D82789053%26oldid%3D82788777"><span>Get shortened URL</span></a></li><li id="t-urlshortener-qrcode" class="mw-list-item"><a href="/w/index.php?title=Special:QrCode&url=https%3A%2F%2Fen.wiktionary.org%2Fw%2Findex.php%3Ftitle%3DModule%3Aparser%26curid%3D9689400%26diff%3D82789053%26oldid%3D82788777"><span>Download QR code</span></a></li> </ul> </div> </div> <div id="p-electronpdfservice-sidebar-portlet-heading" class="vector-menu mw-portlet mw-portlet-electronpdfservice-sidebar-portlet-heading" > <div class="vector-menu-heading"> Print/export </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <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> </div> <div id="p-wikibase-otherprojects" class="vector-menu mw-portlet mw-portlet-wikibase-otherprojects" > <div class="vector-menu-heading"> In other projects </div> <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/Q123551062" title="Link to connected data repository item [g]" accesskey="g"><span>Wikidata item</span></a></li> </ul> </div> </div> </div> </div> </div> </div> </nav> </div> </div> </div> <div class="vector-column-end"> <div class="vector-sticky-pinned-container"> <nav class="vector-page-tools-landmark" aria-label="Page tools"> <div id="vector-page-tools-pinned-container" class="vector-pinned-container"> </div> </nav> <nav class="vector-appearance-landmark" aria-label="Appearance"> <div id="vector-appearance-pinned-container" class="vector-pinned-container"> <div id="vector-appearance" class="vector-appearance vector-pinnable-element"> <div class="vector-pinnable-header vector-appearance-pinnable-header vector-pinnable-header-pinned" data-feature-name="appearance-pinned" data-pinnable-element-id="vector-appearance" data-pinned-container-id="vector-appearance-pinned-container" data-unpinned-container-id="vector-appearance-unpinned-container" > <div class="vector-pinnable-header-label">Appearance</div> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-appearance.pin">move to sidebar</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-appearance.unpin">hide</button> </div> </div> </div> </nav> </div> </div> <div id="bodyContent" class="vector-body" aria-labelledby="firstHeading" data-mw-ve-target-container> <div class="vector-body-before-content"> <div class="mw-indicators"> <div id="mw-indicator-mw-helplink" class="mw-indicator"><a href="https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Diff" target="_blank" class="mw-helplink"><span class="mw-helplink-icon"></span>Help</a></div> </div> <div id="siteSub" class="noprint">From Wiktionary, the free dictionary</div> </div> <div id="contentSub"><div id="mw-content-subtitle"></div></div> <div id="mw-content-text" class="mw-body-content"><div class="mw-revslider-container"><span style='width: 100%; text-align: center;' id='ooui-php-1' class='mw-revslider-toggle-button oo-ui-widget oo-ui-widget-enabled oo-ui-buttonElement oo-ui-buttonElement-frameless oo-ui-indicatorElement oo-ui-labelElement oo-ui-buttonWidget' data-ooui='{"_":"OO.ui.ButtonWidget","rel":["nofollow"],"framed":false,"indicator":"down","label":"Browse history interactively","title":"Open revision slider","classes":["mw-revslider-toggle-button"]}'><a role='button' title='Open revision slider' tabindex='0' rel='nofollow' class='oo-ui-buttonElement-button'><span class='oo-ui-iconElement-icon oo-ui-iconElement-noIcon'></span><span class='oo-ui-labelElement-label'>Browse history interactively</span><span class='oo-ui-indicatorElement-indicator oo-ui-indicator-down'></span></a></span><div class="mw-revslider-slider-wrapper" style="display: none;"><div class="mw-revslider-placeholder"><div class="mw-revslider-spinner"><div class="mw-revslider-bounce"></div></div></div></div></div><div class="mw-diff-revision-history-links"><a href="/w/index.php?title=Module:parser&diff=prev&oldid=82788777" class="mw-diff-revision-history-link-previous" title="Module:parser">← Go to previous edit</a><a href="/w/index.php?title=Module:parser&diff=next&oldid=82789053" class="mw-diff-revision-history-link-next" title="Module:parser">Go to next edit →</a></div><div class="mw-diff-table-prefix" dir="ltr" lang="en"><div class="mw-diff-inline-legend oo-ui-element-hidden"><span class="mw-diff-inline-legend-del">Content deleted</span> <span class="mw-diff-inline-legend-ins">Content added</span></div><div class="mw-diffPage-inlineToggle-container"><div id='mw-diffPage-inline-toggle-switch-layout' class='oo-ui-layout oo-ui-labelElement oo-ui-fieldLayout oo-ui-fieldLayout-align-left' data-ooui='{"_":"OO.ui.FieldLayout","fieldWidget":{"tag":"mw-diffPage-inline-toggle-switch"},"$overlay":true,"label":"Inline","title":"Switches between inline format and two-column format"}'><div class='oo-ui-fieldLayout-body'><span class='oo-ui-fieldLayout-header'><label title='Switches between inline format and two-column format' id='ooui-php-2' class='oo-ui-labelElement-label'>Inline</label></span><div class='oo-ui-fieldLayout-field'><div id='mw-diffPage-inline-toggle-switch' title='Switches between inline format and two-column format' aria-checked='false' tabindex='0' role='switch' aria-labelledby='ooui-php-2' class='oo-ui-widget oo-ui-widget-enabled oo-ui-toggleWidget oo-ui-toggleWidget-off oo-ui-toggleSwitchWidget' data-ooui='{"_":"OO.ui.ToggleSwitchWidget","href":"\/w\/index.php?title=Module:parser&curid=9689400&diff=82789053&oldid=82788777&diff-type=inline","value":false,"title":"Switches between inline format and two-column format"}'><span class='oo-ui-toggleSwitchWidget-glow'></span><a href='/w/index.php?title=Module:parser&curid=9689400&diff=82789053&oldid=82788777&diff-type=inline'><span class='oo-ui-toggleSwitchWidget-grip'></span></a></div></div></div></div></div></div><table class="diff diff-type-table diff-contentalign-left diff-editfont-monospace" data-mw="interface"> <col class="diff-marker" /> <col class="diff-content" /> <col class="diff-marker" /> <col class="diff-content" /> <tr class="diff-title" lang="en"> <td colspan="2" class="diff-otitle diff-side-deleted"><div id="mw-diff-otitle1"><strong><a href="/w/index.php?title=Module:parser&oldid=82788777" title="Module:parser">Revision as of 21:44, 28 November 2024</a> <span class="mw-diff-edit"><a href="/w/index.php?title=Module:parser&action=edit&oldid=82788777" title="Module:parser">view source</a></span><span class="mw-diff-timestamp" data-timestamp="2024-11-28T21:44:49Z"></span></strong></div><div id="mw-diff-otitle2"><a href="/wiki/User:Theknightwho" class="mw-userlink" title="User:Theknightwho" data-mw-revid="82788777"><bdi>Theknightwho</bdi></a> <span class="mw-usertoollinks">(<a href="/wiki/User_talk:Theknightwho" class="mw-usertoollinks-talk" title="User talk:Theknightwho">talk</a> | <a href="/wiki/Special:Contributions/Theknightwho" class="mw-usertoollinks-contribs" title="Special:Contributions/Theknightwho">contribs</a>)</span><div class="mw-diff-usermetadata"><div class="mw-diff-userroles"><a href="/wiki/Wiktionary:Autopatrollers" title="Wiktionary:Autopatrollers">Autopatrollers</a>, <a href="/wiki/Wiktionary:Administrators" title="Wiktionary:Administrators">Administrators</a>, <a href="/wiki/Wiktionary:Template_editors" title="Wiktionary:Template editors">Template editors</a></div><div class="mw-diff-usereditcount"><span>171,887</span> edits</div></div></div><div id="mw-diff-otitle3"> <span class="comment comment--without-parentheses">Remove now-unused __pairs metamethod and unused rawpairs method.</span></div><div id="mw-diff-otitle5"></div><div id="mw-diff-otitle4"><a href="/w/index.php?title=Module:parser&diff=prev&oldid=82788777" title="Module:parser" id="differences-prevlink">← Go to previous edit</a></div></td> <td colspan="2" class="diff-ntitle diff-side-added"><div id="mw-diff-ntitle1"><strong><a href="/w/index.php?title=Module:parser&oldid=82789053" title="Module:parser">Revision as of 22:41, 28 November 2024</a> <span class="mw-diff-edit"><a href="/w/index.php?title=Module:parser&action=edit&oldid=82789053" title="Module:parser">view source</a></span><span class="mw-diff-timestamp" data-timestamp="2024-11-28T22:41:11Z"></span> </strong></div><div id="mw-diff-ntitle2"><a href="/wiki/User:Theknightwho" class="mw-userlink" title="User:Theknightwho" data-mw-revid="82789053"><bdi>Theknightwho</bdi></a> <span class="mw-usertoollinks">(<a href="/wiki/User_talk:Theknightwho" class="mw-usertoollinks-talk" title="User talk:Theknightwho">talk</a> | <a href="/wiki/Special:Contributions/Theknightwho" class="mw-usertoollinks-contribs" title="Special:Contributions/Theknightwho">contribs</a>)</span><div class="mw-diff-usermetadata"><div class="mw-diff-userroles"><a href="/wiki/Wiktionary:Autopatrollers" title="Wiktionary:Autopatrollers">Autopatrollers</a>, <a href="/wiki/Wiktionary:Administrators" title="Wiktionary:Administrators">Administrators</a>, <a href="/wiki/Wiktionary:Template_editors" title="Wiktionary:Template editors">Template editors</a></div><div class="mw-diff-usereditcount"><span>171,887</span> edits</div></div></div><div id="mw-diff-ntitle3"> <span class="comment comment--without-parentheses">Optimise the node iterators, to reduce the number of unnecessary function calls.</span></div><div id="mw-diff-ntitle5"></div><div id="mw-diff-ntitle4"><a href="/w/index.php?title=Module:parser&diff=next&oldid=82789053" title="Module:parser" id="differences-nextlink">Go to next edit →</a></div></td> </tr><tr> <td colspan="2" class="diff-lineno">Line 118:</td> <td colspan="2" class="diff-lineno">Line 118:</td> </tr> <tr> <td class="diff-marker"></td> <td class="diff-context diff-side-deleted"><div>do</div></td> <td class="diff-marker"></td> <td class="diff-context diff-side-added"><div>do</div></td> </tr> <tr> <td class="diff-marker"></td> <td class="diff-context diff-side-deleted"><div> local Iterator1, Iterator2 = {}, {}</div></td> <td class="diff-marker"></td> <td class="diff-context diff-side-added"><div> local Iterator1, Iterator2 = {}, {}</div></td> </tr> <tr> <td class="diff-marker" data-marker="−"></td> <td class="diff-deletedline diff-side-deleted"><div> Iterator1.__index = Iterator2 -- Not a typo.</div></td> <td colspan="2" class="diff-empty diff-side-added"></td> </tr> <tr> <td class="diff-marker"></td> <td class="diff-context diff-side-deleted"><div> Iterator2.__index = Iterator2</div></td> <td class="diff-marker"></td> <td class="diff-context diff-side-added"><div> Iterator2.__index = Iterator2</div></td> </tr> <tr> <td class="diff-marker"></td> <td class="diff-context diff-side-deleted"><div> </div></td> <td class="diff-marker"></td> <td class="diff-context diff-side-added"><div> </div></td> </tr> <tr> <td colspan="2" class="diff-empty diff-side-deleted"></td> <td class="diff-marker" data-marker="+"></td> <td class="diff-addedline diff-side-added"><div> -- Only called on the first iteration, to return the calling node.</div></td> </tr> <tr> <td class="diff-marker"></td> <td class="diff-context diff-side-deleted"><div> function Iterator1:__call()</div></td> <td class="diff-marker"></td> <td class="diff-context diff-side-added"><div> function Iterator1:__call()</div></td> </tr> <tr> <td class="diff-marker"></td> <td class="diff-context diff-side-deleted"><div> setmetatable(self, Iterator2)</div></td> <td class="diff-marker"></td> <td class="diff-context diff-side-added"><div> setmetatable(self, Iterator2)</div></td> </tr> <tr> <td colspan="2" class="diff-lineno">Line 126:</td> <td colspan="2" class="diff-lineno">Line 126:</td> </tr> <tr> <td class="diff-marker"></td> <td class="diff-context diff-side-deleted"><div> end</div></td> <td class="diff-marker"></td> <td class="diff-context diff-side-added"><div> end</div></td> </tr> <tr> <td class="diff-marker"></td> <td class="diff-context diff-side-deleted"><div> </div></td> <td class="diff-marker"></td> <td class="diff-context diff-side-added"><div> </div></td> </tr> <tr> <td colspan="2" class="diff-empty diff-side-deleted"></td> <td class="diff-marker" data-marker="+"></td> <td class="diff-addedline diff-side-added"><div> -- Catches an arbitrary number of returned values, which avoids the need to do it with a new table each time.</div></td> </tr> <tr> <td class="diff-marker" data-marker="−"></td> <td class="diff-deletedline diff-side-deleted"><div> function Iterator2:<del class="diffchange diffchange-inline">push</del>(<del class="diffchange diffchange-inline">node</del>)</div></td> <td class="diff-marker" data-marker="+"></td> <td class="diff-addedline diff-side-added"><div> function Iterator2:<ins class="diffchange diffchange-inline">catch_values</ins>(<ins class="diffchange diffchange-inline">layer, ...</ins>)</div></td> </tr> <tr> <td class="diff-marker"><a class="mw-diff-movedpara-left" title="Paragraph was moved. Click to jump to new location." href="#movedpara_27_0_rhs">⚫</a></td> <td class="diff-deletedline diff-side-deleted"><div><a name="movedpara_8_0_lhs"></a> local layer = {</div></td> <td colspan="2" class="diff-empty diff-side-added"></td> </tr> <tr> <td class="diff-marker"><a class="mw-diff-movedpara-left" title="Paragraph was moved. Click to jump to new location." href="#movedpara_29_0_rhs">⚫</a></td> <td class="diff-deletedline diff-side-deleted"><div><a name="movedpara_9_0_lhs"></a> <del class="diffchange diffchange-inline">k = 0</del>,</div></td> <td colspan="2" class="diff-empty diff-side-added"></td> </tr> <tr> <td class="diff-marker" data-marker="−"></td> <td class="diff-deletedline diff-side-deleted"><div> node = node</div></td> <td colspan="2" class="diff-empty diff-side-added"></td> </tr> <tr> <td class="diff-marker" data-marker="−"></td> <td class="diff-deletedline diff-side-deleted"><div> }</div></td> <td colspan="2" class="diff-empty diff-side-added"></td> </tr> <tr> <td class="diff-marker"><a class="mw-diff-movedpara-left" title="Paragraph was moved. Click to jump to new location." href="#movedpara_31_0_rhs">⚫</a></td> <td class="diff-deletedline diff-side-deleted"><div><a name="movedpara_9_3_lhs"></a> <del class="diffchange diffchange-inline">self</del>[<del class="diffchange diffchange-inline">#self + </del>1] = layer</div></td> <td colspan="2" class="diff-empty diff-side-added"></td> </tr> <tr> <td class="diff-marker" data-marker="−"></td> <td class="diff-deletedline diff-side-deleted"><div> self[-1] = layer</div></td> <td colspan="2" class="diff-empty diff-side-added"></td> </tr> <tr> <td class="diff-marker" data-marker="−"></td> <td class="diff-deletedline diff-side-deleted"><div> return self</div></td> <td colspan="2" class="diff-empty diff-side-added"></td> </tr> <tr> <td class="diff-marker"><a class="mw-diff-movedpara-left" title="Paragraph was moved. Click to jump to new location." href="#movedpara_39_0_rhs">⚫</a></td> <td class="diff-deletedline diff-side-deleted"><div><a name="movedpara_9_6_lhs"></a><del class="diffchange diffchange-inline"> </del>end</div></td> <td colspan="2" class="diff-empty diff-side-added"></td> </tr> <tr> <td class="diff-marker" data-marker="−"></td> <td class="diff-deletedline diff-side-deleted"><div> </div></td> <td colspan="2" class="diff-empty diff-side-added"></td> </tr> <tr> <td class="diff-marker" data-marker="−"></td> <td class="diff-deletedline diff-side-deleted"><div> function Iterator2:pop()</div></td> <td colspan="2" class="diff-empty diff-side-added"></td> </tr> <tr> <td class="diff-marker" data-marker="−"></td> <td class="diff-deletedline diff-side-deleted"><div> local len = #self</div></td> <td colspan="2" class="diff-empty diff-side-added"></td> </tr> <tr> <td class="diff-marker" data-marker="−"></td> <td class="diff-deletedline diff-side-deleted"><div> self[len] = nil</div></td> <td colspan="2" class="diff-empty diff-side-added"></td> </tr> <tr> <td class="diff-marker"><a class="mw-diff-movedpara-left" title="Paragraph was moved. Click to jump to new location." href="#movedpara_14_0_rhs">⚫</a></td> <td class="diff-deletedline diff-side-deleted"><div><a name="movedpara_9_11_lhs"></a> <del class="diffchange diffchange-inline">self[-1]</del> = self[<del class="diffchange diffchange-inline">len</del> - 1]</div></td> <td colspan="2" class="diff-empty diff-side-added"></td> </tr> <tr> <td class="diff-marker" data-marker="−"></td> <td class="diff-deletedline diff-side-deleted"><div> end</div></td> <td colspan="2" class="diff-empty diff-side-added"></td> </tr> <tr> <td class="diff-marker" data-marker="−"></td> <td class="diff-deletedline diff-side-deleted"><div> </div></td> <td colspan="2" class="diff-empty diff-side-added"></td> </tr> <tr> <td class="diff-marker" data-marker="−"></td> <td class="diff-deletedline diff-side-deleted"><div> function Iterator2:iterate(layer, ...)</div></td> <td colspan="2" class="diff-empty diff-side-added"></td> </tr> <tr> <td class="diff-marker"></td> <td class="diff-context diff-side-deleted"><div> local v, node, k = ...</div></td> <td class="diff-marker"></td> <td class="diff-context diff-side-added"><div> local v, node, k = ...</div></td> </tr> <tr> <td class="diff-marker"></td> <td class="diff-context diff-side-deleted"><div> if v ~= nil then</div></td> <td class="diff-marker"></td> <td class="diff-context diff-side-added"><div> if v ~= nil then</div></td> </tr> <tr> <td colspan="2" class="diff-lineno">Line 148:</td> <td colspan="2" class="diff-lineno">Line 133:</td> </tr> <tr> <td class="diff-marker"></td> <td class="diff-context diff-side-deleted"><div> return ...</div></td> <td class="diff-marker"></td> <td class="diff-context diff-side-added"><div> return ...</div></td> </tr> <tr> <td class="diff-marker"></td> <td class="diff-context diff-side-deleted"><div> end</div></td> <td class="diff-marker"></td> <td class="diff-context diff-side-added"><div> end</div></td> </tr> <tr> <td colspan="2" class="diff-empty diff-side-deleted"></td> <td class="diff-marker" data-marker="+"></td> <td class="diff-addedline diff-side-added"><div> -- If `v` is nil, pop the stack, and continue iterating over the layer below if there is one; otherwise, terminate.</div></td> </tr> <tr> <td class="diff-marker" data-marker="−"></td> <td class="diff-deletedline diff-side-deleted"><div> self:pop()</div></td> <td colspan="2" class="diff-empty diff-side-added"></td> </tr> <tr> <td class="diff-marker" data-marker="−"></td> <td class="diff-deletedline diff-side-deleted"><div> <del class="diffchange diffchange-inline">layer</del> = self<del class="diffchange diffchange-inline">[-1]</del></div></td> <td class="diff-marker" data-marker="+"></td> <td class="diff-addedline diff-side-added"><div> <ins class="diffchange diffchange-inline">local self_len</ins> = <ins class="diffchange diffchange-inline">#</ins>self</div></td> </tr> <tr> <td colspan="2" class="diff-empty diff-side-deleted"></td> <td class="diff-marker"><a class="mw-diff-movedpara-right" title="Paragraph was moved. Click to jump to old location." href="#movedpara_9_11_lhs">⚫</a></td> <td class="diff-addedline diff-side-added"><div><a name="movedpara_14_0_rhs"></a> <ins class="diffchange diffchange-inline">layer</ins> = self[<ins class="diffchange diffchange-inline">self_len</ins> - 1]</div></td> </tr> <tr> <td class="diff-marker"></td> <td class="diff-context diff-side-deleted"><div> if layer ~= nil then</div></td> <td class="diff-marker"></td> <td class="diff-context diff-side-added"><div> if layer ~= nil then</div></td> </tr> <tr> <td class="diff-marker" data-marker="−"></td> <td class="diff-deletedline diff-side-deleted"><div> node = layer.node</div></td> <td class="diff-marker" data-marker="+"></td> <td class="diff-addedline diff-side-added"><div> <ins class="diffchange diffchange-inline">self[self_len], self[-1], </ins>node =<ins class="diffchange diffchange-inline"> nil, layer,</ins> layer.node</div></td> </tr> <tr> <td class="diff-marker" data-marker="−"></td> <td class="diff-deletedline diff-side-deleted"><div> return self:<del class="diffchange diffchange-inline">iterate</del>(layer, node[self.next_func](node, layer.k))</div></td> <td class="diff-marker" data-marker="+"></td> <td class="diff-addedline diff-side-added"><div> return self:<ins class="diffchange diffchange-inline">catch_values</ins>(layer, node[self.next_func](node, layer.k))</div></td> </tr> <tr> <td class="diff-marker"></td> <td class="diff-context diff-side-deleted"><div> end</div></td> <td class="diff-marker"></td> <td class="diff-context diff-side-added"><div> end</div></td> </tr> <tr> <td class="diff-marker"></td> <td class="diff-context diff-side-deleted"><div> end</div></td> <td class="diff-marker"></td> <td class="diff-context diff-side-added"><div> end</div></td> </tr> <tr> <td colspan="2" class="diff-lineno">Line 159:</td> <td colspan="2" class="diff-lineno">Line 145:</td> </tr> <tr> <td class="diff-marker"></td> <td class="diff-context diff-side-deleted"><div> local layer = self[-1]</div></td> <td class="diff-marker"></td> <td class="diff-context diff-side-added"><div> local layer = self[-1]</div></td> </tr> <tr> <td class="diff-marker"></td> <td class="diff-context diff-side-deleted"><div> local node, k = layer.node, layer.k</div></td> <td class="diff-marker"></td> <td class="diff-context diff-side-added"><div> local node, k = layer.node, layer.k</div></td> </tr> <tr> <td class="diff-marker" data-marker="−"></td> <td class="diff-deletedline diff-side-deleted"><div> local <del class="diffchange diffchange-inline">curr_val</del> = node[k]</div></td> <td class="diff-marker" data-marker="+"></td> <td class="diff-addedline diff-side-added"><div> local <ins class="diffchange diffchange-inline">v</ins> = node[k]</div></td> </tr> <tr> <td colspan="2" class="diff-empty diff-side-deleted"></td> <td class="diff-marker" data-marker="+"></td> <td class="diff-addedline diff-side-added"><div> -- If `v` is a node, push a new layer onto the stack and iterate over it.</div></td> </tr> <tr> <td class="diff-marker" data-marker="−"></td> <td class="diff-deletedline diff-side-deleted"><div> if is_node(<del class="diffchange diffchange-inline">curr_val</del>) then</div></td> <td class="diff-marker" data-marker="+"></td> <td class="diff-addedline diff-side-added"><div> if is_node(<ins class="diffchange diffchange-inline">v</ins>) then</div></td> </tr> <tr> <td class="diff-marker" data-marker="−"></td> <td class="diff-deletedline diff-side-deleted"><div> self:push(curr_val)</div></td> <td colspan="2" class="diff-empty diff-side-added"></td> </tr> <tr> <td class="diff-marker" data-marker="−"></td> <td class="diff-deletedline diff-side-deleted"><div> layer = <del class="diffchange diffchange-inline">self[-1]</del></div></td> <td class="diff-marker" data-marker="+"></td> <td class="diff-addedline diff-side-added"><div> layer<ins class="diffchange diffchange-inline">, k, node</ins> = <ins class="diffchange diffchange-inline">{k = 0, node = v}, 0, v</ins></div></td> </tr> <tr> <td class="diff-marker" data-marker="−"></td> <td class="diff-deletedline diff-side-deleted"><div> <del class="diffchange diffchange-inline">node</del>, <del class="diffchange diffchange-inline">k</del> = layer<del class="diffchange diffchange-inline">.node</del>, layer<del class="diffchange diffchange-inline">.k</del></div></td> <td class="diff-marker" data-marker="+"></td> <td class="diff-addedline diff-side-added"><div> <ins class="diffchange diffchange-inline">self[#self + 1]</ins>, <ins class="diffchange diffchange-inline">self[-1]</ins> = layer, layer</div></td> </tr> <tr> <td class="diff-marker"></td> <td class="diff-context diff-side-deleted"><div> end</div></td> <td class="diff-marker"></td> <td class="diff-context diff-side-added"><div> end</div></td> </tr> <tr> <td class="diff-marker" data-marker="−"></td> <td class="diff-deletedline diff-side-deleted"><div> return self:<del class="diffchange diffchange-inline">iterate</del>(layer, node[self.next_func](node, k))</div></td> <td class="diff-marker" data-marker="+"></td> <td class="diff-addedline diff-side-added"><div> return self:<ins class="diffchange diffchange-inline">catch_values</ins>(layer, node[self.next_func](node, k))</div></td> </tr> <tr> <td class="diff-marker"></td> <td class="diff-context diff-side-deleted"><div> end</div></td> <td class="diff-marker"></td> <td class="diff-context diff-side-added"><div> end</div></td> </tr> <tr> <td class="diff-marker"></td> <td class="diff-context diff-side-deleted"><div> </div></td> <td class="diff-marker"></td> <td class="diff-context diff-side-added"><div> </div></td> </tr> <tr> <td class="diff-marker"></td> <td class="diff-context diff-side-deleted"><div> function Node:iterate(next_func)</div></td> <td class="diff-marker"></td> <td class="diff-context diff-side-added"><div> function Node:iterate(next_func)</div></td> </tr> <tr> <td colspan="2" class="diff-empty diff-side-deleted"></td> <td class="diff-marker"><a class="mw-diff-movedpara-right" title="Paragraph was moved. Click to jump to old location." href="#movedpara_8_0_lhs">⚫</a></td> <td class="diff-addedline diff-side-added"><div><a name="movedpara_27_0_rhs"></a> local layer = {<ins class="diffchange diffchange-inline">k = 0, node = self}</ins></div></td> </tr> <tr> <td class="diff-marker"></td> <td class="diff-context diff-side-deleted"><div> return setmetatable({</div></td> <td class="diff-marker"></td> <td class="diff-context diff-side-added"><div> return setmetatable({</div></td> </tr> <tr> <td colspan="2" class="diff-empty diff-side-deleted"></td> <td class="diff-marker"><a class="mw-diff-movedpara-right" title="Paragraph was moved. Click to jump to old location." href="#movedpara_9_0_lhs">⚫</a></td> <td class="diff-addedline diff-side-added"><div><a name="movedpara_29_0_rhs"></a> <ins class="diffchange diffchange-inline">layer</ins>,</div></td> </tr> <tr> <td class="diff-marker"><a class="mw-diff-movedpara-left" title="Paragraph was moved. Click to jump to new location." href="#movedpara_33_0_rhs">⚫</a></td> <td class="diff-deletedline diff-side-deleted"><div><a name="movedpara_30_0_lhs"></a> next_func = next_func == nil and "next" or next_func</div></td> <td colspan="2" class="diff-empty diff-side-added"></td> </tr> <tr> <td colspan="2" class="diff-empty diff-side-deleted"></td> <td class="diff-marker"><a class="mw-diff-movedpara-right" title="Paragraph was moved. Click to jump to old location." href="#movedpara_9_3_lhs">⚫</a></td> <td class="diff-addedline diff-side-added"><div><a name="movedpara_31_0_rhs"></a> <ins class="diffchange diffchange-inline"> </ins>[<ins class="diffchange diffchange-inline">-</ins>1] = layer<ins class="diffchange diffchange-inline">,</ins></div></td> </tr> <tr> <td class="diff-marker"><a class="mw-diff-movedpara-left" title="Paragraph was moved. Click to jump to new location." href="#movedpara_35_0_rhs">⚫</a></td> <td class="diff-deletedline diff-side-deleted"><div><a name="movedpara_32_0_lhs"></a> }, Iterator1<del class="diffchange diffchange-inline">):push(self</del>)</div></td> <td colspan="2" class="diff-empty diff-side-added"></td> </tr> <tr> <td colspan="2" class="diff-empty diff-side-deleted"></td> <td class="diff-marker"><a class="mw-diff-movedpara-right" title="Paragraph was moved. Click to jump to old location." href="#movedpara_30_0_lhs">⚫</a></td> <td class="diff-addedline diff-side-added"><div><a name="movedpara_33_0_rhs"></a> next_func = next_func == nil and "next" or next_func<ins class="diffchange diffchange-inline">,</ins></div></td> </tr> <tr> <td class="diff-marker" data-marker="−"></td> <td class="diff-deletedline diff-side-deleted"><div> end</div></td> <td colspan="2" class="diff-empty diff-side-added"></td> </tr> <tr> <td colspan="2" class="diff-empty diff-side-deleted"></td> <td class="diff-marker"><a class="mw-diff-movedpara-right" title="Paragraph was moved. Click to jump to old location." href="#movedpara_32_0_lhs">⚫</a></td> <td class="diff-addedline diff-side-added"><div><a name="movedpara_35_0_rhs"></a> }, Iterator1)</div></td> </tr> <tr> <td class="diff-marker" data-marker="−"></td> <td class="diff-deletedline diff-side-deleted"><div> </div></td> <td colspan="2" class="diff-empty diff-side-added"></td> </tr> <tr> <td class="diff-marker"><a class="mw-diff-movedpara-left" title="Paragraph was moved. Click to jump to new location." href="#movedpara_39_2_rhs">⚫</a></td> <td class="diff-deletedline diff-side-deleted"><div><a name="movedpara_37_0_lhs"></a><del class="diffchange diffchange-inline"> </del>function Node:iterate_nodes()</div></td> <td colspan="2" class="diff-empty diff-side-added"></td> </tr> <tr> <td class="diff-marker"><a class="mw-diff-movedpara-left" title="Paragraph was moved. Click to jump to new location." href="#movedpara_39_3_rhs">⚫</a></td> <td class="diff-deletedline diff-side-deleted"><div><a name="movedpara_37_1_lhs"></a><del class="diffchange diffchange-inline"> </del>return self:iterate("next_node")</div></td> <td colspan="2" class="diff-empty diff-side-added"></td> </tr> <tr> <td class="diff-marker"></td> <td class="diff-context diff-side-deleted"><div> end</div></td> <td class="diff-marker"></td> <td class="diff-context diff-side-added"><div> end</div></td> </tr> <tr> <td colspan="2" class="diff-empty diff-side-deleted"></td> <td class="diff-marker"><a class="mw-diff-movedpara-right" title="Paragraph was moved. Click to jump to old location." href="#movedpara_9_6_lhs">⚫</a></td> <td class="diff-addedline diff-side-added"><div><a name="movedpara_39_0_rhs"></a>end</div></td> </tr> <tr> <td colspan="2" class="diff-empty diff-side-deleted"></td> <td class="diff-marker" data-marker="+"></td> <td class="diff-addedline diff-side-added"><br /></td> </tr> <tr> <td colspan="2" class="diff-empty diff-side-deleted"></td> <td class="diff-marker"><a class="mw-diff-movedpara-right" title="Paragraph was moved. Click to jump to old location." href="#movedpara_37_0_lhs">⚫</a></td> <td class="diff-addedline diff-side-added"><div><a name="movedpara_39_2_rhs"></a>function Node:iterate_nodes()</div></td> </tr> <tr> <td colspan="2" class="diff-empty diff-side-deleted"></td> <td class="diff-marker"><a class="mw-diff-movedpara-right" title="Paragraph was moved. Click to jump to old location." href="#movedpara_37_1_lhs">⚫</a></td> <td class="diff-addedline diff-side-added"><div><a name="movedpara_39_3_rhs"></a><ins class="diffchange diffchange-inline"> </ins>return self:iterate("next_node")</div></td> </tr> <tr> <td class="diff-marker"></td> <td class="diff-context diff-side-deleted"><div>end</div></td> <td class="diff-marker"></td> <td class="diff-context diff-side-added"><div>end</div></td> </tr> <tr> <td class="diff-marker"></td> <td class="diff-context diff-side-deleted"><br /></td> <td class="diff-marker"></td> <td class="diff-context diff-side-added"><br /></td> </tr> <!-- diff cache key enwiktionary:diff:1.41:old-82788777:rev-82789053:wikidiff2=table:1.14.1:ff290eae --> </table><hr class='diff-hr' id='mw-oldid' /> <h2 class='diff-currentversion-title'>Revision as of 22:41, 28 November 2024</h2> <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:parser/documentation" title="Module:parser/documentation">Module:parser/documentation</a>. <sup>[<a class="external text" href="https://en.wiktionary.org/w/index.php?title=Module:parser/documentation&action=edit">edit</a>]</sup></i></dd><dd> <i>Useful links</i>: <a href="/wiki/Special:PrefixIndex/Module:parser/" title="Special:PrefixIndex/Module:parser/">subpage list</a> • <a class="external text" href="https://en.wiktionary.org/w/index.php?title=Special%3AWhatLinksHere%2FModule%3Aparser&hideredirs=1&hidetrans=1">links</a> • <a class="external text" href="https://en.wiktionary.org/w/index.php?title=Special%3AWhatLinksHere%2FModule%3Aparser&hidelinks=1&hideredirs=1">transclusions</a> • <a href="/w/index.php?title=Module:parser/testcases&action=edit&redlink=1" class="new" title="Module:parser/testcases (page does not exist)">testcases</a> • <a href="/w/index.php?title=Module:parser/sandbox&action=edit&redlink=1" class="new" title="Module: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-blue"> <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 module needs documentation. </th></tr> <tr> <td>Please <a href="/wiki/Help:Documenting_templates_and_modules" title="Help:Documenting templates and modules">document</a> this module by describing its purpose and usage on the <a href="/wiki/Module:parser/documentation" title="Module:parser/documentation">documentation page</a>. </td></tr></tbody></table></div> <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="kd">local</span> <span class="n">export</span> <span class="o">=</span> <span class="p">{}</span> </span><span id="L-2"><a href="#L-2"><span class="linenos" data-line="2"></span></a> </span><span id="L-3"><a href="#L-3"><span class="linenos" data-line="3"></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-4"><a href="#L-4"><span class="linenos" data-line="4"></span></a><span class="kd">local</span> <span class="n">deepcopy</span> <span class="c1">-- Assigned when needed.</span> </span><span id="L-5"><a href="#L-5"><span class="linenos" data-line="5"></span></a><span class="kd">local</span> <span class="nb">getmetatable</span> <span class="o">=</span> <span class="nb">getmetatable</span> </span><span id="L-6"><a href="#L-6"><span class="linenos" data-line="6"></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-7"><a href="#L-7"><span class="linenos" data-line="7"></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-8"><a href="#L-8"><span class="linenos" data-line="8"></span></a><span class="kd">local</span> <span class="nb">rawget</span> <span class="o">=</span> <span class="nb">rawget</span> </span><span id="L-9"><a href="#L-9"><span class="linenos" data-line="9"></span></a><span class="kd">local</span> <span class="nb">rawset</span> <span class="o">=</span> <span class="nb">rawset</span> </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">remove</span> <span class="o">=</span> <span class="nb">table.remove</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="nb">setmetatable</span> <span class="o">=</span> <span class="nb">setmetatable</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="nb">type</span> <span class="o">=</span> <span class="nb">type</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">unpack</span> <span class="o">=</span> <span class="n">unpack</span> </span><span id="L-14"><a href="#L-14"><span class="linenos" data-line="14"></span></a> </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">classes</span> <span class="o">=</span> <span class="p">{}</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">metamethods</span> <span class="o">=</span> <span class="n">mw</span><span class="p">.</span><span class="n">loadData</span><span class="p">(</span><span class="s2">"Module:data/metamethods"</span><span class="p">)</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="c1">------------------------------------------------------------------------------------</span> </span><span id="L-19"><a href="#L-19"><span class="linenos" data-line="19"></span></a><span class="c1">--</span> </span><span id="L-20"><a href="#L-20"><span class="linenos" data-line="20"></span></a><span class="c1">-- Helper functions</span> </span><span id="L-21"><a href="#L-21"><span class="linenos" data-line="21"></span></a><span class="c1">--</span> </span><span id="L-22"><a href="#L-22"><span class="linenos" data-line="22"></span></a><span class="c1">------------------------------------------------------------------------------------</span> </span><span id="L-23"><a href="#L-23"><span class="linenos" data-line="23"></span></a> </span><span id="L-24"><a href="#L-24"><span class="linenos" data-line="24"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">get_nested</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="n">k</span><span class="p">,</span> <span class="p">...)</span> </span><span id="L-25"><a href="#L-25"><span class="linenos" data-line="25"></span></a> <span class="kr">if</span> <span class="n">t</span> <span class="o">==</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-26"><a href="#L-26"><span class="linenos" data-line="26"></span></a> <span class="kr">return</span> <span class="kc">nil</span> </span><span id="L-27"><a href="#L-27"><span class="linenos" data-line="27"></span></a> <span class="kr">elseif</span> <span class="p">...</span> <span class="o">==</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-28"><a href="#L-28"><span class="linenos" data-line="28"></span></a> <span class="kr">return</span> <span class="n">t</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> </span><span id="L-29"><a href="#L-29"><span class="linenos" data-line="29"></span></a> <span class="kr">end</span> </span><span id="L-30"><a href="#L-30"><span class="linenos" data-line="30"></span></a> <span class="kr">return</span> <span class="n">get_nested</span><span class="p">(</span><span class="n">t</span><span class="p">[</span><span class="n">k</span><span class="p">],</span> <span class="p">...)</span> </span><span id="L-31"><a href="#L-31"><span class="linenos" data-line="31"></span></a><span class="kr">end</span> </span><span id="L-32"><a href="#L-32"><span class="linenos" data-line="32"></span></a> </span><span id="L-33"><a href="#L-33"><span class="linenos" data-line="33"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">set_nested</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span><span class="p">,</span> <span class="p">...)</span> </span><span id="L-34"><a href="#L-34"><span class="linenos" data-line="34"></span></a> <span class="kr">if</span> <span class="p">...</span> <span class="o">~=</span> <span class="kc">nil</span> <span class="kr">then</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">t_next</span> <span class="o">=</span> <span class="n">t</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> </span><span id="L-36"><a href="#L-36"><span class="linenos" data-line="36"></span></a> <span class="kr">if</span> <span class="n">t_next</span> <span class="o">==</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-37"><a href="#L-37"><span class="linenos" data-line="37"></span></a> <span class="n">t_next</span> <span class="o">=</span> <span class="p">{}</span> </span><span id="L-38"><a href="#L-38"><span class="linenos" data-line="38"></span></a> <span class="n">t</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">t_next</span> </span><span id="L-39"><a href="#L-39"><span class="linenos" data-line="39"></span></a> <span class="kr">end</span> </span><span id="L-40"><a href="#L-40"><span class="linenos" data-line="40"></span></a> <span class="kr">return</span> <span class="n">set_nested</span><span class="p">(</span><span class="n">t_next</span><span class="p">,</span> <span class="n">v</span><span class="p">,</span> <span class="p">...)</span> </span><span id="L-41"><a href="#L-41"><span class="linenos" data-line="41"></span></a> <span class="kr">end</span> </span><span id="L-42"><a href="#L-42"><span class="linenos" data-line="42"></span></a> <span class="n">t</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">v</span> </span><span id="L-43"><a href="#L-43"><span class="linenos" data-line="43"></span></a><span class="kr">end</span> </span><span id="L-44"><a href="#L-44"><span class="linenos" data-line="44"></span></a> </span><span id="L-45"><a href="#L-45"><span class="linenos" data-line="45"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">inherit_metamethods</span><span class="p">(</span><span class="n">child</span><span class="p">,</span> <span class="n">parent</span><span class="p">)</span> </span><span id="L-46"><a href="#L-46"><span class="linenos" data-line="46"></span></a> <span class="kr">if</span> <span class="n">parent</span> <span class="kr">then</span> </span><span id="L-47"><a href="#L-47"><span class="linenos" data-line="47"></span></a> <span class="kr">for</span> <span class="n">method</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">parent</span> <span class="kr">do</span> </span><span id="L-48"><a href="#L-48"><span class="linenos" data-line="48"></span></a> <span class="kr">if</span> <span class="n">child</span><span class="p">[</span><span class="n">method</span><span class="p">]</span> <span class="o">==</span> <span class="kc">nil</span> <span class="ow">and</span> <span class="n">metamethods</span><span class="p">[</span><span class="n">method</span><span class="p">]</span> <span class="o">~=</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-49"><a href="#L-49"><span class="linenos" data-line="49"></span></a> <span class="n">child</span><span class="p">[</span><span class="n">method</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span> </span><span id="L-50"><a href="#L-50"><span class="linenos" data-line="50"></span></a> <span class="kr">end</span> </span><span id="L-51"><a href="#L-51"><span class="linenos" data-line="51"></span></a> <span class="kr">end</span> </span><span id="L-52"><a href="#L-52"><span class="linenos" data-line="52"></span></a> <span class="kr">end</span> </span><span id="L-53"><a href="#L-53"><span class="linenos" data-line="53"></span></a> <span class="kr">return</span> <span class="n">child</span> </span><span id="L-54"><a href="#L-54"><span class="linenos" data-line="54"></span></a><span class="kr">end</span> </span><span id="L-55"><a href="#L-55"><span class="linenos" data-line="55"></span></a> </span><span id="L-56"><a href="#L-56"><span class="linenos" data-line="56"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">signed_index</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span> </span><span id="L-57"><a href="#L-57"><span class="linenos" data-line="57"></span></a> <span class="kr">return</span> <span class="n">n</span> <span class="ow">and</span> <span class="n">n</span> <span class="o"><=</span> <span class="mi">0</span> <span class="ow">and</span> <span class="o">#</span><span class="n">t</span> <span class="o">+</span> <span class="mi">1</span> <span class="o">+</span> <span class="n">n</span> <span class="ow">or</span> <span class="n">n</span> </span><span id="L-58"><a href="#L-58"><span class="linenos" data-line="58"></span></a><span class="kr">end</span> </span><span id="L-59"><a href="#L-59"><span class="linenos" data-line="59"></span></a> </span><span id="L-60"><a href="#L-60"><span class="linenos" data-line="60"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">is_node</span><span class="p">(</span><span class="n">value</span><span class="p">)</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">classes</span><span class="p">[</span><span class="nb">getmetatable</span><span class="p">(</span><span class="n">value</span><span class="p">)]</span> <span class="o">~=</span> <span class="kc">nil</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="c1">-- Recursively calling tostring() adds to the C stack (limit: 200), whereas</span> </span><span id="L-65"><a href="#L-65"><span class="linenos" data-line="65"></span></a><span class="c1">-- calling __tostring metamethods directly does not. Occasionally relevant when</span> </span><span id="L-66"><a href="#L-66"><span class="linenos" data-line="66"></span></a><span class="c1">-- dealing with very deep nesting.</span> </span><span id="L-67"><a href="#L-67"><span class="linenos" data-line="67"></span></a><span class="kd">local</span> <span class="nb">tostring</span> </span><span id="L-68"><a href="#L-68"><span class="linenos" data-line="68"></span></a><span class="kr">do</span> </span><span id="L-69"><a href="#L-69"><span class="linenos" data-line="69"></span></a> <span class="kd">local</span> <span class="n">_tostring</span> <span class="o">=</span> <span class="n">_G</span><span class="p">.</span><span class="n">tostring</span> </span><span id="L-70"><a href="#L-70"><span class="linenos" data-line="70"></span></a> </span><span id="L-71"><a href="#L-71"><span class="linenos" data-line="71"></span></a> <span class="kr">function</span> <span class="nf">tostring</span><span class="p">(</span><span class="n">value</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">if</span> <span class="n">is_node</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-73"><a href="#L-73"><span class="linenos" data-line="73"></span></a> <span class="kr">return</span> <span class="n">value</span><span class="p">:</span><span class="n">__tostring</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> </span><span id="L-74"><a href="#L-74"><span class="linenos" data-line="74"></span></a> <span class="kr">end</span> </span><span id="L-75"><a href="#L-75"><span class="linenos" data-line="75"></span></a> <span class="kr">return</span> <span class="n">_tostring</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> </span><span id="L-76"><a href="#L-76"><span class="linenos" data-line="76"></span></a> <span class="kr">end</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">class_else_type</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> </span><span id="L-80"><a href="#L-80"><span class="linenos" data-line="80"></span></a> <span class="kd">local</span> <span class="n">class</span> <span class="o">=</span> <span class="n">classes</span><span class="p">[</span><span class="nb">getmetatable</span><span class="p">(</span><span class="n">value</span><span class="p">)]</span> </span><span id="L-81"><a href="#L-81"><span class="linenos" data-line="81"></span></a> <span class="kr">if</span> <span class="n">class</span> <span class="o">~=</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-82"><a href="#L-82"><span class="linenos" data-line="82"></span></a> <span class="kr">return</span> <span class="n">class</span> </span><span id="L-83"><a href="#L-83"><span class="linenos" data-line="83"></span></a> <span class="kr">end</span> </span><span id="L-84"><a href="#L-84"><span class="linenos" data-line="84"></span></a> <span class="kr">return</span> <span class="nb">type</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> </span><span id="L-85"><a href="#L-85"><span class="linenos" data-line="85"></span></a><span class="kr">end</span> </span><span id="L-86"><a href="#L-86"><span class="linenos" data-line="86"></span></a> </span><span id="L-87"><a href="#L-87"><span class="linenos" data-line="87"></span></a><span class="c1">------------------------------------------------------------------------------------</span> </span><span id="L-88"><a href="#L-88"><span class="linenos" data-line="88"></span></a><span class="c1">--</span> </span><span id="L-89"><a href="#L-89"><span class="linenos" data-line="89"></span></a><span class="c1">-- Nodes</span> </span><span id="L-90"><a href="#L-90"><span class="linenos" data-line="90"></span></a><span class="c1">--</span> </span><span id="L-91"><a href="#L-91"><span class="linenos" data-line="91"></span></a><span class="c1">------------------------------------------------------------------------------------</span> </span><span id="L-92"><a href="#L-92"><span class="linenos" data-line="92"></span></a> </span><span id="L-93"><a href="#L-93"><span class="linenos" data-line="93"></span></a><span class="kd">local</span> <span class="n">Node</span> <span class="o">=</span> <span class="p">{}</span> </span><span id="L-94"><a href="#L-94"><span class="linenos" data-line="94"></span></a><span class="n">Node</span><span class="p">.</span><span class="n">__index</span> <span class="o">=</span> <span class="n">Node</span> </span><span id="L-95"><a href="#L-95"><span class="linenos" data-line="95"></span></a> </span><span id="L-96"><a href="#L-96"><span class="linenos" data-line="96"></span></a><span class="kr">function</span> <span class="nc">Node</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-97"><a href="#L-97"><span class="linenos" data-line="97"></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-98"><a href="#L-98"><span class="linenos" data-line="98"></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-99"><a href="#L-99"><span class="linenos" data-line="99"></span></a><span class="kr">end</span> </span><span id="L-100"><a href="#L-100"><span class="linenos" data-line="100"></span></a> </span><span id="L-101"><a href="#L-101"><span class="linenos" data-line="101"></span></a><span class="kr">function</span> <span class="nc">Node</span><span class="p">:</span><span class="nf">next_node</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> </span><span id="L-102"><a href="#L-102"><span class="linenos" data-line="102"></span></a> <span class="kd">local</span> <span class="n">v</span> </span><span id="L-103"><a href="#L-103"><span class="linenos" data-line="103"></span></a> <span class="kr">repeat</span> </span><span id="L-104"><a href="#L-104"><span class="linenos" data-line="104"></span></a> <span class="n">v</span><span class="p">,</span> <span class="n">self</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="nb">next</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> </span><span id="L-105"><a href="#L-105"><span class="linenos" data-line="105"></span></a> <span class="kr">until</span> <span class="n">v</span> <span class="o">==</span> <span class="kc">nil</span> <span class="ow">or</span> <span class="n">is_node</span><span class="p">(</span><span class="n">v</span><span class="p">)</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">v</span><span class="p">,</span> <span class="n">self</span><span class="p">,</span> <span class="n">i</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="c1">-- Implements recursive iteration over a node tree, using functors to maintain state (which uses a lot less memory than closures). Iterator1 exists only to return the calling node on the first iteration, while Iterator2 uses a stack to store the state of each layer in the tree.</span> </span><span id="L-110"><a href="#L-110"><span class="linenos" data-line="110"></span></a> </span><span id="L-111"><a href="#L-111"><span class="linenos" data-line="111"></span></a><span class="c1">-- When a node is encountered (which may contain other nodes), it is returned on the first iteration, and then any child nodes are returned on each subsequent iteration; the same process is followed if any of those children contain nodes themselves. Once a particular node has been fully traversed, the iterator moves back up one layer and continues with any sibling nodes.</span> </span><span id="L-112"><a href="#L-112"><span class="linenos" data-line="112"></span></a> </span><span id="L-113"><a href="#L-113"><span class="linenos" data-line="113"></span></a><span class="c1">-- Each iteration returns three values: `value`, `node` and `key`. Together, these can be used to manipulate the node tree at any given point without needing to know the full structure. Note that when the input node is returned on the first iteration, `node` and `key` will be nil.</span> </span><span id="L-114"><a href="#L-114"><span class="linenos" data-line="114"></span></a> </span><span id="L-115"><a href="#L-115"><span class="linenos" data-line="115"></span></a><span class="c1">-- By default, the iterator will use the `next` method of each node, but this can be changed with the `next_func` parameter, which accepts a string argument with the name of a next method. This is because trees might consist of several different classes of node, and each might have different next methods that are tailored to their particular structures. In addition, each class of node might have multiple different next methods, which can be named according to their purposes. `next_func` ensures that the iterator uses equivalent next methods between different types of node.</span> </span><span id="L-116"><a href="#L-116"><span class="linenos" data-line="116"></span></a> </span><span id="L-117"><a href="#L-117"><span class="linenos" data-line="117"></span></a><span class="c1">-- Currently, two next methods are available: `next`, which simply iterates over the node conventionally, and `next_node`, which only returns children that are themselves nodes. Custom next methods can be declared by any calling module.</span> </span><span id="L-118"><a href="#L-118"><span class="linenos" data-line="118"></span></a><span class="kr">do</span> </span><span id="L-119"><a href="#L-119"><span class="linenos" data-line="119"></span></a> <span class="kd">local</span> <span class="n">Iterator1</span><span class="p">,</span> <span class="n">Iterator2</span> <span class="o">=</span> <span class="p">{},</span> <span class="p">{}</span> </span><span id="L-120"><a href="#L-120"><span class="linenos" data-line="120"></span></a> <span class="n">Iterator2</span><span class="p">.</span><span class="n">__index</span> <span class="o">=</span> <span class="n">Iterator2</span> </span><span id="L-121"><a href="#L-121"><span class="linenos" data-line="121"></span></a> </span><span id="L-122"><a href="#L-122"><span class="linenos" data-line="122"></span></a> <span class="c1">-- Only called on the first iteration, to return the calling node.</span> </span><span id="L-123"><a href="#L-123"><span class="linenos" data-line="123"></span></a> <span class="kr">function</span> <span class="nc">Iterator1</span><span class="p">:</span><span class="nf">__call</span><span class="p">()</span> </span><span id="L-124"><a href="#L-124"><span class="linenos" data-line="124"></span></a> <span class="nb">setmetatable</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">Iterator2</span><span class="p">)</span> </span><span id="L-125"><a href="#L-125"><span class="linenos" data-line="125"></span></a> <span class="kr">return</span> <span class="n">self</span><span class="p">[</span><span class="mi">1</span><span class="p">].</span><span class="n">node</span> </span><span id="L-126"><a href="#L-126"><span class="linenos" data-line="126"></span></a> <span class="kr">end</span> </span><span id="L-127"><a href="#L-127"><span class="linenos" data-line="127"></span></a> </span><span id="L-128"><a href="#L-128"><span class="linenos" data-line="128"></span></a> <span class="c1">-- Catches an arbitrary number of returned values, which avoids the need to do it with a new table each time.</span> </span><span id="L-129"><a href="#L-129"><span class="linenos" data-line="129"></span></a> <span class="kr">function</span> <span class="nc">Iterator2</span><span class="p">:</span><span class="nf">catch_values</span><span class="p">(</span><span class="n">layer</span><span class="p">,</span> <span class="p">...)</span> </span><span id="L-130"><a href="#L-130"><span class="linenos" data-line="130"></span></a> <span class="kd">local</span> <span class="n">v</span><span class="p">,</span> <span class="n">node</span><span class="p">,</span> <span class="n">k</span> <span class="o">=</span> <span class="p">...</span> </span><span id="L-131"><a href="#L-131"><span class="linenos" data-line="131"></span></a> <span class="kr">if</span> <span class="n">v</span> <span class="o">~=</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-132"><a href="#L-132"><span class="linenos" data-line="132"></span></a> <span class="n">layer</span><span class="p">.</span><span class="n">k</span> <span class="o">=</span> <span class="n">k</span> </span><span id="L-133"><a href="#L-133"><span class="linenos" data-line="133"></span></a> <span class="kr">return</span> <span class="p">...</span> </span><span id="L-134"><a href="#L-134"><span class="linenos" data-line="134"></span></a> <span class="kr">end</span> </span><span id="L-135"><a href="#L-135"><span class="linenos" data-line="135"></span></a> <span class="c1">-- If `v` is nil, pop the stack, and continue iterating over the layer below if there is one; otherwise, terminate.</span> </span><span id="L-136"><a href="#L-136"><span class="linenos" data-line="136"></span></a> <span class="kd">local</span> <span class="n">self_len</span> <span class="o">=</span> <span class="o">#</span><span class="n">self</span> </span><span id="L-137"><a href="#L-137"><span class="linenos" data-line="137"></span></a> <span class="n">layer</span> <span class="o">=</span> <span class="n">self</span><span class="p">[</span><span class="n">self_len</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span> </span><span id="L-138"><a href="#L-138"><span class="linenos" data-line="138"></span></a> <span class="kr">if</span> <span class="n">layer</span> <span class="o">~=</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-139"><a href="#L-139"><span class="linenos" data-line="139"></span></a> <span class="n">self</span><span class="p">[</span><span class="n">self_len</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">node</span> <span class="o">=</span> <span class="kc">nil</span><span class="p">,</span> <span class="n">layer</span><span class="p">,</span> <span class="n">layer</span><span class="p">.</span><span class="n">node</span> </span><span id="L-140"><a href="#L-140"><span class="linenos" data-line="140"></span></a> <span class="kr">return</span> <span class="n">self</span><span class="p">:</span><span class="n">catch_values</span><span class="p">(</span><span class="n">layer</span><span class="p">,</span> <span class="n">node</span><span class="p">[</span><span class="n">self</span><span class="p">.</span><span class="n">next_func</span><span class="p">](</span><span class="n">node</span><span class="p">,</span> <span class="n">layer</span><span class="p">.</span><span class="n">k</span><span class="p">))</span> </span><span id="L-141"><a href="#L-141"><span class="linenos" data-line="141"></span></a> <span class="kr">end</span> </span><span id="L-142"><a href="#L-142"><span class="linenos" data-line="142"></span></a> <span class="kr">end</span> </span><span id="L-143"><a href="#L-143"><span class="linenos" data-line="143"></span></a> </span><span id="L-144"><a href="#L-144"><span class="linenos" data-line="144"></span></a> <span class="kr">function</span> <span class="nc">Iterator2</span><span class="p">:</span><span class="nf">__call</span><span class="p">()</span> </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">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-146"><a href="#L-146"><span class="linenos" data-line="146"></span></a> <span class="kd">local</span> <span class="n">node</span><span class="p">,</span> <span class="n">k</span> <span class="o">=</span> <span class="n">layer</span><span class="p">.</span><span class="n">node</span><span class="p">,</span> <span class="n">layer</span><span class="p">.</span><span class="n">k</span> </span><span id="L-147"><a href="#L-147"><span class="linenos" data-line="147"></span></a> <span class="kd">local</span> <span class="n">v</span> <span class="o">=</span> <span class="n">node</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> </span><span id="L-148"><a href="#L-148"><span class="linenos" data-line="148"></span></a> <span class="c1">-- If `v` is a node, push a new layer onto the stack and iterate over it.</span> </span><span id="L-149"><a href="#L-149"><span class="linenos" data-line="149"></span></a> <span class="kr">if</span> <span class="n">is_node</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-150"><a href="#L-150"><span class="linenos" data-line="150"></span></a> <span class="n">layer</span><span class="p">,</span> <span class="n">k</span><span class="p">,</span> <span class="n">node</span> <span class="o">=</span> <span class="p">{</span><span class="n">k</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">node</span> <span class="o">=</span> <span class="n">v</span><span class="p">},</span> <span class="mi">0</span><span class="p">,</span> <span class="n">v</span> </span><span id="L-151"><a href="#L-151"><span class="linenos" data-line="151"></span></a> <span class="n">self</span><span class="p">[</span><span class="o">#</span><span class="n">self</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 class="o">=</span> <span class="n">layer</span><span class="p">,</span> <span class="n">layer</span> </span><span id="L-152"><a href="#L-152"><span class="linenos" data-line="152"></span></a> <span class="kr">end</span> </span><span id="L-153"><a href="#L-153"><span class="linenos" data-line="153"></span></a> <span class="kr">return</span> <span class="n">self</span><span class="p">:</span><span class="n">catch_values</span><span class="p">(</span><span class="n">layer</span><span class="p">,</span> <span class="n">node</span><span class="p">[</span><span class="n">self</span><span class="p">.</span><span class="n">next_func</span><span class="p">](</span><span class="n">node</span><span class="p">,</span> <span class="n">k</span><span class="p">))</span> </span><span id="L-154"><a href="#L-154"><span class="linenos" data-line="154"></span></a> <span class="kr">end</span> </span><span id="L-155"><a href="#L-155"><span class="linenos" data-line="155"></span></a> </span><span id="L-156"><a href="#L-156"><span class="linenos" data-line="156"></span></a> <span class="kr">function</span> <span class="nc">Node</span><span class="p">:</span><span class="nf">iterate</span><span class="p">(</span><span class="n">next_func</span><span class="p">)</span> </span><span id="L-157"><a href="#L-157"><span class="linenos" data-line="157"></span></a> <span class="kd">local</span> <span class="n">layer</span> <span class="o">=</span> <span class="p">{</span><span class="n">k</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">node</span> <span class="o">=</span> <span class="n">self</span><span class="p">}</span> </span><span id="L-158"><a href="#L-158"><span class="linenos" data-line="158"></span></a> <span class="kr">return</span> <span class="nb">setmetatable</span><span class="p">({</span> </span><span id="L-159"><a href="#L-159"><span class="linenos" data-line="159"></span></a> <span class="n">layer</span><span class="p">,</span> </span><span id="L-160"><a href="#L-160"><span class="linenos" data-line="160"></span></a> <span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">layer</span><span class="p">,</span> </span><span id="L-161"><a href="#L-161"><span class="linenos" data-line="161"></span></a> <span class="n">next_func</span> <span class="o">=</span> <span class="n">next_func</span> <span class="o">==</span> <span class="kc">nil</span> <span class="ow">and</span> <span class="s2">"next"</span> <span class="ow">or</span> <span class="n">next_func</span><span class="p">,</span> </span><span id="L-162"><a href="#L-162"><span class="linenos" data-line="162"></span></a> <span class="p">},</span> <span class="n">Iterator1</span><span class="p">)</span> </span><span id="L-163"><a href="#L-163"><span class="linenos" data-line="163"></span></a> <span class="kr">end</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><span id="L-166"><a href="#L-166"><span class="linenos" data-line="166"></span></a><span class="kr">function</span> <span class="nc">Node</span><span class="p">:</span><span class="nf">iterate_nodes</span><span class="p">()</span> </span><span id="L-167"><a href="#L-167"><span class="linenos" data-line="167"></span></a> <span class="kr">return</span> <span class="n">self</span><span class="p">:</span><span class="n">iterate</span><span class="p">(</span><span class="s2">"next_node"</span><span class="p">)</span> </span><span id="L-168"><a href="#L-168"><span class="linenos" data-line="168"></span></a><span class="kr">end</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="kr">function</span> <span class="nc">Node</span><span class="p">:</span><span class="nf">__tostring</span><span class="p">()</span> </span><span id="L-171"><a href="#L-171"><span class="linenos" data-line="171"></span></a> <span class="kd">local</span> <span class="n">output</span> <span class="o">=</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">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-173"><a href="#L-173"><span class="linenos" data-line="173"></span></a> <span class="n">insert</span><span class="p">(</span><span class="n">output</span><span class="p">,</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-174"><a href="#L-174"><span class="linenos" data-line="174"></span></a> <span class="kr">end</span> </span><span id="L-175"><a href="#L-175"><span class="linenos" data-line="175"></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-176"><a href="#L-176"><span class="linenos" data-line="176"></span></a><span class="kr">end</span> </span><span id="L-177"><a href="#L-177"><span class="linenos" data-line="177"></span></a> </span><span id="L-178"><a href="#L-178"><span class="linenos" data-line="178"></span></a><span class="kr">function</span> <span class="nc">Node</span><span class="p">:</span><span class="nf">clone</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="ow">not</span> <span class="n">deepcopy</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="n">deepcopy</span> <span class="o">=</span> <span class="nb">require</span><span class="p">(</span><span class="s2">"Module:table"</span><span class="p">).</span><span class="n">deepcopy</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">deepcopy</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="s2">"keep"</span><span class="p">,</span> <span class="kc">true</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="kr">function</span> <span class="nc">Node</span><span class="p">:</span><span class="nf">new_class</span><span class="p">(</span><span class="n">class</span><span class="p">)</span> </span><span id="L-186"><a href="#L-186"><span class="linenos" data-line="186"></span></a> <span class="kd">local</span> <span class="n">t</span> <span class="o">=</span> <span class="p">{</span><span class="nb">type</span> <span class="o">=</span> <span class="n">class</span><span class="p">}</span> </span><span id="L-187"><a href="#L-187"><span class="linenos" data-line="187"></span></a> <span class="n">t</span><span class="p">.</span><span class="n">__index</span> <span class="o">=</span> <span class="n">t</span> </span><span id="L-188"><a href="#L-188"><span class="linenos" data-line="188"></span></a> <span class="n">t</span> <span class="o">=</span> <span class="n">inherit_metamethods</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="n">self</span><span class="p">)</span> </span><span id="L-189"><a href="#L-189"><span class="linenos" data-line="189"></span></a> <span class="n">classes</span><span class="p">[</span><span class="n">t</span><span class="p">]</span> <span class="o">=</span> <span class="n">class</span> </span><span id="L-190"><a href="#L-190"><span class="linenos" data-line="190"></span></a> <span class="kr">return</span> <span class="nb">setmetatable</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="n">self</span><span class="p">)</span> </span><span id="L-191"><a href="#L-191"><span class="linenos" data-line="191"></span></a><span class="kr">end</span> </span><span id="L-192"><a href="#L-192"><span class="linenos" data-line="192"></span></a> </span><span id="L-193"><a href="#L-193"><span class="linenos" data-line="193"></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">"fail"</span><span class="p">,</span> <span class="s2">"handler"</span><span class="p">,</span> <span class="s2">"head"</span><span class="p">,</span> <span class="s2">"override"</span><span class="p">,</span> <span class="s2">"route"</span><span class="p">}</span> </span><span id="L-194"><a href="#L-194"><span class="linenos" data-line="194"></span></a> </span><span id="L-195"><a href="#L-195"><span class="linenos" data-line="195"></span></a><span class="kr">function</span> <span class="nc">Node</span><span class="p">:</span><span class="nf">new</span><span class="p">(</span><span class="n">t</span><span class="p">)</span> </span><span id="L-196"><a href="#L-196"><span class="linenos" data-line="196"></span></a> <span class="nb">setmetatable</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="kc">nil</span><span class="p">)</span> </span><span id="L-197"><a href="#L-197"><span class="linenos" data-line="197"></span></a> <span class="kd">local</span> <span class="n">keys_to_remove</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">keys_to_remove</span> </span><span id="L-198"><a href="#L-198"><span class="linenos" data-line="198"></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">keys_to_remove</span> <span class="kr">do</span> </span><span id="L-199"><a href="#L-199"><span class="linenos" data-line="199"></span></a> <span class="n">t</span><span class="p">[</span><span class="n">keys_to_remove</span><span class="p">[</span><span class="n">i</span><span class="p">]]</span> <span class="o">=</span> <span class="kc">nil</span> </span><span id="L-200"><a href="#L-200"><span class="linenos" data-line="200"></span></a> <span class="kr">end</span> </span><span id="L-201"><a href="#L-201"><span class="linenos" data-line="201"></span></a> <span class="kr">return</span> <span class="nb">setmetatable</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="n">self</span><span class="p">)</span> </span><span id="L-202"><a href="#L-202"><span class="linenos" data-line="202"></span></a><span class="kr">end</span> </span><span id="L-203"><a href="#L-203"><span class="linenos" data-line="203"></span></a> </span><span id="L-204"><a href="#L-204"><span class="linenos" data-line="204"></span></a><span class="kr">do</span> </span><span id="L-205"><a href="#L-205"><span class="linenos" data-line="205"></span></a> <span class="kd">local</span> <span class="n">Proxy</span> <span class="o">=</span> <span class="p">{}</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">Proxy</span><span class="p">:</span><span class="nf">__index</span><span class="p">(</span><span class="n">k</span><span class="p">)</span> </span><span id="L-208"><a href="#L-208"><span class="linenos" data-line="208"></span></a> <span class="kd">local</span> <span class="n">v</span> <span class="o">=</span> <span class="n">Proxy</span><span class="p">[</span><span class="n">k</span><span class="p">]</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">v</span> <span class="o">~=</span> <span class="kc">nil</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">v</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">return</span> <span class="n">self</span><span class="p">.</span><span class="n">__chars</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> </span><span id="L-213"><a href="#L-213"><span class="linenos" data-line="213"></span></a> <span class="kr">end</span> </span><span id="L-214"><a href="#L-214"><span class="linenos" data-line="214"></span></a> </span><span id="L-215"><a href="#L-215"><span class="linenos" data-line="215"></span></a> <span class="kr">function</span> <span class="nc">Proxy</span><span class="p">:</span><span class="nf">__newindex</span><span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span> </span><span id="L-216"><a href="#L-216"><span class="linenos" data-line="216"></span></a> <span class="kd">local</span> <span class="n">key</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">__keys</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> </span><span id="L-217"><a href="#L-217"><span class="linenos" data-line="217"></span></a> <span class="kr">if</span> <span class="n">key</span> <span class="kr">then</span> </span><span id="L-218"><a href="#L-218"><span class="linenos" data-line="218"></span></a> <span class="n">self</span><span class="p">.</span><span class="n">__chars</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">v</span> </span><span id="L-219"><a href="#L-219"><span class="linenos" data-line="219"></span></a> <span class="n">self</span><span class="p">.</span><span class="n">__parents</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">v</span> </span><span id="L-220"><a href="#L-220"><span class="linenos" data-line="220"></span></a> <span class="kr">elseif</span> <span class="n">key</span> <span class="o">==</span> <span class="kc">false</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="nb">error</span><span class="p">(</span><span class="s2">"Character is immutable."</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">else</span> </span><span id="L-223"><a href="#L-223"><span class="linenos" data-line="223"></span></a> <span class="nb">error</span><span class="p">(</span><span class="s2">"Invalid key."</span><span class="p">)</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 class="kr">end</span> </span><span id="L-226"><a href="#L-226"><span class="linenos" data-line="226"></span></a> </span><span id="L-227"><a href="#L-227"><span class="linenos" data-line="227"></span></a> <span class="kr">function</span> <span class="nc">Proxy</span><span class="p">:</span><span class="nf">build</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">)</span> </span><span id="L-228"><a href="#L-228"><span class="linenos" data-line="228"></span></a> <span class="kd">local</span> <span class="n">len</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">__len</span> <span class="o">+</span> <span class="mi">1</span> </span><span id="L-229"><a href="#L-229"><span class="linenos" data-line="229"></span></a> <span class="n">self</span><span class="p">.</span><span class="n">__chars</span><span class="p">[</span><span class="n">len</span><span class="p">]</span> <span class="o">=</span> <span class="n">a</span> </span><span id="L-230"><a href="#L-230"><span class="linenos" data-line="230"></span></a> <span class="n">self</span><span class="p">.</span><span class="n">__parents</span><span class="p">[</span><span class="n">len</span><span class="p">]</span> <span class="o">=</span> <span class="n">b</span> </span><span id="L-231"><a href="#L-231"><span class="linenos" data-line="231"></span></a> <span class="n">self</span><span class="p">.</span><span class="n">__keys</span><span class="p">[</span><span class="n">len</span><span class="p">]</span> <span class="o">=</span> <span class="n">c</span> </span><span id="L-232"><a href="#L-232"><span class="linenos" data-line="232"></span></a> <span class="n">self</span><span class="p">.</span><span class="n">__len</span> <span class="o">=</span> <span class="n">len</span> </span><span id="L-233"><a href="#L-233"><span class="linenos" data-line="233"></span></a> <span class="kr">end</span> </span><span id="L-234"><a href="#L-234"><span class="linenos" data-line="234"></span></a> </span><span id="L-235"><a href="#L-235"><span class="linenos" data-line="235"></span></a> <span class="kr">function</span> <span class="nc">Proxy</span><span class="p">:</span><span class="nf">iter</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> </span><span id="L-236"><a href="#L-236"><span class="linenos" data-line="236"></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-237"><a href="#L-237"><span class="linenos" data-line="237"></span></a> <span class="kd">local</span> <span class="n">char</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">__chars</span><span class="p">[</span><span class="n">i</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">if</span> <span class="n">char</span> <span class="o">~=</span> <span class="kc">nil</span> <span class="kr">then</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="n">i</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">self</span><span class="p">,</span> <span class="n">self</span><span class="p">.</span><span class="n">__parents</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">__keys</span><span class="p">[</span><span class="n">i</span><span class="p">]</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 class="kr">end</span> </span><span id="L-242"><a href="#L-242"><span class="linenos" data-line="242"></span></a> </span><span id="L-243"><a href="#L-243"><span class="linenos" data-line="243"></span></a> <span class="kr">function</span> <span class="nc">Node</span><span class="p">:</span><span class="nf">new_proxy</span><span class="p">()</span> </span><span id="L-244"><a href="#L-244"><span class="linenos" data-line="244"></span></a> <span class="kr">return</span> <span class="nb">setmetatable</span><span class="p">({</span> </span><span id="L-245"><a href="#L-245"><span class="linenos" data-line="245"></span></a> <span class="n">__node</span> <span class="o">=</span> <span class="n">self</span><span class="p">,</span> </span><span id="L-246"><a href="#L-246"><span class="linenos" data-line="246"></span></a> <span class="n">__chars</span> <span class="o">=</span> <span class="p">{},</span> </span><span id="L-247"><a href="#L-247"><span class="linenos" data-line="247"></span></a> <span class="n">__parents</span> <span class="o">=</span> <span class="p">{},</span> </span><span id="L-248"><a href="#L-248"><span class="linenos" data-line="248"></span></a> <span class="n">__keys</span> <span class="o">=</span> <span class="p">{},</span> </span><span id="L-249"><a href="#L-249"><span class="linenos" data-line="249"></span></a> <span class="n">__len</span> <span class="o">=</span> <span class="mi">0</span> </span><span id="L-250"><a href="#L-250"><span class="linenos" data-line="250"></span></a> <span class="p">},</span> <span class="n">Proxy</span><span class="p">)</span> </span><span id="L-251"><a href="#L-251"><span class="linenos" data-line="251"></span></a> <span class="kr">end</span> </span><span id="L-252"><a href="#L-252"><span class="linenos" data-line="252"></span></a><span class="kr">end</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="c1">------------------------------------------------------------------------------------</span> </span><span id="L-255"><a href="#L-255"><span class="linenos" data-line="255"></span></a><span class="c1">--</span> </span><span id="L-256"><a href="#L-256"><span class="linenos" data-line="256"></span></a><span class="c1">-- Parser</span> </span><span id="L-257"><a href="#L-257"><span class="linenos" data-line="257"></span></a><span class="c1">--</span> </span><span id="L-258"><a href="#L-258"><span class="linenos" data-line="258"></span></a><span class="c1">------------------------------------------------------------------------------------</span> </span><span id="L-259"><a href="#L-259"><span class="linenos" data-line="259"></span></a> </span><span id="L-260"><a href="#L-260"><span class="linenos" data-line="260"></span></a><span class="kd">local</span> <span class="n">Parser</span> <span class="o">=</span> <span class="p">{}</span> </span><span id="L-261"><a href="#L-261"><span class="linenos" data-line="261"></span></a><span class="n">Parser</span><span class="p">.</span><span class="n">__index</span> <span class="o">=</span> <span class="n">Parser</span> </span><span id="L-262"><a href="#L-262"><span class="linenos" data-line="262"></span></a> </span><span id="L-263"><a href="#L-263"><span class="linenos" data-line="263"></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">delta</span><span class="p">)</span> </span><span id="L-264"><a href="#L-264"><span class="linenos" data-line="264"></span></a> <span class="kd">local</span> <span class="n">v</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="p">(</span><span class="n">delta</span> <span class="ow">or</span> <span class="mi">0</span><span class="p">)]</span> </span><span id="L-265"><a href="#L-265"><span class="linenos" data-line="265"></span></a> <span class="kr">return</span> <span class="n">v</span> <span class="o">==</span> <span class="kc">nil</span> <span class="ow">and</span> <span class="s2">""</span> <span class="ow">or</span> <span class="n">v</span> </span><span id="L-266"><a href="#L-266"><span class="linenos" data-line="266"></span></a><span class="kr">end</span> </span><span id="L-267"><a href="#L-267"><span class="linenos" data-line="267"></span></a> </span><span id="L-268"><a href="#L-268"><span class="linenos" data-line="268"></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-269"><a href="#L-269"><span class="linenos" data-line="269"></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="o">==</span> <span class="kc">nil</span> <span class="ow">and</span> <span class="mi">1</span> <span class="ow">or</span> <span class="n">n</span><span class="p">)</span> </span><span id="L-270"><a href="#L-270"><span class="linenos" data-line="270"></span></a><span class="kr">end</span> </span><span id="L-271"><a href="#L-271"><span class="linenos" data-line="271"></span></a> </span><span id="L-272"><a href="#L-272"><span class="linenos" data-line="272"></span></a><span class="kr">function</span> <span class="nc">Parser</span><span class="p">:</span><span class="nf">layer</span><span class="p">(</span><span class="n">n</span><span class="p">)</span> </span><span id="L-273"><a href="#L-273"><span class="linenos" data-line="273"></span></a> <span class="kr">if</span> <span class="n">n</span> <span class="o">~=</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-274"><a href="#L-274"><span class="linenos" data-line="274"></span></a> <span class="kr">return</span> <span class="nb">rawget</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="o">#</span><span class="n">self</span> <span class="o">+</span> <span class="n">n</span><span class="p">)</span> </span><span id="L-275"><a href="#L-275"><span class="linenos" data-line="275"></span></a> <span class="kr">end</span> </span><span id="L-276"><a href="#L-276"><span class="linenos" data-line="276"></span></a> <span class="kr">return</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-277"><a href="#L-277"><span class="linenos" data-line="277"></span></a><span class="kr">end</span> </span><span id="L-278"><a href="#L-278"><span class="linenos" data-line="278"></span></a> </span><span id="L-279"><a href="#L-279"><span class="linenos" data-line="279"></span></a><span class="kr">function</span> <span class="nc">Parser</span><span class="p">:</span><span class="nf">emit</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span> </span><span id="L-280"><a href="#L-280"><span class="linenos" data-line="280"></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-281"><a href="#L-281"><span class="linenos" data-line="281"></span></a> <span class="kr">if</span> <span class="n">b</span> <span class="o">~=</span> <span class="kc">nil</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="n">insert</span><span class="p">(</span><span class="n">layer</span><span class="p">,</span> <span class="n">signed_index</span><span class="p">(</span><span class="n">layer</span><span class="p">,</span> <span class="n">a</span><span class="p">),</span> <span class="n">b</span><span class="p">)</span> </span><span id="L-283"><a href="#L-283"><span class="linenos" data-line="283"></span></a> <span class="kr">else</span> </span><span id="L-284"><a href="#L-284"><span class="linenos" data-line="284"></span></a> <span class="nb">rawset</span><span class="p">(</span><span class="n">layer</span><span class="p">,</span> <span class="o">#</span><span class="n">layer</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">a</span><span class="p">)</span> </span><span id="L-285"><a href="#L-285"><span class="linenos" data-line="285"></span></a> <span class="kr">end</span> </span><span id="L-286"><a href="#L-286"><span class="linenos" data-line="286"></span></a><span class="kr">end</span> </span><span id="L-287"><a href="#L-287"><span class="linenos" data-line="287"></span></a> </span><span id="L-288"><a href="#L-288"><span class="linenos" data-line="288"></span></a><span class="kr">function</span> <span class="nc">Parser</span><span class="p">:</span><span class="nf">emit_tokens</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span> </span><span id="L-289"><a href="#L-289"><span class="linenos" data-line="289"></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-290"><a href="#L-290"><span class="linenos" data-line="290"></span></a> <span class="kr">if</span> <span class="n">b</span> <span class="o">~=</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-291"><a href="#L-291"><span class="linenos" data-line="291"></span></a> <span class="n">a</span> <span class="o">=</span> <span class="n">signed_index</span><span class="p">(</span><span class="n">layer</span><span class="p">,</span> <span class="n">a</span><span class="p">)</span> </span><span id="L-292"><a href="#L-292"><span class="linenos" data-line="292"></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">b</span> <span class="kr">do</span> </span><span id="L-293"><a href="#L-293"><span class="linenos" data-line="293"></span></a> <span class="n">insert</span><span class="p">(</span><span class="n">layer</span><span class="p">,</span> <span class="n">a</span> <span class="o">+</span> <span class="n">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">b</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> </span><span id="L-294"><a href="#L-294"><span class="linenos" data-line="294"></span></a> <span class="kr">end</span> </span><span id="L-295"><a href="#L-295"><span class="linenos" data-line="295"></span></a> <span class="kr">else</span> </span><span id="L-296"><a href="#L-296"><span class="linenos" data-line="296"></span></a> <span class="kd">local</span> <span class="n">len</span> <span class="o">=</span> <span class="o">#</span><span class="n">layer</span> </span><span id="L-297"><a href="#L-297"><span class="linenos" data-line="297"></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">a</span> <span class="kr">do</span> </span><span id="L-298"><a href="#L-298"><span class="linenos" data-line="298"></span></a> <span class="n">len</span> <span class="o">=</span> <span class="n">len</span> <span class="o">+</span> <span class="mi">1</span> </span><span id="L-299"><a href="#L-299"><span class="linenos" data-line="299"></span></a> <span class="nb">rawset</span><span class="p">(</span><span class="n">layer</span><span class="p">,</span> <span class="n">len</span><span class="p">,</span> <span class="n">a</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> </span><span id="L-300"><a href="#L-300"><span class="linenos" data-line="300"></span></a> <span class="kr">end</span> </span><span id="L-301"><a href="#L-301"><span class="linenos" data-line="301"></span></a> <span class="kr">end</span> </span><span id="L-302"><a href="#L-302"><span class="linenos" data-line="302"></span></a><span class="kr">end</span> </span><span id="L-303"><a href="#L-303"><span class="linenos" data-line="303"></span></a> </span><span id="L-304"><a href="#L-304"><span class="linenos" data-line="304"></span></a><span class="kr">function</span> <span class="nc">Parser</span><span class="p">:</span><span class="nf">remove</span><span class="p">(</span><span class="n">n</span><span class="p">)</span> </span><span id="L-305"><a href="#L-305"><span class="linenos" data-line="305"></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-306"><a href="#L-306"><span class="linenos" data-line="306"></span></a> <span class="kr">if</span> <span class="n">n</span> <span class="o">~=</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-307"><a href="#L-307"><span class="linenos" data-line="307"></span></a> <span class="kr">return</span> <span class="n">remove</span><span class="p">(</span><span class="n">layer</span><span class="p">,</span> <span class="n">signed_index</span><span class="p">(</span><span class="n">layer</span><span class="p">,</span> <span class="n">n</span><span class="p">))</span> </span><span id="L-308"><a href="#L-308"><span class="linenos" data-line="308"></span></a> <span class="kr">end</span> </span><span id="L-309"><a href="#L-309"><span class="linenos" data-line="309"></span></a> <span class="kd">local</span> <span class="n">len</span> <span class="o">=</span> <span class="o">#</span><span class="n">layer</span> </span><span id="L-310"><a href="#L-310"><span class="linenos" data-line="310"></span></a> <span class="kd">local</span> <span class="n">token</span> <span class="o">=</span> <span class="n">layer</span><span class="p">[</span><span class="n">len</span><span class="p">]</span> </span><span id="L-311"><a href="#L-311"><span class="linenos" data-line="311"></span></a> <span class="n">layer</span><span class="p">[</span><span class="n">len</span><span class="p">]</span> <span class="o">=</span> <span class="kc">nil</span> </span><span id="L-312"><a href="#L-312"><span class="linenos" data-line="312"></span></a> <span class="kr">return</span> <span class="n">token</span> </span><span id="L-313"><a href="#L-313"><span class="linenos" data-line="313"></span></a><span class="kr">end</span> </span><span id="L-314"><a href="#L-314"><span class="linenos" data-line="314"></span></a> </span><span id="L-315"><a href="#L-315"><span class="linenos" data-line="315"></span></a><span class="kr">function</span> <span class="nc">Parser</span><span class="p">:</span><span class="nf">replace</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span> </span><span id="L-316"><a href="#L-316"><span class="linenos" data-line="316"></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-317"><a href="#L-317"><span class="linenos" data-line="317"></span></a> <span class="n">layer</span><span class="p">[</span><span class="n">signed_index</span><span class="p">(</span><span class="n">layer</span><span class="p">,</span> <span class="n">a</span><span class="p">)]</span> <span class="o">=</span> <span class="n">b</span> </span><span id="L-318"><a href="#L-318"><span class="linenos" data-line="318"></span></a><span class="kr">end</span> </span><span id="L-319"><a href="#L-319"><span class="linenos" data-line="319"></span></a> </span><span id="L-320"><a href="#L-320"><span class="linenos" data-line="320"></span></a><span class="c1">-- Unlike default table.concat, this respects __tostring metamethods.</span> </span><span id="L-321"><a href="#L-321"><span class="linenos" data-line="321"></span></a><span class="kr">function</span> <span class="nc">Parser</span><span class="p">:</span><span class="nf">concat</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">)</span> </span><span id="L-322"><a href="#L-322"><span class="linenos" data-line="322"></span></a> <span class="kr">if</span> <span class="n">a</span> <span class="o">==</span> <span class="kc">nil</span> <span class="ow">or</span> <span class="n">a</span> <span class="o">></span> <span class="mi">0</span> <span class="kr">then</span> </span><span id="L-323"><a href="#L-323"><span class="linenos" data-line="323"></span></a> <span class="kr">return</span> <span class="n">self</span><span class="p">:</span><span class="n">concat</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span> </span><span id="L-324"><a href="#L-324"><span class="linenos" data-line="324"></span></a> <span class="kr">end</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">layer</span><span class="p">,</span> <span class="n">ret</span><span class="p">,</span> <span class="n">n</span> <span class="o">=</span> <span class="n">self</span><span class="p">:</span><span class="n">layer</span><span class="p">(</span><span class="n">a</span><span class="p">),</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">for</span> <span class="n">i</span> <span class="o">=</span> <span class="n">b</span> <span class="ow">and</span> <span class="n">signed_index</span><span class="p">(</span><span class="n">layer</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span> <span class="ow">or</span> <span class="mi">1</span><span class="p">,</span> <span class="n">c</span> <span class="ow">and</span> <span class="n">signed_index</span><span class="p">(</span><span class="n">layer</span><span class="p">,</span> <span class="n">c</span><span class="p">)</span> <span class="ow">or</span> <span class="o">#</span><span class="n">layer</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="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-328"><a href="#L-328"><span class="linenos" data-line="328"></span></a> <span class="n">ret</span><span class="p">[</span><span class="n">n</span><span class="p">]</span> <span class="o">=</span> <span class="nb">tostring</span><span class="p">(</span><span class="n">layer</span><span class="p">[</span><span class="n">i</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">end</span> </span><span id="L-330"><a href="#L-330"><span class="linenos" data-line="330"></span></a> <span class="kr">return</span> <span class="n">concat</span><span class="p">(</span><span class="n">ret</span><span class="p">)</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><span id="L-333"><a href="#L-333"><span class="linenos" data-line="333"></span></a><span class="kr">function</span> <span class="nc">Parser</span><span class="p">:</span><span class="nf">emitted</span><span class="p">(</span><span class="n">delta</span><span class="p">)</span> </span><span id="L-334"><a href="#L-334"><span class="linenos" data-line="334"></span></a> <span class="kr">if</span> <span class="n">delta</span> <span class="o">==</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-335"><a href="#L-335"><span class="linenos" data-line="335"></span></a> <span class="n">delta</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span> </span><span id="L-336"><a href="#L-336"><span class="linenos" data-line="336"></span></a> <span class="kr">end</span> </span><span id="L-337"><a href="#L-337"><span class="linenos" data-line="337"></span></a> <span class="kd">local</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span> </span><span id="L-338"><a href="#L-338"><span class="linenos" data-line="338"></span></a> <span class="kr">while</span> <span class="kc">true</span> <span class="kr">do</span> </span><span id="L-339"><a href="#L-339"><span class="linenos" data-line="339"></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="n">layer</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> </span><span id="L-340"><a href="#L-340"><span class="linenos" data-line="340"></span></a> <span class="kr">if</span> <span class="n">layer</span> <span class="o">==</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-341"><a href="#L-341"><span class="linenos" data-line="341"></span></a> <span class="kr">return</span> <span class="kc">nil</span> </span><span id="L-342"><a href="#L-342"><span class="linenos" data-line="342"></span></a> <span class="kr">end</span> </span><span id="L-343"><a href="#L-343"><span class="linenos" data-line="343"></span></a> <span class="kd">local</span> <span class="n">layer_len</span> <span class="o">=</span> <span class="o">#</span><span class="n">layer</span> </span><span id="L-344"><a href="#L-344"><span class="linenos" data-line="344"></span></a> <span class="kr">if</span> <span class="o">-</span><span class="n">delta</span> <span class="o"><=</span> <span class="n">layer_len</span> <span class="kr">then</span> </span><span id="L-345"><a href="#L-345"><span class="linenos" data-line="345"></span></a> <span class="kr">return</span> <span class="nb">rawget</span><span class="p">(</span><span class="n">layer</span><span class="p">,</span> <span class="n">layer_len</span> <span class="o">+</span> <span class="n">delta</span> <span class="o">+</span> <span class="mi">1</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="n">delta</span> <span class="o">=</span> <span class="n">delta</span> <span class="o">+</span> <span class="n">layer_len</span> </span><span id="L-348"><a href="#L-348"><span class="linenos" data-line="348"></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-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="kr">end</span> </span><span id="L-351"><a href="#L-351"><span class="linenos" data-line="351"></span></a> </span><span id="L-352"><a href="#L-352"><span class="linenos" data-line="352"></span></a><span class="kr">function</span> <span class="nc">Parser</span><span class="p">:</span><span class="nf">push</span><span class="p">(</span><span class="n">route</span><span class="p">)</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">layer</span> <span class="o">=</span> <span class="p">{</span> </span><span id="L-354"><a href="#L-354"><span class="linenos" data-line="354"></span></a> <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="p">,</span> </span><span id="L-355"><a href="#L-355"><span class="linenos" data-line="355"></span></a> <span class="n">route</span> <span class="o">=</span> <span class="n">route</span> </span><span id="L-356"><a href="#L-356"><span class="linenos" data-line="356"></span></a> <span class="p">}</span> </span><span id="L-357"><a href="#L-357"><span class="linenos" data-line="357"></span></a> <span class="n">self</span><span class="p">[</span><span class="o">#</span><span class="n">self</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">layer</span> </span><span id="L-358"><a href="#L-358"><span class="linenos" data-line="358"></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="o">=</span> <span class="n">layer</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><span id="L-361"><a href="#L-361"><span class="linenos" data-line="361"></span></a><span class="kr">function</span> <span class="nc">Parser</span><span class="p">:</span><span class="nf">push_sublayer</span><span class="p">(</span><span class="n">handler</span><span class="p">,</span> <span class="n">inherit</span><span class="p">)</span> </span><span id="L-362"><a href="#L-362"><span class="linenos" data-line="362"></span></a> <span class="kd">local</span> <span class="n">sublayer</span> <span class="o">=</span> <span class="p">{</span> </span><span id="L-363"><a href="#L-363"><span class="linenos" data-line="363"></span></a> <span class="n">handler</span> <span class="o">=</span> <span class="n">handler</span><span class="p">,</span> </span><span id="L-364"><a href="#L-364"><span class="linenos" data-line="364"></span></a> <span class="n">sublayer</span> <span class="o">=</span> <span class="kc">true</span> </span><span id="L-365"><a href="#L-365"><span class="linenos" data-line="365"></span></a> <span class="p">}</span> </span><span id="L-366"><a href="#L-366"><span class="linenos" data-line="366"></span></a> <span class="kr">if</span> <span class="n">inherit</span> <span class="kr">then</span> </span><span id="L-367"><a href="#L-367"><span class="linenos" data-line="367"></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-368"><a href="#L-368"><span class="linenos" data-line="368"></span></a> <span class="nb">setmetatable</span><span class="p">(</span><span class="n">sublayer</span><span class="p">,</span> <span class="n">inherit_metamethods</span><span class="p">({</span> </span><span id="L-369"><a href="#L-369"><span class="linenos" data-line="369"></span></a> <span class="n">__index</span> <span class="o">=</span> <span class="n">layer</span><span class="p">,</span> </span><span id="L-370"><a href="#L-370"><span class="linenos" data-line="370"></span></a> <span class="n">__newindex</span> <span class="o">=</span> <span class="n">layer</span> </span><span id="L-371"><a href="#L-371"><span class="linenos" data-line="371"></span></a> <span class="p">},</span> <span class="nb">getmetatable</span><span class="p">(</span><span class="n">layer</span><span class="p">)))</span> </span><span id="L-372"><a href="#L-372"><span class="linenos" data-line="372"></span></a> <span class="kr">end</span> </span><span id="L-373"><a href="#L-373"><span class="linenos" data-line="373"></span></a> <span class="n">self</span><span class="p">[</span><span class="o">#</span><span class="n">self</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">sublayer</span> </span><span id="L-374"><a href="#L-374"><span class="linenos" data-line="374"></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="o">=</span> <span class="n">sublayer</span> </span><span id="L-375"><a href="#L-375"><span class="linenos" data-line="375"></span></a><span class="kr">end</span> </span><span id="L-376"><a href="#L-376"><span class="linenos" data-line="376"></span></a> </span><span id="L-377"><a href="#L-377"><span class="linenos" data-line="377"></span></a><span class="kr">function</span> <span class="nc">Parser</span><span class="p">:</span><span class="nf">pop</span><span class="p">()</span> </span><span id="L-378"><a href="#L-378"><span class="linenos" data-line="378"></span></a> <span class="kd">local</span> <span class="n">len</span><span class="p">,</span> <span class="n">layer</span> <span class="o">=</span> <span class="o">#</span><span class="n">self</span> </span><span id="L-379"><a href="#L-379"><span class="linenos" data-line="379"></span></a> <span class="kr">while</span> <span class="kc">true</span> <span class="kr">do</span> </span><span id="L-380"><a href="#L-380"><span class="linenos" data-line="380"></span></a> <span class="n">layer</span> <span class="o">=</span> <span class="n">self</span><span class="p">[</span><span class="n">len</span><span class="p">]</span> </span><span id="L-381"><a href="#L-381"><span class="linenos" data-line="381"></span></a> <span class="n">self</span><span class="p">[</span><span class="n">len</span><span class="p">]</span> <span class="o">=</span> <span class="kc">nil</span> </span><span id="L-382"><a href="#L-382"><span class="linenos" data-line="382"></span></a> <span class="n">len</span> <span class="o">=</span> <span class="n">len</span> <span class="o">-</span> <span class="mi">1</span> </span><span id="L-383"><a href="#L-383"><span class="linenos" data-line="383"></span></a> <span class="kd">local</span> <span class="n">new</span> <span class="o">=</span> <span class="n">self</span><span class="p">[</span><span class="n">len</span><span class="p">]</span> </span><span id="L-384"><a href="#L-384"><span class="linenos" data-line="384"></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="o">=</span> <span class="n">new</span> <span class="o">==</span> <span class="kc">nil</span> <span class="ow">and</span> <span class="n">self</span> <span class="ow">or</span> <span class="n">new</span> </span><span id="L-385"><a href="#L-385"><span class="linenos" data-line="385"></span></a> <span class="kr">if</span> <span class="n">layer</span><span class="p">.</span><span class="n">sublayer</span> <span class="o">==</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-386"><a href="#L-386"><span class="linenos" data-line="386"></span></a> <span class="kr">break</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="n">self</span><span class="p">:</span><span class="n">emit_tokens</span><span class="p">(</span><span class="n">layer</span><span class="p">)</span> </span><span id="L-389"><a href="#L-389"><span class="linenos" data-line="389"></span></a> <span class="kr">end</span> </span><span id="L-390"><a href="#L-390"><span class="linenos" data-line="390"></span></a> <span class="kr">return</span> <span class="n">layer</span> </span><span id="L-391"><a href="#L-391"><span class="linenos" data-line="391"></span></a><span class="kr">end</span> </span><span id="L-392"><a href="#L-392"><span class="linenos" data-line="392"></span></a> </span><span id="L-393"><a href="#L-393"><span class="linenos" data-line="393"></span></a><span class="kr">function</span> <span class="nc">Parser</span><span class="p">:</span><span class="nf">pop_sublayer</span><span class="p">()</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">len</span><span class="p">,</span> <span class="n">layer</span> <span class="o">=</span> <span class="o">#</span><span class="n">self</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-395"><a href="#L-395"><span class="linenos" data-line="395"></span></a> <span class="n">self</span><span class="p">[</span><span class="n">len</span><span class="p">]</span> <span class="o">=</span> <span class="kc">nil</span> </span><span id="L-396"><a href="#L-396"><span class="linenos" data-line="396"></span></a> <span class="kd">local</span> <span class="n">new</span> <span class="o">=</span> <span class="n">self</span><span class="p">[</span><span class="n">len</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span> </span><span id="L-397"><a href="#L-397"><span class="linenos" data-line="397"></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="o">=</span> <span class="n">new</span> <span class="o">==</span> <span class="kc">nil</span> <span class="ow">and</span> <span class="n">self</span> <span class="ow">or</span> <span class="n">new</span> </span><span id="L-398"><a href="#L-398"><span class="linenos" data-line="398"></span></a> <span class="nb">setmetatable</span><span class="p">(</span><span class="n">layer</span><span class="p">,</span> <span class="kc">nil</span><span class="p">)</span> </span><span id="L-399"><a href="#L-399"><span class="linenos" data-line="399"></span></a> <span class="n">layer</span><span class="p">.</span><span class="n">sublayer</span> <span class="o">=</span> <span class="kc">nil</span> </span><span id="L-400"><a href="#L-400"><span class="linenos" data-line="400"></span></a> <span class="kr">return</span> <span class="n">layer</span> </span><span id="L-401"><a href="#L-401"><span class="linenos" data-line="401"></span></a><span class="kr">end</span> </span><span id="L-402"><a href="#L-402"><span class="linenos" data-line="402"></span></a> </span><span id="L-403"><a href="#L-403"><span class="linenos" data-line="403"></span></a><span class="kr">function</span> <span class="nc">Parser</span><span class="p">:</span><span class="nf">get</span><span class="p">(</span><span class="n">route</span><span class="p">,</span> <span class="p">...)</span> </span><span id="L-404"><a href="#L-404"><span class="linenos" data-line="404"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">push</span><span class="p">(</span><span class="n">route</span><span class="p">)</span> </span><span id="L-405"><a href="#L-405"><span class="linenos" data-line="405"></span></a> <span class="kd">local</span> <span class="n">layer</span> <span class="o">=</span> <span class="n">route</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="p">...)</span> </span><span id="L-406"><a href="#L-406"><span class="linenos" data-line="406"></span></a> <span class="kr">if</span> <span class="n">layer</span> <span class="o">==</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-407"><a href="#L-407"><span class="linenos" data-line="407"></span></a> <span class="n">layer</span> <span class="o">=</span> <span class="n">self</span><span class="p">:</span><span class="n">traverse</span><span class="p">()</span> </span><span id="L-408"><a href="#L-408"><span class="linenos" data-line="408"></span></a> <span class="kr">end</span> </span><span id="L-409"><a href="#L-409"><span class="linenos" data-line="409"></span></a> <span class="kr">return</span> <span class="n">layer</span> </span><span id="L-410"><a href="#L-410"><span class="linenos" data-line="410"></span></a><span class="kr">end</span> </span><span id="L-411"><a href="#L-411"><span class="linenos" data-line="411"></span></a> </span><span id="L-412"><a href="#L-412"><span class="linenos" data-line="412"></span></a><span class="kr">function</span> <span class="nc">Parser</span><span class="p">:</span><span class="nf">try</span><span class="p">(</span><span class="n">route</span><span class="p">,</span> <span class="p">...)</span> </span><span id="L-413"><a href="#L-413"><span class="linenos" data-line="413"></span></a> <span class="kd">local</span> <span class="n">failed_layer</span> <span class="o">=</span> <span class="n">get_nested</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">failed_routes</span><span class="p">,</span> <span class="n">route</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-414"><a href="#L-414"><span class="linenos" data-line="414"></span></a> <span class="kr">if</span> <span class="n">failed_layer</span> <span class="o">~=</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-415"><a href="#L-415"><span class="linenos" data-line="415"></span></a> <span class="kr">return</span> <span class="kc">false</span><span class="p">,</span> <span class="n">failed_layer</span> </span><span id="L-416"><a href="#L-416"><span class="linenos" data-line="416"></span></a> <span class="kr">end</span> </span><span id="L-417"><a href="#L-417"><span class="linenos" data-line="417"></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="n">get</span><span class="p">(</span><span class="n">route</span><span class="p">,</span> <span class="p">...)</span> </span><span id="L-418"><a href="#L-418"><span class="linenos" data-line="418"></span></a> <span class="kr">return</span> <span class="ow">not</span> <span class="n">layer</span><span class="p">.</span><span class="n">fail</span><span class="p">,</span> <span class="n">layer</span> </span><span id="L-419"><a href="#L-419"><span class="linenos" data-line="419"></span></a><span class="kr">end</span> </span><span id="L-420"><a href="#L-420"><span class="linenos" data-line="420"></span></a> </span><span id="L-421"><a href="#L-421"><span class="linenos" data-line="421"></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 class="n">this</span><span class="p">,</span> <span class="p">...)</span> </span><span id="L-422"><a href="#L-422"><span class="linenos" data-line="422"></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-423"><a href="#L-423"><span class="linenos" data-line="423"></span></a> <span class="kr">if</span> <span class="n">this</span> <span class="o">==</span> <span class="kc">nil</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">this</span> <span class="o">=</span> <span class="n">self</span><span class="p">:</span><span class="n">read</span><span class="p">()</span> </span><span id="L-425"><a href="#L-425"><span class="linenos" data-line="425"></span></a> <span class="kr">end</span> </span><span id="L-426"><a href="#L-426"><span class="linenos" data-line="426"></span></a> <span class="kr">return</span> <span class="p">(</span><span class="n">layer</span><span class="p">.</span><span class="n">override</span> <span class="ow">or</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 class="p">...)</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><span id="L-429"><a href="#L-429"><span class="linenos" data-line="429"></span></a><span class="kr">function</span> <span class="nc">Parser</span><span class="p">:</span><span class="nf">fail_route</span><span class="p">()</span> </span><span id="L-430"><a href="#L-430"><span class="linenos" data-line="430"></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="n">pop</span><span class="p">()</span> </span><span id="L-431"><a href="#L-431"><span class="linenos" data-line="431"></span></a> <span class="n">layer</span><span class="p">.</span><span class="n">fail</span> <span class="o">=</span> <span class="kc">true</span> </span><span id="L-432"><a href="#L-432"><span class="linenos" data-line="432"></span></a> <span class="n">set_nested</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="s2">"failed_routes"</span><span class="p">,</span> <span class="n">layer</span><span class="p">.</span><span class="n">route</span><span class="p">,</span> <span class="n">layer</span><span class="p">.</span><span class="n">head</span><span class="p">,</span> <span class="n">layer</span><span class="p">)</span> </span><span id="L-433"><a href="#L-433"><span class="linenos" data-line="433"></span></a> <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">head</span> </span><span id="L-434"><a href="#L-434"><span class="linenos" data-line="434"></span></a> <span class="kr">return</span> <span class="n">layer</span> </span><span id="L-435"><a href="#L-435"><span class="linenos" data-line="435"></span></a><span class="kr">end</span> </span><span id="L-436"><a href="#L-436"><span class="linenos" data-line="436"></span></a> </span><span id="L-437"><a href="#L-437"><span class="linenos" data-line="437"></span></a><span class="kr">function</span> <span class="nc">Parser</span><span class="p">:</span><span class="nf">traverse</span><span class="p">()</span> </span><span id="L-438"><a href="#L-438"><span class="linenos" data-line="438"></span></a> <span class="kr">while</span> <span class="kc">true</span> <span class="kr">do</span> </span><span id="L-439"><a href="#L-439"><span class="linenos" data-line="439"></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="n">consume</span><span class="p">()</span> </span><span id="L-440"><a href="#L-440"><span class="linenos" data-line="440"></span></a> <span class="kr">if</span> <span class="n">layer</span> <span class="o">~=</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-441"><a href="#L-441"><span class="linenos" data-line="441"></span></a> <span class="kr">return</span> <span class="n">layer</span> </span><span id="L-442"><a href="#L-442"><span class="linenos" data-line="442"></span></a> <span class="kr">end</span> </span><span id="L-443"><a href="#L-443"><span class="linenos" data-line="443"></span></a> <span class="n">self</span><span class="p">:</span><span class="n">advance</span><span class="p">()</span> </span><span id="L-444"><a href="#L-444"><span class="linenos" data-line="444"></span></a> <span class="kr">end</span> </span><span id="L-445"><a href="#L-445"><span class="linenos" data-line="445"></span></a><span class="kr">end</span> </span><span id="L-446"><a href="#L-446"><span class="linenos" data-line="446"></span></a> </span><span id="L-447"><a href="#L-447"><span class="linenos" data-line="447"></span></a><span class="c1">-- Converts a handler into a switch table the first time it's called, which avoids creating unnecessary objects, and prevents any scoping issues caused by parser methods being assigned to table keys before they've been declared.</span> </span><span id="L-448"><a href="#L-448"><span class="linenos" data-line="448"></span></a><span class="c1">-- false is used as the default key.</span> </span><span id="L-449"><a href="#L-449"><span class="linenos" data-line="449"></span></a><span class="kr">do</span> </span><span id="L-450"><a href="#L-450"><span class="linenos" data-line="450"></span></a> <span class="kd">local</span> <span class="n">Switch</span> <span class="o">=</span> <span class="p">{}</span> </span><span id="L-451"><a href="#L-451"><span class="linenos" data-line="451"></span></a> </span><span id="L-452"><a href="#L-452"><span class="linenos" data-line="452"></span></a> <span class="kr">function</span> <span class="nc">Switch</span><span class="p">:</span><span class="nf">__call</span><span class="p">(</span><span class="n">parser</span><span class="p">,</span> <span class="n">this</span><span class="p">)</span> </span><span id="L-453"><a href="#L-453"><span class="linenos" data-line="453"></span></a> <span class="kr">return</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">self</span><span class="p">[</span><span class="kc">false</span><span class="p">])(</span><span class="n">parser</span><span class="p">,</span> <span class="n">this</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">end</span> </span><span id="L-455"><a href="#L-455"><span class="linenos" data-line="455"></span></a> </span><span id="L-456"><a href="#L-456"><span class="linenos" data-line="456"></span></a> <span class="kr">function</span> <span class="nc">Parser</span><span class="p">:</span><span class="nf">switch</span><span class="p">(</span><span class="n">func</span><span class="p">,</span> <span class="n">t</span><span class="p">)</span> </span><span id="L-457"><a href="#L-457"><span class="linenos" data-line="457"></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-458"><a href="#L-458"><span class="linenos" data-line="458"></span></a> <span class="c1">-- Point handler to the new switch table if the calling function is the current handler.</span> </span><span id="L-459"><a href="#L-459"><span class="linenos" data-line="459"></span></a> <span class="kr">if</span> <span class="n">layer</span><span class="p">.</span><span class="n">handler</span> <span class="o">==</span> <span class="n">func</span> <span class="kr">then</span> </span><span id="L-460"><a href="#L-460"><span class="linenos" data-line="460"></span></a> <span class="n">layer</span><span class="p">.</span><span class="n">handler</span> <span class="o">=</span> <span class="n">t</span> </span><span id="L-461"><a href="#L-461"><span class="linenos" data-line="461"></span></a> <span class="kr">end</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="nb">setmetatable</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="n">Switch</span><span class="p">)</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="kr">end</span> </span><span id="L-465"><a href="#L-465"><span class="linenos" data-line="465"></span></a> </span><span id="L-466"><a href="#L-466"><span class="linenos" data-line="466"></span></a><span class="c1">-- Generate a new parser class object, which is used as the template for any parser objects. These should be customized with additional/modified methods as needed.</span> </span><span id="L-467"><a href="#L-467"><span class="linenos" data-line="467"></span></a><span class="kr">function</span> <span class="nc">Parser</span><span class="p">:</span><span class="nf">new_class</span><span class="p">()</span> </span><span id="L-468"><a href="#L-468"><span class="linenos" data-line="468"></span></a> <span class="kd">local</span> <span class="n">t</span> <span class="o">=</span> <span class="p">{}</span> </span><span id="L-469"><a href="#L-469"><span class="linenos" data-line="469"></span></a> <span class="n">t</span><span class="p">.</span><span class="n">__index</span> <span class="o">=</span> <span class="n">t</span> </span><span id="L-470"><a href="#L-470"><span class="linenos" data-line="470"></span></a> <span class="kr">return</span> <span class="nb">setmetatable</span><span class="p">(</span><span class="n">inherit_metamethods</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="n">self</span><span class="p">),</span> <span class="n">self</span><span class="p">)</span> </span><span id="L-471"><a href="#L-471"><span class="linenos" data-line="471"></span></a><span class="kr">end</span> </span><span id="L-472"><a href="#L-472"><span class="linenos" data-line="472"></span></a> </span><span id="L-473"><a href="#L-473"><span class="linenos" data-line="473"></span></a><span class="c1">-- Generate a new parser object, which is used for a specific parse.</span> </span><span id="L-474"><a href="#L-474"><span class="linenos" data-line="474"></span></a><span class="kr">function</span> <span class="nc">Parser</span><span class="p">:</span><span class="nf">new</span><span class="p">(</span><span class="n">text</span><span class="p">)</span> </span><span id="L-475"><a href="#L-475"><span class="linenos" data-line="475"></span></a> <span class="kr">return</span> <span class="nb">setmetatable</span><span class="p">({</span> </span><span id="L-476"><a href="#L-476"><span class="linenos" data-line="476"></span></a> <span class="n">text</span> <span class="o">=</span> <span class="n">text</span><span class="p">,</span> </span><span id="L-477"><a href="#L-477"><span class="linenos" data-line="477"></span></a> <span class="n">head</span> <span class="o">=</span> <span class="mi">1</span> </span><span id="L-478"><a href="#L-478"><span class="linenos" data-line="478"></span></a> <span class="p">},</span> <span class="n">self</span><span class="p">)</span> </span><span id="L-479"><a href="#L-479"><span class="linenos" data-line="479"></span></a><span class="kr">end</span> </span><span id="L-480"><a href="#L-480"><span class="linenos" data-line="480"></span></a> </span><span id="L-481"><a href="#L-481"><span class="linenos" data-line="481"></span></a><span class="kr">function</span> <span class="nc">Parser</span><span class="p">:</span><span class="nf">parse</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> </span><span id="L-482"><a href="#L-482"><span class="linenos" data-line="482"></span></a> <span class="kd">local</span> <span class="n">parser</span> <span class="o">=</span> <span class="n">self</span><span class="p">:</span><span class="n">new</span><span class="p">(</span><span class="n">data</span><span class="p">.</span><span class="n">text</span><span class="p">)</span> </span><span id="L-483"><a href="#L-483"><span class="linenos" data-line="483"></span></a> <span class="kd">local</span> <span class="n">success</span><span class="p">,</span> <span class="n">tokens</span> <span class="o">=</span> <span class="n">parser</span><span class="p">:</span><span class="n">try</span><span class="p">(</span><span class="n">unpack</span><span class="p">(</span><span class="n">data</span><span class="p">.</span><span class="n">route</span><span class="p">))</span> </span><span id="L-484"><a href="#L-484"><span class="linenos" data-line="484"></span></a> <span class="kr">if</span> <span class="o">#</span><span class="n">parser</span> <span class="o">></span> <span class="mi">0</span> <span class="kr">then</span> </span><span id="L-485"><a href="#L-485"><span class="linenos" data-line="485"></span></a> <span class="c1">-- This shouldn't happen.</span> </span><span id="L-486"><a href="#L-486"><span class="linenos" data-line="486"></span></a> <span class="nb">error</span><span class="p">(</span><span class="s2">"Parser exited with non-empty stack."</span><span class="p">)</span> </span><span id="L-487"><a href="#L-487"><span class="linenos" data-line="487"></span></a> <span class="kr">elseif</span> <span class="n">success</span> <span class="kr">then</span> </span><span id="L-488"><a href="#L-488"><span class="linenos" data-line="488"></span></a> <span class="kd">local</span> <span class="n">node</span> <span class="o">=</span> <span class="n">data</span><span class="p">.</span><span class="n">node</span> </span><span id="L-489"><a href="#L-489"><span class="linenos" data-line="489"></span></a> <span class="kr">return</span> <span class="kc">true</span><span class="p">,</span> <span class="n">node</span><span class="p">[</span><span class="mi">1</span><span class="p">]:</span><span class="n">new</span><span class="p">(</span><span class="n">tokens</span><span class="p">,</span> <span class="n">unpack</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="mi">2</span><span class="p">)),</span> <span class="n">parser</span> </span><span id="L-490"><a href="#L-490"><span class="linenos" data-line="490"></span></a> <span class="kr">elseif</span> <span class="n">data</span><span class="p">.</span><span class="n">allow_fail</span> <span class="kr">then</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="kc">false</span><span class="p">,</span> <span class="kc">nil</span><span class="p">,</span> <span class="n">parser</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 class="nb">error</span><span class="p">(</span><span class="s2">"Parser exited with failed route."</span><span class="p">)</span> </span><span id="L-494"><a href="#L-494"><span class="linenos" data-line="494"></span></a><span class="kr">end</span> </span><span id="L-495"><a href="#L-495"><span class="linenos" data-line="495"></span></a> </span><span id="L-496"><a href="#L-496"><span class="linenos" data-line="496"></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-497"><a href="#L-497"><span class="linenos" data-line="497"></span></a><span class="n">export</span><span class="p">.</span><span class="n">is_node</span> <span class="o">=</span> <span class="n">is_node</span> </span><span id="L-498"><a href="#L-498"><span class="linenos" data-line="498"></span></a><span class="n">export</span><span class="p">.</span><span class="n">tostring</span> <span class="o">=</span> <span class="nb">tostring</span> </span><span id="L-499"><a href="#L-499"><span class="linenos" data-line="499"></span></a> </span><span id="L-500"><a href="#L-500"><span class="linenos" data-line="500"></span></a><span class="kr">function</span> <span class="nc">export</span><span class="p">.</span><span class="nf">new</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">return</span> <span class="n">Parser</span><span class="p">:</span><span class="n">new_class</span><span class="p">(),</span> <span class="n">Node</span><span class="p">:</span><span class="n">new_class</span><span class="p">(</span><span class="s2">"node"</span><span class="p">)</span> </span><span id="L-502"><a href="#L-502"><span class="linenos" data-line="502"></span></a><span class="kr">end</span> </span><span id="L-503"><a href="#L-503"><span class="linenos" data-line="503"></span></a> </span><span id="L-504"><a href="#L-504"><span class="linenos" data-line="504"></span></a><span class="kr">return</span> <span class="n">export</span> </span></pre></div></div><!--esi <esi:include src="/esitest-fa8a495983347898/content" /> --><noscript><img src="https://login.wikimedia.org/wiki/Special:CentralAutoLogin/start?type=1x1&useformat=desktop" 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:parser&oldid=82789053">https://en.wiktionary.org/w/index.php?title=Module:parser&oldid=82789053</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_needing_documentation" title="Category:Templates and modules needing documentation">Templates and modules needing 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> </main> </div> <div class="mw-footer-container"> <footer id="footer" class="mw-footer" > <ul id="footer-info"> <li id="footer-info-lastmod"> This page was last edited on 28 November 2024, at 22:41.</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:parser&curid=9689400&diff=82789053&oldid=82788777&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> </div> </div> </div> <div class="vector-settings" id="p-dock-bottom"> <ul></ul> </div><script>(RLQ=window.RLQ||[]).push(function(){mw.config.set({"wgHostname":"mw-web.codfw.main-5c59558b9d-mz8kh","wgBackendResponseTime":250,"wgPageParseReport":{"limitreport":{"cputime":"0.054","walltime":"0.077","ppvisitednodes":{"value":52,"limit":1000000},"postexpandincludesize":{"value":3677,"limit":2097152},"templateargumentsize":{"value":245,"limit":2097152},"expansiondepth":{"value":8,"limit":100},"expensivefunctioncount":{"value":2,"limit":500},"unstrip-depth":{"value":0,"limit":20},"unstrip-size":{"value":2164,"limit":5000000},"entityaccesscount":{"value":0,"limit":400},"timingprofile":["100.00% 68.775 1 Template:documentation","100.00% 68.775 1 -total"," 33.33% 22.923 1 Template:documentation_needed"," 28.76% 19.777 1 Template:maintenance_box"]},"scribunto":{"limitreport-timeusage":{"value":"0.037","limit":"10.000"},"limitreport-memusage":{"value":949433,"limit":104857600}},"cachereport":{"origin":"mw-web.codfw.main-5c59558b9d-mz8kh","timestamp":"20241129104845","ttl":2592000,"transientcontent":false}}});});</script> </body> </html>