registry =& $registry;
}
// ###################################################################
/**
* (PHP 4) Constructor
*/
function Printer_CSS(&$registry)
{
$this->__construct($registry);
}
// ###################################################################
/**
* Adds a CSS information block to the array for later use
*
* @access public
*
* @param string Block title to display in thead
* @param string CSS class/descriptor/element name
* @param bool Show the link CSS information
*/
function add_block($title, $descriptor, $dolink)
{
if (isset($this->descriptors["$descriptor"]))
{
trigger_error('The descriptor `' . $descriptor . '` already exists', E_USER_WARNING);
return;
}
$this->descriptors["$descriptor"] = array(
'title' => $title,
'descriptor' => $descriptor,
'dolink' => $dolink
);
}
// ###################################################################
/**
* Sets a master data key for a given descriptor and property
*
* @access public
*
* @param string Descriptor
* @param string Property
* @param string Value
*/
function set_master_data($descriptor, $property, $value)
{
$this->masterdata["$descriptor"]["$property"] = $value;
}
// ###################################################################
/**
* Sets a custom data key for a given descriptor and property
*
* @access public
*
* @param string Descriptor
* @param string Property
* @param string Value
*/
function set_custom_data($descriptor, $property, $value)
{
$this->customdata["$descriptor"]["$property"] = $value;
}
// ###################################################################
/**
* Generates the HTML needed to output the CSS editing blocks; this is
* done in the form of using ISSO.Printer
*
* @access public
*/
function generate_blocks()
{
$print =& $this->registry->modules['printer'];
$lang = array(
'standard_css_attributes' => $this->registry->modules['localize']->string('Standard CSS Attributes'),
'extra_css_attributes' => $this->registry->modules['localize']->string('Extra CSS Attributes'),
'links_normal' => $this->registry->modules['localize']->string('Normal CSS Links'),
'links_visited' => $this->registry->modules['localize']->string('Visited CSS Links'),
'links_hover' => $this->registry->modules['localize']->string('Hover CSS Links'),
'background' => $this->registry->modules['localize']->string('Background'),
'font_color' => $this->registry->modules['localize']->string('Font Color'),
'font_style' => $this->registry->modules['localize']->string('Font Style'),
'font_size' => $this->registry->modules['localize']->string('Font Size'),
'font_family' => $this->registry->modules['localize']->string('Font Family'),
'text_decoration' => $this->registry->modules['localize']->string('Text Decoration'),
'css_selector' => $this->registry->modules['localize']->string('CSS Selector'),
'save_css' => $this->registry->modules['localize']->string('Save CSS')
);
foreach ($this->descriptors AS $descriptor)
{
$value = array();
$print->table_start();
$print->table_head($descriptor['title']);
$value['background'] = $this->fetch_value($descriptor['descriptor'], 'background');
$value['color'] = $this->fetch_value($descriptor['descriptor'], 'color');
$value['font_style'] = $this->fetch_value($descriptor['descriptor'], 'font-style');
$value['font_size'] = $this->fetch_value($descriptor['descriptor'], 'font-size');
$value['font_family'] = $this->fetch_value($descriptor['descriptor'], 'font-family');
$value['extra'] = $this->fetch_value($descriptor['descriptor'], 'extra');
$html = <<
|
|
HTML;
if ($descriptor['dolink'])
{
foreach (array('a:link' => 'a_link', 'a:visited' => 'a_visited', 'a:hover' => 'a_hover') AS $sel => $selname)
{
$value[$selname . '_background'] = $this->fetch_value($descriptor['descriptor'] . ' ' . $sel, 'background');
$value[$selname . '_color'] = $this->fetch_value($descriptor['descriptor'] . ' ' . $sel, 'color');
$value[$selname . '_text_decoration'] = $this->fetch_value($descriptor['descriptor'] . ' ' . $sel, 'text-decoration');
}
$html .= <<
|
|
|
HTML;
}
$print->row_span($html, 'alt2', 'left', 1);
$print->row_span('
' . $lang['css_selector'] . ': ' . $descriptor['descriptor'] . '
', 'tfoot', 'right', 1);
$print->table_end();
}
}
// ###################################################################
/**
* Returns the value of a given descriptor and property by comparing
* the mater set and custom set then returning the right one
*
* @access private
*
* @param string Descriptor
* @param string Property
*
* @return string Value of the given property
*/
function fetch_value($descriptor, $property)
{
if ($this->customdata["$descriptor"]["$property"] == '')
{
return $this->masterdata["$descriptor"]["$property"];
}
else
{
return $this->customdata["$descriptor"]["$property"];
}
}
// ###################################################################
/**
* Generates an array of queries that should be run on your database to
* update CSS changes. All of the queries have sprintf() markers that
* need to be evaluated:
*
* %1$s - Database table
* %2$s - styleid field
* %3$s - descriptor field
* %4$s - property field
* %5$s - value field
* %6%d - Styleid value
*
* @access public
*
* @param array Array of user-inputted information to be transformed into queries
*
* @return array Queries that need to be evaluated then ran
*/
function generate_change_query($data)
{
$queries[0] = '--- RESERVED FOR LATER USE ---';
$deletes = array();
foreach ($this->descriptors AS $descriptor => $opts)
{
$dolink = $opts['dolink'];
if ($dolink)
{
$loops = array('', ' a:link', ' a:visited', ' a:hover');
}
else
{
$loops = array('');
}
foreach ($loops AS $sel)
{
foreach ($data["$descriptor$sel"] AS $prop => $value)
{
// the given value matches the master -- no change
if ($this->masterdata["$descriptor$sel"]["$prop"] == $value)
{
continue;
}
// the given matches the custom -- no change
else if ($this->customdata["$descriptor$sel"]["$prop"] == $value)
{
continue;
}
// no matching, it's new
else
{
$deletes[] = "%3\$s = '" . $this->escape($descriptor . $sel) . "' AND %4\$s = '" . $this->escape($prop) . "'";
$queries[] = "INSERT INTO %1\$s (%2\$s, %3\$s, %4\$s, %5\$s) VALUES (%6\$d, '" . $this->escape($descriptor . $sel) . "', '" . $this->escape($prop) . "', '" . $this->escape($value) . "')";
}
}
}
}
if (sizeof($deletes) < 1)
{
$queries[0] = '##';
}
else
{
$queries[0] = "DELETE FROM %1\$s WHERE styleid = %6\$d AND ((" . implode(') OR (', $deletes) . "))";
}
return $queries;
}
// ###################################################################
/**
* Wrapper for $this->registry->modules[ISSO_DB_LAYER]->escape_string()
*
* @access private
*
* @param string Unprotected string
*
* @return string Sanitized string
*/
function escape($string)
{
return $this->registry->modules[ISSO_DB_LAYER]->escape_string($string);
}
// ###################################################################
/**
* Generates a linkable/usable CSS stylehseet content file; this can
* be outputted to the browser
*
* @access public
*
* @return string CSS output
*/
function generate_css_output()
{
$data = array();
foreach ($this->descriptors AS $descriptor => $opts)
{
$dolink = $opts['dolink'];
if ($dolink)
{
$loops = array('', ' a:link', ' a:visited', ' a:hover');
}
else
{
$loops = array('');
}
foreach ($loops AS $sel)
{
foreach ($this->masterdata["$descriptor$sel"] AS $prop => $value)
{
$data["$descriptor$sel"]["$prop"] = $value;
}
if (is_array($this->customdata["$descriptor$sel"]))
{
foreach ($this->customdata["$descriptor$sel"] AS $prop => $value)
{
$data["$descriptor$sel"]["$prop"] = $value;
}
}
}
}
$output = '/* CSS Style Sheet (generated by ISSO.Printer.CSS $Revision$) */';
foreach ($data AS $selector => $props)
{
$output .= "\n\n$selector\n{";
foreach ($props AS $name => $value)
{
if ($name != 'extra')
{
$output .= "\n\t$name: $value;";
}
}
if ($props['extra'])
{
$extra = explode("\n", $this->registry->modules['functions']->convert_line_breaks($props['extra']));
foreach ($extra AS $prop)
{
$output .= "\n\t$prop";
}
}
$output .= "\n}";
}
return $output;
}
}
/*=====================================================================*\
|| ###################################################################
|| # $HeadURL$
|| # $Id$
|| ###################################################################
\*=====================================================================*/
?>