Difference between revisions of "Transform-changes.php"
 (add newline on successive heads)  | 
				m  | 
				||
| Line 47: | Line 47: | ||
			$time = strftime('%H:%M', $t);  | 			$time = strftime('%H:%M', $t);  | ||
			if ($date != ($d = strftime('%d %b %Y', $t))) {  | 			if ($date != ($d = strftime('%d %b %Y', $t))) {  | ||
| − | + | 				$html .= $date ? '<br>' : '';  | |
				$html .= str_replace( 'Date', $date = $d, $head );  | 				$html .= str_replace( 'Date', $date = $d, $head );  | ||
				$bg = 1;  | 				$bg = 1;  | ||
Revision as of 14:13, 29 January 2006
<?
- 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()) { 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+(()?<a.+?<\\/a>(<\\/strong>)?))?.*?; ([0-9]+:[0-9]+) \\. \\. (<a.+?<\\/a>).+?(<a.+?<\\/a>)(.+?\\((.+)\\))?/";
$pr = "/
([0-9]+ [a-z]+ [0-9]+)<\\/h4>\\s*(.+?)<\\/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>/", $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);
					$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>
- <a href=\"/wiki/index.php/Talk:transform-changes.php\">$i</a>
 
\n";
			}
		$html = "
\n";
		$date = ;
		$td = '';
		$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 ? '
' : ;
				$html .= str_replace( 'Date', $date = $d, $head );
				$bg = 1;
				};
			$bgtag = ++$bg % 2 ?  : ' bgcolor=#d4d4d4';
			$html .= "<tr$bgtag>$td$s$time$s$td$s$time$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('undo', $c[1])) { $c[4] = "$c[3] $c[4]"; $c[3] = ; }
			if ($c[3]) $c[7] = "($c[3]) $c[7]";
			$html .= "$td$s$wiki$c[4]$s $s$c[7]$s\n";
			$html .= "$td$s$c[5]";
			$html .= "$td$s$diff";
			$html .= "$td$s$hist";
			}
		return "$html\n 
";
		}
- 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 = " $wgSitename Events
\n";
$now = $wgLang->timeanddate( wfTimestampNow(), true );
$head .= "<a href='/'>$now</a> 
\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;
?>
 
  | 
}
$html = "\n"; $date = ; $td = '
| ';
 		$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 ? ' 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('undo', $c[1])) { $c[4] = "$c[3] $c[4]"; $c[3] = ; } if ($c[3]) $c[7] = "($c[3]) $c[7]"; $html .= "$td$s$wiki$c[4]$s | $s$c[7]$s\n";
 $html .= "$td$s$c[5]"; $html .= "$td$s$diff"; $html .= "$td$s$hist"; } return "$html\n | 
}
- 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 = "
 $now = $wgLang->timeanddate( wfTimestampNow(), true ); $head .= " | <a href='/'>$now</a> | 
$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; ?>



