- $wgOut->addMeta( "http:Refresh", "10;url=" .
- wfLocalUrlE( wfUrlencode( $returnto ) ) );
- }
- $wgOut->addHTML( "\n<p>$r\n" );
- }
-
-
- function categoryMagic ()
- {
- global $wgTitle , $wgUseCategoryMagic ;
- if ( !isset ( $wgUseCategoryMagic ) || !$wgUseCategoryMagic ) return ;
- $id = $wgTitle->getArticleID() ;
- $cat = ucfirst ( wfMsg ( "category" ) ) ;
- $ti = $wgTitle->getText() ;
- $ti = explode ( ":" , $ti , 2 ) ;
- if ( $cat != $ti[0] ) return "" ;
- $r = "<br break=all>\n" ;
-
- $articles = array() ;
- $parents = array () ;
- $children = array() ;
-
-
- global $wgUser ;
- $sk = $wgUser->getSkin() ;
- $sql = "SELECT l_from FROM links WHERE l_to={$id}" ;
- $res = wfQuery ( $sql, DB_READ ) ;
- while ( $x = wfFetchObject ( $res ) )
- {
- # $t = new Title ;
- # $t->newFromDBkey ( $x->l_from ) ;
- # $t = $t->getText() ;
- $t = $x->l_from ;
- $y = explode ( ":" , $t , 2 ) ;
- if ( count ( $y ) == 2 && $y[0] == $cat ) {
- array_push ( $children , $sk->makeLink ( $t , $y[1] ) ) ;
- } else {
- array_push ( $articles , $sk->makeLink ( $t ) ) ;
- }
- }
- wfFreeResult ( $res ) ;
-
- # Children
- if ( count ( $children ) > 0 )
- {
- asort ( $children ) ;
- $r .= "<h2>".wfMsg("subcategories")."</h2>\n" ;
- $r .= implode ( ", " , $children ) ;
- }
-
- # Articles
- if ( count ( $articles ) > 0 )
- {
- asort ( $articles ) ;
- $h = wfMsg( "category_header", $ti[1] );
- $r .= "<h2>{$h}</h2>\n" ;
- $r .= implode ( ", " , $articles ) ;
- }
-
-
- return $r ;
- }
-
-function getHTMLattrs ()
-{
- $htmlattrs = array( # Allowed attributes--no scripting, etc.
- "title", "align", "lang", "dir", "width", "height",
- "bgcolor", "clear", /* BR */ "noshade", /* HR */
- "cite", /* BLOCKQUOTE, Q */ "size", "face", "color",
- /* FONT */ "type", "start", "value", "compact",
- /* For various lists, mostly deprecated but safe */
- "summary", "width", "border", "frame", "rules",
- "cellspacing", "cellpadding", "valign", "char",
- "charoff", "colgroup", "col", "span", "abbr", "axis",
- "headers", "scope", "rowspan", "colspan", /* Tables */
- "id", "class", "name", "style" /* For CSS */
- );
-return $htmlattrs ;
-}
-
-function fixTagAttributes ( $t )
-{
- if ( trim ( $t ) == "" ) return "" ; # Saves runtime ;-)
- $htmlattrs = $this->getHTMLattrs() ;
-
- # Strip non-approved attributes from the tag
- $t = preg_replace(
- "/(\\w+)(\\s*=\\s*([^\\s\">]+|\"[^\">]*\"))?/e",
- "(in_array(strtolower(\"\$1\"),\$htmlattrs)?(\"\$1\".((\"x\$3\" != \"x\")?\"=\$3\":'')):'')",
- $t);
- # Strip javascript "expression" from stylesheets. Brute force approach:
- # If anythin offensive is found, all attributes of the HTML tag are dropped
-
- if( preg_match(
- "/style\\s*=.*(expression|tps*:\/\/|url\\s*\().*/is",
- wfMungeToUtf8( $t ) ) )
- {
- $t="";
- }
-
- return trim ( $t ) ;
-}
-
-function doTableStuff ( $t )
-{
- $t = explode ( "\n" , $t ) ;
- $td = array () ; # Is currently a td tag open?
- $ltd = array () ; # Was it TD or TH?
- $tr = array () ; # Is currently a tr tag open?
- $ltr = array () ; # tr attributes
- foreach ( $t AS $k => $x )
- {
- $x = rtrim ( $x ) ;
- $fc = substr ( $x , 0 , 1 ) ;
- if ( "{|" == substr ( $x , 0 , 2 ) )
- {
- $t[$k] = "<table " . $this->fixTagAttributes ( substr ( $x , 3 ) ) . ">" ;
- array_push ( $td , false ) ;
- array_push ( $ltd , "" ) ;
- array_push ( $tr , false ) ;
- array_push ( $ltr , "" ) ;
- }
- else if ( count ( $td ) == 0 ) { } # Don't do any of the following
- else if ( "|}" == substr ( $x , 0 , 2 ) )
- {
- $z = "</table>\n" ;
- $l = array_pop ( $ltd ) ;
- if ( array_pop ( $tr ) ) $z = "</tr>" . $z ;
- if ( array_pop ( $td ) ) $z = "</{$l}>" . $z ;
- array_pop ( $ltr ) ;
- $t[$k] = $z ;
- }
-/* else if ( "|_" == substr ( $x , 0 , 2 ) ) # Caption
- {
- $z = trim ( substr ( $x , 2 ) ) ;
- $t[$k] = "<caption>{$z}</caption>\n" ;
- }*/
- else if ( "|-" == substr ( $x , 0 , 2 ) ) # Allows for |---------------
- {
- $x = substr ( $x , 1 ) ;
- while ( $x != "" && substr ( $x , 0 , 1 ) == '-' ) $x = substr ( $x , 1 ) ;
- $z = "" ;
- $l = array_pop ( $ltd ) ;
- if ( array_pop ( $tr ) ) $z = "</tr>" . $z ;
- if ( array_pop ( $td ) ) $z = "</{$l}>" . $z ;
- array_pop ( $ltr ) ;
- $t[$k] = $z ;
- array_push ( $tr , false ) ;
- array_push ( $td , false ) ;
- array_push ( $ltd , "" ) ;
- array_push ( $ltr , $this->fixTagAttributes ( $x ) ) ;
- }
- else if ( "|" == $fc || "!" == $fc || "|+" == substr ( $x , 0 , 2 ) ) # Caption
- {
- if ( "|+" == substr ( $x , 0 , 2 ) )
- {
- $fc = "+" ;
- $x = substr ( $x , 1 ) ;
- }
- $after = substr ( $x , 1 ) ;
- if ( $fc == "!" ) $after = str_replace ( "!!" , "||" , $after ) ;
- $after = explode ( "||" , $after ) ;
- $t[$k] = "" ;
- foreach ( $after AS $theline )
- {
- $z = "" ;
- $tra = array_pop ( $ltr ) ;
- if ( !array_pop ( $tr ) ) $z = "<tr {$tra}>\n" ;
- array_push ( $tr , true ) ;
- array_push ( $ltr , "" ) ;
-
- $l = array_pop ( $ltd ) ;
- if ( array_pop ( $td ) ) $z = "</{$l}>" . $z ;
- if ( $fc == "|" ) $l = "TD" ;
- else if ( $fc == "!" ) $l = "TH" ;
- else if ( $fc == "+" ) $l = "CAPTION" ;
- else $l = "" ;
- array_push ( $ltd , $l ) ;
- $y = explode ( "|" , $theline , 2 ) ;
- if ( count ( $y ) == 1 ) $y = "{$z}<{$l}>{$y[0]}" ;
- else $y = $y = "{$z}<{$l} ".$this->fixTagAttributes($y[0]).">{$y[1]}" ;
- $t[$k] .= $y ;
- array_push ( $td , true ) ;
- }
- }
- }
-
-# Closing open td, tr && table
-while ( count ( $td ) > 0 )
-{
-if ( array_pop ( $td ) ) $t[] = "</td>" ;
-if ( array_pop ( $tr ) ) $t[] = "</tr>" ;
-$t[] = "</table>" ;
-}
-
- $t = implode ( "\n" , $t ) ;
-# $t = $this->removeHTMLtags( $t );
- return $t ;
-}
-
- # Well, OK, it's actually about 14 passes. But since all the
- # hard lifting is done inside PHP's regex code, it probably
- # wouldn't speed things up much to add a real parser.
- #
- function doWikiPass2( $text, $linestart )
- {
- global $wgUser, $wgLang, $wgUseDynamicDates;
- $fname = "OutputPage::doWikiPass2";
- wfProfileIn( $fname );
-
- $text = $this->removeHTMLtags( $text );
- $text = $this->replaceVariables( $text );
-
- $text = preg_replace( "/(^|\n)-----*/", "\\1<hr>", $text );
- $text = str_replace ( "<HR>", "<hr>", $text );
-
- $text = $this->doAllQuotes( $text );
- $text = $this->doHeadings( $text );
- $text = $this->doBlockLevels( $text, $linestart );
-
- if($wgUseDynamicDates) {
- global $wgDateFormatter;
- $text = $wgDateFormatter->reformat( $wgUser->getOption("date"), $text );
- }
-
- $text = $this->replaceExternalLinks( $text );
- $text = $this->replaceInternalLinks ( $text );
- $text = $this->doTableStuff ( $text ) ;
-
- $text = $this->magicISBN( $text );
- $text = $this->magicRFC( $text );
- $text = $this->formatHeadings( $text );
-
- $sk = $wgUser->getSkin();
- $text = $sk->transformContent( $text );
- $text .= $this->categoryMagic () ;
-
- wfProfileOut( $fname );
- return $text;
- }
-
- /* private */ function doAllQuotes( $text )
- {
- $outtext = "";
- $lines = explode( "\r\n", $text );
- foreach ( $lines as $line ) {
- $outtext .= $this->doQuotes ( "", $line, "" ) . "\r\n";
- }
- return $outtext;
- }
-
- /* private */ function doQuotes( $pre, $text, $mode )
- {
- if ( preg_match( "/^(.*)''(.*)$/sU", $text, $m ) ) {
- $m1_strong = ($m[1] == "") ? "" : "<strong>{$m[1]}</strong>";
- $m1_em = ($m[1] == "") ? "" : "<em>{$m[1]}</em>";
- 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 "<strong>{$pre}{$m1_em}</strong>" . $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 "<em>{$pre}{$m1_strong}</em>" . $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" );
- }
- }
- } else {
- $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";
-
- # Special and Media are pseudo-namespaces; no pages actually exist in them
- $image = Namespace::getImage();
- $special = Namespace::getSpecial();
- $media = Namespace::getMedia();
- $nottalk = !Namespace::isTalk( $wgTitle->getNamespace() );
- wfProfileOut( "$fname-setup" );
-
- foreach ( $a as $line ) {
- if ( preg_match( $e1, $line, $m ) ) { # page with normal text or alt
- $text = $m[2];
- $trail = $m[3];
- } else { # Invalid form; output directly
- $s .= "[[" . $line ;
- continue;
- }
-
- /* Valid link forms:
- Foobar -- normal
- :Foobar -- override special treatment of prefix (images, language links)
- /Foobar -- convert to CurrentPage/Foobar
- /Foobar/ -- convert to CurrentPage/Foobar, strip the initial / from text
- */
- $c = substr($m[1],0,1);
- $noforce = ($c != ":");
- if( $c == "/" ) { # 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
- }
- } elseif( $noforce ) { # no subpage
- $link = $m[1];
- } else {
- $link = substr( $m[1], 1 );
- }
- if( "" == $text )
- $text = $link;
-
- $nt = Title::newFromText( $link );
- if( !$nt ) {
- $s .= "[[" . $line;
- continue;
- }
- $ns = $nt->getNamespace();
- $iw = $nt->getInterWiki();
- if( $noforce ) {
- if( $iw && $wgInterwikiMagic && $nottalk && $wgLang->getLanguageName( $iw ) ) {
- array_push( $this->mLanguageLinks, $nt->getPrefixedText() );
- $s .= $trail;
-/* CHECK MERGE @@@
- } 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;
- }
-*/
- continue;
- }
- if( $ns == $image ) {
- $s .= $sk->makeImageLinkObj( $nt, $text ) . $trail;
- $wgLinkCache->addImageLinkObj( $nt );
- continue;
- }
-/* CHECK MERGE @@@
-# } 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 );
-*/
- }
- if( $ns == $media ) {
- $s .= $sk->makeMediaLinkObj( $nt, $text ) . $trail;
- $wgLinkCache->addImageLinkObj( $nt );
- continue;
- } elseif( $ns == $special ) {
- $s .= $sk->makeKnownLinkObj( $nt, $text, "", $trail );
- continue;
- }
- $s .= $sk->makeLinkObj( $nt, $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."\n";
- }
- # 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>";
- }