summaryrefslogblamecommitdiffstats
path: root/paste/include/geshi/classes/class.geshistyler.php
blob: fa56478c5bcf91e7d74cc11a0ec280a06df21059 (plain) (tree)































































































































































































































                                                                                                         
<?php
/**
 * GeSHi - Generic Syntax Highlighter
 * 
 * For information on how to use GeSHi, please consult the documentation
 * found in the docs/ directory, or online at http://geshi.org/docs/
 * 
 *  This file is part of GeSHi.
 *
 *  GeSHi is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  GeSHi is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with GeSHi; if not, write to the Free Software
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 * You can view a copy of the GNU GPL in the COPYING file that comes
 * with GeSHi, in the docs/ directory.
 *
 * @package   core
 * @author    Nigel McNie <nigel@geshi.org>
 * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL
 * @copyright (C) 2005 Nigel McNie
 * @version   1.1.0
 * 
 */

/**
 * The GeSHiStyler class
 * 
 * @package core
 * @author  Nigel McNie <nigel@geshi.org>
 * @since   1.1.0
 * @version   1.1.0
 */
class GeSHiStyler
{
    /**
     * @var string
     */
    var $charset;

    /**
     * @var string
     */    
    var $fileExtension;
    
    /**
     * @var array
     */
    var $_styleData = array();
    
    /**
     * @var array
     */
    var $_parseData;
           
    /**
     * @var int
     */
    var $_parseDataPointer = 0;
    
    /**
     * @var array
     */
    var $_contextCacheData = array();
        
    function setStyle ($context_name, $style, $start_name = 'start', $end_name = 'end')
    {
        // @todo [blocking 1.1.1] Why is this called sometimes with blank data?
        geshi_dbg('GeSHiStyler::setStyle(' . $context_name . ', ' . $style . ')', GESHI_DBG_PARSE);
        $this->_styleData[$context_name] = $style;
        /*if (!isset($this->_styleData["$context_name/$start_name"])) {
           $this->_styleData["$context_name/$start_name"] = $style;
        }
        if (!isset($this->_styleData["$context_name/$end_name"])) {
           $this->_styleData["$context_name/$end_name"] = $style;
        }*/
    }
    
    /*function setStartStyle ($context_name, $style)
    {
        $this->_styleData["$context_name/$this->_startName"] = $style;
    }
    
    function setStartName ($name)
    {
        $this->_startName = $name;
    }*/
    
    function removeStyleData ($context_name, $context_start_name = 'start', $context_end_name = 'end')
    {
        unset($this->_styleData[$context_name]);
        unset($this->_styleData["$context_name/$context_start_name"]);
        unset($this->_styleData["$context_name/$context_end_name"]);
        geshi_dbg('  removed style data for ' . $context_name, GESHI_DBG_PARSE);
    }
    
    /*function setEndStyle ($context_name, $style)
    {
        $this->_styleData["$context_name/$this->_endName"] = $style;
    }
    
    function setEndName ($name)
    {
        $this->_endName = $name;
    }*/
    
    function getStyle ($context_name)
    {
        if (isset($this->_styleData[$context_name])) {
            return $this->_styleData[$context_name];
        }
        // If style for starter/ender requested and we got here, use the default
        if ('/end' == substr($context_name, -4)) {
            $this->_styleData[$context_name] = $this->_styleData[substr($context_name, 0, -4)];
            return $this->_styleData[$context_name]; 
        }
        if ('/start' == substr($context_name, -6)) {
            $this->_styleData[$context_name] = $this->_styleData[substr($context_name, 0, -6)];
            return $this->_styleData[$context_name]; 
        }
         
        //@todo [blocking 1.1.5] Make the default style for otherwise unstyled elements configurable
        $this->_styleData[$context_name] = 'color:#000;';
        return 'color:#000;';
    }
    /*
    function getStyleStart ($context_name)
    {
        if (isset($this->_styleData["$context_name/$this->_startName"])) {
            return $this->_styleData["$context_name/$this->_startName"];
        }
        $this->_styleData["$context_name/$this->_startName"] = $this->getStyle($context_name);
        return $this->_styleData["$context_name/$this->_startName"];
    }
    
    function getStyleEnd ($context_name) 
    {
        if (isset($this->_styleData["$context_name/$this->_endName"])) {
            return $this->_styleData["$context_name/$this->_endName"];
        }
        $this->_styleData["$context_name/$this->_endName"] = $this->getStyle($context_name);
        return $this->_styleData["$context_name/$this->_endName"];
    }*/
    /*
    function startIsUnique ($context_name)
    {
        return (isset($this->_styleData["$context_name/$this->_startName"])
            && '' != $this->_styleData["$context_name/$this->_startName"]
            && $this->_styleData["$context_name/$this->_startName"] != $this->_styleData[$context_name]);
    } 

    function endIsUnique ($context_name)
    {
        $r = (isset($this->_styleData["$context_name/$this->_endName"])
            && '' != $this->_styleData["$context_name/$this->_endName"]
            && $this->_styleData["$context_name/$this->_endName"] != $this->_styleData[$context_name]);
        geshi_dbg('GeSHiStyler::endIsUnique(' . $context_name . ') = ' . $r, GESHI_DBG_PARSE);
        return $r;
    } 
    */
    function resetParseData ()
    {
        $this->_parseData        = null;
        $this->_parseDataPointer = 0;
    }

    /**
     * This method adds parse data. It tries to merge it also if two
     * consecutive contexts with the same name add parse data (which is
     * very possible).
     */    
    function addParseData ($code, $context_name, $url = '')
    {
        if ($context_name == $this->_parseData[$this->_parseDataPointer][1]) {
            // same context, same URL
            $this->_parseData[$this->_parseDataPointer][0] .= $code;
        } else {
            $this->_parseData[++$this->_parseDataPointer] = array($code, $context_name, $url);
        }
    }
    
    function addParseDataStart ($code, $context_name, $start_name = 'start')
    {
    	$this->addParseData($code, "$context_name/$start_name");
    }
    
    function addParseDataEnd ($code, $context_name, $end_name = 'end')
    {
    	$this->addParseData($code, "$context_name/$end_name");
    }
    
    function getParseData ()
    {
        return $this->_parseData;
    }
    
    /**
     * Sets cache data
     */
    function setCacheData ($cached_file_name, $cache_str)
    {
        $this->_contextCacheData[$cached_file_name] = $cache_str;
    }
    
    /**
     * Gets cache data
     */
    function getCacheData ($cached_file_name)
    {
        return isset($this->_contextCacheData[$cached_file_name]) ?
            $this->_contextCacheData[$cached_file_name] : null;
    }
}

?>