Skip to content

Commit

Permalink
initial import
Browse files Browse the repository at this point in the history
  • Loading branch information
haraldmartin committed May 25, 2011
1 parent 52866f9 commit 970d621
Showing 1 changed file with 301 additions and 0 deletions.
301 changes: 301 additions & 0 deletions colhour.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,301 @@
<?php

/*
Plugin Name: Colhour
Plugin URI: http://burnfield.com/martin
Version: 0.3.1.1
Author: Martin Str&ouml;m
Author URI: http://burnfield.com/martin
Description: Enables the page to have colors generated by the <a href="http://harald.net/colhour">Colhour</a> system.
*/

/* --------------------------------------------------------------------------------
* Colhour class
* -------------------------------------------------------------------------------- */

class Colhour {

// Color table
var $_colors = array (

'year' => array(
"8300FF", "3F00FF", "3F00FF", "0081FF", "00FFFB", "00FF81",
"00FF02", "7DFF00", "FCFF00", "FF8A00", "FF1300", "E80030",
),

'month' => array(
"8200FF", "6600FF", "4A00FF",
"3000FF", "1700FF", "000AFF",
"003EFF", "008AFF", "00A6FF",
"00F0FF", "00FFF3", "00FFC1",
"00FF8D", "00FF5A", "00FF2C",
"0BFF00", "3EFF00", "71FF00",
"89FF00", "D9FF00", "FFF400",
"FFC400", "FF9300", "FF6300",
"FF3000", "FF0000", "E40037",
"CA006D", "B000A2", "9C00CC",
"8F00E7",
),

'day' => array(
"8300FF", "6200FF", "3F00FF", "1F00FF", "3F00FF", "0043FF",
"0081FF", "00C3FF", "00FFFB", "00FFBF", "00FF81", "00FF3F",
"00FF02", "3DFF00", "7DFF00", "BCFF00", "FCFF00", "FFC400",
"FF8A00", "FF4C00", "FF1300", "E80030", "E80030", "C70074",
),

'hour' => array(
"8200FF", "7400FF", "6600FF", "5900FF", "4A00FF", "3D00FF",
"3000FF", "2300FF", "1700FF", "0700FF", "000AFF", "0026FF",
"003EFF", "0058FF", "008AFF", "008AFF", "00A6FF", "00BEFF",
"00F0FF", "00FFF3", "00FFF3", "00FFDE", "00FFC1", "00FFA7",
"00FF8D", "00FF75", "00FF5A", "00FF42", "00FF2C", "00FF0F",
"0BFF00", "25FF00", "3EFF00", "56FF00", "71FF00", "89FF00",
"89FF00", "BFFF00", "D9FF00", "F3FF00", "FFF400", "FFDB00",
"FFC400", "FFA800", "FF9300", "FF7800", "FF6300", "FF4900",
"FF3000", "FF1900", "FF0000", "F30018", "E40037", "D8004F",
"CA006D", "BD0087", "B000A2", "A200C0", "9C00CC", "8F00E7",
),

'minute' => array(
"8200FF", "7400FF", "6600FF", "5900FF", "4A00FF", "3D00FF",
"3000FF", "2300FF", "1700FF", "0700FF", "000AFF", "0026FF",
"003EFF", "0058FF", "008AFF", "008AFF", "00A6FF", "00BEFF",
"00F0FF", "00FFF3", "00FFF3", "00FFDE", "00FFC1", "00FFA7",
"00FF8D", "00FF75", "00FF5A", "00FF42", "00FF2C", "00FF0F",
"0BFF00", "25FF00", "3EFF00", "56FF00", "71FF00", "89FF00",
"89FF00", "BFFF00", "D9FF00", "F3FF00", "FFF400", "FFDB00",
"FFC400", "FFA800", "FF9300", "FF7800", "FF6300", "FF4900",
"FF3000", "FF1900", "FF0000", "F30018", "E40037", "D8004F",
"CA006D", "BD0087", "B000A2", "A200C0", "9C00CC", "8F00E7",
),
);

// Hard coded UNIX timestamps
var $_timestamps = array(
'second' => 1,
'minute' => 60,
'hour' => 3600,
'day' => 86400,
'month' => 2635200, // 30.5 days
'year' => 31536000,
);

// Part specific data
var $_info = array(
'year' => array("Y-1-1", "month", "m"),
'month' => array("Y-m-1 0:0:0", "day", "j"),
'day' => array("Y-m-d H", "hour", "H"),
'hour' => array("Y-m-d H:i", "minute", "i"),
'minute' => array("Y-m-d H:i:s", "second", "s") // the blending won't work for minutes
);

// Converts a hex number to RGB
function _hex2RGB($hexstr) {
$int = hexdec($hexstr);
return array(
'r' => 0xFF & ($int >> 0x10),
'g' => 0xFF & ($int >> 0x8),
'b' => 0xFF & ($int)
);
}

// Blends (fades) between two colors
function _blendRGB($c1, $c2, $t) {
// $t must be in range 0...1
if ($t < -1) $t = -1;
else if ($t > 1) $t = 1;
if ($t < 0) $t = 1 + $t;

// convert colors from hex to rgb values
$c1 = $this->_hex2RGB($c1);
$c2 = $this->_hex2RGB($c2);

// transform
$ct = ($c1['r'] + ($c2['r'] - $c1['r']) * $t) << 16 |
($c1['g'] + ($c2['g'] - $c1['g']) * $t) << 8 |
($c1['b'] + ($c2['b'] - $c1['b']) * $t);

return "#".str_pad(dechex($ct), 6, "0", STR_PAD_LEFT);
}

// Returns the current color for given type. If no timestamp is given it'll use the current
function getColor($type="minute", $timestamp=NULL) {
$info = $this->_info[$type];

// Fix timestamp arg
if (!$timestamp) {
$timestamp = time();
}

// Calculate ratio
$ms_this = strtotime(date($info[0], $timestamp));
$ms_next = $ms_this + $this->_timestamps[$info[1]];
$ratio = (($ms_next - $ms_this) == 0)? 0 : ($timestamp - $ms_this) / ($ms_next - $ms_this);

// Get colors to blend between
$index = (int) date($info[2], $timestamp);
$c1 = $this->_colors[$type][$index];
$c2 = $this->_colors[$type][$index + 1];

// Debugging
/*print "<pre> :::: ".strtoupper($type)." :::: \n\n";
print_r(array(
"ms_this " => $ms_this." (".date("Y-m-d H:i:s", $ms_this).")",
"ms_next " => $ms_next." (".date("Y-m-d H:i:s", $ms_next).")",
"timestamp" => $timestamp." (".date("Y-m-d H:i:s", $timestamp).")",
"index" => $index,
"ratio" => $ratio
));
print "</pre>";*/

return $this->_blendRGB($c1, $c2, $ratio);
}

// Prints a html spectrum with all colors in given type
function printHTMLSpectrum($type="minute") {
$color = $this->_colors[$type];
$html = '<div id="_colhour_spectrum" style="-border: 1px solid #000;">';
foreach ($color as $c) {
$html .= '<div style="width: 25px; height: 25px; background: #'.$c.'; float: left;"></div>';
}
$html .= '<p style="clear: both; padding: 0; margin: 0; height: 0.1%;"></p></div>';
echo $html;
}

// Prints a html spectrum with all colors for every type
function printHTMLSpectra() {
foreach ($this->_colors as $name => $value) {
echo "$name";
$this->printHTMLSpectrum($name);
}
}

// Returns an array containing the different types supported
function getTypes() {
return array_keys($this->_colors);
}
}


/* --------------------------------------------------------------------------------
* Plugin class
* -------------------------------------------------------------------------------- */

class ColhourPlugin extends Colhour {

// Prints the CSS-rules with colhour replaces colors
function getCSS() {
?>
<style type="text/css" media="screen">
/* <![CDATA[ */

<?php
$css = "";
foreach ($this->getTypes() as $type) {
$rule = get_option("colhour_css_$type")."\n";
if (trim($rule) == "") continue;
$css .= str_replace("%colhour%", $this->getColor($type), $rule);

}
echo preg_replace("/\n\s*/", "\n\t", $css);
?>

/* ]]> */
</style>
<?php
}

// Set default options
function setDefaultOptions() {
foreach ($this->getTypes() as $type) {
add_option("colhour_css_$type", "");
}
}

// Adds the Colhour option page to WP's admin
function addOptionsPage() {
if (function_exists('add_options_page')) {
add_options_page("Colhour", "Colhour", 5, 'ColhourTab', array(&$this, 'optionsPage'));
}
}

// Generates the page for editing the options
function optionsPage() {
$this->setDefaultOptions();

if (isset($_POST['info_update'])) {
?><div id="message" class="updated fade">
<p><strong><?php
foreach ($this->getTypes() as $type) {
update_option("colhour_css_$type", $_POST["colhour_css_$type"]);
}
_e('Colhour options saved.')
?></strong></p>
</div>
<?php } ?>

<div class="wrap">
<form method="post">
<h2>Colhour Options</h2>

<p>The CSS rules are divided into different types by how long time the spectrum needs to start over from the beginning each time.<br /><a href="http://harald.net/colhour">Read more</a> about Colhour.</p>
<p>Use <code>%colhour%</code> (without any "<code>#</code>") as a placeholder for the color generated by Colhour.</p>

<p>
<code>
/* Examples */<br />
body {background: %colhour%};<br />
#header {border-bottom: %colhour%;}<br />
p.colhour {color: %colhour%;}
</code>
</p>

<fieldset class="options">
<?php
foreach (array_reverse($this->getTypes()) as $type):
$value = get_option("colhour_css_$type");
$rows = (trim($value) == "")? 2 : 5;
?>
<p>
<label for="colhour_css">Resets after one <strong><?php echo ($type) ?></strong></label>
<textarea name="colhour_css_<?php echo $type ?>"
id="colhour_css_<?php echo $type ?>" style="width: 98%;" rows="<?php echo $rows ?>"
cols="50" onfocus="this.rows=5;" onblur="if (this.value == '') this.rows=2;"><?php echo $value ?></textarea>
</p>
<?php endforeach ?>
</fieldset>

<div class="submit">
<p><input type="submit" name="info_update" value="<?php _e('Update Colhour Options') ?> &raquo;" /></p>
</div>

</form>
</div>
<?php
}

// Hooks in the plugin to the site's head and admin menu
function addHooks() {
if (!strpos($_SERVER['PHP_SELF'], 'wp-admin') !== FALSE) {
add_action('wp_head', array(&$this, 'getCSS'));
} else {
add_action('admin_menu', array(&$this, 'addOptionsPage'));
}
}

// Constructor
function ColhourPlugin() {
$this->setDefaultOptions();
$this->addHooks();
}
}


/* --------------------------------------------------------------------------------
* Initialization
* -------------------------------------------------------------------------------- */

$colhourPlugin = new ColhourPlugin();

?>

0 comments on commit 970d621

Please sign in to comment.