teepee 0.12.11 → 0.13.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/teepee.rb +12 -0
- data/lib/teepee/command-parser.rb +43 -48
- data/lib/teepee/commander.rb +133 -103
- data/lib/teepee/parser-node.rb +4 -1
- data/lib/teepee/string-token.rb +4 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 42fae0e05a81b055eff93f9792ca84f040d9ea1a
|
4
|
+
data.tar.gz: 099f7492b8b97be7aa1c48257f0b646b71923ec1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3050382db418cdb90fd951a6abfadfe0cca28ea7b5393cc54681d50b2247a69c7002158001ea2efebb08929ce06e455443c79ccf297fb4d95968e04acdd6c4c7
|
7
|
+
data.tar.gz: 918acc5ca1a16a90ce520e0aac23d68ba86043d0cc26ff98e437801811786d3cb45134edda35bec21cf084be6a1c290957b98750bf719eade9697ab0b535ceb8
|
data/lib/teepee.rb
CHANGED
@@ -43,6 +43,18 @@ require 'monkey-patch'
|
|
43
43
|
|
44
44
|
include ERB::Util
|
45
45
|
|
46
|
+
class Float
|
47
|
+
def to_number
|
48
|
+
self
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
class Integer
|
53
|
+
def to_number
|
54
|
+
self
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
46
58
|
require 'teepee/constants'
|
47
59
|
require 'teepee/errors'
|
48
60
|
require 'teepee/parser-node'
|
@@ -62,6 +62,10 @@ module Teepee
|
|
62
62
|
%{<span style="color: red">[#{message}]</span>}
|
63
63
|
end
|
64
64
|
|
65
|
+
def to_number
|
66
|
+
to_html.to_number
|
67
|
+
end
|
68
|
+
|
65
69
|
def to_html
|
66
70
|
case command.word
|
67
71
|
when "backslash",
|
@@ -116,7 +120,7 @@ module Teepee
|
|
116
120
|
when "dollar"
|
117
121
|
@@commander.dollar
|
118
122
|
when "_"
|
119
|
-
@@commander.nbsp
|
123
|
+
@@commander.nbsp optional_first_word_token
|
120
124
|
when "space"
|
121
125
|
@@commander.space
|
122
126
|
when "br", "newline"
|
@@ -302,67 +306,67 @@ module Teepee
|
|
302
306
|
when "e"
|
303
307
|
@@commander.e
|
304
308
|
when "+"
|
305
|
-
@@commander.+
|
309
|
+
@@commander.+ word_tokens
|
306
310
|
when "-"
|
307
|
-
@@commander.-
|
311
|
+
@@commander.- word_tokens
|
308
312
|
when "*"
|
309
|
-
@@commander.*
|
313
|
+
@@commander.* word_tokens
|
310
314
|
when "/",
|
311
315
|
"÷"
|
312
|
-
@@commander./
|
316
|
+
@@commander./ word_tokens
|
313
317
|
when "%"
|
314
|
-
@@commander.%
|
318
|
+
@@commander.% word_tokens
|
315
319
|
when "+%"
|
316
|
-
@@commander.add_percentage
|
320
|
+
@@commander.add_percentage word_tokens
|
317
321
|
when "-%"
|
318
|
-
@@commander.subtract_percentage
|
322
|
+
@@commander.subtract_percentage word_tokens
|
319
323
|
when "%t",
|
320
324
|
"%total"
|
321
|
-
@@commander.percent_total
|
325
|
+
@@commander.percent_total word_tokens
|
322
326
|
when "floor"
|
323
|
-
@@commander.floor
|
327
|
+
@@commander.floor first_word_token
|
324
328
|
when "ceil",
|
325
329
|
"ciel",
|
326
330
|
"ceiling"
|
327
|
-
@@commander.ceiling
|
331
|
+
@@commander.ceiling first_word_token
|
328
332
|
when "round"
|
329
|
-
@@commander.round *
|
333
|
+
@@commander.round *word_tokens
|
330
334
|
when "mod",
|
331
335
|
"modulus",
|
332
336
|
"modulo"
|
333
|
-
@@commander.mod
|
337
|
+
@@commander.mod word_tokens
|
334
338
|
when "^", "**"
|
335
|
-
@@commander.**
|
339
|
+
@@commander.** word_tokens
|
336
340
|
when "sin", "cos", "tan",
|
337
341
|
"asin", "acos", "atan",
|
338
342
|
"sinh", "cosh", "tanh",
|
339
343
|
"asinh", "acosh", "atanh",
|
340
344
|
"erf", "erfc",
|
341
345
|
"gamma", "log10", "sqrt"
|
342
|
-
@@commander.send command.word.to_sym,
|
346
|
+
@@commander.send command.word.to_sym, first_word_token
|
343
347
|
when "d2r",
|
344
348
|
"deg->rad",
|
345
349
|
"degrees->radians"
|
346
|
-
@@commander.degrees2radians
|
350
|
+
@@commander.degrees2radians first_word_token
|
347
351
|
when "r2d",
|
348
352
|
"rad->deg",
|
349
353
|
"radians->degrees"
|
350
|
-
@@commander.radians2degrees
|
354
|
+
@@commander.radians2degrees first_word_token
|
351
355
|
when "lgamma"
|
352
|
-
@@commander.lgamma
|
356
|
+
@@commander.lgamma first_word_token
|
353
357
|
when "ld",
|
354
358
|
"log2"
|
355
|
-
@@commander.ld
|
359
|
+
@@commander.ld first_word_token
|
356
360
|
when "ln"
|
357
|
-
@@commander.ln
|
361
|
+
@@commander.ln first_word_token
|
358
362
|
when "log"
|
359
|
-
base, number =
|
363
|
+
base, number = word_tokens
|
360
364
|
@@commander.log base, number
|
361
365
|
when "ldexp"
|
362
|
-
fraction, exponent =
|
366
|
+
fraction, exponent = word_tokens
|
363
367
|
@@commander.ldexp fraction, exponent
|
364
368
|
when "hypot"
|
365
|
-
@@commander.hypot
|
369
|
+
@@commander.hypot word_tokens
|
366
370
|
when "true"
|
367
371
|
@@commander.true_constant
|
368
372
|
when "false"
|
@@ -382,20 +386,20 @@ module Teepee
|
|
382
386
|
when "xnor"
|
383
387
|
@@commander.boolean_xnor expressions
|
384
388
|
when "<"
|
385
|
-
@@commander.less_than
|
389
|
+
@@commander.less_than word_tokens
|
386
390
|
when "<=",
|
387
391
|
"≤"
|
388
|
-
@@commander.less_than_or_equal
|
392
|
+
@@commander.less_than_or_equal word_tokens
|
389
393
|
when ">"
|
390
|
-
@@commander.greater_than
|
394
|
+
@@commander.greater_than word_tokens
|
391
395
|
when ">=",
|
392
396
|
"≥"
|
393
|
-
@@commander.greater_than_or_equal
|
397
|
+
@@commander.greater_than_or_equal word_tokens
|
394
398
|
when "="
|
395
|
-
@@commander.equal
|
399
|
+
@@commander.equal word_tokens
|
396
400
|
when "!=",
|
397
401
|
"≠"
|
398
|
-
@@commander.not_equal
|
402
|
+
@@commander.not_equal word_tokens
|
399
403
|
when "if"
|
400
404
|
@@commander.if_operator expressions
|
401
405
|
when "when"
|
@@ -416,6 +420,10 @@ module Teepee
|
|
416
420
|
@@commander.cond_operator expressions
|
417
421
|
when "case"
|
418
422
|
@@commander.case_operator expressions
|
423
|
+
when "get"
|
424
|
+
@@commander.get_operator first_word_token
|
425
|
+
when "set"
|
426
|
+
@@commander.set_operator expressions
|
419
427
|
else
|
420
428
|
command_error "unknown command #{command.to_html}"
|
421
429
|
end
|
@@ -429,29 +437,16 @@ module Teepee
|
|
429
437
|
%{<a href="#{TB_COM}/#{target}">#{string}</a>}
|
430
438
|
end
|
431
439
|
|
432
|
-
def
|
433
|
-
expressions.
|
434
|
-
end
|
435
|
-
|
436
|
-
def numbers_from_expressions
|
437
|
-
expressions
|
438
|
-
.map do |number|
|
439
|
-
begin
|
440
|
-
Float(number.to_html)
|
441
|
-
rescue ArgumentError
|
442
|
-
nil
|
443
|
-
end
|
444
|
-
end.reject &:nil?
|
440
|
+
def word_tokens
|
441
|
+
expressions.reject {|expr| expr.is_a? WhitespaceToken}
|
445
442
|
end
|
446
443
|
|
447
|
-
def
|
448
|
-
|
444
|
+
def first_word_token
|
445
|
+
word_tokens.first
|
449
446
|
end
|
450
447
|
|
451
|
-
def
|
452
|
-
if not expressions.empty?
|
453
|
-
number_from_expression
|
454
|
-
end
|
448
|
+
def optional_first_word_token
|
449
|
+
first_word_token if not expressions.empty?
|
455
450
|
end
|
456
451
|
|
457
452
|
class << self
|
data/lib/teepee/commander.rb
CHANGED
@@ -37,6 +37,10 @@
|
|
37
37
|
|
38
38
|
module Teepee
|
39
39
|
class Commander
|
40
|
+
def initialize
|
41
|
+
@variables = Hash.new
|
42
|
+
end
|
43
|
+
|
40
44
|
def valid_uri? uri
|
41
45
|
(!! (u = URI.parse(uri))) and not u.scheme.nil?
|
42
46
|
rescue URI::InvalidURIError
|
@@ -148,13 +152,26 @@ module Teepee
|
|
148
152
|
expression.is_a? PipeToken
|
149
153
|
end
|
150
154
|
|
155
|
+
def number_from_word word
|
156
|
+
begin
|
157
|
+
word.to_number
|
158
|
+
rescue ArgumentError, NoMethodError
|
159
|
+
nil
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
def to_numbers words
|
164
|
+
words.map {|word| number_from_word word}.reject &:nil?
|
165
|
+
end
|
166
|
+
|
151
167
|
#----------------------------------------------------------------------------
|
152
168
|
|
153
|
-
def +
|
154
|
-
ensure_numeric numbers.inject 0, :+
|
169
|
+
def + numbers
|
170
|
+
ensure_numeric to_numbers(numbers).inject 0, :+
|
155
171
|
end
|
156
172
|
|
157
|
-
def -
|
173
|
+
def - numbers
|
174
|
+
numbers = to_numbers numbers
|
158
175
|
if numbers.length == 1
|
159
176
|
ensure_numeric -numbers.first
|
160
177
|
else
|
@@ -162,11 +179,12 @@ module Teepee
|
|
162
179
|
end
|
163
180
|
end
|
164
181
|
|
165
|
-
def *
|
166
|
-
ensure_numeric numbers.inject 1, :*
|
182
|
+
def * numbers
|
183
|
+
ensure_numeric to_numbers(numbers).inject 1, :*
|
167
184
|
end
|
168
185
|
|
169
|
-
def /
|
186
|
+
def / numbers
|
187
|
+
numbers = to_numbers numbers
|
170
188
|
if numbers.length == 1
|
171
189
|
ensure_numeric 1 / numbers.first
|
172
190
|
else
|
@@ -174,48 +192,48 @@ module Teepee
|
|
174
192
|
end
|
175
193
|
end
|
176
194
|
|
177
|
-
def **
|
178
|
-
ensure_numeric numbers.reduce :**
|
195
|
+
def ** numbers
|
196
|
+
ensure_numeric to_numbers(numbers).reduce :**
|
179
197
|
end
|
180
198
|
|
181
|
-
def %
|
182
|
-
numbers.inject { |base, percent| base*percent/100.0 }
|
199
|
+
def % numbers
|
200
|
+
to_numbers(numbers).inject { |base, percent| base*percent/100.0 }
|
183
201
|
end
|
184
202
|
|
185
|
-
def add_percentage
|
186
|
-
numbers.inject {|base, percent| base * (1+percent/100.0) }
|
203
|
+
def add_percentage numbers
|
204
|
+
to_numbers(numbers).inject {|base, percent| base * (1+percent/100.0) }
|
187
205
|
end
|
188
206
|
|
189
|
-
def subtract_percentage
|
190
|
-
numbers.inject {|base, percent| base * (1-percent/100.0) }
|
207
|
+
def subtract_percentage numbers
|
208
|
+
to_numbers(numbers).inject {|base, percent| base * (1-percent/100.0) }
|
191
209
|
end
|
192
210
|
|
193
|
-
def percent_total
|
194
|
-
numbers.inject {|total, part| Float(part)/Float(total)*100.0 }
|
211
|
+
def percent_total numbers
|
212
|
+
to_numbers(numbers).inject {|total, part| Float(part)/Float(total)*100.0 }
|
195
213
|
end
|
196
214
|
|
197
|
-
def acos
|
198
|
-
ensure_numeric Math.acos
|
215
|
+
def acos angle
|
216
|
+
ensure_numeric Math.acos angle.to_number
|
199
217
|
end
|
200
218
|
|
201
|
-
def acosh
|
202
|
-
ensure_numeric Math.acosh
|
219
|
+
def acosh angle
|
220
|
+
ensure_numeric Math.acosh angle.to_number
|
203
221
|
end
|
204
222
|
|
205
|
-
def asin
|
206
|
-
ensure_numeric Math.asin
|
223
|
+
def asin angle
|
224
|
+
ensure_numeric Math.asin angle.to_number
|
207
225
|
end
|
208
226
|
|
209
|
-
def asinh
|
210
|
-
ensure_numeric Math.asinh
|
227
|
+
def asinh angle
|
228
|
+
ensure_numeric Math.asinh angle.to_number
|
211
229
|
end
|
212
230
|
|
213
|
-
def atan
|
214
|
-
ensure_numeric Math.atan
|
231
|
+
def atan angle
|
232
|
+
ensure_numeric Math.atan angle.to_number
|
215
233
|
end
|
216
234
|
|
217
|
-
def atanh
|
218
|
-
ensure_numeric Math.atanh
|
235
|
+
def atanh angle
|
236
|
+
ensure_numeric Math.atanh angle.to_number
|
219
237
|
end
|
220
238
|
|
221
239
|
def b expressions
|
@@ -238,72 +256,72 @@ module Teepee
|
|
238
256
|
id_command_handler id, :Folder, "folder", "folders", "folders/bookmarks_inline", "bookmarks"
|
239
257
|
end
|
240
258
|
|
241
|
-
def boolean_and
|
242
|
-
if
|
259
|
+
def boolean_and booleans
|
260
|
+
if booleans.empty?
|
243
261
|
true_constant
|
244
|
-
elsif false_constant?
|
262
|
+
elsif false_constant? booleans.first
|
245
263
|
false_constant
|
246
|
-
elsif true_constant?
|
247
|
-
boolean_and
|
264
|
+
elsif true_constant? booleans.first or booleans.first.kind_of? WhitespaceToken
|
265
|
+
boolean_and booleans[1..-1]
|
248
266
|
else
|
249
|
-
command_error "Not a boolean value #{
|
267
|
+
command_error "Not a boolean value #{booleans.first}"
|
250
268
|
end
|
251
269
|
end
|
252
270
|
|
253
|
-
def boolean_nand
|
254
|
-
boolean_not boolean_and
|
271
|
+
def boolean_nand booleans
|
272
|
+
boolean_not boolean_and booleans
|
255
273
|
end
|
256
274
|
|
257
|
-
def boolean_nor
|
258
|
-
boolean_not boolean_or
|
275
|
+
def boolean_nor booleans
|
276
|
+
boolean_not boolean_or booleans
|
259
277
|
end
|
260
278
|
|
261
|
-
def boolean_not
|
262
|
-
if true_constant?
|
279
|
+
def boolean_not boolean
|
280
|
+
if true_constant? boolean
|
263
281
|
false_constant
|
264
|
-
elsif false_constant?
|
282
|
+
elsif false_constant? boolean
|
265
283
|
true_constant
|
266
284
|
else
|
267
285
|
command_error "Not a boolean value"
|
268
286
|
end
|
269
287
|
end
|
270
288
|
|
271
|
-
def boolean_or
|
272
|
-
if
|
289
|
+
def boolean_or booleans
|
290
|
+
if booleans.empty?
|
273
291
|
false_constant
|
274
|
-
elsif true_constant?
|
292
|
+
elsif true_constant? booleans.first
|
275
293
|
true_constant
|
276
|
-
elsif false_constant?
|
277
|
-
boolean_or
|
294
|
+
elsif false_constant? booleans.first or booleans.first.kind_of? WhitespaceToken
|
295
|
+
boolean_or booleans[1..-1]
|
278
296
|
else
|
279
297
|
command_error "Not a boolean value"
|
280
298
|
end
|
281
299
|
end
|
282
300
|
|
283
|
-
def boolean_xnor
|
284
|
-
boolean_not boolean_xor
|
301
|
+
def boolean_xnor booleans
|
302
|
+
boolean_not boolean_xor booleans
|
285
303
|
end
|
286
304
|
|
287
|
-
def boolean_xor
|
305
|
+
def boolean_xor booleans
|
288
306
|
# There are two schools of thought as to what a multi-variable XOR is.
|
289
307
|
# 1. Chained XORs, giving a parity check.
|
290
308
|
# 2. 'Exclusively' one true for ALL inputs.
|
291
309
|
# I'm going with the second: one and only one true, the rest false.
|
292
310
|
# It seems therefore that the zero-argument version should be false then.
|
293
|
-
if
|
311
|
+
if booleans.empty?
|
294
312
|
false_constant
|
295
313
|
else
|
296
314
|
any_trues = false
|
297
|
-
|
298
|
-
if true_constant?
|
315
|
+
booleans.each do |boolean|
|
316
|
+
if true_constant? boolean
|
299
317
|
if any_trues
|
300
318
|
return false_constant
|
301
319
|
else
|
302
320
|
any_trues = true
|
303
321
|
end
|
304
|
-
elsif false_constant?
|
322
|
+
elsif false_constant? boolean
|
305
323
|
# do nothing
|
306
|
-
elsif
|
324
|
+
elsif boolean.kind_of? WhitespaceToken
|
307
325
|
# do nothing
|
308
326
|
else
|
309
327
|
return command_error "Not a boolean value"
|
@@ -322,7 +340,7 @@ module Teepee
|
|
322
340
|
if value and not rest.empty?
|
323
341
|
def cond_helper value, expressions
|
324
342
|
test_value, _, form, *rest = strip expressions
|
325
|
-
if equal value, test_value
|
343
|
+
if equal [value, test_value]
|
326
344
|
form
|
327
345
|
elsif not rest.empty?
|
328
346
|
cond_helper value, rest
|
@@ -333,7 +351,7 @@ module Teepee
|
|
333
351
|
end
|
334
352
|
|
335
353
|
def ceiling number
|
336
|
-
ensure_numeric number.ceil
|
354
|
+
ensure_numeric number.to_number.ceil
|
337
355
|
end
|
338
356
|
|
339
357
|
def comment expressions
|
@@ -350,15 +368,15 @@ module Teepee
|
|
350
368
|
end
|
351
369
|
|
352
370
|
def cos angle
|
353
|
-
ensure_numeric Math.cos angle
|
371
|
+
ensure_numeric Math.cos angle.to_number
|
354
372
|
end
|
355
373
|
|
356
|
-
def cosh
|
357
|
-
ensure_numeric Math.cosh
|
374
|
+
def cosh angle
|
375
|
+
ensure_numeric Math.cosh angle.to_number
|
358
376
|
end
|
359
377
|
|
360
378
|
def degrees2radians degrees
|
361
|
-
ensure_numeric degrees * Math::PI / 180.0
|
379
|
+
ensure_numeric degrees.to_number * Math::PI / 180.0
|
362
380
|
end
|
363
381
|
|
364
382
|
def del expressions
|
@@ -373,13 +391,13 @@ module Teepee
|
|
373
391
|
Math::E
|
374
392
|
end
|
375
393
|
|
376
|
-
def equal
|
394
|
+
def equal expressions
|
377
395
|
if expressions.empty?
|
378
396
|
true_constant
|
379
397
|
elsif expressions.length == 1
|
380
398
|
true_constant
|
381
399
|
else
|
382
|
-
expressions[0].to_s == expressions[1].to_s and equal
|
400
|
+
expressions[0].to_s == expressions[1].to_s and equal expressions.rest
|
383
401
|
end
|
384
402
|
end
|
385
403
|
|
@@ -408,11 +426,11 @@ module Teepee
|
|
408
426
|
end
|
409
427
|
|
410
428
|
def erf number
|
411
|
-
ensure_numeric Math.erf number
|
429
|
+
ensure_numeric Math.erf number.to_number
|
412
430
|
end
|
413
431
|
|
414
432
|
def erfc number
|
415
|
-
ensure_numeric Math.erfc number
|
433
|
+
ensure_numeric Math.erfc number.to_number
|
416
434
|
end
|
417
435
|
|
418
436
|
def false_constant
|
@@ -420,7 +438,7 @@ module Teepee
|
|
420
438
|
end
|
421
439
|
|
422
440
|
def floor number
|
423
|
-
ensure_numeric number.floor
|
441
|
+
ensure_numeric number.to_number.floor
|
424
442
|
end
|
425
443
|
|
426
444
|
def folder_id id
|
@@ -432,26 +450,30 @@ module Teepee
|
|
432
450
|
end
|
433
451
|
|
434
452
|
def gamma number
|
435
|
-
ensure_numeric Math.gamma number
|
453
|
+
ensure_numeric Math.gamma number.to_number
|
454
|
+
end
|
455
|
+
|
456
|
+
def get_operator variable
|
457
|
+
@variables[variable.to_s]
|
436
458
|
end
|
437
459
|
|
438
|
-
def greater_than
|
460
|
+
def greater_than numbers
|
439
461
|
if numbers.empty?
|
440
462
|
true_constant
|
441
463
|
elsif numbers.length == 1
|
442
464
|
true_constant
|
443
465
|
else
|
444
|
-
numbers[0] > numbers[1] and greater_than
|
466
|
+
numbers[0].to_number > numbers[1].to_number and greater_than numbers.rest
|
445
467
|
end
|
446
468
|
end
|
447
469
|
|
448
|
-
def greater_than_or_equal
|
470
|
+
def greater_than_or_equal numbers
|
449
471
|
if numbers.empty?
|
450
472
|
true_constant
|
451
473
|
elsif numbers.length == 1
|
452
474
|
true_constant
|
453
475
|
else
|
454
|
-
numbers[0] >= numbers[1] and greater_than_or_equal
|
476
|
+
numbers[0].to_number >= numbers[1].to_number and greater_than_or_equal numbers.rest
|
455
477
|
end
|
456
478
|
end
|
457
479
|
|
@@ -537,19 +559,19 @@ module Teepee
|
|
537
559
|
end
|
538
560
|
|
539
561
|
def hypot numbers
|
540
|
-
ensure_numeric Math.sqrt numbers.map {|n| n**2}
|
562
|
+
ensure_numeric Math.sqrt to_numbers(numbers).map {|n| n**2}
|
541
563
|
end
|
542
564
|
|
543
565
|
def keyword_id id
|
544
566
|
id_command_handler id, :Keyword
|
545
567
|
end
|
546
568
|
|
547
|
-
def ld
|
548
|
-
ensure_numeric Math.log2
|
569
|
+
def ld number
|
570
|
+
ensure_numeric Math.log2 number.to_number
|
549
571
|
end
|
550
572
|
|
551
573
|
def ldexp fraction, exponent
|
552
|
-
ensure_numeric Math.ldexp fraction, exponent
|
574
|
+
ensure_numeric Math.ldexp fraction.to_number, exponent.to_number
|
553
575
|
end
|
554
576
|
|
555
577
|
def left_brace
|
@@ -560,28 +582,28 @@ module Teepee
|
|
560
582
|
"["
|
561
583
|
end
|
562
584
|
|
563
|
-
def less_than
|
585
|
+
def less_than numbers
|
564
586
|
if numbers.empty?
|
565
587
|
true_constant
|
566
588
|
elsif numbers.length == 1
|
567
589
|
true_constant
|
568
590
|
else
|
569
|
-
numbers[0] < numbers[1] and less_than
|
591
|
+
numbers[0].to_number < numbers[1].to_number and less_than numbers.rest
|
570
592
|
end
|
571
593
|
end
|
572
594
|
|
573
|
-
def less_than_or_equal
|
595
|
+
def less_than_or_equal numbers
|
574
596
|
if numbers.empty?
|
575
597
|
true_constant
|
576
598
|
elsif numbers.length == 1
|
577
599
|
true_constant
|
578
600
|
else
|
579
|
-
numbers[0] <= numbers[1] and less_than_or_equal
|
601
|
+
numbers[0].to_number <= numbers[1].to_number and less_than_or_equal numbers.rest
|
580
602
|
end
|
581
603
|
end
|
582
604
|
|
583
|
-
def lgamma
|
584
|
-
ensure_numeric Math::lgamma(
|
605
|
+
def lgamma number
|
606
|
+
ensure_numeric Math::lgamma(number.to_number).first
|
585
607
|
end
|
586
608
|
|
587
609
|
def link expressions
|
@@ -601,20 +623,20 @@ module Teepee
|
|
601
623
|
end
|
602
624
|
|
603
625
|
def ln number
|
604
|
-
ensure_numeric Math.log number
|
626
|
+
ensure_numeric Math.log number.to_number
|
605
627
|
end
|
606
628
|
|
607
629
|
def log base, number
|
608
630
|
if number.nil?
|
609
631
|
number, base = base, number
|
610
|
-
ensure_numeric Math.log10 number # default to log base 10
|
632
|
+
ensure_numeric Math.log10 number.to_number # default to log base 10
|
611
633
|
else
|
612
|
-
ensure_numeric Math.log number, base
|
634
|
+
ensure_numeric Math.log number.to_number, base.to_number
|
613
635
|
end
|
614
636
|
end
|
615
637
|
|
616
638
|
def log10 number
|
617
|
-
ensure_numeric Math.log10 number
|
639
|
+
ensure_numeric Math.log10 number.to_number
|
618
640
|
end
|
619
641
|
|
620
642
|
def mailto email_address
|
@@ -626,22 +648,25 @@ module Teepee
|
|
626
648
|
end
|
627
649
|
end
|
628
650
|
|
629
|
-
def mod
|
630
|
-
ensure_numeric numbers.reduce :%
|
651
|
+
def mod numbers
|
652
|
+
ensure_numeric to_numbers(numbers).reduce :%
|
631
653
|
end
|
632
654
|
|
633
655
|
def nbsp count
|
634
|
-
|
635
|
-
|
656
|
+
if count and count.to_number and count.to_number > 0
|
657
|
+
" " * count.to_number
|
658
|
+
else
|
659
|
+
" "
|
660
|
+
end
|
636
661
|
end
|
637
662
|
|
638
|
-
def not_equal
|
663
|
+
def not_equal numbers
|
639
664
|
if numbers.empty?
|
640
665
|
true_constant
|
641
666
|
elsif numbers.length == 1
|
642
667
|
true_constant
|
643
668
|
else
|
644
|
-
numbers[0] != numbers[1] and equal
|
669
|
+
numbers[0].to_number != numbers[1].to_number and equal numbers.rest
|
645
670
|
end
|
646
671
|
end
|
647
672
|
|
@@ -658,15 +683,15 @@ module Teepee
|
|
658
683
|
end
|
659
684
|
|
660
685
|
def prog1_operator expressions
|
661
|
-
expressions.first
|
686
|
+
expressions.map(&:to_html).first
|
662
687
|
end
|
663
688
|
|
664
689
|
def progn_operator expressions
|
665
|
-
expressions.last
|
690
|
+
expressions.map(&:to_html).last
|
666
691
|
end
|
667
692
|
|
668
693
|
def radians2degrees radians
|
669
|
-
ensure_numeric(radians * 180.0 / Math::PI)
|
694
|
+
ensure_numeric(radians.to_number * 180.0 / Math::PI)
|
670
695
|
end
|
671
696
|
|
672
697
|
def right_brace
|
@@ -678,19 +703,24 @@ module Teepee
|
|
678
703
|
end
|
679
704
|
|
680
705
|
def round number, precision = nil, *_
|
681
|
-
if precision.nil?
|
682
|
-
ensure_numeric number.round
|
706
|
+
if precision.nil? or precision.to_number.nil?
|
707
|
+
ensure_numeric number.to_number.round
|
683
708
|
else
|
684
|
-
ensure_numeric number.round precision
|
709
|
+
ensure_numeric number.to_number.round precision.to_number
|
685
710
|
end
|
686
711
|
end
|
687
712
|
|
713
|
+
def set_operator expressions
|
714
|
+
variable, _, value = expressions
|
715
|
+
@variables[variable.to_s] = value
|
716
|
+
end
|
717
|
+
|
688
718
|
def sin angle
|
689
|
-
ensure_numeric Math.sin angle
|
719
|
+
ensure_numeric Math.sin angle.to_number
|
690
720
|
end
|
691
721
|
|
692
|
-
def sinh
|
693
|
-
ensure_numeric Math.sinh
|
722
|
+
def sinh angle
|
723
|
+
ensure_numeric Math.sinh angle.to_number
|
694
724
|
end
|
695
725
|
|
696
726
|
def small expressions
|
@@ -702,7 +732,7 @@ module Teepee
|
|
702
732
|
end
|
703
733
|
|
704
734
|
def sqrt number
|
705
|
-
ensure_numeric Math.sqrt number
|
735
|
+
ensure_numeric Math.sqrt number.to_number
|
706
736
|
end
|
707
737
|
|
708
738
|
def space
|
@@ -742,11 +772,11 @@ module Teepee
|
|
742
772
|
end
|
743
773
|
|
744
774
|
def tan angle
|
745
|
-
ensure_numeric Math.tan angle
|
775
|
+
ensure_numeric Math.tan angle.to_number
|
746
776
|
end
|
747
777
|
|
748
|
-
def tanh
|
749
|
-
ensure_numeric Math.tanh
|
778
|
+
def tanh angle
|
779
|
+
ensure_numeric Math.tanh angle.to_number
|
750
780
|
end
|
751
781
|
|
752
782
|
def true_constant
|
data/lib/teepee/parser-node.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
# -*- mode: Ruby -*-
|
3
3
|
|
4
|
-
# Copyright © 2013-
|
4
|
+
# Copyright © 2013-2016, Christopher Mark Gore,
|
5
5
|
# Soli Deo Gloria,
|
6
6
|
# All rights reserved.
|
7
7
|
#
|
@@ -37,5 +37,8 @@
|
|
37
37
|
|
38
38
|
module Teepee
|
39
39
|
class ParserNode
|
40
|
+
def to_html
|
41
|
+
"" # You probably want to override this.
|
42
|
+
end
|
40
43
|
end
|
41
44
|
end
|
data/lib/teepee/string-token.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: teepee
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.13.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Christopher Mark Gore
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-04-
|
11
|
+
date: 2016-04-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|