-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
52866f9
commit 970d621
Showing
1 changed file
with
301 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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ö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') ?> »" /></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(); | ||
|
||
?> |