Class: Postsvg::Translation::Handlers::TextHandler

Inherits:
Object
  • Object
show all
Extended by:
Shared
Defined in:
lib/postsvg/translation/handlers/text_handler.rb

Overview

SVG <text>. Emits a complete PS text sequence:

/<font-family> findfont
<font-size> scalefont
setfont
<x> <y> moveto
(text) show

Real font metrics (kerning, ligatures, glyph substitution) are tracked in TODO.roadmap/20-font-and-text.md. The shape of the emitted sequence matches PLRM ยง5 so PS interpreters that DO have the named font will render the text correctly.

Class Method Summary collapse

Methods included from Shared

emit_fill, emit_paint, emit_paint_setup, emit_stroke, emit_transform, expand_bbox

Class Method Details

.call(element, context) ⇒ Object



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/postsvg/translation/handlers/text_handler.rb', line 21

def self.call(element, context)
  context.emitter.emit(Model::Operators::GraphicsState::Gsave.new)
  emit_transform(element, context)
  emit_fill(element, context) if element.fill && element.fill.color?

  font_name = font_name_value(element)
  context.emitter.emit(Model::Operators::Font::Findfont.new(name: font_name))
  context.emitter.emit(Model::Operators::Font::Scalefont.new(
    font: Model::Computed.new(operator_keyword: "findfont"),
    size: element.font_size,
  ))
  context.emitter.emit(Model::Operators::Font::Setfont.new(
    font: Model::Computed.new(operator_keyword: "scalefont"),
  ))
  context.emitter.emit(Model::Operators::Path::Moveto.new(x: element.x, y: element.y))
  context.emitter.emit(Model::Operators::Font::Show.new(text: element.content.to_s))

  context.emitter.emit(Model::Operators::GraphicsState::Grestore.new)
  expand_bbox(context,
              element.x, element.y,
              element.x + (element.content.to_s.length * element.font_size / 2.0),
              element.y + element.font_size)
end