Extension:FindTpl
![]() | This extension stores its source code on a wiki page. Please be aware that this code may be unreviewed or maliciously altered. They may contain security holes, outdated interfaces that are no longer compatible etc. Note: No localisation updates are provided for this extension by translatewiki.net . |
![]() | This extension is currently not actively maintained! Although it may still work, any bug reports or feature requests will more than likely be ignored. |
![]() Release status: unmaintained |
|
---|---|
Implementation | Tag |
Description | Finds articles with template |
Author(s) | RUNA (Runa_cgtalk) |
Latest version | 0.1 (March 2010) |
MediaWiki | tested on 1.10.2, 1.15.1 |
License | GPL |
Download | See the section labeled code below |
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;
}
?>