tdiary-contrib 3.2.2.20130518

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 (393) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +1 -0
  3. data/.travis.yml +7 -0
  4. data/Gemfile +13 -0
  5. data/Gemfile.lock +35 -0
  6. data/README.en.md +12 -0
  7. data/README.md +13 -0
  8. data/Rakefile +41 -0
  9. data/doc/en/filter/spambayes.txt +3 -0
  10. data/doc/en/plugin.txt +1 -0
  11. data/doc/en/style/hatena.txt +10 -0
  12. data/doc/en/style/markdown.txt +16 -0
  13. data/doc/en/util.txt +1 -0
  14. data/doc/ja/filter/antirefspam.history.txt +59 -0
  15. data/doc/ja/filter/antirefspam.txt +86 -0
  16. data/doc/ja/filter/comment_key.ja.html +182 -0
  17. data/doc/ja/filter/spambayes.txt +3 -0
  18. data/doc/ja/plugin/add_bookmark.txt +50 -0
  19. data/doc/ja/plugin/category_to_tag.txt +21 -0
  20. data/doc/ja/plugin/cocoment.txt +31 -0
  21. data/doc/ja/plugin/google_adsense.txt +25 -0
  22. data/doc/ja/plugin/google_analytics.txt +7 -0
  23. data/doc/ja/plugin/image_detail.txt +69 -0
  24. data/doc/ja/plugin/image_gps.txt +36 -0
  25. data/doc/ja/plugin/image_gps2.txt +41 -0
  26. data/doc/ja/plugin/livedoor_weather.txt +105 -0
  27. data/doc/ja/plugin/opensearch_ad.txt +16 -0
  28. data/doc/ja/plugin/section_footer.txt +84 -0
  29. data/doc/ja/plugin/select_theme.txt +1 -0
  30. data/doc/ja/plugin.txt +13 -0
  31. data/doc/ja/style/hatena.txt +10 -0
  32. data/doc/ja/style/markdown.txt +13 -0
  33. data/doc/ja/util.txt +12 -0
  34. data/filter/antirefspam.rb +263 -0
  35. data/filter/commentkey.rb +29 -0
  36. data/filter/commentsize.rb +18 -0
  37. data/filter/hidecomment.rb +13 -0
  38. data/filter/iplookup.rb +55 -0
  39. data/filter/plugin/antirefspam.rb +59 -0
  40. data/filter/plugin/commentkey.rb +58 -0
  41. data/filter/plugin/commentsize.rb +12 -0
  42. data/filter/plugin/en/iplookup.rb +9 -0
  43. data/filter/plugin/en/spambayes.rb +123 -0
  44. data/filter/plugin/iplookup.rb +39 -0
  45. data/filter/plugin/ja/antirefspam.rb +91 -0
  46. data/filter/plugin/ja/commentkey.rb +17 -0
  47. data/filter/plugin/ja/commentsize.rb +6 -0
  48. data/filter/plugin/ja/iplookup.rb +9 -0
  49. data/filter/plugin/ja/spambayes.rb +124 -0
  50. data/filter/plugin/spambayes.rb +501 -0
  51. data/filter/plugin/zh/iplookup.rb +9 -0
  52. data/filter/rblcheck.rb +36 -0
  53. data/filter/spambayes.rb +535 -0
  54. data/filter/spamlookup.rb +37 -0
  55. data/io/dbi_io/ChangeLog +19 -0
  56. data/io/dbi_io/README.ja +39 -0
  57. data/io/dbi_io/dbi_io.rb +181 -0
  58. data/io/dbi_io/plugin/refererDbiIO.rb +76 -0
  59. data/io/dbi_io/tdiary_table.sql +42 -0
  60. data/js/appstore.js +109 -0
  61. data/js/datepicker.js +69 -0
  62. data/js/editor.js +82 -0
  63. data/js/flickr.js +157 -0
  64. data/js/image_ex.js +79 -0
  65. data/js/jquery.socialbutton.js +842 -0
  66. data/js/nicovideo.js +17 -0
  67. data/js/picasa.js +322 -0
  68. data/js/plugin_checker.js +71 -0
  69. data/js/prettify/lang-apollo.js +2 -0
  70. data/js/prettify/lang-clj.js +18 -0
  71. data/js/prettify/lang-css.js +2 -0
  72. data/js/prettify/lang-go.js +1 -0
  73. data/js/prettify/lang-hs.js +2 -0
  74. data/js/prettify/lang-lisp.js +3 -0
  75. data/js/prettify/lang-lua.js +2 -0
  76. data/js/prettify/lang-ml.js +2 -0
  77. data/js/prettify/lang-n.js +4 -0
  78. data/js/prettify/lang-proto.js +1 -0
  79. data/js/prettify/lang-scala.js +2 -0
  80. data/js/prettify/lang-sql.js +2 -0
  81. data/js/prettify/lang-tex.js +1 -0
  82. data/js/prettify/lang-vb.js +2 -0
  83. data/js/prettify/lang-vhdl.js +3 -0
  84. data/js/prettify/lang-wiki.js +2 -0
  85. data/js/prettify/lang-xq.js +3 -0
  86. data/js/prettify/lang-yaml.js +2 -0
  87. data/js/prettify/prettify.css +1 -0
  88. data/js/prettify/prettify.js +28 -0
  89. data/js/referer.js +17 -0
  90. data/js/show_and_hide.js +39 -0
  91. data/js/socialbutton.js +126 -0
  92. data/js/twitter_anywhere.js +28 -0
  93. data/js/yahoo_kousei.js +21 -0
  94. data/lib/bayes/convert.rb +34 -0
  95. data/lib/bayes.rb +232 -0
  96. data/lib/exifparser/BUGS +1 -0
  97. data/lib/exifparser/ChangeLog +169 -0
  98. data/lib/exifparser/README +15 -0
  99. data/lib/exifparser/install.rb +1015 -0
  100. data/lib/exifparser/lib/exifparser/makernote/canon.rb +502 -0
  101. data/lib/exifparser/lib/exifparser/makernote/fujifilm.rb +415 -0
  102. data/lib/exifparser/lib/exifparser/makernote/minolta.rb +84 -0
  103. data/lib/exifparser/lib/exifparser/makernote/mk_nikonflensname.rb +39 -0
  104. data/lib/exifparser/lib/exifparser/makernote/nikon.rb +267 -0
  105. data/lib/exifparser/lib/exifparser/makernote/nikon2.rb +581 -0
  106. data/lib/exifparser/lib/exifparser/makernote/nikonflensname.rb +438 -0
  107. data/lib/exifparser/lib/exifparser/makernote/olympus.rb +225 -0
  108. data/lib/exifparser/lib/exifparser/makernote/prove.rb +84 -0
  109. data/lib/exifparser/lib/exifparser/makernote/sigma.rb +237 -0
  110. data/lib/exifparser/lib/exifparser/pre-setup.rb +1 -0
  111. data/lib/exifparser/lib/exifparser/scan.rb +278 -0
  112. data/lib/exifparser/lib/exifparser/tag.rb +2298 -0
  113. data/lib/exifparser/lib/exifparser/thumbnail.rb +76 -0
  114. data/lib/exifparser/lib/exifparser/utils.rb +88 -0
  115. data/lib/exifparser/lib/exifparser.rb +265 -0
  116. data/lib/exifparser/sample/exifview.rb +279 -0
  117. data/lib/tdiary-contrib.rb +19 -0
  118. data/lib/wgs2tky.rb +93 -0
  119. data/misc/section_footer2/buzzurl.yaml +6 -0
  120. data/misc/section_footer2/fc2.yaml +6 -0
  121. data/misc/section_footer2/ldc.yaml +6 -0
  122. data/misc/section_footer2/retweet.yaml +7 -0
  123. data/misc/section_footer2/twitter.yaml +7 -0
  124. data/misc/section_footer2/yahoo.yaml +6 -0
  125. data/misc/tdiarygraph/tdiarygraph120x90e.swf +0 -0
  126. data/misc/tdiarygraph/tdiarygraph125x125e.swf +0 -0
  127. data/misc/tdiarygraph/tdiarygraph240x180e.swf +0 -0
  128. data/misc/tdiarygraph/tdiarygraph468x60e.swf +0 -0
  129. data/misc/tdiarygraph/tdiarygraph728x90e.swf +0 -0
  130. data/misc/tdiarytimes/tdiarytimes125x125r.swf +0 -0
  131. data/misc/tdiarytimes/tdiarytimes125x125r7.swf +0 -0
  132. data/misc/tdiarytimes/tdiarytimes125x125s.swf +0 -0
  133. data/misc/tdiarytimes/tdiarytimes125x30.swf +0 -0
  134. data/misc/tdiarytimes/tdiarytimes234x30.swf +0 -0
  135. data/misc/tdiarytimes/tdiarytimes468x30.swf +0 -0
  136. data/plugin/add_bookmark.rb +89 -0
  137. data/plugin/apple_webclip.rb +26 -0
  138. data/plugin/appstore.rb +47 -0
  139. data/plugin/bigpresen.rb +86 -0
  140. data/plugin/bitly.rb +39 -0
  141. data/plugin/bootstrap-navi.rb +54 -0
  142. data/plugin/canonical.rb +9 -0
  143. data/plugin/category_similar.rb +73 -0
  144. data/plugin/category_to_tag.rb +60 -0
  145. data/plugin/category_to_tagcloud.rb +172 -0
  146. data/plugin/cocomment.rb +37 -0
  147. data/plugin/code-prettify.rb +23 -0
  148. data/plugin/coderwall.rb +34 -0
  149. data/plugin/datepicker.rb +28 -0
  150. data/plugin/day2section.rb +20 -0
  151. data/plugin/del_footer.rb +111 -0
  152. data/plugin/description_from_body.rb +23 -0
  153. data/plugin/development.rb +16 -0
  154. data/plugin/editor.rb +11 -0
  155. data/plugin/en/add_bookmark.rb +20 -0
  156. data/plugin/en/del_footer.rb +10 -0
  157. data/plugin/en/git-register.rb +3 -0
  158. data/plugin/en/livedoor_weather.rb +25 -0
  159. data/plugin/en/microsummary.rb +18 -0
  160. data/plugin/en/nicovideo.rb +38 -0
  161. data/plugin/en/openid.rb +8 -0
  162. data/plugin/en/section_footer.rb +6 -0
  163. data/plugin/en/section_footer2.rb +3 -0
  164. data/plugin/en/socialbutton.rb +5 -0
  165. data/plugin/everytrail.rb +39 -0
  166. data/plugin/facebook_comments.rb +59 -0
  167. data/plugin/flickr.rb +209 -0
  168. data/plugin/gist.rb +16 -0
  169. data/plugin/git-register.rb +240 -0
  170. data/plugin/github_badge.rb +27 -0
  171. data/plugin/github_link.rb +9 -0
  172. data/plugin/goo_gl.rb +42 -0
  173. data/plugin/google_adsense.rb +132 -0
  174. data/plugin/google_analytics.rb +39 -0
  175. data/plugin/google_map.rb +168 -0
  176. data/plugin/google_sitemaps.rb +60 -0
  177. data/plugin/google_webmaster.rb +22 -0
  178. data/plugin/hatena_bookmark_nocomment.rb +9 -0
  179. data/plugin/hatena_star.rb +66 -0
  180. data/plugin/hb_footer.rb +255 -0
  181. data/plugin/hb_footer4sec.rb +244 -0
  182. data/plugin/hb_footer4sec_js.rb +30 -0
  183. data/plugin/hide_comment_form.rb +4 -0
  184. data/plugin/hide_sidebar_iphone.rb +21 -0
  185. data/plugin/iddy.rb +81 -0
  186. data/plugin/image_detail.rb +143 -0
  187. data/plugin/image_ex.rb +462 -0
  188. data/plugin/image_gps.rb +128 -0
  189. data/plugin/inline_wiki.rb +6 -0
  190. data/plugin/instagr.rb +64 -0
  191. data/plugin/ja/add_bookmark.rb +20 -0
  192. data/plugin/ja/del_footer.rb +10 -0
  193. data/plugin/ja/flickr.rb +62 -0
  194. data/plugin/ja/git-register.rb +3 -0
  195. data/plugin/ja/google_sitemaps.rb +35 -0
  196. data/plugin/ja/livedoor_weather.rb +25 -0
  197. data/plugin/ja/microsummary.rb +18 -0
  198. data/plugin/ja/nicovideo.rb +41 -0
  199. data/plugin/ja/openid.rb +7 -0
  200. data/plugin/ja/section_footer.rb +6 -0
  201. data/plugin/ja/section_footer2.rb +4 -0
  202. data/plugin/ja/socialbutton.rb +6 -0
  203. data/plugin/jdate.rb +20 -0
  204. data/plugin/jholiday.rb +16 -0
  205. data/plugin/jmonth.rb +20 -0
  206. data/plugin/jquery_ui_theme.rb +55 -0
  207. data/plugin/jroku.rb +28 -0
  208. data/plugin/jyear.rb +37 -0
  209. data/plugin/latlonglab_route.rb +25 -0
  210. data/plugin/lazy_referer.rb +38 -0
  211. data/plugin/livedoor_weather.rb +180 -0
  212. data/plugin/make_link.rb +44 -0
  213. data/plugin/makerss_category.rb +43 -0
  214. data/plugin/makerss_comment.rb +35 -0
  215. data/plugin/microsummary.rb +62 -0
  216. data/plugin/mm_footer.rb +215 -0
  217. data/plugin/monthly_autopagerize.rb +67 -0
  218. data/plugin/my_hotentry.rb +132 -0
  219. data/plugin/navi_day.rb +118 -0
  220. data/plugin/navi_this_month.rb +15 -0
  221. data/plugin/nicovideo.rb +115 -0
  222. data/plugin/notify_miniblog.rb +134 -0
  223. data/plugin/ogp.rb +55 -0
  224. data/plugin/ohmsha_estore.rb +71 -0
  225. data/plugin/openid.rb +90 -0
  226. data/plugin/opensearch_ad.rb +33 -0
  227. data/plugin/picasa.rb +56 -0
  228. data/plugin/plugin_checker.rb +41 -0
  229. data/plugin/popit.rb +22 -0
  230. data/plugin/prettify.rb +19 -0
  231. data/plugin/prezi.rb +10 -0
  232. data/plugin/profile.rb +222 -0
  233. data/plugin/puboo.rb +93 -0
  234. data/plugin/pygments_css.rb +76 -0
  235. data/plugin/rating.rb +419 -0
  236. data/plugin/recent_estraier.rb +50 -0
  237. data/plugin/recent_tweet.rb +71 -0
  238. data/plugin/retweet.rb +86 -0
  239. data/plugin/rubykaigi.rb +99 -0
  240. data/plugin/search-bing.rb +87 -0
  241. data/plugin/search-default.rb +264 -0
  242. data/plugin/search-google-custom.rb +60 -0
  243. data/plugin/search-yahoo-websearch.rb +121 -0
  244. data/plugin/search-yahoo.rb +109 -0
  245. data/plugin/section_footer.rb +195 -0
  246. data/plugin/section_footer2.rb +278 -0
  247. data/plugin/section_permalink.rb +73 -0
  248. data/plugin/section_permalink_anchor.rb +39 -0
  249. data/plugin/select_style.rb +42 -0
  250. data/plugin/select_theme.rb +90 -0
  251. data/plugin/show_and_hide.rb +77 -0
  252. data/plugin/slideshare.rb +10 -0
  253. data/plugin/socialbutton.rb +60 -0
  254. data/plugin/tatsu_zine.rb +93 -0
  255. data/plugin/tdiarygraph_flashstyle.rb +296 -0
  256. data/plugin/tdiarytimes.rb +166 -0
  257. data/plugin/tdiarytimes2.rb +406 -0
  258. data/plugin/tdiarytimes_flashstyle.rb +263 -0
  259. data/plugin/tdiarytimes_textstyle.rb +290 -0
  260. data/plugin/title_anchor.rb +16 -0
  261. data/plugin/tweet_quote.rb +106 -0
  262. data/plugin/twitpic.rb +10 -0
  263. data/plugin/twitter.rb +46 -0
  264. data/plugin/twitter_anywhere.rb +209 -0
  265. data/plugin/twitter_badge.rb +42 -0
  266. data/plugin/twitter_js.rb +59 -0
  267. data/plugin/ustream.rb +19 -0
  268. data/plugin/vimeo.rb +14 -0
  269. data/plugin/volatile.rb +89 -0
  270. data/plugin/vote.rb +100 -0
  271. data/plugin/wikiloc.rb +27 -0
  272. data/plugin/windex.rb +512 -0
  273. data/plugin/yahoo_kousei.rb +79 -0
  274. data/plugin/yahoo_map.rb +97 -0
  275. data/plugin/youtube.rb +33 -0
  276. data/plugin/yshop.rb +189 -0
  277. data/plugin/zenback.rb +46 -0
  278. data/spec/apple_webclip_spec.rb +46 -0
  279. data/spec/fixtures/friendfeed.xml +2 -0
  280. data/spec/fixtures/github.json +1 -0
  281. data/spec/fixtures/twitter.xml +73 -0
  282. data/spec/gist_spec.rb +16 -0
  283. data/spec/github_link_spec.rb +39 -0
  284. data/spec/google_analytics_spec.rb +60 -0
  285. data/spec/jdate_spec.rb +23 -0
  286. data/spec/jmonth_spec.rb +28 -0
  287. data/spec/jyear_spec.rb +21 -0
  288. data/spec/my_hotentry_spec.rb +78 -0
  289. data/spec/openid_spec.rb +246 -0
  290. data/spec/opensearch_ad_spec.rb +50 -0
  291. data/spec/profile_spec.rb +88 -0
  292. data/spec/rcov.opts +2 -0
  293. data/spec/spec_helper.rb +223 -0
  294. data/spec/title_anchor_spec.rb +39 -0
  295. data/spec/twitter_js_spec.rb +116 -0
  296. data/spec/youtube_spec.rb +20 -0
  297. data/style/hatena_style.rb +1011 -0
  298. data/style/markdown_style.rb +239 -0
  299. data/style/wikiext_style.rb +21 -0
  300. data/tdiary-contrib.gemspec +25 -0
  301. data/util/clean-spam/README.ja +1 -0
  302. data/util/clean-spam/tdiary-comment-clean +46 -0
  303. data/util/clean-spam/tdiary-comment-clean2 +81 -0
  304. data/util/clean-spam/tdiary-referer-clean +46 -0
  305. data/util/convert_pstore.rb +82 -0
  306. data/util/estraier-search/ChangeLog +36 -0
  307. data/util/estraier-search/README.ja +114 -0
  308. data/util/estraier-search/en/estraier-register.rb +3 -0
  309. data/util/estraier-search/estraier-register.rb +298 -0
  310. data/util/estraier-search/estraier-search.rb +273 -0
  311. data/util/estraier-search/estraier.rhtml +73 -0
  312. data/util/estraier-search/estraier.rxml +23 -0
  313. data/util/estraier-search/i.estraier.rhtml +31 -0
  314. data/util/estraier-search/ja/estraier-register.rb +3 -0
  315. data/util/image-gallery/README.ja +27 -0
  316. data/util/image-gallery/image-gallery.rb +523 -0
  317. data/util/image-gallery/image-gallery.rb.euc-jp +523 -0
  318. data/util/image-gallery/js/SmoothGallery/Changelog +52 -0
  319. data/util/image-gallery/js/SmoothGallery/css/ReMooz.css +186 -0
  320. data/util/image-gallery/js/SmoothGallery/css/img/carrow1.gif +0 -0
  321. data/util/image-gallery/js/SmoothGallery/css/img/carrow2.gif +0 -0
  322. data/util/image-gallery/js/SmoothGallery/css/img/closebox.gif +0 -0
  323. data/util/image-gallery/js/SmoothGallery/css/img/closebox.png +0 -0
  324. data/util/image-gallery/js/SmoothGallery/css/img/fleche1.gif +0 -0
  325. data/util/image-gallery/js/SmoothGallery/css/img/fleche1.png +0 -0
  326. data/util/image-gallery/js/SmoothGallery/css/img/fleche2.gif +0 -0
  327. data/util/image-gallery/js/SmoothGallery/css/img/fleche2.png +0 -0
  328. data/util/image-gallery/js/SmoothGallery/css/img/loading-bar-black.gif +0 -0
  329. data/util/image-gallery/js/SmoothGallery/css/img/open.gif +0 -0
  330. data/util/image-gallery/js/SmoothGallery/css/img/open.png +0 -0
  331. data/util/image-gallery/js/SmoothGallery/css/img/remo_bg_e.png +0 -0
  332. data/util/image-gallery/js/SmoothGallery/css/img/remo_bg_n.png +0 -0
  333. data/util/image-gallery/js/SmoothGallery/css/img/remo_bg_ne.png +0 -0
  334. data/util/image-gallery/js/SmoothGallery/css/img/remo_bg_nw.png +0 -0
  335. data/util/image-gallery/js/SmoothGallery/css/img/remo_bg_s.png +0 -0
  336. data/util/image-gallery/js/SmoothGallery/css/img/remo_bg_se.png +0 -0
  337. data/util/image-gallery/js/SmoothGallery/css/img/remo_bg_sw.png +0 -0
  338. data/util/image-gallery/js/SmoothGallery/css/img/remo_bg_w.png +0 -0
  339. data/util/image-gallery/js/SmoothGallery/css/img/spinner.gif +0 -0
  340. data/util/image-gallery/js/SmoothGallery/css/jd.gallery.css +371 -0
  341. data/util/image-gallery/js/SmoothGallery/css/layout.css +91 -0
  342. data/util/image-gallery/js/SmoothGallery/license.txt +621 -0
  343. data/util/image-gallery/js/SmoothGallery/resizer.php +113 -0
  344. data/util/image-gallery/js/SmoothGallery/scripts/Changelog +52 -0
  345. data/util/image-gallery/js/SmoothGallery/scripts/History.Routing.js +126 -0
  346. data/util/image-gallery/js/SmoothGallery/scripts/History.js +109 -0
  347. data/util/image-gallery/js/SmoothGallery/scripts/ReMooz.js +364 -0
  348. data/util/image-gallery/js/SmoothGallery/scripts/jd.gallery.js +843 -0
  349. data/util/image-gallery/js/SmoothGallery/scripts/jd.gallery.set.js +183 -0
  350. data/util/image-gallery/js/SmoothGallery/scripts/jd.gallery.transitions.js +90 -0
  351. data/util/image-gallery/js/SmoothGallery/scripts/jdgalleryresize.js +828 -0
  352. data/util/image-gallery/js/SmoothGallery/scripts/license.txt +621 -0
  353. data/util/image-gallery/js/SmoothGallery/scripts/mootools-1.2-more.js +103 -0
  354. data/util/image-gallery/js/SmoothGallery/scripts/mootools-1.2.1-core-yc.js +349 -0
  355. data/util/image-gallery/js/SmoothGallery/scripts/resizer.php +113 -0
  356. data/util/image-gallery/misc/plugin/recent_image.rb +406 -0
  357. data/util/image-gallery/skel/gallery.rhtml +154 -0
  358. data/util/image-gallery/skel/gallery.rhtml.euc-jp +154 -0
  359. data/util/image-gallery/tdiary.conf.igsample +8 -0
  360. data/util/image-gallery/theme/image-gallery.css +85 -0
  361. data/util/image2flickr.rb +282 -0
  362. data/util/posttdiary/README.ja +12 -0
  363. data/util/posttdiary/posttdiary-ex.rb +1155 -0
  364. data/util/posttdiary/posttdiary.rb +245 -0
  365. data/util/rast-search/ChangeLog +55 -0
  366. data/util/rast-search/README.ja +99 -0
  367. data/util/rast-search/en/rast-register.rb +3 -0
  368. data/util/rast-search/i.rast.rhtml +33 -0
  369. data/util/rast-search/ja/rast-register.rb +3 -0
  370. data/util/rast-search/rast-register.rb +326 -0
  371. data/util/rast-search/rast-search.rb +249 -0
  372. data/util/rast-search/rast.rhtml +66 -0
  373. data/util/rast-search/rast.rxml +21 -0
  374. data/util/section_link/README +11 -0
  375. data/util/section_link/misc/plugin/section_link.rb +68 -0
  376. data/util/section_link/misc/plugin/section_link_anchor.rb +38 -0
  377. data/util/section_link/tdiary/tdiary_day_ext.rb +21 -0
  378. data/util/section_link/tdiary/tdiaryext_style.rb +36 -0
  379. data/util/section_link/tdiary/wikiext_style.rb +36 -0
  380. data/util/tdiary-for-ruby1.9/compatible.rb +97 -0
  381. data/util/tdiary-for-ruby1.9/tdiary-2.2.0.patch +98 -0
  382. data/util/tdiary-for-ruby1.9/tdiary-2.3.1.patch +212 -0
  383. data/util/tdiary-grep/README +4 -0
  384. data/util/tdiary-grep/grep.rb +445 -0
  385. data/util/tdiary-mode/http.el +130 -0
  386. data/util/tdiary-mode/tdiary-mode.el +613 -0
  387. data/util/tdiary-vim/ChangeLog +25 -0
  388. data/util/tdiary-vim/README +60 -0
  389. data/util/tdiary-vim/tdiary.vim +350 -0
  390. data/util/tdiarysearch/README.en +53 -0
  391. data/util/tdiarysearch/README.ja +99 -0
  392. data/util/tdiarysearch/search.rb +504 -0
  393. metadata +497 -0
@@ -0,0 +1,1155 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # posttdiary-ex: update tDiary via e-mail. $Revision: 1.2 $
4
+ #
5
+ # Copyright (C) 2002, All right reserved by TADA Tadashi <sho@spc.gr.jp>
6
+ # You can redistribute it and/or modify it under GPL2.
7
+ #
8
+ # 2010.10.19: v.1.71: Modified by K.Sakurai (http://ks.nwr.jp)
9
+ # Acknowledgements:
10
+ # * Based on posttdiary.rb & tdiary.rb by TADA.
11
+ # * Some codes partially imported from Enikki Plugin Ex. :
12
+ # http://shimoi.s26.xrea.com/hiki/hiki.cgi?TdiaryEnikkiEx
13
+ # * Thanks to taketori for image size detection method.
14
+ # * Thanks to NOB for debugging.
15
+ # * Thanks to tamo (http://tamo.tdiary.net) for image-POSTing codes & testing.
16
+ #
17
+
18
+ # language setup for tdiary.conf (for both @data_path & @tdiary_dirname)
19
+ @tdencoding = 'UTF-8'
20
+ # @tdencoding = 'US-ASCII'
21
+ # @tdencoding = 'EUC-JP'
22
+ # @tdencoding = 'Big5'
23
+
24
+ #----------------------------------------------
25
+
26
+ def usage( detailed_help )
27
+ # (if "!" is at the head of the line, it is to be shown only when detailed_help == true (-h option) )
28
+ text = <<-TEXT
29
+ #{File::basename __FILE__}: update tDiary via e-mail (v1.64).
30
+ usage: ruby posttdiary-ex.rb [options (without -d)] <url> <user> <passwd>
31
+ ruby posttdiary-ex.rb [options (with -d)]
32
+ arguments:
33
+ url: update.rb's URL of your diary
34
+ user: username for your tDiary system
35
+ passwd: password for your tDiary system
36
+ ! If the To: field is formatted as "user-passwd@example.com",
37
+ ! you can omit user and passwd arguments.
38
+ options:
39
+ ! ============ for automatic configuration ==========
40
+ --read-conffile, -a dirname: read settings from (dirname)/tdiary.conf
41
+ ! Reads configuration parameters of image_ex plugin as well.
42
+ ! (The default values of -i, -u, -t, -z, -o, -y, -C can be imported.)
43
+ ! Specify the localtion (or fullpathname) of tDiary conf file.
44
+ ! ex. -a /home/hoge/htdocs/diary/tdiary.conf
45
+ !
46
+ ! ============ basic options ==============
47
+ --image-path, -i dirname: directory to store the image(s) in.
48
+ --image-url, -u URL: URL of the image directory.
49
+ ! You must specify both -i and -u options
50
+ ! (unless they are available from tdiary.conf + image_ex plugin)
51
+ ! When using --remote-mode or --use-image-ex, -u is not required.
52
+ --use-subject, -s: use mail subject as subtitle
53
+ ! Also inserts attached image(s) between subtitle and body.
54
+ --make-thumbnail, -t size: Create thumbnail with a link to the original image
55
+ ! Works only when the original image is larger than the specified size
56
+ ! (see --threshold-size also)
57
+ ! ex. -t 80x80
58
+ --image-geometry, -g size: resize image(s).
59
+ ! The original image would be overwritten.
60
+ ! Does not change the image size when the original image is smaller.
61
+ ! ex. -g 800x800 (change the image size to "fit in" to 800x800 pixels)
62
+ --use-image-ex, -e: Recognize & auto-generate tags for image.rb (Enikki)
63
+ or image_ex.rb (Enikki ex.) plugin
64
+ ! Tag format: <%=image (serialno),"(alt text)"%>
65
+ ! Serialno starts from 0. Will be automatically increased to match
66
+ ! the real filename.
67
+ ! Overrides -f option.
68
+ --wiki-style, -w: output image tags in Wiki style
69
+ ! Suppress adding a whitespace before each tag
70
+ ! Adds "!" to subject when -s option is given
71
+ ! Recognize Wiki style tags and rewrite
72
+ ! Must be used with image.rb or image_ex.rb plugin.
73
+ --blog-style, -B: do not specify date to append unless specified
74
+ ! Suitable for use with blogkit
75
+ --read-exif, -c: read "User Comment" tag from EXIF and use as ALT text
76
+ ! If not specified, filename would be used as ALT text.
77
+ ! Requires libexif and "exif" command.
78
+ --hour-offset, -o offset: hour_offset of tDiary
79
+ ! (ex. -o +4 (do not change date until 28:00))
80
+ --yearly-dir, -y: put images in yearly separated directories
81
+ ! ( 2004/ , 2005/ , ...)
82
+ --help, -h: show detailed help & advanced options
83
+ !
84
+ ! ============ advanced options ==============
85
+ ! --convert-path, -C fullpath_of_convert: location of "convert" command
86
+ ! Use this option when ImageMagick's commands are not path-reachable.
87
+ ! Assumes the same location for "identify" command as well.
88
+ ! --exif-path, -E fullpath_of_exif: location of "exif" command
89
+ ! Enables --read-exif command as well.
90
+ ! Use this option when "exif" command is not path-reachable.
91
+ ! --remote-mode, -R: upload images via update.rb using HTTP POST.
92
+ ! Allows user to separate the mailserver and the webserver.
93
+ ! Note: Thumbnails would not be posted.
94
+ ! --remote-image-path,-D remote_dirname:
95
+ ! Specify the image directory of the remote webserver.
96
+ ! Required when using image_ex.rb with --remote-mode option.
97
+ ! --remote-yearly-dir,-Y switch:
98
+ ! Specify whether to put images in yearly separated directories
99
+ ! at the remote webserver.
100
+ ! Required when image_ex.rb with --remote-mode option.
101
+ ! 0: do not separate, 1: separate
102
+ ! --preserve-local-images, -P:
103
+ ! Do not delete local image files.
104
+ ! Effective only when --remote-mode is enabled.
105
+ ! --upload-only, -U:
106
+ ! Upload the attached images to server, but do not update the diary.
107
+ ! Also possible by adding "_UPLONLY#" to mail body.
108
+ ! --group-id, -G: specify the group name (or GID) of the image file.
109
+ ! Also makes the file group writable (chmod 664).
110
+ ! ex1. -G www
111
+ ! ex2. -G 67
112
+ ! --class-name, -n class_name:
113
+ ! Class name for each photo (default: photo)
114
+ ! Invalid when --use-image-ex or --wiki-style option is enabled.
115
+ ! --add-div, -v number_of_images:
116
+ ! Encapsule all attached images with <div class="photos">...</div>
117
+ ! When specified number of (or more) images are attached.
118
+ ! Set to 2 when not given. Specify 0 to disable.
119
+ ! Automatically set to 0 when --wiki-style is enabled.
120
+ ! ex. -v 3 (works only when 3 or more images are attached)
121
+ ! --threshold-size, -z threshold_image_size:
122
+ ! Make thumbnail if image size is larger.
123
+ ! ex1. -z 120x140
124
+ ! ex2. -z 140 (same to 140x140)
125
+ ! --image-format, -f format string:
126
+ ! Specify the format string of the image tag
127
+ ! These variables can be used in the format string:
128
+ ! $0 : image serial number
129
+ ! $1 : image url
130
+ ! $2 : thumbnail image url (when -t is specified)
131
+ ! $3 : class name
132
+ ! $4 : ALT text (filename, or EXIF comment when -c is specified)
133
+ ! ex. -f \\\"{{image \\\$0}}\\\"
134
+ ! --use-original-name, -r:
135
+ ! use original filename as ALT text when not specified
136
+ ! --pass-filename, -p:
137
+ ! Pass real filename (instead of serialno) to image_ex plugin
138
+ ! (EXPERIMENTAL: Has no meanings so far)
139
+ ! Effective only with -e option.
140
+ ! --filter-mode, -d: print to stdout (does not call update.rb)
141
+ ! --write-to-file, -b filename: writeout to file (does not call update.rb)
142
+ ! --date-margin, -j date_margin: avoid writing diaries for future dates
143
+ ! ex. -j 30 (default=7, 0=disabled)
144
+ ! --rotate, -T LEFT or RIGHT: rotate images
145
+ ! ex. -T RIGHT (rotate 90degrees clockwise)
146
+ ! Also possible by adding "_ROT_LEFT#" or "_ROT_RIGHT#"to mail body.
147
+ !
148
+ ! Output format:
149
+ ! without -e/f, without -t: <img src="$1" class="photo" alt="$4" title="$4">
150
+ ! without -e/f, with -t: <A HREF="$1"><img src="$2" class="photo" alt="$4" title="$4"></a>
151
+ ! with -e: <%=image $0,'$4'%>
152
+ ! with -w: {{image $0,'$4'}} (overrides -e)
153
+ ! with -f: (specified format) (overrides -e, -w)
154
+ !
155
+ ! Date specification format in mail body text:
156
+ ! ex. when you want to append this mail to "2005 Feb 15" 's diary,
157
+ ! add this line to mail body:
158
+ !
159
+ ! _Date#2005-2-15
160
+ !
161
+ Examples:
162
+ posttdiary-ex.rb -a /home/hoge/htdocs/diary/tdiary.conf http://yoursite.jp/~hoge/diary/update.rb (tDiary username) (passwd)
163
+ posttdiary-ex.rb -w -i /home/hoge/htdocs/diary-images/ -y -t 120x120 -s -g 800x800 http://yoursite.jp/~hoge/diary/update.rb (tDiary username) (passwd)
164
+ ! posttdiary-ex.rb -i /home/hoge/htdocs/diary-images/ -u http://yoursite.jp/~hoge/diary-images/ -t 120x120 -s -g 800x800 http://yoursite.jp/~hoge/diary/update.rb (tDiary username) (passwd)
165
+ ! posttdiary-ex.rb -R -i /home/hoge/tmp -D /home/hoge/htdocs/diary-images -Y 1 -s -g 800x800 http://yoursite.jp/~hoge/diary/update.rb (tDiary username) (passwd)
166
+
167
+ TEXT
168
+ if( detailed_help )
169
+ text.gsub!( /\!/, '' )
170
+ else
171
+ text.gsub!( /\![^\r\n]*[\r\n]+/, '' )
172
+ end
173
+ text.delete("\t")
174
+ end
175
+
176
+ #--- override functions in the original tdiary.rb
177
+ def base_url
178
+ return ''
179
+ end
180
+
181
+ def TDiaryError( msg )
182
+ print msg + "\n"
183
+ exit 0
184
+ end
185
+
186
+ def load_cgi_conf
187
+ raise TDiaryError, 'posttdiary-ex: No @data_path variable.' unless @data_path
188
+ @data_path = add_delimiter( @data_path )
189
+ raise TDiaryError, 'posttdiary-ex: Do not set @data_path as same as tDiary system directory.' if @data_path == @tdiary_dirname
190
+ def_vars1 = ''
191
+ def_vars2 = ''
192
+ variables = [:author_name, :author_mail, :index_page, :hour_offset]
193
+ variables.each do |var|
194
+ def_vars1 << "#{var} = nil\n"
195
+ def_vars2 << "@#{var} = #{var} unless #{var} == nil\n"
196
+ end
197
+
198
+ begin
199
+ cgi_conf = File::open( "#{@data_path}tdiary.conf" ){|f| f.read }
200
+ cgi_conf.untaint unless @secure
201
+ cgi_conf.force_encoding( @tdencoding )
202
+ b = binding.taint
203
+ eval( cgi_conf, b, "(cgi_conf)", 1 )
204
+ eval( def_vars2, b )
205
+ rescue IOError, Errno::ENOENT
206
+ end
207
+ end
208
+
209
+ #--- read tdiary.conf
210
+ def read_tdiary_conf( dfname )
211
+ if test( ?d , dfname ) then
212
+ @tdiary_dirname = dfname
213
+ @tdiary_conf_file = 'tdiary.conf'
214
+ elsif test( ?f , dfname ) then
215
+ dfname =~ /(.*)[\/\\]([^\/\\]+)/
216
+ @tdiary_dirname = $1
217
+ @tdiary_conf_file = $2
218
+ end
219
+ @tdiary_dirname = add_delimiter( @tdiary_dirname )
220
+ orgdir = Dir.pwd
221
+ Dir.chdir( @tdiary_dirname )
222
+
223
+ @secure = false
224
+ @options = {}
225
+ # evaluate tdiary.conf (load_cgi_conf() would be called as well, via tdiary.conf)
226
+
227
+ f = File::open( @tdiary_dirname + @tdiary_conf_file ){|f| f.read }.untaint.force_encoding(@tdencoding)
228
+ eval( f, binding, "(tdiary.conf)", 1 )
229
+
230
+ Dir.chdir( orgdir )
231
+ true;
232
+
233
+ rescue IOError, Errno::ENOENT
234
+ raise 'posttdiary-ex: failed to read tdiary configuration file'
235
+ end
236
+
237
+ def check_local_images( date, path )
238
+ available_list = []
239
+ exist_list = []
240
+ maxnum = -1
241
+ Dir.foreach( path ) do |file|
242
+ if file =~ /(\d{8,})_(\d+)\.([^\.]*)/ then
243
+ if $1 == date then
244
+ serial = $2.to_i
245
+ maxnum = serial if serial > maxnum
246
+ exist_list[serial]=true
247
+ end
248
+ end
249
+ end
250
+
251
+ num = 0
252
+ for i in 0 .. 200
253
+ if !exist_list[i] then
254
+ available_list[num] = i
255
+ num += 1
256
+ end
257
+ end
258
+
259
+ maxnum += 1
260
+ [maxnum, available_list]
261
+ end
262
+
263
+ def bmp_to_png( bmp )
264
+ png = bmp.sub( /\.bmp$/, '.png' )
265
+ stat = system( "#{@convertpath} #{bmp} #{png}" )
266
+ raise "posttdiary-ex: could not run convert command (#{@convertpath})" if !stat
267
+ if FileTest::exist?( png )
268
+ File::delete( bmp )
269
+ png
270
+ else
271
+ bmp
272
+ end
273
+ end
274
+
275
+ def check_command( cmdname )
276
+ raise 'posttdiary-ex: program bug found in check_command() (call the programmer!)' unless cmdname
277
+
278
+ if @pt_exist_cmd then
279
+ for priv in @pt_exist_cmd
280
+ if priv == cmdname then
281
+ return true
282
+ end
283
+ end
284
+ end
285
+
286
+ stat = false
287
+ if ( test( ?x , cmdname ) ) then
288
+ stat = true
289
+ else
290
+ require 'shell'
291
+ sh = Shell.new
292
+ searchdir = sh.system_path
293
+ for dir in searchdir
294
+ fullpath = add_delimiter( dir ) + cmdname
295
+ if sh.executable?(fullpath) then
296
+ stat = true
297
+ break
298
+ end
299
+ end
300
+ end
301
+ if stat then
302
+ @pt_exist_cmd = [] unless @pt_exist_cmd
303
+ @pt_exist_cmd << cmdname
304
+ else
305
+ raise "posttdiary-ex: execution failed: #{cmdname} not found"
306
+ end
307
+ stat
308
+ end
309
+
310
+ def check_image_size( name, geo )
311
+ cmdstr = @magickpath + "identify"
312
+ check_command( cmdstr )
313
+ return false if !FileTest::exist?( name )
314
+ begin
315
+ imgsize = %x[#{cmdstr} '#{name}'].sub(/#{name}/, '').split[1][/\d+x\d+/]
316
+ i = imgsize.split(/x/)
317
+ j = geo.split(/x/)
318
+ return false if !i[1] or !j[1]
319
+ return false if i[0].to_i < j[0].to_i and i[1].to_i < j[1].to_i
320
+
321
+ rescue
322
+ return false
323
+ end
324
+ true
325
+ end
326
+
327
+ def change_image_size( org, geo )
328
+ check_command( @convertpath )
329
+ system( "#{@convertpath} -size #{geo}\\\> #{org} -geometry #{geo}\\\> #{org}" )
330
+ if FileTest::exist?( org )
331
+ org
332
+ else
333
+ ""
334
+ end
335
+ end
336
+
337
+ def read_exif_comment( fullpath_imgname )
338
+ require 'nkf'
339
+ v = ""
340
+ check_command( @exifpath )
341
+ return "" if !FileTest::exist?( fullpath_imgname )
342
+ open( "| #{@exifpath} -t \"User Comment\" #{fullpath_imgname}", "r" ) do |f|
343
+ s = f.readlines
344
+ s.each do |t|
345
+ t.gsub!( /.*Value:/, '' )
346
+ v = NKF::nkf( '-m0 -Xwd', t ).gsub!( /^\s+/, '' ).chomp! if $&
347
+ end
348
+ end
349
+ v = '' if v =~ /^\(null\)$/i
350
+ v
351
+ end
352
+
353
+ def read_exif_orientation( fullpath_imgname )
354
+ # returns orientaion value
355
+ # top-left : 1
356
+ # right-top : 6
357
+ # left-bottom : 8
358
+ # bottom-right : 3
359
+ val = 1
360
+ v = ''
361
+ check_command( @exifpath )
362
+ return 1 if !FileTest::exist?( fullpath_imgname )
363
+ open( "| #{@exifpath} -t \"Orientation\" #{fullpath_imgname}", "r" ) do |f|
364
+ s = f.readlines
365
+ s.each do |t|
366
+ t.gsub!( /.*Value:/, '' )
367
+ if $& then
368
+ v = t
369
+ break
370
+ end
371
+ end
372
+ end
373
+ val = 6 if v =~ /right.+top/i
374
+ val = 8 if v =~ /left.+bottom/i
375
+ val = 3 if v =~ /bottom.+right/i
376
+ val
377
+ end
378
+
379
+ def rotation_degree( ori )
380
+ deg = 0
381
+ deg = 90 if ori == 6
382
+ deg = -90 if ori == 8
383
+ deg = 180 if ori == 3
384
+ deg
385
+ end
386
+
387
+ def rotate_image( org, deg )
388
+ if FileTest::exist?( org ) then
389
+ check_command( @convertpath )
390
+ system( "#{@convertpath} -rotate #{deg} #{org} #{org}" )
391
+ end
392
+ if FileTest::exist?( org )
393
+ org
394
+ else
395
+ ""
396
+ end
397
+ end
398
+
399
+ def make_thumbnail( idir, iname , newsize , gid )
400
+ org_full = idir + iname
401
+ tb_name = "s" + iname
402
+ tb_full = idir + tb_name
403
+ begin
404
+ check_command( @convertpath )
405
+ # only for imagemagick 6 and later!!
406
+ system( "#{@convertpath} -thumbnail #{newsize}\\\> #{org_full} #{tb_full}" )
407
+ end
408
+ if FileTest::exist?( tb_full )
409
+ if gid then
410
+ require 'shell'
411
+ sh = Shell.new
412
+ sh.chown( nil , gid , tb_full )
413
+ sh.chmod( 00664 , tb_full )
414
+ end
415
+ tb_name
416
+ else
417
+ iname
418
+ end
419
+ end
420
+
421
+ def add_body_text( prev, sub_head , sub_body )
422
+ addtext = prev
423
+ if prev.size > 0 and !(prev =~ /\n$/) then
424
+ addtext += "\n"
425
+ end
426
+ if sub_head =~ %r[^Content-Transfer-Encoding:\s*base64]i then
427
+ addtext += NKF::nkf( '-wXd -mB', sub_body )
428
+ elsif
429
+ addtext += sub_body
430
+ end
431
+ addtext
432
+ end
433
+
434
+ def add_delimiter( orgpath )
435
+ if !orgpath or orgpath.size < 1 then
436
+ newpath = ""
437
+ else
438
+ if !(orgpath =~ /[\/\\]$/) then
439
+ if !(orgpath =~ /\//) and orgpath =~ /\\/ then
440
+ newpath = orgpath + "\\"
441
+ else
442
+ newpath = orgpath + "/"
443
+ end
444
+ else
445
+ newpath = orgpath.dup
446
+ end
447
+ end
448
+ newpath
449
+ end
450
+
451
+ def make_image_body( imgdata , imgname , remotedir , now , image_boundary, protection_key )
452
+ fname = ""
453
+ extension = ""
454
+ image_body = ""
455
+ if imgname =~ /^(.*)(\.jpg|\.jpeg|\.gif|\.png)\z/i
456
+ extension = $2.downcase
457
+ fname = $1 + extension
458
+ else
459
+ return nil
460
+ end
461
+ typestr = "image/jpeg" if extension =~ /jpe??g/i
462
+ typestr = "image/bmp" if extension =~ /bmp/i
463
+ typestr = "image/gif" if extension =~ /gif/i
464
+ typestr = "image/png" if extension =~ /png/i
465
+
466
+ if remotedir and remotedir.length > 0 then
467
+ image_body.concat <<END
468
+ --#{image_boundary}\r
469
+ content-disposition: form-data; name="plugin_image_dir"\r
470
+ \r
471
+ #{add_delimiter(remotedir)}\r
472
+ END
473
+ end
474
+ if protection_key and protection_key.length > 0 then
475
+ image_body.concat <<END
476
+ --#{image_boundary}\r
477
+ content-disposition: form-data; name="csrf_protection_key"\r
478
+ \r
479
+ #{protection_key}\r
480
+ END
481
+ end
482
+
483
+ image_body.concat <<END
484
+ --#{image_boundary}\r
485
+ content-disposition: form-data; name="plugin_image_add"\r
486
+ \r
487
+ true\r
488
+ --#{image_boundary}\r
489
+ content-disposition: form-data; name="plugin_image_addimage"\r
490
+ \r
491
+ true\r
492
+ --#{image_boundary}\r
493
+ content-disposition: form-data; name="date"\r
494
+ \r
495
+ #{now.strftime( "%Y%m%d" )}\r
496
+ END
497
+
498
+ image_body.concat <<END
499
+ --#{image_boundary}\r
500
+ content-disposition: form-data; name="plugin_image_file"; filename="#{fname}"\r
501
+ Content-Type: #{typestr}\r
502
+ \r
503
+ #{imgdata}\r
504
+ END
505
+
506
+ image_body.concat <<END
507
+ --#{image_boundary}\r
508
+ content-disposition: form-data; name="plugin"\r
509
+ \r
510
+ image\r
511
+ --#{image_boundary}--\r
512
+ END
513
+ image_body
514
+ end
515
+
516
+ def check_remote_images( http, cgi, user, pass, now )
517
+ available_list = []
518
+ maxnum = -1
519
+
520
+ str = cgi + '?edit=true;year=' + now.strftime( "%Y" ) + ';month=' + now.strftime( "%m").gsub(/^0/, "") + ';day=' + now.strftime( "%d").gsub(/^0/, "")
521
+ req = Net::HTTP::Get.new( str )
522
+ req.basic_auth user, pass
523
+ response, = http.request(req)
524
+ body = response.body
525
+ date = now.strftime( "%Y%m%d" )
526
+ imglist = []
527
+ num = 0
528
+ for i in 0 .. 200
529
+ if body =~ /\<img [^\<\>]*src=\"[^\"]*(#{date}_#{i}\.[^\"]*)\"/ then
530
+ maxnum = i
531
+ else
532
+ available_list[num] = i
533
+ num += 1
534
+ end
535
+ end
536
+
537
+ maxnum += 1
538
+ [maxnum, available_list]
539
+ end
540
+
541
+ def post_image( http, cgi, user, pass, image_dir , imgname, remote_image_dir, now, protection_key, refurl )
542
+ auth = ["#{user}:#{pass}"].pack( 'm' ).strip
543
+ image_boundary = "PosttdiaryMainBoundary"
544
+ image_data = ( File.open( image_dir + imgname ) { |f| f.read } )
545
+ image_body = make_image_body(image_data, imgname, remote_image_dir, now , image_boundary, protection_key ) if image_data
546
+ if image_body then
547
+ image_header = {
548
+ 'Authorization' => "Basic #{auth}",
549
+ 'Content-Length' => image_body.length.to_s,
550
+ 'Content-Type' => "multipart/form-data; boundary=#{image_boundary}",
551
+ 'Referer' => refurl,
552
+ }
553
+ response, = http.post( cgi, image_body, image_header )
554
+ raise "posttdiary-ex: failed to upload image (#{imgname}) to remote server" if response.code.to_i < 200 or response.code.to_i > 202
555
+ end
556
+
557
+ (image_body ? true : false)
558
+ end
559
+
560
+ def get_date_to_append( http, cgi, user, pass, now )
561
+ # call update.rb via HTTP and get the date to append
562
+ str = cgi
563
+ req = Net::HTTP::Get.new( str )
564
+ req.basic_auth user, pass
565
+ response, = http.request(req)
566
+ body = response.body
567
+
568
+ year = now.strftime( "%Y" )
569
+ month = now.strftime( "%m" )
570
+ day = now.strftime( "%d" )
571
+ bodytmp = body.split(/$/);
572
+ bodytmp.each do |oneline|
573
+ if oneline =~ /\<input\s.*\sname=\"year\"([^\>]*)\>/ then
574
+ if $1 =~ /value=\"(\d\d\d\d)"/ then
575
+ year = $1
576
+ end
577
+ end
578
+ if oneline =~ /\<input\s.*\sname=\"month\"([^\>]*)\>/ then
579
+ if $1 =~ /value=\"(\d+)\"/ then
580
+ month = $1
581
+ end
582
+ end
583
+ if oneline =~ /\<input\s.*\sname=\"day\"([^\>]*)\>/ then
584
+ if $1 =~ /value=\"(\d+)\"/ then
585
+ day = $1
586
+ end
587
+ end
588
+ end
589
+
590
+ Time::local( year, month, day )
591
+ end
592
+
593
+ def parse_mail( head, body , image_dir )
594
+ imglist = []
595
+ orglist = []
596
+ textbody = ""
597
+ imgnum = -1
598
+ imgdir = add_delimiter( image_dir )
599
+
600
+ if head =~ /Content-Type:\s*Multipart\/Mixed.*boundary=\"*([^\"\r\n]*)\"*/im or head =~ /Content-Type:\s*Multipart\/Related.*boundary=\"*([^\"\r\n]*)\"*/im then
601
+ bound = "--" + $1
602
+ body_sub = body.split( Regexp.compile( Regexp.escape( bound ) ) )
603
+ body_sub.each do |b|
604
+ sub_head, sub_body = b.split( /(?:\r\n){2}|\r\r|\n\n/, 2 )
605
+ sub_body = "" unless sub_body
606
+
607
+ next unless sub_head =~ /Content-Type/i
608
+
609
+ if sub_head =~ %r[^Content-Type:\s*text/plain]i then
610
+ textbody = add_body_text( textbody , sub_head, sub_body )
611
+ elsif sub_head =~ %r[^Content-Type:\s*(image\/|application\/octet-stream).*name=\"*(.*)(\.[^\"\r\n]*)\"*]im
612
+ imgnum += 1
613
+ orgname = $2
614
+ orgname = "" if !orgname
615
+ image_ext = $3.downcase
616
+ image_name = "_tmp" + Process.pid.to_s + "_" + imgnum.to_s + image_ext
617
+ File::umask( 022 )
618
+ open( imgdir + image_name, "wb" ) do |s|
619
+ begin
620
+ s.print Base64::decode64( sub_body.strip )
621
+ rescue NameError
622
+ s.print decode64( sub_body.strip )
623
+ end
624
+ end
625
+ if /\.bmp$/i =~ image_name then
626
+ bmp_to_png( imgdir + image_name )
627
+ image_name.sub!( /\.bmp$/, '.png' )
628
+ end
629
+ imglist[imgnum] = imgdir + image_name
630
+ orglist[imgnum] = orgname
631
+ end
632
+ end
633
+ elsif head =~ /^Content-Type:\s*text\/plain/i
634
+ textbody = add_body_text( textbody , head, body )
635
+ else
636
+ raise "posttdiary-ex: can not read this mail (illegal format)"
637
+ end
638
+
639
+ addr = nil
640
+ if /^To:(.*)$/ =~ head then
641
+ to = $1.strip
642
+ if /.*?\s*<(.*)>/ =~ to then
643
+ addr = $1
644
+ elsif /(.*?)\s*\(.*\)/ =~ to
645
+ addr = $1
646
+ else
647
+ addr = to
648
+ end
649
+ end
650
+
651
+ subject = ''
652
+ nextline = false
653
+ headlines = head.split( /[\r\n]+/ )
654
+ for n in 0 .. headlines.size-1
655
+ if nextline then
656
+ if /^[ \t]/ =~ headlines[n] then
657
+ s = headlines[n].sub( /^[ \t]/, '' )
658
+ subject += NKF::nkf( '-wXd', s )
659
+ else
660
+ break
661
+ end
662
+ end
663
+ if /^Subject:(.*)$/ =~ headlines[n] then
664
+ s = $1.sub( /^\s+/, '' )
665
+ subject = NKF::nkf( '-wXd', s )
666
+ nextline = true
667
+ end
668
+ end
669
+
670
+ [addr, subject, imglist, orglist, textbody]
671
+ end
672
+
673
+ begin
674
+ raise usage(false) if ARGV.length < 1
675
+
676
+ require 'getoptlong'
677
+ parser = GetoptLong::new
678
+
679
+ conf_df_name = nil
680
+ image_dir = nil
681
+ image_url = nil
682
+ use_subject = false
683
+ thumbnail_size = nil
684
+ image_geometry = nil
685
+ use_image_ex = false
686
+ hour_offset = nil
687
+ @hour_offset = nil
688
+ yearly_dir = false
689
+ thumbnail_name = Hash.new("")
690
+ exif_comment = Hash.new("")
691
+ exif_orientation = Hash.new(1)
692
+ image_orgname = Hash.new("")
693
+
694
+ remote_mode = false
695
+ remote_image_dir = nil
696
+ remote_yearly_dir = false
697
+ preserve_local_images = false
698
+ upload_only = false
699
+ class_name = 'photo'
700
+ group_id = nil
701
+ add_div_imgnum = 2
702
+ add_div_imgnum_specified = nil
703
+ threshold_size = nil
704
+ pass_filename = false
705
+ filter_mode = false
706
+ writeout_filename = nil
707
+ read_exif = false
708
+ image_format = ' <img class="$3" src="$1" alt="$4" title="$4">'
709
+ image_format_with_thumbnail = ' <A HREF="$1"><img class="$3" src="$2" alt="$4" title="$4"></a>'
710
+ image_format_specified = nil
711
+ wiki_style = false
712
+ blog_style = false
713
+ use_original_name = false
714
+ date_margin = 7
715
+ convertpath_specified = nil
716
+ @convertpath = "convert"
717
+ @magickpath = ""
718
+ exifpath_specified = nil
719
+ @exifpath = "exif"
720
+ rotation_degree_specified = nil
721
+
722
+ parser.set_options(
723
+ ['--read-conffile', '-a', GetoptLong::REQUIRED_ARGUMENT],
724
+ ['--image-path', '-i', GetoptLong::REQUIRED_ARGUMENT],
725
+ ['--image-url', '-u', GetoptLong::REQUIRED_ARGUMENT],
726
+ ['--use-subject', '-s', GetoptLong::NO_ARGUMENT],
727
+ ['--make-thumbnail', '-t', GetoptLong::REQUIRED_ARGUMENT],
728
+ ['--image-geometry', '-g', GetoptLong::REQUIRED_ARGUMENT],
729
+ ['--use-image-ex', '-e', GetoptLong::NO_ARGUMENT],
730
+ ['--hour-offset', '-o', GetoptLong::REQUIRED_ARGUMENT],
731
+ ['--yearly-dir', '-y', GetoptLong::NO_ARGUMENT],
732
+ ['--help', '-h', GetoptLong::NO_ARGUMENT],
733
+ ['--convert-path', '-C', GetoptLong::REQUIRED_ARGUMENT],
734
+ ['--exif-path', '-E', GetoptLong::REQUIRED_ARGUMENT],
735
+ ['--remote-mode', '-R', GetoptLong::NO_ARGUMENT],
736
+ ['--remote-image-path', '-D', GetoptLong::REQUIRED_ARGUMENT],
737
+ ['--remote-yearly-dir', '-Y', GetoptLong::REQUIRED_ARGUMENT],
738
+ ['--preserve-local-images', '-P', GetoptLong::NO_ARGUMENT],
739
+ ['--upload-only', '-U', GetoptLong::NO_ARGUMENT],
740
+ ['--group-id', '-G', GetoptLong::REQUIRED_ARGUMENT],
741
+ ['--class-name', '-n', GetoptLong::REQUIRED_ARGUMENT],
742
+ ['--add-div', '-v', GetoptLong::REQUIRED_ARGUMENT],
743
+ ['--threshold-size', '-z', GetoptLong::REQUIRED_ARGUMENT],
744
+ ['--image-format', '-f', GetoptLong::REQUIRED_ARGUMENT],
745
+ ['--use-original-name', '-r', GetoptLong::NO_ARGUMENT],
746
+ ['--wiki-style', '-w', GetoptLong::NO_ARGUMENT],
747
+ ['--blog-style', '-B', GetoptLong::NO_ARGUMENT],
748
+ ['--read-exif', '-c', GetoptLong::NO_ARGUMENT],
749
+ ['--margin-time', '-m', GetoptLong::REQUIRED_ARGUMENT],
750
+ ['--pass-filename', '-p', GetoptLong::NO_ARGUMENT],
751
+ ['--filter-mode', '-d', GetoptLong::NO_ARGUMENT],
752
+ ['--write-to-file', '-b', GetoptLong::REQUIRED_ARGUMENT],
753
+ ['--date-margin', '-j', GetoptLong::REQUIRED_ARGUMENT],
754
+ ['--rotate', '-T', GetoptLong::REQUIRED_ARGUMENT]
755
+ )
756
+ begin
757
+ parser.each do |opt, arg|
758
+ case opt
759
+ when '--read-conffile'
760
+ conf_df_name = arg.dup
761
+ when '--image-path'
762
+ image_dir = arg.dup
763
+ when '--image-url'
764
+ image_url = arg.dup
765
+ when '--use-subject'
766
+ use_subject = true
767
+ when '--make-thumbnail'
768
+ thumbnail_size = arg.dup
769
+ when '--image-geometry'
770
+ image_geometry = arg.dup
771
+ when '--use-image-ex'
772
+ use_image_ex = true
773
+ when '--hour-offset'
774
+ hour_offset = arg.to_i
775
+ when '--yearly-dir'
776
+ yearly_dir = true
777
+ when '--help'
778
+ print usage(true)
779
+ exit 0
780
+
781
+ when '--convert-path'
782
+ convertpath_specified = arg.dup
783
+ when '--exif-path'
784
+ exifpath_specified = arg.dup
785
+ read_exif = true
786
+ when '--remote-mode'
787
+ remote_mode = true
788
+ when '--remote-image-path'
789
+ remote_image_dir = add_delimiter(arg.dup)
790
+ when '--remote-yearly-dir'
791
+ remote_yearly_dir = (arg.dup =~ /[1yt]/i)
792
+ when '--preserve-local-images'
793
+ preserve_local_images = true
794
+ when '--upload-only'
795
+ upload_only = true
796
+ filter_mode = true
797
+ when '--group-id'
798
+ if arg =~ /\D/ then
799
+ require 'etc'
800
+ group_id = Etc.getgrnam( arg.dup )['gid']
801
+ else
802
+ group_id = arg.to_i
803
+ end
804
+ group_id = nil if group_id <= 0 or group_id > 65535
805
+ when '--add-div'
806
+ add_div_imgnum_specified = arg.to_i
807
+ when '--threshold-size'
808
+ threshold_size = arg.dup
809
+ when '--image-format'
810
+ image_format_specified = arg.dup
811
+ when '--use-original-name'
812
+ use_original_name = true
813
+ when '--wiki-style'
814
+ wiki_style = true
815
+ use_image_ex = true
816
+ when '--blog-style'
817
+ blog_style = true
818
+ when '--read-exif'
819
+ read_exif = true
820
+ when '--pass-filename'
821
+ pass_filename = true
822
+ when '--filter-mode'
823
+ filter_mode = true
824
+ when '--write-to-file'
825
+ filter_mode = true
826
+ writeout_filename = arg.dup
827
+ when '--date-margin'
828
+ date_margin = arg.to_i
829
+ when '--rotate'
830
+ rotation_degree_specified = 0
831
+ rotation_degree_specified = 90 if arg =~ /right/i
832
+ rotation_degree_specified = -90 if arg =~ /left/i
833
+ end
834
+ end
835
+ rescue
836
+ raise usage(false)
837
+ end
838
+ if conf_df_name then
839
+ if read_tdiary_conf( conf_df_name ) then
840
+ image_dir = @options['image.dir'] if @options['image.dir'] and !image_dir
841
+ image_url = @options['image.url'] if @options['image.url'] and !image_url
842
+ yearly_dir = true if @options['image_ex.yearlydir'] and @options['image_ex.yearlydir'] == 1
843
+ thumbnail_size = @options['image_ex.convertedwidth'].to_s + "x" + @options['image_ex.convertedheight'].to_s if @options['image_ex.convertedwidth'] and @options['image_ex.convertedheight'] and thumbnail_size == nil
844
+ threshold_size = @options['image_ex.thresholdsize'].to_s if @options['image_ex.thresholdsize'] and !threshold_size
845
+ @convertpath= @options['image_ex.convertpath'] if @options['image_ex.convertpath'] and !convertpath_specified
846
+ @exifpath = @options['image_ex.exifpath'] if @options['image_ex.exifpath'] and !exifpath_specified
847
+ else
848
+ conf_df_name = ''
849
+ end
850
+ end
851
+ image_url = "" if use_image_ex and !image_url
852
+ raise 'posttdiary-ex: image-path (-i) or image-url (-u) missing...' if (!image_url and image_dir) or (!image_dir and image_url)
853
+ if image_dir then
854
+ image_dir = add_delimiter( image_dir )
855
+ end
856
+ if image_url then
857
+ image_url += '/' unless %r[/$] =~ image_url
858
+ end
859
+ if thumbnail_size then
860
+ thumbnail_size.gsub!(/[\>\\\s]/, '')
861
+ thumbnail_size = thumbnail_size + 'x' + thumbnail_size if !(thumbnail_size =~ /x/ )
862
+ raise usage if !(thumbnail_size =~ /^\d+x\d+/)
863
+ end
864
+ threshold_size = thumbnail_size if !threshold_size
865
+ if threshold_size and threshold_size.size > 0 then
866
+ threshold_size.gsub!(/[\>\\\s]/, '')
867
+ threshold_size = threshold_size + 'x' + threshold_size if !(threshold_size =~ /x/ )
868
+ raise usage if !(threshold_size =~ /^\d+x\d+/)
869
+ end
870
+ if image_geometry then
871
+ image_geometry.gsub!(/[\>\\\s]/, '')
872
+ image_geometry = image_geometry + 'x' + image_geometry if !(image_geometry =~ /x/ )
873
+ raise usage if !(image_geometry =~ /^\d+x\d+/)
874
+ end
875
+ hour_offset = @hour_offset if !hour_offset
876
+ hour_offset = 0 if !hour_offset
877
+ if image_format_specified then
878
+ image_format = image_format_specified
879
+ image_format_with_thumbnail = image_format
880
+ else
881
+ if use_image_ex then
882
+ image_format = '<%=image $0,\'$4\'%>'
883
+ image_format_with_thumbnail = image_format
884
+ end
885
+ if wiki_style then
886
+ image_format = '{{image $0,\'$4\'}}'
887
+ image_format_with_thumbnail = image_format
888
+ end
889
+ end
890
+ if wiki_style then
891
+ add_div_imgnum = 0
892
+ else
893
+ add_div_imgnum = add_div_imgnum_specified if add_div_imgnum_specified
894
+ end
895
+ @convertpath = convertpath_specified if convertpath_specified
896
+ @convertpath = add_delimiter( @convertpath ) + "convert" if test( ?d , @convertpath )
897
+ @magickpath = $1 if @convertpath =~ /(.*[\/\\])[^\/\\]+$/
898
+ @exifpath = exifpath_specified if exifpath_specified
899
+ @exifpath = add_delimiter( @exifpath ) + "exif" if test( ?d , @exifpath )
900
+
901
+ if filter_mode == false then
902
+ url = ARGV.shift.dup
903
+ if %r|http://([^:/]*):?(\d*)(/.*)| =~ url then
904
+ host = $1
905
+ port = $2.to_i
906
+ cgi = $3
907
+ raise 'posttdiary-ex: invalid url for update.rb.' if not host or not cgi
908
+ port = 80 if port == 0
909
+ else
910
+ raise 'posttdiary-ex: invalid url for update.rb.'
911
+ end
912
+ user = ARGV.shift.dup
913
+ pass = ARGV.shift.dup
914
+ end
915
+
916
+ require 'base64'
917
+ require 'nkf'
918
+ require 'net/http'
919
+ require 'shell'
920
+ Net::HTTP.version_1_2
921
+
922
+ mail = NKF::nkf( '-m0 -Xwd', ARGF.read )
923
+ raise "posttdiary-ex: no mail text." if not mail or mail.length == 0
924
+
925
+ head, body = mail.split( /(?:\r\n){2}|\r\r|\n\n/, 2 )
926
+ body = "" unless body
927
+ addr, subject, tmpimglist, orglist, @body = parse_mail( head, body, image_dir )
928
+
929
+ if /([^-]+)-(.*)@/ =~ addr then
930
+ user = $1 unless user
931
+ pass = $2 unless pass
932
+ end
933
+ raise "posttdiary-ex: please specify the username for your tdiary system." unless user or filter_mode
934
+ if tmpimglist.length > 0 and ( !image_dir or !image_url ) then
935
+ raise "posttdiary-ex: please specify image-path (-i) and/or image-url (-u)"
936
+ end
937
+
938
+ now = Time::now + hour_offset * 3600
939
+ tmp = Time::now + hour_offset * 3600
940
+ if @body.gsub!( /^\_date\#([\d\-\/\.]+)[^\r\n]*[\r\n]+/i , '' ) then
941
+ t = $1
942
+ if /(\d\d\d\d)[^\d]*(\d\d)[^\d]*(\d\d)/ =~ t then
943
+ tmp = Time::local( $1.to_i, $2.to_i, $3.to_i );
944
+ end
945
+ if /(\d\d\d\d)[^\d]+(\d+)[^\d]+(\d+)/ =~ t then
946
+ tmp = Time::local( $1.to_i, $2.to_i, $3.to_i );
947
+ end
948
+ else
949
+ if blog_style and !filter_mode then
950
+ Net::HTTP.start( host, port ) do |http|
951
+ tmp = get_date_to_append( http, cgi, user, pass, now )
952
+ end
953
+ end
954
+ end
955
+ if @body.gsub!( /^\_up[ld]+only\#[ \t]*[\r\n]+/i , '' ) then
956
+ upload_only = true
957
+ end
958
+ if @body.gsub!( /^\_rot[ate]*\_right\#[ \t]*[\r\n]+/i , '' ) then
959
+ rotation_degree_specified = 90
960
+ end
961
+ if @body.gsub!( /^\_rot[ate]*\_left\#[ \t]*[\r\n]+/i , '' ) then
962
+ rotation_degree_specified = -90
963
+ end
964
+ if @body.gsub!( /^\_rot[ate]*\_none\#[ \t]*[\r\n]+/i , '' ) then
965
+ rotation_degree_specified = 0
966
+ end
967
+
968
+ if date_margin != 0 and (tmp - now).abs >= date_margin * 24 * 3600 then
969
+ # raise "posttdiary-ex: specified date is too far from today"
970
+ # # use current date (now) instead of specified date(tmp)..
971
+ else
972
+ now = tmp
973
+ end
974
+
975
+ topic_year = now.strftime( "%Y" )
976
+ topic_month = now.strftime( "%m" )
977
+ topic_date = now.strftime( "%d" )
978
+
979
+ if image_dir then
980
+ image_dir = add_delimiter( image_dir + now.strftime( "%Y" ) ) if yearly_dir
981
+ Dir.mkdir( image_dir ) if !test( ?d , image_dir )
982
+ if remote_mode then
983
+ image_url += topic_year + "/" if remote_yearly_dir
984
+ else
985
+ image_url += topic_year + "/" if yearly_dir
986
+ end
987
+ end
988
+ nextnum = -1
989
+ av_list = []
990
+ if remote_mode then
991
+ if !remote_image_dir or remote_image_dir.length < 1 then
992
+ # needed when using image_ex.rb, but not when using image.rb...
993
+ # raise 'posttdiary-ex: please specify --remote-image-path'
994
+ remote_image_dir = ""
995
+ else
996
+ if remote_yearly_dir then
997
+ remote_image_dir = add_delimiter( remote_image_dir + topic_year )
998
+ end
999
+ end
1000
+ Net::HTTP.start( host, port ) do |http|
1001
+ nextnum,av_list = check_remote_images( http, cgi, user, pass, now)
1002
+ end
1003
+ else
1004
+ nextnum,av_list = check_local_images( now.strftime( "%Y%m%d" ), image_dir )
1005
+ end
1006
+ @image_name = nil
1007
+ sh = Shell.new
1008
+ for i in 0 .. (tmpimglist.length-1)
1009
+ tmpimgname = tmpimglist[i]
1010
+ raise "posttdiary-ex: program bug found: no extension in tmpimgname" if !(tmpimgname =~ /(\.[^\.]*?)$/)
1011
+ image_ext = $1.downcase
1012
+ image_name = now.strftime( "%Y%m%d" ) + "_" + nextnum.to_s + image_ext
1013
+ nextnum += 1
1014
+ sh.rename( tmpimgname , image_dir + image_name )
1015
+ exif_comment[image_name] = (read_exif ? read_exif_comment(image_dir + image_name) : "" )
1016
+ exif_orientation[image_name] = (read_exif ? read_exif_orientation(image_dir + image_name) : "" )
1017
+ image_orgname[image_name] = orglist[i]
1018
+ change_image_size( image_dir + image_name , image_geometry ) if image_geometry
1019
+ if rotation_degree_specified then
1020
+ if rotation_degree_specified != 0 then
1021
+ rotate_image( image_dir + image_name , rotation_degree_specified )
1022
+ end
1023
+ elsif read_exif and exif_orientation[image_name] != 1 then
1024
+ rotate_image( image_dir + image_name , rotation_degree( exif_orientation[image_name] ) )
1025
+ end
1026
+ if group_id then
1027
+ sh.chown( nil , group_id , image_dir + image_name )
1028
+ sh.chmod( 00664 , image_dir + image_name )
1029
+ end
1030
+ thumbnail_name[image_name] = ""
1031
+ thumbnail_name[image_name] = make_thumbnail( image_dir, image_name , thumbnail_size , group_id ) if thumbnail_size and check_image_size( image_dir + image_name, threshold_size)
1032
+ @image_name = [] unless @image_name
1033
+ @image_name << image_name
1034
+ end
1035
+
1036
+ if @image_name then
1037
+ img_src = ""
1038
+ marker = "_posttdiary_ex_temporary_marker_"
1039
+ img_in_div = 0
1040
+ for j in 0 .. @image_name.size-1
1041
+ i = @image_name[j]
1042
+ serial = i.sub( /^\d+_(\d+)\.[^\.]*?$/, '\1' )
1043
+ serial = i if use_image_ex and pass_filename
1044
+ cm = ""
1045
+ cm = exif_comment[i] if read_exif and exif_comment[i] and exif_comment[i].size > 0
1046
+ cm = image_orgname[i] if use_original_name and (!cm or cm.size == 0)
1047
+ cm = i.gsub(/\.[^\.]*?$/, '') if !cm or cm.size == 0
1048
+ if use_image_ex then
1049
+ # modify <%=image (num),'comment'%> or <%=image (num)%> tags
1050
+ if @body =~ /\<\%\=image[^\s]*\s+#{j}\s*\,\s*[\"\'](.*)[\"\']\s*\%*\>/i then
1051
+ alttext = $1;
1052
+ alttext = cm if alttext.length < 1
1053
+ @body.gsub!( /\<\%\=(image[^\s]*)\s+#{j}\s*\,\s*[\"\'].*[\"\']\s*\%*\>/i, '<%=\1 '+marker+serial.to_s+',\''+alttext+'\'%>' )
1054
+ next
1055
+ elsif @body =~ /\<\%\=image[^\s]*\s+#{j}\s*\%*\>/i then
1056
+ alttext = cm
1057
+ @body.gsub!( /\<\%\=(image[^\s]*)\s+#{j}\s*\%*\>/i, '<%=\1 '+marker+serial.to_s+',\''+alttext+'\'%>' )
1058
+ next
1059
+ end
1060
+ end
1061
+ if wiki_style then
1062
+ # modify {{image (num),"comment"}} or {{image (num)}} tags (also recognizes image_left, image_right)
1063
+ if @body =~ /\{\{image[^\s]*\s+#{j}\s*\,\s*[\"\'](.*)[\"\']\s*\}\}/i then
1064
+ alttext = $1;
1065
+ alttext = cm if alttext.length < 1
1066
+ @body.gsub!( /\{\{(image[^\s]*)\s+#{j}\s*\,\s*[\"\'].*[\"\']\s*\}\}/i, '{{\1 '+marker+serial.to_s+',\''+alttext+'\'}}' )
1067
+ next
1068
+ elsif @body =~ /\{\{image[^\s]*\s+#{j}\s*\}\}/i then
1069
+ alttext = cm
1070
+ @body.gsub!( /\{\{(image[^\s]*)\s+#{j}\s*\}\}/i, '{{\1 '+marker+serial.to_s+',\''+alttext+'\'}}' )
1071
+ next
1072
+ end
1073
+ end
1074
+ img_in_div+=1
1075
+ if thumbnail_size and thumbnail_name[i].size > 0 then
1076
+ t = thumbnail_name[i]
1077
+ img_src += image_format_with_thumbnail.gsub( /\$0/, serial ).gsub( /\$1/, image_url + i ).gsub( /\$2/, image_url + t ).gsub( /\$3/, class_name ).gsub( /\$4/, cm )
1078
+ else
1079
+ img_src += image_format.gsub( /\$0/, serial ).gsub( /\$1/, image_url + i ).gsub( /\$3/, class_name ).gsub( /\$4/, cm )
1080
+ end
1081
+ end
1082
+ @body.gsub!( /#{marker}/ , '' )
1083
+ if img_src =~ /^\s+$/ then
1084
+ img_src = ''
1085
+ else
1086
+ if add_div_imgnum <= img_in_div and add_div_imgnum > 0 then
1087
+ img_src = "<div class=\"photos\">" + img_src + "</div>"
1088
+ end
1089
+ end
1090
+ img_src.sub!( /^/ , ' ' ) if ! wiki_style
1091
+ if use_subject then
1092
+ img_src = img_src + "\n" if !(img_src =~ /^\s*$/)
1093
+ @body = "#{img_src}#{@body.sub( /\n+\z/, '' )}"
1094
+ else
1095
+ @body = "#{@body.sub( /\n+\z/, '' )}\n#{img_src}"
1096
+ end
1097
+ end
1098
+
1099
+ if use_subject then
1100
+ title = ''
1101
+ @body = "#{subject}\n#{@body}"
1102
+ @body = "!" + @body if wiki_style
1103
+ else
1104
+ title = subject
1105
+ end
1106
+
1107
+ if upload_only then
1108
+ exit 0
1109
+ end
1110
+ require 'cgi'
1111
+ require 'nkf'
1112
+ if filter_mode then
1113
+ data = title + "\n";
1114
+ data << @body + "\n";
1115
+ if writeout_filename then
1116
+ open( writeout_filename, "wb" ) do |s|
1117
+ s.print data
1118
+ end
1119
+ else
1120
+ print data
1121
+ end
1122
+ else
1123
+ data = "title=#{CGI::escape title}"
1124
+ data << "&body=#{CGI::escape @body}"
1125
+ data << "&append=true"
1126
+ data << "&year=#{topic_year}"
1127
+ data << "&month=#{topic_month}"
1128
+ data << "&day=#{topic_date}"
1129
+ auth = ["#{user}:#{pass}"].pack( 'm' ).strip
1130
+ Net::HTTP.start( host, port ) do |http|
1131
+ protection_key = nil
1132
+ res = http.get( cgi,
1133
+ 'Authorization' => "Basic #{auth}",
1134
+ 'Referer' => url )
1135
+ if %r|<input type="hidden" name="csrf_protection_key" value="([^"]+)">| =~ res.body then
1136
+ protection_key = $1
1137
+ data << "&csrf_protection_key=#{CGI::escape( CGI::unescapeHTML( protection_key ) )}"
1138
+ end
1139
+ if remote_mode and @image_name then
1140
+ for i in 0 .. (@image_name.length - 1)
1141
+ imagename = @image_name[i]
1142
+ thumbnailname = thumbnail_name[imagename]
1143
+ post_image( http, cgi, user, pass, image_dir, imagename, remote_image_dir, now, protection_key, url )
1144
+ File.delete( image_dir + imagename ) if !preserve_local_images
1145
+ File.delete( image_dir + thumbnailname ) if !preserve_local_images and test( ?f , image_dir + thumbnailname )
1146
+ end
1147
+ end
1148
+ response = http.post( cgi, data, 'Authorization' => "Basic #{auth}", 'Referer' => url )
1149
+ end
1150
+ end
1151
+
1152
+ rescue
1153
+ $stderr.puts $!
1154
+ exit 1
1155
+ end