X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FParser.php;h=3c539f05982e429378a6084e2aa3c5c9a9b48caf;hb=aeeec5397bb8d3b6fa9ad407a5fd7a102ef7f70f;hp=c25acecadc73e764e303f3c5c0f9889beefd2103;hpb=ef2acad51463af9cb885b4f3ec9362a7c764561e;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/Parser.php b/includes/Parser.php index c25acecadc..3c539f0598 100644 --- a/includes/Parser.php +++ b/includes/Parser.php @@ -42,10 +42,29 @@ define( "OT_MSG", 3 ); # to strip HTML comments in addition to regular # -style tags. This should not be anything we # may want to use in wikisyntax -define( "STRIP_COMMENTS", "HTMLCommentStrip" ); +define( 'STRIP_COMMENTS', 'HTMLCommentStrip' ); # prefix for escaping, used in two functions at least -define( "UNIQ_PREFIX", "NaodW29"); +define( 'UNIQ_PREFIX', 'NaodW29'); + + +# Constants needed for external link processing + +define( 'URL_PROTOCOLS', 'http|https|ftp|irc|gopher|news|mailto' ); +define( 'HTTP_PROTOCOLS', 'http|https' ); +# Everything except bracket, space, or control characters +define( 'EXT_LINK_URL_CLASS', '[^]\\x00-\\x20\\x7F]' ); +define( 'INVERSE_EXT_LINK_URL_CLASS', '[\]\\x00-\\x20\\x7F]' ); +# Including space +define( 'EXT_LINK_TEXT_CLASS', '[^\]\\x00-\\x1F\\x7F]' ); +define( 'EXT_IMAGE_FNAME_CLASS', '[A-Za-z0-9_.,~%\\-+&;#*?!=()@\\x80-\\xFF]' ); +define( 'EXT_IMAGE_EXTENSIONS', 'gif|png|jpg|jpeg' ); +define( 'EXT_LINK_BRACKETED', '/\[(('.URL_PROTOCOLS.'):'.EXT_LINK_URL_CLASS.'+) *('.EXT_LINK_TEXT_CLASS.'*?)\]/S' ); +define( 'EXT_IMAGE_REGEX', + '/^('.HTTP_PROTOCOLS.':)'. # Protocol + '('.EXT_LINK_URL_CLASS.'+)\\/'. # Hostname and path + '('.EXT_IMAGE_FNAME_CLASS.'+)\\.((?i)'.EXT_IMAGE_EXTENSIONS.')$/S' # Filename +); class Parser { @@ -225,7 +244,7 @@ class Parser } } } - + # nowiki $text = Parser::extractTags('nowiki', $text, $nowiki_content, $uniq_prefix); foreach( $nowiki_content as $marker => $content ) { @@ -326,7 +345,7 @@ class Parser for ( $content = end($state['nowiki']); $content !== false; $content = prev( $state['nowiki'] ) ) { $text = str_replace( key( $state['nowiki'] ), $content, $text ); } - + global $wgRawHtml; if ($wgRawHtml) { for ( $content = end($state['html']); $content !== false; $content = prev( $state['html'] ) ) { @@ -373,18 +392,17 @@ class Parser # This method generates the list of subcategories and pages for a category function oldCategoryMagic () { - global $wgLang , $wgUser ; + global $wgLang ; $fname = 'Parser::oldCategoryMagic'; if ( !$this->mOptions->getUseCategoryMagic() ) return ; # Doesn't use categories at all - $cns = Namespace::getCategory() ; - if ( $this->mTitle->getNamespace() != $cns ) return "" ; # This ain't a category page + if ( $this->mTitle->getNamespace() != NS_CATEGORY ) return "" ; # This ain't a category page $r = "
\n"; - $sk =& $wgUser->getSkin() ; + $sk =& $this->mOptions->getSkin() ; $articles = array() ; $children = array() ; @@ -409,7 +427,7 @@ class Parser if ( $t != "" ) $t .= ":" ; $t .= $x->cur_title ; - if ( $x->cur_namespace == $cns ) { + if ( $x->cur_namespace == NS_CATEGORY ) { array_push ( $children , $sk->makeLink ( $t ) ) ; # Subcategory } else { array_push ( $articles , $sk->makeLink ( $t ) ) ; # Page in this category @@ -437,16 +455,15 @@ class Parser function newCategoryMagic () { - global $wgLang , $wgUser ; + global $wgLang; if ( !$this->mOptions->getUseCategoryMagic() ) return ; # Doesn't use categories at all - $cns = Namespace::getCategory() ; - if ( $this->mTitle->getNamespace() != $cns ) return '' ; # This ain't a category page + if ( $this->mTitle->getNamespace() != NS_CATEGORY ) return '' ; # This ain't a category page $r = "
\n"; - $sk =& $wgUser->getSkin() ; + $sk =& $this->mOptions->getSkin() ; $articles = array() ; $articles_start_char = array(); @@ -470,7 +487,7 @@ class Parser if ( $t != '' ) $t .= ':' ; $t .= $x->cur_title ; - if ( $x->cur_namespace == $cns ) { + if ( $x->cur_namespace == NS_CATEGORY ) { $ctitle = str_replace( '_',' ',$x->cur_title ); array_push ( $children, $sk->makeKnownLink ( $t, $ctitle ) ) ; # Subcategory @@ -642,6 +659,9 @@ class Parser '/(\\w+)(\\s*=\\s*([^\\s\">]+|\"[^\">]*\"))?/e', "(in_array(strtolower(\"\$1\"),\$htmlattrs)?(\"\$1\".((\"x\$3\" != \"x\")?\"=\$3\":'')):'')", $t); + + $t = str_replace ( "<>" , "" , $t ) ; # This should fix bug 980557 + # Strip javascript "expression" from stylesheets. Brute force approach: # If anythin offensive is found, all attributes of the HTML tag are dropped @@ -821,7 +841,6 @@ class Parser $text = $this->removeHTMLtags( $text ); $text = $this->replaceVariables( $text, $args ); - print $text; $text = preg_replace( '/(^|\n)-----*/', '\\1
', $text ); @@ -831,12 +850,14 @@ class Parser $text = $wgDateFormatter->reformat( $this->mOptions->getDateFormat(), $text ); } $text = $this->doAllQuotes( $text ); - // $text = $this->doExponent( $text ); $text = $this->replaceExternalLinks( $text ); $text = $this->doMagicLinks( $text ); $text = $this->replaceInternalLinks ( $text ); $text = $this->replaceInternalLinks ( $text ); - //$text = $this->doTokenizedParser ( $text ); + + $text = $this->unstrip( $text, $this->mStripState ); + $text = $this->unstripNoWiki( $text, $this->mStripState ); + $text = $this->doTableStuff( $text ); $text = $this->formatHeadings( $text, $isMain ); $sk =& $this->mOptions->getSkin(); @@ -846,11 +867,11 @@ class Parser $text .= $this->categoryMagic () ; $this->categoryMagicDone = true ; } - + wfProfileOut( $fname ); return $text; } - + /* private */ function &doMagicLinks( &$text ) { $text = $this->magicISBN( $text ); $text = $this->magicGEO( $text ); @@ -887,57 +908,168 @@ class Parser $outtext = ''; $lines = explode( "\n", $text ); foreach ( $lines as $line ) { - $outtext .= $this->doQuotes ( '', $line, '' ) . "\n"; + $outtext .= $this->doQuotes ( $line ) . "\n"; } $outtext = substr($outtext, 0,-1); wfProfileOut( $fname ); return $outtext; } - /* private */ function doQuotes( $pre, $text, $mode ) { - if ( preg_match( "/^(.*)''(.*)$/sU", $text, $m ) ) { - $m1_strong = ($m[1] == "") ? "" : "{$m[1]}"; - $m1_em = ($m[1] == "") ? "" : "{$m[1]}"; - if ( substr ($m[2], 0, 1) == '\'' ) { - $m[2] = substr ($m[2], 1); - if ($mode == 'em') { - return $this->doQuotes ( $m[1], $m[2], ($m[1] == '') ? 'both' : 'emstrong' ); - } else if ($mode == 'strong') { - return $m1_strong . $this->doQuotes ( '', $m[2], '' ); - } else if (($mode == 'emstrong') || ($mode == 'both')) { - return $this->doQuotes ( '', $pre.$m1_strong.$m[2], 'em' ); - } else if ($mode == 'strongem') { - return "{$pre}{$m1_em}" . $this->doQuotes ( '', $m[2], 'em' ); - } else { - return $m[1] . $this->doQuotes ( '', $m[2], 'strong' ); - } - } else { - if ($mode == 'strong') { - return $this->doQuotes ( $m[1], $m[2], ($m[1] == '') ? 'both' : 'strongem' ); - } else if ($mode == 'em') { - return $m1_em . $this->doQuotes ( '', $m[2], '' ); - } else if ($mode == 'emstrong') { - return "{$pre}{$m1_strong}" . $this->doQuotes ( '', $m[2], 'strong' ); - } else if (($mode == 'strongem') || ($mode == 'both')) { - return $this->doQuotes ( '', $pre.$m1_em.$m[2], 'strong' ); - } else { - return $m[1] . $this->doQuotes ( '', $m[2], 'em' ); + /* private */ function doQuotes( $text ) { + $arr = preg_split ("/(''+)/", $text, -1, PREG_SPLIT_DELIM_CAPTURE); + if (count ($arr) == 1) + return $text; + else + { + # First, do some preliminary work. This may shift some apostrophes from + # being mark-up to being text. It also counts the number of occurrences + # of bold and italics mark-ups. + $i = 0; + $numbold = 0; + $numitalics = 0; + foreach ($arr as $r) + { + if (($i % 2) == 1) + { + # If there are ever four apostrophes, assume the first is supposed to + # be text, and the remaining three constitute mark-up for bold text. + if (strlen ($arr[$i]) == 4) + { + $arr[$i-1] .= "'"; + $arr[$i] = "'''"; + } + # If there are more than 5 apostrophes in a row, assume they're all + # text except for the last 5. + else if (strlen ($arr[$i]) > 5) + { + $arr[$i-1] .= str_repeat ("'", strlen ($arr[$i]) - 5); + $arr[$i] = "'''''"; + } + # Count the number of occurrences of bold and italics mark-ups. + # We are not counting sequences of five apostrophes. + if (strlen ($arr[$i]) == 2) $numitalics++; else + if (strlen ($arr[$i]) == 3) $numbold++; } + $i++; } - } else { - $text_strong = ($text == '') ? '' : "{$text}"; - $text_em = ($text == '') ? '' : "{$text}"; - if ($mode == '') { - return $pre . $text; - } else if ($mode == 'em') { - return $pre . $text_em; - } else if ($mode == 'strong') { - return $pre . $text_strong; - } else if ($mode == 'strongem') { - return (($pre == '') && ($text == '')) ? '' : "{$pre}{$text_em}"; - } else { - return (($pre == '') && ($text == '')) ? '' : "{$pre}{$text_strong}"; + + # If there is an odd number of both bold and italics, it is likely + # that one of the bold ones was meant to be an apostrophe followed + # by italics. Which one we cannot know for certain, but it is more + # likely to be one that has a single-letter word before it. + if (($numbold % 2 == 1) && ($numitalics % 2 == 1)) + { + $i = 0; + $firstsingleletterword = -1; + $firstmultiletterword = -1; + $firstspace = -1; + foreach ($arr as $r) + { + if (($i % 2 == 1) and (strlen ($r) == 3)) + { + $x1 = substr ($arr[$i-1], -1); + $x2 = substr ($arr[$i-1], -2, 1); + if ($x1 == " ") { + if ($firstspace == -1) $firstspace = $i; + } else if ($x2 == " ") { + if ($firstsingleletterword == -1) $firstsingleletterword = $i; + } else { + if ($firstmultiletterword == -1) $firstmultiletterword = $i; + } + } + $i++; + } + + # If there is a single-letter word, use it! + if ($firstsingleletterword > -1) + { + $arr [ $firstsingleletterword ] = "''"; + $arr [ $firstsingleletterword-1 ] .= "'"; + } + # If not, but there's a multi-letter word, use that one. + else if ($firstmultiletterword > -1) + { + $arr [ $firstmultiletterword ] = "''"; + $arr [ $firstmultiletterword-1 ] .= "'"; + } + # ... otherwise use the first one that has neither. + else + { + $arr [ $firstspace ] = "''"; + $arr [ $firstspace-1 ] .= "'"; + } } + + # Now let's actually convert our apostrophic mush to HTML! + $output = ''; + $buffer = ''; + $state = ''; + $i = 0; + foreach ($arr as $r) + { + if (($i % 2) == 0) + { + if ($state == 'both') + $buffer .= $r; + else + $output .= $r; + } + else + { + if (strlen ($r) == 2) + { + if ($state == 'em') + { $output .= ""; $state = ''; } + else if ($state == 'strongem') + { $output .= ""; $state = 'strong'; } + else if ($state == 'emstrong') + { $output .= ""; $state = 'strong'; } + else if ($state == 'both') + { $output .= "{$buffer}"; $state = 'strong'; } + else # $state can be 'strong' or '' + { $output .= ""; $state .= 'em'; } + } + else if (strlen ($r) == 3) + { + if ($state == 'strong') + { $output .= ""; $state = ''; } + else if ($state == 'strongem') + { $output .= ""; $state = 'em'; } + else if ($state == 'emstrong') + { $output .= ""; $state = 'em'; } + else if ($state == 'both') + { $output .= "{$buffer}"; $state = 'em'; } + else # $state can be 'em' or '' + { $output .= ""; $state .= 'strong'; } + } + else if (strlen ($r) == 5) + { + if ($state == 'strong') + { $output .= ""; $state = 'em'; } + else if ($state == 'em') + { $output .= ""; $state = 'strong'; } + else if ($state == 'strongem') + { $output .= ""; $state = ''; } + else if ($state == 'emstrong') + { $output .= ""; $state = ''; } + else if ($state == 'both') + { $output .= "{$buffer}"; $state = ''; } + else # ($state == '') + { $buffer = ''; $state = 'both'; } + } + } + $i++; + } + # Now close all remaining tags. Notice that the order is important. + if ($state == 'strong' || $state == 'emstrong') + $output .= ""; + if ($state == 'em' || $state == 'strongem' || $state == 'emstrong') + $output .= ""; + if ($state == 'strongem') + $output .= ""; + if ($state == 'both') + $output .= "{$buffer}"; + return $output; } } @@ -948,101 +1080,131 @@ class Parser /* private */ function replaceExternalLinks( $text ) { $fname = 'Parser::replaceExternalLinks'; wfProfileIn( $fname ); - $text = $this->subReplaceExternalLinks( $text, 'http', true ); - $text = $this->subReplaceExternalLinks( $text, 'https', true ); - $text = $this->subReplaceExternalLinks( $text, 'ftp', false ); - $text = $this->subReplaceExternalLinks( $text, 'irc', false ); - $text = $this->subReplaceExternalLinks( $text, 'gopher', false ); - $text = $this->subReplaceExternalLinks( $text, 'news', false ); - $text = $this->subReplaceExternalLinks( $text, 'mailto', false ); - wfProfileOut( $fname ); - return $text; - } - /* private */ function subReplaceExternalLinks( $s, $protocol, $autonumber ) { - $unique = '4jzAfzB8hNvf4sqyO9Edd8pSmk9rE2in0Tgw3'; - $uc = "A-Za-z0-9_\\/~%\\-+&*#?!=()@\\x80-\\xFF"; - - # this is the list of separators that should be ignored if they - # are the last character of an URL but that should be included - # if they occur within the URL, e.g. "go to www.foo.com, where .." - # in this case, the last comma should not become part of the URL, - # but in "www.foo.com/123,2342,32.htm" it should. - $sep = ",;\.:"; - $fnc = 'A-Za-z0-9_.,~%\\-+&;#*?!=()@\\x80-\\xFF'; - $images = 'gif|png|jpg|jpeg'; - - # PLEASE NOTE: The curly braces { } are not part of the regex, - # they are interpreted as part of the string (used to tell PHP - # that the content of the string should be inserted there). - $e1 = "/(^|[^\\[])({$protocol}:)([{$uc}{$sep}]+)\\/([{$fnc}]+)\\." . - "((?i){$images})([^{$uc}]|$)/"; - - $e2 = "/(^|[^\\[])({$protocol}:)(([".$uc."]|[".$sep."][".$uc."])+)([^". $uc . $sep. "]|[".$sep."]|$)/"; $sk =& $this->mOptions->getSkin(); + $linktrail = wfMsg('linktrail'); + $bits = preg_split( EXT_LINK_BRACKETED, $text, -1, PREG_SPLIT_DELIM_CAPTURE ); - if ( $autonumber and $this->mOptions->getAllowExternalImages() ) { # Use img tags only for HTTP urls - $s = preg_replace( $e1, '\\1' . $sk->makeImage( "{$unique}:\\3" . - '/\\4.\\5', '\\4.\\5' ) . '\\6', $s ); + $s = $this->replaceFreeExternalLinks( array_shift( $bits ) ); + + $i = 0; + while ( $i tag + # This happened by accident in the original parser, but some people used it extensively + $img = $this->maybeMakeImageLink( $text ); + if ( $img !== false ) { + $text = $img; + } + + $dtrail = ''; + + # No link text, e.g. [http://domain.tld/some.link] + if ( $text == '' ) { + # Autonumber if allowed + if ( strpos( HTTP_PROTOCOLS, $protocol ) !== false ) { + $text = "[" . ++$this->mAutonumber . "]"; + } else { + # Otherwise just use the URL + $text = wfEscapeHTML( $url ); + } + } else { + # Have link text, e.g. [http://domain.tld/some.link text]s + # Check for trail + if ( preg_match( $linktrail, $trail, $m2 ) ) { + $dtrail = $m2[1]; + $trail = $m2[2]; + } + } + + $encUrl = htmlspecialchars( $url ); + # Bit in parentheses showing the URL for the printable version + if( $url == $text || preg_match( "!$protocol://" . preg_quote( $text, "/" ) . "/?$!", $url ) ) { + $paren = ''; + } else { + # Expand the URL for printable version + $paren = " (" . htmlspecialchars ( $encUrl ) . ")"; + } + + # Process the trail (i.e. everything after this link up until start of the next link), + # replacing any non-bracketed links + $trail = $this->replaceFreeExternalLinks( $trail ); + + $la = $sk->getExternalLinkAttributes( $url, $text ); + + # Use the encoded URL + # This means that users can paste URLs directly into the text + # Funny characters like ö aren't valid in URLs anyway + # This was changed in August 2004 + $s .= "{$text}{$dtrail}{$paren}{$trail}"; } - $s = preg_replace( $e2, '\\1' . "getExternalLinkAttributes( "{$unique}:\\3", wfEscapeHTML( - "{$unique}:\\3" ) ) . ">" . wfEscapeHTML( "{$unique}:\\3" ) . - '\\5', $s ); - $s = str_replace( $unique, $protocol, $s ); - $a = explode( "[{$protocol}:", " " . $s ); - $s = array_shift( $a ); - $s = substr( $s, 1 ); + wfProfileOut( $fname ); + return $s; + } - # Regexp for URL in square brackets - $e1 = "/^([{$uc}{$sep}]+)\\](.*)\$/sD"; - # Regexp for URL with link text in square brackets - $e2 = "/^([{$uc}{$sep}]+)\\s+([^\\]]+)\\](.*)\$/sD"; + # Replace anything that looks like a URL with a link + function replaceFreeExternalLinks( $text ) { + $bits = preg_split( '/((?:'.URL_PROTOCOLS.'):)/', $text, -1, PREG_SPLIT_DELIM_CAPTURE ); + $s = array_shift( $bits ); + $i = 0; - foreach ( $a as $line ) { + $sk =& $this->mOptions->getSkin(); - # CASE 1: Link in square brackets, e.g. - # some text [http://domain.tld/some.link] more text - if ( preg_match( $e1, $line, $m ) ) { - $link = "{$protocol}:{$m[1]}"; + while ( $i < count( $bits ) ){ + $protocol = $bits[$i++]; + $remainder = $bits[$i++]; + + if ( preg_match( '/^('.EXT_LINK_URL_CLASS.'+)(.*)$/s', $remainder, $m ) ) { + # Found some characters after the protocol that look promising + $url = $protocol . $m[1]; $trail = $m[2]; - if ( $autonumber ) { $text = "[" . ++$this->mAutonumber . "]"; } - else { $text = wfEscapeHTML( $link ); } - } + + # Move trailing punctuation to $trail + $sep = ',;\.:!?'; + # If there is no left bracket, then consider right brackets fair game too + if ( strpos( $url, '(' ) === false ) { + $sep .= ')'; + } - # CASE 2: Link with link text and text directly following it, e.g. - # This is a collection of [http://domain.tld/some.link link]s - else if ( preg_match( $e2, $line, $m ) ) { - $link = "{$protocol}:{$m[1]}"; - $text = $m[2]; - $dtrail = ''; - $trail = $m[3]; - if ( preg_match( wfMsg ('linktrail'), $trail, $m2 ) ) { - $dtrail = $m2[1]; - $trail = $m2[2]; + $numSepChars = strspn( strrev( $url ), $sep ); + if ( $numSepChars ) { + $trail = substr( $url, -$numSepChars ) . $trail; + $url = substr( $url, 0, -$numSepChars ); } - } - # CASE 3: Nothing matches, just output the source text - else { - $s .= "[{$protocol}:" . $line; - continue; - } + # Replace & from obsolete syntax with & + $url = str_replace( '&', '&', $url ); - if( $link == $text || preg_match( "!$protocol://" . preg_quote( $text, "/" ) . "/?$!", $link ) ) { - $paren = ''; + # Is this an external image? + $text = $this->maybeMakeImageLink( $url ); + if ( $text === false ) { + # Not an image, make a link + $text = $sk->makeExternalLink( $url, $url ); + } + $s .= $text . $trail; } else { - # Expand the URL for printable version - $paren = " (" . htmlspecialchars ( $link ) . ")"; + $s .= $protocol . $remainder; } - $la = $sk->getExternalLinkAttributes( $link, $text ); - $s .= "{$text}{$dtrail}{$paren}{$trail}"; - } return $s; } - + + function maybeMakeImageLink( $url ) { + $sk =& $this->mOptions->getSkin(); + $text = false; + if ( $this->mOptions->getAllowExternalImages() ) { + if ( preg_match( EXT_IMAGE_REGEX, $url ) ) { + # Image found + $text = $sk->makeImage( htmlspecialchars( $url ) ); + } + } + return $text; + } /* private */ function replaceInternalLinks( $s ) { global $wgLang, $wgLinkCache; @@ -1057,7 +1219,6 @@ class Parser $sk =& $this->mOptions->getSkin(); $redirect = MagicWord::get ( MAG_REDIRECT ) ; - $isRedirect = $redirect->matchStart ( strtoupper ( substr ( $s , 0 , 10 ) ) ) ; $a = explode( '[[', ' ' . $s ); $s = array_shift( $a ); @@ -1072,14 +1233,6 @@ class Parser $useLinkPrefixExtension = $wgLang->linkPrefixExtension(); # Special and Media are pseudo-namespaces; no pages actually exist in them - static $image = FALSE; - static $special = FALSE; - static $media = FALSE; - static $category = FALSE; - if ( !$image ) { $image = Namespace::getImage(); } - if ( !$special ) { $special = Namespace::getSpecial(); } - if ( !$media ) { $media = Namespace::getMedia(); } - if ( !$category ) { $category = Namespace::getCategory(); } $nottalk = !Namespace::isTalk( $this->mTitle->getNamespace() ); @@ -1169,17 +1322,20 @@ class Parser $s .= (trim($tmp) == '')? '': $tmp; continue; } - if ( $ns == $image ) { + if ( $ns == NS_IMAGE ) { $s .= $prefix . $sk->makeImageLinkObj( $nt, $text ) . $trail; $wgLinkCache->addImageLinkObj( $nt ); continue; } - if ( $ns == $category && !$isRedirect ) { + if ( $ns == NS_CATEGORY ) { $t = $nt->getText() ; - $nnt = Title::newFromText ( Namespace::getCanonicalName($category).":".$t ) ; + $nnt = Title::newFromText ( Namespace::getCanonicalName(NS_CATEGORY).":".$t ) ; $wgLinkCache->suspend(); # Don't save in links/brokenlinks + $pPLC=$sk->postParseLinkColour(); + $sk->postParseLinkColour( false ); $t = $sk->makeLinkObj( $nnt, $t, '', '' , $prefix ); + $sk->postParseLinkColour( $pPLC ); $wgLinkCache->resume(); $sortkey = $wasblank ? $this->mTitle->getPrefixedText() : $text; @@ -1196,11 +1352,11 @@ class Parser continue; } - if( $ns == $media ) { + if( $ns == NS_MEDIA ) { $s .= $prefix . $sk->makeMediaLinkObj( $nt, $text ) . $trail; $wgLinkCache->addImageLinkObj( $nt ); continue; - } elseif( $ns == $special ) { + } elseif( $ns == NS_SPECIAL ) { $s .= $prefix . $sk->makeKnownLinkObj( $nt, $text, '', $trail ); continue; } @@ -1692,7 +1848,7 @@ class Parser if ( isset( $this->mTemplatePath[$part1] ) ) { $noparse = true; $found = true; - } + } # set $text to cached message. $text = $this->mTemplates[$part1]; $found = true; @@ -1758,10 +1914,7 @@ class Parser # Add a new element to the templace recursion path $this->mTemplatePath[$part1] = 1; - # Run full parser on the included text - $text = $this->internalParse( $text, $newline, $assocArgs ); - # I replaced the line below with the line above, as it former seems to cause several bugs - #$text = $this->stripParse( $text, $newline, $assocArgs ); + $text = $this->stripParse( $text, $newline, $assocArgs ); # Resume the link cache and register the inclusion as a link if ( !is_null( $title ) ) { @@ -2312,10 +2465,8 @@ class Parser if(isset($wgLocaltimezone)) putenv('TZ='.$oldtzs); $text = preg_replace( '/~~~~~/', $d, $text ); - $text = preg_replace( '/~~~~/', '[[' . $wgLang->getNsText( - Namespace::getUser() ) . ":$n|$k]] $d", $text ); - $text = preg_replace( '/~~~/', '[[' . $wgLang->getNsText( - Namespace::getUser() ) . ":$n|$k]]", $text ); + $text = preg_replace( '/~~~~/', '[[' . $wgLang->getNsText( NS_USER ) . ":$n|$k]] $d", $text ); + $text = preg_replace( '/~~~/', '[[' . $wgLang->getNsText( NS_USER ) . ":$n|$k]]", $text ); # Context links: [[|name]] and [[name (context)|]] #