Extension:FindTpl
From MediaWiki.org
|
FindTpl Release status: beta |
|
|---|---|
| Implementation | Tag |
| Description | Finds articles with template |
| Author(s) | RUNA (Runa_cgtalk) |
| Last version | 0.1 (March 2010) |
| MediaWiki | tested on 1.10.2, 1.15.1 |
| License | GPL |
| Download | See the section labeled code below |
| Check usage and version matrix; stats | |
Contents |
Form to search specified template in pages[edit]
Displays a search form for the template specified in the parameter. Search results are displayed below. Search results - a list of articles that caused a specific template given the input values of parameters.
Installation[edit]
To install this extension
- Create file in your /extension directory: FindTpl.php (see #Code section)
- Add the following to LocalSettings.php:
require_once("$IP/extensions/FindTpl.php");
Syntax[edit]
<FindTpl>{{Template_name}}</FindTpl>
Code[edit]
<?php // MediaWiki FindTpl Extension Ver 0.1 // set up MediaWiki to react to the "<FindTpl>" tag $wgExtensionFunctions[] = "wfFindTpl"; function wfFindTpl() { global $wgParser; $wgParser->setHook( "FindTpl", "RenderFindTpl" ); return true; } function RenderFindTpl( $input, $argv, $parser ) { global $wgScriptPath, $wgRequest, $wgHooks; $parser->disableCache(); preg_match("/^{{(.*)}}/i", $input, $matches); $tpl_name = $matches[1]; $dbr =& wfGetDB( DB_SLAVE ); $res = $dbr->query( " select distinct t.`old_text` as page_text from `page` p inner join `revision` r on p.`page_latest`=r.`rev_id` inner join `text` t on r.`rev_text_id`=t.`old_id` where p.`page_title` = '".$tpl_name."' and p.`page_namespace` = 10 limit 1 " ); $row = $dbr->fetchObject( $res ); $tpl_text = $row->page_text; $dbr->freeResult( $res ); #preg_match_all("/\{{3}(.+)[^\}{3}\{{3}]\}{3}/", $tpl_text, $matches); preg_match_all("/(?<=\{{3})[^\}]*[^\}]*/", $tpl_text, $matches); #print_r($matches); $params_array = array(); foreach ($matches[0] as $params) { $expl_params = explode("|", $params, 2); $params_array[] = $expl_params[0]; } $params_array = array_unique($params_array); $form_inputs = ""; if (count($params_array)) { $form_inputs .= "<table class=\"standard\" style=\"width: auto\"> <tr><td>Name or number</td><td>Value</td></tr> "; foreach ($params_array as $param_name) { $param_value = ""; if ($wgRequest->getVal("sender") == "findtpl") { $param_value = $wgRequest->getVal("form_".urlencode($param_name)); } $form_inputs .= "<tr><td align=right>$param_name</td><td><input type=text name=\"form_".urlencode($param_name)."\" value=\"$param_value\" style=\"width:200px\"/></td></tr>"; } $form_inputs .= "<tr><td colspan=2><center><input type=submit value=\"Find\"/></center></td></tr> </table> "; } $output = ""; $tt = Title::makeTitle( 10, $tpl_name ); $output .= "Find template : <B><a href=\"".$tt->getFullURL()."\">".$tpl_name."</a></B><BR/> Parameters: <form method=\"POST\"> <input type=\"hidden\" name=\"formsent\" value=\"1\"/> <input type=\"hidden\" name=\"action\" value=\"purge\"/> <input type=\"hidden\" name=\"sender\" value=\"findtpl\"/> $form_inputs </form> "; if ($wgRequest->getVal("sender") == "findtpl") { $output .= "<br><b>Search results:</b>"; $search_params = array(); foreach ($wgRequest->getValues() as $key=>$value) { if (strpos($key, "form_") === 0) { if (strlen(strval($value)) > 0) { $search_params[urldecode(substr($key, 5))] = strval($value); } } } $SQLQuery = " select p.`page_title`, p.`page_namespace`, t.`old_text` as page_text from `page` p inner join `revision` r on p.`page_latest`=r.`rev_id` inner join `text` t on r.`rev_text_id`=t.`old_id` where p.`page_id` in (select distinct `tl_from` from `templatelinks` where `tl_title` = '$tpl_name') "; $res = $dbr->query( $SQLQuery ); $search_res_output = ''; while ( $row = $dbr->fetchObject( $res ) ) { $page_text = $row->page_text; $nt = Title::makeTitle( $row->page_namespace, $row->page_title ); preg_match_all('/{{'.$tpl_name.'\|([^}}]*)}}/i', $page_text, $matches); foreach ($matches[1] as $tpl_key=>$tpl_value) { $arr_text = explode('|', $tpl_value); $i = 1; foreach ($arr_text as &$value) { $value = explode('=', $value, 2); if (isset($value[1])) { $found_params[$value[0]] = trim($value[1]); } else { $found_params[$i] = trim($value[0]); $i++; } } if (count($search_params)) { $result = array_uintersect_uassoc($search_params, $found_params, "SearchCompare", "strcasecmp"); if ($result == $search_params) { $search_res_output .= "<br><a href=\"".$nt->getFullURL()."\">".$nt->getPrefixedText()."</a>"; break; } } else { $search_res_output .= "<br><a href=\"".$nt->getFullURL()."\">".$nt->getPrefixedText()."</a>"; break; } } } $dbr->freeResult( $res ); $wgHooks['ParserAfterTidy'][] = array('fnFindTplPositioning', urlencode($tpl_name)); } if (strlen($search_res_output)) { $output .= $search_res_output; } else if ($wgRequest->getInt("formsent")) { $output .= "<br/>Search result is empty."; } $tpl_name_enc = urlencode($tpl_name); $output = "<DIV id=\"FindTpl_$tpl_name_enc\" style=\"padding: 10px; boder: 1px solid black;\">".str_replace("\n", "", $output)."</DIV>"; return $output; } function SearchCompare($v1,$v2) { $v1 = strtolower($v1); $v2 = strtolower($v2); if ((stripos($v2, $v1) === 0) ||(stripos($v2, $v1) > 0)){ return 0; } else { return 1; } return -1; } function fnFindTplPositioning ( $tpl_name_enc, &$parser, &$text) { $label = "FindTpl_$tpl_name_enc"; $text .= "<script language=\"Javascript\">document.getElementById(\"$label\").scrollIntoView(true);</script>"; return true; } ?>
