excel_to_code 0.2.24 → 0.2.25
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/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
|