iwadon-text-hatena 0.12.20080627.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (80) hide show
  1. data/README +146 -0
  2. data/README.en +62 -0
  3. data/README.rdoc +62 -0
  4. data/Rakefile +62 -0
  5. data/lib/text/hatena.rb +62 -0
  6. data/lib/text/hatena/auto_link.rb +114 -0
  7. data/lib/text/hatena/auto_link/amazon.rb +31 -0
  8. data/lib/text/hatena/auto_link/asin.rb +155 -0
  9. data/lib/text/hatena/auto_link/ean.rb +62 -0
  10. data/lib/text/hatena/auto_link/ftp.rb +19 -0
  11. data/lib/text/hatena/auto_link/google.rb +32 -0
  12. data/lib/text/hatena/auto_link/hatena_antenna.rb +26 -0
  13. data/lib/text/hatena/auto_link/hatena_bookmark.rb +57 -0
  14. data/lib/text/hatena/auto_link/hatena_diary.rb +77 -0
  15. data/lib/text/hatena/auto_link/hatena_fotolife.rb +101 -0
  16. data/lib/text/hatena/auto_link/hatena_graph.rb +69 -0
  17. data/lib/text/hatena/auto_link/hatena_group.rb +96 -0
  18. data/lib/text/hatena/auto_link/hatena_id.rb +34 -0
  19. data/lib/text/hatena/auto_link/hatena_idea.rb +55 -0
  20. data/lib/text/hatena/auto_link/hatena_map.rb +56 -0
  21. data/lib/text/hatena/auto_link/hatena_question.rb +44 -0
  22. data/lib/text/hatena/auto_link/hatena_rss.rb +26 -0
  23. data/lib/text/hatena/auto_link/hatena_search.rb +44 -0
  24. data/lib/text/hatena/auto_link/http.rb +102 -0
  25. data/lib/text/hatena/auto_link/mailto.rb +24 -0
  26. data/lib/text/hatena/auto_link/rakuten.rb +24 -0
  27. data/lib/text/hatena/auto_link/scheme.rb +40 -0
  28. data/lib/text/hatena/auto_link/tex.rb +26 -0
  29. data/lib/text/hatena/auto_link/unbracket.rb +23 -0
  30. data/lib/text/hatena/blockquote_node.rb +43 -0
  31. data/lib/text/hatena/body_node.rb +18 -0
  32. data/lib/text/hatena/br_node.rb +19 -0
  33. data/lib/text/hatena/cdata_node.rb +22 -0
  34. data/lib/text/hatena/context.rb +113 -0
  35. data/lib/text/hatena/dl_node.rb +28 -0
  36. data/lib/text/hatena/footnote_node.rb +33 -0
  37. data/lib/text/hatena/h3_node.rb +58 -0
  38. data/lib/text/hatena/h4_node.rb +19 -0
  39. data/lib/text/hatena/h5_node.rb +19 -0
  40. data/lib/text/hatena/html_filter.rb +207 -0
  41. data/lib/text/hatena/list_node.rb +59 -0
  42. data/lib/text/hatena/node.rb +33 -0
  43. data/lib/text/hatena/p_node.rb +18 -0
  44. data/lib/text/hatena/pre_node.rb +37 -0
  45. data/lib/text/hatena/section_node.rb +39 -0
  46. data/lib/text/hatena/superpre_node.rb +71 -0
  47. data/lib/text/hatena/table_node.rb +34 -0
  48. data/lib/text/hatena/tag_node.rb +44 -0
  49. data/lib/text/hatena/tagline_node.rb +19 -0
  50. data/lib/text/hatena/text.rb +36 -0
  51. data/lib/text/hatena/utils/htmlsplit.rb +891 -0
  52. data/lib/text/hatena/utils/section_node_utils.rb +43 -0
  53. data/t/test_02_autolink_text.rb +20 -0
  54. data/t/test_06_autolink_hatenafotolife.rb +104 -0
  55. data/t/test_08_autolink_asin.rb +65 -0
  56. data/t/test_09_autolink_hatenadiary.rb +62 -0
  57. data/t/test_11_autolink_tex.rb +32 -0
  58. data/t/test_13_autolink_hatenaantenna.rb +26 -0
  59. data/t/test_14_autolink_hatenabookmark.rb +56 -0
  60. data/t/test_15_autolink_hatenarss.rb +26 -0
  61. data/t/test_16_autolink_hatenaidea.rb +38 -0
  62. data/t/test_17_autolink_hatenaquestion.rb +32 -0
  63. data/t/test_18_autolink_ean.rb +32 -0
  64. data/t/test_19_autolink_hatenagraph.rb +44 -0
  65. data/t/test_23_autolink_amazon.rb +27 -0
  66. data/t/test_asin.rb +64 -0
  67. data/t/test_auto_link.rb +19 -0
  68. data/t/test_dl_node.rb +23 -0
  69. data/t/test_erb_tag.rb +23 -0
  70. data/t/test_footnote.rb +63 -0
  71. data/t/test_footnote_in_list.rb +53 -0
  72. data/t/test_helper.rb +13 -0
  73. data/t/test_quote.rb +75 -0
  74. data/t/test_raw_html.rb +25 -0
  75. data/t/test_sanitize.rb +27 -0
  76. data/t/test_superpre_vimcolor.rb +94 -0
  77. data/t/test_text_hatena.rb +287 -0
  78. data/t/test_text_hatena_autolink.rb +333 -0
  79. data/text-hatena.gemspec +133 -0
  80. 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