class Metanorma::Standoc::PlantUMLBlockMacroBackend

Public Class Methods

generate_attrs(attrs) click to toggle source
# File lib/metanorma/standoc/macros_plantuml.rb, line 80
def self.generate_attrs(attrs)
  %w(id align float title role width height alt)
    .inject({}) do |memo, key|
    memo[key] = attrs[key] if attrs.has_key? key
    memo
  end
end
generate_file(parent, reader) click to toggle source

if no :imagesdir: leave image file in plantuml sleep need for windows because dot works in separate process and plantuml process may finish earlier then dot, as result png file maybe not created yet after plantuml finish

# Warning: metanorma/metanorma-standoc#187 Windows Ruby 2.4 will crash if a Tempfile is “mv”ed. This is why we need to copy and then unlink.

# File lib/metanorma/standoc/macros_plantuml.rb, line 35
def self.generate_file(parent, reader)
  localdir = Metanorma::Utils::localdir(parent.document)
  imagesdir = parent.document.attr("imagesdir")
  umlfile, outfile = save_plantuml parent, reader, localdir
  run(umlfile, outfile) or
    raise "No image output from PlantUML (#{umlfile}, #{outfile})!"
  umlfile.unlink

  path = path_prep(localdir, imagesdir)
  filename = File.basename(outfile.to_s)
  FileUtils.cp(outfile, path) and outfile.unlink

  imagesdir ? filename : File.join(path, filename)
end
path_prep(localdir, imagesdir) click to toggle source
# File lib/metanorma/standoc/macros_plantuml.rb, line 50
def self.path_prep(localdir, imagesdir)
  path = Pathname.new(localdir) + (imagesdir || "plantuml")
  File.writable?(localdir) or
    raise "Destination path #{path} not writable for PlantUML!"
  path.mkpath
  File.writable?(path) or
    raise "Destination path #{path} not writable for PlantUML!"
  # File.exist?(path) or raise "Destination path #{path} already exists for PlantUML!"
  path
end
plantuml_installed?() click to toggle source

stackoverflow.com/questions/2108727/which-in-ruby-checking-if-program-exists-in-path-from-ruby

# File lib/metanorma/standoc/macros_plantuml.rb, line 5
def self.plantuml_installed?
  cmd = "plantuml"
  exts = ENV["PATHEXT"] ? ENV["PATHEXT"].split(";") : [""]
  ENV["PATH"].split(File::PATH_SEPARATOR).each do |path|
    exts.each do |ext|
      exe = File.join(path, "#{cmd}#{ext}")
      return exe if File.executable?(exe) && !File.directory?(exe)
    end
  end
  raise "PlantUML not installed"
end
prep_source(reader) click to toggle source
# File lib/metanorma/standoc/macros_plantuml.rb, line 71
def self.prep_source(reader)
  src = reader.source
  reader.lines.first.sub(/\s+$/, "").match /^@startuml($| )/ or
    src = "@startuml\n#{src}\n@enduml\n"
  %r{@enduml\s*$}m.match?(src) or
    raise "@startuml without matching @enduml in PlantUML!"
  src
end
run(umlfile, outfile) click to toggle source
# File lib/metanorma/standoc/macros_plantuml.rb, line 17
def self.run(umlfile, outfile)
  system "plantuml #{umlfile.path}" or (warn $? and return false)
  i = 0
  until !Gem.win_platform? || File.exist?(outfile) || i == 15
    sleep(1)
    i += 1
  end
  File.exist?(outfile)
end
save_plantuml(_parent, reader, _localdir) click to toggle source
# File lib/metanorma/standoc/macros_plantuml.rb, line 61
def self.save_plantuml(_parent, reader, _localdir)
  src = prep_source(reader)
  /^@startuml (?<fn>[^\n]+)\n/ =~ src
  Tempfile.open(["plantuml", ".pml"], encoding: "utf-8") do |f|
    f.write(src)
    [f, File.join(File.dirname(f.path),
                  "#{fn || File.basename(f.path, '.pml')}.png")]
  end
end