red 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +4 -0
- data/License.txt +20 -0
- data/Manifest.txt +41 -0
- data/PostInstall.txt +7 -0
- data/README.txt +28 -0
- data/Rakefile +4 -0
- data/config/hoe.rb +74 -0
- data/config/requirements.rb +15 -0
- data/lib/red/assignment_nodes.rb +126 -0
- data/lib/red/call_nodes.rb +85 -0
- data/lib/red/conditional_nodes.rb +63 -0
- data/lib/red/conjunction_nodes.rb +23 -0
- data/lib/red/constant_nodes.rb +47 -0
- data/lib/red/control_nodes.rb +127 -0
- data/lib/red/data_nodes.rb +92 -0
- data/lib/red/definition_nodes.rb +142 -0
- data/lib/red/errors.rb +95 -0
- data/lib/red/illegal_nodes.rb +63 -0
- data/lib/red/literal_nodes.rb +119 -0
- data/lib/red/variable_nodes.rb +37 -0
- data/lib/red/version.rb +9 -0
- data/lib/red/wrap_nodes.rb +51 -0
- data/lib/red.rb +161 -0
- data/script/console +10 -0
- data/script/destroy +14 -0
- data/script/generate +14 -0
- data/script/txt2html +82 -0
- data/setup.rb +1585 -0
- data/spec/red_spec.rb +11 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +10 -0
- data/tasks/deployment.rake +34 -0
- data/tasks/environment.rake +7 -0
- data/tasks/red.rake +49 -0
- data/tasks/rspec.rake +21 -0
- data/tasks/website.rake +17 -0
- data/website/index.html +86 -0
- data/website/index.txt +83 -0
- data/website/javascripts/rounded_corners_lite.inc.js +285 -0
- data/website/stylesheets/screen.css +138 -0
- data/website/template.html.erb +48 -0
- metadata +116 -0
@@ -0,0 +1,92 @@
|
|
1
|
+
module Red
|
2
|
+
class DataNode # :nodoc:
|
3
|
+
attr_reader :value
|
4
|
+
|
5
|
+
def initialize(value = nil)
|
6
|
+
@value = value
|
7
|
+
end
|
8
|
+
|
9
|
+
def compile_node(options = {})
|
10
|
+
return @value.inspect
|
11
|
+
end
|
12
|
+
|
13
|
+
def wrap_string(string, left_wrapper = "", right_wrapper = nil)
|
14
|
+
return "%s%s%s" % [left_wrapper, string, right_wrapper || left_wrapper]
|
15
|
+
end
|
16
|
+
|
17
|
+
class ErrorNode < DataNode # :nodoc:
|
18
|
+
def compile_node(options = {})
|
19
|
+
"_____ Error %s _____" % [@value]
|
20
|
+
end
|
21
|
+
|
22
|
+
def data_type
|
23
|
+
:error
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
class NilNode < DataNode # :nodoc:
|
28
|
+
def compile_node(options = {})
|
29
|
+
""
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
class OtherNode < DataNode # :nodoc:
|
34
|
+
end
|
35
|
+
|
36
|
+
class RangeNode < DataNode # :nodoc:
|
37
|
+
def initialize(*args)
|
38
|
+
case @@red_library
|
39
|
+
when :Prototype : super(*args)
|
40
|
+
else raise(BuildError::NoRangeConstructor, "#{@@red_library} JavaScript library has no literal range constructor")
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def compile_node(options = {})
|
45
|
+
case @@red_library
|
46
|
+
when :Prototype : return "$R(%s, %s%s)" % self.compile_internals
|
47
|
+
else return ""
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def compile_internals(options = {})
|
52
|
+
exclusive = @value.exclude_end? ? ", true" : ""
|
53
|
+
return [@value.begin, @value.end, exclusive]
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
class StringNode < DataNode # :nodoc:
|
58
|
+
def compile_node(options = {})
|
59
|
+
options[:quotes] ||= "'"
|
60
|
+
return wrap_string(@value, options[:quotes])
|
61
|
+
end
|
62
|
+
|
63
|
+
def data_type
|
64
|
+
:string
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
class SymbolNode < DataNode # :nodoc:
|
69
|
+
def compile_node(options = {})
|
70
|
+
self.camelize!(options[:not_camelized])
|
71
|
+
return wrap_string(@value, options[:quotes])
|
72
|
+
end
|
73
|
+
|
74
|
+
def camelize!(disabled = false)
|
75
|
+
return @value = @value.to_s unless camelize? && !disabled
|
76
|
+
words = @value.to_s.gsub(/@|\$/,'').split(/_| /)
|
77
|
+
underscore = words.shift if words.first.empty?
|
78
|
+
@value = (underscore ? '_' : '') + words[0] + words[1..-1].map {|word| word.capitalize}.join
|
79
|
+
end
|
80
|
+
|
81
|
+
def camelize?
|
82
|
+
is_not_a_constant_name = @value.to_s != @value.to_s.upcase
|
83
|
+
is_not_a_js_special_attribute = @value.to_s[0..1] != '__'
|
84
|
+
return is_not_a_constant_name && is_not_a_js_special_attribute
|
85
|
+
end
|
86
|
+
|
87
|
+
def data_type
|
88
|
+
:symbol
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,142 @@
|
|
1
|
+
module Red
|
2
|
+
class DefinitionNode # :nodoc:
|
3
|
+
class ClassNode # :nodoc:
|
4
|
+
def initialize(class_name, superclass, scope)
|
5
|
+
raise(BuildError::NoClassInheritance, "Class inheritance is currently not supported#{"for the #{@@red_library} JavaScript library";''}") if superclass
|
6
|
+
old_class = @@red_class
|
7
|
+
@@red_class = @class = class_name
|
8
|
+
@class_name, @superclass = [class_name, superclass].build_nodes
|
9
|
+
block_node = scope.assoc(:block) || scope
|
10
|
+
if initializer_node = block_node.rassoc(:initialize)
|
11
|
+
args_node = initializer_node.assoc(:scope).assoc(:block).assoc(:args)
|
12
|
+
@arguments = (args_node[1..-1] || []).build_nodes
|
13
|
+
@initializer = initializer_node.assoc(:scope).assoc(:block).reject {|node| node == args_node}.build_node
|
14
|
+
end
|
15
|
+
properties = block_node.select {|node| (node.first == :cvdecl) rescue false }
|
16
|
+
functions = block_node.select {|node| (node != initializer_node) && ![:block, :scope].include?(node) }
|
17
|
+
@slots = (properties | functions).build_nodes
|
18
|
+
@@red_class = old_class
|
19
|
+
end
|
20
|
+
|
21
|
+
def compile_node(options = {})
|
22
|
+
old_class = @@red_class
|
23
|
+
@@red_class = @class
|
24
|
+
if @initializer
|
25
|
+
output = self.compile_as_standard_class
|
26
|
+
else
|
27
|
+
output = self.compile_as_virtual_class
|
28
|
+
end
|
29
|
+
@@red_class = old_class
|
30
|
+
return output
|
31
|
+
end
|
32
|
+
|
33
|
+
def compile_as_standard_class(options = {})
|
34
|
+
class_name = @class_name.compile_node
|
35
|
+
arguments = @arguments.compile_nodes.join(', ')
|
36
|
+
slots = @slots.compile_nodes(:as_attribute => true)
|
37
|
+
initializer = @initializer.compile_node
|
38
|
+
return "%s%s = function(%s) { %s;%s }" % [self.var?, class_name, arguments, initializer, slots]
|
39
|
+
end
|
40
|
+
|
41
|
+
def compile_as_virtual_class(options = {})
|
42
|
+
class_name = @class_name.compile_node
|
43
|
+
slots = @slots.compile_nodes(:as_prototype => true).compact.join(', ')
|
44
|
+
return "%s%s = { %s }" % [self.var?, class_name, slots]
|
45
|
+
end
|
46
|
+
|
47
|
+
def var?
|
48
|
+
return "var " unless @class_name.is_a?(LiteralNode::NamespaceNode)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
class ClassMethodNode # :nodoc:
|
53
|
+
def initialize(receiver, function_name, scope)
|
54
|
+
@receiver, @function_name = [receiver, function_name].build_nodes
|
55
|
+
@arguments = (scope.assoc(:block).assoc(:args)[1..-1] || []).build_nodes
|
56
|
+
@lines = (scope.assoc(:block)[2..-1] || []).build_nodes
|
57
|
+
end
|
58
|
+
|
59
|
+
def compile_node(options = {})
|
60
|
+
case false
|
61
|
+
when options[:as_attribute].nil?
|
62
|
+
"this.%s = function(%s) { %s; }"
|
63
|
+
when options[:as_prototype].nil?
|
64
|
+
"%s: function(%s) { %s; }"
|
65
|
+
when !(options[:as_attribute].nil? && options[:as_prototype].nil?)
|
66
|
+
"function %s(%s) { %s; }"
|
67
|
+
end % self.compile_internals
|
68
|
+
end
|
69
|
+
|
70
|
+
def compile_internals(options = {})
|
71
|
+
function_name = @function_name.compile_node
|
72
|
+
arguments = @arguments.compile_nodes.join(', ')
|
73
|
+
lines = @lines.compile_nodes.compact.join('; ')
|
74
|
+
return [function_name, arguments, lines]
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
class InstanceMethodNode # :nodoc:
|
79
|
+
def initialize(function_name, scope)
|
80
|
+
block = scope.assoc(:block)
|
81
|
+
@@rescue_is_safe = (block[2].first == :rescue)
|
82
|
+
@function_name = (function_name == :function ? nil : function_name).build_node
|
83
|
+
@arguments = (block.assoc(:args)[1..-1] || []).build_nodes
|
84
|
+
@lines = (block[2..-1] || []).build_nodes
|
85
|
+
end
|
86
|
+
|
87
|
+
def compile_node(options = {})
|
88
|
+
case false
|
89
|
+
when options[:as_attribute].nil?
|
90
|
+
"this.%s = function(%s) { %s; }"
|
91
|
+
when options[:as_prototype].nil?
|
92
|
+
"%s: function(%s) { %s; }"
|
93
|
+
when !(options[:as_attribute].nil? && options[:as_prototype].nil?)
|
94
|
+
"function %s(%s) { %s; }"
|
95
|
+
end % self.compile_internals
|
96
|
+
end
|
97
|
+
|
98
|
+
def compile_internals(options = {})
|
99
|
+
function_name = @function_name.compile_node
|
100
|
+
arguments = @arguments.compile_nodes.join(', ')
|
101
|
+
lines = @lines.compile_nodes.compact.join('; ')
|
102
|
+
return [function_name, arguments, lines]
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
class ModuleNode # :nodoc:
|
107
|
+
def initialize(module_name, scope)
|
108
|
+
old_module = @@red_module
|
109
|
+
@@red_module = module_name
|
110
|
+
@module_name, @scope = [module_name, scope].build_nodes
|
111
|
+
@@red_module = old_module
|
112
|
+
end
|
113
|
+
|
114
|
+
def compile_node(options = {})
|
115
|
+
return "%s" % self.compile_internals
|
116
|
+
end
|
117
|
+
|
118
|
+
def compile_internals(options = {})
|
119
|
+
old_module = @@red_module
|
120
|
+
@@red_module = @module_name.compile_node
|
121
|
+
scope = @scope.compile_node
|
122
|
+
@@red_module = old_module
|
123
|
+
return [scope]
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
|
128
|
+
class ObjectLiteralNode # :nodoc:
|
129
|
+
def initialize(receiver, scope)
|
130
|
+
block_node = scope.assoc(:block) || scope
|
131
|
+
properties = block_node.select {|node| (node.first == :cvdecl) rescue false }
|
132
|
+
functions = block_node.select {|node| ![:block, :scope].include?(node) }
|
133
|
+
@slots = (properties | functions).build_nodes
|
134
|
+
end
|
135
|
+
|
136
|
+
def compile_node(options = {})
|
137
|
+
slots = @slots.compile_nodes(:as_prototype => true).compact.join(', ')
|
138
|
+
return "{ %s }" % [slots]
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
data/lib/red/errors.rb
ADDED
@@ -0,0 +1,95 @@
|
|
1
|
+
module Red
|
2
|
+
class BuildError < StandardError # :nodoc:
|
3
|
+
# Raised when a hash is given a key other than a +String+ or +Symbol+
|
4
|
+
# object.
|
5
|
+
class NoArbitraryHashKeys < BuildError # :nodoc:
|
6
|
+
end
|
7
|
+
|
8
|
+
# Raised when a lone +Regex+ is used as a condition.
|
9
|
+
class NoArbitraryMatch < BuildError # :nodoc:
|
10
|
+
end
|
11
|
+
|
12
|
+
# Raised when a +rescue+ block is placed in a way that would produce a
|
13
|
+
# JavaScript syntax error.
|
14
|
+
class NoArbitraryRescue < BuildError # :nodoc:
|
15
|
+
end
|
16
|
+
|
17
|
+
# Raised when a +BEGIN+ or +END+ block is used.
|
18
|
+
class NoBEGINorEND < BuildError # :nodoc:
|
19
|
+
end
|
20
|
+
|
21
|
+
# Raised when a block is declared as a method argument.
|
22
|
+
class NoBlockArguments < BuildError # :nodoc:
|
23
|
+
end
|
24
|
+
|
25
|
+
# Raised when a +break+ keyword is followed by an argument.
|
26
|
+
class NoBreakArguments < BuildError # :nodoc:
|
27
|
+
end
|
28
|
+
|
29
|
+
# Raised when the active JavaScript library does not support class
|
30
|
+
# inheritance.
|
31
|
+
class NoClassInheritance < BuildError # :nodoc:
|
32
|
+
end
|
33
|
+
|
34
|
+
# Raised when the active JavaScript library does not support calls to
|
35
|
+
# class variables or declarations of class variables.
|
36
|
+
class NoClassVariables < BuildError # :nodoc:
|
37
|
+
end
|
38
|
+
|
39
|
+
# Raised when a +redo+ or +retry+ keyword is used.
|
40
|
+
class NoDoOvers < BuildError # :nodoc:
|
41
|
+
end
|
42
|
+
|
43
|
+
# Raised when a flipflop operator is called using <tt>..</tt> or
|
44
|
+
# <tt>...</tt>
|
45
|
+
class NoFlipflops < BuildError # :nodoc:
|
46
|
+
end
|
47
|
+
|
48
|
+
# Raised when a +begin+ block is used for multiline assignment.
|
49
|
+
class NoMultilineAssignment < BuildError # :nodoc:
|
50
|
+
end
|
51
|
+
|
52
|
+
# Raised when a comma-separated multiple assignment expression is used.
|
53
|
+
class NoMultipleAssignment < BuildError # :nodoc:
|
54
|
+
end
|
55
|
+
|
56
|
+
# Raised when a +break+ keyword is followed by an argument.
|
57
|
+
class NoNextArguments < BuildError # :nodoc:
|
58
|
+
end
|
59
|
+
|
60
|
+
# Raised when the active JavaScript library has no native literal range
|
61
|
+
# constructor.
|
62
|
+
class NoRangeConstructor < BuildError # :nodoc:
|
63
|
+
end
|
64
|
+
|
65
|
+
# Raised when a +Regex+ literal declaration contains evaluated content.
|
66
|
+
class NoRegexEvaluation < BuildError # :nodoc:
|
67
|
+
end
|
68
|
+
|
69
|
+
# Raised when an +Error+ class is passed to +rescue+.
|
70
|
+
class NoSpecificRescue < BuildError # :nodoc:
|
71
|
+
end
|
72
|
+
|
73
|
+
# Raised when the active JavaScript library has no special array
|
74
|
+
# constructor.
|
75
|
+
class NoSplatConstructor < BuildError # :nodoc:
|
76
|
+
end
|
77
|
+
|
78
|
+
# Raised when the active JavaScript library does not support calls to
|
79
|
+
# +super+.
|
80
|
+
class NoSuperMethods < BuildError # :nodoc:
|
81
|
+
end
|
82
|
+
|
83
|
+
# Raised when a +Symbol+ literal declaration contains evaluated content.
|
84
|
+
class NoSymbolEvaluation < BuildError # :nodoc:
|
85
|
+
end
|
86
|
+
|
87
|
+
# Raised when an +undef+ keyword is used.
|
88
|
+
class NoUndef < BuildError # :nodoc:
|
89
|
+
end
|
90
|
+
|
91
|
+
# Raised when an unknown ParseTree sexp type is called to initialize.
|
92
|
+
class UnknownNode < BuildError # :nodoc:
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
module Red
|
2
|
+
class IllegalNode # :nodoc:
|
3
|
+
class BlockArgument < IllegalNode # :nodoc:
|
4
|
+
def initialize(*args)
|
5
|
+
raise(BuildError::NoBlockArguments, "JavaScript does not support block arguments")
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
class FlipflopNode < IllegalNode # :nodoc:
|
10
|
+
def initialize(*args)
|
11
|
+
raise(BuildError::NoFlipflops, "JavaScript does not support flip-flop operators")
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
class MatchNode < IllegalNode # :nodoc:
|
16
|
+
def initialize(*args)
|
17
|
+
raise(BuildError::NoArbitraryMatch, "JavaScript does not support arbitrary boolean matching")
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class MultipleAssignmentNode < IllegalNode # :nodoc:
|
22
|
+
def initialize(*args)
|
23
|
+
raise(BuildError::NoMultipleAssignment, "JavaScript does not support catalogued assignment using multiple comma-separated expressions")
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
class PostexeNode < IllegalNode # :nodoc:
|
28
|
+
def initialize(*args)
|
29
|
+
raise(BuildError::NoBEGINorEND, "BEGIN and END blocks are not supported")
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
class RedoNode < IllegalNode # :nodoc:
|
34
|
+
def initialize(*args)
|
35
|
+
raise(BuildError::NoDoOvers, "JavaScript has no redo keyword")
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
class RegexEvaluationNode < IllegalNode # :nodoc:
|
40
|
+
def initialize(*args)
|
41
|
+
raise(BuildError::NoRegexEvaluation, "Construction of JavaScript regular expressions with evaluated content is not supported")
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
class RetryNode < IllegalNode # :nodoc:
|
46
|
+
def initialize(*args)
|
47
|
+
raise(BuildError::NoDoOvers, "JavaScript has no retry keyword")
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
class SymbolEvaluationNode < IllegalNode # :nodoc:
|
52
|
+
def initialize(*args)
|
53
|
+
raise(BuildError::NoSymbolEvaluation, "Construction of JavaScript identifiers through evaluated symbols is not supported")
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
class UndefNode < IllegalNode # :nodoc:
|
58
|
+
def initialize(*args)
|
59
|
+
raise(BuildError::NoUndef, "JavaScript does not support undefinition of methods")
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,119 @@
|
|
1
|
+
module Red
|
2
|
+
class LiteralNode # :nodoc:
|
3
|
+
def initialize(*elements)
|
4
|
+
@initial = elements.shift.build_node
|
5
|
+
@subsequent = elements.build_nodes
|
6
|
+
end
|
7
|
+
|
8
|
+
def compile_node(options = {})
|
9
|
+
content = @initial.compile_node(options)
|
10
|
+
return "%s" % [content]
|
11
|
+
end
|
12
|
+
|
13
|
+
def data_type
|
14
|
+
return :node unless @initial.is_a?(DataNode)
|
15
|
+
case @initial
|
16
|
+
when DataNode::NilNode : :nil
|
17
|
+
when DataNode::RangeNode : :range
|
18
|
+
when DataNode::StringNode : :string
|
19
|
+
when DataNode::SymbolNode : :symbol
|
20
|
+
else @initial.value.is_a?(Numeric) ? :numeric : :regexp
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
class ArrayNode < LiteralNode # :nodoc:
|
25
|
+
def compile_node(options = {})
|
26
|
+
elements = @subsequent.unshift(@initial).compile_nodes.join(', ')
|
27
|
+
return "[%s]" % [elements]
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
class HashNode < LiteralNode # :nodoc:
|
32
|
+
def initialize(*array)
|
33
|
+
@hash = {}
|
34
|
+
Hash[*array].each do |k,v|
|
35
|
+
key, value = [k,v].build_nodes
|
36
|
+
raise(BuildError::NoArbitraryHashKeys, "JavaScript does not support non-string objects as hash keys") unless [:string, :symbol].include?(key.data_type)
|
37
|
+
@hash[key] = value
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def compile_node(options = {})
|
42
|
+
pairs = @hash.map { |k,v| "%s: %s" % [k.compile_node(:quotes => "'"), v.compile_node(:as_argument => true)] }.join(', ')
|
43
|
+
"{ %s }" % [pairs]
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
class MultilineNode < LiteralNode # :nodoc:
|
48
|
+
def compile_node(options = {})
|
49
|
+
lines = @subsequent.unshift(@initial).compile_nodes(options).compact.join('; ')
|
50
|
+
return "%s" % [lines]
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
class NamespaceNode < LiteralNode # :nodoc:
|
55
|
+
def compile_node(options = {})
|
56
|
+
namespaces = @initial.compile_node
|
57
|
+
class_name = @subsequent.first.compile_node
|
58
|
+
return "%s.%s" % [namespaces, class_name]
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
class OtherNode < LiteralNode # :nodoc:
|
63
|
+
end
|
64
|
+
|
65
|
+
class RangeNode < LiteralNode # :nodoc:
|
66
|
+
def initialize(*args)
|
67
|
+
case @@red_library
|
68
|
+
when :Prototype : super(*args)
|
69
|
+
else raise(BuildError::NoRangeConstructor, "#{@@red_library} JavaScript library has no literal range constructor")
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def compile_node(options = {})
|
74
|
+
start = @initial.compile_node(:as_argument => true)
|
75
|
+
finish = @subsequent.first.compile_node(:as_argument => true)
|
76
|
+
case @@red_library
|
77
|
+
when :Prototype : return "$R(%s, %s)" % [start, finish]
|
78
|
+
else ""
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
class ExclusiveNode < RangeNode # :nodoc:
|
83
|
+
def compile_node(options = {})
|
84
|
+
start = @initial.compile_node(:as_argument => true)
|
85
|
+
finish = @subsequent.first.compile_node(:as_argument => true)
|
86
|
+
case @@red_library
|
87
|
+
when :Prototype : return "$R(%s, %s, true)" % [start, finish]
|
88
|
+
else ""
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
class SplatNode < LiteralNode # :nodoc:
|
95
|
+
def initialize(*args)
|
96
|
+
case @@red_library
|
97
|
+
when :Prototype : super(*args)
|
98
|
+
else raise(BuildError::NoSplatConstructor, "Splat array constructor not supported for #{@@red_library} JavaScript library")
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def compile_node(options = {})
|
103
|
+
initial = @initial.compile_node
|
104
|
+
case @@red_library
|
105
|
+
when :Prototype : return "$A(%s)" % [initial]
|
106
|
+
else ""
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
class StringNode < LiteralNode # :nodoc:
|
112
|
+
def compile_node(options = {})
|
113
|
+
initial = @initial.compile_node(options)
|
114
|
+
subsequent = @subsequent.map {|element| " + %s" % [element.compile_node]}.join
|
115
|
+
return "%s%s" % [initial, subsequent]
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Red
|
2
|
+
class VariableNode # :nodoc:
|
3
|
+
def initialize(variable_name)
|
4
|
+
@variable_name = variable_name.build_node
|
5
|
+
end
|
6
|
+
|
7
|
+
def compile_node(options = {})
|
8
|
+
return "%s" % self.compile_internals
|
9
|
+
end
|
10
|
+
|
11
|
+
def compile_internals(options = {})
|
12
|
+
return [@variable_name.compile_node]
|
13
|
+
end
|
14
|
+
|
15
|
+
class ClassVariableNode < VariableNode # :nodoc:
|
16
|
+
def compile_node(options = {})
|
17
|
+
return "%s.%s" % self.compile_internals
|
18
|
+
end
|
19
|
+
|
20
|
+
def compile_internals(options = {})
|
21
|
+
return [@@red_class, @variable_name.compile_node]
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
class InstanceVariableNode < VariableNode # :nodoc:
|
26
|
+
def compile_node(options = {})
|
27
|
+
return "this.%s" % self.compile_internals
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
class GlobalVariableNode < VariableNode # :nodoc:
|
32
|
+
end
|
33
|
+
|
34
|
+
class OtherVariableNode < VariableNode # :nodoc:
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/lib/red/version.rb
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
module Red
|
2
|
+
class WrapNode # :nodoc:
|
3
|
+
def initialize(expression = nil)
|
4
|
+
@expression = expression.build_node
|
5
|
+
end
|
6
|
+
|
7
|
+
def compile_internals(options = {})
|
8
|
+
return [@expression].compile_nodes(:as_argument => true)
|
9
|
+
end
|
10
|
+
|
11
|
+
class DefinedNode < WrapNode # :nodoc:
|
12
|
+
def compile_node(options = {})
|
13
|
+
return "typeof %s" % self.compile_internals
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class NotNode < WrapNode # :nodoc:
|
18
|
+
def compile_node(options = {})
|
19
|
+
return "!(%s)" % self.compile_internals
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
class ReturnNode < WrapNode # :nodoc:
|
24
|
+
def compile_node(options = {})
|
25
|
+
return ("return %s" % self.compile_internals).rstrip
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
class SuperNode < WrapNode # :nodoc:
|
30
|
+
def initialize(args = [nil])
|
31
|
+
case @@red_library
|
32
|
+
when :Prototype : @args = args[1..-1].build_nodes
|
33
|
+
else raise(BuildError::NoSuperMethods, "Calls to super are not supported in #{@@red_library} JavaScript library")
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def compile_node(options = {})
|
38
|
+
case @@red_library
|
39
|
+
when :Prototype : return "$super(%s)" % @args.compile_nodes(:as_argument => true).join(', ')
|
40
|
+
else return ""
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
class YieldNode < WrapNode # :nodoc:
|
46
|
+
def compile_node(options = {})
|
47
|
+
return ("yield %s" % self.compile_internals).rstrip
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|