summaryrefslogtreecommitdiff
path: root/hugo/libraries/Theme.class.php
diff options
context:
space:
mode:
authorTristan Zur <tzur@web.web.ccwn.org>2014-03-27 22:27:47 +0100
committerTristan Zur <tzur@web.web.ccwn.org>2014-03-27 22:27:47 +0100
commitb62676ca5d3d6f6ba3f019ea3f99722e165a98d8 (patch)
tree86722cb80f07d4569f90088eeaea2fc2f6e2ef94 /hugo/libraries/Theme.class.php
Initial commit of intern.ccwn.org contentsHEADmaster
Diffstat (limited to 'hugo/libraries/Theme.class.php')
-rw-r--r--hugo/libraries/Theme.class.php601
1 files changed, 601 insertions, 0 deletions
diff --git a/hugo/libraries/Theme.class.php b/hugo/libraries/Theme.class.php
new file mode 100644
index 0000000..bf1ee8f
--- /dev/null
+++ b/hugo/libraries/Theme.class.php
@@ -0,0 +1,601 @@
+<?php
+/* vim: set expandtab sw=4 ts=4 sts=4: */
+/**
+ * hold PMA_Theme class
+ *
+ * @package PhpMyAdmin
+ */
+if (! defined('PHPMYADMIN')) {
+ exit;
+}
+
+/**
+ * handles theme
+ *
+ * @todo add the possibility to make a theme depend on another theme
+ * and by default on original
+ * @todo make all components optional - get missing components from 'parent' theme
+ *
+ * @package PhpMyAdmin
+ */
+class PMA_Theme
+{
+ /**
+ * @var string theme version
+ * @access protected
+ */
+ var $version = '0.0.0.0';
+
+ /**
+ * @var string theme name
+ * @access protected
+ */
+ var $name = '';
+
+ /**
+ * @var string theme id
+ * @access protected
+ */
+ var $id = '';
+
+ /**
+ * @var string theme path
+ * @access protected
+ */
+ var $path = '';
+
+ /**
+ * @var string image path
+ * @access protected
+ */
+ var $img_path = '';
+
+ /**
+ * @var integer last modification time for info file
+ * @access protected
+ */
+ var $mtime_info = 0;
+
+ /**
+ * needed because sometimes, the mtime for different themes
+ * is identical
+ * @var integer filesize for info file
+ * @access protected
+ */
+ var $filesize_info = 0;
+
+ /**
+ * @var array List of css files to load
+ * @access private
+ */
+ private $_cssFiles = array(
+ 'common',
+ 'enum_editor',
+ 'gis',
+ 'navigation',
+ 'pmd',
+ 'rte',
+ 'codemirror',
+ 'jqplot',
+ 'resizable-menu'
+ );
+
+ /**
+ * Loads theme information
+ *
+ * @return boolean whether loading them info was successful or not
+ * @access public
+ */
+ function loadInfo()
+ {
+ if (! file_exists($this->getPath() . '/info.inc.php')) {
+ return false;
+ }
+
+ if ($this->mtime_info === filemtime($this->getPath() . '/info.inc.php')) {
+ return true;
+ }
+
+ @include $this->getPath() . '/info.inc.php';
+
+ // was it set correctly?
+ if (! isset($theme_name)) {
+ return false;
+ }
+
+ $this->mtime_info = filemtime($this->getPath() . '/info.inc.php');
+ $this->filesize_info = filesize($this->getPath() . '/info.inc.php');
+
+ if (isset($theme_full_version)) {
+ $this->setVersion($theme_full_version);
+ } elseif (isset($theme_generation, $theme_version)) {
+ $this->setVersion($theme_generation . '.' . $theme_version);
+ }
+ $this->setName($theme_name);
+
+ return true;
+ }
+
+ /**
+ * returns theme object loaded from given folder
+ * or false if theme is invalid
+ *
+ * @param string $folder path to theme
+ *
+ * @return object PMA_Theme
+ * @static
+ * @access public
+ */
+ static public function load($folder)
+ {
+ $theme = new PMA_Theme();
+
+ $theme->setPath($folder);
+
+ if (! $theme->loadInfo()) {
+ return false;
+ }
+
+ $theme->checkImgPath();
+
+ return $theme;
+ }
+
+ /**
+ * checks image path for existance - if not found use img from fallback theme
+ *
+ * @access public
+ * @return bool
+ */
+ public function checkImgPath()
+ {
+ // try current theme first
+ if (is_dir($this->getPath() . '/img/')) {
+ $this->setImgPath($this->getPath() . '/img/');
+ return true;
+ }
+
+ // try fallback theme
+ $fallback = $GLOBALS['cfg']['ThemePath'] . '/'
+ . PMA_Theme_Manager::FALLBACK_THEME
+ . '/img/';
+ if (is_dir($fallback)) {
+ $this->setImgPath($fallback);
+ return true;
+ }
+
+ // we failed
+ trigger_error(
+ sprintf(
+ __('No valid image path for theme %s found!'),
+ $this->getName()
+ ),
+ E_USER_ERROR
+ );
+ return false;
+ }
+
+ /**
+ * returns path to theme
+ *
+ * @access public
+ * @return string path to theme
+ */
+ public function getPath()
+ {
+ return $this->path;
+ }
+
+ /**
+ * returns layout file
+ *
+ * @access public
+ * @return string layout file
+ */
+ public function getLayoutFile()
+ {
+ return $this->getPath() . '/layout.inc.php';
+ }
+
+ /**
+ * set path to theme
+ *
+ * @param string $path path to theme
+ *
+ * @return void
+ * @access public
+ */
+ public function setPath($path)
+ {
+ $this->path = trim($path);
+ }
+
+ /**
+ * sets version
+ *
+ * @param string $version version to set
+ *
+ * @return void
+ * @access public
+ */
+ public function setVersion($version)
+ {
+ $this->version = trim($version);
+ }
+
+ /**
+ * returns version
+ *
+ * @return string version
+ * @access public
+ */
+ public function getVersion()
+ {
+ return $this->version;
+ }
+
+ /**
+ * checks theme version agaisnt $version
+ * returns true if theme version is equal or higher to $version
+ *
+ * @param string $version version to compare to
+ *
+ * @return boolean true if theme version is equal or higher to $version
+ * @access public
+ */
+ public function checkVersion($version)
+ {
+ return version_compare($this->getVersion(), $version, 'lt');
+ }
+
+ /**
+ * sets name
+ *
+ * @param string $name name to set
+ *
+ * @return void
+ * @access public
+ */
+ public function setName($name)
+ {
+ $this->name = trim($name);
+ }
+
+ /**
+ * returns name
+ *
+ * @access public
+ * @return string name
+ */
+ public function getName()
+ {
+ return $this->name;
+ }
+
+ /**
+ * sets id
+ *
+ * @param string $id new id
+ *
+ * @return void
+ * @access public
+ */
+ public function setId($id)
+ {
+ $this->id = trim($id);
+ }
+
+ /**
+ * returns id
+ *
+ * @return string id
+ * @access public
+ */
+ public function getId()
+ {
+ return $this->id;
+ }
+
+ /**
+ * Sets path to images for the theme
+ *
+ * @param string $path path to images for this theme
+ *
+ * @return void
+ * @access public
+ */
+ public function setImgPath($path)
+ {
+ $this->img_path = $path;
+ }
+
+ /**
+ * Returns the path to image for the theme.
+ * If filename is given, it possibly fallbacks to fallback
+ * theme for it if image does not exist.
+ *
+ * @param string $file file name for image
+ *
+ * @access public
+ * @return string image path for this theme
+ */
+ public function getImgPath($file = null)
+ {
+ if (is_null($file)) {
+ return $this->img_path;
+ } else {
+ if (is_readable($this->img_path . $file)) {
+ return $this->img_path . $file;
+ } else {
+ return $GLOBALS['cfg']['ThemePath'] . '/'
+ . PMA_Theme_Manager::FALLBACK_THEME . '/img/' . $file;
+ }
+ }
+ }
+
+ /**
+ * Builds a CSS rule used for html formatted SQL queries
+ *
+ * @param string $classname The class name
+ * @param string $property The property name
+ * @param string $value The property value
+ *
+ * @return string The CSS rule
+ *
+ * @access public
+ *
+ * @see PMA_SQP_buildCssData()
+ */
+ public function buildSQPCssRule($classname, $property, $value)
+ {
+ $str = '.' . $classname . ' {';
+ if ($value != '') {
+ $str .= $property . ': ' . $value . ';';
+ }
+ $str .= '}' . "\n";
+
+ return $str;
+ } // end of the "PMA_SQP_buildCssRule()" function
+
+
+ /**
+ * Builds CSS rules used for html formatted SQL queries
+ *
+ * @return string The CSS rules set
+ *
+ * @access public
+ *
+ * @global array The current PMA configuration
+ *
+ * @see PMA_SQP_buildCssRule()
+ */
+ public function buildSQPCssData()
+ {
+ global $cfg;
+
+ $css_string = '';
+ foreach ($cfg['SQP']['fmtColor'] AS $key => $col) {
+ $css_string .= $this->buildSQPCssRule('syntax_' . $key, 'color', $col);
+ }
+
+ for ($i = 0; $i < 8; $i++) {
+ $css_string .= $this->buildSQPCssRule(
+ 'syntax_indent' . $i, 'margin-left',
+ ($i * $cfg['SQP']['fmtInd']) . $cfg['SQP']['fmtIndUnit']
+ );
+ }
+
+ return $css_string;
+ } // end of the "PMA_SQP_buildCssData()" function
+
+ /**
+ * load css (send to stdout, normally the browser)
+ *
+ * @return bool
+ * @access public
+ */
+ public function loadCss()
+ {
+ $success = true;
+
+ echo $this->buildSQPCssData();
+
+ if ($GLOBALS['text_dir'] === 'ltr') {
+ $right = 'right';
+ $left = 'left';
+ } else {
+ $right = 'left';
+ $left = 'right';
+ }
+
+ foreach ($this->_cssFiles as $file) {
+ $path = $this->getPath() . "/css/$file.css.php";
+ $fallback = "./themes/"
+ . PMA_Theme_Manager::FALLBACK_THEME . "/css/$file.css.php";
+
+ if (is_readable($path)) {
+ echo "\n/* FILE: $file.css.php */\n";
+ include $path;
+ } else if (is_readable($fallback)) {
+ echo "\n/* FILE: $file.css.php */\n";
+ include $fallback;
+ } else {
+ $success = false;
+ }
+ }
+
+ include './themes/sprites.css.php';
+
+ return $success;
+ }
+
+ /**
+ * Renders the preview for this theme
+ *
+ * @return string
+ * @access public
+ */
+ public function getPrintPreview()
+ {
+ $url_params = array('set_theme' => $this->getId());
+ $url = 'index.php'. PMA_generate_common_url($url_params);
+
+ $retval = '<div class="theme_preview">';
+ $retval .= '<h2>';
+ $retval .= htmlspecialchars($this->getName());
+ $retval .= ' (' . htmlspecialchars($this->getVersion()) . ') ';
+ $retval .= '</h2>';
+ $retval .= '<p>';
+ $retval .= '<a class="take_theme" ';
+ $retval .= 'name="' . htmlspecialchars($this->getId()) . '" ';
+ $retval .= 'href="' . $url . '">';
+ if (@file_exists($this->getPath() . '/screen.png')) {
+ // if screen exists then output
+ $retval .= '<img src="' . $this->getPath() . '/screen.png" border="1"';
+ $retval .= ' alt="' . htmlspecialchars($this->getName()) . '"';
+ $retval .= ' title="' . htmlspecialchars($this->getName()) . '" />';
+ $retval .= '<br />';
+ } else {
+ $retval .= __('No preview available.');
+ }
+ $retval .= '[ <strong>' . __('take it') . '</strong> ]';
+ $retval .= '</a>';
+ $retval .= '</p>';
+ $retval .= '</div>';
+ return $retval;
+ }
+
+ /**
+ * Remove filter for IE.
+ *
+ * @return string CSS code.
+ */
+ function getCssIEClearFilter()
+ {
+ return PMA_USR_BROWSER_AGENT == 'IE'
+ && PMA_USR_BROWSER_VER >= 6
+ && PMA_USR_BROWSER_VER <= 8
+ ? 'filter: none'
+ : '';
+ }
+
+ /**
+ * Gets currently configured font size.
+ *
+ * @return String with font size.
+ */
+ function getFontSize()
+ {
+ $fs = $GLOBALS['PMA_Config']->get('fontsize');
+ if (!is_null($fs)) {
+ return $fs;
+ }
+ if (isset($_COOKIE['pma_fontsize'])) {
+ return $_COOKIE['pma_fontsize'];
+ }
+ return '82%';
+ }
+
+ /**
+ * Generates code for CSS gradient using various browser extensions.
+ *
+ * @param string $start_color Color of gradient start, hex value without #
+ * @param string $end_color Color of gradient end, hex value without #
+ *
+ * @return string CSS code.
+ */
+ function getCssGradient($start_color, $end_color)
+ {
+ $result = array();
+ // Opera 9.5+, IE 9
+ $result[] = 'background-image: url(./themes/svg_gradient.php?from='
+ . $start_color . '&to=' . $end_color . ');';
+ $result[] = 'background-size: 100% 100%;';
+ // Safari 4-5, Chrome 1-9
+ $result[] = 'background: '
+ . '-webkit-gradient(linear, left top, left bottom, from(#'
+ . $start_color . '), to(#' . $end_color . '));';
+ // Safari 5.1, Chrome 10+
+ $result[] = 'background: -webkit-linear-gradient(top, #'
+ . $start_color . ', #' . $end_color . ');';
+ // Firefox 3.6+
+ $result[] = 'background: -moz-linear-gradient(top, #'
+ . $start_color . ', #' . $end_color . ');';
+ // IE 10
+ $result[] = 'background: -ms-linear-gradient(top, #'
+ . $start_color . ', #' . $end_color . ');';
+ // Opera 11.10
+ $result[] = 'background: -o-linear-gradient(top, #'
+ . $start_color . ', #' . $end_color . ');';
+ // IE 6-8
+ if (PMA_USR_BROWSER_AGENT == 'IE'
+ && PMA_USR_BROWSER_VER >= 6
+ && PMA_USR_BROWSER_VER <= 8
+ ) {
+ $result[] = 'filter: '
+ . 'progid:DXImageTransform.Microsoft.gradient(startColorstr="#'
+ . $start_color . '", endColorstr="#' . $end_color . '");';
+ }
+ return implode("\n", $result);
+ }
+
+ /**
+ * Returns CSS styles for CodeMirror editor based on query formatter colors.
+ *
+ * @return string CSS code.
+ */
+ function getCssCodeMirror()
+ {
+ if (! $GLOBALS['cfg']['CodemirrorEnable']) {
+ return '';
+ }
+
+ $result[] = 'span.cm-keyword, span.cm-statement-verb {';
+ $result[] = ' color: '
+ . $GLOBALS['cfg']['SQP']['fmtColor']['alpha_reservedWord'] . ';';
+ $result[] = '}';
+ $result[] = 'span.cm-variable {';
+ $result[] = ' color: '
+ . $GLOBALS['cfg']['SQP']['fmtColor']['alpha_identifier'] . ';';
+ $result[] = '}';
+ $result[] = 'span.cm-comment {';
+ $result[] = ' color: '
+ . $GLOBALS['cfg']['SQP']['fmtColor']['comment'] . ';';
+ $result[] = '}';
+ $result[] = 'span.cm-mysql-string {';
+ $result[] = ' color: '
+ . $GLOBALS['cfg']['SQP']['fmtColor']['quote'] . ';';
+ $result[] = '}';
+ $result[] = 'span.cm-operator {';
+ $result[] = ' color: '
+ . $GLOBALS['cfg']['SQP']['fmtColor']['punct'] . ';';
+ $result[] = '}';
+ $result[] = 'span.cm-mysql-word {';
+ $result[] = ' color: '
+ . $GLOBALS['cfg']['SQP']['fmtColor']['alpha_identifier'] . ';';
+ $result[] = '}';
+ $result[] = 'span.cm-builtin {';
+ $result[] = ' color: '
+ . $GLOBALS['cfg']['SQP']['fmtColor']['alpha_functionName'] . ';';
+ $result[] = '}';
+ $result[] = 'span.cm-variable-2 {';
+ $result[] = ' color: '
+ . $GLOBALS['cfg']['SQP']['fmtColor']['alpha_columnType'] . ';';
+ $result[] = '}';
+ $result[] = 'span.cm-variable-3 {';
+ $result[] = ' color: '
+ . $GLOBALS['cfg']['SQP']['fmtColor']['alpha_columnAttrib'] . ';';
+ $result[] = '}';
+ $result[] = 'span.cm-separator {';
+ $result[] = ' color: '
+ . $GLOBALS['cfg']['SQP']['fmtColor']['punct'] . ';';
+ $result[] = '}';
+ $result[] = 'span.cm-number {';
+ $result[] = ' color: '
+ . $GLOBALS['cfg']['SQP']['fmtColor']['digit_integer'] . ';';
+ $result[] = '}';
+
+ return implode("\n", $result);
+ }
+}
+?>