URL: http://metabolomics.jp/ */ if ( !defined( 'MEDIAWIKI' ) ) { die( 'This file is a MediaWiki extension, see HookInsert.php.' ); } $wgExtensionCredits['parserhook'][] = array( 'name' => 'HookInsert', 'version' => '0.11', 'author' => 'K, Suwa', 'description' => '', 'url' => 'http://metabolomics.jp/wiki/Help:Extension/HookInsert', ); $wgHooks['ArticleViewHeader'][] = 'efHookinsertInsert'; $wgHooks['ParserBeforeStrip'][] = 'efHookinsertDeleteMark'; global $egHookInsList, $egHookInsTitle, $egHookInsInsertFlag; $egHookInsList = ""; $egHookInsTitle = ""; $egHookInsInsertFlag = false; function efHookinsertInsert( &$article, &$outputDone, &$pcache ) { global $wgRequest, $wgExtraNamespaces, $egHookInsList, $egHookInsTitle, $egHookInsInsertFlag; # check flag if( strcmp( $wgRequest->getText( "my_hookinsert" ), "__HOOK_AND_INSERT__" ) != 0 ) { return true; } # get namespace number $ns = array_keys( $wgExtraNamespaces, "Index" ); if( count( $ns ) != 1 ) return true; $ns = $ns[0]; # get data $list = ""; $lists = $wgRequest->getArray( "my_list" ); $targetTitle = $wgRequest->getText( "my_title" ); $sep = $wgRequest->getText( "my_separator" ); if( strlen( $sep ) == 0 ) $sep = "&&"; $tmpTitle = preg_replace( "/([^\\\])\//", "$1\\\/", $targetTitle ); // / -> \/ for preg_match $content = $article->getContent(); if( count( $lists ) > 0 ){ # check list data, if correct data or no exist data. $listpage = $wgRequest->getText( "my_listpage" ); # $listTitle = Title::newFromText( "Index:" . $listpage ); $listTitle = Title::makeTitleSafe( $ns, eregi_replace( "^Index:", "", $listpage ) ); $listArticle = new Article( $listTitle ); $listArticle->clear(); $listContent = $listArticle->getContent() . "\n"; #$tmpLists = array(); $checkStr = ""; # do not register, if there is no item in listpage for( $i = 0; $i < count( $lists ); $i ++ ){ $tmp = preg_replace( "/([^\\\])\//", "$1\\\/", $lists[$i] ); // / -> \/ for preg_match # if( preg_match( "/-$lists[$i]\n/", $listContent ) >= 1 ) # if( preg_match( "/-$tmp\n/", $listContent ) >= 1 && preg_match( "/&&$tmp&&/", $checkStr ) == 0){ #$ddd = str_replace( "[", "\\[", $tmp); #$ddd = str_replace( "]", "\\]", $ddd); #$aaa = preg_match( "/[*#] *$ddd *\n/", $listContent ); #$aaa = preg_match( "/[*#] *$tmp *\n/", $listContent ); #`echo "$tmp $aaa" >> /tmp/log`; if( preg_match( "/[*#] *$tmp *\n/", $listContent ) >= 1 && preg_match( "/$sep$tmp$sep/", $checkStr ) == 0){ $tmpLists[] = $lists[$i]; $checkStr .= "$sep" . $lists[$i] . "$sep"; // check duplication } } # data, separated by && # $list = implode( "$sep", $tmpLists ) . "$sep"; $list = implode( "$sep", $tmpLists ); # $list = implode( "&&", $lists ) . "&&"; # $nextContent = preg_replace( "/\+\+$tmpTitle\+\+.*\+\+$tmpTitle\+\+/", "++$tmpTitle++$sep$list++$tmpTitle++", $content ); $nextContent = preg_replace( "/\+\+$tmpTitle\+\+.*\+\+$tmpTitle\+\+/", "++$tmpTitle++$list++$tmpTitle++", $content ); } else { $nextContent = preg_replace( "/\+\+$tmpTitle\+\+.*\+\+$tmpTitle\+\+/", "++$tmpTitle++++$tmpTitle++", $content ); } #`echo "$nextContent" >> /tmp/log`; # update data $article->doEdit( $nextContent, '', EDIT_UPDATE ); # set data for replacement # $egHookInsList = $sep . $list; $egHookInsList = $list; $egHookInsTitle = $targetTitle; $egHookInsInsertFlag = true; return true; } function efHookinsertDeleteMark( &$parser, &$text, $strip_state ) { global $egHookInsList, $egHookInsTitle, $egHookInsInsertFlag; # replace data, because do not update immediately if( $egHookInsInsertFlag ){ $tmpTitle = preg_replace( "/([^\\\])\//", "$1\\\/", $egHookInsTitle ); // / -> \/ for preg_match $text = preg_replace( "/\+\+$tmpTitle\+\+.*\+\+$tmpTitle\+\+/", "++$tmpTitle++$egHookInsList++$tmpTitle++", $text ); } # delete unnecessary data(marker) $text = preg_replace( "/\+\+[^\+]+\+\+/", "", $text ); return true; }