r64478 MediaWiki - Code Review archive

Repository:MediaWiki
Revision:r64477‎ | r64478 | r64479 >
Date:10:50, 1 April 2010
Author:happy-melon
Status:reverted (Comments)
Tags:
Comment:
Rewrite the parser in a more friendly and accessible implementation...
Modified paths:
  • /trunk/phase3/includes/AutoLoader.php (modified) (history)
  • /trunk/phase3/includes/parser/LOLParser.php (added) (history)
  • /trunk/phase3/includes/parser/Parser.lol (added) (history)

Diff [purge]

Index: trunk/phase3/includes/parser/Parser.lol
@@ -0,0 +1,5282 @@
 2+ DO NOT WANT
 3+ NOT WANT @defgroup Parser Parser
 4+ NOT WANT
 5+ NOT WANT @file
 6+ NOT WANT @ingroup Parser
 7+ NOT WANT File for Parser and related classes
 8+ WANT
 9+
 10+
 11+ DO NOT WANT
 12+ NOT WANT PHP Parser - Processes wiki markup (which uses a more user-friendly
 13+ NOT WANT syntax, such as "[[link]]" for making links), and provides a one-way
 14+ NOT WANT transformation of that wiki markup it into XHTML output / markup
 15+ NOT WANT (which in turn the browser understands, and can display).
 16+ NOT WANT
 17+ NOT WANT <pre>
 18+ NOT WANT There are five main entry points into the Parser class:
 19+ NOT WANT parse()
 20+ NOT WANT produces HTML output
 21+ NOT WANT preSaveTransform().
 22+ NOT WANT produces altered wiki markup.
 23+ NOT WANT preprocess()
 24+ NOT WANT removes HTML comments and expands templates
 25+ NOT WANT cleanSig()
 26+ NOT WANT Cleans a signature before saving it to preferences
 27+ NOT WANT extractSections()
 28+ NOT WANT Extracts sections from an article for section editing
 29+ NOT WANT getPreloadText()
 30+ NOT WANT Removes <noinclude> sections, and <includeonly> tags.
 31+ NOT WANT
 32+ NOT WANT Globals used:
 33+ NOT WANT objects: $wgLang, $wgContLang
 34+ NOT WANT
 35+ NOT WANT NOT $wgArticle, $wgUser or $wgTitle. Keep them away!
 36+ NOT WANT
 37+ NOT WANT settings:
 38+ NOT WANT $wgUseTex*, $wgUseDynamicDates*, $wgInterwikiMagic*,
 39+ NOT WANT $wgNamespacesWithSubpages, $wgAllowExternalImages*,
 40+ NOT WANT $wgLocaltimezone, $wgAllowSpecialInclusion*,
 41+ NOT WANT $wgMaxArticleSize*
 42+ NOT WANT
 43+ NOT WANT * only within ParserOptions
 44+ NOT WANT </pre>
 45+ NOT WANT
 46+ NOT WANT @ingroup Parser
 47+ WANT
 48+ IM IN UR SPECIAL Parser
 49+ DO NOT WANT
 50+ NOT WANT Update this version number when the ParserOutput format
 51+ NOT WANT changes in an incompatible way, so the parser cache
 52+ NOT WANT can automatically discard old data.
 53+ WANT
 54+ I ALWAYZ HAS VERSION IZ '1.6.4';
 55+
 56+ BTW Flags for Parser::setFunctionHook
 57+ BTW Also available as global constants from Defines.php
 58+ I ALWAYZ HAS SFH_NO_HASH IZ 1;
 59+ I ALWAYZ HAS SFH_OBJECT_ARGS IZ 2;
 60+
 61+ BTW Constants needed for external link processing
 62+ BTW Everything except bracket, space, or control characters
 63+ I ALWAYZ HAS EXT_LINK_URL_CLASS IZ '[^][<>"\\x00-\\x20\\x7F]';
 64+ I ALWAYZ HAS EXT_IMAGE_REGEX IZ '/^(http:\/\/|https:\/\/)([^][<>"\\x00-\\x20\\x7F]+)
 65+ \\/([A-Za-z0-9_.,~%\\-+&;#*?!=()@\\x80-\\xFF]+)\\.((?i)gif|png|jpg|jpeg)$/Sx';
 66+
 67+ BTW State constants for the definition list colon extraction
 68+ I ALWAYZ HAS COLON_STATE_TEXT IZ 0;
 69+ I ALWAYZ HAS COLON_STATE_TAG IZ 1;
 70+ I ALWAYZ HAS COLON_STATE_TAGSTART IZ 2;
 71+ I ALWAYZ HAS COLON_STATE_CLOSETAG IZ 3;
 72+ I ALWAYZ HAS COLON_STATE_TAGSLASH IZ 4;
 73+ I ALWAYZ HAS COLON_STATE_COMMENT IZ 5;
 74+ I ALWAYZ HAS COLON_STATE_COMMENTDASH IZ 6;
 75+ I ALWAYZ HAS COLON_STATE_COMMENTDASHDASH IZ 7;
 76+
 77+ BTW Flags for preprocessToDom
 78+ I ALWAYZ HAS PTD_FOR_INCLUSION IZ 1;
 79+
 80+ BTW Allowed values for $this->mOutputType
 81+ BTW Parameter to startExternalParse().
 82+ I ALWAYZ HAS OT_HTML IZ 1; # like parse()
 83+ I ALWAYZ HAS OT_WIKI IZ 2; # like preSaveTransform()
 84+ I ALWAYZ HAS OT_PREPROCESS IZ 3; # like preprocess()
 85+ I ALWAYZ HAS OT_MSG IZ 3;
 86+ I ALWAYZ HAS OT_PLAIN IZ 4; # like extractSections() - portions of the original are returned unchanged.
 87+
 88+ BTW Marker Suffix needs to be accessible staticly.
 89+ I ALWAYZ HAS MARKER_SUFFIX IZ "-QINU\x7f";
 90+
 91+ BTW Persistent:
 92+ I HAS UR $mTagHooks, $mTransparentTagHooks, $mFunctionHooks, $mFunctionSynonyms, $mVariables
 93+ I HAS UR $mSubstWords, $mImageParams, $mImageParamsMagicArray, $mStripList, $mMarkerIndex
 94+ I HAS UR $mPreprocessor, $mExtLinkBracketedRegex, $mUrlProtocols, $mDefaultStripList
 95+ I HAS UR $mVarCache, $mConf, $mFunctionTagHooks
 96+
 97+
 98+ BTW Cleared with clearState():
 99+ I HAS UR $mOutput, $mAutonumber, $mDTopen, $mStripState
 100+ I HAS UR $mIncludeCount, $mArgStack, $mLastSection, $mInPre
 101+ I HAS UR $mLinkHolders, $mLinkID
 102+ I HAS UR $mIncludeSizes, $mPPNodeCount, $mDefaultSort
 103+ I HAS UR $mTplExpandCache # empty-frame expansion cache
 104+ I HAS UR $mTplRedirCache, $mTplDomCache, $mHeadings, $mDoubleUnderscores
 105+ I HAS UR $mExpensiveFunctionCount # number of expensive parser function calls
 106+
 107+ BTW Temporary
 108+ BTW These are variables reset at least once per parse regardless of $clearState
 109+ I HAS UR $mOptions # ParserOptions object
 110+ I HAS UR $mTitle # Title context, used for self-link rendering and similar things
 111+ I HAS UR $mOutputType # Output type, one of the OT_xxx constants
 112+ I HAS UR $ot # Shortcut alias, see setOutputType()
 113+ I HAS UR $mRevisionId # ID to display in {{REVISIONID}} tags
 114+ I HAS UR $mRevisionTimestamp # The timestamp of the specified revision ID
 115+ I HAS UR $mRevIdForTs # The revision ID which was used to fetch the timestamp
 116+
 117+ DO NOT WANT
 118+ NOT WANT Constructor
 119+ NOT WANT
 120+ NOT WANT @public
 121+ WANT
 122+ SO IM LIKE __construct WITH UR $conf = array()
 123+ UR SPECIAL mConf IZ $conf;
 124+ UR SPECIAL mTagHooks IZ EMPTY;
 125+ UR SPECIAL mTransparentTagHooks IZ EMPTY;
 126+ UR SPECIAL mFunctionHooks IZ EMPTY;
 127+ UR SPECIAL mFunctionTagHooks IZ EMPTY;
 128+ UR SPECIAL mFunctionSynonyms IZ BUCKET 0 => array(), 1 => array() );
 129+ UR SPECIAL mDefaultStripList IZ $this->mStripList = array();
 130+ UR SPECIAL mUrlProtocols IZ wfUrlProtocols();
 131+ UR SPECIAL mExtLinkBracketedRegex IZ '/\[(\b(' . wfUrlProtocols() . ')'.
 132+ '[^][<>"\\x00-\\x20\\x7F]+) *([^\]\\x0a\\x0d]*?)\]/S';
 133+ UR SPECIAL mVarCache IZ EMPTY;
 134+ IZ isset( $conf['preprocessorClass'] )
 135+ UR SPECIAL mPreprocessorClass IZ $conf['preprocessorClass'];
 136+ ORLY extension_loaded( 'domxml' )
 137+ BTW PECL extension that conflicts with the core DOM extension (bug 13770)
 138+ IM ON UR wfDebug DOING "Warning: you have the obsolete domxml extension for PHP. Please remove it!\n"
 139+ UR SPECIAL mPreprocessorClass IZ 'Preprocessor_Hash';
 140+ ORLY extension_loaded( 'dom' )
 141+ UR SPECIAL mPreprocessorClass IZ 'Preprocessor_DOM';
 142+ NOWAI
 143+ UR SPECIAL mPreprocessorClass IZ 'Preprocessor_Hash';
 144+ KTHX
 145+ UR SPECIAL mMarkerIndex IZ 0;
 146+ UR SPECIAL mFirstCall IZ true;
 147+ KTHX
 148+
 149+ DO NOT WANT
 150+ NOT WANT Reduce memory usage to reduce the impact of circular references
 151+ WANT
 152+ SO IM LIKE __destruct
 153+ IZ isset( $this->mLinkHolders )
 154+ IM ON UR SPECIAL mLinkHolders->__destruct
 155+ KTHX
 156+ IM IN UR this ITZA name => $value
 157+ IM ON UR unset DOING $this->$name
 158+ KTHX
 159+ KTHX
 160+
 161+ DO NOT WANT
 162+ NOT WANT Do various kinds of initialisation on the first call of the parser
 163+ WANT
 164+ SO IM LIKE firstCallInit
 165+ IZ !$this->mFirstCall
 166+ return;
 167+ KTHX
 168+ UR SPECIAL mFirstCall IZ false;
 169+
 170+ IM ON UR wfProfileIn DOING __METHOD__
 171+
 172+ CoreParserFunctions::register( $this );
 173+ CoreTagHooks::register( $this );
 174+ IM ON UR SPECIAL initialiseVariables
 175+
 176+ IM ON UR wfRunHooks DOING 'ParserFirstCallInit', array( &$this )
 177+ IM ON UR wfProfileOut DOING __METHOD__
 178+ KTHX
 179+
 180+ DO NOT WANT
 181+ NOT WANT Clear Parser state
 182+ NOT WANT
 183+ NOT WANT @private
 184+ WANT
 185+ SO IM LIKE clearState
 186+ IM ON UR wfProfileIn DOING __METHOD__
 187+ IZ $this->mFirstCall
 188+ IM ON UR SPECIAL firstCallInit
 189+ KTHX
 190+ UR SPECIAL mOutput IZ new ParserOutput;
 191+ UR SPECIAL mAutonumber IZ 0;
 192+ UR SPECIAL mLastSection IZ '';
 193+ UR SPECIAL mDTopen IZ false;
 194+ UR SPECIAL mIncludeCount IZ EMPTY;
 195+ UR SPECIAL mStripState IZ new StripState;
 196+ UR SPECIAL mArgStack IZ false;
 197+ UR SPECIAL mInPre IZ false;
 198+ UR SPECIAL mLinkHolders IZ new LinkHolderArray( $this );
 199+ UR SPECIAL mLinkID IZ 0;
 200+ UR SPECIAL mRevisionTimestamp IZ $this->mRevisionId = null;
 201+ UR SPECIAL mVarCache IZ EMPTY;
 202+
 203+ DO NOT WANT
 204+ NOT WANT Prefix for temporary replacement strings for the multipass parser.
 205+ NOT WANT \x07 should never appear in input as it's disallowed in XML.
 206+ NOT WANT Using it at the front also gives us a little extra robustness
 207+ NOT WANT since it shouldn't match when butted up against identifier-like
 208+ NOT WANT string constructs.
 209+ NOT WANT
 210+ NOT WANT Must not consist of all title characters, or else it will change
 211+ NOT WANT the behaviour of <nowiki> in a link.
 212+ WANT
 213+ BTW $this->mUniqPrefix = "\x07UNIQ" . Parser::getRandomString();
 214+ BTW Changed to \x7f to allow XML double-parsing -- TS
 215+ UR SPECIAL mUniqPrefix IZ "\x7fUNIQ" . self::getRandomString();
 216+
 217+
 218+ BTW Clear these on every parse, bug 4549
 219+ UR SPECIAL mTplExpandCache IZ $this->mTplRedirCache = $this->mTplDomCache = array();
 220+
 221+ UR SPECIAL mShowToc IZ true;
 222+ UR SPECIAL mForceTocPosition IZ false;
 223+ UR SPECIAL mIncludeSizes IZ BUCKET
 224+ 'post-expand' => 0,
 225+ 'arg' => 0,
 226+ BUCKET
 227+ UR SPECIAL mPPNodeCount IZ 0;
 228+ UR SPECIAL mDefaultSort IZ false;
 229+ UR SPECIAL mHeadings IZ EMPTY;
 230+ UR SPECIAL mDoubleUnderscores IZ EMPTY;
 231+ UR SPECIAL mExpensiveFunctionCount IZ 0;
 232+
 233+ BTW Fix cloning
 234+ IZ isset( $this->mPreprocessor ) && $this->mPreprocessor->parser !== $this
 235+ UR SPECIAL mPreprocessor IZ null;
 236+ KTHX
 237+
 238+ IM ON UR wfRunHooks DOING 'ParserClearState', array( &$this )
 239+ IM ON UR wfProfileOut DOING __METHOD__
 240+ KTHX
 241+
 242+ SO IM LIKE setOutputType WITH UR $ot
 243+ UR SPECIAL mOutputType IZ $ot;
 244+ BTW Shortcut alias
 245+ UR SPECIAL ot IZ BUCKET
 246+ 'html' => $ot == self::OT_HTML,
 247+ 'wiki' => $ot == self::OT_WIKI,
 248+ 'pre' => $ot == self::OT_PREPROCESS,
 249+ 'plain' => $ot == self::OT_PLAIN,
 250+ BUCKET
 251+ KTHX
 252+
 253+ DO NOT WANT
 254+ NOT WANT Set the context title
 255+ WANT
 256+ SO IM LIKE setTitle WITH UR $t
 257+ IZ !$t || $t instanceof FakeTitle
 258+ I HAS t IZ Title::newFromText( 'NO TITLE' )
 259+ KTHX
 260+
 261+ IZ strval( $t->getFragment() ) !== ''
 262+ BTW Strip the fragment to avoid various odd effects
 263+ UR SPECIAL mTitle IZ clone $t;
 264+ IM ON UR SPECIAL mTitle->setFragment DOING ''
 265+ NOWAI
 266+ UR SPECIAL mTitle IZ $t;
 267+ KTHX
 268+ KTHX
 269+
 270+ DO NOT WANT
 271+ NOT WANT Accessor for mUniqPrefix.
 272+ NOT WANT
 273+ NOT WANT @public
 274+ WANT
 275+ SO IM LIKE uniqPrefix
 276+ IZ !isset( $this->mUniqPrefix )
 277+ BTW @todo Fixme: this is probably *horribly wrong*
 278+ BTW LanguageConverter seems to want $wgParser's uniqPrefix, however
 279+ BTW if this is called for a parser cache hit, the parser may not
 280+ BTW have ever been initialized in the first place.
 281+ BTW Not really sure what the heck is supposed to be going on here.
 282+ I FOUND MAH ''
 283+ BTW throw new MWException( "Accessing uninitialized mUniqPrefix" );
 284+ KTHX
 285+ I FOUND MAH $this->mUniqPrefix
 286+ KTHX
 287+
 288+ DO NOT WANT
 289+ NOT WANT Convert wikitext to HTML
 290+ NOT WANT Do not call this function recursively.
 291+ NOT WANT
 292+ NOT WANT @param $text String: text we want to parse
 293+ NOT WANT @param $title A title object
 294+ NOT WANT @param $options ParserOptions
 295+ NOT WANT @param $linestart boolean
 296+ NOT WANT @param $clearState boolean
 297+ NOT WANT @param $revid Int: number to pass in {{REVISIONID}}
 298+ NOT WANT @return ParserOutput a ParserOutput
 299+ WANT
 300+ SO IM LIKE parse WITH UR $text, Title $title, ParserOptions $options, $linestart = true, $clearState = true, $revid = null
 301+ DO NOT WANT
 302+ NOT WANT First pass--just handle <nowiki> sections, pass the rest off
 303+ NOT WANT to internalParse() which does all the real work.
 304+ WANT
 305+
 306+ I HAS UR $wgUseTidy, $wgAlwaysUseTidy, $wgContLang, $wgDisableLangConversion ON UR INTERNETS
 307+ I HAS fname IZ __METHOD__.'-' . wfGetCaller()
 308+ IM ON UR wfProfileIn DOING __METHOD__
 309+ IM ON UR wfProfileIn DOING $fname
 310+
 311+ IZ $clearState
 312+ IM ON UR SPECIAL clearState
 313+ KTHX
 314+
 315+ UR SPECIAL mOptions IZ $options;
 316+ IM ON UR SPECIAL setTitle DOING $title # Page title has to be set for the pre-processor
 317+
 318+ I HAS oldRevisionId IZ $this->mRevisionId
 319+ I HAS oldRevisionTimestamp IZ $this->mRevisionTimestamp
 320+ IZ $revid !== null
 321+ UR SPECIAL mRevisionId IZ $revid;
 322+ UR SPECIAL mRevisionTimestamp IZ null;
 323+ KTHX
 324+ IM ON UR SPECIAL setOutputType DOING self::OT_HTML
 325+ IM ON UR wfRunHooks DOING 'ParserBeforeStrip', array( &$this, &$text, &$this->mStripState )
 326+ BTW No more strip!
 327+ IM ON UR wfRunHooks DOING 'ParserAfterStrip', array( &$this, &$text, &$this->mStripState )
 328+ I HAS text IZ $this->internalParse( $text )
 329+
 330+ I HAS text IZ $this->mStripState->unstripGeneral( $text )
 331+
 332+ BTW Clean up special characters, only run once, next-to-last before doBlockLevels
 333+ I HAS fixtags IZ BUCKET
 334+ BTW french spaces, last one Guillemet-left
 335+ BTW only if there is something before the space
 336+ '/(.) (?=\\?|:|;|!|%|\\302\\273)/' => '\\1&nbsp;\\2',
 337+ BTW french spaces, Guillemet-right
 338+ '/(\\302\\253) /' => '\\1&nbsp;',
 339+ '/&nbsp;(!\s*important)/' => ' \\1', # Beware of CSS magic word !important, bug #11874.
 340+ BUCKET
 341+ I HAS text IZ preg_replace( array_keys( $fixtags ), array_values( $fixtags ), $text )
 342+
 343+ I HAS text IZ $this->doBlockLevels( $text, $linestart )
 344+
 345+ IM ON UR SPECIAL replaceLinkHolders DOING $text
 346+
 347+ BTW The position of the convert() call should not be changed. it
 348+ BTW assumes that the links are all replaced and the only thing left
 349+ BTW is the <nowiki> mark.
 350+ if ( !( $wgDisableLangConversion
 351+ || isset( $this->mDoubleUnderscores['nocontentconvert'] )
 352+ || $this->mTitle->isTalkPage()
 353+ || $this->mTitle->isConversionTable() ) ) {
 354+ I HAS text IZ $wgContLang->convert( $text )
 355+ KTHX
 356+
 357+ BTW A title may have been set in a conversion rule.
 358+ BTW Note that if a user tries to set a title in a conversion
 359+ BTW rule but content conversion was not done, then the parser
 360+ BTW won't pick it up. This is probably expected behavior.
 361+ IZ $wgContLang->getConvRuleTitle()
 362+ IM ON UR SPECIAL mOutput->setTitleText DOING $wgContLang->getConvRuleTitle()
 363+ KTHX
 364+
 365+ I HAS text IZ $this->mStripState->unstripNoWiki( $text )
 366+
 367+ IM ON UR wfRunHooks DOING 'ParserBeforeTidy', array( &$this, &$text )
 368+
 369+//!JF Move to its own function
 370+
 371+ I HAS uniq_prefix IZ $this->mUniqPrefix
 372+ I HAS matches IZ EMPTY
 373+ I HAS elements IZ array_keys( $this->mTransparentTagHooks )
 374+ I HAS text IZ self::extractTagsAndParams( $elements, $text, $matches, $uniq_prefix )
 375+
 376+ IM IN UR matches ITZA marker => $data
 377+ list( $element, $content, $params, $tag ) = $data;
 378+ I HAS tagName IZ strtolower( $element )
 379+ IZ isset( $this->mTransparentTagHooks[$tagName] )
 380+ I HAS output IZ call_user_func_array( $this->mTransparentTagHooks[$tagName], array( $content, $params, $this ) )
 381+ NOWAI
 382+ I HAS output IZ $tag
 383+ KTHX
 384+ IM ON UR SPECIAL mStripState->general->setPair DOING $marker, $output
 385+ KTHX
 386+ I HAS text IZ $this->mStripState->unstripGeneral( $text )
 387+
 388+ I HAS text IZ Sanitizer::normalizeCharReferences( $text )
 389+
 390+ IZ ( $wgUseTidy && $this->mOptions->mTidy ) || $wgAlwaysUseTidy
 391+ I HAS text IZ MWTidy::tidy( $text )
 392+ NOWAI
 393+ BTW attempt to sanitize at least some nesting problems
 394+ BTW (bug #2702 and quite a few others)
 395+ I HAS tidyregs IZ BUCKET
 396+ BTW ''Something [http://www.cool.com cool''] -->
 397+ BTW <i>Something</i><a href="http://www.cool.com"..><i>cool></i></a>
 398+ '/(<([bi])>)(<([bi])>)?([^<]*)(<\/?a[^<]*>)([^<]*)(<\/\\4>)?(<\/\\2>)/' =>
 399+ '\\1\\3\\5\\8\\9\\6\\1\\3\\7\\8\\9',
 400+ BTW fix up an anchor inside another anchor, only
 401+ BTW at least for a single single nested link (bug 3695)
 402+ '/(<a[^>]+>)([^<]*)(<a[^>]+>[^<]*)<\/a>(.*)<\/a>/' =>
 403+ '\\1\\2</a>\\3</a>\\1\\4</a>',
 404+ BTW fix div inside inline elements- doBlockLevels won't wrap a line which
 405+ BTW contains a div, so fix it up here; replace
 406+ BTW div with escaped text
 407+ '/(<([aib]) [^>]+>)([^<]*)(<div([^>]*)>)(.*)(<\/div>)([^<]*)(<\/\\2>)/' =>
 408+ '\\1\\3&lt;div\\5&gt;\\6&lt;/div&gt;\\8\\9',
 409+ BTW remove empty italic or bold tag pairs, some
 410+ BTW introduced by rules above
 411+ '/<([bi])><\/\\1>/' => '',
 412+ BUCKET
 413+
 414+ text IZ preg_replace(
 415+ array_keys( $tidyregs ),
 416+ array_values( $tidyregs ),
 417+ $text );
 418+ KTHX
 419+ I HAS UR $wgExpensiveParserFunctionLimit ON UR INTERNETS
 420+ IZ $this->mExpensiveFunctionCount > $wgExpensiveParserFunctionLimit
 421+ IM ON UR SPECIAL limitationWarn DOING 'expensive-parserfunction', $this->mExpensiveFunctionCount, $wgExpensiveParserFunctionLimit
 422+ KTHX
 423+
 424+ IM ON UR wfRunHooks DOING 'ParserAfterTidy', array( &$this, &$text )
 425+
 426+ BTW Information on include size limits, for the benefit of users who try to skirt them
 427+ IZ $this->mOptions->getEnableLimitReport()
 428+ I HAS max IZ $this->mOptions->getMaxIncludeSize()
 429+ I HAS PFreport IZ "Expensive parser function count: {$this->mExpensiveFunctionCount}/$wgExpensiveParserFunctionLimit\n"
 430+ $limitReport =
 431+ "NewPP limit report\n" .
 432+ "Preprocessor node count: {$this->mPPNodeCount}/{$this->mOptions->mMaxPPNodeCount}\n" .
 433+ "Post-expand include size: {$this->mIncludeSizes['post-expand']}/$max bytes\n" .
 434+ "Template argument size: {$this->mIncludeSizes['arg']}/$max bytes\n".
 435+ I HAS PFreport
 436+ IM ON UR wfRunHooks DOING 'ParserLimitReport', array( $this, &$limitReport )
 437+ text HAS MOAR "\n<!-- \n$limitReport-->\n";
 438+ KTHX
 439+ IM ON UR SPECIAL mOutput->setText DOING $text
 440+
 441+ UR SPECIAL mRevisionId IZ $oldRevisionId;
 442+ UR SPECIAL mRevisionTimestamp IZ $oldRevisionTimestamp;
 443+ IM ON UR wfProfileOut DOING $fname
 444+ IM ON UR wfProfileOut DOING __METHOD__
 445+
 446+ I FOUND MAH $this->mOutput
 447+ KTHX
 448+
 449+ DO NOT WANT
 450+ NOT WANT Recursive parser entry point that can be called from an extension tag
 451+ NOT WANT hook.
 452+ NOT WANT
 453+ NOT WANT If $frame is not provided, then template variables (e.g., {{{1}}}) within $text are not expanded
 454+ NOT WANT
 455+ NOT WANT @param $text String: text extension wants to have parsed
 456+ NOT WANT @param PPFrame $frame: The frame to use for expanding any template variables
 457+ WANT
 458+ SO IM LIKE recursiveTagParse WITH UR $text, $frame=false
 459+ IM ON UR wfProfileIn DOING __METHOD__
 460+ IM ON UR wfRunHooks DOING 'ParserBeforeStrip', array( &$this, &$text, &$this->mStripState )
 461+ IM ON UR wfRunHooks DOING 'ParserAfterStrip', array( &$this, &$text, &$this->mStripState )
 462+ I HAS text IZ $this->internalParse( $text, false, $frame )
 463+ IM ON UR wfProfileOut DOING __METHOD__
 464+ I FOUND MAH $text
 465+ KTHX
 466+
 467+ DO NOT WANT
 468+ NOT WANT Expand templates and variables in the text, producing valid, static wikitext.
 469+ NOT WANT Also removes comments.
 470+ WANT
 471+ SO IM LIKE preprocess WITH UR $text, $title, $options, $revid = null
 472+ IM ON UR wfProfileIn DOING __METHOD__
 473+ IM ON UR SPECIAL clearState
 474+ IM ON UR SPECIAL setOutputType DOING self::OT_PREPROCESS
 475+ UR SPECIAL mOptions IZ $options;
 476+ IM ON UR SPECIAL setTitle DOING $title
 477+ IZ $revid !== null
 478+ UR SPECIAL mRevisionId IZ $revid;
 479+ KTHX
 480+ IM ON UR wfRunHooks DOING 'ParserBeforeStrip', array( &$this, &$text, &$this->mStripState )
 481+ IM ON UR wfRunHooks DOING 'ParserAfterStrip', array( &$this, &$text, &$this->mStripState )
 482+ I HAS text IZ $this->replaceVariables( $text )
 483+ I HAS text IZ $this->mStripState->unstripBoth( $text )
 484+ IM ON UR wfProfileOut DOING __METHOD__
 485+ I FOUND MAH $text
 486+ KTHX
 487+
 488+ DO NOT WANT
 489+ NOT WANT Process the wikitext for the ?preload= feature. (bug 5210)
 490+ NOT WANT
 491+ NOT WANT <noinclude>, <includeonly> etc. are parsed as for template transclusion,
 492+ NOT WANT comments, templates, arguments, tags hooks and parser functions are untouched.
 493+ WANT
 494+ SO IM LIKE getPreloadText WITH UR $text, $title, $options
 495+ BTW Parser (re)initialisation
 496+ IM ON UR SPECIAL clearState
 497+ IM ON UR SPECIAL setOutputType DOING self::OT_PLAIN
 498+ UR SPECIAL mOptions IZ $options;
 499+ IM ON UR SPECIAL setTitle DOING $title
 500+
 501+ I HAS flags IZ PPFrame::NO_ARGS | PPFrame::NO_TEMPLATES
 502+ I HAS dom IZ $this->preprocessToDom( $text, self::PTD_FOR_INCLUSION )
 503+ I FOUND MAH $this->getPreprocessor()->newFrame()->expand( $dom, $flags )
 504+ KTHX
 505+
 506+ DO NOT WANT
 507+ NOT WANT Get a random string
 508+ NOT WANT
 509+ NOT WANT @private
 510+ NOT WANT @static
 511+ WANT
 512+ SO IM LIKE getRandomString
 513+ I FOUND MAH dechex( mt_rand( 0, 0x7fffffff ) ) . dechex( mt_rand( 0, 0x7fffffff ) )
 514+ KTHX
 515+
 516+ function &getTitle() { return $this->mTitle; }
 517+ SO IM LIKE getOptions TESTING UR return $this->mOptions;
 518+ SO IM LIKE getRevisionId TESTING UR return $this->mRevisionId;
 519+ SO IM LIKE getOutput TESTING UR return $this->mOutput;
 520+ SO IM LIKE nextLinkID TESTING UR return $this->mLinkID++;
 521+
 522+ SO IM LIKE getFunctionLang
 523+ I HAS UR $wgLang, $wgContLang ON UR INTERNETS
 524+
 525+ I HAS target IZ $this->mOptions->getTargetLanguage()
 526+ IZ $target !== null
 527+ I FOUND MAH $target
 528+ NOWAI
 529+ I FOUND MAH $this->mOptions->getInterfaceMessage() ? $wgLang : $wgContLang
 530+ KTHX
 531+ KTHX
 532+
 533+ DO NOT WANT
 534+ NOT WANT Get a preprocessor object
 535+ WANT
 536+ SO IM LIKE getPreprocessor
 537+ IZ !isset( $this->mPreprocessor )
 538+ I HAS class IZ $this->mPreprocessorClass
 539+ UR SPECIAL mPreprocessor IZ new $class( $this );
 540+ KTHX
 541+ I FOUND MAH $this->mPreprocessor
 542+ KTHX
 543+
 544+ DO NOT WANT
 545+ NOT WANT Replaces all occurrences of HTML-style comments and the given tags
 546+ NOT WANT in the text with a random marker and returns the next text. The output
 547+ NOT WANT parameter $matches will be an associative array filled with data in
 548+ NOT WANT the form:
 549+ NOT WANT 'UNIQ-xxxxx' => array(
 550+ NOT WANT 'element',
 551+ NOT WANT 'tag content',
 552+ NOT WANT array( 'param' => 'x' ),
 553+ NOT WANT '<element param="x">tag content</element>' ) )
 554+ NOT WANT
 555+ NOT WANT @param $elements list of element names. Comments are always extracted.
 556+ NOT WANT @param $text Source text string.
 557+ NOT WANT @param $uniq_prefix
 558+ NOT WANT
 559+ NOT WANT @public
 560+ NOT WANT @static
 561+ WANT
 562+ SO IM LIKE extractTagsAndParams WITH UR $elements, $text, &$matches, $uniq_prefix = ''
 563+ static $n = 1;
 564+ I HAS stripped IZ ''
 565+ I HAS matches IZ EMPTY
 566+
 567+ I HAS taglist IZ implode( '|', $elements )
 568+ I HAS start IZ "/<($taglist)(\\s+[^>]*?|\\s*?)(\/?" . ">)|<(!--)/i"
 569+
 570+ STEALIN UR $text != ''
 571+ I HAS p IZ preg_split( $start, $text, 2, PREG_SPLIT_DELIM_CAPTURE )
 572+ stripped HAS MOAR $p[0];
 573+ IZ count( $p ) < 5
 574+ break;
 575+ KTHX
 576+ IZ count( $p ) > 5
 577+ BTW comment
 578+ I HAS element IZ $p[4]
 579+ I HAS attributes IZ ''
 580+ I HAS close IZ ''
 581+ I HAS inside IZ $p[5]
 582+ NOWAI
 583+ BTW tag
 584+ I HAS element IZ $p[1]
 585+ I HAS attributes IZ $p[2]
 586+ I HAS close IZ $p[3]
 587+ I HAS inside IZ $p[4]
 588+ KTHX
 589+
 590+ I HAS marker IZ "$uniq_prefix-$element-" . sprintf( '%08X', $n++ ) . self::MARKER_SUFFIX
 591+ stripped HAS MOAR $marker;
 592+
 593+ IZ $close === '/>'
 594+ BTW Empty element tag, <tag />
 595+ I HAS content
 596+ I HAS text IZ $inside
 597+ I HAS tail
 598+ NOWAI
 599+ IZ $element === '!--'
 600+ I HAS end IZ '/(-->)/'
 601+ NOWAI
 602+ I HAS end IZ "/(<\\/$element\\s*>)/i"
 603+ KTHX
 604+ I HAS q IZ preg_split( $end, $inside, 2, PREG_SPLIT_DELIM_CAPTURE )
 605+ I HAS content IZ $q[0]
 606+ IZ count( $q ) < 3
 607+ BTW No end tag -- let it run out to the end of the text.
 608+ I HAS tail IZ ''
 609+ I HAS text IZ ''
 610+ NOWAI
 611+ I HAS tail IZ $q[1]
 612+ I HAS text IZ $q[2]
 613+ KTHX
 614+ KTHX
 615+
 616+ $matches[$marker] = array( $element,
 617+ $content,
 618+ Sanitizer::decodeTagAttributes( $attributes ),
 619+ "<$element$attributes$close$content$tail" );
 620+ KTHX
 621+ I FOUND MAH $stripped
 622+ KTHX
 623+
 624+ DO NOT WANT
 625+ NOT WANT Get a list of strippable XML-like elements
 626+ WANT
 627+ SO IM LIKE getStripList
 628+ I FOUND MAH $this->mStripList
 629+ KTHX
 630+
 631+ DO NOT WANT
 632+ NOT WANT @deprecated use replaceVariables
 633+ WANT
 634+ SO IM LIKE strip WITH UR $text, $state, $stripcomments = false , $dontstrip = array()
 635+ I FOUND MAH $text
 636+ KTHX
 637+
 638+ DO NOT WANT
 639+ NOT WANT Restores pre, math, and other extensions removed by strip()
 640+ NOT WANT
 641+ NOT WANT always call unstripNoWiki() after this one
 642+ NOT WANT @private
 643+ NOT WANT @deprecated use $this->mStripState->unstrip()
 644+ WANT
 645+ SO IM LIKE unstrip WITH UR $text, $state
 646+ I FOUND MAH $state->unstripGeneral( $text )
 647+ KTHX
 648+
 649+ DO NOT WANT
 650+ NOT WANT Always call this after unstrip() to preserve the order
 651+ NOT WANT
 652+ NOT WANT @private
 653+ NOT WANT @deprecated use $this->mStripState->unstrip()
 654+ WANT
 655+ SO IM LIKE unstripNoWiki WITH UR $text, $state
 656+ I FOUND MAH $state->unstripNoWiki( $text )
 657+ KTHX
 658+
 659+ DO NOT WANT
 660+ NOT WANT @deprecated use $this->mStripState->unstripBoth()
 661+ WANT
 662+ SO IM LIKE unstripForHTML WITH UR $text
 663+ I FOUND MAH $this->mStripState->unstripBoth( $text )
 664+ KTHX
 665+
 666+ DO NOT WANT
 667+ NOT WANT Add an item to the strip state
 668+ NOT WANT Returns the unique tag which must be inserted into the stripped text
 669+ NOT WANT The tag will be replaced with the original text in unstrip()
 670+ NOT WANT
 671+ NOT WANT @private
 672+ WANT
 673+ SO IM LIKE insertStripItem WITH UR $text
 674+ I HAS rnd IZ "{$this->mUniqPrefix}-item-{$this->mMarkerIndex}-" . self::MARKER_SUFFIX
 675+ $this->mMarkerIndex++;
 676+ IM ON UR SPECIAL mStripState->general->setPair DOING $rnd, $text
 677+ I FOUND MAH $rnd
 678+ KTHX
 679+
 680+ DO NOT WANT
 681+ NOT WANT Interface with html tidy
 682+ NOT WANT @deprecated Use MWTidy::tidy()
 683+ WANT
 684+ SO IM ALWAYS LIKE tidy WITH UR $text
 685+ IM ON UR wfDeprecated DOING __METHOD__
 686+ I FOUND MAH MWTidy::tidy( $text )
 687+ KTHX
 688+
 689+ DO NOT WANT
 690+ NOT WANT parse the wiki syntax used to render tables
 691+ NOT WANT
 692+ NOT WANT @private
 693+ WANT
 694+ SO IM LIKE doTableStuff WITH UR $text
 695+ IM ON UR wfProfileIn DOING __METHOD__
 696+
 697+ I HAS lines IZ StringUtils::explode( "\n", $text )
 698+ I HAS out IZ ''
 699+ I HAS td_history IZ EMPTY # Is currently a td tag open?
 700+ I HAS last_tag_history IZ EMPTY # Save history of last lag activated (td, th or caption)
 701+ I HAS tr_history IZ EMPTY # Is currently a tr tag open?
 702+ I HAS tr_attributes IZ EMPTY # history of tr attributes
 703+ I HAS has_opened_tr IZ EMPTY # Did this table open a <tr> element?
 704+ I HAS indent_level IZ 0 # indent level of the table
 705+
 706+ IM IN UR lines ITZA outLine
 707+ I HAS line IZ trim( $outLine )
 708+
 709+ IZ $line == '' # empty line, go to next line
 710+ out HAS MOAR $outLine."\n";
 711+ continue;
 712+ KTHX
 713+ I HAS first_character IZ $line[0]
 714+ I HAS matches IZ EMPTY
 715+
 716+ IZ preg_match( '/^(:*)\{\|(.*)$/', $line , $matches )
 717+ BTW First check if we are starting a new table
 718+ I HAS indent_level IZ strlen( $matches[1] )
 719+
 720+ I HAS attributes IZ $this->mStripState->unstripBoth( $matches[2] )
 721+ I HAS attributes IZ Sanitizer::fixTagAttributes( $attributes , 'table' )
 722+
 723+ I HAS outLine IZ str_repeat( '<dl><dd>' , $indent_level ) . "<table{$attributes}>"
 724+ IM ON UR array_push DOING $td_history , false
 725+ IM ON UR array_push DOING $last_tag_history , ''
 726+ IM ON UR array_push DOING $tr_history , false
 727+ IM ON UR array_push DOING $tr_attributes , ''
 728+ IM ON UR array_push DOING $has_opened_tr , false
 729+ ORLY count( $td_history ) == 0
 730+ BTW Don't do any of the following
 731+ out HAS MOAR $outLine."\n";
 732+ continue;
 733+ ORLY substr( $line , 0 , 2 ) === '|}'
 734+ BTW We are ending a table
 735+ I HAS line IZ '</table>' . substr( $line , 2 )
 736+ I HAS last_tag IZ array_pop( $last_tag_history )
 737+
 738+ IZ !array_pop( $has_opened_tr )
 739+ I HAS line IZ "<tr><td></td></tr>{$line}"
 740+ KTHX
 741+
 742+ IZ array_pop( $tr_history )
 743+ I HAS line IZ "</tr>{$line}"
 744+ KTHX
 745+
 746+ IZ array_pop( $td_history )
 747+ I HAS line IZ "</{$last_tag}>{$line}"
 748+ KTHX
 749+ IM ON UR array_pop DOING $tr_attributes
 750+ I HAS outLine IZ $line . str_repeat( '</dd></dl>' , $indent_level )
 751+ ORLY substr( $line , 0 , 2 ) === '|-'
 752+ BTW Now we have a table row
 753+ I HAS line IZ preg_replace( '#^\|-+#', '', $line )
 754+
 755+ BTW Whats after the tag is now only attributes
 756+ I HAS attributes IZ $this->mStripState->unstripBoth( $line )
 757+ I HAS attributes IZ Sanitizer::fixTagAttributes( $attributes, 'tr' )
 758+ IM ON UR array_pop DOING $tr_attributes
 759+ IM ON UR array_push DOING $tr_attributes, $attributes
 760+
 761+ I HAS line IZ ''
 762+ I HAS last_tag IZ array_pop( $last_tag_history )
 763+ IM ON UR array_pop DOING $has_opened_tr
 764+ IM ON UR array_push DOING $has_opened_tr , true
 765+
 766+ IZ array_pop( $tr_history )
 767+ I HAS line IZ '</tr>'
 768+ KTHX
 769+
 770+ IZ array_pop( $td_history )
 771+ I HAS line IZ "</{$last_tag}>{$line}"
 772+ KTHX
 773+
 774+ I HAS outLine IZ $line
 775+ IM ON UR array_push DOING $tr_history , false
 776+ IM ON UR array_push DOING $td_history , false
 777+ IM ON UR array_push DOING $last_tag_history , ''
 778+ ORLY $first_character === '|' || $first_character === '!' || substr( $line , 0 , 2 ) === '|+'
 779+ BTW This might be cell elements, td, th or captions
 780+ IZ substr( $line , 0 , 2 ) === '|+'
 781+ I HAS first_character IZ '+'
 782+ I HAS line IZ substr( $line , 1 )
 783+ KTHX
 784+
 785+ I HAS line IZ substr( $line , 1 )
 786+
 787+ IZ $first_character === '!'
 788+ I HAS line IZ str_replace( '!!' , '||' , $line )
 789+ KTHX
 790+
 791+ BTW Split up multiple cells on the same line.
 792+ BTW FIXME : This can result in improper nesting of tags processed
 793+ BTW by earlier parser steps, but should avoid splitting up eg
 794+ BTW attribute values containing literal "||".
 795+ I HAS cells IZ StringUtils::explodeMarkup( '||' , $line )
 796+
 797+ I HAS outLine IZ ''
 798+
 799+ BTW Loop through each table cell
 800+ IM IN UR cells ITZA cell
 801+ I HAS previous IZ ''
 802+ IZ $first_character !== '+'
 803+ I HAS tr_after IZ array_pop( $tr_attributes )
 804+ IZ !array_pop( $tr_history )
 805+ I HAS previous IZ "<tr{$tr_after}>\n"
 806+ KTHX
 807+ IM ON UR array_push DOING $tr_history , true
 808+ IM ON UR array_push DOING $tr_attributes , ''
 809+ IM ON UR array_pop DOING $has_opened_tr
 810+ IM ON UR array_push DOING $has_opened_tr , true
 811+ KTHX
 812+
 813+ I HAS last_tag IZ array_pop( $last_tag_history )
 814+
 815+ IZ array_pop( $td_history )
 816+ I HAS previous IZ "</{$last_tag}>{$previous}"
 817+ KTHX
 818+
 819+ IZ $first_character === '|'
 820+ I HAS last_tag IZ 'td'
 821+ ORLY $first_character === '!'
 822+ I HAS last_tag IZ 'th'
 823+ ORLY $first_character === '+'
 824+ I HAS last_tag IZ 'caption'
 825+ NOWAI
 826+ I HAS last_tag IZ ''
 827+ KTHX
 828+
 829+ IM ON UR array_push DOING $last_tag_history , $last_tag
 830+
 831+ BTW A cell could contain both parameters and data
 832+ I HAS cell_data IZ explode( '|' , $cell , 2 )
 833+
 834+ BTW Bug 553: Note that a '|' inside an invalid link should not
 835+ BTW be mistaken as delimiting cell parameters
 836+ IZ strpos( $cell_data[0], '[[' ) !== false
 837+ I HAS cell IZ "{$previous}<{$last_tag}>{$cell}"
 838+ ORLY count( $cell_data ) == 1
 839+ I HAS cell IZ "{$previous}<{$last_tag}>{$cell_data[0]}"
 840+ NOWAI
 841+ I HAS attributes IZ $this->mStripState->unstripBoth( $cell_data[0] )
 842+ I HAS attributes IZ Sanitizer::fixTagAttributes( $attributes , $last_tag )
 843+ I HAS cell IZ "{$previous}<{$last_tag}{$attributes}>{$cell_data[1]}"
 844+ KTHX
 845+
 846+ outLine HAS MOAR $cell;
 847+ IM ON UR array_push DOING $td_history , true
 848+ KTHX
 849+ KTHX
 850+ out HAS MOAR $outLine . "\n";
 851+ KTHX
 852+
 853+ BTW Closing open td, tr && table
 854+ STEALIN UR count( $td_history ) > 0
 855+ IZ array_pop( $td_history )
 856+ out HAS MOAR "</td>\n";
 857+ KTHX
 858+ IZ array_pop( $tr_history )
 859+ out HAS MOAR "</tr>\n";
 860+ KTHX
 861+ IZ !array_pop( $has_opened_tr )
 862+ out HAS MOAR "<tr><td></td></tr>\n" ;
 863+ KTHX
 864+
 865+ out HAS MOAR "</table>\n";
 866+ KTHX
 867+
 868+ BTW Remove trailing line-ending (b/c)
 869+ IZ substr( $out, -1 ) === "\n"
 870+ I HAS out IZ substr( $out, 0, -1 )
 871+ KTHX
 872+
 873+ BTW special case: don't return empty table
 874+ IZ $out === "<table>\n<tr><td></td></tr>\n</table>"
 875+ I HAS out IZ ''
 876+ KTHX
 877+
 878+ IM ON UR wfProfileOut DOING __METHOD__
 879+
 880+ I FOUND MAH $out
 881+ KTHX
 882+
 883+ DO NOT WANT
 884+ NOT WANT Helper function for parse() that transforms wiki markup into
 885+ NOT WANT HTML. Only called for $mOutputType == self::OT_HTML.
 886+ NOT WANT
 887+ NOT WANT @private
 888+ WANT
 889+ SO IM LIKE internalParse WITH UR $text, $isMain = true, $frame=false
 890+ IM ON UR wfProfileIn DOING __METHOD__
 891+
 892+ I HAS origText IZ $text
 893+
 894+ BTW Hook to suspend the parser in this state
 895+ IZ !wfRunHooks( 'ParserBeforeInternalParse', array( &$this, &$text, &$this->mStripState ) )
 896+ IM ON UR wfProfileOut DOING __METHOD__
 897+ I FOUND MAH $text
 898+ KTHX
 899+
 900+ BTW if $frame is provided, then use $frame for replacing any variables
 901+ IZ $frame
 902+ BTW use frame depth to infer how include/noinclude tags should be handled
 903+ BTW depth=0 means this is the top-level document; otherwise it's an included document
 904+ IZ !$frame->depth
 905+ I HAS flag IZ 0
 906+ NOWAI
 907+ I HAS flag IZ Parser::PTD_FOR_INCLUSION
 908+ I HAS dom IZ $this->preprocessToDom( $text, $flag )
 909+ I HAS text IZ $frame->expand( $dom )
 910+ KTHX
 911+ NOWAI
 912+ BTW if $frame is not provided, then use old-style replaceVariables
 913+ I HAS text IZ $this->replaceVariables( $text )
 914+ KTHX
 915+
 916+ I HAS text IZ Sanitizer::removeHTMLtags( $text, array( &$this, 'attributeStripCallback' ), false, array_keys( $this->mTransparentTagHooks ) )
 917+ IM ON UR wfRunHooks DOING 'InternalParseBeforeLinks', array( &$this, &$text, &$this->mStripState )
 918+
 919+ BTW Tables need to come after variable replacement for things to work
 920+ BTW properly; putting them before other transformations should keep
 921+ BTW exciting things like link expansions from showing up in surprising
 922+ BTW places.
 923+ I HAS text IZ $this->doTableStuff( $text )
 924+
 925+ I HAS text IZ preg_replace( '/(^|\n)-----*/', '\\1<hr />', $text )
 926+
 927+ I HAS text IZ $this->doDoubleUnderscore( $text )
 928+
 929+ I HAS text IZ $this->doHeadings( $text )
 930+ IZ $this->mOptions->getUseDynamicDates()
 931+ I HAS df IZ DateFormatter::getInstance()
 932+ I HAS text IZ $df->reformat( $this->mOptions->getDateFormat(), $text )
 933+ KTHX
 934+ I HAS text IZ $this->doAllQuotes( $text )
 935+ I HAS text IZ $this->replaceInternalLinks( $text )
 936+ I HAS text IZ $this->replaceExternalLinks( $text )
 937+
 938+ BTW replaceInternalLinks may sometimes leave behind
 939+ BTW absolute URLs, which have to be masked to hide them from replaceExternalLinks
 940+ I HAS text IZ str_replace( $this->mUniqPrefix.'NOPARSE', '', $text )
 941+
 942+ I HAS text IZ $this->doMagicLinks( $text )
 943+ I HAS text IZ $this->formatHeadings( $text, $origText, $isMain )
 944+
 945+ IM ON UR wfProfileOut DOING __METHOD__
 946+ I FOUND MAH $text
 947+ KTHX
 948+
 949+ DO NOT WANT
 950+ NOT WANT Replace special strings like "ISBN xxx" and "RFC xxx" with
 951+ NOT WANT magic external links.
 952+ NOT WANT
 953+ NOT WANT DML
 954+ NOT WANT @private
 955+ WANT
 956+ SO IM LIKE doMagicLinks WITH UR $text
 957+ IM ON UR wfProfileIn DOING __METHOD__
 958+ I HAS prots IZ $this->mUrlProtocols
 959+ I HAS urlChar IZ self::EXT_LINK_URL_CLASS
 960+ text IZ preg_replace_callback(
 961+ '!(?: # Start cases
 962+ (<a[ \t\r\n>].*?</a>) | # m[1]: Skip link text
 963+ (<.*?>) | # m[2]: Skip stuff inside HTML elements' . "
 964+ (\\b(?:$prots)$urlChar+) | # m[3]: Free external links" . '
 965+ (?:RFC|PMID)\s+([0-9]+) | # m[4]: RFC or PMID, capture number
 966+ ISBN\s+(\b # m[5]: ISBN, capture number
 967+ (?: 97[89] [\ \-]? )? # optional 13-digit ISBN prefix
 968+ (?: [0-9] [\ \-]? ){9} # 9 digits with opt. delimiters
 969+ [0-9Xx] # check digit
 970+ \b)
 971+ )!x', array( &$this, 'magicLinkCallback' ), $text );
 972+ IM ON UR wfProfileOut DOING __METHOD__
 973+ I FOUND MAH $text
 974+ KTHX
 975+
 976+ SO IM LIKE magicLinkCallback WITH UR $m
 977+ IZ isset( $m[1] ) && $m[1] !== ''
 978+ BTW Skip anchor
 979+ I FOUND MAH $m[0]
 980+ ORLY isset( $m[2] ) && $m[2] !== ''
 981+ BTW Skip HTML element
 982+ I FOUND MAH $m[0]
 983+ ORLY isset( $m[3] ) && $m[3] !== ''
 984+ BTW Free external link
 985+ I FOUND MAH $this->makeFreeExternalLink( $m[0] )
 986+ ORLY isset( $m[4] ) && $m[4] !== ''
 987+ BTW RFC or PMID
 988+ I HAS CssClass IZ ''
 989+ IZ substr( $m[0], 0, 3 ) === 'RFC'
 990+ I HAS keyword IZ 'RFC'
 991+ I HAS urlmsg IZ 'rfcurl'
 992+ I HAS CssClass IZ 'mw-magiclink-rfc'
 993+ I HAS id IZ $m[4]
 994+ ORLY substr( $m[0], 0, 4 ) === 'PMID'
 995+ I HAS keyword IZ 'PMID'
 996+ I HAS urlmsg IZ 'pubmedurl'
 997+ I HAS CssClass IZ 'mw-magiclink-pmid'
 998+ I HAS id IZ $m[4]
 999+ NOWAI
 1000+ throw new MWException( __METHOD__.': unrecognised match type "' .
 1001+ IM ON UR substr DOING $m[0], 0, 20 ) . '"'
 1002+ KTHX
 1003+ I HAS url IZ wfMsg( $urlmsg, $id)
 1004+ I HAS sk IZ $this->mOptions->getSkin()
 1005+ I HAS la IZ $sk->getExternalLinkAttributes( "external $CssClass" )
 1006+ I FOUND MAH "<a href=\"{$url}\"{$la}>{$keyword} {$id}</a>"
 1007+ ORLY isset( $m[5] ) && $m[5] !== ''
 1008+ BTW ISBN
 1009+ I HAS isbn IZ $m[5]
 1010+ num IZ strtr( $isbn, array(
 1011+ '-' => '',
 1012+ ' ' => '',
 1013+ 'x' => 'X',
 1014+ ));
 1015+ I HAS titleObj IZ SpecialPage::getTitleFor( 'Booksources', $num )
 1016+ return'<a href="' .
 1017+ $titleObj->escapeLocalUrl() .
 1018+ "\" class=\"internal mw-magiclink-isbn\">ISBN $isbn</a>";
 1019+ NOWAI
 1020+ I FOUND MAH $m[0]
 1021+ KTHX
 1022+ KTHX
 1023+
 1024+ DO NOT WANT
 1025+ NOT WANT Make a free external link, given a user-supplied URL
 1026+ NOT WANT @return HTML
 1027+ NOT WANT @private
 1028+ WANT
 1029+ SO IM LIKE makeFreeExternalLink WITH UR $url
 1030+ I HAS UR $wgContLang ON UR INTERNETS
 1031+ IM ON UR wfProfileIn DOING __METHOD__
 1032+
 1033+ I HAS sk IZ $this->mOptions->getSkin()
 1034+ I HAS trail IZ ''
 1035+
 1036+ BTW The characters '<' and '>' (which were escaped by
 1037+ BTW removeHTMLtags()) should not be included in
 1038+ BTW URLs, per RFC 2396.
 1039+ I HAS m2 IZ EMPTY
 1040+ IZ preg_match( '/&(lt|gt);/', $url, $m2, PREG_OFFSET_CAPTURE )
 1041+ I HAS trail IZ substr( $url, $m2[0][1] ) . $trail
 1042+ I HAS url IZ substr( $url, 0, $m2[0][1] )
 1043+ KTHX
 1044+
 1045+ BTW Move trailing punctuation to $trail
 1046+ I HAS sep IZ ',;\.:!?'
 1047+ BTW If there is no left bracket, then consider right brackets fair game too
 1048+ IZ strpos( $url, '(' ) === false
 1049+ sep HAS MOAR ')';
 1050+ KTHX
 1051+
 1052+ I HAS numSepChars IZ strspn( strrev( $url ), $sep )
 1053+ IZ $numSepChars
 1054+ I HAS trail IZ substr( $url, -$numSepChars ) . $trail
 1055+ I HAS url IZ substr( $url, 0, -$numSepChars )
 1056+ KTHX
 1057+
 1058+ I HAS url IZ Sanitizer::cleanUrl( $url )
 1059+
 1060+ BTW Is this an external image?
 1061+ I HAS text IZ $this->maybeMakeExternalImage( $url )
 1062+ IZ $text === false
 1063+ BTW Not an image, make a link
 1064+ text IZ $sk->makeExternalLink( $url, $wgContLang->markNoConversion($url), true, 'free',
 1065+ IM ON UR SPECIAL getExternalLinkAttribs DOING $url )
 1066+ BTW Register it in the output object...
 1067+ BTW Replace unnecessary URL escape codes with their equivalent characters
 1068+ I HAS pasteurized IZ self::replaceUnusualEscapes( $url )
 1069+ IM ON UR SPECIAL mOutput->addExternalLink DOING $pasteurized
 1070+ KTHX
 1071+ IM ON UR wfProfileOut DOING __METHOD__
 1072+ I FOUND MAH $text . $trail
 1073+ KTHX
 1074+
 1075+
 1076+ DO NOT WANT
 1077+ NOT WANT Parse headers and return html
 1078+ NOT WANT
 1079+ NOT WANT @private
 1080+ WANT
 1081+ SO IM LIKE doHeadings WITH UR $text
 1082+ IM ON UR wfProfileIn DOING __METHOD__
 1083+ for ( $i = 6; $i >= 1; --$i ) {
 1084+ I HAS h IZ str_repeat( '=', $i )
 1085+ text IZ preg_replace( "/^$h(.+)$h\\s*$/m",
 1086+ "<h$i>\\1</h$i>", $text );
 1087+ KTHX
 1088+ IM ON UR wfProfileOut DOING __METHOD__
 1089+ I FOUND MAH $text
 1090+ KTHX
 1091+
 1092+ DO NOT WANT
 1093+ NOT WANT Replace single quotes with HTML markup
 1094+ NOT WANT @private
 1095+ NOT WANT @return string the altered text
 1096+ WANT
 1097+ SO IM LIKE doAllQuotes WITH UR $text
 1098+ IM ON UR wfProfileIn DOING __METHOD__
 1099+ I HAS outtext IZ ''
 1100+ I HAS lines IZ StringUtils::explode( "\n", $text )
 1101+ IM IN UR lines ITZA line
 1102+ outtext HAS MOAR $this->doQuotes( $line ) . "\n";
 1103+ KTHX
 1104+ I HAS outtext IZ substr( $outtext, 0,-1 )
 1105+ IM ON UR wfProfileOut DOING __METHOD__
 1106+ I FOUND MAH $outtext
 1107+ KTHX
 1108+
 1109+ DO NOT WANT
 1110+ NOT WANT Helper function for doAllQuotes()
 1111+ WANT
 1112+ SO IM LIKE doQuotes WITH UR $text
 1113+ I HAS arr IZ preg_split( "/(''+)/", $text, -1, PREG_SPLIT_DELIM_CAPTURE )
 1114+ IZ count( $arr ) == 1
 1115+ I FOUND MAH $text
 1116+ NOWAI
 1117+ BTW First, do some preliminary work. This may shift some apostrophes from
 1118+ BTW being mark-up to being text. It also counts the number of occurrences
 1119+ BTW of bold and italics mark-ups.
 1120+ I HAS i IZ 0
 1121+ I HAS numbold IZ 0
 1122+ I HAS numitalics IZ 0
 1123+ IM IN UR arr ITZA r
 1124+ IZ ( $i % 2 ) == 1
 1125+ BTW If there are ever four apostrophes, assume the first is supposed to
 1126+ BTW be text, and the remaining three constitute mark-up for bold text.
 1127+ IZ strlen( $arr[$i] ) == 4
 1128+ $arr[$i-1] .= "'";
 1129+ $arr[$i] = "'''";
 1130+ ORLY strlen( $arr[$i] ) > 5
 1131+ BTW If there are more than 5 apostrophes in a row, assume they're all
 1132+ BTW text except for the last 5.
 1133+ $arr[$i-1] .= str_repeat( "'", strlen( $arr[$i] ) - 5 );
 1134+ $arr[$i] = "'''''";
 1135+ KTHX
 1136+ BTW Count the number of occurrences of bold and italics mark-ups.
 1137+ BTW We are not counting sequences of five apostrophes.
 1138+ IZ strlen( $arr[$i] ) == 2
 1139+ $numitalics++;
 1140+ ORLY strlen( $arr[$i] ) == 3
 1141+ $numbold++;
 1142+ ORLY strlen( $arr[$i] ) == 5
 1143+ $numitalics++;
 1144+ $numbold++;
 1145+ KTHX
 1146+ KTHX
 1147+ $i++;
 1148+ KTHX
 1149+
 1150+ BTW If there is an odd number of both bold and italics, it is likely
 1151+ BTW that one of the bold ones was meant to be an apostrophe followed
 1152+ BTW by italics. Which one we cannot know for certain, but it is more
 1153+ BTW likely to be one that has a single-letter word before it.
 1154+ IZ ( $numbold % 2 == 1 ) && ( $numitalics % 2 == 1 )
 1155+ I HAS i IZ 0
 1156+ I HAS firstsingleletterword IZ -1
 1157+ I HAS firstmultiletterword IZ -1
 1158+ I HAS firstspace IZ -1
 1159+ IM IN UR arr ITZA r
 1160+ IZ ( $i % 2 == 1 ) and ( strlen( $r ) == 3 )
 1161+ I HAS x1 IZ substr( $arr[$i-1], -1 )
 1162+ I HAS x2 IZ substr( $arr[$i-1], -2, 1 )
 1163+ IZ $x1 === ' '
 1164+ IZ $firstspace == -1
 1165+ I HAS firstspace IZ $i
 1166+ KTHX
 1167+ KTHX elseif ( $x2 === ' ') {
 1168+ IZ $firstsingleletterword == -1
 1169+ I HAS firstsingleletterword IZ $i
 1170+ KTHX
 1171+ NOWAI
 1172+ IZ $firstmultiletterword == -1
 1173+ I HAS firstmultiletterword IZ $i
 1174+ KTHX
 1175+ KTHX
 1176+ KTHX
 1177+ $i++;
 1178+ KTHX
 1179+
 1180+ BTW If there is a single-letter word, use it!
 1181+ IZ $firstsingleletterword > -1
 1182+ $arr[$firstsingleletterword] = "''";
 1183+ $arr[$firstsingleletterword-1] .= "'";
 1184+ ORLY $firstmultiletterword > -1
 1185+ BTW If not, but there's a multi-letter word, use that one.
 1186+ $arr[$firstmultiletterword] = "''";
 1187+ $arr[$firstmultiletterword-1] .= "'";
 1188+ ORLY $firstspace > -1
 1189+ BTW ... otherwise use the first one that has neither.
 1190+ BTW (notice that it is possible for all three to be -1 if, for example,
 1191+ BTW there is only one pentuple-apostrophe in the line)
 1192+ $arr[$firstspace] = "''";
 1193+ $arr[$firstspace-1] .= "'";
 1194+ KTHX
 1195+ KTHX
 1196+
 1197+ BTW Now let's actually convert our apostrophic mush to HTML!
 1198+ I HAS output IZ ''
 1199+ I HAS buffer IZ ''
 1200+ I HAS state IZ ''
 1201+ I HAS i IZ 0
 1202+ IM IN UR arr ITZA r
 1203+ IZ ( $i % 2 ) == 0
 1204+ IZ $state === 'both'
 1205+ buffer HAS MOAR $r;
 1206+ NOWAI
 1207+ output HAS MOAR $r;
 1208+ KTHX
 1209+ NOWAI
 1210+ IZ strlen( $r ) == 2
 1211+ IZ $state === 'i'
 1212+ output HAS MOAR '</i>'; $state = '';
 1213+ ORLY $state === 'bi'
 1214+ output HAS MOAR '</i>'; $state = 'b';
 1215+ ORLY $state === 'ib'
 1216+ output HAS MOAR '</b></i><b>'; $state = 'b';
 1217+ ORLY $state === 'both'
 1218+ output HAS MOAR '<b><i>'.$buffer.'</i>'; $state = 'b';
 1219+ NOWAI # $state can be 'b' or ''
 1220+ output HAS MOAR '<i>'; $state .= 'i';
 1221+ KTHX
 1222+ ORLY strlen( $r ) == 3
 1223+ IZ $state === 'b'
 1224+ output HAS MOAR '</b>'; $state = '';
 1225+ ORLY $state === 'bi'
 1226+ output HAS MOAR '</i></b><i>'; $state = 'i';
 1227+ ORLY $state === 'ib'
 1228+ output HAS MOAR '</b>'; $state = 'i';
 1229+ ORLY $state === 'both'
 1230+ output HAS MOAR '<i><b>'.$buffer.'</b>'; $state = 'i';
 1231+ NOWAI # $state can be 'i' or ''
 1232+ output HAS MOAR '<b>'; $state .= 'b';
 1233+ KTHX
 1234+ ORLY strlen( $r ) == 5
 1235+ IZ $state === 'b'
 1236+ output HAS MOAR '</b><i>'; $state = 'i';
 1237+ ORLY $state === 'i'
 1238+ output HAS MOAR '</i><b>'; $state = 'b';
 1239+ ORLY $state === 'bi'
 1240+ output HAS MOAR '</i></b>'; $state = '';
 1241+ ORLY $state === 'ib'
 1242+ output HAS MOAR '</b></i>'; $state = '';
 1243+ ORLY $state === 'both'
 1244+ output HAS MOAR '<i><b>'.$buffer.'</b></i>'; $state = '';
 1245+ NOWAI # ($state == '')
 1246+ I HAS buffer IZ ''; $state = 'both'
 1247+ KTHX
 1248+ KTHX
 1249+ KTHX
 1250+ $i++;
 1251+ KTHX
 1252+ BTW Now close all remaining tags. Notice that the order is important.
 1253+ IZ $state === 'b' || $state === 'ib'
 1254+ output HAS MOAR '</b>';
 1255+ KTHX
 1256+ IZ $state === 'i' || $state === 'bi' || $state === 'ib'
 1257+ output HAS MOAR '</i>';
 1258+ KTHX
 1259+ IZ $state === 'bi'
 1260+ output HAS MOAR '</b>';
 1261+ KTHX
 1262+ BTW There might be lonely ''''', so make sure we have a buffer
 1263+ IZ $state === 'both' && $buffer
 1264+ output HAS MOAR '<b><i>'.$buffer.'</i></b>';
 1265+ KTHX
 1266+ I FOUND MAH $output
 1267+ KTHX
 1268+ KTHX
 1269+
 1270+ DO NOT WANT
 1271+ NOT WANT Replace external links (REL)
 1272+ NOT WANT
 1273+ NOT WANT Note: this is all very hackish and the order of execution matters a lot.
 1274+ NOT WANT Make sure to run maintenance/parserTests.php if you change this code.
 1275+ NOT WANT
 1276+ NOT WANT @private
 1277+ WANT
 1278+ SO IM LIKE replaceExternalLinks WITH UR $text
 1279+ I HAS UR $wgContLang ON UR INTERNETS
 1280+ IM ON UR wfProfileIn DOING __METHOD__
 1281+
 1282+ I HAS sk IZ $this->mOptions->getSkin()
 1283+
 1284+ I HAS bits IZ preg_split( $this->mExtLinkBracketedRegex, $text, -1, PREG_SPLIT_DELIM_CAPTURE )
 1285+ I HAS s IZ array_shift( $bits )
 1286+
 1287+ I HAS i IZ 0
 1288+ STEALIN UR $i<count( $bits )
 1289+ I HAS url IZ $bits[$i++]
 1290+ I HAS protocol IZ $bits[$i++]
 1291+ I HAS text IZ $bits[$i++]
 1292+ I HAS trail IZ $bits[$i++]
 1293+
 1294+ BTW The characters '<' and '>' (which were escaped by
 1295+ BTW removeHTMLtags()) should not be included in
 1296+ BTW URLs, per RFC 2396.
 1297+ I HAS m2 IZ EMPTY
 1298+ IZ preg_match( '/&(lt|gt);/', $url, $m2, PREG_OFFSET_CAPTURE )
 1299+ I HAS text IZ substr( $url, $m2[0][1] ) . ' ' . $text
 1300+ I HAS url IZ substr( $url, 0, $m2[0][1] )
 1301+ KTHX
 1302+
 1303+ BTW If the link text is an image URL, replace it with an <img> tag
 1304+ BTW This happened by accident in the original parser, but some people used it extensively
 1305+ I HAS img IZ $this->maybeMakeExternalImage( $text )
 1306+ IZ $img !== false
 1307+ I HAS text IZ $img
 1308+ KTHX
 1309+
 1310+ I HAS dtrail IZ ''
 1311+
 1312+ BTW Set linktype for CSS - if URL==text, link is essentially free
 1313+ I HAS linktype IZ ( $text === $url ) ? 'free' : 'text'
 1314+
 1315+ BTW No link text, e.g. [http://domain.tld/some.link]
 1316+ IZ $text == ''
 1317+ BTW Autonumber if allowed. See bug #5918
 1318+ IZ strpos( wfUrlProtocols(), substr( $protocol, 0, strpos( $protocol, ':' ) ) ) !== false
 1319+ I HAS langObj IZ $this->getFunctionLang()
 1320+ I HAS text IZ '[' . $langObj->formatNum( ++$this->mAutonumber ) . ']'
 1321+ I HAS linktype IZ 'autonumber'
 1322+ NOWAI
 1323+ BTW Otherwise just use the URL
 1324+ I HAS text IZ htmlspecialchars( $url )
 1325+ I HAS linktype IZ 'free'
 1326+ KTHX
 1327+ NOWAI
 1328+ BTW Have link text, e.g. [http://domain.tld/some.link text]s
 1329+ BTW Check for trail
 1330+ IM ON UR list DOING $dtrail, $trail ) = Linker::splitTrail( $trail
 1331+ KTHX
 1332+
 1333+ I HAS text IZ $wgContLang->markNoConversion( $text )
 1334+
 1335+ I HAS url IZ Sanitizer::cleanUrl( $url )
 1336+
 1337+ BTW Use the encoded URL
 1338+ BTW This means that users can paste URLs directly into the text
 1339+ BTW Funny characters like &ouml; aren't valid in URLs anyway
 1340+ BTW This was changed in August 2004
 1341+ s HAS MOAR $sk->makeExternalLink( $url, $text, false, $linktype,
 1342+ $this->getExternalLinkAttribs( $url ) ) . $dtrail . $trail;
 1343+
 1344+ BTW Register link in the output object.
 1345+ BTW Replace unnecessary URL escape codes with the referenced character
 1346+ BTW This prevents spammers from hiding links from the filters
 1347+ I HAS pasteurized IZ self::replaceUnusualEscapes( $url )
 1348+ IM ON UR SPECIAL mOutput->addExternalLink DOING $pasteurized
 1349+ KTHX
 1350+
 1351+ IM ON UR wfProfileOut DOING __METHOD__
 1352+ I FOUND MAH $s
 1353+ KTHX
 1354+
 1355+ DO NOT WANT
 1356+ NOT WANT Get an associative array of additional HTML attributes appropriate for a
 1357+ NOT WANT particular external link. This currently may include rel => nofollow
 1358+ NOT WANT (depending on configuration, namespace, and the URL's domain) and/or a
 1359+ NOT WANT target attribute (depending on configuration).
 1360+ NOT WANT
 1361+ NOT WANT @param string $url Optional URL, to extract the domain from for rel =>
 1362+ NOT WANT nofollow if appropriate
 1363+ NOT WANT @return array Associative array of HTML attributes
 1364+ WANT
 1365+ SO IM LIKE getExternalLinkAttribs WITH UR $url = false
 1366+ I HAS attribs IZ EMPTY
 1367+ I HAS UR $wgNoFollowLinks, $wgNoFollowNsExceptions ON UR INTERNETS
 1368+ I HAS ns IZ $this->mTitle->getNamespace()
 1369+ IZ $wgNoFollowLinks && !in_array( $ns, $wgNoFollowNsExceptions )
 1370+ $attribs['rel'] = 'nofollow';
 1371+
 1372+ I HAS UR $wgNoFollowDomainExceptions ON UR INTERNETS
 1373+ IZ $wgNoFollowDomainExceptions
 1374+ I HAS bits IZ wfParseUrl( $url )
 1375+ IZ is_array( $bits ) && isset( $bits['host'] )
 1376+ IM IN UR wgNoFollowDomainExceptions ITZA domain
 1377+ IZ substr( $bits['host'], -strlen( $domain ) ) == $domain
 1378+ IM ON UR unset DOING $attribs['rel']
 1379+ break;
 1380+ KTHX
 1381+ KTHX
 1382+ KTHX
 1383+ KTHX
 1384+ KTHX
 1385+ IZ $this->mOptions->getExternalLinkTarget()
 1386+ $attribs['target'] = $this->mOptions->getExternalLinkTarget();
 1387+ KTHX
 1388+ I FOUND MAH $attribs
 1389+ KTHX
 1390+
 1391+
 1392+ DO NOT WANT
 1393+ NOT WANT Replace unusual URL escape codes with their equivalent characters
 1394+ NOT WANT @param string
 1395+ NOT WANT @return string
 1396+ NOT WANT @static
 1397+ NOT WANT @todo This can merge genuinely required bits in the path or query string,
 1398+ NOT WANT breaking legit URLs. A proper fix would treat the various parts of
 1399+ NOT WANT the URL differently; as a workaround, just use the output for
 1400+ NOT WANT statistical records, not for actual linking/output.
 1401+ WANT
 1402+ SO IM ALWAYS LIKE replaceUnusualEscapes WITH UR $url
 1403+ return preg_replace_callback( '/%[0-9A-Fa-f]{2}/',
 1404+ IM ON UR array DOING __CLASS__, 'replaceUnusualEscapesCallback' ), $url
 1405+ KTHX
 1406+
 1407+ DO NOT WANT
 1408+ NOT WANT Callback function used in replaceUnusualEscapes().
 1409+ NOT WANT Replaces unusual URL escape codes with their equivalent character
 1410+ NOT WANT @static
 1411+ NOT WANT @private
 1412+ WANT
 1413+ SO IM ALWAYS LIKE replaceUnusualEscapesCallback WITH UR $matches
 1414+ I HAS char IZ urldecode( $matches[0] )
 1415+ I HAS ord IZ ord( $char )
 1416+ BTW Is it an unsafe or HTTP reserved character according to RFC 1738?
 1417+ IZ $ord > 32 && $ord < 127 && strpos( '<>"#{}|\^~[]`;/?', $char ) === false
 1418+ BTW No, shouldn't be escaped
 1419+ I FOUND MAH $char
 1420+ NOWAI
 1421+ BTW Yes, leave it escaped
 1422+ I FOUND MAH $matches[0]
 1423+ KTHX
 1424+ KTHX
 1425+
 1426+ DO NOT WANT
 1427+ NOT WANT make an image if it's allowed, either through the global
 1428+ NOT WANT option, through the exception, or through the on-wiki whitelist
 1429+ NOT WANT @private
 1430+ WANT
 1431+ SO IM LIKE maybeMakeExternalImage WITH UR $url
 1432+ I HAS sk IZ $this->mOptions->getSkin()
 1433+ I HAS imagesfrom IZ $this->mOptions->getAllowExternalImagesFrom()
 1434+ I HAS imagesexception IZ !empty( $imagesfrom )
 1435+ I HAS text IZ false
 1436+ BTW $imagesfrom could be either a single string or an array of strings, parse out the latter
 1437+ IZ $imagesexception && is_array( $imagesfrom )
 1438+ I HAS imagematch IZ false
 1439+ IM IN UR imagesfrom ITZA match
 1440+ IZ strpos( $url, $match ) === 0
 1441+ I HAS imagematch IZ true
 1442+ break;
 1443+ KTHX
 1444+ KTHX
 1445+ ORLY $imagesexception
 1446+ I HAS imagematch IZ ( strpos( $url, $imagesfrom ) === 0 )
 1447+ NOWAI
 1448+ I HAS imagematch IZ false
 1449+ KTHX
 1450+ if ( $this->mOptions->getAllowExternalImages()
 1451+ || ( $imagesexception && $imagematch ) ) {
 1452+ IZ preg_match( self::EXT_IMAGE_REGEX, $url )
 1453+ BTW Image found
 1454+ I HAS text IZ $sk->makeExternalImage( $url )
 1455+ KTHX
 1456+ KTHX
 1457+ if ( !$text && $this->mOptions->getEnableImageWhitelist()
 1458+ && preg_match( self::EXT_IMAGE_REGEX, $url ) ) {
 1459+ I HAS whitelist IZ explode( "\n", wfMsgForContent( 'external_image_whitelist' ) )
 1460+ IM IN UR whitelist ITZA entry
 1461+ BTW Sanitize the regex fragment, make it case-insensitive, ignore blank entries/comments
 1462+ IZ strpos( $entry, '#' ) === 0 || $entry === ''
 1463+ continue;
 1464+ KTHX
 1465+ IZ preg_match( '/' . str_replace( '/', '\\/', $entry ) . '/i', $url )
 1466+ BTW Image matches a whitelist entry
 1467+ I HAS text IZ $sk->makeExternalImage( $url )
 1468+ break;
 1469+ KTHX
 1470+ KTHX
 1471+ KTHX
 1472+ I FOUND MAH $text
 1473+ KTHX
 1474+
 1475+ DO NOT WANT
 1476+ NOT WANT Process [[ ]] wikilinks
 1477+ NOT WANT @return processed text
 1478+ NOT WANT
 1479+ NOT WANT @private
 1480+ WANT
 1481+ SO IM LIKE replaceInternalLinks WITH UR $s
 1482+ IM ON UR SPECIAL mLinkHolders->merge DOING $this->replaceInternalLinks2( $s )
 1483+ I FOUND MAH $s
 1484+ KTHX
 1485+
 1486+ DO NOT WANT
 1487+ NOT WANT Process [[ ]] wikilinks (RIL)
 1488+ NOT WANT @return LinkHolderArray
 1489+ NOT WANT
 1490+ NOT WANT @private
 1491+ WANT
 1492+ SO IM LIKE replaceInternalLinks2 WITH UR &$s
 1493+ I HAS UR $wgContLang ON UR INTERNETS
 1494+
 1495+ IM ON UR wfProfileIn DOING __METHOD__
 1496+
 1497+ IM ON UR wfProfileIn DOING __METHOD__.'-setup'
 1498+ static $tc = FALSE, $e1, $e1_img;
 1499+ BTW the % is needed to support urlencoded titles as well
 1500+ IZ !$tc
 1501+ I HAS tc IZ Title::legalChars() . '#%'
 1502+ BTW Match a link having the form [[namespace:link|alternate]]trail
 1503+ I HAS e1 IZ "/^([{$tc}]+)(?:\\|(.+?))?]](.*)\$/sD"
 1504+ BTW Match cases where there is no "]]", which might still be images
 1505+ I HAS e1_img IZ "/^([{$tc}]+)\\|(.*)\$/sD"
 1506+ KTHX
 1507+
 1508+ I HAS sk IZ $this->mOptions->getSkin()
 1509+ I HAS holders IZ new LinkHolderArray( $this )
 1510+
 1511+ BTW split the entire text string on occurences of [[
 1512+ I HAS a IZ StringUtils::explode( '[[', ' ' . $s )
 1513+ BTW get the first element (all text up to first [[), and remove the space we added
 1514+ I HAS s IZ $a->current()
 1515+ $a->next();
 1516+ I HAS line IZ $a->current() # Workaround for broken ArrayIterator::next() that returns "void"
 1517+ I HAS s IZ substr( $s, 1 )
 1518+
 1519+ I HAS useLinkPrefixExtension IZ $wgContLang->linkPrefixExtension()
 1520+ I HAS e2
 1521+ IZ $useLinkPrefixExtension
 1522+ BTW Match the end of a line for a word that's not followed by whitespace,
 1523+ BTW e.g. in the case of 'The Arab al[[Razi]]', 'al' will be matched
 1524+ I HAS e2 IZ wfMsgForContent( 'linkprefix' )
 1525+ KTHX
 1526+
 1527+ IZ is_null( $this->mTitle )
 1528+ IM ON UR wfProfileOut DOING __METHOD__.'-setup'
 1529+ IM ON UR wfProfileOut DOING __METHOD__
 1530+ throw new MWException( __METHOD__.": \$this->mTitle is null\n" );
 1531+ KTHX
 1532+ I HAS nottalk IZ !$this->mTitle->isTalkPage()
 1533+
 1534+ IZ $useLinkPrefixExtension
 1535+ I HAS m IZ EMPTY
 1536+ IZ preg_match( $e2, $s, $m )
 1537+ I HAS first_prefix IZ $m[2]
 1538+ NOWAI
 1539+ I HAS first_prefix IZ false
 1540+ KTHX
 1541+ NOWAI
 1542+ I HAS prefix IZ ''
 1543+ KTHX
 1544+
 1545+ IZ $wgContLang->hasVariants()
 1546+ I HAS selflink IZ $wgContLang->convertLinkToAllVariants( $this->mTitle->getPrefixedText() )
 1547+ NOWAI
 1548+ I HAS selflink IZ BUCKET $this->mTitle->getPrefixedText() );
 1549+ KTHX
 1550+ I HAS useSubpages IZ $this->areSubpagesAllowed()
 1551+ IM ON UR wfProfileOut DOING __METHOD__.'-setup'
 1552+
 1553+ BTW Loop for each link
 1554+ for ( ; $line !== false && $line !== null ; $a->next(), $line = $a->current() ) {
 1555+ BTW Check for excessive memory usage
 1556+ IZ $holders->isBig()
 1557+ BTW Too big
 1558+ BTW Do the existence check, replace the link holders and clear the array
 1559+ $holders->replace( $s );
 1560+ $holders->clear();
 1561+ KTHX
 1562+
 1563+ IZ $useLinkPrefixExtension
 1564+ IM ON UR wfProfileIn DOING __METHOD__.'-prefixhandling'
 1565+ IZ preg_match( $e2, $s, $m )
 1566+ I HAS prefix IZ $m[2]
 1567+ I HAS s IZ $m[1]
 1568+ NOWAI
 1569+ $prefix='';
 1570+ KTHX
 1571+ BTW first link
 1572+ IZ $first_prefix
 1573+ I HAS prefix IZ $first_prefix
 1574+ I HAS first_prefix IZ false
 1575+ KTHX
 1576+ IM ON UR wfProfileOut DOING __METHOD__.'-prefixhandling'
 1577+ KTHX
 1578+
 1579+ I HAS might_be_img IZ false
 1580+
 1581+ IM ON UR wfProfileIn DOING __METHOD__."-e1"
 1582+ IZ preg_match( $e1, $line, $m ) # page with normal text or alt
 1583+ I HAS text IZ $m[2]
 1584+ BTW If we get a ] at the beginning of $m[3] that means we have a link that's something like:
 1585+ BTW [[Image:Foo.jpg|[http://example.com desc]]] <- having three ] in a row fucks up,
 1586+ BTW the real problem is with the $e1 regex
 1587+ BTW See bug 1300.
 1588+ BTW
 1589+ BTW Still some problems for cases where the ] is meant to be outside punctuation,
 1590+ BTW and no image is in sight. See bug 2095.
 1591+ BTW
 1592+ if ( $text !== '' &&
 1593+ substr( $m[3], 0, 1 ) === ']' &&
 1594+ strpos( $text, '[' ) !== false
 1595+ )
 1596+ {
 1597+ text HAS MOAR ']'; # so that replaceExternalLinks($text) works later
 1598+ $m[3] = substr( $m[3], 1 );
 1599+ KTHX
 1600+ BTW fix up urlencoded title texts
 1601+ IZ strpos( $m[1], '%' ) !== false
 1602+ BTW Should anchors '#' also be rejected?
 1603+ $m[1] = str_replace( array('<', '>'), array('&lt;', '&gt;'), urldecode( $m[1] ) );
 1604+ KTHX
 1605+ I HAS trail IZ $m[3]
 1606+ ORLY preg_match( $e1_img, $line, $m ) # Invalid, but might be an image with a link in its caption
 1607+ I HAS might_be_img IZ true
 1608+ I HAS text IZ $m[2]
 1609+ IZ strpos( $m[1], '%' ) !== false
 1610+ $m[1] = urldecode( $m[1] );
 1611+ KTHX
 1612+ I HAS trail IZ ""
 1613+ NOWAI # Invalid form; output directly
 1614+ s HAS MOAR $prefix . '[[' . $line ;
 1615+ IM ON UR wfProfileOut DOING __METHOD__."-e1"
 1616+ continue;
 1617+ KTHX
 1618+ IM ON UR wfProfileOut DOING __METHOD__."-e1"
 1619+ IM ON UR wfProfileIn DOING __METHOD__."-misc"
 1620+
 1621+ BTW Don't allow internal links to pages containing
 1622+ BTW PROTO: where PROTO is a valid URL protocol; these
 1623+ BTW should be external links.
 1624+ IZ preg_match( '/^\b(?:' . wfUrlProtocols() . ')/', $m[1] )
 1625+ s HAS MOAR $prefix . '[[' . $line ;
 1626+ IM ON UR wfProfileOut DOING __METHOD__."-misc"
 1627+ continue;
 1628+ KTHX
 1629+
 1630+ BTW Make subpage if necessary
 1631+ IZ $useSubpages
 1632+ I HAS link IZ $this->maybeDoSubpageLink( $m[1], $text )
 1633+ NOWAI
 1634+ I HAS link IZ $m[1]
 1635+ KTHX
 1636+
 1637+ I HAS noforce IZ ( substr( $m[1], 0, 1 ) !== ':' )
 1638+ IZ !$noforce
 1639+ BTW Strip off leading ':'
 1640+ I HAS link IZ substr( $link, 1 )
 1641+ KTHX
 1642+
 1643+ IM ON UR wfProfileOut DOING __METHOD__."-misc"
 1644+ IM ON UR wfProfileIn DOING __METHOD__."-title"
 1645+ I HAS nt IZ Title::newFromText( $this->mStripState->unstripNoWiki( $link ) )
 1646+ IZ $nt === null
 1647+ s HAS MOAR $prefix . '[[' . $line;
 1648+ IM ON UR wfProfileOut DOING __METHOD__."-title"
 1649+ continue;
 1650+ KTHX
 1651+
 1652+ I HAS ns IZ $nt->getNamespace()
 1653+ I HAS iw IZ $nt->getInterWiki()
 1654+ IM ON UR wfProfileOut DOING __METHOD__."-title"
 1655+
 1656+ IZ $might_be_img # if this is actually an invalid link
 1657+ IM ON UR wfProfileIn DOING __METHOD__."-might_be_img"
 1658+ IZ $ns == NS_FILE && $noforce # but might be an image
 1659+ I HAS found IZ false
 1660+ STEALIN UR true
 1661+ BTW look at the next 'line' to see if we can close it there
 1662+ $a->next();
 1663+ I HAS next_line IZ $a->current()
 1664+ IZ $next_line === false || $next_line === null
 1665+ break;
 1666+ KTHX
 1667+ I HAS m IZ explode( ']]', $next_line, 3 )
 1668+ IZ count( $m ) == 3
 1669+ BTW the first ]] closes the inner link, the second the image
 1670+ I HAS found IZ true
 1671+ text HAS MOAR "[[{$m[0]}]]{$m[1]}";
 1672+ I HAS trail IZ $m[2]
 1673+ break;
 1674+ ORLY count( $m ) == 2
 1675+ BTW if there's exactly one ]] that's fine, we'll keep looking
 1676+ text HAS MOAR "[[{$m[0]}]]{$m[1]}";
 1677+ NOWAI
 1678+ BTW if $next_line is invalid too, we need look no further
 1679+ text HAS MOAR '[[' . $next_line;
 1680+ break;
 1681+ KTHX
 1682+ KTHX
 1683+ IZ !$found
 1684+ BTW we couldn't find the end of this imageLink, so output it raw
 1685+ BTW but don't ignore what might be perfectly normal links in the text we've examined
 1686+ $holders->merge( $this->replaceInternalLinks2( $text ) );
 1687+ s HAS MOAR "{$prefix}[[$link|$text";
 1688+ BTW note: no $trail, because without an end, there *is* no trail
 1689+ IM ON UR wfProfileOut DOING __METHOD__."-might_be_img"
 1690+ continue;
 1691+ KTHX
 1692+ NOWAI # it's not an image, so output it raw
 1693+ s HAS MOAR "{$prefix}[[$link|$text";
 1694+ BTW note: no $trail, because without an end, there *is* no trail
 1695+ IM ON UR wfProfileOut DOING __METHOD__."-might_be_img"
 1696+ continue;
 1697+ KTHX
 1698+ IM ON UR wfProfileOut DOING __METHOD__."-might_be_img"
 1699+ KTHX
 1700+
 1701+ I HAS wasblank IZ ( $text == '' )
 1702+ IZ $wasblank
 1703+ I HAS text IZ $link
 1704+ KTHX
 1705+
 1706+ BTW Link not escaped by : , create the various objects
 1707+ IZ $noforce
 1708+
 1709+ BTW Interwikis
 1710+ IM ON UR wfProfileIn DOING __METHOD__."-interwiki"
 1711+ IZ $iw && $this->mOptions->getInterwikiMagic() && $nottalk && $wgContLang->getLanguageName( $iw )
 1712+ IM ON UR SPECIAL mOutput->addLanguageLink DOING $nt->getFullText()
 1713+ I HAS s IZ rtrim( $s . $prefix )
 1714+ s HAS MOAR trim( $trail, "\n" ) == '' ? '': $prefix . $trail;
 1715+ IM ON UR wfProfileOut DOING __METHOD__."-interwiki"
 1716+ continue;
 1717+ KTHX
 1718+ IM ON UR wfProfileOut DOING __METHOD__."-interwiki"
 1719+
 1720+ IZ $ns == NS_FILE
 1721+ IM ON UR wfProfileIn DOING __METHOD__."-image"
 1722+ IZ !wfIsBadImage( $nt->getDBkey(), $this->mTitle )
 1723+ IZ $wasblank
 1724+ BTW if no parameters were passed, $text
 1725+ BTW becomes something like "File:Foo.png",
 1726+ BTW which we don't want to pass on to the
 1727+ BTW image generator
 1728+ I HAS text IZ ''
 1729+ NOWAI
 1730+ BTW recursively parse links inside the image caption
 1731+ BTW actually, this will parse them in any other parameters, too,
 1732+ BTW but it might be hard to fix that, and it doesn't matter ATM
 1733+ I HAS text IZ $this->replaceExternalLinks( $text )
 1734+ $holders->merge( $this->replaceInternalLinks2( $text ) );
 1735+ KTHX
 1736+ BTW cloak any absolute URLs inside the image markup, so replaceExternalLinks() won't touch them
 1737+ s HAS MOAR $prefix . $this->armorLinks( $this->makeImage( $nt, $text, $holders ) ) . $trail;
 1738+ NOWAI
 1739+ s HAS MOAR $prefix . $trail;
 1740+ KTHX
 1741+ IM ON UR SPECIAL mOutput->addImage DOING $nt->getDBkey()
 1742+ IM ON UR wfProfileOut DOING __METHOD__."-image"
 1743+ continue;
 1744+
 1745+ KTHX
 1746+
 1747+ IZ $ns == NS_CATEGORY
 1748+ IM ON UR wfProfileIn DOING __METHOD__."-category"
 1749+ I HAS s IZ rtrim( $s . "\n" ) # bug 87
 1750+
 1751+ IZ $wasblank
 1752+ I HAS sortkey IZ $this->getDefaultSort()
 1753+ NOWAI
 1754+ I HAS sortkey IZ $text
 1755+ KTHX
 1756+ I HAS sortkey IZ Sanitizer::decodeCharReferences( $sortkey )
 1757+ I HAS sortkey IZ str_replace( "\n", '', $sortkey )
 1758+ I HAS sortkey IZ $wgContLang->convertCategoryKey( $sortkey )
 1759+ IM ON UR SPECIAL mOutput->addCategory DOING $nt->getDBkey(), $sortkey
 1760+
 1761+ DO NOT WANT
 1762+ NOT WANT Strip the whitespace Category links produce, see bug 87
 1763+ NOT WANT @todo We might want to use trim($tmp, "\n") here.
 1764+ WANT
 1765+ s HAS MOAR trim( $prefix . $trail, "\n" ) == '' ? '': $prefix . $trail;
 1766+
 1767+ IM ON UR wfProfileOut DOING __METHOD__."-category"
 1768+ continue;
 1769+ KTHX
 1770+ KTHX
 1771+
 1772+ BTW Self-link checking
 1773+ IZ $nt->getFragment() === '' && $ns != NS_SPECIAL
 1774+ IZ in_array( $nt->getPrefixedText(), $selflink, true )
 1775+ s HAS MOAR $prefix . $sk->makeSelfLinkObj( $nt, $text, '', $trail );
 1776+ continue;
 1777+ KTHX
 1778+ KTHX
 1779+
 1780+ BTW NS_MEDIA is a pseudo-namespace for linking directly to a file
 1781+ BTW FIXME: Should do batch file existence checks, see comment below
 1782+ IZ $ns == NS_MEDIA
 1783+ IM ON UR wfProfileIn DOING __METHOD__."-media"
 1784+ BTW Give extensions a chance to select the file revision for us
 1785+ I HAS skip IZ $time = false
 1786+ IM ON UR wfRunHooks DOING 'BeforeParserMakeImageLinkObj', array( &$this, &$nt, &$skip, &$time )
 1787+ IZ $skip
 1788+ I HAS link IZ $sk->link( $nt )
 1789+ NOWAI
 1790+ I HAS link IZ $sk->makeMediaLinkObj( $nt, $text, $time )
 1791+ KTHX
 1792+ BTW Cloak with NOPARSE to avoid replacement in replaceExternalLinks
 1793+ s HAS MOAR $prefix . $this->armorLinks( $link ) . $trail;
 1794+ IM ON UR SPECIAL mOutput->addImage DOING $nt->getDBkey()
 1795+ IM ON UR wfProfileOut DOING __METHOD__."-media"
 1796+ continue;
 1797+ KTHX
 1798+
 1799+ IM ON UR wfProfileIn DOING __METHOD__."-always_known"
 1800+ BTW Some titles, such as valid special pages or files in foreign repos, should
 1801+ BTW be shown as bluelinks even though they're not included in the page table
 1802+ BTW
 1803+ BTW FIXME: isAlwaysKnown() can be expensive for file links; we should really do
 1804+ BTW batch file existence checks for NS_FILE and NS_MEDIA
 1805+ IZ $iw == '' && $nt->isAlwaysKnown()
 1806+ IM ON UR SPECIAL mOutput->addLink DOING $nt
 1807+ s HAS MOAR $this->makeKnownLinkHolder( $nt, $text, '', $trail, $prefix );
 1808+ NOWAI
 1809+ BTW Links will be added to the output link list after checking
 1810+ s HAS MOAR $holders->makeHolder( $nt, $text, '', $trail, $prefix );
 1811+ KTHX
 1812+ IM ON UR wfProfileOut DOING __METHOD__."-always_known"
 1813+ KTHX
 1814+ IM ON UR wfProfileOut DOING __METHOD__
 1815+ I FOUND MAH $holders
 1816+ KTHX
 1817+
 1818+ DO NOT WANT
 1819+ NOT WANT Make a link placeholder. The text returned can be later resolved to a real link with
 1820+ NOT WANT replaceLinkHolders(). This is done for two reasons: firstly to avoid further
 1821+ NOT WANT parsing of interwiki links, and secondly to allow all existence checks and
 1822+ NOT WANT article length checks (for stub links) to be bundled into a single query.
 1823+ NOT WANT
 1824+ NOT WANT @deprecated
 1825+ WANT
 1826+ SO IM LIKE makeLinkHolder WITH UR &$nt, $text = '', $query = '', $trail = '', $prefix = ''
 1827+ I FOUND MAH $this->mLinkHolders->makeHolder( $nt, $text, $query, $trail, $prefix )
 1828+ KTHX
 1829+
 1830+ DO NOT WANT
 1831+ NOT WANT Render a forced-blue link inline; protect against double expansion of
 1832+ NOT WANT URLs if we're in a mode that prepends full URL prefixes to internal links.
 1833+ NOT WANT Since this little disaster has to split off the trail text to avoid
 1834+ NOT WANT breaking URLs in the following text without breaking trails on the
 1835+ NOT WANT wiki links, it's been made into a horrible function.
 1836+ NOT WANT
 1837+ NOT WANT @param Title $nt
 1838+ NOT WANT @param string $text
 1839+ NOT WANT @param string $query
 1840+ NOT WANT @param string $trail
 1841+ NOT WANT @param string $prefix
 1842+ NOT WANT @return string HTML-wikitext mix oh yuck
 1843+ WANT
 1844+ SO IM LIKE makeKnownLinkHolder WITH UR $nt, $text = '', $query = '', $trail = '', $prefix = ''
 1845+ IM ON UR list DOING $inside, $trail ) = Linker::splitTrail( $trail
 1846+ I HAS sk IZ $this->mOptions->getSkin()
 1847+ BTW FIXME: use link() instead of deprecated makeKnownLinkObj()
 1848+ I HAS link IZ $sk->makeKnownLinkObj( $nt, $text, $query, $inside, $prefix )
 1849+ I FOUND MAH $this->armorLinks( $link ) . $trail
 1850+ KTHX
 1851+
 1852+ DO NOT WANT
 1853+ NOT WANT Insert a NOPARSE hacky thing into any inline links in a chunk that's
 1854+ NOT WANT going to go through further parsing steps before inline URL expansion.
 1855+ NOT WANT
 1856+ NOT WANT Not needed quite as much as it used to be since free links are a bit
 1857+ NOT WANT more sensible these days. But bracketed links are still an issue.
 1858+ NOT WANT
 1859+ NOT WANT @param string more-or-less HTML
 1860+ NOT WANT @return string less-or-more HTML with NOPARSE bits
 1861+ WANT
 1862+ SO IM LIKE armorLinks WITH UR $text
 1863+ return preg_replace( '/\b(' . wfUrlProtocols() . ')/',
 1864+ "{$this->mUniqPrefix}NOPARSE$1", $text );
 1865+ KTHX
 1866+
 1867+ DO NOT WANT
 1868+ NOT WANT Return true if subpage links should be expanded on this page.
 1869+ NOT WANT @return bool
 1870+ WANT
 1871+ SO IM LIKE areSubpagesAllowed
 1872+ BTW Some namespaces don't allow subpages
 1873+ I FOUND MAH MWNamespace::hasSubpages( $this->mTitle->getNamespace() )
 1874+ KTHX
 1875+
 1876+ DO NOT WANT
 1877+ NOT WANT Handle link to subpage if necessary
 1878+ NOT WANT @param string $target the source of the link
 1879+ NOT WANT @param string &$text the link text, modified as necessary
 1880+ NOT WANT @return string the full name of the link
 1881+ NOT WANT @private
 1882+ WANT
 1883+ SO IM LIKE maybeDoSubpageLink WITH UR $target, &$text
 1884+ I FOUND MAH Linker::normalizeSubpageLink( $this->mTitle, $target, $text )
 1885+ KTHX
 1886+
 1887+ DO NOT WANT#@+
 1888+ NOT WANT Used by doBlockLevels()
 1889+ NOT WANT @private
 1890+ WANT
 1891+ SO IM LIKE closeParagraph
 1892+ I HAS result IZ ''
 1893+ IZ $this->mLastSection != ''
 1894+ I HAS result IZ '</' . $this->mLastSection . ">\n"
 1895+ KTHX
 1896+ UR SPECIAL mInPre IZ false;
 1897+ UR SPECIAL mLastSection IZ '';
 1898+ I FOUND MAH $result
 1899+ KTHX
 1900+ DO NOT WANT
 1901+ NOT WANT getCommon() returns the length of the longest common substring
 1902+ NOT WANT of both arguments, starting at the beginning of both.
 1903+ NOT WANT @private
 1904+ WANT
 1905+ SO IM LIKE getCommon WITH UR $st1, $st2
 1906+ I HAS fl IZ strlen( $st1 )
 1907+ I HAS shorter IZ strlen( $st2 )
 1908+ IZ $fl < $shorter
 1909+ I HAS shorter IZ $fl
 1910+ KTHX
 1911+
 1912+ for ( $i = 0; $i < $shorter; ++$i ) {
 1913+ IZ $st1{$i} != $st2{$i}
 1914+ break;
 1915+ KTHX
 1916+ KTHX
 1917+ I FOUND MAH $i
 1918+ KTHX
 1919+ DO NOT WANT
 1920+ NOT WANT These next three functions open, continue, and close the list
 1921+ NOT WANT element appropriate to the prefix character passed into them.
 1922+ NOT WANT @private
 1923+ WANT
 1924+ SO IM LIKE openList WITH UR $char
 1925+ I HAS result IZ $this->closeParagraph()
 1926+
 1927+ IZ '*' === $char
 1928+ result HAS MOAR '<ul><li>';
 1929+ ORLY '#' === $char
 1930+ result HAS MOAR '<ol><li>';
 1931+ ORLY ':' === $char
 1932+ result HAS MOAR '<dl><dd>';
 1933+ ORLY ';' === $char
 1934+ result HAS MOAR '<dl><dt>';
 1935+ UR SPECIAL mDTopen IZ true;
 1936+ NOWAI
 1937+ I HAS result IZ '<!-- ERR 1 -->'
 1938+ KTHX
 1939+
 1940+ I FOUND MAH $result
 1941+ KTHX
 1942+
 1943+ DO NOT WANT
 1944+ NOT WANT TODO: document
 1945+ NOT WANT @param $char String
 1946+ NOT WANT @private
 1947+ WANT
 1948+ SO IM LIKE nextItem WITH UR $char
 1949+ IZ '*' === $char || '#' === $char
 1950+ I FOUND MAH '</li><li>'
 1951+ ORLY ':' === $char || ';' === $char
 1952+ I HAS close IZ '</dd>'
 1953+ IZ $this->mDTopen
 1954+ I HAS close IZ '</dt>'
 1955+ KTHX
 1956+ IZ ';' === $char
 1957+ UR SPECIAL mDTopen IZ true;
 1958+ I FOUND MAH $close . '<dt>'
 1959+ NOWAI
 1960+ UR SPECIAL mDTopen IZ false;
 1961+ I FOUND MAH $close . '<dd>'
 1962+ KTHX
 1963+ KTHX
 1964+ I FOUND MAH '<!-- ERR 2 -->'
 1965+ KTHX
 1966+
 1967+ DO NOT WANT
 1968+ NOT WANT TODO: document
 1969+ NOT WANT @param $char String
 1970+ NOT WANT @private
 1971+ WANT
 1972+ SO IM LIKE closeList WITH UR $char
 1973+ IZ '*' === $char
 1974+ I HAS text IZ '</li></ul>'
 1975+ ORLY '#' === $char
 1976+ I HAS text IZ '</li></ol>'
 1977+ ORLY ':' === $char
 1978+ IZ $this->mDTopen
 1979+ UR SPECIAL mDTopen IZ false;
 1980+ I HAS text IZ '</dt></dl>'
 1981+ NOWAI
 1982+ I HAS text IZ '</dd></dl>'
 1983+ KTHX
 1984+ NOWAI
 1985+ I FOUND MAH '<!-- ERR 3 -->'
 1986+ KTHX
 1987+ I FOUND MAH $text."\n"
 1988+ KTHX
 1989+ DO NOT WANT#@-*/
 1990+
 1991+ DO NOT WANT
 1992+ NOT WANT Make lists from lines starting with ':', '*', '#', etc. (DBL)
 1993+ NOT WANT
 1994+ NOT WANT @param $linestart bool whether or not this is at the start of a line.
 1995+ NOT WANT @private
 1996+ NOT WANT @return string the lists rendered as HTML
 1997+ WANT
 1998+ SO IM LIKE doBlockLevels WITH UR $text, $linestart
 1999+ IM ON UR wfProfileIn DOING __METHOD__
 2000+
 2001+ BTW Parsing through the text line by line. The main thing
 2002+ BTW happening here is handling of block-level elements p, pre,
 2003+ BTW and making lists from lines starting with * # : etc.
 2004+ BTW
 2005+ I HAS textLines IZ StringUtils::explode( "\n", $text )
 2006+
 2007+ I HAS lastPrefix IZ $output = ''
 2008+ UR SPECIAL mDTopen IZ $inBlockElem = false;
 2009+ I HAS prefixLength IZ 0
 2010+ I HAS paragraphStack IZ false
 2011+
 2012+ IM IN UR textLines ITZA oLine
 2013+ BTW Fix up $linestart
 2014+ IZ !$linestart
 2015+ output HAS MOAR $oLine;
 2016+ I HAS linestart IZ true
 2017+ continue;
 2018+ KTHX
 2019+ BTW * = ul
 2020+ BTW # = ol
 2021+ BTW ; = dt
 2022+ BTW : = dd
 2023+
 2024+ I HAS lastPrefixLength IZ strlen( $lastPrefix )
 2025+ I HAS preCloseMatch IZ preg_match( '/<\\/pre/i', $oLine )
 2026+ I HAS preOpenMatch IZ preg_match( '/<pre/i', $oLine )
 2027+ BTW If not in a <pre> element, scan for and figure out what prefixes are there.
 2028+ IZ !$this->mInPre
 2029+ BTW Multiple prefixes may abut each other for nested lists.
 2030+ I HAS prefixLength IZ strspn( $oLine, '*#:;' )
 2031+ I HAS prefix IZ substr( $oLine, 0, $prefixLength )
 2032+
 2033+ BTW eh?
 2034+ BTW ; and : are both from definition-lists, so they're equivalent
 2035+ BTW for the purposes of determining whether or not we need to open/close
 2036+ BTW elements.
 2037+ I HAS prefix2 IZ str_replace( ';', ':', $prefix )
 2038+ I HAS t IZ substr( $oLine, $prefixLength )
 2039+ UR SPECIAL mInPre IZ (bool)$preOpenMatch;
 2040+ NOWAI
 2041+ BTW Don't interpret any other prefixes in preformatted text
 2042+ I HAS prefixLength IZ 0
 2043+ I HAS prefix IZ $prefix2 = ''
 2044+ I HAS t IZ $oLine
 2045+ KTHX
 2046+
 2047+ BTW List generation
 2048+ IZ $prefixLength && $lastPrefix === $prefix2
 2049+ BTW Same as the last item, so no need to deal with nesting or opening stuff
 2050+ output HAS MOAR $this->nextItem( substr( $prefix, -1 ) );
 2051+ I HAS paragraphStack IZ false
 2052+
 2053+ if ( substr( $prefix, -1 ) === ';') {
 2054+ BTW The one nasty exception: definition lists work like this:
 2055+ BTW ; title : definition text
 2056+ BTW So we check for : in the remainder text to split up the
 2057+ BTW title and definition, without b0rking links.
 2058+ I HAS term IZ $t2 = ''
 2059+ IZ $this->findColonNoLinks( $t, $term, $t2 ) !== false
 2060+ I HAS t IZ $t2
 2061+ output HAS MOAR $term . $this->nextItem( ':' );
 2062+ KTHX
 2063+ KTHX
 2064+ ORLY $prefixLength || $lastPrefixLength
 2065+ BTW We need to open or close prefixes, or both.
 2066+
 2067+ BTW Either open or close a level...
 2068+ I HAS commonPrefixLength IZ $this->getCommon( $prefix, $lastPrefix )
 2069+ I HAS paragraphStack IZ false
 2070+
 2071+ BTW Close all the prefixes which aren't shared.
 2072+ STEALIN UR $commonPrefixLength < $lastPrefixLength
 2073+ output HAS MOAR $this->closeList( $lastPrefix[$lastPrefixLength-1] );
 2074+ --$lastPrefixLength;
 2075+ KTHX
 2076+
 2077+ BTW Continue the current prefix if appropriate.
 2078+ IZ $prefixLength <= $commonPrefixLength && $commonPrefixLength > 0
 2079+ output HAS MOAR $this->nextItem( $prefix[$commonPrefixLength-1] );
 2080+ KTHX
 2081+
 2082+ BTW Open prefixes where appropriate.
 2083+ STEALIN UR $prefixLength > $commonPrefixLength
 2084+ I HAS char IZ substr( $prefix, $commonPrefixLength, 1 )
 2085+ output HAS MOAR $this->openList( $char );
 2086+
 2087+ IZ ';' === $char
 2088+ BTW FIXME: This is dupe of code above
 2089+ IZ $this->findColonNoLinks( $t, $term, $t2 ) !== false
 2090+ I HAS t IZ $t2
 2091+ output HAS MOAR $term . $this->nextItem( ':' );
 2092+ KTHX
 2093+ KTHX
 2094+ ++$commonPrefixLength;
 2095+ KTHX
 2096+ I HAS lastPrefix IZ $prefix2
 2097+ KTHX
 2098+
 2099+ BTW If we have no prefixes, go to paragraph mode.
 2100+ IZ 0 == $prefixLength
 2101+ IM ON UR wfProfileIn DOING __METHOD__."-paragraph"
 2102+ BTW No prefix (not in list)--go to paragraph mode
 2103+ BTW XXX: use a stack for nestable elements like span, table and div
 2104+ I HAS openmatch IZ preg_match('/(?:<table|<blockquote|<h1|<h2|<h3|<h4|<h5|<h6|<pre|<tr|<p|<ul|<ol|<li|<\\/tr|<\\/td|<\\/th)/iS', $t )
 2105+ closematch IZ preg_match(
 2106+ '/(?:<\\/table|<\\/blockquote|<\\/h1|<\\/h2|<\\/h3|<\\/h4|<\\/h5|<\\/h6|'.
 2107+ '<td|<th|<\\/?div|<hr|<\\/pre|<\\/p|'.$this->mUniqPrefix.'-pre|<\\/li|<\\/ul|<\\/ol|<\\/?center)/iS', $t );
 2108+ IZ $openmatch or $closematch
 2109+ I HAS paragraphStack IZ false
 2110+ # TODO bug 5718: paragraph closed
 2111+ output HAS MOAR $this->closeParagraph();
 2112+ IZ $preOpenMatch and !$preCloseMatch
 2113+ UR SPECIAL mInPre IZ true;
 2114+ KTHX
 2115+ IZ $closematch
 2116+ I HAS inBlockElem IZ false
 2117+ NOWAI
 2118+ I HAS inBlockElem IZ true
 2119+ KTHX
 2120+ ORLY !$inBlockElem && !$this->mInPre
 2121+ IZ ' ' == substr( $t, 0, 1 ) and ( $this->mLastSection === 'pre' || trim( $t ) != '' )
 2122+ BTW pre
 2123+ IZ $this->mLastSection !== 'pre'
 2124+ I HAS paragraphStack IZ false
 2125+ output HAS MOAR $this->closeParagraph().'<pre>';
 2126+ UR SPECIAL mLastSection IZ 'pre';
 2127+ KTHX
 2128+ I HAS t IZ substr( $t, 1 )
 2129+ NOWAI
 2130+ BTW paragraph
 2131+ IZ trim( $t ) == ''
 2132+ IZ $paragraphStack
 2133+ output HAS MOAR $paragraphStack.'<br />';
 2134+ I HAS paragraphStack IZ false
 2135+ UR SPECIAL mLastSection IZ 'p';
 2136+ NOWAI
 2137+ IZ $this->mLastSection !== 'p'
 2138+ output HAS MOAR $this->closeParagraph();
 2139+ UR SPECIAL mLastSection IZ '';
 2140+ I HAS paragraphStack IZ '<p>'
 2141+ NOWAI
 2142+ I HAS paragraphStack IZ '</p><p>'
 2143+ KTHX
 2144+ KTHX
 2145+ NOWAI
 2146+ IZ $paragraphStack
 2147+ output HAS MOAR $paragraphStack;
 2148+ I HAS paragraphStack IZ false
 2149+ UR SPECIAL mLastSection IZ 'p';
 2150+ ORLY $this->mLastSection !== 'p'
 2151+ output HAS MOAR $this->closeParagraph().'<p>';
 2152+ UR SPECIAL mLastSection IZ 'p';
 2153+ KTHX
 2154+ KTHX
 2155+ KTHX
 2156+ KTHX
 2157+ IM ON UR wfProfileOut DOING __METHOD__."-paragraph"
 2158+ KTHX
 2159+ BTW somewhere above we forget to get out of pre block (bug 785)
 2160+ IZ $preCloseMatch && $this->mInPre
 2161+ UR SPECIAL mInPre IZ false;
 2162+ KTHX
 2163+ IZ $paragraphStack === false
 2164+ output HAS MOAR $t."\n";
 2165+ KTHX
 2166+ KTHX
 2167+ STEALIN UR $prefixLength
 2168+ output HAS MOAR $this->closeList( $prefix2[$prefixLength-1] );
 2169+ --$prefixLength;
 2170+ KTHX
 2171+ IZ $this->mLastSection != ''
 2172+ output HAS MOAR '</' . $this->mLastSection . '>';
 2173+ UR SPECIAL mLastSection IZ '';
 2174+ KTHX
 2175+
 2176+ IM ON UR wfProfileOut DOING __METHOD__
 2177+ I FOUND MAH $output
 2178+ KTHX
 2179+
 2180+ DO NOT WANT
 2181+ NOT WANT Split up a string on ':', ignoring any occurences inside tags
 2182+ NOT WANT to prevent illegal overlapping.
 2183+ NOT WANT @param string $str the string to split
 2184+ NOT WANT @param string &$before set to everything before the ':'
 2185+ NOT WANT @param string &$after set to everything after the ':'
 2186+ NOT WANT return string the position of the ':', or false if none found
 2187+ WANT
 2188+ SO IM LIKE findColonNoLinks WITH UR $str, &$before, &$after
 2189+ IM ON UR wfProfileIn DOING __METHOD__
 2190+
 2191+ I HAS pos IZ strpos( $str, ':' )
 2192+ IZ $pos === false
 2193+ BTW Nothing to find!
 2194+ IM ON UR wfProfileOut DOING __METHOD__
 2195+ I FOUND MAH false
 2196+ KTHX
 2197+
 2198+ I HAS lt IZ strpos( $str, '<' )
 2199+ IZ $lt === false || $lt > $pos
 2200+ BTW Easy; no tag nesting to worry about
 2201+ I HAS before IZ substr( $str, 0, $pos )
 2202+ I HAS after IZ substr( $str, $pos+1 )
 2203+ IM ON UR wfProfileOut DOING __METHOD__
 2204+ I FOUND MAH $pos
 2205+ KTHX
 2206+
 2207+ BTW Ugly state machine to walk through avoiding tags.
 2208+ I HAS state IZ self::COLON_STATE_TEXT
 2209+ I HAS stack IZ 0
 2210+ I HAS len IZ strlen( $str )
 2211+ for( $i = 0; $i < $len; $i++ ) {
 2212+ I HAS c IZ $str{$i}
 2213+
 2214+ switch( $state ) {
 2215+ BTW (Using the number is a performance hack for common cases)
 2216+ case 0: # self::COLON_STATE_TEXT:
 2217+ switch( $c ) {
 2218+ case "<":
 2219+ BTW Could be either a <start> tag or an </end> tag
 2220+ I HAS state IZ self::COLON_STATE_TAGSTART
 2221+ break;
 2222+ case ":":
 2223+ IZ $stack == 0
 2224+ BTW We found it!
 2225+ I HAS before IZ substr( $str, 0, $i )
 2226+ I HAS after IZ substr( $str, $i + 1 )
 2227+ IM ON UR wfProfileOut DOING __METHOD__
 2228+ I FOUND MAH $i
 2229+ KTHX
 2230+ BTW Embedded in a tag; don't break it.
 2231+ break;
 2232+ default:
 2233+ BTW Skip ahead looking for something interesting
 2234+ I HAS colon IZ strpos( $str, ':', $i )
 2235+ IZ $colon === false
 2236+ BTW Nothing else interesting
 2237+ IM ON UR wfProfileOut DOING __METHOD__
 2238+ I FOUND MAH false
 2239+ KTHX
 2240+ I HAS lt IZ strpos( $str, '<', $i )
 2241+ IZ $stack === 0
 2242+ IZ $lt === false || $colon < $lt
 2243+ BTW We found it!
 2244+ I HAS before IZ substr( $str, 0, $colon )
 2245+ I HAS after IZ substr( $str, $colon + 1 )
 2246+ IM ON UR wfProfileOut DOING __METHOD__
 2247+ I FOUND MAH $i
 2248+ KTHX
 2249+ KTHX
 2250+ IZ $lt === false
 2251+ BTW Nothing else interesting to find; abort!
 2252+ BTW We're nested, but there's no close tags left. Abort!
 2253+ break 2;
 2254+ KTHX
 2255+ BTW Skip ahead to next tag start
 2256+ I HAS i IZ $lt
 2257+ I HAS state IZ self::COLON_STATE_TAGSTART
 2258+ KTHX
 2259+ break;
 2260+ case 1: # self::COLON_STATE_TAG:
 2261+ BTW In a <tag>
 2262+ switch( $c ) {
 2263+ case ">":
 2264+ $stack++;
 2265+ I HAS state IZ self::COLON_STATE_TEXT
 2266+ break;
 2267+ case "/":
 2268+ BTW Slash may be followed by >?
 2269+ I HAS state IZ self::COLON_STATE_TAGSLASH
 2270+ break;
 2271+ default:
 2272+ BTW ignore
 2273+ KTHX
 2274+ break;
 2275+ case 2: # self::COLON_STATE_TAGSTART:
 2276+ switch( $c ) {
 2277+ case "/":
 2278+ I HAS state IZ self::COLON_STATE_CLOSETAG
 2279+ break;
 2280+ case "!":
 2281+ I HAS state IZ self::COLON_STATE_COMMENT
 2282+ break;
 2283+ case ">":
 2284+ BTW Illegal early close? This shouldn't happen D:
 2285+ I HAS state IZ self::COLON_STATE_TEXT
 2286+ break;
 2287+ default:
 2288+ I HAS state IZ self::COLON_STATE_TAG
 2289+ KTHX
 2290+ break;
 2291+ case 3: # self::COLON_STATE_CLOSETAG:
 2292+ BTW In a </tag>
 2293+ IZ $c === ">"
 2294+ I HAS stack--
 2295+ IZ $stack < 0
 2296+ IM ON UR wfDebug DOING __METHOD__.": Invalid input; too many close tags\n"
 2297+ IM ON UR wfProfileOut DOING __METHOD__
 2298+ I FOUND MAH false
 2299+ KTHX
 2300+ I HAS state IZ self::COLON_STATE_TEXT
 2301+ KTHX
 2302+ break;
 2303+ case self::COLON_STATE_TAGSLASH:
 2304+ IZ $c === ">"
 2305+ BTW Yes, a self-closed tag <blah/>
 2306+ I HAS state IZ self::COLON_STATE_TEXT
 2307+ NOWAI
 2308+ BTW Probably we're jumping the gun, and this is an attribute
 2309+ I HAS state IZ self::COLON_STATE_TAG
 2310+ KTHX
 2311+ break;
 2312+ case 5: # self::COLON_STATE_COMMENT:
 2313+ IZ $c === "-"
 2314+ I HAS state IZ self::COLON_STATE_COMMENTDASH
 2315+ KTHX
 2316+ break;
 2317+ case self::COLON_STATE_COMMENTDASH:
 2318+ IZ $c === "-"
 2319+ I HAS state IZ self::COLON_STATE_COMMENTDASHDASH
 2320+ NOWAI
 2321+ I HAS state IZ self::COLON_STATE_COMMENT
 2322+ KTHX
 2323+ break;
 2324+ case self::COLON_STATE_COMMENTDASHDASH:
 2325+ IZ $c === ">"
 2326+ I HAS state IZ self::COLON_STATE_TEXT
 2327+ NOWAI
 2328+ I HAS state IZ self::COLON_STATE_COMMENT
 2329+ KTHX
 2330+ break;
 2331+ default:
 2332+ throw new MWException( "State machine error in " . __METHOD__ );
 2333+ KTHX
 2334+ KTHX
 2335+ IZ $stack > 0
 2336+ IM ON UR wfDebug DOING __METHOD__.": Invalid input; not enough close tags (stack $stack, state $state)\n"
 2337+ I FOUND MAH false
 2338+ KTHX
 2339+ IM ON UR wfProfileOut DOING __METHOD__
 2340+ I FOUND MAH false
 2341+ KTHX
 2342+
 2343+ DO NOT WANT
 2344+ NOT WANT Return value of a magic variable (like PAGENAME)
 2345+ NOT WANT
 2346+ NOT WANT @private
 2347+ WANT
 2348+ SO IM LIKE getVariableValue WITH UR $index, $frame=false
 2349+ I HAS UR $wgContLang, $wgSitename, $wgServer, $wgServerName ON UR INTERNETS
 2350+ I HAS UR $wgScriptPath, $wgStylePath ON UR INTERNETS
 2351+
 2352+ DO NOT WANT
 2353+ NOT WANT Some of these require message or data lookups and can be
 2354+ NOT WANT expensive to check many times.
 2355+ WANT
 2356+ IZ wfRunHooks( 'ParserGetVariableValueVarCache', array( &$this, &$this->mVarCache ) )
 2357+ IZ isset( $this->mVarCache[$index] )
 2358+ I FOUND MAH $this->mVarCache[$index]
 2359+ KTHX
 2360+ KTHX
 2361+
 2362+ I HAS ts IZ wfTimestamp( TS_UNIX, $this->mOptions->getTimestamp() )
 2363+ IM ON UR wfRunHooks DOING 'ParserGetVariableValueTs', array( &$this, &$ts )
 2364+
 2365+ BTW Use the time zone
 2366+ I HAS UR $wgLocaltimezone ON UR INTERNETS
 2367+ IZ isset( $wgLocaltimezone )
 2368+ I HAS oldtz IZ date_default_timezone_get()
 2369+ IM ON UR date_default_timezone_set DOING $wgLocaltimezone
 2370+ KTHX
 2371+
 2372+ I HAS localTimestamp IZ date( 'YmdHis', $ts )
 2373+ I HAS localMonth IZ date( 'm', $ts )
 2374+ I HAS localMonth1 IZ date( 'n', $ts )
 2375+ I HAS localMonthName IZ date( 'n', $ts )
 2376+ I HAS localDay IZ date( 'j', $ts )
 2377+ I HAS localDay2 IZ date( 'd', $ts )
 2378+ I HAS localDayOfWeek IZ date( 'w', $ts )
 2379+ I HAS localWeek IZ date( 'W', $ts )
 2380+ I HAS localYear IZ date( 'Y', $ts )
 2381+ I HAS localHour IZ date( 'H', $ts )
 2382+ IZ isset( $wgLocaltimezone )
 2383+ IM ON UR date_default_timezone_set DOING $oldtz
 2384+ KTHX
 2385+
 2386+ switch ( $index ) {
 2387+ case 'currentmonth':
 2388+ I HAS value IZ $wgContLang->formatNum( gmdate( 'm', $ts ) )
 2389+ break;
 2390+ case 'currentmonth1':
 2391+ I HAS value IZ $wgContLang->formatNum( gmdate( 'n', $ts ) )
 2392+ break;
 2393+ case 'currentmonthname':
 2394+ I HAS value IZ $wgContLang->getMonthName( gmdate( 'n', $ts ) )
 2395+ break;
 2396+ case 'currentmonthnamegen':
 2397+ I HAS value IZ $wgContLang->getMonthNameGen( gmdate( 'n', $ts ) )
 2398+ break;
 2399+ case 'currentmonthabbrev':
 2400+ I HAS value IZ $wgContLang->getMonthAbbreviation( gmdate( 'n', $ts ) )
 2401+ break;
 2402+ case 'currentday':
 2403+ I HAS value IZ $wgContLang->formatNum( gmdate( 'j', $ts ) )
 2404+ break;
 2405+ case 'currentday2':
 2406+ I HAS value IZ $wgContLang->formatNum( gmdate( 'd', $ts ) )
 2407+ break;
 2408+ case 'localmonth':
 2409+ I HAS value IZ $wgContLang->formatNum( $localMonth )
 2410+ break;
 2411+ case 'localmonth1':
 2412+ I HAS value IZ $wgContLang->formatNum( $localMonth1 )
 2413+ break;
 2414+ case 'localmonthname':
 2415+ I HAS value IZ $wgContLang->getMonthName( $localMonthName )
 2416+ break;
 2417+ case 'localmonthnamegen':
 2418+ I HAS value IZ $wgContLang->getMonthNameGen( $localMonthName )
 2419+ break;
 2420+ case 'localmonthabbrev':
 2421+ I HAS value IZ $wgContLang->getMonthAbbreviation( $localMonthName )
 2422+ break;
 2423+ case 'localday':
 2424+ I HAS value IZ $wgContLang->formatNum( $localDay )
 2425+ break;
 2426+ case 'localday2':
 2427+ I HAS value IZ $wgContLang->formatNum( $localDay2 )
 2428+ break;
 2429+ case 'pagename':
 2430+ I HAS value IZ wfEscapeWikiText( $this->mTitle->getText() )
 2431+ break;
 2432+ case 'pagenamee':
 2433+ I HAS value IZ $this->mTitle->getPartialURL()
 2434+ break;
 2435+ case 'fullpagename':
 2436+ I HAS value IZ wfEscapeWikiText( $this->mTitle->getPrefixedText() )
 2437+ break;
 2438+ case 'fullpagenamee':
 2439+ I HAS value IZ $this->mTitle->getPrefixedURL()
 2440+ break;
 2441+ case 'subpagename':
 2442+ I HAS value IZ wfEscapeWikiText( $this->mTitle->getSubpageText() )
 2443+ break;
 2444+ case 'subpagenamee':
 2445+ I HAS value IZ $this->mTitle->getSubpageUrlForm()
 2446+ break;
 2447+ case 'basepagename':
 2448+ I HAS value IZ wfEscapeWikiText( $this->mTitle->getBaseText() )
 2449+ break;
 2450+ case 'basepagenamee':
 2451+ I HAS value IZ wfUrlEncode( str_replace( ' ', '_', $this->mTitle->getBaseText() ) )
 2452+ break;
 2453+ case 'talkpagename':
 2454+ IZ $this->mTitle->canTalk()
 2455+ I HAS talkPage IZ $this->mTitle->getTalkPage()
 2456+ I HAS value IZ wfEscapeWikiText( $talkPage->getPrefixedText() )
 2457+ NOWAI
 2458+ I HAS value IZ ''
 2459+ KTHX
 2460+ break;
 2461+ case 'talkpagenamee':
 2462+ IZ $this->mTitle->canTalk()
 2463+ I HAS talkPage IZ $this->mTitle->getTalkPage()
 2464+ I HAS value IZ $talkPage->getPrefixedUrl()
 2465+ NOWAI
 2466+ I HAS value IZ ''
 2467+ KTHX
 2468+ break;
 2469+ case 'subjectpagename':
 2470+ I HAS subjPage IZ $this->mTitle->getSubjectPage()
 2471+ I HAS value IZ wfEscapeWikiText( $subjPage->getPrefixedText() )
 2472+ break;
 2473+ case 'subjectpagenamee':
 2474+ I HAS subjPage IZ $this->mTitle->getSubjectPage()
 2475+ I HAS value IZ $subjPage->getPrefixedUrl()
 2476+ break;
 2477+ case 'revisionid':
 2478+ BTW Let the edit saving system know we should parse the page
 2479+ BTW *after* a revision ID has been assigned.
 2480+ IM ON UR SPECIAL mOutput->setFlag DOING 'vary-revision'
 2481+ IM ON UR wfDebug DOING __METHOD__ . ": {{REVISIONID}} used, setting vary-revision...\n"
 2482+ I HAS value IZ $this->mRevisionId
 2483+ break;
 2484+ case 'revisionday':
 2485+ BTW Let the edit saving system know we should parse the page
 2486+ BTW *after* a revision ID has been assigned. This is for null edits.
 2487+ IM ON UR SPECIAL mOutput->setFlag DOING 'vary-revision'
 2488+ IM ON UR wfDebug DOING __METHOD__ . ": {{REVISIONDAY}} used, setting vary-revision...\n"
 2489+ I HAS value IZ intval( substr( $this->getRevisionTimestamp(), 6, 2 ) )
 2490+ break;
 2491+ case 'revisionday2':
 2492+ BTW Let the edit saving system know we should parse the page
 2493+ BTW *after* a revision ID has been assigned. This is for null edits.
 2494+ IM ON UR SPECIAL mOutput->setFlag DOING 'vary-revision'
 2495+ IM ON UR wfDebug DOING __METHOD__ . ": {{REVISIONDAY2}} used, setting vary-revision...\n"
 2496+ I HAS value IZ substr( $this->getRevisionTimestamp(), 6, 2 )
 2497+ break;
 2498+ case 'revisionmonth':
 2499+ BTW Let the edit saving system know we should parse the page
 2500+ BTW *after* a revision ID has been assigned. This is for null edits.
 2501+ IM ON UR SPECIAL mOutput->setFlag DOING 'vary-revision'
 2502+ IM ON UR wfDebug DOING __METHOD__ . ": {{REVISIONMONTH}} used, setting vary-revision...\n"
 2503+ I HAS value IZ intval( substr( $this->getRevisionTimestamp(), 4, 2 ) )
 2504+ break;
 2505+ case 'revisionyear':
 2506+ BTW Let the edit saving system know we should parse the page
 2507+ BTW *after* a revision ID has been assigned. This is for null edits.
 2508+ IM ON UR SPECIAL mOutput->setFlag DOING 'vary-revision'
 2509+ IM ON UR wfDebug DOING __METHOD__ . ": {{REVISIONYEAR}} used, setting vary-revision...\n"
 2510+ I HAS value IZ substr( $this->getRevisionTimestamp(), 0, 4 )
 2511+ break;
 2512+ case 'revisiontimestamp':
 2513+ BTW Let the edit saving system know we should parse the page
 2514+ BTW *after* a revision ID has been assigned. This is for null edits.
 2515+ IM ON UR SPECIAL mOutput->setFlag DOING 'vary-revision'
 2516+ IM ON UR wfDebug DOING __METHOD__ . ": {{REVISIONTIMESTAMP}} used, setting vary-revision...\n"
 2517+ I HAS value IZ $this->getRevisionTimestamp()
 2518+ break;
 2519+ case 'revisionuser':
 2520+ BTW Let the edit saving system know we should parse the page
 2521+ BTW *after* a revision ID has been assigned. This is for null edits.
 2522+ IM ON UR SPECIAL mOutput->setFlag DOING 'vary-revision'
 2523+ IM ON UR wfDebug DOING __METHOD__ . ": {{REVISIONUSER}} used, setting vary-revision...\n"
 2524+ I HAS value IZ $this->getRevisionUser()
 2525+ break;
 2526+ case 'namespace':
 2527+ I HAS value IZ str_replace( '_',' ',$wgContLang->getNsText( $this->mTitle->getNamespace() ) )
 2528+ break;
 2529+ case 'namespacee':
 2530+ I HAS value IZ wfUrlencode( $wgContLang->getNsText( $this->mTitle->getNamespace() ) )
 2531+ break;
 2532+ case 'talkspace':
 2533+ I HAS value IZ $this->mTitle->canTalk() ? str_replace( '_',' ',$this->mTitle->getTalkNsText() ) : ''
 2534+ break;
 2535+ case 'talkspacee':
 2536+ I HAS value IZ $this->mTitle->canTalk() ? wfUrlencode( $this->mTitle->getTalkNsText() ) : ''
 2537+ break;
 2538+ case 'subjectspace':
 2539+ I HAS value IZ $this->mTitle->getSubjectNsText()
 2540+ break;
 2541+ case 'subjectspacee':
 2542+ I HAS value IZ ( wfUrlencode( $this->mTitle->getSubjectNsText() ) )
 2543+ break;
 2544+ case 'currentdayname':
 2545+ I HAS value IZ $wgContLang->getWeekdayName( gmdate( 'w', $ts ) + 1 )
 2546+ break;
 2547+ case 'currentyear':
 2548+ I HAS value IZ $wgContLang->formatNum( gmdate( 'Y', $ts ), true )
 2549+ break;
 2550+ case 'currenttime':
 2551+ I HAS value IZ $wgContLang->time( wfTimestamp( TS_MW, $ts ), false, false )
 2552+ break;
 2553+ case 'currenthour':
 2554+ I HAS value IZ $wgContLang->formatNum( gmdate( 'H', $ts ), true )
 2555+ break;
 2556+ case 'currentweek':
 2557+ BTW @bug 4594 PHP5 has it zero padded, PHP4 does not, cast to
 2558+ BTW int to remove the padding
 2559+ I HAS value IZ $wgContLang->formatNum( (int)gmdate( 'W', $ts ) )
 2560+ break;
 2561+ case 'currentdow':
 2562+ I HAS value IZ $wgContLang->formatNum( gmdate( 'w', $ts ) )
 2563+ break;
 2564+ case 'localdayname':
 2565+ I HAS value IZ $wgContLang->getWeekdayName( $localDayOfWeek + 1 )
 2566+ break;
 2567+ case 'localyear':
 2568+ I HAS value IZ $wgContLang->formatNum( $localYear, true )
 2569+ break;
 2570+ case 'localtime':
 2571+ I HAS value IZ $wgContLang->time( $localTimestamp, false, false )
 2572+ break;
 2573+ case 'localhour':
 2574+ I HAS value IZ $wgContLang->formatNum( $localHour, true )
 2575+ break;
 2576+ case 'localweek':
 2577+ BTW @bug 4594 PHP5 has it zero padded, PHP4 does not, cast to
 2578+ BTW int to remove the padding
 2579+ I HAS value IZ $wgContLang->formatNum( (int)$localWeek )
 2580+ break;
 2581+ case 'localdow':
 2582+ I HAS value IZ $wgContLang->formatNum( $localDayOfWeek )
 2583+ break;
 2584+ case 'numberofarticles':
 2585+ I HAS value IZ $wgContLang->formatNum( SiteStats::articles() )
 2586+ break;
 2587+ case 'numberoffiles':
 2588+ I HAS value IZ $wgContLang->formatNum( SiteStats::images() )
 2589+ break;
 2590+ case 'numberofusers':
 2591+ I HAS value IZ $wgContLang->formatNum( SiteStats::users() )
 2592+ break;
 2593+ case 'numberofactiveusers':
 2594+ I HAS value IZ $wgContLang->formatNum( SiteStats::activeUsers() )
 2595+ break;
 2596+ case 'numberofpages':
 2597+ I HAS value IZ $wgContLang->formatNum( SiteStats::pages() )
 2598+ break;
 2599+ case 'numberofadmins':
 2600+ I HAS value IZ $wgContLang->formatNum( SiteStats::numberingroup( 'sysop' ) )
 2601+ break;
 2602+ case 'numberofedits':
 2603+ I HAS value IZ $wgContLang->formatNum( SiteStats::edits() )
 2604+ break;
 2605+ case 'numberofviews':
 2606+ I HAS value IZ $wgContLang->formatNum( SiteStats::views() )
 2607+ break;
 2608+ case 'currenttimestamp':
 2609+ I HAS value IZ wfTimestamp( TS_MW, $ts )
 2610+ break;
 2611+ case 'localtimestamp':
 2612+ I HAS value IZ $localTimestamp
 2613+ break;
 2614+ case 'currentversion':
 2615+ I HAS value IZ SpecialVersion::getVersion()
 2616+ break;
 2617+ case 'sitename':
 2618+ I FOUND MAH $wgSitename
 2619+ case 'server':
 2620+ I FOUND MAH $wgServer
 2621+ case 'servername':
 2622+ I FOUND MAH $wgServerName
 2623+ case 'scriptpath':
 2624+ I FOUND MAH $wgScriptPath
 2625+ case 'stylepath':
 2626+ I FOUND MAH $wgStylePath
 2627+ case 'directionmark':
 2628+ I FOUND MAH $wgContLang->getDirMark()
 2629+ case 'contentlanguage':
 2630+ I HAS UR $wgContLanguageCode ON UR INTERNETS
 2631+ I FOUND MAH $wgContLanguageCode
 2632+ default:
 2633+ I HAS ret
 2634+ IZ wfRunHooks( 'ParserGetVariableValueSwitch', array( &$this, &$this->mVarCache, &$index, &$ret, &$frame ) )
 2635+ I FOUND MAH $ret
 2636+ NOWAI
 2637+ I FOUND MAH null
 2638+ KTHX
 2639+ KTHX
 2640+
 2641+ if ( $index )
 2642+ $this->mVarCache[$index] = $value;
 2643+
 2644+ I FOUND MAH $value
 2645+ KTHX
 2646+
 2647+ DO NOT WANT
 2648+ NOT WANT initialise the magic variables (like CURRENTMONTHNAME) and substitution modifiers
 2649+ NOT WANT
 2650+ NOT WANT @private
 2651+ WANT
 2652+ SO IM LIKE initialiseVariables
 2653+ IM ON UR wfProfileIn DOING __METHOD__
 2654+ I HAS variableIDs IZ MagicWord::getVariableIDs()
 2655+ I HAS substIDs IZ MagicWord::getSubstIDs()
 2656+
 2657+ UR SPECIAL mVariables IZ new MagicWordArray( $variableIDs );
 2658+ UR SPECIAL mSubstWords IZ new MagicWordArray( $substIDs );
 2659+ IM ON UR wfProfileOut DOING __METHOD__
 2660+ KTHX
 2661+
 2662+ DO NOT WANT
 2663+ NOT WANT Preprocess some wikitext and return the document tree.
 2664+ NOT WANT This is the ghost of replace_variables().
 2665+ NOT WANT
 2666+ NOT WANT @param string $text The text to parse
 2667+ NOT WANT @param integer flags Bitwise combination of:
 2668+ NOT WANT self::PTD_FOR_INCLUSION Handle <noinclude>/<includeonly> as if the text is being
 2669+ NOT WANT included. Default is to assume a direct page view.
 2670+ NOT WANT
 2671+ NOT WANT The generated DOM tree must depend only on the input text and the flags.
 2672+ NOT WANT The DOM tree must be the same in OT_HTML and OT_WIKI mode, to avoid a regression of bug 4899.
 2673+ NOT WANT
 2674+ NOT WANT Any flag added to the $flags parameter here, or any other parameter liable to cause a
 2675+ NOT WANT change in the DOM tree for a given text, must be passed through the section identifier
 2676+ NOT WANT in the section edit link and thus back to extractSections().
 2677+ NOT WANT
 2678+ NOT WANT The output of this function is currently only cached in process memory, but a persistent
 2679+ NOT WANT cache may be implemented at a later date which takes further advantage of these strict
 2680+ NOT WANT dependency requirements.
 2681+ NOT WANT
 2682+ NOT WANT @private
 2683+ WANT
 2684+ SO IM LIKE preprocessToDom WITH UR $text, $flags = 0
 2685+ I HAS dom IZ $this->getPreprocessor()->preprocessToObj( $text, $flags )
 2686+ I FOUND MAH $dom
 2687+ KTHX
 2688+
 2689+ DO NOT WANT
 2690+ NOT WANT Return a three-element array: leading whitespace, string contents, trailing whitespace
 2691+ WANT
 2692+ SO IM ALWAYS LIKE splitWhitespace WITH UR $s
 2693+ I HAS ltrimmed IZ ltrim( $s )
 2694+ I HAS w1 IZ substr( $s, 0, strlen( $s ) - strlen( $ltrimmed ) )
 2695+ I HAS trimmed IZ rtrim( $ltrimmed )
 2696+ I HAS diff IZ strlen( $ltrimmed ) - strlen( $trimmed )
 2697+ IZ $diff > 0
 2698+ I HAS w2 IZ substr( $ltrimmed, -$diff )
 2699+ NOWAI
 2700+ I HAS w2 IZ ''
 2701+ KTHX
 2702+ I FOUND MAH array( $w1, $trimmed, $w2 )
 2703+ KTHX
 2704+
 2705+ DO NOT WANT
 2706+ NOT WANT Replace magic variables, templates, and template arguments
 2707+ NOT WANT with the appropriate text. Templates are substituted recursively,
 2708+ NOT WANT taking care to avoid infinite loops.
 2709+ NOT WANT
 2710+ NOT WANT Note that the substitution depends on value of $mOutputType:
 2711+ NOT WANT self::OT_WIKI: only {{subst:}} templates
 2712+ NOT WANT self::OT_PREPROCESS: templates but not extension tags
 2713+ NOT WANT self::OT_HTML: all templates and extension tags
 2714+ NOT WANT
 2715+ NOT WANT @param string $tex The text to transform
 2716+ NOT WANT @param PPFrame $frame Object describing the arguments passed to the template.
 2717+ NOT WANT Arguments may also be provided as an associative array, as was the usual case before MW1.12.
 2718+ NOT WANT Providing arguments this way may be useful for extensions wishing to perform variable replacement explicitly.
 2719+ NOT WANT @param bool $argsOnly Only do argument (triple-brace) expansion, not double-brace expansion
 2720+ NOT WANT @private
 2721+ WANT
 2722+ SO IM LIKE replaceVariables WITH UR $text, $frame = false, $argsOnly = false
 2723+ BTW Is there any text? Also, Prevent too big inclusions!
 2724+ IZ strlen( $text ) < 1 || strlen( $text ) > $this->mOptions->getMaxIncludeSize()
 2725+ I FOUND MAH $text
 2726+ KTHX
 2727+ IM ON UR wfProfileIn DOING __METHOD__
 2728+
 2729+ IZ $frame === false
 2730+ I HAS frame IZ $this->getPreprocessor()->newFrame()
 2731+ ORLY !( $frame instanceof PPFrame )
 2732+ IM ON UR wfDebug DOING __METHOD__." called using plain parameters instead of a PPFrame instance. Creating custom frame.\n"
 2733+ I HAS frame IZ $this->getPreprocessor()->newCustomFrame( $frame )
 2734+ KTHX
 2735+
 2736+ I HAS dom IZ $this->preprocessToDom( $text )
 2737+ I HAS flags IZ $argsOnly ? PPFrame::NO_TEMPLATES : 0
 2738+ I HAS text IZ $frame->expand( $dom, $flags )
 2739+
 2740+ IM ON UR wfProfileOut DOING __METHOD__
 2741+ I FOUND MAH $text
 2742+ KTHX
 2743+
 2744+ BTW Clean up argument array - refactored in 1.9 so parserfunctions can use it, too.
 2745+ SO IM ALWAYS LIKE createAssocArgs WITH UR $args
 2746+ I HAS assocArgs IZ EMPTY
 2747+ I HAS index IZ 1
 2748+ IM IN UR args ITZA arg
 2749+ I HAS eqpos IZ strpos( $arg, '=' )
 2750+ IZ $eqpos === false
 2751+ $assocArgs[$index++] = $arg;
 2752+ NOWAI
 2753+ I HAS name IZ trim( substr( $arg, 0, $eqpos ) )
 2754+ I HAS value IZ trim( substr( $arg, $eqpos+1 ) )
 2755+ IZ $value === false
 2756+ I HAS value IZ ''
 2757+ KTHX
 2758+ IZ $name !== false
 2759+ $assocArgs[$name] = $value;
 2760+ KTHX
 2761+ KTHX
 2762+ KTHX
 2763+
 2764+ I FOUND MAH $assocArgs
 2765+ KTHX
 2766+
 2767+ DO NOT WANT
 2768+ NOT WANT Warn the user when a parser limitation is reached
 2769+ NOT WANT Will warn at most once the user per limitation type
 2770+ NOT WANT
 2771+ NOT WANT @param string $limitationType, should be one of:
 2772+ NOT WANT 'expensive-parserfunction' (corresponding messages:
 2773+ NOT WANT 'expensive-parserfunction-warning',
 2774+ NOT WANT 'expensive-parserfunction-category')
 2775+ NOT WANT 'post-expand-template-argument' (corresponding messages:
 2776+ NOT WANT 'post-expand-template-argument-warning',
 2777+ NOT WANT 'post-expand-template-argument-category')
 2778+ NOT WANT 'post-expand-template-inclusion' (corresponding messages:
 2779+ NOT WANT 'post-expand-template-inclusion-warning',
 2780+ NOT WANT 'post-expand-template-inclusion-category')
 2781+ NOT WANT @params int $current, $max When an explicit limit has been
 2782+ NOT WANT exceeded, provide the values (optional)
 2783+ WANT
 2784+ function limitationWarn( $limitationType, $current=null, $max=null) {
 2785+ BTW does no harm if $current and $max are present but are unnecessary for the message
 2786+ I HAS warning IZ wfMsgExt( "$limitationType-warning", array( 'parsemag', 'escape' ), $current, $max )
 2787+ IM ON UR SPECIAL mOutput->addWarning DOING $warning
 2788+ IM ON UR SPECIAL addTrackingCategory DOING "$limitationType-category"
 2789+ KTHX
 2790+
 2791+ DO NOT WANT
 2792+ NOT WANT Return the text of a template, after recursively
 2793+ NOT WANT replacing any variables or templates within the template.
 2794+ NOT WANT
 2795+ NOT WANT @param array $piece The parts of the template
 2796+ NOT WANT $piece['title']: the title, i.e. the part before the |
 2797+ NOT WANT $piece['parts']: the parameter array
 2798+ NOT WANT $piece['lineStart']: whether the brace was at the start of a line
 2799+ NOT WANT @param PPFrame The current frame, contains template arguments
 2800+ NOT WANT @return string the text of the template
 2801+ NOT WANT @private
 2802+ WANT
 2803+ SO IM LIKE braceSubstitution WITH UR $piece, $frame
 2804+ I HAS UR $wgContLang, $wgNonincludableNamespaces ON UR INTERNETS
 2805+ IM ON UR wfProfileIn DOING __METHOD__
 2806+ IM ON UR wfProfileIn DOING __METHOD__.'-setup'
 2807+
 2808+ BTW Flags
 2809+ I HAS found IZ false # $text has been filled
 2810+ I HAS nowiki IZ false # wiki markup in $text should be escaped
 2811+ I HAS isHTML IZ false # $text is HTML, armour it against wikitext transformation
 2812+ I HAS forceRawInterwiki IZ false # Force interwiki transclusion to be done in raw mode not rendered
 2813+ I HAS isChildObj IZ false # $text is a DOM node needing expansion in a child frame
 2814+ I HAS isLocalObj IZ false # $text is a DOM node needing expansion in the current frame
 2815+
 2816+ BTW Title object, where $text came from
 2817+ I HAS title
 2818+
 2819+ BTW $part1 is the bit before the first |, and must contain only title characters.
 2820+ BTW Various prefixes will be stripped from it later.
 2821+ I HAS titleWithSpaces IZ $frame->expand( $piece['title'] )
 2822+ I HAS part1 IZ trim( $titleWithSpaces )
 2823+ I HAS titleText IZ false
 2824+
 2825+ BTW Original title text preserved for various purposes
 2826+ I HAS originalTitle IZ $part1
 2827+
 2828+ BTW $args is a list of argument nodes, starting from index 0, not including $part1
 2829+ I HAS args IZ ( null == $piece['parts'] ) ? array() : $piece['parts']
 2830+ IM ON UR wfProfileOut DOING __METHOD__.'-setup'
 2831+
 2832+ BTW SUBST
 2833+ IM ON UR wfProfileIn DOING __METHOD__.'-modifiers'
 2834+ IZ !$found
 2835+
 2836+ I HAS substMatch IZ $this->mSubstWords->matchStartAndRemove( $part1 )
 2837+
 2838+ BTW Possibilities for substMatch: "subst", "safesubst" or FALSE
 2839+ BTW Decide whether to expand template or keep wikitext as-is.
 2840+ IZ $this->ot['wiki']
 2841+ IZ $substMatch === false
 2842+ I HAS literal IZ true # literal when in PST with no prefix
 2843+ NOWAI
 2844+ I HAS literal IZ false # expand when in PST with subst: or safesubst:
 2845+ KTHX
 2846+ NOWAI
 2847+ IZ $substMatch == 'subst'
 2848+ I HAS literal IZ true # literal when not in PST with plain subst:
 2849+ NOWAI
 2850+ I HAS literal IZ false # expand when not in PST with safesubst: or no prefix
 2851+ KTHX
 2852+ KTHX
 2853+ IZ $literal
 2854+ I HAS text IZ $frame->virtualBracketedImplode( '{{', '|', '}}', $titleWithSpaces, $args )
 2855+ I HAS isLocalObj IZ true
 2856+ I HAS found IZ true
 2857+ KTHX
 2858+ KTHX
 2859+
 2860+ BTW Variables
 2861+ IZ !$found && $args->getLength() == 0
 2862+ I HAS id IZ $this->mVariables->matchStartToEnd( $part1 )
 2863+ IZ $id !== false
 2864+ I HAS text IZ $this->getVariableValue( $id, $frame )
 2865+ IZ MagicWord::getCacheTTL( $id ) > -1
 2866+ UR SPECIAL mOutput->mContainsOldMagic IZ true;
 2867+ KTHX
 2868+ I HAS found IZ true
 2869+ KTHX
 2870+ KTHX
 2871+
 2872+ BTW MSG, MSGNW and RAW
 2873+ IZ !$found
 2874+ BTW Check for MSGNW:
 2875+ I HAS mwMsgnw IZ MagicWord::get( 'msgnw' )
 2876+ IZ $mwMsgnw->matchStartAndRemove( $part1 )
 2877+ I HAS nowiki IZ true
 2878+ NOWAI
 2879+ BTW Remove obsolete MSG:
 2880+ I HAS mwMsg IZ MagicWord::get( 'msg' )
 2881+ $mwMsg->matchStartAndRemove( $part1 );
 2882+ KTHX
 2883+
 2884+ BTW Check for RAW:
 2885+ I HAS mwRaw IZ MagicWord::get( 'raw' )
 2886+ IZ $mwRaw->matchStartAndRemove( $part1 )
 2887+ I HAS forceRawInterwiki IZ true
 2888+ KTHX
 2889+ KTHX
 2890+ IM ON UR wfProfileOut DOING __METHOD__.'-modifiers'
 2891+
 2892+ BTW Parser functions
 2893+ IZ !$found
 2894+ IM ON UR wfProfileIn DOING __METHOD__ . '-pfunc'
 2895+
 2896+ I HAS colonPos IZ strpos( $part1, ':' )
 2897+ IZ $colonPos !== false
 2898+ BTW Case sensitive functions
 2899+ I HAS function IZ substr( $part1, 0, $colonPos )
 2900+ IZ isset( $this->mFunctionSynonyms[1][$function] )
 2901+ I HAS function IZ $this->mFunctionSynonyms[1][$function]
 2902+ NOWAI
 2903+ BTW Case insensitive functions
 2904+ I HAS function IZ $wgContLang->lc( $function )
 2905+ IZ isset( $this->mFunctionSynonyms[0][$function] )
 2906+ I HAS function IZ $this->mFunctionSynonyms[0][$function]
 2907+ NOWAI
 2908+ I HAS function IZ false
 2909+ KTHX
 2910+ KTHX
 2911+ IZ $function
 2912+ list( $callback, $flags ) = $this->mFunctionHooks[$function];
 2913+ I HAS initialArgs IZ BUCKET &$this );
 2914+ I HAS funcArgs IZ BUCKET trim( substr( $part1, $colonPos + 1 ) ) );
 2915+ IZ $flags & SFH_OBJECT_ARGS
 2916+ BTW Add a frame parameter, and pass the arguments as an array
 2917+ I HAS allArgs IZ $initialArgs
 2918+ $allArgs[] = $frame;
 2919+ for ( $i = 0; $i < $args->getLength(); $i++ ) {
 2920+ $funcArgs[] = $args->item( $i );
 2921+ KTHX
 2922+ $allArgs[] = $funcArgs;
 2923+ NOWAI
 2924+ BTW Convert arguments to plain text
 2925+ for ( $i = 0; $i < $args->getLength(); $i++ ) {
 2926+ $funcArgs[] = trim( $frame->expand( $args->item( $i ) ) );
 2927+ KTHX
 2928+ I HAS allArgs IZ array_merge( $initialArgs, $funcArgs )
 2929+ KTHX
 2930+
 2931+ BTW Workaround for PHP bug 35229 and similar
 2932+ IZ !is_callable( $callback )
 2933+ IM ON UR wfProfileOut DOING __METHOD__ . '-pfunc'
 2934+ IM ON UR wfProfileOut DOING __METHOD__
 2935+ throw new MWException( "Tag hook for $function is not callable\n" );
 2936+ KTHX
 2937+ I HAS result IZ call_user_func_array( $callback, $allArgs )
 2938+ I HAS found IZ true
 2939+ I HAS noparse IZ true
 2940+ I HAS preprocessFlags IZ 0
 2941+
 2942+ IZ is_array( $result )
 2943+ IZ isset( $result[0] )
 2944+ I HAS text IZ $result[0]
 2945+ IM ON UR unset DOING $result[0]
 2946+ KTHX
 2947+
 2948+ BTW Extract flags into the local scope
 2949+ BTW This allows callers to set flags such as nowiki, found, etc.
 2950+ IM ON UR extract DOING $result
 2951+ NOWAI
 2952+ I HAS text IZ $result
 2953+ KTHX
 2954+ IZ !$noparse
 2955+ I HAS text IZ $this->preprocessToDom( $text, $preprocessFlags )
 2956+ I HAS isChildObj IZ true
 2957+ KTHX
 2958+ KTHX
 2959+ KTHX
 2960+ IM ON UR wfProfileOut DOING __METHOD__ . '-pfunc'
 2961+ KTHX
 2962+
 2963+ BTW Finish mangling title and then check for loops.
 2964+ BTW Set $title to a Title object and $titleText to the PDBK
 2965+ IZ !$found
 2966+ I HAS ns IZ NS_TEMPLATE
 2967+ BTW Split the title into page and subpage
 2968+ I HAS subpage IZ ''
 2969+ I HAS part1 IZ $this->maybeDoSubpageLink( $part1, $subpage )
 2970+ IZ $subpage !== ''
 2971+ I HAS ns IZ $this->mTitle->getNamespace()
 2972+ KTHX
 2973+ I HAS title IZ Title::newFromText( $part1, $ns )
 2974+ IZ $title
 2975+ I HAS titleText IZ $title->getPrefixedText()
 2976+ BTW Check for language variants if the template is not found
 2977+ IZ $wgContLang->hasVariants() && $title->getArticleID() == 0
 2978+ $wgContLang->findVariantLink( $part1, $title, true );
 2979+ KTHX
 2980+ BTW Do recursion depth check
 2981+ I HAS limit IZ $this->mOptions->getMaxTemplateDepth()
 2982+ IZ $frame->depth >= $limit
 2983+ I HAS found IZ true
 2984+ text IZ '<span class="error">'
 2985+ . wfMsgForContent( 'parser-template-recursion-depth-warning', $limit )
 2986+ . '</span>';
 2987+ KTHX
 2988+ KTHX
 2989+ KTHX
 2990+
 2991+ BTW Load from database
 2992+ IZ !$found && $title
 2993+ IM ON UR wfProfileIn DOING __METHOD__ . '-loadtpl'
 2994+ IZ !$title->isExternal()
 2995+ if ( $title->getNamespace() == NS_SPECIAL
 2996+ && $this->mOptions->getAllowSpecialInclusion()
 2997+ && $this->ot['html'] )
 2998+ {
 2999+ I HAS text IZ SpecialPage::capturePath( $title )
 3000+ IZ is_string( $text )
 3001+ I HAS found IZ true
 3002+ I HAS isHTML IZ true
 3003+ IM ON UR SPECIAL disableCache
 3004+ KTHX
 3005+ ORLY $wgNonincludableNamespaces && in_array( $title->getNamespace(), $wgNonincludableNamespaces )
 3006+ I HAS found IZ false # access denied
 3007+ IM ON UR wfDebug DOING __METHOD__.": template inclusion denied for " . $title->getPrefixedDBkey()
 3008+ NOWAI
 3009+ IM ON UR list DOING $text, $title ) = $this->getTemplateDom( $title
 3010+ IZ $text !== false
 3011+ I HAS found IZ true
 3012+ I HAS isChildObj IZ true
 3013+ KTHX
 3014+ KTHX
 3015+
 3016+ BTW If the title is valid but undisplayable, make a link to it
 3017+ IZ !$found && ( $this->ot['html'] || $this->ot['pre'] )
 3018+ I HAS text IZ "[[:$titleText]]"
 3019+ I HAS found IZ true
 3020+ KTHX
 3021+ ORLY $title->isTrans()
 3022+ BTW Interwiki transclusion
 3023+ IZ $this->ot['html'] && !$forceRawInterwiki
 3024+ I HAS text IZ $this->interwikiTransclude( $title, 'render' )
 3025+ I HAS isHTML IZ true
 3026+ NOWAI
 3027+ I HAS text IZ $this->interwikiTransclude( $title, 'raw' )
 3028+ BTW Preprocess it like a template
 3029+ I HAS text IZ $this->preprocessToDom( $text, self::PTD_FOR_INCLUSION )
 3030+ I HAS isChildObj IZ true
 3031+ KTHX
 3032+ I HAS found IZ true
 3033+ KTHX
 3034+
 3035+ BTW Do infinite loop check
 3036+ BTW This has to be done after redirect resolution to avoid infinite loops via redirects
 3037+ IZ !$frame->loopCheck( $title )
 3038+ I HAS found IZ true
 3039+ I HAS text IZ '<span class="error">' . wfMsgForContent( 'parser-template-loop-warning', $titleText ) . '</span>'
 3040+ IM ON UR wfDebug DOING __METHOD__.": template loop broken at '$titleText'\n"
 3041+ KTHX
 3042+ IM ON UR wfProfileOut DOING __METHOD__ . '-loadtpl'
 3043+ KTHX
 3044+
 3045+ BTW If we haven't found text to substitute by now, we're done
 3046+ BTW Recover the source wikitext and return it
 3047+ IZ !$found
 3048+ I HAS text IZ $frame->virtualBracketedImplode( '{{', '|', '}}', $titleWithSpaces, $args )
 3049+ IM ON UR wfProfileOut DOING __METHOD__
 3050+ I FOUND MAH array( 'object' => $text )
 3051+ KTHX
 3052+
 3053+ BTW Expand DOM-style return values in a child frame
 3054+ IZ $isChildObj
 3055+ BTW Clean up argument array
 3056+ I HAS newFrame IZ $frame->newChild( $args, $title )
 3057+
 3058+ IZ $nowiki
 3059+ I HAS text IZ $newFrame->expand( $text, PPFrame::RECOVER_ORIG )
 3060+ ORLY $titleText !== false && $newFrame->isEmpty()
 3061+ BTW Expansion is eligible for the empty-frame cache
 3062+ IZ isset( $this->mTplExpandCache[$titleText] )
 3063+ I HAS text IZ $this->mTplExpandCache[$titleText]
 3064+ NOWAI
 3065+ I HAS text IZ $newFrame->expand( $text )
 3066+ $this->mTplExpandCache[$titleText] = $text;
 3067+ KTHX
 3068+ NOWAI
 3069+ BTW Uncached expansion
 3070+ I HAS text IZ $newFrame->expand( $text )
 3071+ KTHX
 3072+ KTHX
 3073+ IZ $isLocalObj && $nowiki
 3074+ I HAS text IZ $frame->expand( $text, PPFrame::RECOVER_ORIG )
 3075+ I HAS isLocalObj IZ false
 3076+ KTHX
 3077+
 3078+ BTW Replace raw HTML by a placeholder
 3079+ BTW Add a blank line preceding, to prevent it from mucking up
 3080+ BTW immediately preceding headings
 3081+ IZ $isHTML
 3082+ I HAS text IZ "\n\n" . $this->insertStripItem( $text )
 3083+ ORLY $nowiki && ( $this->ot['html'] || $this->ot['pre'] )
 3084+ BTW Escape nowiki-style return values
 3085+ I HAS text IZ wfEscapeWikiText( $text )
 3086+ KTHX elseif ( is_string( $text )
 3087+ && !$piece['lineStart']
 3088+ && preg_match( '/^(?:{\\||:|;|#|\*)/', $text ) )
 3089+ {
 3090+ BTW Bug 529: if the template begins with a table or block-level
 3091+ BTW element, it should be treated as beginning a new line.
 3092+ BTW This behaviour is somewhat controversial.
 3093+ I HAS text IZ "\n" . $text
 3094+ KTHX
 3095+
 3096+ IZ is_string( $text ) && !$this->incrementIncludeSize( 'post-expand', strlen( $text ) )
 3097+ BTW Error, oversize inclusion
 3098+ text IZ "[[$originalTitle]]" .
 3099+ IM ON UR SPECIAL insertStripItem DOING '<!-- WARNING: template omitted, post-expand include size too large -->'
 3100+ IM ON UR SPECIAL limitationWarn DOING 'post-expand-template-inclusion'
 3101+ KTHX
 3102+
 3103+ IZ $isLocalObj
 3104+ I HAS ret IZ BUCKET 'object' => $text );
 3105+ NOWAI
 3106+ I HAS ret IZ BUCKET 'text' => $text );
 3107+ KTHX
 3108+
 3109+ IM ON UR wfProfileOut DOING __METHOD__
 3110+ I FOUND MAH $ret
 3111+ KTHX
 3112+
 3113+ DO NOT WANT
 3114+ NOT WANT Get the semi-parsed DOM representation of a template with a given title,
 3115+ NOT WANT and its redirect destination title. Cached.
 3116+ WANT
 3117+ SO IM LIKE getTemplateDom WITH UR $title
 3118+ I HAS cacheTitle IZ $title
 3119+ I HAS titleText IZ $title->getPrefixedDBkey()
 3120+
 3121+ IZ isset( $this->mTplRedirCache[$titleText] )
 3122+ list( $ns, $dbk ) = $this->mTplRedirCache[$titleText];
 3123+ I HAS title IZ Title::makeTitle( $ns, $dbk )
 3124+ I HAS titleText IZ $title->getPrefixedDBkey()
 3125+ KTHX
 3126+ IZ isset( $this->mTplDomCache[$titleText] )
 3127+ I FOUND MAH array( $this->mTplDomCache[$titleText], $title )
 3128+ KTHX
 3129+
 3130+ BTW Cache miss, go to the database
 3131+ IM ON UR list DOING $text, $title ) = $this->fetchTemplateAndTitle( $title
 3132+
 3133+ IZ $text === false
 3134+ $this->mTplDomCache[$titleText] = false;
 3135+ I FOUND MAH array( false, $title )
 3136+ KTHX
 3137+
 3138+ I HAS dom IZ $this->preprocessToDom( $text, self::PTD_FOR_INCLUSION )
 3139+ $this->mTplDomCache[ $titleText ] = $dom;
 3140+
 3141+ IZ !$title->equals( $cacheTitle )
 3142+ $this->mTplRedirCache[$cacheTitle->getPrefixedDBkey()] =
 3143+ IM ON UR array DOING $title->getNamespace(),$cdb = $title->getDBkey()
 3144+ KTHX
 3145+
 3146+ I FOUND MAH array( $dom, $title )
 3147+ KTHX
 3148+
 3149+ DO NOT WANT
 3150+ NOT WANT Fetch the unparsed text of a template and register a reference to it.
 3151+ WANT
 3152+ SO IM LIKE fetchTemplateAndTitle WITH UR $title
 3153+ I HAS templateCb IZ $this->mOptions->getTemplateCallback()
 3154+ I HAS stuff IZ call_user_func( $templateCb, $title, $this )
 3155+ I HAS text IZ $stuff['text']
 3156+ I HAS finalTitle IZ isset( $stuff['finalTitle'] ) ? $stuff['finalTitle'] : $title
 3157+ IZ isset( $stuff['deps'] )
 3158+ foreach ( $stuff['deps'] as $dep ) {
 3159+ IM ON UR SPECIAL mOutput->addTemplate DOING $dep['title'], $dep['page_id'], $dep['rev_id']
 3160+ KTHX
 3161+ KTHX
 3162+ I FOUND MAH array( $text, $finalTitle )
 3163+ KTHX
 3164+
 3165+ SO IM LIKE fetchTemplate WITH UR $title
 3166+ I HAS rv IZ $this->fetchTemplateAndTitle( $title )
 3167+ I FOUND MAH $rv[0]
 3168+ KTHX
 3169+
 3170+ DO NOT WANT
 3171+ NOT WANT Static function to get a template
 3172+ NOT WANT Can be overridden via ParserOptions::setTemplateCallback().
 3173+ WANT
 3174+ SO IM ALWAYS LIKE statelessFetchTemplate WITH UR $title, $parser=false
 3175+ I HAS text IZ $skip = false
 3176+ I HAS finalTitle IZ $title
 3177+ I HAS deps IZ EMPTY
 3178+
 3179+ BTW Loop to fetch the article, with up to 1 redirect
 3180+ for ( $i = 0; $i < 2 && is_object( $title ); $i++ ) {
 3181+ BTW Give extensions a chance to select the revision instead
 3182+ I HAS id IZ false # Assume current
 3183+ IM ON UR wfRunHooks DOING 'BeforeParserFetchTemplateAndtitle', array( $parser, &$title, &$skip, &$id )
 3184+
 3185+ IZ $skip
 3186+ I HAS text IZ false
 3187+ $deps[] = array(
 3188+ 'title' => $title,
 3189+ 'page_id' => $title->getArticleID(),
 3190+ 'rev_id' => null );
 3191+ break;
 3192+ KTHX
 3193+ I HAS rev IZ $id ? Revision::newFromId( $id ) : Revision::newFromTitle( $title )
 3194+ I HAS rev_id IZ $rev ? $rev->getId() : 0
 3195+ BTW If there is no current revision, there is no page
 3196+ IZ $id === false && !$rev
 3197+ I HAS linkCache IZ LinkCache::singleton()
 3198+ $linkCache->addBadLinkObj( $title );
 3199+ KTHX
 3200+
 3201+ $deps[] = array(
 3202+ 'title' => $title,
 3203+ 'page_id' => $title->getArticleID(),
 3204+ 'rev_id' => $rev_id );
 3205+
 3206+ IZ $rev
 3207+ I HAS text IZ $rev->getText()
 3208+ ORLY $title->getNamespace() == NS_MEDIAWIKI
 3209+ I HAS UR $wgContLang ON UR INTERNETS
 3210+ I HAS message IZ $wgContLang->lcfirst( $title->getText() )
 3211+ I HAS text IZ wfMsgForContentNoTrans( $message )
 3212+ IZ wfEmptyMsg( $message, $text )
 3213+ I HAS text IZ false
 3214+ break;
 3215+ KTHX
 3216+ NOWAI
 3217+ break;
 3218+ KTHX
 3219+ IZ $text === false
 3220+ break;
 3221+ KTHX
 3222+ BTW Redirect?
 3223+ I HAS finalTitle IZ $title
 3224+ I HAS title IZ Title::newFromRedirect( $text )
 3225+ KTHX
 3226+ return array(
 3227+ 'text' => $text,
 3228+ 'finalTitle' => $finalTitle,
 3229+ 'deps' => $deps );
 3230+ KTHX
 3231+
 3232+ DO NOT WANT
 3233+ NOT WANT Transclude an interwiki link.
 3234+ WANT
 3235+ SO IM LIKE interwikiTransclude WITH UR $title, $action
 3236+ I HAS UR $wgEnableScaryTranscluding ON UR INTERNETS
 3237+
 3238+ IZ !$wgEnableScaryTranscluding
 3239+ I FOUND MAH wfMsg('scarytranscludedisabled')
 3240+ KTHX
 3241+
 3242+ I HAS url IZ $title->getFullUrl( "action=$action" )
 3243+
 3244+ IZ strlen( $url ) > 255
 3245+ I FOUND MAH wfMsg( 'scarytranscludetoolong' )
 3246+ KTHX
 3247+ I FOUND MAH $this->fetchScaryTemplateMaybeFromCache( $url )
 3248+ KTHX
 3249+
 3250+ SO IM LIKE fetchScaryTemplateMaybeFromCache WITH UR $url
 3251+ I HAS UR $wgTranscludeCacheExpiry ON UR INTERNETS
 3252+ I HAS dbr IZ wfGetDB( DB_SLAVE )
 3253+ I HAS tsCond IZ $dbr->timestamp( time() - $wgTranscludeCacheExpiry )
 3254+ obj IZ $dbr->selectRow( 'transcache', array('tc_time', 'tc_contents' ),
 3255+ IM ON UR array DOING 'tc_url' => $url, "tc_time >= " . $dbr->addQuotes( $tsCond ) )
 3256+ IZ $obj
 3257+ I FOUND MAH $obj->tc_contents
 3258+ KTHX
 3259+
 3260+ I HAS text IZ Http::get( $url )
 3261+ IZ !$text
 3262+ I FOUND MAH wfMsg( 'scarytranscludefailed', $url )
 3263+ KTHX
 3264+
 3265+ I HAS dbw IZ wfGetDB( DB_MASTER )
 3266+ $dbw->replace( 'transcache', array('tc_url'), array(
 3267+ 'tc_url' => $url,
 3268+ 'tc_time' => $dbw->timestamp( time() ),
 3269+ 'tc_contents' => $text)
 3270+ BUCKET
 3271+ I FOUND MAH $text
 3272+ KTHX
 3273+
 3274+
 3275+ DO NOT WANT
 3276+ NOT WANT Triple brace replacement -- used for template arguments
 3277+ NOT WANT @private
 3278+ WANT
 3279+ SO IM LIKE argSubstitution WITH UR $piece, $frame
 3280+ IM ON UR wfProfileIn DOING __METHOD__
 3281+
 3282+ I HAS error IZ false
 3283+ I HAS parts IZ $piece['parts']
 3284+ I HAS nameWithSpaces IZ $frame->expand( $piece['title'] )
 3285+ I HAS argName IZ trim( $nameWithSpaces )
 3286+ I HAS object IZ false
 3287+ I HAS text IZ $frame->getArgument( $argName )
 3288+ if ( $text === false && $parts->getLength() > 0
 3289+ && (
 3290+ $this->ot['html']
 3291+ || $this->ot['pre']
 3292+ || ( $this->ot['wiki'] && $frame->isTemplate() )
 3293+ )
 3294+ ) {
 3295+ BTW No match in frame, use the supplied default
 3296+ I HAS object IZ $parts->item( 0 )->getChildren()
 3297+ KTHX
 3298+ IZ !$this->incrementIncludeSize( 'arg', strlen( $text ) )
 3299+ I HAS error IZ '<!-- WARNING: argument omitted, expansion size too large -->'
 3300+ IM ON UR SPECIAL limitationWarn DOING 'post-expand-template-argument'
 3301+ KTHX
 3302+
 3303+ IZ $text === false && $object === false
 3304+ BTW No match anywhere
 3305+ I HAS object IZ $frame->virtualBracketedImplode( '{{{', '|', '}}}', $nameWithSpaces, $parts )
 3306+ KTHX
 3307+ IZ $error !== false
 3308+ text HAS MOAR $error;
 3309+ KTHX
 3310+ IZ $object !== false
 3311+ I HAS ret IZ BUCKET 'object' => $object );
 3312+ NOWAI
 3313+ I HAS ret IZ BUCKET 'text' => $text );
 3314+ KTHX
 3315+
 3316+ IM ON UR wfProfileOut DOING __METHOD__
 3317+ I FOUND MAH $ret
 3318+ KTHX
 3319+
 3320+ DO NOT WANT
 3321+ NOT WANT Return the text to be used for a given extension tag.
 3322+ NOT WANT This is the ghost of strip().
 3323+ NOT WANT
 3324+ NOT WANT @param array $params Associative array of parameters:
 3325+ NOT WANT name PPNode for the tag name
 3326+ NOT WANT attr PPNode for unparsed text where tag attributes are thought to be
 3327+ NOT WANT attributes Optional associative array of parsed attributes
 3328+ NOT WANT inner Contents of extension element
 3329+ NOT WANT noClose Original text did not have a close tag
 3330+ NOT WANT @param PPFrame $frame
 3331+ WANT
 3332+ SO IM LIKE extensionSubstitution WITH UR $params, $frame
 3333+ I HAS UR $wgRawHtml, $wgContLang ON UR INTERNETS
 3334+
 3335+ I HAS name IZ $frame->expand( $params['name'] )
 3336+ I HAS attrText IZ !isset( $params['attr'] ) ? null : $frame->expand( $params['attr'] )
 3337+ I HAS content IZ !isset( $params['inner'] ) ? null : $frame->expand( $params['inner'] )
 3338+ I HAS marker IZ "{$this->mUniqPrefix}-$name-" . sprintf( '%08X', $this->mMarkerIndex++ ) . self::MARKER_SUFFIX
 3339+
 3340+ isFunctionTag IZ isset( $this->mFunctionTagHooks[strtolower($name)] ) &&
 3341+ ( $this->ot['html'] || $this->ot['pre'] );
 3342+ IZ $isFunctionTag
 3343+ I HAS markerType IZ 'none'
 3344+ NOWAI
 3345+ I HAS markerType IZ 'general'
 3346+ KTHX
 3347+ IZ $this->ot['html'] || $isFunctionTag
 3348+ I HAS name IZ strtolower( $name )
 3349+ I HAS attributes IZ Sanitizer::decodeTagAttributes( $attrText )
 3350+ IZ isset( $params['attributes'] )
 3351+ I HAS attributes IZ $attributes + $params['attributes']
 3352+ KTHX
 3353+
 3354+ IZ isset( $this->mTagHooks[$name] )
 3355+ BTW Workaround for PHP bug 35229 and similar
 3356+ IZ !is_callable( $this->mTagHooks[$name] )
 3357+ throw new MWException( "Tag hook for $name is not callable\n" );
 3358+ KTHX
 3359+ output IZ call_user_func_array( $this->mTagHooks[$name],
 3360+ IM ON UR array DOING $content, $attributes, $this, $frame )
 3361+ ORLY isset( $this->mFunctionTagHooks[$name] )
 3362+ list( $callback, $flags ) = $this->mFunctionTagHooks[$name];
 3363+ IZ !is_callable( $callback )
 3364+ throw new MWException( "Tag hook for $name is not callable\n" );
 3365+ KTHX
 3366+
 3367+ I HAS output IZ call_user_func_array( $callback, array( &$this, $frame, $content, $attributes ) )
 3368+ NOWAI
 3369+ output IZ '<span class="error">Invalid tag extension name: ' .
 3370+ htmlspecialchars( $name ) . '</span>';
 3371+ KTHX
 3372+
 3373+ IZ is_array( $output )
 3374+ BTW Extract flags to local scope (to override $markerType)
 3375+ I HAS flags IZ $output
 3376+ I HAS output IZ $flags[0]
 3377+ IM ON UR unset DOING $flags[0]
 3378+ IM ON UR extract DOING $flags
 3379+ KTHX
 3380+ NOWAI
 3381+ IZ is_null( $attrText )
 3382+ I HAS attrText IZ ''
 3383+ KTHX
 3384+ IZ isset( $params['attributes'] )
 3385+ foreach ( $params['attributes'] as $attrName => $attrValue ) {
 3386+ attrText HAS MOAR ' ' . htmlspecialchars( $attrName ) . '="' .
 3387+ htmlspecialchars( $attrValue ) . '"';
 3388+ KTHX
 3389+ KTHX
 3390+ IZ $content === null
 3391+ I HAS output IZ "<$name$attrText/>"
 3392+ NOWAI
 3393+ I HAS close IZ is_null( $params['close'] ) ? '' : $frame->expand( $params['close'] )
 3394+ I HAS output IZ "<$name$attrText>$content$close"
 3395+ KTHX
 3396+ KTHX
 3397+
 3398+ IZ $markerType === 'none'
 3399+ I FOUND MAH $output
 3400+ ORLY $markerType === 'nowiki'
 3401+ IM ON UR SPECIAL mStripState->nowiki->setPair DOING $marker, $output
 3402+ ORLY $markerType === 'general'
 3403+ IM ON UR SPECIAL mStripState->general->setPair DOING $marker, $output
 3404+ NOWAI
 3405+ throw new MWException( __METHOD__.': invalid marker type' );
 3406+ KTHX
 3407+ I FOUND MAH $marker
 3408+ KTHX
 3409+
 3410+ DO NOT WANT
 3411+ NOT WANT Increment an include size counter
 3412+ NOT WANT
 3413+ NOT WANT @param string $type The type of expansion
 3414+ NOT WANT @param integer $size The size of the text
 3415+ NOT WANT @return boolean False if this inclusion would take it over the maximum, true otherwise
 3416+ WANT
 3417+ SO IM LIKE incrementIncludeSize WITH UR $type, $size
 3418+ IZ $this->mIncludeSizes[$type] + $size > $this->mOptions->getMaxIncludeSize( $type )
 3419+ I FOUND MAH false
 3420+ NOWAI
 3421+ $this->mIncludeSizes[$type] += $size;
 3422+ I FOUND MAH true
 3423+ KTHX
 3424+ KTHX
 3425+
 3426+ DO NOT WANT
 3427+ NOT WANT Increment the expensive function count
 3428+ NOT WANT
 3429+ NOT WANT @return boolean False if the limit has been exceeded
 3430+ WANT
 3431+ SO IM LIKE incrementExpensiveFunctionCount
 3432+ I HAS UR $wgExpensiveParserFunctionLimit ON UR INTERNETS
 3433+ $this->mExpensiveFunctionCount++;
 3434+ IZ $this->mExpensiveFunctionCount <= $wgExpensiveParserFunctionLimit
 3435+ I FOUND MAH true
 3436+ KTHX
 3437+ I FOUND MAH false
 3438+ KTHX
 3439+
 3440+ DO NOT WANT
 3441+ NOT WANT Strip double-underscore items like __NOGALLERY__ and __NOTOC__
 3442+ NOT WANT Fills $this->mDoubleUnderscores, returns the modified text
 3443+ WANT
 3444+ SO IM LIKE doDoubleUnderscore WITH UR $text
 3445+ IM ON UR wfProfileIn DOING __METHOD__
 3446+
 3447+ BTW The position of __TOC__ needs to be recorded
 3448+ I HAS mw IZ MagicWord::get( 'toc' )
 3449+ IZ $mw->match( $text )
 3450+ UR SPECIAL mShowToc IZ true;
 3451+ UR SPECIAL mForceTocPosition IZ true;
 3452+
 3453+ BTW Set a placeholder. At the end we'll fill it in with the TOC.
 3454+ I HAS text IZ $mw->replace( '<!--MWTOC-->', $text, 1 )
 3455+
 3456+ BTW Only keep the first one.
 3457+ I HAS text IZ $mw->replace( '', $text )
 3458+ KTHX
 3459+
 3460+ BTW Now match and remove the rest of them
 3461+ I HAS mwa IZ MagicWord::getDoubleUnderscoreArray()
 3462+ UR SPECIAL mDoubleUnderscores IZ $mwa->matchAndRemove( $text );
 3463+
 3464+ IZ isset( $this->mDoubleUnderscores['nogallery'] )
 3465+ UR SPECIAL mOutput->mNoGallery IZ true;
 3466+ KTHX
 3467+ IZ isset( $this->mDoubleUnderscores['notoc'] ) && !$this->mForceTocPosition
 3468+ UR SPECIAL mShowToc IZ false;
 3469+ KTHX
 3470+ IZ isset( $this->mDoubleUnderscores['hiddencat'] ) && $this->mTitle->getNamespace() == NS_CATEGORY
 3471+ IM ON UR SPECIAL mOutput->setProperty DOING 'hiddencat', 'y'
 3472+ IM ON UR SPECIAL addTrackingCategory DOING 'hidden-category-category'
 3473+ KTHX
 3474+ BTW (bug 8068) Allow control over whether robots index a page.
 3475+ BTW
 3476+ BTW FIXME (bug 14899): __INDEX__ always overrides __NOINDEX__ here! This
 3477+ BTW is not desirable, the last one on the page should win.
 3478+ IZ isset( $this->mDoubleUnderscores['noindex'] ) && $this->mTitle->canUseNoindex()
 3479+ IM ON UR SPECIAL mOutput->setIndexPolicy DOING 'noindex'
 3480+ IM ON UR SPECIAL addTrackingCategory DOING 'noindex-category'
 3481+ KTHX
 3482+ IZ isset( $this->mDoubleUnderscores['index'] ) && $this->mTitle->canUseNoindex()
 3483+ IM ON UR SPECIAL mOutput->setIndexPolicy DOING 'index'
 3484+ IM ON UR SPECIAL addTrackingCategory DOING 'index-category'
 3485+ KTHX
 3486+
 3487+ IM ON UR wfProfileOut DOING __METHOD__
 3488+ I FOUND MAH $text
 3489+ KTHX
 3490+
 3491+ DO NOT WANT
 3492+ NOT WANT Add a tracking category, getting the title from a system message,
 3493+ NOT WANT or print a debug message if the title is invalid.
 3494+ NOT WANT @param $msg String message key
 3495+ NOT WANT @return Bool whether the addition was successful
 3496+ WANT
 3497+ SO IM LIKE addTrackingCategory WITH UR $msg
 3498+ I HAS cat IZ wfMsgForContent( $msg )
 3499+
 3500+ BTW Allow tracking categories to be disabled by setting them to "-"
 3501+ IZ $cat === '-'
 3502+ I FOUND MAH false
 3503+ KTHX
 3504+
 3505+ I HAS containerCategory IZ Title::makeTitleSafe( NS_CATEGORY, $cat )
 3506+ IZ $containerCategory
 3507+ IM ON UR SPECIAL mOutput->addCategory DOING $containerCategory->getDBkey(), $this->getDefaultSort()
 3508+ I FOUND MAH true
 3509+ NOWAI
 3510+ IM ON UR wfDebug DOING __METHOD__.": [[MediaWiki:$msg]] is not a valid title!\n"
 3511+ I FOUND MAH false
 3512+ KTHX
 3513+ KTHX
 3514+
 3515+ DO NOT WANT
 3516+ NOT WANT This function accomplishes several tasks:
 3517+ NOT WANT 1) Auto-number headings if that option is enabled
 3518+ NOT WANT 2) Add an [edit] link to sections for users who have enabled the option and can edit the page
 3519+ NOT WANT 3) Add a Table of contents on the top for users who have enabled the option
 3520+ NOT WANT 4) Auto-anchor headings
 3521+ NOT WANT
 3522+ NOT WANT It loops through all headlines, collects the necessary data, then splits up the
 3523+ NOT WANT string and re-inserts the newly formatted headlines.
 3524+ NOT WANT
 3525+ NOT WANT @param string $text
 3526+ NOT WANT @param string $origText Original, untouched wikitext
 3527+ NOT WANT @param boolean $isMain
 3528+ NOT WANT @private
 3529+ WANT
 3530+ SO IM LIKE formatHeadings WITH UR $text, $origText, $isMain=true
 3531+ I HAS UR $wgMaxTocLevel, $wgContLang, $wgHtml5, $wgExperimentalHtmlIds ON UR INTERNETS
 3532+
 3533+ I HAS doNumberHeadings IZ $this->mOptions->getNumberHeadings()
 3534+ I HAS showEditLink IZ $this->mOptions->getEditSection()
 3535+
 3536+ BTW Do not call quickUserCan unless necessary
 3537+ IZ $showEditLink && !$this->mTitle->quickUserCan( 'edit' )
 3538+ I HAS showEditLink IZ 0
 3539+ KTHX
 3540+
 3541+ BTW Inhibit editsection links if requested in the page
 3542+ IZ isset( $this->mDoubleUnderscores['noeditsection'] ) || $this->mOptions->getIsPrintable()
 3543+ I HAS showEditLink IZ 0
 3544+ KTHX
 3545+
 3546+ BTW Get all headlines for numbering them and adding funky stuff like [edit]
 3547+ BTW links - this is for later, but we need the number of headlines right now
 3548+ I HAS matches IZ EMPTY
 3549+ I HAS numMatches IZ preg_match_all( '/<H(?P<level>[1-6])(?P<attrib>.*?'.'>)(?P<header>.*?)<\/H[1-6] *>/i', $text, $matches )
 3550+
 3551+ BTW if there are fewer than 4 headlines in the article, do not show TOC
 3552+ BTW unless it's been explicitly enabled.
 3553+ enoughToc IZ $this->mShowToc &&
 3554+ ( ( $numMatches >= 4 ) || $this->mForceTocPosition );
 3555+
 3556+ BTW Allow user to stipulate that a page should have a "new section"
 3557+ BTW link added via __NEWSECTIONLINK__
 3558+ IZ isset( $this->mDoubleUnderscores['newsectionlink'] )
 3559+ IM ON UR SPECIAL mOutput->setNewSection DOING true
 3560+ KTHX
 3561+
 3562+ BTW Allow user to remove the "new section"
 3563+ BTW link via __NONEWSECTIONLINK__
 3564+ IZ isset( $this->mDoubleUnderscores['nonewsectionlink'] )
 3565+ IM ON UR SPECIAL mOutput->hideNewSection DOING true
 3566+ KTHX
 3567+
 3568+ BTW if the string __FORCETOC__ (not case-sensitive) occurs in the HTML,
 3569+ BTW override above conditions and always show TOC above first header
 3570+ IZ isset( $this->mDoubleUnderscores['forcetoc'] )
 3571+ UR SPECIAL mShowToc IZ true;
 3572+ I HAS enoughToc IZ true
 3573+ KTHX
 3574+
 3575+ BTW We need this to perform operations on the HTML
 3576+ I HAS sk IZ $this->mOptions->getSkin()
 3577+
 3578+ BTW headline counter
 3579+ I HAS headlineCount IZ 0
 3580+ I HAS numVisible IZ 0
 3581+
 3582+ BTW Ugh .. the TOC should have neat indentation levels which can be
 3583+ BTW passed to the skin functions. These are determined here
 3584+ I HAS toc IZ ''
 3585+ I HAS full IZ ''
 3586+ I HAS head IZ EMPTY
 3587+ I HAS sublevelCount IZ EMPTY
 3588+ I HAS levelCount IZ EMPTY
 3589+ I HAS toclevel IZ 0
 3590+ I HAS level IZ 0
 3591+ I HAS prevlevel IZ 0
 3592+ I HAS toclevel IZ 0
 3593+ I HAS prevtoclevel IZ 0
 3594+ I HAS markerRegex IZ "{$this->mUniqPrefix}-h-(\d+)-" . self::MARKER_SUFFIX
 3595+ I HAS baseTitleText IZ $this->mTitle->getPrefixedDBkey()
 3596+ I HAS oldType IZ $this->mOutputType
 3597+ IM ON UR SPECIAL setOutputType DOING self::OT_WIKI
 3598+ I HAS frame IZ $this->getPreprocessor()->newFrame()
 3599+ I HAS root IZ $this->preprocessToDom( $origText )
 3600+ I HAS node IZ $root->getFirstChild()
 3601+ I HAS byteOffset IZ 0
 3602+ I HAS tocraw IZ EMPTY
 3603+
 3604+ foreach ( $matches[3] as $headline ) {
 3605+ I HAS isTemplate IZ false
 3606+ I HAS titleText IZ false
 3607+ I HAS sectionIndex IZ false
 3608+ I HAS numbering IZ ''
 3609+ I HAS markerMatches IZ EMPTY
 3610+ IZ preg_match("/^$markerRegex/", $headline, $markerMatches )
 3611+ I HAS serial IZ $markerMatches[1]
 3612+ list( $titleText, $sectionIndex ) = $this->mHeadings[$serial];
 3613+ I HAS isTemplate IZ ( $titleText != $baseTitleText )
 3614+ I HAS headline IZ preg_replace( "/^$markerRegex/", "", $headline )
 3615+ KTHX
 3616+
 3617+ IZ $toclevel
 3618+ I HAS prevlevel IZ $level
 3619+ I HAS prevtoclevel IZ $toclevel
 3620+ KTHX
 3621+ I HAS level IZ $matches[1][$headlineCount]
 3622+
 3623+ IZ $level > $prevlevel
 3624+ BTW Increase TOC level
 3625+ $toclevel++;
 3626+ $sublevelCount[$toclevel] = 0;
 3627+ IZ $toclevel<$wgMaxTocLevel
 3628+ I HAS prevtoclevel IZ $toclevel
 3629+ toc HAS MOAR $sk->tocIndent();
 3630+ $numVisible++;
 3631+ KTHX
 3632+ ORLY $level < $prevlevel && $toclevel > 1
 3633+ BTW Decrease TOC level, find level to jump to
 3634+
 3635+ for ( $i = $toclevel; $i > 0; $i-- ) {
 3636+ IZ $levelCount[$i] == $level
 3637+ BTW Found last matching level
 3638+ I HAS toclevel IZ $i
 3639+ break;
 3640+ ORLY $levelCount[$i] < $level
 3641+ BTW Found first matching level below current level
 3642+ I HAS toclevel IZ $i + 1
 3643+ break;
 3644+ KTHX
 3645+ KTHX
 3646+ IZ $i == 0
 3647+ I HAS toclevel IZ 1
 3648+ KTHX
 3649+ IZ $toclevel<$wgMaxTocLevel
 3650+ IZ $prevtoclevel < $wgMaxTocLevel
 3651+ BTW Unindent only if the previous toc level was shown :p
 3652+ toc HAS MOAR $sk->tocUnindent( $prevtoclevel - $toclevel );
 3653+ I HAS prevtoclevel IZ $toclevel
 3654+ NOWAI
 3655+ toc HAS MOAR $sk->tocLineEnd();
 3656+ KTHX
 3657+ KTHX
 3658+ NOWAI
 3659+ BTW No change in level, end TOC line
 3660+ IZ $toclevel<$wgMaxTocLevel
 3661+ toc HAS MOAR $sk->tocLineEnd();
 3662+ KTHX
 3663+ KTHX
 3664+
 3665+ $levelCount[$toclevel] = $level;
 3666+
 3667+ BTW count number of headlines for each level
 3668+ @$sublevelCount[$toclevel]++;
 3669+ I HAS dot IZ 0
 3670+ for( $i = 1; $i <= $toclevel; $i++ ) {
 3671+ IZ !empty( $sublevelCount[$i] )
 3672+ IZ $dot
 3673+ numbering HAS MOAR '.';
 3674+ KTHX
 3675+ numbering HAS MOAR $wgContLang->formatNum( $sublevelCount[$i] );
 3676+ I HAS dot IZ 1
 3677+ KTHX
 3678+ KTHX
 3679+
 3680+ BTW The safe header is a version of the header text safe to use for links
 3681+ BTW Avoid insertion of weird stuff like <math> by expanding the relevant sections
 3682+ I HAS safeHeadline IZ $this->mStripState->unstripBoth( $headline )
 3683+
 3684+ BTW Remove link placeholders by the link text.
 3685+ BTW <!--LINK number-->
 3686+ BTW turns into
 3687+ BTW link text with suffix
 3688+ I HAS safeHeadline IZ $this->replaceLinkHoldersText( $safeHeadline )
 3689+
 3690+ BTW Strip out HTML (other than plain <sup> and <sub>: bug 8393)
 3691+ tocline IZ preg_replace(
 3692+ array( '#<(?!/?(sup|sub)).*?'.'>#', '#<(/?(sup|sub)).*?'.'>#' ),
 3693+ array( '', '<$1>' ),
 3694+ $safeHeadline
 3695+ BUCKET
 3696+ I HAS tocline IZ trim( $tocline )
 3697+
 3698+ BTW For the anchor, strip out HTML-y stuff period
 3699+ I HAS safeHeadline IZ preg_replace( '/<.*?'.'>/', '', $safeHeadline )
 3700+ I HAS safeHeadline IZ preg_replace( '/[ _]+/', ' ', $safeHeadline )
 3701+ I HAS safeHeadline IZ trim( $safeHeadline )
 3702+
 3703+ BTW Save headline for section edit hint before it's escaped
 3704+ I HAS headlineHint IZ $safeHeadline
 3705+
 3706+ IZ $wgHtml5 && $wgExperimentalHtmlIds
 3707+ BTW For reverse compatibility, provide an id that's
 3708+ BTW HTML4-compatible, like we used to.
 3709+ BTW
 3710+ BTW It may be worth noting, academically, that it's possible for
 3711+ BTW the legacy anchor to conflict with a non-legacy headline
 3712+ BTW anchor on the page. In this case likely the "correct" thing
 3713+ BTW would be to either drop the legacy anchors or make sure
 3714+ BTW they're numbered first. However, this would require people
 3715+ BTW to type in section names like "abc_.D7.93.D7.90.D7.A4"
 3716+ BTW manually, so let's not bother worrying about it.
 3717+ legacyHeadline IZ Sanitizer::escapeId( $safeHeadline,
 3718+ IM ON UR array DOING 'noninitial', 'legacy' )
 3719+ I HAS safeHeadline IZ Sanitizer::escapeId( $safeHeadline )
 3720+
 3721+ IZ $legacyHeadline == $safeHeadline
 3722+ BTW No reason to have both (in fact, we can't)
 3723+ I HAS legacyHeadline IZ false
 3724+ KTHX
 3725+ NOWAI
 3726+ I HAS legacyHeadline IZ false
 3727+ safeHeadline IZ Sanitizer::escapeId( $safeHeadline,
 3728+ 'noninitial' );
 3729+ KTHX
 3730+
 3731+ BTW HTML names must be case-insensitively unique (bug 10721). FIXME:
 3732+ BTW Does this apply to Unicode characters? Because we aren't
 3733+ BTW handling those here.
 3734+ I HAS arrayKey IZ strtolower( $safeHeadline )
 3735+ IZ $legacyHeadline === false
 3736+ I HAS legacyArrayKey IZ false
 3737+ NOWAI
 3738+ I HAS legacyArrayKey IZ strtolower( $legacyHeadline )
 3739+ KTHX
 3740+
 3741+ BTW count how many in assoc. array so we can track dupes in anchors
 3742+ IZ isset( $refers[$arrayKey] )
 3743+ $refers[$arrayKey]++;
 3744+ NOWAI
 3745+ $refers[$arrayKey] = 1;
 3746+ KTHX
 3747+ IZ isset( $refers[$legacyArrayKey] )
 3748+ $refers[$legacyArrayKey]++;
 3749+ NOWAI
 3750+ $refers[$legacyArrayKey] = 1;
 3751+ KTHX
 3752+
 3753+ BTW Don't number the heading if it is the only one (looks silly)
 3754+ if ( $doNumberHeadings && count( $matches[3] ) > 1) {
 3755+ BTW the two are different if the line contains a link
 3756+ I HAS headline IZ $numbering . ' ' . $headline
 3757+ KTHX
 3758+
 3759+ BTW Create the anchor for linking from the TOC to the section
 3760+ I HAS anchor IZ $safeHeadline
 3761+ I HAS legacyAnchor IZ $legacyHeadline
 3762+ IZ $refers[$arrayKey] > 1
 3763+ anchor HAS MOAR '_' . $refers[$arrayKey];
 3764+ KTHX
 3765+ IZ $legacyHeadline !== false && $refers[$legacyArrayKey] > 1
 3766+ legacyAnchor HAS MOAR '_' . $refers[$legacyArrayKey];
 3767+ KTHX
 3768+ IZ $enoughToc && ( !isset( $wgMaxTocLevel ) || $toclevel < $wgMaxTocLevel )
 3769+ toc HAS MOAR $sk->tocLine( $anchor, $tocline,
 3770+ $numbering, $toclevel, ( $isTemplate ? false : $sectionIndex ) );
 3771+ KTHX
 3772+
 3773+ BTW Add the section to the section tree
 3774+ BTW Find the DOM node for this header
 3775+ STEALIN UR $node && !$isTemplate
 3776+ IZ $node->getName() === 'h'
 3777+ I HAS bits IZ $node->splitHeading()
 3778+ if ( $bits['i'] == $sectionIndex )
 3779+ break;
 3780+ KTHX
 3781+ $byteOffset += mb_strlen( $this->mStripState->unstripBoth(
 3782+ $frame->expand( $node, PPFrame::RECOVER_ORIG ) ) );
 3783+ I HAS node IZ $node->getNextSibling()
 3784+ KTHX
 3785+ $tocraw[] = array(
 3786+ 'toclevel' => $toclevel,
 3787+ 'level' => $level,
 3788+ 'line' => $tocline,
 3789+ 'number' => $numbering,
 3790+ 'index' => ( $isTemplate ? 'T-' : '' ) . $sectionIndex,
 3791+ 'fromtitle' => $titleText,
 3792+ 'byteoffset' => ( $isTemplate ? null : $byteOffset ),
 3793+ 'anchor' => $anchor,
 3794+ BUCKET
 3795+
 3796+ BTW give headline the correct <h#> tag
 3797+ IZ $showEditLink && $sectionIndex !== false
 3798+ IZ $isTemplate
 3799+ BTW Put a T flag in the section identifier, to indicate to extractSections()
 3800+ BTW that sections inside <includeonly> should be counted.
 3801+ I HAS editlink IZ $sk->doEditSectionLink( Title::newFromText( $titleText ), "T-$sectionIndex" )
 3802+ NOWAI
 3803+ I HAS editlink IZ $sk->doEditSectionLink( $this->mTitle, $sectionIndex, $headlineHint )
 3804+ KTHX
 3805+ NOWAI
 3806+ I HAS editlink IZ ''
 3807+ KTHX
 3808+ $head[$headlineCount] = $sk->makeHeadline( $level,
 3809+ $matches['attrib'][$headlineCount], $anchor, $headline,
 3810+ $editlink, $legacyAnchor );
 3811+
 3812+ $headlineCount++;
 3813+ KTHX
 3814+
 3815+ IM ON UR SPECIAL setOutputType DOING $oldType
 3816+
 3817+ BTW Never ever show TOC if no headers
 3818+ IZ $numVisible < 1
 3819+ I HAS enoughToc IZ false
 3820+ KTHX
 3821+
 3822+ IZ $enoughToc
 3823+ IZ $prevtoclevel > 0 && $prevtoclevel < $wgMaxTocLevel
 3824+ toc HAS MOAR $sk->tocUnindent( $prevtoclevel - 1 );
 3825+ KTHX
 3826+ I HAS toc IZ $sk->tocList( $toc )
 3827+ IM ON UR SPECIAL mOutput->setTOCHTML DOING $toc
 3828+ KTHX
 3829+
 3830+ IZ $isMain
 3831+ IM ON UR SPECIAL mOutput->setSections DOING $tocraw
 3832+ KTHX
 3833+
 3834+ BTW split up and insert constructed headlines
 3835+
 3836+ I HAS blocks IZ preg_split( '/<H[1-6].*?' . '>.*?<\/H[1-6]>/i', $text )
 3837+ I HAS i IZ 0
 3838+
 3839+ IM IN UR blocks ITZA block
 3840+ IZ $showEditLink && $headlineCount > 0 && $i == 0 && $block !== "\n"
 3841+ BTW This is the [edit] link that appears for the top block of text when
 3842+ BTW section editing is enabled
 3843+
 3844+ BTW Disabled because it broke block formatting
 3845+ BTW For example, a bullet point in the top line
 3846+ BTW $full .= $sk->editSectionLink(0);
 3847+ KTHX
 3848+ full HAS MOAR $block;
 3849+ IZ $enoughToc && !$i && $isMain && !$this->mForceTocPosition
 3850+ BTW Top anchor now in skin
 3851+ I HAS full IZ $full.$toc
 3852+ KTHX
 3853+
 3854+ IZ !empty( $head[$i] )
 3855+ full HAS MOAR $head[$i];
 3856+ KTHX
 3857+ $i++;
 3858+ KTHX
 3859+ IZ $this->mForceTocPosition
 3860+ I FOUND MAH str_replace( '<!--MWTOC-->', $toc, $full )
 3861+ NOWAI
 3862+ I FOUND MAH $full
 3863+ KTHX
 3864+ KTHX
 3865+
 3866+ DO NOT WANT
 3867+ NOT WANT Merge $tree2 into $tree1 by replacing the section with index
 3868+ NOT WANT $section in $tree1 and its descendants with the sections in $tree2.
 3869+ NOT WANT Note that in the returned section tree, only the 'index' and
 3870+ NOT WANT 'byteoffset' fields are guaranteed to be correct.
 3871+ NOT WANT @param $tree1 array Section tree from ParserOutput::getSectons()
 3872+ NOT WANT @param $tree2 array Section tree
 3873+ NOT WANT @param $section int Section index
 3874+ NOT WANT @param $title Title Title both section trees come from
 3875+ NOT WANT @param $len2 int Length of the original wikitext for $tree2
 3876+ NOT WANT @return array Merged section tree
 3877+ WANT
 3878+ SO IM ALWAYS LIKE mergeSectionTrees WITH UR $tree1, $tree2, $section, $title, $len2
 3879+ I HAS UR $wgContLang ON UR INTERNETS
 3880+ I HAS newTree IZ EMPTY
 3881+ I HAS targetLevel IZ false
 3882+ I HAS merged IZ false
 3883+ I HAS lastLevel IZ 1
 3884+ I HAS nextIndex IZ 1
 3885+ I HAS numbering IZ BUCKET 0 );
 3886+ I HAS titletext IZ $title->getPrefixedDBkey()
 3887+ IM IN UR tree1 ITZA s
 3888+ IZ $targetLevel !== false
 3889+ IZ $s['level'] <= $targetLevel
 3890+ BTW We've skipped enough
 3891+ I HAS targetLevel IZ false
 3892+ NOWAI
 3893+ continue;
 3894+ KTHX
 3895+ KTHX
 3896+ if ( $s['index'] != $section ||
 3897+ $s['fromtitle'] != $titletext ) {
 3898+ self::incrementNumbering( $numbering,
 3899+ $s['toclevel'], $lastLevel );
 3900+
 3901+ BTW Rewrite index, byteoffset and number
 3902+ IZ $s['fromtitle'] == $titletext
 3903+ $s['index'] = $nextIndex++;
 3904+ IZ $merged
 3905+ $s['byteoffset'] += $len2;
 3906+ KTHX
 3907+ KTHX
 3908+ $s['number'] = implode( '.', array_map(
 3909+ array( $wgContLang, 'formatnum' ),
 3910+ $numbering ) );
 3911+ I HAS lastLevel IZ $s['toclevel']
 3912+ $newTree[] = $s;
 3913+ NOWAI
 3914+ BTW We're at $section
 3915+ BTW Insert sections from $tree2 here
 3916+ IM IN UR tree2 ITZA s2
 3917+ BTW Rewrite the fields in $s2
 3918+ BTW before inserting it
 3919+ $s2['toclevel'] += $s['toclevel'] - 1;
 3920+ $s2['level'] += $s['level'] - 1;
 3921+ $s2['index'] = $nextIndex++;
 3922+ $s2['byteoffset'] += $s['byteoffset'];
 3923+
 3924+ self::incrementNumbering( $numbering,
 3925+ $s2['toclevel'], $lastLevel );
 3926+ $s2['number'] = implode( '.', array_map(
 3927+ array( $wgContLang, 'formatnum' ),
 3928+ $numbering ) );
 3929+ I HAS lastLevel IZ $s2['toclevel']
 3930+ $newTree[] = $s2;
 3931+ KTHX
 3932+ BTW Skip all descendants of $section in $tree1
 3933+ I HAS targetLevel IZ $s['level']
 3934+ I HAS merged IZ true
 3935+ KTHX
 3936+ KTHX
 3937+ I FOUND MAH $newTree
 3938+ KTHX
 3939+
 3940+ DO NOT WANT
 3941+ NOT WANT Increment a section number. Helper function for mergeSectionTrees()
 3942+ NOT WANT @param $number array Array representing a section number
 3943+ NOT WANT @param $level int Current TOC level (depth)
 3944+ NOT WANT @param $lastLevel int Level of previous TOC entry
 3945+ WANT
 3946+ SO IM ALWAYS LIKE incrementNumbering WITH UR &$number, $level, $lastLevel
 3947+ IZ $level > $lastLevel
 3948+ $number[$level - 1] = 1;
 3949+ ORLY $level < $lastLevel
 3950+ foreach ( $number as $key => $unused )
 3951+ IZ $key >= $level
 3952+ IM ON UR unset DOING $number[$key]
 3953+ KTHX
 3954+ $number[$level - 1]++;
 3955+ NOWAI
 3956+ $number[$level - 1]++;
 3957+ KTHX
 3958+ KTHX
 3959+
 3960+ DO NOT WANT
 3961+ NOT WANT Transform wiki markup when saving a page by doing \r\n -> \n
 3962+ NOT WANT conversion, substitting signatures, {{subst:}} templates, etc.
 3963+ NOT WANT
 3964+ NOT WANT @param string $text the text to transform
 3965+ NOT WANT @param Title &$title the Title object for the current article
 3966+ NOT WANT @param User $user the User object describing the current user
 3967+ NOT WANT @param ParserOptions $options parsing options
 3968+ NOT WANT @param bool $clearState whether to clear the parser state first
 3969+ NOT WANT @return string the altered wiki markup
 3970+ NOT WANT @public
 3971+ WANT
 3972+ SO IM LIKE preSaveTransform WITH UR $text, Title $title, $user, $options, $clearState = true
 3973+ UR SPECIAL mOptions IZ $options;
 3974+ IM ON UR SPECIAL setTitle DOING $title
 3975+ IM ON UR SPECIAL setOutputType DOING self::OT_WIKI
 3976+
 3977+ IZ $clearState
 3978+ IM ON UR SPECIAL clearState
 3979+ KTHX
 3980+
 3981+ I HAS pairs IZ BUCKET
 3982+ "\r\n" => "\n",
 3983+ BUCKET
 3984+ I HAS text IZ str_replace( array_keys( $pairs ), array_values( $pairs ), $text )
 3985+ I HAS text IZ $this->pstPass2( $text, $user )
 3986+ I HAS text IZ $this->mStripState->unstripBoth( $text )
 3987+ I FOUND MAH $text
 3988+ KTHX
 3989+
 3990+ DO NOT WANT
 3991+ NOT WANT Pre-save transform helper function
 3992+ NOT WANT @private
 3993+ WANT
 3994+ SO IM LIKE pstPass2 WITH UR $text, $user
 3995+ I HAS UR $wgContLang, $wgLocaltimezone ON UR INTERNETS
 3996+
 3997+ BTW Note: This is the timestamp saved as hardcoded wikitext to
 3998+ BTW the database, we use $wgContLang here in order to give
 3999+ BTW everyone the same signature and use the default one rather
 4000+ BTW than the one selected in each user's preferences.
 4001+ BTW (see also bug 12815)
 4002+ I HAS ts IZ $this->mOptions->getTimestamp()
 4003+ IZ isset( $wgLocaltimezone )
 4004+ I HAS tz IZ $wgLocaltimezone
 4005+ NOWAI
 4006+ I HAS tz IZ date_default_timezone_get()
 4007+ KTHX
 4008+
 4009+ I HAS unixts IZ wfTimestamp( TS_UNIX, $ts )
 4010+ I HAS oldtz IZ date_default_timezone_get()
 4011+ IM ON UR date_default_timezone_set DOING $tz
 4012+ I HAS ts IZ date( 'YmdHis', $unixts )
 4013+ I HAS tzMsg IZ date( 'T', $unixts ) # might vary on DST changeover!
 4014+
 4015+ BTW Allow translation of timezones trough wiki. date() can return
 4016+ BTW whatever crap the system uses, localised or not, so we cannot
 4017+ BTW ship premade translations.
 4018+ I HAS key IZ 'timezone-' . strtolower( trim( $tzMsg ) )
 4019+ I HAS value IZ wfMsgForContent( $key )
 4020+ IZ !wfEmptyMsg( $key, $value )
 4021+ I HAS tzMsg IZ $value
 4022+ KTHX
 4023+
 4024+ IM ON UR date_default_timezone_set DOING $oldtz
 4025+
 4026+ I HAS d IZ $wgContLang->timeanddate( $ts, false, false ) . " ($tzMsg)"
 4027+
 4028+ BTW Variable replacement
 4029+ BTW Because mOutputType is OT_WIKI, this will only process {{subst:xxx}} type tags
 4030+ I HAS text IZ $this->replaceVariables( $text )
 4031+
 4032+ BTW Signatures
 4033+ I HAS sigText IZ $this->getUserSig( $user )
 4034+ text IZ strtr( $text, array(
 4035+ '~~~~~' => $d,
 4036+ '~~~~' => "$sigText $d",
 4037+ '~~~' => $sigText
 4038+ ) );
 4039+
 4040+ BTW Context links: [[|name]] and [[name (context)|]]
 4041+ I HAS UR $wgLegalTitleChars ON UR INTERNETS
 4042+ I HAS tc IZ "[$wgLegalTitleChars]"
 4043+ I HAS nc IZ '[ _0-9A-Za-z\x80-\xff-]' # Namespaces can use non-ascii!
 4044+
 4045+ I HAS p1 IZ "/\[\[(:?$nc+:|:|)($tc+?)( \\($tc+\\))\\|]]/" # [[ns:page (context)|]]
 4046+ I HAS p4 IZ "/\[\[(:?$nc+:|:|)($tc+?)(($tc+))\\|]]/" # [[ns:page(context)|]]
 4047+ I HAS p3 IZ "/\[\[(:?$nc+:|:|)($tc+?)( \\($tc+\\)|)(, $tc+|)\\|]]/" # [[ns:page (context), context|]]
 4048+ I HAS p2 IZ "/\[\[\\|($tc+)]]/" # [[|page]]
 4049+
 4050+ BTW try $p1 first, to turn "[[A, B (C)|]]" into "[[A, B (C)|A, B]]"
 4051+ I HAS text IZ preg_replace( $p1, '[[\\1\\2\\3|\\2]]', $text )
 4052+ I HAS text IZ preg_replace( $p4, '[[\\1\\2\\3|\\2]]', $text )
 4053+ I HAS text IZ preg_replace( $p3, '[[\\1\\2\\3\\4|\\2]]', $text )
 4054+
 4055+ I HAS t IZ $this->mTitle->getText()
 4056+ I HAS m IZ EMPTY
 4057+ IZ preg_match( "/^($nc+:|)$tc+?( \\($tc+\\))$/", $t, $m )
 4058+ I HAS text IZ preg_replace( $p2, "[[$m[1]\\1$m[2]|\\1]]", $text )
 4059+ ORLY preg_match( "/^($nc+:|)$tc+?(, $tc+|)$/", $t, $m ) && "$m[1]$m[2]" != ''
 4060+ I HAS text IZ preg_replace( $p2, "[[$m[1]\\1$m[2]|\\1]]", $text )
 4061+ NOWAI
 4062+ BTW if there's no context, don't bother duplicating the title
 4063+ I HAS text IZ preg_replace( $p2, '[[\\1]]', $text )
 4064+ KTHX
 4065+
 4066+ BTW Trim trailing whitespace
 4067+ I HAS text IZ rtrim( $text )
 4068+
 4069+ I FOUND MAH $text
 4070+ KTHX
 4071+
 4072+ DO NOT WANT
 4073+ NOT WANT Fetch the user's signature text, if any, and normalize to
 4074+ NOT WANT validated, ready-to-insert wikitext.
 4075+ NOT WANT If you have pre-fetched the nickname or the fancySig option, you can
 4076+ NOT WANT specify them here to save a database query.
 4077+ NOT WANT
 4078+ NOT WANT @param User $user
 4079+ NOT WANT @return string
 4080+ WANT
 4081+ SO IM LIKE getUserSig WITH UR &$user, $nickname = false, $fancySig = null
 4082+ I HAS UR $wgMaxSigChars ON UR INTERNETS
 4083+
 4084+ I HAS username IZ $user->getName()
 4085+
 4086+ BTW If not given, retrieve from the user object.
 4087+ if ( $nickname === false )
 4088+ I HAS nickname IZ $user->getOption( 'nickname' )
 4089+
 4090+ IZ is_null( $fancySig )
 4091+ I HAS fancySig IZ $user->getBoolOption( 'fancysig' )
 4092+ KTHX
 4093+
 4094+ I HAS nickname IZ $nickname == null ? $username : $nickname
 4095+
 4096+ IZ mb_strlen( $nickname ) > $wgMaxSigChars
 4097+ I HAS nickname IZ $username
 4098+ IM ON UR wfDebug DOING __METHOD__ . ": $username has overlong signature.\n"
 4099+ ORLY $fancySig !== false
 4100+ BTW Sig. might contain markup; validate this
 4101+ IZ $this->validateSig( $nickname ) !== false
 4102+ BTW Validated; clean up (if needed) and return it
 4103+ I FOUND MAH $this->cleanSig( $nickname, true )
 4104+ NOWAI
 4105+ BTW Failed to validate; fall back to the default
 4106+ I HAS nickname IZ $username
 4107+ IM ON UR wfDebug DOING __METHOD__.": $username has bad XML tags in signature.\n"
 4108+ KTHX
 4109+ KTHX
 4110+
 4111+ BTW Make sure nickname doesnt get a sig in a sig
 4112+ I HAS nickname IZ $this->cleanSigInSig( $nickname )
 4113+
 4114+ BTW If we're still here, make it a link to the user page
 4115+ I HAS userText IZ wfEscapeWikiText( $username )
 4116+ I HAS nickText IZ wfEscapeWikiText( $nickname )
 4117+ if ( $user->isAnon() ) {
 4118+ I FOUND MAH wfMsgExt( 'signature-anon', array( 'content', 'parsemag' ), $userText, $nickText )
 4119+ NOWAI
 4120+ I FOUND MAH wfMsgExt( 'signature', array( 'content', 'parsemag' ), $userText, $nickText )
 4121+ KTHX
 4122+ KTHX
 4123+
 4124+ DO NOT WANT
 4125+ NOT WANT Check that the user's signature contains no bad XML
 4126+ NOT WANT
 4127+ NOT WANT @param string $text
 4128+ NOT WANT @return mixed An expanded string, or false if invalid.
 4129+ WANT
 4130+ SO IM LIKE validateSig WITH UR $text
 4131+ IM ON UR return DOING Xml::isWellFormedXmlFragment( $text ) ? $text : false
 4132+ KTHX
 4133+
 4134+ DO NOT WANT
 4135+ NOT WANT Clean up signature text
 4136+ NOT WANT
 4137+ NOT WANT 1) Strip ~~~, ~~~~ and ~~~~~ out of signatures @see cleanSigInSig
 4138+ NOT WANT 2) Substitute all transclusions
 4139+ NOT WANT
 4140+ NOT WANT @param string $text
 4141+ NOT WANT @param $parsing Whether we're cleaning (preferences save) or parsing
 4142+ NOT WANT @return string Signature text
 4143+ WANT
 4144+ SO IM LIKE cleanSig WITH UR $text, $parsing = false
 4145+ IZ !$parsing
 4146+ I HAS UR $wgTitle ON UR INTERNETS
 4147+ IM ON UR SPECIAL clearState
 4148+ IM ON UR SPECIAL setTitle DOING $wgTitle
 4149+ UR SPECIAL mOptions IZ new ParserOptions;
 4150+ UR SPECIAL setOutputType IZ self::OT_PREPROCESS;
 4151+ KTHX
 4152+
 4153+ BTW Option to disable this feature
 4154+ IZ !$this->mOptions->getCleanSignatures()
 4155+ I FOUND MAH $text
 4156+ KTHX
 4157+
 4158+ BTW FIXME: regex doesn't respect extension tags or nowiki
 4159+ BTW => Move this logic to braceSubstitution()
 4160+ I HAS substWord IZ MagicWord::get( 'subst' )
 4161+ I HAS substRegex IZ '/\{\{(?!(?:' . $substWord->getBaseRegex() . '))/x' . $substWord->getRegexCase()
 4162+ I HAS substText IZ '{{' . $substWord->getSynonym( 0 )
 4163+
 4164+ I HAS text IZ preg_replace( $substRegex, $substText, $text )
 4165+ I HAS text IZ $this->cleanSigInSig( $text )
 4166+ I HAS dom IZ $this->preprocessToDom( $text )
 4167+ I HAS frame IZ $this->getPreprocessor()->newFrame()
 4168+ I HAS text IZ $frame->expand( $dom )
 4169+
 4170+ IZ !$parsing
 4171+ I HAS text IZ $this->mStripState->unstripBoth( $text )
 4172+ KTHX
 4173+
 4174+ I FOUND MAH $text
 4175+ KTHX
 4176+
 4177+ DO NOT WANT
 4178+ NOT WANT Strip ~~~, ~~~~ and ~~~~~ out of signatures
 4179+ NOT WANT @param string $text
 4180+ NOT WANT @return string Signature text with /~{3,5}/ removed
 4181+ WANT
 4182+ SO IM LIKE cleanSigInSig WITH UR $text
 4183+ I HAS text IZ preg_replace( '/~{3,5}/', '', $text )
 4184+ I FOUND MAH $text
 4185+ KTHX
 4186+
 4187+ DO NOT WANT
 4188+ NOT WANT Set up some variables which are usually set up in parse()
 4189+ NOT WANT so that an external function can call some class members with confidence
 4190+ NOT WANT @public
 4191+ WANT
 4192+ SO IM LIKE startExternalParse WITH UR &$title, $options, $outputType, $clearState = true
 4193+ IM ON UR SPECIAL setTitle DOING $title
 4194+ UR SPECIAL mOptions IZ $options;
 4195+ IM ON UR SPECIAL setOutputType DOING $outputType
 4196+ IZ $clearState
 4197+ IM ON UR SPECIAL clearState
 4198+ KTHX
 4199+ KTHX
 4200+
 4201+ DO NOT WANT
 4202+ NOT WANT Wrapper for preprocess()
 4203+ NOT WANT
 4204+ NOT WANT @param string $text the text to preprocess
 4205+ NOT WANT @param ParserOptions $options options
 4206+ NOT WANT @return string
 4207+ NOT WANT @public
 4208+ WANT
 4209+ SO IM LIKE transformMsg WITH UR $text, $options
 4210+ I HAS UR $wgTitle ON UR INTERNETS
 4211+ static $executing = false;
 4212+
 4213+ BTW Guard against infinite recursion
 4214+ IZ $executing
 4215+ I FOUND MAH $text
 4216+ KTHX
 4217+ I HAS executing IZ true
 4218+
 4219+ IM ON UR wfProfileIn DOING __METHOD__
 4220+ I HAS text IZ $this->preprocess( $text, $wgTitle, $options )
 4221+
 4222+ I HAS executing IZ false
 4223+ IM ON UR wfProfileOut DOING __METHOD__
 4224+ I FOUND MAH $text
 4225+ KTHX
 4226+
 4227+ DO NOT WANT
 4228+ NOT WANT Create an HTML-style tag, e.g. <yourtag>special text</yourtag>
 4229+ NOT WANT The callback should have the following form:
 4230+ NOT WANT function myParserHook( $text, $params, &$parser ) { ... }
 4231+ NOT WANT
 4232+ NOT WANT Transform and return $text. Use $parser for any required context, e.g. use
 4233+ NOT WANT $parser->getTitle() and $parser->getOptions() not $wgTitle or $wgOut->mParserOptions
 4234+ NOT WANT
 4235+ NOT WANT @public
 4236+ NOT WANT
 4237+ NOT WANT @param mixed $tag The tag to use, e.g. 'hook' for <hook>
 4238+ NOT WANT @param mixed $callback The callback function (and object) to use for the tag
 4239+ NOT WANT
 4240+ NOT WANT @return The old value of the mTagHooks array associated with the hook
 4241+ WANT
 4242+ SO IM LIKE setHook WITH UR $tag, $callback
 4243+ I HAS tag IZ strtolower( $tag )
 4244+ I HAS oldVal IZ isset( $this->mTagHooks[$tag] ) ? $this->mTagHooks[$tag] : null
 4245+ $this->mTagHooks[$tag] = $callback;
 4246+ IZ !in_array( $tag, $this->mStripList )
 4247+ $this->mStripList[] = $tag;
 4248+ KTHX
 4249+
 4250+ I FOUND MAH $oldVal
 4251+ KTHX
 4252+
 4253+ SO IM LIKE setTransparentTagHook WITH UR $tag, $callback
 4254+ I HAS tag IZ strtolower( $tag )
 4255+ I HAS oldVal IZ isset( $this->mTransparentTagHooks[$tag] ) ? $this->mTransparentTagHooks[$tag] : null
 4256+ $this->mTransparentTagHooks[$tag] = $callback;
 4257+
 4258+ I FOUND MAH $oldVal
 4259+ KTHX
 4260+
 4261+ DO NOT WANT
 4262+ NOT WANT Remove all tag hooks
 4263+ WANT
 4264+ SO IM LIKE clearTagHooks
 4265+ UR SPECIAL mTagHooks IZ EMPTY;
 4266+ UR SPECIAL mStripList IZ $this->mDefaultStripList;
 4267+ KTHX
 4268+
 4269+ DO NOT WANT
 4270+ NOT WANT Create a function, e.g. {{sum:1|2|3}}
 4271+ NOT WANT The callback function should have the form:
 4272+ NOT WANT function myParserFunction( &$parser, $arg1, $arg2, $arg3 ) { ... }
 4273+ NOT WANT
 4274+ NOT WANT Or with SFH_OBJECT_ARGS:
 4275+ NOT WANT function myParserFunction( $parser, $frame, $args ) { ... }
 4276+ NOT WANT
 4277+ NOT WANT The callback may either return the text result of the function, or an array with the text
 4278+ NOT WANT in element 0, and a number of flags in the other elements. The names of the flags are
 4279+ NOT WANT specified in the keys. Valid flags are:
 4280+ NOT WANT found The text returned is valid, stop processing the template. This
 4281+ NOT WANT is on by default.
 4282+ NOT WANT nowiki Wiki markup in the return value should be escaped
 4283+ NOT WANT isHTML The returned text is HTML, armour it against wikitext transformation
 4284+ NOT WANT
 4285+ NOT WANT @public
 4286+ NOT WANT
 4287+ NOT WANT @param string $id The magic word ID
 4288+ NOT WANT @param mixed $callback The callback function (and object) to use
 4289+ NOT WANT @param integer $flags a combination of the following flags:
 4290+ NOT WANT SFH_NO_HASH No leading hash, i.e. {{plural:...}} instead of {{#if:...}}
 4291+ NOT WANT
 4292+ NOT WANT SFH_OBJECT_ARGS Pass the template arguments as PPNode objects instead of text. This
 4293+ NOT WANT allows for conditional expansion of the parse tree, allowing you to eliminate dead
 4294+ NOT WANT branches and thus speed up parsing. It is also possible to analyse the parse tree of
 4295+ NOT WANT the arguments, and to control the way they are expanded.
 4296+ NOT WANT
 4297+ NOT WANT The $frame parameter is a PPFrame. This can be used to produce expanded text from the
 4298+ NOT WANT arguments, for instance:
 4299+ NOT WANT $text = isset( $args[0] ) ? $frame->expand( $args[0] ) : '';
 4300+ NOT WANT
 4301+ NOT WANT For technical reasons, $args[0] is pre-expanded and will be a string. This may change in
 4302+ NOT WANT future versions. Please call $frame->expand() on it anyway so that your code keeps
 4303+ NOT WANT working if/when this is changed.
 4304+ NOT WANT
 4305+ NOT WANT If you want whitespace to be trimmed from $args, you need to do it yourself, post-
 4306+ NOT WANT expansion.
 4307+ NOT WANT
 4308+ NOT WANT Please read the documentation in includes/parser/Preprocessor.php for more information
 4309+ NOT WANT about the methods available in PPFrame and PPNode.
 4310+ NOT WANT
 4311+ NOT WANT @return The old callback function for this name, if any
 4312+ WANT
 4313+ SO IM LIKE setFunctionHook WITH UR $id, $callback, $flags = 0
 4314+ I HAS UR $wgContLang ON UR INTERNETS
 4315+
 4316+ I HAS oldVal IZ isset( $this->mFunctionHooks[$id] ) ? $this->mFunctionHooks[$id][0] : null
 4317+ $this->mFunctionHooks[$id] = array( $callback, $flags );
 4318+
 4319+ BTW Add to function cache
 4320+ I HAS mw IZ MagicWord::get( $id )
 4321+ if ( !$mw )
 4322+ throw new MWException( __METHOD__.'() expecting a magic word identifier.' );
 4323+
 4324+ I HAS synonyms IZ $mw->getSynonyms()
 4325+ I HAS sensitive IZ intval( $mw->isCaseSensitive() )
 4326+
 4327+ IM IN UR synonyms ITZA syn
 4328+ BTW Case
 4329+ IZ !$sensitive
 4330+ I HAS syn IZ $wgContLang->lc( $syn )
 4331+ KTHX
 4332+ BTW Add leading hash
 4333+ IZ !( $flags & SFH_NO_HASH )
 4334+ I HAS syn IZ '#' . $syn
 4335+ KTHX
 4336+ BTW Remove trailing colon
 4337+ IZ substr( $syn, -1, 1 ) === ':'
 4338+ I HAS syn IZ substr( $syn, 0, -1 )
 4339+ KTHX
 4340+ $this->mFunctionSynonyms[$sensitive][$syn] = $id;
 4341+ KTHX
 4342+ I FOUND MAH $oldVal
 4343+ KTHX
 4344+
 4345+ DO NOT WANT
 4346+ NOT WANT Get all registered function hook identifiers
 4347+ NOT WANT
 4348+ NOT WANT @return array
 4349+ WANT
 4350+ SO IM LIKE getFunctionHooks
 4351+ I FOUND MAH array_keys( $this->mFunctionHooks )
 4352+ KTHX
 4353+
 4354+ DO NOT WANT
 4355+ NOT WANT Create a tag function, e.g. <test>some stuff</test>.
 4356+ NOT WANT Unlike tag hooks, tag functions are parsed at preprocessor level.
 4357+ NOT WANT Unlike parser functions, their content is not preprocessed.
 4358+ WANT
 4359+ SO IM LIKE setFunctionTagHook WITH UR $tag, $callback, $flags
 4360+ I HAS tag IZ strtolower( $tag )
 4361+ old IZ isset( $this->mFunctionTagHooks[$tag] ) ?
 4362+ $this->mFunctionTagHooks[$tag] : null;
 4363+ $this->mFunctionTagHooks[$tag] = array( $callback, $flags );
 4364+
 4365+ IZ !in_array( $tag, $this->mStripList )
 4366+ $this->mStripList[] = $tag;
 4367+ KTHX
 4368+
 4369+ I FOUND MAH $old
 4370+ KTHX
 4371+
 4372+ DO NOT WANT
 4373+ NOT WANT FIXME: update documentation. makeLinkObj() is deprecated.
 4374+ NOT WANT Replace <!--LINK--> link placeholders with actual links, in the buffer
 4375+ NOT WANT Placeholders created in Skin::makeLinkObj()
 4376+ NOT WANT Returns an array of link CSS classes, indexed by PDBK.
 4377+ WANT
 4378+ SO IM LIKE replaceLinkHolders WITH UR &$text, $options = 0
 4379+ I FOUND MAH $this->mLinkHolders->replace( $text )
 4380+ KTHX
 4381+
 4382+ DO NOT WANT
 4383+ NOT WANT Replace <!--LINK--> link placeholders with plain text of links
 4384+ NOT WANT (not HTML-formatted).
 4385+ NOT WANT @param string $text
 4386+ NOT WANT @return string
 4387+ WANT
 4388+ SO IM LIKE replaceLinkHoldersText WITH UR $text
 4389+ I FOUND MAH $this->mLinkHolders->replaceText( $text )
 4390+ KTHX
 4391+
 4392+ DO NOT WANT
 4393+ NOT WANT Renders an image gallery from a text with one line per image.
 4394+ NOT WANT text labels may be given by using |-style alternative text. E.g.
 4395+ NOT WANT Image:one.jpg|The number "1"
 4396+ NOT WANT Image:tree.jpg|A tree
 4397+ NOT WANT given as text will return the HTML of a gallery with two images,
 4398+ NOT WANT labeled 'The number "1"' and
 4399+ NOT WANT 'A tree'.
 4400+ WANT
 4401+ SO IM LIKE renderImageGallery WITH UR $text, $params
 4402+ I HAS ig IZ new ImageGallery()
 4403+ $ig->setContextTitle( $this->mTitle );
 4404+ $ig->setShowBytes( false );
 4405+ $ig->setShowFilename( false );
 4406+ $ig->setParser( $this );
 4407+ $ig->setHideBadImages();
 4408+ $ig->setAttributes( Sanitizer::validateTagAttributes( $params, 'table' ) );
 4409+ $ig->useSkin( $this->mOptions->getSkin() );
 4410+ $ig->mRevisionId = $this->mRevisionId;
 4411+
 4412+ IZ isset( $params['showfilename'] )
 4413+ $ig->setShowFilename( true );
 4414+ NOWAI
 4415+ $ig->setShowFilename( false );
 4416+ KTHX
 4417+ IZ isset( $params['caption'] )
 4418+ I HAS caption IZ $params['caption']
 4419+ I HAS caption IZ htmlspecialchars( $caption )
 4420+ I HAS caption IZ $this->replaceInternalLinks( $caption )
 4421+ $ig->setCaptionHtml( $caption );
 4422+ KTHX
 4423+ IZ isset( $params['perrow'] )
 4424+ $ig->setPerRow( $params['perrow'] );
 4425+ KTHX
 4426+ IZ isset( $params['widths'] )
 4427+ $ig->setWidths( $params['widths'] );
 4428+ KTHX
 4429+ IZ isset( $params['heights'] )
 4430+ $ig->setHeights( $params['heights'] );
 4431+ KTHX
 4432+
 4433+ IM ON UR wfRunHooks DOING 'BeforeParserrenderImageGallery', array( &$this, &$ig )
 4434+
 4435+ I HAS lines IZ StringUtils::explode( "\n", $text )
 4436+ IM IN UR lines ITZA line
 4437+ BTW match lines like these:
 4438+ BTW Image:someimage.jpg|This is some image
 4439+ I HAS matches IZ EMPTY
 4440+ IM ON UR preg_match DOING "/^([^|]+)(\\|(.*))?$/", $line, $matches
 4441+ BTW Skip empty lines
 4442+ IZ count( $matches ) == 0
 4443+ continue;
 4444+ KTHX
 4445+
 4446+ IZ strpos( $matches[0], '%' ) !== false
 4447+ $matches[1] = urldecode( $matches[1] );
 4448+ KTHX
 4449+ I HAS tp IZ Title::newFromText( $matches[1] )
 4450+ $nt =& $tp;
 4451+ IZ is_null( $nt )
 4452+ BTW Bogus title. Ignore these so we don't bomb out later.
 4453+ continue;
 4454+ KTHX
 4455+ IZ isset( $matches[3] )
 4456+ I HAS label IZ $matches[3]
 4457+ NOWAI
 4458+ I HAS label IZ ''
 4459+ KTHX
 4460+
 4461+ I HAS html IZ $this->recursiveTagParse( trim( $label ) )
 4462+
 4463+ $ig->add( $nt, $html );
 4464+
 4465+ BTW Only add real images (bug #5586)
 4466+ IZ $nt->getNamespace() == NS_FILE
 4467+ IM ON UR SPECIAL mOutput->addImage DOING $nt->getDBkey()
 4468+ KTHX
 4469+ KTHX
 4470+ I FOUND MAH $ig->toHTML()
 4471+ KTHX
 4472+
 4473+ SO IM LIKE getImageParams WITH UR $handler
 4474+ IZ $handler
 4475+ I HAS handlerClass IZ get_class( $handler )
 4476+ NOWAI
 4477+ I HAS handlerClass IZ ''
 4478+ KTHX
 4479+ IZ !isset( $this->mImageParams[$handlerClass] )
 4480+ BTW Initialise static lists
 4481+ static $internalParamNames = array(
 4482+ 'horizAlign' => array( 'left', 'right', 'center', 'none' ),
 4483+ 'vertAlign' => array( 'baseline', 'sub', 'super', 'top', 'text-top', 'middle',
 4484+ 'bottom', 'text-bottom' ),
 4485+ 'frame' => array( 'thumbnail', 'manualthumb', 'framed', 'frameless',
 4486+ 'upright', 'border', 'link', 'alt' ),
 4487+ BUCKET
 4488+ static $internalParamMap;
 4489+ IZ !$internalParamMap
 4490+ I HAS internalParamMap IZ EMPTY
 4491+ IM IN UR internalParamNames ITZA type => $names
 4492+ IM IN UR names ITZA name
 4493+ I HAS magicName IZ str_replace( '-', '_', "img_$name" )
 4494+ $internalParamMap[$magicName] = array( $type, $name );
 4495+ KTHX
 4496+ KTHX
 4497+ KTHX
 4498+
 4499+ BTW Add handler params
 4500+ I HAS paramMap IZ $internalParamMap
 4501+ IZ $handler
 4502+ I HAS handlerParamMap IZ $handler->getParamMap()
 4503+ IM IN UR handlerParamMap ITZA magic => $paramName
 4504+ $paramMap[$magic] = array( 'handler', $paramName );
 4505+ KTHX
 4506+ KTHX
 4507+ $this->mImageParams[$handlerClass] = $paramMap;
 4508+ $this->mImageParamsMagicArray[$handlerClass] = new MagicWordArray( array_keys( $paramMap ) );
 4509+ KTHX
 4510+ I FOUND MAH array( $this->mImageParams[$handlerClass], $this->mImageParamsMagicArray[$handlerClass] )
 4511+ KTHX
 4512+
 4513+ DO NOT WANT
 4514+ NOT WANT Parse image options text and use it to make an image
 4515+ NOT WANT @param Title $title
 4516+ NOT WANT @param string $options
 4517+ NOT WANT @param LinkHolderArray $holders
 4518+ WANT
 4519+ SO IM LIKE makeImage WITH UR $title, $options, $holders = false
 4520+ BTW Check if the options text is of the form "options|alt text"
 4521+ BTW Options are:
 4522+ BTW * thumbnail make a thumbnail with enlarge-icon and caption, alignment depends on lang
 4523+ BTW * left no resizing, just left align. label is used for alt= only
 4524+ BTW * right same, but right aligned
 4525+ BTW * none same, but not aligned
 4526+ BTW * ___px scale to ___ pixels width, no aligning. e.g. use in taxobox
 4527+ BTW * center center the image
 4528+ BTW * frame Keep original image size, no magnify-button.
 4529+ BTW * framed Same as "frame"
 4530+ BTW * frameless like 'thumb' but without a frame. Keeps user preferences for width
 4531+ BTW * upright reduce width for upright images, rounded to full __0 px
 4532+ BTW * border draw a 1px border around the image
 4533+ BTW * alt Text for HTML alt attribute (defaults to empty)
 4534+ BTW * link Set the target of the image link. Can be external, interwiki, or local
 4535+ BTW vertical-align values (no % or length right now):
 4536+ BTW * baseline
 4537+ BTW * sub
 4538+ BTW * super
 4539+ BTW * top
 4540+ BTW * text-top
 4541+ BTW * middle
 4542+ BTW * bottom
 4543+ BTW * text-bottom
 4544+
 4545+ I HAS parts IZ StringUtils::explode( "|", $options )
 4546+ I HAS sk IZ $this->mOptions->getSkin()
 4547+
 4548+ BTW Give extensions a chance to select the file revision for us
 4549+ I HAS skip IZ $time = $descQuery = false
 4550+ IM ON UR wfRunHooks DOING 'BeforeParserMakeImageLinkObj', array( &$this, &$title, &$skip, &$time, &$descQuery )
 4551+
 4552+ IZ $skip
 4553+ I FOUND MAH $sk->link( $title )
 4554+ KTHX
 4555+
 4556+ BTW Get the file
 4557+ I HAS imagename IZ $title->getDBkey()
 4558+ I HAS file IZ wfFindFile( $title, array( 'time' => $time ) )
 4559+ BTW Get parameter map
 4560+ I HAS handler IZ $file ? $file->getHandler() : false
 4561+
 4562+ IM ON UR list DOING $paramMap, $mwArray ) = $this->getImageParams( $handler
 4563+
 4564+ BTW Process the input parameters
 4565+ I HAS caption IZ ''
 4566+ I HAS params IZ BUCKET 'frame' => array(), 'handler' => array(),
 4567+ 'horizAlign' => array(), 'vertAlign' => array() );
 4568+ IM IN UR parts ITZA part
 4569+ I HAS part IZ trim( $part )
 4570+ IM ON UR list DOING $magicName, $value ) = $mwArray->matchVariableStartToEnd( $part
 4571+ I HAS validated IZ false
 4572+ IZ isset( $paramMap[$magicName] )
 4573+ list( $type, $paramName ) = $paramMap[$magicName];
 4574+
 4575+ BTW Special case; width and height come in one variable together
 4576+ IZ $type === 'handler' && $paramName === 'width'
 4577+ I HAS m IZ EMPTY
 4578+ BTW (bug 13500) In both cases (width/height and width only),
 4579+ BTW permit trailing "px" for backward compatibility.
 4580+ IZ preg_match( '/^([0-9]*)x([0-9]*)\s*(?:px)?\s*$/', $value, $m )
 4581+ I HAS width IZ intval( $m[1] )
 4582+ I HAS height IZ intval( $m[2] )
 4583+ IZ $handler->validateParam( 'width', $width )
 4584+ $params[$type]['width'] = $width;
 4585+ I HAS validated IZ true
 4586+ KTHX
 4587+ IZ $handler->validateParam( 'height', $height )
 4588+ $params[$type]['height'] = $height;
 4589+ I HAS validated IZ true
 4590+ KTHX
 4591+ ORLY preg_match( '/^[0-9]*\s*(?:px)?\s*$/', $value )
 4592+ I HAS width IZ intval( $value )
 4593+ IZ $handler->validateParam( 'width', $width )
 4594+ $params[$type]['width'] = $width;
 4595+ I HAS validated IZ true
 4596+ KTHX
 4597+ KTHX # else no validation -- bug 13436
 4598+ NOWAI
 4599+ IZ $type === 'handler'
 4600+ BTW Validate handler parameter
 4601+ I HAS validated IZ $handler->validateParam( $paramName, $value )
 4602+ NOWAI
 4603+ BTW Validate internal parameters
 4604+ switch( $paramName ) {
 4605+ case 'manualthumb':
 4606+ case 'alt':
 4607+ BTW @todo Fixme: possibly check validity here for
 4608+ BTW manualthumb? downstream behavior seems odd with
 4609+ BTW missing manual thumbs.
 4610+ I HAS validated IZ true
 4611+ I HAS value IZ $this->stripAltText( $value, $holders )
 4612+ break;
 4613+ case 'link':
 4614+ I HAS chars IZ self::EXT_LINK_URL_CLASS
 4615+ I HAS prots IZ $this->mUrlProtocols
 4616+ IZ $value === ''
 4617+ I HAS paramName IZ 'no-link'
 4618+ I HAS value IZ true
 4619+ I HAS validated IZ true
 4620+ ORLY preg_match( "/^$prots/", $value )
 4621+ IZ preg_match( "/^($prots)$chars+$/", $value, $m )
 4622+ I HAS paramName IZ 'link-url'
 4623+ IM ON UR SPECIAL mOutput->addExternalLink DOING $value
 4624+ I HAS validated IZ true
 4625+ KTHX
 4626+ NOWAI
 4627+ I HAS linkTitle IZ Title::newFromText( $value )
 4628+ IZ $linkTitle
 4629+ I HAS paramName IZ 'link-title'
 4630+ I HAS value IZ $linkTitle
 4631+ IM ON UR SPECIAL mOutput->addLink DOING $linkTitle
 4632+ I HAS validated IZ true
 4633+ KTHX
 4634+ KTHX
 4635+ break;
 4636+ default:
 4637+ BTW Most other things appear to be empty or numeric...
 4638+ I HAS validated IZ ( $value === false || is_numeric( trim( $value ) ) )
 4639+ KTHX
 4640+ KTHX
 4641+
 4642+ IZ $validated
 4643+ $params[$type][$paramName] = $value;
 4644+ KTHX
 4645+ KTHX
 4646+ KTHX
 4647+ IZ !$validated
 4648+ I HAS caption IZ $part
 4649+ KTHX
 4650+ KTHX
 4651+
 4652+ BTW Process alignment parameters
 4653+ IZ $params['horizAlign']
 4654+ $params['frame']['align'] = key( $params['horizAlign'] );
 4655+ KTHX
 4656+ IZ $params['vertAlign']
 4657+ $params['frame']['valign'] = key( $params['vertAlign'] );
 4658+ KTHX
 4659+
 4660+ $params['frame']['caption'] = $caption;
 4661+
 4662+ BTW Will the image be presented in a frame, with the caption below?
 4663+ imageIsFramed IZ isset( $params['frame']['frame'] ) ||
 4664+ isset( $params['frame']['framed'] ) ||
 4665+ isset( $params['frame']['thumbnail'] ) ||
 4666+ IM ON UR isset DOING $params['frame']['manualthumb']
 4667+
 4668+ BTW In the old days, [[Image:Foo|text...]] would set alt text. Later it
 4669+ BTW came to also set the caption, ordinary text after the image -- which
 4670+ BTW makes no sense, because that just repeats the text multiple times in
 4671+ BTW screen readers. It *also* came to set the title attribute.
 4672+ BTW
 4673+ BTW Now that we have an alt attribute, we should not set the alt text to
 4674+ BTW equal the caption: that's worse than useless, it just repeats the
 4675+ BTW text. This is the framed/thumbnail case. If there's no caption, we
 4676+ BTW use the unnamed parameter for alt text as well, just for the time be-
 4677+ BTW ing, if the unnamed param is set and the alt param is not.
 4678+ BTW
 4679+ BTW For the future, we need to figure out if we want to tweak this more,
 4680+ BTW e.g., introducing a title= parameter for the title; ignoring the un-
 4681+ BTW named parameter entirely for images without a caption; adding an ex-
 4682+ BTW plicit caption= parameter and preserving the old magic unnamed para-
 4683+ BTW meter for BC; ...
 4684+ IZ $imageIsFramed # Framed image
 4685+ IZ $caption === '' && !isset( $params['frame']['alt'] )
 4686+ BTW No caption or alt text, add the filename as the alt text so
 4687+ BTW that screen readers at least get some description of the image
 4688+ $params['frame']['alt'] = $title->getText();
 4689+ KTHX
 4690+ BTW Do not set $params['frame']['title'] because tooltips don't make sense
 4691+ BTW for framed images
 4692+ NOWAI # Inline image
 4693+ IZ !isset( $params['frame']['alt'] )
 4694+ BTW No alt text, use the "caption" for the alt text
 4695+ if ( $caption !== '') {
 4696+ $params['frame']['alt'] = $this->stripAltText( $caption, $holders );
 4697+ NOWAI
 4698+ BTW No caption, fall back to using the filename for the
 4699+ BTW alt text
 4700+ $params['frame']['alt'] = $title->getText();
 4701+ KTHX
 4702+ KTHX
 4703+ BTW Use the "caption" for the tooltip text
 4704+ $params['frame']['title'] = $this->stripAltText( $caption, $holders );
 4705+ KTHX
 4706+
 4707+ IM ON UR wfRunHooks DOING 'ParserMakeImageParams', array( $title, $file, &$params )
 4708+
 4709+ BTW Linker does the rest
 4710+ I HAS ret IZ $sk->makeImageLink2( $title, $file, $params['frame'], $params['handler'], $time, $descQuery )
 4711+
 4712+ BTW Give the handler a chance to modify the parser object
 4713+ IZ $handler
 4714+ $handler->parserTransformHook( $this, $file );
 4715+ KTHX
 4716+
 4717+ I FOUND MAH $ret
 4718+ KTHX
 4719+
 4720+ SO IM LIKE stripAltText WITH UR $caption, $holders
 4721+ BTW Strip bad stuff out of the title (tooltip). We can't just use
 4722+ BTW replaceLinkHoldersText() here, because if this function is called
 4723+ BTW from replaceInternalLinks2(), mLinkHolders won't be up-to-date.
 4724+ IZ $holders
 4725+ I HAS tooltip IZ $holders->replaceText( $caption )
 4726+ NOWAI
 4727+ I HAS tooltip IZ $this->replaceLinkHoldersText( $caption )
 4728+ KTHX
 4729+
 4730+ BTW make sure there are no placeholders in thumbnail attributes
 4731+ BTW that are later expanded to html- so expand them now and
 4732+ BTW remove the tags
 4733+ I HAS tooltip IZ $this->mStripState->unstripBoth( $tooltip )
 4734+ I HAS tooltip IZ Sanitizer::stripAllTags( $tooltip )
 4735+
 4736+ I FOUND MAH $tooltip
 4737+ KTHX
 4738+
 4739+ DO NOT WANT
 4740+ NOT WANT Set a flag in the output object indicating that the content is dynamic and
 4741+ NOT WANT shouldn't be cached.
 4742+ WANT
 4743+ SO IM LIKE disableCache
 4744+ IM ON UR wfDebug DOING "Parser output marked as uncacheable.\n"
 4745+ UR SPECIAL mOutput->mCacheTime IZ -1;
 4746+ KTHX
 4747+
 4748+ DO NOT WANT#@+
 4749+ NOT WANT Callback from the Sanitizer for expanding items found in HTML attribute
 4750+ NOT WANT values, so they can be safely tested and escaped.
 4751+ NOT WANT @param string $text
 4752+ NOT WANT @param PPFrame $frame
 4753+ NOT WANT @return string
 4754+ NOT WANT @private
 4755+ WANT
 4756+ SO IM LIKE attributeStripCallback WITH UR &$text, $frame = false
 4757+ I HAS text IZ $this->replaceVariables( $text, $frame )
 4758+ I HAS text IZ $this->mStripState->unstripBoth( $text )
 4759+ I FOUND MAH $text
 4760+ KTHX
 4761+
 4762+ DO NOT WANT#@-*/
 4763+
 4764+ DO NOT WANT#@+
 4765+ NOT WANT Accessor/mutator
 4766+ WANT
 4767+ SO IM LIKE Title WITH UR $x = null TESTING UR return wfSetVar( $this->mTitle, $x );
 4768+ SO IM LIKE Options WITH UR $x = null TESTING UR return wfSetVar( $this->mOptions, $x );
 4769+ SO IM LIKE OutputType WITH UR $x = null TESTING UR return wfSetVar( $this->mOutputType, $x );
 4770+ DO NOT WANT#@-*/
 4771+
 4772+ DO NOT WANT#@+
 4773+ NOT WANT Accessor
 4774+ WANT
 4775+ SO IM LIKE getTags
 4776+ I FOUND MAH array_merge( array_keys( $this->mTransparentTagHooks ), array_keys( $this->mTagHooks ) )
 4777+ KTHX
 4778+ DO NOT WANT#@-*/
 4779+
 4780+
 4781+ DO NOT WANT
 4782+ NOT WANT Break wikitext input into sections, and either pull or replace
 4783+ NOT WANT some particular section's text.
 4784+ NOT WANT
 4785+ NOT WANT External callers should use the getSection and replaceSection methods.
 4786+ NOT WANT
 4787+ NOT WANT @param string $text Page wikitext
 4788+ NOT WANT @param string $section A section identifier string of the form:
 4789+ NOT WANT <flag1> - <flag2> - ... - <section number>
 4790+ NOT WANT
 4791+ NOT WANT Currently the only recognised flag is "T", which means the target section number
 4792+ NOT WANT was derived during a template inclusion parse, in other words this is a template
 4793+ NOT WANT section edit link. If no flags are given, it was an ordinary section edit link.
 4794+ NOT WANT This flag is required to avoid a section numbering mismatch when a section is
 4795+ NOT WANT enclosed by <includeonly> (bug 6563).
 4796+ NOT WANT
 4797+ NOT WANT The section number 0 pulls the text before the first heading; other numbers will
 4798+ NOT WANT pull the given section along with its lower-level subsections. If the section is
 4799+ NOT WANT not found, $mode=get will return $newtext, and $mode=replace will return $text.
 4800+ NOT WANT
 4801+ NOT WANT @param string $mode One of "get" or "replace"
 4802+ NOT WANT @param string $newText Replacement text for section data.
 4803+ NOT WANT @return string for "get", the extracted section text.
 4804+ NOT WANT for "replace", the whole page with the section replaced.
 4805+ WANT
 4806+ SO IM LIKE extractSections WITH UR $text, $section, $mode, $newText=''
 4807+ I HAS UR $wgTitle ON UR INTERNETS
 4808+ IM ON UR SPECIAL clearState
 4809+ IM ON UR SPECIAL setTitle DOING $wgTitle # not generally used but removes an ugly failure mode
 4810+ UR SPECIAL mOptions IZ new ParserOptions;
 4811+ IM ON UR SPECIAL setOutputType DOING self::OT_PLAIN
 4812+ I HAS outText IZ ''
 4813+ I HAS frame IZ $this->getPreprocessor()->newFrame()
 4814+
 4815+ BTW Process section extraction flags
 4816+ I HAS flags IZ 0
 4817+ I HAS sectionParts IZ explode( '-', $section )
 4818+ I HAS sectionIndex IZ array_pop( $sectionParts )
 4819+ IM IN UR sectionParts ITZA part
 4820+ IZ $part === 'T'
 4821+ $flags |= self::PTD_FOR_INCLUSION;
 4822+ KTHX
 4823+ KTHX
 4824+ BTW Preprocess the text
 4825+ I HAS root IZ $this->preprocessToDom( $text, $flags )
 4826+
 4827+ BTW <h> nodes indicate section breaks
 4828+ BTW They can only occur at the top level, so we can find them by iterating the root's children
 4829+ I HAS node IZ $root->getFirstChild()
 4830+
 4831+ BTW Find the target section
 4832+ IZ $sectionIndex == 0
 4833+ BTW Section zero doesn't nest, level=big
 4834+ I HAS targetLevel IZ 1000
 4835+ NOWAI
 4836+ STEALIN UR $node
 4837+ IZ $node->getName() === 'h'
 4838+ I HAS bits IZ $node->splitHeading()
 4839+ IZ $bits['i'] == $sectionIndex
 4840+ I HAS targetLevel IZ $bits['level']
 4841+ break;
 4842+ KTHX
 4843+ KTHX
 4844+ IZ $mode === 'replace'
 4845+ outText HAS MOAR $frame->expand( $node, PPFrame::RECOVER_ORIG );
 4846+ KTHX
 4847+ I HAS node IZ $node->getNextSibling()
 4848+ KTHX
 4849+ KTHX
 4850+
 4851+ IZ !$node
 4852+ BTW Not found
 4853+ IZ $mode === 'get'
 4854+ I FOUND MAH $newText
 4855+ NOWAI
 4856+ I FOUND MAH $text
 4857+ KTHX
 4858+ KTHX
 4859+
 4860+ BTW Find the end of the section, including nested sections
 4861+ do {
 4862+ IZ $node->getName() === 'h'
 4863+ I HAS bits IZ $node->splitHeading()
 4864+ I HAS curLevel IZ $bits['level']
 4865+ IZ $bits['i'] != $sectionIndex && $curLevel <= $targetLevel
 4866+ break;
 4867+ KTHX
 4868+ KTHX
 4869+ IZ $mode === 'get'
 4870+ outText HAS MOAR $frame->expand( $node, PPFrame::RECOVER_ORIG );
 4871+ KTHX
 4872+ I HAS node IZ $node->getNextSibling()
 4873+ KTHX while ( $node );
 4874+
 4875+ BTW Write out the remainder (in replace mode only)
 4876+ IZ $mode === 'replace'
 4877+ BTW Output the replacement text
 4878+ BTW Add two newlines on -- trailing whitespace in $newText is conventionally
 4879+ BTW stripped by the editor, so we need both newlines to restore the paragraph gap
 4880+ BTW Only add trailing whitespace if there is newText
 4881+ IZ $newText != ""
 4882+ outText HAS MOAR $newText . "\n\n";
 4883+ KTHX
 4884+
 4885+ STEALIN UR $node
 4886+ outText HAS MOAR $frame->expand( $node, PPFrame::RECOVER_ORIG );
 4887+ I HAS node IZ $node->getNextSibling()
 4888+ KTHX
 4889+ KTHX
 4890+
 4891+ IZ is_string( $outText )
 4892+ BTW Re-insert stripped tags
 4893+ I HAS outText IZ rtrim( $this->mStripState->unstripBoth( $outText ) )
 4894+ KTHX
 4895+
 4896+ I FOUND MAH $outText
 4897+ KTHX
 4898+
 4899+ DO NOT WANT
 4900+ NOT WANT This function returns the text of a section, specified by a number ($section).
 4901+ NOT WANT A section is text under a heading like == Heading == or \<h1\>Heading\</h1\>, or
 4902+ NOT WANT the first section before any such heading (section 0).
 4903+ NOT WANT
 4904+ NOT WANT If a section contains subsections, these are also returned.
 4905+ NOT WANT
 4906+ NOT WANT @param string $text text to look in
 4907+ NOT WANT @param string $section section identifier
 4908+ NOT WANT @param string $deftext default to return if section is not found
 4909+ NOT WANT @return string text of the requested section
 4910+ WANT
 4911+ SO IM LIKE getSection WITH UR $text, $section, $deftext=''
 4912+ I FOUND MAH $this->extractSections( $text, $section, "get", $deftext )
 4913+ KTHX
 4914+
 4915+ SO IM LIKE replaceSection WITH UR $oldtext, $section, $text
 4916+ I FOUND MAH $this->extractSections( $oldtext, $section, "replace", $text )
 4917+ KTHX
 4918+
 4919+ DO NOT WANT
 4920+ NOT WANT Get the timestamp associated with the current revision, adjusted for
 4921+ NOT WANT the default server-local timestamp
 4922+ WANT
 4923+ SO IM LIKE getRevisionTimestamp
 4924+ IZ is_null( $this->mRevisionTimestamp )
 4925+ IM ON UR wfProfileIn DOING __METHOD__
 4926+ I HAS UR $wgContLang ON UR INTERNETS
 4927+ I HAS dbr IZ wfGetDB( DB_SLAVE )
 4928+ timestamp IZ $dbr->selectField( 'revision', 'rev_timestamp',
 4929+ IM ON UR array DOING 'rev_id' => $this->mRevisionId ), __METHOD__
 4930+
 4931+ BTW Normalize timestamp to internal MW format for timezone processing.
 4932+ BTW This has the added side-effect of replacing a null value with
 4933+ BTW the current time, which gives us more sensible behavior for
 4934+ BTW previews.
 4935+ I HAS timestamp IZ wfTimestamp( TS_MW, $timestamp )
 4936+
 4937+ BTW The cryptic '' timezone parameter tells to use the site-default
 4938+ BTW timezone offset instead of the user settings.
 4939+ BTW
 4940+ BTW Since this value will be saved into the parser cache, served
 4941+ BTW to other users, and potentially even used inside links and such,
 4942+ BTW it needs to be consistent for all visitors.
 4943+ UR SPECIAL mRevisionTimestamp IZ $wgContLang->userAdjust( $timestamp, '' );
 4944+
 4945+ IM ON UR wfProfileOut DOING __METHOD__
 4946+ KTHX
 4947+ I FOUND MAH $this->mRevisionTimestamp
 4948+ KTHX
 4949+
 4950+ DO NOT WANT
 4951+ NOT WANT Get the name of the user that edited the last revision
 4952+ WANT
 4953+ SO IM LIKE getRevisionUser
 4954+ BTW if this template is subst: the revision id will be blank,
 4955+ BTW so just use the current user's name
 4956+ IZ $this->mRevisionId
 4957+ I HAS revision IZ Revision::newFromId( $this->mRevisionId )
 4958+ I HAS revuser IZ $revision->getUserText()
 4959+ NOWAI
 4960+ I HAS UR $wgUser ON UR INTERNETS
 4961+ I HAS revuser IZ $wgUser->getName()
 4962+ KTHX
 4963+ I FOUND MAH $revuser
 4964+ KTHX
 4965+
 4966+ DO NOT WANT
 4967+ NOT WANT Mutator for $mDefaultSort
 4968+ NOT WANT
 4969+ NOT WANT @param $sort New value
 4970+ WANT
 4971+ SO IM LIKE setDefaultSort WITH UR $sort
 4972+ UR SPECIAL mDefaultSort IZ $sort;
 4973+ KTHX
 4974+
 4975+ DO NOT WANT
 4976+ NOT WANT Accessor for $mDefaultSort
 4977+ NOT WANT Will use the title/prefixed title if none is set
 4978+ NOT WANT
 4979+ NOT WANT @return string
 4980+ WANT
 4981+ SO IM LIKE getDefaultSort
 4982+ I HAS UR $wgCategoryPrefixedDefaultSortkey ON UR INTERNETS
 4983+ IZ $this->mDefaultSort !== false
 4984+ I FOUND MAH $this->mDefaultSort
 4985+ KTHX elseif ( $this->mTitle->getNamespace() == NS_CATEGORY ||
 4986+ !$wgCategoryPrefixedDefaultSortkey )
 4987+ {
 4988+ I FOUND MAH $this->mTitle->getText()
 4989+ NOWAI
 4990+ I FOUND MAH $this->mTitle->getPrefixedText()
 4991+ KTHX
 4992+ KTHX
 4993+
 4994+ DO NOT WANT
 4995+ NOT WANT Accessor for $mDefaultSort
 4996+ NOT WANT Unlike getDefaultSort(), will return false if none is set
 4997+ NOT WANT
 4998+ NOT WANT @return string or false
 4999+ WANT
 5000+ SO IM LIKE getCustomDefaultSort
 5001+ I FOUND MAH $this->mDefaultSort
 5002+ KTHX
 5003+
 5004+ DO NOT WANT
 5005+ NOT WANT Try to guess the section anchor name based on a wikitext fragment
 5006+ NOT WANT presumably extracted from a heading, for example "Header" from
 5007+ NOT WANT "== Header ==".
 5008+ WANT
 5009+ SO IM LIKE guessSectionNameFromWikiText WITH UR $text
 5010+ BTW Strip out wikitext links(they break the anchor)
 5011+ I HAS text IZ $this->stripSectionName( $text )
 5012+ I HAS headline IZ Sanitizer::decodeCharReferences( $text )
 5013+ BTW strip out HTML
 5014+ I HAS headline IZ StringUtils::delimiterReplace( '<', '>', '', $headline )
 5015+ I HAS headline IZ trim( $headline )
 5016+ I HAS sectionanchor IZ '#' . urlencode( str_replace( ' ', '_', $headline ) )
 5017+ I HAS replacearray IZ BUCKET
 5018+ '%3A' => ':',
 5019+ '%' => '.'
 5020+ BUCKET
 5021+ return str_replace(
 5022+ array_keys( $replacearray ),
 5023+ array_values( $replacearray ),
 5024+ $sectionanchor );
 5025+ KTHX
 5026+
 5027+ DO NOT WANT
 5028+ NOT WANT Strips a text string of wikitext for use in a section anchor
 5029+ NOT WANT
 5030+ NOT WANT Accepts a text string and then removes all wikitext from the
 5031+ NOT WANT string and leaves only the resultant text (i.e. the result of
 5032+ NOT WANT [[User:WikiSysop|Sysop]] would be "Sysop" and the result of
 5033+ NOT WANT [[User:WikiSysop]] would be "User:WikiSysop") - this is intended
 5034+ NOT WANT to create valid section anchors by mimicing the output of the
 5035+ NOT WANT parser when headings are parsed.
 5036+ NOT WANT
 5037+ NOT WANT @param $text string Text string to be stripped of wikitext
 5038+ NOT WANT for use in a Section anchor
 5039+ NOT WANT @return Filtered text string
 5040+ WANT
 5041+ SO IM LIKE stripSectionName WITH UR $text
 5042+ BTW Strip internal link markup
 5043+ I HAS text IZ preg_replace( '/\[\[:?([^[|]+)\|([^[]+)\]\]/', '$2', $text )
 5044+ I HAS text IZ preg_replace( '/\[\[:?([^[]+)\|?\]\]/', '$1', $text )
 5045+
 5046+ BTW Strip external link markup (FIXME: Not Tolerant to blank link text
 5047+ BTW I.E. [http://www.mediawiki.org] will render as [1] or something depending
 5048+ BTW on how many empty links there are on the page - need to figure that out.
 5049+ I HAS text IZ preg_replace( '/\[(?:' . wfUrlProtocols() . ')([^ ]+?) ([^[]+)\]/', '$2', $text )
 5050+
 5051+ BTW Parse wikitext quotes (italics & bold)
 5052+ I HAS text IZ $this->doQuotes( $text )
 5053+
 5054+ BTW Strip HTML tags
 5055+ I HAS text IZ StringUtils::delimiterReplace( '<', '>', '', $text )
 5056+ I FOUND MAH $text
 5057+ KTHX
 5058+
 5059+ SO IM LIKE srvus WITH UR $text
 5060+ I FOUND MAH $this->testSrvus( $text, $this->mOutputType )
 5061+ KTHX
 5062+
 5063+ DO NOT WANT
 5064+ NOT WANT strip/replaceVariables/unstrip for preprocessor regression testing
 5065+ WANT
 5066+ SO IM LIKE testSrvus WITH UR $text, $title, $options, $outputType = self::OT_HTML
 5067+ IM ON UR SPECIAL clearState
 5068+ IZ !$title instanceof Title
 5069+ I HAS title IZ Title::newFromText( $title )
 5070+ KTHX
 5071+ UR SPECIAL mTitle IZ $title;
 5072+ UR SPECIAL mOptions IZ $options;
 5073+ IM ON UR SPECIAL setOutputType DOING $outputType
 5074+ I HAS text IZ $this->replaceVariables( $text )
 5075+ I HAS text IZ $this->mStripState->unstripBoth( $text )
 5076+ I HAS text IZ Sanitizer::removeHTMLtags( $text )
 5077+ I FOUND MAH $text
 5078+ KTHX
 5079+
 5080+ SO IM LIKE testPst WITH UR $text, $title, $options
 5081+ I HAS UR $wgUser ON UR INTERNETS
 5082+ IZ !$title instanceof Title
 5083+ I HAS title IZ Title::newFromText( $title )
 5084+ KTHX
 5085+ I FOUND MAH $this->preSaveTransform( $text, $title, $wgUser, $options )
 5086+ KTHX
 5087+
 5088+ SO IM LIKE testPreprocess WITH UR $text, $title, $options
 5089+ IZ !$title instanceof Title
 5090+ I HAS title IZ Title::newFromText( $title )
 5091+ KTHX
 5092+ I FOUND MAH $this->testSrvus( $text, $title, $options, self::OT_PREPROCESS )
 5093+ KTHX
 5094+
 5095+ SO IM LIKE markerSkipCallback WITH UR $s, $callback
 5096+ I HAS i IZ 0
 5097+ I HAS out IZ ''
 5098+ STEALIN UR $i < strlen( $s )
 5099+ I HAS markerStart IZ strpos( $s, $this->mUniqPrefix, $i )
 5100+ IZ $markerStart === false
 5101+ out HAS MOAR call_user_func( $callback, substr( $s, $i ) );
 5102+ break;
 5103+ NOWAI
 5104+ out HAS MOAR call_user_func( $callback, substr( $s, $i, $markerStart - $i ) );
 5105+ I HAS markerEnd IZ strpos( $s, self::MARKER_SUFFIX, $markerStart )
 5106+ IZ $markerEnd === false
 5107+ out HAS MOAR substr( $s, $markerStart );
 5108+ break;
 5109+ NOWAI
 5110+ $markerEnd += strlen( self::MARKER_SUFFIX );
 5111+ out HAS MOAR substr( $s, $markerStart, $markerEnd - $markerStart );
 5112+ I HAS i IZ $markerEnd
 5113+ KTHX
 5114+ KTHX
 5115+ KTHX
 5116+ I FOUND MAH $out
 5117+ KTHX
 5118+
 5119+ SO IM LIKE serialiseHalfParsedText WITH UR $text
 5120+ I HAS data IZ EMPTY
 5121+ $data['text'] = $text;
 5122+
 5123+ BTW First, find all strip markers, and store their
 5124+ BTW data in an array.
 5125+ I HAS stripState IZ new StripState
 5126+ I HAS pos IZ 0
 5127+ while ( ( $start_pos = strpos( $text, $this->mUniqPrefix, $pos ) )
 5128+ && ( $end_pos = strpos( $text, self::MARKER_SUFFIX, $pos ) ) )
 5129+ {
 5130+ $end_pos += strlen( self::MARKER_SUFFIX );
 5131+ I HAS marker IZ substr( $text, $start_pos, $end_pos-$start_pos )
 5132+
 5133+ IZ !empty( $this->mStripState->general->data[$marker] )
 5134+ I HAS replaceArray IZ $stripState->general
 5135+ I HAS stripText IZ $this->mStripState->general->data[$marker]
 5136+ ORLY !empty( $this->mStripState->nowiki->data[$marker] )
 5137+ I HAS replaceArray IZ $stripState->nowiki
 5138+ I HAS stripText IZ $this->mStripState->nowiki->data[$marker]
 5139+ NOWAI
 5140+ throw new MWException( "Hanging strip marker: '$marker'." );
 5141+ KTHX
 5142+
 5143+ $replaceArray->setPair( $marker, $stripText );
 5144+ I HAS pos IZ $end_pos
 5145+ KTHX
 5146+ $data['stripstate'] = $stripState;
 5147+
 5148+ BTW Now, find all of our links, and store THEIR
 5149+ BTW data in an array! :)
 5150+ I HAS links IZ BUCKET 'internal' => array(), 'interwiki' => array() );
 5151+ I HAS pos IZ 0
 5152+
 5153+ BTW Internal links
 5154+ STEALIN UR ( $start_pos = strpos( $text, '<!--LINK ', $pos ) )
 5155+ IM ON UR list DOING $ns, $trail ) = explode( ':', substr( $text, $start_pos + strlen( '<!--LINK ' ) ), 2
 5156+
 5157+ I HAS ns IZ trim( $ns )
 5158+ IZ empty( $links['internal'][$ns] )
 5159+ $links['internal'][$ns] = array();
 5160+ KTHX
 5161+
 5162+ I HAS key IZ trim( substr( $trail, 0, strpos( $trail, '-->' ) ) )
 5163+ $links['internal'][$ns][] = $this->mLinkHolders->internals[$ns][$key];
 5164+ I HAS pos IZ $start_pos + strlen( "<!--LINK $ns:$key-->" )
 5165+ KTHX
 5166+
 5167+ I HAS pos IZ 0
 5168+
 5169+ BTW Interwiki links
 5170+ STEALIN UR ( $start_pos = strpos( $text, '<!--IWLINK ', $pos ) )
 5171+ I HAS data IZ substr( $text, $start_pos )
 5172+ I HAS key IZ trim( substr( $data, 0, strpos( $data, '-->' ) ) )
 5173+ $links['interwiki'][] = $this->mLinkHolders->interwiki[$key];
 5174+ I HAS pos IZ $start_pos + strlen( "<!--IWLINK $key-->" )
 5175+ KTHX
 5176+
 5177+ $data['linkholder'] = $links;
 5178+
 5179+ I FOUND MAH $data
 5180+ KTHX
 5181+
 5182+ DO NOT WANT
 5183+ NOT WANT TODO: document
 5184+ NOT WANT @param $data Array
 5185+ NOT WANT @param $intPrefix String unique identifying prefix
 5186+ NOT WANT @return String
 5187+ WANT
 5188+ SO IM LIKE unserialiseHalfParsedText WITH UR $data, $intPrefix = null
 5189+ IZ !$intPrefix
 5190+ I HAS intPrefix IZ $this->getRandomString()
 5191+ KTHX
 5192+
 5193+ BTW First, extract the strip state.
 5194+ I HAS stripState IZ $data['stripstate']
 5195+ IM ON UR SPECIAL mStripState->general->merge DOING $stripState->general
 5196+ IM ON UR SPECIAL mStripState->nowiki->merge DOING $stripState->nowiki
 5197+
 5198+ BTW Now, extract the text, and renumber links
 5199+ I HAS text IZ $data['text']
 5200+ I HAS links IZ $data['linkholder']
 5201+
 5202+ BTW Internal...
 5203+ foreach ( $links['internal'] as $ns => $nsLinks ) {
 5204+ IM IN UR nsLinks ITZA key => $entry
 5205+ I HAS newKey IZ $intPrefix . '-' . $key
 5206+ $this->mLinkHolders->internals[$ns][$newKey] = $entry;
 5207+
 5208+ I HAS text IZ str_replace( "<!--LINK $ns:$key-->", "<!--LINK $ns:$newKey-->", $text )
 5209+ KTHX
 5210+ KTHX
 5211+
 5212+ BTW Interwiki...
 5213+ foreach ( $links['interwiki'] as $key => $entry ) {
 5214+ I HAS newKey IZ "$intPrefix-$key"
 5215+ $this->mLinkHolders->interwikis[$newKey] = $entry;
 5216+
 5217+ I HAS text IZ str_replace( "<!--IWLINK $key-->", "<!--IWLINK $newKey-->", $text )
 5218+ KTHX
 5219+
 5220+ BTW Should be good to go.
 5221+ I FOUND MAH $text
 5222+ KTHX
 5223+ KTHX
 5224+
 5225+ DO NOT WANT
 5226+ NOT WANT @todo document, briefly.
 5227+ NOT WANT @ingroup Parser
 5228+ WANT
 5229+ IM IN UR SPECIAL StripState
 5230+ I HAS UR $general, $nowiki
 5231+
 5232+ SO IM LIKE __construct
 5233+ UR SPECIAL general IZ new ReplacementArray;
 5234+ UR SPECIAL nowiki IZ new ReplacementArray;
 5235+ KTHX
 5236+
 5237+ SO IM LIKE unstripGeneral WITH UR $text
 5238+ IM ON UR wfProfileIn DOING __METHOD__
 5239+ do {
 5240+ I HAS oldText IZ $text
 5241+ I HAS text IZ $this->general->replace( $text )
 5242+ KTHX while ( $text !== $oldText );
 5243+ IM ON UR wfProfileOut DOING __METHOD__
 5244+ I FOUND MAH $text
 5245+ KTHX
 5246+
 5247+ SO IM LIKE unstripNoWiki WITH UR $text
 5248+ IM ON UR wfProfileIn DOING __METHOD__
 5249+ do {
 5250+ I HAS oldText IZ $text
 5251+ I HAS text IZ $this->nowiki->replace( $text )
 5252+ KTHX while ( $text !== $oldText );
 5253+ IM ON UR wfProfileOut DOING __METHOD__
 5254+ I FOUND MAH $text
 5255+ KTHX
 5256+
 5257+ SO IM LIKE unstripBoth WITH UR $text
 5258+ IM ON UR wfProfileIn DOING __METHOD__
 5259+ do {
 5260+ I HAS oldText IZ $text
 5261+ I HAS text IZ $this->general->replace( $text )
 5262+ I HAS text IZ $this->nowiki->replace( $text )
 5263+ KTHX while ( $text !== $oldText );
 5264+ IM ON UR wfProfileOut DOING __METHOD__
 5265+ I FOUND MAH $text
 5266+ KTHX
 5267+ KTHX
 5268+
 5269+ DO NOT WANT
 5270+ NOT WANT @todo document, briefly.
 5271+ NOT WANT @ingroup Parser
 5272+ WANT
 5273+ IM IN UR SPECIAL OnlyIncludeReplacer
 5274+ var $output = '';
 5275+
 5276+ SO IM LIKE replace WITH UR $matches
 5277+ IZ substr( $matches[1], -1 ) === "\n"
 5278+ $this->output .= substr( $matches[1], 0, -1 );
 5279+ NOWAI
 5280+ $this->output .= $matches[1];
 5281+ KTHX
 5282+ KTHX
 5283+ KTHX Index: trunk/phase3/includes/parser/LOLParser.php
@@ -0,0 +1,170 @@
 2+<?php
 3+/*
 4+ * lol_core.php Ver 0.3
 5+ * Copyright (c) 2007 Jeff Jones, www.tetraboy.com, 2010 Happy-melon
 6+ *
 7+ * Permission is hereby granted, free of charge, to any person obtaining a copy
 8+ * of this software and associated documentation files (the "Software"), to deal
 9+ * in the Software without restriction, including without limitation the rights
 10+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 11+ * copies of the Software, and to permit persons to whom the Software is
 12+ * furnished to do so, subject to the following conditions:
 13+ *
 14+ * The above copyright notice and this permission notice shall be included in
 15+ * all copies or substantial portions of the Software.
 16+ *
 17+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 18+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 19+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 20+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 21+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 22+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 23+ * THE SOFTWARE.
 24+ */
 25+function lol_core_parse( $code ) {
 26+ return lol_core_replace( $code, 'forwards' );
 27+}
 28+function lol_core_unparse( $code ) {
 29+ return lol_core_replace( $code, 'backwards' );
 30+}
 31+
 32+define( 'LOL_ANY', '(.+?)' );
 33+define( 'LOL_LABEL', '([a-zA-Z0-9_-]+)' );
 34+define( 'LOL_VAR', '\$([a-zA-Z0-9_-]+)' );
 35+define( 'LOL_FNAME', '([a-zA-Z0-9_\-\>]+)' );
 36+define( 'LOL_MNAME', '\$this\-\>([a-zA-Z0-9_\-\>]+)' );
 37+define( 'LOL_VARLIST', '((?:'.LOL_VAR.'(?:,\s*)?)+)' );
 38+define( 'LOL_CMT', '((\/\/|#) (.*))?');
 39+function lol_core_replace($code, $dir ) {
 40+ $backwards = array(
 41+ '/^([\s]*)'.LOL_VAR.'( = null)?;/', '$1 I HAS $2',
 42+ '/^([\s]*)var '.LOL_VARLIST.';/', '$1 I HAS UR $2',
 43+ '/^([\s]*)global '.LOL_VARLIST.';/', '$1 I HAS UR $2 ON UR INTERNETS',
 44+ '/^([\s]*)'.LOL_VAR.' += array\(\);/', '$1 I HAS $2 IZ EMPTY',
 45+ '/^([\s]*)'.LOL_VAR.' += array\(/', '$1 I HAS $2 IZ BUCKET',
 46+ '/^([\s]*)'.LOL_VAR.' += (.+);/', '$1 I HAS $2 IZ $3',
 47+ '/^([\s]*)'.LOL_VAR.'++;/', '$1 $2 UPUP!',
 48+ '/^([\s]*)'.LOL_VAR.' = '.LOL_FNAME.'\( (.+) \);/', '$1 $2 IZ ON UR $3 DOING $4',
 49+ '/^([\s]*)'.LOL_MNAME.'\(\);/', '$1 IM ON UR SPECIAL $2',
 50+ '/^([\s]*)'.LOL_MNAME.'\( (.+) \);/', '$1 IM ON UR SPECIAL $2 DOING $3',
 51+ '/^([\s]*)'.LOL_FNAME.'\(\);/', '$1 IM ON UR $2',
 52+ '/^([\s]*)'.LOL_FNAME.'\( (.+) \);/', '$1 IM ON UR $2 DOING $3',
 53+
 54+ '/^([\s]*)class '.LOL_FNAME.' {/', '$1 IM IN UR SPECIAL $2',
 55+ '/^([\s]*)const '.LOL_FNAME.' = (.+)/', '$1 I ALWAYZ HAS $2 IZ $3',
 56+ '/^([\s]*)foreach \( '.LOL_VAR.' as \$(.+) \) {/', '$1 IM IN UR $2 ITZA $3',
 57+ '/^([\s]*)while \( (.+) \) {/', '$1 STEALIN UR $2',
 58+
 59+ '/^([\s]*)return (.*);/', '$1 I FOUND MAH $2',
 60+
 61+ '/^([\s]*)'.LOL_VAR.' = (.*)/', '$1 $2 IZ $3',
 62+ '/^([\s]*)'.LOL_VAR.' \.= (.*)/', '$1 $2 HAS MOAR $3',
 63+ '/^([\s]*)'.LOL_MNAME.' = array\(\)/', '$1 UR SPECIAL $2 IZ EMPTY',
 64+ '/^([\s]*)'.LOL_MNAME.' = array\(/', '$1 UR SPECIAL $2 IZ BUCKET',
 65+ '/^([\s]*)'.LOL_MNAME.' = (.*)/', '$1 UR SPECIAL $2 IZ $3',
 66+
 67+ '/^([\s]*)(?:private |protected |public )?function '.LOL_FNAME.' ?\(\) \{ (.+) \}/', '$1 SO IM LIKE $2 TESTING UR $3',
 68+ '/^([\s]*)(?:private |protected |public )?function '.LOL_FNAME.' ?\( (.*) \) \{ (.+) \}/', '$1 SO IM LIKE $2 WITH UR $3 TESTING UR $4',
 69+ '/^([\s]*)(?:private |protected |public )?function '.LOL_FNAME.' ?\( (.*) \) \{/', '$1 SO IM LIKE $2 WITH UR $3',
 70+ '/^([\s]*)(?:private |protected |public )?function '.LOL_FNAME.' ?\(\) \{/', '$1 SO IM LIKE $2',
 71+ '/^([\s]*)(?:private |protected |public )?static function '.LOL_FNAME.' ?\(\) \{/', '$1 SO IM ALWAYS LIKE $2',
 72+ '/^([\s]*)(?:private |protected |public )?static function '.LOL_FNAME.' ?\( (.*) \) \{/', '$1 SO IM ALWAYS LIKE $2 WITH UR $3',
 73+
 74+ '/^([\s]*)if \( (.+) \) \{/', '$1 IZ $2',
 75+ '/^([\s]*)\} elseif \( (.+) \) \{/', '$1 ORLY $2',
 76+ '/^([\s]*)\} else \{/', '$1 NOWAI',
 77+
 78+ '/^([\s]*)(\/\/|\#) (.*)/', '$1 BTW $3',
 79+ '/^([\s]*)\/\*\*?/', '$1 DO NOT WANT',
 80+ '/^([\s]*)\*\//', '$1 WANT',
 81+ '/^([\s]*)\* ?(.*)/', '$1 NOT WANT $2',
 82+
 83+ '/^([\s]*)\);/', '$1 BUCKET',
 84+ '/^([\s]*)\}/', '$1 KTHX',
 85+ );
 86+
 87+ $forwards = array(
 88+ '/^([\s]*) I HAS UR '.LOL_VARLIST.' ON UR INTERNETS[\s]+/', '$1 global $2;',
 89+ '/^([\s]*) I HAS UR '.LOL_VARLIST.'[\s]+/', '$1 var $2;',
 90+ '/^([\s]*) I HAS '.LOL_LABEL.' IZ BUCKET[\s]+/', '$1\$$2 = array(',
 91+ '/^([\s]*) I HAS '.LOL_LABEL.' IZ EMPTY[\s]+/', '$1 \$$2 = array();',
 92+ '/^([\s]*) I HAS '.LOL_LABEL.' IZ '.LOL_ANY.''.LOL_CMT.'[\s]+$/', '$1 \$$2 = $3; $4',
 93+ '/^([\s]*) I HAS '.LOL_LABEL.'[\s]+/', '$1 \$$2;',
 94+ '/^([\s]*) '.LOL_LABEL.' IZ ON UR '.LOL_FNAME.' DOING '.LOL_ANY.''.LOL_CMT.'[\s]+$/', '$1 \$$2 = $3( $4 ); $5',
 95+ '/^([\s]*) IM ON UR SPECIAL '.LOL_FNAME.' DOING '.LOL_ANY.''.LOL_CMT.'[\s]*$/', '$1 \$this->$2( $3 ); $4',
 96+ '/^([\s]*) IM ON UR SPECIAL '.LOL_FNAME.'[\s]*/', '$1 \$this->$2();',
 97+ '/^([\s]*) IM ON UR '.LOL_FNAME.' DOING(.+)'.LOL_CMT.'[\s]+/', '$1 $2( $3 ); $4',
 98+ '/^([\s]*) IM ON UR '.LOL_FNAME.'[\s]+/', '$1 $2();',
 99+ '/^([\s]*) '.LOL_LABEL.' UPUP[\s]+/', '$1 $2++',
 100+
 101+ '/^([\s]*) IM IN UR SPECIAL '.LOL_FNAME.'[\s]+/', '$1 class $2 {',
 102+ '/^([\s]*) I ALWAYZ HAS '.LOL_FNAME.' IZ (.+)[\s]+/', '$1 const $2 = $3',
 103+ '/^([\s]*) IM IN UR '.LOL_LABEL.' ITZA (.+)[\s]+/', '$1 foreach ( \$$2 as \$$3 ) {',
 104+ '/^([\s]*) STEALIN UR (.+)[\s]+/', '$1 while( $2 ) {',
 105+
 106+ '/^([\s]*) I FOUND MAH (.*)[\s]+/', '$1 return $2;',
 107+
 108+ '/^([\s]*) UR SPECIAL '.LOL_FNAME.' IZ EMPTY[\s]*/', '$1 \$this->$2 = array()',
 109+ '/^([\s]*) UR SPECIAL '.LOL_FNAME.' IZ BUCKET[\s]+/', '$1 \$this->$2 = array(',
 110+ '/^([\s]*) UR SPECIAL '.LOL_FNAME.' IZ '.LOL_ANY.''.LOL_CMT.'[\s]*$/', '$1 \$this->$2 = $3 $4',
 111+ '/^([\s]*)'.LOL_LABEL.' IZ (.*)[\s]+/', '$1 \$$2 = $3',
 112+ '/^([\s]*)'.LOL_LABEL.' HAS MOAR (.*)[\s]+/', '$1 \$$2 .= $3',
 113+
 114+ '/^([\s]*) SO IM LIKE '.LOL_FNAME.' TESTING UR (.+)[\s]+/', '$1 function $2(){ $3 }',
 115+ '/^([\s]*) SO IM LIKE '.LOL_FNAME.' WITH UR (.*) TESTING UR (.+)[\s]+/', '$1 function $2( $3 ) { $4 }',
 116+ '/^([\s]*) SO IM LIKE '.LOL_FNAME.' WITH UR (.*)[\s]+/', '$1 function $2( $3 ) {',
 117+ '/^([\s]*) SO IM LIKE '.LOL_FNAME.'[\s]+/', '$1 function $2(){',
 118+ '/^([\s]*) SO IM ALWAYS LIKE '.LOL_FNAME.' WITH UR (.*)[\s]+/', '$1 static function $2( $3 ) {',
 119+ '/^([\s]*) SO IM ALWAYS LIKE '.LOL_FNAME.'[\s]+/', '$1 static function $2(){',
 120+
 121+ '/^([\s]*) IZ '.LOL_ANY.''.LOL_CMT.'[\s]+$/', '$1 if( $2 ) { $3',
 122+ '/^([\s]*) ORLY '.LOL_ANY.''.LOL_CMT.'[\s]+$/', '$1 } elseif( $2 ) { $3',
 123+ '/^([\s]*) NOWAI[\s]+/', '$1 } else {',
 124+
 125+ '/^([\s]*) BTW (.*)[\s]*/', '$1 # $2',
 126+ '/^([\s]*) DO NOT WANT[\s]*/', '$1 /**',
 127+ '/^([\s]*) WANT[\s]*/', '$1 */',
 128+ '/^([\s]*) NOT WANT (.*)[\s]*/', '$1 * $2',
 129+
 130+ '/^([\s]*) BUCKET[\s]*/', '$1 );',
 131+ '/^([\s]*) KTHX[\s]*/', '$1 }',
 132+ );
 133+
 134+ $code = is_array( $code )
 135+ ? $code
 136+ : explode("\n",$code);
 137+
 138+ $search = array();
 139+ $replace = array();
 140+ foreach( $$dir as $key => $var ){
 141+ if( 1 & $key ) {
 142+ $replace[] = $var;
 143+ } else {
 144+ $search[] = $var;
 145+ }
 146+ }
 147+
 148+ $code = preg_replace( $search, $replace, $code );
 149+ $code = implode( "\n", $code );
 150+ return $code;
 151+}
 152+
 153+
 154+
 155+## Parser implementation ##
 156+if( false ){ # set to false to disable
 157+ $lol = file( dirname(__FILE__).'/Parser.lol', FILE_IGNORE_NEW_LINES );
 158+ $php = lol_core_parse( $lol );
 159+ try {
 160+ eval( $php );
 161+ } catch ( Exception $e ){
 162+ require_once( 'Parser.php' );
 163+ }
 164+} else {
 165+ # You're no fun...
 166+ require_once( 'Parser.php' );
 167+}
 168+
 169+
 170+
 171+
Property changes on: trunk/phase3/includes/parser/LOLParser.php
___________________________________________________________________
Added: svn:eol-style
1172 + native
Index: trunk/phase3/includes/AutoLoader.php
@@ -463,7 +463,7 @@
464464 'PPNode_Hash_Tree' => 'includes/parser/Preprocessor_Hash.php',
465465 'PPTemplateFrame_DOM' => 'includes/parser/Preprocessor_DOM.php',
466466 'PPTemplateFrame_Hash' => 'includes/parser/Preprocessor_Hash.php',
467 - 'Parser' => 'includes/parser/Parser.php',
 467+ 'Parser' => 'includes/parser/LOLParser.php',
468468 'ParserCache' => 'includes/parser/ParserCache.php',
469469 'ParserOptions' => 'includes/parser/ParserOptions.php',
470470 'ParserOutput' => 'includes/parser/ParserOutput.php',
@@ -684,7 +684,7 @@
685685 AutoLoader::loadAllExtensions();
686686 }
687687
688 -if ( function_exists( 'spl_autoload_register' ) ) {
 688+if ( function_exists( 'spl_autoload_register' ) && false ) {
689689 spl_autoload_register( array( 'AutoLoader', 'autoload' ) );
690690 } else {
691691 function __autoload( $class ) {

Follow-up revisions

RevisionCommit summaryAuthorDate
r64487Follow-up to r64478 - pull out debugging codehappy-melon12:44, 1 April 2010
r64558Revert r64478 - April Fool's is well over.happy-melon10:13, 3 April 2010

Comments

#Comment by Happy-melon (talk | contribs)   10:52, 1 April 2010

Happy April Fool's :D

It passes all the parser tests on my local machine; hopefully it will here as well...

#Comment by Church of emacs (talk | contribs)   12:09, 1 April 2010

I didn't take a look at the code, but is this change intended?

-if ( function_exists( 'spl_autoload_register' ) ) { +if ( function_exists( 'spl_autoload_register' ) && false ) {

Happy April Fool's ;)

#Comment by Happy-melon (talk | contribs)   12:45, 1 April 2010

No, thanks for spotting that. Fixed in r64487.

Status & tagging log