#!/usr/bin/env ruby # -*- ruby -*- require 'optparse' require 'pione' require 'pp' include Pione # # options # $readline_mode = true $verbose = false $expr = [] option_parser = OptionParser.new do |opt| opt.on('-e', '--expr=expr') {|e| $expr << e; $readline_mode = false } opt.on('-v', '--verbose') { $verbose = true } opt.on('--version') { puts "Pione version: %s" % [Pione.version]; exit } end begin option_parser.parse!(ARGV) rescue OptionParser::InvalidOption => e e.args.each {|arg| $stderr.puts "Unknown option: #{arg}" } abort end # # print parsing result of the string # def print_result(str) begin puts DocumentTransformer.new.apply(DocumentParser.new.parse(str))[0].eval($vtable).textize rescue Pione::Parser::ParserError, Parslet::UnconsumedInput, Parslet::ParseFailed => e error("Pione syntax error", e) rescue Pione::Model::PioneModelTypeError, Pione::Model::VariableBindingError => e error("Pione model error", e) rescue Pione::Model::MethodNotFound, NoMethodError => e error("Pione method error", e) end end def error(msg, e) msg = "%s: %s (%s)" % [msg, e.message, e.class.name] msg << "\n" << e.backtrace.join("\n") if $verbose $readline_mode ? puts(msg) : abort(msg) end # # variable table # $vtable = VariableTable.new # # History # $history = File.join(ENV["HOME"], ".pione", "pione-history") # make pione directory if it is absent unless Dir.exist?(File.join(ENV["HOME"], ".pione")) Dir.mkdir(File.join(ENV["HOME"], ".pione")) end # # Ctr+C # trap("INT") do # save history i = 0 File.open($history, "w+") do |file| Readline::HISTORY.to_a.reverse.each do |line| break if i >= 100 file.puts(line) if /\S/.match(line) end end # quit exit end # # readline loop # if $readline_mode require 'readline' # restore history if File.exist?($history) File.readlines($history).reverse.each do |line| Readline::HISTORY.push line.chomp end end # start loop while buf = Readline.readline(Terminal.red("> "), true) if /[^\s]/.match(buf) # don't record if previous line is the same if Readline::HISTORY.size > 1 && Readline::HISTORY[-2] == buf Readline::HISTORY.pop end # print parsing result print_result(buf) else # don't record if it is an empty line Readline::HISTORY.pop end end else # print parsing result $expr.each {|e| print_result(e) } end