class Skim::Command

Public Class Methods

new(args) click to toggle source
# File lib/skim/command.rb, line 6
def initialize(args)
  @args = args
  @options = {}
end

Public Instance Methods

run() click to toggle source

Run command

# File lib/skim/command.rb, line 12
def run
  @opts = OptionParser.new(&method(:set_opts))
  @opts.parse!(@args)
  process
end

Private Instance Methods

prepend_assignment(result) click to toggle source
# File lib/skim/command.rb, line 116
def prepend_assignment(result)
  assignment = ''
  initialization = ''

  global = 'this'
  if @node_global
    global = 'global'
    result.sub!(/(this)(\.Skim =)/) {"#{global}#{$2}"}
  end

  assignment += "module.exports = " if @export
  assignment += "#{global}.#{@assign_variable_name} = " if @assign_variable_name
  if @assign_object_name
    object_name = "#{global}.#{@assign_object_name}"
    initialization = "#{object_name} || (#{object_name} = {});\n"
    assignment += "#{object_name}[#{truncated_filename.inspect}] = "
  end

  assignment.empty? ? result : (initialization + assignment + result)
end
process() click to toggle source

Process command

# File lib/skim/command.rb, line 79
def process
  args = @args.dup
  result = if @asset_only
    CoffeeScript.compile(Skim::Template.skim_src)
  else
    unless @input
      filename = args.shift
      if filename
        @filename = filename
        @input = File.open(filename, 'r')
      else
        @filename = 'STDIN'
        @input = $stdin
      end
    end

    locals = @options.delete(:locals) || {}
    Template.new(@filename, @options) { @input.read }.render(nil, locals)
  end

  result = prepend_assignment(result)

  rescue Exception => ex
    raise ex if @trace || SystemExit === ex
    $stderr.print "#{ex.class}: " if ex.class != RuntimeError
    $stderr.puts ex.message
    $stderr.puts '  Use --trace for backtrace.'
    exit 1
  else
    unless @options[:output]
      filename = args.shift
      @options[:output] = filename ? File.open(filename, 'w') : $stdout
    end
    @options[:output].puts(result)
    exit 0
end
set_opts(opts) click to toggle source

Configure OptionParser

# File lib/skim/command.rb, line 21
def set_opts(opts)
  opts.on('-s', '--stdin', 'Read input from standard input instead of an input file') do
    @input = $stdin
  end

  opts.on('-e', '--export', 'Assign to module.exports for CommonJS require') do
    @export = true
  end

  opts.on('-n', '--node-global', 'Use Node.js global object for global assignments') do
    @node_global = true
  end

  opts.on('--jst', 'Assign to global JST object keyed by truncated filename') do
    @assign_object_name = 'JST'
  end

  opts.on('--assign variableName', 'Assign to a global variable') do |str|
    @assign_variable_name = str
  end

  opts.on('--assign-object objectName', 'Assign to a global object keyed by truncated filename') do |str|
    @assign_object_name = str
  end

  opts.on('--asset-only', 'Output only the Skim preamble asset') do
    @asset_only = true
  end

  opts.on('--omit-asset', 'Omit Skim preamble asset from output') do
    @options[:use_asset] = true
  end

  opts.on('--trace', 'Show a full traceback on error') do
    @trace = true
  end

  opts.on('-o', '--option name=code', String, 'Set skim option') do |str|
    parts = str.split('=', 2)
    Engine.options[parts.first.gsub(/\A:/, '').to_sym] = eval(parts.last)
  end

  opts.on('-r', '--require library', "Load library or plugin") do |lib|
    require lib.strip
  end

  opts.on_tail('-h', '--help', 'Show this help message') do
    puts opts
    exit
  end

  opts.on_tail('-v', '--version', 'Print version number') do
    puts "Skim #{VERSION}"
    exit
  end
end
truncated_filename() click to toggle source
# File lib/skim/command.rb, line 137
def truncated_filename
  @filename.sub(/\.[^#{File::SEPARATOR}]*\Z/, '')
end