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
40
41
42
43
44
45
46
47
48
49
50
51
|
# File 'lib/asciidoctor-diagram/util/svg.rb', line 8
def self.post_process_image(data, optimise)
svg = REXML::Document.new(data)
root = svg.root
unless root.attributes['xmlns']
root.add_attribute('xmlns', 'http://www.w3.org/2000/svg')
end
unless root.attributes['preserveAspectRatio']
root.add_attribute('preserveAspectRatio', 'xMidYMid meet')
end
width = nil
height = nil
if (w = WIDTH_HEIGHT_REGEX.match(root.attributes['width'])) && (h = WIDTH_HEIGHT_REGEX.match(root.attributes['height']))
width = to_numeric(w[:value]) * to_px_factor(w[:unit])
height = to_numeric(h[:value]) * to_px_factor(h[:unit])
end
viewbox = root.attributes['viewBox']
if (v = VIEWBOX_REGEX.match(viewbox)) && width.nil? && height.nil?
min_x = to_numeric(v[:min_x])
min_y = to_numeric(v[:min_y])
width ||= to_numeric(v[:width]) - min_x
height ||= to_numeric(v[:height]) - min_y
end
if viewbox.nil? && width && height
root.add_attribute('viewBox', "0 0 #{width.to_s} #{height.to_s}")
end
indent = 2
if optimise
(svg)
indent = -1
end
patched_svg = ""
svg.write(:output => patched_svg, :indent => indent, :transitive => true)
[patched_svg, width, height]
end
|