|
|
| Line 1: |
Line 1: |
| − | <?
| + | $readable = count( array_intersect( $readable, $xwUserGroups ) ) |
| − | # Merge local changes with changes from other specified MediaWikis
| |
| − | | |
| − | # Extract changes from a page into an array ready for rendering in a table
| |
| − | function extractChanges(&$changes, &$page, $wd = array()) {
| |
| − | global $xwIsAdmin, $xwUserGroups;
| |
| − | list($wiki, $url, $tz) = $wd;
| |
| − | #if ($wiki) xwMessage(strlen($page)." bytes of changes received from $wiki wiki.", 'green');
| |
| − | # Change exraction rules (for supporting TWiki and MoinMoin later)
| |
| − | $cr = "/^\\((.+?)\\)(.+?\\((.+?)\\))?( \\. \\.\\s+(.*?)\\s+((<strong>)?<a.+?<\\/a>(<\\/strong>)?))?.*?; ([0-9]+:[0-9]+) \\. \\. (<a.+?<\\/a>).+?(<a.+?<\\/a>)(.+?\\((.+)\\))?/";
| |
| − | $pr = "/<h4>([0-9]+ [a-z]+ [0-9]+)<\\/h4>\\s*<ul class=\"special\">(.+?)<\\/ul>/is";
| |
| − | # Used to make urls from other wiki's absolute
| |
| − | if ($url) { $url = parse_url($url); $url = $url['scheme'].'://'.$url['host']; }
| |
| − | $tr = 999; # patch to stop same time keys overwriting
| |
| − | # First split the page by day sections
| |
| − | preg_match_all($pr, $page, $m1, PREG_SET_ORDER);
| |
| − | # Loop through changes in each day extracting relevent info into $changes array
| |
| − | foreach ($m1 as $day) {
| |
| − | preg_match_all("/<li>(.+?)<\\/li>/", $day[2], $m2);
| |
| − | foreach ($m2[1] as $change) {
| |
| − | $change = str_replace('href="', "href=\"$url", $change);
| |
| − | if (preg_match($cr, $change, $m3)) {
| |
| − | list(,$diff,,$hist,,$flags,$title,,,$time,$user,$talk,,$comment) = $m3;
| |
| − | ereg('>.+</a>', $user, $uname);
| |
| − | $user = ereg_replace($uname[0], str_replace(' ',' ',$uname[0]), $user);
| |
| − | # Get read-perms for article
| |
| − | if (!($readable = $xwIsAdmin)) {
| |
| − | if ($prop = new Article(Title::newFromText("xml:$title"))) $prop = $prop->getContentWithoutUsingSoManyDamnGlobals();
| |
| − | $readable = xwGetListByTagname(xwDomificateArticle($prop), 'read') + array('anyone'); | |
| − | }
| |
| − | # Store the change if readable by current user
| |
| − | if ($readable) $changes[(strtotime("$day[1] $time")+$tz*3600).'.00'.$tr--] = array($wd,$diff,$hist,$flags,$title,$user,$talk,$comment);
| |
| − | } else xwMessage("Couldn't match change: $change",'red');
| |
| − | }
| |
| − | }
| |
| − | return $changes;
| |
| − | }
| |
| − | | |
| − | # Render changes into said table
| |
| − | function renderChanges(&$changes) {
| |
| − | | |
| − | $head = '';
| |
| − | foreach ( array( 'Date', 'Event / Activity / Article', 'Description', 'Account', 'Change', 'State' ) as $i ) {
| |
| − | $colspan = $head ? '' : ' colspan=2';
| |
| − | $head .= "<th$colspan align=center><table border=0 cellpadding=0 cellspacing=0><tr><td align=center><div class=portlet id=p-cactions><ul><li><a href=\"/wiki/index.php/Talk:transform-changes.php\">$i</a></li></ul></div></td></tr></table></th>\n";
| |
| − | }
| |
| − | | |
| − | $html = "<br/><table border=0 class=xwChanges cellpadding=1 cellspacing=2 width=100%>\n";
| |
| − | $date = '';
| |
| − | $td = '<td valign=top>';
| |
| − | $s = ' ';
| |
| − | ksort($changes);
| |
| − | foreach (array_reverse($changes, SORT_STRING) as $t => $c) {
| |
| − | $time = strftime('%H:%M', $t);
| |
| − | if ($date != ($d = strftime('%d %b %Y', $t))) {
| |
| − | $html .= $date ? '<tr><td> <tr>' : '<tr>';
| |
| − | $html .= str_replace( 'Date', $date = $d, $head );
| |
| − | $bg = 1;
| |
| − | };
| |
| − | $bgtag = ++$bg % 2 ? '' : ' bgcolor=#d4d4d4';
| |
| − | $html .= "<tr$bgtag>$td$s$time$s$td$s $s";
| |
| − | if ($wt = $c[0][0]) {
| |
| − | $wiki = "<a href=\"".$c[0][1]."\" style=\"color:#009900;\">$wt:</a>";
| |
| − | if (!preg_match("/\\d+\\.\\d+\\.\\d+\\.\\d+/", $c[5]))
| |
| − | $c[5] = str_replace('">', "\">$wt:", $c[5]);
| |
| − | } else $wiki = '';
| |
| − | | |
| − | if (!$c[2]) {
| |
| − | list($diff,$hist) = explode(' ', $c[1]);
| |
| − | preg_match("/(<a.+?<\\/a>)/", $c[7], $m);
| |
| − | $c[4] = $m[1];
| |
| − | } else list(,$diff,$hist) = $c;
| |
| − | if ($diff == 'diff') $diff = '';
| |
| − | if (ereg('^href',$hist)) { $diff = "<a $hist>log</a>"; $hist = ''; }
| |
| − | | |
| − | if (ereg('undo', $c[1])) { $c[4] = "$c[3] $c[4]"; $c[3] = ''; }
| |
| − | $event = "$wiki$c[4]";
| |
| − | | |
| − | if ($c[3]) $c[7] = "<i>($c[3])</i> $c[7]";
| |
| − | $html .= "$td$s$event$s<td width=100%>$s$c[7]$s\n";
| |
| − | $html .= "$td$s$c[5]";
| |
| − | $html .= "$td$s$diff";
| |
| − | $html .= "$td$s$hist";
| |
| − | }
| |
| − | return "$html\n</table>";
| |
| − | }
| |
| − | | |
| − | # Get the list of wikis for which changes are merged
| |
| − | $wikis = array();
| |
| − | $wl = xwArticleContent("$tTitle/wiki.list", false);
| |
| − | if (preg_match_all("/^\\*.*?\"(.*?)\".*?\"(.*?)\".*?\"(.*?)\".*?\"(.*?)\"/m", $wl, $wikis, PREG_SET_ORDER))
| |
| − | for ($i = 0; $i < count($wikis); $i++) array_shift($wikis[$i]);
| |
| − | | |
| − | # get query string of this request
| |
| − | if (!$qs = $_SERVER['QUERY_STRING']) $qs = "title=Special:Recentchanges";
| |
| − | | |
| − | # Merge each wikis changes into local table
| |
| − | $changes = array();
| |
| − | foreach ($wikis as $wd) {
| |
| − | $rc = file_get_contents($wd[1]."?$qs&xpath://view:=&printable=yes");
| |
| − | extractChanges($changes, $rc, $wd);
| |
| − | }
| |
| − | | |
| − | # Extract local changes and render table
| |
| − | $article = renderChanges( extractChanges( $changes, $article ) );
| |
| − | global $wgSitename, $wgLang;
| |
| − | $head = "<table border=0 cellpadding=0 cellspacing=0 width=100%><tr><td width=80% align=left><table border=0 cellpadding=0 cellspacing=0><tr><td><h1 class=firstHeading> $wgSitename Events & Changes</h1></table>\n";
| |
| − | $now = str_replace(' ',' ',$wgLang->timeanddate( wfTimestampNow(), true ));
| |
| − | $head .= "<td width=20% align=right><a href=$script/Talk:Transform-changes.php><u>Talk:transform-changes.php</u> <b>$now</b></a></table>\n";
| |
| − | $article = "$head$article";
| |
| − | | |
| − | # Add a 1 minute refresh into the headers
| |
| − | $GLOBALS['xwHeaders'] .= '<META HTTP-EQUIV="REFRESH" CONTENT="60" />';
| |
| − | if (!isset($_REQUEST['printable'])) $_REQUEST['printable'] = true;
| |
| − | ?>
| |