/var/www/hkosl.com/littleark/webadmin/libraies/dompdf/dompdf/include/text_frame_decorator.cls.php


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
<?php
/**
 * @package dompdf
 * @link    http://dompdf.github.com/
 * @author  Benj Carson <benjcarson@digitaljunkies.ca>
 * @author  Brian Sweeney <eclecticgeek@gmail.com>
 * @author  Fabien Ménager <fabien.menager@gmail.com>
 * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 */

/**
 * Decorates Frame objects for text layout
 *
 * @access private
 * @package dompdf
 */
class Text_Frame_Decorator extends Frame_Decorator {
  
  
// protected members
  
protected $_text_spacing;
  
  
// buggy DOMText::splitText (PHP < 5.2.7)
  
public static $_buggy_splittext;
  
  function 
__construct(Frame $frameDOMPDF $dompdf) {
    if ( !
$frame->is_text_node() )
      throw new 
DOMPDF_Exception("Text_Decorator can only be applied to #text nodes.");
    
    
parent::__construct($frame$dompdf);
    
$this->_text_spacing null;
  }

  
//........................................................................

  
function reset() {
    
parent::reset();
    
$this->_text_spacing null;
  }
  
  
//........................................................................

  // Accessor methods
  
function get_text_spacing() { return $this->_text_spacing; }
      
  function 
get_text() {
    
// FIXME: this should be in a child class (and is incorrect)
//    if ( $this->_frame->get_style()->content !== "normal" ) {
//      $this->_frame->get_node()->data = $this->_frame->get_style()->content;
//      $this->_frame->get_style()->content = "normal";
//    }

//      pre_r("---");
//      $style = $this->_frame->get_style();
//      var_dump($text = $this->_frame->get_node()->data);
//      var_dump($asc = utf8_decode($text));
//      for ($i = 0; $i < strlen($asc); $i++)
//        pre_r("$i: " . $asc[$i] . " - " . ord($asc[$i]));
//      pre_r("width: " . Font_Metrics::get_text_width($text, $style->font_family, $style->font_size));

    
return $this->_frame->get_node()->data;
  }

  
//........................................................................

  // Vertical margins & padding do not apply to text frames

  // http://www.w3.org/TR/CSS21/visudet.html#inline-non-replaced:
  //
  // The vertical padding, border and margin of an inline, non-replaced box
  // start at the top and bottom of the content area, not the
  // 'line-height'. But only the 'line-height' is used to calculate the
  // height of the line box.
  
function get_margin_height() {
    
// This function is called in add_frame_to_line() and is used to
    // determine the line height, so we actually want to return the
    // 'line-height' property, not the actual margin box
    
$style $this->get_parent()->get_style();
    
$font $style->font_family;
    
$size $style->font_size;

    
/*
    pre_r('-----');
    pre_r($style->line_height);
    pre_r($style->font_size);
    pre_r(Font_Metrics::get_font_height($font, $size));
    pre_r(($style->line_height / $size) * Font_Metrics::get_font_height($font, $size));
    */

    
return ($style->line_height / ( $size $size )) * Font_Metrics::get_font_height($font$size);
    
  }

  function 
get_padding_box() {
    
$pb $this->_frame->get_padding_box();
    
$pb[3] = $pb["h"] = $this->_frame->get_style()->height;
    return 
$pb;
  }
  
//........................................................................

  // Set method
  
function set_text_spacing($spacing) {
    
$style $this->_frame->get_style();
    
    
$this->_text_spacing $spacing;
    
$char_spacing $style->length_in_pt($style->letter_spacing);
    
    
// Re-adjust our width to account for the change in spacing
    
$style->width Font_Metrics::get_text_width($this->get_text(), $style->font_family$style->font_size$spacing$char_spacing);
  }

  
//........................................................................

  // Recalculate the text width
  
function recalculate_width() {
    
$style $this->get_style();
    
$text $this->get_text();
    
$size $style->font_size;
    
$font $style->font_family;
    
$word_spacing $style->length_in_pt($style->word_spacing);
    
$char_spacing $style->length_in_pt($style->letter_spacing);

    return 
$style->width Font_Metrics::get_text_width($text$font$size$word_spacing$char_spacing);
  }
  
  
//........................................................................

  // Text manipulation methods
  
  // split the text in this frame at the offset specified.  The remaining
  // text is added a sibling frame following this one and is returned.
  
function split_text($offset) {
    if ( 
$offset == )
      return 
null;

    if ( 
self::$_buggy_splittext ) {
      
// workaround to solve DOMText::spliText() bug parsing multibyte strings
      
$node $this->_frame->get_node();
      
$txt0 $node->substringData(0$offset);
      
$txt1 $node->substringData($offsetmb_strlen($node->textContent)-1);

      
$node->replaceData(0mb_strlen($node->textContent), $txt0);
      
$split $node->parentNode->appendChild(new DOMText($txt1));
    }
    else {
      
$split $this->_frame->get_node()->splitText($offset);
    }
    
    
$deco $this->copy($split);

    
$p $this->get_parent();
    
$p->insert_child_after($deco$thisfalse);

    if ( 
$p instanceof Inline_Frame_Decorator )
      
$p->split($deco);

    return 
$deco;
  }

  
//........................................................................

  
function delete_text($offset$count) {
    
$this->_frame->get_node()->deleteData($offset$count);
  }

  
//........................................................................

  
function set_text($text) {
    
$this->_frame->get_node()->data $text;
  }

}

Text_Frame_Decorator::$_buggy_splittext PHP_VERSION_ID 50207;