diff --git a/rebuild.php b/rebuild.php index dc43caf..d3ab615 100644 --- a/rebuild.php +++ b/rebuild.php @@ -3,37 +3,19 @@ // Code-hosting website // ```````````````````` +// CONFIGURATION +// ````````````` + define('BASEDIR', __DIR__.'\\'); define('SITE_TITLE', 'code.ivysaur.me'); define('PAGE_THUMB_W', 60); define('PAGE_THUMB_H', 60); - -// clean up wwwroot - -if (file_exists(BASEDIR.'wwwroot')) { - rename(BASEDIR.'wwwroot', BASEDIR.'wwwroot.old.'.uniqid()); -} - -mkdir(BASEDIR.'wwwroot'); -mkdir(BASEDIR.'wwwroot/srv'); - -// List of projects - -$ls = scandir(BASEDIR.'data'); -sort($ls); -$projects = array(); -foreach($ls as $dirname) { - if ($dirname[0] == '.') continue; - $matches = array(); - - if (preg_match('~(?:\d+-)?(.+)~', $dirname, $matches)) { - $projects[$dirname] = $matches[1]; - } -} +define('INDEX_THUMB_W', 90); +define('INDEX_THUMB_H', 30); /** - * Create a thumbnail of an image. It overscales and crops to fit the target - * box. + * Create a thumbnail of an image. It overscales, centers, and crops to fit the + * target dimensions. * * @param string $src_file * @param string $dest_file @@ -50,21 +32,12 @@ function mkthumbnail($src_file, $dest_file, $width, $height) { $scale = max( $width/$src_width, $height/$src_height ); // overscale + crop - print_r($scale); - $box_w = $width/$scale; $box_h = $height/$scale; $box_xoff = floor(($src_width - $box_w)/2); $box_yoff = floor(($src_height - $box_h)/2); - print_r(array( - $dest, $im, - 0, 0, - $box_xoff, $box_yoff, - $width, $height, $box_w, $box_h - )); - imagecopyresampled( $dest, $im, 0, 0, @@ -75,6 +48,38 @@ function mkthumbnail($src_file, $dest_file, $width, $height) { return imagejpeg($dest, $dest_file); } +/** + * Remove a directory tree and all its contents. + * + * @author http://www.php.net/manual/en/function.rmdir.php#110489 + * @param string $dir + * @return boolean + */ +function rmdir_recursive($dir) { + $files = array_diff(scandir($dir), array('.','..')); + foreach ($files as $file) { + if (is_dir("$dir/$file")) { + rmdir_recursive("$dir/$file"); + } else { + unlink("$dir/$file"); + } + } + return rmdir($dir); +} + +function fbytes($size, $suffixes='B|KiB|MiB|GiB|TiB') { + $sxlist = explode('|', $suffixes); + if ($size < 1024) { + return $size.$sxlist[0]; + } + + while ($size > 1024 && count($sxlist) >= 2) { + array_shift($sxlist); + $size /= 1024; + } + return number_format($size, 2).array_shift($sxlist); +} + function str_ext($sz) { $dpos = strrpos($sz, '.'); return substr($sz, $dpos+1); @@ -88,15 +93,27 @@ function hesc($sz) { return @htmlentities($sz, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } +function text2html($sz) { + $base = nl2br(hesc($sz)); + + preg_replace('~(https?://.+\b)~i', '\1', $base); + return $base; +} + +/** + * + */ class CProject { private $dir; - private $projname; - private $shortdesc = '(no description)'; + public $projname; + public $shortdesc = '(no description)'; private $longdesc = ''; private $images = array(); private $downloads = array(); + public $homeimage = 'no_image.png'; + public function __construct($dirname, $projname) { $this->dir = BASEDIR.'data/'.$dirname.'/'; $this->projname = $projname; @@ -132,6 +149,15 @@ class CProject { mkthumbnail($outfile.'.'.str_ext($image), $outfile.'_thumb.jpg', PAGE_THUMB_W, PAGE_THUMB_H); } + if (count($this->images)) { + mkthumbnail( + BASEDIR.'wwwroot/srv/'.$this->projname.'_0.'.str_ext($this->images[0]), + BASEDIR.'wwwroot/srv/'.$this->projname.'_headimg.jpg', + INDEX_THUMB_W, INDEX_THUMB_H + ); + $this->homeimage = 'srv/'.$this->projname.'_headimg.jpg'; + } + // Copy downloads to wwwroot foreach($this->downloads as $idx => $filename) { @@ -142,55 +168,176 @@ class CProject { ob_start(); $this->index(); - $idxfile = ob_get_clean(); + $idxfile = template($this->projname.' | '.SITE_TITLE, ob_get_clean()); file_put_contents(BASEDIR.'wwwroot/'.$this->projname.'.html', $idxfile); } public function index() { -?> - - - - - <?=hesc($this->projname)?> | <?=hesc(SITE_TITLE)?> - - -

projname)?>

+?> +

> projname)?>

+ +
+ +
-

longdesc))?>

+ ABOUT - images)) { ?> -

Images

- images as $idx => $origname) { ?> - - - +

longdesc)?>

+ +downloads)) { ?> + + DOWNLOAD - downloads)) { ?> -

Files

+ downloads as $filename) { ?> +
  • + + + + +
  • - - + + +
    + +images)) { ?> +
    + images as $idx => $origname) { ?> + + +
    + + +
    + + + + + + + + <?=hesc($title)?> + + +
    +
    + +
    +
    + + + $projectname) { - $pr = new CProject($dirname, $projectname); - print_r($pr); +function buildall() { - $pr->write(); -} + // Clean up webroot + + if (file_exists(BASEDIR.'wwwroot')) { + rmdir_recursive(BASEDIR.'wwwroot'); + } -// Build index page + echo "Creating directories...\n"; + mkdir(BASEDIR.'wwwroot'); + mkdir(BASEDIR.'wwwroot/srv'); + // Copy in static files + + foreach(scandir(BASEDIR.'static') as $static) { + if ($static[0] == '.' || is_dir($static) /* fixme */) continue; + copy(BASEDIR.'static/'.$static, BASEDIR.'wwwroot/'.$static); + } + + // List projects + + $ls = scandir(BASEDIR.'data'); + sort($ls); + $projects = array(); + foreach($ls as $dirname) { + if ($dirname[0] == '.') continue; + $matches = array(); + + if (preg_match('~(?:\d+-)?(.+)~', $dirname, $matches)) { + $projects[$dirname] = $matches[1]; + } + } + + // Build all projects + + $plist = array(); + $count = 0; + + foreach($projects as $dirname => $projectname) { + + echo sprintf("[%2d/%2d] ".$projectname."...", ++$count, count($projects)); + + $pr = new CProject($dirname, $projectname); + $pr->write(); + $plist[] = $pr; + + echo " done\n"; + } + + // Build index page + + ob_start(); +?> +

    + + + +

    + This page contains several assorted projects, which no longer have any relation. They are listed in roughly chronological order (newest first). Unless specified otherwise, you may feel free to use and modify both the binaries and any source code, for any purpose, on the general condition you do not misrepresent who the author is (BSD license). +

    + +

    + Some of these projects formerly appeared on Google Code here, but were moved following the discontinuation of the Google Code binary download system. +

    + +

    + For bug reports, feature requests, or if you need any help, please + click here to email me. +

    + + + + + + + + + + +
    + + + projname)?>, + shortdesc)?> + more... +
    +