tdiary 3.2.2.20130507

Sign up to get free protection for your applications and to get access to all the features.
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,256 @@
1
+ # -*- coding: utf-8 -*-
2
+ # calendar3.rb
3
+ #
4
+ # calendar3: 現在表示している月のカレンダーを表示します.
5
+ # パラメタ: なし
6
+ #
7
+ # tdiary.confで指定するオプション:
8
+ # @options['calendar3.show_todo']
9
+ # パラグラフのサブサイトルとここで指定した文字列が一致し
10
+ # かつその日の日記が非表示の場合,そのパラグラフの内容を
11
+ # 予定としてpopupする.
12
+ #
13
+ # @options['calendar3.show_popup']
14
+ # JavaScriptによるpopupを表示するかどうか.
15
+ # 省略時の値はtrueなので,表示したくない場合のみfalseを設定する.
16
+ #
17
+ # Copyright (c) 2001,2002 Junichiro KITA <kita@kitaj.no-ip.com>
18
+ # Distributed under the GPL
19
+ #
20
+ #
21
+ # sample CSS for calendar3
22
+ #
23
+ # .calendar-popup {
24
+ # display: none;
25
+ # text-align: left;
26
+ # position: absolute;
27
+ # border-style: solid;
28
+ # border-width: 1px;
29
+ # padding: 0 1ex 0 1ex;
30
+ # }
31
+ #
32
+ # .calendar-sunday {
33
+ # color: red;
34
+ # }
35
+ #
36
+ # .calendar-saturday {
37
+ # color: blue;
38
+ # }
39
+ #
40
+ # .calendar-weekday {
41
+ # color: black;
42
+ # }
43
+ #
44
+ # .calendar-normal {
45
+ # }
46
+ #
47
+ # .calendar-day {
48
+ # font-weight: bold;
49
+ # }
50
+ #
51
+ # .calendar-todo {
52
+ # border-style: solid;
53
+ # border-color: red;
54
+ # border-width: 1px;
55
+ # }
56
+ #
57
+ =begin ChengeLog
58
+ 2003-09-25 TADA Tadashi <sho@spc.gr.jp>
59
+ * use @conf.shorten.
60
+
61
+ 2003-03-25 Junichiro Kita <kita@kitaj.no-ip.com>
62
+ * add css to navigation links to next, current, prev month.
63
+
64
+ 2003-02-27 Junichiro Kita <kita@kitaj.no-ip.com>
65
+ * @options['calendar.show_popup']
66
+
67
+ 2003-01-07 Junichiro Kita <kita@kitaj.no-ip.com>
68
+ * append sample css
69
+
70
+ 2003-01-07 MURAI Kensou <murai@dosule.com>
71
+ * modify javascript for popdown-delay
72
+
73
+ 2002-12-20 TADA Tadashi <sho@spc.gr.jp>
74
+ * use Plugin#apply_plugin.
75
+ =end
76
+
77
+ module Calendar3
78
+ WEEKDAY = 0
79
+ SATURDAY = 1
80
+ SUNDAY = 2
81
+
82
+ STYLE = {
83
+ WEEKDAY => "calendar-weekday",
84
+ SATURDAY => "calendar-saturday",
85
+ SUNDAY => "calendar-sunday",
86
+ }
87
+
88
+ def make_cal(year, month)
89
+ result = []
90
+ 1.upto(31) do |i|
91
+ t = Time.local(year, month, i)
92
+ break if t.month != month
93
+ case t.wday
94
+ when 0
95
+ result << [i, SUNDAY]
96
+ when 1..5
97
+ result << [i, WEEKDAY]
98
+ when 6
99
+ result << [i, SATURDAY]
100
+ end
101
+ end
102
+ result
103
+ end
104
+
105
+ def prev_month(year, month)
106
+ if month == 1
107
+ year -= 1
108
+ month = 12
109
+ else
110
+ month -= 1
111
+ end
112
+ [year, month]
113
+ end
114
+
115
+ def next_month(year, month)
116
+ if month == 12
117
+ year += 1
118
+ month = 1
119
+ else
120
+ month += 1
121
+ end
122
+ [year, month]
123
+ end
124
+
125
+ module_function :make_cal, :next_month, :prev_month
126
+ end
127
+
128
+ def calendar3
129
+ return '' if bot?
130
+ show_todo = @options['calendar3.show_todo']
131
+ show_todo = Regexp.new(show_todo) if show_todo
132
+ result = ''
133
+ if @options.has_key? 'calendar3.erb'
134
+ result << %Q|<p class="message">@options['calendar3.erb'] is obsolete!<p>|
135
+ end
136
+
137
+ if /^(latest|search)$/ =~ @mode
138
+ date = Time.now
139
+ else
140
+ date = @date
141
+ end
142
+ year = date.year
143
+ month = date.month
144
+ day = date.day
145
+
146
+ result << %Q|<span class="calendar-prev-month"><a href="#{h @index}#{anchor "%04d%02d" % Calendar3.prev_month(year, month)}">&lt;&lt;</a></span>\n|
147
+ result << %Q|<span class="calendar-current-month"><a href="#{h @index}#{anchor "%04d%02d" % [year, month]}">#{"%04d/%02d" % [year, month]}</a>/</span>\n|
148
+ #Calendar3.make_cal(year, month)[(day - num >= 0 ? day - num : 0)..(day - 1)].each do |day, kind|
149
+ Calendar3.make_cal(year, month).each do |day, kind|
150
+ date = "%04d%02d%02d" % [year, month, day]
151
+ if @diaries[date].nil?
152
+ result << %Q|<span class="calendar-normal"><a class="#{Calendar3::STYLE[kind]}">#{day}</a></span>\n|
153
+ elsif !@diaries[date].visible?
154
+ todos = []
155
+ if show_todo
156
+ @diaries[date].each_section do |section|
157
+ if show_todo === section.subtitle
158
+ todos << h( section.body_to_html ).gsub( /\n/, "&#13;&#10;" )
159
+ end
160
+ end
161
+ end
162
+ if todos.size != 0
163
+ result << %Q|<span class="calendar-todo"><a class="#{Calendar3::STYLE[kind]}" title="#{day}日の予定:&#13;&#10;#{todos.join "&#13;&#10;"}">#{day}</a></span>\n|
164
+ else
165
+ result << %Q|<span class="calendar-normal"><a class="#{Calendar3::STYLE[kind]}">#{day}</a></span>\n|
166
+ end
167
+ else
168
+ if @calendar3_show_popup
169
+ result << %Q|<span class="calendar-day" id="target-#{day}" onmouseover="popup(document.getElementById('target-#{day}'),document.getElementById('popup-#{day}'), document.getElementById('title-#{day}'));" onmouseout="popdown(document.getElementById('popup-#{day}'));">\n|
170
+ else
171
+ result << %Q|<span class="calendar-day" id="target-#{day}">\n|
172
+ end
173
+ result << %Q| <a class="#{Calendar3::STYLE[kind]}" id="title-#{day}" title="|
174
+ i = 1
175
+ r = []
176
+ if !@plugin_files.grep(/\/category.rb$/).empty? and @diaries[date].categorizable?
177
+ @diaries[date].each_section do |section|
178
+ if section.stripped_subtitle
179
+ text = apply_plugin( section.stripped_subtitle_to_html, true )
180
+ r << %Q|#{i}. #{h text}|
181
+ end
182
+ i += 1
183
+ end
184
+ else
185
+ @diaries[date].each_section do |section|
186
+ if section.subtitle
187
+ text = apply_plugin( section.subtitle_to_html, true )
188
+ r << %Q|#{i}. #{h text}|
189
+ end
190
+ i += 1
191
+ end
192
+ end
193
+ result << r.join("&#13;&#10;")
194
+ result << %Q|" href="#{h @index}#{anchor date}">#{day}</a>\n|
195
+ if @calendar3_show_popup
196
+ result << %Q| <span class="calendar-popup" id="popup-#{day}">\n|
197
+ i = 1
198
+ if !@plugin_files.grep(/\/category.rb$/).empty? and @diaries[date].categorizable?
199
+ @diaries[date].each_section do |section|
200
+ if section.stripped_subtitle
201
+ text = apply_plugin( section.body_to_html, true )
202
+ subtitle = apply_plugin( section.stripped_subtitle_to_html )
203
+ result << %Q| <a href="#{h @index}#{anchor "%s#p%02d" % [date, i]}" title="#{h @conf.shorten( text )}">#{i}</a>. #{subtitle}<br>\n|
204
+ end
205
+ i += 1
206
+ end
207
+ else
208
+ @diaries[date].each_section do |section|
209
+ if section.subtitle
210
+ text = apply_plugin( section.body_to_html, true )
211
+ subtitle = apply_plugin( section.subtitle_to_html )
212
+ result << %Q| <a href="#{h @index}#{anchor "%s#p%02d" % [date, i]}" title="#{h @conf.shorten( text )}">#{i}</a>. #{subtitle}<br>\n|
213
+ end
214
+ i += 1
215
+ end
216
+ end
217
+ result << %Q| </span>\n|
218
+ end
219
+ result << %Q|</span>\n|
220
+ end
221
+ end
222
+ result << %Q|<span class="calendar-next-month"><a href="#{h @index}#{anchor "%04d%02d" % Calendar3.next_month(year, month)}">&gt;&gt;</a></span>\n|
223
+ result
224
+ end
225
+
226
+ @calendar3_show_popup = true
227
+ if @options.has_key?('calendar3.show_popup')
228
+ @calendar3_show_popup = @options['calendar3.show_popup']
229
+ end
230
+ if /w3m|MSIE.*Mac/ === @cgi.user_agent
231
+ @calendar3_show_popup = false
232
+ add_header_proc do
233
+ <<JAVASCRIPT
234
+ <script type="text/javascript">
235
+ <!--
236
+ function popup(target,element,notitle) {
237
+ }
238
+
239
+ function popdown(element) {
240
+ }
241
+ // -->
242
+ </script>
243
+ JAVASCRIPT
244
+ end
245
+ end
246
+ if @calendar3_show_popup
247
+ enable_js('calendar3.js')
248
+ end
249
+
250
+ # Local Variables:
251
+ # mode: ruby
252
+ # indent-tabs-mode: t
253
+ # tab-width: 3
254
+ # ruby-indent-level: 3
255
+ # End:
256
+ # vim: set ts=3:
@@ -0,0 +1,779 @@
1
+ # category.rb
2
+ #
3
+ # Copyright (c) 2003 Junichiro KITA <kita@kitaj.no-ip.com>
4
+ # Distributed under the GPL
5
+ #
6
+ require 'pstore'
7
+
8
+ #
9
+ # initialize
10
+ #
11
+ def category_init
12
+ @conf['category.header1'] ||= %Q[<div class="adminmenu">\n<p>\n<%= category_navi %>\n</p>\n</div>\n]
13
+ @conf['category.header2'] ||= %Q[<p>Categories |\n<%= category_list %>\n</p>\n]
14
+ @conf['category.edit_support'] = @conf['category.edit_support'].to_i rescue 1
15
+ end
16
+ category_init
17
+
18
+ def category_icon_location_init
19
+ @category_icon_dir = (@conf['category.icon_dir'] || './icons/').sub(%r|/*$|, '/')
20
+ @category_icon_url = (@conf['category.icon_url'] || './icons/').sub(%r|/*$|, '/')
21
+ end
22
+
23
+ def category_icon_init
24
+ category_icon_location_init
25
+ @conf['category.icon'] ||= ''
26
+
27
+ @category_icon = {}
28
+ @conf['category.icon'].split(/\n/).each do |l|
29
+ c, i = l.split
30
+ next if c.nil? or i.nil?
31
+ @category_icon[c] = i if File.exists?("#{@category_icon_dir}#{i}".untaint)
32
+ end
33
+ end
34
+ category_icon_init
35
+
36
+ #
37
+ # plugin methods
38
+ #
39
+ def category_form
40
+ # don't you need this method any more?
41
+ end
42
+
43
+ def category_anchor(category)
44
+ period = @conf['category.period'] || 'quarter'
45
+ period_string =
46
+ case period
47
+ when "month"
48
+ "year=#{@date.year};month=#{'%02d' % @date.month};"
49
+ when "quarter"
50
+ "year=#{@date.year};month=#{(@date.month - 1) / 3 + 1}Q;"
51
+ when "half"
52
+ "year=#{@date.year};month=#{(@date.month - 1) / 6 + 1}H;"
53
+ when "year"
54
+ "year=#{@date.year};"
55
+ else
56
+ ""
57
+ end
58
+ if @category_icon[category] and !@cgi.mobile_agent?
59
+ %Q|<a href="#{h @index}?#{period_string}category=#{u category}" title="#{h category}"><img class="category" src="#{h @category_icon_url}#{h @category_icon[category]}" alt="#{h category}"></a>|
60
+ else
61
+ %Q|[<a href="#{h @index}?#{period_string}category=#{u category}" title="#{h category}">#{h category}</a>]|
62
+ end
63
+ end
64
+
65
+ def category_navi_anchor(info, label, mobile = false)
66
+ if mobile then
67
+ "|#{info.make_anchor(label)}"
68
+ else
69
+ ((!label.nil?) && label.empty?) ? '' : %Q[<span class="adminmenu">#{info.make_anchor(label)}</span>\n]
70
+ end
71
+ end
72
+
73
+ def category_navi
74
+ mobile = @cgi.mobile_agent?
75
+ info = Category::Info.new(@cgi, @years, @conf)
76
+ mode = info.mode
77
+
78
+ result = ''
79
+ case mode
80
+ when :year, :half, :quarter, :month
81
+ all_diary = Category::Info.new(@cgi, @years, @conf, :year => -1, :month => -1)
82
+ all = Category::Info.new(@cgi, @years, @conf, :category => ['ALL'], :year => -1, :month => -1)
83
+ result << category_navi_anchor(info.prev, @conf['category.prev_' + mode.to_s], mobile)
84
+ result << category_navi_anchor(info.next, @conf['category.next_' + mode.to_s], mobile)
85
+ unless mobile then
86
+ result << category_navi_anchor(all_diary, @conf['category.all_diary'])
87
+ result << category_navi_anchor(all, @conf['category.all'])
88
+ end
89
+ when :all
90
+ year = Category::Info.new(@cgi, @years, @conf, :year => Time.now.year.to_s)
91
+ half = Category::Info.new(@cgi, @years, @conf, :year => Time.now.year.to_s, :month => "#{((Time.now.month - 1) / 6 + 1)}H")
92
+ quarter = Category::Info.new(@cgi, @years, @conf, :year => Time.now.year.to_s, :month => "#{((Time.now.month - 1) / 3 + 1)}Q")
93
+ month = Category::Info.new(@cgi, @years, @conf, :year => Time.now.year.to_s, :month => '%02d' % Time.now.month)
94
+ result << category_navi_anchor(year, @conf['category.this_year'], mobile)
95
+ result << category_navi_anchor(half, @conf['category.this_half'], mobile)
96
+ result << category_navi_anchor(quarter, @conf['category.this_quarter'], mobile)
97
+ result << category_navi_anchor(month, @conf['category.this_month'], mobile)
98
+ end
99
+ if !info.category.include?('ALL') and !mobile then
100
+ all_category = Category::Info.new(@cgi, @years, @conf, :category => ['ALL'])
101
+ result << category_navi_anchor(all_category, @conf['category.all_category'])
102
+ end
103
+ result
104
+ end
105
+
106
+ def category_list_sections
107
+ info = Category::Info.new(@cgi, @years, @conf)
108
+ category = info.category
109
+ years = info.years
110
+ r = ''
111
+
112
+ raise ::TDiary::NotFound if @categorized.empty? and bot?
113
+
114
+ @categorized.to_a.sort_by{|e| e[0].downcase}.each do |c, v|
115
+ info.category = [c]
116
+ if @category_icon[c]
117
+ img = %Q|<img class="category" src="#{h @category_icon_url}#{h @category_icon[c]}" alt="#{h c}">|
118
+ else
119
+ img = ''
120
+ end
121
+ r << <<HTML
122
+ <div class="category day">
123
+ <h2><span class="title">#{img}#{info.make_anchor}</span></h2>
124
+ <div class="body">
125
+ <ul class="category">
126
+ HTML
127
+ v.to_a.sort_by{|e| e[0]}.each do |ymd, ary|
128
+ text = Time.local(ymd[0,4], ymd[4,2], ymd[6,2]).strftime(@conf.date_format)
129
+ ary.sort.each do |idx, title, excerpt|
130
+ r << %Q|\t\t\t<li><a href="#{h @index}#{anchor "#{ymd}#p#{'%02d' % idx}"}" title="#{h excerpt}">#{text}#p#{'%02d' % idx}</a> #{apply_plugin(title)}</li>\n|
131
+ end
132
+ end
133
+ r << <<HTML
134
+ </ul>
135
+ </div>
136
+ </div>
137
+ HTML
138
+ end
139
+ r
140
+ end
141
+
142
+ def category_list_sections_mobile
143
+ info = Category::Info.new(@cgi, @years, @conf)
144
+ category = info.category
145
+ years = info.years
146
+ r = ''
147
+
148
+ raise ::TDiary::NotFound if @categorized.empty? and bot?
149
+
150
+ @categorized.to_a.sort_by{|e| e[0].downcase}.each do |c, v|
151
+ info.category = [c]
152
+ r << "<H2>#{info.make_anchor}</H2>"
153
+ r << "<UL>"
154
+ v.to_a.sort_by{|e| e[0]}.each do |ymd, ary|
155
+ text = Time.local(ymd[0,4], ymd[4,2], ymd[6,2]).strftime(@conf.date_format)
156
+ ary.sort.each do |idx, title, excerpt|
157
+ r << %Q|<LI><A HREF="#{h @index}#{anchor "#{ymd}#p#{'%02d' % idx}"}">#{text}#p#{'%02d' % idx}</A> #{apply_plugin(title)}</LI>\n|
158
+ end
159
+ end
160
+ r << "</UL>"
161
+ end
162
+ r
163
+ end
164
+
165
+ def category_list
166
+ info = Category::Info.new(@cgi, @years, @conf)
167
+ @categories.map do |c|
168
+ info.category = [c]
169
+ info.make_anchor
170
+ end.join(" | \n")
171
+ end
172
+
173
+ def category_dropdown_list(label = nil, multiple = nil)
174
+ label ||= 'Categorize!'
175
+ multiple ||= false
176
+
177
+ info = Category::Info.new(@cgi, @years, @conf)
178
+ category = info.category
179
+ if category.empty?
180
+ return '' if @cgi.mobile_agent?
181
+ category = ['ALL']
182
+ end
183
+
184
+ options = ''
185
+ (['ALL'] + @categories.sort_by{|e| e.downcase}).each do |c|
186
+ options << %Q|\t\t<option value="#{h c}"#{" selected" if category.include?(c)}>#{h c}</option>\n|
187
+ end
188
+
189
+ params = ''
190
+ params << %Q[<input type="hidden" name="year" value="#{h info.year}">] if info.year
191
+ params << %Q[<input type="hidden" name="month" value="#{h info.month}">] if info.month
192
+
193
+ <<HTML
194
+ <form method="get" action="#{h @index}"><div>
195
+ <select name="category"#{" multiple" if multiple}>
196
+ #{options}
197
+ </select>
198
+ #{params}
199
+ <input type="submit" value="#{label}">
200
+ </div></form>
201
+ HTML
202
+ end
203
+
204
+
205
+ #
206
+ # misc
207
+ #
208
+
209
+ def category_icon_save
210
+ @conf['category.icon'] = @category_icon.map {|c, i| "#{c} #{i}"}.join("\n")
211
+ end
212
+
213
+
214
+ module Category
215
+
216
+ #
217
+ # CGI (mock-up CGI class for Cache::recreate)
218
+ #
219
+ class CGI
220
+ attr_reader :params
221
+ def initialize
222
+ @params = Hash.new([])
223
+ end
224
+ def referer; nil; end
225
+ def user_agent; nil; end
226
+ def request_method; 'GET'; end
227
+ end
228
+
229
+ #
230
+ # Info
231
+ #
232
+ class Info
233
+ include ERB::Util
234
+
235
+ def initialize(cgi, years, conf, args = {})
236
+ @cgi = cgi
237
+ @years = years
238
+ @conf = conf
239
+ @category = args[:category] || @cgi.params['category'].map do |c|
240
+ @conf.to_native(c, @conf.encoding_old)
241
+ end
242
+ @year = args[:year] || @cgi.params['year'][0]
243
+ @month = args[:month] || @cgi.params['month'][0]
244
+ @mode = :all
245
+ set_mode
246
+ end
247
+
248
+ protected
249
+ attr_writer :year
250
+ attr_writer :month
251
+ public
252
+ attr :category, true
253
+ attr_reader :year
254
+ attr_reader :month
255
+ attr_reader :mode
256
+
257
+ def prev
258
+ pp = self.dup
259
+
260
+ case mode
261
+ when :half
262
+ h = @month.to_i
263
+ if h == 1
264
+ pp.month = "2H"
265
+ pp.year = (@year.to_i - 1).to_s if @year
266
+ else
267
+ pp.month = "1H"
268
+ end
269
+ when :quarter
270
+ q = @month.to_i
271
+ if q == 1
272
+ pp.month = "4Q"
273
+ pp.year = (@year.to_i - 1).to_s if @year
274
+ else
275
+ pp.month = "#{q - 1}Q"
276
+ end
277
+ when :month
278
+ m = @month.to_i
279
+ if m == 1
280
+ pp.month = "12"
281
+ pp.year = (@year.to_i - 1).to_s if @year
282
+ else
283
+ pp.month = '%02d' % (m - 1)
284
+ end
285
+ when :year
286
+ pp.year = (@year.to_i - 1).to_s
287
+ end
288
+ pp
289
+ end
290
+
291
+ def next
292
+ pp = self.dup
293
+
294
+ case mode
295
+ when :half
296
+ h = @month.to_i
297
+ if h == 2
298
+ pp.month = "1H"
299
+ pp.year = (@year.to_i + 1).to_s if @year
300
+ else
301
+ pp.month = "2H"
302
+ end
303
+ when :quarter
304
+ q = @month.to_i
305
+ if q == 4
306
+ pp.month = "1Q"
307
+ pp.year = (@year.to_i + 1).to_s if @year
308
+ else
309
+ pp.month = "#{q + 1}Q"
310
+ end
311
+ when :month
312
+ m = @month.to_i
313
+ if m == 12
314
+ pp.month = "01"
315
+ pp.year = (@year.to_i + 1).to_s if @year
316
+ else
317
+ pp.month = '%02d' % (m + 1)
318
+ end
319
+ when :year
320
+ pp.year = (@year.to_i + 1).to_s
321
+ end
322
+ pp
323
+ end
324
+
325
+ def make_anchor(label = nil)
326
+ a = @category.map {|c| "category=#{u c}"}.join(';')
327
+ a << ";year=#{@year}" if @year
328
+ a << ";month=#{@month}" if @month
329
+ if label
330
+ case mode
331
+ when :year
332
+ label = label.gsub(/\$1/, @year)
333
+ when :month, :quarter, :half
334
+ label = label.gsub(/\$2/, @month)
335
+ label = label.gsub(/\$1/, @year || '*')
336
+ end
337
+ else
338
+ label = @category.to_a.join(':')
339
+ end
340
+ %Q|<a href="#{h @conf.index}?#{h a}">#{h label}</a>|
341
+ end
342
+
343
+ #
344
+ # return ym_spec
345
+ #
346
+ # {"yyyy" => ["mm", ...], ...}
347
+ #
348
+ # date spec:
349
+ # (1) none -> all diary
350
+ # (2) month=xH -> all diary in xH of all year
351
+ # (3) year=YYYY;month=xH -> all diary in YYYY/xH
352
+ # (4) month=xQ -> all diary in xQ of all year
353
+ # (5) year=YYYY;month=xQ -> all diary in YYYY/xQ
354
+ # (6) month=MM -> all diary in MM of all year
355
+ # (7) year=YYYY;month=MM -> all diary in YYYY/MM
356
+ # (8) year=YYYY -> all diary in YYYY
357
+ #
358
+ def years
359
+ if @mode == :all
360
+ return @years
361
+ end
362
+
363
+ months = case @mode
364
+ when :half
365
+ [('01'..'06'), ('07'..'12')][@month.to_i - 1].to_a
366
+ when :quarter
367
+ [['01', '02', '03'], ['04', '05', '06'], ['07', '08', '09'], ['10', '11', '12']][@month.to_i - 1]
368
+ when :month
369
+ [@month]
370
+ else
371
+ ('01'..'12').to_a
372
+ end
373
+
374
+ r = {}
375
+ (@year ? [@year] : @years.keys).each do |y|
376
+ r[y] = months
377
+ end
378
+ r
379
+ end
380
+
381
+ #
382
+ # date spec:
383
+ # (1) none -> all
384
+ # (2) month=xH -> half
385
+ # (3) year=YYYY;month=xH -> half
386
+ # (4) month=xQ -> quarter
387
+ # (5) year=YYYY;month=xQ -> quarter
388
+ # (6) month=MM -> month
389
+ # (7) year=YYYY;month=MM -> month
390
+ # (8) year=YYYY -> year
391
+ #
392
+ def set_mode
393
+ if @year.nil? and @month.nil?
394
+ @mode = :all
395
+ end
396
+
397
+ if /\d{4}/ === @year.to_s
398
+ @mode = :year
399
+ else
400
+ @year = nil
401
+ end
402
+
403
+ if /[12]H/ === @month.to_s
404
+ @mode = :half
405
+ elsif /[1-4]Q/ === @month.to_s
406
+ @mode = :quarter
407
+ elsif (1..12).include?(@month.to_i)
408
+ @mode = :month
409
+ else
410
+ @month = nil
411
+ end
412
+
413
+ end
414
+ end
415
+
416
+ #
417
+ # Cache
418
+ #
419
+ class Cache
420
+ include ERB::Util
421
+
422
+ def initialize(conf, bind)
423
+ @conf = conf
424
+ @binding = bind # ...... very ugly
425
+ @dir = "#{conf.data_path}/category"
426
+ Dir.mkdir(@dir) unless File.exist?(@dir)
427
+ end
428
+
429
+ def add_categories(list)
430
+ return if list.nil? or list.empty?
431
+ replace_categories(restore_categories + list)
432
+ end
433
+
434
+ def replace_categories(list)
435
+ PStore.new(cache_file).transaction do |db|
436
+ db['category'] = list.sort.uniq
437
+ end
438
+ end
439
+
440
+ #
441
+ # restore category names
442
+ # ["category1", "category2", ...]
443
+ #
444
+ def restore_categories
445
+ list = nil
446
+ PStore.new(cache_file).transaction do |db|
447
+ list = db['category'] if db.root?('category')
448
+ db.abort
449
+ end
450
+ list || []
451
+ end
452
+
453
+ #
454
+ # cache each section of diary
455
+ # used in update_proc
456
+ #
457
+ def replace_sections(diary)
458
+ return if diary.nil? or !diary.categorizable?
459
+
460
+ categorized = categorize_diary(diary)
461
+ categories = restore_categories
462
+ deleted = []
463
+ ymd = diary.date.strftime('%Y%m%d')
464
+
465
+ categories.each do |c|
466
+ PStore.new(cache_file(c)).transaction do |db|
467
+ db['category'] = {} unless db.root?('category')
468
+ if diary.visible? and categorized[c]
469
+ db['category'].update(categorized[c])
470
+ else
471
+ # diary is invisible or sections of this category is deleted
472
+ db['category'].delete(ymd)
473
+ deleted << c if db['category'].empty?
474
+ end
475
+ end
476
+ end
477
+
478
+ if !deleted.empty?
479
+ deleted.each do |c|
480
+ File.unlink(cache_file(c))
481
+ end
482
+ replace_categories(categories - deleted)
483
+ end
484
+ end
485
+
486
+ #
487
+ # (re)create category cache
488
+ #
489
+ def recreate(years)
490
+ cgi = Category::CGI::new
491
+
492
+ list = []
493
+ years.each do |y, ms|
494
+ ms.each do |m|
495
+ ym = "#{y}#{m}"
496
+ cgi.params['date'] = [ym]
497
+ m = TDiaryMonth.new(cgi, '', @conf)
498
+ sections = {}
499
+ m.diaries.each do |ymd, diary|
500
+ next if !diary.visible?
501
+ initial_replace_sections(diary)
502
+ diary.each_section do |s|
503
+ list |= s.categories unless s.categories.empty?
504
+ end
505
+ end
506
+ end
507
+ end
508
+
509
+ replace_categories(list)
510
+ end
511
+
512
+ #
513
+ # categorize sections of category of years
514
+ #
515
+ # {"category" => {"yyyymmdd" => [[idx, title, excerpt], ...], ...}, ...}
516
+ #
517
+ def categorize(category, years)
518
+ categories = category - ['ALL']
519
+ if categories.empty?
520
+ categories = restore_categories
521
+ else
522
+ categories &= restore_categories
523
+ end
524
+
525
+ categorized = {}
526
+ begin
527
+ categorized.clear
528
+ categories.each do |c|
529
+ PStore.new(cache_file(c)).transaction do |db|
530
+ categorized[c] = db['category']
531
+ db.abort
532
+ end
533
+ categorized[c].keys.each do |ymd|
534
+ y, m = ymd[0,4], ymd[4,2]
535
+ if years[y].nil? or !years[y].include?(m)
536
+ categorized[c].delete(ymd)
537
+ end
538
+ end
539
+ categorized.delete(c) if categorized[c].empty?
540
+ end
541
+ rescue NoMethodError # when categorized[c] is nil
542
+ recreate(years)
543
+ retry
544
+ end
545
+
546
+ categorized
547
+ end
548
+
549
+ private
550
+ def cache_file(category = nil)
551
+ if category
552
+ "#{@dir}/#{u( category ).gsub(/%20/,'+')}".untaint
553
+ else
554
+ "#{@dir}/category_list"
555
+ end
556
+ end
557
+
558
+ #
559
+ # categorize sections of diary
560
+ #
561
+ # {"category" => {"yyyymmdd" => [[idx, title, excerpt], ...]}}
562
+ #
563
+ def categorize_diary(diary)
564
+ categorized = {}
565
+ ymd = diary.date.strftime('%Y%m%d')
566
+
567
+ idx = 1
568
+ diary.each_section do |s|
569
+ s.categories.each do |c|
570
+ categorized[c] = {} if categorized[c].nil?
571
+ categorized[c][ymd] = [] if categorized[c][ymd].nil?
572
+ body = <<EVAL
573
+ text = apply_plugin(<<'BODY', true)
574
+ #{s.body_to_html}
575
+ BODY
576
+ EVAL
577
+ shorten = begin
578
+ @conf.shorten(eval(body.untaint, @binding))
579
+ rescue NameError
580
+ ""
581
+ end
582
+ categorized[c][ymd] << [idx, s.stripped_subtitle_to_html, shorten]
583
+ end
584
+ idx +=1
585
+ end
586
+
587
+ categorized
588
+ end
589
+
590
+ #
591
+ # cache each section of diary
592
+ # used in recreate
593
+ #
594
+ def initial_replace_sections(diary)
595
+ return if diary.nil? or !diary.visible? or !diary.categorizable?
596
+
597
+ categorized = categorize_diary(diary)
598
+ categorized.keys.each do |c|
599
+ PStore.new(cache_file(c)).transaction do |db|
600
+ db['category'] = {} unless db.root?('category')
601
+ db['category'].update(categorized[c])
602
+ end
603
+ end
604
+ end
605
+ end
606
+
607
+ end # module Category
608
+
609
+ # read cache here so that you can use category with secure mode.
610
+ @category_cache = Category::Cache.new(@conf, binding)
611
+
612
+ #
613
+ # display categories on update form
614
+ #
615
+ def category_edit_support_flatlist
616
+ ret = ''
617
+ ret << '<div class="field title">'
618
+ ret << "#{@category_conf_label}:\n"
619
+ @categories.sort_by{|e| e.downcase}.each do |c|
620
+ ret << %Q!| <span class="category-item">#{h c}</span>\n!
621
+ end
622
+ ret << "|\n</div>\n<br>\n"
623
+ ret
624
+ end
625
+
626
+ def category_edit_support_dropdown
627
+ ret = ''
628
+ ret << '<div class="field title">'
629
+ ret << %Q|#{@category_conf_label}: <select id="category-candidate" name="category-candidate">\n|
630
+ @categories.sort_by{|e| e.downcase}.each do |c|
631
+ ret << %Q!<option>#{h c}</option>\n!
632
+ end
633
+ ret << "|\n</select>\n</div>\n<br>\n"
634
+ ret
635
+ end
636
+
637
+ if @conf['category.edit_support'] != 0 then
638
+ enable_js( 'category.js' )
639
+ add_edit_proc do |date|
640
+ ret = ''
641
+ unless @categories.size == 0 then
642
+ ret << if @conf['category.edit_support'] == 2 then
643
+ category_edit_support_dropdown
644
+ else
645
+ category_edit_support_flatlist
646
+ end
647
+ end
648
+ end
649
+ end
650
+
651
+
652
+ #
653
+ # when update diary, update cache
654
+ #
655
+ add_update_proc do
656
+ if /^(append|replace)$/ =~ @mode
657
+ cache = @category_cache
658
+ list = []
659
+ diary = @diaries[@date.strftime('%Y%m%d')]
660
+ diary.each_section do |s|
661
+ list |= s.categories
662
+ end
663
+ cache.add_categories(list)
664
+ cache.replace_sections(diary)
665
+ end
666
+ end
667
+
668
+
669
+ #
670
+ # configuration
671
+ #
672
+ def category_icon_find_icons
673
+ return if @category_all_icon
674
+ @category_all_icon = []
675
+ %w(png jpg gif bmp).each do |e|
676
+ @category_all_icon += Dir.glob("#{@category_icon_dir}*.#{e}".untaint).map {|i| File.basename(i)}
677
+ end
678
+ @category_all_icon.sort!
679
+ end
680
+
681
+ def category_icon_select(category)
682
+ options = %Q|<\t<option value="none">#{@category_icon_none_label}</option>\n|
683
+ @category_all_icon.each do |i|
684
+ options << %Q|\t<option value="#{h i}"#{" selected" if @category_icon[category] == i}>#{h i}</option>\n|
685
+ end
686
+ <<HTML
687
+ <select name="category.icon.#{h category}">
688
+ #{options}
689
+ </select>
690
+ HTML
691
+ end
692
+
693
+ def category_icon_sample
694
+ @category_all_icon.map do |i|
695
+ %Q|<img src="#{h @category_icon_url}#{h i}" alt="#{h i}" title="#{h i}">\n|
696
+ end.join("/\n")
697
+ end
698
+
699
+ if @mode == 'conf' || @mode == 'saveconf'
700
+ add_conf_proc( 'category', @category_conf_label, 'basic' ) do
701
+ cache = @category_cache
702
+ if @mode == 'saveconf'
703
+ if @cgi.valid?( 'category_initialize' )
704
+ @category_cache.recreate(@years)
705
+ end
706
+
707
+ [
708
+ 'category.header1',
709
+ 'category.header2',
710
+ ].each do |name|
711
+ @conf[name] = @conf.to_native( @cgi.params[name][0] )
712
+ end
713
+ [
714
+ 'category.prev_year',
715
+ 'category.next_year',
716
+ 'category.prev_half',
717
+ 'category.next_half',
718
+ 'category.prev_quarter',
719
+ 'category.next_quarter',
720
+ 'category.prev_month',
721
+ 'category.next_month',
722
+ 'category.this_year',
723
+ 'category.this_half',
724
+ 'category.this_quarter',
725
+ 'category.this_month',
726
+ 'category.all_diary',
727
+ 'category.all_category',
728
+ 'category.all',
729
+ ].each do |name|
730
+ @conf[name] = @conf.to_native( @cgi.params[name][0] )
731
+ end
732
+ if ["month", "quarter", "half", "year", "all"].index(@cgi.params["category.period"][0])
733
+ @conf["category.period"] = @cgi.params["category.period"][0]
734
+ end
735
+ @conf['category.edit_support'] = (@cgi.params['category.edit_support'][0] || '1').to_i
736
+ end
737
+ category_conf_html
738
+ end
739
+
740
+ category_icon_find_icons if @cgi.params['conf'][0] == 'category_icon'
741
+ add_conf_proc( 'category_icon', @category_icon_conf_label, 'basic' ) do
742
+ if @mode == 'saveconf'
743
+ unless @conf.secure
744
+ [
745
+ 'category.icon_dir',
746
+ 'category.icon_url',
747
+ ].each do |name|
748
+ @conf[name] = @cgi.params[name][0].sub(%r|/*$|, '/')
749
+ end
750
+ category_icon_location_init
751
+ end
752
+ @cgi.params.keys.each do |key|
753
+ next unless /\Acategory\.icon\..*\z/ === key
754
+ category = key.sub(/\Acategory\.icon\./, '')
755
+ if @cgi.params[key][0] == 'none'
756
+ @category_icon.delete(category)
757
+ else
758
+ @category_icon[category] = @cgi.params[key][0]
759
+ end
760
+ end
761
+ category_icon_save
762
+ end
763
+ category_icon_conf_html
764
+ end
765
+ end
766
+
767
+ @categories = @category_cache.restore_categories
768
+ if @mode == 'categoryview'
769
+ info = Category::Info.new(@cgi, @years, @conf)
770
+ @categorized = @category_cache.categorize(info.category, info.years)
771
+ end
772
+
773
+ # Local Variables:
774
+ # mode: ruby
775
+ # indent-tabs-mode: t
776
+ # tab-width: 3
777
+ # ruby-indent-level: 3
778
+ # End:
779
+ # vim: ts=3