qwikdoc 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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,42 @@
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
+ module Qwik
8
+ class Action
9
+ def ext_md5
10
+ c_require_page_exist
11
+ c_set_status
12
+ c_set_no_cache
13
+ c_set_contenttype('text/plain')
14
+ c_set_body(@site[@req.base].get.md5hex)
15
+ end
16
+ end
17
+ end
18
+
19
+ if $0 == __FILE__
20
+ require 'qwik/test-common'
21
+ $test = true
22
+ end
23
+
24
+ if defined?($test) && $test
25
+ class TestActMD5 < Test::Unit::TestCase
26
+ include TestSession
27
+
28
+ def test_all
29
+ t_add_user
30
+
31
+ page = @site.create_new
32
+
33
+ page.store ''
34
+ res = session '/test/1.md5'
35
+ eq 'd41d8cd98f00b204e9800998ecf8427e', res.body
36
+
37
+ page.store '*t'
38
+ res = session '/test/1.md5'
39
+ eq '713c3323a56a1024e3638a96c031cf91', res.body
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,741 @@
1
+ # -*- coding: shift_jis -*-
2
+ # Copyright (C) 2003-2006 Kouichirou Eto, All rights reserved.
3
+ # This is free software with ABSOLUTELY NO WARRANTY.
4
+ # You can redistribute it and/or modify it under the terms of the GNU GPL 2.
5
+
6
+ # special mode for modulobe.com
7
+
8
+ $LOAD_PATH.unshift '..' unless $LOAD_PATH.include? '..'
9
+ require 'qwik/modulobe'
10
+ require 'qwik/act-metadata'
11
+ require 'qwik/act-files'
12
+
13
+ module Qwik
14
+ class Action
15
+ # ============================== model
16
+ MODULOBE_MODEL_STYLE = '
17
+
18
+ /* ==================== modulobe model */
19
+ div.modulobe_model {
20
+ margin: 1em 0;
21
+ padding: 10px;
22
+ border: 1px solid #999;
23
+ background-color: #fff;
24
+ }
25
+
26
+ div.modulobe_model table {
27
+ margin: 0;
28
+ width: 100%;
29
+ border: 0;
30
+ }
31
+
32
+ div.modulobe_model td {
33
+ margin: 0;
34
+ padding: 0;
35
+ border: 0;
36
+ line-height: 1.0;
37
+ }
38
+
39
+ div.modulobe_model td.img {
40
+ margin: 0;
41
+ border: 0;
42
+ text-align: center;
43
+ }
44
+
45
+ div.modulobe_model td.img a {
46
+ text-decoration: none;
47
+ border-bottom: 0;
48
+ }
49
+
50
+ div.modulobe_model td.img img {
51
+ border: 0;
52
+ }
53
+
54
+ div.modulobe_model td.desc {
55
+ border: 0;
56
+ }
57
+
58
+ div.modulobe_model td.desc h3 {
59
+ border-bottom: 0;
60
+ margin: 0;
61
+ padding: 0;
62
+ left: 0;
63
+ color: #393;
64
+ }
65
+
66
+ div.modulobe_model td.desc p {
67
+ margin: 0;
68
+ padding: 0;
69
+ line-height: 1.33;
70
+ }
71
+
72
+ div.modulobe_model td.desc strong {
73
+ color: #060;
74
+ font-weight: normal;
75
+ }
76
+
77
+ '
78
+
79
+ def plg_modulobe_model(model)
80
+ div = [:div, {:class=>'modulobe_model'}]
81
+
82
+ # image
83
+ files = @site.files(@req.base)
84
+ file = files.path(model)
85
+
86
+ return [:div, 'No file exist.'] if ! file.exist?
87
+ model = Modulobe::ModelFile.new(file)
88
+
89
+ href, url, img = model.prepare_link(self, "#{@req.base}.files")
90
+
91
+ # description
92
+ content = yield
93
+ #tokens = c_tokenize(content)
94
+ tokens = TextTokenizer.tokenize(content)
95
+
96
+ author = 'anonymous'
97
+ title = 'no title'
98
+ comment = 'no comment'
99
+ tokens.each {|token|
100
+ if token[0] == :dl
101
+ author = token[2] if token[1] == 'author'
102
+ title = token[2] if token[1] == 'title'
103
+ comment = token[2] if token[1] == 'comment'
104
+ end
105
+ }
106
+
107
+ comment.gsub!(/\\n/, "\n")
108
+ comment = c_res(comment)
109
+
110
+ desc = [[:h3, [:a, {:href=>href}, title]],
111
+ [:p, _('Author'), ': ', [:strong, author]],
112
+ [:p, comment]]
113
+
114
+ table = [:table, [:tr,
115
+ [:td, {:class=>'img'}, img],
116
+ [:td, {:class=>'desc'}, desc]]]
117
+
118
+ div << table
119
+
120
+ if ! defined?(@modulobe_model_style)
121
+ @modulobe_model_style = true
122
+ div << [:style, MODULOBE_MODEL_STYLE]
123
+ end
124
+
125
+ return div
126
+ end
127
+
128
+ # ============================== list
129
+ def plg_modulobe_model_list
130
+ pagename = @req.base
131
+ page = @site[pagename]
132
+ return if page.nil?
133
+
134
+ files = @site.files(pagename)
135
+ page.cache[:modellist] ||= Modulobe::ModelList.new(files)
136
+ modellist = page.cache[:modellist]
137
+ return if modellist.empty?
138
+
139
+ div = [:div, {:class=>'files'}]
140
+ path = c_relative_to_root(pagename+'.files')
141
+ div << modellist.get_table(self, path)
142
+ div << modellist.get_style
143
+ return div
144
+ end
145
+
146
+ # ============================== rss
147
+ # Called from act-metadata.rb
148
+ def metadata_model_xml
149
+ # Check pages that has .mdlb file.
150
+ page_keys = Hash.new(0)
151
+ @site.each {|page|
152
+ files = @site.files(page.key)
153
+ files.each {|filename|
154
+ if /\.mdlb\z/ =~ filename
155
+ page_keys[page.key] += 1
156
+ end
157
+ }
158
+ }
159
+
160
+ # Collect model files and check last_time.
161
+ last_time = nil
162
+ models = []
163
+ page_keys.keys.sort.each {|key|
164
+ page = @site[key]
165
+ str = page.load
166
+ tokens = TextTokenizer.tokenize(str)
167
+ tokens.each {|token|
168
+ if token[0] == :plugin && token[1] == 'modulobe_model'
169
+ filename = token[2]
170
+ files = @site.files(page.key)
171
+ file = files.path(filename)
172
+ mtime = file.mtime
173
+ last_time = mtime if last_time.nil? || last_time < mtime
174
+
175
+ content = token[3]
176
+ content_tokens = TextTokenizer.tokenize(content)
177
+ title = author = comment = nil
178
+ content_tokens.each {|ctoken|
179
+ next if ctoken[0] != :dl
180
+ title = ctoken[2] if ctoken[1] == 'title'
181
+ author = ctoken[2] if ctoken[1] == 'author'
182
+ comment = ctoken[2] if ctoken[1] == 'comment'
183
+ }
184
+
185
+ title ||= 'no title'
186
+ author ||= 'no name'
187
+ comment ||= 'no comment'
188
+ models << [mtime, page, file, title, author, comment]
189
+ end
190
+ }
191
+ }
192
+
193
+ xml = []
194
+ xml << [:'?xml', '1.0', 'utf-8']
195
+ rss = [:rss, {:version=>'2.0', :'xmlns:creativeCommons'=>
196
+ 'http://backend.userland.com/creativeCommonsRssModule'}]
197
+
198
+ top_url = c_relative_to_absolute('/')
199
+ channel = [:channel,
200
+ [:title, 'Modulobe model gallery'],
201
+ [:link, top_url],
202
+ [:description, 'This is a model list of Modulobe Wiki.'],
203
+ [:language, 'ja'],
204
+ [:managingEditor, 'modulobe@qwik.jp'],
205
+ [:webMaster, 'modulobe@qwik.jp'],
206
+ [:lastBuildDate, last_time.rfc1123_date],
207
+ [:ttl, '60']]
208
+
209
+ models.sort.each {|mtime, page, file, title, author, comment|
210
+ basename = file.basename
211
+ url = c_relative_to_absolute(page.key+'.files/'+basename)
212
+
213
+ # Check thumb is exist.
214
+ thumb_file = file.dirname+'.thumb'+(file.basename('.mdlb').to_s+'.gif')
215
+ if ! thumb_file.exist?
216
+ # make it.
217
+ end
218
+
219
+ thumb = page.key+'.files/.thumb/'+file.basename('.mdlb').to_s+'.gif'
220
+ thumb_url = c_relative_to_absolute(thumb)
221
+ html = "<p><img src=\"#{thumb_url}\" alt=\"#{title}\" width=\"100\" height=\"75\"/><p>#{comment}</p>"
222
+
223
+ length = file.size
224
+
225
+ item = [:item,
226
+ [:title, title],
227
+ [:link, url],
228
+ [:description, html],
229
+ [:author, author],
230
+ [:pubDate, mtime.rfc1123_date],
231
+ [:enclosure,
232
+ {:url=>url, :length=>length, :type=>'application/xml'}],
233
+ [:'creativeCommons:license',
234
+ 'http://creativecommons.org/licenses/by/2.1/jp/']]
235
+ channel << item
236
+ }
237
+
238
+ rss << channel
239
+ xml << rss
240
+
241
+ return xml
242
+ end
243
+
244
+ def pre_ext_mdlbrss
245
+ xml = []
246
+ xml << [:'?xml', '1.0', 'utf-8']
247
+ rss = [:rss, {:version=>'2.0'}]
248
+
249
+ moved_url = c_relative_to_absolute('/model.xml')
250
+ channel = [:channel,
251
+ [:title, 'moved'],
252
+ [:link, moved_url],
253
+ [:description, 'moved.'],
254
+ [:lastBuildDate, Time.at(0).rfc1123_date],
255
+ [:ttl, '60']]
256
+
257
+ item = [:item,
258
+ [:title, 'moved'],
259
+ [:link, moved_url],
260
+ [:description, 'moved'],
261
+ [:pubDate, Time.at(0).rfc1123_date]]
262
+ channel << item
263
+
264
+ rss << channel
265
+
266
+ xml << rss
267
+
268
+ @res['Content-Type'] = 'application/xml'
269
+ @res.body = xml
270
+ @res.body = @res.body.format_xml.page_to_xml if ! @config.test
271
+ return nil
272
+ end
273
+
274
+ # ============================== upload
275
+ def plg_modulobe_files_form(pagename=nil)
276
+ base = @req.base
277
+ base = pagename if pagename
278
+ ar = []
279
+ ar << [:style, '
280
+ div.modulobe_uploader {
281
+ margin: 10px 0;
282
+ padding: 10px;
283
+ border: 1px solid #ccc;
284
+ background-color: #fff;
285
+ }
286
+ div.modulobe_uploader table {
287
+ margin: 0;
288
+ padding: 0;
289
+ border: 0;
290
+ width: 100%;
291
+ }
292
+ div.modulobe_uploader td,
293
+ div.modulobe_uploader th {
294
+ margin: 0;
295
+ padding: 2px 10px;
296
+ border: 0;
297
+ }
298
+ div.modulobe_uploader th {
299
+ text-align: right;
300
+ }
301
+ div.modulobe_uploader td input {
302
+ font-size: small;
303
+ }
304
+ ']
305
+ ar << [:div, {:class=>'modulobe_uploader'},
306
+ [:form, {:method=>'POST', :action=>base+'.modulobe_files_upload',
307
+ :enctype=>'multipart/form-data'},
308
+ [:table,
309
+ [:tr, [:th, _('Model file'), ' : '],
310
+ [:td, [:input, {:type=>'file', :name=>'content', :size=>'30'}]]],
311
+ [:tr, [:th, _('Image file'), ' : '],
312
+ [:td, [:input, {:type=>'file', :name=>'image', :size=>'30'}]]],
313
+ [:tr, [:td, ''],
314
+ [:td, [:input, {:type=>'submit', :value=>_('Attach')}]]]]]]
315
+ return ar
316
+ end
317
+
318
+ def ext_modulobe_files_upload
319
+ content = @req.query['content'] # WEBrick::HTTPUtils::FormData
320
+ image = @req.query['image']
321
+ return modulobe_files_put(content, image) if content
322
+ return modulobe_files_error(_('Please specify file.'))
323
+ end
324
+
325
+ def modulobe_files_put(content, image)
326
+ c_require_post
327
+
328
+ files = @site.files(@req.base)
329
+
330
+ fullfilename = content.filename
331
+ if fullfilename.empty?
332
+ return modulobe_files_error(_('Please contact the administrator.'))
333
+ end
334
+
335
+ # Get basename.
336
+ filename = fullfilename.sub(/\A.*[\/\\]([^\/\\]+)\z/) { $1 }
337
+
338
+ result_filename = files.fput(filename, content)
339
+
340
+ list = []
341
+ if filename == result_filename
342
+ list << [:p, [:strong, filename], ' : ', _('The file is saved.')]
343
+ else
344
+ list << [:p, [:strong, filename], ' -> ', [:strong, result_filename],
345
+ ' : ', _('The file is saved with this filename.')]
346
+ end
347
+
348
+ if image
349
+ img_fullfilename = image.filename
350
+ if img_fullfilename && ! img_fullfilename.empty?
351
+ img_filename = img_fullfilename.sub(/\A.*[\/\\]([^\/\\]+)\z/) { $1 }
352
+ ext = Filename.extname(img_filename)
353
+ if ext == 'gif'
354
+ img_filename = File.basename(result_filename, '.mdlb')+'.gif'
355
+ files.put(img_filename, image)
356
+ list << [:p, _('The image is also saved.')]
357
+ end
358
+ end
359
+ end
360
+
361
+ c_make_log('modulobe file attach') # Modulobe FILE ATTACH
362
+
363
+ files = @site.files(@req.base)
364
+ file = files.path(result_filename)
365
+ model = Modulobe::ModelFile.new(file)
366
+ model.get_internal_info
367
+ name = model.name
368
+ author = model.author
369
+ comment = model.comment
370
+ comment ||= ''
371
+ comment.gsub!(/\n/, "\\n")
372
+
373
+ page = @site[@req.base]
374
+ v = page.load
375
+ page.add("
376
+ * #{name}
377
+ {{modulobe_model(#{result_filename})
378
+ :title: #{name}
379
+ :author: #{author}
380
+ :comment: #{comment}
381
+ }}
382
+ {{mcomment}}
383
+
384
+ ")
385
+
386
+ list << [:hr]
387
+ url = @req.base+'.html'
388
+ list << [:p,_('Go next'),' : ',[:a,{:href=>url},url]]
389
+ return c_surface(_('File attachment completed')){list}
390
+ end
391
+
392
+ def modulobe_files_error(msg)
393
+ return c_surface(_('Error')){
394
+ [[:h2, {:style=>'margin:2em;text-align:center;'},
395
+ msg],
396
+ [:p, {:style=>'margin:2em;text-align:center;'},
397
+ [:a, {:href=>@req.base+'.html'}, _('Go back')]]]
398
+ }
399
+ end
400
+
401
+ end
402
+ end
403
+
404
+ if $0 == __FILE__
405
+ require 'qwik/test-common'
406
+ $test = true
407
+ end
408
+
409
+ if defined?($test) && $test
410
+ class TestActModulobe < Test::Unit::TestCase
411
+ include TestSession
412
+ include Modulobe::Sample
413
+
414
+ # ============================== model
415
+ def test_model
416
+ t_add_user
417
+
418
+ # test_modulobe_model
419
+ page = @site.create('c')
420
+ page.store('{{modulobe_model(test1.mdlb)
421
+ :author: Modulobe Project
422
+ :title: Test1 Model
423
+ :comment: This is a sample model by Modulobe Project.
424
+
425
+ http://www.modulobe.com/
426
+
427
+ }}
428
+ {{hcomment}}
429
+ ')
430
+
431
+ model = MODULOBE_TEST_MODEL
432
+ @site.files('c').put('test1.mdlb', model, nil, 0)
433
+ image = TEST_PNG_DATA
434
+ @site.files('c').put('test1.gif', image, nil, 1)
435
+
436
+ res = session('/test/c.html')
437
+ ok_xp([:table,
438
+ [:tr,
439
+ [:td, {:class=>'img'},
440
+ [:a, {:href=>'c.files/test1.mdlb'},
441
+ [:img, {:src=>'c.files/.thumb/test1.gif'}]]],
442
+ [:td, {:class=>'desc'},
443
+ [[:h3, [:a, {:href=>'c.files/test1.mdlb'}, 'Test1 Model']],
444
+ [:p, 'Author', ': ', [:strong, 'Modulobe Project']],
445
+ [:p, [[:p,
446
+ 'This is a sample model by Modulobe Project.']]]]]]],
447
+ "//div[@class='modulobe_model']/table")
448
+ end
449
+
450
+ def test_with_minus
451
+ t_add_user
452
+
453
+ page = @site.create('c')
454
+ page.store('{{modulobe_model(test-2.mdlb)
455
+ :author: Modulobe Project
456
+ :title: Test-2 Model
457
+ :comment: This is a sample.
458
+ }}
459
+ {{hcomment}}
460
+ ')
461
+
462
+ model = MODULOBE_TEST_MODEL
463
+ @site.files('c').put('test-2.mdlb', model, nil, 0)
464
+ image = TEST_PNG_DATA
465
+ @site.files('c').put('test-2.gif', image, nil, 1)
466
+
467
+ res = session('/test/c.html')
468
+ ok_xp([:table,
469
+ [:tr,
470
+ [:td, {:class=>'img'},
471
+ [:a, {:href=>'c.files/test-2.mdlb'},
472
+ [:img, {:src=>'c.files/.thumb/test-2.gif'}]]],
473
+ [:td, {:class=>'desc'},
474
+ [[:h3, [:a, {:href=>'c.files/test-2.mdlb'}, 'Test-2 Model']],
475
+ [:p, 'Author', ': ', [:strong, 'Modulobe Project']],
476
+ [:p, [[:p,
477
+ 'This is a sample.']]]]]]],
478
+ "//div[@class='modulobe_model']/table")
479
+ end
480
+
481
+ # ============================== list
482
+ def test_modulobe_list
483
+ t_add_user
484
+
485
+ # test_modulobe_model_list
486
+ page = @site.create('c')
487
+
488
+ model = MODULOBE_TEST_MODEL1
489
+ @site.files('c').put('test1.mdlb', model, nil, 0)
490
+ image = TEST_PNG_DATA
491
+ @site.files('c').put('test1.gif', image, nil, 1)
492
+
493
+ page.store("{{modulobe_model_list}}")
494
+ res = session('/test/c.html')
495
+ list = res.body.get_path("//div[@class='files']")
496
+ ok_xp([:tr, {:class=>'model'},
497
+ [:td, [:a, {:href=>'c.files/test1.mdlb'},
498
+ [:img, {:src=>'c.files/.thumb/test1.gif'}]]],
499
+ [:td, [:div, {:class=>'author'}, 'Alice'],
500
+ [:div, {:class=>'name'},
501
+ [:a, {:href=>'c.files/test1.mdlb'}, 't1 model']],
502
+ [:pre, {:class=>'comment'}, "This is a comment.\n"]]],
503
+ "//div[@class='files']/table/tr[2]")
504
+ end
505
+
506
+ # ============================== rss
507
+ def setup_models
508
+ t_add_user
509
+
510
+ # Prepare a page.
511
+ page = @site.create('a')
512
+ page.store("* a
513
+ * t1 model
514
+ {{modulobe_model(test1.mdlb)
515
+ :title: t1 model
516
+ :author: Alice
517
+ :comment: This is a comment.\n
518
+ }}
519
+ {{hcomment}}
520
+ ")
521
+ files = @site.files('a')
522
+ files.put('test1.mdlb', MODULOBE_TEST_MODEL1, nil, 0)
523
+ files.put('test1.gif', TEST_PNG_DATA, nil, 1)
524
+
525
+ # Prepare another page.
526
+ page = @site.create('b')
527
+ page.store("* b
528
+ * t2 model
529
+ {{modulobe_model(test2.mdlb)
530
+ :title: t2 model
531
+ :author: Bob
532
+ :comment: This is a comment, too.\n
533
+ }}
534
+ {{hcomment}}
535
+ ")
536
+ files = @site.files('b')
537
+ files.put('test2.mdlb', MODULOBE_TEST_MODEL2, nil, 2)
538
+ files.put('test2.gif', TEST_PNG_DATA, nil, 3)
539
+ end
540
+
541
+ def test_ext_mdlbrss
542
+ setup_models
543
+ res = session('/test/nosuch.mdlbrss')
544
+ ok_xp([:title, 'moved'], '//title')
545
+ res = session('/test/a.mdlbrss')
546
+ ok_eq([[:'?xml', '1.0', 'utf-8'],
547
+ [:rss,
548
+ {:version=>'2.0'},
549
+ [:channel,
550
+ [:title, 'moved'],
551
+ [:link, 'http://example.com/model.xml'],
552
+ [:description, 'moved.'],
553
+ [:lastBuildDate, 'Thu, 01 Jan 1970 09:00:00 GMT'],
554
+ [:ttl, '60'],
555
+ [:item,
556
+ [:title, 'moved'],
557
+ [:link, 'http://example.com/model.xml'],
558
+ [:description, 'moved'],
559
+ [:pubDate, 'Thu, 01 Jan 1970 09:00:00 GMT']]]]],
560
+ res.body)
561
+ end
562
+
563
+ def nu_test_metadata_model_xml
564
+ setup_models
565
+ res = session('/test/model.xml')
566
+ ok_eq([[:'?xml', '1.0', 'utf-8'],
567
+ [:rss, {:'xmlns:creativeCommons'=>
568
+ 'http://backend.userland.com/creativeCommonsRssModule',
569
+ :version=>'2.0'},
570
+ [:channel,
571
+ [:title, 'Modulobe model gallery'],
572
+ [:link, 'http://example.com/'],
573
+ [:description, 'This is a model list of Modulobe Wiki.'],
574
+ [:language, 'ja'],
575
+ [:managingEditor, 'modulobe@qwik.jp'],
576
+ [:webMaster, 'modulobe@qwik.jp'],
577
+ [:lastBuildDate, 'Thu, 01 Jan 1970 09:00:02 GMT'],
578
+ [:ttl, '60'],
579
+ [:item,
580
+ [:title, 't1 model'],
581
+ [:link, 'http://example.com/test/a.files/test1.mdlb'],
582
+ [:description,
583
+ "<p><img src=\"http://example.com/test/a.files/.thumb/test1.gif\" alt=\"t1 model\" width=\"100\" height=\"75\"/><p>This is a comment.</p>"],
584
+ [:author, 'Alice'],
585
+ [:pubDate, 'Thu, 01 Jan 1970 09:00:00 GMT'],
586
+ [:enclosure,
587
+ {:url=>'http://example.com/test/a.files/test1.mdlb',
588
+ :length=>563, :type=>'application/xml'}],
589
+ [:'creativeCommons:license',
590
+ 'http://creativecommons.org/licenses/by/2.1/jp/']],
591
+ [:item,
592
+ [:title, 't2 model'],
593
+ [:link, 'http://example.com/test/b.files/test2.mdlb'],
594
+ [:description,
595
+ "<p><img src=\"http://example.com/test/b.files/.thumb/test2.gif\" alt=\"t2 model\" width=\"100\" height=\"75\"/><p>This is a comment, too.</p>"],
596
+ [:author, 'Bob'],
597
+ [:pubDate, 'Thu, 01 Jan 1970 09:00:02 GMT'],
598
+ [:enclosure,
599
+ {:url=>'http://example.com/test/b.files/test2.mdlb',
600
+ :length=>1395, :type=>'application/xml'}],
601
+ [:'creativeCommons:license',
602
+ 'http://creativecommons.org/licenses/by/2.1/jp/']]]]],
603
+ res.body)
604
+ end
605
+
606
+ # ============================== upload
607
+ def prepare(con, im)
608
+ content = WEBrick::HTTPUtils::FormData.new(MODULOBE_TEST_MODEL)
609
+ content.filename = con
610
+ image = WEBrick::HTTPUtils::FormData.new(TEST_PNG_DATA)
611
+ image.filename = im
612
+ return content, image
613
+ end
614
+
615
+ def test_upload
616
+ t_add_user
617
+
618
+ # test_modulobe_files_form
619
+ page = @site.create('c')
620
+ page.store('{{modulobe_files_form}}')
621
+ res = session('/test/c.html') # See the form.
622
+ form = @res.body.get_path("//div[@class='section']/form")
623
+ ok_eq({:method=>'POST', :action=>'c.modulobe_files_upload',
624
+ :enctype=>'multipart/form-data'}, form[1])
625
+ ok_eq([:form, {:enctype=>'multipart/form-data',
626
+ :method=>'POST', :action=>'c.modulobe_files_upload'},
627
+ [:table,
628
+ [:tr,
629
+ [:th, 'Model file', ' : '],
630
+ [:td, [:input,
631
+ {:size=>'30', :type=>'file', :name=>'content'}]]],
632
+ [:tr,
633
+ [:th, 'Image file', ' : '],
634
+ [:td, [:input,
635
+ {:size=>'30', :type=>'file', :name=>'image'}]]],
636
+ [:tr,
637
+ [:td, ''],
638
+ [:td, [:input, {:value=>'Attach', :type=>'submit'}]]]]],
639
+ form)
640
+
641
+ # test_upload
642
+ content, image = prepare('test1.mdlb', 'test1.gif')
643
+ session('POST /test/c.modulobe_files_upload') {|req| # Put a file.
644
+ req.query.update({'content'=>content, 'image'=>image})
645
+ }
646
+ ok_title('File attachment completed')
647
+ sitelog = @site.sitelog # Check log.
648
+ ok_eq(",0.000000,user@e.com,modulobe file attach,c\n",
649
+ @site['_SiteLog'].load)
650
+
651
+ # The model is attached.
652
+ ok_eq("{{modulobe_files_form}}
653
+
654
+ *
655
+ {{modulobe_model(test1.mdlb)
656
+ :title:\t\t
657
+ :author:\t
658
+ :comment:\t
659
+ }}
660
+ {{mcomment}}
661
+
662
+ ", page.load)
663
+
664
+ # Get the file.
665
+ res = session('/test/c.files/test1.mdlb')
666
+ assert_match(/\A<\?xml version="1\.0" encoding="utf-8"\?>/, res.body)
667
+ ok_eq('application/x-modulobe', res['Content-Type'])
668
+
669
+ # Get the image file.
670
+ res = session('/test/c.files/test1.gif')
671
+ ok_eq('image/gif', res['Content-Type'])
672
+ end
673
+
674
+ def test_with_invalid_character
675
+ t_add_user
676
+
677
+ page = @site.create('c')
678
+
679
+ content, image = prepare('test 2.mdlb', 'test 2.gif')
680
+ res = session('POST /test/c.modulobe_files_upload') {|req| # Put a file.
681
+ req.query.update({'content'=>content, 'image'=>image})
682
+ }
683
+ ok_title('File attachment completed')
684
+ ok_xp([:p, [:strong, 'test 2.mdlb'], ' : ', 'The file is saved.'],
685
+ "//div[@class='body_main']/p")
686
+
687
+ # test_modulobe_files_upload_with_invalid_character
688
+ content, image = prepare('test+2.mdlb', 'test 2.gif')
689
+ res = session('POST /test/c.modulobe_files_upload') {|req|
690
+ req.query.update({'content'=>content, 'image'=>image})
691
+ }
692
+ ok_title('File attachment completed')
693
+ ok_xp([:p, [:strong, 'test+2.mdlb'], ' : ', 'The file is saved.'],
694
+ "//div[@class='body_main']/p")
695
+
696
+ # Get the file.
697
+ res = session('/test/c.files/test+2.mdlb')
698
+ assert_match(/\A<\?xml version="1\.0" encoding="utf-8"\?>/, res.body)
699
+ ok_eq('application/x-modulobe', res['Content-Type'])
700
+
701
+ # Get the image file.
702
+ res = session('/test/c.files/test+2.gif')
703
+ ok_eq('image/gif', res['Content-Type'])
704
+ end
705
+
706
+ def test_with_japanese_character
707
+ t_add_user
708
+ page = @site.create('c')
709
+
710
+ # Put files.
711
+ content, image = prepare('c:\��\��.mdlb', 'c:\��\��.gif')
712
+ res = session('POST /test/c.modulobe_files_upload') {|req|
713
+ req.query.update({'content'=>content, 'image'=>image})
714
+ }
715
+ ok_title('File attachment completed')
716
+ ok_xp([:p, [:strong, '��.mdlb'], ' : ', 'The file is saved.'],
717
+ "//div[@class='body_main']/p")
718
+
719
+ # Get the file.
720
+ res = session('/test/c.files/=E3=81=82.mdlb')
721
+ assert_match(/\A<\?xml version="1\.0" encoding="utf-8"\?>/, res.body)
722
+ ok_eq('application/x-modulobe', res['Content-Type'])
723
+
724
+ # Put files again.
725
+ # content and image are same.
726
+ res = session('POST /test/c.modulobe_files_upload') {|req|
727
+ req.query.update({'content'=>content, 'image'=>image})
728
+ }
729
+ ok_title('File attachment completed')
730
+ ok_xp([:p, [:strong, '��.mdlb'], ' -> ', [:strong, '1-��.mdlb'], ' : ',
731
+ 'The file is saved with this filename.'],
732
+ "//div[@class='body_main']/p")
733
+
734
+ # Get the file.
735
+ res = session('/test/c.files/1-=E3=81=82.mdlb')
736
+ assert_match(/\A<\?xml version="1\.0" encoding="utf-8"\?>/, res.body)
737
+ ok_eq('application/x-modulobe', res['Content-Type'])
738
+ end
739
+
740
+ end
741
+ end