משתמש:Mikibot/בוט 1 - הסרת פרמטר מתבנית:דבר
מראה
- הבוט מסיר את פרמטר מספר 5 מתבנית:דבר אם הוא מכיל רק תאריך. התיקון נדרש בגלל שינוי בתבנית.
- משתמש בספריית Peachy
- משתמש ב wikimedia ajax.js עבור תמיכה ב AJAX
- הבוט כתוב ממש ממש גרוע, אבל הוא עובד. צריך לכתוב את לולאת השליטה מחדש ב PHP במקום JS.
הבוט רץ כ-4 שעות ב 26-27/7/10 ובדק 585 דפים מתוכם הוא ערך 384 דפים בהם היו 1067 תבניות עם תאריך.
davarBot.php
[עריכת קוד מקור | עריכה]<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>
control_page.php
[עריכת קוד מקור | עריכה]<!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>
control_page.js
[עריכת קוד מקור | עריכה]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 ); }