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
true
if 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.
186 187 188 189 190 191 |
# File 'lib/hexapdf/layout/line.rb', line 186 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
173 174 175 |
# File 'lib/hexapdf/layout/line.rb', line 173 def items @items end |
#x_offset ⇒ Object
An optional horizontal offset that should be taken into account when positioning the line.
176 177 178 |
# File 'lib/hexapdf/layout/line.rb', line 176 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.
183 184 185 |
# File 'lib/hexapdf/layout/line.rb', line 183 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!
199 200 201 202 203 204 205 206 207 208 209 210 211 212 |
# File 'lib/hexapdf/layout/line.rb', line 199 def add(item) last = @items.last if last.instance_of?(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!
297 298 299 300 |
# File 'lib/hexapdf/layout/line.rb', line 297 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.
220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 |
# File 'lib/hexapdf/layout/line.rb', line 220 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.
277 278 279 |
# File 'lib/hexapdf/layout/line.rb', line 277 def height y_max - y_min end |
#ignore_justification! ⇒ Object
Specifies that this line should not be justified if line justification is used.
282 283 284 |
# File 'lib/hexapdf/layout/line.rb', line 282 def ignore_justification! @ignore_justification = true end |
#ignore_justification? ⇒ Boolean
Returns true
if justification should be ignored for this line.
287 288 289 |
# File 'lib/hexapdf/layout/line.rb', line 287 def ignore_justification? defined?(@ignore_justification) && @ignore_justification end |
#text_y_max ⇒ Object
The maximum y-coordinate of any TextFragment item of the line.
267 268 269 |
# File 'lib/hexapdf/layout/line.rb', line 267 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.
255 256 257 |
# File 'lib/hexapdf/layout/line.rb', line 255 def text_y_min @text_y_min ||= calculate_y_dimensions[2] end |
#width ⇒ Object
The width of the line fragment.
272 273 274 |
# File 'lib/hexapdf/layout/line.rb', line 272 def width @width ||= @items.sum(&:width) end |
#x_max ⇒ Object
The maximum x-coordinate of the whole line.
243 244 245 |
# File 'lib/hexapdf/layout/line.rb', line 243 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.
238 239 240 |
# File 'lib/hexapdf/layout/line.rb', line 238 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.
262 263 264 |
# File 'lib/hexapdf/layout/line.rb', line 262 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.
250 251 252 |
# File 'lib/hexapdf/layout/line.rb', line 250 def y_min @y_min ||= calculate_y_dimensions[0] end |