diff --git a/codesite2git b/codesite2git
new file mode 100755
index 0000000..462061b
--- /dev/null
+++ b/codesite2git
@@ -0,0 +1,153 @@
+#!/usr/bin/php
+allowText2Html = false; // Don't produce HTML when processing the download block
+ }
+
+ function ExportAsGit(string $dest) {
+
+ // Create destination directory
+ if (is_dir($dest)) {
+ throw new Exception("Destination path '{$dest}' already exists");
+ }
+ mkdir($dest);
+ shell_exec('cd '. escapeshellarg($dest).' && git init');
+
+ // Parse download information blocks
+ $this->filterLongDescArea();
+
+ // Prepare to start modifying the generated README.md file
+ $lines = explode("\n", $this->longdesc);
+ $lines = array_merge(["# ".$this->projname, ""], $lines);
+
+ // Modify some lines to standard markdown format:
+ foreach($lines as $i => $line) {
+
+ // Convert ==HEADERS== to ## Headers
+ if (strlen($line) > 0 && $line[0] == '=') {
+ $tmp = rtrim($line, '=');
+ $indent = substr_count($tmp, '=');
+
+ // Normalise the capitalisation for header text
+ $header_text = substr($tmp, $indent);
+ if ($header_text != "TODO" && $header_text != "FIXME" && $header_text != "WARNING") {
+ $header_text = ucwords(strtolower($header_text));
+ }
+
+ // raise markdown-equivalent header level by 1 to compensate for new header
+ $lines[$i] = $line = str_repeat('#', $indent + 1).' '.$header_text;
+ }
+
+ // Convert multiline single-backtick to multi-backtick
+ // Heuristic: if there is only a single backtick in the line
+ if (substr_count($line, '`') == 1) {
+ $lines[$i] = $line = str_replace('`', "\n```\n", $line);
+ }
+
+ // If the previous line started with a hyphen, and this line didn't, we need an
+ // extra line separator
+ if ($i > 0 && strlen($line) > 0 &&
+ $line[0] != '-' && strlen($lines[$i-1]) > 0 && $lines[$i-1][0] == '-'
+ ) {
+ $lines[$i] = $line = "\n".$line;
+ }
+ }
+
+ // Copy all images to a doc/ subdirectory
+ mkdir($dest.'/doc');
+ foreach($this->images as $img) {
+ copy($this->dir.$img, $dest.'/doc/'.$img);
+ }
+
+ // Copy all downloads to a dist-archive/ subdirectory
+
+ if (count($this->downloads) > 0) {
+
+ mkdir($dest.'/dist-archive');
+ foreach($this->downloads as $file) {
+ copy($this->dir.$file, $dest.'/dist-archive/'.$file);
+ }
+
+ if (! $this->downloads_section_was_replaced) {
+ // Add our own downloads section
+ $lines[] = $this->renderDownloadsBlock($this->downloads, true);
+ }
+ }
+
+ // Save final README
+ file_put_contents($dest.'/README.md', implode("\n", $lines));
+
+ // Extra properties file
+ $ctime = $this->lastupdate - ($this->lifespan * 3600); // Lifespans are measured in hours
+ file_put_contents($dest.'/.legacy-codesite.toml', "# Converted with codesite2git
+
+project_name=\"".$this->projname."\"
+short_description=\"".$this->shortdesc."\"
+written_in_lang=\"".$this->subtag."\"
+topics=".json_encode($this->tags)."
+ctime=".$ctime."
+mtime=".$this->lastupdate."
+
+");
+
+ // Git commit everything
+ // Once for the meta with ctime; once for all files with the mtime
+ $command = (
+ 'cd '. escapeshellarg($dest).' && '.
+ 'git add .legacy-codesite.toml ; '.
+ 'GIT_COMMITTER_DATE="'.date(DATE_ISO8601, $ctime).'" git commit -m "initial meta commit" --date '.escapeshellarg(date(DATE_ISO8601, $ctime)).' ; '.
+ 'git add -A ; '.
+ 'GIT_COMMITTER_DATE="'.date(DATE_ISO8601, $this->lastupdate).'" git commit -m "commit all archived files" --date '.escapeshellarg(date(DATE_ISO8601, $this->lastupdate))
+ );
+ echo $command."\n";
+ shell_exec($command);
+
+ }
+
+ public function renderDownloadsBlock($render_downloads, $include_header=false) { // override
+ if (! count($render_downloads)) {
+ return;
+ }
+
+ $ret = "\n";
+ if ($include_header) {
+ $ret .= "## Download\n\n";
+ }
+ foreach($render_downloads as $filename) {
+ $ret .= "- [⬇️ {$filename}](raw/branch/master/dist-archive/{$filename}) ";
+ $ret .= "*(".fbytes(filesize($this->dir.$filename)).")*\n";
+ }
+
+ return $ret;
+ }
+
+}
+
+function codesite2git(string $projdirname, string $projname, string $dest) {
+
+ // Parse existing project
+ $c = new CProjectGitExporter($projdirname, $projname);
+ var_dump($c);
+
+ $c->ExportAsGit($dest);
+
+}
+
+function main(array $argv) {
+ if (count($argv) != 5) {
+ die("Usage: codesite2git CODESITE_ROOT_PATH PROJECT_DIR_NAME PROJECT_REAL_NAME DEST_DIR\n");
+ }
+
+ $config = setup_vars($argv[1]);
+
+ codesite2git($argv[2], $argv[3], $argv[4]);
+}
+
+main($_SERVER['argv']);
diff --git a/lib/CProject.php b/lib/CProject.php
index bb871ab..21292b7 100644
--- a/lib/CProject.php
+++ b/lib/CProject.php
@@ -2,7 +2,7 @@
class CProject {
- private $dir;
+ protected $dir;
public $projname;
public $shortdesc = '(no description)';
@@ -10,11 +10,11 @@ class CProject {
public $lastupdate = 0;
public $numreleases = 0;
- private $longdesc = '';
- private $prefix_html = '';
- private $images = array();
- private $downloads = array();
- private $downloads_hashes = array();
+ protected $longdesc = '';
+ protected $prefix_html = '';
+ protected $images = array();
+ protected $downloads = array();
+ protected $downloads_hashes = array();
public $downloads_section_was_replaced = false;
@@ -26,6 +26,8 @@ class CProject {
protected $go_get_target = '';
protected $git_repo = '';
+
+ protected $allowText2Html = true;
public function __construct($dirname, $projname) {
$this->dir = BASEDIR.'data/'.$dirname.'/';
@@ -235,7 +237,9 @@ class CProject {
$this->longdesc = substr($this->longdesc, 0, strlen($this->longdesc)-1); // Strip the extra NL we added
- $this->longdesc = text2html($this->longdesc);
+ if ($this->allowText2Html) {
+ $this->longdesc = text2html($this->longdesc);
+ }
foreach($known_tags as $tag_name => $tag_idx) {
$this->longdesc = str_replace(
'${{TAG_'.$tag_idx.'}}',
@@ -244,7 +248,9 @@ class CProject {
);
}
- $this->longdesc = str_replace("\n
", "", $this->longdesc);
+ if ($this->allowText2Html) {
+ $this->longdesc = str_replace("\n
", "", $this->longdesc);
+ }
// Skip displaying the global downloads area
// This flag also indicates that the content has been pre-HTMLified