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,130 @@
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
+ require 'timeout'
6
+
7
+ $LOAD_PATH << 'compat' unless $LOAD_PATH.include? 'compat'
8
+ begin
9
+ require 'diff'
10
+ rescue LoadError
11
+ require 'algorithm/diff'
12
+ end
13
+
14
+ $LOAD_PATH.unshift '..' unless $LOAD_PATH.include? '..'
15
+ require 'qwik/util-string'
16
+
17
+ class DiffGenerator
18
+ def self.gen_ary(s1, s2)
19
+ s1 = s1.gsub(/\r/, '')
20
+ s2 = s2.gsub(/\r/, '')
21
+ a1 = s1.split("\n").collect! {|s| "#{s}\n"}
22
+ a2 = s2.split("\n").collect! {|s| "#{s}\n"}
23
+ Diff.diff(a1, a2)
24
+ end
25
+
26
+ MAX_TIME = 10 # 10 sec
27
+
28
+ # ref. http://moonrock.jp/%7Edon/wikimodoki/security.html
29
+ def self.generate(s1, s2, maxtime=MAX_TIME)
30
+ result = nil
31
+ begin
32
+ Timeout.timeout(maxtime) {
33
+ result = generate_internal(s1, s2)
34
+ }
35
+ rescue Timeout::Error
36
+ return ['timeout']
37
+ end
38
+ result
39
+ end
40
+
41
+ def self.generate_internal(s1, s2)
42
+ s1 = s1.gsub(/\r/, '')
43
+ s2 = s2.gsub(/\r/, '')
44
+
45
+ # why?
46
+ #src = s1.split("\n").collect {|s| "#{s.escapeHTML}" }
47
+ #src = s1
48
+ src = s1.split("\n").collect {|s| s }
49
+
50
+ si = 0
51
+ di = 0
52
+ e = []
53
+ self.gen_ary(s1, s2).each {|action, position, elements|
54
+ case action
55
+ when :-
56
+ while si < position
57
+ e << src[si]
58
+ e << [:br]
59
+ si += 1
60
+ di += 1
61
+ end
62
+ si += elements.length
63
+ elements.each {|l|
64
+ e << [:del, l.chomp]
65
+ e << [:br]
66
+ }
67
+ when :+
68
+ while di < position
69
+ e << src[si]
70
+ e << [:br]
71
+ si += 1
72
+ di += 1
73
+ end
74
+ di += elements.length
75
+ elements.each {|l|
76
+ e << [:ins, l.chomp]
77
+ e << [:br]
78
+ }
79
+ end
80
+ }
81
+ while si < src.length
82
+ e << src[si]
83
+ e << [:br]
84
+ si += 1
85
+ end
86
+ e
87
+ end
88
+ end
89
+
90
+ if $0 == __FILE__
91
+ require 'qwik/testunit'
92
+ $test = true
93
+ end
94
+
95
+ if defined?($test) && $test
96
+ class TestDiffGenerator < Test::Unit::TestCase
97
+ def test_all
98
+ # check_diff
99
+ is "[[:+, 1, \"t\"]]", Diff.diff('t', 'tt').inspect
100
+ is "[[:-, 1, \"t\"]]", Diff.diff('tt', 't').inspect
101
+
102
+ curstr = "a
103
+ b
104
+ c
105
+ "
106
+ newstr = "a
107
+ z
108
+ c
109
+ "
110
+
111
+ # test_gen_ary
112
+ is [[:-, 0, ["t\n"]], [:+, 0, ["tt\n"]]],
113
+ DiffGenerator.gen_ary('t', 'tt')
114
+ is [[:-, 1, ["z\n"]], [:+, 1, ["b\n"]]],
115
+ DiffGenerator.gen_ary(newstr, curstr)
116
+
117
+ # test_generate
118
+ is [[:del, 't'], [:br], [:ins, 'tt'], [:br]],
119
+ DiffGenerator.generate('t', 'tt')
120
+ is ['a', [:br], [:del, 'z'], [:br],
121
+ [:ins, 'b'], [:br], 'c', [:br]],
122
+ DiffGenerator.generate(newstr, curstr)
123
+
124
+ # test_vulnerability
125
+ curstr = "a\n \n" * 10000
126
+ newstr = "b\n \n" * 10000
127
+ is ["timeout"], DiffGenerator.generate(newstr, curstr, 1)
128
+ end
129
+ end
130
+ end
@@ -0,0 +1,310 @@
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/util-string'
7
+
8
+ $LOAD_PATH << '../../ext' unless $LOAD_PATH.include?('../../ext')
9
+ begin
10
+ require 'xmlformatter.so'
11
+ $have_xmlformatter_so = true
12
+ rescue LoadError
13
+ #p "No extention. Use Ruby version."
14
+ $have_xmlformatter_so = false
15
+ end
16
+
17
+ module Qwik
18
+ class RB_XMLFormatter
19
+ # copied from gonzui-0.1
20
+ # Extend some functions by Kouichirou Eto
21
+
22
+ # To eliminate costs for object creation, the following
23
+ # strings are defined as constants. It makes format_xml
24
+ # 1.2 times faster.
25
+ SP = ' '
26
+ QT = '"'
27
+ EQ = '='
28
+ LT = '<'
29
+ GT = '>'
30
+ LF = "\n"
31
+ SL = '/'
32
+ NL = '' # null
33
+
34
+ # Meta element
35
+ XMLDECL = '?xml'
36
+ DOCTYPE = '!DOCTYPE'
37
+ COMMENT = '!--'
38
+ CDATA = '![CDATA['
39
+
40
+ def format(ar, indent=0, sindent=0)
41
+ n = (0 <= indent) ? LF : NL
42
+ sn = (0 <= sindent) ? LF : NL
43
+
44
+ if !ar[0].is_a?(Symbol)
45
+ out = ''
46
+ ar.each {|x|
47
+ if x.is_a?(Array)
48
+ out << format(x, indent, sindent) # recursive
49
+ elsif x.is_a?(String)
50
+ out << x.escapeHTML
51
+ elsif x.is_a?(NilClass)
52
+ # do nothing
53
+ else
54
+ p "what?", x
55
+ out << x.to_s.escapeHTML
56
+ end
57
+ }
58
+ return out
59
+ end
60
+
61
+ element = ar[0].to_s.escapeHTML
62
+
63
+ if element == XMLDECL # XML Declaration
64
+ attributes = ''
65
+ attributes += " version=\""+ar[1]+"\"" if ar[1]
66
+ attributes += " encoding=\""+ar[2]+"\"" if ar[2]
67
+ attributes += " standalone=\""+ar[3]+"\"" if ar[3]
68
+ return "<?xml"+attributes+"?>"
69
+
70
+ elsif element == DOCTYPE # doctype
71
+ return "<!DOCTYPE "+ar[1]+' '+ar[2]+
72
+ " \""+ar[3]+"\" \""+ar[4]+"\">"
73
+
74
+ elsif element == COMMENT # comment
75
+ return "<!--"+ar[1]+"-->"
76
+
77
+ elsif element == CDATA # CDATA
78
+ return "<![CDATA["+ar[1]+"]]>"
79
+
80
+ end
81
+
82
+ offset = 1
83
+ attributes = ''
84
+ while ar[offset].is_a?(Hash)
85
+ attr = ar[offset]
86
+ offset += 1
87
+ attr.keys.sort{|a, b| a.to_s <=> b.to_s }.each {|k|
88
+ v = attr[k]
89
+ attributes << SP << k.to_s.escapeHTML << EQ << QT << v.to_s.escapeHTML << QT
90
+ }
91
+ end
92
+
93
+ if ar[offset].nil? && ar.length == offset
94
+ o = ''
95
+ o << LT << element << attributes << n << SL << GT
96
+ return o
97
+ end
98
+
99
+ out = ''
100
+ out << LT << element << attributes << sn << GT
101
+ (offset...ar.length).each {|i|
102
+ x = ar[i]
103
+ if x.is_a?(Array)
104
+ out << format(x, indent, sindent) # recursive
105
+ elsif x.is_a?(String)
106
+ out << x.escapeHTML
107
+ else
108
+ out << x.to_s.escapeHTML
109
+ end
110
+ }
111
+ out << LT << SL << element << n << GT
112
+ out
113
+ end
114
+ end
115
+ end
116
+
117
+ class Array
118
+ def rb_format_xml(indent=0, sindent=0)
119
+ formatter = Qwik::RB_XMLFormatter.new
120
+ result = formatter.format(self, indent, sindent)
121
+ result
122
+ end
123
+
124
+ # You can not specify indent in c_formt_xml.
125
+ def c_format_xml
126
+ formatter = Gonzui::XMLFormatter.new
127
+ result = formatter.format(self)
128
+ result
129
+ end
130
+
131
+ def format_xml
132
+ return self.c_format_xml if $have_xmlformatter_so
133
+ return self.rb_format_xml
134
+ end
135
+ end
136
+
137
+ if $0 == __FILE__
138
+ if ARGV[0] == '-c'
139
+ $check = true
140
+ else
141
+ require 'qwik/testunit'
142
+ require 'pp'
143
+ $test = true
144
+ end
145
+ end
146
+
147
+ if defined?($test) && $test
148
+ class TestXMLFormatter < Test::Unit::TestCase
149
+ def ok(e, w)
150
+ ok_eq(e, w.rb_format_xml)
151
+ ok_eq(e, w.format_xml) # assert twice
152
+ end
153
+
154
+ def ok_rb(e, w)
155
+ ok_eq(e, w.rb_format_xml)
156
+ end
157
+
158
+ def test_rb_format_xml
159
+ ok_eq("<a\n/>", [:a].rb_format_xml(0))
160
+ ok_eq("<a></a\n>", [:a, ""].rb_format_xml(0, -1))
161
+ ok_eq("<a\n></a\n>", [:a, ""].rb_format_xml)
162
+ ok_eq("<a><b></b></a>", [:a, [:b, '']].rb_format_xml(-1, -1))
163
+ ok_eq("<a><b></b\n></a\n>", [:a, [:b, ""]].rb_format_xml(0, -1))
164
+ ok_eq("<a\n><b\n></b\n></a\n>", [:a, [:b, ""]].rb_format_xml)
165
+ end
166
+
167
+ def test_all
168
+ # test_basic
169
+ ok("<a\n/>", [:a])
170
+ ok("<a\n>t</a\n>", [:a, 't'])
171
+ ok("<a\n><b\n></b\n></a\n>", [:a, [:b, '']])
172
+ ok("<a href=\"t\"\n>s</a\n>", [:a, {:href=>'t'}, 's'])
173
+
174
+ # test_escape
175
+ ok("<a\n>&lt;</a\n>", [:a, '<'])
176
+ ok("<a href=\"&lt;\"\n/>", [:a, {:href=>'<'}])
177
+ ok("<a &gt;=\"&lt;\"\n/>", [:a, {'>'=>'<'}])
178
+ ok("<a &lt;=\"&lt;\"\n/>", [:a, {'<'=>'<'}])
179
+ ok("<&lt;\n/>", [:'<'])
180
+ ok("<&lt; &amp;=\"&lt;\"\n/>", [:'<', {'&'=>'<'}])
181
+
182
+ # test_doctype
183
+ ok("<!DOCTYPE html PUBLIC \"-//W3C//DTD html 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">",
184
+ [:"!DOCTYPE", 'html', 'PUBLIC',
185
+ '-//W3C//DTD html 4.01 Transitional//EN',
186
+ 'http://www.w3.org/TR/html4/loose.dtd'])
187
+ ok("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">",
188
+ [:"!DOCTYPE", 'html', 'PUBLIC',
189
+ '-//W3C//DTD XHTML 1.0 Transitional//EN',
190
+ 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'])
191
+
192
+ # test_comment
193
+ ok('<!--comment-->', [:'!--', 'comment'])
194
+ ok("<!--<-->", [:"!--", "<"])
195
+
196
+ # test_text
197
+ ok('', [])
198
+ ok('', [''])
199
+ ok('a', ['a'])
200
+ ok('ab', ['a', 'b'])
201
+ ok('abc', ['a', ['b'], 'c'])
202
+
203
+ # test_null
204
+ ok("<a\n></a\n>", [:a, ''])
205
+ ok("<a\n></a\n>", [:a, nil])
206
+ ok("<a\n></a\n>", [:a, []])
207
+ ok("<a\n>nil</a\n>", [:a, :nil])
208
+ ok("<p id=\"\"\n/>", [:p, {:id=>''}])
209
+ ok("<p id=\"\"\n/>", [:p, {:id=>nil}])
210
+ ok("<p id=\"\"\n/>", [:p, {:id=>[]}])
211
+ ok("<p\n>b</p\n>", [:p, [['b']]])
212
+ ok("<p\n>bc</p\n>", [:p, ['b'], 'c'])
213
+ ok("<p id=\"\"\n></p\n>", [:p, {:id=>''}, ''])
214
+
215
+ # test_non_destructive
216
+ w = [:a]
217
+ ok("<a\n/>", w)
218
+ ok("<a\n/>", w)
219
+
220
+ # test_bug
221
+ ok("<a\n/><b\n/>", [[:a], [:b]])
222
+
223
+ # test_format_xml # copied from gonzui-0.3
224
+ html = [:html]
225
+ head = [:head, [:title, 'foo']]
226
+ body = [:body, [:h1, [:a, {:href => 'foo<&">.html'}, 'foo<&">']]]
227
+ body.push([:p, 'hello'])
228
+ html.push(head)
229
+ html.push(body)
230
+ ok("<html\n><head\n><title\n>foo</title\n></head\n><body\n><h1\n><a href=\"foo&lt;&amp;&quot;&gt;.html\"\n>foo&lt;&amp;&quot;&gt;</a\n></h1\n><p\n>hello</p\n></body\n></html\n>", html)
231
+
232
+ # test_general
233
+ ok(
234
+ "<html
235
+ ><head
236
+ ><title
237
+ >hello</title
238
+ ></head
239
+ ><body
240
+ ><h1
241
+ >hello, world!</h1
242
+ ><p
243
+ >This is <a href=\"hello.html\"
244
+ >hello, world</a
245
+ >example.</p
246
+ ></body
247
+ ></html
248
+ >",
249
+ [:html,
250
+ [:head,
251
+ [:title, 'hello']],
252
+ [:body,
253
+ [:h1, 'hello, world!'],
254
+ [:p, 'This is ',
255
+ [:a, {:href=>'hello.html'}, 'hello, world'],
256
+ 'example.']]]
257
+ )
258
+
259
+ # test_etc
260
+ ok_rb("<html lang=\"ja\" xml:lang=\"ja\" xmlns=\"http://www.w3.org/1999/xhtml\"\n></html\n>",
261
+ [:html, {:xmlns=>'http://www.w3.org/1999/xhtml',
262
+ :'xml:lang'=>'ja', :lang=>'ja'}, ''])
263
+ ok_rb("<meta content=\"text/html; charset=shift_jis\" http-equiv=\"Content-Type\"\n/>",
264
+ [:meta, {:'http-equiv'=>'Content-Type',
265
+ :content=>'text/html; charset=shift_jis'}])
266
+
267
+ # test_cdata
268
+ ok("<![CDATA[cdata]]>", [:'![CDATA[', 'cdata'])
269
+ ok("<![CDATA[<]]>", [:'![CDATA[', "<"])
270
+
271
+ # test_xmldecl
272
+ ok("<?xml?>", [:'?xml'])
273
+ ok("<?xml version=\"1.0\"?>", [:'?xml', '1.0'])
274
+ ok("<?xml version=\"1.0\" encoding=\"utf-8\"?>",
275
+ [:'?xml', '1.0', 'utf-8'])
276
+ ok("<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>",
277
+ [:'?xml', '1.0', 'utf-8', 'yes'])
278
+ ok("<?xml version=\"1.0\" encoding=\"utf-8\"?><a\n/>",
279
+ [[:'?xml', '1.0', 'utf-8'], [:a]])
280
+
281
+ # check_wabisabi_output
282
+ html = [:html,
283
+ [:head,
284
+ [:title, 'hello']],
285
+ [:body,
286
+ [:h1, 'hello, world!'],
287
+ [:p, 'This is a ',
288
+ [:a, {:href=>'hello.html'}, 'hello, world'],
289
+ ' example.']]]
290
+ #puts html.format_xml
291
+ ok("<html
292
+ ><head
293
+ ><title
294
+ >hello</title
295
+ ></head
296
+ ><body
297
+ ><h1
298
+ >hello, world!</h1
299
+ ><p
300
+ >This is a <a href=\"hello.html\"
301
+ >hello, world</a
302
+ > example.</p
303
+ ></body
304
+ ></html
305
+ >",
306
+ html)
307
+ end
308
+ end
309
+ end
310
+
@@ -0,0 +1,262 @@
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/html-generator'
7
+
8
+ module Qwik
9
+ module WabisabiGeneratorModule
10
+ def method_missing(symbol, *args, &block)
11
+ make(symbol, *args, &block)
12
+ end
13
+
14
+ def p(*args, &block)
15
+ make(:p, *args, &block)
16
+ end
17
+
18
+ def make(symbol, *args, &block)
19
+ symbol = symbol.intern if symbol.is_a?(String)
20
+ ar = make_ar(symbol, *args, &block)
21
+ ar
22
+ end
23
+
24
+ def make_ar(symbol, *args, &block)
25
+ ar = []
26
+
27
+ ar << symbol
28
+
29
+ if 0 < args.length
30
+ ar += args.flatten
31
+ end
32
+
33
+ if block
34
+ y = block.call
35
+ es = add_elems(y)
36
+ if 0 < es.length
37
+ if es[0].is_a? Symbol
38
+ ar << es
39
+ else
40
+ ar += es
41
+ end
42
+ end
43
+ end
44
+
45
+ ar
46
+ end
47
+
48
+ def add_elems(args)
49
+ return [] if args.nil?
50
+ return [args] unless args.kind_of? Array
51
+ ar = []
52
+ args.each {|a|
53
+ a = '' if a.nil?
54
+ ar << a
55
+ }
56
+ ar
57
+ end
58
+ end
59
+
60
+ module WabisabiHtmlGeneratorModule
61
+ include WabisabiGeneratorModule
62
+ include HtmlGeneratorUnit
63
+ end
64
+
65
+ class WabisabiGenerator; include WabisabiGeneratorModule; end
66
+ class WabisabiHtmlGenerator; include WabisabiHtmlGeneratorModule; end
67
+
68
+ class Generator < WabisabiGenerator; end
69
+ class HtmlGenerator < WabisabiHtmlGenerator; end
70
+ end
71
+
72
+ if $0 == __FILE__
73
+ require 'qwik/testunit'
74
+ require 'qwik/wabisabi-format-xml'
75
+ # $KCODE = 's'
76
+ $test = true
77
+ end
78
+
79
+ if defined?($test) && $test
80
+ class TestWabisabiGenerator < Test::Unit::TestCase
81
+ def ok(e, s)
82
+ assert_equal e, s
83
+ end
84
+
85
+ def test_all
86
+ g = Qwik::WabisabiGenerator.new
87
+
88
+ # test_htree_generator
89
+ ok([:p], g.p)
90
+ ok([:a], g.a)
91
+ ok([:b], g.b{})
92
+ ok([:b, ''], g.b{''})
93
+ ok([:img, {:src=>'u'}], g.img(:src=>'u'))
94
+ ok([:b, 't'], g.b{'t'})
95
+ ok([:p, [:b, 'b']], g.p{g.b{'b'}})
96
+ ok([:p, 't', [:p, 'b'], 't'], g.p{['t', g.p{'b'}, 't']})
97
+ ok([:a, {:href=>'u'}, 't'], g.a(:href=>'u'){'t'})
98
+ ok([:font, {:size=>'7'}, 't'], g.font(:size=>'7'){'t'})
99
+
100
+ # test_namespace
101
+ ok([:b, 't'], g.make('b'){'t'})
102
+ ok([:'n:b', 't'], g.make('n:b'){'t'})
103
+ ok([:a, {:href=>'u'}, 't'], g.make('a', :href=>'u'){'t'})
104
+ html = g.html {[
105
+ g.head {[
106
+ g.title {"�^�C�g��"},
107
+ ]},
108
+ g.body {[
109
+ g.pre {[g.b {'world'}, 'hello']},
110
+ g.pre {['this is ', g.b{'bold'}, ' text.']},
111
+ g.pre {['this is ', g.i{'italic'}, ' text.']},
112
+ g.p {['this is ', g.a(:href=>'hoge'){'anchor'}, ' text.']},
113
+ ]}
114
+ ]}
115
+ ok([:html,
116
+ [:head, [:title, "�^�C�g��"]],
117
+ [:body,
118
+ [:pre, [:b, 'world'], 'hello'],
119
+ [:pre, 'this is ', [:b, 'bold'], ' text.'],
120
+ [:pre, 'this is ', [:i, 'italic'], ' text.'],
121
+ [:p, 'this is ', [:a, {:href=>'hoge'}, 'anchor'], ' text.']]],
122
+ html)
123
+
124
+ # test_with_underbar
125
+ ok([:ab], g.ab)
126
+ ok([:'a-b'], g.make('a-b'))
127
+
128
+ # test_ordered_hash
129
+ ok([:a, {'b'=>'c'}], g.a({'b'=>'c'}))
130
+ ok([:a, {'b'=>'c'}], g.a([{'b'=>'c'}]))
131
+ ok([:a, {'b'=>'c'}, {'d'=>'e'}], g.a([{'b'=>'c'}, {'d'=>'e'}]))
132
+ ok([:a, {'b'=>'c'}, {'d'=>'e'}], g.a({'b'=>'c'}, {'d'=>'e'}))
133
+ end
134
+ end
135
+
136
+ class TestWabisabiHtmlGenerator < Test::Unit::TestCase
137
+ def ok(e, s)
138
+ assert_equal e, s
139
+ end
140
+
141
+ def test_htree_html_generator
142
+ g = Qwik::WabisabiHtmlGenerator.new
143
+ ok([:p], g.p)
144
+
145
+ ok([:meta, {:content=>'text/html', 'http-equiv'=>'Content-Type'}],
146
+ g.contenttype('text/html'))
147
+ ok([:meta, {:content=>"0; url=t", 'http-equiv'=>'Refresh'}],
148
+ g.refresh(0, 't'))
149
+ ok([:link, {:href=>'style1.css',
150
+ :type=>'text/css', :rel=>'stylesheet'}],
151
+ g.stylesheet('style1.css'))
152
+
153
+ # test_link
154
+ ok([:a, {:href=>'t'}, 's'], g.a('t'){'s'})
155
+ ok([:a, {:href=>"t?a"}, 's'], g.a("t?a"){'s'})
156
+ ok([:a, {:href=>"t?a&b"}, 's'], g.a("t?a&b"){'s'})
157
+ ok([:a, {:href=>'t'}, "<"], g.a('t'){"<"})
158
+
159
+ # test_form
160
+ ok([:input, {:name=>'n'}], g.text('n'))
161
+ ok([:input, {:value=>'t', :type=>'submit', :name=>'n'}],
162
+ g.submit('t', 'n'))
163
+ ok([:textarea, {:name=>''}, 't'],
164
+ g.textarea{'t'})
165
+ ok([:select,
166
+ {:name=>'n'},
167
+ [:option, {:name=>'t1'}, 't1'],
168
+ [:option, {:name=>'t2'}, 't2']], g.select('n', 't1', 't2'))
169
+
170
+ ok([:input, {:type=>'hidden'}, {:name=>'n'}], g.hidden('n'))
171
+ ok([:input, {:type=>'hidden'}, {:name=>'n'}, {:value=>'v'}],
172
+ g.hidden('n', 'v'))
173
+ ok([:input, {:id=>'i', :value=>'v', :name=>'n'}],
174
+ g.hidden({:name=>'n', :value=>'v', :id=>'i'}))
175
+ ok([:input, {:id=>'i', :value=>'v', :name=>'n'}],
176
+ g.hidden(:name=>'n', :value=>'v', :id=>'i'))
177
+
178
+ ok([:form, 't'], g.form{'t'})
179
+ ok([:form, {:method=>'POST'}, 't'], g.form('POST'){'t'})
180
+ ok([:form, {:method=>'POST'}, {:action=>'u'}, 't'],
181
+ g.form('POST', 'u'){'t'})
182
+ ok([:form, {:enctype=>'multipart/form-data', :method=>'POST'}, 't'],
183
+ g.form(:method=>'POST', :enctype=>'multipart/form-data'){'t'})
184
+
185
+ # test_html
186
+ html = g.html {[
187
+ g.head {[
188
+ g.contenttype("text/html; charset=SHIFT_JIS"),
189
+ g.title {"�^�C�g��"},
190
+ g.stylesheet('style.css')
191
+ ]},
192
+ g.body {[
193
+ g.pre {[g.b {'world'}, 'hello']},
194
+ g.pre {['This is ', g.b{'bold'}, ' text.']},
195
+ g.pre {['This is ', g.i{'italic'}, ' text.']},
196
+ g.p {['This is ', g.a('hoge'){'anchor'}, ' text.']},
197
+ g.p {['This is ', g.a(:href=>'hoge'){'anchor'}, ' text.']},
198
+ g.img('new.gif', 'new')
199
+ ]}
200
+ ]}
201
+ ok([:html,
202
+ [:head,
203
+ [:meta,
204
+ {:content=>"text/html; charset=SHIFT_JIS", 'http-equiv'=>'Content-Type'}],
205
+ [:title, "�^�C�g��"],
206
+ [:link,
207
+ {:href=>'style.css', :rel=>'stylesheet', :type=>'text/css'}]],
208
+ [:body,
209
+ [:pre, [:b, 'world'], 'hello'],
210
+ [:pre, 'This is ', [:b, 'bold'], ' text.'],
211
+ [:pre, 'This is ', [:i, 'italic'], ' text.'],
212
+ [:p, 'This is ', [:a, {:href=>'hoge'}, 'anchor'], ' text.'],
213
+ [:p, 'This is ', [:a, {:href=>'hoge'}, 'anchor'], ' text.'],
214
+ [:img, {:alt=>'new', :src=>'new.gif'}]]], html)
215
+ end
216
+ end
217
+
218
+ class TestWabisabiXmlGeneratorModule < Test::Unit::TestCase
219
+ include Qwik::WabisabiGeneratorModule
220
+
221
+ def ok(e, s)
222
+ assert_equal e, s.rb_format_xml(-1, -1)
223
+ end
224
+
225
+ def test_generator_module
226
+ ok("<b/>", b)
227
+ ok("<b/>", b{})
228
+ ok("<b>t</b>", b{'t'})
229
+ ok("<div><b>t</b></div>", div{b{'t'}})
230
+ ok("<p><b>b</b></p>", p{b{'b'}})
231
+ ok("<p>t<p>b</p>t</p>", p{['t', p{'b'}, 't']})
232
+ ok("<a href=\"u\">t</a>", a(:href=>'u'){'t'})
233
+ end
234
+ end
235
+
236
+ class TestWabisabiHtmlGeneratorModule < Test::Unit::TestCase
237
+ include Qwik::WabisabiHtmlGeneratorModule
238
+
239
+ def ok(e, s)
240
+ assert_equal e, s.rb_format_xml(-1, -1)
241
+ end
242
+
243
+ def test_all
244
+ html = html {[
245
+ head {[
246
+ contenttype("text/html; charset=SHIFT_JIS"),
247
+ title {"�^�C�g��"},
248
+ stylesheet('style.css')
249
+ ]},
250
+ body {[
251
+ pre {[b {'world'}, 'hello']},
252
+ pre {['This is ', b{'bold'}, ' text.']},
253
+ pre {['This is ', i{'italic'}, ' text.']},
254
+ p {['This is ', a('hoge'){'anchor'}, ' text.']},
255
+ p {['This is ', a(:href=>'hoge'){'anchor'}, ' text.']},
256
+ img('new.gif', 'new')
257
+ ]}
258
+ ]}
259
+ ok("<html><head><meta content=\"text/html; charset=SHIFT_JIS\" http-equiv=\"Content-Type\"/><title>�^�C�g��</title><link href=\"style.css\" rel=\"stylesheet\" type=\"text/css\"/></head><body><pre><b>world</b>hello</pre><pre>This is <b>bold</b> text.</pre><pre>This is <i>italic</i> text.</pre><p>This is <a href=\"hoge\">anchor</a> text.</p><p>This is <a href=\"hoge\">anchor</a> text.</p><img alt=\"new\" src=\"new.gif\"/></body></html>", html)
260
+ end
261
+ end
262
+ end