excel_to_code 0.1.8 → 0.1.10
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/TODO +0 -1
- data/src/commands/excel_to_c.rb +6 -5
- data/src/commands/excel_to_ruby.rb +2 -1
- data/src/commands/excel_to_x.rb +69 -37
- data/src/compile/c/a.out +0 -0
- data/src/compile/c/compile_named_reference_setters.rb +1 -1
- data/src/compile/c/compile_to_c.rb +1 -1
- data/src/compile/c/compile_to_c_header.rb +1 -1
- data/src/compile/c/excel_to_c_runtime.c +117 -1
- data/src/compile/c/map_formulae_to_c.rb +4 -0
- data/src/compile/c/map_sheet_names_to_c_names.rb +1 -1
- data/src/compile/c/map_values_to_c.rb +2 -1
- data/src/compile/ruby/compile_to_ruby.rb +2 -2
- data/src/compile/ruby/compile_to_ruby_unit_test.rb +1 -1
- data/src/compile/ruby/map_formulae_to_ruby.rb +5 -0
- data/src/compile/ruby/map_values_to_ruby.rb +2 -1
- data/src/excel/excel_functions.rb +10 -0
- data/src/excel/excel_functions/cell.rb +14 -0
- data/src/excel/excel_functions/mid.rb +20 -0
- data/src/excel/excel_functions/negative.rb +2 -0
- data/src/excel/excel_functions/pv.rb +37 -0
- data/src/excel/excel_functions/text.rb +25 -0
- data/src/excel/excel_functions/trim.rb +8 -0
- data/src/excel/table.rb +1 -0
- data/src/extract/check_for_unknown_functions.rb +1 -1
- data/src/rewrite/ast_expand_array_formulae.rb +4 -6
- data/src/rewrite/rewrite_array_formulae.rb +2 -2
- data/src/rewrite/rewrite_array_formulae_to_arrays.rb +1 -1
- data/src/rewrite/rewrite_cell_references_to_include_sheet.rb +1 -1
- data/src/rewrite/rewrite_formulae_to_ast.rb +1 -1
- data/src/rewrite/rewrite_merge_formulae_and_values.rb +2 -2
- data/src/rewrite/rewrite_named_reference_names.rb +1 -1
- data/src/rewrite/rewrite_relationship_id_to_filename.rb +1 -1
- data/src/rewrite/rewrite_shared_formulae.rb +2 -2
- data/src/rewrite/rewrite_values_to_ast.rb +1 -1
- data/src/rewrite/rewrite_whole_row_column_references_to_areas.rb +2 -2
- data/src/rewrite/rewrite_worksheet_names.rb +6 -3
- data/src/simplify.rb +2 -0
- data/src/simplify/inline_formulae.rb +18 -1
- data/src/simplify/map_formulae_to_values.rb +18 -6
- data/src/simplify/remove_cells.rb +1 -1
- data/src/simplify/replace_arrays_with_single_cells.rb +1 -1
- data/src/simplify/replace_column_with_column_number.rb +58 -0
- data/src/simplify/replace_common_elements_in_formulae.rb +1 -1
- data/src/simplify/replace_formulae_with_calculated_values.rb +7 -1
- data/src/simplify/replace_indirects_with_references.rb +16 -3
- data/src/simplify/replace_named_references.rb +1 -1
- data/src/simplify/replace_offsets_with_references.rb +66 -0
- data/src/simplify/replace_ranges_with_array_literals.rb +1 -1
- data/src/simplify/replace_shared_strings.rb +1 -1
- data/src/simplify/replace_table_references.rb +2 -2
- data/src/simplify/replace_values_with_constants.rb +1 -1
- data/src/simplify/simplify_arithmetic.rb +1 -1
- metadata +9 -2
@@ -51,6 +51,9 @@ class MapFormulaeToC < MapValuesToC
|
|
51
51
|
'MIN' => 'min',
|
52
52
|
'MOD' => 'mod',
|
53
53
|
'PMT' => 'pmt',
|
54
|
+
'PV3' => 'pv_3',
|
55
|
+
'PV4' => 'pv_4',
|
56
|
+
'PV5' => 'pv_5',
|
54
57
|
'ROUND' => 'excel_round',
|
55
58
|
'ROUNDDOWN' => 'rounddown',
|
56
59
|
'ROUNDUP' => 'roundup',
|
@@ -60,6 +63,7 @@ class MapFormulaeToC < MapValuesToC
|
|
60
63
|
'SUMIF2' => 'sumif_2',
|
61
64
|
'SUMIF3' => 'sumif',
|
62
65
|
'SUMIFS' => 'sumifs',
|
66
|
+
'TEXT2' => 'text',
|
63
67
|
'SUMPRODUCT' => 'sumproduct',
|
64
68
|
'VLOOKUP3' => 'vlookup_3',
|
65
69
|
'VLOOKUP4' => 'vlookup',
|
@@ -6,7 +6,7 @@ class MapSheetNamesToCNames
|
|
6
6
|
|
7
7
|
def rewrite(input,output)
|
8
8
|
c_names_assigned = {}
|
9
|
-
input.
|
9
|
+
input.each_line do |line|
|
10
10
|
excel_worksheet_name = line.split("\t").first
|
11
11
|
c_name = excel_worksheet_name.downcase.gsub(/[^a-z0-9]+/,'_')
|
12
12
|
c_name = "s"+c_name if c_name[0] !~ /[a-z]/
|
@@ -15,7 +15,7 @@ class CompileToRuby
|
|
15
15
|
mapper.worksheet = worksheet
|
16
16
|
mapper.sheet_names = Hash[sheet_names_file.readlines.map { |line| line.strip.split("\t")}]
|
17
17
|
c_name = mapper.sheet_names[worksheet]
|
18
|
-
input.
|
18
|
+
input.each_line do |line|
|
19
19
|
begin
|
20
20
|
ref, formula = line.split("\t")
|
21
21
|
name = c_name ? "#{c_name}_#{ref.downcase}" : ref.downcase
|
@@ -32,4 +32,4 @@ class CompileToRuby
|
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
35
|
-
end
|
35
|
+
end
|
@@ -17,7 +17,7 @@ class CompileToRubyUnitTest
|
|
17
17
|
|
18
18
|
def rewrite(input, sloppy, c_name, refs_to_test, o)
|
19
19
|
mapper = MapValuesToRuby.new
|
20
|
-
input.
|
20
|
+
input.each_line do |line|
|
21
21
|
ref, formula = line.split("\t")
|
22
22
|
next unless refs_to_test.include?(ref.upcase)
|
23
23
|
ast = eval(formula)
|
@@ -19,6 +19,7 @@ class MapFormulaeToRuby < MapValuesToRuby
|
|
19
19
|
'ABS' => 'abs',
|
20
20
|
'AND' => 'excel_and',
|
21
21
|
'AVERAGE' => 'average',
|
22
|
+
'CELL' => 'cell',
|
22
23
|
'CHOOSE' => 'choose',
|
23
24
|
'COSH' => 'cosh',
|
24
25
|
'COUNT' => 'count',
|
@@ -32,10 +33,12 @@ class MapFormulaeToRuby < MapValuesToRuby
|
|
32
33
|
'LEFT' => 'left',
|
33
34
|
'MATCH' => 'excel_match',
|
34
35
|
'MAX' => 'max',
|
36
|
+
'MID' => 'mid',
|
35
37
|
'MIN' => 'min',
|
36
38
|
'MOD' => 'mod',
|
37
39
|
'PI' => 'pi',
|
38
40
|
'PMT' => 'pmt',
|
41
|
+
'PV' => 'pv',
|
39
42
|
'ROUND' => 'round',
|
40
43
|
'ROUNDDOWN' => 'rounddown',
|
41
44
|
'ROUNDUP' => 'roundup',
|
@@ -44,6 +47,8 @@ class MapFormulaeToRuby < MapValuesToRuby
|
|
44
47
|
'SUMIF' => 'sumif',
|
45
48
|
'SUMIFS' => 'sumifs',
|
46
49
|
'SUMPRODUCT' => 'sumproduct',
|
50
|
+
'TEXT' => 'text',
|
51
|
+
'TRIM' => 'trim',
|
47
52
|
'VLOOKUP' => 'vlookup',
|
48
53
|
'^' => 'power'
|
49
54
|
}
|
@@ -69,3 +69,13 @@ require_relative 'excel_functions/int'
|
|
69
69
|
|
70
70
|
# Other functions
|
71
71
|
|
72
|
+
|
73
|
+
require_relative 'excel_functions/cell'
|
74
|
+
|
75
|
+
require_relative 'excel_functions/trim'
|
76
|
+
|
77
|
+
require_relative 'excel_functions/mid'
|
78
|
+
|
79
|
+
require_relative 'excel_functions/pv'
|
80
|
+
|
81
|
+
require_relative 'excel_functions/text'
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module ExcelFunctions
|
2
|
+
|
3
|
+
def cell(info_type, reference = nil)
|
4
|
+
return info_type if info_type.is_a?(Symbol)
|
5
|
+
return :value unless info_type.is_a?(String)
|
6
|
+
case info_type.downcase
|
7
|
+
when 'filename'
|
8
|
+
original_excel_filename
|
9
|
+
else
|
10
|
+
:value
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module ExcelFunctions
|
2
|
+
|
3
|
+
def mid(text, start_num, num_chars)
|
4
|
+
start_num = number_argument(start_num)
|
5
|
+
num_chars = number_argument(num_chars)
|
6
|
+
|
7
|
+
return text if text.is_a?(Symbol)
|
8
|
+
return start_num if start_num.is_a?(Symbol)
|
9
|
+
return num_chars if num_chars.is_a?(Symbol)
|
10
|
+
|
11
|
+
text = text.to_s
|
12
|
+
|
13
|
+
return :value if start_num < 1
|
14
|
+
return :value if num_chars < 0
|
15
|
+
|
16
|
+
return "" if start_num > text.length
|
17
|
+
text[start_num - 1, num_chars]
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module ExcelFunctions
|
2
|
+
|
3
|
+
def pv(rate, nper, pmt, fv = nil, type = nil)
|
4
|
+
# Turn the remainder into numbers
|
5
|
+
rate = number_argument(rate)
|
6
|
+
nper = number_argument(nper)
|
7
|
+
pmt = number_argument(pmt)
|
8
|
+
fv = number_argument(fv)
|
9
|
+
type = number_argument(type)
|
10
|
+
|
11
|
+
# Check for errors
|
12
|
+
return rate if rate.is_a?(Symbol)
|
13
|
+
return nper if nper.is_a?(Symbol)
|
14
|
+
return pmt if pmt.is_a?(Symbol)
|
15
|
+
return fv if fv.is_a?(Symbol)
|
16
|
+
|
17
|
+
return :value unless (type == 1 || type == 0)
|
18
|
+
return :value unless rate >= 0
|
19
|
+
|
20
|
+
# Sum the payments
|
21
|
+
if rate > 0
|
22
|
+
present_value = -pmt * ((1 - ((1 + rate)**-nper))/rate)
|
23
|
+
else
|
24
|
+
present_value = -pmt * nper
|
25
|
+
end
|
26
|
+
|
27
|
+
# Adjust for the type, which governs whether payments at the beginning or end of the period
|
28
|
+
present_value = present_value * ( 1 + rate) if type == 1
|
29
|
+
|
30
|
+
# Add on the final value
|
31
|
+
present_value += -fv / ((1 + rate)**(nper))
|
32
|
+
|
33
|
+
# Return the answer
|
34
|
+
present_value
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module ExcelFunctions
|
2
|
+
|
3
|
+
def text(number, format)
|
4
|
+
number ||= 0
|
5
|
+
return "" unless format
|
6
|
+
|
7
|
+
if number.is_a?(String)
|
8
|
+
begin
|
9
|
+
number = Float(number)
|
10
|
+
rescue ArgumentError => e
|
11
|
+
# Ignore
|
12
|
+
end
|
13
|
+
end
|
14
|
+
return number unless number.is_a?(Numeric)
|
15
|
+
return format if format.is_a?(Symbol)
|
16
|
+
|
17
|
+
case format
|
18
|
+
when '0%'
|
19
|
+
"#{(number * 100).round}%"
|
20
|
+
else
|
21
|
+
format
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
data/src/excel/table.rb
CHANGED
@@ -9,6 +9,7 @@ class Table
|
|
9
9
|
@name, @worksheet, @area, @number_of_total_rows, @column_name_array = name, worksheet, Area.for(reference), number_of_total_rows.to_i, column_name_array.map { |c| c.strip.downcase }
|
10
10
|
@area.calculate_excel_variables
|
11
11
|
@data_area = Area.for("#{@area.excel_start.offset(1,0)}:#{@area.excel_finish.offset(-@number_of_total_rows,0)}")
|
12
|
+
@data_area.calculate_excel_variables
|
12
13
|
end
|
13
14
|
|
14
15
|
def reference_for(table_name,structured_reference,calling_worksheet,calling_cell)
|
@@ -10,7 +10,7 @@ class CheckForUnknownFunctions
|
|
10
10
|
|
11
11
|
def check(input,output)
|
12
12
|
self.settable ||= lambda { |ref| false }
|
13
|
-
input.
|
13
|
+
input.each_line do |line|
|
14
14
|
line.scan(/\[:function, "(.*?)"/).each do |match|
|
15
15
|
output.puts $1 unless MapFormulaeToRuby::FUNCTIONS.has_key?($1)
|
16
16
|
end
|
@@ -114,13 +114,11 @@ class AstExpandArrayFormulae
|
|
114
114
|
|
115
115
|
private
|
116
116
|
|
117
|
-
def no_need_to_array?(args,ok_to_be_an_array)
|
117
|
+
def no_need_to_array?(args, ok_to_be_an_array)
|
118
118
|
ok_to_be_an_array.each_with_index do |array_ok,i|
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
end
|
123
|
-
end
|
119
|
+
next if array_ok
|
120
|
+
break unless args[i]
|
121
|
+
return false if args[i].first == :array
|
124
122
|
end
|
125
123
|
true
|
126
124
|
end
|
@@ -45,7 +45,7 @@ class RewriteArrayFormulae
|
|
45
45
|
end
|
46
46
|
|
47
47
|
def rewrite(input,output)
|
48
|
-
input.
|
48
|
+
input.each_line do |line|
|
49
49
|
ref, array_range, formula = line.split("\t")
|
50
50
|
array_formula(formula,array_range,output)
|
51
51
|
end
|
@@ -68,4 +68,4 @@ class RewriteArrayFormulae
|
|
68
68
|
end
|
69
69
|
end
|
70
70
|
|
71
|
-
end
|
71
|
+
end
|
@@ -8,7 +8,7 @@ class RewriteArrayFormulaeToArrays
|
|
8
8
|
|
9
9
|
def rewrite(input,output)
|
10
10
|
mapper = AstExpandArrayFormulae.new
|
11
|
-
input.
|
11
|
+
input.each_line do |line|
|
12
12
|
content = line.split("\t")
|
13
13
|
ast = eval(content.pop)
|
14
14
|
output.puts "#{content.join("\t")}\t#{mapper.map(ast).inspect}"
|
@@ -42,7 +42,7 @@ class RewriteCellReferencesToIncludeSheet
|
|
42
42
|
def rewrite(input,output)
|
43
43
|
mapper = RewriteCellReferencesToIncludeSheetAst.new
|
44
44
|
mapper.worksheet = worksheet
|
45
|
-
input.
|
45
|
+
input.each_line do |line|
|
46
46
|
if line =~ /(:area|:cell)/
|
47
47
|
content = line.split("\t")
|
48
48
|
ast = eval(content.pop)
|
@@ -9,7 +9,7 @@ class RewriteFormulaeToAst
|
|
9
9
|
# input should be in the form: 'thing\tthing\tformula\n' where the last field is always a forumla
|
10
10
|
# output will be in the form 'thing\tthing\tast\n'
|
11
11
|
def rewrite(input,output)
|
12
|
-
input.
|
12
|
+
input.each_line.with_index do |line,i|
|
13
13
|
line =~ /^(.*\t)(.*?)$/
|
14
14
|
output.write $1
|
15
15
|
ast = Formula.parse($2)
|
@@ -12,7 +12,7 @@ class RewriteMergeFormulaeAndValues
|
|
12
12
|
array_formula = Hash[array_formula.readlines.map { |line| [line[/(.*?)\t/,1],line]}]
|
13
13
|
simple_formulae = Hash[simple_formulae.readlines.map { |line| [line[/(.*?)\t/,1],line]}]
|
14
14
|
|
15
|
-
values.
|
15
|
+
values.each_line do |line|
|
16
16
|
ref = line[/(.*?)\t/,1]
|
17
17
|
@references_to_add_if_they_are_not_already_present.delete(ref)
|
18
18
|
output.puts simple_formulae[ref] || array_formula[ref] || shared_formulae[ref] || line
|
@@ -23,4 +23,4 @@ class RewriteMergeFormulaeAndValues
|
|
23
23
|
end
|
24
24
|
|
25
25
|
end
|
26
|
-
|
26
|
+
|
@@ -16,7 +16,7 @@ class RewriteNamedReferenceNames
|
|
16
16
|
worksheet_names = Hash[worksheet_names.readlines.map { |line| line.strip.split("\t")}]
|
17
17
|
c_names_assigned = worksheet_names.invert
|
18
18
|
|
19
|
-
named_references.
|
19
|
+
named_references.each_line do |line|
|
20
20
|
sheet, name, reference = line.split("\t")
|
21
21
|
sheet = worksheet_names[sheet]
|
22
22
|
if sheet
|
@@ -7,7 +7,7 @@ class RewriteRelationshipIdToFilename
|
|
7
7
|
def rewrite(input, relationships_file, output)
|
8
8
|
relationships_file.rewind
|
9
9
|
relationships = Hash[relationships_file.readlines.map { |line| line.split("\t")}]
|
10
|
-
input.
|
10
|
+
input.each_line do |line|
|
11
11
|
parts = line.split("\t")
|
12
12
|
rid = parts.pop.strip
|
13
13
|
if relationships.has_key?(rid)
|
@@ -6,8 +6,8 @@ class RewriteSharedFormulae
|
|
6
6
|
end
|
7
7
|
|
8
8
|
def rewrite(input, shared_targets, output)
|
9
|
-
shared_targets = shared_targets.
|
10
|
-
input.
|
9
|
+
shared_targets = shared_targets.each_line.map(&:strip).to_a
|
10
|
+
input.each_line do |line|
|
11
11
|
ref, copy_range, formula = line.split("\t")
|
12
12
|
share_formula(ref, formula, copy_range, shared_targets, output)
|
13
13
|
end
|
@@ -9,7 +9,7 @@ class RewriteValuesToAst
|
|
9
9
|
# input should be in the form: 'thing\tthing\tformula\n' where the last field is always a forumla
|
10
10
|
# output will be in the form 'thing\tthing\tast\n'
|
11
11
|
def rewrite(input,output)
|
12
|
-
input.
|
12
|
+
input.each_line do |line|
|
13
13
|
line =~ /^(.*?)\t(.*?)\t(.*)\n/
|
14
14
|
ref, type, value = $1, $2, $3
|
15
15
|
ast = case type
|
@@ -74,7 +74,7 @@ class RewriteWholeRowColumnReferencesToAreas
|
|
74
74
|
end
|
75
75
|
|
76
76
|
def rewrite(input,output)
|
77
|
-
input.
|
77
|
+
input.each_line do |line|
|
78
78
|
if line =~ /(:column_range|:row_range)/
|
79
79
|
content = line.split("\t")
|
80
80
|
ast = eval(content.pop)
|
@@ -97,4 +97,4 @@ class RewriteWholeRowColumnReferencesToAreas
|
|
97
97
|
@mapper ||= MapColumnAndRowRangeAst.new(sheet_name,dimensions)
|
98
98
|
end
|
99
99
|
|
100
|
-
end
|
100
|
+
end
|
@@ -10,11 +10,14 @@ class RewriteWorksheetNames
|
|
10
10
|
# relationship_id\tfilename\n
|
11
11
|
# Outputs worksheet names in the form:
|
12
12
|
# name\tfilename\n
|
13
|
+
# Only includes actual worksheets (ignores chartsheets and the like)
|
13
14
|
def rewrite(worksheet_names,relationships,output)
|
14
15
|
relationships = Hash[relationships.readlines.map { |line| line.split("\t")}]
|
15
|
-
worksheet_names.
|
16
|
+
worksheet_names.each_line do |line|
|
16
17
|
rid, name = line.split("\t")
|
17
|
-
|
18
|
+
filename = relationships[rid].strip
|
19
|
+
next unless filename =~ /^worksheets/i
|
20
|
+
output.puts "#{name.strip}\t#{filename}"
|
18
21
|
end
|
19
22
|
end
|
20
|
-
end
|
23
|
+
end
|
data/src/simplify.rb
CHANGED
@@ -5,6 +5,8 @@ require_relative "simplify/replace_ranges_with_array_literals"
|
|
5
5
|
require_relative "simplify/inline_formulae"
|
6
6
|
require_relative "simplify/replace_formulae_with_calculated_values"
|
7
7
|
require_relative "simplify/replace_indirects_with_references"
|
8
|
+
require_relative "simplify/replace_offsets_with_references"
|
9
|
+
require_relative "simplify/replace_column_with_column_number"
|
8
10
|
require_relative "simplify/simplify_arithmetic"
|
9
11
|
require_relative "simplify/identify_dependencies"
|
10
12
|
require_relative "simplify/remove_cells"
|
@@ -1,9 +1,11 @@
|
|
1
1
|
class InlineFormulaeAst
|
2
2
|
|
3
3
|
attr_accessor :references, :current_sheet_name, :inline_ast
|
4
|
+
attr_accessor :replacements_made_in_the_last_pass
|
4
5
|
|
5
6
|
def initialize(references, current_sheet_name, inline_ast = nil)
|
6
7
|
@references, @current_sheet_name, @inline_ast = references, [current_sheet_name], inline_ast
|
8
|
+
@replacements_made_in_the_last_pass = 0
|
7
9
|
@inline_ast ||= lambda { |sheet,reference,references| true }
|
8
10
|
end
|
9
11
|
|
@@ -16,9 +18,20 @@ class InlineFormulaeAst
|
|
16
18
|
[operator,*ast[1..-1].map {|a| map(a) }]
|
17
19
|
end
|
18
20
|
end
|
21
|
+
|
22
|
+
def function(name,*args)
|
23
|
+
case name
|
24
|
+
when 'OFFSET'
|
25
|
+
[:function, name, args.shift, *args.map { |a| map(a) }]
|
26
|
+
else
|
27
|
+
[:function, name, *args.map { |a| map(a) }]
|
28
|
+
end
|
29
|
+
end
|
19
30
|
|
20
31
|
def sheet_reference(sheet,reference)
|
32
|
+
return [:error, '#REF!'] unless references[sheet]
|
21
33
|
if inline_ast.call(sheet,reference.last.upcase.gsub('$',''),references)
|
34
|
+
@replacements_made_in_the_last_pass += 1
|
22
35
|
ast = references[sheet][reference.last.upcase.gsub('$','')]
|
23
36
|
if ast
|
24
37
|
current_sheet_name.push(sheet)
|
@@ -36,6 +49,7 @@ class InlineFormulaeAst
|
|
36
49
|
# TODO: Optimize by replacing contents of references hash with the inlined version
|
37
50
|
def cell(reference)
|
38
51
|
if inline_ast.call(current_sheet_name.last,reference.upcase.gsub('$',''),references)
|
52
|
+
@replacements_made_in_the_last_pass += 1
|
39
53
|
ast = references[current_sheet_name.last][reference.upcase.gsub('$','')]
|
40
54
|
if ast
|
41
55
|
map(ast)
|
@@ -61,10 +75,12 @@ class InlineFormulae
|
|
61
75
|
def self.replace(*args)
|
62
76
|
self.new.replace(*args)
|
63
77
|
end
|
78
|
+
|
79
|
+
attr_accessor :replacements_made_in_the_last_pass
|
64
80
|
|
65
81
|
def replace(input,output)
|
66
82
|
rewriter = InlineFormulaeAst.new(references, default_sheet_name, inline_ast)
|
67
|
-
input.
|
83
|
+
input.each_line do |line|
|
68
84
|
# Looks to match lines with references
|
69
85
|
if line =~ /\[:cell/
|
70
86
|
ref, ast = line.split("\t")
|
@@ -73,5 +89,6 @@ class InlineFormulae
|
|
73
89
|
output.puts line
|
74
90
|
end
|
75
91
|
end
|
92
|
+
@replacements_made_in_the_last_pass = rewriter.replacements_made_in_the_last_pass
|
76
93
|
end
|
77
94
|
end
|