- $text_strong = ($text == "") ? "" : "<strong>{$text}</strong>";
- $text_em = ($text == "") ? "" : "<em>{$text}</em>";
- 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 == "")) ? "" : "<strong>{$pre}{$text_em}</strong>";
- } else {
- return (($pre == "") && ($text == "")) ? "" : "<em>{$pre}{$text_strong}</em>";
- }
- }
- }
-
- /* private */ function doHeadings( $text )
- {
- for ( $i = 6; $i >= 1; --$i ) {
- $h = substr( "======", 0, $i );
- $text = preg_replace( "/^{$h}([^=]+){$h}(\\s|$)/m",
- "<h{$i}>\\1</h{$i}>\\2", $text );
- }
- return $text;
- }
-
- # Note: we have to do external links before the internal ones,
- # and otherwise take great care in the order of things here, so
- # that we don't end up interpreting some URLs twice.
-
- /* private */ function replaceExternalLinks( $text )
- {
- $fname = "OutputPage::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, "gopher", false );
- $text = $this->subReplaceExternalLinks( $text, "news", false );
- $text = $this->subReplaceExternalLinks( $text, "mailto", false );
- wfProfileOut( $fname );
- return $text;
- }
-
- /* private */ function subReplaceExternalLinks( $s, $protocol, $autonumber )
- {
- global $wgUser, $printable;
- global $wgAllowExternalImages;
-
-
- $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 = $wgUser->getSkin();
-
- if ( $autonumber and $wgAllowExternalImages) { # Use img tags only for HTTP urls
- $s = preg_replace( $e1, "\\1" . $sk->makeImage( "{$unique}:\\3" .
- "/\\4.\\5", "\\4.\\5" ) . "\\6", $s );
- }
- $s = preg_replace( $e2, "\\1" . "<a href=\"{$unique}:\\3\"" .
- $sk->getExternalLinkAttributes( "{$unique}:\\3", wfEscapeHTML(
- "{$unique}:\\3" ) ) . ">" . wfEscapeHTML( "{$unique}:\\3" ) .
- "</a>\\5", $s );
- $s = str_replace( $unique, $protocol, $s );
-
- $a = explode( "[{$protocol}:", " " . $s );
- $s = array_shift( $a );
- $s = substr( $s, 1 );
-
- $e1 = "/^([{$uc}"."{$sep}]+)](.*)\$/sD";
- $e2 = "/^([{$uc}"."{$sep}]+)\\s+([^\\]]+)](.*)\$/sD";
-
- foreach ( $a as $line ) {
- if ( preg_match( $e1, $line, $m ) ) {
- $link = "{$protocol}:{$m[1]}";
- $trail = $m[2];
- if ( $autonumber ) { $text = "[" . ++$this->mAutonumber . "]"; }
- else { $text = wfEscapeHTML( $link ); }
- } else if ( preg_match( $e2, $line, $m ) ) {
- $link = "{$protocol}:{$m[1]}";
- $text = $m[2];
- $trail = $m[3];
- } else {
- $s .= "[{$protocol}:" . $line;
- continue;
- }
- if ( $printable == "yes") $paren = " (<i>" . htmlspecialchars ( $link ) . "</i>)";
- else $paren = "";
- $la = $sk->getExternalLinkAttributes( $link, $text );
- $s .= "<a href='{$link}'{$la}>{$text}</a>{$paren}{$trail}";
-
- }
- return $s;
- }
-
- /* private */ function replaceInternalLinks( $s )
- {
- global $wgTitle, $wgUser, $wgLang;
- global $wgLinkCache, $wgInterwikiMagic, $wgUseCategoryMagic;
- global $wgNamespacesWithSubpages, $wgLanguageCode;
- wfProfileIn( $fname = "OutputPage::replaceInternalLinks" );
-
- wfProfileIn( "$fname-setup" );
- $tc = Title::legalChars() . "#";
- $sk = $wgUser->getSkin();
-
- $a = explode( "[[", " " . $s );
- $s = array_shift( $a );
- $s = substr( $s, 1 );
-
- $e1 = "/^([{$tc}]+)\\|([^]]+)]](.*)\$/sD";
- $e2 = "/^([{$tc}]+)]](.*)\$/sD";
- wfProfileOut( "$fname-setup" );
-
- foreach ( $a as $line ) {
- if ( preg_match( $e1, $line, $m ) ) { # page with alternate text
-
- $text = $m[2];
- $trail = $m[3];
-
- } else if ( preg_match( $e2, $line, $m ) ) { # page with normal text
-
- $text = "";
- $trail = $m[2];
- }
-
- else { # Invalid form; output directly
- $s .= "[[" . $line ;
- wfProfileOut( "$fname-loop1" );
- continue;
- }
- if(substr($m[1],0,1)=="/") { # subpage
- if(substr($m[1],-1,1)=="/") { # / at end means we don't want the slash to be shown
- $m[1]=substr($m[1],1,strlen($m[1])-2);
- $noslash=$m[1];
-
- } else {
- $noslash=substr($m[1],1);
- }
- if($wgNamespacesWithSubpages[$wgTitle->getNamespace()]) { # subpages allowed here
- $link = $wgTitle->getPrefixedText(). "/" . trim($noslash);
- if(!$text) {
- $text= $m[1];
- } # this might be changed for ugliness reasons
- } else {
- $link = $noslash; # no subpage allowed, use standard link
- }
- } else { # no subpage
- $link = $m[1];
- }
-
- if ( preg_match( "/^((?:i|x|[a-z]{2,3})(?:-[a-z0-9]+)?|[A-Za-z\\x80-\\xff]+):(.*)\$/", $link, $m ) ) {
- $pre = strtolower( $m[1] );
- $suf = trim($m[2]);
- if( empty( $suf ) ) {
- $s .= $trail;
- } else if ( $wgLang->getNsIndex( $pre ) ==
- Namespace::getImage() ) {
- $nt = Title::newFromText( $suf );
- $name = $nt->getDBkey();
- if ( "" == $text ) { $text = $nt->GetText(); }
-
- $wgLinkCache->addImageLink( $name );
- $s .= $sk->makeImageLink( $name,
- wfImageUrl( $name ), $text );
- $s .= $trail;
- } else if ( "media" == $pre ) {
- $nt = Title::newFromText( $suf );
- $name = $nt->getDBkey();
- if ( "" == $text ) { $text = $nt->GetText(); }
-
- $wgLinkCache->addImageLink( $name );
- $s .= $sk->makeMediaLink( $name,
- wfImageUrl( $name ), $text );
- $s .= $trail;
- } else if ( isset($wgUseCategoryMagic) && $wgUseCategoryMagic && $pre == wfMsg ( "category" ) ) {
- $l = $sk->makeLink ( $pre.":".ucfirst( $m[2] ), ucfirst ( $m[2] ) ) ;
- array_push ( $this->mCategoryLinks , $l ) ;
- $s .= $trail ;
- } else {
- $l = $wgLang->getLanguageName( $pre );
- if ( "" == $l or !$wgInterwikiMagic or Namespace::isTalk( $wgTitle->getNamespace() ) ) {
- if ( "" == $text ) {
- $text = $link;
- }
- $s .= $sk->makeLink( $link, $text, "", $trail );
- } else if ( $pre != $wgLanguageCode ) {
- array_push( $this->mLanguageLinks, "$pre:$suf" );
- $s .= $trail;
- }
- }
-# } else if ( 0 == strcmp( "##", substr( $link, 0, 2 ) ) ) {
-# $link = substr( $link, 2 );
-# $s .= "<a name=\"{$link}\">{$text}</a>{$trail}";
- } else {
- if ( "" == $text ) { $text = $link; }
- # Hotspot:
- $s .= $sk->makeLink( $link, $text, "", $trail );
- }
- }
- wfProfileOut( $fname );
- return $s;
- }
-
- # Some functions here used by doBlockLevels()
- #
- /* private */ function closeParagraph()
- {
- $result = "";
- if ( 0 != strcmp( "p", $this->mLastSection ) &&
- 0 != strcmp( "", $this->mLastSection ) ) {
- $result = "</" . $this->mLastSection . ">";
- }
- $this->mLastSection = "";
- return $result;
- }
- # getCommon() returns the length of the longest common substring
- # of both arguments, starting at the beginning of both.
- #
- /* private */ function getCommon( $st1, $st2 )
- {
- $fl = strlen( $st1 );
- $shorter = strlen( $st2 );
- if ( $fl < $shorter ) { $shorter = $fl; }
-
- for ( $i = 0; $i < $shorter; ++$i ) {
- if ( $st1{$i} != $st2{$i} ) { break; }
- }
- return $i;
- }
- # These next three functions open, continue, and close the list
- # element appropriate to the prefix character passed into them.
- #
- /* private */ function openList( $char )
- {
- $result = $this->closeParagraph();
-
- if ( "*" == $char ) { $result .= "<ul><li>"; }
- else if ( "#" == $char ) { $result .= "<ol><li>"; }
- else if ( ":" == $char ) { $result .= "<dl><dd>"; }
- else if ( ";" == $char ) {
- $result .= "<dl><dt>";
- $this->mDTopen = true;
- }
- else { $result = "<!-- ERR 1 -->"; }
-
- return $result;
- }
-
- /* private */ function nextItem( $char )
- {
- if ( "*" == $char || "#" == $char ) { return "</li><li>"; }
- else if ( ":" == $char || ";" == $char ) {
- $close = "</dd>";
- if ( $this->mDTopen ) { $close = "</dt>"; }
- if ( ";" == $char ) {
- $this->mDTopen = true;
- return $close . "<dt>";
- } else {
- $this->mDTopen = false;
- return $close . "<dd>";
- }
- }
- return "<!-- ERR 2 -->";
- }
-
- /* private */function closeList( $char )
- {
- if ( "*" == $char ) { return "</li></ul>"; }
- else if ( "#" == $char ) { return "</li></ol>"; }
- else if ( ":" == $char ) {
- if ( $this->mDTopen ) {
- $this->mDTopen = false;
- return "</dt></dl>";
- } else {
- return "</dd></dl>";
- }
- }
- return "<!-- ERR 3 -->";
- }
-
- /* private */ function doBlockLevels( $text, $linestart )
- {
- $fname = "OutputPage::doBlockLevels";
- wfProfileIn( $fname );
- # Parsing through the text line by line. The main thing
- # happening here is handling of block-level elements p, pre,
- # and making lists from lines starting with * # : etc.
- #
- $a = explode( "\n", $text );
- $text = $lastPref = "";
- $this->mDTopen = $inBlockElem = false;
-
- if ( ! $linestart ) { $text .= array_shift( $a ); }
- foreach ( $a as $t ) {
- if ( "" != $text ) { $text .= "\n"; }
-
- $oLine = $t;
- $opl = strlen( $lastPref );
- $npl = strspn( $t, "*#:;" );
- $pref = substr( $t, 0, $npl );
- $pref2 = str_replace( ";", ":", $pref );
- $t = substr( $t, $npl );
-
- if ( 0 != $npl && 0 == strcmp( $lastPref, $pref2 ) ) {
- $text .= $this->nextItem( substr( $pref, -1 ) );
-
- if ( ";" == substr( $pref, -1 ) ) {
- $cpos = strpos( $t, ":" );
- if ( ! ( false === $cpos ) ) {
- $term = substr( $t, 0, $cpos );
- $text .= $term . $this->nextItem( ":" );
- $t = substr( $t, $cpos + 1 );
- }
- }
- } else if (0 != $npl || 0 != $opl) {
- $cpl = $this->getCommon( $pref, $lastPref );
-
- while ( $cpl < $opl ) {
- $text .= $this->closeList( $lastPref{$opl-1} );
- --$opl;
- }
- if ( $npl <= $cpl && $cpl > 0 ) {
- $text .= $this->nextItem( $pref{$cpl-1} );
- }
- while ( $npl > $cpl ) {
- $char = substr( $pref, $cpl, 1 );
- $text .= $this->openList( $char );
-
- if ( ";" == $char ) {
- $cpos = strpos( $t, ":" );
- if ( ! ( false === $cpos ) ) {
- $term = substr( $t, 0, $cpos );
- $text .= $term . $this->nextItem( ":" );
- $t = substr( $t, $cpos + 1 );
- }
- }
- ++$cpl;
- }
- $lastPref = $pref2;
- }
- if ( 0 == $npl ) { # No prefix--go to paragraph mode
- if ( preg_match(
- "/(<table|<blockquote|<h1|<h2|<h3|<h4|<h5|<h6)/i", $t ) ) {
- $text .= $this->closeParagraph();
- $inBlockElem = true;
- }
- if ( ! $inBlockElem ) {
- if ( " " == $t{0} ) {
- $newSection = "pre";
- # $t = wfEscapeHTML( $t );
- }
- else { $newSection = "p"; }
-
- if ( 0 == strcmp( "", trim( $oLine ) ) ) {
- $text .= $this->closeParagraph();
- $text .= "<" . $newSection . ">";
- } else if ( 0 != strcmp( $this->mLastSection,
- $newSection ) ) {
- $text .= $this->closeParagraph();
- if ( 0 != strcmp( "p", $newSection ) ) {
- $text .= "<" . $newSection . ">";
- }
- }
- $this->mLastSection = $newSection;
- }
- if ( $inBlockElem &&
- preg_match( "/(<\\/table|<\\/blockquote|<\\/h1|<\\/h2|<\\/h3|<\\/h4|<\\/h5|<\\/h6)/i", $t ) ) {
- $inBlockElem = false;
- }
- }
- $text .= $t;
- }
- while ( $npl ) {
- $text .= $this->closeList( $pref2{$npl-1} );
- --$npl;
- }
- if ( "" != $this->mLastSection ) {
- if ( "p" != $this->mLastSection ) {
- $text .= "</" . $this->mLastSection . ">";
- }
- $this->mLastSection = "";
- }
- wfProfileOut( $fname );
- return $text;
- }
-
- /* private */ function replaceVariables( $text )
- {
- global $wgLang;
- $fname = "OutputPage::replaceVariables";
- wfProfileIn( $fname );
-
- /* As with sigs, use server's local time --
- ensure this is appropriate for your audience! */
- $v = date( "m" );
- $mw =& MagicWord::get( MAG_CURRENTMONTH );
- $text = $mw->replace( $v, $text );
-
- $v = $wgLang->getMonthName( date( "n" ) );
- $mw =& MagicWord::get( MAG_CURRENTMONTHNAME );
- $text = $mw->replace( $v, $text );
-
- $v = $wgLang->getMonthNameGen( date( "n" ) );
- $mw =& MagicWord::get( MAG_CURRENTMONTHNAMEGEN );
- $text = $mw->replace( $v, $text );
-
- $v = date( "j" );
- $mw = MagicWord::get( MAG_CURRENTDAY );
- $text = $mw->replace( $v, $text );
-
- $v = $wgLang->getWeekdayName( date( "w" )+1 );
- $mw =& MagicWord::get( MAG_CURRENTDAYNAME );
- $text = $mw->replace( $v, $text );
-
- $v = date( "Y" );
- $mw =& MagicWord::get( MAG_CURRENTYEAR );
- $text = $mw->replace( $v, $text );
-
- $v = $wgLang->time( wfTimestampNow(), false );
- $mw =& MagicWord::get( MAG_CURRENTTIME );
- $text = $mw->replace( $v, $text );
-
- $mw =& MagicWord::get( MAG_NUMBEROFARTICLES );
- if ( $mw->match( $text ) ) {
- $v = wfNumberOfArticles();
- $text = $mw->replace( $v, $text );