excel_to_code 0.2.24 → 0.2.25
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/src/compile/c/a.out +0 -0
- data/src/compile/c/excel_to_c_runtime.c +11 -0
- data/src/compile/c/excel_to_c_runtime_test.c +6 -0
- data/src/compile/c/map_formulae_to_c.rb +1 -0
- data/src/compile/ruby/map_formulae_to_ruby.rb +1 -0
- data/src/excel/excel_functions.rb +2 -0
- data/src/excel/excel_functions/ln.rb +14 -0
- data/src/excel_to_code.rb +1 -1
- data/src/extract/extract_named_references.rb +51 -32
- data/src/simplify/replace_arithmetic_on_ranges.rb +11 -23
- data/src/simplify/replace_arrays_with_single_cells.rb +21 -4
- data/src/simplify/replace_string_join_on_ranges.rb +11 -25
- metadata +29 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3d72318213cf0081f534b5f4831a7a1e1835dbd3
|
4
|
+
data.tar.gz: 2700a1eef57c8edbc96432fa4140713b6a15c37f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f2796806f37fff89494e84f60cc73305ab9cdcc19e44540954fbe9f9961d73914c82af786bafc01936aa1e1e2553fbc1b23fd9902950e70cefcafd007ada22ca
|
7
|
+
data.tar.gz: 9a15536fd266ac59fea374200645ff395b11dff32f45ae7acb85c158aa90dcb8486f1e03c8ba8312c034086606bbef41a8884fc0a65e91c713f9f3470e27aedf
|
data/src/compile/c/a.out
CHANGED
Binary file
|
@@ -74,6 +74,7 @@ static ExcelValue left_1(ExcelValue string_v);
|
|
74
74
|
static ExcelValue len(ExcelValue string_v);
|
75
75
|
static ExcelValue excel_log(ExcelValue number);
|
76
76
|
static ExcelValue excel_log_2(ExcelValue number, ExcelValue base);
|
77
|
+
static ExcelValue ln(ExcelValue number);
|
77
78
|
static ExcelValue excel_exp(ExcelValue number);
|
78
79
|
static ExcelValue max(int number_of_arguments, ExcelValue *arguments);
|
79
80
|
static ExcelValue min(int number_of_arguments, ExcelValue *arguments);
|
@@ -333,6 +334,16 @@ static ExcelValue excel_log_2(ExcelValue number_v, ExcelValue base_v) {
|
|
333
334
|
return new_excel_number(log(n)/log(b));
|
334
335
|
}
|
335
336
|
|
337
|
+
static ExcelValue ln(ExcelValue number_v) {
|
338
|
+
CHECK_FOR_PASSED_ERROR(number_v)
|
339
|
+
NUMBER(number_v, n)
|
340
|
+
CHECK_FOR_CONVERSION_ERROR
|
341
|
+
|
342
|
+
if(n<=0) { return NUM; }
|
343
|
+
|
344
|
+
return new_excel_number(log(n));
|
345
|
+
}
|
346
|
+
|
336
347
|
static ExcelValue excel_exp(ExcelValue number_v) {
|
337
348
|
CHECK_FOR_PASSED_ERROR(number_v)
|
338
349
|
NUMBER(number_v, n)
|
@@ -685,6 +685,12 @@ int test_functions() {
|
|
685
685
|
assert(excel_log_2(new_excel_number(8),new_excel_number(2)).number == 3.0);
|
686
686
|
assert(excel_log_2(new_excel_number(8),new_excel_number(0)).type == ExcelError);
|
687
687
|
|
688
|
+
// Test LN
|
689
|
+
assert(ln(new_excel_number(10)).number == 2.302585092994046);
|
690
|
+
assert(ln(new_excel_number(8)).number == 2.0794415416798357);
|
691
|
+
assert(ln(new_excel_number(0)).type == ExcelError);
|
692
|
+
assert(ln(new_excel_number(-1)).type == ExcelError);
|
693
|
+
|
688
694
|
// Test MMULT (Matrix multiplication)
|
689
695
|
ExcelValue mmult_1[] = { ONE, TWO, THREE, FOUR};
|
690
696
|
ExcelValue mmult_2[] = { FOUR, THREE, TWO, ONE};
|
data/src/excel_to_code.rb
CHANGED
@@ -1,53 +1,72 @@
|
|
1
|
-
require '
|
1
|
+
require 'ox'
|
2
2
|
|
3
|
-
class ExtractNamedReferences <
|
3
|
+
class ExtractNamedReferences < ::Ox::Sax
|
4
4
|
|
5
|
-
attr_accessor :
|
5
|
+
attr_accessor :named_references
|
6
|
+
attr_accessor :state
|
6
7
|
|
7
8
|
def self.extract(input)
|
8
9
|
self.new.extract(input)
|
9
10
|
end
|
10
11
|
|
11
|
-
def
|
12
|
-
|
13
|
-
@sheet_names = []
|
12
|
+
def extract(input_xml)
|
13
|
+
@state = :not_parsing
|
14
|
+
@sheet_names = [] # This keeps track of the sheet names
|
15
|
+
@named_references = {}
|
16
|
+
@localSheetId = nil
|
17
|
+
@name = nil
|
18
|
+
@reference = []
|
19
|
+
Ox.sax_parse(self, input_xml, :convert_special => true)
|
20
|
+
@named_references
|
14
21
|
end
|
15
22
|
|
16
|
-
def
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
@output
|
23
|
+
def start_element(name)
|
24
|
+
case name
|
25
|
+
when :sheet
|
26
|
+
@state = :parsing_sheet_name
|
27
|
+
when :definedName
|
28
|
+
@state = :parsing_named_reference
|
29
|
+
end
|
24
30
|
end
|
25
31
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
@
|
31
|
-
|
32
|
-
@
|
32
|
+
|
33
|
+
def attr(name, value)
|
34
|
+
case state
|
35
|
+
when :parsing_sheet_name
|
36
|
+
@sheet_names << value if name == :name
|
37
|
+
when :parsing_named_reference
|
38
|
+
@localSheetId = value.to_i if name == :localSheetId
|
39
|
+
@name = value.downcase.to_sym if name == :name
|
33
40
|
end
|
34
41
|
end
|
35
42
|
|
36
43
|
def end_element(name)
|
37
|
-
|
38
|
-
|
39
|
-
@
|
40
|
-
|
41
|
-
@
|
44
|
+
case name
|
45
|
+
when :sheet
|
46
|
+
@state = :not_parsing
|
47
|
+
when :definedName
|
48
|
+
@state = :not_parsing
|
49
|
+
|
50
|
+
reference = @reference.join.gsub('$','')
|
51
|
+
|
52
|
+
@named_references[key] = reference
|
53
|
+
|
54
|
+
@localSheetId = nil
|
55
|
+
@name = nil
|
56
|
+
@reference = []
|
42
57
|
end
|
43
|
-
@sheet = nil
|
44
|
-
@name = nil
|
45
|
-
@reference = nil
|
46
58
|
end
|
47
59
|
|
48
|
-
def
|
49
|
-
return unless
|
50
|
-
@reference <<
|
60
|
+
def text(text)
|
61
|
+
return unless state == :parsing_named_reference
|
62
|
+
@reference << text
|
63
|
+
end
|
64
|
+
|
65
|
+
|
66
|
+
def key
|
67
|
+
return @name unless @localSheetId
|
68
|
+
sheet = @sheet_names[@localSheetId].downcase.to_sym
|
69
|
+
[sheet, @name]
|
51
70
|
end
|
52
71
|
|
53
72
|
end
|
@@ -2,7 +2,17 @@ class ReplaceArithmeticOnRangesAst
|
|
2
2
|
|
3
3
|
def map(ast)
|
4
4
|
return ast unless ast.is_a?(Array)
|
5
|
-
ast.each
|
5
|
+
ast.each do |a|
|
6
|
+
next unless a.is_a?(Array)
|
7
|
+
case ast.first
|
8
|
+
when :error, :null, :space, :prefix, :boolean_true, :boolean_false, :number, :string
|
9
|
+
next
|
10
|
+
when :sheet_reference, :table_reference, :local_table_reference
|
11
|
+
next
|
12
|
+
else
|
13
|
+
map(a)
|
14
|
+
end
|
15
|
+
end
|
6
16
|
arithmetic(ast) if ast.first == :arithmetic
|
7
17
|
comparison(ast) if ast.first == :comparison
|
8
18
|
ast
|
@@ -112,25 +122,3 @@ class ReplaceArithmeticOnRangesAst
|
|
112
122
|
end
|
113
123
|
|
114
124
|
end
|
115
|
-
|
116
|
-
|
117
|
-
class ReplaceArithmeticOnRanges
|
118
|
-
|
119
|
-
def self.replace(*args)
|
120
|
-
self.new.replace(*args)
|
121
|
-
end
|
122
|
-
|
123
|
-
def replace(input,output)
|
124
|
-
rewriter = ReplaceArithmeticOnRangesAst.new
|
125
|
-
input.each_line do |line|
|
126
|
-
# Looks to match lines with references
|
127
|
-
if line =~ /:arithmetic/ && line =~ /:array/
|
128
|
-
content = line.split("\t")
|
129
|
-
ast = eval(content.pop)
|
130
|
-
output.puts "#{content.join("\t")}\t#{rewriter.map(ast).inspect}"
|
131
|
-
else
|
132
|
-
output.puts line
|
133
|
-
end
|
134
|
-
end
|
135
|
-
end
|
136
|
-
end
|
@@ -37,7 +37,7 @@ class ReplaceArraysWithSingleCellsAst
|
|
37
37
|
right = try_and_convert_array(right)
|
38
38
|
ast.replace([:arithmetic, left, op, right])
|
39
39
|
else
|
40
|
-
ast
|
40
|
+
map_if_required(ast)
|
41
41
|
end
|
42
42
|
when :string_join
|
43
43
|
strings = ast[1..-1]
|
@@ -45,7 +45,7 @@ class ReplaceArraysWithSingleCellsAst
|
|
45
45
|
strings = strings.map { |s| try_and_convert_array(s) }
|
46
46
|
ast.replace([:string_join, *strings])
|
47
47
|
else
|
48
|
-
|
48
|
+
map_if_required(strings)
|
49
49
|
end
|
50
50
|
when :function
|
51
51
|
if ast[1] == :SUMIF && ast[3].first == :array
|
@@ -57,10 +57,27 @@ class ReplaceArraysWithSingleCellsAst
|
|
57
57
|
elsif ast[1] == :INDIRECT && check_indirect(ast)
|
58
58
|
# Replacement made in check function
|
59
59
|
else
|
60
|
-
ast
|
60
|
+
map_if_required(ast)
|
61
61
|
end
|
62
62
|
else
|
63
|
-
ast
|
63
|
+
map_if_required(ast)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
# This tries to speed up the process by not recursively
|
68
|
+
# checking arguments that we know won't be interesting
|
69
|
+
def map_if_required(arguments)
|
70
|
+
return arguments unless arguments.is_a?(Array)
|
71
|
+
arguments.each do |a|
|
72
|
+
next unless a.is_a?(Array)
|
73
|
+
case a.first
|
74
|
+
when :error, :null, :space, :prefix, :boolean_true, :boolean_false, :number, :string
|
75
|
+
next
|
76
|
+
when :sheet_reference, :table_reference, :local_table_reference
|
77
|
+
next
|
78
|
+
else
|
79
|
+
do_map(a)
|
80
|
+
end
|
64
81
|
end
|
65
82
|
end
|
66
83
|
|
@@ -2,8 +2,18 @@ class ReplaceStringJoinOnRangesAST
|
|
2
2
|
|
3
3
|
def map(ast)
|
4
4
|
return ast unless ast.is_a?(Array)
|
5
|
+
ast.each do |a|
|
6
|
+
next unless a.is_a?(Array)
|
7
|
+
case ast.first
|
8
|
+
when :error, :null, :space, :prefix, :boolean_true, :boolean_false, :number, :string
|
9
|
+
next
|
10
|
+
when :sheet_reference, :table_reference, :local_table_reference
|
11
|
+
next
|
12
|
+
else
|
13
|
+
map(a)
|
14
|
+
end
|
5
15
|
string_join(ast) if ast[0] == :string_join
|
6
|
-
|
16
|
+
end
|
7
17
|
ast
|
8
18
|
end
|
9
19
|
|
@@ -46,28 +56,4 @@ class ReplaceStringJoinOnRangesAST
|
|
46
56
|
return [:error, "#VALUE!"] unless cell
|
47
57
|
map(cell)
|
48
58
|
end
|
49
|
-
|
50
|
-
|
51
|
-
end
|
52
|
-
|
53
|
-
|
54
|
-
class ReplaceStringJoinOnRanges
|
55
|
-
|
56
|
-
def self.replace(*args)
|
57
|
-
self.new.replace(*args)
|
58
|
-
end
|
59
|
-
|
60
|
-
def replace(input,output)
|
61
|
-
rewriter = ReplaceStringJoinOnRangesAST.new
|
62
|
-
input.each_line do |line|
|
63
|
-
# Looks to match lines with references
|
64
|
-
if line =~ /:string_join/ && line =~ /:array/
|
65
|
-
content = line.split("\t")
|
66
|
-
ast = eval(content.pop)
|
67
|
-
output.puts "#{content.join("\t")}\t#{rewriter.map(ast).inspect}"
|
68
|
-
else
|
69
|
-
output.puts line
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
73
59
|
end
|
metadata
CHANGED
@@ -1,33 +1,36 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: excel_to_code
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.25
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Thomas Counsell, Green on Black Ltd
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-05-
|
11
|
+
date: 2014-05-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rubypeg
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: nokogiri
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.5'
|
31
34
|
- - ">="
|
32
35
|
- !ruby/object:Gem::Version
|
33
36
|
version: 1.5.0
|
@@ -35,6 +38,9 @@ dependencies:
|
|
35
38
|
prerelease: false
|
36
39
|
version_requirements: !ruby/object:Gem::Requirement
|
37
40
|
requirements:
|
41
|
+
- - "~>"
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '1.5'
|
38
44
|
- - ">="
|
39
45
|
- !ruby/object:Gem::Version
|
40
46
|
version: 1.5.0
|
@@ -42,6 +48,9 @@ dependencies:
|
|
42
48
|
name: rspec
|
43
49
|
requirement: !ruby/object:Gem::Requirement
|
44
50
|
requirements:
|
51
|
+
- - "~>"
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '2.7'
|
45
54
|
- - ">="
|
46
55
|
- !ruby/object:Gem::Version
|
47
56
|
version: 2.7.0
|
@@ -49,6 +58,9 @@ dependencies:
|
|
49
58
|
prerelease: false
|
50
59
|
version_requirements: !ruby/object:Gem::Requirement
|
51
60
|
requirements:
|
61
|
+
- - "~>"
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: '2.7'
|
52
64
|
- - ">="
|
53
65
|
- !ruby/object:Gem::Version
|
54
66
|
version: 2.7.0
|
@@ -56,6 +68,9 @@ dependencies:
|
|
56
68
|
name: ffi
|
57
69
|
requirement: !ruby/object:Gem::Requirement
|
58
70
|
requirements:
|
71
|
+
- - "~>"
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
version: '1.0'
|
59
74
|
- - ">="
|
60
75
|
- !ruby/object:Gem::Version
|
61
76
|
version: 1.0.11
|
@@ -63,6 +78,9 @@ dependencies:
|
|
63
78
|
prerelease: false
|
64
79
|
version_requirements: !ruby/object:Gem::Requirement
|
65
80
|
requirements:
|
81
|
+
- - "~>"
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '1.0'
|
66
84
|
- - ">="
|
67
85
|
- !ruby/object:Gem::Version
|
68
86
|
version: 1.0.11
|
@@ -70,6 +88,9 @@ dependencies:
|
|
70
88
|
name: ox
|
71
89
|
requirement: !ruby/object:Gem::Requirement
|
72
90
|
requirements:
|
91
|
+
- - "~>"
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '2.0'
|
73
94
|
- - ">="
|
74
95
|
- !ruby/object:Gem::Version
|
75
96
|
version: 2.0.12
|
@@ -77,6 +98,9 @@ dependencies:
|
|
77
98
|
prerelease: false
|
78
99
|
version_requirements: !ruby/object:Gem::Requirement
|
79
100
|
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '2.0'
|
80
104
|
- - ">="
|
81
105
|
- !ruby/object:Gem::Version
|
82
106
|
version: 2.0.12
|
@@ -168,6 +192,7 @@ files:
|
|
168
192
|
- src/excel/excel_functions/len.rb
|
169
193
|
- src/excel/excel_functions/less_than.rb
|
170
194
|
- src/excel/excel_functions/less_than_or_equal.rb
|
195
|
+
- src/excel/excel_functions/ln.rb
|
171
196
|
- src/excel/excel_functions/log.rb
|
172
197
|
- src/excel/excel_functions/lower.rb
|
173
198
|
- src/excel/excel_functions/max.rb
|