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,109 @@
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/act-search'
7
+
8
+ module Qwik
9
+ class Action
10
+
11
+ #* Incremental search
12
+ # {{isearch}}
13
+ #{{isearch}}
14
+ #You can also make incremenatl search form.
15
+
16
+ #* �C���N�������^���E�T�[�`
17
+ # {{isearch}}
18
+ #{{isearch}}
19
+ #���l�ɁA�C���N�������^���E�T�[�`���s���������ł��B
20
+
21
+ # ============================== isearch
22
+ def plg_isearch(focus=false)
23
+ form = search_form(focus)
24
+ form[1][:action] = '.isearch'
25
+ return form
26
+ end
27
+
28
+ def act_isearch
29
+ query = @req.query['q']
30
+ if query.nil? || query.empty?
31
+ search_form_page
32
+ isearch_patch(@res.body)
33
+ return
34
+ end
35
+
36
+ ar = @site.isearch(query)
37
+ if ar.nil? || ar.empty?
38
+ search_notfound_page(query)
39
+ isearch_patch(@res.body)
40
+ return
41
+ end
42
+
43
+ return isearch_result(@site, ar)
44
+ end
45
+
46
+ def isearch_patch(body) # Destructive for the body
47
+ form = body.get_path('//form')
48
+ form[1][:action] = '.isearch'
49
+ end
50
+
51
+ def isearch_result(site, ar)
52
+ ul = [:ul]
53
+ ar.each {|key|
54
+ page = site[key]
55
+ url = page.url
56
+ ul << [:li, [:a, {:href=>url}, key]]
57
+ }
58
+ div = [:div, {:class=>'day'},
59
+ [:div, {:class=>'section'},
60
+ [:div, {:class=>'search_result'}, ul]]]
61
+ title = _('Search result')
62
+ return c_plain(title) { div }
63
+ end
64
+ end
65
+ end
66
+
67
+ if $0 == __FILE__
68
+ require 'qwik/test-common'
69
+ $test = true
70
+ end
71
+
72
+ if defined?($test) && $test
73
+ class TestActIncrementalSearch < Test::Unit::TestCase
74
+ include TestSession
75
+
76
+ def test_plg_isearch
77
+ ok_wi([:form, {:action=>'.isearch'},
78
+ [:input, {:name=>'q'}],
79
+ [:input, {:value=>'Search', :type=>'submit'}]],
80
+ "{{isearch}}")
81
+ end
82
+
83
+ def test_act_isearch
84
+ t_add_user
85
+
86
+ res = session '/test/.isearch'
87
+ ok_xp [:form, {:action=>'.isearch'},
88
+ [:input, {:class=>'focus', :name=>'q'}],
89
+ [:input, {:value=>'Search', :type=>'submit'}]],
90
+ '//form'
91
+
92
+ res = session "/test/.isearch?q=nosuchkey"
93
+ assert_text 'Search result', 'h1'
94
+ ok_in ['No match.'], '//h2'
95
+
96
+ page = @site.create_new
97
+ page.store 'This is a keyword.'
98
+ res = session "/test/.isearch?q=keyword"
99
+ # ok_in [:ul, [:li, [:a, {:href=>'1.html'}, '1']]],
100
+ # "//div[@class='search_result']"
101
+
102
+ page = @site.create_new # 2.txt
103
+ page.store "����"
104
+ res = session "/test/.isearch?q=��"
105
+ # ok_in [:ul, [:li, [:a, {:href=>'2.html'}, '2']]],
106
+ # "//div[@class='search_result']"
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,137 @@
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
+ require 'MeCab'
7
+ $have_mecab = true
8
+ rescue LoadError
9
+ $have_mecab = false
10
+ end
11
+
12
+ $LOAD_PATH.unshift '..' unless $LOAD_PATH.include? '..'
13
+
14
+ module Qwik
15
+ class Action
16
+ D_PluginKeywords = {
17
+ :dt => 'Show keywords plugin',
18
+ :dd => 'You can see the list of keywords of the page.',
19
+ :dc => "* Example
20
+ You see the keyword list of FrontPage.
21
+ {{keywords}}
22
+ {{keywords}}
23
+ You see the keyword list of TextFormat.
24
+ {{keywords(TextFormat)}}
25
+ {{keywords(TextFormat)}}
26
+
27
+ \'\'\'Warning:\'\'\' This plugin works only for Japanese document.
28
+ "
29
+ }
30
+
31
+ D_PluginKeywords_ja = {
32
+ :dt => '�L�[���[�h�\���v���O�C��',
33
+ :dd => '�y�[�W���̃L�[���[�h�̈ꗗ���\������܂��B',
34
+ :dc => "* ��
35
+ FrontPage�̃L�[���[�h�ꗗ���\������܂��B
36
+ {{keywords}}
37
+ {{keywords}}
38
+ TextFormat�y�[�W�̈ꗗ���\������܂��B
39
+ {{keywords(TextFormat)}}
40
+ {{keywords(TextFormat)}}
41
+ "
42
+ }
43
+
44
+ CLOUD_BASE_FONT_SIZE = 12
45
+ CLOUD_MAX_FONT_SIZE = 40
46
+
47
+ def plg_keywords(pagename=@req.base)
48
+ return "no mecab" if ! $have_mecab
49
+
50
+ page = @site[pagename]
51
+ return if page.nil?
52
+
53
+ content = page.get
54
+
55
+ nodes = Action.nodes_get(content)
56
+
57
+ hash = Hash.new { 0 }
58
+ nodes.each {|surface, feature|
59
+ hash[surface] += 1
60
+ }
61
+ w = hash.keys.sort.map {|surface|
62
+ num = Math.sqrt(hash[surface]) * CLOUD_BASE_FONT_SIZE
63
+ num = CLOUD_MAX_FONT_SIZE if CLOUD_MAX_FONT_SIZE < num
64
+ fontsize = "%.2fpx" % num
65
+ href = "#{surface.escape}.search"
66
+ [:a, {:style=>"font-size:#{fontsize};",
67
+ :href=>href}, surface]
68
+ }
69
+ return [:div, {:class=>'keywords'}, *w]
70
+ end
71
+
72
+ PATTERN_SJIS = '[\x81-\x9f\xe0-\xef][\x40-\x7e\x80-\xfc]'
73
+ PATTERN_EUC = '[\xa1-\xfe][\xa1-\xfe]'
74
+ RE_SJIS = Regexp.new(PATTERN_SJIS, 0, 'n')
75
+ RE_EUC = Regexp.new(PATTERN_EUC, 0, 'n')
76
+
77
+ HIRAGANA = "[��-��[�`]"
78
+ KANJI = "[��-�]"
79
+
80
+ def self.nodes_get(content)
81
+ content.set_sjis
82
+ euc_content = content.to_euc
83
+ tagger = MeCab::Tagger.new([$0])
84
+ n = tagger.parseToNode(euc_content)
85
+ nodes = []
86
+ while n.hasNode != 0
87
+ surface = n.getSurface.set_euc.to_sjis
88
+ feature = n.getFeature.set_euc.to_sjis
89
+ if ! surface.empty? &&
90
+ RE_SJIS =~ surface &&
91
+ /\A([��-��[�`]+)\z/s !~ surface &&
92
+ /\A[�D-���A�B]/s !~ surface &&
93
+ /\A[�C��]/s !~ surface
94
+ # /\A[�@�O-�X���u�v�i�j�A�B]/s !~ surface
95
+ nodes << [surface, feature]
96
+ end
97
+ n = n.next
98
+ end
99
+ return nodes
100
+ end
101
+ end
102
+ end
103
+
104
+ if $0 == __FILE__
105
+ require 'qwik/test-common'
106
+ $test = true
107
+ $KCODE = 's'
108
+ end
109
+
110
+ if defined?($test) && $test
111
+ class TestAction < Test::Unit::TestCase
112
+ include TestSession
113
+
114
+ def test_keywords
115
+ c = Qwik::Action
116
+ # eq ["��"], c.nodes_get("��")
117
+ # eq ["����", "��", "�e�X�g", "�ł�", "�B"],
118
+ # c.nodes_get("����̓e�X�g�ł��B")
119
+ # eq ["����", "��", "��", "�Ȃ�", "��", "��"],
120
+ # c.nodes_get("���������Ȃ��Ƃ�")
121
+ # eq ["���Y", "��", "����", "�{", "��", "��Y", "��", "��", "��",
122
+ # "����", "��", "�n��", "��", "�B"],
123
+ # c.nodes_get("���Y�͂��̖{���Y�����������ɓn�����B")
124
+ end
125
+
126
+ def test_plg_keywords
127
+ return unless $have_mecab
128
+
129
+ page = @site.create('2')
130
+ page.store("��")
131
+
132
+ ok_wi [:div, {:class=>"keywords"},
133
+ [:a, {:style=>"font-size:12.00px;", :href=>"%8E%9A.search"}, "��"]],
134
+ "{{keywords(2)}}"
135
+ end
136
+ end
137
+ end
@@ -0,0 +1,81 @@
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 plg_lang(lang)
10
+ # lang should be only two letters length.
11
+ return 'error' unless /\A[a-z][a-z]\z/ =~ lang
12
+
13
+ alang = @req.accept_language[0]
14
+
15
+ return '' unless alang && alang == lang
16
+
17
+ s = yield
18
+ return c_res(s)
19
+ end
20
+
21
+ def plg_lang_select
22
+ pagebase = @req.base
23
+ if /\A([0-9A-Za-z]+)_([a-z][a-z])\z/ =~ @req.base
24
+ pagebase = $1
25
+ lang = $2
26
+ end
27
+
28
+ list = []
29
+ @req.accept_language.each {|lang|
30
+ pagename_with_lang = "#{pagebase}_#{lang}"
31
+ if @site.exist?(pagename_with_lang)
32
+ #list << pagename_with_lang
33
+ list << lang
34
+ end
35
+ }
36
+
37
+ return nil if list.empty?
38
+
39
+ list.unshift ''
40
+ return list.map {|lang|
41
+ page = "#{pagebase}"
42
+ page = "#{pagebase}_#{lang}" if ! lang.empty?
43
+ lang = "default" if lang.empty?
44
+ [:a, {:href=>"#{page}.html"}, lang]
45
+ }
46
+ end
47
+ end
48
+ end
49
+
50
+ if $0 == __FILE__
51
+ require 'qwik/test-common'
52
+ $test = true
53
+ end
54
+
55
+ if defined?($test) && $test
56
+ class TestActLang < Test::Unit::TestCase
57
+ include TestSession
58
+
59
+ def test_lang
60
+ ok_wi('error', "{{lang(nosuchlang)\na\n}}")
61
+ ok_wi([""], "{{lang(ja)\nj\n}}")
62
+ #ok_wi([], "{{lang(ja)\nj\n}}")
63
+ ok_wi([:p, 'e'], "{{lang(en)\ne\n}}")
64
+
65
+ ok_wi([:p, 'j'], "{{lang(ja)\nj\n}}") {|req|
66
+ req.accept_language = ['ja']
67
+ }
68
+ ok_wi("", "{{lang(en)\ne\n}}") {|req|
69
+ req.accept_language = ['ja']
70
+ }
71
+ end
72
+
73
+ def test_lang_select
74
+ ok_wi [], '{{lang_select}}'
75
+
76
+ page = @site.create('1_en')
77
+ ok_wi [[:a, {:href=>'1.html'}, 'default'],
78
+ [:a, {:href=>'1_en.html'}, 'en']], '{{lang_select}}'
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,63 @@
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 plg_notice
10
+ msg = yield
11
+ w = c_parse(msg)
12
+ div = [:div, {:class=>'notice'}] + w
13
+ return div
14
+ end
15
+
16
+ LICENSE = {
17
+ 'cc' => "You can use the files on this site under [[Creative Commons by 2.1|http://creativecommons.org/licenses/by/2.1/jp/]] license.",
18
+ 'cc-by-sa-2.5' => "You can use the files on this site under [[Creative Commons Attribution-ShareAlike 2.5|http://creativecommons.org/licenses/by-sa/2.5/]] license.",
19
+ 'upload-cc-by-sa-2.5' => "The files you uploaded will be under [[Creative Commons Attribution-ShareAlike 2.5|http://creativecommons.org/licenses/by-sa/2.5/]] license."
20
+ }
21
+
22
+ def plg_license(license)
23
+ text = license_text(license)
24
+ return if text.nil?
25
+ w = c_parse(text)
26
+ return [:div, {:class=>'license'}] + w
27
+ end
28
+
29
+ # TODO: Show CC icon.
30
+ def license_text(license)
31
+ msg = LICENSE[license]
32
+ return '' if msg.nil?
33
+ newmsg = _(msg)
34
+ return newmsg
35
+ end
36
+ end
37
+ end
38
+
39
+ if $0 == __FILE__
40
+ require 'qwik/test-common'
41
+ $test = true
42
+ end
43
+
44
+ if defined?($test) && $test
45
+ class TestActLicense < Test::Unit::TestCase
46
+ include TestSession
47
+
48
+ def test_all
49
+ ok_wi([:div, {:class=>'notice'}, [:p, 't']], "{{notice\nt\n}}")
50
+
51
+ # test_act_license
52
+ ok_wi([:div, {:class=>'license'},
53
+ [:p, 'You can use the files on this site under ',
54
+ [:a, {:href=>'http://creativecommons.org/licenses/by/2.1/jp/'},
55
+ 'Creative Commons by 2.1'], ' license.']],
56
+ "{{license(cc)}}")
57
+
58
+ # @action.plg_license('cc')
59
+ # @action.plg_license('cc-by-sa-2.5')
60
+ # @action.plg_license('upload-cc-by-sa-2.5')
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,287 @@
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
+ NotYet_D_PluginListEdit = {
10
+ :dt => 'List editing plugin',
11
+ :dd => 'You can edit a list in the page.',
12
+ :dc => "* Example
13
+ {{list
14
+ - A
15
+ - B
16
+ - C
17
+ }}
18
+ You can see a list with three lines.
19
+
20
+ - By clicking the item, you can edit the item.
21
+ - You can drag-and-drop the list.
22
+ The system automatically save your editing by Ajax method.
23
+ "
24
+ }
25
+
26
+ PLG_LIST_SCRIPT = "
27
+ function qwikSetInPlaceEditor(id, action) {
28
+ new Ajax.InPlaceEditor(
29
+ id,
30
+ action,
31
+ {
32
+ onComplete: function(transport, element) {
33
+ if (element.innerHTML.length == 0) {
34
+ Element.remove(element.parentNode);
35
+ }
36
+ }
37
+ }
38
+ )
39
+ }
40
+
41
+ function qwikCreateSortable(list_id, list_action) {
42
+ Sortable.create(
43
+ list_id,
44
+ {
45
+ onUpdate: function() {
46
+ new Ajax.Request(
47
+ list_action,
48
+ {
49
+ asynchronous: true,
50
+ evalScripts: true,
51
+ parameters: Sortable.serialize(
52
+ list_id,
53
+ {
54
+ name: 'sortable_list'
55
+ }
56
+ )
57
+ }
58
+ )
59
+ }
60
+ }
61
+ )
62
+ }
63
+ "
64
+
65
+ def plg_list
66
+ content = nil
67
+ content = yield if block_given?
68
+ content ||= ''
69
+
70
+ @list_num = 0 if ! defined?(@list_num)
71
+ @list_num += 1
72
+ list_num = @list_num
73
+
74
+ div = list_make_div(list_num, content)
75
+
76
+ return div
77
+ end
78
+
79
+ def list_make_div(list_num, content)
80
+ w = c_tokenize(content)
81
+
82
+ div = [:div, {:class=>'list'}]
83
+
84
+ list_id = "list_#{list_num}"
85
+ ul, inplace_editors = list_make_ul(list_num, list_id, w)
86
+ div << ul
87
+
88
+ script = list_make_script(@req.base, list_num, list_id,
89
+ inplace_editors)
90
+ div << script
91
+
92
+ return div
93
+ end
94
+
95
+ def list_make_ul(list_num, list_id, w)
96
+ ul = [:ul, {:id=>list_id}]
97
+ inplace_editors = []
98
+ item_num = 1
99
+ w.each_element(:ul) {|li|
100
+ #level = li[1] # FIXME: Use level info correctly.
101
+ content = li[2]
102
+ item_id = "item_#{list_num}_#{item_num}"
103
+ span_id = "item_edit_area_#{list_num}_#{item_num}"
104
+ action = "#{@req.base}.#{list_num}.#{item_num}.list_edit"
105
+ ul << [:li, {:id=>item_id},
106
+ [:span, {:class=>"item_edit_area", :id=>span_id}, content]]
107
+ inplace_editors << [span_id, action]
108
+ item_num += 1
109
+ }
110
+ return ul, inplace_editors
111
+ end
112
+
113
+ def list_make_script(base, list_num, list_id, inplace_editors)
114
+ list_action = "#{base}.#{list_num}.list_pos"
115
+ script = ''
116
+ script << PLG_LIST_SCRIPT if list_num == 1
117
+ inplace_editors.each {|span_id, action|
118
+ script << "qwikSetInPlaceEditor('#{span_id}', '#{action}');\n"
119
+ }
120
+ script << "qwikCreateSortable('#{list_id}', '#{list_action}');\n"
121
+ return [:script, {:type=>'text/javascript'}, script]
122
+ end
123
+
124
+ def ext_list_edit
125
+ list_num = @req.ext_args[0].to_i
126
+ item_num = @req.ext_args[1].to_i
127
+ return c_nerror if list_num < 1 || item_num < 1
128
+
129
+ query = @req.query
130
+ # [{""=>"ok", "value"=>"Aa", "_"=>""}]
131
+ value = query['value']
132
+
133
+ begin
134
+ plugin_edit(:list, list_num) {|content|
135
+ new_content = Action.list_edit(content, item_num, value)
136
+ new_content
137
+ }
138
+ rescue NoCorrespondingPlugin
139
+ return c_nerror(_('Failed'))
140
+ rescue PageCollisionError
141
+ return mcomment_error(_('Page collision detected.'))
142
+ end
143
+
144
+ c_make_log('list_edit') # COMMENT
145
+
146
+ c_set_status
147
+ c_set_no_cache
148
+ c_set_contenttype('text/plain')
149
+ body = value
150
+ c_set_body(body)
151
+ end
152
+
153
+ def self.list_edit(content, item_num, value)
154
+ tokens = TextTokenizer.tokenize(content)
155
+ index = 1 # list index starts with 1
156
+ tokens.each_element(:ul) {|token|
157
+ if index == item_num
158
+ token[2] = value # Destructive.
159
+ end
160
+ index += 1
161
+ }
162
+ return tokens_to_s(tokens)
163
+ end
164
+
165
+ def self.tokens_to_s(tokens)
166
+ token_str = ''
167
+ tokens.each_element(:ul) {|token|
168
+ level_s = '-' * token[1]
169
+ token_str << "#{level_s} #{token[2]}\n"
170
+ }
171
+ return token_str
172
+ end
173
+
174
+ def ext_list_pos
175
+ list_num = @req.ext_args[0].to_i
176
+ return c_nerror if list_num < 1
177
+
178
+ item_list = @req.query["sortable_list[]"].list
179
+
180
+ item_list = Action.parse_list(item_list)
181
+
182
+ new_content = ''
183
+ begin
184
+ plugin_edit(:list, list_num) {|content|
185
+ new_content = Action.list_arrange(content, item_list)
186
+ pp content, new_content
187
+ new_content
188
+ }
189
+ rescue NoCorrespondingPlugin
190
+ return c_nerror(_('Failed'))
191
+ rescue PageCollisionError
192
+ return mcomment_error(_('Page collision detected.'))
193
+ end
194
+
195
+ c_make_log('list_pos') # COMMENT
196
+
197
+ c_set_status
198
+ c_set_no_cache
199
+ c_set_contenttype('text/plain')
200
+ body = new_content
201
+ c_set_body(body)
202
+ end
203
+
204
+ def self.parse_list(list)
205
+ return list.map {|item|
206
+ /\A(\d+)_(\d+)\z/ =~ item
207
+ $2.to_i
208
+ }
209
+ end
210
+
211
+ def self.list_arrange(content, item_list)
212
+ tokens = TextTokenizer.tokenize(content)
213
+ new_tokens = []
214
+ item_list.each {|item_num|
215
+ new_tokens << tokens[item_num - 1]
216
+ }
217
+ return tokens_to_s(new_tokens)
218
+ end
219
+ end
220
+ end
221
+
222
+ if $0 == __FILE__
223
+ require 'qwik/test-common'
224
+ $test = true
225
+ end
226
+
227
+ if defined?($test) && $test
228
+ class TestActList < Test::Unit::TestCase
229
+ include TestSession
230
+
231
+ def test_all
232
+ c = Qwik::Action
233
+
234
+ eq([[:ul, 1, "a"]], Qwik::TextTokenizer.tokenize("-a"))
235
+ eq([[:ul, 2, "a"]], Qwik::TextTokenizer.tokenize("--a"))
236
+ eq([[:ul, 1, "a"], [:ul, 1, "b"]],
237
+ Qwik::TextTokenizer.tokenize("-a\n-b"))
238
+
239
+ # test_tokens_to_s
240
+ eq("- a\n", c.tokens_to_s([[:ul, 1, "a"]]))
241
+ eq("-- a\n", c.tokens_to_s([[:ul, 2, "a"]]))
242
+ eq("- a\n- b\n", c.tokens_to_s([[:ul, 1, "a"], [:ul, 1, "b"]]))
243
+
244
+ # test_list_edit
245
+ eq("- b\n", c.list_edit('-a', 1, 'b'))
246
+ eq("- c\n- b\n", c.list_edit("-a\n-b", 1, 'c'))
247
+ eq("- a\n- c\n", c.list_edit("-a\n-b", 2, 'c'))
248
+
249
+ # test_parse_list
250
+ eq([1, 3, 2], c.parse_list(["1_1", "1_3", "1_2"]))
251
+
252
+ # test_list_arrange
253
+ eq("- a\n- b\n", c.list_arrange("-a\n-b", [1, 2]))
254
+ eq("- b\n- a\n", c.list_arrange("-a\n-b", [2, 1]))
255
+ end
256
+
257
+ def test_all2
258
+ t_add_user
259
+
260
+ =begin
261
+ # test_plg_list
262
+ ok_wi([:div, {:class=>"list"},
263
+ [:form, {:method=>"POST", :action=>""},
264
+ [[:ul, [:li, "a"]]],
265
+ [:div, {:class=>"submit"},
266
+ [:input, {:value=>"Update", :type=>"submit"}]]]],
267
+ "{{list
268
+ - A
269
+ - B
270
+ - C
271
+ }}")
272
+ =end
273
+
274
+ page = @site.create_new
275
+ page.store("{{list
276
+ - a
277
+ - b
278
+ }}
279
+ ")
280
+ res = session("POST /test/1.1.1.list_edit?value=c")
281
+ eq("{{list\n- c\n- b\n}}\n", page.load)
282
+
283
+ res = session("POST /test/1.1.2.list_edit?value=d")
284
+ eq("{{list\n- c\n- d\n}}\n", page.load)
285
+ end
286
+ end
287
+ end