amrita2 1.9.6
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/amrita2/core.rb +1897 -0
- data/lib/amrita2/rails_bridge.rb +40 -0
- data/lib/amrita2/rd.rb +314 -0
- data/lib/amrita2/template.rb +304 -0
- data/lib/amrita2/version.rb +9 -0
- data/lib/amrita2.rb +1 -0
- metadata +44 -0
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'amrita2/template'
|
2
|
+
|
3
|
+
module Amrita2View
|
4
|
+
class Base
|
5
|
+
@@compiled_amrita2_templates = {}
|
6
|
+
|
7
|
+
def initialize( action_view )
|
8
|
+
@action_view = action_view
|
9
|
+
@action_view.extend(Amrita2::Runtime)
|
10
|
+
end
|
11
|
+
|
12
|
+
def render( template, local_assigns={} )
|
13
|
+
action_name = @action_view.controller.action_name
|
14
|
+
tmpl_method = action_name + "_setup_template"
|
15
|
+
tmpl = @@compiled_amrita2_templates[template] ||=
|
16
|
+
if @action_view.respond_to?(tmpl_method)
|
17
|
+
@action_view.send(tmpl_method, template)
|
18
|
+
else
|
19
|
+
t = Amrita2::TemplateText.new(template)
|
20
|
+
b = @action_view.instance_eval { binding }
|
21
|
+
t.use_erb(b)
|
22
|
+
t
|
23
|
+
end
|
24
|
+
|
25
|
+
po_method = action_name + "_po"
|
26
|
+
po = nil
|
27
|
+
if @action_view.respond_to?(po_method)
|
28
|
+
po = @action_view.send(po_method)
|
29
|
+
else
|
30
|
+
po = @action_view.controller
|
31
|
+
end
|
32
|
+
|
33
|
+
tmpl.expand(out="", po)
|
34
|
+
out
|
35
|
+
rescue
|
36
|
+
$!.to_s + $@.join("<br>")
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
data/lib/amrita2/rd.rb
ADDED
@@ -0,0 +1,314 @@
|
|
1
|
+
require "rd/rd2html-lib"
|
2
|
+
require 'rd/rdfmt'
|
3
|
+
require 'amrita2/template'
|
4
|
+
|
5
|
+
module Amrita2
|
6
|
+
include Amrita2
|
7
|
+
RDTmpl = TemplateText.new <<-END
|
8
|
+
<html>
|
9
|
+
<head id='header'>
|
10
|
+
<title id='title' />
|
11
|
+
<link id='css' rel="stylesheet" type="text/css" />
|
12
|
+
<meta id='lang' content="text/html; charset=euc-jp" http-equiv="content-type" />
|
13
|
+
</head>
|
14
|
+
<body id='document'>
|
15
|
+
<span id='output'></span>
|
16
|
+
<div id='block'>
|
17
|
+
<h1 id='header1'> header</h1>
|
18
|
+
<h2 id='header2'> header</h2>
|
19
|
+
<h3 id='header3'> header</h3>
|
20
|
+
<p id='textblock'> </p>
|
21
|
+
<ul id='list'><li id='item'></li></ul>
|
22
|
+
<ol id='enumlist'><li id='item'></li></ol>
|
23
|
+
<dl id='desclist'><dt id='term' /><dd id='description' /></dl>
|
24
|
+
</div>
|
25
|
+
<div id='inline'>
|
26
|
+
<em id='emphasis'>*<span id='text'></span>*</em>
|
27
|
+
<code id='code'><span id='text'></span></code>
|
28
|
+
<var id='var'><span id='text'></span></var>
|
29
|
+
<kbd id='kbd'><span id='text'></span></kbd>
|
30
|
+
<a id='link_to_url'></a>
|
31
|
+
</div>
|
32
|
+
</body>
|
33
|
+
</html>
|
34
|
+
END
|
35
|
+
RDTmpl.define_parts(:block=>[:header1, :header2, :header3, :textblock,
|
36
|
+
{ :list=>:item },
|
37
|
+
{ :enumlist=>:item } ,
|
38
|
+
{ :desclist=>[:term, :description] } ],
|
39
|
+
:inline=>[:emphasis, :code, :var, :kbd, :link_to_url])
|
40
|
+
|
41
|
+
class Amrita2Visitor < RD::RD2HTMLVisitor
|
42
|
+
include Amrita2
|
43
|
+
include Amrita2::Runtime
|
44
|
+
include Amrita2::Core
|
45
|
+
|
46
|
+
attr_accessor :option
|
47
|
+
def initialize(doctmpl, blocktmpl, inlinetmpl, extention_processor, option=nil)
|
48
|
+
@doctmpl, @blocktmpl, @inlinetmpl, @extention_processor =
|
49
|
+
doctmpl, blocktmpl, inlinetmpl, extention_processor
|
50
|
+
@option = option
|
51
|
+
end
|
52
|
+
|
53
|
+
def visit_DocumentElement(element)
|
54
|
+
@doctmpl.expand(out="") do |m|
|
55
|
+
if @option
|
56
|
+
m.header do |mh|
|
57
|
+
mh.title(@option[:title]) if @option[:title]
|
58
|
+
mh.css(nil,:href=>@option[:css]) if @option[:css]
|
59
|
+
mh.lang(nil,:content=>"text/html; charset=#{@option[:lang]}") if @option[:lang]
|
60
|
+
end
|
61
|
+
end
|
62
|
+
m.document do |md|
|
63
|
+
md.output(visit_children(element))
|
64
|
+
end
|
65
|
+
end
|
66
|
+
out
|
67
|
+
end
|
68
|
+
|
69
|
+
def visit_children(element)
|
70
|
+
SanitizedString[super.to_s]
|
71
|
+
end
|
72
|
+
|
73
|
+
def visit_TextBlock(element)
|
74
|
+
if (is_this_textblock_only_one_block_of_parent_listitem?(element) or
|
75
|
+
is_this_textblock_only_one_block_other_than_sublists_in_parent_listitem?(element))
|
76
|
+
visit_children(element).gsub(/\s/, " ")
|
77
|
+
else
|
78
|
+
@blocktmpl[:textblock][visit_children(element)]
|
79
|
+
end
|
80
|
+
end
|
81
|
+
HeadlineMethods = [
|
82
|
+
nil,
|
83
|
+
:header1,
|
84
|
+
:header2,
|
85
|
+
:header3,
|
86
|
+
:header4,
|
87
|
+
:header5,
|
88
|
+
:header6,
|
89
|
+
nil
|
90
|
+
]
|
91
|
+
|
92
|
+
def visit_Headline(element)
|
93
|
+
c = visit_children(element)
|
94
|
+
@blocktmpl[HeadlineMethods[element.level]][c]
|
95
|
+
end
|
96
|
+
|
97
|
+
def visit_ItemList(element)
|
98
|
+
@blocktmpl[:list][visit_children(element)]
|
99
|
+
end
|
100
|
+
|
101
|
+
def visit_ItemListItem(element)
|
102
|
+
@blocktmpl[:list][:item][visit_children(element)]
|
103
|
+
end
|
104
|
+
|
105
|
+
def visit_EnumList(element)
|
106
|
+
@blocktmpl[:enumlist][visit_children(element)]
|
107
|
+
end
|
108
|
+
|
109
|
+
def apply_to_EnumListItem(element, content)
|
110
|
+
@blocktmpl[:enumlist][:item][content]
|
111
|
+
end
|
112
|
+
|
113
|
+
def visit_DescList(element)
|
114
|
+
@blocktmpl[:desclist][visit_children(element)]
|
115
|
+
end
|
116
|
+
|
117
|
+
def apply_to_DescListItem(element, term, description)
|
118
|
+
@blocktmpl[:desclist][:term][term] +
|
119
|
+
@blocktmpl[:desclist][:description][description]
|
120
|
+
end
|
121
|
+
|
122
|
+
def visit_StringElement(element)
|
123
|
+
element.to_label.amrita_sanitize
|
124
|
+
end
|
125
|
+
|
126
|
+
def visit_Emphasis(element)
|
127
|
+
@inlinetmpl[:emphasis][:text=>visit_children(element)]
|
128
|
+
end
|
129
|
+
|
130
|
+
def visit_Code(element)
|
131
|
+
@inlinetmpl[:code][:text=>visit_children(element)]
|
132
|
+
end
|
133
|
+
|
134
|
+
def visit_Var(element)
|
135
|
+
@inlinetmpl[:var][:text=>visit_children(element)]
|
136
|
+
end
|
137
|
+
|
138
|
+
def visit_Keyboard(element)
|
139
|
+
#@inlinetmpl[:kbd][:text=>visit_children(element)]
|
140
|
+
name, *a = visit_children(element).split(' ')
|
141
|
+
process_ext(name, a)
|
142
|
+
end
|
143
|
+
|
144
|
+
def visit_Reference(element)
|
145
|
+
case element.label
|
146
|
+
when RD::Reference::RDLabel
|
147
|
+
name, *a = element.to_label.split(':')
|
148
|
+
process_ext(name, *a)
|
149
|
+
when RD::Reference::URL
|
150
|
+
@inlinetmpl[:link_to_url][
|
151
|
+
a(:href=>element.label.url) do
|
152
|
+
visit_children(element)
|
153
|
+
end
|
154
|
+
]
|
155
|
+
else
|
156
|
+
raise "can't happen"
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
def apply_to_MethodListItem(element, term, content)
|
161
|
+
name, *args = split_MethodListparams(term)
|
162
|
+
args.unshift content
|
163
|
+
@extention_processor.send(name.intern, args)
|
164
|
+
end
|
165
|
+
|
166
|
+
def split_MethodListparams(term)
|
167
|
+
ret = []
|
168
|
+
while term.size > 0
|
169
|
+
case term
|
170
|
+
when /^\s*\"([^"]+)\"(.*)/ #'"
|
171
|
+
ret << $1
|
172
|
+
term = $2
|
173
|
+
when /^\s*(\S+)(.*)/
|
174
|
+
ret << $1
|
175
|
+
term = $2
|
176
|
+
else
|
177
|
+
raise 'can not happen'
|
178
|
+
end
|
179
|
+
end
|
180
|
+
ret
|
181
|
+
end
|
182
|
+
|
183
|
+
def apply_to_MethodList(element, items)
|
184
|
+
items
|
185
|
+
end
|
186
|
+
|
187
|
+
def process_ext(name, *args)
|
188
|
+
@extention_processor.send(name.intern, *args)
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
class RDAStandardExtention
|
193
|
+
include Amrita2
|
194
|
+
include Amrita2::Core
|
195
|
+
include Amrita2::Runtime
|
196
|
+
extend Amrita2::Runtime
|
197
|
+
|
198
|
+
EXTTMPL = TemplateText.new <<-END
|
199
|
+
<div>
|
200
|
+
<a id='rubytalk' href="http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/$1">[ruby-talk:$1]</a>
|
201
|
+
<a id='raa' href="http://raa.ruby-lang.org/list.rhtml?name=$1">[$2]</a>]
|
202
|
+
<div id='include'><pre>$1$0</pre></div>
|
203
|
+
<amrita:erb id='blockquote'>
|
204
|
+
<blockquote cite='<%= $_[1] %>'>
|
205
|
+
<p><%= $_[0] %></p><p>(<a href='<%= $_[1] %>'><%= $_[2] %></a>)</p>
|
206
|
+
</blockquote>
|
207
|
+
</amrita:erb>
|
208
|
+
</div>
|
209
|
+
END
|
210
|
+
|
211
|
+
EXTTMPL.use_erb(binding)
|
212
|
+
EXTTMPL.element_option[:rubytalk] = :use_args
|
213
|
+
EXTTMPL.element_option[:raa] = :use_args
|
214
|
+
EXTTMPL.element_option[:include] = :use_args
|
215
|
+
EXTTMPL.define_parts(:rubytalk, :raa, :blockquote, :include)
|
216
|
+
|
217
|
+
def initialize(exttmpl=nil)
|
218
|
+
@exttmpl = (exttmpl || EXTTMPL)
|
219
|
+
end
|
220
|
+
|
221
|
+
def table(name, cols, *args)
|
222
|
+
content = yield
|
223
|
+
cols = cols.to_i
|
224
|
+
items = content.split
|
225
|
+
ret = self.send(name) do |mt|
|
226
|
+
mt.header do |mh|
|
227
|
+
cols.times do |i|
|
228
|
+
mh.header_item(items.shift)
|
229
|
+
end
|
230
|
+
end
|
231
|
+
lines = items.size/cols
|
232
|
+
lines.times do |i|
|
233
|
+
mt.detail(i) do |md|
|
234
|
+
md.header_item(items.shift)
|
235
|
+
(cols-1).times do |j|
|
236
|
+
md.item(items.shift)
|
237
|
+
end
|
238
|
+
end
|
239
|
+
end
|
240
|
+
end
|
241
|
+
ret
|
242
|
+
end
|
243
|
+
|
244
|
+
def include(name, title=name)
|
245
|
+
super("--- #{title} ---\n") { File::open(name).read }
|
246
|
+
end
|
247
|
+
|
248
|
+
def method_missing(sym , *arg, &block)
|
249
|
+
arg = t(*arg)
|
250
|
+
tmpl = @exttmpl[sym]
|
251
|
+
raise "extention template element #{sym} not found" unless tmpl
|
252
|
+
tmpl.expand(out="") do |m|
|
253
|
+
meth = m.method(sym)
|
254
|
+
begin
|
255
|
+
meth.call(*arg, &block)
|
256
|
+
end
|
257
|
+
end
|
258
|
+
end
|
259
|
+
|
260
|
+
def method_missing_x(sym , *arg, &block)
|
261
|
+
arg = t(*arg)
|
262
|
+
tmpl = @exttmpl[sym]
|
263
|
+
raise "extention template element #{sym} not found" unless tmpl
|
264
|
+
if block_given?
|
265
|
+
if arg.size == 0
|
266
|
+
tmpl.expand(out="") do |m|
|
267
|
+
m.send(sym, arg.first, &block)
|
268
|
+
end
|
269
|
+
out
|
270
|
+
else
|
271
|
+
tmpl.expand(out="") do |m|
|
272
|
+
m.send(sym, *arg, &block)
|
273
|
+
end
|
274
|
+
out
|
275
|
+
end
|
276
|
+
else
|
277
|
+
if arg.size == 0
|
278
|
+
tmpl[arg.first]
|
279
|
+
else
|
280
|
+
tmpl[arg]
|
281
|
+
end
|
282
|
+
end
|
283
|
+
end
|
284
|
+
end
|
285
|
+
|
286
|
+
class RDAProcessor
|
287
|
+
include Amrita2
|
288
|
+
def self.compile_rd(path, out=nil, opts={})
|
289
|
+
out = path + ".html" unless out
|
290
|
+
css = opts[:css]
|
291
|
+
File::open(path) do |i|
|
292
|
+
File::open(out, "w") do |out|
|
293
|
+
src = i.read
|
294
|
+
ret = Amrita2::RDAProcessor.new(opts).process(src, opts)
|
295
|
+
out.print ret
|
296
|
+
end
|
297
|
+
end
|
298
|
+
end
|
299
|
+
|
300
|
+
def initialize(opts={})
|
301
|
+
doc = opts[:doc_template] || RDTmpl
|
302
|
+
block = opts[:block_template] || RDTmpl[:block]
|
303
|
+
inline = opts[:inline_template] || RDTmpl[:inline]
|
304
|
+
ext = opts[:extention_processor] || RDAStandardExtention.new(opts[:exttmpl])
|
305
|
+
@visitor = Amrita2Visitor.new(doc, block, inline, ext)
|
306
|
+
end
|
307
|
+
|
308
|
+
def process(rdtext, opt=nil)
|
309
|
+
tree = RD::RDTree.new("=begin\n#{rdtext}\n=end\n\n")
|
310
|
+
@visitor.option = opt
|
311
|
+
@visitor.visit(tree)
|
312
|
+
end
|
313
|
+
end
|
314
|
+
end
|
@@ -0,0 +1,304 @@
|
|
1
|
+
require 'amrita2/core'
|
2
|
+
|
3
|
+
module Amrita2
|
4
|
+
class Template
|
5
|
+
include Amrita2
|
6
|
+
|
7
|
+
# Map amrita:type to element_option
|
8
|
+
DefaultTypeMap = {
|
9
|
+
:use_args => { :use_args => true},
|
10
|
+
:use_original_element=> { :use_original_element => true},
|
11
|
+
:expand_by_member => { :expand_by_member => true },
|
12
|
+
:erb => { :erb => true, :use_args=>true },
|
13
|
+
:link => { :link_attr => [:href, [/javascript:.*/]] },
|
14
|
+
:input => { :value_attr => :value },
|
15
|
+
:checkbox => { :value_attr => :checked },
|
16
|
+
:encoding_euc => { :encoding=>'EUC-JP' }
|
17
|
+
}
|
18
|
+
|
19
|
+
# keep id attribute of output if set.
|
20
|
+
attr_accessor :keep_id
|
21
|
+
# The name of attribute that will be used for template expandion by amrita.
|
22
|
+
# You will need to set this if you use _id_ attribute fom DOM.
|
23
|
+
# For expample, if this was set to "amrita_id",
|
24
|
+
# you can use amrita_id for amrita and id for DOM.
|
25
|
+
attr_accessor :amrita_id
|
26
|
+
|
27
|
+
attr_accessor :encoding, :spec, :ie_hack, :debug_source, :eval_cdata_as_erb # :nodoc:
|
28
|
+
|
29
|
+
attr_accessor :type_map, :parts_id # :nodoc:
|
30
|
+
|
31
|
+
attr_reader :mod, :element_option, :root # :nodoc:
|
32
|
+
|
33
|
+
|
34
|
+
def initialize(&block)
|
35
|
+
@keep_id = false
|
36
|
+
@amrita_id = nil
|
37
|
+
@setuped = false
|
38
|
+
@spec = nil
|
39
|
+
@spec_proc = block
|
40
|
+
@type_map = DefaultTypeMap.clone
|
41
|
+
@ie_hack = false
|
42
|
+
@eval_cdata_as_erb = false
|
43
|
+
@element_option = Hash.new
|
44
|
+
@parts_template = Hash.new
|
45
|
+
@parts_id = nil
|
46
|
+
@encoding = $KCODE
|
47
|
+
@debug_source = nil
|
48
|
+
end
|
49
|
+
|
50
|
+
def setup
|
51
|
+
return if @setuped
|
52
|
+
setup_document
|
53
|
+
@spec = get_spec
|
54
|
+
@mod = @spec.create_template_module(@rexml_doc, @rexml_doc)
|
55
|
+
@expander = get_expander
|
56
|
+
@setuped = true
|
57
|
+
end
|
58
|
+
|
59
|
+
def setup_document
|
60
|
+
return if @root
|
61
|
+
@rexml_doc =
|
62
|
+
if @eval_cdata_as_erb
|
63
|
+
t = get_document_text
|
64
|
+
t.gsub!(/<amrita:erb *id='(\w+)'>/, "<span id='\\1'><![CDATA[" )
|
65
|
+
t.gsub!('</amrita:erb>', ']]></span>')
|
66
|
+
REXML::Document.new(t)
|
67
|
+
else
|
68
|
+
get_document
|
69
|
+
end
|
70
|
+
@root = @rexml_doc.root
|
71
|
+
end
|
72
|
+
|
73
|
+
def get_root_option
|
74
|
+
ret = {
|
75
|
+
:delete_id => (not @keep_id),
|
76
|
+
:key_attr_name=>( @amrita_id or :id),
|
77
|
+
:ie_hack => @ie_hack,
|
78
|
+
:eval_cdata_as_erb => @eval_cdata_as_erb,
|
79
|
+
:debug_source => @debug_source,
|
80
|
+
}
|
81
|
+
case @encoding
|
82
|
+
when "EUC"
|
83
|
+
ret[:encoding]='EUC-JP'
|
84
|
+
when "SJIS"
|
85
|
+
ret[:encoding]='SHIFT_JIS'
|
86
|
+
when "UTF8"
|
87
|
+
ret[:encoding]='UTF-8'
|
88
|
+
when "NONE"
|
89
|
+
else
|
90
|
+
raise "unkonw encoding #{@encoding}"
|
91
|
+
end
|
92
|
+
ret
|
93
|
+
end
|
94
|
+
|
95
|
+
def get_spec
|
96
|
+
if @spec
|
97
|
+
@spec
|
98
|
+
elsif @spec_proc
|
99
|
+
@spec = @spec_proc.call
|
100
|
+
else
|
101
|
+
@spec = make_default_spec(@root, @type_map, get_root_option, @element_option)
|
102
|
+
end
|
103
|
+
@spec = @spec.clone unless @spec.cloned
|
104
|
+
@spec
|
105
|
+
end
|
106
|
+
|
107
|
+
def get_expander
|
108
|
+
@spec.generate_expander(@mod)
|
109
|
+
end
|
110
|
+
|
111
|
+
def use_erb(b=TOPLEVEL_BINDING)
|
112
|
+
@eval_cdata_as_erb = b
|
113
|
+
@simple_cdata = true
|
114
|
+
end
|
115
|
+
|
116
|
+
def define_parts(*parts_ids)
|
117
|
+
setup_document
|
118
|
+
parts_ids.each do |pid|
|
119
|
+
case pid
|
120
|
+
when Array
|
121
|
+
pid.each { |id| define_parts(id) }
|
122
|
+
when Symbol
|
123
|
+
make_parts(@root, pid)
|
124
|
+
raise "parts element #{pid} not found" unless @parts_template[pid]
|
125
|
+
when Hash
|
126
|
+
pid.each do |k, v|
|
127
|
+
define_parts(k)
|
128
|
+
@parts_template[k].define_parts(v) unless v == true
|
129
|
+
end
|
130
|
+
else
|
131
|
+
raise "#{pid.class} not supported"
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
def make_parts(element, parts_id)
|
137
|
+
element.each_element do |e|
|
138
|
+
if e.attributes['id'] == parts_id.to_s
|
139
|
+
e.parent.delete(e)
|
140
|
+
pt = @parts_template[parts_id] = TemplateElement.new(e)
|
141
|
+
pt.element_option[parts_id]= element_option[parts_id]
|
142
|
+
pt.parts_id = parts_id
|
143
|
+
pt.debug_source = debug_source
|
144
|
+
pt.use_erb(@eval_cdata_as_erb) if @eval_cdata_as_erb
|
145
|
+
else
|
146
|
+
make_parts(e, parts_id)
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
def [](x)
|
152
|
+
case x
|
153
|
+
when Symbol
|
154
|
+
@parts_template[x]
|
155
|
+
else
|
156
|
+
x = { parts_id=>x} if parts_id
|
157
|
+
expand(out="", x)
|
158
|
+
Amrita2::SanitizedString[out]
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
def expand(out, data=nil, &block)
|
163
|
+
setup unless @setuped
|
164
|
+
set_binding(@eval_cdata_as_erb) if @eval_cdata_as_erb.kind_of?(Binding)
|
165
|
+
if data
|
166
|
+
@expander.expand_template(out, data)
|
167
|
+
else
|
168
|
+
@mod.expand_template(out, &block)
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
def prettyprint=(f)
|
173
|
+
warn 'prettyprint is not supported'
|
174
|
+
end
|
175
|
+
|
176
|
+
def compact_space=(f)
|
177
|
+
warn 'compact_space is not supported'
|
178
|
+
end
|
179
|
+
|
180
|
+
def escaped_id=(f)
|
181
|
+
warn 'escaped_id is not supported'
|
182
|
+
end
|
183
|
+
|
184
|
+
def xml=(f)
|
185
|
+
warn 'xml option is not supported'
|
186
|
+
end
|
187
|
+
|
188
|
+
def asxml=(f)
|
189
|
+
warn 'asxml option is not supported'
|
190
|
+
end
|
191
|
+
|
192
|
+
def pre_format=(f)
|
193
|
+
warn 'pre_format option is not supported'
|
194
|
+
end
|
195
|
+
|
196
|
+
def use_compiler=(f)
|
197
|
+
warn 'use_compiler option is not supported'
|
198
|
+
end
|
199
|
+
|
200
|
+
def get_document
|
201
|
+
nil
|
202
|
+
end
|
203
|
+
|
204
|
+
def make_default_spec(root, type_map, option, element_option)
|
205
|
+
s = Core::RootSpec.new(option.clone)
|
206
|
+
make_default_spec1(root, option, [s], type_map, element_option)
|
207
|
+
s
|
208
|
+
end
|
209
|
+
|
210
|
+
def make_default_spec1(e, option, spec_stack, type_map, element_option)
|
211
|
+
key_attr = option[:key_attr_name].to_s
|
212
|
+
id_ = e.attributes[key_attr]
|
213
|
+
if id_
|
214
|
+
sym = id_.intern
|
215
|
+
opt = get_option(e, option, type_map, element_option, sym)
|
216
|
+
s = Core::DynamicElementSpec.new(sym, nil, opt)
|
217
|
+
s.parent = spec_stack.first
|
218
|
+
spec_stack.first.children << s
|
219
|
+
spec_stack.unshift(s)
|
220
|
+
e.elements.each do |c|
|
221
|
+
make_default_spec1(c, option, spec_stack, type_map, element_option)
|
222
|
+
end
|
223
|
+
spec_stack.shift
|
224
|
+
spec_stack.first.check_double_id if option[:check_double_id]
|
225
|
+
else
|
226
|
+
e.elements.each do |c|
|
227
|
+
make_default_spec1(c, option, spec_stack, type_map, element_option)
|
228
|
+
end
|
229
|
+
end
|
230
|
+
end
|
231
|
+
|
232
|
+
def get_option(e, option, type_map, element_option, sym)
|
233
|
+
ret = option.clone
|
234
|
+
a = e.attributes
|
235
|
+
typ = (a['amrita:type'] || element_option[sym])
|
236
|
+
case typ
|
237
|
+
when Symbol, String
|
238
|
+
default_opt = type_map[typ.intern] || { typ.intern=>true }
|
239
|
+
ret.merge!(default_opt) if default_opt
|
240
|
+
a.delete('amrita:type')
|
241
|
+
when Hash
|
242
|
+
default_opt = typ
|
243
|
+
ret.merge!(default_opt) if default_opt
|
244
|
+
a.delete('amrita:type')
|
245
|
+
end
|
246
|
+
if opt = a['amrita:option']
|
247
|
+
ret.merge!(eval("{#{opt} }"))
|
248
|
+
a.delete('amrita:option')
|
249
|
+
end
|
250
|
+
ret
|
251
|
+
end
|
252
|
+
end
|
253
|
+
|
254
|
+
class TemplateFile < Template
|
255
|
+
include Amrita2
|
256
|
+
def initialize(fname, &block)
|
257
|
+
super(&block)
|
258
|
+
@fname = fname
|
259
|
+
end
|
260
|
+
|
261
|
+
def get_document
|
262
|
+
REXML::Document.new(File.new(@fname))
|
263
|
+
end
|
264
|
+
|
265
|
+
def get_document_text
|
266
|
+
File.new(@fname).read
|
267
|
+
end
|
268
|
+
end
|
269
|
+
|
270
|
+
class TemplateText < Template
|
271
|
+
include Amrita2
|
272
|
+
def initialize(text, &block)
|
273
|
+
super(&block)
|
274
|
+
@text = text
|
275
|
+
end
|
276
|
+
|
277
|
+
def get_document
|
278
|
+
REXML::Document.new(@text)
|
279
|
+
end
|
280
|
+
|
281
|
+
def get_document_text
|
282
|
+
@text
|
283
|
+
end
|
284
|
+
end
|
285
|
+
|
286
|
+
class TemplateElement < Template
|
287
|
+
def initialize(e, &block)
|
288
|
+
super(&block)
|
289
|
+
@element = e
|
290
|
+
end
|
291
|
+
|
292
|
+
def get_document
|
293
|
+
doc = REXML::Document.new
|
294
|
+
doc << @element
|
295
|
+
doc
|
296
|
+
end
|
297
|
+
|
298
|
+
def get_document_text
|
299
|
+
doc = REXML::Document.new
|
300
|
+
doc << @element
|
301
|
+
doc.to_s
|
302
|
+
end
|
303
|
+
end
|
304
|
+
end
|
data/lib/amrita2.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'amrita2/template'
|
metadata
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
rubygems_version: 0.8.11
|
3
|
+
specification_version: 1
|
4
|
+
name: amrita2
|
5
|
+
version: !ruby/object:Gem::Version
|
6
|
+
version: 1.9.6
|
7
|
+
date: 2005-12-07 00:00:00 +09:00
|
8
|
+
summary: Amrita2 is a a xml/xhtml template library for Ruby
|
9
|
+
require_paths:
|
10
|
+
- lib
|
11
|
+
email: tnakajima@brain-tokyo.jp
|
12
|
+
homepage:
|
13
|
+
rubyforge_project:
|
14
|
+
description:
|
15
|
+
autorequire: amrita2
|
16
|
+
default_executable:
|
17
|
+
bindir: bin
|
18
|
+
has_rdoc: false
|
19
|
+
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
20
|
+
requirements:
|
21
|
+
-
|
22
|
+
- ">"
|
23
|
+
- !ruby/object:Gem::Version
|
24
|
+
version: 0.0.0
|
25
|
+
version:
|
26
|
+
platform: ruby
|
27
|
+
signing_key:
|
28
|
+
cert_chain:
|
29
|
+
authors:
|
30
|
+
- Taku Nakajima
|
31
|
+
files:
|
32
|
+
- lib/amrita2.rb
|
33
|
+
- lib/amrita2/template.rb
|
34
|
+
- lib/amrita2/core.rb
|
35
|
+
- lib/amrita2/rd.rb
|
36
|
+
- lib/amrita2/rails_bridge.rb
|
37
|
+
- lib/amrita2/version.rb
|
38
|
+
test_files: []
|
39
|
+
rdoc_options: []
|
40
|
+
extra_rdoc_files: []
|
41
|
+
executables: []
|
42
|
+
extensions: []
|
43
|
+
requirements: []
|
44
|
+
dependencies: []
|