Class: Prawn::SVG::Elements::Use

Inherits:
Base
  • Object
show all
Defined in:
lib/prawn/svg/elements/use.rb

Constant Summary

Constants inherited from Base

Base::COMMA_WSP_REGEXP, Base::MissingAttributesError, Base::PAINT_TYPES, Base::SVG_NAMESPACE, Base::SkipElementError, Base::SkipElementQuietly

Constants included from Attributes::Stroke

Attributes::Stroke::CAP_STYLE_TRANSLATIONS, Attributes::Stroke::JOIN_STYLE_TRANSLATIONS

Instance Attribute Summary collapse

Attributes inherited from Base

#attributes, #base_calls, #calls, #document, #parent_calls, #properties, #source, #state

Instance Method Summary collapse

Methods inherited from Base

#initialize, #name, #parse_and_apply, #process

Methods included from TransformParser

#parse_transform_attribute

Methods included from PDFMatrix

#load_matrix, #matrix_for_pdf, #rotation_matrix, #scale_matrix, #translation_matrix

Methods included from Attributes::Space

#parse_xml_space_attribute

Methods included from Attributes::Stroke

#parse_stroke_attributes_and_call

Methods included from Attributes::ClipPath

#parse_clip_path_attribute_and_call

Methods included from Attributes::Opacity

#parse_opacity_attributes_and_call

Methods included from Attributes::Transform

#parse_transform_attribute_and_call

Constructor Details

This class inherits a constructor from Prawn::SVG::Elements::Base

Instance Attribute Details

#referenced_element_classObject (readonly)

Returns the value of attribute referenced_element_class.



2
3
4
# File 'lib/prawn/svg/elements/use.rb', line 2

def referenced_element_class
  @referenced_element_class
end

#referenced_element_sourceObject (readonly)

Returns the value of attribute referenced_element_source.



2
3
4
# File 'lib/prawn/svg/elements/use.rb', line 2

def referenced_element_source
  @referenced_element_source
end

Instance Method Details

#applyObject



45
46
47
# File 'lib/prawn/svg/elements/use.rb', line 45

def apply
  add_call_and_enter 'translate', x_pixels(@x || 0), -y_pixels(@y || 0) if @x || @y
end

#container?Boolean

Returns:

  • (Boolean)


41
42
43
# File 'lib/prawn/svg/elements/use.rb', line 41

def container?
  true
end

#parseObject

Raises:



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
# File 'lib/prawn/svg/elements/use.rb', line 4

def parse
  href = href_attribute
  raise SkipElementError, 'use tag must have an href or xlink:href' if href.nil?

  if href[0..0] != '#'
    raise SkipElementError, 'use tag has an href that is not a reference to an id; this is not supported'
  end

  id = href[1..]
  referenced_element = @document.elements_by_id[id]

  if referenced_element
    @referenced_element_class = referenced_element.class
    @referenced_element_source = referenced_element.source
  else
    # Perhaps the element is defined further down in the document.  This is not recommended but still valid SVG,
    # so we'll support it with an exception case that's not particularly performant.
    raw_element = REXML::XPath.match(@document.root, %(//*[@id="#{id.gsub('"', '\"')}"])).first

    if raw_element
      @referenced_element_class = Prawn::SVG::Elements::TAG_CLASS_MAPPING[raw_element.name.to_sym]
      @referenced_element_source = raw_element
    end
  end

  raise SkipElementError, "no tag with ID '#{id}' was found, referenced by use tag" if referenced_element_class.nil?

  @referenced_element_class = Prawn::SVG::Elements::Viewport if referenced_element_source.name == 'symbol'

  state.inside_use = true

  @x = attributes['x']
  @y = attributes['y']
  @width = attributes['width']
  @height = attributes['height']
end

#process_child_elementsObject



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/prawn/svg/elements/use.rb', line 49

def process_child_elements
  add_call 'save'

  source = clone_element_source(referenced_element_source)

  if referenced_element_class == Prawn::SVG::Elements::Viewport
    source.attributes['width'] = @width || '100%'
    source.attributes['height'] = @height || '100%'
  end

  child = referenced_element_class.new(document, source, calls, state.dup)
  child.process

  add_call 'restore'
end