amrita2 1.9.6
Sign up to get free protection for your applications and to get access to all the features.
- 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: []
|