לדלג לתוכן

משתמש:Mikibot/בוט 1 - הסרת פרמטר מתבנית:דבר

מתוך ויקיפדיה, האנציקלופדיה החופשית
  • הבוט מסיר את פרמטר מספר 5 מתבנית:דבר אם הוא מכיל רק תאריך. התיקון נדרש בגלל שינוי בתבנית.
  • משתמש בספריית Peachy
  • משתמש ב wikimedia ajax.js עבור תמיכה ב AJAX
  • הבוט כתוב ממש ממש גרוע, אבל הוא עובד. צריך לכתוב את לולאת השליטה מחדש ב PHP במקום JS.

הבוט רץ כ-4 שעות ב 26-27/7/10 ובדק 585 דפים מתוכם הוא ערך 384 דפים בהם היו 1067 תבניות עם תאריך.

<table border="1" style="border:1px solid gray; border-collapse:separate; margin:auto;">
<tbody style="color:black;">
<?php
if ( !isset($_GET['page']) )
{
	echo '<tr><td>missing: ?page=xxx</tr></td></tbody></table>';
	die();
}

echo "<tr><td colspan='4'>{$_GET['page']}</td></tr>";

echo "<tr><td colspan='4'>";
require_once ( 'Peachy/Init.php' );
$wiki = Peachy::newWiki( 'hebrew_mikibot' );
$page = $wiki->initPage( $_GET['page'] );
$text = $page->get_text();
echo "</td></tr>";

if ( !$text )
{
	echo '<tr><td colspan="4">this page is empty.</tr></td></tbody></table>';
	die();
}

//------------------------------------- ok, let's do it:
$davar_arr = array();
$total_fixed = 0;
$rx = ' *((רא(ו|ה|י)|(ב|מ?ה?){0,2}תאריך|((ב|מ){1,2}ה?|את ה)?פי?רסום|ש?(פורס|התפרס)(מ?ה|ם){1,2}))*( *(((ב|ה|ל|מ){1,2}|מה)(יום( +ה)?|חודש)?( ?(–|־|-))? ?)?){1,2}(\d{1,2}([ ./\\\\-]+((((ב|ה|ל|מ){1,2}|מה)(חודש)?|חודש)( ?(–|־|-))? ?)?){1,2})?(\d{1,2}|(ינואר|פברואר|מר(ס|ץ)|אפריל|מאי|יוני|יולי|אוגוסט|ספטמבר|אוקטובר|נובמבר|דצמבר|January|February|March|April|May|June|July|August|September|October|November|December))([ ./\\\\-]+((ב|ל|מ){1,2}(שנ(ה|ת))?( ?(–|־|-))? ?)?){1,2}(\d{4}|\d{2}) *';  
$rx = "#^($rx| *\\($rx\\) *)$#";

$fixedtext = preg_replace_callback ( "/\\{\\{[ \n]*דבר[ \n]*\\|[^{}]+}}/", 'fix_davar_template', $text ); 

if ( preg_match('/\{\{[ \n]*דבר[ \n]*\|[^{}]*\{/', $text) )
	echo "<tr><td colspan='4'><center><b>*** found {{דבר|...{ ***</b></center></td></tr>";
	
foreach ( $davar_arr as $line )
	echo "<tr><td>{$line['orig']}</td><td>{$line['date']}</td><td>{$line['fixed']}</td><td>{$line['type']}</td></tr>"; 

if ( $total_fixed ) 
{
	$summary = 'בוט: מסיר פרמטר מיותר מ[[תבנית:דבר]] בעקבות [[שיחת תבנית:דבר#בקשה: הוספת התאריך לתצוגה|שינוי בתבנית]] (' . ( $total_fixed == 1 ? 'פעם אחת' : $total_fixed . ' פעמים' ) . ')'; 	
	echo "<tr><td colspan='4'>$summary</td></tr>";

	echo "<tr><td colspan='4'>";
	$page->edit( $fixedtext, $summary );
	echo "</td></tr>";
}
 else echo "<tr><td colspan='4'>nothing to fix.</td></tr>";

function fix_davar_template ( $davar )                                                  // $davar[0] = '{{דבר| xxx }}'
{
	global $davar_arr;
	global $total_fixed;
	global $rx; 
	
	$parts = explode ( '|',str_replace ( '}}', '|}}', ($davar[0]) ) ); 		// $parts = [ '{{דבר', 'param1', 'param2', ... '}}' ]
	
	$date_location = -1;
	$broken_parts = 0;  
	
	foreach ( $parts as $part )
	{
		$date_location++;
		if ( preg_match('/^[^\[\]]*]]/',$part) ) $broken_parts++;
		if ( $date_location - $broken_parts == 5 ) break;
	}
	
	if ( $date_location - $broken_parts != 5 || preg_match('/^ *(}})?$/',$parts[$date_location]) )      // nothing to do. return with no change
	{
		$davar_arr[] = array ( 'orig' => $davar[0], 'date' => '', 'fixed' => '', 'type' => 'NONE' );
		return $davar[0];      		  				
	}
																											// take the date part in the template and remove  
	$str = str_replace ( "\xE2\x80\x8F", '', str_replace( "\xE2\x80\x8E", '', $parts[$date_location] ) ); 	// Left-to-right mark (U+200E) and Right-to-left mark (U+200F) 
    $str = preg_replace ( "/[\[\]]/", '', $str ); 
	
	if ( preg_match($rx, $str, $matches) ) 
	{
		$removed_date = $parts[$date_location]; 
		$parts[$date_location] = '';
		$fixed_output = preg_replace ( '/\|+}}/', '}}', implode ( '|', $parts ) );
		
		$total_fixed++;
		$davar_arr[] = array ( 'orig' => $davar[0], 'date' => $removed_date, 'fixed' => $fixed_output, 'type' => 'FIXED' );
		return $fixed_output; 
	}
	 else
	{ 
		$davar_arr[] = array ( 'orig' => $davar[0], 'date' => $parts[$date_location], 'fixed' => '', 'type' => 'NOTDATE' );
		return $davar[0];
	}
}
?>
</tbody>
</table>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<?php header('Content-Type: text/html; charset=UTF-8'); ?>
<title>hebrew wiki bot - control page</title>
<script src="ajax_support.js" type="text/javascript"></script>
<script src="control_page.js" type="text/javascript"></script>
</head>
<body>
<div dir="rtl">
<textarea tabindex="1" id="textBox1" cols="80" rows="25" style="" name="botTextBox1">
כתוב כאן את הדפים עליהם הבוט יפעל. כל דף בשורה נפרדת. 
</textarea>
<br />
<input type="button" id="activateBot" name="disableBotButton" value="go!" onclick="document.getElementById('disableBot').checked=false; activateBot();" />
<input type="checkbox" id="disableBot" name="disableBotCheckBox" >stop bot</input> 
<br />
<div id="reportArea"></div>
</div>
</body>
</html>
function getNextPage()
{
	var inputArea = document.getElementById("textBox1");
	
	if ( /[^ \n]/.test(inputArea.value) )
	{
		var arr = inputArea.value.split("\n");
		while( arr.length > 1 && /^ *$/.test(arr[0]) ) arr.splice(0,1);
		var page = arr[0];
		arr.splice(0,1);
		inputArea.value = arr.join("\n");
		return page.replace ( /^#? *(.+?) *(\(הכללה\).*)?$/, "$1" );
	}
	
	return "";
}

function activateBotOnPage ( page, box )
{
    var ajaxObj = sajax_init_object();
    ajaxObj.open ( "GET", "http://localhost/wiki-bot-1/davarBot.php?page=" + page, true );
    ajaxObj.onreadystatechange =
        function()
        {
         try {
            if ( this.readyState != 4 ) box.appendChild ( document.createTextNode(".") );
             else if ( this.status != 200 ) box.appendChild ( document.createTextNode("error status=200") );
                   else 
              	   {
                	   var res = document.createElement("div");
                	   res.innerHTML = this.responseText; 
                	   box.appendChild (res); 
               	   }
          }
         catch ( e )
          {
        	 box.appendChild ( document.createTextNode("activateBotOnPage ERROR: " + e.message) );
          }
        };
    ajaxObj.send ( null );
}

function activateBot()
{
	var reportArea = document.getElementById("reportArea");
	reportArea.appendChild(document.createElement("hr"));		
//---	
	var page = getNextPage();
	if ( !page )
	{
		reportArea.appendChild ( document.createTextNode("DONE!") );
		return;
	}
//---
	var disableBot = document.getElementById("disableBot");
	if ( disableBot.checked )
	{
		reportArea.appendChild ( document.createTextNode("STOPED BY USER") );
		return;
	}
	var newDisableBot = disableBot.cloneNode(true);
	disableBot.id = "";
	newDisableBot.id = "disableBot";
	reportArea.appendChild ( newDisableBot );
//---
	reportArea.appendChild ( document.createTextNode("waiting for '" + page + "'") );
	reportArea.appendChild ( document.createElement("br") );
	activateBotOnPage ( page, reportArea );
	setTimeout ( "activateBot();", 20*1000 );
}