Merge with default
--HG-- branch : sanitise-paths
This commit is contained in:
commit
fccaa6a326
11
footer.htm
Normal file
11
footer.htm
Normal file
@ -0,0 +1,11 @@
|
||||
<p>
|
||||
<strong>CONTACT</strong>
|
||||
</p>
|
||||
<p>
|
||||
For bug reports, feature requests, or if you need any help, please
|
||||
<a
|
||||
href="http://www.google.com/recaptcha/mailhide/d?k=01GuAWzMc9JjSdooo-2KCMQA==&c=kgR3dBrP39yhPIy8FvLFbuBLmWqorQBDc_Zjbw6NAmU="
|
||||
onclick="window.open('http://www.google.com/recaptcha/mailhide/d?k\07501GuAWzMc9JjSdooo-2KCMQA\75\75\46c\75kgR3dBrP39yhPIy8FvLFbuBLmWqorQBDc_Zjbw6NAmU\075', '', 'toolbar=0,scrollbars=0,location=0,statusbar=0,menubar=0,resizable=0,width=500,height=300'); return false;"
|
||||
title="Reveal this e-mail address"
|
||||
>click here</a> to email me.
|
||||
</p>
|
1
header.htm
Normal file
1
header.htm
Normal file
@ -0,0 +1 @@
|
||||
<h1><a href="index.html"><div id="ivylogo"></div>code.ivysaur.me</a></h1>
|
214
rebuild.php
214
rebuild.php
@ -29,6 +29,7 @@ function mkthumbnail($src_file, $dest_file, $width, $height) {
|
||||
$im = imagecreatefromstring(file_get_contents($src_file));
|
||||
|
||||
$dest = imagecreatetruecolor($width, $height);
|
||||
imagefilledrectangle($dest, 0, 0, $width, $height, imagecolorallocate($dest, 0xFF, 0xFF, 0xFF));
|
||||
|
||||
$scale = max( $width/$src_width, $height/$src_height ); // overscale + crop
|
||||
|
||||
@ -68,25 +69,6 @@ function mkspritesheet(array $handles, $dest_file, $width, $height) {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 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) {
|
||||
@ -114,20 +96,61 @@ function hesc($sz) {
|
||||
}
|
||||
|
||||
function text2html($sz) {
|
||||
$base = hesc($sz);
|
||||
$base = preg_replace('~(https?://[^ \\r\\n\\t]+)~i', '<a href="\\1">\\1</a>', $base);
|
||||
|
||||
$base = preg_replace('~=+(.+)=+~', '<strong>\\1</strong>', $base);
|
||||
$sectionFmt = function($sz) {
|
||||
$base = hesc($sz);
|
||||
|
||||
$btparts = explode('`', $base);
|
||||
if (count($btparts) > 1 && (count($btparts) % 2)) {
|
||||
for ($i = 1, $e = count($btparts); $i < $e; $i += 2) {
|
||||
$btparts[$i] = '<span class="code">'.$btparts[$i].'</span>';
|
||||
$base = preg_replace('~=+(.+)=+~', '<strong>\\1</strong>', $base);
|
||||
$base = preg_replace('~(https?://[^ \\r\\n\\t]+)~i', '<a href="\\1">\\1</a>', $base);
|
||||
|
||||
$btparts = explode('`', $base);
|
||||
if (count($btparts) > 1 && (count($btparts) % 2)) {
|
||||
for ($i = 1, $e = count($btparts); $i < $e; $i += 2) {
|
||||
$btparts[$i] = '<span class="code">'.$btparts[$i].'</span>';
|
||||
}
|
||||
$base = implode('', $btparts);
|
||||
}
|
||||
$base = implode('', $btparts);
|
||||
}
|
||||
|
||||
return nl2br($base);
|
||||
return nl2br($base);
|
||||
};
|
||||
|
||||
$identity = function($sz) {
|
||||
return $sz;
|
||||
};
|
||||
|
||||
$splitInside = function($begin, $end, $sz) {
|
||||
$parts = explode($begin, $sz);
|
||||
if (count($parts) == 1) return [$sz];
|
||||
|
||||
$ret = [$parts[0]];
|
||||
for($i = 1, $e = count($parts); $i !== $e; ++$i) {
|
||||
$inner = explode($end, $parts[$i], 2);
|
||||
$ret = array_merge($ret, $inner);
|
||||
}
|
||||
return $ret;
|
||||
};
|
||||
|
||||
$oddEven = function(array $parts, $odd, $even, $join='') {
|
||||
$ret = [];
|
||||
for($i = 0, $e = count($parts); $i != $e; ++$i) {
|
||||
$ret[] = ($i % 2) ? $odd($parts[$i]) : $even($parts[$i]);
|
||||
}
|
||||
return implode($join, $ret);
|
||||
};
|
||||
|
||||
$htmlSections = $splitInside('<html>', '</html>', $sz);
|
||||
return $oddEven($htmlSections, $identity, $sectionFmt);
|
||||
}
|
||||
|
||||
function array_decimate($array, $total, $partno) {
|
||||
$ct = 0;
|
||||
$ret = [];
|
||||
foreach($array as $k => $v) {
|
||||
if (++$ct % $total == ($partno - 1)) {
|
||||
$ret[$k] = $v;
|
||||
}
|
||||
}
|
||||
return $ret;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -142,6 +165,7 @@ class CProject {
|
||||
private $longdesc = '';
|
||||
private $images = array();
|
||||
private $downloads = array();
|
||||
public $tags = array();
|
||||
|
||||
public $homeimage = null;
|
||||
|
||||
@ -162,7 +186,12 @@ class CProject {
|
||||
$this->subtag = rtrim($matches[1], ' .');
|
||||
}
|
||||
|
||||
$this->shortdesc = array_shift(explode("\n", $this->longdesc));
|
||||
if (preg_match('~Tags: ([^\\r\\n]+)~', $this->longdesc, $matches)) {
|
||||
$this->tags = array_map('trim', explode(',', $matches[1]));
|
||||
}
|
||||
|
||||
$parts = explode("\n", $this->longdesc);
|
||||
$this->shortdesc = array_shift($parts);
|
||||
$this->shortdesc[0] = strtolower($this->shortdesc[0]); // cosmetic lowercase
|
||||
continue;
|
||||
}
|
||||
@ -173,6 +202,21 @@ class CProject {
|
||||
$this->downloads[] = $file;
|
||||
}
|
||||
}
|
||||
|
||||
natcasesort($this->downloads);
|
||||
$this->downloads = array_reverse($this->downloads);
|
||||
}
|
||||
|
||||
public function genHomeImage() {
|
||||
if (count($this->images)) {
|
||||
|
||||
$this->homeimage = mkthumbnail(
|
||||
$this->dir.$this->images[0], //BASEDIR.'wwwroot/srv/'.$this->projname.'_0.'.str_ext($this->images[0]),
|
||||
null, // raw handle
|
||||
INDEX_THUMB_W, INDEX_THUMB_H
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public function write() {
|
||||
@ -186,14 +230,6 @@ class CProject {
|
||||
mkthumbnail($outfile.'.'.str_ext($image), $outfile.'_thumb.jpg', PAGE_THUMB_W, PAGE_THUMB_H);
|
||||
}
|
||||
|
||||
if (count($this->images)) {
|
||||
$this->homeimage = mkthumbnail(
|
||||
BASEDIR.'wwwroot/srv/'.$this->projname.'_0.'.str_ext($this->images[0]),
|
||||
null, // raw handle
|
||||
INDEX_THUMB_W, INDEX_THUMB_H
|
||||
);
|
||||
}
|
||||
|
||||
// Copy downloads to wwwroot
|
||||
|
||||
foreach($this->downloads as $idx => $filename) {
|
||||
@ -208,6 +244,14 @@ class CProject {
|
||||
file_put_contents(BASEDIR.'wwwroot/'.$this->projname.'.html', $idxfile);
|
||||
}
|
||||
|
||||
public function getClassAttr() {
|
||||
if (count($this->tags)) {
|
||||
return 'taggedWith-'.implode(' taggedWith-', $this->tags);
|
||||
} else {
|
||||
return '';
|
||||
}
|
||||
}
|
||||
|
||||
public function index() {
|
||||
?>
|
||||
<h2><?=hesc($this->projname)?></h2>
|
||||
@ -220,6 +264,8 @@ class CProject {
|
||||
|
||||
<p><?=text2html($this->longdesc)?></p>
|
||||
|
||||
<?=file_get_contents(__DIR__.'/footer.htm')?>
|
||||
|
||||
<?php if (count($this->downloads)) { ?>
|
||||
|
||||
<strong>DOWNLOAD</strong>
|
||||
@ -227,7 +273,7 @@ class CProject {
|
||||
<ul>
|
||||
<?php foreach($this->downloads as $filename) { ?>
|
||||
<li>
|
||||
<a href="srv/<?=hesc(urlencode($filename))?>"><?=hesc($filename)?></a>
|
||||
<a href="srv/<?=hesc(rawurlencode($filename))?>"><?=hesc($filename)?></a>
|
||||
<small>
|
||||
<?=hesc(fbytes(filesize(BASEDIR.'wwwroot/srv/'.$filename)))?>
|
||||
</small>
|
||||
@ -261,13 +307,15 @@ function template($title, $content) {
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" >
|
||||
<meta name="viewport" content="width=768px" >
|
||||
<link type="text/css" rel="stylesheet" href="normalize.css">
|
||||
<link type="text/css" rel="stylesheet" href="style.css">
|
||||
<script type="text/javascript" src="site.js"></script>
|
||||
<title><?=hesc($title)?></title>
|
||||
</head>
|
||||
<body>
|
||||
<div id="container">
|
||||
<div id="content">
|
||||
<a href="index.html"><div id="bannerlogo"></div></a>
|
||||
<?=file_get_contents(__DIR__.'/header.htm')?>
|
||||
<?=$content?>
|
||||
</div>
|
||||
</div>
|
||||
@ -277,26 +325,7 @@ function template($title, $content) {
|
||||
return ob_get_clean();
|
||||
}
|
||||
|
||||
function buildall() {
|
||||
|
||||
// Clean up webroot
|
||||
|
||||
if (file_exists(BASEDIR.'wwwroot')) {
|
||||
rmdir_recursive(BASEDIR.'wwwroot');
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
function listprojects() {
|
||||
// List projects
|
||||
|
||||
$ls = scandir(BASEDIR.'data');
|
||||
@ -311,20 +340,39 @@ function buildall() {
|
||||
}
|
||||
}
|
||||
|
||||
return $projects;
|
||||
}
|
||||
|
||||
function buildprojects($id, $projects) {
|
||||
$count = 0;
|
||||
|
||||
foreach($projects as $dirname => $projectname) {
|
||||
|
||||
echo sprintf("@%1d [%3d/%3d] ".$projectname."...\n", $id, ++$count, count($projects));
|
||||
|
||||
$pr = new CProject($dirname, $projectname);
|
||||
$pr->write();
|
||||
}
|
||||
}
|
||||
|
||||
function buildcommon() {
|
||||
|
||||
echo "@0 [ 0/ ?] Common files...\n";
|
||||
|
||||
$projects = listprojects();
|
||||
|
||||
// Build all projects
|
||||
|
||||
$plist = array();
|
||||
$count = 0;
|
||||
|
||||
$handles = array();
|
||||
$handle_lookup = array();
|
||||
|
||||
foreach($projects as $dirname => $projectname) {
|
||||
|
||||
echo sprintf("[%3d/%3d] ".$projectname."...", ++$count, count($projects));
|
||||
|
||||
$pr = new CProject($dirname, $projectname);
|
||||
$pr->write();
|
||||
$pr->genHomeImage(); // thumbnail
|
||||
|
||||
$plist[] = $pr;
|
||||
|
||||
if (is_null($pr->homeimage)) {
|
||||
@ -333,8 +381,6 @@ function buildall() {
|
||||
$handle_lookup[$projectname] = count($handles);
|
||||
$handles[] = $pr->homeimage;
|
||||
}
|
||||
|
||||
echo " done\n";
|
||||
}
|
||||
|
||||
// Build homepage spritesheet
|
||||
@ -355,7 +401,7 @@ function buildall() {
|
||||
|
||||
<table class="projtable">
|
||||
<?php foreach ($plist as $pr) { ?>
|
||||
<tr>
|
||||
<tr class="<?=$pr->getClassAttr()?>">
|
||||
<td>
|
||||
<a href="<?=hesc(urlencode($pr->projname))?>.html"><?=(is_null($handle_lookup[$pr->projname]) ? '<div class="no-image"></div>' : '<div class="homeimage homeimage-sprite" style="background-position:0 -'.($handle_lookup[$pr->projname]*INDEX_THUMB_H).'px"></div>')?></a>
|
||||
</td>
|
||||
@ -363,9 +409,17 @@ function buildall() {
|
||||
<strong><?=hesc($pr->projname)?></strong>,
|
||||
<?=hesc($pr->shortdesc)?>
|
||||
<a href="<?=hesc(urlencode($pr->projname))?>.html">more...</a>
|
||||
<?php if (strlen($pr->subtag)) { ?>
|
||||
<?php if (strlen($pr->subtag) || count($pr->tags)) { ?>
|
||||
<br>
|
||||
<small><?=hesc($pr->subtag)?></small>
|
||||
<small>
|
||||
<?=hesc($pr->subtag)?>
|
||||
<?php if (strlen($pr->subtag) && count($pr->tags)) { ?>
|
||||
::
|
||||
<?php } ?>
|
||||
<?php foreach($pr->tags as $tag) { ?>
|
||||
<a class="tag tag-link" data-tag="<?=hesc($tag)?>"><?=hesc($tag)?></a>
|
||||
<?php } ?>
|
||||
</small>
|
||||
<?php } ?>
|
||||
</td>
|
||||
</tr>
|
||||
@ -376,8 +430,24 @@ function buildall() {
|
||||
$index = template(SITE_TITLE, ob_get_clean());
|
||||
file_put_contents(BASEDIR.'wwwroot/index.html', $index);
|
||||
|
||||
echo "All processes complete.\n";
|
||||
|
||||
// Done
|
||||
}
|
||||
|
||||
buildall();
|
||||
function main($args) {
|
||||
$total = $args[0];
|
||||
$pos = $args[1];
|
||||
|
||||
if ($pos == 0) {
|
||||
buildcommon();
|
||||
} else {
|
||||
buildprojects($pos, array_decimate(listprojects(), $total, $pos));
|
||||
}
|
||||
}
|
||||
|
||||
// Entry point
|
||||
//
|
||||
|
||||
ini_set('display_errors', 'On');
|
||||
error_reporting(E_ALL);
|
||||
|
||||
main(array_slice($_SERVER['argv'], 1));
|
||||
|
BIN
static/ivysaur24.png
Normal file
BIN
static/ivysaur24.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.4 KiB |
406
static/normalize.css
vendored
Normal file
406
static/normalize.css
vendored
Normal file
@ -0,0 +1,406 @@
|
||||
/*! normalize.css v2.1.3 | MIT License | git.io/normalize */
|
||||
|
||||
/* ==========================================================================
|
||||
HTML5 display definitions
|
||||
========================================================================== */
|
||||
|
||||
/**
|
||||
* Correct `block` display not defined in IE 8/9.
|
||||
*/
|
||||
|
||||
article,
|
||||
aside,
|
||||
details,
|
||||
figcaption,
|
||||
figure,
|
||||
footer,
|
||||
header,
|
||||
hgroup,
|
||||
main,
|
||||
nav,
|
||||
section,
|
||||
summary {
|
||||
display: block;
|
||||
}
|
||||
|
||||
/**
|
||||
* Correct `inline-block` display not defined in IE 8/9.
|
||||
*/
|
||||
|
||||
audio,
|
||||
canvas,
|
||||
video {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
/**
|
||||
* Prevent modern browsers from displaying `audio` without controls.
|
||||
* Remove excess height in iOS 5 devices.
|
||||
*/
|
||||
|
||||
audio:not([controls]) {
|
||||
display: none;
|
||||
height: 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Address `[hidden]` styling not present in IE 8/9.
|
||||
* Hide the `template` element in IE, Safari, and Firefox < 22.
|
||||
*/
|
||||
|
||||
[hidden],
|
||||
template {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* ==========================================================================
|
||||
Base
|
||||
========================================================================== */
|
||||
|
||||
/**
|
||||
* 1. Set default font family to sans-serif.
|
||||
* 2. Prevent iOS text size adjust after orientation change, without disabling
|
||||
* user zoom.
|
||||
*/
|
||||
|
||||
html {
|
||||
font-family: sans-serif; /* 1 */
|
||||
-ms-text-size-adjust: 100%; /* 2 */
|
||||
-webkit-text-size-adjust: 100%; /* 2 */
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove default margin.
|
||||
*/
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
/* ==========================================================================
|
||||
Links
|
||||
========================================================================== */
|
||||
|
||||
/**
|
||||
* Remove the gray background color from active links in IE 10.
|
||||
*/
|
||||
|
||||
a {
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
/**
|
||||
* Address `outline` inconsistency between Chrome and other browsers.
|
||||
*/
|
||||
|
||||
a:focus {
|
||||
outline: thin dotted;
|
||||
}
|
||||
|
||||
/**
|
||||
* Improve readability when focused and also mouse hovered in all browsers.
|
||||
*/
|
||||
|
||||
a:active,
|
||||
a:hover {
|
||||
outline: 0;
|
||||
}
|
||||
|
||||
/* ==========================================================================
|
||||
Typography
|
||||
========================================================================== */
|
||||
|
||||
/**
|
||||
* Address variable `h1` font-size and margin within `section` and `article`
|
||||
* contexts in Firefox 4+, Safari 5, and Chrome.
|
||||
*/
|
||||
|
||||
h1 {
|
||||
font-size: 2em;
|
||||
margin: 0.67em 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Address styling not present in IE 8/9, Safari 5, and Chrome.
|
||||
*/
|
||||
|
||||
abbr[title] {
|
||||
border-bottom: 1px dotted;
|
||||
}
|
||||
|
||||
/**
|
||||
* Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome.
|
||||
*/
|
||||
|
||||
b,
|
||||
strong {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/**
|
||||
* Address styling not present in Safari 5 and Chrome.
|
||||
*/
|
||||
|
||||
dfn {
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
/**
|
||||
* Address differences between Firefox and other browsers.
|
||||
*/
|
||||
|
||||
hr {
|
||||
-moz-box-sizing: content-box;
|
||||
box-sizing: content-box;
|
||||
height: 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Address styling not present in IE 8/9.
|
||||
*/
|
||||
|
||||
mark {
|
||||
background: #ff0;
|
||||
color: #000;
|
||||
}
|
||||
|
||||
/**
|
||||
* Correct font family set oddly in Safari 5 and Chrome.
|
||||
*/
|
||||
|
||||
code,
|
||||
kbd,
|
||||
pre,
|
||||
samp {
|
||||
font-family: monospace, serif;
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
/**
|
||||
* Improve readability of pre-formatted text in all browsers.
|
||||
*/
|
||||
|
||||
pre {
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set consistent quote types.
|
||||
*/
|
||||
|
||||
q {
|
||||
quotes: "\201C" "\201D" "\2018" "\2019";
|
||||
}
|
||||
|
||||
/**
|
||||
* Address inconsistent and variable font size in all browsers.
|
||||
*/
|
||||
|
||||
small {
|
||||
font-size: 80%;
|
||||
}
|
||||
|
||||
/**
|
||||
* Prevent `sub` and `sup` affecting `line-height` in all browsers.
|
||||
*/
|
||||
|
||||
sub,
|
||||
sup {
|
||||
font-size: 75%;
|
||||
line-height: 0;
|
||||
position: relative;
|
||||
vertical-align: baseline;
|
||||
}
|
||||
|
||||
sup {
|
||||
top: -0.5em;
|
||||
}
|
||||
|
||||
sub {
|
||||
bottom: -0.25em;
|
||||
}
|
||||
|
||||
/* ==========================================================================
|
||||
Embedded content
|
||||
========================================================================== */
|
||||
|
||||
/**
|
||||
* Remove border when inside `a` element in IE 8/9.
|
||||
*/
|
||||
|
||||
img {
|
||||
border: 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Correct overflow displayed oddly in IE 9.
|
||||
*/
|
||||
|
||||
svg:not(:root) {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
/* ==========================================================================
|
||||
Figures
|
||||
========================================================================== */
|
||||
|
||||
/**
|
||||
* Address margin not present in IE 8/9 and Safari 5.
|
||||
*/
|
||||
|
||||
figure {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
/* ==========================================================================
|
||||
Forms
|
||||
========================================================================== */
|
||||
|
||||
/**
|
||||
* Define consistent border, margin, and padding.
|
||||
*/
|
||||
|
||||
fieldset {
|
||||
border: 1px solid #c0c0c0;
|
||||
margin: 0 2px;
|
||||
padding: 0.35em 0.625em 0.75em;
|
||||
}
|
||||
|
||||
/**
|
||||
* 1. Correct `color` not being inherited in IE 8/9.
|
||||
* 2. Remove padding so people aren't caught out if they zero out fieldsets.
|
||||
*/
|
||||
|
||||
legend {
|
||||
border: 0; /* 1 */
|
||||
padding: 0; /* 2 */
|
||||
}
|
||||
|
||||
/**
|
||||
* 1. Correct font family not being inherited in all browsers.
|
||||
* 2. Correct font size not being inherited in all browsers.
|
||||
* 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome.
|
||||
*/
|
||||
|
||||
button,
|
||||
input,
|
||||
select,
|
||||
textarea {
|
||||
font-family: inherit; /* 1 */
|
||||
font-size: 100%; /* 2 */
|
||||
margin: 0; /* 3 */
|
||||
}
|
||||
|
||||
/**
|
||||
* Address Firefox 4+ setting `line-height` on `input` using `!important` in
|
||||
* the UA stylesheet.
|
||||
*/
|
||||
|
||||
button,
|
||||
input {
|
||||
line-height: normal;
|
||||
}
|
||||
|
||||
/**
|
||||
* Address inconsistent `text-transform` inheritance for `button` and `select`.
|
||||
* All other form control elements do not inherit `text-transform` values.
|
||||
* Correct `button` style inheritance in Chrome, Safari 5+, and IE 8+.
|
||||
* Correct `select` style inheritance in Firefox 4+ and Opera.
|
||||
*/
|
||||
|
||||
button,
|
||||
select {
|
||||
text-transform: none;
|
||||
}
|
||||
|
||||
/**
|
||||
* 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
|
||||
* and `video` controls.
|
||||
* 2. Correct inability to style clickable `input` types in iOS.
|
||||
* 3. Improve usability and consistency of cursor style between image-type
|
||||
* `input` and others.
|
||||
*/
|
||||
|
||||
button,
|
||||
html input[type="button"], /* 1 */
|
||||
input[type="reset"],
|
||||
input[type="submit"] {
|
||||
-webkit-appearance: button; /* 2 */
|
||||
cursor: pointer; /* 3 */
|
||||
}
|
||||
|
||||
/**
|
||||
* Re-set default cursor for disabled elements.
|
||||
*/
|
||||
|
||||
button[disabled],
|
||||
html input[disabled] {
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
/**
|
||||
* 1. Address box sizing set to `content-box` in IE 8/9/10.
|
||||
* 2. Remove excess padding in IE 8/9/10.
|
||||
*/
|
||||
|
||||
input[type="checkbox"],
|
||||
input[type="radio"] {
|
||||
box-sizing: border-box; /* 1 */
|
||||
padding: 0; /* 2 */
|
||||
}
|
||||
|
||||
/**
|
||||
* 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome.
|
||||
* 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome
|
||||
* (include `-moz` to future-proof).
|
||||
*/
|
||||
|
||||
input[type="search"] {
|
||||
-webkit-appearance: textfield; /* 1 */
|
||||
-moz-box-sizing: content-box;
|
||||
-webkit-box-sizing: content-box; /* 2 */
|
||||
box-sizing: content-box;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove inner padding and search cancel button in Safari 5 and Chrome
|
||||
* on OS X.
|
||||
*/
|
||||
|
||||
input[type="search"]::-webkit-search-cancel-button,
|
||||
input[type="search"]::-webkit-search-decoration {
|
||||
-webkit-appearance: none;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove inner padding and border in Firefox 4+.
|
||||
*/
|
||||
|
||||
button::-moz-focus-inner,
|
||||
input::-moz-focus-inner {
|
||||
border: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* 1. Remove default vertical scrollbar in IE 8/9.
|
||||
* 2. Improve readability and alignment in all browsers.
|
||||
*/
|
||||
|
||||
textarea {
|
||||
overflow: auto; /* 1 */
|
||||
vertical-align: top; /* 2 */
|
||||
}
|
||||
|
||||
/* ==========================================================================
|
||||
Tables
|
||||
========================================================================== */
|
||||
|
||||
/**
|
||||
* Remove most spacing between table cells.
|
||||
*/
|
||||
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0;
|
||||
}
|
46
static/site.js
Normal file
46
static/site.js
Normal file
@ -0,0 +1,46 @@
|
||||
(function() {
|
||||
"use strict";
|
||||
|
||||
var show_all = function() {
|
||||
var tr = document.querySelectorAll(".projtable tr");
|
||||
for (var i = 0, e = tr.length; i !== e; ++i) {
|
||||
tr[i].style.display = "table-row";
|
||||
}
|
||||
|
||||
var warn = document.querySelector(".tag-filter-warn");
|
||||
warn.parentNode.removeChild(warn);
|
||||
};
|
||||
|
||||
var show_tag = function(tag) {
|
||||
if (document.querySelector(".tag-filter-warn") !== null) {
|
||||
show_all();
|
||||
}
|
||||
|
||||
var tr = document.querySelectorAll(".projtable tr");
|
||||
for (var i = 0, e = tr.length; i !== e; ++i) {
|
||||
tr[i].style.display = (tr[i].className.split(" ").indexOf("taggedWith-"+tag) === -1) ? "none" : "table-row";
|
||||
}
|
||||
|
||||
var div = document.createElement("div");
|
||||
div.className = "tag-filter-warn";
|
||||
div.innerHTML = "Filtering by tag. <a>reset</a>";
|
||||
document.body.appendChild(div);
|
||||
|
||||
document.querySelector(".tag-filter-warn a").addEventListener('click', function() {
|
||||
show_all();
|
||||
return false;
|
||||
});
|
||||
};
|
||||
|
||||
var get_show_tag = function(tag) {
|
||||
return function() { show_tag(tag); return false; };
|
||||
};
|
||||
|
||||
window.addEventListener('load', function() {
|
||||
var taglinks = document.querySelectorAll(".tag-link");
|
||||
for (var i = 0, e = taglinks.length; i !== e; ++i) {
|
||||
var tag = taglinks[i].getAttribute("data-tag");
|
||||
taglinks[i].addEventListener('click', get_show_tag(tag));
|
||||
}
|
||||
});
|
||||
})();
|
@ -1,13 +1,24 @@
|
||||
/* style.css */
|
||||
|
||||
html {
|
||||
overflow-y:scroll; /* always display scrollbar to prevent horizontal lurch */
|
||||
}
|
||||
img {
|
||||
border:0;
|
||||
}
|
||||
a {
|
||||
color:black;
|
||||
text-decoration:underline;
|
||||
}
|
||||
a:hover {
|
||||
color:blue;
|
||||
cursor:pointer;
|
||||
}
|
||||
h1 a {
|
||||
text-decoration:none;
|
||||
}
|
||||
h1 a:hover {
|
||||
color:black;
|
||||
}
|
||||
h1,h2,h3 {
|
||||
margin-top:0;
|
||||
@ -27,6 +38,8 @@ html, body {
|
||||
padding:0;
|
||||
|
||||
/* cosmetic */
|
||||
font-family:"Helvetica Neue","Segoe UI",Arial,sans-serif;
|
||||
font-size:12px;
|
||||
background:#DDD url('pixel_weave.png'); /* thanks subtlepatterns.com ! */
|
||||
color:#333;
|
||||
}
|
||||
@ -51,6 +64,32 @@ html, body {
|
||||
|
||||
/* */
|
||||
|
||||
.tag::before {
|
||||
content:"";
|
||||
|
||||
display:inline-block;
|
||||
width:7px;
|
||||
height:7px;
|
||||
|
||||
margin-right:2px;
|
||||
|
||||
background:transparent url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAYAAADEUlfTAAAAZUlEQVQI12P4//8/Awyrqqp6KSkp/QdhFRWV7cgS+kDBN0B8RVlZuRikACahB+T8ger6BMTXwJJAiTwg4xvMOCj+ART3ZwCa3YYm8QcopgsyEWasDVT3W5AVMHcgO6gViNORXQ8A84NToxbSsJcAAAAASUVORK5CYII=') no-repeat 0 0;
|
||||
}
|
||||
|
||||
.tag-filter-warn {
|
||||
position:fixed;
|
||||
top:0;
|
||||
right:0;
|
||||
|
||||
padding:4px;
|
||||
|
||||
background:lightyellow;
|
||||
border-bottom: 1px solid #888;
|
||||
border-left:1px solid #888;
|
||||
}
|
||||
|
||||
/* */
|
||||
|
||||
.projtable {
|
||||
border-collapse: collapse;
|
||||
width:100%;
|
||||
@ -68,6 +107,9 @@ html, body {
|
||||
color:grey;
|
||||
font-style:italic;
|
||||
}
|
||||
.projtable tr td:first-child {
|
||||
width:95px;
|
||||
}
|
||||
|
||||
.projinfo {
|
||||
position:relative;
|
||||
@ -91,18 +133,19 @@ html, body {
|
||||
|
||||
/* */
|
||||
|
||||
#bannerlogo {
|
||||
width:631px;
|
||||
height:35px;
|
||||
margin:0 auto;
|
||||
background: white url('header.png') no-repeat 0 0;
|
||||
padding:8px;
|
||||
#ivylogo {
|
||||
background:transparent url('ivysaur24.png') no-repeat 0 0;
|
||||
width:24px;
|
||||
height:24px;
|
||||
display:inline-block;
|
||||
*display:block;
|
||||
*zoom:1;
|
||||
margin-right:4px;
|
||||
position:relative;
|
||||
top:4px;
|
||||
}
|
||||
|
||||
.headimg {
|
||||
width:310px;
|
||||
height:62px;
|
||||
}
|
||||
/* */
|
||||
|
||||
.homeimage {
|
||||
width:90px;
|
||||
|
Reference in New Issue
Block a user