radiantcms-couchrest_model 0.1.8 → 0.1.9

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.
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{radiantcms-couchrest_model}
5
- s.version = "0.1.8"
5
+ s.version = "0.1.9"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["davide-malagoli"]
@@ -2859,6 +2859,17 @@ a general purpose content managment system--not merely a blogging engine.}
2859
2859
  "vendor/radius/CHANGELOG",
2860
2860
  "vendor/radius/lib",
2861
2861
  "vendor/radius/lib/radius19.rb",
2862
+ "vendor/radius/lib/radius/errors.rb",
2863
+ "vendor/radius/lib/radius/context.rb",
2864
+ "vendor/radius/lib/radius/dostruct.rb",
2865
+ "vendor/radius/lib/radius/parser.rb",
2866
+ "vendor/radius/lib/radius/parsetag.rb",
2867
+ "vendor/radius/lib/radius/tagbinding.rb",
2868
+ "vendor/radius/lib/radius/tagdefs.rb",
2869
+ "vendor/radius/lib/radius/util.rb",
2870
+ "vendor/radius/lib/radius/parser/",
2871
+ "vendor/radius/lib/radius/parser/scan.rb",
2872
+ "vendor/radius/lib/radius/parser/scan.rl",
2862
2873
  "vendor/radius/README",
2863
2874
  "vendor/radius/test",
2864
2875
  "vendor/radius/test/context_test.rb",
@@ -0,0 +1,139 @@
1
+ module Radius
2
+ #
3
+ # A context contains the tag definitions which are available for use in a template.
4
+ # See the QUICKSTART[link:files/QUICKSTART.html] for a detailed explaination its
5
+ # usage.
6
+ #
7
+ class Context
8
+ # A hash of tag definition blocks that define tags accessible on a Context.
9
+ attr_accessor :definitions # :nodoc:
10
+ attr_accessor :globals # :nodoc:
11
+
12
+ # Creates a new Context object.
13
+ def initialize(&block)
14
+ @definitions = {}
15
+ @tag_binding_stack = []
16
+ @globals = DelegatingOpenStruct.new
17
+ with(&block) if block_given?
18
+ end
19
+
20
+ # Yeild an instance of self for tag definitions:
21
+ #
22
+ # context.with do |c|
23
+ # c.define_tag 'test' do
24
+ # 'test'
25
+ # end
26
+ # end
27
+ #
28
+ def with
29
+ yield self
30
+ self
31
+ end
32
+
33
+ # Creates a tag definition on a context. Several options are available to you
34
+ # when creating a tag:
35
+ #
36
+ # +for+:: Specifies an object that the tag is in reference to. This is
37
+ # applicable when a block is not passed to the tag, or when the
38
+ # +expose+ option is also used.
39
+ #
40
+ # +expose+:: Specifies that child tags should be set for each of the methods
41
+ # contained in this option. May be either a single symbol/string or
42
+ # an array of symbols/strings.
43
+ #
44
+ # +attributes+:: Specifies whether or not attributes should be exposed
45
+ # automatically. Useful for ActiveRecord objects. Boolean. Defaults
46
+ # to +true+.
47
+ #
48
+ def define_tag(name, options = {}, &block)
49
+ type = Util.impartial_hash_delete(options, :type).to_s
50
+ klass = Util.constantize('Radius::TagDefinitions::' + Util.camelize(type) + 'TagFactory') rescue raise(ArgumentError.new("Undefined type `#{type}' in options hash"))
51
+ klass.new(self).define_tag(name, options, &block)
52
+ end
53
+
54
+ # Returns the value of a rendered tag. Used internally by Parser#parse.
55
+ def render_tag(name, attributes = {}, &block)
56
+ if name =~ /^(.+?):(.+)$/
57
+ render_tag($1) { render_tag($2, attributes, &block) }
58
+ else
59
+ tag_definition_block = @definitions[qualified_tag_name(name.to_s)]
60
+ if tag_definition_block
61
+ stack(name, attributes, block) do |tag|
62
+ tag_definition_block.call(tag).to_s
63
+ end
64
+ else
65
+ tag_missing(name, attributes, &block)
66
+ end
67
+ end
68
+ end
69
+
70
+ # Like method_missing for objects, but fired when a tag is undefined.
71
+ # Override in your own Context to change what happens when a tag is
72
+ # undefined. By default this method raises an UndefinedTagError.
73
+ def tag_missing(name, attributes, &block)
74
+ raise UndefinedTagError.new(name)
75
+ end
76
+
77
+ # Returns the state of the current render stack. Useful from inside
78
+ # a tag definition. Normally just use TagBinding#nesting.
79
+ def current_nesting
80
+ @tag_binding_stack.collect { |tag| tag.name }.join(':')
81
+ end
82
+
83
+ private
84
+
85
+ # A convienence method for managing the various parts of the
86
+ # tag binding stack.
87
+ def stack(name, attributes, block)
88
+ previous = @tag_binding_stack.last
89
+ previous_locals = previous.nil? ? @globals : previous.locals
90
+ locals = DelegatingOpenStruct.new(previous_locals)
91
+ binding = TagBinding.new(self, locals, name, attributes, block)
92
+ @tag_binding_stack.push(binding)
93
+ result = yield(binding)
94
+ @tag_binding_stack.pop
95
+ result
96
+ end
97
+
98
+ # Returns a fully qualified tag name based on state of the
99
+ # tag binding stack.
100
+ def qualified_tag_name(name)
101
+ nesting_parts = @tag_binding_stack.collect { |tag| tag.name }
102
+ nesting_parts << name unless nesting_parts.last == name
103
+ specific_name = nesting_parts.join(':') # specific_name always has the highest specificity
104
+ unless @definitions.has_key? specific_name
105
+ possible_matches = @definitions.keys.grep(/(^|:)#{name}$/)
106
+ specificity = possible_matches.inject({}) { |hash, tag| hash[numeric_specificity(tag, nesting_parts)] = tag; hash }
107
+ max = specificity.keys.max
108
+ if max != 0
109
+ specificity[max]
110
+ else
111
+ name
112
+ end
113
+ else
114
+ specific_name
115
+ end
116
+ end
117
+
118
+ # Returns the specificity for +tag_name+ at nesting defined
119
+ # by +nesting_parts+ as a number.
120
+ def numeric_specificity(tag_name, nesting_parts)
121
+ nesting_parts = nesting_parts.dup
122
+ name_parts = tag_name.split(':')
123
+ specificity = 0
124
+ value = 1
125
+ if nesting_parts.last == name_parts.last
126
+ while nesting_parts.size > 0
127
+ if nesting_parts.last == name_parts.last
128
+ specificity += value
129
+ name_parts.pop
130
+ end
131
+ nesting_parts.pop
132
+ value *= 0.1
133
+ end
134
+ specificity = 0 if (name_parts.size > 0)
135
+ end
136
+ specificity
137
+ end
138
+ end
139
+ end
@@ -0,0 +1,31 @@
1
+ module Radius
2
+ class DelegatingOpenStruct # :nodoc:
3
+ attr_accessor :object
4
+
5
+ def initialize(object = nil)
6
+ @object = object
7
+ @hash = {}
8
+ end
9
+
10
+ def method_missing(method, *args, &block)
11
+ symbol = (method.to_s =~ /^(.*?)=$/) ? $1.intern : method
12
+ if (0..1).include?(args.size)
13
+ if args.size == 1
14
+ @hash[symbol] = args.first
15
+ else
16
+ if @hash.has_key?(symbol)
17
+ @hash[symbol]
18
+ else
19
+ unless object.nil?
20
+ @object.send(method, *args, &block)
21
+ else
22
+ nil
23
+ end
24
+ end
25
+ end
26
+ else
27
+ super
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,24 @@
1
+ module Radius
2
+
3
+ # Abstract base class for all parsing errors.
4
+ class ParseError < StandardError
5
+ end
6
+
7
+ # Occurs when Parser cannot find an end tag for a given tag in a template or when
8
+ # tags are miss-matched in a template.
9
+ class MissingEndTagError < ParseError
10
+ # Create a new MissingEndTagError object for +tag_name+.
11
+ def initialize(tag_name)
12
+ super("end tag not found for start tag `#{tag_name}'")
13
+ end
14
+ end
15
+
16
+ # Occurs when Context#render_tag cannot find the specified tag on a Context.
17
+ class UndefinedTagError < ParseError
18
+ # Create a new UndefinedTagError object for +tag_name+.
19
+ def initialize(tag_name)
20
+ super("undefined tag `#{tag_name}'")
21
+ end
22
+ end
23
+
24
+ end
@@ -0,0 +1,95 @@
1
+ module Radius
2
+ #
3
+ # The Radius parser. Initialize a parser with a Context object that
4
+ # defines how tags should be expanded. See the QUICKSTART[link:files/QUICKSTART.html]
5
+ # for a detailed explaination of its usage.
6
+ #
7
+ class Parser
8
+ # The Context object used to expand template tags.
9
+ attr_accessor :context
10
+
11
+ # The string that prefixes all tags that are expanded by a parser
12
+ # (the part in the tag name before the first colon).
13
+ attr_accessor :tag_prefix
14
+
15
+ # Creates a new parser object initialized with a Context.
16
+ def initialize(context = Context.new, options = {})
17
+ if context.kind_of?(Hash) and options.empty?
18
+ options = context
19
+ context = options[:context] || options['context'] || Context.new
20
+ end
21
+ options = Util.symbolize_keys(options)
22
+ @context = context
23
+ @tag_prefix = options[:tag_prefix]
24
+ end
25
+
26
+ # Parses string for tags, expands them, and returns the result.
27
+ def parse(string)
28
+ @stack = [ParseContainerTag.new { |t| Util.recurring_array_to_s(t.contents) }]
29
+ pre_parse(string)
30
+ @stack.last.to_s
31
+ end
32
+
33
+ protected
34
+
35
+ def pre_parse(text) # :nodoc:
36
+ re = %r{<#{@tag_prefix}:([\w:]+?)(\s+(?:\w+\s*=\s*(?:"[^"]*?"|'[^']*?')\s*)*|)>|</#{@tag_prefix}:([\w:]+?)\s*>}
37
+ if md = re.match(text)
38
+ start_tag, attr, end_tag = $1, $2, $3
39
+ @stack.last.contents << ParseTag.new { parse_individual(md.pre_match) }
40
+ remaining = md.post_match
41
+ if start_tag
42
+ parse_start_tag(start_tag, attr, remaining)
43
+ else
44
+ parse_end_tag(end_tag, remaining)
45
+ end
46
+ else
47
+ if @stack.length == 1
48
+ @stack.last.contents << ParseTag.new { parse_individual(text) }
49
+ else
50
+ raise MissingEndTagError.new(@stack.last.name)
51
+ end
52
+ end
53
+ end
54
+
55
+ def parse_start_tag(start_tag, attr, remaining) # :nodoc:
56
+ @stack.push(ParseContainerTag.new(start_tag, parse_attributes(attr)))
57
+ pre_parse(remaining)
58
+ end
59
+
60
+ def parse_end_tag(end_tag, remaining) # :nodoc:
61
+ popped = @stack.pop
62
+ if popped.name == end_tag
63
+ popped.on_parse do |t|
64
+ @context.render_tag(popped.name, popped.attributes) { Util.recurring_array_to_s(t.contents) }
65
+ end
66
+ tag = @stack.last
67
+ tag.contents << popped
68
+ pre_parse(remaining)
69
+ else
70
+ raise MissingEndTagError.new(popped.name)
71
+ end
72
+ end
73
+
74
+ def parse_individual(text) # :nodoc:
75
+ re = %r{<#{@tag_prefix}:([\w:]+?)(\s+(?:\w+\s*=\s*(?:"[^"]*?"|'[^']*?')\s*)*|)/>}
76
+ if md = re.match(text)
77
+ attr = parse_attributes($2)
78
+ replace = @context.render_tag($1, attr)
79
+ md.pre_match + replace + parse_individual(md.post_match)
80
+ else
81
+ text || ''
82
+ end
83
+ end
84
+
85
+ def parse_attributes(text) # :nodoc:
86
+ attr = {}
87
+ re = /(\w+?)\s*=\s*('|")(.*?)\2/
88
+ while md = re.match(text)
89
+ attr[$1] = $3
90
+ text = md.post_match
91
+ end
92
+ attr
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,678 @@
1
+
2
+ # line 1 "scan.rl"
3
+
4
+ # line 84 "scan.rl"
5
+
6
+
7
+ module Radius
8
+ class Scanner
9
+ def self.operate(prefix, data)
10
+ buf = ""
11
+ csel = ""
12
+ @prematch = ''
13
+ @starttag = nil
14
+ @attrs = {}
15
+ @flavor = :tasteless
16
+ @cursor = 0
17
+ @tagstart = 0
18
+ @nodes = ['']
19
+ remainder = data.dup
20
+
21
+ until remainder.length == 0
22
+ p = perform_parse(prefix, remainder)
23
+ remainder = remainder[p..-1]
24
+ end
25
+
26
+ return @nodes
27
+ end
28
+
29
+ private
30
+ def self.perform_parse(prefix, data)
31
+ stack = []
32
+ p = 0
33
+ ts = 0
34
+ te = 0
35
+ act = 0
36
+ eof = data.length
37
+
38
+ @prefix = prefix
39
+
40
+ # line 41 "scan.rb"
41
+ class << self
42
+ attr_accessor :_parser_actions
43
+ private :_parser_actions, :_parser_actions=
44
+ end
45
+ self._parser_actions = [
46
+ 0, 1, 0, 1, 1, 1, 2, 1,
47
+ 3, 1, 4, 1, 5, 1, 6, 1,
48
+ 7, 1, 8, 1, 9, 1, 13, 1,
49
+ 14, 1, 18, 1, 20, 1, 21, 1,
50
+ 22, 2, 4, 5, 2, 5, 6, 2,
51
+ 8, 4, 2, 8, 9, 2, 9, 8,
52
+ 2, 10, 19, 2, 11, 19, 2, 12,
53
+ 19, 2, 15, 16, 2, 15, 17, 3,
54
+ 4, 5, 6, 3, 8, 4, 5, 3,
55
+ 15, 5, 16, 4, 8, 4, 5, 6,
56
+ 4, 15, 4, 5, 16, 5, 15, 8,
57
+ 4, 5, 16
58
+ ]
59
+
60
+ class << self
61
+ attr_accessor :_parser_key_offsets
62
+ private :_parser_key_offsets, :_parser_key_offsets=
63
+ end
64
+ self._parser_key_offsets = [
65
+ 0, 0, 11, 21, 34, 47, 61, 65,
66
+ 70, 72, 74, 87, 100, 101, 103, 118,
67
+ 133, 149, 155, 161, 176, 179, 182, 185,
68
+ 200, 202, 204, 219, 235, 241, 247, 250,
69
+ 253, 269, 285, 302, 309, 315, 331, 335,
70
+ 351, 366, 369, 371, 381, 392, 402, 416,
71
+ 420, 420, 421, 430, 430, 430, 432, 434,
72
+ 437, 440, 442, 444
73
+ ]
74
+
75
+ class << self
76
+ attr_accessor :_parser_trans_keys
77
+ private :_parser_trans_keys, :_parser_trans_keys=
78
+ end
79
+ self._parser_trans_keys = [
80
+ 58, 63, 95, 45, 46, 48, 57, 65,
81
+ 90, 97, 122, 63, 95, 45, 46, 48,
82
+ 58, 65, 90, 97, 122, 32, 47, 62,
83
+ 63, 95, 9, 13, 45, 58, 65, 90,
84
+ 97, 122, 32, 47, 62, 63, 95, 9,
85
+ 13, 45, 58, 65, 90, 97, 122, 32,
86
+ 61, 63, 95, 9, 13, 45, 46, 48,
87
+ 58, 65, 90, 97, 122, 32, 61, 9,
88
+ 13, 32, 34, 39, 9, 13, 34, 92,
89
+ 34, 92, 32, 47, 62, 63, 95, 9,
90
+ 13, 45, 58, 65, 90, 97, 122, 32,
91
+ 47, 62, 63, 95, 9, 13, 45, 58,
92
+ 65, 90, 97, 122, 62, 34, 92, 32,
93
+ 34, 47, 62, 63, 92, 95, 9, 13,
94
+ 45, 58, 65, 90, 97, 122, 32, 34,
95
+ 47, 62, 63, 92, 95, 9, 13, 45,
96
+ 58, 65, 90, 97, 122, 32, 34, 61,
97
+ 63, 92, 95, 9, 13, 45, 46, 48,
98
+ 58, 65, 90, 97, 122, 32, 34, 61,
99
+ 92, 9, 13, 32, 34, 39, 92, 9,
100
+ 13, 32, 34, 47, 62, 63, 92, 95,
101
+ 9, 13, 45, 58, 65, 90, 97, 122,
102
+ 34, 62, 92, 34, 39, 92, 34, 39,
103
+ 92, 32, 39, 47, 62, 63, 92, 95,
104
+ 9, 13, 45, 58, 65, 90, 97, 122,
105
+ 39, 92, 39, 92, 32, 39, 47, 62,
106
+ 63, 92, 95, 9, 13, 45, 58, 65,
107
+ 90, 97, 122, 32, 39, 61, 63, 92,
108
+ 95, 9, 13, 45, 46, 48, 58, 65,
109
+ 90, 97, 122, 32, 39, 61, 92, 9,
110
+ 13, 32, 34, 39, 92, 9, 13, 34,
111
+ 39, 92, 34, 39, 92, 32, 34, 39,
112
+ 47, 62, 63, 92, 95, 9, 13, 45,
113
+ 58, 65, 90, 97, 122, 32, 34, 39,
114
+ 47, 62, 63, 92, 95, 9, 13, 45,
115
+ 58, 65, 90, 97, 122, 32, 34, 39,
116
+ 61, 63, 92, 95, 9, 13, 45, 46,
117
+ 48, 58, 65, 90, 97, 122, 32, 34,
118
+ 39, 61, 92, 9, 13, 32, 34, 39,
119
+ 92, 9, 13, 32, 34, 39, 47, 62,
120
+ 63, 92, 95, 9, 13, 45, 58, 65,
121
+ 90, 97, 122, 34, 39, 62, 92, 32,
122
+ 34, 39, 47, 62, 63, 92, 95, 9,
123
+ 13, 45, 58, 65, 90, 97, 122, 32,
124
+ 39, 47, 62, 63, 92, 95, 9, 13,
125
+ 45, 58, 65, 90, 97, 122, 39, 62,
126
+ 92, 39, 92, 63, 95, 45, 46, 48,
127
+ 57, 65, 90, 97, 122, 58, 63, 95,
128
+ 45, 46, 48, 57, 65, 90, 97, 122,
129
+ 63, 95, 45, 46, 48, 58, 65, 90,
130
+ 97, 122, 32, 62, 63, 95, 9, 13,
131
+ 45, 46, 48, 58, 65, 90, 97, 122,
132
+ 32, 62, 9, 13, 60, 47, 63, 95,
133
+ 45, 57, 65, 90, 97, 122, 34, 92,
134
+ 34, 92, 34, 39, 92, 34, 39, 92,
135
+ 39, 92, 39, 92, 0
136
+ ]
137
+
138
+ class << self
139
+ attr_accessor :_parser_single_lengths
140
+ private :_parser_single_lengths, :_parser_single_lengths=
141
+ end
142
+ self._parser_single_lengths = [
143
+ 0, 3, 2, 5, 5, 4, 2, 3,
144
+ 2, 2, 5, 5, 1, 2, 7, 7,
145
+ 6, 4, 4, 7, 3, 3, 3, 7,
146
+ 2, 2, 7, 6, 4, 4, 3, 3,
147
+ 8, 8, 7, 5, 4, 8, 4, 8,
148
+ 7, 3, 2, 2, 3, 2, 4, 2,
149
+ 0, 1, 3, 0, 0, 2, 2, 3,
150
+ 3, 2, 2, 0
151
+ ]
152
+
153
+ class << self
154
+ attr_accessor :_parser_range_lengths
155
+ private :_parser_range_lengths, :_parser_range_lengths=
156
+ end
157
+ self._parser_range_lengths = [
158
+ 0, 4, 4, 4, 4, 5, 1, 1,
159
+ 0, 0, 4, 4, 0, 0, 4, 4,
160
+ 5, 1, 1, 4, 0, 0, 0, 4,
161
+ 0, 0, 4, 5, 1, 1, 0, 0,
162
+ 4, 4, 5, 1, 1, 4, 0, 4,
163
+ 4, 0, 0, 4, 4, 4, 5, 1,
164
+ 0, 0, 3, 0, 0, 0, 0, 0,
165
+ 0, 0, 0, 0
166
+ ]
167
+
168
+ class << self
169
+ attr_accessor :_parser_index_offsets
170
+ private :_parser_index_offsets, :_parser_index_offsets=
171
+ end
172
+ self._parser_index_offsets = [
173
+ 0, 0, 8, 15, 25, 35, 45, 49,
174
+ 54, 57, 60, 70, 80, 82, 85, 97,
175
+ 109, 121, 127, 133, 145, 149, 153, 157,
176
+ 169, 172, 175, 187, 199, 205, 211, 215,
177
+ 219, 232, 245, 258, 265, 271, 284, 289,
178
+ 302, 314, 318, 321, 328, 336, 343, 353,
179
+ 357, 358, 360, 367, 368, 369, 372, 375,
180
+ 379, 383, 386, 389
181
+ ]
182
+
183
+ class << self
184
+ attr_accessor :_parser_indicies
185
+ private :_parser_indicies, :_parser_indicies=
186
+ end
187
+ self._parser_indicies = [
188
+ 2, 1, 1, 1, 1, 1, 1, 0,
189
+ 3, 3, 3, 3, 3, 3, 0, 4,
190
+ 6, 7, 5, 5, 4, 5, 5, 5,
191
+ 0, 8, 10, 11, 9, 9, 8, 9,
192
+ 9, 9, 0, 13, 15, 14, 14, 13,
193
+ 14, 14, 14, 14, 12, 16, 17, 16,
194
+ 12, 17, 18, 19, 17, 12, 21, 22,
195
+ 20, 24, 25, 23, 26, 28, 29, 27,
196
+ 27, 26, 27, 27, 27, 12, 30, 32,
197
+ 33, 31, 31, 30, 31, 31, 31, 12,
198
+ 34, 12, 35, 25, 23, 36, 24, 38,
199
+ 39, 37, 25, 37, 36, 37, 37, 37,
200
+ 23, 40, 24, 42, 43, 41, 25, 41,
201
+ 40, 41, 41, 41, 23, 44, 24, 46,
202
+ 45, 25, 45, 44, 45, 45, 45, 45,
203
+ 23, 47, 24, 48, 25, 47, 23, 48,
204
+ 49, 50, 25, 48, 23, 51, 21, 53,
205
+ 54, 52, 22, 52, 51, 52, 52, 52,
206
+ 20, 24, 55, 25, 23, 57, 58, 59,
207
+ 56, 61, 35, 62, 60, 64, 24, 66,
208
+ 67, 65, 68, 65, 64, 65, 65, 65,
209
+ 63, 24, 68, 63, 61, 68, 63, 69,
210
+ 24, 71, 72, 70, 68, 70, 69, 70,
211
+ 70, 70, 63, 73, 24, 75, 74, 68,
212
+ 74, 73, 74, 74, 74, 74, 63, 76,
213
+ 24, 77, 68, 76, 63, 77, 78, 79,
214
+ 68, 77, 63, 80, 58, 59, 56, 81,
215
+ 81, 62, 60, 82, 61, 35, 84, 85,
216
+ 83, 62, 83, 82, 83, 83, 83, 60,
217
+ 86, 61, 35, 88, 89, 87, 62, 87,
218
+ 86, 87, 87, 87, 60, 90, 61, 35,
219
+ 92, 91, 62, 91, 90, 91, 91, 91,
220
+ 91, 60, 93, 61, 35, 94, 62, 93,
221
+ 60, 94, 95, 96, 62, 94, 60, 97,
222
+ 80, 58, 99, 100, 98, 59, 98, 97,
223
+ 98, 98, 98, 56, 61, 35, 101, 62,
224
+ 60, 97, 57, 58, 99, 100, 98, 59,
225
+ 98, 97, 98, 98, 98, 56, 103, 21,
226
+ 105, 106, 104, 107, 104, 103, 104, 104,
227
+ 104, 102, 24, 108, 68, 63, 21, 107,
228
+ 102, 109, 109, 109, 109, 109, 109, 0,
229
+ 111, 110, 110, 110, 110, 110, 110, 0,
230
+ 112, 112, 112, 112, 112, 112, 0, 113,
231
+ 115, 114, 114, 113, 114, 114, 114, 114,
232
+ 0, 116, 117, 116, 0, 118, 120, 119,
233
+ 123, 122, 122, 122, 122, 122, 121, 124,
234
+ 125, 24, 25, 23, 24, 25, 23, 61,
235
+ 35, 62, 60, 61, 35, 62, 60, 24,
236
+ 68, 63, 24, 68, 63, 126, 0
237
+ ]
238
+
239
+ class << self
240
+ attr_accessor :_parser_trans_targs
241
+ private :_parser_trans_targs, :_parser_trans_targs=
242
+ end
243
+ self._parser_trans_targs = [
244
+ 49, 1, 2, 3, 4, 3, 12, 52,
245
+ 4, 5, 12, 52, 49, 6, 5, 7,
246
+ 6, 7, 8, 42, 9, 10, 13, 9,
247
+ 10, 13, 11, 5, 12, 52, 11, 5,
248
+ 12, 52, 51, 14, 15, 16, 20, 54,
249
+ 15, 16, 20, 54, 17, 16, 18, 17,
250
+ 18, 19, 21, 15, 16, 20, 54, 53,
251
+ 22, 23, 14, 31, 22, 23, 31, 24,
252
+ 26, 27, 41, 58, 25, 26, 27, 41,
253
+ 58, 28, 27, 29, 28, 29, 30, 40,
254
+ 23, 32, 33, 34, 38, 56, 33, 34,
255
+ 38, 56, 35, 34, 36, 35, 36, 37,
256
+ 39, 33, 34, 38, 56, 55, 24, 26,
257
+ 27, 41, 58, 25, 57, 44, 44, 45,
258
+ 46, 47, 46, 59, 47, 59, 0, 49,
259
+ 50, 49, 1, 43, 49, 49, 49
260
+ ]
261
+
262
+ class << self
263
+ attr_accessor :_parser_trans_actions
264
+ private :_parser_trans_actions, :_parser_trans_actions=
265
+ end
266
+ self._parser_trans_actions = [
267
+ 29, 0, 3, 5, 7, 0, 7, 7,
268
+ 0, 13, 0, 0, 31, 15, 0, 15,
269
+ 0, 0, 0, 0, 17, 42, 17, 0,
270
+ 19, 0, 9, 63, 33, 33, 0, 36,
271
+ 11, 11, 0, 19, 9, 63, 33, 80,
272
+ 0, 36, 11, 71, 15, 0, 15, 0,
273
+ 0, 19, 0, 39, 75, 67, 85, 57,
274
+ 17, 45, 42, 17, 0, 19, 0, 0,
275
+ 9, 63, 33, 80, 0, 0, 36, 11,
276
+ 71, 15, 0, 15, 0, 0, 0, 19,
277
+ 42, 19, 9, 63, 33, 80, 0, 36,
278
+ 11, 71, 15, 0, 15, 0, 0, 19,
279
+ 19, 39, 75, 67, 85, 57, 17, 39,
280
+ 75, 67, 85, 17, 57, 1, 0, 3,
281
+ 5, 7, 0, 7, 0, 0, 0, 25,
282
+ 60, 27, 1, 0, 51, 48, 54
283
+ ]
284
+
285
+ class << self
286
+ attr_accessor :_parser_to_state_actions
287
+ private :_parser_to_state_actions, :_parser_to_state_actions=
288
+ end
289
+ self._parser_to_state_actions = [
290
+ 0, 0, 0, 0, 0, 0, 0, 0,
291
+ 0, 0, 0, 0, 0, 0, 0, 0,
292
+ 0, 0, 0, 0, 0, 0, 0, 0,
293
+ 0, 0, 0, 0, 0, 0, 0, 0,
294
+ 0, 0, 0, 0, 0, 0, 0, 0,
295
+ 0, 0, 0, 0, 0, 0, 0, 0,
296
+ 21, 21, 0, 0, 0, 0, 0, 0,
297
+ 0, 0, 0, 0
298
+ ]
299
+
300
+ class << self
301
+ attr_accessor :_parser_from_state_actions
302
+ private :_parser_from_state_actions, :_parser_from_state_actions=
303
+ end
304
+ self._parser_from_state_actions = [
305
+ 0, 0, 0, 0, 0, 0, 0, 0,
306
+ 0, 0, 0, 0, 0, 0, 0, 0,
307
+ 0, 0, 0, 0, 0, 0, 0, 0,
308
+ 0, 0, 0, 0, 0, 0, 0, 0,
309
+ 0, 0, 0, 0, 0, 0, 0, 0,
310
+ 0, 0, 0, 0, 0, 0, 0, 0,
311
+ 0, 23, 0, 0, 0, 0, 0, 0,
312
+ 0, 0, 0, 0
313
+ ]
314
+
315
+ class << self
316
+ attr_accessor :_parser_eof_trans
317
+ private :_parser_eof_trans, :_parser_eof_trans=
318
+ end
319
+ self._parser_eof_trans = [
320
+ 0, 1, 1, 1, 1, 13, 13, 13,
321
+ 13, 13, 13, 13, 13, 13, 13, 13,
322
+ 13, 13, 13, 13, 13, 13, 13, 13,
323
+ 13, 13, 13, 13, 13, 13, 13, 13,
324
+ 13, 13, 13, 13, 13, 13, 13, 13,
325
+ 13, 13, 13, 1, 1, 1, 1, 1,
326
+ 0, 0, 122, 125, 126, 125, 126, 125,
327
+ 126, 125, 126, 127
328
+ ]
329
+
330
+ class << self
331
+ attr_accessor :parser_start
332
+ end
333
+ self.parser_start = 49;
334
+ class << self
335
+ attr_accessor :parser_first_final
336
+ end
337
+ self.parser_first_final = 49;
338
+ class << self
339
+ attr_accessor :parser_error
340
+ end
341
+ self.parser_error = 0;
342
+
343
+ class << self
344
+ attr_accessor :parser_en_Closeout
345
+ end
346
+ self.parser_en_Closeout = 48;
347
+ class << self
348
+ attr_accessor :parser_en_main
349
+ end
350
+ self.parser_en_main = 49;
351
+
352
+
353
+ # line 119 "scan.rl"
354
+
355
+ # line 356 "scan.rb"
356
+ begin
357
+ p ||= 0
358
+ pe ||= data.length
359
+ cs = parser_start
360
+ ts = nil
361
+ te = nil
362
+ act = 0
363
+ end
364
+
365
+ # line 120 "scan.rl"
366
+
367
+ # line 368 "scan.rb"
368
+ begin
369
+ _klen, _trans, _keys, _acts, _nacts = nil
370
+ _goto_level = 0
371
+ _resume = 10
372
+ _eof_trans = 15
373
+ _again = 20
374
+ _test_eof = 30
375
+ _out = 40
376
+ while true
377
+ _trigger_goto = false
378
+ if _goto_level <= 0
379
+ if p == pe
380
+ _goto_level = _test_eof
381
+ next
382
+ end
383
+ if cs == 0
384
+ _goto_level = _out
385
+ next
386
+ end
387
+ end
388
+ if _goto_level <= _resume
389
+ _acts = _parser_from_state_actions[cs]
390
+ _nacts = _parser_actions[_acts]
391
+ _acts += 1
392
+ while _nacts > 0
393
+ _nacts -= 1
394
+ _acts += 1
395
+ case _parser_actions[_acts - 1]
396
+ when 14 then
397
+ # line 1 "NONE"
398
+ begin
399
+ ts = p
400
+ end
401
+ # line 402 "scan.rb"
402
+ end # from state action switch
403
+ end
404
+ if _trigger_goto
405
+ next
406
+ end
407
+ _keys = _parser_key_offsets[cs]
408
+ _trans = _parser_index_offsets[cs]
409
+ _klen = _parser_single_lengths[cs]
410
+ _break_match = false
411
+
412
+ begin
413
+ if _klen > 0
414
+ _lower = _keys
415
+ _upper = _keys + _klen - 1
416
+
417
+ loop do
418
+ break if _upper < _lower
419
+ _mid = _lower + ( (_upper - _lower) >> 1 )
420
+
421
+ if data[p] < _parser_trans_keys[_mid]
422
+ _upper = _mid - 1
423
+ elsif data[p] > _parser_trans_keys[_mid]
424
+ _lower = _mid + 1
425
+ else
426
+ _trans += (_mid - _keys)
427
+ _break_match = true
428
+ break
429
+ end
430
+ end # loop
431
+ break if _break_match
432
+ _keys += _klen
433
+ _trans += _klen
434
+ end
435
+ _klen = _parser_range_lengths[cs]
436
+ if _klen > 0
437
+ _lower = _keys
438
+ _upper = _keys + (_klen << 1) - 2
439
+ loop do
440
+ break if _upper < _lower
441
+ _mid = _lower + (((_upper-_lower) >> 1) & ~1)
442
+ if data[p] < _parser_trans_keys[_mid]
443
+ _upper = _mid - 2
444
+ elsif data[p] > _parser_trans_keys[_mid+1]
445
+ _lower = _mid + 2
446
+ else
447
+ _trans += ((_mid - _keys) >> 1)
448
+ _break_match = true
449
+ break
450
+ end
451
+ end # loop
452
+ break if _break_match
453
+ _trans += _klen
454
+ end
455
+ end while false
456
+ _trans = _parser_indicies[_trans]
457
+ end
458
+ if _goto_level <= _eof_trans
459
+ cs = _parser_trans_targs[_trans]
460
+ if _parser_trans_actions[_trans] != 0
461
+ _acts = _parser_trans_actions[_trans]
462
+ _nacts = _parser_actions[_acts]
463
+ _acts += 1
464
+ while _nacts > 0
465
+ _nacts -= 1
466
+ _acts += 1
467
+ case _parser_actions[_acts - 1]
468
+ when 0 then
469
+ # line 5 "scan.rl"
470
+ begin
471
+ mark_pfx = p end
472
+ when 1 then
473
+ # line 6 "scan.rl"
474
+ begin
475
+
476
+ if data[mark_pfx..p-1] != @prefix
477
+ closing = data[mark_pfx-1,1] == '/'
478
+ @nodes.last << data[mark_pfx-(closing ? 2 : 1)..p]
479
+ begin
480
+ p += 1
481
+ _trigger_goto = true
482
+ _goto_level = _out
483
+ break
484
+ end
485
+
486
+ end
487
+ end
488
+ when 2 then
489
+ # line 13 "scan.rl"
490
+ begin
491
+ mark_stg = p end
492
+ when 3 then
493
+ # line 14 "scan.rl"
494
+ begin
495
+ @starttag = data[mark_stg..p-1] end
496
+ when 4 then
497
+ # line 15 "scan.rl"
498
+ begin
499
+ mark_attr = p end
500
+ when 5 then
501
+ # line 16 "scan.rl"
502
+ begin
503
+
504
+ @attrs[@nat] = @vat
505
+ end
506
+ when 6 then
507
+ # line 25 "scan.rl"
508
+ begin
509
+ mark_nat = p end
510
+ when 7 then
511
+ # line 26 "scan.rl"
512
+ begin
513
+ @nat = data[mark_nat..p-1] end
514
+ when 8 then
515
+ # line 27 "scan.rl"
516
+ begin
517
+ mark_vat = p end
518
+ when 9 then
519
+ # line 28 "scan.rl"
520
+ begin
521
+ @vat = data[mark_vat..p-1] end
522
+ when 10 then
523
+ # line 30 "scan.rl"
524
+ begin
525
+ @flavor = :open end
526
+ when 11 then
527
+ # line 31 "scan.rl"
528
+ begin
529
+ @flavor = :self end
530
+ when 12 then
531
+ # line 32 "scan.rl"
532
+ begin
533
+ @flavor = :close end
534
+ when 15 then
535
+ # line 1 "NONE"
536
+ begin
537
+ te = p+1
538
+ end
539
+ when 16 then
540
+ # line 70 "scan.rl"
541
+ begin
542
+ act = 1; end
543
+ when 17 then
544
+ # line 79 "scan.rl"
545
+ begin
546
+ act = 2; end
547
+ when 18 then
548
+ # line 79 "scan.rl"
549
+ begin
550
+ te = p+1
551
+ begin
552
+ @nodes.last << data[p]
553
+ @tagstart = p
554
+ end
555
+ end
556
+ when 19 then
557
+ # line 70 "scan.rl"
558
+ begin
559
+ te = p
560
+ p = p - 1; begin
561
+ tag = {:prefix=>@prefix, :name=>@starttag, :flavor => @flavor, :attrs => @attrs}
562
+ @prefix = nil
563
+ @name = nil
564
+ @flavor = :tasteless
565
+ @attrs = {}
566
+ @nodes << tag << ''
567
+ begin
568
+ p += 1
569
+ _trigger_goto = true
570
+ _goto_level = _out
571
+ break
572
+ end
573
+
574
+ end
575
+ end
576
+ when 20 then
577
+ # line 79 "scan.rl"
578
+ begin
579
+ te = p
580
+ p = p - 1; begin
581
+ @nodes.last << data[p]
582
+ @tagstart = p
583
+ end
584
+ end
585
+ when 21 then
586
+ # line 79 "scan.rl"
587
+ begin
588
+ begin p = ((te))-1; end
589
+ begin
590
+ @nodes.last << data[p]
591
+ @tagstart = p
592
+ end
593
+ end
594
+ when 22 then
595
+ # line 1 "NONE"
596
+ begin
597
+ case act
598
+ when 1 then
599
+ begin begin p = ((te))-1; end
600
+
601
+ tag = {:prefix=>@prefix, :name=>@starttag, :flavor => @flavor, :attrs => @attrs}
602
+ @prefix = nil
603
+ @name = nil
604
+ @flavor = :tasteless
605
+ @attrs = {}
606
+ @nodes << tag << ''
607
+ begin
608
+ p += 1
609
+ _trigger_goto = true
610
+ _goto_level = _out
611
+ break
612
+ end
613
+
614
+ end
615
+ when 2 then
616
+ begin begin p = ((te))-1; end
617
+
618
+ @nodes.last << data[p]
619
+ @tagstart = p
620
+ end
621
+ end
622
+ end
623
+ # line 624 "scan.rb"
624
+ end # action switch
625
+ end
626
+ end
627
+ if _trigger_goto
628
+ next
629
+ end
630
+ end
631
+ if _goto_level <= _again
632
+ _acts = _parser_to_state_actions[cs]
633
+ _nacts = _parser_actions[_acts]
634
+ _acts += 1
635
+ while _nacts > 0
636
+ _nacts -= 1
637
+ _acts += 1
638
+ case _parser_actions[_acts - 1]
639
+ when 13 then
640
+ # line 1 "NONE"
641
+ begin
642
+ ts = nil; end
643
+ # line 644 "scan.rb"
644
+ end # to state action switch
645
+ end
646
+ if _trigger_goto
647
+ next
648
+ end
649
+ if cs == 0
650
+ _goto_level = _out
651
+ next
652
+ end
653
+ p += 1
654
+ if p != pe
655
+ _goto_level = _resume
656
+ next
657
+ end
658
+ end
659
+ if _goto_level <= _test_eof
660
+ if p == eof
661
+ if _parser_eof_trans[cs] > 0
662
+ _trans = _parser_eof_trans[cs] - 1;
663
+ _goto_level = _eof_trans
664
+ next;
665
+ end
666
+ end
667
+ end
668
+ if _goto_level <= _out
669
+ break
670
+ end
671
+ end
672
+ end
673
+
674
+ # line 121 "scan.rl"
675
+ return p
676
+ end
677
+ end
678
+ end
@@ -0,0 +1,124 @@
1
+ %%{
2
+ machine parser;
3
+
4
+
5
+ action _prefix { mark_pfx = p }
6
+ action prefix {
7
+ if data[mark_pfx..p-1] != @prefix
8
+ closing = data[mark_pfx-1,1] == '/'
9
+ @nodes.last << data[mark_pfx-(closing ? 2 : 1)..p]
10
+ fbreak;
11
+ end
12
+ }
13
+ action _starttag { mark_stg = p }
14
+ action starttag { @starttag = data[mark_stg..p-1] }
15
+ action _attr { mark_attr = p }
16
+ action attr {
17
+ @attrs[@nat] = @vat
18
+ }
19
+
20
+ action prematch {
21
+ @prematch_end = p
22
+ @prematch = data[0..p] if p > 0
23
+ }
24
+
25
+ action _nameattr { mark_nat = p }
26
+ action nameattr { @nat = data[mark_nat..p-1] }
27
+ action _valattr { mark_vat = p }
28
+ action valattr { @vat = data[mark_vat..p-1] }
29
+
30
+ action opentag { @flavor = :open }
31
+ action selftag { @flavor = :self }
32
+ action closetag { @flavor = :close }
33
+
34
+ action stopparse {
35
+ @cursor = p;
36
+ fbreak;
37
+ }
38
+
39
+
40
+ Closeout := empty;
41
+
42
+ # words
43
+ PrefixChar = [\-A-Za-z0-9._?] ;
44
+ NameChar = [\-A-Za-z0-9._:?] ;
45
+ TagName = NameChar+ >_starttag %starttag;
46
+ Prefix = PrefixChar+ >_prefix %prefix;
47
+
48
+ Name = Prefix ":" TagName;
49
+
50
+ NameAttr = NameChar+ >_nameattr %nameattr;
51
+ Q1Char = ( "\\\'" | [^'] ) ;
52
+ Q1Attr = Q1Char* >_valattr %valattr;
53
+ Q2Char = ( "\\\"" | [^"] ) ;
54
+ Q2Attr = Q2Char* >_valattr %valattr;
55
+
56
+ Attr = NameAttr space* "=" space* ('"' Q2Attr '"' | "'" Q1Attr "'") space* >_attr %attr;
57
+ Attrs = (space+ Attr* | empty);
58
+
59
+ CloseTrailer = "/>" %selftag;
60
+ OpenTrailer = ">" %opentag;
61
+
62
+ Trailer = (OpenTrailer | CloseTrailer);
63
+
64
+ OpenOrSelfTag = Name Attrs? Trailer;
65
+ CloseTag = "/" Name space* ">" %closetag;
66
+
67
+ SomeTag = '<' (OpenOrSelfTag | CloseTag);
68
+
69
+ main := |*
70
+ SomeTag => {
71
+ tag = {:prefix=>@prefix, :name=>@starttag, :flavor => @flavor, :attrs => @attrs}
72
+ @prefix = nil
73
+ @name = nil
74
+ @flavor = :tasteless
75
+ @attrs = {}
76
+ @nodes << tag << ''
77
+ fbreak;
78
+ };
79
+ any => {
80
+ @nodes.last << data[p]
81
+ @tagstart = p
82
+ };
83
+ *|;
84
+ }%%
85
+
86
+ module Radius
87
+ class Scanner
88
+ def self.operate(prefix, data)
89
+ buf = ""
90
+ csel = ""
91
+ @prematch = ''
92
+ @starttag = nil
93
+ @attrs = {}
94
+ @flavor = :tasteless
95
+ @cursor = 0
96
+ @tagstart = 0
97
+ @nodes = ['']
98
+ remainder = data.dup
99
+
100
+ until remainder.length == 0
101
+ p = perform_parse(prefix, remainder)
102
+ remainder = remainder[p..-1]
103
+ end
104
+
105
+ return @nodes
106
+ end
107
+
108
+ private
109
+ def self.perform_parse(prefix, data)
110
+ stack = []
111
+ p = 0
112
+ ts = 0
113
+ te = 0
114
+ act = 0
115
+ eof = data.length
116
+
117
+ @prefix = prefix
118
+ %% write data;
119
+ %% write init;
120
+ %% write exec;
121
+ return p
122
+ end
123
+ end
124
+ end
@@ -0,0 +1,23 @@
1
+ class ParseTag # :nodoc:
2
+ def initialize(&b)
3
+ @block = b
4
+ end
5
+
6
+ def on_parse(&b)
7
+ @block = b
8
+ end
9
+
10
+ def to_s
11
+ @block.call(self)
12
+ end
13
+ end
14
+
15
+ class ParseContainerTag < ParseTag # :nodoc:
16
+ attr_accessor :name, :attributes, :contents
17
+
18
+ def initialize(name = "", attributes = {}, contents = [], &b)
19
+ @name, @attributes, @contents = name, attributes, contents
20
+ super(&b)
21
+ end
22
+ end
23
+
@@ -0,0 +1,66 @@
1
+ module Radius
2
+ #
3
+ # A tag binding is passed into each tag definition and contains helper methods for working
4
+ # with tags. Use it to gain access to the attributes that were passed to the tag, to
5
+ # render the tag contents, and to do other tasks.
6
+ #
7
+ class TagBinding
8
+ # The Context that the TagBinding is associated with. Used internally. Try not to use
9
+ # this object directly.
10
+ attr_reader :context
11
+
12
+ # The locals object for the current tag.
13
+ attr_reader :locals
14
+
15
+ # The name of the tag (as used in a template string).
16
+ attr_reader :name
17
+
18
+ # The attributes of the tag. Also aliased as TagBinding#attr.
19
+ attr_reader :attributes
20
+ alias :attr :attributes
21
+
22
+ # The render block. When called expands the contents of the tag. Use TagBinding#expand
23
+ # instead.
24
+ attr_reader :block
25
+
26
+ # Creates a new TagBinding object.
27
+ def initialize(context, locals, name, attributes, block)
28
+ @context, @locals, @name, @attributes, @block = context, locals, name, attributes, block
29
+ end
30
+
31
+ # Evaluates the current tag and returns the rendered contents.
32
+ def expand
33
+ double? ? block.call : ''
34
+ end
35
+
36
+ # Returns true if the current tag is a single tag.
37
+ def single?
38
+ block.nil?
39
+ end
40
+
41
+ # Returns true if the current tag is a container tag.
42
+ def double?
43
+ not single?
44
+ end
45
+
46
+ # The globals object from which all locals objects ultimately inherit their values.
47
+ def globals
48
+ @context.globals
49
+ end
50
+
51
+ # Returns a list of the way tags are nested around the current tag as a string.
52
+ def nesting
53
+ @context.current_nesting
54
+ end
55
+
56
+ # Fires off Context#tag_missing for the current tag.
57
+ def missing!
58
+ @context.tag_missing(name, attributes, &block)
59
+ end
60
+
61
+ # Renders the tag using the current context .
62
+ def render(tag, attributes = {}, &block)
63
+ @context.render_tag(tag, attributes, &block)
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,78 @@
1
+ module Radius
2
+ module TagDefinitions # :nodoc:
3
+ class TagFactory # :nodoc:
4
+ def initialize(context)
5
+ @context = context
6
+ end
7
+
8
+ def define_tag(name, options, &block)
9
+ options = prepare_options(name, options)
10
+ validate_params(name, options, &block)
11
+ construct_tag_set(name, options, &block)
12
+ expose_methods_as_tags(name, options)
13
+ end
14
+
15
+ protected
16
+
17
+ # Normalizes options pased to tag definition. Override in decendants to preform
18
+ # additional normalization.
19
+ def prepare_options(name, options)
20
+ options = Util.symbolize_keys(options)
21
+ options[:expose] = expand_array_option(options[:expose])
22
+ object = options[:for]
23
+ options[:attributes] = object.respond_to?(:attributes) unless options.has_key? :attributes
24
+ options[:expose] += object.attributes.keys if options[:attributes]
25
+ options
26
+ end
27
+
28
+ # Validates parameters passed to tag definition. Override in decendants to add custom
29
+ # validations.
30
+ def validate_params(name, options, &block)
31
+ unless options.has_key? :for
32
+ raise ArgumentError.new("tag definition must contain a :for option or a block") unless block
33
+ raise ArgumentError.new("tag definition must contain a :for option when used with the :expose option") unless options[:expose].empty?
34
+ end
35
+ end
36
+
37
+ # Adds the tag definition to the context. Override in subclasses to add additional tags
38
+ # (child tags) when the tag is created.
39
+ def construct_tag_set(name, options, &block)
40
+ if block
41
+ @context.definitions[name.to_s] = block
42
+ else
43
+ lp = last_part(name)
44
+ @context.define_tag(name) do |tag|
45
+ if tag.single?
46
+ options[:for]
47
+ else
48
+ tag.locals.send("#{ lp }=", options[:for]) unless options[:for].nil?
49
+ tag.expand
50
+ end
51
+ end
52
+ end
53
+ end
54
+
55
+ # Exposes the methods of an object as child tags.
56
+ def expose_methods_as_tags(name, options)
57
+ options[:expose].each do |method|
58
+ tag_name = "#{name}:#{method}"
59
+ lp = last_part(name)
60
+ @context.define_tag(tag_name) do |tag|
61
+ object = tag.locals.send(lp)
62
+ object.send(method)
63
+ end
64
+ end
65
+ end
66
+
67
+ protected
68
+
69
+ def expand_array_option(value)
70
+ [*value].compact.map { |m| m.to_s.intern }
71
+ end
72
+
73
+ def last_part(name)
74
+ name.split(':').last
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,34 @@
1
+ module Radius
2
+ module Util # :nodoc:
3
+ def self.symbolize_keys(hash)
4
+ new_hash = {}
5
+ hash.keys.each do |k|
6
+ new_hash[k.to_s.intern] = hash[k]
7
+ end
8
+ new_hash
9
+ end
10
+
11
+ def self.impartial_hash_delete(hash, key)
12
+ string = key.to_s
13
+ symbol = string.intern
14
+ value1 = hash.delete(symbol)
15
+ value2 = hash.delete(string)
16
+ value1 || value2
17
+ end
18
+
19
+ def self.constantize(camelized_string)
20
+ raise "invalid constant name `#{camelized_string}'" unless camelized_string.split('::').all? { |part| part =~ /^[A-Za-z]+$/ }
21
+ Object.module_eval(camelized_string)
22
+ end
23
+
24
+ def self.camelize(underscored_string)
25
+ string = ''
26
+ underscored_string.split('_').each { |part| string << part.capitalize }
27
+ string
28
+ end
29
+
30
+ def self.recurring_array_to_s(ary)
31
+ ary.map{|x| x.is_a?(Array) ? recurring_array_to_s(x) : x.to_s }.join
32
+ end
33
+ end
34
+ end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 1
8
- - 8
9
- version: 0.1.8
8
+ - 9
9
+ version: 0.1.9
10
10
  platform: ruby
11
11
  authors:
12
12
  - davide-malagoli
@@ -2403,6 +2403,16 @@ files:
2403
2403
  - vendor/radius/ROADMAP
2404
2404
  - vendor/radius/CHANGELOG
2405
2405
  - vendor/radius/lib/radius19.rb
2406
+ - vendor/radius/lib/radius/errors.rb
2407
+ - vendor/radius/lib/radius/context.rb
2408
+ - vendor/radius/lib/radius/dostruct.rb
2409
+ - vendor/radius/lib/radius/parser.rb
2410
+ - vendor/radius/lib/radius/parsetag.rb
2411
+ - vendor/radius/lib/radius/tagbinding.rb
2412
+ - vendor/radius/lib/radius/tagdefs.rb
2413
+ - vendor/radius/lib/radius/util.rb
2414
+ - vendor/radius/lib/radius/parser/scan.rb
2415
+ - vendor/radius/lib/radius/parser/scan.rl
2406
2416
  - vendor/radius/README
2407
2417
  - vendor/radius/test/context_test.rb
2408
2418
  - vendor/radius/test/dostruct_test.rb