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,68 @@
1
+ # -*- coding: utf-8 -*-
2
+ # my-ex.rb
3
+ #
4
+ # my(拡張版): myプラグインを拡張し、title属性に参照先の内容を挿入します。
5
+ # 参照先がセクションの場合は(あれば)サブタイトルを、
6
+ # ツッコミの場合はツッコんだ人の名前と内容の一部を使います。
7
+ # パラメタ:
8
+ # a: 自分の日記内のリンク先情報('YYYYMMDD#pNN' または 'YYYYMMDD#cNN')
9
+ # URLをそのまま書くこともできます。
10
+ # str: リンクにする文字列
11
+ #
12
+ # Copyright (c) 2002 TADA Tadashi <sho@spc.gr.jp>
13
+ # Distributed under the GPL
14
+
15
+ unless @cgi.mobile_agent?
16
+
17
+ def my( a, str, title = nil )
18
+ date, frag = a.scan( /(\d{4}|\d{6}|\d{8}|\d{8}-\d+)[^\d]*(?:#?([pct]\d+))?$/ )[0]
19
+ anc = frag ? "#{date}#{frag}" : date
20
+ place, frag = frag.scan( /([cpt])(\d\d)/ )[0] if frag
21
+ if date and frag and @diaries[date] then
22
+ case place
23
+ when 'p'
24
+ section = nil
25
+ idx = 1
26
+ @diaries[date].each_section do |s|
27
+ section = s
28
+ break if idx == frag.to_i
29
+ idx += 1
30
+ end
31
+ if section and section.subtitle then
32
+ title = h( "#{apply_plugin(section.subtitle_to_html, true)}" )
33
+ title.sub!( /^(\[([^\]]+)\])+ */, '' )
34
+ end
35
+ when 'c'
36
+ com = nil
37
+ @diaries[date].each_comment( frag.to_i ) {|c| com = c}
38
+ if com then
39
+ title = h( "[#{com.name}] #{com.shorten( @conf.comment_length )}" )
40
+ end
41
+ when 't'
42
+ unless @plugin_files.grep(/tb-show.rb\z/).empty?
43
+ tb = nil
44
+ @diaries[date].each_visible_trackback( frag.to_i ) {|t, idx| tb = t}
45
+ if tb then
46
+ url, name, tbtitle, excerpt = tb.body.split( /\n/,4 )
47
+ title = h( "[#{name}] #{@conf.shorten( excerpt, @conf.comment_length )}" )
48
+ end
49
+ end
50
+ end
51
+ end
52
+ index = /^https?:/ =~ @index ? '' : base_url
53
+ index += @index.sub(%r|^\./|, '')
54
+ if title then
55
+ %Q[<a href="#{h index}#{anchor anc}" title="#{title}">#{str}</a>]
56
+ else
57
+ %Q[<a href="#{h index}#{anchor anc}">#{str}</a>]
58
+ end
59
+ end
60
+
61
+ end
62
+
63
+ # Local Variables:
64
+ # mode: ruby
65
+ # indent-tabs-mode: t
66
+ # tab-width: 3
67
+ # ruby-indent-level: 3
68
+ # End:
@@ -0,0 +1,539 @@
1
+ #
2
+ # my-sequel.rb
3
+ #
4
+ # show links to follow-up entries
5
+ #
6
+ # Copyright 2006 zunda <zunda at freeshell.org> and
7
+ # NISHIMURA Takashi <nt at be.to>
8
+ #
9
+ # Permission is granted for use, copying, modification, distribution,
10
+ # and distribution of modified versions of this work under the terms
11
+ # of GPL version 2.
12
+ #
13
+ # Language resources can be found in the middle of thie file.
14
+ # Please search a line with `language resource'
15
+ #
16
+ require 'pstore'
17
+ unless defined?(ERB)
18
+ require 'erb'
19
+ end
20
+
21
+ class MySequel
22
+ include ERB::Util
23
+ extend ERB::Util
24
+
25
+ class Conf
26
+ include ERB::Util
27
+ Prefix = 'my_sequel.'
28
+
29
+ unless @conf then
30
+ def self::to_native(str)
31
+ return str
32
+ end
33
+ else
34
+ def self::to_native(str)
35
+ @conf.to_native(str)
36
+ end
37
+ end
38
+
39
+ def self::handler_escape(string)
40
+ string.gsub(/\r/n, '').gsub(/&/n, '&amp;').gsub(/"/n, '&quot;').gsub(/>/n, '&gt;').gsub(/</n, '&lt;').gsub(/\n/n, '\n')
41
+ end
42
+
43
+ def self::handler_scriptlet
44
+ return <<'_END'
45
+ function unescape(string) {
46
+ return string.replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&quot;/g, '"').replace(/&amp;/g, '&');
47
+ }
48
+ function uncheck(element) {
49
+ document.getElementById(element.id+".reset").checked = false;
50
+ }
51
+ function restore(element) {
52
+ var text_id = element.id.replace(/\.reset$/, "")
53
+ if (element.checked) {
54
+ document.getElementById(text_id).value = unescape(default_values[text_id]);
55
+ }
56
+ }
57
+ _END
58
+ end
59
+
60
+ def initialize(conf_hash)
61
+ @default_hash = conf_hash
62
+ @conf_hash = Hash.new
63
+ end
64
+
65
+ # takes configuration from @options trusting the input
66
+ def merge_hash(hash)
67
+ @default_hash.each_key do |key|
68
+ prefixed = Prefix + key.to_s
69
+ @conf_hash[key] = hash[prefixed] if hash.has_key?(prefixed)
70
+ end
71
+ end
72
+
73
+ # takes configuration from @cgi.params
74
+ def merge_params(params)
75
+ @default_hash.each_key do |key|
76
+ keystr = key.to_s
77
+ if params[keystr+'.reset'] and params[keystr+'.reset'][0] then
78
+ @conf_hash.delete(key)
79
+ elsif params[keystr] then
80
+ @conf_hash[key] = params[keystr][0]
81
+ end
82
+ end
83
+ end
84
+
85
+ # returns current configuration
86
+ def [](key)
87
+ if @conf_hash.has_key?(key) then
88
+ return @conf_hash[key]
89
+ else
90
+ return @default_hash[key][:default]
91
+ end
92
+ end
93
+
94
+ # returns hash of configured values
95
+ def to_conf_hash(target_hash)
96
+ @default_hash.each_key do |key|
97
+ target_hash.delete(Prefix + key.to_s)
98
+ end
99
+ @conf_hash.each_pair do |key, value|
100
+ target_hash[Prefix + key.to_s] = value
101
+ end
102
+ end
103
+
104
+ # returns an HTML sniplet for configuration interface
105
+ def html(restore_default_label, mobile = false)
106
+ return @default_hash.keys.sort_by{|k| @default_hash[k][:index]}.map{|k|
107
+ idattr = mobile ? '' : %Q| id="#{h k.to_s}"|
108
+ idattr_reset = mobile ? '' : %Q| id="#{h k.to_s}.reset"|
109
+ uncheck = mobile ? '' : ' onfocus="uncheck(this)"'
110
+ restore = mobile ? '' : ' onchange="restore(this)" onclick="restore(this)"'
111
+ r = %Q|\t<h3 class="subtitle">#{h @default_hash[k][:title]}</h3>\n|
112
+ description = @default_hash[k][:description]
113
+ r += %Q|\t<p>#{h description}</p>\n| if description and not mobile
114
+ unless @default_hash[k][:textarea]
115
+ r += %Q|\t<p><input name="#{h k.to_s}"#{idattr} type="text" value="#{h(Conf.to_native(self[k]))}"#{uncheck}>|
116
+ else
117
+ cols = 70
118
+ rows = 10
119
+ if @default_hash[k][:textarea].respond_to?(:[]) then
120
+ cols = @default_hash[k][:textarea][:cols] || cols
121
+ rows = @default_hash[k][:textarea][:rows] || rows
122
+ end
123
+ r += %Q|\t<p><textarea name="#{h k.to_s}"#{idattr} cols="#{h cols}" rows="#{h rows}"#{uncheck}>#{h(Conf.to_native(self[k]))}</textarea>|
124
+ end
125
+ name = "#{h k.to_s}.reset"
126
+ r += %Q|&nbsp;-&nbsp;<label for="#{name}"><input id="#{name}" name="#{name}"#{idattr_reset} type="checkbox" value="t"#{restore}>#{restore_default_label}</label></p>\n|
127
+ r
128
+ }.join
129
+ end
130
+
131
+ # Javascript hash literal for default values
132
+ def default_js_hash
133
+ r = "default_values = {\n"
134
+ r += @default_hash.keys.sort_by{|k| @default_hash[k][:index]}.map{|k|
135
+ %Q|\t"#{h k}": "#{Conf::handler_escape(@default_hash[k][:default])}"|
136
+ }.join(",\n")
137
+ r += "\n};\n"
138
+ return r
139
+ end
140
+
141
+ def handler_block
142
+ return <<"_END"
143
+ <script type="text/javascript"><!--
144
+ #{default_js_hash}#{Conf::handler_scriptlet}// --></script>
145
+ _END
146
+ end
147
+ end
148
+
149
+ # CSS sniplet for sequels
150
+ def self::css(inner_css)
151
+ unless inner_css.strip.empty?
152
+ return <<"_END"
153
+ \t<style type="text/css" media="all"><!--
154
+ \tdiv.sequel {
155
+ #{h(inner_css.gsub(/^\s*/, "\t\t").gsub(/\r?\n/, "\n"))}\t}
156
+ \t--></style>
157
+ _END
158
+ else
159
+ return ''
160
+ end
161
+ end
162
+
163
+ # cache directory for this plguin
164
+ def self::cache_dir(cache_path)
165
+ return File.join(cache_path, 'my_sequel')
166
+ end
167
+
168
+ # cache file for a month: #{yyyy}/#{yyyymm}.#{src or dst}.dat
169
+ def self::cache_file(cache_path, anchor, direction)
170
+ return File.join(MySequel.cache_dir(cache_path), MySequel.year(anchor), "#{MySequel.month(anchor)}.#{direction}.dat")
171
+ end
172
+
173
+ # unique for each month
174
+ def self::cache_key(anchor)
175
+ return MySequel.month(anchor)
176
+ end
177
+
178
+ # for each cache key for dates
179
+ def self::each_cache_key(dates)
180
+ dates = dates.is_a?(String) ? [dates] : dates
181
+ dates.map{|ymd| MySequel.cache_key(ymd)}.uniq.each do |cache_file|
182
+ yield(cache_file)
183
+ end
184
+ end
185
+
186
+ # yyyy
187
+ def self::year(anchor)
188
+ return anchor.scan(/\d{4,4}/)[0]
189
+ end
190
+
191
+ # yyyymm
192
+ def self::month(anchor)
193
+ return anchor.scan(/\d{6,6}/)[0]
194
+ end
195
+
196
+ # yyyymmdd
197
+ def self::date(anchor)
198
+ if anchor.respond_to?(:localtime)
199
+ return anchor.localtime.strftime("%Y%m%d")
200
+ else
201
+ return anchor.scan(/\d{8,8}/)[0]
202
+ end
203
+ end
204
+
205
+ # add an entry to Array value of hash, making new Array if needed
206
+ def self::push_to_hash(hash, key, element)
207
+ unless hash.has_key?(key)
208
+ hash[key] = Array.new
209
+ begin
210
+ hash[key].taint
211
+ rescue SecurityError
212
+ end
213
+ end
214
+ hash[key] << element
215
+ hash
216
+ end
217
+
218
+ def initialize(cache_path)
219
+ @link_srcs = Hash.new.taint # key:dst anchor value:Array of src anchors
220
+ @current_dsts = Hash.new.taint # key:src anchor value:Array of dst anchors
221
+ @cached_dsts = Hash.new.taint # for restore_dsts and clean_srcs
222
+ @vanished_dsts = Hash.new.taint # key:src date value:Array of dst anchors
223
+ @cache_path = cache_path
224
+ end
225
+
226
+ def restore(dates)
227
+ restore_srcs(dates)
228
+ restore_dsts(dates)
229
+ end
230
+
231
+ # HTML sniplet for sequels
232
+ def html(dst_anchor, date_format, label)
233
+ anchors = srcs(dst_anchor)
234
+ if anchors and not anchors.empty? then
235
+ r = %Q|<div class="sequel">#{h label}|
236
+ r += anchors.map{|src_anchor|
237
+ yield(src_anchor, Time.local(*(src_anchor.scan(/(\d{4,4})(\d\d)(\d\d)/)[0])).strftime(date_format))
238
+ }.join(', ')
239
+ r += "</div>\n"
240
+ return r
241
+ else
242
+ return ''
243
+ end
244
+ end
245
+
246
+ # Array of source anchors for a destination anchor, nil if none
247
+ def srcs(dst_anchor)
248
+ a = @link_srcs[dst_anchor]
249
+ return nil if not a or a.empty?
250
+ return a.uniq.sort
251
+ end
252
+
253
+ # starts a day - get ready to scan the diary for the section
254
+ def clean_dsts(date)
255
+ datestr = MySequel.date(date)
256
+ @current_dsts.keys.each do |src_anchor|
257
+ next unless MySequel.date(src_anchor) == datestr
258
+ @current_dsts[src_anchor] = Array.new
259
+ begin
260
+ @current_dsts[src_anchor].taint
261
+ rescue SecurityError
262
+ end
263
+ end
264
+ end
265
+
266
+ # adds a link
267
+ def add(src_anchor, dst_anchor)
268
+ MySequel.push_to_hash(@link_srcs, dst_anchor, src_anchor)
269
+ MySequel.push_to_hash(@current_dsts, src_anchor, dst_anchor)
270
+ end
271
+
272
+ # detect vanished links
273
+ def clean_srcs
274
+ (@cached_dsts.keys + @current_dsts.keys).uniq.each do |src_anchor|
275
+ if @cached_dsts[src_anchor] then
276
+ if @current_dsts[src_anchor] then
277
+ @vanished_dsts[src_anchor] = @cached_dsts[src_anchor] - @current_dsts[src_anchor]
278
+ else
279
+ @vanished_dsts[src_anchor] = @cached_dsts[src_anchor]
280
+ end
281
+ end
282
+ @cached_dsts[src_anchor] = @current_dsts[src_anchor].dup
283
+ end
284
+ end
285
+
286
+ # restores cached data for a month
287
+ # calls the block for each root giving key and value
288
+ def each_cached(anchor, direction)
289
+ path = MySequel.cache_file(@cache_path, anchor, direction)
290
+ begin
291
+ PStore.new(path).transaction(true) do |db|
292
+ db.roots.each do |cached_anchor|
293
+ yield(cached_anchor, db[cached_anchor])
294
+ end
295
+ end
296
+ rescue TypeError # corrupted PStore data
297
+ File.unlink(path)
298
+ rescue PStore::Error # corrupted PStore data
299
+ begin
300
+ File.unlink(path)
301
+ rescue Errno::ENOENT
302
+ end
303
+ rescue Errno::ENOENT # no cache yet
304
+ end
305
+ end
306
+ private :each_cached
307
+
308
+ # restores cached sources for a month
309
+ def restore_srcs(dates)
310
+ @srcs_loaded ||= Hash.new
311
+ MySequel.each_cache_key(dates) do |cache_key|
312
+ unless @srcs_loaded[cache_key] then
313
+ each_cached(cache_key, 'src') do |anchor, array|
314
+ unless @link_srcs.has_key?(anchor)
315
+ @link_srcs[anchor] = array.taint
316
+ else
317
+ @link_srcs[anchor] += array.taint
318
+ end
319
+ end
320
+ @srcs_loaded[cache_key] = true
321
+ end
322
+ end
323
+ end
324
+
325
+ # restores cached destinations
326
+ def restore_dsts(dates)
327
+ @dsts_loaded ||= Hash.new
328
+ MySequel.each_cache_key(dates) do |cache_key|
329
+ unless @dsts_loaded[cache_key] then
330
+ each_cached(cache_key, 'dst') do |anchor, array|
331
+ array.taint
332
+ @cached_dsts[anchor] = array
333
+ @current_dsts[anchor] = array.dup
334
+ end
335
+ @dsts_loaded[cache_key] = true
336
+ end
337
+ end
338
+ end
339
+
340
+ # hash for storing cache
341
+ # key: path to cache
342
+ # value: Hash
343
+ # key: anchor
344
+ # value: compacted and uniqed Array of anchor on the other side of link
345
+ def hash_for_cache(link_hash, direction)
346
+ r = Hash.new
347
+ link_hash.each_pair do |pivot_anchor, anchor_array|
348
+ c = anchor_array.compact.uniq
349
+ path = MySequel.cache_file(@cache_path, pivot_anchor, direction)
350
+ r[path] ||= Hash.new
351
+ r[path][pivot_anchor] = c
352
+ end
353
+ return r
354
+ end
355
+ private :hash_for_cache
356
+
357
+ # stores the data
358
+ def store(cache_hash)
359
+ cache_hash.each_pair do |path, h|
360
+ d = File.dirname(path)
361
+ Dir.mkdir(d) unless File.exist?(d)
362
+ PStore.new(path).transaction do |db|
363
+ h.each_pair do |k, v|
364
+ unless v.empty? then
365
+ db[k] = v
366
+ else
367
+ db.delete(k)
368
+ end
369
+ end
370
+ end
371
+ end
372
+ end
373
+ private :store
374
+
375
+ # commits on-memory results to files
376
+ def commit
377
+ d = MySequel.cache_dir(@cache_path)
378
+ Dir.mkdir(d) unless File.exist?(d)
379
+
380
+ restore_srcs(@link_srcs.keys)
381
+
382
+ restore_srcs(@vanished_dsts.values.flatten)
383
+ @vanished_dsts.each_pair do |src_anchor, dst_anchors|
384
+ dst_anchors.uniq.each do |dst_anchor|
385
+ @link_srcs[dst_anchor].reject!{|anchor| anchor == src_anchor}
386
+ end
387
+ end
388
+
389
+ store(hash_for_cache(@link_srcs, 'src'))
390
+ store(hash_for_cache(@current_dsts, 'dst'))
391
+ @vanished_dsts = Hash.new.taint
392
+ end
393
+
394
+ end
395
+
396
+ # register this plguin to tDiary
397
+ unless defined?(Test::Unit)
398
+ # language resource and configuration
399
+ @my_sequel_plugin_name ||= 'Link to follow ups'
400
+ @my_sequel_description ||= <<_END
401
+ <p>Shows links to follow-up entries,
402
+ which have `my' link to the entry in the past.</p>
403
+ <p>Do not forget to push the OK button to store the changes.</p>
404
+ _END
405
+ @my_sequel_label_conf ||= 'Link label'
406
+ @my_sequel_label ||= 'Follow up: '
407
+ @my_sequel_restore_default_label ||= 'Restore default'
408
+ @my_sequel_default_hash ||= {
409
+ :label => {
410
+ :title => 'Link label',
411
+ :default => 'Follow up: ',
412
+ :description => 'Prefix for links to the follow-ups',
413
+ :index => 1,
414
+ },
415
+ :date_format => {
416
+ :title => 'Link format',
417
+ :default => @date_format,
418
+ :description => 'Time format of links to the follow-ups. Sequences of % and a charactor are converted as follows: "%Y" to year, "%m" to month in number, "%b" to short name of month, "%B" to full name of month, "%d" to day of month, "%a" to short name of day of week, and "%A" to full name of day of week, for the follow-up.',
419
+ :index => 2,
420
+ },
421
+ :inner_css => {
422
+ :title => 'CSS',
423
+ :default => <<'_END',
424
+ font-size: 75%;
425
+ text-align: right;
426
+ margin: 0px;
427
+ _END
428
+ :description => 'CSS for the links. The followoing is applied to <code>div.sequel</code>.',
429
+ :index => 3,
430
+ :textarea => {:rows => 5},
431
+ },
432
+ }
433
+
434
+ @my_sequel_conf = MySequel::Conf.new(@my_sequel_default_hash)
435
+ @my_sequel_conf.merge_hash(@options)
436
+
437
+ # configuration interface
438
+ add_conf_proc( 'my-sequel', @my_sequel_plugin_name ) do
439
+ if @mode == 'saveconf' then
440
+ @my_sequel_conf.merge_params(@cgi.params)
441
+ @my_sequel_conf.to_conf_hash(@conf)
442
+ end
443
+ <<"_HTML"
444
+ #{@my_sequel_conf.handler_block}
445
+ <h3>#{@my_sequel_plugin_name}</h3>
446
+ #{@my_sequel_description}
447
+ #{@my_sequel_conf.html(@my_sequel_restore_default_label, @cgi.mobile_agent?).chomp}
448
+ _HTML
449
+ end
450
+
451
+ @my_sequel = MySequel.new(@cache_path)
452
+ @my_sequel_active = false
453
+
454
+ # activate this plugin if header procs are called
455
+ # - This avoids being called from makerss.rb
456
+ add_header_proc do
457
+ if not bot? and not @cgi.mobile_agent? then
458
+ @my_sequel_active = true
459
+ @my_sequel.restore(@diaries.keys)
460
+ MySequel.css(@my_sequel_conf[:inner_css])
461
+ end
462
+ end
463
+
464
+ # preparation for a day
465
+ add_body_enter_proc do |date|
466
+ if @my_sequel_active then
467
+ if date then
468
+ @my_sequel_date = MySequel.date(date)
469
+ @my_sequel.clean_dsts(@my_sequel_date)
470
+ else
471
+ @my_sequel_date = nil
472
+ end
473
+ end
474
+ ''
475
+ end
476
+
477
+ # preparation for a section
478
+ add_section_enter_proc do |date, index|
479
+ if @my_sequel_active and @my_sequel_date then
480
+ @my_sequel_anchor = "#{@my_sequel_date}#p#{'%02d' % index}"
481
+ end
482
+ ''
483
+ end
484
+
485
+ # plugin function to be called from within sections
486
+ alias :my_sequel_orig_my :my unless defined?(my_sequel_orig_my)
487
+ def my(*args)
488
+ if @my_sequel_active and @my_sequel_date and @my_sequel_anchor and @mode != 'preview' then
489
+ dst_date, frag = args[0].scan(/(\d{8,8})(?:[^\d]*)(?:#?p(\d+))?$/)[0]
490
+ if dst_date and dst_date < @my_sequel_date then
491
+ dst_anchor = "#{dst_date}#{frag ? "#p%02d" % frag.to_i : ''}"
492
+ @my_sequel.add(@my_sequel_anchor, dst_anchor)
493
+ end
494
+ end
495
+ my_sequel_orig_my(*args)
496
+ end
497
+
498
+ # show sequels when leaving a section
499
+ add_section_leave_proc do
500
+ r = ''
501
+ if @my_sequel_active and @my_sequel_date and @my_sequel_anchor and not bot? and not @cgi.mobile_agent? then
502
+ r = @my_sequel.html(@my_sequel_anchor, @my_sequel_conf[:date_format], @my_sequel_conf[:label]){|src_anchor, anchor_str|
503
+ my_sequel_orig_my(src_anchor, anchor_str)
504
+ }
505
+ end
506
+ @my_sequel_anchor = nil
507
+ r
508
+ end
509
+
510
+ # show sequels when leaving a day
511
+ add_body_leave_proc do
512
+ r = ''
513
+ if @my_sequel_active and @my_sequel_date then
514
+ if not bot? and not @cgi.mobile_agent? then
515
+ r = @my_sequel.html(@my_sequel_anchor, @my_sequel_conf[:date_format], @my_sequel_conf[:label]){|src_anchor, anchor_str|
516
+ my_sequel_orig_my(src_anchor, anchor_str)
517
+ }
518
+ end
519
+ end
520
+ @my_sequel_date = nil
521
+ r
522
+ end
523
+
524
+ # commit changes
525
+ add_footer_proc do
526
+ if @my_sequel_active then
527
+ @my_sequel.clean_srcs
528
+ @my_sequel.commit
529
+ end
530
+ ''
531
+ end
532
+ end
533
+
534
+ # Local Variables:
535
+ # mode: ruby
536
+ # indent-tabs-mode: t
537
+ # tab-width: 3
538
+ # ruby-indent-level: 3
539
+ # End: