1 <?php 2 3 /** 4 * Transforms FONT tags to the proper form (SPAN with CSS styling) 5 * 6 * This transformation takes the three proprietary attributes of FONT and 7 * transforms them into their corresponding CSS attributes. These are color, 8 * face, and size. 9 * 10 * @note Size is an interesting case because it doesn't map cleanly to CSS. 11 * Thanks to 12 * http://style.cleverchimp.com/font_size_intervals/altintervals.html 13 * for reasonable mappings. 14 * @warning This doesn't work completely correctly; specifically, this 15 * TagTransform operates before well-formedness is enforced, so 16 * the "active formatting elements" algorithm doesn't get applied. 17 */ 18 class HTMLPurifier_TagTransform_Font extends HTMLPurifier_TagTransform 19 { 20 /** 21 * @type string 22 */ 23 public $transform_to = 'span'; 24 25 /** 26 * @type array 27 */ 28 protected $_size_lookup = array( 29 '0' => 'xx-small', 30 '1' => 'xx-small', 31 '2' => 'small', 32 '3' => 'medium', 33 '4' => 'large', 34 '5' => 'x-large', 35 '6' => 'xx-large', 36 '7' => '300%', 37 '-1' => 'smaller', 38 '-2' => '60%', 39 '+1' => 'larger', 40 '+2' => '150%', 41 '+3' => '200%', 42 '+4' => '300%' 43 ); 44 45 /** 46 * @param HTMLPurifier_Token_Tag $tag 47 * @param HTMLPurifier_Config $config 48 * @param HTMLPurifier_Context $context 49 * @return HTMLPurifier_Token_End|string 50 */ 51 public function transform($tag, $config, $context) 52 { 53 if ($tag instanceof HTMLPurifier_Token_End) { 54 $new_tag = clone $tag; 55 $new_tag->name = $this->transform_to; 56 return $new_tag; 57 } 58 59 $attr = $tag->attr; 60 $prepend_style = ''; 61 62 // handle color transform 63 if (isset($attr['color'])) { 64 $prepend_style .= 'color:' . $attr['color'] . ';'; 65 unset($attr['color']); 66 } 67 68 // handle face transform 69 if (isset($attr['face'])) { 70 $prepend_style .= 'font-family:' . $attr['face'] . ';'; 71 unset($attr['face']); 72 } 73 74 // handle size transform 75 if (isset($attr['size'])) { 76 // normalize large numbers 77 if ($attr['size'] !== '') { 78 if ($attr['size'][0] == '+' || $attr['size'][0] == '-') { 79 $size = (int)$attr['size']; 80 if ($size < -2) { 81 $attr['size'] = '-2'; 82 } 83 if ($size > 4) { 84 $attr['size'] = '+4'; 85 } 86 } else { 87 $size = (int)$attr['size']; 88 if ($size > 7) { 89 $attr['size'] = '7'; 90 } 91 } 92 } 93 if (isset($this->_size_lookup[$attr['size']])) { 94 $prepend_style .= 'font-size:' . 95 $this->_size_lookup[$attr['size']] . ';'; 96 } 97 unset($attr['size']); 98 } 99 100 if ($prepend_style) { 101 $attr['style'] = isset($attr['style']) ? 102 $prepend_style . $attr['style'] : 103 $prepend_style; 104 } 105 106 $new_tag = clone $tag; 107 $new_tag->name = $this->transform_to; 108 $new_tag->attr = $attr; 109 110 return $new_tag; 111 } 112 } 113 114 // vim: et sw=4 sts=4
title
Description
Body
title
Description
Body
title
Description
Body
title
Body