juli 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +26 -0
- data/CODE_OF_CONDUCT.md +13 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +21 -0
- data/README.rdoc +39 -0
- data/Rakefile +89 -0
- data/bin/console +14 -0
- data/bin/je +73 -0
- data/bin/juli +82 -0
- data/bin/juli_tb.rb +76 -0
- data/bin/setup +7 -0
- data/juli.gemspec +29 -0
- data/lib/juli.rb +21 -0
- data/lib/juli/absyn.rb +206 -0
- data/lib/juli/command.rb +180 -0
- data/lib/juli/command/file_entry.rb +12 -0
- data/lib/juli/command/recent_update.rb +52 -0
- data/lib/juli/command/sitemap.rb +55 -0
- data/lib/juli/command/tag.rb +81 -0
- data/lib/juli/line_parser.y +212 -0
- data/lib/juli/macro.rb +39 -0
- data/lib/juli/macro/amazon.rb +33 -0
- data/lib/juli/macro/jmap.rb +38 -0
- data/lib/juli/macro/photo.rb +161 -0
- data/lib/juli/macro/tag.rb +136 -0
- data/lib/juli/macro/template.rb +37 -0
- data/lib/juli/macro/template_base.rb +44 -0
- data/lib/juli/macro/wikipedia.rb +19 -0
- data/lib/juli/parser.y +360 -0
- data/lib/juli/template/default.html +64 -0
- data/lib/juli/template/facebook.html +82 -0
- data/lib/juli/template/je-bash-complete +42 -0
- data/lib/juli/template/juli.css +173 -0
- data/lib/juli/template/juli.js +87 -0
- data/lib/juli/template/locale/en.yml +10 -0
- data/lib/juli/template/locale/ja.yml +10 -0
- data/lib/juli/template/prototype.js +4320 -0
- data/lib/juli/template/simple.html +45 -0
- data/lib/juli/template/sitemap.html +78 -0
- data/lib/juli/template/sitemap_order_by_mtime_DESC.html +78 -0
- data/lib/juli/template/slidy.html +126 -0
- data/lib/juli/template/sourceforge.html +71 -0
- data/lib/juli/template/takahashi_method.html +116 -0
- data/lib/juli/util.rb +255 -0
- data/lib/juli/util/juli_i18n.rb +32 -0
- data/lib/juli/version.rb +3 -0
- data/lib/juli/visitor.rb +12 -0
- data/lib/juli/visitor/html.rb +462 -0
- data/lib/juli/visitor/html/helper.rb +97 -0
- data/lib/juli/visitor/html/helper/contents.rb +76 -0
- data/lib/juli/visitor/html/helper/fb_comments.rb +68 -0
- data/lib/juli/visitor/html/helper/fb_like.rb +37 -0
- data/lib/juli/visitor/html/tag_helper.rb +40 -0
- data/lib/juli/visitor/slidy.rb +39 -0
- data/lib/juli/visitor/takahashi_method.rb +41 -0
- data/lib/juli/visitor/tree.rb +135 -0
- data/lib/juli/wiki.rb +52 -0
- data/sample/protected_photo/2012-04-22/DCIM/101_PANA/P1010441.JPG +0 -0
- data/sample/update_public_juli.rb +71 -0
- data/setup.rb +1585 -0
- metadata +211 -0
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'juli/macro/template_base'
|
2
|
+
|
3
|
+
module Juli
|
4
|
+
module Macro
|
5
|
+
# Interwiki for Wikipedia
|
6
|
+
class Wikipedia < TemplateBase
|
7
|
+
DEFAULT_TEMPLATE = '<a href="http://en.wikipedia.org/wiki/%{wikipedia}">%{wikipedia}</a>'
|
8
|
+
|
9
|
+
def self.conf_template
|
10
|
+
<<EOM
|
11
|
+
# HTML template for wikipedia.
|
12
|
+
# '%{wikipedia}' in the template will be replaced by actual Wikipedia word:
|
13
|
+
#
|
14
|
+
#wikipedia: #{DEFAULT_TEMPLATE}
|
15
|
+
EOM
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/juli/parser.y
ADDED
@@ -0,0 +1,360 @@
|
|
1
|
+
# Text parser for Juli format.
|
2
|
+
class Juli::Parser
|
3
|
+
options no_result_var
|
4
|
+
|
5
|
+
rule
|
6
|
+
# Racc action returns absyn node to build absyn-tree
|
7
|
+
text
|
8
|
+
: blocks { @root = val[0] }
|
9
|
+
|
10
|
+
blocks
|
11
|
+
: /* none */ { Absyn::ArrayNode.new }
|
12
|
+
| blocks block { val[0].add(val[1]) if val[1]; val[0] }
|
13
|
+
|
14
|
+
block
|
15
|
+
: textblock { Absyn::StrNode.new(val[0]) }
|
16
|
+
| '(' textblock ')' { Absyn::Verbatim.new(val[1]) }
|
17
|
+
| '{' chapters '}' { val[1] }
|
18
|
+
| '(' ulist ')' { val[1] }
|
19
|
+
| '(' olist ')' { val[1] }
|
20
|
+
| cdlist
|
21
|
+
| dlist
|
22
|
+
| WHITELINE { nil }
|
23
|
+
|
24
|
+
textblock
|
25
|
+
: STRING
|
26
|
+
| textblock STRING { val[0] + val[1] }
|
27
|
+
|
28
|
+
# chapters are list of chapter at the same level,
|
29
|
+
# and chapter is header + blocks.
|
30
|
+
#
|
31
|
+
# Where, chapter here refers both chapter and/or section in
|
32
|
+
# usual meanings since (again) it contains header + blocks.
|
33
|
+
#
|
34
|
+
# '{' ... '}' at chapters syntax is to let
|
35
|
+
# racc parse headlines with *level* correctly.
|
36
|
+
# It's the same as 'if ... elsif ... elsif ... end' in Ada, Eiffel, and Ruby.
|
37
|
+
chapters
|
38
|
+
: chapter { h = Absyn::ArrayNode.new; h.add(val[0]) }
|
39
|
+
| chapters chapter { val[0].add(val[1]) }
|
40
|
+
chapter
|
41
|
+
: H STRING blocks { Absyn::Chapter.new(val[0], val[1], val[2]) }
|
42
|
+
|
43
|
+
# unordered list
|
44
|
+
ulist
|
45
|
+
: ulist_item { l = Absyn::UnorderedList.new; l.add(val[0]) }
|
46
|
+
| ulist ulist_item { val[0].add(val[1]) }
|
47
|
+
ulist_item
|
48
|
+
: '*' blocks { val[1] }
|
49
|
+
|
50
|
+
# ordered list
|
51
|
+
olist
|
52
|
+
: olist_item { l = Absyn::OrderedList.new; l.add(val[0]) }
|
53
|
+
| olist olist_item { val[0].add(val[1]) }
|
54
|
+
olist_item
|
55
|
+
: '#' blocks { val[1] }
|
56
|
+
|
57
|
+
# compact dictionary list
|
58
|
+
cdlist
|
59
|
+
: cdlist_item { l = Absyn::CompactDictionaryList.new; l.add(val[0])}
|
60
|
+
| cdlist cdlist_item { val[0].add(val[1]) }
|
61
|
+
cdlist_item
|
62
|
+
: CDT STRING { Absyn::CompactDictionaryListItem.new(val[0],val[1])}
|
63
|
+
|
64
|
+
# dictionary list
|
65
|
+
dlist
|
66
|
+
: dlist_item { l = Absyn::DictionaryList.new; l.add(val[0]) }
|
67
|
+
| dlist dlist_item { val[0].add(val[1]) }
|
68
|
+
dlist_item
|
69
|
+
: DT '(' textblock ')'{ Absyn::DictionaryListItem.new(val[0], val[2]) }
|
70
|
+
end
|
71
|
+
|
72
|
+
---- header
|
73
|
+
require 'juli/wiki'
|
74
|
+
|
75
|
+
---- inner
|
76
|
+
require 'erb'
|
77
|
+
require 'juli/visitor'
|
78
|
+
|
79
|
+
# keep nest level; will be used to yield ')'
|
80
|
+
#
|
81
|
+
# This is used for both headline level and list nesting.
|
82
|
+
class NestStack
|
83
|
+
class InvalidOrder < StandardError; end
|
84
|
+
|
85
|
+
def initialize
|
86
|
+
@stack = []
|
87
|
+
@baseline = 0
|
88
|
+
end
|
89
|
+
|
90
|
+
# action on '('
|
91
|
+
def push(length)
|
92
|
+
if @stack.last && @stack.last >= length
|
93
|
+
raise InvalidOrder, "top(#{@stack.last}) >= length(#{length})"
|
94
|
+
end
|
95
|
+
@stack << length
|
96
|
+
@baseline = length
|
97
|
+
end
|
98
|
+
|
99
|
+
# current baseline
|
100
|
+
def baseline
|
101
|
+
@baseline
|
102
|
+
end
|
103
|
+
|
104
|
+
# action on ')'
|
105
|
+
#
|
106
|
+
# go up nest until length meets. Block (mainly for ')') is called
|
107
|
+
# on each pop
|
108
|
+
# If length==nil, pop just 1 level up
|
109
|
+
def pop(length = nil, &block)
|
110
|
+
if length
|
111
|
+
if @stack.last && @stack.last > length
|
112
|
+
@stack.pop
|
113
|
+
yield if block_given?
|
114
|
+
self.pop(length, &block)
|
115
|
+
else
|
116
|
+
@baseline = @stack.last ? length : 0
|
117
|
+
end
|
118
|
+
else
|
119
|
+
if @stack.last
|
120
|
+
@stack.pop
|
121
|
+
yield if block_given?
|
122
|
+
@baseline = @stack.last || 0
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
def flush(&block)
|
128
|
+
while @stack.last do
|
129
|
+
yield if block_given?
|
130
|
+
@stack.pop
|
131
|
+
end
|
132
|
+
@baseline = 0
|
133
|
+
end
|
134
|
+
|
135
|
+
# for debug
|
136
|
+
def status
|
137
|
+
@stack.inspect
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
# parse one file, build Absyn tree, then generate HTML
|
142
|
+
def parse(in_file, visitor)
|
143
|
+
@yydebug = true if ENV['YYDEBUG']
|
144
|
+
@indent_stack = NestStack.new
|
145
|
+
@header_stack = NestStack.new
|
146
|
+
|
147
|
+
@in_verbatim = false
|
148
|
+
@in_file = in_file
|
149
|
+
File.open(in_file) do |io|
|
150
|
+
@in_io = io
|
151
|
+
yyparse self, :scan
|
152
|
+
end
|
153
|
+
visitor.run_file(in_file, @root)
|
154
|
+
end
|
155
|
+
|
156
|
+
# return absyn tree
|
157
|
+
def tree
|
158
|
+
@root
|
159
|
+
end
|
160
|
+
|
161
|
+
private
|
162
|
+
class ScanError < Exception; end
|
163
|
+
|
164
|
+
def scan(&block)
|
165
|
+
@src_line = 0
|
166
|
+
while line = @in_io.gets do
|
167
|
+
debug("@in_verbatim = #{@in_verbatim.inspect}")
|
168
|
+
@src_line += 1
|
169
|
+
case line
|
170
|
+
when /^\s*$/
|
171
|
+
if @in_verbatim
|
172
|
+
yield [:STRING, "\n"]
|
173
|
+
else
|
174
|
+
indent_or_dedent(0, &block)
|
175
|
+
yield [:WHITELINE, nil]
|
176
|
+
end
|
177
|
+
when /^(={1,6})\s+(.*)$/
|
178
|
+
header_nest($1.length, &block)
|
179
|
+
yield [:H, $1.length]
|
180
|
+
yield [:STRING, $2]
|
181
|
+
when /^(\s*)(\d+\.\s+)(.*)$/
|
182
|
+
on_list_item(line, '#', $1.length, $2.length, $3, &block)
|
183
|
+
when /^(\s*)(\*\s+)(.*)$/
|
184
|
+
on_list_item(line, '*', $1.length, $2.length, $3, &block)
|
185
|
+
when /^(\s*)(\S.*)::\s*$/
|
186
|
+
if !on_item($1.length, $2 + "::\n", &block)
|
187
|
+
yield [:DT, $2]
|
188
|
+
end
|
189
|
+
when /^(\s*)((\S.*)::\s+(.*))$/
|
190
|
+
if !on_item($1.length, $2 + "\n", &block)
|
191
|
+
yield [:CDT, $3]
|
192
|
+
yield [:STRING, $4]
|
193
|
+
end
|
194
|
+
when /^(\s*)(.*)$/
|
195
|
+
length = $1.length
|
196
|
+
if indent_or_dedent(length, &block)
|
197
|
+
@in_verbatim = true
|
198
|
+
end
|
199
|
+
yield [:STRING,
|
200
|
+
(@in_verbatim ?
|
201
|
+
' ' * (length - @indent_stack.baseline) :
|
202
|
+
'') + $2 + "\n"]
|
203
|
+
else
|
204
|
+
raise ScanError
|
205
|
+
end
|
206
|
+
end
|
207
|
+
@indent_stack.flush{ yield [')', nil] }
|
208
|
+
@header_stack.flush{ yield ['}', nil] }
|
209
|
+
yield [false, nil]
|
210
|
+
end
|
211
|
+
|
212
|
+
class NoSrcLine < ParseError; end
|
213
|
+
|
214
|
+
def on_error(et, ev, values)
|
215
|
+
print_line('Juli syntax error')
|
216
|
+
raise ParseError
|
217
|
+
rescue NoSrcLine
|
218
|
+
raise ParseError, sprintf("Juli syntax error at line %d\n", @src_line)
|
219
|
+
end
|
220
|
+
|
221
|
+
def on_list_item(line, token, length1, length2, str, &block)
|
222
|
+
length = length1 + length2
|
223
|
+
debug_indent("list item('#{token}')", length)
|
224
|
+
if @in_verbatim
|
225
|
+
if @indent_stack.baseline <= length1
|
226
|
+
yield [:STRING, line]
|
227
|
+
else
|
228
|
+
# after verbatim, dedent just 1-level because there is no
|
229
|
+
# deeper nest in verbatim
|
230
|
+
dedent(&block)
|
231
|
+
@in_verbatim = false
|
232
|
+
indent_or_dedent_on_non_verbatim(length, &block)
|
233
|
+
yield [token, nil]
|
234
|
+
yield [:STRING, str + "\n"]
|
235
|
+
end
|
236
|
+
else
|
237
|
+
base_line_before = @indent_stack.baseline
|
238
|
+
indent_or_dedent(length, &block)
|
239
|
+
if base_line_before > 0 && @indent_stack.baseline == 0
|
240
|
+
warn('Incorrect nest here, but reset it and continue to process.')
|
241
|
+
indent(length, &block)
|
242
|
+
end
|
243
|
+
yield [token, nil]
|
244
|
+
yield [:STRING, str + "\n"]
|
245
|
+
end
|
246
|
+
end
|
247
|
+
|
248
|
+
# action on dictionary list and compact dictionary list
|
249
|
+
#
|
250
|
+
# 1st, check indent, dedent, or continue.
|
251
|
+
# 2nd, if in verbatime, yield string.
|
252
|
+
# otherwise, return in_verbatim to tell caller to do the 'NON verbatim'
|
253
|
+
# case.
|
254
|
+
#
|
255
|
+
# === RETURN
|
256
|
+
# in verbatim
|
257
|
+
def on_item(length, str, &block)
|
258
|
+
if indent_or_dedent(length, &block)
|
259
|
+
@in_verbatim = true
|
260
|
+
end
|
261
|
+
if @in_verbatim
|
262
|
+
yield [:STRING, str]
|
263
|
+
end
|
264
|
+
@in_verbatim
|
265
|
+
end
|
266
|
+
|
267
|
+
# calculate indent level and yield '(' or ')' correctly
|
268
|
+
#
|
269
|
+
# === RETURN
|
270
|
+
# true:: not @in_verbatim and @indent_stack.baseline < length
|
271
|
+
# false:: other case
|
272
|
+
def indent_or_dedent(length, &block)
|
273
|
+
if @in_verbatim
|
274
|
+
debug_indent('in_verbatim', length)
|
275
|
+
if @indent_stack.baseline > length # end of verbatim
|
276
|
+
dedent(length, &block)
|
277
|
+
@in_verbatim = false
|
278
|
+
end
|
279
|
+
false
|
280
|
+
else
|
281
|
+
indent_or_dedent_on_non_verbatim(length, &block)
|
282
|
+
end
|
283
|
+
end
|
284
|
+
|
285
|
+
def indent_or_dedent_on_non_verbatim(length, &block)
|
286
|
+
debug_indent('NOTverbatim', length)
|
287
|
+
if @indent_stack.baseline < length # begin verbatim
|
288
|
+
indent(length, &block)
|
289
|
+
true
|
290
|
+
elsif @indent_stack.baseline > length
|
291
|
+
dedent(length, &block)
|
292
|
+
false
|
293
|
+
end
|
294
|
+
end
|
295
|
+
|
296
|
+
def indent(length, &block)
|
297
|
+
@indent_stack.push(length)
|
298
|
+
yield ['(', nil]
|
299
|
+
end
|
300
|
+
|
301
|
+
def dedent(length=nil, &block)
|
302
|
+
@indent_stack.pop(length) do
|
303
|
+
yield [')', nil]
|
304
|
+
end
|
305
|
+
end
|
306
|
+
|
307
|
+
# calculate header level and yield '(' or ')' correctly
|
308
|
+
def header_nest(length, &block)
|
309
|
+
# at header level change, flush indent_stack
|
310
|
+
@indent_stack.flush{ yield [')', nil] }
|
311
|
+
@in_verbatim = false
|
312
|
+
|
313
|
+
if @header_stack.baseline < length
|
314
|
+
@header_stack.push(length)
|
315
|
+
yield ['{', nil]
|
316
|
+
elsif @header_stack.baseline > length
|
317
|
+
@header_stack.pop(length) do
|
318
|
+
yield ['}', nil]
|
319
|
+
end
|
320
|
+
end
|
321
|
+
end
|
322
|
+
|
323
|
+
# print indent info on debug
|
324
|
+
def debug_indent(key, length)
|
325
|
+
debug(sprintf(
|
326
|
+
"indent(%s): @indent_stack(%s,%d), length=%d",
|
327
|
+
key,
|
328
|
+
@indent_stack.status,
|
329
|
+
@indent_stack.baseline,
|
330
|
+
length))
|
331
|
+
end
|
332
|
+
|
333
|
+
# print str with source text line info to $stderr.
|
334
|
+
# If @src_line is not found, NoSrcLine error is raised.
|
335
|
+
def print_line(str)
|
336
|
+
File.open(@in_file) do |io|
|
337
|
+
line = 0
|
338
|
+
while line_str = io.gets do
|
339
|
+
line += 1
|
340
|
+
if @src_line == line
|
341
|
+
return $stderr.printf("%s: %s\n%04d: %s\n",
|
342
|
+
@in_file,
|
343
|
+
str,
|
344
|
+
@src_line,
|
345
|
+
line_str)
|
346
|
+
end
|
347
|
+
end
|
348
|
+
end
|
349
|
+
raise NoSrcError
|
350
|
+
end
|
351
|
+
|
352
|
+
def warn(str)
|
353
|
+
print_line('WARN: ' + str)
|
354
|
+
end
|
355
|
+
|
356
|
+
# general debug method
|
357
|
+
def debug(str)
|
358
|
+
@racc_debug_out.print(str, "\n") if @yydebug
|
359
|
+
end
|
360
|
+
---- footer
|
@@ -0,0 +1,64 @@
|
|
1
|
+
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
2
|
+
<html>
|
3
|
+
<!--
|
4
|
+
|
5
|
+
DO NOT MODIFY THIS FILE DIRECTORY!
|
6
|
+
|
7
|
+
This file is automatically generated from a text file by juli(1).
|
8
|
+
|
9
|
+
Thanks!
|
10
|
+
-->
|
11
|
+
<%#
|
12
|
+
= Required methods
|
13
|
+
|
14
|
+
juli(1) template must have following methods:
|
15
|
+
|
16
|
+
title:: title string
|
17
|
+
prototype:: prototype url
|
18
|
+
javascript:: javascript url
|
19
|
+
stylesheet:: stylesheet url
|
20
|
+
body:: generate html
|
21
|
+
|
22
|
+
= Optional methods
|
23
|
+
|
24
|
+
Following helper methods are optional:
|
25
|
+
|
26
|
+
contents:: draw contents of page
|
27
|
+
%>
|
28
|
+
<head>
|
29
|
+
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
30
|
+
<title><%= title %></title>
|
31
|
+
<script src="<%= prototype %>" type="text/javascript"></script>
|
32
|
+
<script src="<%= javascript %>" type="text/javascript"></script>
|
33
|
+
<link href="<%= stylesheet %>" rel="stylesheet" type="text/css" />
|
34
|
+
</head>
|
35
|
+
<body>
|
36
|
+
<h1>
|
37
|
+
<%= title %>
|
38
|
+
</h1>
|
39
|
+
<br/><br/>
|
40
|
+
|
41
|
+
<table width='100%'>
|
42
|
+
<tr>
|
43
|
+
<td>
|
44
|
+
<%= contents %>
|
45
|
+
</td>
|
46
|
+
<td align=right valign=top>
|
47
|
+
<table>
|
48
|
+
<tr><td align=left valign=top>
|
49
|
+
<div class=sitemap>
|
50
|
+
<a href="<%= sitemap %>">Sitemap</a>
|
51
|
+
</div>
|
52
|
+
<br/>
|
53
|
+
<!--#include virtual="recent_update.shtml" -->
|
54
|
+
</td></tr>
|
55
|
+
</table>
|
56
|
+
</td>
|
57
|
+
</tr>
|
58
|
+
</table>
|
59
|
+
<br/><br/>
|
60
|
+
<%= body %>
|
61
|
+
<hr/>
|
62
|
+
Generated by <a href='http://jjjuli.sourceforge.net/'>juli <%= Juli::VERSION %></a>
|
63
|
+
</body>
|
64
|
+
</html>
|
@@ -0,0 +1,82 @@
|
|
1
|
+
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
2
|
+
<html xmlns:fb="http://ogp.me/ns/fb#">
|
3
|
+
<!--
|
4
|
+
|
5
|
+
DO NOT MODIFY THIS FILE DIRECTORY!
|
6
|
+
|
7
|
+
This file is automatically generated from a text file by juli(1).
|
8
|
+
|
9
|
+
Thanks!
|
10
|
+
-->
|
11
|
+
<%#
|
12
|
+
= Required methods
|
13
|
+
|
14
|
+
juli(1) template must have following methods:
|
15
|
+
|
16
|
+
title:: title string
|
17
|
+
prototype:: prototype url
|
18
|
+
javascript:: javascript url
|
19
|
+
stylesheet:: stylesheet url
|
20
|
+
body:: generate html
|
21
|
+
|
22
|
+
= Optional methods
|
23
|
+
|
24
|
+
Following helper methods are optional:
|
25
|
+
|
26
|
+
contents:: draw contents of page
|
27
|
+
%>
|
28
|
+
<head>
|
29
|
+
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
30
|
+
<title><%= title %></title>
|
31
|
+
<script src="<%= prototype %>" type="text/javascript"></script>
|
32
|
+
<script src="<%= javascript %>" type="text/javascript"></script>
|
33
|
+
<link href="<%= stylesheet %>" rel="stylesheet" type="text/css" />
|
34
|
+
</head>
|
35
|
+
<body>
|
36
|
+
<div id="fb-root"></div>
|
37
|
+
<!--
|
38
|
+
YOUR_APPID below is a uniq ID for your site.
|
39
|
+
This *SHOULD* be replaced with your actual digits taken from
|
40
|
+
Facebook developer site application registration page fo
|
41
|
+
-->
|
42
|
+
<script>(function(d, s, id) {
|
43
|
+
var js, fjs = d.getElementsByTagName(s)[0];
|
44
|
+
if (d.getElementById(id)) return;
|
45
|
+
js = d.createElement(s); js.id = id;
|
46
|
+
js.src = "//connect.facebook.net/ja_JP/all.js#xfbml=1&appId=YOUR_APPID";
|
47
|
+
fjs.parentNode.insertBefore(js, fjs);
|
48
|
+
}(document, 'script', 'facebook-jssdk'));
|
49
|
+
</script>
|
50
|
+
|
51
|
+
<h1>
|
52
|
+
<%= title %>
|
53
|
+
</h1>
|
54
|
+
<br/><br/>
|
55
|
+
|
56
|
+
<table width='100%'>
|
57
|
+
<tr>
|
58
|
+
<td>
|
59
|
+
<%= contents %>
|
60
|
+
</td>
|
61
|
+
<td align=right valign=top>
|
62
|
+
<table>
|
63
|
+
<tr><td align=left valign=top>
|
64
|
+
<div class=sitemap>
|
65
|
+
<a href="<%= sitemap %>">Sitemap</a>
|
66
|
+
</div>
|
67
|
+
<br/>
|
68
|
+
<!--#include virtual="recent_update.shtml" -->
|
69
|
+
</td></tr>
|
70
|
+
</table>
|
71
|
+
</td>
|
72
|
+
</tr>
|
73
|
+
</table>
|
74
|
+
<br/><br/>
|
75
|
+
<%= body %>
|
76
|
+
<br/><br/>
|
77
|
+
<%= fb_like %>
|
78
|
+
<%= fb_comments %>
|
79
|
+
<hr/>
|
80
|
+
Generated by <a href='http://jjjuli.sourceforge.net/'>juli <%= Juli::VERSION %></a>
|
81
|
+
</body>
|
82
|
+
</html>
|