nilac 0.0.4.3.9.4 → 0.0.4.3.9.5
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/examples/marky.js +22 -3
- data/examples/marky.nila +29 -2
- data/lib/nilac/compile_classes.rb +6 -6
- data/lib/nilac/compile_custom_function_map.rb +8 -2
- data/lib/nilac/compile_existential_operator.rb +169 -0
- data/lib/nilac/compile_named_functions.rb +1 -1
- data/lib/nilac/compile_operators.rb +46 -40
- data/lib/nilac/compile_require_statements.rb +43 -0
- data/lib/nilac/compile_ruby_methods.rb +43 -1
- data/lib/nilac/compile_ternary_operator.rb +6 -0
- data/lib/nilac/compile_whitespace_delimited_functions.rb +15 -8
- data/lib/nilac/get_variables.rb +5 -1
- data/lib/nilac/pretty_print_javascript.rb +2 -2
- data/lib/nilac/rollblocks.rb +100 -0
- data/lib/nilac/version.rb +1 -1
- data/lib/nilac.rb +12 -2
- data/shark/features/add_auto_return_statement.feature +1 -1
- data/shark/features/array_and_string_indexing.feature +1 -1
- data/shark/features/automatic_require_statements.feature +11 -0
- data/shark/features/barebones_compilation.feature +1 -1
- data/shark/features/case_when.feature +1 -1
- data/shark/features/default_method_parameters.feature +1 -1
- data/shark/features/fix_newlines.feature +1 -1
- data/shark/features/hashes.feature +1 -1
- data/shark/features/heredoc.feature +1 -1
- data/shark/features/if_then_else.feature +1 -1
- data/shark/features/loop.feature +1 -1
- data/shark/features/method_multiple_return.feature +1 -1
- data/shark/features/multiline_array.feature +1 -1
- data/shark/features/multiple_variable_initialization.feature +1 -1
- data/shark/features/numbers.feature +1 -1
- data/shark/features/regular_for.feature +1 -1
- data/shark/features/regular_if.feature +1 -1
- data/shark/features/regular_while.feature +1 -1
- data/shark/features/ruby_methods.feature +1 -1
- data/shark/features/ruby_operators.feature +1 -1
- data/shark/features/splats.feature +1 -1
- data/shark/features/string_interpolation.feature +1 -1
- data/shark/features/strings.feature +1 -1
- data/shark/features/times.feature +1 -1
- data/shark/features/unless_until.feature +1 -1
- data/shark/features/whitespace_delimitation.feature +1 -1
- data/shark/test_files/correct_required_module.js +14 -0
- data/shark/test_files/required_module.nila +11 -0
- data/shark/test_files/sample_class.nila +10 -0
- metadata +10 -4
- data/shark/features/array_sugar.feature +0 -11
- data/shark/test_files/array_sugar.js +0 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 193275e07ff9a381b98f8cba61b4178b4aa67746
|
4
|
+
data.tar.gz: fdb154e462dccec62c8b6c92221303d86c47c50f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e46d6cf55cd21f52feed937192522cc287a34e79979b2f8cbb199154d8cddb38b279b1ccab3bb6a69533df0bb93e557d21c408051ed903f47e7a1b78e8e81513
|
7
|
+
data.tar.gz: 46eabf7a2ad1f5188e1398120971fcc0ecbcacf7befb88b0f067da15dbc02f79d4d0a99e88c57178612783c81c3e1ea93073c7e02f6a887d4710c5ecf551b971
|
data/examples/marky.js
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
//Written using Nila. Visit http://adhithyan15.github.io/nila
|
2
2
|
(function() {
|
3
|
-
var commandline_args, parse_markdown;
|
3
|
+
var commandline_args, file_name, fs, parse_markdown, parsed_args;
|
4
4
|
|
5
5
|
// Marky is a simple markdown parser written in Nila and runs on Nodejs.
|
6
6
|
|
@@ -16,7 +16,15 @@
|
|
16
16
|
|
17
17
|
// If you want to learn more about Nila, please visit http://adhithyan15.github.io/nila
|
18
18
|
|
19
|
-
|
19
|
+
fs = require('fs');
|
20
|
+
|
21
|
+
parse_markdown = function(input_file) {
|
22
|
+
fs.readFile(input_file, 'utf8',function(err,data) {
|
23
|
+
if (err) {
|
24
|
+
console.log(err);
|
25
|
+
}
|
26
|
+
console.log(data);
|
27
|
+
});
|
20
28
|
};
|
21
29
|
|
22
30
|
commandline_args = [];
|
@@ -25,6 +33,17 @@
|
|
25
33
|
commandline_args.push(val);
|
26
34
|
});
|
27
35
|
|
28
|
-
|
36
|
+
parsed_args = commandline_args.slice(2);
|
37
|
+
|
38
|
+
if (!(parsed_args.length === 0)) {
|
39
|
+
if (parsed_args[0].indexOf("-c") !== -1){
|
40
|
+
file_name = parsed_args[1];
|
41
|
+
if (!((typeof file_name === "undefined"))) {
|
42
|
+
parse_markdown(file_name);
|
43
|
+
} else {
|
44
|
+
console.log("No file has been specified!");
|
45
|
+
}
|
46
|
+
}
|
47
|
+
}
|
29
48
|
|
30
49
|
}).call(this);
|
data/examples/marky.nila
CHANGED
@@ -8,7 +8,14 @@
|
|
8
8
|
|
9
9
|
# If you want to learn more about Nila, please visit http://adhithyan15.github.io/nila
|
10
10
|
|
11
|
-
|
11
|
+
require 'fs'
|
12
|
+
|
13
|
+
def parse_markdown(input_file)
|
14
|
+
|
15
|
+
fs.readFile input_file, 'utf8', do |err,data|
|
16
|
+
puts err if err
|
17
|
+
puts data
|
18
|
+
end
|
12
19
|
|
13
20
|
end
|
14
21
|
|
@@ -20,4 +27,24 @@ process.argv.forEach do |val,index,array|
|
|
20
27
|
|
21
28
|
end
|
22
29
|
|
23
|
-
|
30
|
+
parsed_args = commandline_args[2..last]
|
31
|
+
|
32
|
+
unless parsed_args.empty?
|
33
|
+
|
34
|
+
if parsed_args[0].include?("-c")
|
35
|
+
|
36
|
+
file_name = parsed_args[1]
|
37
|
+
|
38
|
+
unless file_name.undefined?
|
39
|
+
|
40
|
+
parse_markdown file_name
|
41
|
+
|
42
|
+
else
|
43
|
+
|
44
|
+
puts "No file has been specified!"
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
@@ -3,17 +3,17 @@
|
|
3
3
|
# Nila will have support for classes. But the current implementation is not ready for prime time
|
4
4
|
# yet. So it won't be documented.
|
5
5
|
|
6
|
-
def extract_classes
|
6
|
+
def extract_classes(file_contents)
|
7
7
|
|
8
|
-
|
8
|
+
# This method will extract code blocks between class .. end blocks and try to convert to
|
9
|
+
# Javascript equivalent code
|
9
10
|
|
10
|
-
|
11
|
+
possible_classes = file_contents.reject {|element| !element.index(/class\s*\w{1,}\s*<?\s?\w{1,}?/)}
|
11
12
|
|
12
|
-
"Array",
|
13
|
-
]
|
14
13
|
|
15
|
-
end
|
16
14
|
|
15
|
+
end
|
17
16
|
|
17
|
+
extract_classes(input_file_contents)
|
18
18
|
|
19
19
|
end
|
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
require_relative 'replace_strings'
|
2
|
+
|
3
|
+
def compile_custom_function_map(input_file_contents)
|
2
4
|
|
3
5
|
function_map_replacements = {
|
4
6
|
|
@@ -8,6 +10,8 @@
|
|
8
10
|
|
9
11
|
"print" => "process.stdout.write",
|
10
12
|
|
13
|
+
"require" => "require",
|
14
|
+
|
11
15
|
}
|
12
16
|
|
13
17
|
function_map = function_map_replacements.keys
|
@@ -20,7 +24,9 @@
|
|
20
24
|
|
21
25
|
function_map.each do |function|
|
22
26
|
|
23
|
-
|
27
|
+
test_line = replace_strings(line)
|
28
|
+
|
29
|
+
if test_line.include?(function+"(") or test_line.include?(function+" ") and test_line.index(javascript_regexp) == nil
|
24
30
|
|
25
31
|
testsplit = line.split(function)
|
26
32
|
|
@@ -0,0 +1,169 @@
|
|
1
|
+
require_relative 'replace_strings'
|
2
|
+
|
3
|
+
def compile_existential_operators(input_file_contents)
|
4
|
+
|
5
|
+
# This method compiles Nila's existential operator.
|
6
|
+
#
|
7
|
+
# Example:
|
8
|
+
#
|
9
|
+
# input_args[0].nil?
|
10
|
+
#
|
11
|
+
# The above line should compile to
|
12
|
+
#
|
13
|
+
# typeof input_args[0] === undefined && input_args[0] === nil
|
14
|
+
|
15
|
+
modified_contents = input_file_contents.collect {|element| replace_strings(element)}
|
16
|
+
|
17
|
+
possible_existential_calls = modified_contents.reject {|element| !element.include?(".nil")}
|
18
|
+
|
19
|
+
split_regexp = /((if|while) \((!\()?)/
|
20
|
+
|
21
|
+
second_split_regexp = /(&&|\|\|)/
|
22
|
+
|
23
|
+
possible_existential_calls.each do |statement|
|
24
|
+
|
25
|
+
reconstructed_statement = input_file_contents[modified_contents.index(statement)]
|
26
|
+
|
27
|
+
counter = 0
|
28
|
+
|
29
|
+
while reconstructed_statement.include?(".nil")
|
30
|
+
|
31
|
+
before,after = reconstructed_statement.split(".nil",2)
|
32
|
+
|
33
|
+
if counter == 0
|
34
|
+
|
35
|
+
split_data = before.split(split_regexp)
|
36
|
+
|
37
|
+
before2 = split_data[1]
|
38
|
+
|
39
|
+
if before2.eql?("if (") or before2.eql?("while (")
|
40
|
+
|
41
|
+
usage = split_data[3]
|
42
|
+
|
43
|
+
elsif before2.eql?("if (!(") or before2.eql?("while (!(")
|
44
|
+
|
45
|
+
usage = split_data[4]
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
replacement_string = "(typeof #{usage} === \"undefined\" &|&| #{usage} === null)"
|
50
|
+
|
51
|
+
reconstructed_statement = before.split(before2)[0] + before2 + replacement_string + after
|
52
|
+
|
53
|
+
elsif counter > 0
|
54
|
+
|
55
|
+
split_data = before.split(second_split_regexp)
|
56
|
+
|
57
|
+
before2 = split_data[0]
|
58
|
+
|
59
|
+
operator = split_data[1]
|
60
|
+
|
61
|
+
operator = " &|&| " if operator.strip.eql?("&&")
|
62
|
+
|
63
|
+
operator = " |$|$ " if operator.strip.eql?("||")
|
64
|
+
|
65
|
+
usage = split_data[2]
|
66
|
+
|
67
|
+
replacement_string = "(typeof #{usage} === \"undefined\" &|&| #{usage} === null)"
|
68
|
+
|
69
|
+
reconstructed_statement = before2 + operator + replacement_string + after
|
70
|
+
|
71
|
+
end
|
72
|
+
|
73
|
+
counter += 1
|
74
|
+
|
75
|
+
end
|
76
|
+
|
77
|
+
reconstructed_statement = reconstructed_statement.gsub("&|&|","&&").gsub("|$|$","&&")
|
78
|
+
|
79
|
+
input_file_contents[modified_contents.index(statement)] = reconstructed_statement
|
80
|
+
|
81
|
+
end
|
82
|
+
|
83
|
+
return input_file_contents
|
84
|
+
|
85
|
+
end
|
86
|
+
|
87
|
+
def compile_undefined_operator(input_file_contents)
|
88
|
+
|
89
|
+
# This method compiles Nila's .undefined? method to native Javascript
|
90
|
+
|
91
|
+
# Example:
|
92
|
+
#
|
93
|
+
# input_args[0].undefined?
|
94
|
+
#
|
95
|
+
# The above line should compile to
|
96
|
+
#
|
97
|
+
# typeof input_args[0] === "undefined"
|
98
|
+
|
99
|
+
modified_contents = input_file_contents.collect {|element| replace_strings(element)}
|
100
|
+
|
101
|
+
possible_existential_calls = modified_contents.reject {|element| !element.include?(".undefined")}
|
102
|
+
|
103
|
+
split_regexp = /((if|while) \((!\()?)/
|
104
|
+
|
105
|
+
second_split_regexp = /(&&|\|\|)/
|
106
|
+
|
107
|
+
possible_existential_calls.each do |statement|
|
108
|
+
|
109
|
+
reconstructed_statement = input_file_contents[modified_contents.index(statement)]
|
110
|
+
|
111
|
+
counter = 0
|
112
|
+
|
113
|
+
while reconstructed_statement.include?(".undefined")
|
114
|
+
|
115
|
+
before,after = reconstructed_statement.split(".undefined",2)
|
116
|
+
|
117
|
+
if counter == 0
|
118
|
+
|
119
|
+
split_data = before.split(split_regexp)
|
120
|
+
|
121
|
+
before2 = split_data[1]
|
122
|
+
|
123
|
+
if before2.eql?("if (") or before2.eql?("while (")
|
124
|
+
|
125
|
+
usage = split_data[3]
|
126
|
+
|
127
|
+
elsif before2.eql?("if (!(") or before2.eql?("while (!(")
|
128
|
+
|
129
|
+
usage = split_data[4]
|
130
|
+
|
131
|
+
end
|
132
|
+
|
133
|
+
replacement_string = "(typeof #{usage} === \"undefined\")"
|
134
|
+
|
135
|
+
reconstructed_statement = before.split(before2)[0] + before2 + replacement_string + after
|
136
|
+
|
137
|
+
elsif counter > 0
|
138
|
+
|
139
|
+
split_data = before.split(second_split_regexp)
|
140
|
+
|
141
|
+
before2 = split_data[0]
|
142
|
+
|
143
|
+
operator = split_data[1]
|
144
|
+
|
145
|
+
operator = " &|&| " if operator.strip.eql?("&&")
|
146
|
+
|
147
|
+
operator = " |$|$ " if operator.strip.eql?("||")
|
148
|
+
|
149
|
+
usage = split_data[2]
|
150
|
+
|
151
|
+
replacement_string = "(typeof #{usage} === \"undefined\")"
|
152
|
+
|
153
|
+
reconstructed_statement = before2 + operator + replacement_string + after
|
154
|
+
|
155
|
+
end
|
156
|
+
|
157
|
+
counter += 1
|
158
|
+
|
159
|
+
end
|
160
|
+
|
161
|
+
reconstructed_statement = reconstructed_statement.gsub("&|&|","&&").gsub("|$|$","&&")
|
162
|
+
|
163
|
+
input_file_contents[modified_contents.index(statement)] = reconstructed_statement
|
164
|
+
|
165
|
+
end
|
166
|
+
|
167
|
+
return input_file_contents
|
168
|
+
|
169
|
+
end
|
@@ -174,7 +174,7 @@ def compile_named_functions(input_file_contents, named_code_blocks, nested_funct
|
|
174
174
|
|
175
175
|
rejected_array = rejected_array[1..-1]
|
176
176
|
|
177
|
-
|
177
|
+
unless rejected_array[0].strip.eql?("}") or rejected_array[0].strip.eql?("})")
|
178
178
|
|
179
179
|
if !rejected_array[0].strip.eql?("end") and !rejected_array[0].strip.include?("--single_line_comment")
|
180
180
|
|
@@ -1,83 +1,89 @@
|
|
1
|
-
|
1
|
+
require_relative 'compile_existential_operator'
|
2
2
|
|
3
|
-
|
3
|
+
def compile_operators(input_file_contents)
|
4
4
|
|
5
|
-
|
5
|
+
def compile_power_operator(input_string)
|
6
6
|
|
7
|
-
|
7
|
+
matches = input_string.scan(/(\w{1,}\*\*\w{1,})/).to_a.flatten
|
8
8
|
|
9
|
-
|
9
|
+
unless matches.empty?
|
10
10
|
|
11
|
-
|
11
|
+
matches.each do |match|
|
12
12
|
|
13
|
-
|
13
|
+
left, right = match.split("**")
|
14
14
|
|
15
|
-
|
15
|
+
input_string = input_string.sub(match, "Math.pow(#{left},#{right})")
|
16
16
|
|
17
17
|
end
|
18
18
|
|
19
|
-
return input_string
|
20
|
-
|
21
19
|
end
|
22
20
|
|
23
|
-
|
21
|
+
return input_string
|
24
22
|
|
25
|
-
|
23
|
+
end
|
26
24
|
|
27
|
-
|
25
|
+
def compile_match_operator(input_string)
|
28
26
|
|
29
|
-
|
27
|
+
rejection_exp = /( aannddy | orriioo |nnoottyy )/
|
30
28
|
|
31
|
-
|
29
|
+
if input_string.include?("=~")
|
32
30
|
|
33
|
-
|
31
|
+
input_string = input_string.gsub(" && ", " aannddy ").gsub(" || ", " orriioo ").gsub("!", "nnoottyy")
|
34
32
|
|
35
|
-
|
33
|
+
left, right = input_string.split("=~")
|
36
34
|
|
37
|
-
|
35
|
+
if left.index(rejection_exp) != nil
|
38
36
|
|
39
|
-
|
37
|
+
left = left[left.index(rejection_exp)..-1]
|
40
38
|
|
41
|
-
|
39
|
+
elsif left.index(/\(/)
|
42
40
|
|
43
|
-
|
41
|
+
left = left[left.index(/\(/)+1..-1]
|
44
42
|
|
45
|
-
|
43
|
+
end
|
46
44
|
|
47
|
-
|
45
|
+
if right.index(rejection_exp) != nil
|
48
46
|
|
49
|
-
|
47
|
+
right = right[0...right.index(rejection_exp)]
|
50
48
|
|
51
|
-
|
49
|
+
elsif right.index(/\)/)
|
52
50
|
|
53
|
-
|
51
|
+
right = right[0...right.index(/\)/)]
|
54
52
|
|
55
|
-
|
53
|
+
end
|
56
54
|
|
57
|
-
|
55
|
+
original_string = "#{left}=~#{right}"
|
58
56
|
|
59
|
-
|
57
|
+
replacement_string = "#{left.rstrip} = #{left.rstrip}.match(#{right.lstrip.rstrip})"
|
60
58
|
|
61
|
-
|
59
|
+
input_string = input_string.sub(original_string, replacement_string)
|
62
60
|
|
63
|
-
|
61
|
+
input_string = input_string.gsub(" aannddy ", " && ").gsub(" orriioo ", " || ").gsub("nnoottyy", "!")
|
64
62
|
|
65
63
|
end
|
66
64
|
|
67
|
-
|
65
|
+
return input_string
|
66
|
+
|
67
|
+
end
|
68
|
+
|
69
|
+
input_file_contents = input_file_contents.collect { |element| element.sub("==", "===") }
|
70
|
+
|
71
|
+
input_file_contents = input_file_contents.collect { |element| element.sub("!=", "!==") }
|
72
|
+
|
73
|
+
input_file_contents = input_file_contents.collect { |element| element.sub("equequ", "==") }
|
68
74
|
|
69
|
-
|
75
|
+
input_file_contents = input_file_contents.collect { |element| element.sub("elsuf", "else if") }
|
70
76
|
|
71
|
-
|
77
|
+
input_file_contents = compile_existential_operators(input_file_contents)
|
72
78
|
|
73
|
-
|
79
|
+
input_file_contents = compile_undefined_operator(input_file_contents)
|
74
80
|
|
75
|
-
|
81
|
+
input_file_contents = input_file_contents.collect { |element| compile_power_operator(element) }
|
76
82
|
|
77
|
-
|
83
|
+
input_file_contents = input_file_contents.collect { |element| compile_match_operator(element) }
|
78
84
|
|
79
|
-
|
85
|
+
input_file_contents = input_file_contents.collect { |element| element.gsub("_!;", ";") }
|
80
86
|
|
81
|
-
|
87
|
+
return input_file_contents
|
82
88
|
|
83
|
-
|
89
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require_relative 'replace_strings'
|
2
|
+
|
3
|
+
def compile_require_statements(input_file_contents)
|
4
|
+
|
5
|
+
# This method automatically assigns variables to Node.js require statements
|
6
|
+
#
|
7
|
+
# Example:
|
8
|
+
#
|
9
|
+
# require 'fs'
|
10
|
+
#
|
11
|
+
# will compile to
|
12
|
+
#
|
13
|
+
# var fs = require('fs')
|
14
|
+
|
15
|
+
modified_file_contents = input_file_contents.collect {|element| replace_strings(element)}
|
16
|
+
|
17
|
+
possible_require_calls = modified_file_contents.reject {|element| !element.include?("require")}
|
18
|
+
|
19
|
+
possible_require_calls.each do |statement|
|
20
|
+
|
21
|
+
original_statement = input_file_contents[modified_file_contents.index(statement)]
|
22
|
+
|
23
|
+
before,required_module = original_statement.split("require")
|
24
|
+
|
25
|
+
unless before.include?("=")
|
26
|
+
|
27
|
+
required_module = required_module.strip
|
28
|
+
|
29
|
+
required_module = required_module[2...-2] if required_module.include?("(") and required_module.include?(")")
|
30
|
+
|
31
|
+
required_module = required_module[1...-1] if required_module.include?("'")
|
32
|
+
|
33
|
+
replacement_string = "#{required_module} = #{original_statement}"
|
34
|
+
|
35
|
+
input_file_contents[modified_file_contents.index(statement)] = replacement_string
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
return input_file_contents
|
42
|
+
|
43
|
+
end
|
@@ -3,6 +3,46 @@
|
|
3
3
|
# These are some interesting methods that we really miss in Javascript.
|
4
4
|
# So we have made these methods available
|
5
5
|
|
6
|
+
def compile_complex_methods(input_file_contents)
|
7
|
+
|
8
|
+
method_map_replacement = {
|
9
|
+
|
10
|
+
".include" => [".indexOf"," != -1"],
|
11
|
+
|
12
|
+
}
|
13
|
+
|
14
|
+
method_map_replacement.each do |val,key|
|
15
|
+
|
16
|
+
possible_complex_method_calls = input_file_contents.reject {|element| !element.include?(val)}
|
17
|
+
|
18
|
+
possible_complex_method_calls.each do |statement|
|
19
|
+
|
20
|
+
before,after = statement.split(val)
|
21
|
+
|
22
|
+
after,remains = after.split
|
23
|
+
|
24
|
+
if after[-1].eql?(")")
|
25
|
+
|
26
|
+
after = after[0...-1] + key[1] + after[-1]
|
27
|
+
|
28
|
+
elsif after.strip.eql?(after)
|
29
|
+
|
30
|
+
after = after + key[1]
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
reconstructed_statement = before + key[0] + after + remains
|
35
|
+
|
36
|
+
input_file_contents[input_file_contents.index(statement)] = reconstructed_statement
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
return input_file_contents
|
43
|
+
|
44
|
+
end
|
45
|
+
|
6
46
|
method_map_replacement = {
|
7
47
|
|
8
48
|
".split" => ".split(\" \")",
|
@@ -19,7 +59,7 @@
|
|
19
59
|
|
20
60
|
".reverse" => ".reverse()",
|
21
61
|
|
22
|
-
".empty
|
62
|
+
".empty" => ".length == 0",
|
23
63
|
|
24
64
|
".upcase" => ".toUpperCase()",
|
25
65
|
|
@@ -53,6 +93,8 @@
|
|
53
93
|
|
54
94
|
end
|
55
95
|
|
96
|
+
modified_file_contents = compile_complex_methods(modified_file_contents)
|
97
|
+
|
56
98
|
return modified_file_contents
|
57
99
|
|
58
100
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require_relative 'read_file_line_by_line'
|
2
|
+
require_relative 'replace_strings'
|
2
3
|
|
3
4
|
def compile_whitespace_delimited_functions(input_file_contents, function_names, temporary_nila_file)
|
4
5
|
|
@@ -52,25 +53,31 @@ require_relative 'read_file_line_by_line'
|
|
52
53
|
|
53
54
|
joined_file_contents = input_file_contents.join
|
54
55
|
|
56
|
+
test_contents = replace_strings(joined_file_contents)
|
57
|
+
|
55
58
|
function_names.each do |list_of_functions|
|
56
59
|
|
57
60
|
list_of_functions.each do |function|
|
58
61
|
|
59
|
-
|
62
|
+
if test_contents.include?(function)
|
63
|
+
|
64
|
+
matching_strings = extract(joined_file_contents, function+" ", "\n")
|
65
|
+
|
66
|
+
matching_strings.each do |string|
|
60
67
|
|
61
|
-
|
68
|
+
modified_string = string.dup
|
62
69
|
|
63
|
-
|
70
|
+
modified_string = modified_string.rstrip + modified_string.split(modified_string.rstrip)[1].gsub(" ", "")
|
64
71
|
|
65
|
-
|
72
|
+
modified_string = modified_string.sub(function+" ", function+"(")
|
66
73
|
|
67
|
-
|
74
|
+
modified_string = modified_string.split("#{function}(")[0] + "#{function}(" + modified_string.split("#{function}(")[1].lstrip
|
68
75
|
|
69
|
-
|
76
|
+
modified_string = modified_string.sub("\n", ")\n")
|
70
77
|
|
71
|
-
|
78
|
+
joined_file_contents = joined_file_contents.sub(string, modified_string)
|
72
79
|
|
73
|
-
|
80
|
+
end
|
74
81
|
|
75
82
|
end
|
76
83
|
|
data/lib/nilac/get_variables.rb
CHANGED
@@ -76,12 +76,16 @@ require_relative 'read_file_line_by_line'
|
|
76
76
|
|
77
77
|
line_by_line_contents = read_file_line_by_line(temporary_nila_file)
|
78
78
|
|
79
|
+
test_contents = line_by_line_contents.collect {|element| replace_strings(element)}
|
80
|
+
|
79
81
|
for_loop_variables = []
|
80
82
|
|
81
|
-
for_loop_statements =
|
83
|
+
for_loop_statements = test_contents.reject {|line| !line.include?("for")}
|
82
84
|
|
83
85
|
for_loop_statements = for_loop_statements.reject {|line| line.include?("forEach")}
|
84
86
|
|
87
|
+
puts for_loop_statements
|
88
|
+
|
85
89
|
for_loop_statements.each do |statement|
|
86
90
|
|
87
91
|
varis = statement.split("for (")[1].split(";",2)[0].split(",")
|
@@ -46,7 +46,7 @@ require_relative 'read_file_line_by_line'
|
|
46
46
|
|
47
47
|
def extract_blocks(file_contents)
|
48
48
|
|
49
|
-
javascript_regexp = /(if |
|
49
|
+
javascript_regexp = /(if |for |while |case |default:|switch\(|\(function\(|= function\(|function\(|((=|:)\s+\{))/
|
50
50
|
|
51
51
|
block_starting_lines = file_contents.dup.reject { |element| element.index(javascript_regexp).nil? }[1..-1]
|
52
52
|
|
@@ -62,7 +62,7 @@ require_relative 'read_file_line_by_line'
|
|
62
62
|
|
63
63
|
end
|
64
64
|
|
65
|
-
block_ending_lines = file_contents.dup.each_index.select { |index| (file_contents[index].eql? " }\n" or file_contents[index].eql? " };\n" or file_contents[index].
|
65
|
+
block_ending_lines = file_contents.dup.each_index.select { |index| (file_contents[index].eql? " }\n" or file_contents[index].eql? " };\n" or file_contents[index].strip.eql?("});\n"))}
|
66
66
|
|
67
67
|
modified_file_contents = file_contents.dup
|
68
68
|
|
@@ -0,0 +1,100 @@
|
|
1
|
+
def extract_blocks(statement_indexes, input_file_contents)
|
2
|
+
|
3
|
+
possible_if_blocks = []
|
4
|
+
|
5
|
+
if_block_counter = 0
|
6
|
+
|
7
|
+
extracted_blocks = []
|
8
|
+
|
9
|
+
controlregexp = /(if |while |def | do )/
|
10
|
+
|
11
|
+
for x in 0...if_statement_indexes.length-1
|
12
|
+
|
13
|
+
possible_if_blocks << input_file_contents[if_statement_indexes[x]..if_statement_indexes[x+1]]
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
end_counter = 0
|
18
|
+
|
19
|
+
end_index = []
|
20
|
+
|
21
|
+
current_block = []
|
22
|
+
|
23
|
+
possible_if_blocks.each_with_index do |block|
|
24
|
+
|
25
|
+
unless current_block[-1] == block[0]
|
26
|
+
|
27
|
+
current_block += block
|
28
|
+
|
29
|
+
else
|
30
|
+
|
31
|
+
current_block += block[1..-1]
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
current_block.each_with_index do |line, index|
|
37
|
+
|
38
|
+
if line.strip.eql? "end"
|
39
|
+
|
40
|
+
end_counter += 1
|
41
|
+
|
42
|
+
end_index << index
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
if end_counter > 0
|
49
|
+
|
50
|
+
until end_index.empty?
|
51
|
+
|
52
|
+
array_extract = current_block[0..end_index[0]].reverse
|
53
|
+
|
54
|
+
index_counter = 0
|
55
|
+
|
56
|
+
array_extract.each_with_index do |line|
|
57
|
+
|
58
|
+
break if (line.lstrip.index(controlregexp) != nil and line.lstrip.index(rejectionregexp).nil?)
|
59
|
+
|
60
|
+
index_counter += 1
|
61
|
+
|
62
|
+
end
|
63
|
+
|
64
|
+
block_extract = array_extract[0..index_counter].reverse
|
65
|
+
|
66
|
+
extracted_blocks << block_extract
|
67
|
+
|
68
|
+
block_start = current_block.index(block_extract[0])
|
69
|
+
|
70
|
+
block_end = current_block.index(block_extract[-1])
|
71
|
+
|
72
|
+
current_block[block_start..block_end] = "--ifblock#{if_block_counter}"
|
73
|
+
|
74
|
+
if_block_counter += 1
|
75
|
+
|
76
|
+
end_counter = 0
|
77
|
+
|
78
|
+
end_index = []
|
79
|
+
|
80
|
+
current_block.each_with_index do |line, index|
|
81
|
+
|
82
|
+
if line.strip.eql? "end"
|
83
|
+
|
84
|
+
end_counter += 1
|
85
|
+
|
86
|
+
end_index << index
|
87
|
+
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
97
|
+
|
98
|
+
return current_block, extracted_blocks
|
99
|
+
|
100
|
+
end
|
data/lib/nilac/version.rb
CHANGED
data/lib/nilac.rb
CHANGED
@@ -19,6 +19,8 @@ module Nilac
|
|
19
19
|
|
20
20
|
require 'nilac/extract_parsable_file'
|
21
21
|
|
22
|
+
require 'nilac/compile_require_statements'
|
23
|
+
|
22
24
|
require 'nilac/replace_multiline_comments'
|
23
25
|
|
24
26
|
require 'nilac/split_semicolon_seperated_expressions'
|
@@ -80,6 +82,8 @@ module Nilac
|
|
80
82
|
require 'nilac/create_mac_executable'
|
81
83
|
|
82
84
|
require 'nilac/parse_arguments'
|
85
|
+
|
86
|
+
require 'nilac/compile_classes'
|
83
87
|
|
84
88
|
class NilaCompiler
|
85
89
|
|
@@ -97,12 +101,16 @@ module Nilac
|
|
97
101
|
|
98
102
|
file_contents = extract_parsable_file(file_contents)
|
99
103
|
|
104
|
+
file_contents = compile_require_statements(file_contents)
|
105
|
+
|
100
106
|
file_contents, multiline_comments, temp_file, output_js_file = replace_multiline_comments(file_contents, input_file_path, *output_file_name)
|
101
107
|
|
102
108
|
file_contents, singleline_comments = replace_singleline_comments(file_contents)
|
103
109
|
|
104
110
|
file_contents = split_semicolon_seperated_expressions(file_contents)
|
105
111
|
|
112
|
+
compile_classes(file_contents)
|
113
|
+
|
106
114
|
file_contents = compile_heredocs(file_contents, temp_file)
|
107
115
|
|
108
116
|
file_contents,loop_vars = compile_loops(file_contents,temp_file)
|
@@ -315,8 +323,10 @@ end
|
|
315
323
|
|
316
324
|
if ARGV.include?("--test")
|
317
325
|
|
318
|
-
|
326
|
+
ARGV.delete("--test")
|
327
|
+
|
328
|
+
compiler = Nilac::NilaCompiler.new(ARGV)
|
319
329
|
|
320
|
-
compiler.start_compile()
|
330
|
+
compiler.start_compile()
|
321
331
|
|
322
332
|
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
Feature: Automatically add variable declaration for required modules. Very useful for Node.js developers.
|
2
|
+
Scenario: Input file with required modules
|
3
|
+
Given the input file "required_module.nila"
|
4
|
+
When the ~compiler is run
|
5
|
+
The output file must be "required_module.js"
|
6
|
+
The output file must equal "correct_required_module.js"
|
7
|
+
|
8
|
+
Configurations:
|
9
|
+
|
10
|
+
~compiler => lib/nilac.rb
|
11
|
+
:v $cliusage => ruby :v --test --compile $file
|
data/shark/features/loop.feature
CHANGED
@@ -0,0 +1,14 @@
|
|
1
|
+
//Written using Nila. Visit http://adhithyan15.github.io/nila
|
2
|
+
(function() {
|
3
|
+
var fs;
|
4
|
+
|
5
|
+
fs = require('fs');
|
6
|
+
|
7
|
+
fs.readFile('/etc/hosts','utf8',function(err,data) {
|
8
|
+
if (err) {
|
9
|
+
console.log(err);
|
10
|
+
}
|
11
|
+
console.log(data);
|
12
|
+
});
|
13
|
+
|
14
|
+
}).call(this);
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nilac
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.4.3.9.
|
4
|
+
version: 0.0.4.3.9.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adhithya Rajasekaran
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-11-
|
11
|
+
date: 2013-11-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: shark
|
@@ -55,6 +55,7 @@ files:
|
|
55
55
|
- lib/nilac/compile_conditional_structures.rb
|
56
56
|
- lib/nilac/compile_custom_function_map.rb
|
57
57
|
- lib/nilac/compile_default_values.rb
|
58
|
+
- lib/nilac/compile_existential_operator.rb
|
58
59
|
- lib/nilac/compile_hashes.rb
|
59
60
|
- lib/nilac/compile_heredocs.rb
|
60
61
|
- lib/nilac/compile_integers.rb
|
@@ -63,9 +64,11 @@ files:
|
|
63
64
|
- lib/nilac/compile_named_functions.rb
|
64
65
|
- lib/nilac/compile_operators.rb
|
65
66
|
- lib/nilac/compile_parallel_assignment.rb
|
67
|
+
- lib/nilac/compile_require_statements.rb
|
66
68
|
- lib/nilac/compile_ruby_methods.rb
|
67
69
|
- lib/nilac/compile_special_keywords.rb
|
68
70
|
- lib/nilac/compile_strings.rb
|
71
|
+
- lib/nilac/compile_ternary_operator.rb
|
69
72
|
- lib/nilac/compile_whitespace_delimited_functions.rb
|
70
73
|
- lib/nilac/create_mac_executable.rb
|
71
74
|
- lib/nilac/extract_parsable_file.rb
|
@@ -82,13 +85,14 @@ files:
|
|
82
85
|
- lib/nilac/replace_named_functions.rb
|
83
86
|
- lib/nilac/replace_singleline_comments.rb
|
84
87
|
- lib/nilac/replace_strings.rb
|
88
|
+
- lib/nilac/rollblocks.rb
|
85
89
|
- lib/nilac/split_semicolon_seperated_expressions.rb
|
86
90
|
- lib/nilac/strToArray.rb
|
87
91
|
- lib/nilac/version.rb
|
88
92
|
- nilac.gemspec
|
89
93
|
- shark/features/add_auto_return_statement.feature
|
90
94
|
- shark/features/array_and_string_indexing.feature
|
91
|
-
- shark/features/
|
95
|
+
- shark/features/automatic_require_statements.feature
|
92
96
|
- shark/features/barebones_compilation.feature
|
93
97
|
- shark/features/case_when.feature
|
94
98
|
- shark/features/default_method_parameters.feature
|
@@ -113,7 +117,6 @@ files:
|
|
113
117
|
- shark/features/unless_until.feature
|
114
118
|
- shark/features/whitespace_delimitation.feature
|
115
119
|
- shark/test_files/array_string_indexing.nila
|
116
|
-
- shark/test_files/array_sugar.js
|
117
120
|
- shark/test_files/array_sugar.nila
|
118
121
|
- shark/test_files/case.nila
|
119
122
|
- shark/test_files/class.nila
|
@@ -133,6 +136,7 @@ files:
|
|
133
136
|
- shark/test_files/correct_operators.js
|
134
137
|
- shark/test_files/correct_regular_if.js
|
135
138
|
- shark/test_files/correct_regular_while.js
|
139
|
+
- shark/test_files/correct_required_module.js
|
136
140
|
- shark/test_files/correct_return.js
|
137
141
|
- shark/test_files/correct_ruby_methods.js
|
138
142
|
- shark/test_files/correct_single_return.js
|
@@ -158,7 +162,9 @@ files:
|
|
158
162
|
- shark/test_files/regular_for.nila
|
159
163
|
- shark/test_files/regular_if.nila
|
160
164
|
- shark/test_files/regular_while.nila
|
165
|
+
- shark/test_files/required_module.nila
|
161
166
|
- shark/test_files/ruby_methods.nila
|
167
|
+
- shark/test_files/sample_class.nila
|
162
168
|
- shark/test_files/simple.nila
|
163
169
|
- shark/test_files/single_return.nila
|
164
170
|
- shark/test_files/splats.nila
|
@@ -1,11 +0,0 @@
|
|
1
|
-
Feature: This feature brings Ruby's Syntactic Sugar for Arrays to Nila
|
2
|
-
Scenario: Input file with Ruby style arrays
|
3
|
-
Given the input file "array_sugar.nila"
|
4
|
-
When the ~compiler is run
|
5
|
-
The output file must be "array_sugar.js"
|
6
|
-
The output file must equal "correct_array_sugar.js"
|
7
|
-
|
8
|
-
Configurations:
|
9
|
-
|
10
|
-
~compiler => lib/nilac.rb
|
11
|
-
:v $cliusage => ruby :v --compile $file
|
@@ -1,9 +0,0 @@
|
|
1
|
-
//Written using Nila. Visit http://adhithyan15.github.io/nila
|
2
|
-
(function() {
|
3
|
-
var date_time, names;
|
4
|
-
|
5
|
-
names = ["joe", "kelly", "bill", "james", "smith"];
|
6
|
-
|
7
|
-
date_time = ["\"The", "current", "date", "and", "time", "is", "\\" + (new Date().toString()) + \"];
|
8
|
-
|
9
|
-
}).call(this);
|