From 7b6b1452291c3ccde34e2179ba8a2fd0e46f47c5 Mon Sep 17 00:00:00 2001 From: "Michael Kaufmann (d00p)" Date: Tue, 8 Feb 2011 10:38:47 +0100 Subject: [PATCH] add more new files for re-design Signed-off-by: Michael Kaufmann (d00p) --- lib/classes/output/class.Minify_HTML.php | 246 +++++++++++++++++++ lib/classes/output/class.htmlform.php | 168 +++++++++++++ lib/functions/froxlor/function.getThemes.php | 45 ++++ 3 files changed, 459 insertions(+) create mode 100644 lib/classes/output/class.Minify_HTML.php create mode 100644 lib/classes/output/class.htmlform.php create mode 100644 lib/functions/froxlor/function.getThemes.php diff --git a/lib/classes/output/class.Minify_HTML.php b/lib/classes/output/class.Minify_HTML.php new file mode 100644 index 00000000..9deff776 --- /dev/null +++ b/lib/classes/output/class.Minify_HTML.php @@ -0,0 +1,246 @@ + + */ +class Minify_HTML { + + /** + * "Minify" an HTML page + * + * @param string $html + * + * @param array $options + * + * 'cssMinifier' : (optional) callback function to process content of STYLE + * elements. + * + * 'jsMinifier' : (optional) callback function to process content of SCRIPT + * elements. Note: the type attribute is ignored. + * + * 'xhtml' : (optional boolean) should content be treated as XHTML1.0? If + * unset, minify will sniff for an XHTML doctype. + * + * @return string + */ + public static function minify($html, $options = array()) { + $min = new Minify_HTML($html, $options); + return $min->process(); + } + + + /** + * Create a minifier object + * + * @param string $html + * + * @param array $options + * + * 'cssMinifier' : (optional) callback function to process content of STYLE + * elements. + * + * 'jsMinifier' : (optional) callback function to process content of SCRIPT + * elements. Note: the type attribute is ignored. + * + * 'xhtml' : (optional boolean) should content be treated as XHTML1.0? If + * unset, minify will sniff for an XHTML doctype. + * + * @return null + */ + public function __construct($html, $options = array()) + { + $this->_html = str_replace("\r\n", "\n", trim($html)); + if (isset($options['xhtml'])) { + $this->_isXhtml = (bool)$options['xhtml']; + } + if (isset($options['cssMinifier'])) { + $this->_cssMinifier = $options['cssMinifier']; + } + if (isset($options['jsMinifier'])) { + $this->_jsMinifier = $options['jsMinifier']; + } + } + + + /** + * Minify the markeup given in the constructor + * + * @return string + */ + public function process() + { + if ($this->_isXhtml === null) { + $this->_isXhtml = (false !== strpos($this->_html, '_replacementHash = 'MINIFYHTML' . md5($_SERVER['REQUEST_TIME']); + $this->_placeholders = array(); + + // replace SCRIPTs (and minify) with placeholders + $this->_html = preg_replace_callback( + '/(\\s*)(]*?>)([\\s\\S]*?)<\\/script>(\\s*)/i' + ,array($this, '_removeScriptCB') + ,$this->_html); + + // replace STYLEs (and minify) with placeholders + $this->_html = preg_replace_callback( + '/\\s*(]*?>)([\\s\\S]*?)<\\/style>\\s*/i' + ,array($this, '_removeStyleCB') + ,$this->_html); + + // remove HTML comments (not containing IE conditional comments). + $this->_html = preg_replace_callback( + '//' + ,array($this, '_commentCB') + ,$this->_html); + + // replace PREs with placeholders + $this->_html = preg_replace_callback('/\\s*(]*?>[\\s\\S]*?<\\/pre>)\\s*/i' + ,array($this, '_removePreCB') + ,$this->_html); + + // replace TEXTAREAs with placeholders + $this->_html = preg_replace_callback( + '/\\s*(]*?>[\\s\\S]*?<\\/textarea>)\\s*/i' + ,array($this, '_removeTextareaCB') + ,$this->_html); + + // trim each line. + // @todo take into account attribute values that span multiple lines. + $this->_html = preg_replace('/^\\s+|\\s+$/m', '', $this->_html); + + // remove ws around block/undisplayed elements + $this->_html = preg_replace('/\\s+(<\\/?(?:area|base(?:font)?|blockquote|body' + .'|caption|center|cite|col(?:group)?|dd|dir|div|dl|dt|fieldset|form' + .'|frame(?:set)?|h[1-6]|head|hr|html|legend|li|link|map|menu|meta' + .'|ol|opt(?:group|ion)|p|param|t(?:able|body|head|d|h||r|foot|itle)' + .'|ul)\\b[^>]*>)/i', '$1', $this->_html); + + // remove ws outside of all elements + $this->_html = preg_replace_callback( + '/>([^<]+)_html); + + // use newlines before 1st attribute in open tags (to limit line lengths) + $this->_html = preg_replace('/(<[a-z\\-]+)\\s+([^>]+>)/i', "$1\n$2", $this->_html); + + // fill placeholders + $this->_html = str_replace( + array_keys($this->_placeholders) + ,array_values($this->_placeholders) + ,$this->_html + ); + return $this->_html; + } + + protected function _commentCB($m) + { + return (0 === strpos($m[1], '[') || false !== strpos($m[1], '_replacementHash . count($this->_placeholders) . '%'; + $this->_placeholders[$placeholder] = $content; + return $placeholder; + } + + protected $_isXhtml = null; + protected $_replacementHash = null; + protected $_placeholders = array(); + protected $_cssMinifier = null; + protected $_jsMinifier = null; + + protected function _outsideTagCB($m) + { + return '>' . preg_replace('/^\\s+|\\s+$/', ' ', $m[1]) . '<'; + } + + protected function _removePreCB($m) + { + return $this->_reservePlace($m[1]); + } + + protected function _removeTextareaCB($m) + { + return $this->_reservePlace($m[1]); + } + + protected function _removeStyleCB($m) + { + $openStyle = $m[1]; + $css = $m[2]; + // remove HTML comments + $css = preg_replace('/(?:^\\s*\\s*$)/', '', $css); + + // remove CDATA section markers + $css = $this->_removeCdata($css); + + // minify + $minifier = $this->_cssMinifier + ? $this->_cssMinifier + : 'trim'; + $css = call_user_func($minifier, $css); + + return $this->_reservePlace($this->_needsCdata($css) + ? "{$openStyle}/**/" + : "{$openStyle}{$css}" + ); + } + + protected function _removeScriptCB($m) + { + $openScript = $m[2]; + $js = $m[3]; + + // whitespace surrounding? preserve at least one space + $ws1 = ($m[1] === '') ? '' : ' '; + $ws2 = ($m[4] === '') ? '' : ' '; + + // remove HTML comments (and ending "//" if present) + $js = preg_replace('/(?:^\\s*\\s*$)/', '', $js); + + // remove CDATA section markers + $js = $this->_removeCdata($js); + + // minify + $minifier = $this->_jsMinifier + ? $this->_jsMinifier + : 'trim'; + $js = call_user_func($minifier, $js); + + return $this->_reservePlace($this->_needsCdata($js) + ? "{$ws1}{$openScript}/**/{$ws2}" + : "{$ws1}{$openScript}{$js}{$ws2}" + ); + } + + protected function _removeCdata($str) + { + return (false !== strpos($str, ''), '', $str) + : $str; + } + + protected function _needsCdata($str) + { + return ($this->_isXhtml && preg_match('/(?:[<&]|\\-\\-|\\]\\]>)/', $str)); + } +} + diff --git a/lib/classes/output/class.htmlform.php b/lib/classes/output/class.htmlform.php new file mode 100644 index 00000000..4f9a5b6f --- /dev/null +++ b/lib/classes/output/class.htmlform.php @@ -0,0 +1,168 @@ + (2010-) + * @license GPLv2 http://files.froxlor.org/misc/COPYING.txt + * @package Classes + * @version $Id: class.htmlform.php 130 2010-12-22 00:54:11Z d00p $ + */ + +class htmlform +{ + /** + * internal tmp-variable to store form + * @var string + */ + private static $_form = ''; + private static $_filename = ''; + + public static function genHTMLForm($data = array()) + { + global $lng; + + self::$_form = ''; + + foreach($data as $fdata) + { + $sections = $fdata['sections']; + + foreach($sections as $section) + { + /* + * here be section title & image + */ + $title = $section['title']; + $image = $section['image']; + + if(isset($section['visible']) && $section['visible'] === false) + { + continue; + } + + eval("self::\$_form .= \"" . getTemplate("misc/form/table_section", "1") . "\";"); + + foreach($section['fields'] as $fieldname => $fielddata) + { + if(isset($fielddata['visible']) && $fielddata['visible'] === false) + { + continue; + } + + $label = $fielddata['label']; + $desc = (isset($fielddata['desc']) ? $fielddata['desc'] : ''); + $style = (isset($fielddata['style']) ? ' style="'.$fielddata['style'].'"' : ''); + $mandatory = self::_getMandatoryFlag($fielddata); + $data_field = self::_parseDataField($fieldname, $fielddata); + $data_field = str_replace("\n", "", $data_field); + $data_field = str_replace("\t", "", $data_field); + eval("self::\$_form .= \"" . getTemplate("misc/form/table_row", "1") . "\";"); + } + } + } + + return self::$_form; + } + + private static function _parseDataField($fieldname, $data = array()) + { + switch($data['type']) + { + case 'text': + return self::_textBox($fieldname, $data); break; + case 'textul': + return self::_textBox($fieldname, $data, 'text', true); break; + case 'password': + return self::_textBox($fieldname, $data, 'password'); break; + case 'hidden': + return self::_textBox($fieldname, $data, 'hidden'); break; + case 'yesno': + return self::_yesnoBox($data); break; + case 'select': + return self::_selectBox($fieldname, $data); break; + case 'label': + return self::_labelField($data); break; + case 'textarea': + return self::_textArea($fieldname, $data); break; + } + } + + private static function _getMandatoryFlag($data = array()) + { + if(isset($data['mandatory'])) + { + return ' *'; + } + elseif(isset($data['mandatory_ex'])) + { + return ' **'; + } + return ''; + } + + private static function _textBox($fieldname = '', $data = array(), $type = 'text', $unlimited = false) + { + $return = ''; + $extras = ''; + if(isset($data['maxlength'])) { + $extras .= ' maxlength="'.$data['maxlength'].'"'; + } + if(isset($data['size'])) { + $extras .= ' size="'.$data['size'].'"'; + } + + $value = isset($data['value']) ? $data['value'] : ''; + $ulfield = ($unlimited == true ? ' '.$data['ul_field'] : ''); + if(isset($data['display']) && $data['display'] != '') + { + $ulfield = ''.$data['display'].''; + } + + eval("\$return = \"" . getTemplate("misc/form/input_text", "1") . "\";"); + return $return; + } + + private static function _textArea($fieldname = '', $data = array()) + { + $return = ''; + $extras = ''; + if(isset($data['cols'])) { + $extras .= ' cols="'.$data['cols'].'"'; + } + if(isset($data['rows'])) { + $extras .= ' rows="'.$data['rows'].'"'; + } + $value = isset($data['value']) ? $data['value'] : ''; + + eval("\$return = \"" . getTemplate("misc/form/input_textarea", "1") . "\";"); + return $return; + } + + private static function _yesnoBox($data = array()) + { + return $data['yesno_var']; + } + + private static function _labelField($data = array()) + { + return $data['value']; + } + + private static function _selectBox($fieldname = '', $data = array()) + { + return ''; + } +} diff --git a/lib/functions/froxlor/function.getThemes.php b/lib/functions/froxlor/function.getThemes.php new file mode 100644 index 00000000..d15e92a6 --- /dev/null +++ b/lib/functions/froxlor/function.getThemes.php @@ -0,0 +1,45 @@ + (2010-) + * @license GPLv2 http://files.froxlor.org/misc/COPYING.txt + * @package Functions + * @version $Id: function.getThemes.php 5 2010-11-08 09:35:26Z d00p $ + */ + +/** + * returns an array for the settings-array + * + * @return array + */ +function getThemes() +{ + $themespath = makeCorrectDir(dirname(dirname(dirname(dirname(__FILE__)))).'/templates/'); + $themes_available = array(); + + if (is_dir($themespath)) + { + $its = new DirectoryIterator($themespath); + + foreach ($its as $it) + { + if ($it->isDir() + && $it->getFilename() != '.' + && $it->getFilename() != '..' + && $it->getFilename() != '.svn' + && $it->getFilename() != 'misc' + ) { + $themes_available[] = $it->getFilename(); + } + } + } + return $themes_available; +}