metadin
clone your own copy | download snapshot

Snapshots | iceberg

Inside this repository

metaflop.rb
application/x-ruby

Download raw (3.4 KB)

# encoding: UTF-8

#
# metaflop - web interface
# © 2012 by alexis reigel
# www.metaflop.com
#
# licensed under gpl v3
#

require './lib/rack_logger'
require './lib/rack_settings'
require './lib/font_parameters'
require './lib/font_settings'
require './lib/web_font'
require 'mustache'

class Metaflop

  include RackLogger
  include RackSettings

  # args: see FontParameter
  def initialize(args = {})
    @font_settings = FontSettings.new(args)
    @font_parameters = FontParameters.new(args, @font_settings)
  end

  def font_parameters(file = nil)
    if (!@font_parameters_initialized)
      @font_parameters.from_file file
      @font_parameters_initialized = true
    end

    @font_parameters
  end

  def font_settings
    @font_settings
  end

  # returns an gif image for a single character preview
  def preview_single
    generate(
      latex: settings[:preview_single]['latex'],
      text: @font_settings.char,
      width: settings[:preview_width]
    )
  end

  def preview_chart
    generate(
      latex: settings[:preview_chart]['latex'],
      width: settings[:preview_width]
    )
  end

  def preview_typewriter
    generate(
      latex: settings[:preview_typewriter]['latex'],
      text: @font_settings.text,
      width: settings[:preview_width] * 2
    )
  end

  def font_otf
    @font_settings.cleanup_tmp_dir
    # regenerate from the latest parameters with the sidebearings turned off
    @font_parameters.sidebearing.value = '0'
    font_parameters "#{@font_settings.out_dir}/font.mf"
    generate_mf

    command = Mustache.render(settings[:font_otf], @font_settings)

    `cd #{@font_settings.out_dir} && #{command}`

    @font_parameters.sidebearing.value = nil

    { :name => "#{@font_settings.font_name}.otf",
      :data => File.read("#{@font_settings.out_dir}/font.otf") }
  end

  def font_web
    font_otf
    `cd #{@font_settings.out_dir} && #{settings[:font_web]}`

    font = WebFont.new(@font_settings)
    { :name => "#{font.font_name}_webfont.zip",
      :data => font.zip }
  end

  # generates the image for the specified tool chain
  #
  # @param options [Hash] optional parameters
  # @option options [String] :latex the latex command that generates the dvi output
  # @option options [String] :text the text that is generated by latex
  # @option options [Integer] :width the width of the preview image
  def generate(options = {})
    latex = options[:latex].strip.gsub(/\n/, "\\\n") # add a backslash for bash multiline

    @font_settings.cleanup_tmp_dir

    # don't bother if metafont failed
    if generate_mf
      # hide all output but the last one, which returns the image
      command = Mustache.render(%Q{
        {{=<% %>=}} <%! change delimiter, we have too many curly braces in tex %>
        cd #{@font_settings.out_dir} &&
        latex -output-format=dvi -jobname=font "\\#{latex}" > /dev/null &&
        dvisvgm -TS0.75 -M16 -n --cache=none font.dvi > /dev/null &&
        convert -density 200 -resize <% width %> font.svg gif:-
        <%={{ }}=%>
        },
        { :text => options[:text], :width => options[:width] }
      )

      logger.info command

      `#{command}`
    else
      logger.error "mf generation failed."
      nil
    end
  end

  # returns true if the mf was successfully generated
  def generate_mf
    @font_parameters.to_file
    system(
      %Q{cd #{@font_settings.out_dir} &&
         mf -halt-on-error -jobname=font font.mf > /dev/null}
    )
  end

end