summaryrefslogtreecommitdiff
path: root/bin/erb
blob: 2459d2562e4dba8a5975dc07bd1031538f1ef92c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#!/usr/bin/env ruby
# Tiny eRuby --- ERB2
# Copyright (c) 1999-2000,2002 Masatoshi SEKI 
# You can redistribute it and/or modify it under the same terms as Ruby.

require 'erb'

class ERB
  module Main
    def ARGV.switch
      return nil if self.empty?
      arg = self.shift
      return nil if arg == '--'
      if arg =~ /^-(.)(.*)/
	return arg if $1 == '-'
	raise 'unknown switch "-"' if $2.index('-')
	self.unshift "-#{$2}" if $2.size > 0
	"-#{$1}"
      else
	self.unshift arg
	nil
      end
    end
    
    def ARGV.req_arg
      self.shift || raise('missing argument')
    end

    def trim_mode_opt(trim_mode, disable_percent)
      return trim_mode if disable_percent
      case trim_mode
      when 0
	return '%'
      when 1
	return '%>'
      when 2
	return '%<>'
      when '-'
	return '%-'
      end
    end
    module_function :trim_mode_opt

    def run(factory=ERB)
      trim_mode = 0
      disable_percent = false
      begin
	while switch = ARGV.switch
	  case switch
	  when '-x'			# ruby source
	    output = true
	  when '-n'			# line number
	    number = true
	  when '-v'			# verbose
	    $VERBOSE = true
	  when '--version'		# version
	    STDERR.puts factory.version
	    exit
	  when '-d', '--debug'	# debug
	    $DEBUG = true
	  when '-r'			# require
	    require ARGV.req_arg
	  when '-S'			# sacurity level
	    arg = ARGV.req_arg
	    raise "invalid safe_level #{arg.dump}" unless arg =~ /^[0-4]$/
	    safe_level = arg.to_i
	  when '-T'			# trim mode
	    arg = ARGV.req_arg
	    if arg == '-'
	      trim_mode = arg 
	      next
	    end
	    raise "invalid trim mode #{arg.dump}" unless arg =~ /^[0-2]$/
	    trim_mode = arg.to_i
	  when '-K'			# KCODE
	    arg = ARGV.req_arg
	    case arg.downcase
	    when 'e', '-e', 'euc'
	      $KCODE = 'EUC'
	    when 's', '-s', 'sjis'
	      $KCODE = 'SJIS'
	    when 'u', '-u', 'utf8'
	      $KCODE = 'UTF8'
	    when 'n', '-n', 'none'
	      $KCODE = 'NONE'
	    else
	      raise "invalid KCODE #{arg.dump}"
	    end
	  when '-P'
	    disable_percent = true
	  when '--help'
	    raise "print this help"
	  else
	    raise "unknown switch #{switch.dump}"
	  end
	end
      rescue    			# usage
	STDERR.puts $!.to_s
	STDERR.puts File.basename($0) + 
	  " [switches] [inputfile]"
	STDERR.puts <<EOU
  -x               print ruby script
  -n               print ruby script with line number
  -v               enable verbose mode
  -d               set $DBEUG to true
  -r [library]     load a library
  -K [kcode]       specify KANJI code-set
  -S [safe_level]  set $SAFE (0..4)
  -T [trim_mode]   specify trim_mode (0..2, -)
  -P               disregard the lin which starts in "%" 
EOU
	exit 1
      end

      src = $<.read
      exit 2 unless src
      trim = trim_mode_opt(trim_mode, disable_percent)
      erb = factory.new(src.untaint, safe_level, trim)
      if output
	if number
	  l = 1
	  for line in erb.src
	    puts "%3d %s"%[l, line]
	    l += 1
	  end
	else
	  puts erb.src
	end
      else
	erb.run(TOPLEVEL_BINDING.taint)
      end
    end
    module_function :run
  end
end

if __FILE__ == $0
  ERB::Main.run
end