iwadon-text-hatena 0.12.20080627.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README +146 -0
- data/README.en +62 -0
- data/README.rdoc +62 -0
- data/Rakefile +62 -0
- data/lib/text/hatena.rb +62 -0
- data/lib/text/hatena/auto_link.rb +114 -0
- data/lib/text/hatena/auto_link/amazon.rb +31 -0
- data/lib/text/hatena/auto_link/asin.rb +155 -0
- data/lib/text/hatena/auto_link/ean.rb +62 -0
- data/lib/text/hatena/auto_link/ftp.rb +19 -0
- data/lib/text/hatena/auto_link/google.rb +32 -0
- data/lib/text/hatena/auto_link/hatena_antenna.rb +26 -0
- data/lib/text/hatena/auto_link/hatena_bookmark.rb +57 -0
- data/lib/text/hatena/auto_link/hatena_diary.rb +77 -0
- data/lib/text/hatena/auto_link/hatena_fotolife.rb +101 -0
- data/lib/text/hatena/auto_link/hatena_graph.rb +69 -0
- data/lib/text/hatena/auto_link/hatena_group.rb +96 -0
- data/lib/text/hatena/auto_link/hatena_id.rb +34 -0
- data/lib/text/hatena/auto_link/hatena_idea.rb +55 -0
- data/lib/text/hatena/auto_link/hatena_map.rb +56 -0
- data/lib/text/hatena/auto_link/hatena_question.rb +44 -0
- data/lib/text/hatena/auto_link/hatena_rss.rb +26 -0
- data/lib/text/hatena/auto_link/hatena_search.rb +44 -0
- data/lib/text/hatena/auto_link/http.rb +102 -0
- data/lib/text/hatena/auto_link/mailto.rb +24 -0
- data/lib/text/hatena/auto_link/rakuten.rb +24 -0
- data/lib/text/hatena/auto_link/scheme.rb +40 -0
- data/lib/text/hatena/auto_link/tex.rb +26 -0
- data/lib/text/hatena/auto_link/unbracket.rb +23 -0
- data/lib/text/hatena/blockquote_node.rb +43 -0
- data/lib/text/hatena/body_node.rb +18 -0
- data/lib/text/hatena/br_node.rb +19 -0
- data/lib/text/hatena/cdata_node.rb +22 -0
- data/lib/text/hatena/context.rb +113 -0
- data/lib/text/hatena/dl_node.rb +28 -0
- data/lib/text/hatena/footnote_node.rb +33 -0
- data/lib/text/hatena/h3_node.rb +58 -0
- data/lib/text/hatena/h4_node.rb +19 -0
- data/lib/text/hatena/h5_node.rb +19 -0
- data/lib/text/hatena/html_filter.rb +207 -0
- data/lib/text/hatena/list_node.rb +59 -0
- data/lib/text/hatena/node.rb +33 -0
- data/lib/text/hatena/p_node.rb +18 -0
- data/lib/text/hatena/pre_node.rb +37 -0
- data/lib/text/hatena/section_node.rb +39 -0
- data/lib/text/hatena/superpre_node.rb +71 -0
- data/lib/text/hatena/table_node.rb +34 -0
- data/lib/text/hatena/tag_node.rb +44 -0
- data/lib/text/hatena/tagline_node.rb +19 -0
- data/lib/text/hatena/text.rb +36 -0
- data/lib/text/hatena/utils/htmlsplit.rb +891 -0
- data/lib/text/hatena/utils/section_node_utils.rb +43 -0
- data/t/test_02_autolink_text.rb +20 -0
- data/t/test_06_autolink_hatenafotolife.rb +104 -0
- data/t/test_08_autolink_asin.rb +65 -0
- data/t/test_09_autolink_hatenadiary.rb +62 -0
- data/t/test_11_autolink_tex.rb +32 -0
- data/t/test_13_autolink_hatenaantenna.rb +26 -0
- data/t/test_14_autolink_hatenabookmark.rb +56 -0
- data/t/test_15_autolink_hatenarss.rb +26 -0
- data/t/test_16_autolink_hatenaidea.rb +38 -0
- data/t/test_17_autolink_hatenaquestion.rb +32 -0
- data/t/test_18_autolink_ean.rb +32 -0
- data/t/test_19_autolink_hatenagraph.rb +44 -0
- data/t/test_23_autolink_amazon.rb +27 -0
- data/t/test_asin.rb +64 -0
- data/t/test_auto_link.rb +19 -0
- data/t/test_dl_node.rb +23 -0
- data/t/test_erb_tag.rb +23 -0
- data/t/test_footnote.rb +63 -0
- data/t/test_footnote_in_list.rb +53 -0
- data/t/test_helper.rb +13 -0
- data/t/test_quote.rb +75 -0
- data/t/test_raw_html.rb +25 -0
- data/t/test_sanitize.rb +27 -0
- data/t/test_superpre_vimcolor.rb +94 -0
- data/t/test_text_hatena.rb +287 -0
- data/t/test_text_hatena_autolink.rb +333 -0
- data/text-hatena.gemspec +133 -0
- metadata +131 -0
@@ -0,0 +1,101 @@
|
|
1
|
+
require "text/hatena/auto_link/scheme"
|
2
|
+
|
3
|
+
module Text
|
4
|
+
class Hatena
|
5
|
+
class AutoLink
|
6
|
+
class HatenaFotolife < Scheme
|
7
|
+
@@pattern_foto = /\[?f:id:([A-Za-z][a-zA-Z0-9_\-]{2,14})(?::(\d{14}|favorite)([jpg])?)?(?::(image)(?:(small|:(?:small|medium|h\d+|w\d+|left|right)(?:,(?:small|medium|h\d+|w\d+|left|right))*))?)?\]?/i
|
8
|
+
@@pattern_keyword = /\[(f:(keyword|t):([^\]]+))\]/i
|
9
|
+
|
10
|
+
def patterns
|
11
|
+
[@@pattern_foto, @@pattern_keyword]
|
12
|
+
end
|
13
|
+
|
14
|
+
def init
|
15
|
+
super
|
16
|
+
@domain = "f.hatena.ne.jp"
|
17
|
+
end
|
18
|
+
|
19
|
+
def parse(text, opt = {})
|
20
|
+
if @@pattern_foto =~ text
|
21
|
+
_parse_foto(text)
|
22
|
+
elsif @@pattern_keyword =~ text
|
23
|
+
_parse_keyword(text)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def _parse_foto(text)
|
30
|
+
return if @@pattern_foto !~ text
|
31
|
+
name, fid, ext, type, size = $1, $2 || "", $3 || "", $4 || "", $5 || ""
|
32
|
+
if /^g$/i =~ ext
|
33
|
+
ext = "gif"
|
34
|
+
elsif /^p$/ =~ ext
|
35
|
+
ext = "png"
|
36
|
+
else
|
37
|
+
ext = "jpg"
|
38
|
+
end
|
39
|
+
if fid.empty? or /^favorite$/i =~ fid
|
40
|
+
return sprintf('<a href="http://%s/%s/%s"%s>%s</a>',
|
41
|
+
@domain,
|
42
|
+
name,
|
43
|
+
fid,
|
44
|
+
@a_target_string,
|
45
|
+
text)
|
46
|
+
elsif /image/i =~ type
|
47
|
+
firstchar = name[0, 1]
|
48
|
+
date = fid[0, 8]
|
49
|
+
class_str, w_str, h_str, file_name = "", "", "", sprintf("%s.%s", fid, ext)
|
50
|
+
size.split(/,/).each do |s|
|
51
|
+
case s
|
52
|
+
when /small/i
|
53
|
+
file_name = sprintf("%s_m.gif", fid)
|
54
|
+
when /medium/i
|
55
|
+
file_name = sprintf("%s_120.jpg", fid)
|
56
|
+
when /h(\d+)/i
|
57
|
+
h_str = sprintf(' height="%d"', $1.to_i)
|
58
|
+
when /w(\d+)/i
|
59
|
+
w_str = sprintf(' width="%d"', $1.to_i)
|
60
|
+
when /left/i
|
61
|
+
class_str = ' hatena-image-left'
|
62
|
+
when /right/i
|
63
|
+
class_str = ' hatena-image-right'
|
64
|
+
end
|
65
|
+
end
|
66
|
+
return sprintf('<a href="http://%s/%s/%s"%s><img src="http://%s/images/fotolife/%s/%s/%d/%s" alt="%s" title="%s" class="hatena-fotolife%s"%s%s></a>',
|
67
|
+
@domain,
|
68
|
+
name,
|
69
|
+
fid,
|
70
|
+
@a_target_string,
|
71
|
+
@domain,
|
72
|
+
firstchar,
|
73
|
+
name,
|
74
|
+
date,
|
75
|
+
file_name,
|
76
|
+
text,
|
77
|
+
text,
|
78
|
+
class_str,
|
79
|
+
w_str,
|
80
|
+
h_str)
|
81
|
+
else
|
82
|
+
return sprintf('<a href="http://%s/%s/%s"%s>%s</a>',
|
83
|
+
@domain,
|
84
|
+
name,
|
85
|
+
fid,
|
86
|
+
@a_target_string,
|
87
|
+
text)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def _parse_keyword(text)
|
92
|
+
return if @@pattern_keyword !~ text
|
93
|
+
title, type, word = $1, $2, $3 || ""
|
94
|
+
return sprintf('<a href="http://%s/%s/%s"%s>%s</a>',
|
95
|
+
@domain, type, html_encode(word),
|
96
|
+
@a_target_string, title)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require "text/hatena/auto_link/scheme"
|
2
|
+
|
3
|
+
module Text
|
4
|
+
class Hatena
|
5
|
+
class AutoLink
|
6
|
+
class HatenaGraph < Scheme
|
7
|
+
@@pattern_tag = /\[(graph:t:([^\]]+))\]/i
|
8
|
+
@@pattern_image = /\[graph:id:([A-Za-z][a-zA-Z0-9_\-]{2,14}):(.+):image\]/i
|
9
|
+
@@pattern_simple = /\[graph:id:([A-Za-z][a-zA-Z0-9_\-]{2,14}):(.+)\]/i
|
10
|
+
@@pattern_user = /\[?graph:id:([A-Za-z][a-zA-Z0-9_\-]{2,14})\]?/i
|
11
|
+
|
12
|
+
def patterns
|
13
|
+
[@@pattern_tag, @@pattern_image, @@pattern_simple, @@pattern_user]
|
14
|
+
end
|
15
|
+
|
16
|
+
def init
|
17
|
+
super
|
18
|
+
@domain = 'graph.hatena.ne.jp'
|
19
|
+
end
|
20
|
+
|
21
|
+
def parse(text, opt = {})
|
22
|
+
case text
|
23
|
+
when @@pattern_tag
|
24
|
+
_parse_tag(text)
|
25
|
+
when @@pattern_image
|
26
|
+
_parse_image(text)
|
27
|
+
when @@pattern_simple
|
28
|
+
_parse_simple(text)
|
29
|
+
when @@pattern_user
|
30
|
+
_parse_user(text)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def _parse_tag(text)
|
35
|
+
return if @@pattern_tag !~ text
|
36
|
+
name, tag = $1, $2
|
37
|
+
return sprintf('<a href="http://%s/t/%s"%s>%s</a>',
|
38
|
+
@domain, html_encode(tag),
|
39
|
+
@a_target_string, name)
|
40
|
+
end
|
41
|
+
|
42
|
+
def _parse_image(text)
|
43
|
+
return if @@pattern_image !~ text
|
44
|
+
name, graphname = $1, $2
|
45
|
+
engname = html_encode(graphname)
|
46
|
+
return sprintf('<a href="http://%s/%s/%s/"%s><img src="http://%s/%s/graph?graphname=%s" class="hatena-graph-image" alt="%s" title="%s"></a>',
|
47
|
+
@domain, name, engname, @a_target_string,
|
48
|
+
@domain, name, engname,
|
49
|
+
escape_attr(graphname), escape_attr(graphname))
|
50
|
+
end
|
51
|
+
|
52
|
+
def _parse_simple(text)
|
53
|
+
return if @@pattern_simple !~ text
|
54
|
+
name, graphname = $1, $2
|
55
|
+
return sprintf('<a href="http://%s/%s/%s/"%s>graph:id:%s:%s</a>',
|
56
|
+
@domain, name, html_encode(graphname),
|
57
|
+
@a_target_string, name, graphname)
|
58
|
+
end
|
59
|
+
|
60
|
+
def _parse_user(text)
|
61
|
+
return if @@pattern_user !~ text
|
62
|
+
name = $1
|
63
|
+
return sprintf('<a href="http://%s/%s/"%s>graph:id:%s</a>',
|
64
|
+
@domain, name, @a_target_string, name)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
require "text/hatena/auto_link/scheme"
|
2
|
+
|
3
|
+
module Text
|
4
|
+
class Hatena
|
5
|
+
class AutoLink
|
6
|
+
class HatenaGroup < Scheme
|
7
|
+
@@pattern_group_archive = /\[?(g:([a-z][a-z0-9\-]{2,23}))(:id:([A-Za-z][a-zA-Z0-9_\-]{2,14}))(:(archive)(?::(\d{6}))?)\]?/i
|
8
|
+
@@pattern_group_diary = /\[?(g:([a-z][a-z0-9\-]{2,23}))(:id:([A-Za-z][a-zA-Z0-9_\-]{2,14}))(\:(\d{8}))?(?:(\#|:)([a-zA-Z0-9_]+))?\]?/i
|
9
|
+
@@pattern_group_keyword = /\[g:([a-z][a-z0-9\-]{2,23}):keyword:([^\]]+)\]/i
|
10
|
+
@@pattern_group_bbs = /\[?(?:g:([a-z][a-z0-9\-]{2,23}):)?bbs:(\d+)(?::(\d+))?\]?/i
|
11
|
+
|
12
|
+
def patterns
|
13
|
+
[@@pattern_group_archive, @@pattern_group_diary, @@pattern_group_keyword, @@pattern_group_bbs]
|
14
|
+
end
|
15
|
+
|
16
|
+
def init
|
17
|
+
super
|
18
|
+
@domain = 'g.hatena.ne.jp'
|
19
|
+
end
|
20
|
+
|
21
|
+
def parse(text, opt = {})
|
22
|
+
case text
|
23
|
+
when @@pattern_group_archive
|
24
|
+
return _parse_group_archive(text)
|
25
|
+
when @@pattern_group_diary
|
26
|
+
return _parse_group_diary(text)
|
27
|
+
when @@pattern_group_keyword
|
28
|
+
return _parse_group_keyword(text)
|
29
|
+
when @@pattern_group_bbs
|
30
|
+
return _parse_group_bbs(text)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def _parse_group_archive(text)
|
35
|
+
return if @@pattern_group_archive !~ text
|
36
|
+
month = $7 ? "/#{$7}" : ''
|
37
|
+
return sprintf('<a href="http://%s.%s/%s/%s%s">%s%s%s</a>',
|
38
|
+
$2,
|
39
|
+
@domain,
|
40
|
+
$4,
|
41
|
+
$6,
|
42
|
+
month,
|
43
|
+
$1,
|
44
|
+
$3,
|
45
|
+
$5
|
46
|
+
)
|
47
|
+
end
|
48
|
+
|
49
|
+
def _parse_group_diary(text)
|
50
|
+
return if @@pattern_group_diary !~ text
|
51
|
+
m1, m2, m3, m4, m5, m6, m7, m8 = $1, $2, $3 || '', $4 || '', $5 || '', $6 || '', $7, $8
|
52
|
+
if m7
|
53
|
+
date = m6 != '' ? "/#{m6}" : ''
|
54
|
+
delim = m7 == ':' ? '/' : '#'
|
55
|
+
return sprintf('<a href="http://%s.%s/%s%s%s%s">%s%s%s%s%s</a>',
|
56
|
+
m2, @domain, m4, date, delim, m8, m1, m3,
|
57
|
+
m5, m7, m8)
|
58
|
+
else
|
59
|
+
return sprintf('<a href="http://%s.%s/%s/%s">%s%s%s</a>',
|
60
|
+
m2, @domain, m4, m6, m1, m3, m5)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def _parse_group_keyword(text)
|
65
|
+
return if @@pattern_group_keyword !~ text
|
66
|
+
gname, word = $1, $2
|
67
|
+
enword = html_encode(word)
|
68
|
+
return sprintf('<a class="okeyword" href="http://%s.%s/keyword/%s">g:%s:keyword:%s</a>',
|
69
|
+
gname,
|
70
|
+
@domain,
|
71
|
+
enword,
|
72
|
+
gname,
|
73
|
+
word)
|
74
|
+
end
|
75
|
+
|
76
|
+
def _parse_group_bbs(text)
|
77
|
+
return if @@pattern_group_bbs !~ text
|
78
|
+
gname, tid, aid = $1, $2, $3
|
79
|
+
url = ''
|
80
|
+
title = ''
|
81
|
+
if gname
|
82
|
+
url = "http://#{gname}." + @domain
|
83
|
+
title = "g:#{gname}:"
|
84
|
+
end
|
85
|
+
url += "/bbs/#{tid}"
|
86
|
+
title += "bbs:#{tid}"
|
87
|
+
if aid
|
88
|
+
url += "/#{aid}"
|
89
|
+
title += ":#{aid}"
|
90
|
+
end
|
91
|
+
return %Q|<a href="#{url}">#{title}</a>|
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'text/hatena/auto_link/scheme'
|
2
|
+
|
3
|
+
module Text
|
4
|
+
class Hatena
|
5
|
+
class AutoLink
|
6
|
+
class HatenaID < Scheme
|
7
|
+
@@pattern = /\[?(id:([A-Za-z][a-zA-Z0-9_\-]{2,14})(?::(detail|image))?)\]?/i
|
8
|
+
|
9
|
+
def patterns
|
10
|
+
[@@pattern]
|
11
|
+
end
|
12
|
+
|
13
|
+
def parse(text, opt = {})
|
14
|
+
return if @@pattern !~ text
|
15
|
+
content, name, type = $1, $2, $3 || ''
|
16
|
+
case type
|
17
|
+
when 'image'
|
18
|
+
pre = name[0, 2]
|
19
|
+
return sprintf('<a href="/%s/"%s><img src="http://www.hatena.ne.jp/users/%s/%s/profile.gif" width="60" height="60" alt="id:%s" class="hatena-id-image"></a>',
|
20
|
+
name, @a_target_string, pre, name, name)
|
21
|
+
when 'detail'
|
22
|
+
pre = name[0, 2]
|
23
|
+
return sprintf('<a href="/%s/"%s><img src="http://www.hatena.ne.jp/users/%s/%s/profile.gif" width="16" height="16" alt="id:%s" class="hatena-id-icon">id:%s</a>',
|
24
|
+
name, @a_target_string, pre, name,
|
25
|
+
name, name)
|
26
|
+
else
|
27
|
+
sprintf('<a href="/%s/"%s>%s</a>',
|
28
|
+
name, @a_target_string, content)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require "text/hatena/auto_link/scheme"
|
2
|
+
|
3
|
+
module Text
|
4
|
+
class Hatena
|
5
|
+
class AutoLink
|
6
|
+
class HatenaIdea < Scheme
|
7
|
+
@@pattern_user = /\[?(i:id:([A-Za-z][a-zA-Z0-9_\-]{2,14}))\]?/i
|
8
|
+
@@pattern_tag = /\[(i:t:([^\]]+))\]/i
|
9
|
+
@@pattern_idea = /\[?(idea:(\d+))\]?/i
|
10
|
+
|
11
|
+
def patterns
|
12
|
+
[@@pattern_user, @@pattern_idea, @@pattern_tag]
|
13
|
+
end
|
14
|
+
|
15
|
+
def init
|
16
|
+
super
|
17
|
+
@domain = 'i.hatena.ne.jp'
|
18
|
+
end
|
19
|
+
|
20
|
+
def parse(text, opt = {})
|
21
|
+
case text
|
22
|
+
when @@pattern_user
|
23
|
+
_parse_user(text)
|
24
|
+
when @@pattern_idea
|
25
|
+
_parse_idea(text)
|
26
|
+
when @@pattern_tag
|
27
|
+
_parse_tag(text)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def _parse_idea(text)
|
32
|
+
return if @@pattern_idea !~ text
|
33
|
+
title, iid = $1, $2
|
34
|
+
return sprintf('<a href="http://%s/idea/%s"%s>%s</a>',
|
35
|
+
@domain, iid, @a_target_string, title)
|
36
|
+
end
|
37
|
+
|
38
|
+
def _parse_user(text)
|
39
|
+
return if @@pattern_user !~ text
|
40
|
+
title, name = $1, $2
|
41
|
+
return sprintf('<a href="http://%s/%s/"%s>%s</a>',
|
42
|
+
@domain, name, @a_target_string, title)
|
43
|
+
end
|
44
|
+
|
45
|
+
def _parse_tag(text)
|
46
|
+
return if @@pattern_tag !~ text
|
47
|
+
title, word = $1, $2
|
48
|
+
return sprintf('<a href="http://%s/t/%s"%s>%s</a>',
|
49
|
+
@domain, html_encode(word),
|
50
|
+
@a_target_string, title)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require "text/hatena/auto_link/scheme"
|
2
|
+
|
3
|
+
module Text
|
4
|
+
class Hatena
|
5
|
+
class AutoLink
|
6
|
+
class HatenaMap < Scheme
|
7
|
+
@@pattern_tag = /\[(map:t:([^\]]+))\]/i
|
8
|
+
@@pattern_map = /\[?(map:x(\-?[\d\.]+)y(\-?[\d\.]+))\]?/i
|
9
|
+
@@pattern_search = /\[(map:([^\]]+))\]/i
|
10
|
+
|
11
|
+
def patterns
|
12
|
+
[@@pattern_tag, @@pattern_map, @@pattern_search]
|
13
|
+
end
|
14
|
+
|
15
|
+
def init
|
16
|
+
super
|
17
|
+
@domain = 'map.hatena.ne.jp'
|
18
|
+
end
|
19
|
+
|
20
|
+
def parse(text, opt = {})
|
21
|
+
case text
|
22
|
+
when @@pattern_tag
|
23
|
+
_parse_tag(text)
|
24
|
+
when @@pattern_map
|
25
|
+
_parse_map(text)
|
26
|
+
when @@pattern_search
|
27
|
+
_parse_search(text)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def _parse_tag(text)
|
32
|
+
return unless @@pattern_tag =~ text
|
33
|
+
name, tag = $1, $2
|
34
|
+
return sprintf('<a href="http://%s/t/%s"%s>%s</a>',
|
35
|
+
@domain, html_encode(tag), @a_target_string, name)
|
36
|
+
end
|
37
|
+
|
38
|
+
def _parse_map(text)
|
39
|
+
return unless @@pattern_map =~ text
|
40
|
+
name, x, y = $1, $2, $3
|
41
|
+
return sprintf('<a href="http://%s/?x=%s&y=%s&z=4"%s>%s</a>',
|
42
|
+
@domain, x, y,
|
43
|
+
@a_target_string, name)
|
44
|
+
end
|
45
|
+
|
46
|
+
def _parse_search(text)
|
47
|
+
return unless @@pattern_search =~ text
|
48
|
+
name, wd = $1, $2
|
49
|
+
return sprintf('<a href="http://%s/?word=%s"%s>%s</a>',
|
50
|
+
@domain, html_encode(wd),
|
51
|
+
@a_target_string, name)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require "text/hatena/auto_link/scheme"
|
2
|
+
|
3
|
+
module Text
|
4
|
+
class Hatena
|
5
|
+
class AutoLink
|
6
|
+
class HatenaQuestion < Scheme
|
7
|
+
@@pattern_user = /\[?(q:id:([A-Za-z][a-zA-Z0-9_\-]{2,14}))\]?/i
|
8
|
+
@@pattern_question = /\[?(question:(\d+))\]?/i
|
9
|
+
|
10
|
+
def patterns
|
11
|
+
[@@pattern_user, @@pattern_question]
|
12
|
+
end
|
13
|
+
|
14
|
+
def init
|
15
|
+
super
|
16
|
+
@domain = 'q.hatena.ne.jp'
|
17
|
+
end
|
18
|
+
|
19
|
+
def parse(text, opt = {})
|
20
|
+
case text
|
21
|
+
when @@pattern_user
|
22
|
+
_parse_user(text)
|
23
|
+
when @@pattern_question
|
24
|
+
_parse_question(text)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def _parse_user(text)
|
29
|
+
return if @@pattern_user !~ text
|
30
|
+
title, name = $1, $2
|
31
|
+
return sprintf('<a href="http://%s/%s/"%s>%s</a>',
|
32
|
+
@domain, name, @a_target_string, title)
|
33
|
+
end
|
34
|
+
|
35
|
+
def _parse_question(text)
|
36
|
+
return if @@pattern_question !~ text
|
37
|
+
title, qid = $1, $2
|
38
|
+
return sprintf('<a href="http://%s/%s"%s>%s</a>',
|
39
|
+
@domain, qid, @a_target_string, title)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|