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,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: