====== Dokuwiki Color Plugin ====== ---- plugin ---- description: Opportunity to write colored text in DokuWiki. author : Christopher Smith email : chris@jalakai.co.uk type : Syntax lastupdate : 2008-02-06 compatible : 2009-12-25, 2010-11-07, 2011-05-25, 2012-01-25, 2014-05-05, 2014-09-29d, Adora Belle, Weatherwax, Binky, Ponder Stibbons, Detritus depends : conflicts : similar : fontcolor tags : typography, highlight downloadurl: https://github.com/leeyc0/dokuwiki_plugin_color/zipball/master sourcerepo : https://github.com/leeyc0/dokuwiki_plugin_color/ ---- ===== Installation ===== Please use the plugin manager to install the plugin, no configuration needed. ===== Usage ===== Place this code sample in your playground: text text This plugin supports the [[https://en.wikipedia.org/wiki/X11_color_names#Color_name_chart| X11 color names ]] ===== Discussion ===== This source for this plugin is shown in the [[devel:Syntax Plugins#sample_plugin_2_-_color|Sample Plugin Tutorial]]. ===== Update History ===== * 2008-02-06 --- Fixed a security vulnerability in the colour pattern. Any users of this plugin should apply this update. --- //[[chris@jalakai.co.uk|Christopher Smith]] 2008-02-06 17:20// ===== Version with ODT renderer support ===== This modified version is no more suitable for a simple tutorial example. But I needed the ODT renderer support ;-) --- //[[birke@d-scribe.de|Gabriel Birke]] 2008/05/09 11:46// > Ooops. The version picked up to add ODT support was from before the 2008-02-06 version (which fixed a Cross Site Scripting vulnerability). So the ODT version was again vulnerable. Now fixed again. --- //[[dokuwiki@andywebber.com|Andy Webber]] 2009/06/24 16:16// Hello, I put this plugin on our wiki. That work well in the wiki but not at the time of export in odt. At which place must be located the colornames.php ? Do I use the last version of the plugin odt, have a solution? //cedric 2010/01/11 // > Hey, Cedric. ''colornames.php'' should go in the same directory as ''syntax.php'' if I am reading the source all right. --- [[user>ryan.chappelle|Luis Machuca Bezzaza]] //2011/06/13 10:06// */ // must be run within DokuWiki if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../../').'/'); if(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/'); require_once(DOKU_PLUGIN.'syntax.php'); /** * All DokuWiki plugins to extend the parser/rendering mechanism * need to inherit from this class */ class syntax_plugin_color extends DokuWiki_Syntax_Plugin { var $odt_styles = array(); /** * return some info */ function getInfo(){ return array( 'author' => 'Christopher Smith', 'email' => 'chris@jalakai.co.uk', 'date' => '2009-06-24', 'name' => 'Color Plugin with ODT', 'desc' => 'Changes text colour and background', 'url' => 'http://www.dokuwiki.org/plugin:color', ); } function getType(){ return 'formatting'; } function getAllowedTypes() { return array('formatting', 'substition', 'disabled'); } function getSort(){ return 158; } function connectTo($mode) { $this->Lexer->addEntryPattern('(?=.*?)',$mode,'plugin_color'); } function postConnect() { $this->Lexer->addExitPattern('','plugin_color'); } /** * Handle the match */ function handle($match, $state, $pos, &$handler){ switch ($state) { case DOKU_LEXER_ENTER : list($color, $background) = preg_split("/\//u", substr($match, 6, -1), 2); $color = $this->_isValid($color); $background = $this->_isValid($background); return array($state, array($color, $background)); case DOKU_LEXER_UNMATCHED : return array($state, $match); case DOKU_LEXER_EXIT : return array($state, ''); } return array(); } /** * Create output */ function render($mode, &$renderer, $data) { if($mode == 'xhtml'){ list($state, $match) = $data; switch ($state) { case DOKU_LEXER_ENTER : list($color, $background) = $match; $color = $color?"color:$color;":""; $background = $background?"background-color:$background;":""; $renderer->doc .= ""; break; case DOKU_LEXER_UNMATCHED : $renderer->doc .= $renderer->_xmlEntities($match); break; case DOKU_LEXER_EXIT : $renderer->doc .= ""; break; } return true; } if($mode == 'odt'){ list($state, $match) = $data; switch ($state) { case DOKU_LEXER_ENTER : list($color, $background) = $match; $style_index = $color.'/'.$background; if(empty($this->odt_styles[$style_index])) { $stylename = "ColorizedText".count($this->odt_styles); $this->odt_styles[$style_index] = $stylename; $color = $color?'fo:color="'.$this->_color2hex($color).'" ':''; $background = $background?'fo:background="'.$this->_color2hex($background).'" ':''; $renderer->autostyles[$stylename] = ' '; } $renderer->doc .= ''; break; case DOKU_LEXER_UNMATCHED : $renderer->doc .= $renderer->_xmlEntities($match); break; case DOKU_LEXER_EXIT : $renderer->doc .= ""; break; } return true; } return false; } // validate color value $c // this is cut price validation - only to ensure the basic format is correct and there is nothing harmful // three basic formats "colorname", "#fff[fff]", "rgb(255[%],255[%],255[%])" function _isValid($c) { $c = trim($c); $pattern = "/^\s*( ([a-zA-Z]+)| #colorname - not verified (\#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}))| #colorvalue (rgb\(([0-9]{1,3}%?,){2}[0-9]{1,3}%?\)) #rgb triplet )\s*$/x"; if (preg_match($pattern, $c)) return $c; return ""; } /** * Translate color names and RGB to hex values */ function _color2hex($name) { static $colornames = null; if(is_null($colornames)) { include dirname(__FILE__).'/colornames.php'; } if(!preg_match('/^(#|rgb)/', $name) && array_key_exists($name, $colornames)) return $colornames[$name]; elseif(preg_match('/rgb\(([0-9]{1,3}%?),([0-9]{1,3}%?),([0-9]{1,3}%?)\)/', $name, $matches)) { $colors = array(); for($i=1;$i<4;$i++) { $percent = substr($matches[$i], -1, 1) == '%'; $colors[$i] = $percent?(substr($matches[$i],0,-1)/100)*256:$matches[$i]; } return sprintf('#%02X%02X%02X', $colors[1], $colors[2], $colors[3]); } else return $name; } } //Setup VIM: ex: et ts=4 enc=utf-8 : '#000000', 'navy' => '#000080', 'blue' => '#0000FF', 'green' => '#008000', 'teal' => '#008080', 'lime' => '#00FF00', 'aqua' => '#00FFFF', 'maroon' => '#800000', 'purple' => '#800080', 'olive' => '#808000', 'gray' => '#808080', 'silver' => '#C0C0C0', 'red' => '#FF0000', 'fuchsia' => '#FF00FF', 'yellow' => '#FFFF00', 'white' => '#FFFFFF', 'orange' => '#FFA500', // From CSS 2.1 spec //additional X11 colors, works nicely from Rincewind on. 'aliceblue' => '#F0F8FF', 'antiquewhite' => '#FAEBD7', 'aqua' => '#00FFFF', 'aquamarine' => '#7FFFD4', 'azure' => '#F0FFFF', 'beige' => '#F5F5DC', 'bisque' => '#FFE4C4', 'black' => '#000000', 'blanchedalmond' => '#FFEBCD', 'blue' => '#0000FF', 'blueviolet' => '#8A2BE2', 'brown' => '#A52A2A', 'burlywood' => '#DEB887', 'cadetblue' => '#5F9EA0', 'chartreuse' => '#7FFF00', 'chocolate' => '#D2691E', 'coral' => '#FF7F50', 'cornflower' => '#6495ED', 'cornsilk' => '#FFF8DC', 'crimson' => '#DC143C', 'cyan' => '#00FFFF', 'darkblue' => '#00008B', 'darkcyan' => '#008B8B', 'darkgoldenrod' => '#B8860B', 'darkgray' => '#A9A9A9', 'darkgreen' => '#006400', 'darkkhaki' => '#BDB76B', 'darkmagenta' => '#8B008B', 'darkolivegreen' => '#556B2F', 'darkorange' => '#FF8C00', 'darkorchid' => '#9932CC', 'darkred' => '#8B0000', 'darksalmon' => '#E9967A', 'darkseagreen' => '#8FBC8F', 'darkslateblue' => '#483D8B', 'darkslategray' => '#2F4F4F', 'darkturquoise' => '#00CED1', 'darkviolet' => '#9400D3', 'deeppink' => '#FF1493', 'deepskyblue' => '#00BFFF', 'dimgray' => '#696969', 'dodgerblue' => '#1E90FF', 'firebrick' => '#B22222', 'floralwhite' => '#FFFAF0', 'forestgreen' => '#228B22', 'fuchsia' => '#FF00FF', 'gainsboro' => '#DCDCDC', 'ghostwhite' => '#F8F8FF', 'gold' => '#FFD700', 'goldenrod' => '#DAA520', 'grayx11' => '#BEBEBE', 'gray' => '#808080', 'greenx11' => '#00FF00', 'green' => '#008000', 'greenyellow' => '#ADFF2F', 'honeydew' => '#F0FFF0', 'hotpink' => '#FF69B4', 'indianred' => '#CD5C5C', 'indigo' => '#4B0082', 'ivory' => '#FFFFF0', 'khaki' => '#F0E68C', 'lavender' => '#E6E6FA', 'lavenderblush' => '#FFF0F5', 'lawngreen' => '#7CFC00', 'lemonchiffon' => '#FFFACD', 'lightblue' => '#ADD8E6', 'lightcoral' => '#F08080', 'lightcyan' => '#E0FFFF', 'lightgoldenrod' => '#FAFAD2', 'lightgray' => '#D3D3D3', 'lightgreen' => '#90EE90', 'lightpink' => '#FFB6C1', 'lightsalmon' => '#FFA07A', 'lightseagreen' => '#20B2AA', 'lightskyblue' => '#87CEFA', 'lightslategray' => '#778899', 'lightsteelblue' => '#B0C4DE', 'lightyellow' => '#FFFFE0', 'lime' => '#00FF00', 'limegreen' => '#32CD32', 'linen' => '#FAF0E6', 'magenta' => '#FF00FF', 'maroonx11' => '#B03060', 'maroon' => '#7F0000', 'mediumaquamarine' => '#66CDAA', 'mediumblue' => '#0000CD', 'mediumorchid' => '#BA55D3', 'mediumpurple' => '#9370DB', 'mediumseagreen' => '#3CB371', 'mediumslateblue' => '#7B68EE', 'mediumspringgreen' => '#00FA9A', 'mediumturquoise' => '#48D1CC', 'mediumvioletred' => '#C71585', 'midnightblue' => '#191970', 'mintcream' => '#F5FFFA', 'mistyrose' => '#FFE4E1', 'moccasin' => '#FFE4B5', 'navajowhite' => '#FFDEAD', 'navy' => '#000080', 'oldlace' => '#FDF5E6', 'olive' => '#808000', 'olivedrab' => '#6B8E23', 'orange' => '#FFA500', 'orangered' => '#FF4500', 'orchid' => '#DA70D6', 'palegoldenrod' => '#EEE8AA', 'palegreen' => '#98FB98', 'paleturquoise' => '#AFEEEE', 'palevioletred' => '#DB7093', 'papayawhip' => '#FFEFD5', 'peachpuff' => '#FFDAB9', 'peru' => '#CD853F', 'pink' => '#FFC0CB', 'plum' => '#DDA0DD', 'powderblue' => '#B0E0E6', 'purplex11' => '#A020F0', 'purple' => '#7F007F', 'red' => '#FF0000', 'rosybrown' => '#BC8F8F', 'royalblue' => '#4169E1', 'saddlebrown' => '#8B4513', 'salmon' => '#FA8072', 'sandybrown' => '#F4A460', 'seagreen' => '#2E8B57', 'seashell' => '#FFF5EE', 'sienna' => '#A0522D', 'silver' => '#C0C0C0', 'skyblue' => '#87CEEB', 'slateblue' => '#6A5ACD', 'slategray' => '#708090', 'snow' => '#FFFAFA', 'springgreen' => '#00FF7F', 'steelblue' => '#4682B4', 'tan' => '#D2B48C', 'teal' => '#008080', 'thistle' => '#D8BFD8', 'tomato' => '#FF6347', 'turquoise' => '#40E0D0', 'violet' => '#EE82EE', 'wheat' => '#F5DEB3', 'white' => '#FFFFFF', 'whitesmoke' => '#F5F5F5', 'yellow' => '#FFFF00', 'yellowgreen' => '#9ACD32' //from https://en.wikipedia.org/wiki/X11_color_names ); ===== No header support ===== Hi there, i realized that coloring of headers is not possible. The //=// delimiters turn to plain text when wrapped with the color tag. It would be great to have that feature, if possible.\\ Thanks for this otherwise awesome plugin! //rapho 2012/08/03// I agree that would be very helpful //newbie 2013/04/30// This would be really nice //CyrilM 2013/07/12// I like colourful headers as well. // HH 2014/07/29// Mee Too //CW in Miami 2015/6/30// This plugin also supports background color, which is defined with '' Blue text on yellow background''. //AndyF 2016/04/05//