$v) { if (trim($k) <> '') { if (is_bool($v)) { if ($v) { $prepared_attributes[] = "$k=\"$k\""; } } else { $prepared_attributes[] = $k . '="' . clean($v) . '"'; } // if } // if } // foreach $attribute_string = implode(' ', $prepared_attributes); } // if $empty_string = $empty ? ' /' : ''; // Close? return "<$name $attribute_string$empty_string>"; // And done... } // html_tag /** * Close specific HTML tag * * @access public * @param string $name Tag name * @return string */ function close_html_tag($name) { return ""; } // close_html_tag /** * Return title tag * * @access public * @param string $title * @return string */ function title_tag($title) { return open_html_tag('title') . $title . close_html_tag('title'); } // title_tag /** * Prepare link tag * * @access public * @param string $href * @param string $rel_or_rev Rel or rev * @param string $rel * @param array $attributes * @return string */ function link_tag($href, $rel_or_rev = 'rel', $rel = 'alternate', $attributes = null) { // Prepare attributes $all_attributes = array( 'href' => $href, $rel_or_rev => $rel ); // array // Additional attributes if (is_array($attributes) && count($attributes)) { $all_attributes = array_merge($all_attributes, $attributes); } // if // And done! return open_html_tag('link', $all_attributes, true); } // link_tag /** * Rel link tag * * @access public * @param string $href * @param string $rel * @param string $attributes * @return string */ function link_tag_rel($href, $rel, $attributes = null) { return link_tag($href, 'rel', $rel, $attributes); } // link_tag_rel /** * Rev link tag * * @access public * @param string $href * @param string $rel * @param string $attributes * @return string */ function link_tag_rev($href, $rel, $attributes = null) { return link_tag($href, 'rev', $rel, $attributes); } // link_tag_rev /** * Return code of meta tag * * @access public * @param string $name Name of the meta property * @param string $content * @param boolean $http_equiv * @return string */ function meta_tag($name, $content, $http_equiv = false) { // Name attribute $name_attribute = $http_equiv ? 'http-equiv' : 'name'; // Prepare attributes $attributes = array( $name_attribute => $name, 'content' => $content ); // array // And done... return open_html_tag('meta', $attributes, true); } // meta_tag /** * Generate javascript tag * * @access public * @param string $src Path to external file * @param string $content Tag content * @return string */ function javascript_tag($src = null, $content = null) { // Content formatting if ($content) { $content = "\n" . $content . "\n"; } // Prepare attributes $attributes = array('type' => 'text/javascript'); if (!is_null($src)) { $attributes['src'] = is_valid_url($src) ? $src : get_javascript_url($src); } // if // Generate return open_html_tag('script', $attributes) . $content . close_html_tag('script'); } // javascript_tag /** * Render stylesheet tag * * @access public * @param string $href URL of external stylesheet * @Param array $attributes * @return string */ function stylesheet_tag($href, $attributes = null) { if (!is_valid_url($href)) { $href = get_stylesheet_url($href); } // if $all_attributes = array( 'type' => 'text/css' ); // array if (is_array($attributes) && count($attributes)) { array_merge($all_attributes, $attributes); } // if return link_tag($href, 'rel', 'Stylesheet', $all_attributes); } // stylesheet_tag /** * Render style tag inside optional conditional comment * * @access public * @param string $content * @param string $condition Condition for conditional comment (IE, lte IE6...). If null * conditional comment will not be added * @return string */ function style_tag($content, $condition = null) { // Open and close for conditional comment $open = ''; $close = ''; if ($condition) { $open = "'; } // if // And return... return $open . open_html_tag('style', array('type' => 'text/css')) . "\n" . $content . "\n" . close_html_tag('style') . "\n" . $close; } // style_tag /** * Page description class * * Class that hold XHTML page properties. This class can be used from templates * to inform layouts that templates want some proprety changes. It is entirely * on layout to decide if it will use properties from instance of this class or * some other set of values. * * @version 1.0 * @http://www.projectpier.org/ */ class PageDescription { /** * Page title * * @var string */ private $title; /** * Array of page metadata * * @var array */ private $meta = array(); /** * Array of links * * @var array */ private $links = array(); /** * Array of inline CSS rules * * @var array */ private $inline_css = array(); /** * Array of links to external JS files * * @var array */ private $javascript = array(); /** * Array of inline JS code * * @var array */ private $inline_js = array(); /** * Get title * * @access public * @param null * @return string */ function getTitle() { return $this->title; } // getTitle /** * Set title value * * @access public * @param string $value * @return null */ function setTitle($value) { $this->title = $value; } // setTitle /** * Get meta * * @access public * @param null * @return type */ function getMeta() { return $this->meta; } // getMeta /** * Add page meta entry * * @access public * @param string $name * @param string $content * @param boolean $http_equiv * @return null */ function addMeta($name, $content, $http_equiv = false) { $this->meta[] = array( 'name' => $name, 'content' => $content, 'http_equiv' => $http_equiv ); // array } // addMeta /** * Get links * * @access public * @param null * @return array */ function getLinks() { return $this->links; } // getLinks /** * Add rel link * * @param string $href Link locator * @param string $rel Rel value * @param string $attributes * @return mixed */ function addRelLink($href, $rel = 'alternate', $attributes) { $this->addLink($href, 'rel', $rel, $attributes); } // end func addRelMedia /** * Add rev link * * @param string $href Link locator * @param string $rev Rev value * @param array $attributes * @return mixed */ function addRevLink($href, $rev = 'alternate', $attributes = null) { $this->addLink($href, 'rev', $rev, $attributes); } // end func addRevLink /** * Add link * * @access public * @param string $href * @param string $rel_or_rev * @param string $rel * @param array $attributes * @return null */ function addLink($href, $rel_or_rev = 'rel', $rel = 'alternate', $attributes = null) { // Do we have this link? foreach ($this->links as $link) { if (array_var($link, 'href') == $href) { return; } } // Prepare link attributes... $link = array( 'href' => $href, $rel_or_rev => $rel ); // array // Additional attributes if (is_array($attributes) && count($attributes)) { $link = array_merge($link, $attributes); } $this->links[] = $link; } // addLink /** * Get inline_css * * @access public * @param null * @return array */ function getInlineCSS() { return $this->inline_css; } // getInlineCSS /** * Add inline CSS block * * @access public * @param string $content * @param string $condition * @return null */ function addInlineCSS($content, $condition = null) { $this->inline_css[] = array( 'content' => $content, 'condition' => $condition ); // array } // addInlineCSS /** * Get javascription * * @access public * @param null * @return array */ function getJavascript() { return $this->javascript; } // getJavascript /** * Add external JS link * * @access public * @param string $src JS file URL * @return null */ function addJavascript($src) { $this->javascript[] = $src; } // addJavascript /** * Check if specific javascript file is included on page * * @access public * @param string $src * @return boolean */ function isJavascriptIncluded($src) { return in_array($src, $this->inline_js); } // isJavascriptIncluded /** * Get inline_js * * @access public * @param null * @return array */ function getInlineJS() { return $this->inline_js; } // getInlineJS /** * Add inline JS entry * * @access public * @param string * @return null */ function addInlineJS($content) { $this->inline_js[] = $content; } // addInlineJS /** * Return single PageDescription instance * * @access public * @param void * @return PageDescription */ static function instance() { static $instance; if (!instance_of($instance, 'PageDescription')) { $instance = new PageDescription(); } // if return $instance; } // instance } // PageDescription /** * Return page title * * @access public * @param void * @return string */ function get_page_title() { $page = PageDescription::instance(); // If we dont have title use action if ($page->getTitle() == '') { $action = array_var($_GET, 'action'); return $action ? ucfirst($action) : PRODUCT_NAME; } else { return $page->getTitle(); } // if } // get_page_title /** * Set page title * * @access public * @param string $value * @return null */ function set_page_title($value) { PageDescription::instance()->setTitle(clean($value)); } // set_page_title /** * Add external stylesheet file to page * * @access public * @param string $href * @param string $title * @param string $media * @return null */ function add_stylesheet_to_page($href, $title = null, $media = null) { if (!is_valid_url($href)) { $href = get_stylesheet_url($href); } $page = PageDescription::instance(); $attributes = array('type' => 'text/css'); if ($title) $attributes['title'] = $title; if ($media) $attributes['media'] = $media; $page->addRelLink($href, 'Stylesheet', $attributes); // addRelLink } // add_stylesheet_to_page /** * Add external JS to page * * @access public * @param string $src URL of external JS file * @return null */ function add_javascript_to_page($src) { $page = PageDescription::instance(); $page->addJavascript($src); } // add_javascript_to_page /** * Add inline JS to page * * @access public * @param string $content * @return null */ function add_inline_javascript_to_page($content) { $page = PageDescription::instance(); $page->addInlineJS($content); } // add_inline_javascript_to_page /** * Add inline CSS to page * * @access public * @param string $content * @param string $condition * @return null */ function add_inline_css_to_page($content, $condition = null) { $page = PageDescription::instance(); $page->addInlineCSS($content, $condition); } // add_inline_css_to_page /** * Return generated page meta code * * @access public * @param void * @return string */ function render_page_meta() { // Get page instance... $page = PageDescription::instance(); // Get meta... $meta = $page->getMeta(); // Generated code... $generated_code = ''; if (is_array($meta) && count($meta)) { $generated = array(); foreach ($meta as $data) { $generated[] = meta_tag($data['name'], $data['content'], $data['http_equiv']); } // foreach $generated_code = implode("\n", $generated); } // if // Return... return $generated_code; } // render_page_meta /** * Render page links * * @access public * @param void * @return string */ function render_page_links() { // Get page instance... $page = PageDescription::instance(); // Getlinks... $links = $page->getLinks(); // Prepare result $generated_code = ''; // If we have links go... if (is_array($links) && count($links)) { $generated = array(); foreach ($links as $data) { $href = array_var($data, 'href'); $rel_or_rev = isset($data['rel']) ? 'rel' : 'rev'; $rel = ''; if (isset($data[$rel_or_rev])) { $rel = $data[$rel_or_rev]; unset($data[$rel_or_rev]); } // if $generated[] = link_tag($href, $rel_or_rev, $rel, $data); } // if $generated_code = implode("\n", $generated); } // if return $generated_code; } // render_page_links /** * Render page inline CSS * * @access public * @param void * @return string */ function render_page_inline_css() { // Get page instance... $page = PageDescription::instance(); // Get inline CSS $css = $page->getInlineCSS(); // Prepare result... $generated_code = ''; // And get code... if (is_array($css) && count($css)) { $generated = array(); foreach ($css as $data) { // Get... $content = array_var($data, 'content'); $condition = array_var($data, 'condition'); // If we have content generate tag... if ($content) { $generated[] = style_tag($content, $condition); } } // foreach $generated_code = implode("\n", $generated); } // if // And done! return $generated_code; } // render_page_inline_css /** * Render javascript tags * * @access public * @param void * @return string */ function render_page_javascript() { // Get page instance... $page = PageDescription::instance(); // Get page javascript... $javascript = $page->getJavascript(); // Prepare result... $generated_code = ''; // Loop... if (is_array($javascript) && count($javascript)) { $generated = array(); foreach ($javascript as $data) { $generated[] = javascript_tag($data); } // foreach $generated_code = implode("\n", $generated); } // if // Done... return $generated_code; } // render_page_javascript /** * Render inline javascript * * @access public * @param void * @return string */ function render_page_inline_js() { // Get page instance... $page = PageDescription::instance(); // Get page javascript... $javascript = $page->getInlineJS(); // Prepare result... $generated_code = ''; // Loop... if (is_array($javascript) && count($javascript)) { $generated = array(); foreach ($javascript as $data) { $generated[] = javascript_tag(null, $data); } // foreach $generated_code = implode("\n", $generated); } // if // Done... return $generated_code; } // render_page_inline_js /** * Render page head... * * @access public * @param string $title * @return string */ function render_page_head() { $page = PageDescription::instance(); $page->addRelLink(get_public_url('assets/print.css'), 'stylesheet', array('type'=>'text/css', 'media'=>'print')); $head = render_page_links() . "\n" . render_page_meta() . "\n" . render_page_javascript() . "\n" . render_page_inline_js() . "\n" . render_page_inline_css(); return trim($head) . "\n"; } // render_page_head /** * Return URL relative to public folder * * @param string $rel * @return string */ function get_public_url($rel) { $base = trim(PUBLIC_FOLDER) == '' ? with_slash(ROOT_URL) : with_slash(with_slash(ROOT_URL) . PUBLIC_FOLDER); return $base . $rel; } // get_public_url /** * Return URL of specific file in /public/files * * @param string $file_name Name of the file or path relative to /public/files/ * @return string */ function get_file_url($file_name) { return get_public_url('files/' . $file_name); } // get_file_url /** * Return javascript URL * * @param string $file_name * @return string */ function get_javascript_url($file_name) { return get_public_url('assets/javascript/' . $file_name); } // get_javascript_url /** * Return URL of specific stylesheet * * @param string $file_name * @return string */ function get_stylesheet_url($file_name) { static $theme = null; if (is_null($theme)) { if (function_exists('config_option')) { $theme = config_option('theme'); } // if if (trim($theme) == '') { $theme = DEFAULT_THEME; } // if } // if return get_public_url("assets/themes/$theme/stylesheets/$file_name"); } // get_stylesheet_url /** * Return image URl * * @param string $file_name * @return string */ function get_image_url($file_name) { static $theme = null; if (is_null($theme)) { if (function_exists('config_option')) { $theme = config_option('theme'); } // if if (trim($theme) == '') { $theme = DEFAULT_THEME; } // if } // if return get_public_url("assets/themes/$theme/images/$file_name"); } // get_image_url ?>