tdiary-style-rd 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/.rspec +2 -0
- data/.travis.yml +3 -0
- data/Gemfile +6 -0
- data/LICENSE.txt +22 -0
- data/README.md +29 -0
- data/Rakefile +6 -0
- data/lib/tdiary/style/rd.rb +367 -0
- data/lib/tdiary/style/rd/version.rb +7 -0
- data/spec/spec_helper.rb +5 -0
- data/spec/tdiary/style/rd_spec.rb +221 -0
- data/tdiary-style-rd.gemspec +26 -0
- metadata +115 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 26005407987328a5aece608dc4b553d91f0060ea
|
4
|
+
data.tar.gz: ecc5cc264c199379908e1e860a9be3ab4613d517
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 05ce051fab516cc39eaa9af1c51ac43fc516261c8e526bd59da37048046e7ac0668e612b41f7f88fbc293c2ada9e46994111c22ea42ea921e450bc263659ab9f
|
7
|
+
data.tar.gz: 99fcb14750e8134bed5b0424487f490e6dd9ce010ad4ff4e1664ca47b3e0810aa846136237b95d334bcbf0993c0f5587c2d9b791951a7835ce896d40f135d60a
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 SHIBATA Hiroshi
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# Tdiary::Style::Rd
|
2
|
+
|
3
|
+
TODO: Write a gem description
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
gem 'tdiary-style-rd'
|
10
|
+
|
11
|
+
And then execute:
|
12
|
+
|
13
|
+
$ bundle
|
14
|
+
|
15
|
+
Or install it yourself as:
|
16
|
+
|
17
|
+
$ gem install tdiary-style-rd
|
18
|
+
|
19
|
+
## Usage
|
20
|
+
|
21
|
+
TODO: Write usage instructions here
|
22
|
+
|
23
|
+
## Contributing
|
24
|
+
|
25
|
+
1. Fork it
|
26
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
27
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
28
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
29
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,367 @@
|
|
1
|
+
# -*- coding: utf-8; -*-
|
2
|
+
#
|
3
|
+
# rd_style.rb: RD style for tDiary 2.x format. $Revision: 1.32 $
|
4
|
+
# based on Wiki style which Copyright belongs to TADA Tadashi.
|
5
|
+
#
|
6
|
+
# if you want to use this style, install RDtool
|
7
|
+
# and add @style into tdiary.conf below:
|
8
|
+
#
|
9
|
+
# @style = 'RD'
|
10
|
+
#
|
11
|
+
# about RDtool: http://raa.ruby-lang.org/list.rhtml?name=rdtool
|
12
|
+
#
|
13
|
+
# ref_extension codes come from rd2html-ext
|
14
|
+
# http://raa.ruby-lang.org/list.rhtml?name=rd2html-ext
|
15
|
+
#
|
16
|
+
# Copyright (C) 2003, UECHI Yasumasa <uechi@potaway.net>
|
17
|
+
# You can distribute this under GPL.
|
18
|
+
#
|
19
|
+
require 'rd/rdfmt'
|
20
|
+
require 'rd/rd2html-lib'
|
21
|
+
|
22
|
+
module RD
|
23
|
+
TDIARY_BASE_LEVEL = 2
|
24
|
+
|
25
|
+
class RD2tDiaryVisitor < RD2HTMLVisitor
|
26
|
+
def initialize( date=nil, idx=nil, opt=nil, author=nil )
|
27
|
+
@td_date = date
|
28
|
+
@td_idx = idx
|
29
|
+
@td_opt = opt
|
30
|
+
@td_author = author
|
31
|
+
super()
|
32
|
+
end
|
33
|
+
|
34
|
+
def apply_to_DocumentElement(element, content)
|
35
|
+
ret = ""
|
36
|
+
ret << html_body(content) + "\n"
|
37
|
+
ret
|
38
|
+
end
|
39
|
+
|
40
|
+
def html_body(contents)
|
41
|
+
content = contents.join("\n")
|
42
|
+
end
|
43
|
+
private :html_body
|
44
|
+
|
45
|
+
def apply_to_Headline(element, title)
|
46
|
+
level = element.level + TDIARY_BASE_LEVEL
|
47
|
+
title = title.join
|
48
|
+
if level == 3
|
49
|
+
r = %Q[<h#{level}><%= subtitle_proc( Time::at( #{@td_date.to_i} ), #{title.to_s.dump.gsub( /%/, '\\\\045' )} ) %></h#{level}>]
|
50
|
+
else
|
51
|
+
r = %Q[<h#{level}>#{title}</h#{level}>]
|
52
|
+
end
|
53
|
+
r
|
54
|
+
end
|
55
|
+
|
56
|
+
def apply_to_DescListItem(element, term, description)
|
57
|
+
%Q[<dt>#{term.join}</dt>] +
|
58
|
+
if description.empty? then
|
59
|
+
"\n"
|
60
|
+
else
|
61
|
+
%Q[\n<dd>\n#{description.join("\n").chomp}\n</dd>]
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def apply_to_MethodList(element, items)
|
66
|
+
if /^(<.+>)?$/ =~ element.items[0].term.to_label
|
67
|
+
%Q[#{items.join("\n").chomp}\n]
|
68
|
+
else
|
69
|
+
%Q[<dl>\n#{items.join("\n").chomp}\n</dl>]
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def apply_to_MethodListItem(element, term, description)
|
74
|
+
case term
|
75
|
+
when /^<([^\s]+)\s*.*>/
|
76
|
+
closetag = "</#{CGI.unescapeHTML($1)}>"
|
77
|
+
r = CGI.unescapeHTML(term)
|
78
|
+
if description.size > 0
|
79
|
+
r << %Q[\n#{description.join("\n")}\n]
|
80
|
+
r << closetag
|
81
|
+
end
|
82
|
+
r
|
83
|
+
when ''
|
84
|
+
"<hr>"
|
85
|
+
else
|
86
|
+
super
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
# use for tDiary plugin :-p
|
91
|
+
def apply_to_Keyboard(element, content)
|
92
|
+
plugin, args = CGI.unescapeHTML(content.join("")).split(/\s+/, 2)
|
93
|
+
%Q[<%=#{plugin} #{args}%>]
|
94
|
+
end
|
95
|
+
|
96
|
+
# use for native html
|
97
|
+
def apply_to_Index(element, content)
|
98
|
+
CGI.unescapeHTML(content.join)
|
99
|
+
end
|
100
|
+
|
101
|
+
def apply_to_Footnote(element, content)
|
102
|
+
escaped_content = content.join.gsub( /%>/, "%%>" )
|
103
|
+
%Q|<%=fn apply_plugin( #{escaped_content.dump} ) %>|
|
104
|
+
end
|
105
|
+
|
106
|
+
def apply_to_RefToElement(element, content)
|
107
|
+
label = element.to_label
|
108
|
+
key, opt = label.split(/:/, 2)
|
109
|
+
|
110
|
+
case key
|
111
|
+
when "IMG"
|
112
|
+
ref_ext_IMG(label, content.join, opt)
|
113
|
+
when "RAA"
|
114
|
+
ref_ext_RAA(label, content.join, opt)
|
115
|
+
when /^ruby-(talk|list|dev|math|ext|core)$/
|
116
|
+
ref_ext_RubyML(label, content.join, key, opt)
|
117
|
+
when /^(\d{4}|\d{6}|\d{8}|\d{8}-\d+)[^\d]*?#?([pct]\d+)?$/
|
118
|
+
%Q[<%=my "#{key}","#{content.join}"%>]
|
119
|
+
else
|
120
|
+
opt = "" unless opt # case of no ":"
|
121
|
+
%Q[<%=a "#{key}","#{opt}","#{content.join}"%>]
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
private
|
126
|
+
def categorized_subtitle( title )
|
127
|
+
cat = /^(\[(.*?)\])+/.match(title.to_s).to_a[0]
|
128
|
+
subtitle = $'
|
129
|
+
|
130
|
+
if cat
|
131
|
+
r =
|
132
|
+
cat.scan(/\[(.*?)\]/).collect do |c|
|
133
|
+
%Q|<%= category_anchor("#{c[0]}") %>|
|
134
|
+
end.join + subtitle
|
135
|
+
else
|
136
|
+
r = title.to_s
|
137
|
+
end
|
138
|
+
r
|
139
|
+
end
|
140
|
+
|
141
|
+
def ref_ext_RubyML(label, content, ml, article)
|
142
|
+
article.sub!(/^0+/, '')
|
143
|
+
content = "[#{label}]" if label == content
|
144
|
+
|
145
|
+
%Q[<a href="http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/#{ ml }/#{ article }">#{ content }</a>]
|
146
|
+
end
|
147
|
+
|
148
|
+
def ref_ext_RAA(label, content, name)
|
149
|
+
name = CGI.escape(name)
|
150
|
+
content = "[#{label}]" if label == content
|
151
|
+
%Q[<a href="http://raa.ruby-lang.org/list.rhtml?name=#{ name }">#{ content }</a>]
|
152
|
+
end
|
153
|
+
|
154
|
+
def ref_ext_IMG(label, content, src)
|
155
|
+
label.to_s == content.to_s and content = src
|
156
|
+
%Q[<img src="#{src}" alt="#{content}">]
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
class RD2tDiaryCHTMLVistor < RD2tDiaryVisitor
|
161
|
+
def apply_to_Headline(element, title)
|
162
|
+
level = element.level + TDIARY_BASE_LEVEL
|
163
|
+
title = title.join
|
164
|
+
if level == 3
|
165
|
+
r = %Q[<H#{level}><%= subtitle_proc( Time::at( #{@td_date.to_i} ), #{title.to_s.dump.gsub( /%/, '\\\\045' )} ) %></H#{level}>]
|
166
|
+
else
|
167
|
+
r = %Q[<H#{level}>#{title}</H#{level}>]
|
168
|
+
end
|
169
|
+
r
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
class RDInlineParser
|
174
|
+
def on_error(et, ev, values)
|
175
|
+
lines_of_rest = @src.rest.lines.to_a.length
|
176
|
+
prev_words = prev_words_on_error(ev)
|
177
|
+
at = 4 + prev_words.length
|
178
|
+
message = <<-MSG
|
179
|
+
RD syntax error: line #{@blockp.line_index - lines_of_rest - 1}:
|
180
|
+
...#{prev_words} #{(ev||'')} #{next_words_on_error()} ...
|
181
|
+
MSG
|
182
|
+
message << " " * at + "^" * (ev ? ev.length : 0) + "\n"
|
183
|
+
raise ParseError, message
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
end
|
188
|
+
|
189
|
+
module TDiary
|
190
|
+
module Style
|
191
|
+
class RDSection
|
192
|
+
include RD
|
193
|
+
|
194
|
+
attr_reader :author, :categories, :subtitle, :stripped_subtitle
|
195
|
+
attr_reader :body_to_html, :subtitle_to_html, :stripped_subtitle_to_html
|
196
|
+
|
197
|
+
def initialize( fragment, author = nil )
|
198
|
+
@author = author
|
199
|
+
if /\A=(?!=)/ =~ fragment then
|
200
|
+
@subtitle, @body = fragment.split( /\n/, 2 )
|
201
|
+
@subtitle.sub!( /^\=\s*/, '' )
|
202
|
+
else
|
203
|
+
@subtitle = nil
|
204
|
+
@body = fragment.dup
|
205
|
+
end
|
206
|
+
@body = @body || ''
|
207
|
+
@body.sub!( /[\n\r]+\Z/, '' )
|
208
|
+
@body << "\n\n"
|
209
|
+
|
210
|
+
@categories = get_categories
|
211
|
+
@stripped_subtitle = strip_subtitle
|
212
|
+
|
213
|
+
@subtitle_to_html = manufacture(@subtitle, true)
|
214
|
+
@stripped_subtitle_to_html = manufacture(@stripped_subtitle, true)
|
215
|
+
@body_to_html = manufacture(@body, false)
|
216
|
+
end
|
217
|
+
|
218
|
+
def subtitle=(subtitle)
|
219
|
+
cat_str = ""
|
220
|
+
@categories.each {|cat|
|
221
|
+
cat_str << "[#{cat}]"
|
222
|
+
}
|
223
|
+
cat_str << " " unless cat_str.empty?
|
224
|
+
@subtitle = subtitle ? (cat_str + subtitle) : nil
|
225
|
+
@stripped_subtitle = strip_subtitle
|
226
|
+
end
|
227
|
+
|
228
|
+
def body=(str)
|
229
|
+
@body = str
|
230
|
+
end
|
231
|
+
|
232
|
+
def body
|
233
|
+
@body.dup
|
234
|
+
end
|
235
|
+
|
236
|
+
def categories=(categories)
|
237
|
+
@categories = categories
|
238
|
+
cat_str = ""
|
239
|
+
categories.each {|cat|
|
240
|
+
cat_str << "[#{cat}]"
|
241
|
+
}
|
242
|
+
cat_str << " " unless cat_str.empty?
|
243
|
+
@subtitle = @subtitle ? (cat_str + @stripped_subtitle) : nil
|
244
|
+
@stripped_subtitle = strip_subtitle
|
245
|
+
end
|
246
|
+
|
247
|
+
def to_src
|
248
|
+
r = ''
|
249
|
+
r << "= #{@subtitle}\n" if @subtitle
|
250
|
+
r << @body
|
251
|
+
end
|
252
|
+
|
253
|
+
def html( date, idx, opt, mode = :HTML)
|
254
|
+
if mode == :CHTML
|
255
|
+
visitor = RD2tDiaryCHTMLVistor.new( date, idx, opt, @author)
|
256
|
+
section_open = "<%=section_enter_proc( Time::at( #{date.to_i} ))%>\n"
|
257
|
+
section_close = "<%=section_leave_proc( Time::at( #{date.to_i} ))%>\n"
|
258
|
+
else
|
259
|
+
visitor = RD2tDiaryVisitor.new( date, idx, opt, @author )
|
260
|
+
section_open = %Q[<div class="section">\n<%=section_enter_proc( Time::at( #{date.to_i} ))%>\n]
|
261
|
+
section_close = "<%=section_leave_proc( Time::at( #{date.to_i} ))%>\n</div>\n"
|
262
|
+
end
|
263
|
+
|
264
|
+
src = to_src.split(/^/)
|
265
|
+
src.unshift("=begin\n").push("=end\n")
|
266
|
+
tree = RDTree.new( src, nil, nil)
|
267
|
+
begin
|
268
|
+
tree.parse
|
269
|
+
rescue ParseError
|
270
|
+
raise SyntaxError, $!.message
|
271
|
+
end
|
272
|
+
|
273
|
+
r = "#{section_open}#{visitor.visit( tree )}#{section_close}"
|
274
|
+
end
|
275
|
+
|
276
|
+
private
|
277
|
+
def manufacture(str, subtitle = false)
|
278
|
+
return nil unless str
|
279
|
+
src = str.strip.split(/^/).unshift("=begin\n").push("=end\n")
|
280
|
+
visitor = RD2tDiaryVisitor.new
|
281
|
+
tree = RDTree.new(src, nil, nil)
|
282
|
+
begin
|
283
|
+
r = visitor.visit( tree.parse )
|
284
|
+
r.gsub!(/<\/?p>/, '') if subtitle
|
285
|
+
r
|
286
|
+
rescue ParseError
|
287
|
+
str
|
288
|
+
end
|
289
|
+
end
|
290
|
+
|
291
|
+
def get_categories
|
292
|
+
return [] unless @subtitle
|
293
|
+
cat = /^(\[(.*?)\])+/.match(@subtitle).to_a[0]
|
294
|
+
return [] unless cat
|
295
|
+
cat.scan(/\[(.*?)\]/).collect do |c|
|
296
|
+
c[0].split(/,/)
|
297
|
+
end.flatten
|
298
|
+
end
|
299
|
+
|
300
|
+
def strip_subtitle
|
301
|
+
return nil unless @subtitle
|
302
|
+
@subtitle.sub(/^(\[(.*?)\])+/,'')
|
303
|
+
end
|
304
|
+
end
|
305
|
+
|
306
|
+
class RdDiary
|
307
|
+
include BaseDiary
|
308
|
+
include CategorizableDiary
|
309
|
+
|
310
|
+
def initialize( date, title, body, modified = Time::now )
|
311
|
+
init_diary
|
312
|
+
replace( date, title, body )
|
313
|
+
@last_modified = modified
|
314
|
+
end
|
315
|
+
|
316
|
+
def style
|
317
|
+
'RD'
|
318
|
+
end
|
319
|
+
|
320
|
+
def append( body, author = nil )
|
321
|
+
section = nil
|
322
|
+
body.lines.each do |l|
|
323
|
+
case l
|
324
|
+
when /^=(begin|end)\b/
|
325
|
+
# do nothing
|
326
|
+
when /^=[^=]/
|
327
|
+
@sections << RDSection::new( section, author ) if section
|
328
|
+
section = l
|
329
|
+
else
|
330
|
+
section = '' unless section
|
331
|
+
section << l
|
332
|
+
end
|
333
|
+
end
|
334
|
+
@sections << RDSection::new( section, author ) if section
|
335
|
+
@last_modified = Time::now
|
336
|
+
self
|
337
|
+
end
|
338
|
+
|
339
|
+
def add_section(subtitle, body)
|
340
|
+
sec = RDSection::new("\n")
|
341
|
+
sec.subtitle = subtitle
|
342
|
+
sec.body = body
|
343
|
+
@sections << sec
|
344
|
+
@sections.size
|
345
|
+
end
|
346
|
+
|
347
|
+
def to_html( opt = {}, mode = :HTML )
|
348
|
+
r = ''
|
349
|
+
idx = 1
|
350
|
+
each_section do |section|
|
351
|
+
r << section.html( date, idx, opt, mode )
|
352
|
+
idx += 1
|
353
|
+
end
|
354
|
+
return r
|
355
|
+
end
|
356
|
+
|
357
|
+
undef :to_html4, :to_chtml
|
358
|
+
end
|
359
|
+
end
|
360
|
+
end
|
361
|
+
|
362
|
+
# Local Variables:
|
363
|
+
# mode: ruby
|
364
|
+
# indent-tabs-mode: t
|
365
|
+
# tab-width: 3
|
366
|
+
# ruby-indent-level: 3
|
367
|
+
# End:
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,221 @@
|
|
1
|
+
# -*- coding: utf-8; -*-
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe TDiary::Style::RdDiary do
|
5
|
+
before do
|
6
|
+
@diary = TDiary::Style::RdDiary.new(Time::at( 1041346800 ), "TITLE", "")
|
7
|
+
end
|
8
|
+
|
9
|
+
describe '#append' do
|
10
|
+
before do
|
11
|
+
source = <<-'EOF'
|
12
|
+
= subTitle
|
13
|
+
honbun
|
14
|
+
|
15
|
+
== subTitleH4
|
16
|
+
honbun
|
17
|
+
|
18
|
+
EOF
|
19
|
+
@diary.append(source)
|
20
|
+
end
|
21
|
+
|
22
|
+
context 'HTML' do
|
23
|
+
before do
|
24
|
+
@html = <<-'EOF'
|
25
|
+
<div class="section">
|
26
|
+
<%=section_enter_proc( Time::at( 1041346800 ))%>
|
27
|
+
<h3><%= subtitle_proc( Time::at( 1041346800 ), "subTitle" ) %></h3>
|
28
|
+
<p>honbun</p>
|
29
|
+
<h4>subTitleH4</h4>
|
30
|
+
<p>honbun</p>
|
31
|
+
<%=section_leave_proc( Time::at( 1041346800 ))%>
|
32
|
+
</div>
|
33
|
+
EOF
|
34
|
+
end
|
35
|
+
it { @diary.to_html.should eq @html }
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe '#replace' do
|
40
|
+
before do
|
41
|
+
source = <<-'EOF'
|
42
|
+
= subTitle
|
43
|
+
honbun
|
44
|
+
|
45
|
+
== subTitleH4
|
46
|
+
honbun
|
47
|
+
|
48
|
+
EOF
|
49
|
+
@diary.append(source)
|
50
|
+
|
51
|
+
replaced = <<-'EOF'
|
52
|
+
= replaceTitle
|
53
|
+
replace
|
54
|
+
|
55
|
+
== replaceTitleH4
|
56
|
+
replace
|
57
|
+
|
58
|
+
EOF
|
59
|
+
@diary.replace(Time::at( 1041346800 ), "TITLE", replaced)
|
60
|
+
|
61
|
+
@html = <<-'EOF'
|
62
|
+
<div class="section">
|
63
|
+
<%=section_enter_proc( Time::at( 1041346800 ))%>
|
64
|
+
<h3><%= subtitle_proc( Time::at( 1041346800 ), "replaceTitle" ) %></h3>
|
65
|
+
<p>replace</p>
|
66
|
+
<h4>replaceTitleH4</h4>
|
67
|
+
<p>replace</p>
|
68
|
+
<%=section_leave_proc( Time::at( 1041346800 ))%>
|
69
|
+
</div>
|
70
|
+
EOF
|
71
|
+
end
|
72
|
+
it { @diary.to_html.should eq @html }
|
73
|
+
end
|
74
|
+
|
75
|
+
describe '#add_section' do
|
76
|
+
before do
|
77
|
+
source = <<-'EOF'
|
78
|
+
= subTitle
|
79
|
+
honbun
|
80
|
+
|
81
|
+
== subTitleH4
|
82
|
+
honbun
|
83
|
+
|
84
|
+
EOF
|
85
|
+
@diary.append(source)
|
86
|
+
@diary.add_section('subTitle2', 'honbun')
|
87
|
+
|
88
|
+
@html = <<-'EOF'
|
89
|
+
<div class="section">
|
90
|
+
<%=section_enter_proc( Time::at( 1041346800 ))%>
|
91
|
+
<h3><%= subtitle_proc( Time::at( 1041346800 ), "subTitle" ) %></h3>
|
92
|
+
<p>honbun</p>
|
93
|
+
<h4>subTitleH4</h4>
|
94
|
+
<p>honbun</p>
|
95
|
+
<%=section_leave_proc( Time::at( 1041346800 ))%>
|
96
|
+
</div>
|
97
|
+
<div class="section">
|
98
|
+
<%=section_enter_proc( Time::at( 1041346800 ))%>
|
99
|
+
<h3><%= subtitle_proc( Time::at( 1041346800 ), "subTitle2" ) %></h3>
|
100
|
+
<p>honbun</p>
|
101
|
+
<%=section_leave_proc( Time::at( 1041346800 ))%>
|
102
|
+
</div>
|
103
|
+
EOF
|
104
|
+
end
|
105
|
+
it { @diary.to_html.should eq @html }
|
106
|
+
end
|
107
|
+
|
108
|
+
describe '#delete_section' do
|
109
|
+
before do
|
110
|
+
source = <<-'EOF'
|
111
|
+
= subTitle
|
112
|
+
honbun
|
113
|
+
|
114
|
+
= subTitle2
|
115
|
+
honbun
|
116
|
+
|
117
|
+
EOF
|
118
|
+
@diary.append(source)
|
119
|
+
@diary.delete_section(1)
|
120
|
+
|
121
|
+
@html = <<-'EOF'
|
122
|
+
<div class="section">
|
123
|
+
<%=section_enter_proc( Time::at( 1041346800 ))%>
|
124
|
+
<h3><%= subtitle_proc( Time::at( 1041346800 ), "subTitle2" ) %></h3>
|
125
|
+
<p>honbun</p>
|
126
|
+
<%=section_leave_proc( Time::at( 1041346800 ))%>
|
127
|
+
</div>
|
128
|
+
EOF
|
129
|
+
end
|
130
|
+
it { @diary.to_html.should eq @html }
|
131
|
+
end
|
132
|
+
|
133
|
+
describe 'test_rd_style_plugin' do
|
134
|
+
before do
|
135
|
+
source = <<-'EOF'
|
136
|
+
= subTitle
|
137
|
+
((%plugin%))
|
138
|
+
((%plugin%))
|
139
|
+
aaa
|
140
|
+
|
141
|
+
((%plugin%))
|
142
|
+
|
143
|
+
a((%ho
|
144
|
+
ge%))b
|
145
|
+
|
146
|
+
((%ho
|
147
|
+
ge%))
|
148
|
+
EOF
|
149
|
+
@diary.append(source)
|
150
|
+
end
|
151
|
+
|
152
|
+
context 'HTML' do
|
153
|
+
before do
|
154
|
+
@html = <<-'EOF'
|
155
|
+
<div class="section">
|
156
|
+
<%=section_enter_proc( Time::at( 1041346800 ))%>
|
157
|
+
<h3><%= subtitle_proc( Time::at( 1041346800 ), "subTitle" ) %></h3>
|
158
|
+
<p><%=plugin %>
|
159
|
+
<%=plugin %>
|
160
|
+
aaa</p>
|
161
|
+
<p><%=plugin %></p>
|
162
|
+
<p>a<%=ho ge%>b</p>
|
163
|
+
<p><%=ho ge%></p>
|
164
|
+
<%=section_leave_proc( Time::at( 1041346800 ))%>
|
165
|
+
</div>
|
166
|
+
EOF
|
167
|
+
end
|
168
|
+
it { @diary.to_html.should eq @html }
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
describe 'fn' do
|
173
|
+
context 'my' do
|
174
|
+
before do
|
175
|
+
source = <<-'EOF'
|
176
|
+
((-((<20130714>))-))
|
177
|
+
EOF
|
178
|
+
@diary.append(source)
|
179
|
+
end
|
180
|
+
|
181
|
+
before do
|
182
|
+
@html = <<-'EOF'
|
183
|
+
<div class="section">
|
184
|
+
<%=section_enter_proc( Time::at( 1041346800 ))%>
|
185
|
+
<p><%=fn apply_plugin( "<%=my \"20130714\",\"20130714\"%%>" ) %></p>
|
186
|
+
<%=section_leave_proc( Time::at( 1041346800 ))%>
|
187
|
+
</div>
|
188
|
+
EOF
|
189
|
+
end
|
190
|
+
it { @diary.to_html.should eq @html }
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
describe 'test_rd_on_error' do
|
195
|
+
context 'link' do
|
196
|
+
before do
|
197
|
+
source = <<-'EOF'
|
198
|
+
((<tdiary|http://www.tdiary.org/>))
|
199
|
+
EOF
|
200
|
+
@diary.append(source)
|
201
|
+
@exception_message = <<-'EOF'
|
202
|
+
RD syntax error: line 1:
|
203
|
+
...((<tdiary|http:/ / www.tdiary.org/>)) ...
|
204
|
+
^
|
205
|
+
EOF
|
206
|
+
end
|
207
|
+
it {
|
208
|
+
lambda{ @diary.to_html }.should raise_error(SyntaxError){ |e|
|
209
|
+
e.message.should eq @exception_message
|
210
|
+
}
|
211
|
+
}
|
212
|
+
end
|
213
|
+
end
|
214
|
+
end
|
215
|
+
|
216
|
+
# Local Variables:
|
217
|
+
# mode: ruby
|
218
|
+
# indent-tabs-mode: t
|
219
|
+
# tab-width: 3
|
220
|
+
# ruby-indent-level: 3
|
221
|
+
# End:
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'tdiary/style/rd/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "tdiary-style-rd"
|
8
|
+
spec.version = Tdiary::Style::Rd::VERSION
|
9
|
+
spec.authors = ["SHIBATA Hiroshi"]
|
10
|
+
spec.email = ["shibata.hiroshi@gmail.com"]
|
11
|
+
spec.description = %q{RD Style for tDiary}
|
12
|
+
spec.summary = %q{RD Style for tDiary}
|
13
|
+
spec.homepage = ""
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_dependency "rdtool"
|
22
|
+
|
23
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
24
|
+
spec.add_development_dependency "rake"
|
25
|
+
spec.add_development_dependency "rspec"
|
26
|
+
end
|
metadata
ADDED
@@ -0,0 +1,115 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: tdiary-style-rd
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- SHIBATA Hiroshi
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-09-26 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rdtool
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.3'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.3'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
description: RD Style for tDiary
|
70
|
+
email:
|
71
|
+
- shibata.hiroshi@gmail.com
|
72
|
+
executables: []
|
73
|
+
extensions: []
|
74
|
+
extra_rdoc_files: []
|
75
|
+
files:
|
76
|
+
- ".gitignore"
|
77
|
+
- ".rspec"
|
78
|
+
- ".travis.yml"
|
79
|
+
- Gemfile
|
80
|
+
- LICENSE.txt
|
81
|
+
- README.md
|
82
|
+
- Rakefile
|
83
|
+
- lib/tdiary/style/rd.rb
|
84
|
+
- lib/tdiary/style/rd/version.rb
|
85
|
+
- spec/spec_helper.rb
|
86
|
+
- spec/tdiary/style/rd_spec.rb
|
87
|
+
- tdiary-style-rd.gemspec
|
88
|
+
homepage: ''
|
89
|
+
licenses:
|
90
|
+
- MIT
|
91
|
+
metadata: {}
|
92
|
+
post_install_message:
|
93
|
+
rdoc_options: []
|
94
|
+
require_paths:
|
95
|
+
- lib
|
96
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
97
|
+
requirements:
|
98
|
+
- - ">="
|
99
|
+
- !ruby/object:Gem::Version
|
100
|
+
version: '0'
|
101
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
102
|
+
requirements:
|
103
|
+
- - ">="
|
104
|
+
- !ruby/object:Gem::Version
|
105
|
+
version: '0'
|
106
|
+
requirements: []
|
107
|
+
rubyforge_project:
|
108
|
+
rubygems_version: 2.1.3
|
109
|
+
signing_key:
|
110
|
+
specification_version: 4
|
111
|
+
summary: RD Style for tDiary
|
112
|
+
test_files:
|
113
|
+
- spec/spec_helper.rb
|
114
|
+
- spec/tdiary/style/rd_spec.rb
|
115
|
+
has_rdoc:
|