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,56 @@
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
+ class CSS
8
+ INHIBIT_PATTERN = %w(
9
+ @i
10
+ \\
11
+ javascript
12
+ vbscript
13
+ cookie
14
+ eval
15
+ expression
16
+ behavior
17
+ behaviour
18
+ binding
19
+ include-source
20
+ )
21
+
22
+ def self.valid?(str)
23
+ INHIBIT_PATTERN.each {|c|
24
+ return false if str.include?(c)
25
+ }
26
+ return true
27
+ end
28
+ end
29
+
30
+ if $0 == __FILE__
31
+ require 'test/unit'
32
+ $test = true
33
+ end
34
+
35
+ if defined?($test) && $test
36
+ class TestCSS < Test::Unit::TestCase
37
+ def valid(s)
38
+ assert_equal true, CSS.valid?(s)
39
+ end
40
+
41
+ def invalid(s)
42
+ assert_equal false, CSS.valid?(s)
43
+ end
44
+
45
+ def test_all
46
+ valid 'h2 { color: red }'
47
+ invalid "@import"
48
+ invalid "\\important"
49
+ valid ''
50
+ valid 'text-align:center;'
51
+ valid 'ok@style'
52
+ valid 'ok.style'
53
+ invalid '@i'
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,113 @@
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
+ class CSVTokenizer
6
+ def self.csv_split(source)
7
+ status = :IN_FIELD
8
+ csv = []
9
+ last = ''
10
+ csv << last
11
+
12
+ while !source.empty?
13
+ case status
14
+
15
+ when :IN_FIELD
16
+ case source
17
+ when /\A'/
18
+ source = $'
19
+ last << "'"
20
+ status = :IN_QFIELD
21
+ when /\A,/
22
+ source = $'
23
+ last = ''
24
+ csv << last
25
+ when /\A(\\)/
26
+ source = $'
27
+ when /\A([^,'\\]*)/ # anything else
28
+ source = $'
29
+ last << $1
30
+ end
31
+
32
+ when :IN_QFIELD
33
+ case source
34
+ when /\A'/
35
+ source = $'
36
+ last << "'"
37
+ status = :IN_FIELD
38
+ when /\A(\\)/
39
+ source = $'
40
+ last << $1
41
+ status = :IN_ESCAPE
42
+ when /\A([^'\\]*)/ # anything else
43
+ source = $'
44
+ last << $1
45
+ end
46
+
47
+ when :IN_ESCAPE
48
+ if /\A(.)/ =~ source
49
+ source = $'
50
+ last << $1
51
+ end
52
+ status = :IN_QFIELD
53
+
54
+ end
55
+ end
56
+
57
+ csv = csv.map {|a|
58
+ a.strip
59
+ }
60
+
61
+ csv
62
+ end
63
+ end
64
+
65
+ if $0 == __FILE__
66
+ require 'test/unit'
67
+ $test = true
68
+ end
69
+
70
+ if defined?($test) && $test
71
+ class TestCSVTokenizer < Test::Unit::TestCase
72
+ def ok(e, s)
73
+ assert_equal e, CSVTokenizer.csv_split(s)
74
+ end
75
+
76
+ def test_csv
77
+ # test basic
78
+ ok(['1'], '1')
79
+ ok(['1', ''], '1,')
80
+ ok(['1', '2'], '1,2')
81
+ ok(['1', '', '3'], '1,,3')
82
+
83
+ # test from plugin
84
+ ok(['a', 'b'], 'a,b')
85
+ ok(["'a'", 'b'], "'a',b")
86
+ ok(['a', 'b'], 'a, b')
87
+ ok(['a', '', 'b'], 'a,,b')
88
+
89
+ # test space
90
+ ok(['1'], ' 1')
91
+ ok(['1'], '1 ')
92
+ ok(['1', '2'], '1, 2')
93
+ ok(['1', '2'], "1,\n2")
94
+ ok(['1', '2'], "1,\t2")
95
+ ok(['1', '2'], "1,\\2")
96
+
97
+ # test escape
98
+ ok(["\"1\"\""], '"1""')
99
+
100
+ # test IN_QFIELD
101
+ ok(["'1'"], "'1'")
102
+ ok(["'1 '"], "'1 '")
103
+ ok(["'1,2'"], "'1,2'")
104
+ ok(["\"1\""], "\"1\"")
105
+ ok(["\"1\"", "\"2\""], "\"1\",\"2\"")
106
+ ok(["\"1", "2\""], '"1,2"')
107
+
108
+ # test with space
109
+ ok(["'a b'"], "'a b'")
110
+ ok(['a b'], 'a b')
111
+ end
112
+ end
113
+ end
@@ -0,0 +1,112 @@
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
+ # Thanks to Mr. Shuhei Yamamoto
6
+
7
+ $LOAD_PATH.unshift '..' unless $LOAD_PATH.include? '..'
8
+ require 'qwik/util-string'
9
+ require 'qwik/util-charset'
10
+
11
+ module Qwik
12
+ class Filename
13
+ def self.encode(str)
14
+ str = str.to_filename_charset
15
+ str = str.gsub(/\342\200\276/n) {
16
+ '~'
17
+ }
18
+ str = str.gsub(/([^ 0-9A-Za-z_.\/-]+)/n) {
19
+ '=' + $1.unpack('H2' * $1.size).join('=').upcase
20
+ }
21
+ return str
22
+ end
23
+
24
+ def self.decode(str)
25
+ str = str.gsub(/((?:=[0-9a-fA-F]{2})+)/n) {
26
+ [$1.delete('=')].pack('H*')
27
+ }
28
+ str = str.to_filename_charset
29
+ return str
30
+ end
31
+
32
+ def self.contain_multibyte?(filename)
33
+ filename.each_byte {|byte|
34
+ if 0x7f < byte || byte == ?\e
35
+ return true
36
+ end
37
+ }
38
+ return false
39
+ end
40
+
41
+ def self.extname(filename)
42
+ return File.extname(filename).sub(/\A\./, '')
43
+ end
44
+
45
+ ALLOWABLE_CHARACTERS_FOR_PATH_RE = /\A[\/ 0-9A-Za-z_.-]+\z/
46
+
47
+ def self.allowable_characters_for_path?(f)
48
+ return true if ALLOWABLE_CHARACTERS_FOR_PATH_RE =~ f
49
+ return false
50
+ end
51
+
52
+ private
53
+
54
+ ALLOWABLE_CHARACTERS_RE = /\A[ 0-9A-Za-z_.-]+\z/
55
+
56
+ def self.allowable_characters?(f)
57
+ return true if ALLOWABLE_CHARACTERS_RE =~ f
58
+ return false
59
+ end
60
+ end
61
+ end
62
+
63
+ if $0 == __FILE__
64
+ require 'qwik/test-common'
65
+ $test = true
66
+ end
67
+
68
+ if defined?($test) && $test
69
+ class TestFilename < Test::Unit::TestCase
70
+ include TestSession
71
+
72
+ def test_all
73
+ c = Qwik::Filename
74
+
75
+ # test_encode
76
+ ok_eq('t', c.encode('t'))
77
+ ok_eq(' ', c.encode(' '))
78
+ ok_eq('=E3=81=82', c.encode("��"))
79
+ ok_eq('=E3=81=82', c.encode("\202\240"))
80
+ ok_eq('=E3=81=82.txt', c.encode("\202\240.txt"))
81
+
82
+ # test_bug
83
+ ok_eq('=7E', c.encode('~'))
84
+ ok_eq('=7E', c.encode('~'.set_sjis))
85
+
86
+ # test_decode
87
+ ok_eq('t', c.decode('t'))
88
+ ok_eq(' ', c.decode(' '))
89
+ ok_eq("\343\201\202", c.decode('=E3=81=82'))
90
+ ok_eq("\343\201\202.txt", c.decode('=E3=81=82.txt'))
91
+
92
+ # test_contain_multibyte?
93
+ ok_eq(false, c.contain_multibyte?('t'))
94
+ ok_eq(false, c.contain_multibyte?('t t'))
95
+ ok_eq(true, c.contain_multibyte?("\202\240"))
96
+
97
+ # test_allowable_characters?
98
+ ok_eq(true, c.allowable_characters?('t'))
99
+ ok_eq(true, c.allowable_characters?('t t'))
100
+ ok_eq(true, c.allowable_characters?('t.-_t'))
101
+ ok_eq(true, c.allowable_characters?('t..t'))
102
+ ok_eq(false, c.allowable_characters?("\202\240"))
103
+ ok_eq(false, c.allowable_characters?('t/t'))
104
+
105
+ # test_allowable_characters_for_path?
106
+ ok_eq(true, c.allowable_characters_for_path?('t/t'))
107
+
108
+ # test_extname
109
+ ok_eq('txt', c.extname('t.txt'))
110
+ end
111
+ end
112
+ end
@@ -0,0 +1,202 @@
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 'pathname'
6
+
7
+ $LOAD_PATH.unshift '..' unless $LOAD_PATH.include? '..'
8
+
9
+ class String
10
+ def path
11
+ return Pathname.new(self)
12
+ end
13
+ end
14
+
15
+ class Pathname
16
+ def path
17
+ return self
18
+ end
19
+
20
+ # /cygdrive/c -> c:
21
+ def to_win_dir
22
+ return self.to_s.sub(%r!\A/cygdrive/(\w)!) {|a| $1+':' }
23
+ end
24
+
25
+ def ext
26
+ return (self.extname.to_s).sub(/\A\./, '')
27
+ end
28
+
29
+ def write(str)
30
+ return self.open('wb') {|f| f.print str }
31
+ end
32
+ alias put write
33
+
34
+ def append(str)
35
+ return self.open('ab') {|f| f.print str }
36
+ end
37
+ alias add append
38
+
39
+ def get_first
40
+ return self.open('rb') {|f| f.gets }
41
+ end
42
+
43
+ def check_directory
44
+ if self.exist?
45
+ if ! self.directory?
46
+ raise "#{self} is not directory. failed."
47
+ end
48
+ return # The directory is already exist.
49
+ end
50
+ self.mkpath
51
+ end
52
+
53
+ def erase_all
54
+ self.each_entry {|file|
55
+ base = file.to_s
56
+ next if base == '.' || base == '..'
57
+ f = self + file
58
+ if f.directory?
59
+ f.erase_all
60
+ next
61
+ end
62
+ if f.exist?
63
+ f.unlink
64
+ end
65
+ }
66
+ end
67
+
68
+ def remove_directory
69
+ if self.exist?
70
+ if self.directory?
71
+ self.rmtree
72
+ self.rmdir if self.directory?
73
+ else
74
+ raise "#{self} is not directory. failed."
75
+ end
76
+ end
77
+ end
78
+ end
79
+
80
+ if $0 == __FILE__
81
+ require 'qwik/testunit'
82
+ require 'qwik/test-module-path'
83
+ $test = true
84
+ end
85
+
86
+ if defined?($test) && $test
87
+ class TestUtilPathname < Test::Unit::TestCase
88
+ def test_all
89
+ # test_string_path
90
+ assert_instance_of Pathname, 't'.path
91
+ assert_equal 't', 't'.path.to_s
92
+
93
+ # test_path_path
94
+ assert_instance_of Pathname, 't'.path.path
95
+
96
+ # test_to_win_dir
97
+ assert_equal 'c:/t', '/cygdrive/c/t'.path.to_win_dir
98
+
99
+ # test_extname
100
+ assert_equal '', 't'.path.extname
101
+ assert_equal '.txt', 't.txt'.path.extname
102
+ assert_equal '.gz', 't.tar.gz'.path.extname
103
+
104
+ # test_ext
105
+ assert_equal 'txt', 't.txt'.path.ext
106
+ assert_equal 'gz', 't.tar.gz'.path.ext
107
+
108
+ # test_write
109
+ 'test.txt'.path.write('t')
110
+
111
+ # test_read
112
+ assert_equal 't', 'test.txt'.path.read
113
+
114
+ # test_append
115
+ 'test.txt'.path.append('t')
116
+ assert_equal 'tt', 'test.txt'.path.read
117
+
118
+ # test_get_first
119
+ 'test.txt'.path.write("s\nt\n")
120
+ assert_equal "s\nt\n", 'test.txt'.path.read
121
+ assert_equal "s\n", 'test.txt'.path.get_first
122
+
123
+ # teardown
124
+ assert_equal true, 'test.txt'.path.exist?
125
+ 'test.txt'.path.unlink
126
+ assert_equal false, 'test.txt'.path.exist?
127
+ end
128
+
129
+ def test_check_directory
130
+ return if $0 != __FILE__ # Only for unit test.
131
+
132
+ dir = 'testdir'.path
133
+ dir.erase_all if dir.exist?
134
+ dir.rmtree if dir.exist?
135
+ dir.rmdir if dir.exist?
136
+ assert_equal false, dir.exist?
137
+
138
+ dir.check_directory
139
+ assert_equal true, dir.exist?
140
+
141
+ dir.check_directory # Check again cause no error.
142
+ assert_equal true, dir.exist?
143
+
144
+ dir.erase_all
145
+ dir.rmdir
146
+ assert_equal false, dir.exist?
147
+ end
148
+
149
+ def test_check_directory_raise
150
+ return if $0 != __FILE__ # Only for unit test.
151
+
152
+ # Make a plain text file.
153
+ file = 't.txt'.path
154
+ file.write('t')
155
+
156
+ # Try to create a directory with the same name cause exception.
157
+ assert_raise(RuntimeError) {
158
+ file.check_directory
159
+ }
160
+ file.unlink
161
+ end
162
+
163
+ def test_erase_all
164
+ dir = 'testdir'.path
165
+ dir.check_directory # mkdir
166
+
167
+ file = 'testdir/t.txt'.path # Create a dummy file.
168
+ file.write('t')
169
+ assert_equal true, file.exist?
170
+
171
+ dir.erase_all
172
+ assert_equal false, file.exist? # The file is deleted.
173
+ assert_equal true, dir.exist? # But the directory is remained here.
174
+
175
+ dir.rmdir
176
+ assert_equal false, dir.exist?
177
+ end
178
+
179
+ def test_check_pathname
180
+ dir = 'testdir'.path
181
+ dir.rmtree if dir.exist?
182
+ dir.rmdir if dir.exist?
183
+
184
+ dir.mkdir
185
+ assert_equal true, dir.exist?
186
+
187
+ file = dir+'t'
188
+ file.write('test string')
189
+ assert_equal true, file.exist?
190
+ dir.rmtree
191
+ assert_equal false, dir.exist?
192
+ end
193
+
194
+ def test_chdir
195
+ pwd = Dir.pwd
196
+ Dir.chdir('/') {
197
+ assert_not_equal(pwd, Dir.pwd)
198
+ }
199
+ assert_equal pwd, Dir.pwd
200
+ end
201
+ end
202
+ end