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.
- checksums.yaml +7 -0
- data/.coveralls.yml +1 -0
- data/.gitignore +16 -0
- data/.travis.yml +29 -0
- data/Capfile +2 -0
- data/ChangeLog +3173 -0
- data/Gemfile +58 -0
- data/Gemfile.lock +201 -0
- data/LICENSE +340 -0
- data/Procfile +1 -0
- data/README.md +33 -0
- data/Rakefile +26 -0
- data/bin/tdiary +7 -0
- data/config.ru +61 -0
- data/data/.htaccess +2 -0
- data/doc/HOWTO-authenticate-in-rack.md +89 -0
- data/doc/HOWTO-make-io.md +305 -0
- data/doc/HOWTO-make-plugin.md +279 -0
- data/doc/HOWTO-make-theme.md +67 -0
- data/doc/HOWTO-testing-tDiary.md +44 -0
- data/doc/HOWTO-use-plugin.md +148 -0
- data/doc/HOWTO-write-tDiary.en.md +131 -0
- data/doc/HOWTO-write-tDiary.md +136 -0
- data/doc/INSTALL-paas.md +202 -0
- data/doc/INSTALL.md +160 -0
- data/doc/README.en.md +174 -0
- data/doc/README.md +56 -0
- data/doc/UPGRADE.md +164 -0
- data/doc/doc.css +115 -0
- data/dot.htaccess +27 -0
- data/index.fcgi +45 -0
- data/index.rb +57 -0
- data/js/00default.js +60 -0
- data/js/01conf.js +62 -0
- data/js/02edit.coffee +5 -0
- data/js/02edit.js +15 -0
- data/js/amazon.js +43 -0
- data/js/calendar3.js +130 -0
- data/js/caretposition.js +170 -0
- data/js/category.js +29 -0
- data/js/category_autocomplete.js +96 -0
- data/js/comment_ajax.js +27 -0
- data/js/draft.js +149 -0
- data/js/highlight.js +36 -0
- data/js/image.js +181 -0
- data/misc/convert2.rb +123 -0
- data/misc/filter/antispamservice.rb +101 -0
- data/misc/filter/limitdays.rb +40 -0
- data/misc/filter/linkcheck.rb +81 -0
- data/misc/filter/plugin/antispamservice.rb +82 -0
- data/misc/filter/plugin/en/antispamservice.rb +21 -0
- data/misc/filter/plugin/ja/antispamservice.rb +20 -0
- data/misc/lib/README +4 -0
- data/misc/lib/compatible.rb +1 -0
- data/misc/lib/fcgi_patch.rb +90 -0
- data/misc/migrate.rb +157 -0
- data/misc/paas/cloudfoundry/Gemfile +26 -0
- data/misc/paas/cloudfoundry/Gemfile.lock +85 -0
- data/misc/paas/heroku/Gemfile +22 -0
- data/misc/paas/heroku/Gemfile.lock +85 -0
- data/misc/paas/sqale/Gemfile +19 -0
- data/misc/paas/sqale/Gemfile.lock +85 -0
- data/misc/paas/sqale/Procfile +1 -0
- data/misc/paas/sqale/dot.env +1 -0
- data/misc/plugin/ChangeLog.DO_NOT_UPDATE +2333 -0
- data/misc/plugin/a.rb +211 -0
- data/misc/plugin/amazon.rb +403 -0
- data/misc/plugin/amazon/README.en +17 -0
- data/misc/plugin/amazon/README.ja +29 -0
- data/misc/plugin/amazon/amazonimg.rb +113 -0
- data/misc/plugin/amazon/large.png +0 -0
- data/misc/plugin/amazon/medium.png +0 -0
- data/misc/plugin/amazon/small.png +0 -0
- data/misc/plugin/append-css.rb +51 -0
- data/misc/plugin/bq.rb +48 -0
- data/misc/plugin/calendar2.rb +184 -0
- data/misc/plugin/calendar3.rb +256 -0
- data/misc/plugin/category.rb +779 -0
- data/misc/plugin/category_autocomplete.rb +33 -0
- data/misc/plugin/comment_ajax.rb +11 -0
- data/misc/plugin/comment_mail-qmail.rb +57 -0
- data/misc/plugin/comment_mail-sendmail.rb +56 -0
- data/misc/plugin/comment_mail-smtp.rb +59 -0
- data/misc/plugin/comment_rank.rb +36 -0
- data/misc/plugin/counter.rb +631 -0
- data/misc/plugin/daily_theme.rb +55 -0
- data/misc/plugin/disp_referrer.rb +1486 -0
- data/misc/plugin/doctype-html401tr.rb +16 -0
- data/misc/plugin/draft.rb +20 -0
- data/misc/plugin/dropdown_calendar.rb +32 -0
- data/misc/plugin/edit_today.rb +50 -0
- data/misc/plugin/en/a.rb +10 -0
- data/misc/plugin/en/amazon.rb +71 -0
- data/misc/plugin/en/append-css.rb +17 -0
- data/misc/plugin/en/bq.rb +12 -0
- data/misc/plugin/en/calendar2.rb +12 -0
- data/misc/plugin/en/category.rb +204 -0
- data/misc/plugin/en/counter.rb +48 -0
- data/misc/plugin/en/daily_theme.rb +14 -0
- data/misc/plugin/en/disp_referrer.rb +387 -0
- data/misc/plugin/en/dropdown_calendar.rb +14 -0
- data/misc/plugin/en/edit_today.rb +22 -0
- data/misc/plugin/en/hide-mail-field.rb +19 -0
- data/misc/plugin/en/highlight.rb +29 -0
- data/misc/plugin/en/image.rb +54 -0
- data/misc/plugin/en/kw.rb +22 -0
- data/misc/plugin/en/makerss.rb +47 -0
- data/misc/plugin/en/pb-show.rb +21 -0
- data/misc/plugin/en/ping.rb +16 -0
- data/misc/plugin/en/recent_comment.rb +44 -0
- data/misc/plugin/en/recent_comment3.rb +56 -0
- data/misc/plugin/en/recent_rss.rb +33 -0
- data/misc/plugin/en/referer_scheme.rb +48 -0
- data/misc/plugin/en/search_control.rb +74 -0
- data/misc/plugin/en/search_form.rb +22 -0
- data/misc/plugin/en/speed_comment.rb +19 -0
- data/misc/plugin/en/tb-show.rb +37 -0
- data/misc/plugin/en/todo.rb +43 -0
- data/misc/plugin/en/weather.rb +185 -0
- data/misc/plugin/en/xmlrpc.rb +14 -0
- data/misc/plugin/footnote.rb +92 -0
- data/misc/plugin/gradation.rb +39 -0
- data/misc/plugin/gradient.rb +36 -0
- data/misc/plugin/hide-mail-field.rb +50 -0
- data/misc/plugin/highlight.rb +22 -0
- data/misc/plugin/html_anchor.rb +34 -0
- data/misc/plugin/image.rb +290 -0
- data/misc/plugin/ja/amazon.rb +89 -0
- data/misc/plugin/ja/bq.rb +13 -0
- data/misc/plugin/ja/calendar2.rb +12 -0
- data/misc/plugin/ja/category.rb +212 -0
- data/misc/plugin/ja/daily_theme.rb +15 -0
- data/misc/plugin/ja/disp_referrer.rb +644 -0
- data/misc/plugin/ja/edit_today.rb +23 -0
- data/misc/plugin/ja/hide-mail-field.rb +20 -0
- data/misc/plugin/ja/highlight.rb +30 -0
- data/misc/plugin/ja/makerss.rb +44 -0
- data/misc/plugin/ja/my-sequel.rb +52 -0
- data/misc/plugin/ja/pb-show.rb +23 -0
- data/misc/plugin/ja/ping.rb +17 -0
- data/misc/plugin/ja/recent_comment.rb +45 -0
- data/misc/plugin/ja/recent_comment3.rb +57 -0
- data/misc/plugin/ja/recent_rss.rb +34 -0
- data/misc/plugin/ja/referer_scheme.rb +86 -0
- data/misc/plugin/ja/search_control.rb +75 -0
- data/misc/plugin/ja/search_form.rb +32 -0
- data/misc/plugin/ja/tb-show.rb +38 -0
- data/misc/plugin/ja/todo.rb +46 -0
- data/misc/plugin/ja/weather.rb +402 -0
- data/misc/plugin/ja/xmlrpc.rb +15 -0
- data/misc/plugin/kw.rb +150 -0
- data/misc/plugin/list.rb +40 -0
- data/misc/plugin/makelirs.rb +89 -0
- data/misc/plugin/makerss.rb +744 -0
- data/misc/plugin/my-ex.rb +68 -0
- data/misc/plugin/my-sequel.rb +539 -0
- data/misc/plugin/navi_user.rb +19 -0
- data/misc/plugin/number_anchor.rb +47 -0
- data/misc/plugin/pb-show.rb +165 -0
- data/misc/plugin/ping.rb +99 -0
- data/misc/plugin/pre_wrap.rb +19 -0
- data/misc/plugin/random_google.rb +165 -0
- data/misc/plugin/recent_comment.rb +82 -0
- data/misc/plugin/recent_comment3.rb +192 -0
- data/misc/plugin/recent_list.rb +91 -0
- data/misc/plugin/recent_namazu.rb +50 -0
- data/misc/plugin/recent_rss.rb +305 -0
- data/misc/plugin/referer-antibot.rb +53 -0
- data/misc/plugin/referer-utf8.rb +12 -0
- data/misc/plugin/referer_scheme.rb +87 -0
- data/misc/plugin/search_control.rb +227 -0
- data/misc/plugin/search_form.rb +53 -0
- data/misc/plugin/sn.rb +107 -0
- data/misc/plugin/speed_comment.rb +68 -0
- data/misc/plugin/squeeze.rb +272 -0
- data/misc/plugin/src.rb +30 -0
- data/misc/plugin/tb-show.rb +212 -0
- data/misc/plugin/title_list.rb +41 -0
- data/misc/plugin/title_tag.rb +80 -0
- data/misc/plugin/tlink.rb +163 -0
- data/misc/plugin/todo.rb +182 -0
- data/misc/plugin/weather.rb +505 -0
- data/misc/plugin/whatsnew.rb +100 -0
- data/misc/plugin/xmlrpc.rb +80 -0
- data/misc/plugin/xmlrpc/README +20 -0
- data/misc/plugin/xmlrpc/xmlrpc.rb +575 -0
- data/misc/style/emptdiary/README.rd +83 -0
- data/misc/style/emptdiary/README.rd.en +78 -0
- data/misc/style/emptdiary/emptdiary_style.rb +199 -0
- data/misc/style/etdiary/README.rd +83 -0
- data/misc/style/etdiary/etdiary_style.rb +446 -0
- data/misc/style/gfm/gfm_style.rb +194 -0
- data/misc/style/rd/README.rd +71 -0
- data/misc/style/rd/rd_style.rb +366 -0
- data/misc/style/wiki/README +116 -0
- data/misc/style/wiki/README.en +101 -0
- data/misc/style/wiki/wiki_parser.rb +273 -0
- data/misc/style/wiki/wiki_style.rb +478 -0
- data/misc/theme_convert/Readme.rd +21 -0
- data/misc/theme_convert/append.rcss +150 -0
- data/misc/theme_convert/theme_convert.rb +453 -0
- data/plugin/00default.rb +1015 -0
- data/plugin/05referer.rb +298 -0
- data/plugin/10spamfilter.rb +183 -0
- data/plugin/50sp.rb +146 -0
- data/plugin/60sf.rb +152 -0
- data/plugin/90migrate.rb +109 -0
- data/plugin/en/00default.rb +390 -0
- data/plugin/en/05referer.rb +49 -0
- data/plugin/en/10spamfilter.rb +81 -0
- data/plugin/en/50sp.rb +56 -0
- data/plugin/en/60sf.rb +60 -0
- data/plugin/ja/00default.rb +401 -0
- data/plugin/ja/05referer.rb +47 -0
- data/plugin/ja/10spamfilter.rb +79 -0
- data/plugin/ja/50sp.rb +66 -0
- data/plugin/ja/60sf.rb +73 -0
- data/public/.gitkeep +0 -0
- data/public/images/.gitkeep +0 -0
- data/public/javascripts/.gitkeep +0 -0
- data/public/stylesheets/.gitkeep +0 -0
- data/skel/category.rhtml +9 -0
- data/skel/conf.rhtml +23 -0
- data/skel/day.rhtml +33 -0
- data/skel/diary.rhtml +83 -0
- data/skel/footer.rhtml +8 -0
- data/skel/header.rhtml +10 -0
- data/skel/i.category.rhtml +6 -0
- data/skel/i.conf.rhtml +14 -0
- data/skel/i.day.rhtml +28 -0
- data/skel/i.diary.rhtml +17 -0
- data/skel/i.footer.rhtml +2 -0
- data/skel/i.header.rhtml +3 -0
- data/skel/i.latest.rhtml +24 -0
- data/skel/i.month.rhtml +39 -0
- data/skel/i.search.rhtml +5 -0
- data/skel/i.update.rhtml +40 -0
- data/skel/i.update.rhtml.en +40 -0
- data/skel/latest.rhtml +27 -0
- data/skel/mail.rtxt +18 -0
- data/skel/mail.rtxt.en +18 -0
- data/skel/month.rhtml +27 -0
- data/skel/plugin_error.rhtml +27 -0
- data/skel/preview.rhtml +85 -0
- data/skel/preview.rhtml.en +72 -0
- data/skel/referer.rhtml +24 -0
- data/skel/search.rhtml +14 -0
- data/skel/tdiary.rconf +76 -0
- data/skel/update.rhtml +103 -0
- data/skel/update.rhtml.en +83 -0
- data/spec/acceptance/append_comment_spec.rb +94 -0
- data/spec/acceptance/append_diary_spec.rb +98 -0
- data/spec/acceptance/bugfix/encoding_error_spec.rb +27 -0
- data/spec/acceptance/save_conf_comment_spec.rb +87 -0
- data/spec/acceptance/save_conf_default_spec.rb +169 -0
- data/spec/acceptance/save_conf_dnsbl_spec.rb +152 -0
- data/spec/acceptance/save_conf_filter_spec.rb +50 -0
- data/spec/acceptance/save_conf_plugin_spec.rb +69 -0
- data/spec/acceptance/save_conf_referer_spec.rb +60 -0
- data/spec/acceptance/save_conf_security_spec.rb +280 -0
- data/spec/acceptance/support/helpers.rb +49 -0
- data/spec/acceptance/support/paths.rb +7 -0
- data/spec/acceptance/update_diary_spec.rb +113 -0
- data/spec/acceptance/view_category_spec.rb +38 -0
- data/spec/acceptance/view_comment_spec.rb +67 -0
- data/spec/acceptance/view_diary_spec.rb +126 -0
- data/spec/acceptance/view_referer_spec.rb +31 -0
- data/spec/acceptance_helper.rb +101 -0
- data/spec/core/compatible_spec.rb +54 -0
- data/spec/core/core_ext_spec.rb +59 -0
- data/spec/core/plugin_spec.rb +389 -0
- data/spec/core/rack/assets/precompile_spec.rb +76 -0
- data/spec/core/rack/html_anchor_spec.rb +57 -0
- data/spec/core/rack/valid_request_path_spec.rb +67 -0
- data/spec/core/style/emptdiary_style_spec.rb +165 -0
- data/spec/core/style/etdiary_style_spec.rb +512 -0
- data/spec/core/style/gfm_style_spec.rb +334 -0
- data/spec/core/style/rd_style_spec.rb +202 -0
- data/spec/core/style/tdiary_style_spec.rb +240 -0
- data/spec/core/style/wiki_style_spec.rb +441 -0
- data/spec/fixtures/ascii8bit-pstore.db +0 -0
- data/spec/fixtures/invalid-sequence-volatile.tdr +9 -0
- data/spec/fixtures/just_installed.conf +1 -0
- data/spec/fixtures/plugin/ja/sample.rb +4 -0
- data/spec/fixtures/plugin/sample.rb +6 -0
- data/spec/fixtures/sample.rb +12 -0
- data/spec/fixtures/tdiary.conf.gem +212 -0
- data/spec/fixtures/tdiary.conf.rack +212 -0
- data/spec/fixtures/tdiary.conf.rdb +227 -0
- data/spec/fixtures/tdiary.conf.secure +204 -0
- data/spec/fixtures/tdiary.conf.webrick +212 -0
- data/spec/javascripts/00default_spec.js +35 -0
- data/spec/javascripts/fixtures/00default.html +1 -0
- data/spec/javascripts/support/jasmine.yml +76 -0
- data/spec/plugin/bq_spec.rb +24 -0
- data/spec/plugin/plugin_helper.rb +203 -0
- data/spec/spec_helper.rb +32 -0
- data/tdiary.conf.beginner +244 -0
- data/tdiary.conf.sample +345 -0
- data/tdiary.conf.sample-en +333 -0
- data/tdiary.gemspec +26 -0
- data/tdiary.rb +151 -0
- data/tdiary/admin.rb +236 -0
- data/tdiary/application.rb +57 -0
- data/tdiary/author_only_base.rb +171 -0
- data/tdiary/base.rb +220 -0
- data/tdiary/cli.rb +116 -0
- data/tdiary/comment.rb +40 -0
- data/tdiary/comment_manager.rb +94 -0
- data/tdiary/compatible.rb +72 -0
- data/tdiary/config.rb +270 -0
- data/tdiary/core_ext.rb +122 -0
- data/tdiary/deploy.rb +50 -0
- data/tdiary/dispatcher.rb +77 -0
- data/tdiary/dispatcher/index_main.rb +122 -0
- data/tdiary/dispatcher/update_main.rb +101 -0
- data/tdiary/environment.rb +15 -0
- data/tdiary/filter.rb +48 -0
- data/tdiary/filter/default.rb +54 -0
- data/tdiary/filter/spam.rb +304 -0
- data/tdiary/io/base.rb +70 -0
- data/tdiary/io/cache/file.rb +123 -0
- data/tdiary/io/cache/memcached.rb +88 -0
- data/tdiary/io/cache/redis.rb +100 -0
- data/tdiary/io/default.rb +297 -0
- data/tdiary/io/pstore.rb +252 -0
- data/tdiary/io/rdb.rb +213 -0
- data/tdiary/lang/en.rb +79 -0
- data/tdiary/lang/ja.rb +72 -0
- data/tdiary/plugin.rb +375 -0
- data/tdiary/rack/assets/precompile.rb +37 -0
- data/tdiary/rack/auth/basic.rb +38 -0
- data/tdiary/rack/auth/omniauth.rb +51 -0
- data/tdiary/rack/html_anchor.rb +31 -0
- data/tdiary/rack/valid_request_path.rb +36 -0
- data/tdiary/referer_manager.rb +80 -0
- data/tdiary/request.rb +217 -0
- data/tdiary/response.rb +29 -0
- data/tdiary/server.rb +85 -0
- data/tdiary/style.rb +194 -0
- data/tdiary/style/tdiary_style.rb +198 -0
- data/tdiary/style/wiki_style.rb +213 -0
- data/tdiary/tasks.rb +1 -0
- data/tdiary/tasks/assets.rake +31 -0
- data/tdiary/tasks/auth.rake +28 -0
- data/tdiary/tasks/db.rake +110 -0
- data/tdiary/tasks/doc.rake +31 -0
- data/tdiary/tasks/heroku.rake +37 -0
- data/tdiary/tasks/jasmine.rake +16 -0
- data/tdiary/tasks/rdoc.rake +24 -0
- data/tdiary/tasks/release.rake +122 -0
- data/tdiary/tasks/rspec.rake +51 -0
- data/tdiary/tasks/server.rake +33 -0
- data/tdiary/tasks/test.rake +17 -0
- data/tdiary/version.rb +3 -0
- data/tdiary/view.rb +468 -0
- data/tdiary/view_helper.rb +15 -0
- data/test/disp_referrer_test.rb +93 -0
- data/test/my-sequel_test.rb +238 -0
- data/test/test_helper.rb +7 -0
- data/test/test_plugin_helper.rb +64 -0
- data/test/test_plugin_helper_test.rb +28 -0
- data/test/weather_test.rb +33 -0
- data/theme/base.css +268 -0
- data/theme/conf.block.png +0 -0
- data/theme/conf.css +254 -0
- data/theme/default/README +11 -0
- data/theme/default/body.png +0 -0
- data/theme/default/default.css +743 -0
- data/theme/help.png +0 -0
- data/theme/loading.gif +0 -0
- data/theme/tdiary1/README +7 -0
- data/theme/tdiary1/tdiary1.css +394 -0
- data/theme/tdiary2/README +19 -0
- data/theme/tdiary2/tdiary2.css +624 -0
- data/update.fcgi +45 -0
- data/update.rb +57 -0
- data/vendor/hikidoc-0.0.6/COPYING +28 -0
- data/vendor/hikidoc-0.0.6/NEWS +30 -0
- data/vendor/hikidoc-0.0.6/NEWS.ja +30 -0
- data/vendor/hikidoc-0.0.6/README +86 -0
- data/vendor/hikidoc-0.0.6/README.ja +83 -0
- data/vendor/hikidoc-0.0.6/Rakefile +68 -0
- data/vendor/hikidoc-0.0.6/TextFormattingRules +320 -0
- data/vendor/hikidoc-0.0.6/TextFormattingRules.ja +318 -0
- data/vendor/hikidoc-0.0.6/bin/hikidoc +66 -0
- data/vendor/hikidoc-0.0.6/lib/hikidoc.rb +914 -0
- data/vendor/hikidoc-0.0.6/setup.rb +1360 -0
- data/vendor/hikidoc-0.0.6/test/run-test.rb +13 -0
- data/vendor/hikidoc-0.0.6/test/test_hikidoc.rb +506 -0
- data/vendor/imagesize-0.1.1/Manifest.txt +19 -0
- data/vendor/imagesize-0.1.1/README.txt +49 -0
- data/vendor/imagesize-0.1.1/lib/image_size.rb +305 -0
- data/vendor/imagesize-0.1.1/lib/image_size/version.rb +9 -0
- data/vendor/imagesize-0.1.1/setup.rb +1585 -0
- data/vendor/imagesize-0.1.1/test/2-4-7.png +0 -0
- data/vendor/imagesize-0.1.1/test/4_1_2.gif +0 -0
- data/vendor/imagesize-0.1.1/test/bmp.bmp +0 -0
- data/vendor/imagesize-0.1.1/test/cursor.xbm +6 -0
- data/vendor/imagesize-0.1.1/test/detect.swf +0 -0
- data/vendor/imagesize-0.1.1/test/pbm.pbm +0 -0
- data/vendor/imagesize-0.1.1/test/pcx.pcx +0 -0
- data/vendor/imagesize-0.1.1/test/pgm.pgm +5 -0
- data/vendor/imagesize-0.1.1/test/test.xpm +38 -0
- data/vendor/imagesize-0.1.1/test/test_helper.rb +2 -0
- data/vendor/imagesize-0.1.1/test/test_image_size.rb +71 -0
- data/vendor/imagesize-0.1.1/test/tiff.tiff +0 -0
- data/vendor/imagesize-0.1.1/test/tokyo_tower.jpg +0 -0
- data/vendor/imagesize-0.1.1/test/tower_e.gif.psd +0 -0
- data/vendor/jasmine-jquery-1.4.2/jasmine-jquery.js +548 -0
- data/vendor/jquery-1.8/jquery.js +9227 -0
- data/vendor/rdtool-0.6.38/COPYING.txt +339 -0
- data/vendor/rdtool-0.6.38/Gemfile +3 -0
- data/vendor/rdtool-0.6.38/HISTORY +318 -0
- data/vendor/rdtool-0.6.38/LGPL-2.1 +502 -0
- data/vendor/rdtool-0.6.38/LICENSE.txt +58 -0
- data/vendor/rdtool-0.6.38/README.html +66 -0
- data/vendor/rdtool-0.6.38/README.ja.html +73 -0
- data/vendor/rdtool-0.6.38/README.rd +76 -0
- data/vendor/rdtool-0.6.38/README.rd.ja +85 -0
- data/vendor/rdtool-0.6.38/Rakefile +152 -0
- data/vendor/rdtool-0.6.38/TODO +22 -0
- data/vendor/rdtool-0.6.38/bin/rd2 +283 -0
- data/vendor/rdtool-0.6.38/bin/rdswap.rb +207 -0
- data/vendor/rdtool-0.6.38/doc/rd-draft.html +456 -0
- data/vendor/rdtool-0.6.38/doc/rd-draft.ja.html +466 -0
- data/vendor/rdtool-0.6.38/doc/rd-draft.rd +479 -0
- data/vendor/rdtool-0.6.38/doc/rd-draft.rd.ja +487 -0
- data/vendor/rdtool-0.6.38/lib/rd/block-element.rb +114 -0
- data/vendor/rdtool-0.6.38/lib/rd/complex-list-item.rb +65 -0
- data/vendor/rdtool-0.6.38/lib/rd/desclist.rb +55 -0
- data/vendor/rdtool-0.6.38/lib/rd/document-struct.rb +46 -0
- data/vendor/rdtool-0.6.38/lib/rd/dot.rd2rc +18 -0
- data/vendor/rdtool-0.6.38/lib/rd/element.rb +160 -0
- data/vendor/rdtool-0.6.38/lib/rd/filter.rb +255 -0
- data/vendor/rdtool-0.6.38/lib/rd/head-filter.rb +14 -0
- data/vendor/rdtool-0.6.38/lib/rd/inline-element.rb +233 -0
- data/vendor/rdtool-0.6.38/lib/rd/labeled-element.rb +14 -0
- data/vendor/rdtool-0.6.38/lib/rd/list.rb +57 -0
- data/vendor/rdtool-0.6.38/lib/rd/loose-struct.rb +11 -0
- data/vendor/rdtool-0.6.38/lib/rd/methodlist.rb +57 -0
- data/vendor/rdtool-0.6.38/lib/rd/output-format-visitor.rb +30 -0
- data/vendor/rdtool-0.6.38/lib/rd/package.rb +4 -0
- data/vendor/rdtool-0.6.38/lib/rd/parser-util.rb +14 -0
- data/vendor/rdtool-0.6.38/lib/rd/post-install +1 -0
- data/vendor/rdtool-0.6.38/lib/rd/pre-setup.rb +18 -0
- data/vendor/rdtool-0.6.38/lib/rd/rbl-file.rb +69 -0
- data/vendor/rdtool-0.6.38/lib/rd/rbl-suite.rb +37 -0
- data/vendor/rdtool-0.6.38/lib/rd/rd-struct.rb +86 -0
- data/vendor/rdtool-0.6.38/lib/rd/rd2html-ext-lib.rb +266 -0
- data/vendor/rdtool-0.6.38/lib/rd/rd2html-ext-opt.rb +34 -0
- data/vendor/rdtool-0.6.38/lib/rd/rd2html-lib.rb +490 -0
- data/vendor/rdtool-0.6.38/lib/rd/rd2html-opt.rb +67 -0
- data/vendor/rdtool-0.6.38/lib/rd/rd2man-lib.rb +251 -0
- data/vendor/rdtool-0.6.38/lib/rd/rd2rdo-lib.rb +19 -0
- data/vendor/rdtool-0.6.38/lib/rd/rd2rmi-lib.rb +32 -0
- data/vendor/rdtool-0.6.38/lib/rd/rdblockparser.ry +518 -0
- data/vendor/rdtool-0.6.38/lib/rd/rdblockparser.tab.rb +1061 -0
- data/vendor/rdtool-0.6.38/lib/rd/rdfmt.rb +15 -0
- data/vendor/rdtool-0.6.38/lib/rd/rdinlineparser.ry +503 -0
- data/vendor/rdtool-0.6.38/lib/rd/rdinlineparser.tab.rb +1243 -0
- data/vendor/rdtool-0.6.38/lib/rd/rdvisitor.rb +214 -0
- data/vendor/rdtool-0.6.38/lib/rd/reference-resolver.rb +114 -0
- data/vendor/rdtool-0.6.38/lib/rd/search-file.rb +14 -0
- data/vendor/rdtool-0.6.38/lib/rd/tree.rb +103 -0
- data/vendor/rdtool-0.6.38/lib/rd/version.rb +41 -0
- data/vendor/rdtool-0.6.38/lib/rd/visitor.rb +86 -0
- data/vendor/rdtool-0.6.38/rdtool.gemspec +125 -0
- data/vendor/rdtool-0.6.38/setup.rb +1596 -0
- data/vendor/rdtool-0.6.38/test/data/includee1.html +1 -0
- data/vendor/rdtool-0.6.38/test/data/includee2.html +1 -0
- data/vendor/rdtool-0.6.38/test/data/includee3.nothtml +1 -0
- data/vendor/rdtool-0.6.38/test/data/includee4.xhtml +0 -0
- data/vendor/rdtool-0.6.38/test/data/label.rbl +2 -0
- data/vendor/rdtool-0.6.38/test/data/label2.rbl +2 -0
- data/vendor/rdtool-0.6.38/test/data/sub/includee2.html +1 -0
- data/vendor/rdtool-0.6.38/test/data/sub/includee4.html +0 -0
- data/vendor/rdtool-0.6.38/test/dummy-observer.rb +6 -0
- data/vendor/rdtool-0.6.38/test/dummy.rb +33 -0
- data/vendor/rdtool-0.6.38/test/temp-dir.rb +19 -0
- data/vendor/rdtool-0.6.38/test/test-block-parser.rb +46 -0
- data/vendor/rdtool-0.6.38/test/test-desclist-item.rb +219 -0
- data/vendor/rdtool-0.6.38/test/test-document-element.rb +46 -0
- data/vendor/rdtool-0.6.38/test/test-document-struct.rb +66 -0
- data/vendor/rdtool-0.6.38/test/test-element.rb +46 -0
- data/vendor/rdtool-0.6.38/test/test-headline.rb +80 -0
- data/vendor/rdtool-0.6.38/test/test-inline-parser.rb +46 -0
- data/vendor/rdtool-0.6.38/test/test-list-item.rb +54 -0
- data/vendor/rdtool-0.6.38/test/test-list.rb +53 -0
- data/vendor/rdtool-0.6.38/test/test-methodlist-item.rb +73 -0
- data/vendor/rdtool-0.6.38/test/test-nonterminal-element.rb +170 -0
- data/vendor/rdtool-0.6.38/test/test-nonterminal-inline.rb +33 -0
- data/vendor/rdtool-0.6.38/test/test-output-format-visitor.rb +48 -0
- data/vendor/rdtool-0.6.38/test/test-parser-util.rb +41 -0
- data/vendor/rdtool-0.6.38/test/test-rbl-file.rb +156 -0
- data/vendor/rdtool-0.6.38/test/test-rbl-suite.rb +43 -0
- data/vendor/rdtool-0.6.38/test/test-rd2html-lib.rb +496 -0
- data/vendor/rdtool-0.6.38/test/test-rdtree.rb +17 -0
- data/vendor/rdtool-0.6.38/test/test-rdvisitor.rb +29 -0
- data/vendor/rdtool-0.6.38/test/test-reference-resolver.rb +202 -0
- data/vendor/rdtool-0.6.38/test/test-reference.rb +132 -0
- data/vendor/rdtool-0.6.38/test/test-search-file.rb +22 -0
- data/vendor/rdtool-0.6.38/test/test-terminal-inline.rb +41 -0
- data/vendor/rdtool-0.6.38/test/test-textblock.rb +44 -0
- data/vendor/rdtool-0.6.38/test/test-tree.rb +82 -0
- data/vendor/rdtool-0.6.38/test/test-version.rb +57 -0
- data/vendor/rdtool-0.6.38/test/test-visitor.rb +230 -0
- data/vendor/rdtool-0.6.38/utils/rd-mode.el +464 -0
- 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:
|