xaizek / rocketgit (License: AGPLv3+) (since 2018-12-09)
Light and fast Git hosting solution suitable to serve both as a hub or as a personal code storage with its tickets, pull requests, API and much more.
<root> / misc / compare.php (053d52a0ab65d3e3e3ac3dd057bfed1b58e02dbb) (4,523B) (mode 100644) [raw]
<?php
// Build the compare.html from compare.csv
// compare.csv is easy edited with LibreOffice
// compare.html gets included in the website

/*
 * Returns an array with fields
 * Parses something like: "a,a",,"b","c" => array('a,a', '', 'b', 'c')
 */
/*
function parse_csv_line($line)
{
	$ret = array();
	$pos = 0;
	$f = '';
	$first = TRUE;
	$len = strlen($line);
	$last_was_comma = FALSE;
	while (1) {
		//echo "REST: " . substr($line, $pos) . "\n";
		if (strncmp($line[$pos], '"', 1) == 0) {
			$q = strpos($line, '"', $pos + 1);
			//echo "Q q=" . $q . "\n";
			if ($q === FALSE) {
				echo 'Line: ' . $line . ' is malformed (unterminated quoted string)!' . "\n";
				return FALSE;
			}
			$ret[] = substr($line, $pos + 1, $q - $pos - 1);
			$pos = $q + 1;

			if ($pos == $len)
				break;

			if (strncmp($line[$pos], ',', 1) != 0) {
				echo 'Line: ' . $line . ' is malformed (no comma after quote)!' . "\n";
				return FALSE;
			}

			$pos++; // skip comma
		} else {
			// This field does not start with '"' => starts with a comma! Search till next ','
			$q = strpos($line, ',', $pos);
			//echo "X q=" . $q . "\n";
			if ($q === FALSE) {
				// Final element after last ','
				$ret[] = substr($line, $pos);
				break;
			}

			$last_was_comma = TRUE;
			$ret[] = substr($line, $pos, $q - $pos);
			$pos = $q + 1;
			if ($pos == $len)
				break;
		}
	}

	if ($last_was_comma)
		$ret[] = '';

	return $ret;
}

$s = 'a';
$r = parse_csv_line($s);
echo $s . ':'; print_r($r);

$s = ',b';
$r = parse_csv_line($s);
echo $s . ':'; print_r($r);

$s = '"a","b","c';
$r = parse_csv_line($s);
echo $s . ':'; print_r($r);

$s = '"a","b","c"';
$r = parse_csv_line($s);
echo $s . ':'; print_r($r);

$s = ',"a,a","b 3 6,6","c d e c",,';
$r = parse_csv_line($s);
echo $s . ':'; print_r($r);

$s = '"a",,';
$r = parse_csv_line($s);
echo $s . ':'; print_r($r);
exit(1);
*/

$INC = dirname(__FILE__) . '/../inc';
require_once($INC . '/util.inc.php');

function cell($a)
{
	$a = rg_xss_safe($a);

	// links
	$a = preg_replace('/\[\[([^ ]*) ([^ ]*)\]\]/U', '<a href="\2" target="_blank">\1</a>', $a);
	$a = preg_replace('/\[\[(.*)\]\]/U', '<a href="\1" target="_blank">\1</a>', $a);

	// baloons
	$a = preg_replace('/{(.*)}/U',
		'<span class="compare_info" title="\1">?</span>', $a);

	return $a;
}


$h = fopen($_SERVER['argv'][1], 'r');
if (!$h)
	die('Cannot open input file!' . "\n");

$out = fopen($_SERVER['argv'][2], 'w');
if (!$out)
	die('Cannot open out file!' . "\n");

fwrite($out, '<div class="main_title">Git hosting solutions comparison</div>' . "\n");
fwrite($out, '<div class="compare_intro">'
	. '<i>' . "\n"
	. '- This document was generated on ' . gmdate('Y-m-d') . '.<br />' . "\n"
	. '- To contribute to this document, just e-mail us to'
	. ' in@rocketgit.com or clone the RocketGit'
	. ' <a href="https://rocketgit.com/user/catalinux/rocketgit">repository</a>'
	. ', make changes and push them.<br />' . "\n"
	. '- Move the mouse over the <span class="compare_info">?</span> signs'
	. ' for more information.'
	. '</i>' . "\n"
	. '</div>' . "\n");
fwrite($out, '<table class="compare">' . "\n");

$lineno = 1;
while (($line = fgetcsv($h)) !== FALSE) {
	if ($lineno == 1) {
		// First line
		$rows = count($line);
	}

	// Insert an empty line
	if (empty($line[0])) {
		fwrite($out, '<tr><td colspan="'
			. $rows . '">&nbsp;</td></tr>' . "\n");
		continue;
	}

	// Notes
	if (strcmp($line[0], '[Notes]') == 0) {
		fwrite($out,
			'<tr><td class="compare_chapter"'
			. ' colspan="' . $rows . '">'
			. cell(substr($line[0], 1, -1))
			. '</td></tr>' . "\n");
		continue;
	}
	if (strcmp($line[0], '*') == 0) {
		fwrite($out,
			'<tr><td colspan="' . $rows . '">'
			. cell($line[1])
			. '</td></tr>' . "\n");
		continue;
	}

	if (strncmp($line[0], '[', 1) == 0) {
		// We have a chapter
		$line[0] = str_replace('[', '', $line[0]);
		$line[0] = str_replace(']', '', $line[0]);
		$class2 = ' class="compare_chapter"';
	} else {
		$class2 = '';
	}

	$block = '<tr>';
	foreach ($line as $i => $f) {
		if (strstr($f, '/#')) {
			$t = explode('/#', $f);
			$class = ' class="compare_' . $t[1] . '"';
			$f = $t[0];
		} else if ($i && strncasecmp($f, 'no', 2) == 0) {
			$class = ' class="compare_bad"';
		} else if ($i && strncasecmp($f, 'yes', 3) == 0) {
			$class = ' class="compare_good"';
		} else {
			$class = '';
		}

		$block .= '<td' . $class . $class2 . '>' . cell($f) . '</td>';
	}
	$block .= '</tr>' . "\n";
	fwrite($out, $block);

	$lineno++;
}
fwrite($out, '</table>' . "\n");
fclose($out);
fclose($h);

Hints

Before first commit, do not forget to setup your git environment:
git config --global user.name "your_name_here"
git config --global user.email "your@email_here"

Clone this repository using HTTP(S):
git clone https://code.reversed.top/user/xaizek/rocketgit

Clone this repository using ssh (do not forget to upload a key first):
git clone ssh://rocketgit@code.reversed.top/user/xaizek/rocketgit

You are allowed to anonymously push to this repository.
This means that your pushed commits will automatically be transformed into a pull request:
... clone the repository ...
... make some changes and some commits ...
git push origin master