📄 style.cls.php
字号:
<?php/** * DOMPDF - PHP5 HTML to PDF renderer * * File: $RCSfile: style.cls.php,v $ * Created on: 2004-06-01 * * Copyright (c) 2004 - Benj Carson <benjcarson@digitaljunkies.ca> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library in the file LICENSE.LGPL; if not, write to the * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307 USA * * Alternatively, you may distribute this software under the terms of the * PHP License, version 3.0 or later. A copy of this license should have * been distributed with this file in the file LICENSE.PHP . If this is not * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. * * The latest version of DOMPDF might be available at: * http://www.digitaljunkies.ca/dompdf * * @link http://www.digitaljunkies.ca/dompdf * @copyright 2004 Benj Carson * @author Benj Carson <benjcarson@digitaljunkies.ca> * @package dompdf * @version 0.5.1 *//* $Id: style.cls.php,v 1.2 2006/07/21 10:46:20 mschering Exp $ *//** * Represents CSS properties. * * The Style class is responsible for handling and storing CSS properties. * It includes methods to resolve colours and lengths, as well as getters & * setters for many CSS properites. * * Actual CSS parsing is performed in the {@link Stylesheet} class. * * @package dompdf */class Style { /** * Default font size, in points. * * @var float */ static $default_font_size = 12; /** * Default line height, as a fraction of the font size. * * @var float */ static $default_line_height = 1.2; /** * List of all inline types. Should really be a constant. * * @var array */ static $INLINE_TYPES = array("inline"); /** * List of all block types. Should really be a constant. * * @var array */ static $BLOCK_TYPES = array("block","inline-block", "table-cell", "list-item"); /** * List of all table types. Should really be a constant. * * @var array; */ static $TABLE_TYPES = array("table", "inline-table"); /** * List of valid border styles. Should also really be a constant. * * @var array */ static $BORDER_STYLES = array("none", "hidden", "dotted", "dashed", "solid", "double", "groove", "ridge", "inset", "outset"); /** * Default style values. * * @link http://www.w3.org/TR/CSS21/propidx.html * * @var array */ static protected $_defaults = null; /** * List of inherited properties * * @link http://www.w3.org/TR/CSS21/propidx.html * * @var array */ static protected $_inherited = null; /** * The stylesheet this style belongs to * * @see Stylesheet * @var Stylesheet */ protected $_stylesheet; // stylesheet this style is attached to /** * Main array of all CSS properties & values * * @var array */ protected $_props; /** * Cached property values * * @var array */ protected $_prop_cache; /** * Font size of parent element in document tree. Used for relative font * size resolution. * * @var float */ protected $_parent_font_size; // Font size of parent element // private members /** * True once the font size is resolved absolutely * * @var bool */ private $__font_size_calculated; // Cache flag /** * Class constructor * * @param Stylesheet $stylesheet the stylesheet this Style is associated with. */ function __construct(Stylesheet $stylesheet) { $this->_props = array(); $this->_stylesheet = $stylesheet; $this->_parent_font_size = null; $this->__font_size_calculated = false; if ( !isset(self::$_defaults) ) { // Shorthand $d =& self::$_defaults; // All CSS 2.1 properties, and their default values $d["azimuth"] = "center"; $d["background_attachment"] = "scroll"; $d["background_color"] = "transparent"; $d["background_image"] = "none"; $d["background_position"] = "0% 0%"; $d["background_repeat"] = "repeat"; $d["background"] = ""; $d["border_collapse"] = "separate"; $d["border_color"] = ""; $d["border_spacing"] = "0"; $d["border_style"] = ""; $d["border_top"] = ""; $d["border_right"] = ""; $d["border_bottom"] = ""; $d["border_left"] = ""; $d["border_top_color"] = ""; $d["border_right_color"] = ""; $d["border_bottom_color"] = ""; $d["border_left_color"] = ""; $d["border_top_style"] = "none"; $d["border_right_style"] = "none"; $d["border_bottom_style"] = "none"; $d["border_left_style"] = "none"; $d["border_top_width"] = "medium"; $d["border_right_width"] = "medium"; $d["border_bottom_width"] = "medium"; $d["border_left_width"] = "medium"; $d["border_width"] = "medium"; $d["border"] = ""; $d["bottom"] = "auto"; $d["caption_side"] = "top"; $d["clear"] = "none"; $d["clip"] = "auto"; $d["color"] = "#000000"; $d["content"] = "normal"; $d["counter_increment"] = "none"; $d["counter_reset"] = "none"; $d["cue_after"] = "none"; $d["cue_before"] = "none"; $d["cue"] = ""; $d["cursor"] = "auto"; $d["direction"] = "ltr"; $d["display"] = "inline"; $d["elevation"] = "level"; $d["empty_cells"] = "show"; $d["float"] = "none"; $d["font_family"] = "serif"; $d["font_size"] = "medium"; $d["font_style"] = "normal"; $d["font_variant"] = "normal"; $d["font_weight"] = "normal"; $d["font"] = ""; $d["height"] = "auto"; $d["left"] = "auto"; $d["letter_spacing"] = "normal"; $d["line_height"] = "normal"; $d["list_style_image"] = "none"; $d["list_style_position"] = "outside"; $d["list_style_type"] = "disc"; $d["list_style"] = ""; $d["margin_right"] = "0"; $d["margin_left"] = "0"; $d["margin_top"] = "0"; $d["margin_bottom"] = "0"; $d["margin"] = ""; $d["max_height"] = "none"; $d["max_width"] = "none"; $d["min_height"] = "0"; $d["min_width"] = "0"; $d["orphans"] = "2"; $d["outline_color"] = "invert"; $d["outline_style"] = "none"; $d["outline_width"] = "medium"; $d["outline"] = ""; $d["overflow"] = "visible"; $d["padding_top"] = "0"; $d["padding_right"] = "0"; $d["padding_bottom"] = "0"; $d["padding_left"] = "0"; $d["padding"] = ""; $d["page_break_after"] = "auto"; $d["page_break_before"] = "auto"; $d["page_break_inside"] = "auto"; $d["pause_after"] = "0"; $d["pause_before"] = "0"; $d["pause"] = ""; $d["pitch_range"] = "50"; $d["pitch"] = "medium"; $d["play_during"] = "auto"; $d["position"] = "static"; $d["quotes"] = ""; $d["richness"] = "50"; $d["right"] = "auto"; $d["speak_header"] = "once"; $d["speak_numeral"] = "continuous"; $d["speak_punctuation"] = "none"; $d["speak"] = "normal"; $d["speech_rate"] = "medium"; $d["stress"] = "50"; $d["table_layout"] = "auto"; $d["text_align"] = "left"; $d["text_decoration"] = "none"; $d["text_indent"] = "0"; $d["text_transform"] = "none"; $d["top"] = "auto"; $d["unicode_bidi"] = "normal"; $d["vertical_align"] = "baseline"; $d["visibility"] = "visible"; $d["voice_family"] = ""; $d["volume"] = "medium"; $d["white_space"] = "normal"; $d["widows"] = "2"; $d["width"] = "auto"; $d["word_spacing"] = "normal"; $d["z_index"] = "auto"; // Properties that inherit by default self::$_inherited = array("azimuth", "border_collapse", "border_spacing", "caption_side", "color", "cursor", "direction", "elevation", "empty_cells", "font_family", "font_size", "font_style", "font_variant", "font_weight", "font", "letter_spacing", "line_height", "list_style_image", "list_style_position", "list_style_type", "list_style", "orphans", "page_break_inside", "pitch_range", "pitch", "quotes", "richness", "speak_header", "speak_numeral", "speak_punctuation", "speak", "speech_rate", "stress", "text_align", "text_indent", "text_transform", "visibility", "voice_family", "volume", "white_space", "widows", "word_spacing"); } } /** * "Destructor": forcibly free all references held by this object */ function dispose() { unset($this->_stylesheet); } /** * returns the {@link Stylesheet} this Style is associated with. * * @return Stylesheet */ function get_stylesheet() { return $this->_stylesheet; } /** * Converts any CSS length value into an absolute length in points. * * length_in_pt() takes a single length (e.g. '1em') or an array of * lengths and returns an absolute length. If an array is passed, then * the return value is the sum of all elements. * * If a reference size is not provided, the default font size is used * ({@link Style::$default_font_size}). * * @param float|array $length the length or array of lengths to resolve * @param float $ref_size an absolute reference size to resolve percentage lengths * @return float */ function length_in_pt($length, $ref_size = null) { if ( !is_array($length) ) $length = array($length); if ( !isset($ref_size) ) $ref_size = self::$default_font_size; $ret = 0; foreach ($length as $l) { if ( $l === "auto" ) return "auto"; if ( $l === "none" ) return "none"; // Assume numeric values are already in points if ( is_numeric($l) ) { $ret += $l; continue; } if ( $l === "normal" ) { $ret += $ref_size; continue; } // Border lengths if ( $l === "thin" ) { $ret += 0.5; continue; } if ( $l === "medium" ) { $ret += 1.5; continue; } if ( $l === "thick" ) { $ret += 2.5; continue; } if ( ($i = mb_strpos($l, "pt")) !== false ) { $ret += mb_substr($l, 0, $i); continue; } if ( ($i = mb_strpos($l, "px")) !== false ) { $ret += mb_substr($l, 0, $i); continue; } if ( ($i = mb_strpos($l, "em")) !== false ) { $ret += mb_substr($l, 0, $i) * $this->__get("font_size"); continue; } // FIXME: em:ex ratio? if ( ($i = mb_strpos($l, "ex")) !== false ) { $ret += mb_substr($l, 0, $i) * $this->__get("font_size"); continue; } if ( ($i = mb_strpos($l, "%")) !== false ) { $ret += mb_substr($l, 0, $i)/100 * $ref_size; continue; } if ( ($i = mb_strpos($l, "in")) !== false ) { $ret += mb_substr($l, 0, $i) * 72; continue; } if ( ($i = mb_strpos($l, "cm")) !== false ) { $ret += mb_substr($l, 0, $i) * 72 / 2.54; continue; } if ( ($i = mb_strpos($l, "mm")) !== false ) { $ret += mb_substr($l, 0, $i) * 72 / 25.4; continue; } if ( ($i = mb_strpos($l, "pc")) !== false ) { $ret += mb_substr($l, 0, $i) / 12; continue; } // Bogus value $ret += $ref_size; } return $ret; } /** * Set inherited properties in this style using values in $parent * * @param Style $parent */ function inherit(Style $parent) { // Set parent font size $this->_parent_font_size = $parent->get_font_size(); foreach (self::$_inherited as $prop) { if ( !isset($this->_props[$prop]) && isset($parent->_props[$prop]) ) $this->_props[$prop] = $parent->_props[$prop]; } foreach (array_keys($this->_props) as $prop) { if ( $this->_props[$prop] == "inherit" ) $this->$prop = $parent->$prop; } return $this; } /** * Override properties in this style with those in $style * * @param Style $style */ function merge(Style $style) { $this->_props = array_merge($this->_props, $style->_props); if ( isset($style->_props["font_size"]) ) $this->__font_size_calculated = false; } /** * Returns an array(r, g, b, "r"=> r, "g"=>g, "b"=>b, "hex"=>"#rrggbb") * based on the provided CSS colour value. * * @param string $colour * @return array */ function munge_colour($colour) { if ( is_array($colour) ) // Assume the array has the right format... // FIXME: should/could verify this. return $colour; $r = 0; $g = 0; $b = 0; // Handle colour names switch ($colour) { case "maroon": $r = 0x80; break; case "red": $r = 0xff; break; case "orange": $r = 0xff; $g = 0xa5; break; case "yellow": $r = 0xff; $g = 0xff; break; case "olive": $r = 0x80; $g = 0x80; break; case "purple": $r = 0x80;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -