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,5 @@
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 'qwik/server'
@@ -0,0 +1,34 @@
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
+ =begin
6
+ $LOAD_PATH.unshift '..' unless $LOAD_PATH.include? '..'
7
+ require 'qwik/config'
8
+ require 'qwik/farm'
9
+
10
+ module Qwik
11
+ class AddUser
12
+ def self.main(argv)
13
+ if argv.length != 2
14
+ puts "Usage: qwikweb-adduser [sitename] [mail address]"
15
+ exit
16
+ end
17
+
18
+ config = Config.new
19
+ memory = ServerMemory.new(config)
20
+ farm = Farm.new(config, memory)
21
+ sitename = argv.shift
22
+ mail = argv.shift
23
+ begin
24
+ site = farm.get_site(sitename)
25
+ site.member.add(mail)
26
+ rescue
27
+ puts 'Error: The site does not exist.'
28
+ exit 1
29
+ end
30
+ puts 'Adding a new user completed.'
31
+ end
32
+ end
33
+ end
34
+ =end
@@ -0,0 +1,110 @@
1
+ # Copyright (C) 2003-2006 Kouichirou Eto, All rights reserved.
2
+ # This is free software with ABSOLUTELY NO WARRANTY.
3
+ # You can redistribute it and/or modify it under the terms of the GNU GPL 2.
4
+
5
+ $LOAD_PATH.unshift '..' unless $LOAD_PATH.include? '..'
6
+ require 'qwik/gettext'
7
+ include Qwik
8
+ include Qwik::GetText
9
+
10
+ module Qwik
11
+ class CatalogValidator
12
+ def self.main(argv)
13
+ if argv.length < 2
14
+ puts "usage: ruby catalog-validator.rb <catalog> <source...>"
15
+ exit
16
+ end
17
+
18
+ catalog_file = argv.shift
19
+ catalog = load_catalog(catalog_file)
20
+ set_catalog(catalog)
21
+
22
+ ok = true
23
+ argv.each {|source_file|
24
+ validator = self.new(source_file, catalog)
25
+ validator.validate
26
+ validator.error_messages.each {|message|
27
+ puts message
28
+ }
29
+ ok = (ok and validator.ok?)
30
+ }
31
+ if ok then exit else exit(1) end
32
+ end
33
+
34
+ def initialize (source_file_name, messages)
35
+ @source_file_name = source_file_name
36
+ @gettext_catalog = messages
37
+ @error_messages = []
38
+ end
39
+ attr_reader :error_messages
40
+
41
+ def read_file_with_numbering (file_name)
42
+ content = ''
43
+ File.open(file_name).each_with_index {|line, idx|
44
+ lineno = idx + 1
45
+ content << line.gsub(/\b_\(/, "_[#{lineno}](")
46
+ }
47
+ content
48
+ end
49
+
50
+ def collect_messages (content)
51
+ messages = []
52
+ while content.sub!(/\b_\[(\d+)\]\(("(?:\\"|.)*?").*?\)/m, "")
53
+ lineno = $1.to_i
54
+ message = eval($2)
55
+ messages.push([lineno, message])
56
+ end
57
+ messages
58
+ end
59
+
60
+ def validate
61
+ @gettext_catalog or return
62
+ content = read_file_with_numbering(@source_file_name)
63
+ messages = collect_messages(content)
64
+ messages.each {|lineno, message|
65
+ translated_message = @gettext_catalog[message]
66
+ if not translated_message
67
+ message =
68
+ sprintf('%s:%d: %s', @source_file_name, lineno, message.inspect)
69
+ @error_messages.push(message)
70
+ elsif message.count('%') != translated_message.count('%')
71
+ message = sprintf("%s:%d: %s => # of %% mismatch.",
72
+ @source_file_name,
73
+ lineno, message.inspect, translated_message)
74
+ @error_messages.push(message)
75
+ end
76
+ }
77
+ end
78
+
79
+ def ok?
80
+ @error_messages.empty?
81
+ end
82
+ end
83
+ end
84
+
85
+ if $0 == __FILE__
86
+ Qwik::CatalogValidator.main(ARGV)
87
+ end
88
+
89
+ if defined?($test) && $test
90
+ require 'qwik/testunit'
91
+
92
+ class TestCatalogValidator < Test::Unit::TestCase
93
+ include Qwik::GetText
94
+
95
+ def test_dummy
96
+ end
97
+
98
+ def nutest_validator
99
+ #validator = CatalogValidator.new($0, CATALOG)
100
+ validator = Qwik::CatalogValidator.new($0, CATALOG)
101
+ validator.validate
102
+ ok_eq(true, validator.ok?)
103
+
104
+ #validator = CatalogValidator.new($0, {})
105
+ validator = Qwik::CatalogValidator.new($0, {})
106
+ validator.validate
107
+ ok_eq(false, validator.ok?)
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,28 @@
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
+ =begin
6
+ $LOAD_PATH.unshift '..' unless $LOAD_PATH.include? '..'
7
+ require 'qwik/config'
8
+ require 'qwik/password'
9
+
10
+ module Qwik
11
+ class IncrementGeneration
12
+ def self.main(argv)
13
+ if argv.length == 0
14
+ puts 'usage: qwikweb-incgen [mailaddress]'
15
+ exit
16
+ end
17
+
18
+ config = Config.new
19
+ gen = PasswordGenerator.new(config)
20
+ mail = argv.shift
21
+ g = gen.generation_inc(mail)
22
+ puts 'mail: '+mail
23
+ puts 'generation: '+g.to_s
24
+ puts 'increment generation done.'
25
+ end
26
+ end
27
+ end
28
+ =end
@@ -0,0 +1,41 @@
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
+ =begin
6
+ $LOAD_PATH.unshift '..' unless $LOAD_PATH.include? '..'
7
+ require 'qwik/config'
8
+ require 'qwik/farm'
9
+
10
+ module Qwik
11
+ class MakeSite
12
+ def self.main(argv)
13
+ return usage if argv.length != 2
14
+
15
+ config = Config.new
16
+ memory = ServerMemory.new(config)
17
+ farm = Farm.new(config, memory)
18
+
19
+ sitename = argv.shift
20
+ mail = argv.shift
21
+ return usage if sitename.nil? || sitename.empty?
22
+ return usage if mail.nil? || mail.empty?
23
+
24
+ begin
25
+ site = farm.make_site(sitename)
26
+ site = farm.get_site(sitename)
27
+ site.member.add(mail)
28
+ rescue => e
29
+ puts 'Error: The site is already exist.'
30
+ exit 1
31
+ end
32
+ puts 'Creating a new site completed.'
33
+ end
34
+
35
+ def self.usage
36
+ puts 'usage: qwikweb-makesite [sitename] [your mail address]'
37
+ exit
38
+ end
39
+ end
40
+ end
41
+ =end
@@ -0,0 +1,44 @@
1
+ # Copyright (C) 2003-2006 Kouichirou Eto, All rights reserved.
2
+ # This is free software with ABSOLUTELY NO WARRANTY.
3
+ # You can redistribute it and/or modify it under the terms of the GNU GPL 2.
4
+
5
+ $LOAD_PATH.unshift '..' unless $LOAD_PATH.include? '..'
6
+ require 'qwik/config'
7
+ require 'qwik/loadlib'
8
+ require 'qwik/server'
9
+
10
+ module Qwik
11
+ class QwikWebServer
12
+ def self.main(args)
13
+ return if defined?($qwikweb_server_running) && $qwikweb_server_running
14
+
15
+ File.umask(0)
16
+
17
+ config = Config.new
18
+ Config.load_args_and_config(config, $0, args)
19
+
20
+ # Load all actions here.
21
+ LoadLibrary.load_libs_here('qwik/act-*.rb')
22
+ LoadLibrary.load_libs_here('qwik/plugin/act-*.rb')
23
+
24
+ if config[:server_type] == 'webrick'
25
+ server = Server.new(config)
26
+ elsif config[:server_type] == 'mongrel'
27
+ require 'qwik/mongrel-server'
28
+ server = MongrelServer.new(config)
29
+ else
30
+ puts 'Error'
31
+ exit
32
+ end
33
+
34
+ $qwikweb_server_running = true
35
+ server.start
36
+ end
37
+ end
38
+ end
39
+
40
+ if $0 == __FILE__
41
+ args = ARGV
42
+ args << '-d' # force debug mode
43
+ Qwik::QwikWebServer.main(args)
44
+ end
@@ -0,0 +1,26 @@
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
+ =begin
6
+ $LOAD_PATH.unshift '..' unless $LOAD_PATH.include? '..'
7
+ require 'qwik/config'
8
+ require 'qwik/password'
9
+
10
+ module Qwik
11
+ class ShowPassword
12
+ def self.main(argv)
13
+ if argv.length == 0
14
+ puts 'usage: qwikweb-showpassword [mailaddress]'
15
+ exit
16
+ end
17
+
18
+ config = Config.new
19
+ gen = PasswordGenerator.new(config)
20
+ mail = argv.shift
21
+ puts 'mail: '+mail
22
+ puts 'pass: '+gen.generate(mail)
23
+ end
24
+ end
25
+ end
26
+ =end
@@ -0,0 +1,67 @@
1
+ # Copyright (C) 2003-2006 Kouichirou Eto, All rights reserved.
2
+ # This is free software with ABSOLUTELY NO WARRANTY.
3
+ # You can redistribute it and/or modify it under the terms of the GNU GPL 2.
4
+
5
+ $LOAD_PATH.unshift '..' unless $LOAD_PATH.include? '..'
6
+ require 'qwik/config'
7
+ require 'qwik/util-pathname'
8
+ require 'qwik/logger'
9
+
10
+ module Qwik
11
+ class WatchLog
12
+ def self.main(args)
13
+ config = Config.new
14
+ Config.load_args_and_config(config, 'qwikweb-watchlog', args)
15
+ self.new(config).run
16
+ end
17
+
18
+ def initialize(config)
19
+ @config = config
20
+ end
21
+
22
+ # http://colinux:9190/qtest/
23
+ def run
24
+ pid_path = @config.web_pid_file.path
25
+ if pid_path.exist?
26
+ str = pid_path.read
27
+ puts 'Process id: '+str
28
+ end
29
+
30
+ p error_log = @config.log_dir.path + Logger::WEB_ERROR_LOG
31
+ p access_log = @config.log_dir.path + Logger::ACCESS_LOG
32
+ p web_access_log = @config.log_dir.path + Logger::WEB_ACCESS_LOG
33
+
34
+ t1 = start_tail_f(error_log.to_s)
35
+ t2 = start_tail_f(web_access_log.to_s)
36
+ loop { sleep 1 }
37
+ end
38
+
39
+ def start_tail_f(file)
40
+ return Thread.new {
41
+ open(file) {|log|
42
+ log.seek(0, IO::SEEK_END)
43
+ tail_f(log) {|line| puts line }
44
+ }
45
+ }
46
+ end
47
+
48
+ def tail_f(input)
49
+ loop {
50
+ line = input.gets
51
+ yield line if line
52
+ if input.eof?
53
+ sleep 1
54
+ input.seek(input.tell)
55
+ end
56
+ }
57
+ end
58
+ end
59
+ end
60
+
61
+ if $0 == __FILE__
62
+ argv = ARGV
63
+ # argv << '-d'
64
+ # argv << '-c'
65
+ # argv << 'config-debug.txt'
66
+ Qwik::WatchLog.main(argv)
67
+ end
@@ -0,0 +1,304 @@
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 UnknownPathException < Exception; end
9
+
10
+ class Request
11
+ attr_reader :sitename
12
+ attr_accessor :base
13
+ attr_reader :ext
14
+ attr_accessor :plugin
15
+ attr_reader :ext_args
16
+ attr_accessor :path_args
17
+ attr_reader :path_query
18
+ attr_reader :unparsed_uri
19
+
20
+ def parse_path(path)
21
+ if @unparsed_uri.nil?
22
+ @unparsed_uri = path # for test
23
+ end
24
+
25
+ @sitename, @base, @ext, @plugin, @path_args, @path_query, @ext_args =
26
+ Request.parse_path(path, @config.default_sitename)
27
+
28
+ return [@sitename, @base, @ext] # only for test
29
+ end
30
+
31
+ def self.parse_path(path, default_sitename)
32
+ raise "first character must be '/'" unless path[0] == ?/
33
+
34
+ path = remove_quote(path)
35
+
36
+ path = normalize_path(path) # for security
37
+
38
+ # OBSOLETE: Patch for redirect plugin (old format).
39
+ if /\A\/((?:http|https|ftp|file):\/.+)\z/ =~ path
40
+ return [default_sitename, '', '', 'redirect', [$1], {}, []]
41
+ end
42
+
43
+ pas = path.split('/')
44
+ pas.shift # Drop the first null element.
45
+
46
+ # Ad hoc: Error handling.
47
+ if pas.length == 1
48
+ if ! pas.first.include?('.') && /\/\z/ !~ path
49
+ return [default_sitename, pas.first, '', nil, [], {}, []]
50
+ end
51
+ end
52
+
53
+ sitename = base = ext = plugin = nil
54
+ path_args = []
55
+ path_query = {}
56
+ ext_args = []
57
+
58
+ pas.each_with_index {|pa, i|
59
+ if plugin || ext
60
+ # path_args is catch all.
61
+ path_args << pa
62
+ next
63
+ end
64
+
65
+ # Maybe sitename.
66
+ if i == 0
67
+ if Request.sitename?(pa)
68
+ sitename = pa
69
+ end
70
+ next if sitename # Skip.
71
+ end
72
+
73
+ ff = pa.split('.')
74
+
75
+ # No end with dot.
76
+ if ff[1].nil? || ff[1].empty?
77
+ if ff[0] == 'theme' || ff[0] == 'attach'
78
+ ff = ['', ff[0]]
79
+ else
80
+ base = ''
81
+ ext = ''
82
+ return [sitename, base, ext, plugin, path_args, path_query, ext_args]
83
+ end
84
+ end
85
+
86
+ # Start with dot -> Action plugin.
87
+ if ff[0].empty?
88
+ raise 'no two action' unless plugin.nil? # No two plugins.
89
+ plugin = ff[1]
90
+ next
91
+ end
92
+
93
+ # Accept only two.
94
+ if 2 < ff.length
95
+ base = ff.shift
96
+ ext = ff.pop
97
+ ext_args = ff
98
+ next
99
+ end
100
+
101
+ raise 'base should be one.' if base # base should be one.
102
+ base = ff[0]
103
+ ext = ff[1]
104
+ }
105
+
106
+ # sitename is not specified.
107
+ sitename = default_sitename if sitename.nil?
108
+
109
+ if base.nil?
110
+ base, ext = ['FrontPage', 'html']
111
+ end
112
+
113
+ path_args.each {|pa|
114
+ ff = pa.split('=')
115
+ if ff.length == 2
116
+ path_query[ff.first] = ff.last
117
+ end
118
+ }
119
+
120
+ base.set_url_charset
121
+
122
+ return [sitename, base, ext, plugin, path_args, path_query, ext_args]
123
+ end
124
+
125
+ private
126
+
127
+ def init_path
128
+ @sitename = nil
129
+ @base = nil
130
+ @ext = nil
131
+ @plugin = nil
132
+ @ext_args = []
133
+ @path_args = []
134
+ @path_query = {}
135
+ @unparsed_uri = nil
136
+ end
137
+
138
+ # For Excite Translate Bug.
139
+ def self.remove_quote(path)
140
+ if /\A(.+)\"(.+)\"\z/ =~ path
141
+ return $1+$2
142
+ end
143
+ return path
144
+ end
145
+
146
+ # copied from webrick/httputils.rb
147
+ def self.normalize_path(path)
148
+ raise "abnormal path `#{path}'" if path[0] != ?/
149
+ ret = path.dup
150
+
151
+ ret.gsub!(%r{/+}o, '/') # // => /
152
+ while ret.sub!(%r:/\.(/|\z):o, '/'); end # /. => /
153
+ begin # /foo/.. => /foo
154
+ match = ret.sub!(%r{/([^/]+)/\.\.(/|\z)}o){
155
+ if $1 == '..'
156
+ raise "abnormal path `#{path}'"
157
+ else
158
+ '/'
159
+ end
160
+ }
161
+ end while match
162
+
163
+ raise "abnormal path `#{path}'" if %r{/\.\.(/|\z)} =~ ret
164
+ return ret
165
+ end
166
+
167
+ def self.sitename?(pa)
168
+ ff = pa.split('.')
169
+ return false if ff.first.empty? # action
170
+ len = ff.length
171
+ return true if len == 1
172
+ # contain dot, and last is com or jp is external site
173
+ return true if 1 < len && %w(com jp).include?(ff.last)
174
+ return false
175
+ end
176
+ end
177
+ end
178
+
179
+ if $0 == __FILE__
180
+ require 'qwik/testunit'
181
+ require 'qwik/config'
182
+ require 'qwik/request'
183
+ $test = true
184
+ end
185
+
186
+ if defined?($test) && $test
187
+ require 'qwik/test-module-public'
188
+
189
+ class TestRequestPath < Test::Unit::TestCase
190
+ include TestModulePublic
191
+
192
+ def test_class_method
193
+ c = Qwik::Request
194
+ ok_eq('a', c.remove_quote('a'))
195
+ ok_eq("\"a\"", c.remove_quote("\"a\""))
196
+ ok_eq('ab', c.remove_quote("a\"b\""))
197
+ ok_eq("'a'", c.remove_quote("'a'"))
198
+ end
199
+
200
+ def test_all
201
+ config = Qwik::Config.new
202
+ req = Qwik::Request.new(config)
203
+
204
+ # test_parse_path
205
+ # t_make_public(Qwik::Request, :parse_path)
206
+ ok_eq(['www', 'FrontPage', 'html'], req.parse_path('/'))
207
+ ok_eq(['www', 'FrontPage', 'html'],
208
+ req.parse_path('/FrontPage.html'))
209
+ ok_eq(['test', 't', 'html'], req.parse_path('/test/t.html'))
210
+ ok_eq(['test', 'FrontPage', 'html'], req.parse_path('/test/'))
211
+ ok_eq(['www', 'test', ''], req.parse_path('/test'))
212
+ ok_eq(['test', 'FrontPage', 'html'],
213
+ req.parse_path('/test/FrontPage.html'))
214
+ ok_eq(['example.com', 'FrontPage', 'html'],
215
+ req.parse_path('/example.com/'))
216
+ ok_eq(['www.example.com', 'FrontPage', 'html'],
217
+ req.parse_path('/www.example.com/'))
218
+
219
+ # test_theme_plugin
220
+ req.parse_path('/.theme/all.css')
221
+ ok_eq(['theme', ['all.css']], [req.plugin, req.path_args])
222
+ ok_eq(['www', 'FrontPage', 'html'],
223
+ req.parse_path('/.theme/all.css'))
224
+
225
+ req.parse_path('/.theme/qwikgreen/qwikgreen.css')
226
+ ok_eq(['theme', ['qwikgreen', 'qwikgreen.css']],
227
+ [req.plugin, req.path_args])
228
+
229
+ req.parse_path('/.login')
230
+ ok_eq(['login', []], [req.plugin, req.path_args])
231
+
232
+ req.parse_path('/.login/user@e.com/44484125/')
233
+ ok_eq(['login', ['user@e.com', '44484125']],
234
+ [req.plugin, req.path_args])
235
+
236
+ ok_eq(['www', 'FrontPage', 'html'],
237
+ req.parse_path('/FrontPage.html/sid=000/'))
238
+ ok_eq(['sid=000'], req.path_args)
239
+ ok_eq({'sid'=>'000'}, req.path_query)
240
+
241
+ # test_parse_plugin
242
+ assert_raise(RuntimeError){ req.parse_path('test/') }
243
+ ok_eq(['test', 'FrontPage', 'html'],
244
+ req.parse_path('/test/.attach/t.txt'))
245
+ ok_eq(['attach', ['t.txt']], [req.plugin, req.path_args])
246
+ ok_eq(['www', 'FrontPage', 'html'],
247
+ req.parse_path('/.attach/s.jpg'))
248
+ ok_eq(['attach', ['s.jpg']], [req.plugin, req.path_args])
249
+
250
+ ok_eq(['www', 'FrontPage', 'html'], req.parse_path('/.new'))
251
+ ok_eq(['new', []], [req.plugin, req.path_args])
252
+
253
+ ok_eq(['test', 'test', 'zip'], req.parse_path('/test/test.zip'))
254
+ ok_eq('zip', req.ext)
255
+
256
+ ok_eq(['www', 'test', 'zip'], req.parse_path('/test.zip'))
257
+ ok_eq('zip', req.ext)
258
+
259
+ ok_eq(['e.com', 'FrontPage', 'html'],
260
+ req.parse_path('/e.com/.attach/t.png'))
261
+ ok_eq(['attach', ['t.png']],
262
+ [req.plugin, req.path_args])
263
+
264
+ ok_eq(['www', 'www', 'zip'], req.parse_path('/www.zip'))
265
+ ok_eq(['www', 'www', 'rss'], req.parse_path('/www.rss'))
266
+
267
+ ok_eq(['www', 'favicon', 'ico'], req.parse_path('/favicon.ico'))
268
+
269
+ # test_attach
270
+ ok_eq(['www', 'FrontPage', 'html'],
271
+ req.parse_path('/.attach/s.jpg'))
272
+ ok_eq(['attach', ['s.jpg']], [req.plugin, req.path_args])
273
+
274
+ ok_eq(['www', 'FrontPage', 'html'],
275
+ req.parse_path('/.attach/thumb/s.jpg'))
276
+ ok_eq(['attach', ['thumb', 's.jpg']],
277
+ [req.plugin, req.path_args])
278
+
279
+ # test_parse_sitename
280
+ c = Qwik::Request
281
+ ok_eq(true, c.sitename?('test'))
282
+ ok_eq(true, c.sitename?('e.com'))
283
+ ok_eq(true, c.sitename?('www.e.com'))
284
+ ok_eq(false, c.sitename?('www.new'))
285
+ ok_eq(false, c.sitename?('www.zip'))
286
+ ok_eq(false, c.sitename?('www.rss'))
287
+ ok_eq(false, c.sitename?('hoge.1.backup'))
288
+
289
+ # test_ext_args
290
+ ok_eq(['www', 'hoge', 'backup'],
291
+ req.parse_path('/hoge.backup'))
292
+ ok_eq([], req.ext_args)
293
+
294
+ ok_eq(['www', 'hoge', 'backup'],
295
+ req.parse_path('/hoge.1.backup'))
296
+ ok_eq(['1'], req.ext_args)
297
+
298
+ ok_eq(['test', 'hoge', 'backup'],
299
+ req.parse_path('/test/hoge.1.backup'))
300
+ ok_eq(['1'], req.ext_args)
301
+
302
+ end
303
+ end
304
+ end