リポジトリブラウザを作ってみる 3.svnに--xmlってオプションがあった

オプション--xmlをつければXML形式で出力してくれる。
その結果をSimpleXMLElementの第一引数に入れればObjectの出来上がり。
しかも、listでこのオプションを付けると--verboseをつけても出なかった「年」が出るようになる。
↓こんな感じでlistをパースしてたのがバカバカしく思えてきた。

<?php
public function buildData($data)
{
	$config = SVN_Config::getInstance();
	$list = SVN_Util::multiline2array($data);
	$href_base = SVN_Util::getHttpBase().SVN_Util::parsePath('path').'/';
	if ($config->getOption('verbose') && 0<count($list)) {
		// 文字有無
		$char_list = array();
		foreach ($list as $line) {
			$line = str_split($line);
			foreach ($line as $i=>$char) {
				if (!isset($char_list[$i])) {
					$char_list[$i] = false;
				}
				if ($char_list[$i]===false && $char!=' ') {
					$char_list[$i] = true;
				}
			}
		}
		// 始まりの位置
		$start_list = array();
		foreach ($char_list as $i=>$bool) {
			if ($bool && (!isset($char_list[$i-1]) || $char_list[$i-1]===false)) {
				$start_list[] = $i;
			}
		}
		// ファイルサイズ有無
		$size_exists = true;
		if (is_numeric($list[0][$start_list[3]])) {
			$size_exists = false;
		}
		// 分割
		$result = array();
		foreach ($list as $line) {
			$item = array();
			$i = 0;
			$item['Last_Changed_Rev'] = trim(substr($line, $start_list[$i], $start_list[$i+1]-$start_list[$i]));
			$i++;
			$item['Last_Changed_Author'] = trim(substr($line, $start_list[$i], $start_list[$i+1]-$start_list[$i]));
			$i++;
			$item['File_Size'] = '';
			if ($size_exists) {
				$item['File_Size'] = trim(substr($line, $start_list[$i], $start_list[$i+1]-$start_list[$i]));
				$i++;
			}
			$item['Last_Changed_Date'] = trim(substr($line, $start_list[$i], $start_list[$i+3]-$start_list[$i]));
			$item['Last_Changed_Date'] = date($config->getConfig('date_format'), strtotime($item['Last_Changed_Date']));
			$i += 3;
			$item['Path'] = trim(substr($line, $start_list[$i]));
			$item['Href'] = $href_base.$item['Path'];
			if ($item['Path']!='./') {
				$result[] = $item;
			}
		}
		return $result;
	}
	$result = array();
	foreach ($list as $item) {
		if ($item!='./') {
			$result[] = array(
				'Path' => $item,
				'Href' => $href_base.$item
			);
		}
	}
	return $result;
}

 
ライブラリはPearのVersionControl_SVNっぽい感じで自分が使い易いように1から作り直した。
そんな感じでinfo/list/cat/logが出来た。
とりあえず、Backlogのデザインをパクった。
まともにCSS書いたのは3年ぶり位かもしれない。

 
また朝になってしまった。