tdiary 3.2.2.20130507

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 (509) hide show
  1. checksums.yaml +7 -0
  2. data/.coveralls.yml +1 -0
  3. data/.gitignore +16 -0
  4. data/.travis.yml +29 -0
  5. data/Capfile +2 -0
  6. data/ChangeLog +3173 -0
  7. data/Gemfile +58 -0
  8. data/Gemfile.lock +201 -0
  9. data/LICENSE +340 -0
  10. data/Procfile +1 -0
  11. data/README.md +33 -0
  12. data/Rakefile +26 -0
  13. data/bin/tdiary +7 -0
  14. data/config.ru +61 -0
  15. data/data/.htaccess +2 -0
  16. data/doc/HOWTO-authenticate-in-rack.md +89 -0
  17. data/doc/HOWTO-make-io.md +305 -0
  18. data/doc/HOWTO-make-plugin.md +279 -0
  19. data/doc/HOWTO-make-theme.md +67 -0
  20. data/doc/HOWTO-testing-tDiary.md +44 -0
  21. data/doc/HOWTO-use-plugin.md +148 -0
  22. data/doc/HOWTO-write-tDiary.en.md +131 -0
  23. data/doc/HOWTO-write-tDiary.md +136 -0
  24. data/doc/INSTALL-paas.md +202 -0
  25. data/doc/INSTALL.md +160 -0
  26. data/doc/README.en.md +174 -0
  27. data/doc/README.md +56 -0
  28. data/doc/UPGRADE.md +164 -0
  29. data/doc/doc.css +115 -0
  30. data/dot.htaccess +27 -0
  31. data/index.fcgi +45 -0
  32. data/index.rb +57 -0
  33. data/js/00default.js +60 -0
  34. data/js/01conf.js +62 -0
  35. data/js/02edit.coffee +5 -0
  36. data/js/02edit.js +15 -0
  37. data/js/amazon.js +43 -0
  38. data/js/calendar3.js +130 -0
  39. data/js/caretposition.js +170 -0
  40. data/js/category.js +29 -0
  41. data/js/category_autocomplete.js +96 -0
  42. data/js/comment_ajax.js +27 -0
  43. data/js/draft.js +149 -0
  44. data/js/highlight.js +36 -0
  45. data/js/image.js +181 -0
  46. data/misc/convert2.rb +123 -0
  47. data/misc/filter/antispamservice.rb +101 -0
  48. data/misc/filter/limitdays.rb +40 -0
  49. data/misc/filter/linkcheck.rb +81 -0
  50. data/misc/filter/plugin/antispamservice.rb +82 -0
  51. data/misc/filter/plugin/en/antispamservice.rb +21 -0
  52. data/misc/filter/plugin/ja/antispamservice.rb +20 -0
  53. data/misc/lib/README +4 -0
  54. data/misc/lib/compatible.rb +1 -0
  55. data/misc/lib/fcgi_patch.rb +90 -0
  56. data/misc/migrate.rb +157 -0
  57. data/misc/paas/cloudfoundry/Gemfile +26 -0
  58. data/misc/paas/cloudfoundry/Gemfile.lock +85 -0
  59. data/misc/paas/heroku/Gemfile +22 -0
  60. data/misc/paas/heroku/Gemfile.lock +85 -0
  61. data/misc/paas/sqale/Gemfile +19 -0
  62. data/misc/paas/sqale/Gemfile.lock +85 -0
  63. data/misc/paas/sqale/Procfile +1 -0
  64. data/misc/paas/sqale/dot.env +1 -0
  65. data/misc/plugin/ChangeLog.DO_NOT_UPDATE +2333 -0
  66. data/misc/plugin/a.rb +211 -0
  67. data/misc/plugin/amazon.rb +403 -0
  68. data/misc/plugin/amazon/README.en +17 -0
  69. data/misc/plugin/amazon/README.ja +29 -0
  70. data/misc/plugin/amazon/amazonimg.rb +113 -0
  71. data/misc/plugin/amazon/large.png +0 -0
  72. data/misc/plugin/amazon/medium.png +0 -0
  73. data/misc/plugin/amazon/small.png +0 -0
  74. data/misc/plugin/append-css.rb +51 -0
  75. data/misc/plugin/bq.rb +48 -0
  76. data/misc/plugin/calendar2.rb +184 -0
  77. data/misc/plugin/calendar3.rb +256 -0
  78. data/misc/plugin/category.rb +779 -0
  79. data/misc/plugin/category_autocomplete.rb +33 -0
  80. data/misc/plugin/comment_ajax.rb +11 -0
  81. data/misc/plugin/comment_mail-qmail.rb +57 -0
  82. data/misc/plugin/comment_mail-sendmail.rb +56 -0
  83. data/misc/plugin/comment_mail-smtp.rb +59 -0
  84. data/misc/plugin/comment_rank.rb +36 -0
  85. data/misc/plugin/counter.rb +631 -0
  86. data/misc/plugin/daily_theme.rb +55 -0
  87. data/misc/plugin/disp_referrer.rb +1486 -0
  88. data/misc/plugin/doctype-html401tr.rb +16 -0
  89. data/misc/plugin/draft.rb +20 -0
  90. data/misc/plugin/dropdown_calendar.rb +32 -0
  91. data/misc/plugin/edit_today.rb +50 -0
  92. data/misc/plugin/en/a.rb +10 -0
  93. data/misc/plugin/en/amazon.rb +71 -0
  94. data/misc/plugin/en/append-css.rb +17 -0
  95. data/misc/plugin/en/bq.rb +12 -0
  96. data/misc/plugin/en/calendar2.rb +12 -0
  97. data/misc/plugin/en/category.rb +204 -0
  98. data/misc/plugin/en/counter.rb +48 -0
  99. data/misc/plugin/en/daily_theme.rb +14 -0
  100. data/misc/plugin/en/disp_referrer.rb +387 -0
  101. data/misc/plugin/en/dropdown_calendar.rb +14 -0
  102. data/misc/plugin/en/edit_today.rb +22 -0
  103. data/misc/plugin/en/hide-mail-field.rb +19 -0
  104. data/misc/plugin/en/highlight.rb +29 -0
  105. data/misc/plugin/en/image.rb +54 -0
  106. data/misc/plugin/en/kw.rb +22 -0
  107. data/misc/plugin/en/makerss.rb +47 -0
  108. data/misc/plugin/en/pb-show.rb +21 -0
  109. data/misc/plugin/en/ping.rb +16 -0
  110. data/misc/plugin/en/recent_comment.rb +44 -0
  111. data/misc/plugin/en/recent_comment3.rb +56 -0
  112. data/misc/plugin/en/recent_rss.rb +33 -0
  113. data/misc/plugin/en/referer_scheme.rb +48 -0
  114. data/misc/plugin/en/search_control.rb +74 -0
  115. data/misc/plugin/en/search_form.rb +22 -0
  116. data/misc/plugin/en/speed_comment.rb +19 -0
  117. data/misc/plugin/en/tb-show.rb +37 -0
  118. data/misc/plugin/en/todo.rb +43 -0
  119. data/misc/plugin/en/weather.rb +185 -0
  120. data/misc/plugin/en/xmlrpc.rb +14 -0
  121. data/misc/plugin/footnote.rb +92 -0
  122. data/misc/plugin/gradation.rb +39 -0
  123. data/misc/plugin/gradient.rb +36 -0
  124. data/misc/plugin/hide-mail-field.rb +50 -0
  125. data/misc/plugin/highlight.rb +22 -0
  126. data/misc/plugin/html_anchor.rb +34 -0
  127. data/misc/plugin/image.rb +290 -0
  128. data/misc/plugin/ja/amazon.rb +89 -0
  129. data/misc/plugin/ja/bq.rb +13 -0
  130. data/misc/plugin/ja/calendar2.rb +12 -0
  131. data/misc/plugin/ja/category.rb +212 -0
  132. data/misc/plugin/ja/daily_theme.rb +15 -0
  133. data/misc/plugin/ja/disp_referrer.rb +644 -0
  134. data/misc/plugin/ja/edit_today.rb +23 -0
  135. data/misc/plugin/ja/hide-mail-field.rb +20 -0
  136. data/misc/plugin/ja/highlight.rb +30 -0
  137. data/misc/plugin/ja/makerss.rb +44 -0
  138. data/misc/plugin/ja/my-sequel.rb +52 -0
  139. data/misc/plugin/ja/pb-show.rb +23 -0
  140. data/misc/plugin/ja/ping.rb +17 -0
  141. data/misc/plugin/ja/recent_comment.rb +45 -0
  142. data/misc/plugin/ja/recent_comment3.rb +57 -0
  143. data/misc/plugin/ja/recent_rss.rb +34 -0
  144. data/misc/plugin/ja/referer_scheme.rb +86 -0
  145. data/misc/plugin/ja/search_control.rb +75 -0
  146. data/misc/plugin/ja/search_form.rb +32 -0
  147. data/misc/plugin/ja/tb-show.rb +38 -0
  148. data/misc/plugin/ja/todo.rb +46 -0
  149. data/misc/plugin/ja/weather.rb +402 -0
  150. data/misc/plugin/ja/xmlrpc.rb +15 -0
  151. data/misc/plugin/kw.rb +150 -0
  152. data/misc/plugin/list.rb +40 -0
  153. data/misc/plugin/makelirs.rb +89 -0
  154. data/misc/plugin/makerss.rb +744 -0
  155. data/misc/plugin/my-ex.rb +68 -0
  156. data/misc/plugin/my-sequel.rb +539 -0
  157. data/misc/plugin/navi_user.rb +19 -0
  158. data/misc/plugin/number_anchor.rb +47 -0
  159. data/misc/plugin/pb-show.rb +165 -0
  160. data/misc/plugin/ping.rb +99 -0
  161. data/misc/plugin/pre_wrap.rb +19 -0
  162. data/misc/plugin/random_google.rb +165 -0
  163. data/misc/plugin/recent_comment.rb +82 -0
  164. data/misc/plugin/recent_comment3.rb +192 -0
  165. data/misc/plugin/recent_list.rb +91 -0
  166. data/misc/plugin/recent_namazu.rb +50 -0
  167. data/misc/plugin/recent_rss.rb +305 -0
  168. data/misc/plugin/referer-antibot.rb +53 -0
  169. data/misc/plugin/referer-utf8.rb +12 -0
  170. data/misc/plugin/referer_scheme.rb +87 -0
  171. data/misc/plugin/search_control.rb +227 -0
  172. data/misc/plugin/search_form.rb +53 -0
  173. data/misc/plugin/sn.rb +107 -0
  174. data/misc/plugin/speed_comment.rb +68 -0
  175. data/misc/plugin/squeeze.rb +272 -0
  176. data/misc/plugin/src.rb +30 -0
  177. data/misc/plugin/tb-show.rb +212 -0
  178. data/misc/plugin/title_list.rb +41 -0
  179. data/misc/plugin/title_tag.rb +80 -0
  180. data/misc/plugin/tlink.rb +163 -0
  181. data/misc/plugin/todo.rb +182 -0
  182. data/misc/plugin/weather.rb +505 -0
  183. data/misc/plugin/whatsnew.rb +100 -0
  184. data/misc/plugin/xmlrpc.rb +80 -0
  185. data/misc/plugin/xmlrpc/README +20 -0
  186. data/misc/plugin/xmlrpc/xmlrpc.rb +575 -0
  187. data/misc/style/emptdiary/README.rd +83 -0
  188. data/misc/style/emptdiary/README.rd.en +78 -0
  189. data/misc/style/emptdiary/emptdiary_style.rb +199 -0
  190. data/misc/style/etdiary/README.rd +83 -0
  191. data/misc/style/etdiary/etdiary_style.rb +446 -0
  192. data/misc/style/gfm/gfm_style.rb +194 -0
  193. data/misc/style/rd/README.rd +71 -0
  194. data/misc/style/rd/rd_style.rb +366 -0
  195. data/misc/style/wiki/README +116 -0
  196. data/misc/style/wiki/README.en +101 -0
  197. data/misc/style/wiki/wiki_parser.rb +273 -0
  198. data/misc/style/wiki/wiki_style.rb +478 -0
  199. data/misc/theme_convert/Readme.rd +21 -0
  200. data/misc/theme_convert/append.rcss +150 -0
  201. data/misc/theme_convert/theme_convert.rb +453 -0
  202. data/plugin/00default.rb +1015 -0
  203. data/plugin/05referer.rb +298 -0
  204. data/plugin/10spamfilter.rb +183 -0
  205. data/plugin/50sp.rb +146 -0
  206. data/plugin/60sf.rb +152 -0
  207. data/plugin/90migrate.rb +109 -0
  208. data/plugin/en/00default.rb +390 -0
  209. data/plugin/en/05referer.rb +49 -0
  210. data/plugin/en/10spamfilter.rb +81 -0
  211. data/plugin/en/50sp.rb +56 -0
  212. data/plugin/en/60sf.rb +60 -0
  213. data/plugin/ja/00default.rb +401 -0
  214. data/plugin/ja/05referer.rb +47 -0
  215. data/plugin/ja/10spamfilter.rb +79 -0
  216. data/plugin/ja/50sp.rb +66 -0
  217. data/plugin/ja/60sf.rb +73 -0
  218. data/public/.gitkeep +0 -0
  219. data/public/images/.gitkeep +0 -0
  220. data/public/javascripts/.gitkeep +0 -0
  221. data/public/stylesheets/.gitkeep +0 -0
  222. data/skel/category.rhtml +9 -0
  223. data/skel/conf.rhtml +23 -0
  224. data/skel/day.rhtml +33 -0
  225. data/skel/diary.rhtml +83 -0
  226. data/skel/footer.rhtml +8 -0
  227. data/skel/header.rhtml +10 -0
  228. data/skel/i.category.rhtml +6 -0
  229. data/skel/i.conf.rhtml +14 -0
  230. data/skel/i.day.rhtml +28 -0
  231. data/skel/i.diary.rhtml +17 -0
  232. data/skel/i.footer.rhtml +2 -0
  233. data/skel/i.header.rhtml +3 -0
  234. data/skel/i.latest.rhtml +24 -0
  235. data/skel/i.month.rhtml +39 -0
  236. data/skel/i.search.rhtml +5 -0
  237. data/skel/i.update.rhtml +40 -0
  238. data/skel/i.update.rhtml.en +40 -0
  239. data/skel/latest.rhtml +27 -0
  240. data/skel/mail.rtxt +18 -0
  241. data/skel/mail.rtxt.en +18 -0
  242. data/skel/month.rhtml +27 -0
  243. data/skel/plugin_error.rhtml +27 -0
  244. data/skel/preview.rhtml +85 -0
  245. data/skel/preview.rhtml.en +72 -0
  246. data/skel/referer.rhtml +24 -0
  247. data/skel/search.rhtml +14 -0
  248. data/skel/tdiary.rconf +76 -0
  249. data/skel/update.rhtml +103 -0
  250. data/skel/update.rhtml.en +83 -0
  251. data/spec/acceptance/append_comment_spec.rb +94 -0
  252. data/spec/acceptance/append_diary_spec.rb +98 -0
  253. data/spec/acceptance/bugfix/encoding_error_spec.rb +27 -0
  254. data/spec/acceptance/save_conf_comment_spec.rb +87 -0
  255. data/spec/acceptance/save_conf_default_spec.rb +169 -0
  256. data/spec/acceptance/save_conf_dnsbl_spec.rb +152 -0
  257. data/spec/acceptance/save_conf_filter_spec.rb +50 -0
  258. data/spec/acceptance/save_conf_plugin_spec.rb +69 -0
  259. data/spec/acceptance/save_conf_referer_spec.rb +60 -0
  260. data/spec/acceptance/save_conf_security_spec.rb +280 -0
  261. data/spec/acceptance/support/helpers.rb +49 -0
  262. data/spec/acceptance/support/paths.rb +7 -0
  263. data/spec/acceptance/update_diary_spec.rb +113 -0
  264. data/spec/acceptance/view_category_spec.rb +38 -0
  265. data/spec/acceptance/view_comment_spec.rb +67 -0
  266. data/spec/acceptance/view_diary_spec.rb +126 -0
  267. data/spec/acceptance/view_referer_spec.rb +31 -0
  268. data/spec/acceptance_helper.rb +101 -0
  269. data/spec/core/compatible_spec.rb +54 -0
  270. data/spec/core/core_ext_spec.rb +59 -0
  271. data/spec/core/plugin_spec.rb +389 -0
  272. data/spec/core/rack/assets/precompile_spec.rb +76 -0
  273. data/spec/core/rack/html_anchor_spec.rb +57 -0
  274. data/spec/core/rack/valid_request_path_spec.rb +67 -0
  275. data/spec/core/style/emptdiary_style_spec.rb +165 -0
  276. data/spec/core/style/etdiary_style_spec.rb +512 -0
  277. data/spec/core/style/gfm_style_spec.rb +334 -0
  278. data/spec/core/style/rd_style_spec.rb +202 -0
  279. data/spec/core/style/tdiary_style_spec.rb +240 -0
  280. data/spec/core/style/wiki_style_spec.rb +441 -0
  281. data/spec/fixtures/ascii8bit-pstore.db +0 -0
  282. data/spec/fixtures/invalid-sequence-volatile.tdr +9 -0
  283. data/spec/fixtures/just_installed.conf +1 -0
  284. data/spec/fixtures/plugin/ja/sample.rb +4 -0
  285. data/spec/fixtures/plugin/sample.rb +6 -0
  286. data/spec/fixtures/sample.rb +12 -0
  287. data/spec/fixtures/tdiary.conf.gem +212 -0
  288. data/spec/fixtures/tdiary.conf.rack +212 -0
  289. data/spec/fixtures/tdiary.conf.rdb +227 -0
  290. data/spec/fixtures/tdiary.conf.secure +204 -0
  291. data/spec/fixtures/tdiary.conf.webrick +212 -0
  292. data/spec/javascripts/00default_spec.js +35 -0
  293. data/spec/javascripts/fixtures/00default.html +1 -0
  294. data/spec/javascripts/support/jasmine.yml +76 -0
  295. data/spec/plugin/bq_spec.rb +24 -0
  296. data/spec/plugin/plugin_helper.rb +203 -0
  297. data/spec/spec_helper.rb +32 -0
  298. data/tdiary.conf.beginner +244 -0
  299. data/tdiary.conf.sample +345 -0
  300. data/tdiary.conf.sample-en +333 -0
  301. data/tdiary.gemspec +26 -0
  302. data/tdiary.rb +151 -0
  303. data/tdiary/admin.rb +236 -0
  304. data/tdiary/application.rb +57 -0
  305. data/tdiary/author_only_base.rb +171 -0
  306. data/tdiary/base.rb +220 -0
  307. data/tdiary/cli.rb +116 -0
  308. data/tdiary/comment.rb +40 -0
  309. data/tdiary/comment_manager.rb +94 -0
  310. data/tdiary/compatible.rb +72 -0
  311. data/tdiary/config.rb +270 -0
  312. data/tdiary/core_ext.rb +122 -0
  313. data/tdiary/deploy.rb +50 -0
  314. data/tdiary/dispatcher.rb +77 -0
  315. data/tdiary/dispatcher/index_main.rb +122 -0
  316. data/tdiary/dispatcher/update_main.rb +101 -0
  317. data/tdiary/environment.rb +15 -0
  318. data/tdiary/filter.rb +48 -0
  319. data/tdiary/filter/default.rb +54 -0
  320. data/tdiary/filter/spam.rb +304 -0
  321. data/tdiary/io/base.rb +70 -0
  322. data/tdiary/io/cache/file.rb +123 -0
  323. data/tdiary/io/cache/memcached.rb +88 -0
  324. data/tdiary/io/cache/redis.rb +100 -0
  325. data/tdiary/io/default.rb +297 -0
  326. data/tdiary/io/pstore.rb +252 -0
  327. data/tdiary/io/rdb.rb +213 -0
  328. data/tdiary/lang/en.rb +79 -0
  329. data/tdiary/lang/ja.rb +72 -0
  330. data/tdiary/plugin.rb +375 -0
  331. data/tdiary/rack/assets/precompile.rb +37 -0
  332. data/tdiary/rack/auth/basic.rb +38 -0
  333. data/tdiary/rack/auth/omniauth.rb +51 -0
  334. data/tdiary/rack/html_anchor.rb +31 -0
  335. data/tdiary/rack/valid_request_path.rb +36 -0
  336. data/tdiary/referer_manager.rb +80 -0
  337. data/tdiary/request.rb +217 -0
  338. data/tdiary/response.rb +29 -0
  339. data/tdiary/server.rb +85 -0
  340. data/tdiary/style.rb +194 -0
  341. data/tdiary/style/tdiary_style.rb +198 -0
  342. data/tdiary/style/wiki_style.rb +213 -0
  343. data/tdiary/tasks.rb +1 -0
  344. data/tdiary/tasks/assets.rake +31 -0
  345. data/tdiary/tasks/auth.rake +28 -0
  346. data/tdiary/tasks/db.rake +110 -0
  347. data/tdiary/tasks/doc.rake +31 -0
  348. data/tdiary/tasks/heroku.rake +37 -0
  349. data/tdiary/tasks/jasmine.rake +16 -0
  350. data/tdiary/tasks/rdoc.rake +24 -0
  351. data/tdiary/tasks/release.rake +122 -0
  352. data/tdiary/tasks/rspec.rake +51 -0
  353. data/tdiary/tasks/server.rake +33 -0
  354. data/tdiary/tasks/test.rake +17 -0
  355. data/tdiary/version.rb +3 -0
  356. data/tdiary/view.rb +468 -0
  357. data/tdiary/view_helper.rb +15 -0
  358. data/test/disp_referrer_test.rb +93 -0
  359. data/test/my-sequel_test.rb +238 -0
  360. data/test/test_helper.rb +7 -0
  361. data/test/test_plugin_helper.rb +64 -0
  362. data/test/test_plugin_helper_test.rb +28 -0
  363. data/test/weather_test.rb +33 -0
  364. data/theme/base.css +268 -0
  365. data/theme/conf.block.png +0 -0
  366. data/theme/conf.css +254 -0
  367. data/theme/default/README +11 -0
  368. data/theme/default/body.png +0 -0
  369. data/theme/default/default.css +743 -0
  370. data/theme/help.png +0 -0
  371. data/theme/loading.gif +0 -0
  372. data/theme/tdiary1/README +7 -0
  373. data/theme/tdiary1/tdiary1.css +394 -0
  374. data/theme/tdiary2/README +19 -0
  375. data/theme/tdiary2/tdiary2.css +624 -0
  376. data/update.fcgi +45 -0
  377. data/update.rb +57 -0
  378. data/vendor/hikidoc-0.0.6/COPYING +28 -0
  379. data/vendor/hikidoc-0.0.6/NEWS +30 -0
  380. data/vendor/hikidoc-0.0.6/NEWS.ja +30 -0
  381. data/vendor/hikidoc-0.0.6/README +86 -0
  382. data/vendor/hikidoc-0.0.6/README.ja +83 -0
  383. data/vendor/hikidoc-0.0.6/Rakefile +68 -0
  384. data/vendor/hikidoc-0.0.6/TextFormattingRules +320 -0
  385. data/vendor/hikidoc-0.0.6/TextFormattingRules.ja +318 -0
  386. data/vendor/hikidoc-0.0.6/bin/hikidoc +66 -0
  387. data/vendor/hikidoc-0.0.6/lib/hikidoc.rb +914 -0
  388. data/vendor/hikidoc-0.0.6/setup.rb +1360 -0
  389. data/vendor/hikidoc-0.0.6/test/run-test.rb +13 -0
  390. data/vendor/hikidoc-0.0.6/test/test_hikidoc.rb +506 -0
  391. data/vendor/imagesize-0.1.1/Manifest.txt +19 -0
  392. data/vendor/imagesize-0.1.1/README.txt +49 -0
  393. data/vendor/imagesize-0.1.1/lib/image_size.rb +305 -0
  394. data/vendor/imagesize-0.1.1/lib/image_size/version.rb +9 -0
  395. data/vendor/imagesize-0.1.1/setup.rb +1585 -0
  396. data/vendor/imagesize-0.1.1/test/2-4-7.png +0 -0
  397. data/vendor/imagesize-0.1.1/test/4_1_2.gif +0 -0
  398. data/vendor/imagesize-0.1.1/test/bmp.bmp +0 -0
  399. data/vendor/imagesize-0.1.1/test/cursor.xbm +6 -0
  400. data/vendor/imagesize-0.1.1/test/detect.swf +0 -0
  401. data/vendor/imagesize-0.1.1/test/pbm.pbm +0 -0
  402. data/vendor/imagesize-0.1.1/test/pcx.pcx +0 -0
  403. data/vendor/imagesize-0.1.1/test/pgm.pgm +5 -0
  404. data/vendor/imagesize-0.1.1/test/test.xpm +38 -0
  405. data/vendor/imagesize-0.1.1/test/test_helper.rb +2 -0
  406. data/vendor/imagesize-0.1.1/test/test_image_size.rb +71 -0
  407. data/vendor/imagesize-0.1.1/test/tiff.tiff +0 -0
  408. data/vendor/imagesize-0.1.1/test/tokyo_tower.jpg +0 -0
  409. data/vendor/imagesize-0.1.1/test/tower_e.gif.psd +0 -0
  410. data/vendor/jasmine-jquery-1.4.2/jasmine-jquery.js +548 -0
  411. data/vendor/jquery-1.8/jquery.js +9227 -0
  412. data/vendor/rdtool-0.6.38/COPYING.txt +339 -0
  413. data/vendor/rdtool-0.6.38/Gemfile +3 -0
  414. data/vendor/rdtool-0.6.38/HISTORY +318 -0
  415. data/vendor/rdtool-0.6.38/LGPL-2.1 +502 -0
  416. data/vendor/rdtool-0.6.38/LICENSE.txt +58 -0
  417. data/vendor/rdtool-0.6.38/README.html +66 -0
  418. data/vendor/rdtool-0.6.38/README.ja.html +73 -0
  419. data/vendor/rdtool-0.6.38/README.rd +76 -0
  420. data/vendor/rdtool-0.6.38/README.rd.ja +85 -0
  421. data/vendor/rdtool-0.6.38/Rakefile +152 -0
  422. data/vendor/rdtool-0.6.38/TODO +22 -0
  423. data/vendor/rdtool-0.6.38/bin/rd2 +283 -0
  424. data/vendor/rdtool-0.6.38/bin/rdswap.rb +207 -0
  425. data/vendor/rdtool-0.6.38/doc/rd-draft.html +456 -0
  426. data/vendor/rdtool-0.6.38/doc/rd-draft.ja.html +466 -0
  427. data/vendor/rdtool-0.6.38/doc/rd-draft.rd +479 -0
  428. data/vendor/rdtool-0.6.38/doc/rd-draft.rd.ja +487 -0
  429. data/vendor/rdtool-0.6.38/lib/rd/block-element.rb +114 -0
  430. data/vendor/rdtool-0.6.38/lib/rd/complex-list-item.rb +65 -0
  431. data/vendor/rdtool-0.6.38/lib/rd/desclist.rb +55 -0
  432. data/vendor/rdtool-0.6.38/lib/rd/document-struct.rb +46 -0
  433. data/vendor/rdtool-0.6.38/lib/rd/dot.rd2rc +18 -0
  434. data/vendor/rdtool-0.6.38/lib/rd/element.rb +160 -0
  435. data/vendor/rdtool-0.6.38/lib/rd/filter.rb +255 -0
  436. data/vendor/rdtool-0.6.38/lib/rd/head-filter.rb +14 -0
  437. data/vendor/rdtool-0.6.38/lib/rd/inline-element.rb +233 -0
  438. data/vendor/rdtool-0.6.38/lib/rd/labeled-element.rb +14 -0
  439. data/vendor/rdtool-0.6.38/lib/rd/list.rb +57 -0
  440. data/vendor/rdtool-0.6.38/lib/rd/loose-struct.rb +11 -0
  441. data/vendor/rdtool-0.6.38/lib/rd/methodlist.rb +57 -0
  442. data/vendor/rdtool-0.6.38/lib/rd/output-format-visitor.rb +30 -0
  443. data/vendor/rdtool-0.6.38/lib/rd/package.rb +4 -0
  444. data/vendor/rdtool-0.6.38/lib/rd/parser-util.rb +14 -0
  445. data/vendor/rdtool-0.6.38/lib/rd/post-install +1 -0
  446. data/vendor/rdtool-0.6.38/lib/rd/pre-setup.rb +18 -0
  447. data/vendor/rdtool-0.6.38/lib/rd/rbl-file.rb +69 -0
  448. data/vendor/rdtool-0.6.38/lib/rd/rbl-suite.rb +37 -0
  449. data/vendor/rdtool-0.6.38/lib/rd/rd-struct.rb +86 -0
  450. data/vendor/rdtool-0.6.38/lib/rd/rd2html-ext-lib.rb +266 -0
  451. data/vendor/rdtool-0.6.38/lib/rd/rd2html-ext-opt.rb +34 -0
  452. data/vendor/rdtool-0.6.38/lib/rd/rd2html-lib.rb +490 -0
  453. data/vendor/rdtool-0.6.38/lib/rd/rd2html-opt.rb +67 -0
  454. data/vendor/rdtool-0.6.38/lib/rd/rd2man-lib.rb +251 -0
  455. data/vendor/rdtool-0.6.38/lib/rd/rd2rdo-lib.rb +19 -0
  456. data/vendor/rdtool-0.6.38/lib/rd/rd2rmi-lib.rb +32 -0
  457. data/vendor/rdtool-0.6.38/lib/rd/rdblockparser.ry +518 -0
  458. data/vendor/rdtool-0.6.38/lib/rd/rdblockparser.tab.rb +1061 -0
  459. data/vendor/rdtool-0.6.38/lib/rd/rdfmt.rb +15 -0
  460. data/vendor/rdtool-0.6.38/lib/rd/rdinlineparser.ry +503 -0
  461. data/vendor/rdtool-0.6.38/lib/rd/rdinlineparser.tab.rb +1243 -0
  462. data/vendor/rdtool-0.6.38/lib/rd/rdvisitor.rb +214 -0
  463. data/vendor/rdtool-0.6.38/lib/rd/reference-resolver.rb +114 -0
  464. data/vendor/rdtool-0.6.38/lib/rd/search-file.rb +14 -0
  465. data/vendor/rdtool-0.6.38/lib/rd/tree.rb +103 -0
  466. data/vendor/rdtool-0.6.38/lib/rd/version.rb +41 -0
  467. data/vendor/rdtool-0.6.38/lib/rd/visitor.rb +86 -0
  468. data/vendor/rdtool-0.6.38/rdtool.gemspec +125 -0
  469. data/vendor/rdtool-0.6.38/setup.rb +1596 -0
  470. data/vendor/rdtool-0.6.38/test/data/includee1.html +1 -0
  471. data/vendor/rdtool-0.6.38/test/data/includee2.html +1 -0
  472. data/vendor/rdtool-0.6.38/test/data/includee3.nothtml +1 -0
  473. data/vendor/rdtool-0.6.38/test/data/includee4.xhtml +0 -0
  474. data/vendor/rdtool-0.6.38/test/data/label.rbl +2 -0
  475. data/vendor/rdtool-0.6.38/test/data/label2.rbl +2 -0
  476. data/vendor/rdtool-0.6.38/test/data/sub/includee2.html +1 -0
  477. data/vendor/rdtool-0.6.38/test/data/sub/includee4.html +0 -0
  478. data/vendor/rdtool-0.6.38/test/dummy-observer.rb +6 -0
  479. data/vendor/rdtool-0.6.38/test/dummy.rb +33 -0
  480. data/vendor/rdtool-0.6.38/test/temp-dir.rb +19 -0
  481. data/vendor/rdtool-0.6.38/test/test-block-parser.rb +46 -0
  482. data/vendor/rdtool-0.6.38/test/test-desclist-item.rb +219 -0
  483. data/vendor/rdtool-0.6.38/test/test-document-element.rb +46 -0
  484. data/vendor/rdtool-0.6.38/test/test-document-struct.rb +66 -0
  485. data/vendor/rdtool-0.6.38/test/test-element.rb +46 -0
  486. data/vendor/rdtool-0.6.38/test/test-headline.rb +80 -0
  487. data/vendor/rdtool-0.6.38/test/test-inline-parser.rb +46 -0
  488. data/vendor/rdtool-0.6.38/test/test-list-item.rb +54 -0
  489. data/vendor/rdtool-0.6.38/test/test-list.rb +53 -0
  490. data/vendor/rdtool-0.6.38/test/test-methodlist-item.rb +73 -0
  491. data/vendor/rdtool-0.6.38/test/test-nonterminal-element.rb +170 -0
  492. data/vendor/rdtool-0.6.38/test/test-nonterminal-inline.rb +33 -0
  493. data/vendor/rdtool-0.6.38/test/test-output-format-visitor.rb +48 -0
  494. data/vendor/rdtool-0.6.38/test/test-parser-util.rb +41 -0
  495. data/vendor/rdtool-0.6.38/test/test-rbl-file.rb +156 -0
  496. data/vendor/rdtool-0.6.38/test/test-rbl-suite.rb +43 -0
  497. data/vendor/rdtool-0.6.38/test/test-rd2html-lib.rb +496 -0
  498. data/vendor/rdtool-0.6.38/test/test-rdtree.rb +17 -0
  499. data/vendor/rdtool-0.6.38/test/test-rdvisitor.rb +29 -0
  500. data/vendor/rdtool-0.6.38/test/test-reference-resolver.rb +202 -0
  501. data/vendor/rdtool-0.6.38/test/test-reference.rb +132 -0
  502. data/vendor/rdtool-0.6.38/test/test-search-file.rb +22 -0
  503. data/vendor/rdtool-0.6.38/test/test-terminal-inline.rb +41 -0
  504. data/vendor/rdtool-0.6.38/test/test-textblock.rb +44 -0
  505. data/vendor/rdtool-0.6.38/test/test-tree.rb +82 -0
  506. data/vendor/rdtool-0.6.38/test/test-version.rb +57 -0
  507. data/vendor/rdtool-0.6.38/test/test-visitor.rb +230 -0
  508. data/vendor/rdtool-0.6.38/utils/rd-mode.el +464 -0
  509. metadata +666 -0
@@ -0,0 +1,505 @@
1
+ # -*- coding: utf-8 -*-
2
+ =begin
3
+ = その日の天気プラグイン / Weather-of-today plugin((-$Id: weather.rb,v 1.16 2008-03-02 09:01:45 kazuhiko Exp $-))
4
+ Records the weather when the diary is first updated for the date and
5
+ displays it.
6
+
7
+ その日の天気を、その日の日記を最初に更新する時に取得して保存し、それぞれ
8
+ の日の日記の上部に表示します。
9
+
10
+ == Acknowledgements
11
+ その日の天気プラグインのアイディアを提供してくださったhsbtさん、実装のヒ
12
+ ントを提供してくださったzoeさんに感謝します。また、NOAAの情報を提供して
13
+ くださったkotakさんに感謝します。
14
+
15
+ The author appreciates National Weather Service
16
+ ((<URL:http://weather.noaa.gov/>)) making such valuable data available
17
+ in public domain as described in ((<URL:http://www.noaa.gov/wx.html>)).
18
+
19
+ == Copyright
20
+ Copyright 2003 zunda <zunda at freeshell.org>
21
+
22
+ Permission is granted for use, copying, modification, distribution,
23
+ and distribution of modified versions of this work under the terms
24
+ of GPL version 2 or later.
25
+ =end
26
+
27
+ =begin ChangeLog
28
+ * Mon Jan 14, 2008 SHIBATA Hiroshi <h-sbt@nifty.com>
29
+ - Hide output string in RSS feed.
30
+ * Mon Sep 29, 2003 zunda <zunda at freeshell.org>
31
+ - Japanese resources divided into a separate file, English resource
32
+ created
33
+ * Thu Jul 24, 2003 zunda <zunda at freeshell.org>
34
+ - Syntax error in drizzle fixed
35
+ * Mon Jul 21, 2003 zunda <zunda at freeshell.org>
36
+ - changed regexp literals from %r|..| to %r[..] for Ruby 1.8.x.
37
+ * Fri Jul 17, 2003 zunda <zunda at freeshell.org>
38
+ - WWW configuration interface
39
+ * Thu Jun 5, 2003 zunda <zunda at freeshell.org>
40
+ - checks the age of data
41
+ * Tue Jun 3, 2003 zunda <zunda at freeshell.org>
42
+ - ignores `... in the vicinity', thank you kosaka-san.
43
+ - now tests translations if executed as a stand alone script.
44
+ * Mon May 26, 2003 zunda <zunda at freeshell.org>
45
+ - fix typo on weaHTer.show_mobile and weHTer.show_error, thank you halchan.
46
+ * Thu May 8, 2003 zunda <zunda at freeshell.org>
47
+ - A with B, observed,
48
+ * Mon May 5, 2003 zunda <zunda at freeshell.org>
49
+ - mobile agent
50
+ * Fri Mar 28, 2003 zunda <zunda at freeshell.org>
51
+ - overcast, Thanks kotak san.
52
+ * Fri Mar 21, 2003 zunda <zunda at freeshell.org>
53
+ - mist: kiri -> kasumi, Thanks kotak san.
54
+ * Sun Mar 16, 2003 zunda <zunda at freeshell.org>
55
+ - option weather.tz, appropriate handling of timezone
56
+ * Tue Mar 11, 2003 zunda <zunda at freeshell.org>
57
+ - records: windchill, winddir with 'direction variable', gusting wind
58
+ * Mon Mar 10, 2003 zunda <zunda at freeshell.org>
59
+ - WeatherTranslator module
60
+ * Sat Mar 8, 2003 zunda <zunda at freeshell.org>
61
+ - values with units
62
+ * Fri Mar 7, 2003 zunda <zunda at freeshell.org>
63
+ - edited to work with NOAA/NWS
64
+ * Fri Feb 28, 2003 zunda <zunda at freeshell.org>
65
+ - first draft
66
+ =end
67
+
68
+ require 'net/http'
69
+ require 'cgi'
70
+ require 'timeout'
71
+
72
+ =begin
73
+ == Classes and methods
74
+ === WeatherTranslator module
75
+ We want Japanese displayed in a diary written in Japanese.
76
+
77
+ --- WeatherTranslator::S < String
78
+ Extension of String class. It translates itself.
79
+
80
+ --- WeatherTranslator::S.translate( table )
81
+ Translates self according to ((|table|)).
82
+ =end
83
+
84
+ module WeatherTranslator
85
+ class S < String
86
+ def translate( table )
87
+ return '' if not self or self.empty?
88
+ table.each do |x|
89
+ if x[0] =~ self then
90
+ return S.new( S.new( $` ).translate( table ) + eval( x[1] ) + S.new( $' ).translate( table ) )
91
+ end
92
+ end
93
+ self
94
+ end
95
+ def compact
96
+ S.new( self.split( /\/+/ ).uniq.join( '/' ) )
97
+ end
98
+ end
99
+ end
100
+
101
+ =begin
102
+ === Weather class
103
+ Weather of a date.
104
+
105
+ --- Weather( date )
106
+ A Weather is a weather datum for a ((|date|)) (a Time object).
107
+
108
+ --- Weather.get( url, header, items )
109
+ Gets a WWW page from the ((|url|)) providing HTTP header in the
110
+ ((|header|)) hash. The page is parsed calling Weahter.parse_html.
111
+ Returns self.
112
+
113
+ --- Weather.parse_html( html, items )
114
+ Parses an HTML page ((|html|)) and stores the data into @data
115
+ according to ((|items|)).
116
+
117
+ --- Weather.to_s
118
+ Creates a line to be stored into the cache file which will be
119
+ parsed with Weather.parse method. Data are stored with the
120
+ following sequence and separated with a tab:
121
+ date(string), url, acquisition time(UNIX time) timezone, error (or empty string), item, value, ...
122
+ Each record is terminated with a new line.
123
+
124
+ --- Weather.parse( string )
125
+ --- Weather::parse( string )
126
+ Parses the ((|string|)) made by Weather.to_s and returns the
127
+ resulting Weather.
128
+
129
+ --- Weather::date_to_s( date )
130
+ Returns ((|date|)) formatted as a String used in to_s method. Used
131
+ to find a record for the date from a file.
132
+
133
+ --- Weather.to_html( show_error = false )
134
+ Returns an HTML fragment for the weather. When show_error is true,
135
+ returns an error message as an HTML fragment in case an error
136
+ occured when getting the weather.
137
+
138
+ --- Weather.to_i_html
139
+ Returns a CHTML fragment for the weather.
140
+ =end
141
+ class Weather
142
+ attr_reader :date, :time, :url, :error, :data, :tz
143
+
144
+ # magic numbers
145
+ WAITTIME = 10
146
+ MAXREDIRECT = 10
147
+
148
+ # edit this method according to the HTML we will get
149
+ def parse_html( html, items )
150
+ htmlitems = Hash.new
151
+
152
+ # weather data is in the 4th table in the HTML from weather.noaa.gov
153
+ table = html.scan( %r[<table.*?>(.*?)</table>]mi )[3][0]
154
+ table.scan( %r[<tr.*?>(.*?)</tr>]mi ).collect {|a| a[0]}.each do |row|
155
+ # <tr><td> *item* -> downcased </td><td> *value* </td></tr>
156
+ if %r[<td.*?>(.*?)</td>\s*<td.*?>(.*?)</td>]mi =~ row then
157
+ item = $1
158
+ value = $2
159
+ item = item.gsub( /<br>/i, '/' ).gsub( /<.*?>/m , '').strip.downcase
160
+ value = value.gsub( /<br>/i, '/' ).gsub( /<.*?>/m , '').strip
161
+
162
+ # unit conversion settings
163
+ units = []
164
+ case item
165
+ when 'conditions at'
166
+ # we have to convert the UTC time into UNIX time
167
+ if /(\d{4}).(\d\d).(\d\d)\s*(\d\d)(\d\d)\s*UTC$/ =~ value then
168
+ value = Time::utc( $1, $2, $3, $4, $5 ).to_i.to_s
169
+ else
170
+ raise StandardError, 'Parse error in "Conditions at"'
171
+ end
172
+ when 'visibility' # we want to preserve adjective phrase if possible
173
+ if /(.*)([\d.]+)\s*mile(\(s\))?/i =~ value then
174
+ htmlitems["#{item}(km)"] = sprintf( '%s %.3f', $1.strip, $2.to_f * 1.610 )
175
+ htmlitems["#{item}(mile)"] = sprintf( '%s %s', $1.strip, $2 )
176
+ end
177
+ when 'wind' # we want to preserve adjective phrase if possible
178
+ speed = value.scan( /([\d.]+)\s*MPH/i ).collect { |x| x[0] }
179
+ htmlitems["#{item}(MPH)"] = speed.join(',')
180
+ htmlitems["#{item}(m/s)"] = speed.collect {|s| sprintf( '%.4f', s.to_f * 0.4472222 ) }.join(',')
181
+ if /([\d.]+)\s*degrees?/i =~ value then
182
+ htmlitems["#{item}(deg)"] = $1
183
+ end
184
+ if /from\s+(the\s+)?(\w+)/i =~ value then
185
+ htmlitems["#{item}dir"] = $2 + ($3 ? " #{$3}" : '')
186
+ end
187
+ if /(\(direction variable\))/i =~ value then
188
+ htmlitems["#{item}dir"] << " #{$1}"
189
+ end
190
+ # just have to parse the value with the units
191
+ when 'temperature'
192
+ units = ['C', 'F']
193
+ when 'windchill'
194
+ units = ['C', 'F']
195
+ when 'dew point'
196
+ units = ['C', 'F']
197
+ when 'relative humidity'
198
+ units = ['%']
199
+ when 'pressure (altimeter)'
200
+ units = ['hPa']
201
+ end
202
+
203
+ # parse the value with the units if preferred and possible
204
+ units.each do |unit|
205
+ if /(-?[\d.]+)\s*\(?#{unit}\b/i =~ value then
206
+ htmlitems["#{item}(#{unit})"] = $1
207
+ end
208
+ end
209
+
210
+ # record the value as read from the HTML
211
+ htmlitems[item] = value
212
+
213
+ end # if %r[<td.*?>(.*?)</td>\s*<td.*?>(.*?)</td>]mi =~ row
214
+ end # table.scan( %r[<tr.*?>(.*?)</tr>]mi ) ... do |row|
215
+
216
+ # translate the parsed HTML into the Weather hash with more generic key
217
+ items.each do |from, to|
218
+ if htmlitems[from] then
219
+ # as specified in items
220
+ @data[to] = htmlitems[from]
221
+ elsif f = from.dup.sub!( /\([^)]+\)$/, '' ) \
222
+ and htmlitems[f] \
223
+ and t = to.dup.sub!( /\([^)]+\)$/, '' ) then
224
+ # remove the units and try again if not found
225
+ @data[t] = htmlitems[f]
226
+ end
227
+ end
228
+ @time = Time::now
229
+ end
230
+
231
+ # check age of data
232
+ def check_age( oldest_sec = nil )
233
+ if oldest_sec and @time and @data['timestamp'] and @data['timestamp'].to_i + oldest_sec < @time.to_i then
234
+ @error = 'data too old'
235
+ end
236
+ end
237
+
238
+ def initialize( date = nil, tz = nil, conf = nil )
239
+ @conf = conf
240
+ @date = date or Time.now
241
+ @data = Hash.new
242
+ @error = nil
243
+ @url = nil
244
+ if tz and not tz.empty? then
245
+ @tz = tz
246
+ elsif ENV['TZ']
247
+ @tz = ENV['TZ']
248
+ else
249
+ @tz = nil
250
+ end
251
+ end
252
+
253
+ def fetch( url, limit, header )
254
+ raise ArgumentError, 'HTTP redirect too deep' if limit == 0
255
+
256
+ px_host, px_port = (@conf['proxy'] || '').split( /:/ )
257
+ px_port = 80 if px_host and !px_port
258
+ u = URI::parse( url )
259
+ Net::HTTP::Proxy( px_host, px_port ).start( u.host, u.port ) do |http|
260
+ case res = http.get( u.path, header )
261
+ when Net::HTTPSuccess
262
+ res.body
263
+ when Net::HTTPRedirection
264
+ fetch( res['location'].untaint, limit - 1 )
265
+ else
266
+ raise ArgumentError, res.error!
267
+ end
268
+ end
269
+ end
270
+
271
+ def get( url, header = {}, items = {} )
272
+ @url = url.gsub(/[\t\n]/, '')
273
+ @error = nil
274
+
275
+ begin
276
+ timeout( WAITTIME ) do
277
+ d = @conf.to_native( fetch( url, MAXREDIRECT, header ) )
278
+ parse_html( d, items )
279
+ end
280
+ rescue TimeoutError
281
+ @error = 'Timeout'
282
+ rescue
283
+ @error = @conf.to_native( $!.message.gsub( /[\t\n]/, ' ' ) )
284
+ end
285
+ self
286
+ end
287
+
288
+ def to_s
289
+ tzstr = @tz ? " #{tz}" : ''
290
+ r = "#{Weather::date_to_s( @date )}\t#{@url}\t#{@time.to_i}#{tzstr}\t#{@error}"
291
+ @data.each do |item, value|
292
+ r << "\t#{item}\t#{value}" if value and not value.empty?
293
+ end
294
+ r << "\n"
295
+ end
296
+
297
+ def parse( string )
298
+ i = string.chomp.split( /\t/ )
299
+ y, m, d = i.shift.scan( /^(\d{4})(\d\d)(\d\d)$/ )[0]
300
+ @date = Time::local( y, m, d )
301
+ @url = i.shift
302
+ itime, @tz = i.shift.split( / +/, 2 )
303
+ @time = Time::at( itime.to_i )
304
+ error = i.shift
305
+ if error and not error.empty? then
306
+ @error = error
307
+ else
308
+ @error = nil
309
+ end
310
+ @data.clear
311
+ while not i.empty? do
312
+ @data[i.shift] = i.shift
313
+ end
314
+ self
315
+ end
316
+
317
+ def to_html( show_error = false )
318
+ @error ? (show_error ? error_html_string : '') : html_string
319
+ end
320
+
321
+ def to_i_html
322
+ @error ? '' : i_html_string
323
+ end
324
+
325
+ def store( path, date )
326
+ ddir = File.dirname( Weather::file_path( path, date ) )
327
+ # mkdir_p logic copied from fileutils.rb
328
+ # Copyright (c) 2000,2001 Minero Aoki <aamine@loveruby.net>
329
+ # and edited (zunda.freeshell.org does not have fileutils.rb T_T
330
+ dirstack = []
331
+ until FileTest.directory?( ddir ) do
332
+ dirstack.push( ddir )
333
+ ddir = File.dirname( ddir )
334
+ end
335
+ dirstack.reverse_each do |dir|
336
+ Dir.mkdir dir
337
+ end
338
+ # finally we can write a file
339
+ File::open( Weather::file_path( path, date ), 'a' ) do |fh|
340
+ fh.puts( to_s )
341
+ end
342
+ end
343
+
344
+ class << self
345
+ def parse( string )
346
+ new.parse( string )
347
+ end
348
+
349
+ def date_to_s( date )
350
+ date.strftime( '%Y%m%d' )
351
+ end
352
+
353
+ def file_path( path, date )
354
+ date.strftime( "#{path}/%Y/%Y%m.weather" ).gsub( /\/\/+/, '/' )
355
+ end
356
+
357
+ def restore( path, date )
358
+ r = nil
359
+ datestring = Weather::date_to_s( date )
360
+ begin
361
+ File::open( file_path( path, date ), 'r' ) do |fh|
362
+ fh.each( "\n" ) do |l|
363
+ if /^#{datestring}\t/ =~ l then
364
+ r = l # will use the last/newest data found in the file
365
+ end
366
+ end
367
+ end
368
+ rescue Errno::ENOENT
369
+ end
370
+ r ? Weather::parse( r ) : nil
371
+ end
372
+
373
+ end
374
+ end
375
+
376
+ =begin
377
+ === Methods as a plugin
378
+ weather method also can be used as a usual plug-in in your diary body.
379
+ Please note that the argument is not a String but a Time object.
380
+
381
+ --- weather( date = nil )
382
+ Returns an HTML flagment of the weather for the date. This will be
383
+ provoked as a body_enter_proc. @date is used when ((|date|)) is
384
+ nil.
385
+
386
+ --- get_weather
387
+ Access the URL to get the current weather information when:
388
+ * @mode is append or replace,
389
+ * @date is today, and
390
+ * There is no cached data without an error for today
391
+ This will be provoked as an update_proc.
392
+ =end
393
+
394
+ Weather_default_path = "#{@cache_path}/weather"
395
+ Weather_default_items = {
396
+ # UNIX time
397
+ 'conditions at' => 'timestamp',
398
+ # English phrases
399
+ 'sky conditions' => 'condition',
400
+ 'weather' => 'weather',
401
+ # Direction (e.g. SE)
402
+ 'winddir' => 'winddir',
403
+ # English phrases when unit conversion failed, otherwise, key with (unit)
404
+ 'wind(m/s)' => 'wind(m/s)',
405
+ 'wind(deg)' => 'wind(deg)',
406
+ 'visibility(km)' => 'visibility(km)',
407
+ 'temperature(C)' => 'temperature(C)',
408
+ 'windchill(C)' => 'windchill(C)',
409
+ 'dew point(C)' => 'dewpoint(C)',
410
+ 'relative humidity(%)' => 'humidity(%)',
411
+ 'pressure (altimeter)(hPa)' => 'pressure(hPa)',
412
+ }
413
+
414
+ # shows weather
415
+ def weather( date = nil, wrap = true )
416
+ return '' if bot? and not @options['weather.show_robot']
417
+ path = @options['weather.dir'] || Weather_default_path
418
+ w = Weather::restore( path, date || @date )
419
+ if w then
420
+ unless @cgi.mobile_agent? then
421
+ %Q|#{wrap ? '<div class="weather">' : ' '}#{w.to_html( @options['weather.show_error'] )}#{wrap ? "</div>\n" : ''}|
422
+ else
423
+ %Q|<P>#{w.to_i_html if @options['weather.show_mobile']}</P>\n|
424
+ end
425
+ else
426
+ ''
427
+ end
428
+ end
429
+
430
+ # gets weather when the diary is updated
431
+ def get_weather
432
+ return unless @options['weather.url']
433
+ return unless @mode == 'append' or @mode == 'replace'
434
+ return unless @date.strftime( '%Y%m%d' ) == Time::now.strftime( '%Y%m%d' )
435
+ path = @options['weather.dir'] || Weather_default_path
436
+ w = Weather::restore( path, @date )
437
+ if not w or w.error then
438
+ items = @options['weather.items'] || Weather_default_items
439
+ w = Weather.new( @date, @options['weather.tz'], @conf )
440
+ w.get( @options['weather.url'], @options['weather.header'] || {}, items )
441
+ if @options.has_key?( 'weather.oldest' ) then
442
+ oldest = @options['weather.oldest']
443
+ else
444
+ oldest = 21600
445
+ end
446
+ w.check_age( oldest )
447
+ w.store( path, @date )
448
+ end
449
+ end
450
+
451
+ # www configuration interface
452
+ def configure_weather
453
+ if( @mode == 'saveconf' ) then
454
+ # weather.url
455
+ @conf['weather.url'] = @cgi.params['weather.url'][0]
456
+ # weather.tz
457
+ tz = @cgi.params['weather.tz'][0]
458
+ unless tz.empty? then # need more checks
459
+ @conf['weather.tz'] = tz
460
+ else
461
+ @conf['weather.tz'] = ''
462
+ end
463
+ %w(in_title show_mobile show_robot).each do |item|
464
+ case @cgi.params["weather.#{item}"][0]
465
+ when 'true'
466
+ @conf["weather.#{item}"] = true
467
+ when 'false'
468
+ @conf["weather.#{item}"] = false
469
+ end
470
+ end
471
+ end
472
+ weather_configure_html( @conf )
473
+ end
474
+
475
+ add_header_proc do
476
+ <<"_END"
477
+ \t<style type="text/css" media="all"><!--
478
+ \t\th2 span.weather{font-size: small;}
479
+ \t\tdiv.weather{text-align: right; font-size: 75%;}
480
+ \t--></style>
481
+ _END
482
+ end
483
+
484
+ if not feed? and not @options['weather.in_title'] then
485
+ add_body_enter_proc do |date|
486
+ weather( date )
487
+ end
488
+ end
489
+
490
+ if not feed? and @options['weather.in_title'] then
491
+ add_title_proc do |date, title|
492
+ title + weather( date, false )
493
+ end
494
+ end
495
+
496
+ add_update_proc do get_weather end
497
+ add_conf_proc( 'weather', @weather_plugin_name ) do configure_weather end
498
+
499
+
500
+ # Local Variables:
501
+ # mode: ruby
502
+ # indent-tabs-mode: t
503
+ # tab-width: 3
504
+ # ruby-indent-level: 3
505
+ # End: