nilac 0.0.0.1

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.
data/bin/nilac ADDED
@@ -0,0 +1,1741 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+
4
+ #Nilac is the official Nila compiler. It compiles Nila into pure Javascript. Nilac is currently
5
+ #written in Ruby but will be self hosted in the upcoming years. Nila targets mostly the
6
+ #Node.js developers rather than client side developers.
7
+
8
+ #Nila was created by Adhithya Rajasekaran and Nilac is maintained by Adhithya Rajasekaran and Sri Madhavi Rajasekaran
9
+
10
+ require 'optparse'
11
+
12
+ def compile(input_file_path)
13
+
14
+ def read_file_line_by_line(input_path)
15
+
16
+ file_id = open(input_path)
17
+
18
+ file_line_by_line = file_id.readlines()
19
+
20
+ file_id.close
21
+
22
+ return file_line_by_line
23
+
24
+ end
25
+
26
+ def extract_parsable_array(input_file_contents)
27
+
28
+ #This method finds and removes the __END__ keyword and the following lines in a Nila file.
29
+
30
+ modified_file_contents = input_file_contents.dup
31
+
32
+ end_index = 0
33
+
34
+ input_file_contents.each_with_index do |line,index|
35
+
36
+ if line.strip.eql?("__END__")
37
+
38
+ end_index = index
39
+
40
+ end
41
+
42
+ end
43
+
44
+ if end_index == 0
45
+
46
+ output = modified_file_contents
47
+
48
+ else
49
+
50
+ output = modified_file_contents[0..end_index-1]
51
+
52
+ while output[-1].eql?("\n")
53
+
54
+ output.delete_at(-1)
55
+
56
+ end
57
+
58
+ end
59
+
60
+ return output
61
+
62
+ end
63
+
64
+ def replace_multiline_comments(input_file_contents,nila_file_path)
65
+
66
+ #This method will replace both the single and multiline comments
67
+ #
68
+ #Single line comment will be replaced by => --single_line_comment[n]
69
+ #
70
+ #Multiline comment will be replaced by => --multiline_comment[n]
71
+
72
+ def find_all_matching_indices(input_string,pattern)
73
+
74
+ locations = []
75
+
76
+ index = input_string.index(pattern)
77
+
78
+ while index != nil
79
+
80
+ locations << index
81
+
82
+ index = input_string.index(pattern,index+1)
83
+
84
+
85
+ end
86
+
87
+ return locations
88
+
89
+
90
+ end
91
+
92
+ def find_file_path(input_path,file_extension)
93
+
94
+ extension_remover = input_path.split(file_extension)
95
+
96
+ remaining_string = extension_remover[0].reverse
97
+
98
+ path_finder = remaining_string.index("/")
99
+
100
+ remaining_string = remaining_string.reverse
101
+
102
+ return remaining_string[0...remaining_string.length-path_finder]
103
+
104
+ end
105
+
106
+ def find_file_name(input_path,file_extension)
107
+
108
+ extension_remover = input_path.split(file_extension)
109
+
110
+ remaining_string = extension_remover[0].reverse
111
+
112
+ path_finder = remaining_string.index("/")
113
+
114
+ remaining_string = remaining_string.reverse
115
+
116
+ return remaining_string[remaining_string.length-path_finder..-1]
117
+
118
+ end
119
+
120
+ multiline_comments = []
121
+
122
+ file_contents_as_string = input_file_contents.join
123
+
124
+ modified_file_contents = file_contents_as_string.dup
125
+
126
+ multiline_comment_counter = 1
127
+
128
+ multiline_comments_start = find_all_matching_indices(file_contents_as_string,"=begin")
129
+
130
+ multiline_comments_end = find_all_matching_indices(file_contents_as_string,"=end")
131
+
132
+ for y in 0...multiline_comments_start.length
133
+
134
+ start_of_multiline_comment = multiline_comments_start[y]
135
+
136
+ end_of_multiline_comment = multiline_comments_end[y]
137
+
138
+ multiline_comment = file_contents_as_string[start_of_multiline_comment..end_of_multiline_comment+3]
139
+
140
+ modified_file_contents = modified_file_contents.gsub(multiline_comment,"--multiline_comment[#{multiline_comment_counter}]")
141
+
142
+ multiline_comment_counter += 1
143
+
144
+ multiline_comments << multiline_comment
145
+
146
+
147
+ end
148
+
149
+ temporary_nila_file = find_file_path(nila_file_path,".nila") + "temp_nila.nila"
150
+
151
+ output_js_file = find_file_path(nila_file_path,".nila") + find_file_name(nila_file_path,".nila") + ".js"
152
+
153
+ file_id = open(temporary_nila_file, 'w')
154
+
155
+ file_id2 = open(output_js_file, 'w')
156
+
157
+ file_id.write(modified_file_contents)
158
+
159
+ file_id2.write("//Written in Nila and compiled to Javascript. Have fun!\n\n")
160
+
161
+ file_id.close()
162
+
163
+ file_id2.close()
164
+
165
+ line_by_line_contents = read_file_line_by_line(temporary_nila_file)
166
+
167
+ comments = multiline_comments.dup
168
+
169
+ return line_by_line_contents,comments,temporary_nila_file,output_js_file
170
+
171
+ end
172
+
173
+ def split_semicolon_seperated_expressions(input_file_contents)
174
+
175
+ modified_file_contents = input_file_contents.dup
176
+
177
+ input_file_contents.each_with_index do |line,index|
178
+
179
+ if line.include?("\"")
180
+
181
+ first_index = line.index("\"")
182
+
183
+ modified_line = line.sub(line[first_index..line.index("\"",first_index+1)],"--string")
184
+
185
+ elsif line.include?("'")
186
+
187
+ first_index = line.index("'")
188
+
189
+ modified_line = line.sub(line[first_index..line.index("'",first_index+1)],"--string")
190
+
191
+ else
192
+
193
+ modified_line = line
194
+
195
+ end
196
+
197
+ if modified_line.include?(";")
198
+
199
+ replacement_line = modified_file_contents[index]
200
+
201
+ replacement_line = replacement_line.split(";").join("\n\n")
202
+
203
+ modified_file_contents[index] = replacement_line
204
+
205
+ end
206
+
207
+ end
208
+
209
+ return modified_file_contents
210
+
211
+ end
212
+
213
+ def compile_heredoc_strings(input_file_contents,temporary_nila_file)
214
+
215
+ #This method will compile all the Heredoc strings in Nila into pure
216
+ #Javascript strings. Ruby has two types of Heredocs. Currently, Nila doesn't support both of them.
217
+ #Here is an example of what Nila supports
218
+
219
+ #long_passage = <<-ipsumtext
220
+ #
221
+ #Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
222
+ #incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud
223
+ #exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute
224
+ #irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
225
+ #pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia
226
+ #deserunt mollit anim id est laborum.
227
+ #
228
+ #ipsumtext
229
+
230
+ #Heredocs preserve all the formatting
231
+
232
+ def find_all_matching_indices(input_string,pattern)
233
+
234
+ locations = []
235
+
236
+ index = input_string.index(pattern)
237
+
238
+ while index != nil
239
+
240
+ locations << index
241
+
242
+ index = input_string.index(pattern,index+1)
243
+
244
+
245
+ end
246
+
247
+ return locations
248
+
249
+
250
+ end
251
+
252
+ joined_file_contents = input_file_contents.join
253
+
254
+ modified_file_contents = joined_file_contents.dup
255
+
256
+ heredoc_start_locations = find_all_matching_indices(joined_file_contents,"<<-")
257
+
258
+ heredoc_start_locations.each do |location|
259
+
260
+ string_extract = joined_file_contents[location..-1]
261
+
262
+ end_of_first_line = string_extract.index("\n")
263
+
264
+ name_of_heredoc = string_extract[3...end_of_first_line].rstrip
265
+
266
+ heredoc_start,heredoc_end = find_all_matching_indices(string_extract,name_of_heredoc)
267
+
268
+ heredoc = string_extract[heredoc_start..heredoc_end+name_of_heredoc.length-1]
269
+
270
+ heredoc_content = heredoc.split(name_of_heredoc)
271
+
272
+ heredoc_content = heredoc_content[1].lstrip.rstrip.gsub("\n","\\n").gsub("\t","\\t")
273
+
274
+ modified_file_contents = modified_file_contents.sub(string_extract[heredoc_start-3..heredoc_end+name_of_heredoc.length-1],"\""+heredoc_content+"\"")
275
+
276
+ end
277
+
278
+ file_id = open(temporary_nila_file, 'w')
279
+
280
+ file_id.write(modified_file_contents)
281
+
282
+ file_id.close()
283
+
284
+ line_by_line_contents = read_file_line_by_line(temporary_nila_file)
285
+
286
+ return line_by_line_contents
287
+
288
+ end
289
+
290
+ def compile_interpolated_strings(input_file_contents)
291
+
292
+ modified_file_contents = input_file_contents.dup
293
+
294
+ input_file_contents.each_with_index do |line,index|
295
+
296
+ if line.include?("\#{")
297
+
298
+ interpolated_strings = line.scan(/\#{\S{1,}}/)
299
+
300
+ interpolated_strings.each do |interpol|
301
+
302
+ string_split = line.split(interpol)
303
+
304
+ if string_split[1].eql?("\"\n")
305
+
306
+ replacement_string = "\" + " + interpol[2...-1]
307
+
308
+ modified_file_contents[index] = modified_file_contents[index].sub(interpol+"\"",replacement_string)
309
+
310
+ elsif string_split[1].eql?("\")\n")
311
+
312
+ replacement_string = "\" + " + interpol[2...-1]
313
+
314
+ modified_file_contents[index] = modified_file_contents[index].sub(interpol+"\"",replacement_string)
315
+
316
+ else
317
+
318
+ replacement_string = "\" + " + interpol[2...-1] + " + \""
319
+
320
+ modified_file_contents[index] = modified_file_contents[index].sub(interpol,replacement_string)
321
+
322
+ end
323
+
324
+ end
325
+
326
+ end
327
+
328
+ end
329
+
330
+ return modified_file_contents
331
+
332
+ end
333
+
334
+ def replace_singleline_comments(input_file_contents)
335
+
336
+ single_line_comments = []
337
+
338
+ singleline_comment_counter = 1
339
+
340
+ for x in 0...input_file_contents.length
341
+
342
+ current_row = input_file_contents[x]
343
+
344
+ if current_row.include?("#")
345
+
346
+ comment_start = current_row.index("#")
347
+
348
+ if current_row[comment_start+1] != "{"
349
+
350
+ comment = current_row[comment_start..-1]
351
+
352
+ single_line_comments << comment
353
+
354
+ current_row = current_row.gsub(comment,"--single_line_comment[#{singleline_comment_counter}]")
355
+
356
+ singleline_comment_counter += 1
357
+
358
+ end
359
+
360
+ end
361
+
362
+ input_file_contents[x] = current_row
363
+
364
+ end
365
+
366
+ return input_file_contents,single_line_comments
367
+
368
+ end
369
+
370
+ def replace_named_functions(nila_file_contents,temporary_nila_file)
371
+
372
+ def extract_array(input_array,start_index,end_index)
373
+
374
+ return input_array[start_index..end_index]
375
+
376
+ end
377
+
378
+ end_locations = []
379
+
380
+ key_word_locations = []
381
+
382
+ start_blocks = []
383
+
384
+ end_blocks = []
385
+
386
+ nila_regexp = /(def )/
387
+
388
+ named_code_blocks = []
389
+
390
+ for x in 0...nila_file_contents.length
391
+
392
+ current_row = nila_file_contents[x]
393
+
394
+ if current_row.index(nila_regexp) != nil
395
+
396
+ key_word_locations << x
397
+
398
+ elsif current_row.include?("end\n")
399
+
400
+ end_locations << x
401
+
402
+
403
+ end
404
+
405
+
406
+ end
407
+
408
+ modified_file_contents = nila_file_contents.dup
409
+
410
+ for y in 0...end_locations.length
411
+
412
+ current_location = end_locations[y]
413
+
414
+ current_string = modified_file_contents[current_location]
415
+
416
+ finder_location = current_location
417
+
418
+ while current_string.index(nila_regexp) == nil
419
+
420
+ finder_location -= 1
421
+
422
+ current_string = modified_file_contents[finder_location]
423
+
424
+ end
425
+
426
+ code_block_begin = finder_location
427
+
428
+ code_block_end = current_location
429
+
430
+ start_blocks << code_block_begin
431
+
432
+ end_blocks << code_block_end
433
+
434
+ code_block_begin_string_split = modified_file_contents[code_block_begin].split(" ")
435
+
436
+ code_block_begin_string_split[0] = code_block_begin_string_split[0].reverse
437
+
438
+ code_block_begin_string = code_block_begin_string_split.join(" ")
439
+
440
+ modified_file_contents[code_block_begin] = code_block_begin_string
441
+
442
+ end
443
+
444
+ final_modified_file_contents = nila_file_contents.dup
445
+
446
+ joined_file_contents = final_modified_file_contents.join
447
+
448
+ while start_blocks.length != 0
449
+
450
+ top_most_level = start_blocks.min
451
+
452
+ top_most_level_index = start_blocks.index(top_most_level)
453
+
454
+ matching_level = end_blocks[top_most_level_index]
455
+
456
+ named_code_blocks << extract_array(final_modified_file_contents,top_most_level,matching_level)
457
+
458
+ start_blocks.delete_at(top_most_level_index)
459
+
460
+ end_blocks.delete(matching_level)
461
+
462
+ end
463
+
464
+ codeblock_counter = 1
465
+
466
+ named_functions = named_code_blocks.dup
467
+
468
+ nested_functions = []
469
+
470
+ named_code_blocks.each do |codeblock|
471
+
472
+ if joined_file_contents.include?(codeblock.join)
473
+
474
+ joined_file_contents = joined_file_contents.sub(codeblock.join,"--named_function[#{codeblock_counter}]\n")
475
+
476
+ codeblock_counter += 1
477
+
478
+ nested_functions = nested_functions + [[]]
479
+
480
+ else
481
+
482
+ nested_functions[codeblock_counter-2] << codeblock
483
+
484
+ named_functions.delete(codeblock)
485
+
486
+ end
487
+
488
+ end
489
+
490
+ file_id = open(temporary_nila_file, 'w')
491
+
492
+ file_id.write(joined_file_contents)
493
+
494
+ file_id.close()
495
+
496
+ line_by_line_contents = read_file_line_by_line(temporary_nila_file)
497
+
498
+ return line_by_line_contents,named_functions,nested_functions
499
+
500
+
501
+ end
502
+
503
+ def get_variables(input_file_contents,temporary_nila_file)
504
+
505
+ #This method is solely focused on getting a list of variables to be declared.
506
+ #Since Javascript is a dynamic language, Nila doesn't have to worry about following up on those variables.
507
+
508
+ #Semicolons are required in Javascript for successful compilation. So this method adds semicolons at the end of each
509
+ #variable usage statements.
510
+
511
+ variables = []
512
+
513
+ for x in 0...input_file_contents.length
514
+
515
+ current_row = input_file_contents[x]
516
+
517
+ #The condition below verifies if the rows contain any equation operators.
518
+
519
+ if current_row.include?("=")
520
+
521
+ current_row = current_row.rstrip + "\n"
522
+
523
+ current_row_split = current_row.split("=")
524
+
525
+ for y in 0...current_row_split.length
526
+
527
+ current_row_split[y] = current_row_split[y].strip
528
+
529
+
530
+ end
531
+
532
+ variables << current_row_split[0]
533
+
534
+
535
+ end
536
+
537
+ input_file_contents[x] = current_row
538
+
539
+ end
540
+
541
+ file_contents_as_string = input_file_contents.join
542
+
543
+ file_id = open(temporary_nila_file, 'w')
544
+
545
+ file_id.write(file_contents_as_string)
546
+
547
+ file_id.close()
548
+
549
+ line_by_line_contents = read_file_line_by_line(temporary_nila_file)
550
+
551
+ variable_declaration_string = "var " + variables.uniq.join(", ") + "\n\n"
552
+
553
+ line_by_line_contents = [variable_declaration_string,line_by_line_contents].flatten
554
+
555
+ return variables.uniq,line_by_line_contents
556
+
557
+ end
558
+
559
+ def remove_question_marks(input_file_contents,variable_list,temporary_nila_file)
560
+
561
+ #A method to remove question marks from global variable names. Local variables are dealt
562
+ #with in their appropriate scope.
563
+
564
+ #Params:
565
+ #input_file_contents => An array containing the contents of the input nila file
566
+ #variable_list => An array containing all the global variables declared in the file
567
+ #temporary_nila_file => A file object used to write temporary contents
568
+
569
+ #Example:
570
+
571
+ #Nila
572
+ #isprime? = false
573
+
574
+ #Javascript Output
575
+ #var isprime;
576
+ #isprime = false;
577
+
578
+ #Returns a modified input_file_contents with all the question marks removed
579
+
580
+ joined_file_contents = input_file_contents.join
581
+
582
+ variable_list.each do |var|
583
+
584
+ if var.include? "?"
585
+
586
+ joined_file_contents = joined_file_contents.gsub(var,var[0...-1])
587
+
588
+ end
589
+
590
+ end
591
+
592
+ file_id = open(temporary_nila_file, 'w')
593
+
594
+ file_id.write(joined_file_contents)
595
+
596
+ file_id.close()
597
+
598
+ line_by_line_contents = read_file_line_by_line(temporary_nila_file)
599
+
600
+ return line_by_line_contents
601
+
602
+ end
603
+
604
+ def compile_arrays(input_file_contents)
605
+
606
+ #Currently the following kinds of array constructs are compilable
607
+
608
+ # 1. %w{} syntax
609
+ # 2. Range - Coming soon!
610
+
611
+ def extract(input_string,pattern_start,pattern_end)
612
+
613
+ def find_all_matching_indices(input_string,pattern)
614
+
615
+ locations = []
616
+
617
+ index = input_string.index(pattern)
618
+
619
+ while index != nil
620
+
621
+ locations << index
622
+
623
+ index = input_string.index(pattern,index+1)
624
+
625
+
626
+ end
627
+
628
+ return locations
629
+
630
+
631
+ end
632
+
633
+ all_start_locations = find_all_matching_indices(input_string,pattern_start)
634
+
635
+ all_end_locations = find_all_matching_indices(input_string,pattern_end)
636
+
637
+ pattern = []
638
+
639
+ all_start_locations.each_with_index do |location,index|
640
+
641
+ pattern << input_string[location..all_end_locations[index]]
642
+
643
+ end
644
+
645
+ return pattern
646
+
647
+ end
648
+
649
+ def compile_w_syntax(input_string)
650
+
651
+ modified_input_string = input_string[3...-1]
652
+
653
+ string_split = modified_input_string.split(" ")
654
+
655
+ return string_split.to_s
656
+
657
+ end
658
+
659
+ modified_file_contents = input_file_contents.dup
660
+
661
+ input_file_contents.each_with_index do |line,index|
662
+
663
+ if line.include?("%w{")
664
+
665
+ string_arrays = extract(line,"%w{","}")
666
+
667
+ string_arrays.each do |array|
668
+
669
+ modified_file_contents[index] = modified_file_contents[index].sub(array,compile_w_syntax(array))
670
+
671
+ end
672
+
673
+ end
674
+
675
+ end
676
+
677
+ return modified_file_contents
678
+
679
+ end
680
+
681
+ def compile_named_functions(input_file_contents,named_code_blocks,nested_functions,temporary_nila_file)
682
+
683
+ #This method compiles all the named Nila functions. Below is an example of what is meant
684
+ #by named/explicit function
685
+
686
+ #def square(input_number)
687
+ #
688
+ # return input_number*input_number
689
+ #
690
+ #end
691
+
692
+ #The above function will compile to
693
+
694
+ #function square(input_number) {
695
+ #
696
+ # return input_number*input_number;
697
+ #
698
+ # }
699
+
700
+ def is_parameterless?(input_function_block)
701
+
702
+ if input_function_block[0].include?("(")
703
+
704
+ false
705
+
706
+ else
707
+
708
+ true
709
+
710
+ end
711
+
712
+ end
713
+
714
+ def lexical_scoped_variables(input_function_block)
715
+
716
+ #This method will pickup and declare all the variables inside a function block. In future, this method will be
717
+ #merged with the get variables method
718
+
719
+ variables = []
720
+
721
+ input_function_block.each do |line|
722
+
723
+ if line.include? "="
724
+
725
+ current_line_split = line.strip.split("=")
726
+
727
+ variables << current_line_split[0].rstrip
728
+
729
+ end
730
+
731
+ end
732
+
733
+ variables.uniq
734
+
735
+ end
736
+
737
+ def remove_question_marks(input_file_contents,input_list,temporary_nila_file)
738
+
739
+ joined_file_contents = input_file_contents.join
740
+
741
+ input_list.each do |element|
742
+
743
+ if element.include? "?"
744
+
745
+ joined_file_contents = joined_file_contents.gsub(element,element[0...-1])
746
+
747
+ end
748
+
749
+ end
750
+
751
+ file_id = open(temporary_nila_file, 'w')
752
+
753
+ file_id.write(joined_file_contents)
754
+
755
+ file_id.close()
756
+
757
+ line_by_line_contents = read_file_line_by_line(temporary_nila_file)
758
+
759
+ return line_by_line_contents
760
+
761
+ end
762
+
763
+ def add_auto_return_statement(input_array)
764
+
765
+ joined_array = input_array.join
766
+
767
+ reversed_input_array = input_array.reverse
768
+
769
+ if !joined_array.include?("return ")
770
+
771
+ rejected_array = reversed_input_array.reject {|content| content.eql?("\n") || content.lstrip.eql?("}\n")}
772
+
773
+ last_statement = rejected_array[0]
774
+
775
+ replacement_string = "return #{last_statement.lstrip}"
776
+
777
+ input_array[input_array.index(last_statement)] = replacement_string
778
+
779
+ end
780
+
781
+ return input_array
782
+
783
+ end
784
+
785
+ def compile_function(input_array,temporary_nila_file)
786
+
787
+ modified_input_array = input_array.dup
788
+
789
+ if is_parameterless?(modified_input_array)
790
+
791
+ if modified_input_array[0].include?("--single")
792
+
793
+ modified_input_array[0] = input_array[0].sub "def","function"
794
+
795
+ interim_string = modified_input_array[0].split("--single")
796
+
797
+ modified_input_array[0] = interim_string[0].rstrip + "() {\n--single" + interim_string[1]
798
+
799
+
800
+ elsif modified_input_array[0].include?("--multi")
801
+
802
+ modified_input_array[0] = input_array[0].sub "def","function"
803
+
804
+ interim_string = modified_input_array[0].split("--multi")
805
+
806
+ modified_input_array[0] = interim_string[0].rstrip + "() {\n--multi" + interim_string[1]
807
+
808
+ else
809
+
810
+ modified_input_array[0] = input_array[0].sub "def","function"
811
+
812
+ modified_input_array[0] = modified_input_array[0].rstrip + "() {\n"
813
+
814
+ end
815
+
816
+ else
817
+
818
+ if modified_input_array[0].include?("--single")
819
+
820
+ modified_input_array[0] = input_array[0].sub "def","function"
821
+
822
+ interim_string = modified_input_array[0].split("--single")
823
+
824
+ modified_input_array[0] = interim_string[0].rstrip + " {\n--single" + interim_string[1]
825
+
826
+
827
+ elsif modified_input_array[0].include?("--multi")
828
+
829
+ modified_input_array[0] = input_array[0].sub "def","function"
830
+
831
+ interim_string = modified_input_array[0].split("--multi")
832
+
833
+ modified_input_array[0] = interim_string[0].rstrip + " {\n--multi" + interim_string[1]
834
+
835
+ else
836
+
837
+ modified_input_array[0] = input_array[0].sub "def","function"
838
+
839
+ modified_input_array[0] = modified_input_array[0].rstrip + " {\n"
840
+
841
+ end
842
+
843
+ end
844
+
845
+ modified_input_array[-1] = input_array[-1].sub "end","}\n"
846
+
847
+ variables = lexical_scoped_variables(modified_input_array)
848
+
849
+ if !variables.empty?
850
+
851
+ variable_string = "\nvar " + variables.join(", ") + "\n"
852
+
853
+ modified_input_array.insert(1,variable_string)
854
+
855
+ end
856
+
857
+ modified_input_array = remove_question_marks(modified_input_array,variables,temporary_nila_file)
858
+
859
+ modified_input_array = add_auto_return_statement(modified_input_array)
860
+
861
+ return modified_input_array
862
+
863
+ end
864
+
865
+ def extract_function_name(input_code_block)
866
+
867
+ first_line = input_code_block[0]
868
+
869
+ first_line_split = first_line.split(" ")
870
+
871
+ if first_line_split[1].include?("(")
872
+
873
+ function_name,parameters = first_line_split[1].split("(")
874
+
875
+ else
876
+
877
+ function_name = first_line_split[1]
878
+
879
+ end
880
+
881
+ return function_name
882
+
883
+ end
884
+
885
+ joined_file_contents = input_file_contents.join
886
+
887
+ codeblock_counter = 1
888
+
889
+ function_names = []
890
+
891
+ named_code_blocks.each do |codeblock|
892
+
893
+ function_names[codeblock_counter-1] = []
894
+
895
+ joined_file_contents = joined_file_contents.sub("--named_function[#{codeblock_counter}]\n",compile_function(codeblock,temporary_nila_file).join)
896
+
897
+ codeblock_counter += 1
898
+
899
+ current_nested_functions = nested_functions[codeblock_counter-2]
900
+
901
+ function_names[codeblock_counter-2] << extract_function_name(codeblock)
902
+
903
+ current_nested_functions.each do |nested_function|
904
+
905
+ function_names[codeblock_counter-2] << extract_function_name(nested_function)
906
+
907
+ joined_file_contents = joined_file_contents.sub(nested_function.join,compile_function(nested_function,temporary_nila_file).join)
908
+
909
+ end
910
+
911
+ end
912
+
913
+ file_id = open(temporary_nila_file, 'w')
914
+
915
+ file_id.write(joined_file_contents)
916
+
917
+ file_id.close()
918
+
919
+ line_by_line_contents = read_file_line_by_line(temporary_nila_file)
920
+
921
+ return line_by_line_contents,function_names
922
+
923
+ end
924
+
925
+ def compile_custom_function_map(input_file_contents)
926
+
927
+ function_map = ["puts"]
928
+
929
+ function_map_replacements = {
930
+
931
+ "puts" => "console.log"
932
+
933
+ }
934
+
935
+ modified_file_contents = input_file_contents.dup
936
+
937
+ input_file_contents.each_with_index do |line,index|
938
+
939
+ function_map.each do |function|
940
+
941
+ if line.include?(function+"(") or line.include?(function+" ")
942
+
943
+ modified_file_contents[index] = line.sub(function,function_map_replacements[function])
944
+
945
+ end
946
+
947
+ end
948
+
949
+ end
950
+
951
+ return modified_file_contents,function_map_replacements.values
952
+
953
+ end
954
+
955
+ def compile_whitespace_delimited_functions(input_file_contents,function_names,temporary_nila_file)
956
+
957
+ def extract(input_string,pattern_start,pattern_end)
958
+
959
+ def find_all_matching_indices(input_string,pattern)
960
+
961
+ locations = []
962
+
963
+ index = input_string.index(pattern)
964
+
965
+ while index != nil
966
+
967
+ locations << index
968
+
969
+ index = input_string.index(pattern,index+1)
970
+
971
+
972
+ end
973
+
974
+ return locations
975
+
976
+
977
+ end
978
+
979
+ all_start_locations = find_all_matching_indices(input_string,pattern_start)
980
+
981
+ pattern = []
982
+
983
+ all_start_locations.each do |location|
984
+
985
+ extracted_string = input_string[location..-1]
986
+
987
+ pattern << extracted_string[0..extracted_string.index(pattern_end)]
988
+
989
+ end
990
+
991
+
992
+ return pattern
993
+
994
+ end
995
+
996
+ joined_file_contents = input_file_contents.join
997
+
998
+ function_names.each do |list_of_functions|
999
+
1000
+ list_of_functions.each do |function|
1001
+
1002
+ matching_strings = extract(joined_file_contents,function+" ","\n")
1003
+
1004
+ matching_strings.each do |string|
1005
+
1006
+ modified_string = string.dup
1007
+
1008
+ modified_string = modified_string.sub(function+" ",function+"(")
1009
+
1010
+ modified_string = modified_string.sub("\n",")\n")
1011
+
1012
+ joined_file_contents = joined_file_contents.sub(string,modified_string)
1013
+
1014
+ end
1015
+
1016
+ end
1017
+
1018
+ end
1019
+
1020
+ file_id = open(temporary_nila_file, 'w')
1021
+
1022
+ file_id.write(joined_file_contents)
1023
+
1024
+ file_id.close()
1025
+
1026
+ line_by_line_contents = read_file_line_by_line(temporary_nila_file)
1027
+
1028
+ return line_by_line_contents
1029
+
1030
+ end
1031
+
1032
+ def compile_conditional_structures(input_file_contents,temporary_nila_file)
1033
+
1034
+ #Currently the following conditional structures have been implemented
1035
+
1036
+ #1. If, Elsif, Else Statement
1037
+
1038
+
1039
+
1040
+ end
1041
+
1042
+ def compile_comments(input_file_contents,comments,temporary_nila_file)
1043
+
1044
+ #This method converts Nila comments into pure Javascript comments. This method
1045
+ #handles both single line and multiline comments.
1046
+
1047
+ file_contents_as_string = input_file_contents.join
1048
+
1049
+ single_line_comments = comments[0]
1050
+
1051
+ multiline_comments = comments[1]
1052
+
1053
+ single_line_comment_counter = 1
1054
+
1055
+ multi_line_comment_counter = 1
1056
+
1057
+ for x in 0...single_line_comments.length
1058
+
1059
+ current_singleline_comment = "--single_line_comment[#{single_line_comment_counter}]"
1060
+
1061
+ replacement_singleline_string = single_line_comments[x].sub("#","//")
1062
+
1063
+ file_contents_as_string = file_contents_as_string.sub(current_singleline_comment,replacement_singleline_string)
1064
+
1065
+ single_line_comment_counter += 1
1066
+
1067
+
1068
+ end
1069
+
1070
+ for y in 0...multiline_comments.length
1071
+
1072
+ current_multiline_comment = "--multiline_comment[#{multi_line_comment_counter}]"
1073
+
1074
+ replacement_multiline_string = multiline_comments[y].sub("=begin","/*\n")
1075
+
1076
+ replacement_multiline_string = replacement_multiline_string.sub("=end","\n*/")
1077
+
1078
+ file_contents_as_string = file_contents_as_string.sub(current_multiline_comment,replacement_multiline_string)
1079
+
1080
+ multi_line_comment_counter += 1
1081
+
1082
+ end
1083
+
1084
+ file_id = open(temporary_nila_file, 'w')
1085
+
1086
+ file_id.write(file_contents_as_string)
1087
+
1088
+ file_id.close()
1089
+
1090
+ line_by_line_contents = read_file_line_by_line(temporary_nila_file)
1091
+
1092
+ line_by_line_contents
1093
+
1094
+ end
1095
+
1096
+ def add_semicolons(input_file_contents)
1097
+
1098
+ def comment(input_string)
1099
+
1100
+ if input_string.include?("--single_line_comment")
1101
+
1102
+ true
1103
+
1104
+ elsif input_string.include?("--multiline_comment")
1105
+
1106
+ true
1107
+
1108
+ else
1109
+
1110
+ false
1111
+
1112
+ end
1113
+
1114
+ end
1115
+
1116
+ reject_regexp = /(function |if |else|switch |case|while |for )/
1117
+
1118
+ modified_file_contents = []
1119
+
1120
+ input_file_contents.each do |line|
1121
+
1122
+ if line.index(reject_regexp) == nil
1123
+
1124
+ if !comment(line)
1125
+
1126
+ if !line.eql?("\n")
1127
+
1128
+ if !line.lstrip.eql?("}\n")
1129
+
1130
+ if !line.lstrip.eql?("}\n\n")
1131
+
1132
+ modified_file_contents << line.rstrip + ";\n\n"
1133
+
1134
+ else
1135
+
1136
+ modified_file_contents << line
1137
+
1138
+ end
1139
+
1140
+ else
1141
+
1142
+ modified_file_contents << line
1143
+
1144
+ end
1145
+
1146
+ else
1147
+
1148
+ modified_file_contents << line
1149
+
1150
+ end
1151
+
1152
+ else
1153
+
1154
+ modified_file_contents << line
1155
+
1156
+ end
1157
+
1158
+ else
1159
+
1160
+ modified_file_contents << line
1161
+
1162
+ end
1163
+
1164
+ end
1165
+
1166
+ modified_file_contents
1167
+
1168
+ end
1169
+
1170
+ def pretty_print_javascript(javascript_file_contents,temporary_nila_file)
1171
+
1172
+ def reset_tabs(input_file_contents)
1173
+
1174
+ #This method removes all the predefined tabs to avoid problems in
1175
+ #later parts of the beautifying process.
1176
+
1177
+ for x in 0...input_file_contents.length
1178
+
1179
+ current_row = input_file_contents[x]
1180
+
1181
+ if !current_row.eql?("\n")
1182
+
1183
+ current_row = current_row.lstrip
1184
+
1185
+ end
1186
+
1187
+ input_file_contents[x] = current_row
1188
+
1189
+
1190
+ end
1191
+
1192
+ return input_file_contents
1193
+
1194
+ end
1195
+
1196
+ def find_all_matching_indices(input_string,pattern)
1197
+
1198
+ locations = []
1199
+
1200
+ index = input_string.index(pattern)
1201
+
1202
+ while index != nil
1203
+
1204
+ locations << index
1205
+
1206
+ index = input_string.index(pattern,index+1)
1207
+
1208
+
1209
+ end
1210
+
1211
+ return locations
1212
+
1213
+
1214
+ end
1215
+
1216
+ def convert_string_to_array(input_string,temporary_nila_file)
1217
+
1218
+ file_id = open(temporary_nila_file, 'w')
1219
+
1220
+ file_id.write(input_string)
1221
+
1222
+ file_id.close()
1223
+
1224
+ line_by_line_contents = read_file_line_by_line(temporary_nila_file)
1225
+
1226
+ return line_by_line_contents
1227
+
1228
+ end
1229
+
1230
+ def previous_formatting(input_string,tab_counter,temporary_nila_file)
1231
+
1232
+ string_as_array = convert_string_to_array(input_string,temporary_nila_file)
1233
+
1234
+ modified_array = []
1235
+
1236
+ string_as_array.each do |line|
1237
+
1238
+ modified_array << " "*tab_counter + line
1239
+
1240
+ end
1241
+
1242
+ return modified_array.join
1243
+
1244
+ end
1245
+
1246
+ javascript_regexp = /(function |function\()/
1247
+
1248
+ locations = []
1249
+
1250
+ javascript_file_contents = reset_tabs(javascript_file_contents)
1251
+
1252
+ joined_file_contents = javascript_file_contents.join
1253
+
1254
+ code_block_starting_locations = find_all_matching_indices(joined_file_contents,javascript_regexp)
1255
+
1256
+ code_block_ending_locations = find_all_matching_indices(joined_file_contents,"}")
1257
+
1258
+ combined_location = [code_block_starting_locations,code_block_ending_locations.dup].flatten.sort
1259
+
1260
+ last_matching_location = 0
1261
+
1262
+ self_invoking_function_extract = joined_file_contents[code_block_starting_locations[0]..code_block_ending_locations[-1]]
1263
+
1264
+ self_invoking_function_array = convert_string_to_array(self_invoking_function_extract,temporary_nila_file)
1265
+
1266
+ combined_location.delete_at(0); combined_location.delete_at(-1); code_block_ending_locations.delete_at(-1); code_block_starting_locations.delete_at(0)
1267
+
1268
+ modified_self_invoking_array = self_invoking_function_array.dup
1269
+
1270
+ for x in 1...self_invoking_function_array.length-1
1271
+
1272
+ modified_self_invoking_array[x] = " " + self_invoking_function_array[x]
1273
+
1274
+ end
1275
+
1276
+ modified_self_invoking_array[-1] = "\n\n" + modified_self_invoking_array[-1]
1277
+
1278
+ while code_block_ending_locations.length > 0
1279
+
1280
+ matching_location = combined_location[combined_location.index(code_block_ending_locations[0])-1]
1281
+
1282
+ location_among_start_locations = code_block_starting_locations.index(matching_location)
1283
+
1284
+ locations << [[matching_location,combined_location[combined_location.index(code_block_ending_locations[0])]]]
1285
+
1286
+ code_block_ending_locations.delete_at(0)
1287
+
1288
+ if code_block_ending_locations.length > 0
1289
+
1290
+ for x in location_among_start_locations-1..last_matching_location
1291
+
1292
+ locations[-1] << [code_block_starting_locations[x],code_block_ending_locations[0]]
1293
+
1294
+ code_block_ending_locations.delete_at(0)
1295
+
1296
+ end
1297
+
1298
+ end
1299
+
1300
+ last_matching_location = location_among_start_locations + 1
1301
+
1302
+ end
1303
+
1304
+ modified_locations = []
1305
+
1306
+ locations.each do |loc|
1307
+
1308
+ modified_locations << loc.sort
1309
+
1310
+ end
1311
+
1312
+ modified_joined_file_contents = joined_file_contents.dup
1313
+
1314
+ modified_joined_file_contents = modified_joined_file_contents.sub(self_invoking_function_extract,modified_self_invoking_array.join)
1315
+
1316
+ modified_locations.each do |location|
1317
+
1318
+ soft_tabs_counter = 2
1319
+
1320
+ location.each do |sublocation|
1321
+
1322
+ string_extract = joined_file_contents[sublocation[0]..sublocation[1]]
1323
+
1324
+ string_extract_array = convert_string_to_array(string_extract,temporary_nila_file)
1325
+
1326
+ if soft_tabs_counter > 1
1327
+
1328
+ string_extract_array[0] = " "*(soft_tabs_counter-1) + string_extract_array[0]
1329
+
1330
+ string_extract_array[-1] = " "*(soft_tabs_counter-1) + string_extract_array[-1]
1331
+
1332
+ end
1333
+
1334
+ for x in 1...string_extract_array.length-1
1335
+
1336
+ string_extract_array[x] = " "*soft_tabs_counter + string_extract_array[x]
1337
+
1338
+ end
1339
+
1340
+ if soft_tabs_counter > 1
1341
+
1342
+ modified_joined_file_contents = modified_joined_file_contents.sub(previous_formatting(string_extract,soft_tabs_counter-1,temporary_nila_file),string_extract_array.join)
1343
+
1344
+ else
1345
+
1346
+ modified_joined_file_contents = modified_joined_file_contents.sub(string_extract,string_extract_array.join)
1347
+
1348
+ end
1349
+
1350
+ soft_tabs_counter += 1
1351
+
1352
+ end
1353
+
1354
+ end
1355
+
1356
+ file_id = open(temporary_nila_file, 'w')
1357
+
1358
+ file_id.write(modified_joined_file_contents)
1359
+
1360
+ file_id.close()
1361
+
1362
+ line_by_line_contents = read_file_line_by_line(temporary_nila_file)
1363
+
1364
+ var_declaration_index = 0
1365
+
1366
+ for x in 0...line_by_line_contents.length
1367
+
1368
+ current_row = line_by_line_contents[x]
1369
+
1370
+ if current_row.lstrip.include?("var ")
1371
+
1372
+ var_declaration_index = x
1373
+
1374
+ break
1375
+
1376
+ end
1377
+
1378
+ end
1379
+
1380
+ empty_check = line_by_line_contents[x+1..x+4]
1381
+
1382
+ empty_check.each_with_index do |content,index|
1383
+
1384
+ empty_check[index] = content.lstrip
1385
+
1386
+ end
1387
+
1388
+ empty_check = empty_check.delete_if {|content| content.empty?}
1389
+
1390
+ if empty_check.empty?
1391
+
1392
+ line_by_line_contents.delete_at(x+1);line_by_line_contents.delete_at(x+2)
1393
+
1394
+ end
1395
+
1396
+ return line_by_line_contents
1397
+
1398
+ end
1399
+
1400
+ def pretty_print_nila(input_file_contents)
1401
+
1402
+ #Implementation is pending
1403
+
1404
+ end
1405
+
1406
+ def static_analysis(input_file_contents)
1407
+
1408
+ #Implementation is pending
1409
+
1410
+ end
1411
+
1412
+ def create_self_invoking_function(input_file_contents)
1413
+
1414
+ # A feature imported from Coffeescript. This makes all the function private by default
1415
+ # and prevents global variables from leaking.
1416
+
1417
+ modified_file_contents = ["(function() {\n\n",input_file_contents,"\n\n}).call(this);\n"].flatten
1418
+
1419
+ return modified_file_contents
1420
+
1421
+ end
1422
+
1423
+ def compile_license_functions(input_file_contents,temporary_nila_file)
1424
+
1425
+ #This method will make it easier for developers to add open source licensing to their projects
1426
+
1427
+ #Currently the following licenses are supported
1428
+
1429
+ #1. MIT License
1430
+
1431
+ #Example of MIT License => mit_license(year,authors)
1432
+
1433
+ #mit_license("2013","Adhithya Rajasekaran, Sri Madhavi Rajasekaran")
1434
+
1435
+ def find_all_matching_indices(input_string,pattern)
1436
+
1437
+ locations = []
1438
+
1439
+ index = input_string.index(pattern)
1440
+
1441
+ while index != nil
1442
+
1443
+ locations << index
1444
+
1445
+ index = input_string.index(pattern,index+1)
1446
+
1447
+
1448
+ end
1449
+
1450
+ return locations
1451
+
1452
+
1453
+ end
1454
+
1455
+ license_functions = ["mit_license(","apache_license"]
1456
+
1457
+ mit_license = <<-licensetext
1458
+
1459
+ /*
1460
+
1461
+ Copyright yer, <auth>
1462
+
1463
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”),
1464
+ to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
1465
+ and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
1466
+
1467
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
1468
+
1469
+ THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1470
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1471
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
1472
+ IN THE SOFTWARE.
1473
+
1474
+ */
1475
+
1476
+
1477
+ licensetext
1478
+
1479
+ apache_license = <<-licensetext
1480
+
1481
+ /*
1482
+
1483
+ Copyright [yer] [auth]
1484
+
1485
+ Licensed under the Apache License, Version 2.0 (the "License");
1486
+ you may not use this file except in compliance with the License.
1487
+ You may obtain a copy of the License at
1488
+
1489
+ http://www.apache.org/licenses/LICENSE-2.0
1490
+
1491
+ Unless required by applicable law or agreed to in writing, software
1492
+ distributed under the License is distributed on an "AS IS" BASIS,
1493
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1494
+ See the License for the specific language governing permissions and
1495
+ limitations under the License.
1496
+
1497
+ */
1498
+
1499
+
1500
+ licensetext
1501
+
1502
+ license_texts = [mit_license,apache_license]
1503
+
1504
+ license_params = [2,2]
1505
+
1506
+ license_replaceables = ["yer","auth","orgg"]
1507
+
1508
+ joined_file_contents = input_file_contents.join
1509
+
1510
+ license_functions.each_with_index do |function,index|
1511
+
1512
+ function_locations = find_all_matching_indices(joined_file_contents,function)
1513
+
1514
+ function_locations.each do |location|
1515
+
1516
+ string_extract = joined_file_contents[location..-1]
1517
+
1518
+ function_end = string_extract.index(")")
1519
+
1520
+ function_call = string_extract[0..function_end]
1521
+
1522
+ parameters = function_call.split(function)[1][0...-1]
1523
+
1524
+ parameters = parameters.split(":")
1525
+
1526
+ parameters.each_with_index do |param,index|
1527
+
1528
+ parameters[index] = param[1...-1]
1529
+
1530
+ end
1531
+
1532
+ replacement_string = license_texts[index]
1533
+
1534
+ for x in 0...parameters.length
1535
+
1536
+ replacement_string = replacement_string.sub(license_replaceables[x],parameters[x])
1537
+
1538
+ end
1539
+
1540
+ replacement_array = replacement_string.split("\n")
1541
+
1542
+ modified_replacement_array = replacement_array.dup
1543
+
1544
+ replacement_array.each_with_index do |line,index|
1545
+
1546
+ modified_replacement_array[index] = line.lstrip
1547
+
1548
+ end
1549
+
1550
+ replacement_string = replacement_array.join("\n")
1551
+
1552
+ if joined_file_contents.include?(function_call+";\n")
1553
+
1554
+ joined_file_contents = joined_file_contents.sub(function_call+";\n","")
1555
+
1556
+ else
1557
+
1558
+ joined_file_contents = joined_file_contents.sub(function_call+";","")
1559
+
1560
+ end
1561
+
1562
+ joined_file_contents = replacement_string.lstrip + "\n\n" + joined_file_contents
1563
+
1564
+ end
1565
+
1566
+ end
1567
+
1568
+ file_id = open(temporary_nila_file, 'w')
1569
+
1570
+ file_id.write(joined_file_contents)
1571
+
1572
+ file_id.close()
1573
+
1574
+ line_by_line_contents = read_file_line_by_line(temporary_nila_file)
1575
+
1576
+ return line_by_line_contents
1577
+
1578
+ end
1579
+
1580
+ def output_javascript(file_contents,output_file,temporary_nila_file)
1581
+
1582
+ file_id = open(output_file, 'w')
1583
+
1584
+ File.delete(temporary_nila_file)
1585
+
1586
+ file_id.write("// Generated by Nilac 0.0.1 Visit http://adhithyan15.github.com/nila to know more\n\n")
1587
+
1588
+ file_id.write(file_contents.join)
1589
+
1590
+ file_id.close()
1591
+
1592
+ end
1593
+
1594
+ file_contents = read_file_line_by_line(input_file_path)
1595
+
1596
+ file_contents = extract_parsable_array(file_contents)
1597
+
1598
+ file_contents,multiline_comments,temp_file,output_js_file = replace_multiline_comments(file_contents,input_file_path)
1599
+
1600
+ file_contents = split_semicolon_seperated_expressions(file_contents)
1601
+
1602
+ file_contents = compile_heredoc_strings(file_contents,temp_file)
1603
+
1604
+ file_contents = compile_interpolated_strings(file_contents)
1605
+
1606
+ file_contents,singleline_comments = replace_singleline_comments(file_contents)
1607
+
1608
+ file_contents,named_functions,nested_functions = replace_named_functions(file_contents,temp_file)
1609
+
1610
+ comments = [singleline_comments,multiline_comments]
1611
+
1612
+ list_of_variables,file_contents = get_variables(file_contents,temp_file)
1613
+
1614
+ file_contents = compile_arrays(file_contents)
1615
+
1616
+ file_contents, function_names = compile_named_functions(file_contents,named_functions,nested_functions,temp_file)
1617
+
1618
+ file_contents, ruby_functions = compile_custom_function_map(file_contents)
1619
+
1620
+ function_names << ruby_functions
1621
+
1622
+ file_contents = compile_whitespace_delimited_functions(file_contents,function_names,temp_file)
1623
+
1624
+ file_contents = remove_question_marks(file_contents,list_of_variables,temp_file)
1625
+
1626
+ file_contents = add_semicolons(file_contents)
1627
+
1628
+ file_contents = compile_comments(file_contents,comments,temp_file)
1629
+
1630
+ file_contents = create_self_invoking_function(file_contents)
1631
+
1632
+ file_contents = compile_license_functions(file_contents,temp_file)
1633
+
1634
+ file_contents = pretty_print_javascript(file_contents,temp_file)
1635
+
1636
+ output_javascript(file_contents,output_js_file,temp_file)
1637
+
1638
+
1639
+ end
1640
+
1641
+ def create_executable(input_file)
1642
+
1643
+ windows_output = `ocra --add-all-core #{input_file}`
1644
+
1645
+ end
1646
+
1647
+ def create_mac_executable(input_file)
1648
+
1649
+ def read_file_line_by_line(input_path)
1650
+
1651
+ file_id = open(input_path)
1652
+
1653
+ file_line_by_line = file_id.readlines()
1654
+
1655
+ file_id.close
1656
+
1657
+ return file_line_by_line
1658
+
1659
+ end
1660
+
1661
+ mac_file_contents = ["#!/usr/bin/env ruby"] + read_file_line_by_line(input_file)
1662
+
1663
+ mac_file_path = input_file.sub(".rb","")
1664
+
1665
+ file_id = open(mac_file_path,"w")
1666
+
1667
+ file_id.write(mac_file_contents.join)
1668
+
1669
+ file_id.close
1670
+
1671
+ end
1672
+
1673
+ def find_file_name(input_path,file_extension)
1674
+
1675
+ extension_remover = input_path.split(file_extension)
1676
+
1677
+ remaining_string = extension_remover[0].reverse
1678
+
1679
+ path_finder = remaining_string.index("\\")
1680
+
1681
+ remaining_string = remaining_string.reverse
1682
+
1683
+ return remaining_string[remaining_string.length-path_finder..-1]
1684
+
1685
+ end
1686
+
1687
+ options = {}
1688
+
1689
+ OptionParser.new do |opts|
1690
+ opts.banner = "Usage: nilac [options] nilafile"
1691
+
1692
+ opts.on("-c", "--compile FILE", "Compile to Javascript") do |file|
1693
+ current_directory = Dir.pwd
1694
+ file_path = current_directory + "/" + file
1695
+ compile(file_path)
1696
+ puts "Compilation Successful!"
1697
+
1698
+ end
1699
+
1700
+ opts.on("-r", "--run FILE", "Compile to Javascript and Run") do |file|
1701
+ current_directory = Dir.pwd
1702
+
1703
+ file_path = current_directory + "/" + file
1704
+
1705
+ compile(file_path)
1706
+
1707
+ js_file_name = find_file_name(file_path,".nila") + ".js"
1708
+
1709
+ node_output = `node #{js_file_name}`
1710
+
1711
+ puts node_output
1712
+
1713
+ end
1714
+
1715
+ opts.on("-b", "--build", "Builds Itself") do
1716
+
1717
+ create_executable("nilac.rb")
1718
+
1719
+ puts "Build Successful!"
1720
+
1721
+ end
1722
+
1723
+ opts.on("-m", "--buildmac", "Builds Mac Executables") do
1724
+
1725
+ file_path = Dir.pwd + "/nilac.rb"
1726
+
1727
+ create_mac_executable(file_path)
1728
+
1729
+ puts "Build Successful!"
1730
+
1731
+ end
1732
+
1733
+ opts.on("-v", "--version", "Version of Nilac") do
1734
+
1735
+ version_number = "0.0.1"
1736
+
1737
+ puts "Current Nilac Version: #{version_number}"
1738
+
1739
+ end
1740
+
1741
+ end.parse!