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,179 @@
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 << 'compat' unless $LOAD_PATH.include? 'compat'
6
+ require 'htree'
7
+ $LOAD_PATH.unshift '..' unless $LOAD_PATH.include? '..'
8
+ require 'qwik/html-generator'
9
+ require 'qwik/htree-generator'
10
+
11
+ module HTree
12
+ module HtmlGeneratorModule
13
+ include GeneratorModule
14
+ include HtmlGeneratorUnit
15
+ end
16
+
17
+ class HtmlGenerator
18
+ include HtmlGeneratorModule
19
+ end
20
+ end
21
+
22
+ if $0 == __FILE__
23
+ require 'qwik/testunit'
24
+ require 'qwik/htree-format-xml'
25
+ $test = true
26
+ end
27
+
28
+ if defined?($test) && $test
29
+ class TestHTreeHtmlGeneratorModule < Test::Unit::TestCase
30
+ include HTree::HtmlGeneratorModule
31
+
32
+ def test_html_generator_module
33
+ html = html {[
34
+ head {[
35
+ contenttype("text/html; charset=SHIFT_JIS"),
36
+ title {"�^�C�g��"},
37
+ stylesheet('style.css')
38
+ ]},
39
+ body {[
40
+ pre {[b {'world'}, 'hello']},
41
+ pre {['This is ', b{'bold'}, ' text.']},
42
+ pre {['This is ', i{'italic'}, ' text.']},
43
+ p {['This is ', a('hoge'){'anchor'}, ' text.']},
44
+ p {['This is ', a(:href=>'hoge'){'anchor'}, ' text.']},
45
+ img('new.gif', 'new')
46
+ ]}
47
+ ]}
48
+ ok_eq("<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 src=\"new.gif\" alt=\"new\"/></body></html>", html.format_xml)
49
+ end
50
+ end
51
+
52
+ class TestHTreeXmlGeneratorModule < Test::Unit::TestCase
53
+ include HTree::GeneratorModule
54
+
55
+ def ok(e, s)
56
+ ok_eq(e, s.format_xml)
57
+ end
58
+
59
+ def test_generator_module
60
+ ok("<b/>", b)
61
+ ok("<b/>", b{})
62
+ ok("<b>t</b>", b{'t'})
63
+ ok("<div><b>t</b></div>", div{b{'t'}})
64
+ ok("<p><b>b</b></p>", p{b{'b'}})
65
+ ok("<p>t<p>b</p>t</p>", p{['t', p{'b'}, 't']})
66
+ ok("<a href=\"u\">t</a>", a(:href=>'u'){'t'})
67
+ end
68
+ end
69
+
70
+ class TestHTreeHtmlGenerator < Test::Unit::TestCase
71
+ def ok(e, s)
72
+ ok_eq(e, s.format_xml)
73
+ end
74
+
75
+ def test_htree_html_generator
76
+ g = HTree::HtmlGenerator.new
77
+
78
+ ok("<p/>", g.p)
79
+ doc = HTree::Doc.new(g.p)
80
+ ok("<p/>", doc)
81
+ str = ''
82
+ doc.display_xml(str)
83
+ #ok_eq("<p xmlns=\"http://www.w3.org/1999/xhtml\"\n/>", str)
84
+
85
+ ok("<meta content=\"text/html\" http-equiv=\"Content-Type\"/>",
86
+ g.contenttype('text/html'))
87
+ ok("<meta content=\"0; url=t\" http-equiv=\"Refresh\"/>",
88
+ g.refresh(0, 't'))
89
+ ok("<link href=\"style1.css\" rel=\"stylesheet\" type=\"text/css\"/>",
90
+ g.stylesheet('style1.css'))
91
+
92
+ ok("<a href=\"t\">s</a>", g.a('t'){'s'}) # test_link
93
+ ok("<a href=\"t?a\">s</a>", g.a("t?a"){'s'})
94
+ ok("<a href=\"t?a&amp;b\">s</a>", g.a("t?a&b"){'s'})
95
+ ok("<a href=\"t\">&lt;</a>", g.a('t'){"<"})
96
+
97
+ ok("<input name=\"n\" type=\"submit\" value=\"t\"/>",
98
+ g.submit('t', 'n')) # test_form
99
+ ok("<textarea name=\"\">t</textarea>", g.textarea{'t'})
100
+ ok("<select name=\"n\"><option name=\"t1\">t1</option><option name=\"t2\">t2</option></select>", g.select('n', 't1', 't2'))
101
+
102
+ ok("<input type=\"hidden\" name=\"n\"/>", g.hidden('n'))
103
+ ok("<input type=\"hidden\" name=\"n\" value=\"v\"/>",
104
+ g.hidden('n', 'v'))
105
+ ok("<input name=\"n\" id=\"i\" value=\"v\"/>",
106
+ g.hidden({:name=>'n', :value=>'v', :id=>'i'}))
107
+ ok("<input name=\"n\" id=\"i\" value=\"v\"/>",
108
+ g.hidden(:name=>'n', :value=>'v', :id=>'i'))
109
+
110
+ ok("<form>t</form>", g.form{'t'})
111
+ ok("<form method=\"POST\">t</form>", g.form('POST'){'t'})
112
+ ok("<form method=\"POST\" action=\"u\">t</form>",
113
+ g.form('POST', 'u'){'t'})
114
+ ok("<form enctype=\"multipart/form-data\" method=\"POST\">t</form>",
115
+ g.form(:method=>'POST', :enctype=>'multipart/form-data'){'t'})
116
+
117
+ # test_apos
118
+ ok("&lt;&amp;", HTree::Text.new("<&"))
119
+ ok("'", HTree::Text.new("'"))
120
+ xml = g.p(:title => "What's New"){'t'}
121
+ ok("<p title=\"What's New\">t</p>", xml)
122
+ xml = g.p{"What's New"}
123
+ ok("<p>What's New</p>", xml)
124
+
125
+ # test_html
126
+ html = g.html {[
127
+ g.head {[
128
+ g.contenttype("text/html; charset=SHIFT_JIS"),
129
+ g.title {"�^�C�g��"},
130
+ g.stylesheet('style.css')
131
+ ]},
132
+ g.body {[
133
+ g.pre {[g.b {'world'}, 'hello']},
134
+ g.pre {['This is ', g.b{'bold'}, ' text.']},
135
+ g.pre {['This is ', g.i{'italic'}, ' text.']},
136
+ g.p {['This is ', g.a('hoge'){'anchor'}, ' text.']},
137
+ g.p {['This is ', g.a(:href=>'hoge'){'anchor'}, ' text.']},
138
+ g.img('new.gif', 'new')
139
+ ]}
140
+ ]}
141
+ 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 src=\"new.gif\" alt=\"new\"/></body></html>", html)
142
+
143
+ ok_eq(<<'EOT'.chomp, html.format_xml(0))
144
+ <html
145
+ ><head
146
+ ><meta content="text/html; charset=SHIFT_JIS" http-equiv="Content-Type"
147
+ /><title
148
+ >�^�C�g��</title
149
+ ><link href="style.css" rel='stylesheet' type="text/css"
150
+ /></head
151
+ ><body
152
+ ><pre
153
+ ><b
154
+ >world</b
155
+ >hello</pre
156
+ ><pre
157
+ >This is <b
158
+ >bold</b
159
+ > text.</pre
160
+ ><pre
161
+ >This is <i
162
+ >italic</i
163
+ > text.</pre
164
+ ><p
165
+ >This is <a href='hoge'
166
+ >anchor</a
167
+ > text.</p
168
+ ><p
169
+ >This is <a href='hoge'
170
+ >anchor</a
171
+ > text.</p
172
+ ><img src="new.gif" alt='new'
173
+ /></body
174
+ ></html
175
+ >
176
+ EOT
177
+ end
178
+ end
179
+ end
@@ -0,0 +1,263 @@
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 << 'compat' unless $LOAD_PATH.include? 'compat'
6
+ require 'htree'
7
+ $LOAD_PATH.unshift '..' unless $LOAD_PATH.include? '..'
8
+
9
+ module HTree
10
+ class Attr < Hash
11
+ def initialize(h)
12
+ self.update(h)
13
+ end
14
+ end
15
+
16
+ module Container
17
+ def html_tags(*tags)
18
+ ar = []
19
+ tags.map {|tag|
20
+ ar << tag
21
+ ar << "{http://www.w3.org/1999/xhtml}#{tag}"
22
+ }
23
+ return ar
24
+ end
25
+
26
+ def replace(*otags, &block)
27
+ tags = html_tags(*otags)
28
+
29
+ subst = {}
30
+ each_child_with_index {|descendant, i|
31
+ if ! descendant.elem?
32
+ subst[i] = descendant
33
+ next
34
+ end
35
+
36
+ if tags.length == 0 || tags.include?(descendant.name)
37
+ y = yield(descendant)
38
+ if !(y === descendant)
39
+ subst[i] = y
40
+ next
41
+ end
42
+ end
43
+
44
+ subst[i] = descendant.replace(*tags, &block)
45
+ }
46
+ return to_node.subst_subnode(subst)
47
+ end
48
+ alias each_tag replace
49
+
50
+ def apply(data)
51
+ replace {|e|
52
+ eid = e.get_attr('id')
53
+ next e if eid.nil?
54
+ eid = eid.intern
55
+ d = data[eid]
56
+ next nil if d.nil?
57
+ next e if d == true
58
+ if d.is_a? HTree::Attr
59
+ next e.clone_with(d)
60
+ elsif d.is_a? Array
61
+ next e.clone_with(d.flatten)
62
+ end
63
+ e.clone_with(d)
64
+ }
65
+ end
66
+ end
67
+
68
+ class Elem
69
+ include Enumerable
70
+ alias each each_child
71
+
72
+ def delete_spaces
73
+ ar = map {|e|
74
+ e.is_a?(HTree::Text) ? e.to_s.sub(/^\s+/, "").sub(/\s+$/, "") : e
75
+ }
76
+ clone_without_child.clone_with(ar)
77
+ end
78
+
79
+ def clone_without_child
80
+ name = self.name
81
+ org_attr = self.attributes
82
+ attr = symbol_to_str(org_attr)
83
+ return Elem.new(name, attr)
84
+ end
85
+
86
+ def clone_with(*ar)
87
+ name = self.name
88
+ org_attr = self.attributes
89
+ attr = symbol_to_str(org_attr)
90
+
91
+ nar = []
92
+ ar.flatten.each {|e|
93
+ if e.is_a?(Hash)
94
+ data = symbol_to_str(e)
95
+ attr.update(data)
96
+ elsif e.nil?
97
+ # do nothing
98
+ else
99
+ nar << e
100
+ end
101
+ }
102
+
103
+ return Elem.new(name, attr, @children, *nar)
104
+ end
105
+
106
+ private
107
+
108
+ def symbol_to_str(sdata)
109
+ data = {}
110
+ sdata.each {|k, v|
111
+ data[k.to_s] = v.to_s
112
+ }
113
+ return data
114
+ end
115
+ end
116
+ end
117
+
118
+ if $0 == __FILE__
119
+ require 'qwik/testunit'
120
+ require 'qwik/htree-format-xml'
121
+ require 'qwik/htree-generator'
122
+ $test = true
123
+ end
124
+
125
+ if defined?($test) && $test
126
+ class TestHTreeTemplate < Test::Unit::TestCase
127
+ def ok(e, s)
128
+ ok_eq(e, s.format_xml)
129
+ end
130
+
131
+ def test_all
132
+ g = HTree::Generator.new
133
+
134
+ # test_symbol_to_str
135
+ HTree::Elem.instance_eval {
136
+ public :symbol_to_str
137
+ }
138
+ ok_eq({'t'=>'s'}, g.a.symbol_to_str({:t => 's'}))
139
+
140
+ # test_apply
141
+ org = HTree("<p><div id='a'/><div id='b'/></p>")
142
+ data = {}
143
+ data[:a] = 'a'
144
+ data[:b] = g.b
145
+ h = org.apply(data)
146
+ ok("<p><div id=\"a\">a</div><div id=\"b\"><b/></div></p>", h)
147
+
148
+ data = {}
149
+ data[:a] = nil
150
+ data[:b] = HTree::Attr.new(:action => 'd.html')
151
+ h = org.apply(data)
152
+ ok("<p><div action=\"d.html\" id=\"b\"></div></p>", h)
153
+
154
+ data = {}
155
+ data[:a] = [['a', g.hr]] # OK.
156
+ data[:b] = nil
157
+ h = org.apply(data)
158
+ ok("<p><div id=\"a\">a<hr/></div></p>", h)
159
+
160
+ # test_each_tag
161
+ org = HTree("<a><b><c/><d/><c/></b></a>")
162
+ ok("<a><b><c/><d/><c/></b></a>", org)
163
+ xml = org.each_tag('c'){|e| nil }
164
+ ok("<a><b><d/></b></a>", xml)
165
+ xml = org.each_tag('c'){|e| e }
166
+ ok("<a><b><c/><d/><c/></b></a>", xml)
167
+ xml = org.each_tag('c'){|e| HTree::Elem.new('cc') }
168
+ ok("<a><b><cc/><d/><cc/></b></a>", xml)
169
+ xml = org.each_tag('c'){|e| g.dd }
170
+ ok("<a><b><dd/><d/><dd/></b></a>", xml)
171
+ xml = org.each_tag('c'){|e| e.clone_with('test1') }
172
+ ok("<a><b><c>test1</c><d/><c>test1</c></b></a>", xml)
173
+
174
+ # test_set_attr
175
+ e = g.a(:href => 't.html'){'t'}
176
+ ok("<a href=\"t.html\">t</a>", e)
177
+ e = e.clone_with('href' => 's.html')
178
+ ok("<a href=\"s.html\">t</a>", e)
179
+ e = e.clone_with('s')
180
+ ok("<a href=\"s.html\">ts</a>", e)
181
+
182
+ # test_textarea
183
+ org = HTree("<textarea></textarea>")
184
+ htree = org.replace('textarea'){|e|
185
+ e.clone_with('text')
186
+ }
187
+ ok("<textarea>text</textarea>", htree)
188
+ org = HTree("<textarea id='contents'></textarea>")
189
+ data = {}
190
+ data[:contents] = 'text'
191
+ htree = org.apply(data)
192
+ ok("<textarea id=\"contents\">text</textarea>", htree)
193
+
194
+ # test_html_tags
195
+ h = HTree("<a>")
196
+ ok_eq(['a', "{http://www.w3.org/1999/xhtml}a"], h.html_tags('a'))
197
+ ok_eq(['a', "{http://www.w3.org/1999/xhtml}a", 'b', "{http://www.w3.org/1999/xhtml}b"], h.html_tags('a', 'b'))
198
+
199
+ # test_clone
200
+ h = HTree("<a href='1.html'>t</a>")
201
+ e = h.children[0]
202
+ xml = e.clone_with('test1')
203
+ ok("<a href=\"1.html\">ttest1</a>", xml)
204
+ xml = e.clone_with('href'=>'n.html')
205
+ ok("<a href=\"n.html\">t</a>", xml)
206
+ end
207
+
208
+ def test_replace
209
+ g = HTree::Generator.new
210
+
211
+ h = HTree("<a><b/><c/></a>")
212
+
213
+ h2 = h.replace {|e| e.name == 'c' ? 'text' : e } # insert a text
214
+ ok("<a><b/>text</a>", h2)
215
+
216
+ h2 = h.replace('nosuch') {|e| nil } # no effect
217
+ ok("<a><b/><c/></a>", h2)
218
+
219
+ h2 = h.replace('b') {|e| e } # no effect
220
+ ok("<a><b/><c/></a>", h2)
221
+
222
+ h2 = h.replace('b') {|e| nil } # delete it
223
+ ok("<a><c/></a>", h2)
224
+
225
+ h2 = h.replace('b') {|e| 'text' } # insert a text
226
+ ok("<a>text<c/></a>", h2)
227
+
228
+ h2 = h.replace('b') {|e| g.d } # insert a element
229
+ ok("<a><d/><c/></a>", h2)
230
+
231
+ h2 = h.replace('b') {|e| g.d{'text'} } # insert a element with text
232
+ ok("<a><d>text</d><c/></a>", h2)
233
+
234
+ h = HTree("<p><span id='a'/><span id='b'/></p>")
235
+
236
+ h2 = h.replace('span'){|e| e.get_attr('id') } # insert the id as text
237
+ ok("<p>ab</p>", h2)
238
+
239
+ h2 = h.replace('span'){|e| e.get_attr('id') == 'b' ? e : nil }
240
+ ok('<p><span id='b'/></p>', h2)
241
+
242
+ h = HTree("<h2/><h3/><h4/><h5/><h6/>")
243
+
244
+ h2 = h.replace('h3', 'h4') {|e| g.make(e.name){ e.name } } # insert a text
245
+ ok("<h2/><h3>h3</h3><h4>h4</h4><h5/><h6/>", h2)
246
+
247
+ h2 = h.replace {|e| e.name == 'h5' ? 'text' : e } # insert a text
248
+ ok("<h2/><h3/><h4/>text<h6/>", h2)
249
+
250
+ h2 = h.replace('h4') {|e| [g.h3{'h'}, g.hr] } #
251
+ ok("<h2/><h3/><h3>h</h3><hr/><h5/><h6/>", h2)
252
+
253
+ h = HTree("<span></span>")
254
+ h2 = h.each_tag('span'){|e| [g.h3{'h'}, g.hr] }
255
+ ok("<h3>h</h3><hr/>", h2)
256
+
257
+ h2 = h.each_tag('span'){|e|
258
+ [g.h3{'h3'}, g.ul{g.li{g.a('href'=>'1.html'){'1'}}}]
259
+ }
260
+ ok("<h3>h3</h3><ul><li><a href=\"1.html\">1</a></li></ul>", h2)
261
+ end
262
+ end
263
+ end
@@ -0,0 +1,171 @@
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 << 'compat' unless $LOAD_PATH.include? 'compat'
6
+ #require 'htree'
7
+
8
+ $LOAD_PATH.unshift '..' unless $LOAD_PATH.include? '..'
9
+
10
+ module HTree
11
+ class Doc
12
+ def to_wabisabi
13
+ return children.map {|child|
14
+ child.to_wabisabi
15
+ }
16
+ end
17
+ end
18
+
19
+ class XMLDecl
20
+ def to_wabisabi
21
+ w = [:'?xml']
22
+ w << @version
23
+ w << @encoding if @encoding
24
+ w << @standalone ? 'yes' : 'no' if @standalone
25
+ return w
26
+ end
27
+ end
28
+
29
+ class DocType
30
+ def to_wabisabi
31
+ w = [:'!DOCTYPE']
32
+ w << root_element_name
33
+ w << 'PUBLIC'
34
+ w << public_identifier
35
+ w << system_identifier
36
+ return w
37
+ end
38
+ end
39
+
40
+ module Node
41
+ def to_wabisabi
42
+ ar = []
43
+
44
+ element_name = name.sub('{http://www.w3.org/1999/xhtml}', '').intern
45
+ ar << element_name
46
+
47
+ if 0 < attributes.length
48
+ h = {}
49
+ attributes.each {|k, v|
50
+ h[k.to_s.intern] = v.to_s
51
+ }
52
+ ar << h
53
+ end
54
+
55
+ children.each {|h|
56
+ case h
57
+ when Elem, Text, Comment, BogusETag
58
+ ar << h.to_wabisabi
59
+ else
60
+ p 'what?', h
61
+ end
62
+ }
63
+
64
+ return ar
65
+ end
66
+ end
67
+
68
+ class Text
69
+ def to_wabisabi
70
+ return to_s
71
+ end
72
+ end
73
+
74
+ class Comment
75
+ def to_wabisabi
76
+ return [:'!--', @content]
77
+ end
78
+ end
79
+
80
+ class BogusETag
81
+ def to_wabisabi
82
+ return ''
83
+ end
84
+ end
85
+ end
86
+
87
+ if $0 == __FILE__
88
+ require 'qwik/testunit'
89
+ $test = true
90
+ end
91
+
92
+ if defined?($test) && $test
93
+ class TestHTreeToWabisabi < Test::Unit::TestCase
94
+ def ok_ht(e, str)
95
+ ok_eq(e, HTree(str).to_wabisabi)
96
+ end
97
+
98
+ def ok(e, htree)
99
+ ok_eq(e, htree.to_wabisabi)
100
+ end
101
+
102
+ def test_doc
103
+ ok([[:'!DOCTYPE', 'html', 'PUBLIC',
104
+ '-//W3C//DTD html 4.01 Transitional//EN',
105
+ 'http://www.w3.org/TR/html4/loose.dtd'],
106
+ [:html, [:head, [:title, 't']], [:body, [:p, 'b']]]],
107
+ HTree('<!DOCTYPE HTML PUBLIC "-//W3C//DTD html 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><title>t</title></head><body><p>b</p></body></html>'))
108
+
109
+ e = HTree::Elem.new('a')
110
+ doc = HTree::Doc.new(e)
111
+ ok_eq('#<HTree::Doc {emptyelem <a>}>', doc.inspect)
112
+ ok([[:a]], doc)
113
+ end
114
+
115
+ def test_xmldecl
116
+ ok_ht([[:'?xml', '1.0', 'utf-8']],
117
+ '<?xml version="1.0" encoding="utf-8"?>')
118
+
119
+ e = HTree::XMLDecl.new('1.0', 'utf-8')
120
+ ok_eq('{xmldecl }', e.inspect)
121
+ ok([:'?xml', '1.0', 'utf-8'], e)
122
+ end
123
+
124
+ def test_doctype
125
+ ok_ht([[:'!DOCTYPE', 'html', 'PUBLIC',
126
+ '-//W3C//DTD html 4.01 Transitional//EN',
127
+ 'http://www.w3.org/TR/html4/loose.dtd']],
128
+ '<!DOCTYPE HTML PUBLIC "-//W3C//DTD html 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">')
129
+
130
+ e = HTree::DocType.new('HTML', '-//W3C//DTD html 4.01 Transitional//EN',
131
+ 'http://www.w3.org/TR/html4/loose.dtd')
132
+ # ok_eq('{doctype <!DOCTYPE HTML PUBLIC "-//W3C//DTD html 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">}', e.inspect)
133
+ ok_eq("PUBLIC \"-//W3C//DTD html 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\"", e.generate_content)
134
+ ok([:'!DOCTYPE', 'HTML', 'PUBLIC',
135
+ '-//W3C//DTD html 4.01 Transitional//EN',
136
+ 'http://www.w3.org/TR/html4/loose.dtd'], e)
137
+ end
138
+
139
+ def test_node
140
+ ok_ht([[:a]], '<a/>')
141
+ ok_ht([[:a]], '<a></a>')
142
+ ok_ht([[:a, [:b]]], '<a><b/></a>')
143
+ ok_ht([[:a, {:href=>'foo.html'}]], "<a href='foo.html'></a>")
144
+
145
+ e = HTree::Elem.new('a')
146
+ ok([:a], e) # test_elem
147
+ e = HTree::Elem.new('b', e) # test_elem_with_elem
148
+ ok([:b, [:a]], e)
149
+ e = HTree::Elem.new('a', {'href'=>'foo.html'}) # test_elem_with_attr
150
+ ok([:a, {:href=>'foo.html'}], e)
151
+ end
152
+
153
+ def test_text
154
+ ok_ht(['a'], 'a')
155
+ e = HTree::Text.new('a')
156
+ ok('a', e)
157
+ end
158
+
159
+ def test_comment
160
+ ok_ht([[:'!--', 'c']], '<!--c-->')
161
+ e = HTree::Comment.new('a')
162
+ ok_eq('a', e.content)
163
+ ok([:'!--', 'a'], e)
164
+ end
165
+
166
+ def test_bogustag
167
+ ok([[:p, 't']], HTree('<p>t</p>'))
168
+ ok([[:p, 't'], ''], HTree('<p>t</p></p>'))
169
+ end
170
+ end
171
+ end