Class: Webgen::Tag::TikZ

Inherits:
Object
  • Object
show all
Includes:
Base, WebsiteAccess
Defined in:
lib/webgen/tag/tikz.rb

Overview

This tag allows the creation and inclusion of complex graphics using the PGF/TikZ library of LaTeX. You will need a current LaTeX distribution and the convert utility from ImageMagick.

Constant Summary collapse

LATEX_TEMPLATE =
<<EOF
\\nonstopmode \\documentclass{article} \\usepackage{tikz} \\pagestyle{empty}
<% if param('tag.tikz.libraries') %>
\\usetikzlibrary{<%= param('tag.tikz.libraries').join(',') %>}
<% end %>
\\begin{document}
<% if param('tag.tikz.opts') %>
\\begin{tikzpicture}[<%= param('tag.tikz.opts') %>]
<% else %>
\\begin{tikzpicture}
<% end %>
<%= body %>
\\end{tikzpicture}
\\end{document}
EOF

Instance Method Summary collapse

Methods included from WebsiteAccess

included, website

Methods included from Base

#create_params_hash, #create_tag_params, #param, #set_params

Methods included from Loggable

#log, #puts

Instance Method Details

#call(tag, body, context) ⇒ Object

Create a graphic from the commands in the body of the tag.



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/webgen/tag/tikz.rb', line 33

def call(tag, body, context)
  path = param('tag.tikz.path')
  path = Webgen::Path.make_absolute(context.ref_node.parent.alcn, path)

  mem_handler = website.cache.instance('Webgen::SourceHandler::Memory')
  src_path = context.ref_node.node_info[:src]
  parent = website.blackboard.invoke(:create_directories, context.ref_node.tree.root, File.dirname(path), src_path)
  params = @params

  node = website.blackboard.invoke(:create_nodes, Webgen::Path.new(path, src_path), mem_handler) do |node_path|
    mem_handler.create_node(node_path, context.ref_node.alcn) do |pic_node|
      set_params(params)
      document = ERB.new(LATEX_TEMPLATE).result(binding)
      pic_path = compile(document, File.extname(path), context)
      set_params(nil)
      if pic_path
        io = Webgen::Path::SourceIO.new { File.open(pic_path, 'rb') }
      else
        pic_node.flag(:dirty)
        nil
      end
    end
  end.first
  attrs = param('tag.tikz.img_attr').collect {|name,value| "#{name.to_s}=\"#{value}\"" }.sort.unshift('').join(' ')
  "<img src=\"#{context.dest_node.route_to(node)}\"#{attrs} />"
end