1<?php 2// $Header: /cvsroot/html2ps/css.vertical-align.inc.php,v 1.23 2006/09/07 18:38:14 Konstantin Exp $ 3 4define('VA_SUPER' ,0); 5define('VA_SUB' ,1); 6define('VA_TOP' ,2); 7define('VA_MIDDLE' ,3); 8define('VA_BOTTOM' ,4); 9define('VA_BASELINE' ,5); 10define('VA_TEXT_TOP' ,6); 11define('VA_TEXT_BOTTOM',7); 12 13class VerticalAlignSuper { 14 function apply_cell(&$cell, $row_height, $row_baseline) { 15 return; // Do nothing 16 } 17} 18 19class VerticalAlignSub { 20 function apply_cell(&$cell, $row_height, $row_baseline) { 21 return; // Do nothing 22 } 23} 24 25class VerticalAlignTop { 26 function apply_cell(&$cell, $row_height, $row_baseline) { 27 return; // Do nothing 28 } 29} 30 31class VerticalAlignMiddle { 32 function apply_cell(&$cell, $row_height, $row_baseline) { 33 $delta = max(0, ($row_height - $cell->get_real_full_height()) / 2); 34 35 $old_top = $cell->get_top(); 36 $cell->offset(0, -$delta); 37 $cell->put_top($old_top); 38 } 39} 40 41class VerticalAlignBottom { 42 function apply_cell(&$cell, $row_height, $row_baseline) { 43 $delta = ($row_height - $cell->get_real_full_height()); 44 45 $old_top = $cell->get_top(); 46 $cell->offset(0, -$delta); 47 $cell->put_top($old_top); 48 } 49} 50 51class VerticalAlignBaseline { 52 function apply_cell(&$cell, $row_height, $row_baseline) { 53 $delta = ($row_baseline - $cell->get_cell_baseline()); 54 55 $old_top = $cell->get_top(); 56 $cell->offset(0, -$delta); 57 $cell->put_top($old_top); 58 } 59} 60 61class VerticalAlignTextTop { 62 function apply_cell(&$cell, $row_height, $row_baseline) { 63 return; // Do nothing 64 } 65} 66 67class VerticalAlignTextBottom { 68 function apply_cell(&$cell, $row_height, $row_baseline) { 69 $delta = ($row_baseline - $cell->get_cell_baseline()); 70 71 $old_top = $cell->get_top(); 72 $cell->offset(0, -$delta); 73 $cell->put_top($old_top); 74 } 75} 76 77class CSSVerticalAlign extends CSSPropertyHandler { 78 function CSSVerticalAlign() { 79 // Note that in general, parameters 'true' and 'false' are non meaningful in out case, 80 // as we anyway override 'inherit' and 'inherit_text' in this class. 81 $this->CSSPropertyHandler(true, true); 82 } 83 84 function inherit($old_state, &$new_state) { 85 // Determine parent 'display' value 86 $parent_display = $old_state[CSS_DISPLAY]; 87 88 // Inherit vertical-align from table-rows 89 if ($parent_display === "table-row") { 90 $this->replace_array($this->get($old_state), 91 $new_state); 92 return; 93 } 94 95 if (is_inline_element($parent_display)) { 96 $this->replace_array($this->get($old_state), $new_state); 97 return; 98 }; 99 100 $this->replace_array($this->default_value(), $new_state); 101 return; 102 } 103 104 function inherit_text($old_state, &$new_state) { 105 // Determine parent 'display' value 106 $parent_display = $old_state[CSS_DISPLAY]; 107 108 $this->replace_array(is_inline_element($parent_display) ? $this->get($old_state) : $this->default_value(), 109 $new_state); 110 } 111 112 function default_value() { return VA_BASELINE; } 113 114 function parse($value) { 115 if ($value === 'inherit') { 116 return CSS_PROPERTY_INHERIT; 117 }; 118 119 // Convert value to lower case, as html allows values 120 // in both cases to be entered 121 $value = strtolower($value); 122 123 if ($value === 'baseline') { return VA_BASELINE; }; 124 if ($value === 'sub') { return VA_SUB; }; 125 if ($value === 'super') { return VA_SUPER; }; 126 if ($value === 'top') { return VA_TOP; }; 127 if ($value === 'middle') { return VA_MIDDLE; }; 128 129 // As some brainless designers sometimes use 'center' instead of 'middle', 130 // we'll add support for it 131 if ($value === 'center') { return VA_MIDDLE; } 132 133 if ($value === 'bottom') { return VA_BOTTOM; }; 134 if ($value === 'text-top') { return VA_TEXT_TOP; }; 135 if ($value === 'text-bottom') { return VA_TEXT_BOTTOM; }; 136 return $this->default_value(); 137 } 138 139 function value2pdf($value) { 140 if ($value === VA_SUPER) { return new VerticalAlignSuper; } 141 if ($value === VA_SUB) { return new VerticalAlignSub; } 142 if ($value === VA_TOP) { return new VerticalAlignTop; } 143 if ($value === VA_MIDDLE) { return new VerticalAlignMiddle; } 144 if ($value === VA_BOTTOM) { return new VerticalAlignBottom; } 145 if ($value === VA_BASELINE) { return new VerticalAlignBaseline; } 146 if ($value === VA_TEXT_TOP) { return new VerticalAlignTextTop; } 147 if ($value === VA_TEXT_BOTTOM) { return new VerticalAlignTextBottom; } 148 return new VerticalAlignBaseline; 149 } 150 151 function applicable($css_state) { 152 $handler =& CSS::get_handler(CSS_DISPLAY); 153 $display = $handler->get($css_state->getState()); 154 return 155 $display === 'table-cell' || 156 $display === 'table-row' || 157 is_inline_element($display); 158 } 159 160 function get_property_code() { 161 return CSS_VERTICAL_ALIGN; 162 } 163 164 function get_property_name() { 165 return 'vertical-align'; 166 } 167} 168 169CSS::register_css_property(new CSSVerticalAlign); 170 171?>