qwikdoc 0.0.1

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 (335) hide show
  1. data/.gitignore +5 -0
  2. data/.rspec +2 -0
  3. data/CHANGES +3 -0
  4. data/COPYING +340 -0
  5. data/Gemfile +3 -0
  6. data/README.md +10 -0
  7. data/Rakefile +10 -0
  8. data/TextFormattingRules +137 -0
  9. data/TextFormattingRules.ja +143 -0
  10. data/bin/qwikdoc +34 -0
  11. data/lib/qwik_doc.rb +15 -0
  12. data/lib/qwik_doc/hack.rb +184 -0
  13. data/qwikdoc.gemspec +26 -0
  14. data/spec/qwik_doc_spec.rb +305 -0
  15. data/spec/spec_helper.rb +12 -0
  16. data/vendor/qwik/Makefile +63 -0
  17. data/vendor/qwik/Rakefile +17 -0
  18. data/vendor/qwik/act-aa.rb +83 -0
  19. data/vendor/qwik/act-archive.rb +386 -0
  20. data/vendor/qwik/act-attach.rb +304 -0
  21. data/vendor/qwik/act-backup.rb +236 -0
  22. data/vendor/qwik/act-basic.rb +325 -0
  23. data/vendor/qwik/act-book.rb +161 -0
  24. data/vendor/qwik/act-calc.rb +371 -0
  25. data/vendor/qwik/act-charset.rb +251 -0
  26. data/vendor/qwik/act-christel.rb +112 -0
  27. data/vendor/qwik/act-chronology.rb +149 -0
  28. data/vendor/qwik/act-code.rb +155 -0
  29. data/vendor/qwik/act-comment.rb +554 -0
  30. data/vendor/qwik/act-config.rb +49 -0
  31. data/vendor/qwik/act-counter.rb +125 -0
  32. data/vendor/qwik/act-day.rb +96 -0
  33. data/vendor/qwik/act-describe.rb +135 -0
  34. data/vendor/qwik/act-diary.rb +109 -0
  35. data/vendor/qwik/act-edit.rb +317 -0
  36. data/vendor/qwik/act-embed-html.rb +296 -0
  37. data/vendor/qwik/act-emode.rb +150 -0
  38. data/vendor/qwik/act-event.rb +187 -0
  39. data/vendor/qwik/act-file.rb +303 -0
  40. data/vendor/qwik/act-files.rb +771 -0
  41. data/vendor/qwik/act-getpass.rb +295 -0
  42. data/vendor/qwik/act-history.rb +136 -0
  43. data/vendor/qwik/act-html.rb +204 -0
  44. data/vendor/qwik/act-httpauth.rb +147 -0
  45. data/vendor/qwik/act-include.rb +142 -0
  46. data/vendor/qwik/act-interwiki.rb +189 -0
  47. data/vendor/qwik/act-isearch.rb +109 -0
  48. data/vendor/qwik/act-keywords.rb +137 -0
  49. data/vendor/qwik/act-lang.rb +81 -0
  50. data/vendor/qwik/act-license.rb +63 -0
  51. data/vendor/qwik/act-list.rb +287 -0
  52. data/vendor/qwik/act-login.rb +410 -0
  53. data/vendor/qwik/act-logout.rb +60 -0
  54. data/vendor/qwik/act-mail.rb +159 -0
  55. data/vendor/qwik/act-map.rb +292 -0
  56. data/vendor/qwik/act-md5.rb +42 -0
  57. data/vendor/qwik/act-mdlb.rb +741 -0
  58. data/vendor/qwik/act-media.rb +416 -0
  59. data/vendor/qwik/act-member.rb +157 -0
  60. data/vendor/qwik/act-menu.rb +142 -0
  61. data/vendor/qwik/act-metadata.rb +323 -0
  62. data/vendor/qwik/act-mlsubmitform.rb +49 -0
  63. data/vendor/qwik/act-monitor.rb +167 -0
  64. data/vendor/qwik/act-new.rb +418 -0
  65. data/vendor/qwik/act-pagelist.rb +248 -0
  66. data/vendor/qwik/act-password.rb +145 -0
  67. data/vendor/qwik/act-plan.rb +210 -0
  68. data/vendor/qwik/act-povray.rb +230 -0
  69. data/vendor/qwik/act-presen.rb +380 -0
  70. data/vendor/qwik/act-redirect.rb +133 -0
  71. data/vendor/qwik/act-ring.rb +1071 -0
  72. data/vendor/qwik/act-rrefs.rb +255 -0
  73. data/vendor/qwik/act-ruby.rb +116 -0
  74. data/vendor/qwik/act-sample.rb +170 -0
  75. data/vendor/qwik/act-save.rb +295 -0
  76. data/vendor/qwik/act-schedule.rb +374 -0
  77. data/vendor/qwik/act-search.rb +180 -0
  78. data/vendor/qwik/act-searchwords.rb +51 -0
  79. data/vendor/qwik/act-sendpass.rb +83 -0
  80. data/vendor/qwik/act-site.rb +89 -0
  81. data/vendor/qwik/act-sitebackup.rb +419 -0
  82. data/vendor/qwik/act-sitelog.rb +118 -0
  83. data/vendor/qwik/act-smil.rb +299 -0
  84. data/vendor/qwik/act-status.rb +220 -0
  85. data/vendor/qwik/act-style.rb +608 -0
  86. data/vendor/qwik/act-table.rb +263 -0
  87. data/vendor/qwik/act-tableform.rb +241 -0
  88. data/vendor/qwik/act-tag.rb +103 -0
  89. data/vendor/qwik/act-text.rb +70 -0
  90. data/vendor/qwik/act-textarea.rb +164 -0
  91. data/vendor/qwik/act-theme.rb +346 -0
  92. data/vendor/qwik/act-toc.rb +112 -0
  93. data/vendor/qwik/act-typekey.rb +198 -0
  94. data/vendor/qwik/act-under-const.rb +94 -0
  95. data/vendor/qwik/act-webservice.rb +321 -0
  96. data/vendor/qwik/act-wema.rb +558 -0
  97. data/vendor/qwik/act-wysiwyg.rb +238 -0
  98. data/vendor/qwik/action.rb +325 -0
  99. data/vendor/qwik/autoreload.rb +98 -0
  100. data/vendor/qwik/bench-bench.rb +28 -0
  101. data/vendor/qwik/bench-emode.rb +47 -0
  102. data/vendor/qwik/bench-format-xml.rb +70 -0
  103. data/vendor/qwik/bench-large-table.rb +62 -0
  104. data/vendor/qwik/bench-md5.rb +14 -0
  105. data/vendor/qwik/bench-module-session.rb +19 -0
  106. data/vendor/qwik/bench-page.rb +50 -0
  107. data/vendor/qwik/bench-s-md5.rb +28 -0
  108. data/vendor/qwik/bench-session.rb +25 -0
  109. data/vendor/qwik/bench-textformat.rb +31 -0
  110. data/vendor/qwik/catalog-factory.rb +91 -0
  111. data/vendor/qwik/catalog-ja.rb +479 -0
  112. data/vendor/qwik/catalog-ml-ja.rb +145 -0
  113. data/vendor/qwik/check-act-monitor.rb +112 -0
  114. data/vendor/qwik/check-act-monitor2.rb +46 -0
  115. data/vendor/qwik/check-act-theme.rb +27 -0
  116. data/vendor/qwik/check-event.rb +112 -0
  117. data/vendor/qwik/check-event2.rb +55 -0
  118. data/vendor/qwik/check-htree-rexml.rb +77 -0
  119. data/vendor/qwik/check-htree.rb +51 -0
  120. data/vendor/qwik/check-libxml.rb +135 -0
  121. data/vendor/qwik/check-many-pages.rb +47 -0
  122. data/vendor/qwik/check-monitor.rb +33 -0
  123. data/vendor/qwik/check-observer.rb +67 -0
  124. data/vendor/qwik/check-server.rb +61 -0
  125. data/vendor/qwik/check-uuencode.rb +33 -0
  126. data/vendor/qwik/check-webdav.rb +65 -0
  127. data/vendor/qwik/check-xml-xpath.rb +27 -0
  128. data/vendor/qwik/common-backtrace.rb +94 -0
  129. data/vendor/qwik/common-basic.rb +111 -0
  130. data/vendor/qwik/common-condition.rb +142 -0
  131. data/vendor/qwik/common-error.rb +48 -0
  132. data/vendor/qwik/common-gettext.rb +50 -0
  133. data/vendor/qwik/common-javascript.rb +45 -0
  134. data/vendor/qwik/common-notice.rb +132 -0
  135. data/vendor/qwik/common-plain.rb +105 -0
  136. data/vendor/qwik/common-plugin.rb +111 -0
  137. data/vendor/qwik/common-res.rb +76 -0
  138. data/vendor/qwik/common-resolve.rb +92 -0
  139. data/vendor/qwik/common-send.rb +171 -0
  140. data/vendor/qwik/common-session.rb +139 -0
  141. data/vendor/qwik/common-surface.rb +261 -0
  142. data/vendor/qwik/common-url.rb +90 -0
  143. data/vendor/qwik/compat/Makefile +12 -0
  144. data/vendor/qwik/compat/add_load_path.rb +1 -0
  145. data/vendor/qwik/config.rb +299 -0
  146. data/vendor/qwik/db-b-backup.rb +142 -0
  147. data/vendor/qwik/db-backup.rb +184 -0
  148. data/vendor/qwik/db-berkeley.rb +306 -0
  149. data/vendor/qwik/db-filesystem.rb +305 -0
  150. data/vendor/qwik/db-indexer.rb +154 -0
  151. data/vendor/qwik/db-searchwords.rb +238 -0
  152. data/vendor/qwik/description-ja.rb +267 -0
  153. data/vendor/qwik/description.rb +256 -0
  154. data/vendor/qwik/dev-add-copyright.rb +23 -0
  155. data/vendor/qwik/dev-backup.rb +24 -0
  156. data/vendor/qwik/dev-bench.rb +175 -0
  157. data/vendor/qwik/dev-calctime.rb +52 -0
  158. data/vendor/qwik/dev-css-compressor.rb +60 -0
  159. data/vendor/qwik/dev-extract-catalog.rb +102 -0
  160. data/vendor/qwik/dev-js-compressor.rb +73 -0
  161. data/vendor/qwik/dev-release.rb +235 -0
  162. data/vendor/qwik/dev-replace.rb +353 -0
  163. data/vendor/qwik/dev-sendmail.rb +25 -0
  164. data/vendor/qwik/farm.rb +283 -0
  165. data/vendor/qwik/gettext.rb +56 -0
  166. data/vendor/qwik/group-cond.rb +157 -0
  167. data/vendor/qwik/group-config.rb +247 -0
  168. data/vendor/qwik/group-confirm.rb +147 -0
  169. data/vendor/qwik/group-db.rb +326 -0
  170. data/vendor/qwik/group-mail.rb +195 -0
  171. data/vendor/qwik/group-member.rb +307 -0
  172. data/vendor/qwik/group-sendmail.rb +231 -0
  173. data/vendor/qwik/group-site.rb +374 -0
  174. data/vendor/qwik/group-sweep.rb +63 -0
  175. data/vendor/qwik/group.rb +157 -0
  176. data/vendor/qwik/helper.rb +6 -0
  177. data/vendor/qwik/html-generator.rb +104 -0
  178. data/vendor/qwik/html-to-wabisabi.rb +149 -0
  179. data/vendor/qwik/htree-diff.rb +87 -0
  180. data/vendor/qwik/htree-format-xml.rb +57 -0
  181. data/vendor/qwik/htree-generator.rb +144 -0
  182. data/vendor/qwik/htree-get.rb +251 -0
  183. data/vendor/qwik/htree-html-generator.rb +179 -0
  184. data/vendor/qwik/htree-template.rb +263 -0
  185. data/vendor/qwik/htree-to-wabisabi.rb +171 -0
  186. data/vendor/qwik/loadlib.rb +79 -0
  187. data/vendor/qwik/logger.rb +115 -0
  188. data/vendor/qwik/mail-body.rb +171 -0
  189. data/vendor/qwik/mail-header.rb +474 -0
  190. data/vendor/qwik/mail-multipart.rb +193 -0
  191. data/vendor/qwik/mail-parse.rb +147 -0
  192. data/vendor/qwik/mail.rb +341 -0
  193. data/vendor/qwik/mailaddress.rb +83 -0
  194. data/vendor/qwik/mdlb-model.rb +81 -0
  195. data/vendor/qwik/mdlb-sample.rb +324 -0
  196. data/vendor/qwik/ml-catalog-factory.rb +27 -0
  197. data/vendor/qwik/ml-exception.rb +15 -0
  198. data/vendor/qwik/ml-generator.rb +28 -0
  199. data/vendor/qwik/ml-gettext.rb +137 -0
  200. data/vendor/qwik/ml-logger.rb +82 -0
  201. data/vendor/qwik/ml-memory.rb +65 -0
  202. data/vendor/qwik/ml-msg-validator.rb +86 -0
  203. data/vendor/qwik/ml-processor.rb +609 -0
  204. data/vendor/qwik/ml-quickml-server.rb +122 -0
  205. data/vendor/qwik/ml-sendmail.rb +0 -0
  206. data/vendor/qwik/ml-server.rb +107 -0
  207. data/vendor/qwik/ml-session.rb +348 -0
  208. data/vendor/qwik/ml-sweeper.rb +101 -0
  209. data/vendor/qwik/mock-logger.rb +65 -0
  210. data/vendor/qwik/mock-sendmail.rb +78 -0
  211. data/vendor/qwik/mock-socket.rb +82 -0
  212. data/vendor/qwik/modulobe.rb +406 -0
  213. data/vendor/qwik/mongrel-server.rb +72 -0
  214. data/vendor/qwik/page-files.rb +249 -0
  215. data/vendor/qwik/page-generate.rb +82 -0
  216. data/vendor/qwik/page-get.rb +262 -0
  217. data/vendor/qwik/page-images.rb +168 -0
  218. data/vendor/qwik/page-put.rb +128 -0
  219. data/vendor/qwik/page-rrefs.rb +154 -0
  220. data/vendor/qwik/page-title.rb +0 -0
  221. data/vendor/qwik/page-wikidb.rb +234 -0
  222. data/vendor/qwik/page.rb +67 -0
  223. data/vendor/qwik/pages.rb +444 -0
  224. data/vendor/qwik/parse-plugin.rb +249 -0
  225. data/vendor/qwik/parser-emode.rb +116 -0
  226. data/vendor/qwik/parser-inline.rb +273 -0
  227. data/vendor/qwik/parser.rb +350 -0
  228. data/vendor/qwik/password.rb +183 -0
  229. data/vendor/qwik/periodic.rb +79 -0
  230. data/vendor/qwik/qp.rb +56 -0
  231. data/vendor/qwik/qwik-service.rb +341 -0
  232. data/vendor/qwik/qwik.rb +5 -0
  233. data/vendor/qwik/qwikweb-adduser.rb +34 -0
  234. data/vendor/qwik/qwikweb-catalog-validator.rb +110 -0
  235. data/vendor/qwik/qwikweb-incgen.rb +28 -0
  236. data/vendor/qwik/qwikweb-makesite.rb +41 -0
  237. data/vendor/qwik/qwikweb-server.rb +44 -0
  238. data/vendor/qwik/qwikweb-showpassword.rb +26 -0
  239. data/vendor/qwik/qwikweb-watchlog.rb +67 -0
  240. data/vendor/qwik/request-path.rb +304 -0
  241. data/vendor/qwik/request-ua.rb +76 -0
  242. data/vendor/qwik/request-webrick.rb +81 -0
  243. data/vendor/qwik/request.rb +91 -0
  244. data/vendor/qwik/resolve-tdiary.rb +292 -0
  245. data/vendor/qwik/resolve.rb +121 -0
  246. data/vendor/qwik/response.rb +228 -0
  247. data/vendor/qwik/server-memory.rb +57 -0
  248. data/vendor/qwik/server-webrick.rb +102 -0
  249. data/vendor/qwik/server.rb +252 -0
  250. data/vendor/qwik/site-config.rb +149 -0
  251. data/vendor/qwik/site-db.rb +136 -0
  252. data/vendor/qwik/site-event.rb +162 -0
  253. data/vendor/qwik/site-files.rb +86 -0
  254. data/vendor/qwik/site-group.rb +103 -0
  255. data/vendor/qwik/site-index.rb +47 -0
  256. data/vendor/qwik/site-log.rb +64 -0
  257. data/vendor/qwik/site-member.rb +230 -0
  258. data/vendor/qwik/site-monitor.rb +97 -0
  259. data/vendor/qwik/site-pages.rb +62 -0
  260. data/vendor/qwik/site-plan.rb +139 -0
  261. data/vendor/qwik/site-report.rb +282 -0
  262. data/vendor/qwik/site-resolve.rb +230 -0
  263. data/vendor/qwik/site-rrefs.rb +18 -0
  264. data/vendor/qwik/site-search.rb +180 -0
  265. data/vendor/qwik/site-timeline.rb +153 -0
  266. data/vendor/qwik/site-url.rb +189 -0
  267. data/vendor/qwik/site.rb +76 -0
  268. data/vendor/qwik/smil-time.rb +105 -0
  269. data/vendor/qwik/smtp-session.rb +331 -0
  270. data/vendor/qwik/template-generator.rb +149 -0
  271. data/vendor/qwik/template.rb +85 -0
  272. data/vendor/qwik/test-common.rb +10 -0
  273. data/vendor/qwik/test-ml-info.rb +225 -0
  274. data/vendor/qwik/test-module-ml.rb +142 -0
  275. data/vendor/qwik/test-module-path.rb +110 -0
  276. data/vendor/qwik/test-module-public.rb +70 -0
  277. data/vendor/qwik/test-module-server.rb +98 -0
  278. data/vendor/qwik/test-module-session.rb +264 -0
  279. data/vendor/qwik/test-module-suite.rb +91 -0
  280. data/vendor/qwik/test-ms-applemail.rb +59 -0
  281. data/vendor/qwik/test-ms-attach.rb +174 -0
  282. data/vendor/qwik/test-ms-basic.rb +40 -0
  283. data/vendor/qwik/test-ms-close.rb +35 -0
  284. data/vendor/qwik/test-ms-confirm.rb +75 -0
  285. data/vendor/qwik/test-ms-ignore-spam.rb +57 -0
  286. data/vendor/qwik/test-ms-japanese.rb +97 -0
  287. data/vendor/qwik/test-ms-jfilename.rb +82 -0
  288. data/vendor/qwik/test-ms-large.rb +58 -0
  289. data/vendor/qwik/test-ms-member.rb +103 -0
  290. data/vendor/qwik/test-ms-multipart.rb +84 -0
  291. data/vendor/qwik/test-ms-org.rb +129 -0
  292. data/vendor/qwik/test-ms-plan.rb +130 -0
  293. data/vendor/qwik/test-ms-post.rb +53 -0
  294. data/vendor/qwik/test-ms-quopri.rb +76 -0
  295. data/vendor/qwik/test-sub-quopri.rb +45 -0
  296. data/vendor/qwik/test-submit-base64.rb +59 -0
  297. data/vendor/qwik/test-submit-forward.rb +61 -0
  298. data/vendor/qwik/test-submit-html-mail.rb +52 -0
  299. data/vendor/qwik/test-submit-japanese.rb +135 -0
  300. data/vendor/qwik/test-submit-jfilename.rb +144 -0
  301. data/vendor/qwik/test-submit-uuencode.rb +71 -0
  302. data/vendor/qwik/test-suite-all.rb +8 -0
  303. data/vendor/qwik/test-suite-basic.rb +9 -0
  304. data/vendor/qwik/test-suite-ml.rb +9 -0
  305. data/vendor/qwik/test-typekey.rb +64 -0
  306. data/vendor/qwik/testunit.rb +45 -0
  307. data/vendor/qwik/tokenizer-inline.rb +294 -0
  308. data/vendor/qwik/tokenizer.rb +332 -0
  309. data/vendor/qwik/typekey.rb +160 -0
  310. data/vendor/qwik/util-basic.rb +135 -0
  311. data/vendor/qwik/util-charset.rb +332 -0
  312. data/vendor/qwik/util-css.rb +56 -0
  313. data/vendor/qwik/util-csv-tokenizer.rb +113 -0
  314. data/vendor/qwik/util-filename.rb +112 -0
  315. data/vendor/qwik/util-pathname.rb +202 -0
  316. data/vendor/qwik/util-pid.rb +58 -0
  317. data/vendor/qwik/util-safe.rb +67 -0
  318. data/vendor/qwik/util-sendmail.rb +273 -0
  319. data/vendor/qwik/util-string.rb +203 -0
  320. data/vendor/qwik/util-time.rb +125 -0
  321. data/vendor/qwik/util-webrick.rb +176 -0
  322. data/vendor/qwik/version.rb +11 -0
  323. data/vendor/qwik/wabisabi-basic.rb +163 -0
  324. data/vendor/qwik/wabisabi-diff.rb +130 -0
  325. data/vendor/qwik/wabisabi-format-xml.rb +310 -0
  326. data/vendor/qwik/wabisabi-generator.rb +262 -0
  327. data/vendor/qwik/wabisabi-index.rb +174 -0
  328. data/vendor/qwik/wabisabi-table.rb +212 -0
  329. data/vendor/qwik/wabisabi-template.rb +295 -0
  330. data/vendor/qwik/wabisabi-to-htree.rb +111 -0
  331. data/vendor/qwik/wabisabi-to-wiki.rb +690 -0
  332. data/vendor/qwik/wabisabi-traverse.rb +207 -0
  333. data/vendor/qwik/wabisabi-validator.rb +116 -0
  334. data/vendor/qwik/wabisabi.rb +5 -0
  335. metadata +416 -0
@@ -0,0 +1,249 @@
1
+ # Copyright (C) 2003-2006 Kouichirou Eto, All rights reserved.
2
+ # This is free software with ABSOLUTELY NO WARRANTY.
3
+ # You can redistribute it and/or modify it under the terms of the GNU GPL 2.
4
+
5
+ $LOAD_PATH.unshift '..' unless $LOAD_PATH.include? '..'
6
+ require 'qwik/parser'
7
+
8
+ module Qwik
9
+ class Plugin
10
+ # Split a string into paragraphs.
11
+ def self.split(str)
12
+ paras = []
13
+
14
+ cur_str = nil
15
+ in_plugin = false
16
+ str.each_line {|line|
17
+ if ! in_plugin
18
+ if /\A\{\{/ =~ line
19
+ paras << cur_str if cur_str
20
+ cur_str = line
21
+ in_plugin = true
22
+ if /\}\}$/ =~ line # Use $ for new line.
23
+ paras << cur_str
24
+ cur_str = nil
25
+ in_plugin = false
26
+ end
27
+ else
28
+ cur_str = '' if cur_str.nil?
29
+ cur_str += line
30
+ end
31
+ else
32
+ if /\A\}\}$/ =~ line
33
+ cur_str += line
34
+ paras << cur_str
35
+ cur_str = nil
36
+ in_plugin = nil
37
+ else
38
+ cur_str += line
39
+ end
40
+ end
41
+ }
42
+
43
+ if cur_str
44
+ paras << cur_str
45
+ end
46
+
47
+ return paras
48
+ end
49
+
50
+ def self.rewrite(paras, pluginname, num)
51
+ cur_num = 1
52
+ nparas = []
53
+ paras.each {|para|
54
+ if /\A\{\{(\w+)/ =~ para && (name = $1.intern) == pluginname
55
+ if cur_num == num
56
+ tokens = TextTokenizer.tokenize(para)
57
+ tree = TextParser.make_tree(tokens)
58
+ raise if 1 < tree.length
59
+ plugin = tree[0]
60
+ raise if plugin[0] != :plugin
61
+ new_plugin = yield(plugin)
62
+ new_para = encode(new_plugin)
63
+ nparas << new_para
64
+ else
65
+ nparas << para
66
+ end
67
+ cur_num += 1
68
+ else
69
+ nparas << para
70
+ end
71
+ }
72
+ return nparas
73
+ end
74
+
75
+ def self.encode(plugin)
76
+ method = plugin[1][:method]
77
+ param = plugin[1][:param]
78
+ content = plugin[2]
79
+ str = "{{#{method}"
80
+ str << "(#{param})" if param && ! param.empty?
81
+ if content
82
+ content.chomp!
83
+ str << "
84
+ #{content}
85
+ "
86
+ end
87
+ str << "}}
88
+ "
89
+ return str
90
+ end
91
+
92
+ def self.join(paras)
93
+ str = paras.join
94
+ return str
95
+ end
96
+ end
97
+ end
98
+
99
+ if $0 == __FILE__
100
+ require 'qwik/test-common'
101
+ $test = true
102
+ end
103
+
104
+ if defined?($test) && $test
105
+ class TestPlugin < Test::Unit::TestCase
106
+ include TestSession
107
+
108
+ def ok_sp(e, s)
109
+ ok_eq(e, Qwik::Plugin.split(s))
110
+ end
111
+
112
+ def test_plugin_split
113
+ ok_sp([], '')
114
+ ok_sp(['a'], 'a')
115
+ ok_sp(['a
116
+ b'], 'a
117
+ b')
118
+ ok_sp(['{{p}}'], '{{p}}')
119
+ ok_sp(['a
120
+ ', '{{p}}'], 'a
121
+ {{p}}')
122
+ ok_sp(['a
123
+ ', '{{p}}
124
+ ', 'b'], 'a
125
+ {{p}}
126
+ b')
127
+ ok_sp(['a
128
+ ', '{{p
129
+ }}
130
+ ', 'b'], 'a
131
+ {{p
132
+ }}
133
+ b')
134
+ end
135
+
136
+ def ok_re(expected, paras, num)
137
+ nparas = Qwik::Plugin.rewrite(paras, :p, num) {|plugin|
138
+ plugin << 'c'
139
+ plugin
140
+ }
141
+ ok_eq(expected, nparas)
142
+ end
143
+
144
+ def test_plugin_rewrite
145
+ ok_re(["{{p
146
+ c
147
+ }}
148
+ "],
149
+ ['{{p}}'], 1)
150
+ ok_re(['{{p}}'], ['{{p}}'], 2)
151
+ ok_re(["a
152
+ ", "{{p
153
+ c
154
+ }}
155
+ ", "b
156
+ "],
157
+ ["a
158
+ ", "{{p}}
159
+ ", "b
160
+ "], 1)
161
+ ok_re(["a
162
+ ", "{{p
163
+ c
164
+ }}
165
+ ", "{{p}}
166
+ ", "b
167
+ "],
168
+ ["a
169
+ ", "{{p}}
170
+ ", "{{p}}
171
+ ", "b
172
+ "], 1)
173
+ ok_re(["{{p}}
174
+ ", "{{p
175
+ c
176
+ }}
177
+ "],
178
+ ["{{p}}
179
+ ", '{{p}}'], 2)
180
+ ok_re(["{{p
181
+ c
182
+ }}
183
+ ", '{{q}}'],
184
+ ["{{p}}
185
+ ", '{{q}}'], 1)
186
+ ok_re(["{{p}}
187
+ ", '{{q}}'],
188
+ ["{{p}}
189
+ ", '{{q}}'], 2)
190
+ end
191
+
192
+ def ok_en(e, s)
193
+ ok_eq(e, Qwik::Plugin.encode(s))
194
+ end
195
+
196
+ def test_plugin_encode
197
+ ok_en("{{m}}
198
+ ", [:plugin, {:method=>'m'}])
199
+ ok_en("{{m}}
200
+ ", [:plugin, {:method=>'m', :param=>''}])
201
+ ok_en("{{m(p)}}
202
+ ", [:plugin, {:method=>'m', :param=>'p'}])
203
+ ok_en("{{m(p)
204
+
205
+ }}
206
+ ", [:plugin, {:method=>'m', :param=>'p'}, ''])
207
+ ok_en("{{m
208
+ c
209
+ }}
210
+ ", [:plugin, {:method=>'m'}, 'c'])
211
+ ok_en("{{m
212
+ c
213
+ }}
214
+ ", [:plugin, {:method=>'m'}, "c
215
+ "])
216
+ ok_en("{{m
217
+ c
218
+
219
+ }}
220
+ ", [:plugin, {:method=>'m'}, "c
221
+
222
+ "])
223
+ ok_en("{{m(p)
224
+ c
225
+ }}
226
+ ", [:plugin, {:method=>'m', :param=>'p'}, 'c'])
227
+ ok_en("{{m(p)
228
+ c
229
+ }}
230
+ ", [:plugin, {:method=>'m', :param=>'p'}, "c
231
+ "])
232
+ end
233
+
234
+ def test_plugin_join
235
+ ok_eq("a
236
+ {{p
237
+ c
238
+ }}
239
+ b
240
+ ",
241
+ Qwik::Plugin.join(["a
242
+ ", "{{p
243
+ c
244
+ }}
245
+ ", "b
246
+ "]))
247
+ end
248
+ end
249
+ end
@@ -0,0 +1,116 @@
1
+ # Copyright (C) 2003-2006 Kouichirou Eto, All rights reserved.
2
+ # This is free software with ABSOLUTELY NO WARRANTY.
3
+ # You can redistribute it and/or modify it under the terms of the GNU GPL 2.
4
+
5
+ $LOAD_PATH.unshift '..' unless $LOAD_PATH.include? '..'
6
+
7
+ # Special mode, not for general use.
8
+
9
+ module Qwik
10
+ class EmodePreProcessor
11
+ def self.emode?(str)
12
+ /\A============================================================/ =~ str
13
+ end
14
+
15
+ HMARK = {
16
+ 'h2' => '*',
17
+ 'h3' => '**'
18
+ }
19
+
20
+ def self.preprocess(str)
21
+ next_line = nil
22
+ num = 0
23
+ ar = []
24
+ str.each {|line|
25
+ line.chomp!
26
+ if next_line
27
+ if next_line == 'h2'
28
+ num += 1
29
+ end
30
+ if /\A([����])(.*)\z/s =~ line
31
+ ar << HMARK[next_line] + $2
32
+ else
33
+ if next_line == 'h2'
34
+ ar << '*' + num.to_s
35
+ else
36
+ ar << "===="
37
+ end
38
+ next_line = add_line(next_line, ar, line)
39
+ end
40
+ next_line = nil
41
+ else
42
+ next_line = add_line(next_line, ar, line)
43
+ end
44
+ }
45
+ return ar.join("\n")
46
+ end
47
+
48
+ def self.add_line(next_line, ar, line)
49
+ case line
50
+ when /\A(=+)\z/ # only =
51
+ return 'h2'
52
+ when /\A(------+)/ # only -
53
+ return 'h3'
54
+ when /\A([���E])(.*)\z/s
55
+ ar << '-'+$2
56
+ return next_line
57
+ when /\A([����])(.*)\z/s
58
+ ar << '***'+$2
59
+ return next_line
60
+ end
61
+
62
+ ignore_chars = [?\s, ?-, ?*, ?>, ?|, ?,, ?{, ?}]
63
+ if ignore_chars.include?(line[0]) || line.empty?
64
+ ar << line
65
+ return next_line
66
+ end
67
+
68
+ ar << line+"{{br}}"
69
+ return next_line
70
+ end
71
+ end
72
+ end
73
+
74
+ if $0 == __FILE__
75
+ require 'qwik/testunit'
76
+ $test = true
77
+ end
78
+
79
+ if defined?($test) && $test
80
+ class TestEmodePreProcessor < Test::Unit::TestCase
81
+ def ok(e, str)
82
+ str = "============================================================\n"+str
83
+ ok_eq(e, Qwik::EmodePreProcessor.preprocess(str))
84
+ end
85
+
86
+ def test_all
87
+ c = Qwik::EmodePreProcessor
88
+
89
+ # test_emode?
90
+ eq(false, !!c.emode?(''))
91
+ eq(true, !!c.emode?("============================================================"))
92
+
93
+ # test_preprocess
94
+ ok('*t', "��t")
95
+ ok("*1\n-t", "�Et")
96
+ ok("*1\nt{{br}}", 't')
97
+ ok("*t\nt1{{br}}\nt2{{br}}", "��t\nt1\nt2")
98
+ ok("*t\nt1{{br}}\n====\nt2{{br}}",
99
+ "��t\nt1\n------------------------------------------------------------\nt2")
100
+ #ok("*t\n>t1{{br}}\n>t2{{br}}", "��t\n>t1\n>t2") # impossible...
101
+ ok("*t\n>t1\n>t2", "��t\n>t1\n>t2")
102
+ ok("*1\n-", '-')
103
+ ok('*1',
104
+ '------------------------------------------------------------')
105
+
106
+ # test_sjis_bug
107
+ ok("*1\n�[{{br}}\nt{{br}}", "�[\nt")
108
+
109
+ # test_br
110
+ ok("*1\n{{{\nt{{br}}\n}}}", "{{{\nt\n}}}")
111
+
112
+ # test_multiline
113
+ ok("*1\na{{br}}\n\nb{{br}}", "a\n\nb")
114
+ end
115
+ end
116
+ end
@@ -0,0 +1,273 @@
1
+ #encoding: sjis
2
+ # Copyright (C) 2003-2006 Kouichirou Eto, All rights reserved.
3
+ # This is free software with ABSOLUTELY NO WARRANTY.
4
+ # You can redistribute it and/or modify it under the terms of the GNU GPL 2.
5
+
6
+ $LOAD_PATH.unshift '..' unless $LOAD_PATH.include? '..'
7
+
8
+ module Qwik
9
+ class InlineParser
10
+ URL = '(?:http|https|ftp|mailto|file):[a-zA-Z0-9;/?:@&=+$,\-_.!~*\'()#%]+'
11
+
12
+ INLINE_PATTERNS = {
13
+ :"'''"=>:strong,
14
+ :"''"=>:em,
15
+ :'=='=>:del,
16
+ }
17
+
18
+ def self.make_tree(line_ar)
19
+ root = []
20
+ stack = []
21
+ stack << root
22
+ in_tag = {}
23
+
24
+ line_ar.each {|t|
25
+ if t.is_a?(Symbol)
26
+ if in_tag[t]
27
+ in_tag[t] = nil
28
+ if stack.last.length == 1 # bad hack
29
+ stack.last << ''
30
+ end
31
+ stack.pop if 1 < stack.length
32
+ else
33
+ in_tag[t] = true
34
+ ar = [INLINE_PATTERNS[t]]
35
+ stack.last << ar
36
+ stack << ar
37
+ end
38
+
39
+ else
40
+ if t.is_a? Array
41
+ elem = t.first
42
+ case elem
43
+ when :ref
44
+ stack.last << parse_ref(t[1])
45
+ when :plugin
46
+ stack.last << parse_plugin(t)
47
+ when :url
48
+ stack.last << [:a, {:href=>t[1]}, t[1]]
49
+ else
50
+ # do nothing
51
+ end
52
+
53
+ else
54
+ stack.last << t
55
+ end
56
+ end
57
+ }
58
+
59
+ # bad hack
60
+ if stack.last.length == 1 && stack.last.is_a?(Array) &&
61
+ stack.last.first.is_a?(Symbol)
62
+ stack.last << ''
63
+ end
64
+
65
+ return root
66
+ end
67
+
68
+ def self.parse_plugin(t)
69
+ method = t[1].to_s
70
+ param = t[2].to_s
71
+ data = t[3].to_s
72
+ return [:br] if method == 'br' # shortcut
73
+ return [:plugin, {:method=>method, :param=>param}, data]
74
+ end
75
+
76
+ def self.parse_ref(uri)
77
+ text, uri = $1, $2 if /\A([^|]*)\|(.+)\z/s =~ uri
78
+ if text.nil? or text.empty?
79
+ text = uri
80
+ end
81
+
82
+ case uri
83
+ when /\A#{URL}/o
84
+ if /\.(?:jpg|jpeg|png|gif)\z/i =~ uri
85
+ [:img, {:src=>uri, :alt=>text}]
86
+ else
87
+ [:a, {:href=>uri}, text]
88
+ end
89
+ when /\A(.+?):(.+)\z/
90
+ [:plugin, {:method=>'interwiki', :param=>uri}, text]
91
+ else
92
+ uri = "#{uri}.html" unless uri.include?('.')
93
+ [:a, {:href=>uri}, text]
94
+ end
95
+ end
96
+ end
97
+ end
98
+
99
+ if $0 == __FILE__
100
+ if ARGV[0] == '-b'
101
+ $bench = true
102
+ else
103
+ require 'qwik/testunit'
104
+ $test = true
105
+ end
106
+ end
107
+
108
+ if defined?($test) && $test
109
+ require 'qwik/tokenizer-inline'
110
+
111
+ class TestInlineParser < Test::Unit::TestCase
112
+ def ok(e, str)
113
+ tokens = Qwik::InlineTokenizer.tokenize(str)
114
+ tree = Qwik::InlineParser.make_tree(tokens)
115
+ ok_eq(e, tree)
116
+ end
117
+
118
+ def test_all
119
+ ok([], '')
120
+ ok(['t'], 't')
121
+
122
+ # test em, strong and del
123
+ ok([[:em, 't']], "''t''")
124
+ ok([[:strong, 't']], "'''t'''")
125
+ ok([[:strong, 't', [:em, '']]], "'''t''")
126
+ ok(["'"], "'")
127
+ ok(["'", 't'], "'t")
128
+ ok([[:del, 't']], '==t==')
129
+ ok(['='], '=')
130
+ ok(['=', 't'], '=t')
131
+ ok(['a ',[:em,'b ',[:strong,'c'],' d'],' e'], "a ''b '''c''' d'' e")
132
+ # FIXME: Take care of incomplete patterns.
133
+ ok([[:em, 'a', [:strong, 'b', [:del, 'c']]]], "''a'''b==c")
134
+ ok([[:strong, '']], "''''''")
135
+ ok(['a', [:em, 'b', [:strong, 'c'], 'd'], 'e'], "a''b'''c''d'''e")
136
+ ok(['a', [:del, 'b', [:em, 'c'], 'd'], 'e'], "a==b''c==d''e")
137
+
138
+ # test_ref
139
+ ok([[:a, {:href=>'t.html'}, 't']], '[[t]]')
140
+ ok([[:a, {:href=>'t.html'}, 's']], '[[s|t]]')
141
+ ok([[:a, {:href=>'http://e.com/'}, 'e']], '[[e|http://e.com/]]')
142
+ ok([[:plugin, {:method=>'interwiki', :param=>'w:p'}, 'w:p']],
143
+ '[[w:p]]')
144
+ ok([']'], ']')
145
+ ok(['[', 't', ']'], '[t]')
146
+ ok([[:a, {:href=>'http://e.com/'}, 't']], '[http://e.com/ t]')
147
+
148
+ ok([[:a, {:href=>'C++.html'}, 'C++']], '[[C++]]')
149
+
150
+ # test_plugin
151
+ ok([[:plugin, {:method=>'t', :param=>''}, '']], '{{t}}')
152
+ ok([[:plugin, {:method=>'t', :param=>'a'}, '']], '{{t(a)}}')
153
+ ok(['{', 't', '}'], '{t}')
154
+ #ok(['{', '{', '}}'], '{{}}') # regexp version.
155
+ ok(['{{}}'], '{{}}') # strscan version.
156
+ ok([[:br]], '{{br}}') # shotcut
157
+
158
+ # test_url
159
+ ok([[:a, {:href=>'http://e.com/'}, 'http://e.com/']], 'http://e.com/')
160
+ ok([[:a, {:href=>'https://e.com/'}, 'https://e.com/']],
161
+ 'https://e.com/')
162
+ ok(['t ', [:a, {:href=>'http://e.com/'}, 'http://e.com/'], ' a'],
163
+ 't http://e.com/ a')
164
+
165
+ # test etc. at a time
166
+ ok(['a ', [:em, 'b'], ' ', [:strong, 'c'], ' ', [:del, 'd'], ' ',
167
+ [:a, {:href=>'e.html'}, 'e'], ' ',
168
+ [:plugin, {:method=>'f', :param=>''}, ''], ' ',
169
+ [:a, {:href=>'http://e.com/'}, 'http://e.com/'], ' g'],
170
+ "a ''b'' '''c''' ==d== [[e]] {{f}} http://e.com/ g")
171
+
172
+ # test_img
173
+ ok([[:img, {:alt=>'http://e.com/t.jpg', :src=>'http://e.com/t.jpg'}]],
174
+ '[[http://e.com/t.jpg]]')
175
+ ok([[:img, {:alt=>'m', :src=>'http://e.com/t.jpg'}]],
176
+ '[[m|http://e.com/t.jpg]]')
177
+
178
+ # test_security
179
+ ok([[:a, {:href=>'t.html'}, 't']], '[[t]]')
180
+ ok([[:a, {:href=>'http://e.com/'}, 'http://e.com/']],
181
+ '[[http://e.com/]]')
182
+ ok([[:plugin, {:param=>'javascript:t', :method=>'interwiki'},
183
+ 'javascript:t']],
184
+ '[[javascript:t]]') # Treated as InterWiki
185
+ ok([[:a, {:href=>"&{alert('hello');};.html"}, "&{alert('hello');};"]],
186
+ "[[&{alert('hello');};]]")
187
+
188
+ # test_bug
189
+ ok([[:a, {:href=>"\226].html"}, "\226]"]], '[[�]]]')
190
+ end
191
+ end
192
+
193
+ class TestInlineParser_parse_ref < Test::Unit::TestCase
194
+ def ok(e, str)
195
+ ok_eq(e, Qwik::InlineParser.parse_ref(str))
196
+ end
197
+
198
+ def test_all
199
+ # normal ref
200
+ ok([:a, {:href=>'t.html'}, 't'], 't')
201
+ ok([:a, {:href=>'http://e.com/'}, 'http://e.com/'], 'http://e.com/')
202
+
203
+ # with title
204
+ ok([:a, {:href=>'t.html'}, 's'], 's|t')
205
+ ok([:a, {:href=>'http://e.com/'}, 's'], 's|http://e.com/')
206
+
207
+ # interwiki
208
+ ok([:plugin, {:param=>'s:t', :method=>'interwiki'}, 's:t'], 's:t')
209
+ ok([:plugin, {:param=>'s:t', :method=>'interwiki'}, 'foo'], 'foo|s:t')
210
+
211
+ # test_plugin_ref
212
+ ok([:a, {:href=>'.attach'}, '.attach'], '.attach')
213
+ ok([:a, {:href=>'.attach/t.txt'}, '.attach/t.txt'], '.attach/t.txt')
214
+ ok([:a, {:href=>'.attach/s t.txt'}, '.attach/s t.txt'],
215
+ '.attach/s t.txt')
216
+
217
+ # test_img
218
+ ok([:img, {:alt=>'http://e.com/t.jpg', :src=>'http://e.com/t.jpg'}],
219
+ 'http://e.com/t.jpg')
220
+ ok([:img, {:alt=>'s', :src=>'http://e.com/t.jpg'}],
221
+ 's|http://e.com/t.jpg')
222
+
223
+ # test security
224
+ ok([:a, {:href=>"&{alert('hello');};.html"}, "&{alert('hello');};"],
225
+ "&{alert('hello');};")
226
+
227
+ # test_sjis_bug
228
+ ok_eq("\203|\203X", '�|�X')
229
+ ok([:a, {:href=>"\203|\203X.html"}, "\203|\203X"], '�|�X')
230
+
231
+ # test_bug
232
+ ok_eq("\226]", '�]')
233
+ ok([:a, {:href=>"\226].html"}, "\226]"], '�]')
234
+
235
+ # abnormal cases
236
+ ok([:a, {:href=>'|.html'}, '|'], '|')
237
+ ok([:a, {:href=>'|.html'}, '|'], '||')
238
+ ok([:a, {:href=>'||.html'}, '||'], '|||')
239
+ ok([:a, {:href=>'s|.html'}, 's|'], 's|')
240
+ ok([:a, {:href=>'s.html'}, 's'], '|s')
241
+ ok([:a, {:href=>'http://example.com'}, 'http://example.com'], '|http://example.com')
242
+ ok([:plugin, {:param=>'s:t', :method=>'interwiki'}, 's:t'], '|s:t')
243
+ end
244
+ end
245
+ end
246
+
247
+ if defined?($bench) && $bench
248
+ require 'qwik/bench-module-session'
249
+
250
+ def ok(e, str)
251
+ tree = Qwik::InlineParser.parse(str)
252
+ end
253
+
254
+ def main
255
+ n = 10000
256
+
257
+ # 10000 times.
258
+ # 5.460000 0.220000 5.680000 ( 5.683599)
259
+ # 5.460000 0.180000 5.640000 ( 5.641708)
260
+ # 5.480000 0.350000 5.830000 ( 5.840561)
261
+
262
+ BenchmarkModule::benchmark {
263
+ n.times {
264
+ ok(['a ', [:em, 'b'], ' ', [:strong, 'c'], ' ', [:del, 'd'], ' ',
265
+ [:a, {:href=>'e.html'}, 'e'], ' ',
266
+ [:plugin, {:method=>'f', :param=>''}, ''], ' ',
267
+ [:a, {:href=>'http://e.com/'}, 'http://e.com/'], ' g'],
268
+ "a ''b'' '''c''' ==d== [[e]] {{f}} http://e.com/ g")
269
+ }
270
+ }
271
+ end
272
+ main
273
+ end