tdiary 3.2.2.20130507

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (509) hide show
  1. checksums.yaml +7 -0
  2. data/.coveralls.yml +1 -0
  3. data/.gitignore +16 -0
  4. data/.travis.yml +29 -0
  5. data/Capfile +2 -0
  6. data/ChangeLog +3173 -0
  7. data/Gemfile +58 -0
  8. data/Gemfile.lock +201 -0
  9. data/LICENSE +340 -0
  10. data/Procfile +1 -0
  11. data/README.md +33 -0
  12. data/Rakefile +26 -0
  13. data/bin/tdiary +7 -0
  14. data/config.ru +61 -0
  15. data/data/.htaccess +2 -0
  16. data/doc/HOWTO-authenticate-in-rack.md +89 -0
  17. data/doc/HOWTO-make-io.md +305 -0
  18. data/doc/HOWTO-make-plugin.md +279 -0
  19. data/doc/HOWTO-make-theme.md +67 -0
  20. data/doc/HOWTO-testing-tDiary.md +44 -0
  21. data/doc/HOWTO-use-plugin.md +148 -0
  22. data/doc/HOWTO-write-tDiary.en.md +131 -0
  23. data/doc/HOWTO-write-tDiary.md +136 -0
  24. data/doc/INSTALL-paas.md +202 -0
  25. data/doc/INSTALL.md +160 -0
  26. data/doc/README.en.md +174 -0
  27. data/doc/README.md +56 -0
  28. data/doc/UPGRADE.md +164 -0
  29. data/doc/doc.css +115 -0
  30. data/dot.htaccess +27 -0
  31. data/index.fcgi +45 -0
  32. data/index.rb +57 -0
  33. data/js/00default.js +60 -0
  34. data/js/01conf.js +62 -0
  35. data/js/02edit.coffee +5 -0
  36. data/js/02edit.js +15 -0
  37. data/js/amazon.js +43 -0
  38. data/js/calendar3.js +130 -0
  39. data/js/caretposition.js +170 -0
  40. data/js/category.js +29 -0
  41. data/js/category_autocomplete.js +96 -0
  42. data/js/comment_ajax.js +27 -0
  43. data/js/draft.js +149 -0
  44. data/js/highlight.js +36 -0
  45. data/js/image.js +181 -0
  46. data/misc/convert2.rb +123 -0
  47. data/misc/filter/antispamservice.rb +101 -0
  48. data/misc/filter/limitdays.rb +40 -0
  49. data/misc/filter/linkcheck.rb +81 -0
  50. data/misc/filter/plugin/antispamservice.rb +82 -0
  51. data/misc/filter/plugin/en/antispamservice.rb +21 -0
  52. data/misc/filter/plugin/ja/antispamservice.rb +20 -0
  53. data/misc/lib/README +4 -0
  54. data/misc/lib/compatible.rb +1 -0
  55. data/misc/lib/fcgi_patch.rb +90 -0
  56. data/misc/migrate.rb +157 -0
  57. data/misc/paas/cloudfoundry/Gemfile +26 -0
  58. data/misc/paas/cloudfoundry/Gemfile.lock +85 -0
  59. data/misc/paas/heroku/Gemfile +22 -0
  60. data/misc/paas/heroku/Gemfile.lock +85 -0
  61. data/misc/paas/sqale/Gemfile +19 -0
  62. data/misc/paas/sqale/Gemfile.lock +85 -0
  63. data/misc/paas/sqale/Procfile +1 -0
  64. data/misc/paas/sqale/dot.env +1 -0
  65. data/misc/plugin/ChangeLog.DO_NOT_UPDATE +2333 -0
  66. data/misc/plugin/a.rb +211 -0
  67. data/misc/plugin/amazon.rb +403 -0
  68. data/misc/plugin/amazon/README.en +17 -0
  69. data/misc/plugin/amazon/README.ja +29 -0
  70. data/misc/plugin/amazon/amazonimg.rb +113 -0
  71. data/misc/plugin/amazon/large.png +0 -0
  72. data/misc/plugin/amazon/medium.png +0 -0
  73. data/misc/plugin/amazon/small.png +0 -0
  74. data/misc/plugin/append-css.rb +51 -0
  75. data/misc/plugin/bq.rb +48 -0
  76. data/misc/plugin/calendar2.rb +184 -0
  77. data/misc/plugin/calendar3.rb +256 -0
  78. data/misc/plugin/category.rb +779 -0
  79. data/misc/plugin/category_autocomplete.rb +33 -0
  80. data/misc/plugin/comment_ajax.rb +11 -0
  81. data/misc/plugin/comment_mail-qmail.rb +57 -0
  82. data/misc/plugin/comment_mail-sendmail.rb +56 -0
  83. data/misc/plugin/comment_mail-smtp.rb +59 -0
  84. data/misc/plugin/comment_rank.rb +36 -0
  85. data/misc/plugin/counter.rb +631 -0
  86. data/misc/plugin/daily_theme.rb +55 -0
  87. data/misc/plugin/disp_referrer.rb +1486 -0
  88. data/misc/plugin/doctype-html401tr.rb +16 -0
  89. data/misc/plugin/draft.rb +20 -0
  90. data/misc/plugin/dropdown_calendar.rb +32 -0
  91. data/misc/plugin/edit_today.rb +50 -0
  92. data/misc/plugin/en/a.rb +10 -0
  93. data/misc/plugin/en/amazon.rb +71 -0
  94. data/misc/plugin/en/append-css.rb +17 -0
  95. data/misc/plugin/en/bq.rb +12 -0
  96. data/misc/plugin/en/calendar2.rb +12 -0
  97. data/misc/plugin/en/category.rb +204 -0
  98. data/misc/plugin/en/counter.rb +48 -0
  99. data/misc/plugin/en/daily_theme.rb +14 -0
  100. data/misc/plugin/en/disp_referrer.rb +387 -0
  101. data/misc/plugin/en/dropdown_calendar.rb +14 -0
  102. data/misc/plugin/en/edit_today.rb +22 -0
  103. data/misc/plugin/en/hide-mail-field.rb +19 -0
  104. data/misc/plugin/en/highlight.rb +29 -0
  105. data/misc/plugin/en/image.rb +54 -0
  106. data/misc/plugin/en/kw.rb +22 -0
  107. data/misc/plugin/en/makerss.rb +47 -0
  108. data/misc/plugin/en/pb-show.rb +21 -0
  109. data/misc/plugin/en/ping.rb +16 -0
  110. data/misc/plugin/en/recent_comment.rb +44 -0
  111. data/misc/plugin/en/recent_comment3.rb +56 -0
  112. data/misc/plugin/en/recent_rss.rb +33 -0
  113. data/misc/plugin/en/referer_scheme.rb +48 -0
  114. data/misc/plugin/en/search_control.rb +74 -0
  115. data/misc/plugin/en/search_form.rb +22 -0
  116. data/misc/plugin/en/speed_comment.rb +19 -0
  117. data/misc/plugin/en/tb-show.rb +37 -0
  118. data/misc/plugin/en/todo.rb +43 -0
  119. data/misc/plugin/en/weather.rb +185 -0
  120. data/misc/plugin/en/xmlrpc.rb +14 -0
  121. data/misc/plugin/footnote.rb +92 -0
  122. data/misc/plugin/gradation.rb +39 -0
  123. data/misc/plugin/gradient.rb +36 -0
  124. data/misc/plugin/hide-mail-field.rb +50 -0
  125. data/misc/plugin/highlight.rb +22 -0
  126. data/misc/plugin/html_anchor.rb +34 -0
  127. data/misc/plugin/image.rb +290 -0
  128. data/misc/plugin/ja/amazon.rb +89 -0
  129. data/misc/plugin/ja/bq.rb +13 -0
  130. data/misc/plugin/ja/calendar2.rb +12 -0
  131. data/misc/plugin/ja/category.rb +212 -0
  132. data/misc/plugin/ja/daily_theme.rb +15 -0
  133. data/misc/plugin/ja/disp_referrer.rb +644 -0
  134. data/misc/plugin/ja/edit_today.rb +23 -0
  135. data/misc/plugin/ja/hide-mail-field.rb +20 -0
  136. data/misc/plugin/ja/highlight.rb +30 -0
  137. data/misc/plugin/ja/makerss.rb +44 -0
  138. data/misc/plugin/ja/my-sequel.rb +52 -0
  139. data/misc/plugin/ja/pb-show.rb +23 -0
  140. data/misc/plugin/ja/ping.rb +17 -0
  141. data/misc/plugin/ja/recent_comment.rb +45 -0
  142. data/misc/plugin/ja/recent_comment3.rb +57 -0
  143. data/misc/plugin/ja/recent_rss.rb +34 -0
  144. data/misc/plugin/ja/referer_scheme.rb +86 -0
  145. data/misc/plugin/ja/search_control.rb +75 -0
  146. data/misc/plugin/ja/search_form.rb +32 -0
  147. data/misc/plugin/ja/tb-show.rb +38 -0
  148. data/misc/plugin/ja/todo.rb +46 -0
  149. data/misc/plugin/ja/weather.rb +402 -0
  150. data/misc/plugin/ja/xmlrpc.rb +15 -0
  151. data/misc/plugin/kw.rb +150 -0
  152. data/misc/plugin/list.rb +40 -0
  153. data/misc/plugin/makelirs.rb +89 -0
  154. data/misc/plugin/makerss.rb +744 -0
  155. data/misc/plugin/my-ex.rb +68 -0
  156. data/misc/plugin/my-sequel.rb +539 -0
  157. data/misc/plugin/navi_user.rb +19 -0
  158. data/misc/plugin/number_anchor.rb +47 -0
  159. data/misc/plugin/pb-show.rb +165 -0
  160. data/misc/plugin/ping.rb +99 -0
  161. data/misc/plugin/pre_wrap.rb +19 -0
  162. data/misc/plugin/random_google.rb +165 -0
  163. data/misc/plugin/recent_comment.rb +82 -0
  164. data/misc/plugin/recent_comment3.rb +192 -0
  165. data/misc/plugin/recent_list.rb +91 -0
  166. data/misc/plugin/recent_namazu.rb +50 -0
  167. data/misc/plugin/recent_rss.rb +305 -0
  168. data/misc/plugin/referer-antibot.rb +53 -0
  169. data/misc/plugin/referer-utf8.rb +12 -0
  170. data/misc/plugin/referer_scheme.rb +87 -0
  171. data/misc/plugin/search_control.rb +227 -0
  172. data/misc/plugin/search_form.rb +53 -0
  173. data/misc/plugin/sn.rb +107 -0
  174. data/misc/plugin/speed_comment.rb +68 -0
  175. data/misc/plugin/squeeze.rb +272 -0
  176. data/misc/plugin/src.rb +30 -0
  177. data/misc/plugin/tb-show.rb +212 -0
  178. data/misc/plugin/title_list.rb +41 -0
  179. data/misc/plugin/title_tag.rb +80 -0
  180. data/misc/plugin/tlink.rb +163 -0
  181. data/misc/plugin/todo.rb +182 -0
  182. data/misc/plugin/weather.rb +505 -0
  183. data/misc/plugin/whatsnew.rb +100 -0
  184. data/misc/plugin/xmlrpc.rb +80 -0
  185. data/misc/plugin/xmlrpc/README +20 -0
  186. data/misc/plugin/xmlrpc/xmlrpc.rb +575 -0
  187. data/misc/style/emptdiary/README.rd +83 -0
  188. data/misc/style/emptdiary/README.rd.en +78 -0
  189. data/misc/style/emptdiary/emptdiary_style.rb +199 -0
  190. data/misc/style/etdiary/README.rd +83 -0
  191. data/misc/style/etdiary/etdiary_style.rb +446 -0
  192. data/misc/style/gfm/gfm_style.rb +194 -0
  193. data/misc/style/rd/README.rd +71 -0
  194. data/misc/style/rd/rd_style.rb +366 -0
  195. data/misc/style/wiki/README +116 -0
  196. data/misc/style/wiki/README.en +101 -0
  197. data/misc/style/wiki/wiki_parser.rb +273 -0
  198. data/misc/style/wiki/wiki_style.rb +478 -0
  199. data/misc/theme_convert/Readme.rd +21 -0
  200. data/misc/theme_convert/append.rcss +150 -0
  201. data/misc/theme_convert/theme_convert.rb +453 -0
  202. data/plugin/00default.rb +1015 -0
  203. data/plugin/05referer.rb +298 -0
  204. data/plugin/10spamfilter.rb +183 -0
  205. data/plugin/50sp.rb +146 -0
  206. data/plugin/60sf.rb +152 -0
  207. data/plugin/90migrate.rb +109 -0
  208. data/plugin/en/00default.rb +390 -0
  209. data/plugin/en/05referer.rb +49 -0
  210. data/plugin/en/10spamfilter.rb +81 -0
  211. data/plugin/en/50sp.rb +56 -0
  212. data/plugin/en/60sf.rb +60 -0
  213. data/plugin/ja/00default.rb +401 -0
  214. data/plugin/ja/05referer.rb +47 -0
  215. data/plugin/ja/10spamfilter.rb +79 -0
  216. data/plugin/ja/50sp.rb +66 -0
  217. data/plugin/ja/60sf.rb +73 -0
  218. data/public/.gitkeep +0 -0
  219. data/public/images/.gitkeep +0 -0
  220. data/public/javascripts/.gitkeep +0 -0
  221. data/public/stylesheets/.gitkeep +0 -0
  222. data/skel/category.rhtml +9 -0
  223. data/skel/conf.rhtml +23 -0
  224. data/skel/day.rhtml +33 -0
  225. data/skel/diary.rhtml +83 -0
  226. data/skel/footer.rhtml +8 -0
  227. data/skel/header.rhtml +10 -0
  228. data/skel/i.category.rhtml +6 -0
  229. data/skel/i.conf.rhtml +14 -0
  230. data/skel/i.day.rhtml +28 -0
  231. data/skel/i.diary.rhtml +17 -0
  232. data/skel/i.footer.rhtml +2 -0
  233. data/skel/i.header.rhtml +3 -0
  234. data/skel/i.latest.rhtml +24 -0
  235. data/skel/i.month.rhtml +39 -0
  236. data/skel/i.search.rhtml +5 -0
  237. data/skel/i.update.rhtml +40 -0
  238. data/skel/i.update.rhtml.en +40 -0
  239. data/skel/latest.rhtml +27 -0
  240. data/skel/mail.rtxt +18 -0
  241. data/skel/mail.rtxt.en +18 -0
  242. data/skel/month.rhtml +27 -0
  243. data/skel/plugin_error.rhtml +27 -0
  244. data/skel/preview.rhtml +85 -0
  245. data/skel/preview.rhtml.en +72 -0
  246. data/skel/referer.rhtml +24 -0
  247. data/skel/search.rhtml +14 -0
  248. data/skel/tdiary.rconf +76 -0
  249. data/skel/update.rhtml +103 -0
  250. data/skel/update.rhtml.en +83 -0
  251. data/spec/acceptance/append_comment_spec.rb +94 -0
  252. data/spec/acceptance/append_diary_spec.rb +98 -0
  253. data/spec/acceptance/bugfix/encoding_error_spec.rb +27 -0
  254. data/spec/acceptance/save_conf_comment_spec.rb +87 -0
  255. data/spec/acceptance/save_conf_default_spec.rb +169 -0
  256. data/spec/acceptance/save_conf_dnsbl_spec.rb +152 -0
  257. data/spec/acceptance/save_conf_filter_spec.rb +50 -0
  258. data/spec/acceptance/save_conf_plugin_spec.rb +69 -0
  259. data/spec/acceptance/save_conf_referer_spec.rb +60 -0
  260. data/spec/acceptance/save_conf_security_spec.rb +280 -0
  261. data/spec/acceptance/support/helpers.rb +49 -0
  262. data/spec/acceptance/support/paths.rb +7 -0
  263. data/spec/acceptance/update_diary_spec.rb +113 -0
  264. data/spec/acceptance/view_category_spec.rb +38 -0
  265. data/spec/acceptance/view_comment_spec.rb +67 -0
  266. data/spec/acceptance/view_diary_spec.rb +126 -0
  267. data/spec/acceptance/view_referer_spec.rb +31 -0
  268. data/spec/acceptance_helper.rb +101 -0
  269. data/spec/core/compatible_spec.rb +54 -0
  270. data/spec/core/core_ext_spec.rb +59 -0
  271. data/spec/core/plugin_spec.rb +389 -0
  272. data/spec/core/rack/assets/precompile_spec.rb +76 -0
  273. data/spec/core/rack/html_anchor_spec.rb +57 -0
  274. data/spec/core/rack/valid_request_path_spec.rb +67 -0
  275. data/spec/core/style/emptdiary_style_spec.rb +165 -0
  276. data/spec/core/style/etdiary_style_spec.rb +512 -0
  277. data/spec/core/style/gfm_style_spec.rb +334 -0
  278. data/spec/core/style/rd_style_spec.rb +202 -0
  279. data/spec/core/style/tdiary_style_spec.rb +240 -0
  280. data/spec/core/style/wiki_style_spec.rb +441 -0
  281. data/spec/fixtures/ascii8bit-pstore.db +0 -0
  282. data/spec/fixtures/invalid-sequence-volatile.tdr +9 -0
  283. data/spec/fixtures/just_installed.conf +1 -0
  284. data/spec/fixtures/plugin/ja/sample.rb +4 -0
  285. data/spec/fixtures/plugin/sample.rb +6 -0
  286. data/spec/fixtures/sample.rb +12 -0
  287. data/spec/fixtures/tdiary.conf.gem +212 -0
  288. data/spec/fixtures/tdiary.conf.rack +212 -0
  289. data/spec/fixtures/tdiary.conf.rdb +227 -0
  290. data/spec/fixtures/tdiary.conf.secure +204 -0
  291. data/spec/fixtures/tdiary.conf.webrick +212 -0
  292. data/spec/javascripts/00default_spec.js +35 -0
  293. data/spec/javascripts/fixtures/00default.html +1 -0
  294. data/spec/javascripts/support/jasmine.yml +76 -0
  295. data/spec/plugin/bq_spec.rb +24 -0
  296. data/spec/plugin/plugin_helper.rb +203 -0
  297. data/spec/spec_helper.rb +32 -0
  298. data/tdiary.conf.beginner +244 -0
  299. data/tdiary.conf.sample +345 -0
  300. data/tdiary.conf.sample-en +333 -0
  301. data/tdiary.gemspec +26 -0
  302. data/tdiary.rb +151 -0
  303. data/tdiary/admin.rb +236 -0
  304. data/tdiary/application.rb +57 -0
  305. data/tdiary/author_only_base.rb +171 -0
  306. data/tdiary/base.rb +220 -0
  307. data/tdiary/cli.rb +116 -0
  308. data/tdiary/comment.rb +40 -0
  309. data/tdiary/comment_manager.rb +94 -0
  310. data/tdiary/compatible.rb +72 -0
  311. data/tdiary/config.rb +270 -0
  312. data/tdiary/core_ext.rb +122 -0
  313. data/tdiary/deploy.rb +50 -0
  314. data/tdiary/dispatcher.rb +77 -0
  315. data/tdiary/dispatcher/index_main.rb +122 -0
  316. data/tdiary/dispatcher/update_main.rb +101 -0
  317. data/tdiary/environment.rb +15 -0
  318. data/tdiary/filter.rb +48 -0
  319. data/tdiary/filter/default.rb +54 -0
  320. data/tdiary/filter/spam.rb +304 -0
  321. data/tdiary/io/base.rb +70 -0
  322. data/tdiary/io/cache/file.rb +123 -0
  323. data/tdiary/io/cache/memcached.rb +88 -0
  324. data/tdiary/io/cache/redis.rb +100 -0
  325. data/tdiary/io/default.rb +297 -0
  326. data/tdiary/io/pstore.rb +252 -0
  327. data/tdiary/io/rdb.rb +213 -0
  328. data/tdiary/lang/en.rb +79 -0
  329. data/tdiary/lang/ja.rb +72 -0
  330. data/tdiary/plugin.rb +375 -0
  331. data/tdiary/rack/assets/precompile.rb +37 -0
  332. data/tdiary/rack/auth/basic.rb +38 -0
  333. data/tdiary/rack/auth/omniauth.rb +51 -0
  334. data/tdiary/rack/html_anchor.rb +31 -0
  335. data/tdiary/rack/valid_request_path.rb +36 -0
  336. data/tdiary/referer_manager.rb +80 -0
  337. data/tdiary/request.rb +217 -0
  338. data/tdiary/response.rb +29 -0
  339. data/tdiary/server.rb +85 -0
  340. data/tdiary/style.rb +194 -0
  341. data/tdiary/style/tdiary_style.rb +198 -0
  342. data/tdiary/style/wiki_style.rb +213 -0
  343. data/tdiary/tasks.rb +1 -0
  344. data/tdiary/tasks/assets.rake +31 -0
  345. data/tdiary/tasks/auth.rake +28 -0
  346. data/tdiary/tasks/db.rake +110 -0
  347. data/tdiary/tasks/doc.rake +31 -0
  348. data/tdiary/tasks/heroku.rake +37 -0
  349. data/tdiary/tasks/jasmine.rake +16 -0
  350. data/tdiary/tasks/rdoc.rake +24 -0
  351. data/tdiary/tasks/release.rake +122 -0
  352. data/tdiary/tasks/rspec.rake +51 -0
  353. data/tdiary/tasks/server.rake +33 -0
  354. data/tdiary/tasks/test.rake +17 -0
  355. data/tdiary/version.rb +3 -0
  356. data/tdiary/view.rb +468 -0
  357. data/tdiary/view_helper.rb +15 -0
  358. data/test/disp_referrer_test.rb +93 -0
  359. data/test/my-sequel_test.rb +238 -0
  360. data/test/test_helper.rb +7 -0
  361. data/test/test_plugin_helper.rb +64 -0
  362. data/test/test_plugin_helper_test.rb +28 -0
  363. data/test/weather_test.rb +33 -0
  364. data/theme/base.css +268 -0
  365. data/theme/conf.block.png +0 -0
  366. data/theme/conf.css +254 -0
  367. data/theme/default/README +11 -0
  368. data/theme/default/body.png +0 -0
  369. data/theme/default/default.css +743 -0
  370. data/theme/help.png +0 -0
  371. data/theme/loading.gif +0 -0
  372. data/theme/tdiary1/README +7 -0
  373. data/theme/tdiary1/tdiary1.css +394 -0
  374. data/theme/tdiary2/README +19 -0
  375. data/theme/tdiary2/tdiary2.css +624 -0
  376. data/update.fcgi +45 -0
  377. data/update.rb +57 -0
  378. data/vendor/hikidoc-0.0.6/COPYING +28 -0
  379. data/vendor/hikidoc-0.0.6/NEWS +30 -0
  380. data/vendor/hikidoc-0.0.6/NEWS.ja +30 -0
  381. data/vendor/hikidoc-0.0.6/README +86 -0
  382. data/vendor/hikidoc-0.0.6/README.ja +83 -0
  383. data/vendor/hikidoc-0.0.6/Rakefile +68 -0
  384. data/vendor/hikidoc-0.0.6/TextFormattingRules +320 -0
  385. data/vendor/hikidoc-0.0.6/TextFormattingRules.ja +318 -0
  386. data/vendor/hikidoc-0.0.6/bin/hikidoc +66 -0
  387. data/vendor/hikidoc-0.0.6/lib/hikidoc.rb +914 -0
  388. data/vendor/hikidoc-0.0.6/setup.rb +1360 -0
  389. data/vendor/hikidoc-0.0.6/test/run-test.rb +13 -0
  390. data/vendor/hikidoc-0.0.6/test/test_hikidoc.rb +506 -0
  391. data/vendor/imagesize-0.1.1/Manifest.txt +19 -0
  392. data/vendor/imagesize-0.1.1/README.txt +49 -0
  393. data/vendor/imagesize-0.1.1/lib/image_size.rb +305 -0
  394. data/vendor/imagesize-0.1.1/lib/image_size/version.rb +9 -0
  395. data/vendor/imagesize-0.1.1/setup.rb +1585 -0
  396. data/vendor/imagesize-0.1.1/test/2-4-7.png +0 -0
  397. data/vendor/imagesize-0.1.1/test/4_1_2.gif +0 -0
  398. data/vendor/imagesize-0.1.1/test/bmp.bmp +0 -0
  399. data/vendor/imagesize-0.1.1/test/cursor.xbm +6 -0
  400. data/vendor/imagesize-0.1.1/test/detect.swf +0 -0
  401. data/vendor/imagesize-0.1.1/test/pbm.pbm +0 -0
  402. data/vendor/imagesize-0.1.1/test/pcx.pcx +0 -0
  403. data/vendor/imagesize-0.1.1/test/pgm.pgm +5 -0
  404. data/vendor/imagesize-0.1.1/test/test.xpm +38 -0
  405. data/vendor/imagesize-0.1.1/test/test_helper.rb +2 -0
  406. data/vendor/imagesize-0.1.1/test/test_image_size.rb +71 -0
  407. data/vendor/imagesize-0.1.1/test/tiff.tiff +0 -0
  408. data/vendor/imagesize-0.1.1/test/tokyo_tower.jpg +0 -0
  409. data/vendor/imagesize-0.1.1/test/tower_e.gif.psd +0 -0
  410. data/vendor/jasmine-jquery-1.4.2/jasmine-jquery.js +548 -0
  411. data/vendor/jquery-1.8/jquery.js +9227 -0
  412. data/vendor/rdtool-0.6.38/COPYING.txt +339 -0
  413. data/vendor/rdtool-0.6.38/Gemfile +3 -0
  414. data/vendor/rdtool-0.6.38/HISTORY +318 -0
  415. data/vendor/rdtool-0.6.38/LGPL-2.1 +502 -0
  416. data/vendor/rdtool-0.6.38/LICENSE.txt +58 -0
  417. data/vendor/rdtool-0.6.38/README.html +66 -0
  418. data/vendor/rdtool-0.6.38/README.ja.html +73 -0
  419. data/vendor/rdtool-0.6.38/README.rd +76 -0
  420. data/vendor/rdtool-0.6.38/README.rd.ja +85 -0
  421. data/vendor/rdtool-0.6.38/Rakefile +152 -0
  422. data/vendor/rdtool-0.6.38/TODO +22 -0
  423. data/vendor/rdtool-0.6.38/bin/rd2 +283 -0
  424. data/vendor/rdtool-0.6.38/bin/rdswap.rb +207 -0
  425. data/vendor/rdtool-0.6.38/doc/rd-draft.html +456 -0
  426. data/vendor/rdtool-0.6.38/doc/rd-draft.ja.html +466 -0
  427. data/vendor/rdtool-0.6.38/doc/rd-draft.rd +479 -0
  428. data/vendor/rdtool-0.6.38/doc/rd-draft.rd.ja +487 -0
  429. data/vendor/rdtool-0.6.38/lib/rd/block-element.rb +114 -0
  430. data/vendor/rdtool-0.6.38/lib/rd/complex-list-item.rb +65 -0
  431. data/vendor/rdtool-0.6.38/lib/rd/desclist.rb +55 -0
  432. data/vendor/rdtool-0.6.38/lib/rd/document-struct.rb +46 -0
  433. data/vendor/rdtool-0.6.38/lib/rd/dot.rd2rc +18 -0
  434. data/vendor/rdtool-0.6.38/lib/rd/element.rb +160 -0
  435. data/vendor/rdtool-0.6.38/lib/rd/filter.rb +255 -0
  436. data/vendor/rdtool-0.6.38/lib/rd/head-filter.rb +14 -0
  437. data/vendor/rdtool-0.6.38/lib/rd/inline-element.rb +233 -0
  438. data/vendor/rdtool-0.6.38/lib/rd/labeled-element.rb +14 -0
  439. data/vendor/rdtool-0.6.38/lib/rd/list.rb +57 -0
  440. data/vendor/rdtool-0.6.38/lib/rd/loose-struct.rb +11 -0
  441. data/vendor/rdtool-0.6.38/lib/rd/methodlist.rb +57 -0
  442. data/vendor/rdtool-0.6.38/lib/rd/output-format-visitor.rb +30 -0
  443. data/vendor/rdtool-0.6.38/lib/rd/package.rb +4 -0
  444. data/vendor/rdtool-0.6.38/lib/rd/parser-util.rb +14 -0
  445. data/vendor/rdtool-0.6.38/lib/rd/post-install +1 -0
  446. data/vendor/rdtool-0.6.38/lib/rd/pre-setup.rb +18 -0
  447. data/vendor/rdtool-0.6.38/lib/rd/rbl-file.rb +69 -0
  448. data/vendor/rdtool-0.6.38/lib/rd/rbl-suite.rb +37 -0
  449. data/vendor/rdtool-0.6.38/lib/rd/rd-struct.rb +86 -0
  450. data/vendor/rdtool-0.6.38/lib/rd/rd2html-ext-lib.rb +266 -0
  451. data/vendor/rdtool-0.6.38/lib/rd/rd2html-ext-opt.rb +34 -0
  452. data/vendor/rdtool-0.6.38/lib/rd/rd2html-lib.rb +490 -0
  453. data/vendor/rdtool-0.6.38/lib/rd/rd2html-opt.rb +67 -0
  454. data/vendor/rdtool-0.6.38/lib/rd/rd2man-lib.rb +251 -0
  455. data/vendor/rdtool-0.6.38/lib/rd/rd2rdo-lib.rb +19 -0
  456. data/vendor/rdtool-0.6.38/lib/rd/rd2rmi-lib.rb +32 -0
  457. data/vendor/rdtool-0.6.38/lib/rd/rdblockparser.ry +518 -0
  458. data/vendor/rdtool-0.6.38/lib/rd/rdblockparser.tab.rb +1061 -0
  459. data/vendor/rdtool-0.6.38/lib/rd/rdfmt.rb +15 -0
  460. data/vendor/rdtool-0.6.38/lib/rd/rdinlineparser.ry +503 -0
  461. data/vendor/rdtool-0.6.38/lib/rd/rdinlineparser.tab.rb +1243 -0
  462. data/vendor/rdtool-0.6.38/lib/rd/rdvisitor.rb +214 -0
  463. data/vendor/rdtool-0.6.38/lib/rd/reference-resolver.rb +114 -0
  464. data/vendor/rdtool-0.6.38/lib/rd/search-file.rb +14 -0
  465. data/vendor/rdtool-0.6.38/lib/rd/tree.rb +103 -0
  466. data/vendor/rdtool-0.6.38/lib/rd/version.rb +41 -0
  467. data/vendor/rdtool-0.6.38/lib/rd/visitor.rb +86 -0
  468. data/vendor/rdtool-0.6.38/rdtool.gemspec +125 -0
  469. data/vendor/rdtool-0.6.38/setup.rb +1596 -0
  470. data/vendor/rdtool-0.6.38/test/data/includee1.html +1 -0
  471. data/vendor/rdtool-0.6.38/test/data/includee2.html +1 -0
  472. data/vendor/rdtool-0.6.38/test/data/includee3.nothtml +1 -0
  473. data/vendor/rdtool-0.6.38/test/data/includee4.xhtml +0 -0
  474. data/vendor/rdtool-0.6.38/test/data/label.rbl +2 -0
  475. data/vendor/rdtool-0.6.38/test/data/label2.rbl +2 -0
  476. data/vendor/rdtool-0.6.38/test/data/sub/includee2.html +1 -0
  477. data/vendor/rdtool-0.6.38/test/data/sub/includee4.html +0 -0
  478. data/vendor/rdtool-0.6.38/test/dummy-observer.rb +6 -0
  479. data/vendor/rdtool-0.6.38/test/dummy.rb +33 -0
  480. data/vendor/rdtool-0.6.38/test/temp-dir.rb +19 -0
  481. data/vendor/rdtool-0.6.38/test/test-block-parser.rb +46 -0
  482. data/vendor/rdtool-0.6.38/test/test-desclist-item.rb +219 -0
  483. data/vendor/rdtool-0.6.38/test/test-document-element.rb +46 -0
  484. data/vendor/rdtool-0.6.38/test/test-document-struct.rb +66 -0
  485. data/vendor/rdtool-0.6.38/test/test-element.rb +46 -0
  486. data/vendor/rdtool-0.6.38/test/test-headline.rb +80 -0
  487. data/vendor/rdtool-0.6.38/test/test-inline-parser.rb +46 -0
  488. data/vendor/rdtool-0.6.38/test/test-list-item.rb +54 -0
  489. data/vendor/rdtool-0.6.38/test/test-list.rb +53 -0
  490. data/vendor/rdtool-0.6.38/test/test-methodlist-item.rb +73 -0
  491. data/vendor/rdtool-0.6.38/test/test-nonterminal-element.rb +170 -0
  492. data/vendor/rdtool-0.6.38/test/test-nonterminal-inline.rb +33 -0
  493. data/vendor/rdtool-0.6.38/test/test-output-format-visitor.rb +48 -0
  494. data/vendor/rdtool-0.6.38/test/test-parser-util.rb +41 -0
  495. data/vendor/rdtool-0.6.38/test/test-rbl-file.rb +156 -0
  496. data/vendor/rdtool-0.6.38/test/test-rbl-suite.rb +43 -0
  497. data/vendor/rdtool-0.6.38/test/test-rd2html-lib.rb +496 -0
  498. data/vendor/rdtool-0.6.38/test/test-rdtree.rb +17 -0
  499. data/vendor/rdtool-0.6.38/test/test-rdvisitor.rb +29 -0
  500. data/vendor/rdtool-0.6.38/test/test-reference-resolver.rb +202 -0
  501. data/vendor/rdtool-0.6.38/test/test-reference.rb +132 -0
  502. data/vendor/rdtool-0.6.38/test/test-search-file.rb +22 -0
  503. data/vendor/rdtool-0.6.38/test/test-terminal-inline.rb +41 -0
  504. data/vendor/rdtool-0.6.38/test/test-textblock.rb +44 -0
  505. data/vendor/rdtool-0.6.38/test/test-tree.rb +82 -0
  506. data/vendor/rdtool-0.6.38/test/test-version.rb +57 -0
  507. data/vendor/rdtool-0.6.38/test/test-visitor.rb +230 -0
  508. data/vendor/rdtool-0.6.38/utils/rd-mode.el +464 -0
  509. metadata +666 -0
@@ -0,0 +1,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