red 3.0.0

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/lib/red.rb ADDED
@@ -0,0 +1,161 @@
1
+ $:.unshift(File.dirname(__FILE__)) unless
2
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
+
4
+ require 'parse_tree'
5
+ require 'lib/red/assignment_nodes'
6
+ require 'lib/red/call_nodes'
7
+ require 'lib/red/conditional_nodes'
8
+ require 'lib/red/conjunction_nodes'
9
+ require 'lib/red/constant_nodes'
10
+ require 'lib/red/control_nodes'
11
+ require 'lib/red/data_nodes'
12
+ require 'lib/red/definition_nodes'
13
+ require 'lib/red/errors'
14
+ require 'lib/red/illegal_nodes'
15
+ require 'lib/red/literal_nodes'
16
+ require 'lib/red/variable_nodes'
17
+ require 'lib/red/wrap_nodes'
18
+
19
+ module Red
20
+ @@red_library = nil
21
+ @@red_module = nil
22
+ @@red_class = nil
23
+ @@rescue_is_safe = false
24
+ @@exception_index = 0
25
+
26
+ ARRAY_NODES = {
27
+ :and => ConjunctionNode::AndNode,
28
+ :argscat => IllegalNode::MultipleAssignmentNode,
29
+ :argspush => IllegalNode::MultipleAssignmentNode,
30
+ :array => LiteralNode::ArrayNode,
31
+ :attrasgn => AssignmentNode::AttributeNode,
32
+ :begin => ControlNode::BeginNode,
33
+ :block => LiteralNode::MultilineNode,
34
+ :block_arg => IllegalNode::BlockArgument,
35
+ :block_pass => IllegalNode::BlockArgument,
36
+ :break => ConstantNode::BreakNode,
37
+ :call => CallNode::MethodNode::ExplicitNode,
38
+ :case => ConditionalNode::CaseNode,
39
+ :class => DefinitionNode::ClassNode,
40
+ :cdecl => AssignmentNode::GlobalVariableNode,
41
+ :colon2 => LiteralNode::NamespaceNode,
42
+ :colon3 => ControlNode::LibraryNode,
43
+ :const => VariableNode::OtherVariableNode,
44
+ :cvar => VariableNode::ClassVariableNode,
45
+ :cvasgn => AssignmentNode::ClassVariableNode,
46
+ :cvdecl => AssignmentNode::ClassVariableNode,
47
+ :dasgn => AssignmentNode::LocalVariableNode,
48
+ :dasgn_curr => AssignmentNode::LocalVariableNode,
49
+ :defined => WrapNode::DefinedNode,
50
+ :defn => DefinitionNode::InstanceMethodNode,
51
+ :defs => DefinitionNode::ClassMethodNode,
52
+ :dot2 => LiteralNode::RangeNode,
53
+ :dot3 => LiteralNode::RangeNode::ExclusiveNode,
54
+ :dregx => IllegalNode::RegexEvaluationNode,
55
+ :dregx_once => IllegalNode::RegexEvaluationNode,
56
+ :dstr => LiteralNode::StringNode,
57
+ :dsym => IllegalNode::SymbolEvaluationNode,
58
+ :dvar => VariableNode::OtherVariableNode,
59
+ :dxstr => LiteralNode::StringNode,
60
+ :ensure => ControlNode::EnsureNode,
61
+ :evstr => LiteralNode::StringNode,
62
+ :false => ConstantNode::FalseNode,
63
+ :fcall => CallNode::MethodNode::ImplicitNode,
64
+ :flip2 => IllegalNode::FlipflopNode,
65
+ :flip3 => IllegalNode::FlipflopNode,
66
+ :for => ControlNode::ForNode,
67
+ :gasgn => AssignmentNode::GlobalVariableNode,
68
+ :gvar => VariableNode::GlobalVariableNode,
69
+ :hash => LiteralNode::HashNode,
70
+ :iasgn => AssignmentNode::InstanceVariableNode,
71
+ :if => ConditionalNode::IfNode,
72
+ :iter => CallNode::BlockNode,
73
+ :ivar => VariableNode::InstanceVariableNode,
74
+ :lasgn => AssignmentNode::LocalVariableNode,
75
+ :lvar => VariableNode::OtherVariableNode,
76
+ :lit => LiteralNode::OtherNode,
77
+ :match => IllegalNode::MatchNode,
78
+ :match2 => CallNode::MatchNode,
79
+ :match3 => CallNode::MatchNode::ReverseNode,
80
+ :masgn => IllegalNode::MultipleAssignmentNode,
81
+ :module => DefinitionNode::ModuleNode,
82
+ :next => ConstantNode::NextNode,
83
+ :nil => ConstantNode::NilNode,
84
+ :not => WrapNode::NotNode,
85
+ :op_asgn1 => AssignmentNode::OperatorNode::BracketNode,
86
+ :op_asgn2 => AssignmentNode::OperatorNode::DotNode,
87
+ :op_asgn_and => AssignmentNode::OperatorNode::AndNode,
88
+ :op_asgn_or => AssignmentNode::OperatorNode::OrNode,
89
+ :or => ConjunctionNode::OrNode,
90
+ :postexe => IllegalNode::PostexeNode,
91
+ :redo => IllegalNode::RedoNode,
92
+ :rescue => ControlNode::RescueNode,
93
+ :retry => IllegalNode::RetryNode,
94
+ :return => WrapNode::ReturnNode,
95
+ :sclass => DefinitionNode::ObjectLiteralNode,
96
+ :scope => LiteralNode::OtherNode,
97
+ :self => ConstantNode::SelfNode,
98
+ :splat => LiteralNode::SplatNode,
99
+ :super => WrapNode::SuperNode,
100
+ :svalue => LiteralNode::OtherNode,
101
+ :str => LiteralNode::StringNode,
102
+ :true => ConstantNode::TrueNode,
103
+ :undef => IllegalNode::UndefNode,
104
+ :until => ControlNode::UntilNode,
105
+ :vcall => VariableNode::OtherVariableNode,
106
+ :when => ConditionalNode::WhenNode,
107
+ :while => ControlNode::WhileNode,
108
+ :xstr => LiteralNode::StringNode,
109
+ :yield => WrapNode::YieldNode,
110
+ :zarray => LiteralNode::ArrayNode,
111
+ :zsuper => WrapNode::SuperNode
112
+ }
113
+
114
+ DATA_NODES = {
115
+ Bignum => DataNode::OtherNode,
116
+ Fixnum => DataNode::OtherNode,
117
+ Float => DataNode::OtherNode,
118
+ Range => DataNode::RangeNode,
119
+ Regexp => DataNode::OtherNode,
120
+ Symbol => DataNode::SymbolNode,
121
+ String => DataNode::StringNode,
122
+ NilClass => DataNode::NilNode
123
+ }
124
+
125
+ def build_node # :nodoc:
126
+ case self
127
+ when Array
128
+ raise(BuildError::UnknownNode, "Don't know how to handle sexp type :#{self.first}") unless ARRAY_NODES[self.first]
129
+ return ARRAY_NODES[self.first].new(*self[1..-1])
130
+ else
131
+ return DATA_NODES[self.class].new(self)
132
+ end
133
+ rescue => e
134
+ self.handle_red_error(e)
135
+ end
136
+
137
+ def build_nodes # :nodoc:
138
+ self.map {|node| node.build_node}
139
+ end
140
+
141
+ def compile_nodes(options = {}) # :nodoc:
142
+ self.map {|node| node.compile_node(options)}
143
+ end
144
+
145
+ def string_to_node # :nodoc:
146
+ self.translate_to_sexp_array.build_node
147
+ rescue SyntaxError => e
148
+ self.handle_red_error(e)
149
+ end
150
+
151
+ def translate_to_sexp_array # :nodoc:
152
+ raise TypeError, "Can only translate Strings" unless self.is_a?(String)
153
+ ParseTree.translate("::Standard\n" + self)
154
+ end
155
+
156
+ def handle_red_error(error) # :nodoc:
157
+ @@red_errors ||= "\nErrors"
158
+ @@red_errors << "\n%s: %s" % [@@exception_index += 1, error]
159
+ return DataNode::ErrorNode.new(@@exception_index)
160
+ end
161
+ end
data/script/console ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+ # File: script/console
3
+ irb = RUBY_PLATFORM =~ /(:?mswin|mingw)/ ? 'irb.bat' : 'irb'
4
+
5
+ libs = " -r irb/completion"
6
+ # Perhaps use a console_lib to store any extra methods I may want available in the console
7
+ # libs << " -r #{File.dirname(__FILE__) + '/../lib/console_lib/console_logger.rb'}"
8
+ libs << " -r #{File.dirname(__FILE__) + '/../lib/red.rb'}"
9
+ puts "Loading red gem"
10
+ exec "#{irb} #{libs} --simple-prompt"
data/script/destroy ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+ APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
3
+
4
+ begin
5
+ require 'rubigen'
6
+ rescue LoadError
7
+ require 'rubygems'
8
+ require 'rubigen'
9
+ end
10
+ require 'rubigen/scripts/destroy'
11
+
12
+ ARGV.shift if ['--help', '-h'].include?(ARGV[0])
13
+ RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
14
+ RubiGen::Scripts::Destroy.new.run(ARGV)
data/script/generate ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+ APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
3
+
4
+ begin
5
+ require 'rubigen'
6
+ rescue LoadError
7
+ require 'rubygems'
8
+ require 'rubigen'
9
+ end
10
+ require 'rubigen/scripts/generate'
11
+
12
+ ARGV.shift if ['--help', '-h'].include?(ARGV[0])
13
+ RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
14
+ RubiGen::Scripts::Generate.new.run(ARGV)
data/script/txt2html ADDED
@@ -0,0 +1,82 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ GEM_NAME = 'red' # what ppl will type to install your gem
4
+ RUBYFORGE_PROJECT = 'red'
5
+
6
+ require 'rubygems'
7
+ begin
8
+ require 'newgem'
9
+ require 'rubyforge'
10
+ rescue LoadError
11
+ puts "\n\nGenerating the website requires the newgem RubyGem"
12
+ puts "Install: gem install newgem\n\n"
13
+ exit(1)
14
+ end
15
+ require 'redcloth'
16
+ require 'syntax/convertors/html'
17
+ require 'erb'
18
+ require File.dirname(__FILE__) + "/../lib/#{GEM_NAME}/version.rb"
19
+
20
+ version = Red::VERSION::STRING
21
+ download = "http://rubyforge.org/projects/#{RUBYFORGE_PROJECT}"
22
+
23
+ def rubyforge_project_id
24
+ RubyForge.new.autoconfig["group_ids"][RUBYFORGE_PROJECT]
25
+ end
26
+
27
+ class Fixnum
28
+ def ordinal
29
+ # teens
30
+ return 'th' if (10..19).include?(self % 100)
31
+ # others
32
+ case self % 10
33
+ when 1: return 'st'
34
+ when 2: return 'nd'
35
+ when 3: return 'rd'
36
+ else return 'th'
37
+ end
38
+ end
39
+ end
40
+
41
+ class Time
42
+ def pretty
43
+ return "#{mday}#{mday.ordinal} #{strftime('%B')} #{year}"
44
+ end
45
+ end
46
+
47
+ def convert_syntax(syntax, source)
48
+ return Syntax::Convertors::HTML.for_syntax(syntax).convert(source).gsub(%r!^<pre>|</pre>$!,'')
49
+ end
50
+
51
+ if ARGV.length >= 1
52
+ src, template = ARGV
53
+ template ||= File.join(File.dirname(__FILE__), '/../website/template.html.erb')
54
+ else
55
+ puts("Usage: #{File.split($0).last} source.txt [template.html.erb] > output.html")
56
+ exit!
57
+ end
58
+
59
+ template = ERB.new(File.open(template).read)
60
+
61
+ title = nil
62
+ body = nil
63
+ File.open(src) do |fsrc|
64
+ title_text = fsrc.readline
65
+ body_text_template = fsrc.read
66
+ body_text = ERB.new(body_text_template).result(binding)
67
+ syntax_items = []
68
+ body_text.gsub!(%r!<(pre|code)[^>]*?syntax=['"]([^'"]+)[^>]*>(.*?)</\1>!m){
69
+ ident = syntax_items.length
70
+ element, syntax, source = $1, $2, $3
71
+ syntax_items << "<#{element} class='syntax'>#{convert_syntax(syntax, source)}</#{element}>"
72
+ "syntax-temp-#{ident}"
73
+ }
74
+ title = RedCloth.new(title_text).to_html.gsub(%r!<.*?>!,'').strip
75
+ body = RedCloth.new(body_text).to_html
76
+ body.gsub!(%r!(?:<pre><code>)?syntax-temp-(\d+)(?:</code></pre>)?!){ syntax_items[$1.to_i] }
77
+ end
78
+ stat = File.stat(src)
79
+ created = stat.ctime
80
+ modified = stat.mtime
81
+
82
+ $stdout << template.result(binding)