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,123 @@
1
+ # -*- coding: utf-8; -*-
2
+
3
+ module TDiary
4
+ module CacheIO
5
+ def restore_cache( prefix )
6
+ restore_data("#{cache_path}/#{cache_file( prefix )}") if cache_enable?( prefix )
7
+ end
8
+
9
+ def store_cache(cache, prefix)
10
+ store_data(cache, "#{cache_path}/#{cache_file( prefix )}") if cache_file( prefix )
11
+ end
12
+
13
+ def clear_cache( target = /.*/ )
14
+ Dir::glob( "#{cache_path}/*.r[bh]*" ).each do |c|
15
+ delete_data(c) if target =~ c
16
+ end
17
+ end
18
+
19
+ private
20
+
21
+ def restore_data(path)
22
+ File.read(path) rescue nil
23
+ end
24
+
25
+ def store_data(data, path)
26
+ File.open(path, 'w') do |f|
27
+ f.flock(File::LOCK_EX)
28
+ f.write(data)
29
+ end
30
+ end
31
+
32
+ def delete_data(path)
33
+ File.delete(path.untaint)
34
+ end
35
+
36
+ def restore_parser_cache(date, key = nil)
37
+ return nil if @tdiary.ignore_parser_cache
38
+
39
+ file = date.strftime("#{cache_path}/%Y%m.parser")
40
+ obj = nil
41
+ begin
42
+ PStore.new(file).transaction do |cache|
43
+ begin
44
+ ver = cache.root?('version') ? cache['version'] : nil
45
+ if ver == TDIARY_VERSION and cache.root?(key)
46
+ obj = cache[key]
47
+ else
48
+ clear_cache
49
+ end
50
+ cache.abort
51
+ rescue PStore::Error
52
+ end
53
+ end
54
+ rescue
55
+ clear_parser_cache( date )
56
+ end
57
+ obj
58
+ end
59
+
60
+ def store_parser_cache(date, obj, key = nil)
61
+ return nil if @tdiary.ignore_parser_cache
62
+
63
+ file = date.strftime("#{cache_path}/%Y%m.parser")
64
+ begin
65
+ PStore::new(file).transaction do |cache|
66
+ begin
67
+ cache[key] = obj
68
+ cache['version'] = TDIARY_VERSION
69
+ rescue PStore::Error
70
+ end
71
+ end
72
+ rescue
73
+ clear_parser_cache(date)
74
+ end
75
+ end
76
+
77
+ def clear_parser_cache(date)
78
+ file = date.strftime("#{cache_path}/%Y%m.parser")
79
+
80
+ begin
81
+ File.delete(file)
82
+ File.delete(file + '~')
83
+ rescue
84
+ end
85
+
86
+ nil
87
+ end
88
+
89
+ def cache_file( prefix )
90
+ if @tdiary.is_a?(TDiaryMonth)
91
+ "#{prefix}#{@tdiary.rhtml.sub( /month/, @tdiary.date.strftime( '%Y%m' ) ).sub( /\.rhtml$/, '.rb' )}"
92
+ elsif @tdiary.is_a?(TDiaryLatest)
93
+ if @tdiary.cgi.params['date'][0] then
94
+ nil
95
+ else
96
+ "#{prefix}#{@tdiary.rhtml.sub( /\.rhtml$/, '.rb' )}"
97
+ end
98
+ else
99
+ nil
100
+ end
101
+ end
102
+
103
+ def cache_exists?( prefix )
104
+ cache_file( prefix ) && FileTest::file?( "#{cache_path}/#{cache_file( prefix )}" )
105
+ end
106
+
107
+ def cache_enable?( prefix )
108
+ if @tdiary.is_a?(TDiaryView)
109
+ cache_exists?( prefix ) && (File::mtime( "#{cache_path}/#{cache_file( prefix )}" ) > @tdiary.last_modified)
110
+ else
111
+ cache_exists?( prefix )
112
+ end
113
+ end
114
+ end
115
+ end
116
+
117
+ # Local Variables:
118
+ # mode: ruby
119
+ # indent-tabs-mode: t
120
+ # tab-width: 3
121
+ # ruby-indent-level: 3
122
+ # End:
123
+ # vim: ts=3
@@ -0,0 +1,88 @@
1
+ require 'dalli'
2
+
3
+ module TDiary
4
+ module CacheIO
5
+ def restore_cache(prefix)
6
+ if key = cache_key(prefix)
7
+ restore_data(key)
8
+ end
9
+ end
10
+
11
+ def store_cache(cache, prefix)
12
+ if key = cache_key(prefix)
13
+ store_data(cache, key)
14
+ end
15
+ end
16
+
17
+ def clear_cache(target = :all)
18
+ if target == :all
19
+ delete_data(:all)
20
+ else
21
+ ym = target.to_s.scan(/\d{4}\d{2}/)[0]
22
+ ['latest.rb', 'i.latest.rb', "#{ym}.rb", "i.#{ym}.rb"].each do |key|
23
+ delete_data(key)
24
+ end
25
+ end
26
+ end
27
+
28
+ private
29
+
30
+ def restore_data(key)
31
+ memcache.get(key)
32
+ end
33
+
34
+ def store_data(data, key)
35
+ memcache.set(key, data)
36
+ end
37
+
38
+ def delete_data(key)
39
+ if key == :all
40
+ memcache.flush
41
+ else
42
+ memcache.delete(key)
43
+ end
44
+ end
45
+
46
+ def restore_parser_cache(date, key = nil)
47
+ restore_data(date.strftime("%Y%m.parser"))
48
+ end
49
+
50
+ def store_parser_cache(date, obj, key = nil)
51
+ store_data(obj, date.strftime("%Y%m.parser"))
52
+ end
53
+
54
+ def clear_parser_cache(*args)
55
+ delete_data(:all)
56
+ end
57
+
58
+ def cache_key(prefix)
59
+ if @tdiary.is_a?(TDiaryMonth)
60
+ "#{prefix}#{@tdiary.rhtml.sub( /month/, @tdiary.date.strftime( '%Y%m' ) ).sub( /\.rhtml$/, '.rb' )}"
61
+ elsif @tdiary.is_a?(TDiaryLatest)
62
+ if @tdiary.cgi.params['date'][0]
63
+ nil
64
+ else
65
+ "#{prefix}#{@tdiary.rhtml.sub( /\.rhtml$/, '.rb' )}"
66
+ end
67
+ else
68
+ nil
69
+ end
70
+ end
71
+
72
+ def memcache
73
+ options = {}
74
+ if @tdiary.conf.user_name
75
+ options.merge!({:namespace => @tdiary.conf.user_name})
76
+ end
77
+ @_client ||= Dalli::Client.new(nil, options)
78
+ end
79
+ end
80
+ end
81
+
82
+ # Local Variables:
83
+ # mode: ruby
84
+ # indent-tabs-mode: t
85
+ # tab-width: 3
86
+ # ruby-indent-level: 3
87
+ # End:
88
+ # vim: ts=3
@@ -0,0 +1,100 @@
1
+ require 'redis'
2
+ require 'redis-namespace'
3
+ require 'yaml'
4
+
5
+ module TDiary
6
+ module CacheIO
7
+ def restore_cache(prefix)
8
+ if key = cache_key(prefix)
9
+ restore_data(key)
10
+ end
11
+ end
12
+
13
+ def store_cache(cache, prefix)
14
+ if key = cache_key(prefix)
15
+ store_data(cache, key)
16
+ end
17
+ end
18
+
19
+ def clear_cache(target = :all)
20
+ if target == :all
21
+ delete_data(:all)
22
+ else
23
+ ym = target.to_s.scan(/\d{4}\d{2}/)[0]
24
+ ['latest.rb', 'i.latest.rb', "#{ym}.rb", "i.#{ym}.rb"].each do |key|
25
+ delete_data(key)
26
+ end
27
+ end
28
+ end
29
+
30
+ private
31
+
32
+ def restore_data(key)
33
+ obj = redis.get(key)
34
+ if obj.nil?
35
+ nil
36
+ else
37
+ YAML.load(obj)
38
+ end
39
+ end
40
+
41
+ def store_data(data, key)
42
+ redis.set(key, YAML.dump(data))
43
+ end
44
+
45
+ def delete_data(key)
46
+ if key == :all
47
+ redis.flushdb
48
+ else
49
+ redis.del(key)
50
+ end
51
+ end
52
+
53
+ def restore_parser_cache(date, key = nil)
54
+ obj = redis.get(date.strftime("%Y%m.parser"))
55
+ if obj.nil?
56
+ nil
57
+ else
58
+ YAML.load(obj)
59
+ end
60
+ end
61
+
62
+ def store_parser_cache(date, obj, key = nil)
63
+ redis.set(date.strftime("%Y%m.parser"), YAML.dump(obj))
64
+ end
65
+
66
+ def clear_parser_cache(date)
67
+ redis.flushdb
68
+ end
69
+
70
+ def cache_key(prefix)
71
+ if @tdiary.is_a?(TDiaryMonth)
72
+ "#{prefix}#{@tdiary.rhtml.sub( /month/, @tdiary.date.strftime( '%Y%m' ) ).sub( /\.rhtml$/, '.rb' )}"
73
+ elsif @tdiary.is_a?(TDiaryLatest)
74
+ if @tdiary.cgi.params['date'][0]
75
+ nil
76
+ else
77
+ "#{prefix}#{@tdiary.rhtml.sub( /\.rhtml$/, '.rb' )}"
78
+ end
79
+ else
80
+ nil
81
+ end
82
+ end
83
+
84
+ def redis
85
+ @_client ||= if @tdiary.conf.user_name
86
+ Redis::Namespace.new(@tdiary.conf.user_name.to_sym, Redis.new)
87
+ else
88
+ Redis.new
89
+ end
90
+ end
91
+ end
92
+ end
93
+
94
+ # Local Variables:
95
+ # mode: ruby
96
+ # indent-tabs-mode: t
97
+ # tab-width: 3
98
+ # ruby-indent-level: 3
99
+ # End:
100
+ # vim: ts=3
@@ -0,0 +1,297 @@
1
+ # -*- coding: utf-8; -*-
2
+ #
3
+ # defaultio.rb: tDiary IO class for tDiary 2.x format. $Revision: 1.44 $
4
+ #
5
+ # Copyright (C) 2001-2005, TADA Tadashi <t@tdtds.jp>
6
+ # You can redistribute it and/or modify it under GPL2.
7
+ #
8
+ require 'fileutils'
9
+ require 'tdiary/io/base'
10
+
11
+ module TDiary
12
+ TDIARY_MAGIC_MAJOR = 'TDIARY2'
13
+ TDIARY_MAGIC_MINOR = '01.00'
14
+ TDIARY_MAGIC = "#{TDIARY_MAGIC_MAJOR}.#{TDIARY_MAGIC_MINOR}"
15
+
16
+ module CommentIO
17
+ def comment_file( data_path, date )
18
+ date.strftime( "#{data_path}%Y/%Y%m.tdc" )
19
+ end
20
+
21
+ def restore_comment( file, diaries )
22
+ minor = ''
23
+ begin
24
+ File::open( file ) do |fh|
25
+ fh.flock( File::LOCK_SH )
26
+
27
+ major, minor = fh.gets.chomp.split( /\./, 2 )
28
+ unless TDIARY_MAGIC_MAJOR == major then
29
+ raise StandardError, 'bad file format.'
30
+ end
31
+
32
+ s = fh.read
33
+ s = migrate_to_01( s ) if minor == '00.00' and !@tdiary.conf['stop_migrate_01']
34
+ s.split( /\r?\n\.\r?\n/ ).each do |l|
35
+ headers, body = DefaultIO.parse_tdiary( l )
36
+ next unless body
37
+ comment = Comment::new(
38
+ headers['Name'],
39
+ headers['Mail'],
40
+ body,
41
+ Time::at( headers['Last-Modified'].to_i ) )
42
+ comment.show = false if headers['Visible'] == 'false'
43
+ diaries[headers['Date']].add_comment( comment ) if headers['Date']
44
+ end
45
+ end
46
+ rescue Errno::ENOENT
47
+ end
48
+ return minor == '00.00' ? TDiaryBase::DIRTY_COMMENT : TDiaryBase::DIRTY_NONE
49
+ end
50
+
51
+ def store_comment( file, diaries )
52
+ File::open( file, File::WRONLY | File::CREAT ) do |fhc|
53
+ fhc.flock( File::LOCK_EX )
54
+ fhc.rewind
55
+ fhc.truncate( 0 )
56
+ fhc.puts( TDIARY_MAGIC )
57
+ diaries.each do |date,diary|
58
+ diary.each_comment( diary.count_comments( true ) ) do |com|
59
+ fhc.puts( "Date: #{date}" )
60
+ fhc.puts( "Name: #{com.name}" )
61
+ fhc.puts( "Mail: #{com.mail}" )
62
+ fhc.puts( "Last-Modified: #{com.date.to_i}" )
63
+ fhc.puts( "Visible: #{com.visible? ? 'true' : 'false'}" )
64
+ fhc.puts
65
+ fhc.puts( com.body.gsub( /\r/, '' ).sub( /\n+\Z/, '' ).gsub( /\n\./, "\n.." ) )
66
+ fhc.puts( '.' )
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
72
+
73
+ module RefererIO
74
+ def referer_file( data_path, date )
75
+ date.strftime( "#{data_path}%Y/%Y%m.tdr" )
76
+ end
77
+
78
+ def restore_referer( file, diaries )
79
+ begin
80
+ File::open( file ) do |fh|
81
+ fh.flock( File::LOCK_SH )
82
+ fh.read.split( /\r?\n\.\r?\n/ ).each do |l|
83
+ headers, body = DefaultIO.parse_tdiary( l )
84
+ next unless body
85
+ body.each do |r|
86
+ count, ref = r.chomp.split( / /, 2 )
87
+ next unless ref
88
+ diaries[headers['Date']].add_referer( ref.chomp, count.to_i )
89
+ end
90
+ end
91
+
92
+ # convert to referer plugin format
93
+ diaries.each do |date,diary|
94
+ fname = file.sub( /\.tdr$/, "#{date[6,2]}.tdr".untaint )
95
+ File::open( fname, File::WRONLY | File::CREAT ) do |fhr|
96
+ fhr.flock( File::LOCK_EX )
97
+ fhr.rewind
98
+ fhr.truncate( 0 )
99
+ fhr.puts( TDiary::TDIARY_MAGIC )
100
+ fhr.puts( "Date: #{date}" )
101
+ fhr.puts
102
+ diary.each_referer( diary.count_referers ) do |count,ref|
103
+ fhr.puts( "#{count} #{ref}" )
104
+ end
105
+ fhr.puts( '.' )
106
+ end
107
+ end
108
+ end
109
+ File::rename( file, file.sub( /\.tdr$/, '.tdr~' ) )
110
+ rescue Errno::ENOENT
111
+ end
112
+ return TDiaryBase::DIRTY_NONE
113
+ end
114
+
115
+ def store_referer( file, diaries )
116
+ return
117
+ end
118
+ end
119
+
120
+ class DefaultIO < BaseIO
121
+ include CommentIO
122
+ include RefererIO
123
+ include CacheIO
124
+
125
+ class << self
126
+ def parse_tdiary( data )
127
+ header, body = data.split( /\r?\n\r?\n/, 2 )
128
+ headers = {}
129
+ if header then
130
+ header.lines.each do |l|
131
+ l.chomp!
132
+ key, val = l.scan( /([^:]*):\s*(.*)/ )[0]
133
+ headers[key] = val ? val.chomp : nil
134
+ end
135
+ end
136
+ if body then
137
+ body.gsub!( /^\./, '' )
138
+ else
139
+ body = ''
140
+ end
141
+ [headers, body]
142
+ end
143
+
144
+ def load_cgi_conf(conf)
145
+ conf.class.class_eval { attr_accessor :data_path }
146
+ raise TDiaryError, 'No @data_path variable.' unless conf.data_path
147
+
148
+ conf.data_path += '/' if /\/$/ !~ conf.data_path
149
+ raise TDiaryError, 'Do not set @data_path as same as tDiary system directory.' if conf.data_path == "#{TDiary::PATH}/"
150
+
151
+ File::open( "#{conf.data_path.untaint}tdiary.conf" ){|f| f.read }
152
+ rescue IOError, Errno::ENOENT
153
+ end
154
+
155
+ def save_cgi_conf(conf, result)
156
+ File::open( "#{conf.data_path.untaint}tdiary.conf", 'w' ) {|o| o.print result }
157
+ rescue IOError, Errno::ENOENT
158
+ end
159
+ end
160
+
161
+ #
162
+ # block must be return boolean which dirty diaries.
163
+ #
164
+ def transaction( date )
165
+ diaries = {}
166
+ dir = date.strftime( "#{@data_path}%Y" )
167
+ @dfile = date.strftime( "#{@data_path}%Y/%Y%m.td2" )
168
+ cfile = comment_file( @data_path, date )
169
+ rfile = referer_file( @data_path, date )
170
+ begin
171
+ FileUtils.mkdir_p(dir)
172
+ begin
173
+ fh = File::open( @dfile, 'r+' )
174
+ rescue
175
+ fh = File::open( @dfile, 'w+' )
176
+ end
177
+ fh.flock( File::LOCK_EX )
178
+
179
+ cache = restore_parser_cache( date, 'default' )
180
+ force_save = TDiaryBase::DIRTY_NONE
181
+ unless cache then
182
+ force_save |= restore( fh, diaries )
183
+ force_save |= restore_comment( cfile, diaries )
184
+ force_save |= restore_referer( rfile, diaries )
185
+ else
186
+ diaries.update( cache )
187
+ end
188
+ dirty = yield( diaries ) if iterator?
189
+ store( fh, diaries ) if ((dirty | force_save) & TDiaryBase::DIRTY_DIARY) != 0
190
+ store_comment( cfile, diaries ) if ((dirty | force_save) & TDiaryBase::DIRTY_COMMENT) != 0
191
+ store_referer( rfile, diaries ) if ((dirty | force_save) & TDiaryBase::DIRTY_REFERER) != 0
192
+ if dirty != TDiaryBase::DIRTY_NONE or not cache then
193
+ store_parser_cache(date, diaries, 'default')
194
+ end
195
+
196
+ if diaries.empty?
197
+ begin
198
+ if fh then
199
+ fh.close
200
+ fh = nil
201
+ end
202
+ File::delete( @dfile )
203
+ rescue Errno::ENOENT
204
+ end
205
+ begin
206
+ store_parser_cache(date, nil, nil)
207
+ rescue Errno::ENOENT
208
+ end
209
+ end
210
+ # delete dispensable data directory
211
+ begin
212
+ Dir.delete( dir ) if Dir.new( dir ).entries.reject {|f| "." == f or ".." == f}.empty?
213
+ rescue Errno::ENOENT
214
+ end
215
+ ensure
216
+ fh.close if fh
217
+ end
218
+ end
219
+
220
+ def calendar
221
+ calendar = {}
222
+ Dir["#{@data_path}????"].sort.each do |dir|
223
+ next unless %r[/\d{4}$] =~ dir
224
+ Dir["#{dir.untaint}/??????.td2"].sort.each do |file|
225
+ year, month = file.scan( %r[/(\d{4})(\d\d)\.td2$] )[0]
226
+ next unless year
227
+ calendar[year] = [] unless calendar[year]
228
+ calendar[year] << month
229
+ end
230
+ end
231
+ calendar
232
+ end
233
+
234
+ def cache_dir
235
+ @tdiary.conf.cache_path || "#{@data_path}/cache"
236
+ end
237
+
238
+ private
239
+
240
+ def restore( fh, diaries )
241
+ begin
242
+ fh.seek( 0 )
243
+ begin
244
+ major, minor = fh.gets.chomp.split( /\./, 2 )
245
+ unless TDIARY_MAGIC_MAJOR == major then
246
+ raise StandardError, 'bad file format.'
247
+ end
248
+
249
+ # read and parse diary
250
+ style_name = ''
251
+ s = fh.read
252
+ s = migrate_to_01( s ) if minor == '00.00' and !@tdiary.conf['stop_migrate_01']
253
+ s.split( /\r?\n\.\r?\n/ ).each do |l|
254
+ headers, body = DefaultIO.parse_tdiary( l )
255
+ style_name = headers['Format'] || 'tDiary'
256
+ diary = style( style_name )::new( headers['Date'], headers['Title'], body, Time::at( headers['Last-Modified'].to_i ) )
257
+ diary.show( headers['Visible'] == 'true' ? true : false )
258
+ diaries[headers['Date']] = diary
259
+ end
260
+ rescue NameError
261
+ # no magic number when it is new file.
262
+ end
263
+ end
264
+ return minor == '00.00' ? TDiaryBase::DIRTY_DIARY : TDiaryBase::DIRTY_NONE
265
+ end
266
+
267
+ def store( fh, diaries )
268
+ begin
269
+ fh.seek( 0 )
270
+ fh.puts( TDIARY_MAGIC )
271
+ diaries.sort_by {|date, diary| date}.each do |date,diary|
272
+ # save diaries
273
+ fh.puts( "Date: #{date}" )
274
+ fh.puts( "Title: #{diary.title}" )
275
+ fh.puts( "Last-Modified: #{diary.last_modified.to_i}" )
276
+ fh.puts( "Visible: #{diary.visible? ? 'true' : 'false'}" )
277
+ fh.puts( "Format: #{diary.style}" )
278
+ fh.puts
279
+ fh.puts( diary.to_src.gsub( /\r/, '' ).gsub( /\n\./, "\n.." ) )
280
+ fh.puts( '.' )
281
+ end
282
+ fh.truncate( fh.tell )
283
+ end
284
+ end
285
+
286
+ def migrate_to_01( day )
287
+ @tdiary.conf.migrate_to_utf8( day )
288
+ end
289
+ end
290
+ end
291
+
292
+ # Local Variables:
293
+ # mode: ruby
294
+ # indent-tabs-mode: t
295
+ # tab-width: 3
296
+ # ruby-indent-level: 3
297
+ # End: