erubis-bmp 2.7.0.bmp

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGES.txt +828 -0
  3. data/MIT-LICENSE +20 -0
  4. data/README.txt +10 -0
  5. data/benchmark/bench.rb +313 -0
  6. data/benchmark/bench_context.yaml +141 -0
  7. data/benchmark/mybench2.rb +266 -0
  8. data/benchmark/pibench.rb +163 -0
  9. data/benchmark/templates/_footer.html +4 -0
  10. data/benchmark/templates/_header.html +52 -0
  11. data/benchmark/templates/bench_erb.rhtml +29 -0
  12. data/benchmark/templates/bench_erubis.rhtml +29 -0
  13. data/benchmark/templates/bench_eruby.rhtml +29 -0
  14. data/bin/erubis +10 -0
  15. data/contrib/erubis-run.rb +132 -0
  16. data/doc/Rookbook.yaml +106 -0
  17. data/doc/docstyle.css +209 -0
  18. data/doc/users-guide.html +3551 -0
  19. data/doc/users-guide.txt +3631 -0
  20. data/examples/basic/Makefile +58 -0
  21. data/examples/basic/example.ec +42 -0
  22. data/examples/basic/example.ecpp +33 -0
  23. data/examples/basic/example.ejava +45 -0
  24. data/examples/basic/example.ejs +16 -0
  25. data/examples/basic/example.eperl +16 -0
  26. data/examples/basic/example.ephp +17 -0
  27. data/examples/basic/example.eruby +15 -0
  28. data/examples/basic/example.escheme +26 -0
  29. data/examples/pi-xhtml/ExamplePage.xhtml +80 -0
  30. data/examples/pi-xhtml/Makefile +17 -0
  31. data/examples/pi-xhtml/my/User.java +19 -0
  32. data/examples/pi-xhtml/my/Util.java +54 -0
  33. data/examples/pi/Makefile +54 -0
  34. data/examples/pi/example.ec +42 -0
  35. data/examples/pi/example.ejava +45 -0
  36. data/examples/pi/example.ejs +16 -0
  37. data/examples/pi/example.eperl +16 -0
  38. data/examples/pi/example.ephp +17 -0
  39. data/examples/pi/example.eruby +15 -0
  40. data/examples/pi/example.escheme +26 -0
  41. data/lib/erubis.rb +73 -0
  42. data/lib/erubis/context.rb +83 -0
  43. data/lib/erubis/converter.rb +357 -0
  44. data/lib/erubis/engine.rb +120 -0
  45. data/lib/erubis/engine/ec.rb +117 -0
  46. data/lib/erubis/engine/ecpp.rb +113 -0
  47. data/lib/erubis/engine/ejava.rb +110 -0
  48. data/lib/erubis/engine/ejavascript.rb +119 -0
  49. data/lib/erubis/engine/enhanced.rb +126 -0
  50. data/lib/erubis/engine/eperl.rb +95 -0
  51. data/lib/erubis/engine/ephp.rb +99 -0
  52. data/lib/erubis/engine/eruby.rb +125 -0
  53. data/lib/erubis/engine/escheme.rb +114 -0
  54. data/lib/erubis/engine/optimized.rb +127 -0
  55. data/lib/erubis/enhancer.rb +723 -0
  56. data/lib/erubis/error.rb +23 -0
  57. data/lib/erubis/evaluator.rb +88 -0
  58. data/lib/erubis/generator.rb +85 -0
  59. data/lib/erubis/helper.rb +47 -0
  60. data/lib/erubis/helpers/rails_form_helper.rb +197 -0
  61. data/lib/erubis/helpers/rails_helper.rb +353 -0
  62. data/lib/erubis/local-setting.rb +9 -0
  63. data/lib/erubis/main.rb +516 -0
  64. data/lib/erubis/preprocessing.rb +58 -0
  65. data/lib/erubis/tiny.rb +144 -0
  66. data/lib/erubis/util.rb +22 -0
  67. data/setup.rb +1331 -0
  68. data/test/Rookbook.yaml +42 -0
  69. data/test/assert-text-equal.rb +44 -0
  70. data/test/test-engines.rb +425 -0
  71. data/test/test-enhancers.rb +646 -0
  72. data/test/test-erubis.rb +887 -0
  73. data/test/test-index-cgi.rb +191 -0
  74. data/test/test-main.rb +752 -0
  75. data/test/test-users-guide.rb +73 -0
  76. data/test/test.rb +45 -0
  77. data/test/testutil.rb +111 -0
  78. metadata +121 -0
@@ -0,0 +1,266 @@
1
+
2
+ $: << '../lib'
3
+ %w[erb erubis yaml benchmark].each {|x| require x }
4
+
5
+ ydoc = YAML.load_file('bench_context.yaml')
6
+ list = ydoc['list']
7
+ @list = list
8
+
9
+ filename = 'bench_erb.rhtml'
10
+ input = File.read(filename)
11
+ input2 = input.gsub(/\blist\b/, '@list')
12
+
13
+ erb = ERB.new(input)
14
+ erb.result(binding())
15
+
16
+ N = ($N || 10000).to_i
17
+ output = nil
18
+ Benchmark.bm(33) do |x|
19
+
20
+ ## warm up (why need?)
21
+ ERB.new(input).result(binding())
22
+ Erubis::Eruby.new(input).result(binding())
23
+
24
+ output = nil; GC.start
25
+ x.report('ERB') do
26
+ i = 0
27
+ (N/10).times do
28
+ output = ERB.new(input).result(binding())
29
+ output = ERB.new(input).result(binding())
30
+ output = ERB.new(input).result(binding())
31
+ output = ERB.new(input).result(binding())
32
+ output = ERB.new(input).result(binding())
33
+ output = ERB.new(input).result(binding())
34
+ output = ERB.new(input).result(binding())
35
+ output = ERB.new(input).result(binding())
36
+ output = ERB.new(input).result(binding())
37
+ output = ERB.new(input).result(binding())
38
+ end
39
+ end
40
+
41
+ output = nil; GC.start
42
+ x.report('ERB (reused)') do
43
+ erb = ERB.new(input)
44
+ (N/10).times do
45
+ output = erb.result(binding())
46
+ output = erb.result(binding())
47
+ output = erb.result(binding())
48
+ output = erb.result(binding())
49
+ output = erb.result(binding())
50
+ output = erb.result(binding())
51
+ output = erb.result(binding())
52
+ output = erb.result(binding())
53
+ output = erb.result(binding())
54
+ output = erb.result(binding())
55
+ end
56
+ end
57
+
58
+ output = nil; GC.start
59
+ x.report('ERB (defmethod)') do
60
+ ERB_FILENAME = filename
61
+ class Renderer
62
+ extend ERB::DefMethod
63
+ def_erb_method('render_erb', ERB_FILENAME)
64
+ attr_accessor :list
65
+ end
66
+ #self.extend ERB::DefMethod
67
+ #def_erb_method('render_erb', filename)
68
+ r = Renderer.new
69
+ r.list = list
70
+ (N/10).times do
71
+ output = r.render_erb()
72
+ output = r.render_erb()
73
+ output = r.render_erb()
74
+ output = r.render_erb()
75
+ output = r.render_erb()
76
+ output = r.render_erb()
77
+ output = r.render_erb()
78
+ output = r.render_erb()
79
+ output = r.render_erb()
80
+ output = r.render_erb()
81
+ end
82
+ end
83
+
84
+ output = nil; GC.start
85
+ x.report('Erubis::Eruby#result') do
86
+ (N/10).times do
87
+ output = Erubis::Eruby.new(input).result(binding())
88
+ output = Erubis::Eruby.new(input).result(binding())
89
+ output = Erubis::Eruby.new(input).result(binding())
90
+ output = Erubis::Eruby.new(input).result(binding())
91
+ output = Erubis::Eruby.new(input).result(binding())
92
+ output = Erubis::Eruby.new(input).result(binding())
93
+ output = Erubis::Eruby.new(input).result(binding())
94
+ output = Erubis::Eruby.new(input).result(binding())
95
+ output = Erubis::Eruby.new(input).result(binding())
96
+ output = Erubis::Eruby.new(input).result(binding())
97
+ end
98
+ end
99
+
100
+ output = nil; GC.start
101
+ input2 = input.gsub(/\blist\b/, '@list')
102
+ x.report('Erubis::Eruby#evaluate') do
103
+ (N/10).times do
104
+ output = Erubis::Eruby.new(input2).evaluate(self)
105
+ output = Erubis::Eruby.new(input2).evaluate(self)
106
+ output = Erubis::Eruby.new(input2).evaluate(self)
107
+ output = Erubis::Eruby.new(input2).evaluate(self)
108
+ output = Erubis::Eruby.new(input2).evaluate(self)
109
+ output = Erubis::Eruby.new(input2).evaluate(self)
110
+ output = Erubis::Eruby.new(input2).evaluate(self)
111
+ output = Erubis::Eruby.new(input2).evaluate(self)
112
+ output = Erubis::Eruby.new(input2).evaluate(self)
113
+ output = Erubis::Eruby.new(input2).evaluate(self)
114
+ end
115
+ end
116
+
117
+ output = nil; GC.start
118
+ x.report('Erubis::Eruby#result (reused)') do
119
+ erubis = Erubis::Eruby.new(input)
120
+ (N/10).times do
121
+ output = erubis.result(binding())
122
+ output = erubis.result(binding())
123
+ output = erubis.result(binding())
124
+ output = erubis.result(binding())
125
+ output = erubis.result(binding())
126
+ output = erubis.result(binding())
127
+ output = erubis.result(binding())
128
+ output = erubis.result(binding())
129
+ output = erubis.result(binding())
130
+ output = erubis.result(binding())
131
+ end
132
+ end
133
+
134
+ output = nil; GC.start
135
+ x.report('Erubis::Eruby#evaluate (reused)') do
136
+ erubis = Erubis::Eruby.new(input2)
137
+ (N/10).times do
138
+ output = erubis.evaluate(self)
139
+ output = erubis.evaluate(self)
140
+ output = erubis.evaluate(self)
141
+ output = erubis.evaluate(self)
142
+ output = erubis.evaluate(self)
143
+ output = erubis.evaluate(self)
144
+ output = erubis.evaluate(self)
145
+ output = erubis.evaluate(self)
146
+ output = erubis.evaluate(self)
147
+ output = erubis.evaluate(self)
148
+ end
149
+ end
150
+
151
+ output = nil; GC.start
152
+ x.report('Erubis::Eruby (defmethod)') do
153
+ erubis = Erubis::Eruby.new(input)
154
+ eval "def render_erubis(list); #{erubis.src}; end"
155
+ (N/10).times do
156
+ output = render_erubis(list)
157
+ output = render_erubis(list)
158
+ output = render_erubis(list)
159
+ output = render_erubis(list)
160
+ output = render_erubis(list)
161
+ output = render_erubis(list)
162
+ output = render_erubis(list)
163
+ output = render_erubis(list)
164
+ output = render_erubis(list)
165
+ output = render_erubis(list)
166
+ end
167
+ end
168
+
169
+ output = nil; GC.start
170
+ x.report('Erubis::Eruby (defmethod#2)') do
171
+ erubis = Erubis::Eruby.new(input2)
172
+ eval "def render_erubis; #{erubis.src}; end"
173
+ (N/10).times do
174
+ output = render_erubis()
175
+ output = render_erubis()
176
+ output = render_erubis()
177
+ output = render_erubis()
178
+ output = render_erubis()
179
+ output = render_erubis()
180
+ output = render_erubis()
181
+ output = render_erubis()
182
+ output = render_erubis()
183
+ output = render_erubis()
184
+ end
185
+ end
186
+
187
+
188
+ File.open('hoge.output', 'w') {|f| f.write(output) }
189
+
190
+ end
191
+
192
+ __END__
193
+
194
+ $ ruby186 -s mybench2.rb -N=10000
195
+ user system total real
196
+ ERB 29.940000 0.810000 30.750000 ( 31.175876)
197
+ ERB (reused) 8.890000 0.030000 8.920000 ( 8.989230)
198
+ ERB (defmethod) 4.870000 0.010000 4.880000 ( 4.913900)
199
+ Erubis::Eruby#result 9.070000 0.030000 9.100000 ( 9.148731)
200
+ Erubis::Eruby#evaluate 9.130000 0.020000 9.150000 ( 9.209373)
201
+ Erubis::Eruby#result (reused) 5.580000 0.020000 5.600000 ( 5.666395)
202
+ Erubis::Eruby#evaluate (reused) 3.870000 0.000000 3.870000 ( 3.916371)
203
+ Erubis::Eruby (defmethod) 3.780000 0.000000 3.780000 ( 3.810064)
204
+ Erubis::Eruby (defmethod#2) 3.790000 0.010000 3.800000 ( 3.824344)
205
+
206
+ $ ruby187 -s mybench2.rb -N=10000
207
+ user system total real
208
+ ERB 16.410000 0.050000 16.460000 ( 16.549911)
209
+ ERB (reused) 5.880000 0.010000 5.890000 ( 5.930305)
210
+ ERB (defmethod) 3.850000 0.010000 3.860000 ( 3.883939)
211
+ Erubis::Eruby#result 9.320000 0.030000 9.350000 ( 9.394255)
212
+ Erubis::Eruby#evaluate 9.400000 0.020000 9.420000 ( 9.471952)
213
+ Erubis::Eruby#result (reused) 5.680000 0.010000 5.690000 ( 5.737928)
214
+ Erubis::Eruby#evaluate (reused) 3.960000 0.010000 3.970000 ( 3.992922)
215
+ Erubis::Eruby (defmethod) 3.850000 0.010000 3.860000 ( 3.896049)
216
+ Erubis::Eruby (defmethod#2) 3.850000 0.010000 3.860000 ( 3.872664)
217
+
218
+ $ ruby191 -s mybench2.rb -N=10000
219
+ user system total real
220
+ ERB 14.370000 0.050000 14.420000 ( 14.469204)
221
+ ERB (reused) 7.150000 0.030000 7.180000 ( 7.207674)
222
+ ERB (defmethod) 3.940000 0.010000 3.950000 ( 3.983292)
223
+ Erubis::Eruby#result 9.320000 0.040000 9.360000 ( 9.423159)
224
+ Erubis::Eruby#evaluate 9.550000 0.040000 9.590000 ( 9.659015)
225
+ Erubis::Eruby#result (reused) 6.420000 0.020000 6.440000 ( 6.479266)
226
+ Erubis::Eruby#evaluate (reused) 3.830000 0.020000 3.850000 ( 3.876132)
227
+ Erubis::Eruby (defmethod) 3.690000 0.010000 3.700000 ( 3.726208)
228
+ Erubis::Eruby (defmethod#2) 3.690000 0.020000 3.710000 ( 3.715565)
229
+
230
+ --------------------------------------------------------------------------------
231
+
232
+ $ ruby186 -s mybench2.rb -N=10000
233
+ user system total real
234
+ ERB 30.880000 0.240000 31.120000 ( 33.366328)
235
+ ERB (reused) 9.280000 0.070000 9.350000 ( 10.036719)
236
+ ERB (defmethod) 5.030000 0.040000 5.070000 ( 5.387336)
237
+ Erubis::Eruby#result 9.460000 0.070000 9.530000 ( 10.171072)
238
+ Erubis::Eruby#evaluate 9.540000 0.070000 9.610000 ( 10.289576)
239
+ Erubis::Eruby#result (reused) 5.830000 0.050000 5.880000 ( 6.286742)
240
+ Erubis::Eruby#evaluate (reused) 3.990000 0.030000 4.020000 ( 4.330680)
241
+ Erubis::Eruby (defmethod) 3.890000 0.030000 3.920000 ( 4.189439)
242
+ Erubis::Eruby (defmethod#2) 3.910000 0.030000 3.940000 ( 4.223124)
243
+
244
+ $ ruby187 -s mybench2.rb -N=10000
245
+ user system total real
246
+ ERB 16.950000 0.140000 17.090000 ( 18.276843)
247
+ ERB (reused) 6.100000 0.050000 6.150000 ( 6.578923)
248
+ ERB (defmethod) 3.990000 0.030000 4.020000 ( 4.314654)
249
+ Erubis::Eruby#result 9.690000 0.080000 9.770000 ( 10.467531)
250
+ Erubis::Eruby#evaluate 9.770000 0.080000 9.850000 ( 10.539132)
251
+ Erubis::Eruby#result (reused) 5.940000 0.040000 5.980000 ( 6.434127)
252
+ Erubis::Eruby#evaluate (reused) 4.110000 0.030000 4.140000 ( 4.424622)
253
+ Erubis::Eruby (defmethod) 3.990000 0.030000 4.020000 ( 4.292276)
254
+ Erubis::Eruby (defmethod#2) 3.990000 0.040000 4.030000 ( 4.332821)
255
+
256
+ $ ruby191 -s mybench2.rb -N=10000
257
+ user system total real
258
+ ERB 14.850000 0.150000 15.000000 ( 16.020819)
259
+ ERB (reused) 7.400000 0.070000 7.470000 ( 7.971797)
260
+ ERB (defmethod) 4.090000 0.030000 4.120000 ( 4.477900)
261
+ Erubis::Eruby#result 9.720000 0.100000 9.820000 ( 10.486989)
262
+ Erubis::Eruby#evaluate 9.930000 0.100000 10.030000 ( 10.720467)
263
+ Erubis::Eruby#result (reused) 6.660000 0.060000 6.720000 ( 7.201429)
264
+ Erubis::Eruby#evaluate (reused) 3.960000 0.040000 4.000000 ( 4.265177)
265
+ Erubis::Eruby (defmethod) 3.810000 0.040000 3.850000 ( 4.130089)
266
+ Erubis::Eruby (defmethod#2) 3.810000 0.030000 3.840000 ( 4.096473)
@@ -0,0 +1,163 @@
1
+
2
+ require 'yaml'
3
+ require 'benchmark'
4
+ require 'eruby'
5
+ require 'erb'
6
+ require 'erubis'
7
+ require 'erubis/tiny'
8
+ require 'erubis/engine/enhanced'
9
+
10
+
11
+ ## default values
12
+ ntime = 10000
13
+ filename = 'erubybench.rhtml'
14
+ show_code = false
15
+ show_output = false
16
+ show_help = false
17
+
18
+ ## parse command-line options
19
+ while ARGV[0] && ARGV[0][0] == ?-
20
+ option = ARGV.shift
21
+ case option
22
+ when '-n'
23
+ raise "-n: argument required." if ARGV.empty?
24
+ ntime = ARGV.shift.to_i
25
+ when '-f'
26
+ raise "-f: argument required." if ARGV.empty?
27
+ filename = ARGV.shift
28
+ when '-c'
29
+ show_code = true
30
+ when '-o'
31
+ show_output = true
32
+ when '-h'
33
+ show_help = true
34
+ else
35
+ raise "#{option}: unknown option."
36
+ end
37
+ end
38
+
39
+
40
+ ## show help
41
+ if show_help
42
+ script = File.basename($0)
43
+ puts "usage: ruby #{script} [-h] [-c] [-o] [-n N] [-f filename] > /dev/null"
44
+ puts " -h: show help"
45
+ puts " -c: show ruby code"
46
+ puts " -o: show output"
47
+ puts " -n N: repeat N times in benchmark"
48
+ puts " -f file: eRuby file (*.rhtml) for benchmark"
49
+ exit
50
+ end
51
+
52
+
53
+ ## load data for benchmark
54
+ ydoc = YAML.load_file('erubybench.yaml')
55
+ data = []
56
+ ydoc['data'].each do |hash|
57
+ #data << hash.inject({}) { |h, t| h[t[0].intern] = t[1]; h }
58
+ h = {}; hash.each { |k, v| h[k.intern] = v } ; data << h
59
+ end
60
+ data = data.sort_by { |h| h[:code] }
61
+ #require 'pp'; pp data
62
+
63
+
64
+ ## eRuby string
65
+ input1 = File.read(filename)
66
+ input2 = input1.gsub(/<%==\s*(.*?)\s*%>/m, '@{\1}@').gsub(/<%=\s*(.*?)\s*%>/m, '@!{\1}@')
67
+ input2 = input2.gsub(/<%(.*?)%>/m, '<?rb\1?>')
68
+
69
+
70
+ ## procedure objects for benchmark
71
+ code = nil
72
+ convert_procs = [
73
+ ['eruby',
74
+ proc { code = ERuby::Compiler.new.compile_string(input1) } ],
75
+ # ['ERB',
76
+ # proc { code = ERB.new(input1).src } ],
77
+ ['Erubis::Eruby',
78
+ proc { code = Erubis::Eruby.new.convert(input1) } ],
79
+ ['Erubis::StringBufferEruby',
80
+ proc { code = Erubis::StringBufferEruby.new.convert(input1) } ],
81
+ ['Erubis::StdoutEruby',
82
+ proc { code = Erubis::StdoutEruby.new.convert(input1) } ],
83
+ ['Erubis::PI::Eruby',
84
+ proc { code = Erubis::PI::Eruby.new.convert(input2) } ],
85
+ ['Erubis::TinyEruby',
86
+ proc { code = Erubis::TinyEruby.new.convert(input1) } ],
87
+ ['Erubis::PI::TinyEruby',
88
+ proc { code = Erubis::PI::TinyEruby.new.convert(input2) } ],
89
+ ]
90
+
91
+ evaluate_procs = [
92
+ ['eruby',
93
+ proc { ERuby::load(filename) } ],
94
+ # ['ERB',
95
+ # proc { print ERB.new(input1).result() } ],
96
+ ['Erubis::Eruby',
97
+ proc { print Erubis::Eruby.new.process(input1, binding()) } ],
98
+ ['Erubis::StringBufferEruby',
99
+ proc { print Erubis::StringBufferEruby.new.process(input1, binding()) } ],
100
+ ['Erubis::StdoutEruby',
101
+ proc { Erubis::StdoutEruby.new.process(input1, binding()) } ],
102
+ ['Erubis::PI::Eruby',
103
+ proc { print Erubis::PI::Eruby.new.process(input2, binding()) } ],
104
+ ['Erubis::TinyEruby',
105
+ proc { print eval(Erubis::TinyEruby.new.convert(input1)) } ],
106
+ ['Erubis::PI::TinyEruby',
107
+ proc { print eval(Erubis::PI::TinyEruby.new.convert(input2)) } ],
108
+ ]
109
+
110
+
111
+ ## change benchmark library to use $stderr instead of $stdout
112
+ require 'benchmark'
113
+ module Benchmark
114
+ class Report
115
+ def print(*args)
116
+ $stderr.print(*args)
117
+ end
118
+ end
119
+ module_function
120
+ def print(*args)
121
+ $stderr.print(*args)
122
+ end
123
+ end
124
+
125
+ ## show code or output
126
+ if show_code
127
+ convert_procs.each do |classname, proc_obj|
128
+ puts "---- #{classname} ----"
129
+ puts proc_obj.call
130
+ end
131
+ exit
132
+ end
133
+
134
+ if show_output
135
+ evaluate_procs.each do |classname, proc_obj|
136
+ puts "---- #{classname} ---"
137
+ proc_obj.call
138
+ end
139
+ exit
140
+ end
141
+
142
+
143
+ ## do benchmark
144
+ width = 30
145
+ $stderr.puts "*** benchmark result of convertion *.rhtml into ruby code"
146
+ Benchmark.bm(width) do |x|
147
+ GC.start()
148
+ convert_procs.each do |classname, proc_obj|
149
+ x.report(classname) do
150
+ ntime.times(&proc_obj)
151
+ end
152
+ end
153
+ end
154
+ $stderr.puts
155
+ $stderr.puts "*** benchmark result of evaluation of *.rhtml"
156
+ Benchmark.bm(width) do |x|
157
+ GC.start()
158
+ evaluate_procs.each do |classname, proc_obj|
159
+ x.report(classname) do
160
+ ntime.times(&proc_obj)
161
+ end
162
+ end
163
+ end
@@ -0,0 +1,4 @@
1
+ </table>
2
+
3
+ </body>
4
+ </html>
@@ -0,0 +1,52 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
3
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
4
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
5
+ <head>
6
+ <title>Stock Prices</title>
7
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
8
+ <meta http-equiv="Content-Style-Type" content="text/css" />
9
+ <meta http-equiv="Content-Script-Type" content="text/javascript" />
10
+ <link rel="shortcut icon" href="/images/favicon.ico" />
11
+ <link rel="stylesheet" type="text/css" href="/css/style.css" media="all" />
12
+ <script type="text/javascript" src="/js/util.js"></script>
13
+ <style type="text/css">
14
+ /*<![CDATA[*/
15
+
16
+ body {
17
+ color: #333333;
18
+ line-height: 150%;
19
+ }
20
+
21
+ thead {
22
+ font-weight: bold;
23
+ background-color: #CCCCCC;
24
+ }
25
+
26
+ .odd {
27
+ background-color: #FFCCCC;
28
+ }
29
+
30
+ .even {
31
+ background-color: #CCCCFF;
32
+ }
33
+
34
+ .minus {
35
+ color: #FF0000;
36
+ }
37
+
38
+ /*]]>*/
39
+ </style>
40
+
41
+ </head>
42
+
43
+ <body>
44
+
45
+ <h1>Stock Prices</h1>
46
+
47
+ <table>
48
+ <thead>
49
+ <tr>
50
+ <th>#</th><th>symbol</th><th>name</th><th>price</th><th>change</th><th>ratio</th>
51
+ </tr>
52
+ </thead>