tdiary-contrib 3.2.2.20130518

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (393) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +1 -0
  3. data/.travis.yml +7 -0
  4. data/Gemfile +13 -0
  5. data/Gemfile.lock +35 -0
  6. data/README.en.md +12 -0
  7. data/README.md +13 -0
  8. data/Rakefile +41 -0
  9. data/doc/en/filter/spambayes.txt +3 -0
  10. data/doc/en/plugin.txt +1 -0
  11. data/doc/en/style/hatena.txt +10 -0
  12. data/doc/en/style/markdown.txt +16 -0
  13. data/doc/en/util.txt +1 -0
  14. data/doc/ja/filter/antirefspam.history.txt +59 -0
  15. data/doc/ja/filter/antirefspam.txt +86 -0
  16. data/doc/ja/filter/comment_key.ja.html +182 -0
  17. data/doc/ja/filter/spambayes.txt +3 -0
  18. data/doc/ja/plugin/add_bookmark.txt +50 -0
  19. data/doc/ja/plugin/category_to_tag.txt +21 -0
  20. data/doc/ja/plugin/cocoment.txt +31 -0
  21. data/doc/ja/plugin/google_adsense.txt +25 -0
  22. data/doc/ja/plugin/google_analytics.txt +7 -0
  23. data/doc/ja/plugin/image_detail.txt +69 -0
  24. data/doc/ja/plugin/image_gps.txt +36 -0
  25. data/doc/ja/plugin/image_gps2.txt +41 -0
  26. data/doc/ja/plugin/livedoor_weather.txt +105 -0
  27. data/doc/ja/plugin/opensearch_ad.txt +16 -0
  28. data/doc/ja/plugin/section_footer.txt +84 -0
  29. data/doc/ja/plugin/select_theme.txt +1 -0
  30. data/doc/ja/plugin.txt +13 -0
  31. data/doc/ja/style/hatena.txt +10 -0
  32. data/doc/ja/style/markdown.txt +13 -0
  33. data/doc/ja/util.txt +12 -0
  34. data/filter/antirefspam.rb +263 -0
  35. data/filter/commentkey.rb +29 -0
  36. data/filter/commentsize.rb +18 -0
  37. data/filter/hidecomment.rb +13 -0
  38. data/filter/iplookup.rb +55 -0
  39. data/filter/plugin/antirefspam.rb +59 -0
  40. data/filter/plugin/commentkey.rb +58 -0
  41. data/filter/plugin/commentsize.rb +12 -0
  42. data/filter/plugin/en/iplookup.rb +9 -0
  43. data/filter/plugin/en/spambayes.rb +123 -0
  44. data/filter/plugin/iplookup.rb +39 -0
  45. data/filter/plugin/ja/antirefspam.rb +91 -0
  46. data/filter/plugin/ja/commentkey.rb +17 -0
  47. data/filter/plugin/ja/commentsize.rb +6 -0
  48. data/filter/plugin/ja/iplookup.rb +9 -0
  49. data/filter/plugin/ja/spambayes.rb +124 -0
  50. data/filter/plugin/spambayes.rb +501 -0
  51. data/filter/plugin/zh/iplookup.rb +9 -0
  52. data/filter/rblcheck.rb +36 -0
  53. data/filter/spambayes.rb +535 -0
  54. data/filter/spamlookup.rb +37 -0
  55. data/io/dbi_io/ChangeLog +19 -0
  56. data/io/dbi_io/README.ja +39 -0
  57. data/io/dbi_io/dbi_io.rb +181 -0
  58. data/io/dbi_io/plugin/refererDbiIO.rb +76 -0
  59. data/io/dbi_io/tdiary_table.sql +42 -0
  60. data/js/appstore.js +109 -0
  61. data/js/datepicker.js +69 -0
  62. data/js/editor.js +82 -0
  63. data/js/flickr.js +157 -0
  64. data/js/image_ex.js +79 -0
  65. data/js/jquery.socialbutton.js +842 -0
  66. data/js/nicovideo.js +17 -0
  67. data/js/picasa.js +322 -0
  68. data/js/plugin_checker.js +71 -0
  69. data/js/prettify/lang-apollo.js +2 -0
  70. data/js/prettify/lang-clj.js +18 -0
  71. data/js/prettify/lang-css.js +2 -0
  72. data/js/prettify/lang-go.js +1 -0
  73. data/js/prettify/lang-hs.js +2 -0
  74. data/js/prettify/lang-lisp.js +3 -0
  75. data/js/prettify/lang-lua.js +2 -0
  76. data/js/prettify/lang-ml.js +2 -0
  77. data/js/prettify/lang-n.js +4 -0
  78. data/js/prettify/lang-proto.js +1 -0
  79. data/js/prettify/lang-scala.js +2 -0
  80. data/js/prettify/lang-sql.js +2 -0
  81. data/js/prettify/lang-tex.js +1 -0
  82. data/js/prettify/lang-vb.js +2 -0
  83. data/js/prettify/lang-vhdl.js +3 -0
  84. data/js/prettify/lang-wiki.js +2 -0
  85. data/js/prettify/lang-xq.js +3 -0
  86. data/js/prettify/lang-yaml.js +2 -0
  87. data/js/prettify/prettify.css +1 -0
  88. data/js/prettify/prettify.js +28 -0
  89. data/js/referer.js +17 -0
  90. data/js/show_and_hide.js +39 -0
  91. data/js/socialbutton.js +126 -0
  92. data/js/twitter_anywhere.js +28 -0
  93. data/js/yahoo_kousei.js +21 -0
  94. data/lib/bayes/convert.rb +34 -0
  95. data/lib/bayes.rb +232 -0
  96. data/lib/exifparser/BUGS +1 -0
  97. data/lib/exifparser/ChangeLog +169 -0
  98. data/lib/exifparser/README +15 -0
  99. data/lib/exifparser/install.rb +1015 -0
  100. data/lib/exifparser/lib/exifparser/makernote/canon.rb +502 -0
  101. data/lib/exifparser/lib/exifparser/makernote/fujifilm.rb +415 -0
  102. data/lib/exifparser/lib/exifparser/makernote/minolta.rb +84 -0
  103. data/lib/exifparser/lib/exifparser/makernote/mk_nikonflensname.rb +39 -0
  104. data/lib/exifparser/lib/exifparser/makernote/nikon.rb +267 -0
  105. data/lib/exifparser/lib/exifparser/makernote/nikon2.rb +581 -0
  106. data/lib/exifparser/lib/exifparser/makernote/nikonflensname.rb +438 -0
  107. data/lib/exifparser/lib/exifparser/makernote/olympus.rb +225 -0
  108. data/lib/exifparser/lib/exifparser/makernote/prove.rb +84 -0
  109. data/lib/exifparser/lib/exifparser/makernote/sigma.rb +237 -0
  110. data/lib/exifparser/lib/exifparser/pre-setup.rb +1 -0
  111. data/lib/exifparser/lib/exifparser/scan.rb +278 -0
  112. data/lib/exifparser/lib/exifparser/tag.rb +2298 -0
  113. data/lib/exifparser/lib/exifparser/thumbnail.rb +76 -0
  114. data/lib/exifparser/lib/exifparser/utils.rb +88 -0
  115. data/lib/exifparser/lib/exifparser.rb +265 -0
  116. data/lib/exifparser/sample/exifview.rb +279 -0
  117. data/lib/tdiary-contrib.rb +19 -0
  118. data/lib/wgs2tky.rb +93 -0
  119. data/misc/section_footer2/buzzurl.yaml +6 -0
  120. data/misc/section_footer2/fc2.yaml +6 -0
  121. data/misc/section_footer2/ldc.yaml +6 -0
  122. data/misc/section_footer2/retweet.yaml +7 -0
  123. data/misc/section_footer2/twitter.yaml +7 -0
  124. data/misc/section_footer2/yahoo.yaml +6 -0
  125. data/misc/tdiarygraph/tdiarygraph120x90e.swf +0 -0
  126. data/misc/tdiarygraph/tdiarygraph125x125e.swf +0 -0
  127. data/misc/tdiarygraph/tdiarygraph240x180e.swf +0 -0
  128. data/misc/tdiarygraph/tdiarygraph468x60e.swf +0 -0
  129. data/misc/tdiarygraph/tdiarygraph728x90e.swf +0 -0
  130. data/misc/tdiarytimes/tdiarytimes125x125r.swf +0 -0
  131. data/misc/tdiarytimes/tdiarytimes125x125r7.swf +0 -0
  132. data/misc/tdiarytimes/tdiarytimes125x125s.swf +0 -0
  133. data/misc/tdiarytimes/tdiarytimes125x30.swf +0 -0
  134. data/misc/tdiarytimes/tdiarytimes234x30.swf +0 -0
  135. data/misc/tdiarytimes/tdiarytimes468x30.swf +0 -0
  136. data/plugin/add_bookmark.rb +89 -0
  137. data/plugin/apple_webclip.rb +26 -0
  138. data/plugin/appstore.rb +47 -0
  139. data/plugin/bigpresen.rb +86 -0
  140. data/plugin/bitly.rb +39 -0
  141. data/plugin/bootstrap-navi.rb +54 -0
  142. data/plugin/canonical.rb +9 -0
  143. data/plugin/category_similar.rb +73 -0
  144. data/plugin/category_to_tag.rb +60 -0
  145. data/plugin/category_to_tagcloud.rb +172 -0
  146. data/plugin/cocomment.rb +37 -0
  147. data/plugin/code-prettify.rb +23 -0
  148. data/plugin/coderwall.rb +34 -0
  149. data/plugin/datepicker.rb +28 -0
  150. data/plugin/day2section.rb +20 -0
  151. data/plugin/del_footer.rb +111 -0
  152. data/plugin/description_from_body.rb +23 -0
  153. data/plugin/development.rb +16 -0
  154. data/plugin/editor.rb +11 -0
  155. data/plugin/en/add_bookmark.rb +20 -0
  156. data/plugin/en/del_footer.rb +10 -0
  157. data/plugin/en/git-register.rb +3 -0
  158. data/plugin/en/livedoor_weather.rb +25 -0
  159. data/plugin/en/microsummary.rb +18 -0
  160. data/plugin/en/nicovideo.rb +38 -0
  161. data/plugin/en/openid.rb +8 -0
  162. data/plugin/en/section_footer.rb +6 -0
  163. data/plugin/en/section_footer2.rb +3 -0
  164. data/plugin/en/socialbutton.rb +5 -0
  165. data/plugin/everytrail.rb +39 -0
  166. data/plugin/facebook_comments.rb +59 -0
  167. data/plugin/flickr.rb +209 -0
  168. data/plugin/gist.rb +16 -0
  169. data/plugin/git-register.rb +240 -0
  170. data/plugin/github_badge.rb +27 -0
  171. data/plugin/github_link.rb +9 -0
  172. data/plugin/goo_gl.rb +42 -0
  173. data/plugin/google_adsense.rb +132 -0
  174. data/plugin/google_analytics.rb +39 -0
  175. data/plugin/google_map.rb +168 -0
  176. data/plugin/google_sitemaps.rb +60 -0
  177. data/plugin/google_webmaster.rb +22 -0
  178. data/plugin/hatena_bookmark_nocomment.rb +9 -0
  179. data/plugin/hatena_star.rb +66 -0
  180. data/plugin/hb_footer.rb +255 -0
  181. data/plugin/hb_footer4sec.rb +244 -0
  182. data/plugin/hb_footer4sec_js.rb +30 -0
  183. data/plugin/hide_comment_form.rb +4 -0
  184. data/plugin/hide_sidebar_iphone.rb +21 -0
  185. data/plugin/iddy.rb +81 -0
  186. data/plugin/image_detail.rb +143 -0
  187. data/plugin/image_ex.rb +462 -0
  188. data/plugin/image_gps.rb +128 -0
  189. data/plugin/inline_wiki.rb +6 -0
  190. data/plugin/instagr.rb +64 -0
  191. data/plugin/ja/add_bookmark.rb +20 -0
  192. data/plugin/ja/del_footer.rb +10 -0
  193. data/plugin/ja/flickr.rb +62 -0
  194. data/plugin/ja/git-register.rb +3 -0
  195. data/plugin/ja/google_sitemaps.rb +35 -0
  196. data/plugin/ja/livedoor_weather.rb +25 -0
  197. data/plugin/ja/microsummary.rb +18 -0
  198. data/plugin/ja/nicovideo.rb +41 -0
  199. data/plugin/ja/openid.rb +7 -0
  200. data/plugin/ja/section_footer.rb +6 -0
  201. data/plugin/ja/section_footer2.rb +4 -0
  202. data/plugin/ja/socialbutton.rb +6 -0
  203. data/plugin/jdate.rb +20 -0
  204. data/plugin/jholiday.rb +16 -0
  205. data/plugin/jmonth.rb +20 -0
  206. data/plugin/jquery_ui_theme.rb +55 -0
  207. data/plugin/jroku.rb +28 -0
  208. data/plugin/jyear.rb +37 -0
  209. data/plugin/latlonglab_route.rb +25 -0
  210. data/plugin/lazy_referer.rb +38 -0
  211. data/plugin/livedoor_weather.rb +180 -0
  212. data/plugin/make_link.rb +44 -0
  213. data/plugin/makerss_category.rb +43 -0
  214. data/plugin/makerss_comment.rb +35 -0
  215. data/plugin/microsummary.rb +62 -0
  216. data/plugin/mm_footer.rb +215 -0
  217. data/plugin/monthly_autopagerize.rb +67 -0
  218. data/plugin/my_hotentry.rb +132 -0
  219. data/plugin/navi_day.rb +118 -0
  220. data/plugin/navi_this_month.rb +15 -0
  221. data/plugin/nicovideo.rb +115 -0
  222. data/plugin/notify_miniblog.rb +134 -0
  223. data/plugin/ogp.rb +55 -0
  224. data/plugin/ohmsha_estore.rb +71 -0
  225. data/plugin/openid.rb +90 -0
  226. data/plugin/opensearch_ad.rb +33 -0
  227. data/plugin/picasa.rb +56 -0
  228. data/plugin/plugin_checker.rb +41 -0
  229. data/plugin/popit.rb +22 -0
  230. data/plugin/prettify.rb +19 -0
  231. data/plugin/prezi.rb +10 -0
  232. data/plugin/profile.rb +222 -0
  233. data/plugin/puboo.rb +93 -0
  234. data/plugin/pygments_css.rb +76 -0
  235. data/plugin/rating.rb +419 -0
  236. data/plugin/recent_estraier.rb +50 -0
  237. data/plugin/recent_tweet.rb +71 -0
  238. data/plugin/retweet.rb +86 -0
  239. data/plugin/rubykaigi.rb +99 -0
  240. data/plugin/search-bing.rb +87 -0
  241. data/plugin/search-default.rb +264 -0
  242. data/plugin/search-google-custom.rb +60 -0
  243. data/plugin/search-yahoo-websearch.rb +121 -0
  244. data/plugin/search-yahoo.rb +109 -0
  245. data/plugin/section_footer.rb +195 -0
  246. data/plugin/section_footer2.rb +278 -0
  247. data/plugin/section_permalink.rb +73 -0
  248. data/plugin/section_permalink_anchor.rb +39 -0
  249. data/plugin/select_style.rb +42 -0
  250. data/plugin/select_theme.rb +90 -0
  251. data/plugin/show_and_hide.rb +77 -0
  252. data/plugin/slideshare.rb +10 -0
  253. data/plugin/socialbutton.rb +60 -0
  254. data/plugin/tatsu_zine.rb +93 -0
  255. data/plugin/tdiarygraph_flashstyle.rb +296 -0
  256. data/plugin/tdiarytimes.rb +166 -0
  257. data/plugin/tdiarytimes2.rb +406 -0
  258. data/plugin/tdiarytimes_flashstyle.rb +263 -0
  259. data/plugin/tdiarytimes_textstyle.rb +290 -0
  260. data/plugin/title_anchor.rb +16 -0
  261. data/plugin/tweet_quote.rb +106 -0
  262. data/plugin/twitpic.rb +10 -0
  263. data/plugin/twitter.rb +46 -0
  264. data/plugin/twitter_anywhere.rb +209 -0
  265. data/plugin/twitter_badge.rb +42 -0
  266. data/plugin/twitter_js.rb +59 -0
  267. data/plugin/ustream.rb +19 -0
  268. data/plugin/vimeo.rb +14 -0
  269. data/plugin/volatile.rb +89 -0
  270. data/plugin/vote.rb +100 -0
  271. data/plugin/wikiloc.rb +27 -0
  272. data/plugin/windex.rb +512 -0
  273. data/plugin/yahoo_kousei.rb +79 -0
  274. data/plugin/yahoo_map.rb +97 -0
  275. data/plugin/youtube.rb +33 -0
  276. data/plugin/yshop.rb +189 -0
  277. data/plugin/zenback.rb +46 -0
  278. data/spec/apple_webclip_spec.rb +46 -0
  279. data/spec/fixtures/friendfeed.xml +2 -0
  280. data/spec/fixtures/github.json +1 -0
  281. data/spec/fixtures/twitter.xml +73 -0
  282. data/spec/gist_spec.rb +16 -0
  283. data/spec/github_link_spec.rb +39 -0
  284. data/spec/google_analytics_spec.rb +60 -0
  285. data/spec/jdate_spec.rb +23 -0
  286. data/spec/jmonth_spec.rb +28 -0
  287. data/spec/jyear_spec.rb +21 -0
  288. data/spec/my_hotentry_spec.rb +78 -0
  289. data/spec/openid_spec.rb +246 -0
  290. data/spec/opensearch_ad_spec.rb +50 -0
  291. data/spec/profile_spec.rb +88 -0
  292. data/spec/rcov.opts +2 -0
  293. data/spec/spec_helper.rb +223 -0
  294. data/spec/title_anchor_spec.rb +39 -0
  295. data/spec/twitter_js_spec.rb +116 -0
  296. data/spec/youtube_spec.rb +20 -0
  297. data/style/hatena_style.rb +1011 -0
  298. data/style/markdown_style.rb +239 -0
  299. data/style/wikiext_style.rb +21 -0
  300. data/tdiary-contrib.gemspec +25 -0
  301. data/util/clean-spam/README.ja +1 -0
  302. data/util/clean-spam/tdiary-comment-clean +46 -0
  303. data/util/clean-spam/tdiary-comment-clean2 +81 -0
  304. data/util/clean-spam/tdiary-referer-clean +46 -0
  305. data/util/convert_pstore.rb +82 -0
  306. data/util/estraier-search/ChangeLog +36 -0
  307. data/util/estraier-search/README.ja +114 -0
  308. data/util/estraier-search/en/estraier-register.rb +3 -0
  309. data/util/estraier-search/estraier-register.rb +298 -0
  310. data/util/estraier-search/estraier-search.rb +273 -0
  311. data/util/estraier-search/estraier.rhtml +73 -0
  312. data/util/estraier-search/estraier.rxml +23 -0
  313. data/util/estraier-search/i.estraier.rhtml +31 -0
  314. data/util/estraier-search/ja/estraier-register.rb +3 -0
  315. data/util/image-gallery/README.ja +27 -0
  316. data/util/image-gallery/image-gallery.rb +523 -0
  317. data/util/image-gallery/image-gallery.rb.euc-jp +523 -0
  318. data/util/image-gallery/js/SmoothGallery/Changelog +52 -0
  319. data/util/image-gallery/js/SmoothGallery/css/ReMooz.css +186 -0
  320. data/util/image-gallery/js/SmoothGallery/css/img/carrow1.gif +0 -0
  321. data/util/image-gallery/js/SmoothGallery/css/img/carrow2.gif +0 -0
  322. data/util/image-gallery/js/SmoothGallery/css/img/closebox.gif +0 -0
  323. data/util/image-gallery/js/SmoothGallery/css/img/closebox.png +0 -0
  324. data/util/image-gallery/js/SmoothGallery/css/img/fleche1.gif +0 -0
  325. data/util/image-gallery/js/SmoothGallery/css/img/fleche1.png +0 -0
  326. data/util/image-gallery/js/SmoothGallery/css/img/fleche2.gif +0 -0
  327. data/util/image-gallery/js/SmoothGallery/css/img/fleche2.png +0 -0
  328. data/util/image-gallery/js/SmoothGallery/css/img/loading-bar-black.gif +0 -0
  329. data/util/image-gallery/js/SmoothGallery/css/img/open.gif +0 -0
  330. data/util/image-gallery/js/SmoothGallery/css/img/open.png +0 -0
  331. data/util/image-gallery/js/SmoothGallery/css/img/remo_bg_e.png +0 -0
  332. data/util/image-gallery/js/SmoothGallery/css/img/remo_bg_n.png +0 -0
  333. data/util/image-gallery/js/SmoothGallery/css/img/remo_bg_ne.png +0 -0
  334. data/util/image-gallery/js/SmoothGallery/css/img/remo_bg_nw.png +0 -0
  335. data/util/image-gallery/js/SmoothGallery/css/img/remo_bg_s.png +0 -0
  336. data/util/image-gallery/js/SmoothGallery/css/img/remo_bg_se.png +0 -0
  337. data/util/image-gallery/js/SmoothGallery/css/img/remo_bg_sw.png +0 -0
  338. data/util/image-gallery/js/SmoothGallery/css/img/remo_bg_w.png +0 -0
  339. data/util/image-gallery/js/SmoothGallery/css/img/spinner.gif +0 -0
  340. data/util/image-gallery/js/SmoothGallery/css/jd.gallery.css +371 -0
  341. data/util/image-gallery/js/SmoothGallery/css/layout.css +91 -0
  342. data/util/image-gallery/js/SmoothGallery/license.txt +621 -0
  343. data/util/image-gallery/js/SmoothGallery/resizer.php +113 -0
  344. data/util/image-gallery/js/SmoothGallery/scripts/Changelog +52 -0
  345. data/util/image-gallery/js/SmoothGallery/scripts/History.Routing.js +126 -0
  346. data/util/image-gallery/js/SmoothGallery/scripts/History.js +109 -0
  347. data/util/image-gallery/js/SmoothGallery/scripts/ReMooz.js +364 -0
  348. data/util/image-gallery/js/SmoothGallery/scripts/jd.gallery.js +843 -0
  349. data/util/image-gallery/js/SmoothGallery/scripts/jd.gallery.set.js +183 -0
  350. data/util/image-gallery/js/SmoothGallery/scripts/jd.gallery.transitions.js +90 -0
  351. data/util/image-gallery/js/SmoothGallery/scripts/jdgalleryresize.js +828 -0
  352. data/util/image-gallery/js/SmoothGallery/scripts/license.txt +621 -0
  353. data/util/image-gallery/js/SmoothGallery/scripts/mootools-1.2-more.js +103 -0
  354. data/util/image-gallery/js/SmoothGallery/scripts/mootools-1.2.1-core-yc.js +349 -0
  355. data/util/image-gallery/js/SmoothGallery/scripts/resizer.php +113 -0
  356. data/util/image-gallery/misc/plugin/recent_image.rb +406 -0
  357. data/util/image-gallery/skel/gallery.rhtml +154 -0
  358. data/util/image-gallery/skel/gallery.rhtml.euc-jp +154 -0
  359. data/util/image-gallery/tdiary.conf.igsample +8 -0
  360. data/util/image-gallery/theme/image-gallery.css +85 -0
  361. data/util/image2flickr.rb +282 -0
  362. data/util/posttdiary/README.ja +12 -0
  363. data/util/posttdiary/posttdiary-ex.rb +1155 -0
  364. data/util/posttdiary/posttdiary.rb +245 -0
  365. data/util/rast-search/ChangeLog +55 -0
  366. data/util/rast-search/README.ja +99 -0
  367. data/util/rast-search/en/rast-register.rb +3 -0
  368. data/util/rast-search/i.rast.rhtml +33 -0
  369. data/util/rast-search/ja/rast-register.rb +3 -0
  370. data/util/rast-search/rast-register.rb +326 -0
  371. data/util/rast-search/rast-search.rb +249 -0
  372. data/util/rast-search/rast.rhtml +66 -0
  373. data/util/rast-search/rast.rxml +21 -0
  374. data/util/section_link/README +11 -0
  375. data/util/section_link/misc/plugin/section_link.rb +68 -0
  376. data/util/section_link/misc/plugin/section_link_anchor.rb +38 -0
  377. data/util/section_link/tdiary/tdiary_day_ext.rb +21 -0
  378. data/util/section_link/tdiary/tdiaryext_style.rb +36 -0
  379. data/util/section_link/tdiary/wikiext_style.rb +36 -0
  380. data/util/tdiary-for-ruby1.9/compatible.rb +97 -0
  381. data/util/tdiary-for-ruby1.9/tdiary-2.2.0.patch +98 -0
  382. data/util/tdiary-for-ruby1.9/tdiary-2.3.1.patch +212 -0
  383. data/util/tdiary-grep/README +4 -0
  384. data/util/tdiary-grep/grep.rb +445 -0
  385. data/util/tdiary-mode/http.el +130 -0
  386. data/util/tdiary-mode/tdiary-mode.el +613 -0
  387. data/util/tdiary-vim/ChangeLog +25 -0
  388. data/util/tdiary-vim/README +60 -0
  389. data/util/tdiary-vim/tdiary.vim +350 -0
  390. data/util/tdiarysearch/README.en +53 -0
  391. data/util/tdiarysearch/README.ja +99 -0
  392. data/util/tdiarysearch/search.rb +504 -0
  393. metadata +497 -0
@@ -0,0 +1,99 @@
1
+ #
2
+ # rubykaigi.rb: make badges of RubyKaigi.
3
+ #
4
+ # usage: <%= rubykaigi 'role', 'size' %>
5
+ # role: attendee (default), speaker, sponsor, staff, committer, individual sponsor, away
6
+ # size: large(160x160), small(160x90)
7
+ #
8
+ # Copyright (C) TADA Tadashi <t@tdtds.jp>
9
+ # Distributed under GPL.
10
+ #
11
+
12
+ def rubykaigi2013( role = 'attendee', size = nil )
13
+ r = role.split(/[ _]+/).map{|s| s.capitalize}.join
14
+ s = "@#{h size}" unless size.nil?
15
+ %Q|<a href="http://rubykaigi.org/2013/" style="display:block;margin:8px auto;text-align:center;"><img src="http://rubykaigi.org/2013/images/badge#{h r}#{s}.png" alt="RubyKaigi 2013 #{h r}"></a>|
16
+ end
17
+
18
+ def sappororubykaigi2012( role = 'attendee' )
19
+ r = role.split(/[ _]+/).map{|s| s.capitalize}.join
20
+ %Q|<a href="http://sapporo.rubykaigi.org/2012/" style="display:block;margin:8px auto;text-align:center;"><img src="http://sapporo.rubykaigi.org/2012/images/goodiesBadge160#{h r}.png" alt="SapporoRubyKaigi 2012 #{h r}"></a>|
21
+ end
22
+
23
+ def kansairubykaigi04( role = 'attendee' )
24
+ badges = {
25
+ 'attendee' => "attendee_taiyou",
26
+ 'speaker' => "speaker_shika",
27
+ 'staff' => "staff_daibutsu"
28
+ }
29
+
30
+ %Q|<a href="http://regional.rubykaigi.org/kansai04" style="display:block;margin:8px auto;text-align:center;"><img src="http://regional.rubykaigi.org/images/kansai04/#{badges[role]}.png" alt="KansaiRubyKaigi04 #{h role.capitalize}"></a>|
31
+ end
32
+
33
+ def rubykaigi2011( role = 'attendee', size = 'large' )
34
+ badges = Hash::new( 'attendee' ).update({
35
+ 'committer' => 'committer',
36
+ 'individual sponsor' => 'individualSponsor',
37
+ 'sponsor' => 'sponsor',
38
+ 'staff' => 'staff',
39
+ 'speaker' => 'speaker',
40
+ 'attendee' => 'attendee',
41
+ 'away' => 'attendeeAway'
42
+ })
43
+
44
+ width, height = size == 'large' ? ['160','160'] : ['160', '90']
45
+
46
+ %Q|<a href="http://rubykaigi.org/2011/" style="display:block;margin:8px auto;text-align:center;"><img src="http://rubykaigi.org/2011/goodies/badges/#{width}x#{height}#{badges[role]}.png" width="#{width}" height="#{height}" alt="RubyKaigi2010 #{h role.capitalize}" style="border-width: 0px;"></a>|
47
+ end
48
+
49
+ alias :rubykaigi :rubykaigi2011
50
+
51
+ #----- OLD EDITIONS -----#
52
+
53
+ def sappororubykaigi03( role = 'attendee' )
54
+ %Q|<a href="http://regional.rubykaigi.org/sapporo03/" style="display:block;margin:8px auto;text-align:center;"><img src="http://regional.rubykaigi.org/images/sapporo03/badge_#{h role}.gif" alt="badge_#{h role}.gif"></a>|
55
+ end
56
+
57
+ def rubykaigi2010( role = 'attendee' )
58
+ badges = Hash::new( 'attendee' ).update({
59
+ 'committer' => 'committer',
60
+ 'individual sponsor' => 'individual_sponsor',
61
+ 'sponsor' => 'sponsor',
62
+ 'staff' => 'staff',
63
+ 'speaker' => 'speaker',
64
+ 'attendee' => 'attendee',
65
+ 'away' => 'away'
66
+ })
67
+ %Q|<a href="http://rubykaigi.org/2010/" style="display:block;margin:8px auto;text-align:center;"><img src="http://rubykaigi.org/2010/badge/#{badges[role]}.png" width="160" height="201" alt="RubyKaigi2010 #{h role.capitalize}" style="border-width: 0px;"></a>|
68
+ end
69
+
70
+ def rubykaigi2009( role = 'attendee' )
71
+ %Q|<div style="text-align: center; margin-top: 0.5em; margin-bottom: 0.5em;"><a href="http://rubykaigi.org/2009/"><img src="http://rubykaigi.org/2009/images/goodies/badges/#{h role}.gif" width="160" height="160" alt="RubyKaigi2009#{h role.capitalize}" style="border-width: 0px;"></a></div>|
72
+ end
73
+
74
+ def rubykaigi2008( role = 'attendee' )
75
+ img = case role
76
+ when 'speaker'
77
+ 1
78
+ when 'sponsor'
79
+ 2
80
+ when 'staff'
81
+ 3
82
+ else
83
+ role = 'attendee'
84
+ 0
85
+ end
86
+ %Q|<div style="text-align: center; margin-top: 0.5em; margin-bottom: 0.5em;"><a href="http://jp.rubyist.net/RubyKaigi2008/"><img src="http://rubykaigi.tdiary.net/images/20080617_#{img}.png" width="160" height="79" alt="RubyKaigi2008#{h role.capitalize}" style="border-width: 0px;"></a></div>|
87
+ end
88
+
89
+ def sappororubykaigi02( role = 'attendee' )
90
+ %Q|<div style="text-align: center; margin-top: 0.5em; margin-bottom: 0.5em;"><a href="http://regional.rubykaigi.org/sapporo02/"><img src="http://ruby-sapporo.org/sappororubykaigi02/#{h role}.gif" width="160" height="90" alt="SapporoRubyKaigi02#{h role.capitalize}" style="border-width: 0px;"></a></div>|
91
+ end
92
+
93
+ # Local Variables:
94
+ # mode: ruby
95
+ # indent-tabs-mode: t
96
+ # tab-width: 3
97
+ # ruby-indent-level: 3
98
+ # End:
99
+ # vim: ts=3
@@ -0,0 +1,87 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ # search-bing.rb - site search plugin sample using Bing API.
4
+ #
5
+ # Copyright (C) 2011, TADA Tadashi <t@tdtds.jp>
6
+ # You can redistribute it and/or modify it under GPL.
7
+ #
8
+ # Needed these options below:
9
+ #
10
+ # @options['search-bing.appid'] : Your Bing AppId
11
+ # @options['search.result_filter'] : your dialy's URL format of DAY mode into Regexp.
12
+ #
13
+
14
+ require 'timeout'
15
+ require 'json'
16
+ require 'open-uri'
17
+
18
+ def search_title
19
+ '全文検索 by Bing'
20
+ end
21
+
22
+ def search_input_form( q )
23
+ r = <<-HTML
24
+ <form method="GET" action="#{@conf.index}"><div>
25
+ 検索キーワード:
26
+ <input name="q" value="#{h q}">
27
+ <input type="submit" value="OK">
28
+ </div></form>
29
+ HTML
30
+ end
31
+
32
+ def search_bing_api( q, start = 0 )
33
+ appid = @conf['search-bing.appid']
34
+
35
+ u = 'https://api.datamarket.azure.com/Data.ashx/Bing/SearchWeb/v1/Web'
36
+ u << "?Query=%27#{q}%27&Options=%27EnableHighlighting%27&$top=50&$skip=#{start}&$format=Json"
37
+ uri = URI( u )
38
+
39
+ open( uri, {:http_basic_authentication => [appid, appid]} ).read
40
+
41
+ ### FIX ME: this code failed on Timeout error, temporary using open-uri above.
42
+ # px_host, px_port = (@conf['proxy'] || '').split( /:/ )
43
+ # px_port = 8080 if px_host and !px_port
44
+ # res = Net::HTTP::Proxy( px_host, px_port ).start( uri.host, uri.port ) do |http|
45
+ # req = Net::HTTP::Get.new( uri.request_uri )
46
+ # req.basic_auth( appid, appid )
47
+ # res = http.request( req )
48
+ # end
49
+ # res.body
50
+ end
51
+
52
+ def search_to_html( str )
53
+ (str || '').gsub( /\uE000/, '<strong>' ).gsub( /\uE001/, '</strong>' )
54
+ end
55
+
56
+ def search_result
57
+ query = CGI::unescape( @cgi.params['q'][0] )
58
+ start = CGI::unescape( @cgi.params['start'][0] || '0' ).to_i
59
+
60
+ begin
61
+ uri = URI::parse( @conf.base_url )
62
+ #uri = URI::parse( 'http://sho.tdiary.net/' ) ### FOR DEBUGGING ###
63
+ q = "#{query} site:#{uri.host}"
64
+ q << %Q| inurl:"#{uri.path}"| unless uri.path == '/'
65
+ xml = search_bing_api( u( q.untaint ), start )
66
+ json = JSON::parse( xml )
67
+ rescue Net::HTTPError
68
+ return %Q|<p class="message">#$!</p>|
69
+ end
70
+
71
+ r = search_input_form( query )
72
+ r << '<dl class="search-result autopagerize_page_element">'
73
+ json['d']['results'].each do |entry|
74
+ url = entry['Url']
75
+ title = entry['Title']
76
+ desc = entry['Description']
77
+ r << %Q|<dt><a href="#{h url}">#{search_to_html title}</a></dt>|
78
+ r << %Q|<dd>#{search_to_html desc}</dd>|
79
+ end
80
+ r << '</dl>'
81
+
82
+ r << '<div class="search-navi">'
83
+ # no search navi on Bing search because no total result not supported
84
+ r << '</div>'
85
+
86
+ r
87
+ end
@@ -0,0 +1,264 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ # search-default.rb - site search plugin sample using DefaultIO.
4
+ #
5
+ # Copyright (C) 2003-2005 Minero Aoki
6
+ # Copyright (C) 2012, TADA Tadashi <t@tdtds.jp>
7
+ # You can redistribute it and/or modify it under GPL2.
8
+ #
9
+ #
10
+
11
+ def search_title
12
+ '全文検索'
13
+ end
14
+
15
+ class WrongQuery < StandardError; end
16
+
17
+ module DefaultIOSearch
18
+
19
+ module_function
20
+ def setup_patterns(query)
21
+ patterns = split_string(query).map {|pat|
22
+ check_pattern pat
23
+ Regexp.new( Regexp.quote(pat), Regexp::IGNORECASE )
24
+ }
25
+ raise WrongQuery, 'no pattern' if patterns.empty?
26
+ raise WrongQuery, 'too many sub patterns' if patterns.length > 8
27
+ patterns
28
+ end
29
+
30
+ def check_pattern(pat)
31
+ raise WrongQuery, 'no pattern' unless pat
32
+ raise WrongQuery, 'empty pattern' if pat.empty?
33
+ raise WrongQuery, "pattern too short: #{pat}" if pat.length < 2
34
+ raise WrongQuery, 'pattern too long' if pat.length > 128
35
+ end
36
+
37
+ def split_string(str)
38
+ str.split(/[\s ]+/ou).reject {|w| w.empty? }
39
+ end
40
+
41
+ INF = 1 / 0.0
42
+
43
+ def match_components(patterns, data_path)
44
+ foreach_diary_from_latest(data_path) do |diary|
45
+ next unless diary.visible?
46
+ num = 1
47
+ diary.each_section do |sec|
48
+ if patterns.all? {|re| re =~ sec.to_src }
49
+ yield diary, fragment('p', num), sec
50
+ end
51
+ num += 1
52
+ end
53
+ diary.each_visible_comment(INF) do |cmt, num|
54
+ if patterns.all? {|re| re =~ cmt.body }
55
+ yield diary, fragment('c', num), cmt
56
+ end
57
+ end
58
+ end
59
+ end
60
+
61
+ def fragment(type, num)
62
+ sprintf('%s%02d', type, num)
63
+ end
64
+
65
+ #
66
+ # tDiary Implementation Dependent
67
+ #
68
+ def foreach_diary_from_latest(data_path, &block)
69
+ foreach_data_file(data_path.sub(%r</+\z>, '')) do |path|
70
+ read_diaries(path).sort_by {|diary| diary.date }.reverse_each(&block)
71
+ end
72
+ end
73
+
74
+ def foreach_data_file(data_path, &block)
75
+ Dir.glob("#{data_path}/[0-9]*/*.td2").sort.reverse_each do |path|
76
+ yield path.untaint
77
+ end
78
+ end
79
+
80
+ def read_diaries(path)
81
+ d = nil
82
+ diaries = {}
83
+ load_tdiary_textdb(path) do |header, body|
84
+ begin
85
+ d = diary_class(header['Format']).new(header['Date'], '', body)
86
+ rescue ArgumentError
87
+ next
88
+ end
89
+ d.show(header['Visible'] != 'false')
90
+ diaries[d.ymd] = d
91
+ end
92
+ (Years[d.y] ||= []).push(d.m) if d
93
+ load_comments diaries, path
94
+ diaries.values
95
+ end
96
+
97
+ DIARY_CLASS_CACHE = {}
98
+
99
+ def diary_class(style)
100
+ c = DIARY_CLASS_CACHE[style]
101
+ return c if c
102
+ require "tdiary/style/#{style.downcase}_style.rb"
103
+ c = eval("TDiary::#{style.capitalize}Diary")
104
+ c.__send__(:include, DiaryClassDelta)
105
+ DIARY_CLASS_CACHE[style] = c
106
+ c
107
+ end
108
+
109
+ module DiaryClassDelta
110
+ def ymd
111
+ date().strftime('%Y%m%d')
112
+ end
113
+
114
+ def y_m_d
115
+ date().strftime('%Y-%m-%d')
116
+ end
117
+
118
+ def y
119
+ '%04d' % date().year
120
+ end
121
+
122
+ def m
123
+ '%02d' % date().month
124
+ end
125
+ end
126
+
127
+ def load_comments(diaries, path)
128
+ cmtfile = path.sub(/2\z/, 'c')
129
+ return unless File.file?(cmtfile)
130
+ load_tdiary_textdb(cmtfile) do |header, body|
131
+ c = TDiary::Comment.new(header['Name'], header['Mail'], body,
132
+ Time.at(header['Last-Modified'].to_i))
133
+ c.show = (header['Visible'] != 'false')
134
+ d = diaries[header['Date']]
135
+ d.add_comment c if d
136
+ end
137
+ end
138
+
139
+ def load_tdiary_textdb(path)
140
+ File.open(path) {|f|
141
+ ver = f.gets.strip
142
+ raise "unkwnown format: #{ver}" unless ver == 'TDIARY2.00.00' or ver == 'TDIARY2.01.00'
143
+ f.each('') do |header|
144
+ h = {}
145
+ header.untaint.strip.each_line do |line|
146
+ begin
147
+ n, v = *line.split(':', 2)
148
+ rescue ArgumentError
149
+ next
150
+ end
151
+ h[n.strip] = v.strip
152
+ end
153
+ body = f.gets("\n.\n").chomp(".\n").untaint
154
+ yield h, body
155
+ end
156
+ }
157
+ end
158
+
159
+ def short_html(component)
160
+ # Section classes do not have common superclass, we can't use class here.
161
+ case component.class.name
162
+ when /Section/
163
+ section = component
164
+ if section.subtitle
165
+ sprintf('%s<br>%s',
166
+ tdiary2text(section.subtitle_to_html),
167
+ tdiary2text(section.body_to_html))
168
+ else
169
+ tdiary2text(section.body_to_html)
170
+ end
171
+ when /Comment/
172
+ cmt = component
173
+ shorten(escape((cmt.name + ': ' + cmt.body)))
174
+ else
175
+ raise "must not happen: #{component.class}"
176
+ end
177
+ end
178
+
179
+ def tdiary2text(html)
180
+ re = Regexp.new('<[^>]*>', Regexp::EXTENDED)
181
+ shorten(apply_tdiary_plugins(html).gsub(re, ''))
182
+ end
183
+
184
+ Years = {}
185
+
186
+ TDiary::Plugin.__send__(:public, :apply_plugin)
187
+ def apply_tdiary_plugins(html)
188
+ #@plugin.apply_plugin(html, false)
189
+ html
190
+ end
191
+
192
+ @plugin = nil
193
+
194
+ #
195
+ # Utils
196
+ #
197
+ HTML_ESCAPE_TABLE = {
198
+ '&' => '&amp;',
199
+ '<' => '&lt;',
200
+ '>' => '&gt;',
201
+ '"' => '&quot;'
202
+ }
203
+
204
+ def escape(str)
205
+ tbl = HTML_ESCAPE_TABLE
206
+ str.gsub(/[&"<>]/) {|ch| tbl[ch] }
207
+ end
208
+
209
+ def shorten(str, len = 200)
210
+ matched = str.gsub( /\n/, ' ' ).scan( /^.{0,#{len - 3}}/u )[0]
211
+ if $'.nil? || $'.empty?
212
+ matched
213
+ else
214
+ matched + '...'
215
+ end
216
+ end
217
+ end
218
+
219
+ def search_input_form( q )
220
+ r = <<-HTML
221
+ <form method="GET" action="#{@conf.index}"><div>
222
+ 検索キーワード:
223
+ <input name="q" value="#{h q}">
224
+ <input type="submit" value="OK">
225
+ </div></form>
226
+ HTML
227
+ end
228
+
229
+ def search_result
230
+ unless @conf.io_class == TDiary::DefaultIO
231
+ return %Q|<p class="message">could not use this plugin under #{@conf.io_class}.</p>|
232
+ end
233
+
234
+ query = CGI::unescape( @cgi.params['q'][0] )
235
+ start = CGI::unescape( @cgi.params['start'][0] || '0' ).to_i
236
+
237
+ begin
238
+ patterns = DefaultIOSearch::setup_patterns(query)
239
+ r = search_input_form( query )
240
+
241
+ r << '<dl class="search-result autopagerize_page_element">'
242
+ count = 0
243
+ too_many = false
244
+ DefaultIOSearch::match_components(patterns, @conf.data_path) do |diary, fragment, component|
245
+ count += 1
246
+ if count > 50 # TO MANY HITS
247
+ too_many = true
248
+ break
249
+ end
250
+ href = @conf.index + anchor( "#{diary.ymd}#{fragment}" )
251
+ r << %Q|<dt><a href="#{href}">#{h diary.y_m_d}</a></dt>|
252
+ r << %Q|<dd>#{DefaultIOSearch::short_html(component)}</dd>|
253
+ end
254
+ r << '</dl>'
255
+
256
+ r << '<div class="search-navi">'
257
+ r << "<p>#{too_many ? 'too many' : count} hits.</p>"
258
+ r << '</div>'
259
+
260
+ r
261
+ rescue WrongQuery
262
+ search_input_form( query ) + %Q|<p class="message">#{$!.message}</p>|
263
+ end
264
+ end
@@ -0,0 +1,60 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ # search-google-custom.rb - site search plugin using Goole Custom Search.
4
+ #
5
+ # Copyright (C) 2011, hb <http://www.smallstyle.com>
6
+ # You can redistribute it and/or modify it under GPL.
7
+ #
8
+ # Needed these options below:
9
+ #
10
+ # @options["search-google-custom.id"] : Your Google Custome Search ID
11
+ # @options["search-google-custom.cof"] : 広告の表示場所(9:右,10:一番上と右,11:一番上と下)
12
+ # @options["search-google-custom.width"] : 検索結果のフレームの幅
13
+ # @options["search-google-custom.height"] : 検索結果のフレームの高さ
14
+ # @options["search-google-custom.search_label"] : 検索テキストボックス左のラベル
15
+ # @options["search-google-custom.button_text"] : 検索ボタンに書かれる文字列
16
+ #
17
+
18
+ def search_title
19
+ '全文検索 by Google カスタム検索'
20
+ end
21
+
22
+ add_footer_proc do
23
+ %Q|<script type="text/javascript" src="http://www.google.com/cse/brand?form=cse-search-box&lang=ja"></script>|
24
+ end
25
+
26
+ def search_input_form(q='')
27
+ cof = @conf["search-google-custom.cof"] || 9
28
+ search_label = @conf["search-google-custom.search_label"] || '検索キーワード:'
29
+ button_text = @conf["search-google-custom.button_text"] || '検索'
30
+
31
+ r = <<-HTML
32
+ <form action="#{@conf.index}" id="cse-search-box">
33
+ <div>
34
+ <input type="hidden" name="cx" value="#{@conf["search-google-custom.id"]}">
35
+ <input type="hidden" name="cof" value="FORID:#{cof}">
36
+ <input type="hidden" name="ie" value="UTF-8">
37
+ <label for="q">#{search_label}</label><input type="text" name="q" value="#{h q}">
38
+ <input type="submit" name="sa" value="#{button_text}">
39
+ </div>
40
+ </form>
41
+ HTML
42
+ end
43
+
44
+ def search_result
45
+ w = @conf["search-google-custom.width"] || 600
46
+ h = @conf["search-google-custom.height"] || 1300
47
+
48
+ r = <<-HTML
49
+ <div id="cse-search-results"></div>
50
+ <script type="text/javascript">
51
+ var googleSearchIframeName = "cse-search-results";
52
+ var googleSearchFormName = "cse-search-box";
53
+ var googleSearchFrameWidth = #{w};
54
+ var googleSearchFrameHeight = #{h};
55
+ var googleSearchDomain = "www.google.com";
56
+ var googleSearchPath = "/cse";
57
+ </script>
58
+ <script type="text/javascript" src="http://www.google.com/afsonline/show_afs_search.js"></script>
59
+ HTML
60
+ end
@@ -0,0 +1,121 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ # search-yahoo-websearch.rb - Yahoo!デベロッパーネットワークのWeb検索APIを利用した検索プラグイン.
4
+ #
5
+ # Copyright (C) 2011, hb <smallstyle@gmail.com>
6
+ # You can redistribute it and/or modify it under GPL.
7
+ #
8
+ # オプション
9
+ #
10
+ # @options['search-yahoo-websearch.appid'] : アプリケーションID(必須)
11
+ # @options['search-yahoo-websearch.premium'] : アップグレード版利用時はtrueを指定する(任意)
12
+ #
13
+
14
+ def search_title
15
+ '全文検索 by Yahoo! ウェブ検索'
16
+ end
17
+
18
+ def search_input_form( q )
19
+ r = <<-HTML
20
+ <form method="GET" action="#{@conf.index}"><div>
21
+ 検索キーワード:
22
+ <input name="q" value="#{h q}">
23
+ <input type="submit" value="OK">
24
+ </div></form>
25
+ HTML
26
+ end
27
+
28
+ def request_url
29
+ if @conf['search-yahoo-websearch.premium']
30
+ 'http://search.yahooapis.jp/PremiumWebSearchService/V1/webSearch'
31
+ else
32
+ 'http://search.yahooapis.jp/WebSearchService/V2/webSearch'
33
+ end
34
+ end
35
+
36
+ def search_to_html( str )
37
+ (str || '').gsub( /(?:<wbr(?:[ \t\r\n][^>]*)?>)+/, '' ).gsub( %r{<(/?)b[ \t\n\r]*>}, '<\\1strong>' )
38
+ end
39
+
40
+ def yahoo_websearch_api( q, start = 1 )
41
+ url = request_url
42
+ appid = @conf['search-yahoo-websearch.appid']
43
+ uri = URI::parse( @conf.base_url )
44
+
45
+ url << "?appid=#{appid}&query=#{q}&results=20&start=#{start}&format=html&site=#{uri.host}"
46
+
47
+ proxy = @conf['proxy']
48
+ proxy = 'http://' + proxy if proxy
49
+
50
+ proxy_host, proxy_port = nil
51
+ if proxy
52
+ proxy_host = proxy_uri.host
53
+ proxy_port = proxy_uri.port
54
+ end
55
+ proxy_class = Net::HTTP::Proxy(proxy_host, proxy_port)
56
+
57
+ query = URI.parse(url)
58
+ req = Net::HTTP::Get.new(query.request_uri)
59
+ http = proxy_class.new(query.host, query.port)
60
+ http.open_timeout = 20
61
+ http.read_timeout = 20
62
+ res = http.start do
63
+ http.request(req)
64
+ end
65
+ res.body
66
+ end
67
+
68
+ def yahoo_websearch_attribution
69
+ <<-EOF
70
+ <!-- Begin Yahoo! JAPAN Web Services Attribution Snippet -->
71
+ <a href="http://developer.yahoo.co.jp/about">
72
+ <img src="http://i.yimg.jp/images/yjdn/yjdn_attbtn1_125_17.gif" title="Webサービス by Yahoo! JAPAN" alt="Web Services by Yahoo! JAPAN" width="125" height="17" border="0" style="margin:15px 15px 15px 15px"></a>
73
+ <!-- End Yahoo! JAPAN Web Services Attribution Snippet -->
74
+ EOF
75
+ end
76
+
77
+ def search_result
78
+ query = CGI::unescape( @cgi.params['q'][0] )
79
+ start = CGI::unescape( @cgi.params['start'][0] || '1' ).to_i
80
+
81
+ begin
82
+ uri = URI::parse( @conf.base_url )
83
+ xml = yahoo_websearch_api( u( query.untaint ), start )
84
+ doc = REXML::Document::new( REXML::Source.new( xml ) ).root
85
+ err = doc.elements.to_a( '/Error/Message' )[0]
86
+ if err
87
+ return %Q|<p class="message">ERROR - #{err.text}</p>|
88
+ end
89
+ rescue OpenURI::HTTPError
90
+ return %Q|<p class="message">#$!</p>|
91
+ end
92
+
93
+ r = '<dl class="search-result autopagerize_page_element">'
94
+ doc.elements.to_a( 'Result' ).each do |elem|
95
+ url = elem.elements.to_a( 'Url' )[0].text
96
+ next unless url =~ @conf['search.result_filter']
97
+ title = elem.elements.to_a( 'Title' )[0].text
98
+ summary = elem.elements.to_a( 'Summary' )[0].text
99
+ r << %Q|<dt><a href="#{h url}">#{search_to_html title}</a></dt>|
100
+ r << %Q|<dd>#{search_to_html summary}</dd>|
101
+ end
102
+ r << '</dl>'
103
+
104
+ r << '<div class="search-navi">'
105
+ pos = doc.elements["/ResultSet"].attributes["firstResultPosition"]
106
+ unless pos == '1'
107
+ r << %Q|<a href="#{@conf.index}?q=#{u query}&amp;start=#{pos.to_i - 20}" rel="prev">&lt;前の20件</a>&nbsp;|
108
+ end
109
+
110
+ total = doc.elements["/ResultSet"].attributes["totalResultsAvailable"]
111
+ ret = doc.elements["/ResultSet"].attributes["totalResultsReturned"]
112
+
113
+ if ret.to_i == 20 and pos.to_i + 19 < 1000
114
+ r << %Q|<a href="#{@conf.index}?q=#{u query}&amp;start=#{pos.to_i + 20}" rel="next">次の20件&gt;</a>|
115
+ end
116
+ r << '</div>'
117
+
118
+ r << yahoo_websearch_attribution
119
+
120
+ r
121
+ end