nilac 0.0.4.3.9.4 → 0.0.4.3.9.5
Sign up to get free protection for your applications and to get access to all the features.
- 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);
|