teepee 0.15.7 → 0.15.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/teepee/commander-mixins/boolean.rb +147 -0
- data/lib/teepee/commander-mixins/control.rb +189 -0
- data/lib/teepee/commander-mixins/formatting.rb +206 -0
- data/lib/teepee/commander-mixins/mathematics.rb +296 -0
- data/lib/teepee/commander-mixins/thinking-bicycle-models.rb +134 -0
- data/lib/teepee/commander.rb +13 -759
- metadata +7 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a354469b71690050b06422444c866f6add0e2a3b
|
4
|
+
data.tar.gz: 420ad93e8d5475b06e6a511c5783eb09e8bed1f6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fc12e333e13cc8dbfac1f8eac67ff572820452a8972acd02db6ee5e98c2254547d5948d05b6a4d6befc4f3854b1747c91fb1ac6a4c0252504822bcf11186d210
|
7
|
+
data.tar.gz: 9387b9da0c147e875debf1903e43c95fa386616649a2668e4b7525255d9f97915170d183306882967a469dfe340878e5aee0970297ec5d9c897867388e0c1dd7
|
@@ -0,0 +1,147 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
# -*- mode: Ruby -*-
|
3
|
+
|
4
|
+
# Copyright © 2013-2016, Christopher Mark Gore,
|
5
|
+
# Soli Deo Gloria,
|
6
|
+
# All rights reserved.
|
7
|
+
#
|
8
|
+
# 2317 South River Road, Saint Charles, Missouri 63303 USA.
|
9
|
+
# Web: http://cgore.com
|
10
|
+
# Email: cgore@cgore.com
|
11
|
+
#
|
12
|
+
# Redistribution and use in source and binary forms, with or without
|
13
|
+
# modification, are permitted provided that the following conditions are met:
|
14
|
+
#
|
15
|
+
# * Redistributions of source code must retain the above copyright
|
16
|
+
# notice, this list of conditions and the following disclaimer.
|
17
|
+
#
|
18
|
+
# * Redistributions in binary form must reproduce the above copyright
|
19
|
+
# notice, this list of conditions and the following disclaimer in the
|
20
|
+
# documentation and/or other materials provided with the distribution.
|
21
|
+
#
|
22
|
+
# * Neither the name of Christopher Mark Gore nor the names of other
|
23
|
+
# contributors may be used to endorse or promote products derived from
|
24
|
+
# this software without specific prior written permission.
|
25
|
+
#
|
26
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
27
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
28
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
29
|
+
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
30
|
+
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
31
|
+
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
32
|
+
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
33
|
+
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
34
|
+
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
35
|
+
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
36
|
+
# POSSIBILITY OF SUCH DAMAGE.
|
37
|
+
|
38
|
+
|
39
|
+
module Teepee
|
40
|
+
module CommanderMixins
|
41
|
+
module Boolean
|
42
|
+
def ensure_boolean boolean
|
43
|
+
if boolean.to_html == "true" or boolean.to_html == "false"
|
44
|
+
boolean
|
45
|
+
else
|
46
|
+
command_error "Non-boolean value."
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def true_constant
|
51
|
+
"true"
|
52
|
+
end
|
53
|
+
|
54
|
+
def false_constant
|
55
|
+
"false"
|
56
|
+
end
|
57
|
+
|
58
|
+
def true_constant? expression
|
59
|
+
expression.to_html == "true"
|
60
|
+
end
|
61
|
+
|
62
|
+
def false_constant? expression
|
63
|
+
expression.to_html == "false"
|
64
|
+
end
|
65
|
+
|
66
|
+
def boolean_and booleans
|
67
|
+
if booleans.empty?
|
68
|
+
return true_constant
|
69
|
+
end
|
70
|
+
b = booleans.first.to_html
|
71
|
+
if false_constant? b
|
72
|
+
false_constant
|
73
|
+
elsif true_constant? b or booleans.first.kind_of? WhitespaceToken
|
74
|
+
boolean_and booleans[1..-1]
|
75
|
+
else
|
76
|
+
command_error "Not a boolean value #{booleans.first}"
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def boolean_nand booleans
|
81
|
+
boolean_not boolean_and booleans
|
82
|
+
end
|
83
|
+
|
84
|
+
def boolean_nor booleans
|
85
|
+
boolean_not boolean_or booleans
|
86
|
+
end
|
87
|
+
|
88
|
+
def boolean_not boolean
|
89
|
+
boolean = boolean.to_html
|
90
|
+
if true_constant? boolean
|
91
|
+
false_constant
|
92
|
+
elsif false_constant? boolean
|
93
|
+
true_constant
|
94
|
+
else
|
95
|
+
command_error "Not a boolean value"
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def boolean_or booleans
|
100
|
+
if booleans.empty?
|
101
|
+
return false_constant
|
102
|
+
end
|
103
|
+
b = booleans.first.to_html
|
104
|
+
if true_constant? b
|
105
|
+
true_constant
|
106
|
+
elsif false_constant? b or booleans.first.kind_of? WhitespaceToken
|
107
|
+
boolean_or booleans[1..-1]
|
108
|
+
else
|
109
|
+
command_error "Not a boolean value"
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
def boolean_xnor booleans
|
114
|
+
boolean_not boolean_xor booleans
|
115
|
+
end
|
116
|
+
|
117
|
+
def boolean_xor booleans
|
118
|
+
# There are two schools of thought as to what a multi-variable XOR is.
|
119
|
+
# 1. Chained XORs, giving a parity check.
|
120
|
+
# 2. 'Exclusively' one true for ALL inputs.
|
121
|
+
# I'm going with the second: one and only one true, the rest false.
|
122
|
+
# It seems therefore that the zero-argument version should be false then.
|
123
|
+
if booleans.empty?
|
124
|
+
false_constant
|
125
|
+
else
|
126
|
+
any_trues = false
|
127
|
+
booleans.each do |boolean|
|
128
|
+
if true_constant? boolean
|
129
|
+
if any_trues
|
130
|
+
return false_constant
|
131
|
+
else
|
132
|
+
any_trues = true
|
133
|
+
end
|
134
|
+
elsif false_constant? boolean
|
135
|
+
# do nothing
|
136
|
+
elsif boolean.kind_of? WhitespaceToken
|
137
|
+
# do nothing
|
138
|
+
else
|
139
|
+
return command_error "Not a boolean value"
|
140
|
+
end
|
141
|
+
end
|
142
|
+
return any_trues.to_html
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
@@ -0,0 +1,189 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
# -*- mode: Ruby -*-
|
3
|
+
|
4
|
+
# Copyright © 2013-2016, Christopher Mark Gore,
|
5
|
+
# Soli Deo Gloria,
|
6
|
+
# All rights reserved.
|
7
|
+
#
|
8
|
+
# 2317 South River Road, Saint Charles, Missouri 63303 USA.
|
9
|
+
# Web: http://cgore.com
|
10
|
+
# Email: cgore@cgore.com
|
11
|
+
#
|
12
|
+
# Redistribution and use in source and binary forms, with or without
|
13
|
+
# modification, are permitted provided that the following conditions are met:
|
14
|
+
#
|
15
|
+
# * Redistributions of source code must retain the above copyright
|
16
|
+
# notice, this list of conditions and the following disclaimer.
|
17
|
+
#
|
18
|
+
# * Redistributions in binary form must reproduce the above copyright
|
19
|
+
# notice, this list of conditions and the following disclaimer in the
|
20
|
+
# documentation and/or other materials provided with the distribution.
|
21
|
+
#
|
22
|
+
# * Neither the name of Christopher Mark Gore nor the names of other
|
23
|
+
# contributors may be used to endorse or promote products derived from
|
24
|
+
# this software without specific prior written permission.
|
25
|
+
#
|
26
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
27
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
28
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
29
|
+
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
30
|
+
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
31
|
+
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
32
|
+
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
33
|
+
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
34
|
+
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
35
|
+
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
36
|
+
# POSSIBILITY OF SUCH DAMAGE.
|
37
|
+
|
38
|
+
|
39
|
+
module Teepee
|
40
|
+
module CommanderMixins
|
41
|
+
module Control
|
42
|
+
def case_operator expressions
|
43
|
+
value, _, *rest = strip expressions
|
44
|
+
if value and not rest.empty?
|
45
|
+
def cond_helper value, expressions
|
46
|
+
test_value, _, form, *rest = strip expressions
|
47
|
+
if equal [value.to_html, test_value.to_html]
|
48
|
+
form
|
49
|
+
elsif not rest.empty?
|
50
|
+
cond_helper value, rest
|
51
|
+
end
|
52
|
+
end
|
53
|
+
cond_helper value, rest
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def comment expressions
|
58
|
+
nil
|
59
|
+
end
|
60
|
+
|
61
|
+
def cond_operator expressions
|
62
|
+
conditional, _, form, *rest = strip expressions
|
63
|
+
if true_constant? conditional.to_html
|
64
|
+
form
|
65
|
+
elsif not rest.empty?
|
66
|
+
cond_operator rest
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def decrement variable
|
71
|
+
return variable_not_defined_error variable if not is_defined? variable
|
72
|
+
old_value = get_operator(variable).to_number
|
73
|
+
return non_numeric_error old_value if not numeric? old_value
|
74
|
+
@parser.variables[variable.to_html] = old_value - 1
|
75
|
+
end
|
76
|
+
|
77
|
+
def define expressions
|
78
|
+
variable, _, value = expressions
|
79
|
+
k = variable.to_html
|
80
|
+
v = value.to_html
|
81
|
+
@parser.variables[k] = v
|
82
|
+
get_operator k
|
83
|
+
end
|
84
|
+
|
85
|
+
def is_defined? variables
|
86
|
+
if not variables.is_a? Array
|
87
|
+
return is_defined? [variables]
|
88
|
+
elsif Set.new(variables.map(&:to_html)).subset? Set.new(@parser.variables.keys)
|
89
|
+
true_constant
|
90
|
+
else
|
91
|
+
false_constant
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def dotimes expressions
|
96
|
+
n = expressions.first.to_number
|
97
|
+
return "" if n.nil? or n < 1
|
98
|
+
span_operator expressions[1..-1] * n
|
99
|
+
end
|
100
|
+
|
101
|
+
def equal expressions
|
102
|
+
if expressions.empty?
|
103
|
+
true_constant
|
104
|
+
elsif expressions.length == 1
|
105
|
+
true_constant
|
106
|
+
else
|
107
|
+
expressions[0].to_html == expressions[1].to_html and equal expressions.rest
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
def get_operator variable
|
112
|
+
@parser.variables[variable.to_html].to_html
|
113
|
+
end
|
114
|
+
|
115
|
+
def if_operator expressions
|
116
|
+
expressions = strip expressions
|
117
|
+
conditional, _, true_clause, _, false_clause = expressions
|
118
|
+
if true_constant? conditional.to_html
|
119
|
+
true_clause.to_html
|
120
|
+
elsif false_clause
|
121
|
+
false_clause.to_html
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
def increment variable
|
126
|
+
return variable_not_defined_error variable if not is_defined? variable
|
127
|
+
old_value = get_operator(variable).to_number
|
128
|
+
return non_numeric_error old_value if not numeric? old_value
|
129
|
+
@parser.variables[variable.to_html] = old_value + 1
|
130
|
+
end
|
131
|
+
|
132
|
+
def not_equal numbers
|
133
|
+
if numbers.empty?
|
134
|
+
true_constant
|
135
|
+
elsif numbers.length == 1
|
136
|
+
true_constant
|
137
|
+
else
|
138
|
+
numbers[0].to_number != numbers[1].to_number and equal numbers.rest
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
def prog1_operator expressions
|
143
|
+
expressions.map(&:to_html).first
|
144
|
+
end
|
145
|
+
|
146
|
+
def progn_operator expressions
|
147
|
+
expressions.map(&:to_html).last
|
148
|
+
end
|
149
|
+
|
150
|
+
def prognil expressions
|
151
|
+
expressions.map(&:to_html)
|
152
|
+
""
|
153
|
+
end
|
154
|
+
|
155
|
+
def undefine expressions
|
156
|
+
expressions.each do |expression|
|
157
|
+
@parser.variables.delete expression.to_html
|
158
|
+
end
|
159
|
+
""
|
160
|
+
end
|
161
|
+
|
162
|
+
def unless_operator expressions
|
163
|
+
expressions = strip expressions
|
164
|
+
conditional = expressions.first
|
165
|
+
expressions = strip expressions.rest
|
166
|
+
if false_constant? conditional.to_html
|
167
|
+
if expressions.length <= 1
|
168
|
+
expressions.first
|
169
|
+
else
|
170
|
+
span_operator expressions
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
def when_operator expressions
|
176
|
+
expressions = strip expressions
|
177
|
+
conditional = expressions.first
|
178
|
+
expressions = strip expressions.rest
|
179
|
+
if true_constant? conditional.to_html
|
180
|
+
if expressions.length <= 1
|
181
|
+
expressions.first
|
182
|
+
else
|
183
|
+
span_operator expressions
|
184
|
+
end
|
185
|
+
end
|
186
|
+
end
|
187
|
+
end
|
188
|
+
end
|
189
|
+
end
|
@@ -0,0 +1,206 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
# -*- mode: Ruby -*-
|
3
|
+
|
4
|
+
# Copyright © 2013-2016, Christopher Mark Gore,
|
5
|
+
# Soli Deo Gloria,
|
6
|
+
# All rights reserved.
|
7
|
+
#
|
8
|
+
# 2317 South River Road, Saint Charles, Missouri 63303 USA.
|
9
|
+
# Web: http://cgore.com
|
10
|
+
# Email: cgore@cgore.com
|
11
|
+
#
|
12
|
+
# Redistribution and use in source and binary forms, with or without
|
13
|
+
# modification, are permitted provided that the following conditions are met:
|
14
|
+
#
|
15
|
+
# * Redistributions of source code must retain the above copyright
|
16
|
+
# notice, this list of conditions and the following disclaimer.
|
17
|
+
#
|
18
|
+
# * Redistributions in binary form must reproduce the above copyright
|
19
|
+
# notice, this list of conditions and the following disclaimer in the
|
20
|
+
# documentation and/or other materials provided with the distribution.
|
21
|
+
#
|
22
|
+
# * Neither the name of Christopher Mark Gore nor the names of other
|
23
|
+
# contributors may be used to endorse or promote products derived from
|
24
|
+
# this software without specific prior written permission.
|
25
|
+
#
|
26
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
27
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
28
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
29
|
+
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
30
|
+
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
31
|
+
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
32
|
+
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
33
|
+
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
34
|
+
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
35
|
+
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
36
|
+
# POSSIBILITY OF SUCH DAMAGE.
|
37
|
+
|
38
|
+
|
39
|
+
module Teepee
|
40
|
+
module CommanderMixins
|
41
|
+
module Formatting
|
42
|
+
def html_tag tag, expressions, attribs=nil
|
43
|
+
opening_tag = if attribs
|
44
|
+
attribs_string = attribs.map {|k,v| %{#{k}="#{v}"}}.join " "
|
45
|
+
if expressions.nil?
|
46
|
+
"<#{tag} #{attribs_string}/>"
|
47
|
+
else
|
48
|
+
"<#{tag} #{attribs_string}>"
|
49
|
+
end
|
50
|
+
else
|
51
|
+
if expressions.nil?
|
52
|
+
"<#{tag}/>"
|
53
|
+
else
|
54
|
+
"<#{tag}>"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
if expressions.nil?
|
58
|
+
opening_tag
|
59
|
+
else
|
60
|
+
opening_tag + expressions.map(&:to_html).join.strip + "</#{tag}>"
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def b expressions
|
65
|
+
html_tag :b, expressions
|
66
|
+
end
|
67
|
+
|
68
|
+
def big expressions
|
69
|
+
html_tag :big, expressions
|
70
|
+
end
|
71
|
+
|
72
|
+
def br
|
73
|
+
html_tag :br, nil
|
74
|
+
end
|
75
|
+
|
76
|
+
def del expressions
|
77
|
+
html_tag :del, expressions
|
78
|
+
end
|
79
|
+
|
80
|
+
def enumerate expressions
|
81
|
+
html_tag :ol, expressions
|
82
|
+
end
|
83
|
+
|
84
|
+
def enumerate_numeric expressions
|
85
|
+
html_tag :ol, expressions, {type: "1"}
|
86
|
+
end
|
87
|
+
|
88
|
+
def enumerate_uppercase expressions
|
89
|
+
html_tag :ol, expressions, {type: "A"}
|
90
|
+
end
|
91
|
+
|
92
|
+
def enumerate_lowercase expressions
|
93
|
+
html_tag :ol, expressions, {type: "a"}
|
94
|
+
end
|
95
|
+
|
96
|
+
def enumerate_roman_uppercase expressions
|
97
|
+
html_tag :ol, expressions, {type: "I"}
|
98
|
+
end
|
99
|
+
|
100
|
+
def enumerate_roman_lowercase expressions
|
101
|
+
html_tag :ol, expressions, {type: "i"}
|
102
|
+
end
|
103
|
+
|
104
|
+
def h1 expressions
|
105
|
+
html_tag :h1, expressions
|
106
|
+
end
|
107
|
+
|
108
|
+
def h2 expressions
|
109
|
+
html_tag :h2, expressions
|
110
|
+
end
|
111
|
+
|
112
|
+
def h3 expressions
|
113
|
+
html_tag :h3, expressions
|
114
|
+
end
|
115
|
+
|
116
|
+
def h4 expressions
|
117
|
+
html_tag :h4, expressions
|
118
|
+
end
|
119
|
+
|
120
|
+
def h5 expressions
|
121
|
+
html_tag :h5, expressions
|
122
|
+
end
|
123
|
+
|
124
|
+
def h6 expressions
|
125
|
+
html_tag :h6, expressions
|
126
|
+
end
|
127
|
+
|
128
|
+
def it expressions
|
129
|
+
html_tag :i, expressions
|
130
|
+
end
|
131
|
+
|
132
|
+
def item expressions
|
133
|
+
html_tag :li, expressions
|
134
|
+
end
|
135
|
+
|
136
|
+
def itemize expressions
|
137
|
+
html_tag :ul, expressions
|
138
|
+
end
|
139
|
+
|
140
|
+
def itemize_disc expressions
|
141
|
+
html_tag :ul, expressions, {style: "list-style-type:disc"}
|
142
|
+
end
|
143
|
+
|
144
|
+
def itemize_circle expressions
|
145
|
+
html_tag :ul, expressions, {style: "list-style-type:circle"}
|
146
|
+
end
|
147
|
+
|
148
|
+
def itemize_square expressions
|
149
|
+
html_tag :ul, expressions, {style: "list-style-type:square"}
|
150
|
+
end
|
151
|
+
|
152
|
+
def itemize_none expressions
|
153
|
+
html_tag :ul, expressions, {style: "list-style-type:none"}
|
154
|
+
end
|
155
|
+
|
156
|
+
def nbsp count
|
157
|
+
if count and count.to_number and count.to_number > 0
|
158
|
+
" " * count.to_number
|
159
|
+
else
|
160
|
+
" "
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
def small expressions
|
165
|
+
html_tag :small, expressions
|
166
|
+
end
|
167
|
+
|
168
|
+
def span_operator expressions
|
169
|
+
html_tag :span, expressions
|
170
|
+
end
|
171
|
+
|
172
|
+
def sub expressions
|
173
|
+
html_tag :sub, expressions
|
174
|
+
end
|
175
|
+
|
176
|
+
def sup expressions
|
177
|
+
html_tag :sup, expressions
|
178
|
+
end
|
179
|
+
|
180
|
+
def table expressions
|
181
|
+
html_tag :table, expressions
|
182
|
+
end
|
183
|
+
|
184
|
+
def table_data expressions
|
185
|
+
html_tag :td, expressions
|
186
|
+
end
|
187
|
+
|
188
|
+
def table_header expressions
|
189
|
+
html_tag :th, expressions
|
190
|
+
end
|
191
|
+
|
192
|
+
def table_row expressions
|
193
|
+
html_tag :tr, expressions
|
194
|
+
end
|
195
|
+
|
196
|
+
def tt expressions
|
197
|
+
html_tag :tt, expressions
|
198
|
+
end
|
199
|
+
|
200
|
+
def u expressions
|
201
|
+
html_tag :u, expressions
|
202
|
+
end
|
203
|
+
|
204
|
+
end
|
205
|
+
end
|
206
|
+
end
|