tdiary 3.2.2.20130507

Sign up to get free protection for your applications and to get access to all the features.
Files changed (509) hide show
  1. checksums.yaml +7 -0
  2. data/.coveralls.yml +1 -0
  3. data/.gitignore +16 -0
  4. data/.travis.yml +29 -0
  5. data/Capfile +2 -0
  6. data/ChangeLog +3173 -0
  7. data/Gemfile +58 -0
  8. data/Gemfile.lock +201 -0
  9. data/LICENSE +340 -0
  10. data/Procfile +1 -0
  11. data/README.md +33 -0
  12. data/Rakefile +26 -0
  13. data/bin/tdiary +7 -0
  14. data/config.ru +61 -0
  15. data/data/.htaccess +2 -0
  16. data/doc/HOWTO-authenticate-in-rack.md +89 -0
  17. data/doc/HOWTO-make-io.md +305 -0
  18. data/doc/HOWTO-make-plugin.md +279 -0
  19. data/doc/HOWTO-make-theme.md +67 -0
  20. data/doc/HOWTO-testing-tDiary.md +44 -0
  21. data/doc/HOWTO-use-plugin.md +148 -0
  22. data/doc/HOWTO-write-tDiary.en.md +131 -0
  23. data/doc/HOWTO-write-tDiary.md +136 -0
  24. data/doc/INSTALL-paas.md +202 -0
  25. data/doc/INSTALL.md +160 -0
  26. data/doc/README.en.md +174 -0
  27. data/doc/README.md +56 -0
  28. data/doc/UPGRADE.md +164 -0
  29. data/doc/doc.css +115 -0
  30. data/dot.htaccess +27 -0
  31. data/index.fcgi +45 -0
  32. data/index.rb +57 -0
  33. data/js/00default.js +60 -0
  34. data/js/01conf.js +62 -0
  35. data/js/02edit.coffee +5 -0
  36. data/js/02edit.js +15 -0
  37. data/js/amazon.js +43 -0
  38. data/js/calendar3.js +130 -0
  39. data/js/caretposition.js +170 -0
  40. data/js/category.js +29 -0
  41. data/js/category_autocomplete.js +96 -0
  42. data/js/comment_ajax.js +27 -0
  43. data/js/draft.js +149 -0
  44. data/js/highlight.js +36 -0
  45. data/js/image.js +181 -0
  46. data/misc/convert2.rb +123 -0
  47. data/misc/filter/antispamservice.rb +101 -0
  48. data/misc/filter/limitdays.rb +40 -0
  49. data/misc/filter/linkcheck.rb +81 -0
  50. data/misc/filter/plugin/antispamservice.rb +82 -0
  51. data/misc/filter/plugin/en/antispamservice.rb +21 -0
  52. data/misc/filter/plugin/ja/antispamservice.rb +20 -0
  53. data/misc/lib/README +4 -0
  54. data/misc/lib/compatible.rb +1 -0
  55. data/misc/lib/fcgi_patch.rb +90 -0
  56. data/misc/migrate.rb +157 -0
  57. data/misc/paas/cloudfoundry/Gemfile +26 -0
  58. data/misc/paas/cloudfoundry/Gemfile.lock +85 -0
  59. data/misc/paas/heroku/Gemfile +22 -0
  60. data/misc/paas/heroku/Gemfile.lock +85 -0
  61. data/misc/paas/sqale/Gemfile +19 -0
  62. data/misc/paas/sqale/Gemfile.lock +85 -0
  63. data/misc/paas/sqale/Procfile +1 -0
  64. data/misc/paas/sqale/dot.env +1 -0
  65. data/misc/plugin/ChangeLog.DO_NOT_UPDATE +2333 -0
  66. data/misc/plugin/a.rb +211 -0
  67. data/misc/plugin/amazon.rb +403 -0
  68. data/misc/plugin/amazon/README.en +17 -0
  69. data/misc/plugin/amazon/README.ja +29 -0
  70. data/misc/plugin/amazon/amazonimg.rb +113 -0
  71. data/misc/plugin/amazon/large.png +0 -0
  72. data/misc/plugin/amazon/medium.png +0 -0
  73. data/misc/plugin/amazon/small.png +0 -0
  74. data/misc/plugin/append-css.rb +51 -0
  75. data/misc/plugin/bq.rb +48 -0
  76. data/misc/plugin/calendar2.rb +184 -0
  77. data/misc/plugin/calendar3.rb +256 -0
  78. data/misc/plugin/category.rb +779 -0
  79. data/misc/plugin/category_autocomplete.rb +33 -0
  80. data/misc/plugin/comment_ajax.rb +11 -0
  81. data/misc/plugin/comment_mail-qmail.rb +57 -0
  82. data/misc/plugin/comment_mail-sendmail.rb +56 -0
  83. data/misc/plugin/comment_mail-smtp.rb +59 -0
  84. data/misc/plugin/comment_rank.rb +36 -0
  85. data/misc/plugin/counter.rb +631 -0
  86. data/misc/plugin/daily_theme.rb +55 -0
  87. data/misc/plugin/disp_referrer.rb +1486 -0
  88. data/misc/plugin/doctype-html401tr.rb +16 -0
  89. data/misc/plugin/draft.rb +20 -0
  90. data/misc/plugin/dropdown_calendar.rb +32 -0
  91. data/misc/plugin/edit_today.rb +50 -0
  92. data/misc/plugin/en/a.rb +10 -0
  93. data/misc/plugin/en/amazon.rb +71 -0
  94. data/misc/plugin/en/append-css.rb +17 -0
  95. data/misc/plugin/en/bq.rb +12 -0
  96. data/misc/plugin/en/calendar2.rb +12 -0
  97. data/misc/plugin/en/category.rb +204 -0
  98. data/misc/plugin/en/counter.rb +48 -0
  99. data/misc/plugin/en/daily_theme.rb +14 -0
  100. data/misc/plugin/en/disp_referrer.rb +387 -0
  101. data/misc/plugin/en/dropdown_calendar.rb +14 -0
  102. data/misc/plugin/en/edit_today.rb +22 -0
  103. data/misc/plugin/en/hide-mail-field.rb +19 -0
  104. data/misc/plugin/en/highlight.rb +29 -0
  105. data/misc/plugin/en/image.rb +54 -0
  106. data/misc/plugin/en/kw.rb +22 -0
  107. data/misc/plugin/en/makerss.rb +47 -0
  108. data/misc/plugin/en/pb-show.rb +21 -0
  109. data/misc/plugin/en/ping.rb +16 -0
  110. data/misc/plugin/en/recent_comment.rb +44 -0
  111. data/misc/plugin/en/recent_comment3.rb +56 -0
  112. data/misc/plugin/en/recent_rss.rb +33 -0
  113. data/misc/plugin/en/referer_scheme.rb +48 -0
  114. data/misc/plugin/en/search_control.rb +74 -0
  115. data/misc/plugin/en/search_form.rb +22 -0
  116. data/misc/plugin/en/speed_comment.rb +19 -0
  117. data/misc/plugin/en/tb-show.rb +37 -0
  118. data/misc/plugin/en/todo.rb +43 -0
  119. data/misc/plugin/en/weather.rb +185 -0
  120. data/misc/plugin/en/xmlrpc.rb +14 -0
  121. data/misc/plugin/footnote.rb +92 -0
  122. data/misc/plugin/gradation.rb +39 -0
  123. data/misc/plugin/gradient.rb +36 -0
  124. data/misc/plugin/hide-mail-field.rb +50 -0
  125. data/misc/plugin/highlight.rb +22 -0
  126. data/misc/plugin/html_anchor.rb +34 -0
  127. data/misc/plugin/image.rb +290 -0
  128. data/misc/plugin/ja/amazon.rb +89 -0
  129. data/misc/plugin/ja/bq.rb +13 -0
  130. data/misc/plugin/ja/calendar2.rb +12 -0
  131. data/misc/plugin/ja/category.rb +212 -0
  132. data/misc/plugin/ja/daily_theme.rb +15 -0
  133. data/misc/plugin/ja/disp_referrer.rb +644 -0
  134. data/misc/plugin/ja/edit_today.rb +23 -0
  135. data/misc/plugin/ja/hide-mail-field.rb +20 -0
  136. data/misc/plugin/ja/highlight.rb +30 -0
  137. data/misc/plugin/ja/makerss.rb +44 -0
  138. data/misc/plugin/ja/my-sequel.rb +52 -0
  139. data/misc/plugin/ja/pb-show.rb +23 -0
  140. data/misc/plugin/ja/ping.rb +17 -0
  141. data/misc/plugin/ja/recent_comment.rb +45 -0
  142. data/misc/plugin/ja/recent_comment3.rb +57 -0
  143. data/misc/plugin/ja/recent_rss.rb +34 -0
  144. data/misc/plugin/ja/referer_scheme.rb +86 -0
  145. data/misc/plugin/ja/search_control.rb +75 -0
  146. data/misc/plugin/ja/search_form.rb +32 -0
  147. data/misc/plugin/ja/tb-show.rb +38 -0
  148. data/misc/plugin/ja/todo.rb +46 -0
  149. data/misc/plugin/ja/weather.rb +402 -0
  150. data/misc/plugin/ja/xmlrpc.rb +15 -0
  151. data/misc/plugin/kw.rb +150 -0
  152. data/misc/plugin/list.rb +40 -0
  153. data/misc/plugin/makelirs.rb +89 -0
  154. data/misc/plugin/makerss.rb +744 -0
  155. data/misc/plugin/my-ex.rb +68 -0
  156. data/misc/plugin/my-sequel.rb +539 -0
  157. data/misc/plugin/navi_user.rb +19 -0
  158. data/misc/plugin/number_anchor.rb +47 -0
  159. data/misc/plugin/pb-show.rb +165 -0
  160. data/misc/plugin/ping.rb +99 -0
  161. data/misc/plugin/pre_wrap.rb +19 -0
  162. data/misc/plugin/random_google.rb +165 -0
  163. data/misc/plugin/recent_comment.rb +82 -0
  164. data/misc/plugin/recent_comment3.rb +192 -0
  165. data/misc/plugin/recent_list.rb +91 -0
  166. data/misc/plugin/recent_namazu.rb +50 -0
  167. data/misc/plugin/recent_rss.rb +305 -0
  168. data/misc/plugin/referer-antibot.rb +53 -0
  169. data/misc/plugin/referer-utf8.rb +12 -0
  170. data/misc/plugin/referer_scheme.rb +87 -0
  171. data/misc/plugin/search_control.rb +227 -0
  172. data/misc/plugin/search_form.rb +53 -0
  173. data/misc/plugin/sn.rb +107 -0
  174. data/misc/plugin/speed_comment.rb +68 -0
  175. data/misc/plugin/squeeze.rb +272 -0
  176. data/misc/plugin/src.rb +30 -0
  177. data/misc/plugin/tb-show.rb +212 -0
  178. data/misc/plugin/title_list.rb +41 -0
  179. data/misc/plugin/title_tag.rb +80 -0
  180. data/misc/plugin/tlink.rb +163 -0
  181. data/misc/plugin/todo.rb +182 -0
  182. data/misc/plugin/weather.rb +505 -0
  183. data/misc/plugin/whatsnew.rb +100 -0
  184. data/misc/plugin/xmlrpc.rb +80 -0
  185. data/misc/plugin/xmlrpc/README +20 -0
  186. data/misc/plugin/xmlrpc/xmlrpc.rb +575 -0
  187. data/misc/style/emptdiary/README.rd +83 -0
  188. data/misc/style/emptdiary/README.rd.en +78 -0
  189. data/misc/style/emptdiary/emptdiary_style.rb +199 -0
  190. data/misc/style/etdiary/README.rd +83 -0
  191. data/misc/style/etdiary/etdiary_style.rb +446 -0
  192. data/misc/style/gfm/gfm_style.rb +194 -0
  193. data/misc/style/rd/README.rd +71 -0
  194. data/misc/style/rd/rd_style.rb +366 -0
  195. data/misc/style/wiki/README +116 -0
  196. data/misc/style/wiki/README.en +101 -0
  197. data/misc/style/wiki/wiki_parser.rb +273 -0
  198. data/misc/style/wiki/wiki_style.rb +478 -0
  199. data/misc/theme_convert/Readme.rd +21 -0
  200. data/misc/theme_convert/append.rcss +150 -0
  201. data/misc/theme_convert/theme_convert.rb +453 -0
  202. data/plugin/00default.rb +1015 -0
  203. data/plugin/05referer.rb +298 -0
  204. data/plugin/10spamfilter.rb +183 -0
  205. data/plugin/50sp.rb +146 -0
  206. data/plugin/60sf.rb +152 -0
  207. data/plugin/90migrate.rb +109 -0
  208. data/plugin/en/00default.rb +390 -0
  209. data/plugin/en/05referer.rb +49 -0
  210. data/plugin/en/10spamfilter.rb +81 -0
  211. data/plugin/en/50sp.rb +56 -0
  212. data/plugin/en/60sf.rb +60 -0
  213. data/plugin/ja/00default.rb +401 -0
  214. data/plugin/ja/05referer.rb +47 -0
  215. data/plugin/ja/10spamfilter.rb +79 -0
  216. data/plugin/ja/50sp.rb +66 -0
  217. data/plugin/ja/60sf.rb +73 -0
  218. data/public/.gitkeep +0 -0
  219. data/public/images/.gitkeep +0 -0
  220. data/public/javascripts/.gitkeep +0 -0
  221. data/public/stylesheets/.gitkeep +0 -0
  222. data/skel/category.rhtml +9 -0
  223. data/skel/conf.rhtml +23 -0
  224. data/skel/day.rhtml +33 -0
  225. data/skel/diary.rhtml +83 -0
  226. data/skel/footer.rhtml +8 -0
  227. data/skel/header.rhtml +10 -0
  228. data/skel/i.category.rhtml +6 -0
  229. data/skel/i.conf.rhtml +14 -0
  230. data/skel/i.day.rhtml +28 -0
  231. data/skel/i.diary.rhtml +17 -0
  232. data/skel/i.footer.rhtml +2 -0
  233. data/skel/i.header.rhtml +3 -0
  234. data/skel/i.latest.rhtml +24 -0
  235. data/skel/i.month.rhtml +39 -0
  236. data/skel/i.search.rhtml +5 -0
  237. data/skel/i.update.rhtml +40 -0
  238. data/skel/i.update.rhtml.en +40 -0
  239. data/skel/latest.rhtml +27 -0
  240. data/skel/mail.rtxt +18 -0
  241. data/skel/mail.rtxt.en +18 -0
  242. data/skel/month.rhtml +27 -0
  243. data/skel/plugin_error.rhtml +27 -0
  244. data/skel/preview.rhtml +85 -0
  245. data/skel/preview.rhtml.en +72 -0
  246. data/skel/referer.rhtml +24 -0
  247. data/skel/search.rhtml +14 -0
  248. data/skel/tdiary.rconf +76 -0
  249. data/skel/update.rhtml +103 -0
  250. data/skel/update.rhtml.en +83 -0
  251. data/spec/acceptance/append_comment_spec.rb +94 -0
  252. data/spec/acceptance/append_diary_spec.rb +98 -0
  253. data/spec/acceptance/bugfix/encoding_error_spec.rb +27 -0
  254. data/spec/acceptance/save_conf_comment_spec.rb +87 -0
  255. data/spec/acceptance/save_conf_default_spec.rb +169 -0
  256. data/spec/acceptance/save_conf_dnsbl_spec.rb +152 -0
  257. data/spec/acceptance/save_conf_filter_spec.rb +50 -0
  258. data/spec/acceptance/save_conf_plugin_spec.rb +69 -0
  259. data/spec/acceptance/save_conf_referer_spec.rb +60 -0
  260. data/spec/acceptance/save_conf_security_spec.rb +280 -0
  261. data/spec/acceptance/support/helpers.rb +49 -0
  262. data/spec/acceptance/support/paths.rb +7 -0
  263. data/spec/acceptance/update_diary_spec.rb +113 -0
  264. data/spec/acceptance/view_category_spec.rb +38 -0
  265. data/spec/acceptance/view_comment_spec.rb +67 -0
  266. data/spec/acceptance/view_diary_spec.rb +126 -0
  267. data/spec/acceptance/view_referer_spec.rb +31 -0
  268. data/spec/acceptance_helper.rb +101 -0
  269. data/spec/core/compatible_spec.rb +54 -0
  270. data/spec/core/core_ext_spec.rb +59 -0
  271. data/spec/core/plugin_spec.rb +389 -0
  272. data/spec/core/rack/assets/precompile_spec.rb +76 -0
  273. data/spec/core/rack/html_anchor_spec.rb +57 -0
  274. data/spec/core/rack/valid_request_path_spec.rb +67 -0
  275. data/spec/core/style/emptdiary_style_spec.rb +165 -0
  276. data/spec/core/style/etdiary_style_spec.rb +512 -0
  277. data/spec/core/style/gfm_style_spec.rb +334 -0
  278. data/spec/core/style/rd_style_spec.rb +202 -0
  279. data/spec/core/style/tdiary_style_spec.rb +240 -0
  280. data/spec/core/style/wiki_style_spec.rb +441 -0
  281. data/spec/fixtures/ascii8bit-pstore.db +0 -0
  282. data/spec/fixtures/invalid-sequence-volatile.tdr +9 -0
  283. data/spec/fixtures/just_installed.conf +1 -0
  284. data/spec/fixtures/plugin/ja/sample.rb +4 -0
  285. data/spec/fixtures/plugin/sample.rb +6 -0
  286. data/spec/fixtures/sample.rb +12 -0
  287. data/spec/fixtures/tdiary.conf.gem +212 -0
  288. data/spec/fixtures/tdiary.conf.rack +212 -0
  289. data/spec/fixtures/tdiary.conf.rdb +227 -0
  290. data/spec/fixtures/tdiary.conf.secure +204 -0
  291. data/spec/fixtures/tdiary.conf.webrick +212 -0
  292. data/spec/javascripts/00default_spec.js +35 -0
  293. data/spec/javascripts/fixtures/00default.html +1 -0
  294. data/spec/javascripts/support/jasmine.yml +76 -0
  295. data/spec/plugin/bq_spec.rb +24 -0
  296. data/spec/plugin/plugin_helper.rb +203 -0
  297. data/spec/spec_helper.rb +32 -0
  298. data/tdiary.conf.beginner +244 -0
  299. data/tdiary.conf.sample +345 -0
  300. data/tdiary.conf.sample-en +333 -0
  301. data/tdiary.gemspec +26 -0
  302. data/tdiary.rb +151 -0
  303. data/tdiary/admin.rb +236 -0
  304. data/tdiary/application.rb +57 -0
  305. data/tdiary/author_only_base.rb +171 -0
  306. data/tdiary/base.rb +220 -0
  307. data/tdiary/cli.rb +116 -0
  308. data/tdiary/comment.rb +40 -0
  309. data/tdiary/comment_manager.rb +94 -0
  310. data/tdiary/compatible.rb +72 -0
  311. data/tdiary/config.rb +270 -0
  312. data/tdiary/core_ext.rb +122 -0
  313. data/tdiary/deploy.rb +50 -0
  314. data/tdiary/dispatcher.rb +77 -0
  315. data/tdiary/dispatcher/index_main.rb +122 -0
  316. data/tdiary/dispatcher/update_main.rb +101 -0
  317. data/tdiary/environment.rb +15 -0
  318. data/tdiary/filter.rb +48 -0
  319. data/tdiary/filter/default.rb +54 -0
  320. data/tdiary/filter/spam.rb +304 -0
  321. data/tdiary/io/base.rb +70 -0
  322. data/tdiary/io/cache/file.rb +123 -0
  323. data/tdiary/io/cache/memcached.rb +88 -0
  324. data/tdiary/io/cache/redis.rb +100 -0
  325. data/tdiary/io/default.rb +297 -0
  326. data/tdiary/io/pstore.rb +252 -0
  327. data/tdiary/io/rdb.rb +213 -0
  328. data/tdiary/lang/en.rb +79 -0
  329. data/tdiary/lang/ja.rb +72 -0
  330. data/tdiary/plugin.rb +375 -0
  331. data/tdiary/rack/assets/precompile.rb +37 -0
  332. data/tdiary/rack/auth/basic.rb +38 -0
  333. data/tdiary/rack/auth/omniauth.rb +51 -0
  334. data/tdiary/rack/html_anchor.rb +31 -0
  335. data/tdiary/rack/valid_request_path.rb +36 -0
  336. data/tdiary/referer_manager.rb +80 -0
  337. data/tdiary/request.rb +217 -0
  338. data/tdiary/response.rb +29 -0
  339. data/tdiary/server.rb +85 -0
  340. data/tdiary/style.rb +194 -0
  341. data/tdiary/style/tdiary_style.rb +198 -0
  342. data/tdiary/style/wiki_style.rb +213 -0
  343. data/tdiary/tasks.rb +1 -0
  344. data/tdiary/tasks/assets.rake +31 -0
  345. data/tdiary/tasks/auth.rake +28 -0
  346. data/tdiary/tasks/db.rake +110 -0
  347. data/tdiary/tasks/doc.rake +31 -0
  348. data/tdiary/tasks/heroku.rake +37 -0
  349. data/tdiary/tasks/jasmine.rake +16 -0
  350. data/tdiary/tasks/rdoc.rake +24 -0
  351. data/tdiary/tasks/release.rake +122 -0
  352. data/tdiary/tasks/rspec.rake +51 -0
  353. data/tdiary/tasks/server.rake +33 -0
  354. data/tdiary/tasks/test.rake +17 -0
  355. data/tdiary/version.rb +3 -0
  356. data/tdiary/view.rb +468 -0
  357. data/tdiary/view_helper.rb +15 -0
  358. data/test/disp_referrer_test.rb +93 -0
  359. data/test/my-sequel_test.rb +238 -0
  360. data/test/test_helper.rb +7 -0
  361. data/test/test_plugin_helper.rb +64 -0
  362. data/test/test_plugin_helper_test.rb +28 -0
  363. data/test/weather_test.rb +33 -0
  364. data/theme/base.css +268 -0
  365. data/theme/conf.block.png +0 -0
  366. data/theme/conf.css +254 -0
  367. data/theme/default/README +11 -0
  368. data/theme/default/body.png +0 -0
  369. data/theme/default/default.css +743 -0
  370. data/theme/help.png +0 -0
  371. data/theme/loading.gif +0 -0
  372. data/theme/tdiary1/README +7 -0
  373. data/theme/tdiary1/tdiary1.css +394 -0
  374. data/theme/tdiary2/README +19 -0
  375. data/theme/tdiary2/tdiary2.css +624 -0
  376. data/update.fcgi +45 -0
  377. data/update.rb +57 -0
  378. data/vendor/hikidoc-0.0.6/COPYING +28 -0
  379. data/vendor/hikidoc-0.0.6/NEWS +30 -0
  380. data/vendor/hikidoc-0.0.6/NEWS.ja +30 -0
  381. data/vendor/hikidoc-0.0.6/README +86 -0
  382. data/vendor/hikidoc-0.0.6/README.ja +83 -0
  383. data/vendor/hikidoc-0.0.6/Rakefile +68 -0
  384. data/vendor/hikidoc-0.0.6/TextFormattingRules +320 -0
  385. data/vendor/hikidoc-0.0.6/TextFormattingRules.ja +318 -0
  386. data/vendor/hikidoc-0.0.6/bin/hikidoc +66 -0
  387. data/vendor/hikidoc-0.0.6/lib/hikidoc.rb +914 -0
  388. data/vendor/hikidoc-0.0.6/setup.rb +1360 -0
  389. data/vendor/hikidoc-0.0.6/test/run-test.rb +13 -0
  390. data/vendor/hikidoc-0.0.6/test/test_hikidoc.rb +506 -0
  391. data/vendor/imagesize-0.1.1/Manifest.txt +19 -0
  392. data/vendor/imagesize-0.1.1/README.txt +49 -0
  393. data/vendor/imagesize-0.1.1/lib/image_size.rb +305 -0
  394. data/vendor/imagesize-0.1.1/lib/image_size/version.rb +9 -0
  395. data/vendor/imagesize-0.1.1/setup.rb +1585 -0
  396. data/vendor/imagesize-0.1.1/test/2-4-7.png +0 -0
  397. data/vendor/imagesize-0.1.1/test/4_1_2.gif +0 -0
  398. data/vendor/imagesize-0.1.1/test/bmp.bmp +0 -0
  399. data/vendor/imagesize-0.1.1/test/cursor.xbm +6 -0
  400. data/vendor/imagesize-0.1.1/test/detect.swf +0 -0
  401. data/vendor/imagesize-0.1.1/test/pbm.pbm +0 -0
  402. data/vendor/imagesize-0.1.1/test/pcx.pcx +0 -0
  403. data/vendor/imagesize-0.1.1/test/pgm.pgm +5 -0
  404. data/vendor/imagesize-0.1.1/test/test.xpm +38 -0
  405. data/vendor/imagesize-0.1.1/test/test_helper.rb +2 -0
  406. data/vendor/imagesize-0.1.1/test/test_image_size.rb +71 -0
  407. data/vendor/imagesize-0.1.1/test/tiff.tiff +0 -0
  408. data/vendor/imagesize-0.1.1/test/tokyo_tower.jpg +0 -0
  409. data/vendor/imagesize-0.1.1/test/tower_e.gif.psd +0 -0
  410. data/vendor/jasmine-jquery-1.4.2/jasmine-jquery.js +548 -0
  411. data/vendor/jquery-1.8/jquery.js +9227 -0
  412. data/vendor/rdtool-0.6.38/COPYING.txt +339 -0
  413. data/vendor/rdtool-0.6.38/Gemfile +3 -0
  414. data/vendor/rdtool-0.6.38/HISTORY +318 -0
  415. data/vendor/rdtool-0.6.38/LGPL-2.1 +502 -0
  416. data/vendor/rdtool-0.6.38/LICENSE.txt +58 -0
  417. data/vendor/rdtool-0.6.38/README.html +66 -0
  418. data/vendor/rdtool-0.6.38/README.ja.html +73 -0
  419. data/vendor/rdtool-0.6.38/README.rd +76 -0
  420. data/vendor/rdtool-0.6.38/README.rd.ja +85 -0
  421. data/vendor/rdtool-0.6.38/Rakefile +152 -0
  422. data/vendor/rdtool-0.6.38/TODO +22 -0
  423. data/vendor/rdtool-0.6.38/bin/rd2 +283 -0
  424. data/vendor/rdtool-0.6.38/bin/rdswap.rb +207 -0
  425. data/vendor/rdtool-0.6.38/doc/rd-draft.html +456 -0
  426. data/vendor/rdtool-0.6.38/doc/rd-draft.ja.html +466 -0
  427. data/vendor/rdtool-0.6.38/doc/rd-draft.rd +479 -0
  428. data/vendor/rdtool-0.6.38/doc/rd-draft.rd.ja +487 -0
  429. data/vendor/rdtool-0.6.38/lib/rd/block-element.rb +114 -0
  430. data/vendor/rdtool-0.6.38/lib/rd/complex-list-item.rb +65 -0
  431. data/vendor/rdtool-0.6.38/lib/rd/desclist.rb +55 -0
  432. data/vendor/rdtool-0.6.38/lib/rd/document-struct.rb +46 -0
  433. data/vendor/rdtool-0.6.38/lib/rd/dot.rd2rc +18 -0
  434. data/vendor/rdtool-0.6.38/lib/rd/element.rb +160 -0
  435. data/vendor/rdtool-0.6.38/lib/rd/filter.rb +255 -0
  436. data/vendor/rdtool-0.6.38/lib/rd/head-filter.rb +14 -0
  437. data/vendor/rdtool-0.6.38/lib/rd/inline-element.rb +233 -0
  438. data/vendor/rdtool-0.6.38/lib/rd/labeled-element.rb +14 -0
  439. data/vendor/rdtool-0.6.38/lib/rd/list.rb +57 -0
  440. data/vendor/rdtool-0.6.38/lib/rd/loose-struct.rb +11 -0
  441. data/vendor/rdtool-0.6.38/lib/rd/methodlist.rb +57 -0
  442. data/vendor/rdtool-0.6.38/lib/rd/output-format-visitor.rb +30 -0
  443. data/vendor/rdtool-0.6.38/lib/rd/package.rb +4 -0
  444. data/vendor/rdtool-0.6.38/lib/rd/parser-util.rb +14 -0
  445. data/vendor/rdtool-0.6.38/lib/rd/post-install +1 -0
  446. data/vendor/rdtool-0.6.38/lib/rd/pre-setup.rb +18 -0
  447. data/vendor/rdtool-0.6.38/lib/rd/rbl-file.rb +69 -0
  448. data/vendor/rdtool-0.6.38/lib/rd/rbl-suite.rb +37 -0
  449. data/vendor/rdtool-0.6.38/lib/rd/rd-struct.rb +86 -0
  450. data/vendor/rdtool-0.6.38/lib/rd/rd2html-ext-lib.rb +266 -0
  451. data/vendor/rdtool-0.6.38/lib/rd/rd2html-ext-opt.rb +34 -0
  452. data/vendor/rdtool-0.6.38/lib/rd/rd2html-lib.rb +490 -0
  453. data/vendor/rdtool-0.6.38/lib/rd/rd2html-opt.rb +67 -0
  454. data/vendor/rdtool-0.6.38/lib/rd/rd2man-lib.rb +251 -0
  455. data/vendor/rdtool-0.6.38/lib/rd/rd2rdo-lib.rb +19 -0
  456. data/vendor/rdtool-0.6.38/lib/rd/rd2rmi-lib.rb +32 -0
  457. data/vendor/rdtool-0.6.38/lib/rd/rdblockparser.ry +518 -0
  458. data/vendor/rdtool-0.6.38/lib/rd/rdblockparser.tab.rb +1061 -0
  459. data/vendor/rdtool-0.6.38/lib/rd/rdfmt.rb +15 -0
  460. data/vendor/rdtool-0.6.38/lib/rd/rdinlineparser.ry +503 -0
  461. data/vendor/rdtool-0.6.38/lib/rd/rdinlineparser.tab.rb +1243 -0
  462. data/vendor/rdtool-0.6.38/lib/rd/rdvisitor.rb +214 -0
  463. data/vendor/rdtool-0.6.38/lib/rd/reference-resolver.rb +114 -0
  464. data/vendor/rdtool-0.6.38/lib/rd/search-file.rb +14 -0
  465. data/vendor/rdtool-0.6.38/lib/rd/tree.rb +103 -0
  466. data/vendor/rdtool-0.6.38/lib/rd/version.rb +41 -0
  467. data/vendor/rdtool-0.6.38/lib/rd/visitor.rb +86 -0
  468. data/vendor/rdtool-0.6.38/rdtool.gemspec +125 -0
  469. data/vendor/rdtool-0.6.38/setup.rb +1596 -0
  470. data/vendor/rdtool-0.6.38/test/data/includee1.html +1 -0
  471. data/vendor/rdtool-0.6.38/test/data/includee2.html +1 -0
  472. data/vendor/rdtool-0.6.38/test/data/includee3.nothtml +1 -0
  473. data/vendor/rdtool-0.6.38/test/data/includee4.xhtml +0 -0
  474. data/vendor/rdtool-0.6.38/test/data/label.rbl +2 -0
  475. data/vendor/rdtool-0.6.38/test/data/label2.rbl +2 -0
  476. data/vendor/rdtool-0.6.38/test/data/sub/includee2.html +1 -0
  477. data/vendor/rdtool-0.6.38/test/data/sub/includee4.html +0 -0
  478. data/vendor/rdtool-0.6.38/test/dummy-observer.rb +6 -0
  479. data/vendor/rdtool-0.6.38/test/dummy.rb +33 -0
  480. data/vendor/rdtool-0.6.38/test/temp-dir.rb +19 -0
  481. data/vendor/rdtool-0.6.38/test/test-block-parser.rb +46 -0
  482. data/vendor/rdtool-0.6.38/test/test-desclist-item.rb +219 -0
  483. data/vendor/rdtool-0.6.38/test/test-document-element.rb +46 -0
  484. data/vendor/rdtool-0.6.38/test/test-document-struct.rb +66 -0
  485. data/vendor/rdtool-0.6.38/test/test-element.rb +46 -0
  486. data/vendor/rdtool-0.6.38/test/test-headline.rb +80 -0
  487. data/vendor/rdtool-0.6.38/test/test-inline-parser.rb +46 -0
  488. data/vendor/rdtool-0.6.38/test/test-list-item.rb +54 -0
  489. data/vendor/rdtool-0.6.38/test/test-list.rb +53 -0
  490. data/vendor/rdtool-0.6.38/test/test-methodlist-item.rb +73 -0
  491. data/vendor/rdtool-0.6.38/test/test-nonterminal-element.rb +170 -0
  492. data/vendor/rdtool-0.6.38/test/test-nonterminal-inline.rb +33 -0
  493. data/vendor/rdtool-0.6.38/test/test-output-format-visitor.rb +48 -0
  494. data/vendor/rdtool-0.6.38/test/test-parser-util.rb +41 -0
  495. data/vendor/rdtool-0.6.38/test/test-rbl-file.rb +156 -0
  496. data/vendor/rdtool-0.6.38/test/test-rbl-suite.rb +43 -0
  497. data/vendor/rdtool-0.6.38/test/test-rd2html-lib.rb +496 -0
  498. data/vendor/rdtool-0.6.38/test/test-rdtree.rb +17 -0
  499. data/vendor/rdtool-0.6.38/test/test-rdvisitor.rb +29 -0
  500. data/vendor/rdtool-0.6.38/test/test-reference-resolver.rb +202 -0
  501. data/vendor/rdtool-0.6.38/test/test-reference.rb +132 -0
  502. data/vendor/rdtool-0.6.38/test/test-search-file.rb +22 -0
  503. data/vendor/rdtool-0.6.38/test/test-terminal-inline.rb +41 -0
  504. data/vendor/rdtool-0.6.38/test/test-textblock.rb +44 -0
  505. data/vendor/rdtool-0.6.38/test/test-tree.rb +82 -0
  506. data/vendor/rdtool-0.6.38/test/test-version.rb +57 -0
  507. data/vendor/rdtool-0.6.38/test/test-visitor.rb +230 -0
  508. data/vendor/rdtool-0.6.38/utils/rd-mode.el +464 -0
  509. metadata +666 -0
@@ -0,0 +1,318 @@
1
+ !�ѥ饰���
2
+
3
+ Ϣ³����ʣ���Ԥ�Ϣ�뤵��ư�ĤΥѥ饰��դˤʤ�ޤ���
4
+
5
+ ���� (���ԤΤߡ��ޤ��ϥ��ڡ��������֤����ι�) �ϥѥ饰��դζ��ڤ�ˤʤ�ޤ���
6
+
7
+ *������
8
+
9
+ �㤨�С�
10
+ �����������˵��Ҥ���ȡ������ιԤ�
11
+ ��ĤΥѥ饰��դȤ�����������ޤ���
12
+
13
+ *������
14
+
15
+ �㤨�С�
16
+ �����������˵��Ҥ���ȡ������ιԤ�
17
+ ��ĤΥѥ饰��դȤ�����������ޤ���
18
+
19
+ !���
20
+
21
+ !!WikiName
22
+
23
+ ��ʸ���αѻ��ǻϤޤꡢ��ʸ���αѻ��ޤ��Ͽ�����1ʸ���ʾ�³��
24
+
25
+ ���ξ�郎2��ʾ巫���֤����ñ���WikiName�ˤʤ꼫ưŪ�˥�󥯤��Ϥ��ޤ���
26
+
27
+ *������
28
+
29
+ WikiName - WikiName
30
+ HogeRule1 - WikiName
31
+ NOTWIKINAME - ������ʸ���ʤΤ�WikiName�ǤϤʤ�
32
+ WikiNAME - NAME��������ʸ���ʤΤ�WikiName�ǤϤʤ�
33
+ fooWikiName - ��Ƭ�����ƾ�ʸ���αѻ�foo�����뤿��WikiName�ǤϤʤ�
34
+
35
+ *������
36
+
37
+ **WikiName - WikiName
38
+ **HogeRule1 - WikiName
39
+ **NOTWIKINAME - ������ʸ���ʤΤ�WikiName�ǤϤʤ�
40
+ **WikiNAME - NAME��������ʸ���ʤΤ�WikiName�ǤϤʤ�
41
+ **fooWikiName - ��Ƭ�����ƾ�ʸ���αѻ�foo�����뤿��WikiName�ǤϤʤ�
42
+
43
+ WikiName������''^''��Ĥ����WikiName�ؤΥ�󥯤��������뤳�Ȥ��Ǥ��ޤ���
44
+
45
+ *������
46
+
47
+ WikiName - WikiName
48
+ ^WikiName - WikiName�ؤΥ�󥯤�����
49
+
50
+ *������
51
+
52
+ **WikiName - WikiName
53
+ **^WikiName - WikiName�ؤΥ�󥯤�����
54
+
55
+ !!�ڡ����ؤΥ��
56
+
57
+ �ڡ���̾����ĤΥ������å��ǰϤ�ȡ����Υڡ����ؤΥ�󥯤ˤʤ�ޤ���
58
+
59
+ *������
60
+
61
+ �㤨��[[�հ���Ruby]]�Ȥ���ȡ����Υڡ����ؤΥ�󥯤ˤʤ�ޤ���
62
+
63
+ *������
64
+
65
+ �㤨��[[�հ���Ruby]]�Ȥ���ȡ����Υڡ����ؤΥ�󥯤ˤʤ�ޤ���
66
+
67
+ !!Ǥ�դ�URL�ؤΥ��
68
+
69
+ ñ��|URL����ĤΥ������å��ǰϤ�Ȥ�Ǥ�դ�URL�ؤΥ�󥯤ˤʤ�ޤ���
70
+
71
+ *������
72
+
73
+ [[Yahoo!|http://www.yahoo.co.jp/]]�Ȥ���Ǥ��ޤ���
74
+
75
+ *������
76
+
77
+ [[Yahoo!|http://www.yahoo.co.jp/]]�Ȥ���Ǥ��ޤ���
78
+
79
+ �ѥ饰������URL�äݤ���Τ�����Ⱦ���˥�󥯤��Ϥ��ޤ���
80
+
81
+ *������
82
+
83
+ Hiki�Υڡ�����http://hikiwiki.org/ja/�Ǥ���
84
+
85
+ *������
86
+
87
+ Hiki�Υڡ�����http://hikiwiki.org/ja/�Ǥ���
88
+
89
+ ���ΤȤ�URL��������jpg,jpeg,png,gif����IMG������Ÿ������ޤ���
90
+
91
+ *������
92
+
93
+ http://jp.rubyist.net/theme/clover/clover_h1.png
94
+
95
+ *������
96
+
97
+ http://jp.rubyist.net/theme/clover/clover_h1.png
98
+
99
+ !�����Ѥߥƥ�����
100
+
101
+ �Ԥ���Ƭ�����ڡ����ޤ��ϥ��֤ǻϤޤäƤ���ȡ����ιԤ������ѤߤȤ��ư����ޤ���
102
+
103
+ *������
104
+
105
+ require 'cgi'
106
+
107
+ cgi = CGI::new
108
+ cgi.header
109
+
110
+ puts <<EOS
111
+ <html>
112
+ <head>
113
+ <title>Hello!</title>
114
+ </head>
115
+ <body>
116
+ <p>Hello!</p>
117
+ </body>
118
+ </html>
119
+ EOS
120
+
121
+ !ʸ���ν���
122
+
123
+ ��'��2�ĤǤϤ������ʬ�϶�Ĵ����ޤ���
124
+
125
+ ��'��3�ĤǤϤ������ʬ�Ϥ���˶�Ĵ����ޤ���
126
+
127
+ ��=��2�ĤǤϤ������ʬ�ϼ�����ˤʤ�ޤ���
128
+
129
+ ��`��2�ĤǤϤ������ʬ������ɽ���ˤʤ�ޤ���
130
+
131
+ *������
132
+
133
+ ���Τ褦�ˤ����''��Ĵ''�ˤʤ�ޤ���
134
+ �����ơ����Τ褦�ˤ����'''����˶�Ĵ'''����ޤ���
135
+ ==���뤤����==����ˡ����ä����⥵�ݡ��Ȥ��Ƥ��ޤ���
136
+ �ޤ��ޤ������Τ褦�ˤ����''����ɽ��''�ˤʤ�ޤ���
137
+
138
+ *������
139
+
140
+ ���Τ褦�ˤ����''��Ĵ''�ˤʤ�ޤ���
141
+ �����ơ����Τ褦�ˤ����'''����˶�Ĵ'''����ޤ���
142
+ ==���뤤����==����ˡ����ä����⥵�ݡ��Ȥ��Ƥ��ޤ���
143
+ �ޤ��ޤ������Τ褦�ˤ����''����ɽ��''�ˤʤ�ޤ���
144
+
145
+ !����
146
+
147
+ ��!�פ�Ԥ���Ƭ�˽񤯤ȸ��Ф��ˤʤ�ޤ���
148
+
149
+ ��!�פϰ�Ĥ���ϻ�Ĥޤǵ��Ҥ��뤳�Ȥ���ǽ�ǡ����줾��<H1>��<H6>���Ѵ�����ޤ���
150
+
151
+ *������
152
+
153
+ !����1
154
+ !!����2
155
+ !!!����3
156
+ !!!!����4
157
+ !!!!!����5
158
+
159
+ *������
160
+
161
+ !����1
162
+ !!����2
163
+ !!!����3
164
+ !!!!����4
165
+ !!!!!����5
166
+
167
+ !��ʿ��
168
+
169
+ �ޥ��ʥ������-�פ�Ԥ���Ƭ����4�Ľ񤯤ȿ�ʿ���ˤʤ�ޤ���
170
+
171
+ *������
172
+
173
+ ������������
174
+ ----
175
+ ������������
176
+
177
+ *������
178
+
179
+ ������������
180
+ ----
181
+ ������������
182
+
183
+ !�վ��
184
+
185
+ ��*�פ�Ԥ���Ƭ�˽񤯤Ȳվ�񤭤ˤʤ�ޤ���
186
+
187
+ ��*�פϰ�Ĥ��黰�Ĥޤǵ��Ҥ��뤳�Ȥ���ǽ������Ҥˤ��뤳�Ȥ�Ǥ��ޤ���
188
+
189
+ ��#�פ�Ԥ���Ƭ�˽񤯤��ֹ��դ��βվ�񤭤ˤʤ�ޤ���
190
+
191
+ *������
192
+
193
+ *�����ƥ�1
194
+ **�����ƥ�1.1
195
+ **�����ƥ�1.2
196
+ ***�����ƥ�1.2.1
197
+ ***�����ƥ�1.2.2
198
+ ***�����ƥ�1.2.3
199
+ **�����ƥ�1.3
200
+ **�����ƥ�1.4
201
+ *�����ƥ�2
202
+
203
+ #����1
204
+ #����2
205
+ ##����2.1
206
+ ##����2.2
207
+ ##����2.3
208
+ #����3
209
+ ##����3.1
210
+ ###����3.1.1
211
+ ###����3.1.2
212
+
213
+ *������
214
+
215
+ *�����ƥ�1
216
+ **�����ƥ�1.1
217
+ **�����ƥ�1.2
218
+ ***�����ƥ�1.2.1
219
+ ***�����ƥ�1.2.2
220
+ ***�����ƥ�1.2.3
221
+ **�����ƥ�1.3
222
+ **�����ƥ�1.4
223
+ *�����ƥ�2
224
+
225
+ #����1
226
+ #����2
227
+ ##����2.1
228
+ ##����2.2
229
+ ##����2.3
230
+ #����3
231
+ ##����3.1
232
+ ###����3.1.1
233
+ ###����3.1.2
234
+
235
+ !����
236
+
237
+ ��"�פ�Ԥ���Ƭ������Ľ񤯤Ȱ��Ѥˤʤ�ޤ���
238
+
239
+ *������
240
+
241
+ ""����ϰ��ѤǤ���
242
+ ""����˰��Ѥ��ޤ���
243
+ ""³���ư��Ѥ��ޤ������Ѥ�Ϣ³�����硢
244
+ ""���Τ褦�˰�Ĥΰ��ѤȤ���
245
+ ""Ÿ������ޤ���
246
+
247
+ *������
248
+
249
+ ""����ϰ��ѤǤ���
250
+ ""����˰��Ѥ��ޤ���
251
+ ""³���ư��Ѥ��ޤ������Ѥ�Ϣ³�����硢
252
+ ""���Τ褦�˰�Ĥΰ��ѤȤ���
253
+ ""Ÿ������ޤ���
254
+
255
+ !�Ѹ����
256
+
257
+ �������:�פ�Ԥ���Ƭ�˽񤭡�³�����Ѹ�:����ʸ�Ȥ�����Ѹ����ˤʤ�ޤ���
258
+
259
+ *������
260
+
261
+ :���:apple
262
+ :�����:gorilla
263
+ :�饯��:camel
264
+
265
+ *������
266
+
267
+ :���:apple
268
+ :�����:gorilla
269
+ :�饯��:camel
270
+
271
+
272
+
273
+ ɽ(�ơ��֥�)�ϡ�||�פǻϤ�ޤ���
274
+ ����ι��ܤ�Ƭ�ˡ�!�פ�Ĥ��뤳�Ȥˤ�긫�Ф�����ˤʤ�ޤ���
275
+ �Ԥ�Ϣ��ˤϡ�^�פ����Ϣ��ˤϡ�>�פ�Ϣ�뤷��������������ι���Ƭ�ˤĤ��Ƥ���������
276
+
277
+ *������
278
+
279
+ ||!�Ը��Ф����󸫽Ф�||!��-A||!��-B||!��-C||!>��-D-E�ʲ�Ϣ���
280
+ ||!��-1||A1||B1||^C1-C2�ʽ�Ϣ���||D1||E1
281
+ ||!��-2||A2||B2||^>D2-E2-D3-E3�ʽIJ�Ϣ���
282
+ ||!��-3||>>A3-C3�ʲ���Ϣ���
283
+
284
+ *������
285
+
286
+ ||!�Ը��Ф����󸫽Ф�||!��-A||!��-B||!��-C||!>��-D-E�ʲ�Ϣ���
287
+ ||!��-1||A1||B1||^C1-C2�ʽ�Ϣ���||D1||E1
288
+ ||!��-2||A2||B2||^>D2-E2-D3-E3�ʽIJ�Ϣ���
289
+ ||!��-3||>>A3-C3�ʲ���Ϣ���
290
+
291
+ !�����ȹ�
292
+
293
+ ��//�פ���Ƭ�ˤ���Ԥϥ����ȹԤˤʤꡢ���Ϥ���ʤ��ʤ�ޤ���
294
+
295
+ *������
296
+
297
+ // �����ϥ����ȤǤ���
298
+
299
+ *�������ɽ������ޤ����
300
+ // �����ϥ����ȤǤ���
301
+
302
+ !�ץ饰����
303
+
304
+ ��{����Ĥȡ�}����ĤǰϤ�ȥץ饰�����ƤӽФ����Ȥ��Ǥ��ޤ���
305
+ �ѥ�᡼����ʣ���Ԥ�ʬ���ƽ񤯤��Ȥ��ǽ�Ǥ���
306
+ �ץ饰����Τߤ�ñ�ȹԤ˽񤤤����ϥ֥��å��ץ饰����ˤʤꡢ�����<p>��</p>���դ��ʤ��ʤ�ޤ���
307
+
308
+ *������
309
+
310
+ {{recent(3)}}
311
+
312
+ *ʣ���Ե�����
313
+
314
+ {{pre(
315
+ �ѥ�᡼����
316
+ �ѥ�᡼����
317
+ �ѥ�᡼����
318
+ )}}
@@ -0,0 +1,66 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'hikidoc'
4
+ require 'optparse'
5
+ require 'erb'
6
+
7
+ HTML_TEMPLATE = <<EOS
8
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
9
+ <html>
10
+ <head>
11
+ <title><%= title %></title>
12
+ </head>
13
+ <body>
14
+ <%= body %>
15
+ </body>
16
+ </html>
17
+ EOS
18
+
19
+ options = {}
20
+ format_options = {}
21
+ ARGV.options do |opts|
22
+ opts.banner = "Usage: #$0 [OPTIONS] FILE"
23
+
24
+ opts.on('-f', '--fragment',
25
+ 'Output HTML fragments only') do
26
+ options[:fragment] = true
27
+ end
28
+ opts.on('-t', '--template=TEMPLATE',
29
+ 'Specify a HTML template file') do |template|
30
+ options[:template] = template
31
+ end
32
+ opts.on('--no-wikiname', 'Disable WikiName link') do
33
+ format_options[:use_wiki_name] = false
34
+ end
35
+
36
+ opts.parse!
37
+ end
38
+
39
+ case ARGV.size
40
+ when 0
41
+ title, text = '-', $stdin.read
42
+ when 1
43
+ title, text = ARGV[0], File.read(ARGV[0])
44
+ else
45
+ usage
46
+ end
47
+
48
+ body = HikiDoc.to_html(text, format_options)
49
+
50
+ def result(erb, title, body, text)
51
+ erb.result(binding)
52
+ end
53
+
54
+ if options[:fragment]
55
+ puts(body)
56
+ else
57
+ template = options[:template]
58
+ if template
59
+ source = File.read(template)
60
+ else
61
+ source = HTML_TEMPLATE
62
+ end
63
+ erb = ERB.new(source)
64
+ erb.filename = template
65
+ puts(result(erb, title, body, text))
66
+ end
@@ -0,0 +1,914 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Copyright (c) 2005, Kazuhiko <kazuhiko@fdiary.net>
3
+ # Copyright (c) 2007 Minero Aoki
4
+ # All rights reserved.
5
+ #
6
+ # Redistribution and use in source and binary forms, with or without
7
+ # modification, are permitted provided that the following conditions are
8
+ # met:
9
+ #
10
+ # * Redistributions of source code must retain the above copyright
11
+ # notice, this list of conditions and the following disclaimer.
12
+ # * Redistributions in binary form must reproduce the above
13
+ # copyright notice, this list of conditions and the following
14
+ # disclaimer in the documentation and/or other materials provided
15
+ # with the distribution.
16
+ # * Neither the name of the HikiDoc nor the names of its
17
+ # contributors may be used to endorse or promote products derived
18
+ # from this software without specific prior written permission.
19
+ #
20
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21
+ # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22
+ # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23
+ # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24
+ # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25
+ # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26
+ # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27
+ # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28
+ # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29
+ # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30
+ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
+
32
+ require "stringio"
33
+ require "strscan"
34
+ require "uri"
35
+ begin
36
+ require "syntax/convertors/html"
37
+ rescue LoadError
38
+ end
39
+
40
+ class HikiDoc
41
+ VERSION = "0.0.6" # FIXME
42
+
43
+ class Error < StandardError
44
+ end
45
+
46
+ class UnexpectedError < Error
47
+ end
48
+
49
+ def HikiDoc.to_html(src, options = {})
50
+ new(HTMLOutput.new(">"), options).compile(src)
51
+ end
52
+
53
+ def HikiDoc.to_xhtml(src, options = {})
54
+ new(HTMLOutput.new(" />"), options).compile(src)
55
+ end
56
+
57
+ def initialize(output, options = {})
58
+ @output = output
59
+ @options = default_options.merge(options)
60
+ @header_re = nil
61
+ @level = options[:level] || 1
62
+ @plugin_syntax = options[:plugin_syntax] || method(:valid_plugin_syntax?)
63
+ end
64
+
65
+ def compile(src)
66
+ @output.reset
67
+ escape_plugin_blocks(src) {|escaped|
68
+ compile_blocks escaped
69
+ @output.finish
70
+ }
71
+ end
72
+
73
+ # for backward compatibility
74
+ def to_html
75
+ $stderr.puts("warning: HikiDoc#to_html is deprecated. Please use HikiDoc.to_html or HikiDoc.to_xhtml instead.")
76
+ self.class.to_html(@output, @options)
77
+ end
78
+
79
+ private
80
+
81
+ def default_options
82
+ {
83
+ :allow_bracket_inline_image => true,
84
+ :use_wiki_name => true,
85
+ :use_not_wiki_name => true,
86
+ }
87
+ end
88
+
89
+ #
90
+ # Plugin
91
+ #
92
+
93
+ def valid_plugin_syntax?(code)
94
+ /['"]/ !~ code.gsub(/\\\\/, "").gsub(/\\['"]/,"").gsub(/'[^']*'|"[^"]*"/m, "")
95
+ end
96
+
97
+ def escape_plugin_blocks(text)
98
+ s = StringScanner.new(text)
99
+ buf = ""
100
+ @plugin_blocks = []
101
+ while chunk = s.scan_until(/\{\{/)
102
+ tail = chunk[-2, 2]
103
+ chunk[-2, 2] = ""
104
+ buf << chunk
105
+ # plugin
106
+ if block = extract_plugin_block(s)
107
+ @plugin_blocks.push block
108
+ buf << "\0#{@plugin_blocks.size - 1}\0"
109
+ else
110
+ buf << "{{"
111
+ end
112
+ end
113
+ buf << s.rest
114
+ yield(buf)
115
+ end
116
+
117
+ def restore_plugin_block(str)
118
+ str.gsub(/\0(\d+)\0/) {
119
+ "{{" + plugin_block($1.to_i) + "}}"
120
+ }
121
+ end
122
+
123
+ def evaluate_plugin_block(str, buf = nil)
124
+ buf ||= @output.container
125
+ str.split(/(\0\d+\0)/).each do |s|
126
+ if s[0, 1] == "\0" and s[-1, 1] == "\0"
127
+ buf << @output.inline_plugin(plugin_block(s[1..-2].to_i))
128
+ else
129
+ buf << @output.text(s)
130
+ end
131
+ end
132
+ buf
133
+ end
134
+
135
+ def plugin_block(id)
136
+ @plugin_blocks[id] or raise UnexpectedError, "must not happen: #{id.inspect}"
137
+ end
138
+
139
+ def extract_plugin_block(s)
140
+ pos = s.pos
141
+ buf = ""
142
+ while chunk = s.scan_until(/\}\}/)
143
+ buf << chunk
144
+ buf.chomp!("}}")
145
+ if @plugin_syntax.call(buf)
146
+ return buf
147
+ end
148
+ buf << "}}"
149
+ end
150
+ s.pos = pos
151
+ nil
152
+ end
153
+
154
+ #
155
+ # Block Level
156
+ #
157
+
158
+ def compile_blocks(src)
159
+ f = LineInput.new(StringIO.new(src))
160
+ while line = f.peek
161
+ case line
162
+ when COMMENT_RE
163
+ f.gets
164
+ when HEADER_RE
165
+ compile_header f.gets
166
+ when HRULE_RE
167
+ f.gets
168
+ compile_hrule
169
+ when LIST_RE
170
+ compile_list f
171
+ when DLIST_RE
172
+ compile_dlist f
173
+ when TABLE_RE
174
+ compile_table f
175
+ when BLOCKQUOTE_RE
176
+ compile_blockquote f
177
+ when INDENTED_PRE_RE
178
+ compile_indented_pre f
179
+ when BLOCK_PRE_OPEN_RE
180
+ compile_block_pre f
181
+ else
182
+ if /^$/ =~ line
183
+ f.gets
184
+ next
185
+ end
186
+ compile_paragraph f
187
+ end
188
+ end
189
+ end
190
+
191
+ COMMENT_RE = %r<\A//>
192
+
193
+ def skip_comments(f)
194
+ f.while_match(COMMENT_RE) do |line|
195
+ end
196
+ end
197
+
198
+ HEADER_RE = /\A!+/
199
+
200
+ def compile_header(line)
201
+ @header_re ||= /\A!{1,#{7 - @level}}/
202
+ level = @level + (line.slice!(@header_re).size - 1)
203
+ title = strip(line)
204
+ @output.headline level, compile_inline(title)
205
+ end
206
+
207
+ HRULE_RE = /\A----$/
208
+
209
+ def compile_hrule
210
+ @output.hrule
211
+ end
212
+
213
+ ULIST = "*"
214
+ OLIST = "#"
215
+ LIST_RE = /\A#{Regexp.union(ULIST, OLIST)}+/
216
+
217
+ def compile_list(f)
218
+ typestack = []
219
+ level = 0
220
+ @output.list_begin
221
+ f.while_match(LIST_RE) do |line|
222
+ list_type = (line[0,1] == ULIST ? "ul" : "ol")
223
+ new_level = line.slice(LIST_RE).size
224
+ item = strip(line.sub(LIST_RE, ""))
225
+ if new_level > level
226
+ (new_level - level).times do
227
+ typestack.push list_type
228
+ @output.list_open list_type
229
+ @output.listitem_open
230
+ end
231
+ @output.listitem compile_inline(item)
232
+ elsif new_level < level
233
+ (level - new_level).times do
234
+ @output.listitem_close
235
+ @output.list_close typestack.pop
236
+ end
237
+ @output.listitem_close
238
+ @output.listitem_open
239
+ @output.listitem compile_inline(item)
240
+ elsif list_type == typestack.last
241
+ @output.listitem_close
242
+ @output.listitem_open
243
+ @output.listitem compile_inline(item)
244
+ else
245
+ @output.listitem_close
246
+ @output.list_close typestack.pop
247
+ @output.list_open list_type
248
+ @output.listitem_open
249
+ @output.listitem compile_inline(item)
250
+ typestack.push list_type
251
+ end
252
+ level = new_level
253
+ skip_comments f
254
+ end
255
+ level.times do
256
+ @output.listitem_close
257
+ @output.list_close typestack.pop
258
+ end
259
+ @output.list_end
260
+ end
261
+
262
+ DLIST_RE = /\A:/
263
+
264
+ def compile_dlist(f)
265
+ @output.dlist_open
266
+ f.while_match(DLIST_RE) do |line|
267
+ dt, dd = split_dlitem(line.sub(DLIST_RE, ""))
268
+ @output.dlist_item compile_inline(dt), compile_inline(dd)
269
+ skip_comments f
270
+ end
271
+ @output.dlist_close
272
+ end
273
+
274
+ def split_dlitem(line)
275
+ re = /\A((?:#{BRACKET_LINK_RE}|.)*?):/o
276
+ if m = re.match(line)
277
+ return m[1], m.post_match
278
+ else
279
+ return line, ""
280
+ end
281
+ end
282
+
283
+ TABLE_RE = /\A\|\|/
284
+
285
+ def compile_table(f)
286
+ lines = []
287
+ f.while_match(TABLE_RE) do |line|
288
+ lines.push line
289
+ skip_comments f
290
+ end
291
+ @output.table_open
292
+ lines.each do |line|
293
+ @output.table_record_open
294
+ split_columns(line.sub(TABLE_RE, "")).each do |col|
295
+ mid = col.sub!(/\A!/, "") ? "table_head" : "table_data"
296
+ span = col.slice!(/\A[\^>]*/)
297
+ rs = span_count(span, "^")
298
+ cs = span_count(span, ">")
299
+ @output.__send__(mid, compile_inline(col), rs, cs)
300
+ end
301
+ @output.table_record_close
302
+ end
303
+ @output.table_close
304
+ end
305
+
306
+ def split_columns(str)
307
+ cols = str.split(/\|\|/)
308
+ cols.pop if cols.last.chomp.empty?
309
+ cols
310
+ end
311
+
312
+ def span_count(str, ch)
313
+ c = str.count(ch)
314
+ c == 0 ? nil : c + 1
315
+ end
316
+
317
+ BLOCKQUOTE_RE = /\A""[ \t]?/
318
+
319
+ def compile_blockquote(f)
320
+ @output.blockquote_open
321
+ lines = []
322
+ f.while_match(BLOCKQUOTE_RE) do |line|
323
+ lines.push line.sub(BLOCKQUOTE_RE, "")
324
+ skip_comments f
325
+ end
326
+ compile_blocks lines.join("")
327
+ @output.blockquote_close
328
+ end
329
+
330
+ INDENTED_PRE_RE = /\A[ \t]/
331
+
332
+ def compile_indented_pre(f)
333
+ lines = f.span(INDENTED_PRE_RE)\
334
+ .map {|line| rstrip(line.sub(INDENTED_PRE_RE, "")) }
335
+ text = restore_plugin_block(lines.join("\n"))
336
+ @output.preformatted(@output.text(text))
337
+ end
338
+
339
+ BLOCK_PRE_OPEN_RE = /\A<<<\s*(\w+)?/
340
+ BLOCK_PRE_CLOSE_RE = /\A>>>/
341
+
342
+ def compile_block_pre(f)
343
+ m = BLOCK_PRE_OPEN_RE.match(f.gets) or raise UnexpectedError, "must not happen"
344
+ str = restore_plugin_block(f.break(BLOCK_PRE_CLOSE_RE).join.chomp)
345
+ f.gets
346
+ @output.block_preformatted(str, m[1])
347
+ end
348
+
349
+ BLANK = /\A$/
350
+ PARAGRAPH_END_RE = Regexp.union(BLANK,
351
+ HEADER_RE, HRULE_RE, LIST_RE, DLIST_RE,
352
+ BLOCKQUOTE_RE, TABLE_RE,
353
+ INDENTED_PRE_RE, BLOCK_PRE_OPEN_RE)
354
+
355
+ def compile_paragraph(f)
356
+ lines = f.break(PARAGRAPH_END_RE)\
357
+ .reject {|line| COMMENT_RE =~ line }
358
+ if lines.size == 1 and /\A\0(\d+)\0\z/ =~ strip(lines[0])
359
+ @output.block_plugin plugin_block($1.to_i)
360
+ else
361
+ line_buffer = @output.container(:paragraph)
362
+ lines.each_with_index do |line, i|
363
+ buffer = @output.container
364
+ line_buffer << buffer
365
+ compile_inline(lstrip(line).chomp, buffer)
366
+ end
367
+ @output.paragraph(line_buffer)
368
+ end
369
+ end
370
+
371
+ #
372
+ # Inline Level
373
+ #
374
+
375
+ BRACKET_LINK_RE = /\[\[.+?\]\]/
376
+ URI_RE = /(?:https?|ftp|file|mailto):[A-Za-z0-9;\/?:@&=+$,\-_.!~*\'()#%]+/
377
+ WIKI_NAME_RE = /\b(?:[A-Z]+[a-z\d]+){2,}\b/
378
+
379
+ def inline_syntax_re
380
+ if @options[:use_wiki_name]
381
+ if @options[:use_not_wiki_name]
382
+ / (#{BRACKET_LINK_RE})
383
+ | (#{URI_RE})
384
+ | (#{MODIFIER_RE})
385
+ | (\^?#{WIKI_NAME_RE})
386
+ /xo
387
+ else
388
+ / (#{BRACKET_LINK_RE})
389
+ | (#{URI_RE})
390
+ | (#{MODIFIER_RE})
391
+ | (#{WIKI_NAME_RE})
392
+ /xo
393
+ end
394
+ else
395
+ / (#{BRACKET_LINK_RE})
396
+ | (#{URI_RE})
397
+ | (#{MODIFIER_RE})
398
+ /xo
399
+ end
400
+ end
401
+
402
+ def compile_inline(str, buf = nil)
403
+ buf ||= @output.container
404
+ re = inline_syntax_re
405
+ pending_str = nil
406
+ while m = re.match(str)
407
+ str = m.post_match
408
+
409
+ link, uri, mod, wiki_name = m[1, 4]
410
+ if wiki_name and wiki_name[0, 1] == "^"
411
+ pending_str = m.pre_match + wiki_name[1..-1] + str
412
+ next
413
+ end
414
+
415
+ pre_str = "#{pending_str}#{m.pre_match}"
416
+ pending_str = nil
417
+ evaluate_plugin_block(pre_str, buf)
418
+ compile_inline_markup(buf, link, uri, mod, wiki_name)
419
+ end
420
+ evaluate_plugin_block(pending_str || str, buf)
421
+ buf
422
+ end
423
+
424
+ def compile_inline_markup(buf, link, uri, mod, wiki_name)
425
+ case
426
+ when link
427
+ buf << compile_bracket_link(link[2...-2])
428
+ when uri
429
+ buf << compile_uri_autolink(uri)
430
+ when mod
431
+ buf << compile_modifier(mod)
432
+ when wiki_name
433
+ buf << @output.wiki_name(wiki_name)
434
+ else
435
+ raise UnexpectedError, "must not happen"
436
+ end
437
+ end
438
+
439
+ def compile_bracket_link(link)
440
+ if m = /\A(.*)\|/.match(link)
441
+ title = m[0].chop
442
+ uri = m.post_match
443
+ fixed_uri = fix_uri(uri)
444
+ if can_image_link?(uri)
445
+ @output.image_hyperlink(fixed_uri, title)
446
+ else
447
+ @output.hyperlink(fixed_uri, compile_modifier(title))
448
+ end
449
+ else
450
+ fixed_link = fix_uri(link)
451
+ if can_image_link?(link)
452
+ @output.image_hyperlink(fixed_link)
453
+ else
454
+ @output.hyperlink(fixed_link, @output.text(link))
455
+ end
456
+ end
457
+ end
458
+
459
+ def can_image_link?(uri)
460
+ image?(uri) and @options[:allow_bracket_inline_image]
461
+ end
462
+
463
+ def compile_uri_autolink(uri)
464
+ if image?(uri)
465
+ @output.image_hyperlink(fix_uri(uri))
466
+ else
467
+ @output.hyperlink(fix_uri(uri), @output.text(uri))
468
+ end
469
+ end
470
+
471
+ def fix_uri(uri)
472
+ if /\A(?:https?|ftp|file):(?!\/\/)/ =~ uri
473
+ uri.sub(/\A\w+:/, "")
474
+ else
475
+ uri
476
+ end
477
+ end
478
+
479
+ IMAGE_EXTS = %w(.jpg .jpeg .gif .png)
480
+
481
+ def image?(uri)
482
+ IMAGE_EXTS.include?(uri[/\.[^.]+\z/].to_s.downcase)
483
+ end
484
+
485
+ STRONG = "'''"
486
+ EM = "''"
487
+ DEL = "=="
488
+ TT = "``"
489
+
490
+ STRONG_RE = /'''.+?'''/
491
+ EM_RE = /''.+?''/
492
+ DEL_RE = /==.+?==/
493
+ TT_RE = /``.+?``/
494
+
495
+ MODIFIER_RE = Regexp.union(STRONG_RE, EM_RE, DEL_RE, TT_RE)
496
+
497
+ MODTAG = {
498
+ STRONG => "strong",
499
+ EM => "em",
500
+ DEL => "del",
501
+ TT => 'tt'
502
+ }
503
+
504
+ def compile_modifier(str)
505
+ buf = @output.container
506
+ while m = / (#{MODIFIER_RE})
507
+ /xo.match(str)
508
+ evaluate_plugin_block(m.pre_match, buf)
509
+ case
510
+ when chunk = m[1]
511
+ mod, s = split_mod(chunk)
512
+ mid = MODTAG[mod]
513
+ buf << @output.__send__(mid, compile_inline(s))
514
+ else
515
+ raise UnexpectedError, "must not happen"
516
+ end
517
+ str = m.post_match
518
+ end
519
+ evaluate_plugin_block(str, buf)
520
+ buf
521
+ end
522
+
523
+ def split_mod(str)
524
+ case str
525
+ when /\A'''/
526
+ return str[0, 3], str[3...-3]
527
+ when /\A''/
528
+ return str[0, 2], str[2...-2]
529
+ when /\A==/
530
+ return str[0, 2], str[2...-2]
531
+ when /\A``/
532
+ return str[0, 2], str[2...-2]
533
+ else
534
+ raise UnexpectedError, "must not happen: #{str.inspect}"
535
+ end
536
+ end
537
+
538
+ def strip(str)
539
+ rstrip(lstrip(str))
540
+ end
541
+
542
+ def rstrip(str)
543
+ str.sub(/[ \t\r\n\v\f]+\z/, "")
544
+ end
545
+
546
+ def lstrip(str)
547
+ str.sub(/\A[ \t\r\n\v\f]+/, "")
548
+ end
549
+
550
+
551
+ class HTMLOutput
552
+ def initialize(suffix = " />")
553
+ @suffix = suffix
554
+ @f = nil
555
+ end
556
+
557
+ def reset
558
+ @f = StringIO.new
559
+ end
560
+
561
+ def finish
562
+ @f.string
563
+ end
564
+
565
+ def container(_for=nil)
566
+ case _for
567
+ when :paragraph
568
+ []
569
+ else
570
+ ""
571
+ end
572
+ end
573
+
574
+ #
575
+ # Procedures
576
+ #
577
+
578
+ def headline(level, title)
579
+ @f.puts "<h#{level}>#{title}</h#{level}>"
580
+ end
581
+
582
+ def hrule
583
+ @f.puts "<hr#{@suffix}"
584
+ end
585
+
586
+ def list_begin
587
+ end
588
+
589
+ def list_end
590
+ @f.puts
591
+ end
592
+
593
+ def list_open(type)
594
+ @f.puts "<#{type}>"
595
+ end
596
+
597
+ def list_close(type)
598
+ @f.print "</#{type}>"
599
+ end
600
+
601
+ def listitem_open
602
+ @f.print "<li>"
603
+ end
604
+
605
+ def listitem_close
606
+ @f.puts "</li>"
607
+ end
608
+
609
+ def listitem(item)
610
+ @f.print item
611
+ end
612
+
613
+ def dlist_open
614
+ @f.puts "<dl>"
615
+ end
616
+
617
+ def dlist_close
618
+ @f.puts "</dl>"
619
+ end
620
+
621
+ def dlist_item(dt, dd)
622
+ case
623
+ when dd.empty?
624
+ @f.puts "<dt>#{dt}</dt>"
625
+ when dt.empty?
626
+ @f.puts "<dd>#{dd}</dd>"
627
+ else
628
+ @f.puts "<dt>#{dt}</dt>"
629
+ @f.puts "<dd>#{dd}</dd>"
630
+ end
631
+ end
632
+
633
+ def table_open
634
+ @f.puts %Q(<table border="1">)
635
+ end
636
+
637
+ def table_close
638
+ @f.puts "</table>"
639
+ end
640
+
641
+ def table_record_open
642
+ @f.print "<tr>"
643
+ end
644
+
645
+ def table_record_close
646
+ @f.puts "</tr>"
647
+ end
648
+
649
+ def table_head(item, rs, cs)
650
+ @f.print "<th#{tdattr(rs, cs)}>#{item}</th>"
651
+ end
652
+
653
+ def table_data(item, rs, cs)
654
+ @f.print "<td#{tdattr(rs, cs)}>#{item}</td>"
655
+ end
656
+
657
+ def tdattr(rs, cs)
658
+ buf = ""
659
+ buf << %Q( rowspan="#{rs}") if rs
660
+ buf << %Q( colspan="#{cs}") if cs
661
+ buf
662
+ end
663
+ private :tdattr
664
+
665
+ def blockquote_open
666
+ @f.print "<blockquote>"
667
+ end
668
+
669
+ def blockquote_close
670
+ @f.puts "</blockquote>"
671
+ end
672
+
673
+ def block_preformatted(str, info)
674
+ syntax = info ? info.downcase : nil
675
+ if syntax
676
+ begin
677
+ convertor = Syntax::Convertors::HTML.for_syntax(syntax)
678
+ @f.puts convertor.convert(str)
679
+ return
680
+ rescue NameError, RuntimeError
681
+ @f.puts %Q|<pre class="prettyprint">#{text(str)}</pre>|
682
+ return
683
+ end
684
+ end
685
+ preformatted(text(str))
686
+ end
687
+
688
+ def preformatted(str)
689
+ @f.print "<pre>"
690
+ @f.print str
691
+ @f.puts "</pre>"
692
+ end
693
+
694
+ def paragraph(lines)
695
+ @f.puts "<p>#{lines.join("\n")}</p>"
696
+ end
697
+
698
+ def block_plugin(str)
699
+ @f.puts %Q(<div class="plugin">{{#{escape_html(str)}}}</div>)
700
+ end
701
+
702
+ #
703
+ # Functions
704
+ #
705
+
706
+ def hyperlink(uri, title)
707
+ %Q(<a href="#{escape_html_param(uri)}">#{title}</a>)
708
+ end
709
+
710
+ def wiki_name(name)
711
+ hyperlink(name, text(name))
712
+ end
713
+
714
+ def image_hyperlink(uri, alt = nil)
715
+ alt ||= uri.split(/\//).last
716
+ alt = escape_html(alt)
717
+ %Q(<img src="#{escape_html_param(uri)}" alt="#{alt}"#{@suffix})
718
+ end
719
+
720
+ def strong(item)
721
+ "<strong>#{item}</strong>"
722
+ end
723
+
724
+ def em(item)
725
+ "<em>#{item}</em>"
726
+ end
727
+
728
+ def del(item)
729
+ "<del>#{item}</del>"
730
+ end
731
+
732
+ def tt(item)
733
+ "<tt>#{item}</tt>"
734
+ end
735
+
736
+ def text(str)
737
+ escape_html(str)
738
+ end
739
+
740
+ def inline_plugin(src)
741
+ %Q(<span class="plugin">{{#{escape_html(src)}}}</span>)
742
+ end
743
+
744
+ #
745
+ # Utilities
746
+ #
747
+
748
+ def escape_html_param(str)
749
+ escape_quote(escape_html(str))
750
+ end
751
+
752
+ def escape_html(text)
753
+ text.gsub(/&/, "&amp;").gsub(/</, "&lt;").gsub(/>/, "&gt;")
754
+ end
755
+
756
+ def unescape_html(text)
757
+ text.gsub(/&gt;/, ">").gsub(/&lt;/, "<").gsub(/&amp;/, "&")
758
+ end
759
+
760
+ def escape_quote(text)
761
+ text.gsub(/"/, "&quot;")
762
+ end
763
+ end
764
+
765
+
766
+ class LineInput
767
+ def initialize(f)
768
+ @input = f
769
+ @buf = []
770
+ @lineno = 0
771
+ @eof_p = false
772
+ end
773
+
774
+ def inspect
775
+ "\#<#{self.class} file=#{@input.inspect} line=#{lineno()}>"
776
+ end
777
+
778
+ def eof?
779
+ @eof_p
780
+ end
781
+
782
+ def lineno
783
+ @lineno
784
+ end
785
+
786
+ def gets
787
+ unless @buf.empty?
788
+ @lineno += 1
789
+ return @buf.pop
790
+ end
791
+ return nil if @eof_p # to avoid ARGF blocking.
792
+ line = @input.gets
793
+ line = line.sub(/\r\n/, "\n") if line
794
+ @eof_p = line.nil?
795
+ @lineno += 1
796
+ line
797
+ end
798
+
799
+ def ungets(line)
800
+ return unless line
801
+ @lineno -= 1
802
+ @buf.push line
803
+ line
804
+ end
805
+
806
+ def peek
807
+ line = gets()
808
+ ungets line if line
809
+ line
810
+ end
811
+
812
+ def next?
813
+ peek() ? true : false
814
+ end
815
+
816
+ def skip_blank_lines
817
+ n = 0
818
+ while line = gets()
819
+ unless line.strip.empty?
820
+ ungets line
821
+ return n
822
+ end
823
+ n += 1
824
+ end
825
+ n
826
+ end
827
+
828
+ def gets_if(re)
829
+ line = gets()
830
+ if not line or not (re =~ line)
831
+ ungets line
832
+ return nil
833
+ end
834
+ line
835
+ end
836
+
837
+ def gets_unless(re)
838
+ line = gets()
839
+ if not line or re =~ line
840
+ ungets line
841
+ return nil
842
+ end
843
+ line
844
+ end
845
+
846
+ def each
847
+ while line = gets()
848
+ yield line
849
+ end
850
+ end
851
+
852
+ def while_match(re)
853
+ while line = gets()
854
+ unless re =~ line
855
+ ungets line
856
+ return
857
+ end
858
+ yield line
859
+ end
860
+ nil
861
+ end
862
+
863
+ def getlines_while(re)
864
+ buf = []
865
+ while_match(re) do |line|
866
+ buf.push line
867
+ end
868
+ buf
869
+ end
870
+
871
+ alias span getlines_while # from Haskell
872
+
873
+ def until_match(re)
874
+ while line = gets()
875
+ if re =~ line
876
+ ungets line
877
+ return
878
+ end
879
+ yield line
880
+ end
881
+ nil
882
+ end
883
+
884
+ def getlines_until(re)
885
+ buf = []
886
+ until_match(re) do |line|
887
+ buf.push line
888
+ end
889
+ buf
890
+ end
891
+
892
+ alias break getlines_until # from Haskell
893
+
894
+ def until_terminator(re)
895
+ while line = gets()
896
+ return if re =~ line # discard terminal line
897
+ yield line
898
+ end
899
+ nil
900
+ end
901
+
902
+ def getblock(term_re)
903
+ buf = []
904
+ until_terminator(term_re) do |line|
905
+ buf.push line
906
+ end
907
+ buf
908
+ end
909
+ end
910
+ end
911
+
912
+ if __FILE__ == $0
913
+ puts HikiDoc.to_html(ARGF.read(nil))
914
+ end