Class: HexaPDF::Layout::Line
- Inherits:
-
Object
- Object
- HexaPDF::Layout::Line
- Defined in:
- lib/hexapdf/layout/line.rb
Overview
A Line describes a line of text and can contain TextFragment objects or InlineBox objects.
The items of a line fragment are aligned along the x-axis which coincides with the text baseline. The vertical alignment is determined by the value of the #valign method:
- :text_top
-
Align the top of the box with the top of the text of the Line.
- :text_bottom
-
Align the bottom of the box with the bottom of the text of the Line.
- :baseline
-
Align the bottom of the box with the baseline of the Line.
- :top
-
Align the top of the box with the top of the Line.
- :bottom
-
Align the bottom of the box with the bottom of the Line.
- :text
-
This is a special alignment value for text fragment objects. The text fragment is aligned on the baseline and its minimum and maximum y-coordinates are used when calculating the line’s #text_y_min and #text_y_max.
This value may be used by other objects if they should be handled similar to text fragments, e.g. graphical representation of characters (think: emoji fonts).
Item Requirements
Each item of a line fragment has to respond to the following methods:
- #x_min
-
The minimum x-coordinate of the item.
- #x_max
-
The maximum x-coordinate of the item.
- #width
-
The width of the item.
- #valign
-
The vertical alignment of the item (see above).
- #draw(canvas, x, y)
-
Should draw the item onto the canvas at the position (x, y).
If an item has a vertical alignment of :text, it additionally has to respond to the following methods:
- #y_min
-
The minimum y-coordinate of the item.
- #y_max
-
The maximum y-coordinate of the item.
Otherwise (i.e. a vertical alignment different from :text), the following method must be implemented:
- #height
-
The height of the item.
Defined Under Namespace
Classes: HeightCalculator
Instance Attribute Summary collapse
-
#items ⇒ Object
The items: TextFragment and InlineBox objects.
-
#x_offset ⇒ Object
An optional horizontal offset that should be taken into account when positioning the line.
-
#y_offset ⇒ Object
An optional vertical offset that should be taken into account when positioning the line.
Instance Method Summary collapse
-
#add(item) ⇒ Object
(also: #<<)
Adds the given item at the end of the item list.
-
#clear_cache ⇒ Object
:call-seq: line.clear_cache -> line.
-
#each ⇒ Object
:call-seq: line.each {|item, x, y| block }.
-
#height ⇒ Object
The height of the line fragment.
-
#ignore_justification! ⇒ Object
Specifies that this line should not be justified if line justification is used.
-
#ignore_justification? ⇒ Boolean
Returns
trueif justification should be ignored for this line. -
#initialize(items = []) ⇒ Line
constructor
Creates a new Line object, adding all given items to it.
-
#text_y_max ⇒ Object
The maximum y-coordinate of any TextFragment item of the line.
-
#text_y_min ⇒ Object
The minimum y-coordinate of any TextFragment item of the line.
-
#width ⇒ Object
The width of the line fragment.
-
#x_max ⇒ Object
The maximum x-coordinate of the whole line.
-
#x_min ⇒ Object
The minimum x-coordinate of the whole line.
-
#y_max ⇒ Object
The maximum y-coordinate of any item of the line.
-
#y_min ⇒ Object
The minimum y-coordinate of any item of the line.
Constructor Details
#initialize(items = []) ⇒ Line
Creates a new Line object, adding all given items to it.
183 184 185 186 187 188 |
# File 'lib/hexapdf/layout/line.rb', line 183 def initialize(items = []) @items = [] items.each {|i| add(i) } @x_offset = 0 @y_offset = 0 end |
Instance Attribute Details
#items ⇒ Object
The items: TextFragment and InlineBox objects
170 171 172 |
# File 'lib/hexapdf/layout/line.rb', line 170 def items @items end |
#x_offset ⇒ Object
An optional horizontal offset that should be taken into account when positioning the line.
173 174 175 |
# File 'lib/hexapdf/layout/line.rb', line 173 def x_offset @x_offset end |
#y_offset ⇒ Object
An optional vertical offset that should be taken into account when positioning the line.
For the first line in a paragraph this describes the offset from the top of the box to the baseline of the line. For all other lines it describes the offset from the previous baseline to the baseline of this line.
180 181 182 |
# File 'lib/hexapdf/layout/line.rb', line 180 def y_offset @y_offset end |
Instance Method Details
#add(item) ⇒ Object Also known as: <<
Adds the given item at the end of the item list.
If both the item and the last item in the item list are TextFragment objects and they have the same style, they are combined.
Note: The cache is not cleared!
196 197 198 199 200 201 202 203 204 205 206 207 208 209 |
# File 'lib/hexapdf/layout/line.rb', line 196 def add(item) last = @items.last if last.class == item.class && item.kind_of?(TextFragment) && last.style == item.style if last.items.frozen? @items[-1] = last = last.dup last.items = last.items.dup end last.items[last.items.length, 0] = item.items last.clear_cache else @items << item end self end |
#clear_cache ⇒ Object
:call-seq:
line.clear_cache -> line
Clears all cached values.
This method needs to be called if the line’s items are changed!
294 295 296 297 |
# File 'lib/hexapdf/layout/line.rb', line 294 def clear_cache @x_max = @y_min = @y_max = @text_y_min = @text_y_max = @width = nil self end |
#each ⇒ Object
:call-seq:
line.each {|item, x, y| block }
Yields each item together with its horizontal offset from 0 and vertical offset from the baseline.
217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 |
# File 'lib/hexapdf/layout/line.rb', line 217 def each x = 0 @items.each do |item| y = case item.valign when :text, :baseline then 0 when :top then y_max - item.height when :text_top then text_y_max - item.height when :text_bottom then text_y_min when :bottom then y_min else raise HexaPDF::Error, "Unknown inline box alignment #{item.valign}" end yield(item, x, y) x += item.width end end |
#height ⇒ Object
The height of the line fragment.
274 275 276 |
# File 'lib/hexapdf/layout/line.rb', line 274 def height y_max - y_min end |
#ignore_justification! ⇒ Object
Specifies that this line should not be justified if line justification is used.
279 280 281 |
# File 'lib/hexapdf/layout/line.rb', line 279 def ignore_justification! @ignore_justification = true end |
#ignore_justification? ⇒ Boolean
Returns true if justification should be ignored for this line.
284 285 286 |
# File 'lib/hexapdf/layout/line.rb', line 284 def ignore_justification? defined?(@ignore_justification) && @ignore_justification end |
#text_y_max ⇒ Object
The maximum y-coordinate of any TextFragment item of the line.
264 265 266 |
# File 'lib/hexapdf/layout/line.rb', line 264 def text_y_max @text_y_max ||= calculate_y_dimensions[3] end |
#text_y_min ⇒ Object
The minimum y-coordinate of any TextFragment item of the line.
252 253 254 |
# File 'lib/hexapdf/layout/line.rb', line 252 def text_y_min @text_y_min ||= calculate_y_dimensions[2] end |
#width ⇒ Object
The width of the line fragment.
269 270 271 |
# File 'lib/hexapdf/layout/line.rb', line 269 def width @width ||= @items.sum(&:width) end |
#x_max ⇒ Object
The maximum x-coordinate of the whole line.
240 241 242 |
# File 'lib/hexapdf/layout/line.rb', line 240 def x_max @x_max ||= width + (items[-1].x_max - items[-1].width) end |
#x_min ⇒ Object
The minimum x-coordinate of the whole line.
235 236 237 |
# File 'lib/hexapdf/layout/line.rb', line 235 def x_min @items[0].x_min end |
#y_max ⇒ Object
The maximum y-coordinate of any item of the line.
It is always greater than or equal to zero.
259 260 261 |
# File 'lib/hexapdf/layout/line.rb', line 259 def y_max @y_max ||= calculate_y_dimensions[1] end |
#y_min ⇒ Object
The minimum y-coordinate of any item of the line.
It is always lower than or equal to zero.
247 248 249 |
# File 'lib/hexapdf/layout/line.rb', line 247 def y_min @y_min ||= calculate_y_dimensions[0] end |