Soks 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (284) hide show
  1. data/README.txt +14 -4
  2. data/bin/soks-create-wiki.rb +2 -2
  3. data/contrib/redcloth-3.0.3.rb +0 -1
  4. data/lib/helpers/default-helpers.rb +13 -12
  5. data/lib/helpers/mail2wiki-helper.rb +12 -7
  6. data/lib/helpers/mail2wiki-test.rb +15 -0
  7. data/lib/helpers/wiki2html.rb +60 -0
  8. data/lib/soks-drb.rb +20 -0
  9. data/lib/soks-fcgi.rb +127 -0
  10. data/lib/soks-model.rb +11 -3
  11. data/lib/soks-servlet.rb +68 -45
  12. data/lib/soks-storage.rb +11 -3
  13. data/lib/soks-utils.rb +32 -3
  14. data/lib/soks-view.rb +48 -69
  15. data/lib/soks.rb +6 -3
  16. data/templates/default/attachment/blank.gif +0 -0
  17. data/templates/default/attachment/logo.jpg +0 -0
  18. data/templates/default/attachment/newpage.js +9 -0
  19. data/templates/default/attachment/pngbehavior.htc +86 -0
  20. data/templates/default/attachment/robots.txt +2 -1
  21. data/templates/default/attachment/stylesheet.css +144 -37
  22. data/templates/default/banned_titles.txt +36 -0
  23. data/templates/default/content/Api%20for%20classes%20to%20modify%20the%20wiki.textile +24 -0
  24. data/templates/default/content/Author.textile +3 -3
  25. data/templates/default/content/Automatic%20Summaries.textile +14 -14
  26. data/templates/default/content/Automatic%20linking%20between%20pages.textile +2 -0
  27. data/templates/default/content/Bug%3A%20RSS%20feed%20does%20not%20validate.textile +10 -0
  28. data/templates/default/content/Bug%3A%20Textile%20mishandles%20paragraphs.textile +33 -0
  29. data/templates/default/content/Bug%3A%20Unanticipated%20Rollbacks.textile +21 -0
  30. data/templates/default/content/Home%20Page.textile +3 -2
  31. data/templates/default/content/How%20to%20administrate%20this%20wiki.textile +4 -19
  32. data/templates/default/content/How%20to%20get%20the%20latest%20Soks%20from%20cvs.textile +21 -0
  33. data/templates/default/content/How%20to%20import%20data%20to%20this%20wiki.textile +45 -0
  34. data/templates/default/content/How%20to%20install%20Soks.textile +12 -8
  35. data/templates/default/content/How%20to%20password%20protect%20your%20wiki.textile +43 -0
  36. data/templates/default/content/How%20to%20report%20a%20bug.textile +1 -1
  37. data/templates/default/content/How%20to%20use%20the%20keyboard%20shortcuts.textile +2 -0
  38. data/templates/default/content/How%20to%20use%20this%20wiki.textile +1 -0
  39. data/templates/default/content/Instructions%20and%20Howtos.textile +4 -1
  40. data/templates/default/content/Known%20bugs.textile +5 -2
  41. data/templates/default/content/List%20of%20changes.textile +49 -0
  42. data/templates/default/content/New%20Recent%20Changes%20class.textile +58 -0
  43. data/templates/default/content/New%20page%20templates%20or%20categories%20code.textile +68 -0
  44. data/templates/default/content/Per%20Wiki%20Templates.textile +35 -0
  45. data/templates/default/content/Planned%20Features.textile +29 -8
  46. data/templates/default/content/README.textile +14 -4
  47. data/templates/default/content/RSS%20feed.textile +2 -0
  48. data/templates/default/content/Recent%20Changes%20to%20This%20Site.textile +200 -202
  49. data/templates/default/content/SOKS%20features.textile +2 -1
  50. data/templates/default/content/Sidebar%20Page.textile +3 -0
  51. data/templates/default/content/Type%20a%20title%20here.textile +1 -0
  52. data/templates/default/content/bug%3A%20competing%20edits.textile +13 -0
  53. data/templates/default/content/ctrl%2Dn.textile +1 -0
  54. data/templates/default/content/tamc.textile +1 -0
  55. data/templates/default/start.rb +38 -15
  56. data/templates/default/version.txt +1 -1
  57. data/templates/default/views/Page_edit.rhtml +71 -57
  58. data/templates/default/views/Page_meta.rhtml +6 -2
  59. data/templates/default/views/Page_revisions.rhtml +17 -9
  60. data/templates/default/views/Page_rss.rhtml +3 -1
  61. data/templates/default/views/Page_search_results.rhtml +11 -1
  62. data/templates/default/views/Page_view.rhtml +6 -2
  63. data/templates/default/views/UploadPage_edit.rhtml +58 -33
  64. data/templates/default/views/frame.rhtml +46 -27
  65. data/test/test_soks-utils.rb +37 -0
  66. metadata +27 -229
  67. data/templates/default/content/Bug%3A%20%5BFATAL%5D%20When%20renaming%20upload%20%2F%20picture%2.textile +0 -1
  68. data/templates/default/content/Bug%3A%20Automatic%20link%20links%20to%20stuff%20inside%20%3Chtml.textile +0 -1
  69. data/templates/default/content/Bug%3A%20Does%20not%20make%20use%20of%20if%2Dmodified%2Dsince%20r.textile +0 -1
  70. data/templates/default/content/Bug%3A%20Duplicate%20links%2Dto%20a%20page%20sometimes%20appear.textile +0 -1
  71. data/templates/default/content/Bug%3A%20External%20links%20incorrectly%20include%20trailing%20pu.textile +0 -1
  72. data/templates/default/content/Bug%3A%20In%20a%20list%20of%20links%2C%20the%20last%20link%20is%2.textile +0 -1
  73. data/templates/default/content/Bug%3A%20Inserted%20pages%20are%20not%20refreshed%20when%20new%20.textile +0 -1
  74. data/templates/default/content/Bug%3A%20No%20robots%2Etxt%20or%20favicon%2Eico.textile +0 -1
  75. data/templates/default/content/Bug%3A%20Page%20titles%20cannot%20have%20html%20tags%20in%20them.textile +0 -1
  76. data/templates/default/content/Bug%3A%20Punctuation%20in%20page%20titles%20still%20problematic.textile +0 -7
  77. data/templates/default/content/Bug%3A%20RSS%20feed%20shows%20oldest%2015%20revisions%20%28not%20.textile +0 -1
  78. data/templates/default/content/Bug%3A%20Search%20box%20width%20does%20not%20match%20column%20wid.textile +0 -1
  79. data/templates/default/content/Bug%3A%20Search%20includes%20leading%20and%20trailing%20spaces.textile +0 -1
  80. data/templates/default/content/Bug%3A%20Search%20inluced%20leading%20and%20trailing%20spaces.textile +0 -1
  81. data/templates/default/content/Bug%3A%20Site%20Index%20updates%20on%20every%20revision.textile +0 -1
  82. data/templates/default/content/Bug%3A%20Symbols%20are%20not%20always%20correctly%20rendered%20in.textile +0 -1
  83. data/templates/default/content/Bug%3A%20Uploads%20are%20not%20password%20protected.textile +0 -3
  84. data/templates/default/content/Bug%3A%20no%20superclass%20method%20%60%5Fdeprecated%5Fbase64.textile +0 -1
  85. data/templates/default/content/Fixed%20Bug%3A%20%5BFATAL%5D%20When%20renaming%20upload%20%2F%20p.textile +0 -34
  86. data/templates/default/content/Fixed%20Bug%3A%20Duplicate%20links%2Dto%20a%20page%20sometimes%20.textile +0 -3
  87. data/templates/default/content/Fixed%20Bug%3A%20External%20links%20incorrectly%20include%20trail.textile +0 -3
  88. data/templates/default/content/Fixed%20Bug%3A%20In%20a%20list%20of%20links%2C%20the%20last%20lin.textile +0 -13
  89. data/templates/default/content/Fixed%20Bug%3A%20Inserted%20pages%20are%20not%20refreshed%20when%.textile +0 -9
  90. data/templates/default/content/Fixed%20Bug%3A%20No%20robots%2Etxt%20or%20favicon%2Eico.textile +0 -4
  91. data/templates/default/content/Fixed%20Bug%3A%20RSS%20feed%20shows%20oldest%2015%20revisions%20%.textile +0 -15
  92. data/templates/default/content/Fixed%20Bug%3A%20Search%20box%20width%20does%20not%20match%20colu.textile +0 -3
  93. data/templates/default/content/Fixed%20Bug%3A%20Search%20includes%20leading%20and%20trailing%20s.textile +0 -3
  94. data/templates/default/content/Fixed%20Bug%3A%20Site%20Index%20updates%20on%20every%20revision.textile +0 -3
  95. data/templates/default/content/Fixed%20Bug%3A%20Symbols%20are%20not%20always%20correctly%20rende.textile +0 -5
  96. data/templates/default/content/Fixed%20Bug%3A%20no%20superclass%20method%20%60%5Fdeprecated%5Fba.textile +0 -3
  97. data/templates/default/content/Site%20Index.textile +0 -60
  98. data/templates/default/content/fixed%20bug%3A%20automatic%20link%20links%20to%20stuff%20inside%2.textile +0 -3
  99. data/templates/default/content/sandbox.textile +0 -2
  100. data/templates/default/content/test%20page.textile +0 -1
  101. data/templates/instiki/attachment/header_backdrop.png +0 -0
  102. data/templates/instiki/attachment/instiki_style_sheet.css +0 -199
  103. data/templates/instiki/attachment/logo.tiff +0 -0
  104. data/templates/instiki/attachment/logotext.png +0 -0
  105. data/templates/instiki/attachment/newpage.js +0 -41
  106. data/templates/instiki/attachment/rss.png +0 -0
  107. data/templates/instiki/banned_titles.txt +0 -31
  108. data/templates/instiki/content/All%20News.textile +0 -9
  109. data/templates/instiki/content/Attached%20ruby%20logo.textile +0 -1
  110. data/templates/instiki/content/Attached%20test%20thing.textile +0 -1
  111. data/templates/instiki/content/Author.textile +0 -12
  112. data/templates/instiki/content/Automatic%20Summaries.textile +0 -77
  113. data/templates/instiki/content/Automatic%20linking%20between%20pages.textile +0 -5
  114. data/templates/instiki/content/Bug%3A%20%5BFATAL%5D%20When%20renaming%20upload%20%2F%20picture%2.textile +0 -1
  115. data/templates/instiki/content/Bug%3A%20Automatic%20link%20links%20to%20stuff%20inside%20%3Chtml.textile +0 -1
  116. data/templates/instiki/content/Bug%3A%20Does%20not%20make%20use%20of%20if%2Dmodified%2Dsince%20r.textile +0 -1
  117. data/templates/instiki/content/Bug%3A%20Duplicate%20links%2Dto%20a%20page%20sometimes%20appear.textile +0 -1
  118. data/templates/instiki/content/Bug%3A%20External%20links%20incorrectly%20include%20trailing%20pu.textile +0 -1
  119. data/templates/instiki/content/Bug%3A%20GEM%20limits%20title%20lengths.textile +0 -1
  120. data/templates/instiki/content/Bug%3A%20In%20a%20list%20of%20links%2C%20the%20last%20link%20is%2.textile +0 -1
  121. data/templates/instiki/content/Bug%3A%20Inserted%20pages%20are%20not%20refreshed%20when%20new%20.textile +0 -1
  122. data/templates/instiki/content/Bug%3A%20No%20robots%2Etxt%20or%20favicon%2Eico.textile +0 -1
  123. data/templates/instiki/content/Bug%3A%20Page%20titles%20cannot%20have%20html%20tags%20in%20them.textile +0 -1
  124. data/templates/instiki/content/Bug%3A%20Punctuation%20in%20page%20titles%20still%20problematic.textile +0 -7
  125. data/templates/instiki/content/Bug%3A%20RSS%20feed%20shows%20oldest%2015%20revisions%20%28not%20.textile +0 -1
  126. data/templates/instiki/content/Bug%3A%20Search%20box%20width%20does%20not%20match%20column%20wid.textile +0 -1
  127. data/templates/instiki/content/Bug%3A%20Search%20includes%20leading%20and%20trailing%20spaces.textile +0 -1
  128. data/templates/instiki/content/Bug%3A%20Search%20inluced%20leading%20and%20trailing%20spaces.textile +0 -1
  129. data/templates/instiki/content/Bug%3A%20Site%20Index%20updates%20on%20every%20revision.textile +0 -1
  130. data/templates/instiki/content/Bug%3A%20Symbols%20are%20not%20always%20correctly%20rendered%20in.textile +0 -1
  131. data/templates/instiki/content/Bug%3A%20Uploads%20are%20not%20password%20protected.textile +0 -3
  132. data/templates/instiki/content/Bug%3A%20no%20superclass%20method%20%60%5Fdeprecated%5Fbase64.textile +0 -1
  133. data/templates/instiki/content/Bug%3A%20notextile%20does%20not%20prevent%20page%20inserts.textile +0 -1
  134. data/templates/instiki/content/Fixed%20Bug%3A%20%5BFATAL%5D%20When%20renaming%20upload%20%2F%20p.textile +0 -34
  135. data/templates/instiki/content/Fixed%20Bug%3A%20Duplicate%20links%2Dto%20a%20page%20sometimes%20.textile +0 -3
  136. data/templates/instiki/content/Fixed%20Bug%3A%20External%20links%20incorrectly%20include%20trail.textile +0 -3
  137. data/templates/instiki/content/Fixed%20Bug%3A%20In%20a%20list%20of%20links%2C%20the%20last%20lin.textile +0 -13
  138. data/templates/instiki/content/Fixed%20Bug%3A%20Inserted%20pages%20are%20not%20refreshed%20when%.textile +0 -9
  139. data/templates/instiki/content/Fixed%20Bug%3A%20No%20robots%2Etxt%20or%20favicon%2Eico.textile +0 -4
  140. data/templates/instiki/content/Fixed%20Bug%3A%20RSS%20feed%20shows%20oldest%2015%20revisions%20%.textile +0 -15
  141. data/templates/instiki/content/Fixed%20Bug%3A%20Search%20box%20width%20does%20not%20match%20colu.textile +0 -3
  142. data/templates/instiki/content/Fixed%20Bug%3A%20Search%20includes%20leading%20and%20trailing%20s.textile +0 -3
  143. data/templates/instiki/content/Fixed%20Bug%3A%20Site%20Index%20updates%20on%20every%20revision.textile +0 -3
  144. data/templates/instiki/content/Fixed%20Bug%3A%20Symbols%20are%20not%20always%20correctly%20rende.textile +0 -5
  145. data/templates/instiki/content/Fixed%20Bug%3A%20no%20superclass%20method%20%60%5Fdeprecated%5Fba.textile +0 -3
  146. data/templates/instiki/content/Home%20Page.textile +0 -19
  147. data/templates/instiki/content/How%20to%20administrate%20this%20wiki.textile +0 -62
  148. data/templates/instiki/content/How%20to%20change%20the%20way%20this%20wiki%20looks.textile +0 -30
  149. data/templates/instiki/content/How%20to%20export%20a%20site%20from%20this%20wiki.textile +0 -60
  150. data/templates/instiki/content/How%20to%20hack%20soks.textile +0 -61
  151. data/templates/instiki/content/How%20to%20import%20a%20site%20from%20instiki.textile +0 -13
  152. data/templates/instiki/content/How%20to%20install%20Soks.textile +0 -27
  153. data/templates/instiki/content/How%20to%20report%20a%20bug.textile +0 -8
  154. data/templates/instiki/content/How%20to%20use%20the%20keyboard%20shortcuts.textile +0 -13
  155. data/templates/instiki/content/How%20to%20use%20this%20wiki.textile +0 -27
  156. data/templates/instiki/content/Instructions%20and%20Howtos.textile +0 -18
  157. data/templates/instiki/content/Known%20bugs.textile +0 -15
  158. data/templates/instiki/content/Latest%20News.textile +0 -9
  159. data/templates/instiki/content/List%20of%20changes.textile +0 -67
  160. data/templates/instiki/content/Picture%20of%20Type%20a%20title%20here.textile +0 -1
  161. data/templates/instiki/content/Picture%20of%20a%20logo%20for%20the%20ruby%20language.textile +0 -1
  162. data/templates/instiki/content/Picture%20of%20a%20pair%20of%20soks.textile +0 -1
  163. data/templates/instiki/content/Picture%20of%20powered%20by%20ruby%20logo.textile +0 -1
  164. data/templates/instiki/content/Planned%20Features.textile +0 -19
  165. data/templates/instiki/content/README.textile +0 -63
  166. data/templates/instiki/content/RSS%20feed.textile +0 -7
  167. data/templates/instiki/content/Recent%20Blog%20Entries.textile +0 -5
  168. data/templates/instiki/content/Recent%20Changes%20to%20This%20Site.textile +0 -211
  169. data/templates/instiki/content/Recent%20News.textile +0 -9
  170. data/templates/instiki/content/Ruby.textile +0 -9
  171. data/templates/instiki/content/SOKS%20features.textile +0 -16
  172. data/templates/instiki/content/Site%20Index.textile +0 -60
  173. data/templates/instiki/content/Soks%20Licence.textile +0 -64
  174. data/templates/instiki/content/fixed%20bug%3A%20automatic%20link%20links%20to%20stuff%20inside%2.textile +0 -3
  175. data/templates/instiki/content/let%20me%20know.textile +0 -1
  176. data/templates/instiki/content/sandbox.textile +0 -2
  177. data/templates/instiki/content/tamc2.textile +0 -1
  178. data/templates/instiki/content/test%20page.textile +0 -1
  179. data/templates/instiki/start.rb +0 -112
  180. data/templates/instiki/version.txt +0 -1
  181. data/templates/instiki/views/Page_content.rhtml +0 -1
  182. data/templates/instiki/views/Page_edit.rhtml +0 -8
  183. data/templates/instiki/views/Page_meta.rhtml +0 -34
  184. data/templates/instiki/views/Page_print.rhtml +0 -6
  185. data/templates/instiki/views/Page_revisions.rhtml +0 -17
  186. data/templates/instiki/views/Page_rss.rhtml +0 -55
  187. data/templates/instiki/views/Page_search_results.rhtml +0 -18
  188. data/templates/instiki/views/Page_view.rhtml +0 -2
  189. data/templates/instiki/views/UploadPage_edit.rhtml +0 -16
  190. data/templates/instiki/views/frame.rhtml +0 -90
  191. data/templates/instiki/views/messages.yaml +0 -6
  192. data/templates/rails/attachment/2colheader.css +0 -77
  193. data/templates/rails/attachment/basics.css +0 -98
  194. data/templates/rails/attachment/header_backdrop.png +0 -0
  195. data/templates/rails/attachment/logo.tiff +0 -0
  196. data/templates/rails/attachment/logotext.png +0 -0
  197. data/templates/rails/attachment/newpage.js +0 -41
  198. data/templates/rails/attachment/rss.png +0 -0
  199. data/templates/rails/banned_titles.txt +0 -31
  200. data/templates/rails/content/All%20News.textile +0 -9
  201. data/templates/rails/content/Attached%20ruby%20logo.textile +0 -1
  202. data/templates/rails/content/Attached%20test%20thing.textile +0 -1
  203. data/templates/rails/content/Author.textile +0 -12
  204. data/templates/rails/content/Automatic%20Summaries.textile +0 -77
  205. data/templates/rails/content/Automatic%20linking%20between%20pages.textile +0 -5
  206. data/templates/rails/content/Bug%3A%20%5BFATAL%5D%20When%20renaming%20upload%20%2F%20picture%2.textile +0 -1
  207. data/templates/rails/content/Bug%3A%20Automatic%20link%20links%20to%20stuff%20inside%20%3Chtml.textile +0 -1
  208. data/templates/rails/content/Bug%3A%20Does%20not%20make%20use%20of%20if%2Dmodified%2Dsince%20r.textile +0 -1
  209. data/templates/rails/content/Bug%3A%20Duplicate%20links%2Dto%20a%20page%20sometimes%20appear.textile +0 -1
  210. data/templates/rails/content/Bug%3A%20External%20links%20incorrectly%20include%20trailing%20pu.textile +0 -1
  211. data/templates/rails/content/Bug%3A%20GEM%20limits%20title%20lengths.textile +0 -1
  212. data/templates/rails/content/Bug%3A%20In%20a%20list%20of%20links%2C%20the%20last%20link%20is%2.textile +0 -1
  213. data/templates/rails/content/Bug%3A%20Inserted%20pages%20are%20not%20refreshed%20when%20new%20.textile +0 -1
  214. data/templates/rails/content/Bug%3A%20No%20robots%2Etxt%20or%20favicon%2Eico.textile +0 -1
  215. data/templates/rails/content/Bug%3A%20Page%20titles%20cannot%20have%20html%20tags%20in%20them.textile +0 -1
  216. data/templates/rails/content/Bug%3A%20Punctuation%20in%20page%20titles%20still%20problematic.textile +0 -7
  217. data/templates/rails/content/Bug%3A%20RSS%20feed%20shows%20oldest%2015%20revisions%20%28not%20.textile +0 -1
  218. data/templates/rails/content/Bug%3A%20Search%20box%20width%20does%20not%20match%20column%20wid.textile +0 -1
  219. data/templates/rails/content/Bug%3A%20Search%20includes%20leading%20and%20trailing%20spaces.textile +0 -1
  220. data/templates/rails/content/Bug%3A%20Search%20inluced%20leading%20and%20trailing%20spaces.textile +0 -1
  221. data/templates/rails/content/Bug%3A%20Site%20Index%20updates%20on%20every%20revision.textile +0 -1
  222. data/templates/rails/content/Bug%3A%20Symbols%20are%20not%20always%20correctly%20rendered%20in.textile +0 -1
  223. data/templates/rails/content/Bug%3A%20Uploads%20are%20not%20password%20protected.textile +0 -3
  224. data/templates/rails/content/Bug%3A%20no%20superclass%20method%20%60%5Fdeprecated%5Fbase64.textile +0 -1
  225. data/templates/rails/content/Bug%3A%20notextile%20does%20not%20prevent%20page%20inserts.textile +0 -1
  226. data/templates/rails/content/Fixed%20Bug%3A%20%5BFATAL%5D%20When%20renaming%20upload%20%2F%20p.textile +0 -34
  227. data/templates/rails/content/Fixed%20Bug%3A%20Duplicate%20links%2Dto%20a%20page%20sometimes%20.textile +0 -3
  228. data/templates/rails/content/Fixed%20Bug%3A%20External%20links%20incorrectly%20include%20trail.textile +0 -3
  229. data/templates/rails/content/Fixed%20Bug%3A%20In%20a%20list%20of%20links%2C%20the%20last%20lin.textile +0 -13
  230. data/templates/rails/content/Fixed%20Bug%3A%20Inserted%20pages%20are%20not%20refreshed%20when%.textile +0 -9
  231. data/templates/rails/content/Fixed%20Bug%3A%20No%20robots%2Etxt%20or%20favicon%2Eico.textile +0 -4
  232. data/templates/rails/content/Fixed%20Bug%3A%20RSS%20feed%20shows%20oldest%2015%20revisions%20%.textile +0 -15
  233. data/templates/rails/content/Fixed%20Bug%3A%20Search%20box%20width%20does%20not%20match%20colu.textile +0 -3
  234. data/templates/rails/content/Fixed%20Bug%3A%20Search%20includes%20leading%20and%20trailing%20s.textile +0 -3
  235. data/templates/rails/content/Fixed%20Bug%3A%20Site%20Index%20updates%20on%20every%20revision.textile +0 -3
  236. data/templates/rails/content/Fixed%20Bug%3A%20Symbols%20are%20not%20always%20correctly%20rende.textile +0 -5
  237. data/templates/rails/content/Fixed%20Bug%3A%20no%20superclass%20method%20%60%5Fdeprecated%5Fba.textile +0 -3
  238. data/templates/rails/content/Home%20Page.textile +0 -19
  239. data/templates/rails/content/How%20to%20administrate%20this%20wiki.textile +0 -62
  240. data/templates/rails/content/How%20to%20change%20the%20way%20this%20wiki%20looks.textile +0 -30
  241. data/templates/rails/content/How%20to%20export%20a%20site%20from%20this%20wiki.textile +0 -60
  242. data/templates/rails/content/How%20to%20hack%20soks.textile +0 -61
  243. data/templates/rails/content/How%20to%20import%20a%20site%20from%20instiki.textile +0 -13
  244. data/templates/rails/content/How%20to%20install%20Soks.textile +0 -27
  245. data/templates/rails/content/How%20to%20report%20a%20bug.textile +0 -8
  246. data/templates/rails/content/How%20to%20use%20the%20keyboard%20shortcuts.textile +0 -13
  247. data/templates/rails/content/How%20to%20use%20this%20wiki.textile +0 -27
  248. data/templates/rails/content/Instructions%20and%20Howtos.textile +0 -18
  249. data/templates/rails/content/Known%20bugs.textile +0 -15
  250. data/templates/rails/content/Latest%20News.textile +0 -9
  251. data/templates/rails/content/List%20of%20changes.textile +0 -67
  252. data/templates/rails/content/Picture%20of%20Type%20a%20title%20here.textile +0 -1
  253. data/templates/rails/content/Picture%20of%20a%20logo%20for%20the%20ruby%20language.textile +0 -1
  254. data/templates/rails/content/Picture%20of%20a%20pair%20of%20soks.textile +0 -1
  255. data/templates/rails/content/Picture%20of%20powered%20by%20ruby%20logo.textile +0 -1
  256. data/templates/rails/content/Planned%20Features.textile +0 -19
  257. data/templates/rails/content/README.textile +0 -63
  258. data/templates/rails/content/RSS%20feed.textile +0 -7
  259. data/templates/rails/content/Recent%20Blog%20Entries.textile +0 -5
  260. data/templates/rails/content/Recent%20Changes%20to%20This%20Site.textile +0 -211
  261. data/templates/rails/content/Recent%20News.textile +0 -9
  262. data/templates/rails/content/Ruby.textile +0 -9
  263. data/templates/rails/content/SOKS%20features.textile +0 -16
  264. data/templates/rails/content/Site%20Index.textile +0 -60
  265. data/templates/rails/content/Soks%20Licence.textile +0 -64
  266. data/templates/rails/content/fixed%20bug%3A%20automatic%20link%20links%20to%20stuff%20inside%2.textile +0 -3
  267. data/templates/rails/content/let%20me%20know.textile +0 -1
  268. data/templates/rails/content/sandbox.textile +0 -2
  269. data/templates/rails/content/tamc2.textile +0 -1
  270. data/templates/rails/content/test%20page.textile +0 -1
  271. data/templates/rails/start.rb +0 -113
  272. data/templates/rails/version.txt +0 -1
  273. data/templates/rails/views/Page_content.rhtml +0 -1
  274. data/templates/rails/views/Page_edit.rhtml +0 -61
  275. data/templates/rails/views/Page_meta.rhtml +0 -38
  276. data/templates/rails/views/Page_print.rhtml +0 -6
  277. data/templates/rails/views/Page_revisions.rhtml +0 -19
  278. data/templates/rails/views/Page_rss.rhtml +0 -55
  279. data/templates/rails/views/Page_search_results.rhtml +0 -19
  280. data/templates/rails/views/Page_view.rhtml +0 -3
  281. data/templates/rails/views/UploadPage_edit.rhtml +0 -38
  282. data/templates/rails/views/frame.rhtml +0 -60
  283. data/templates/rails/views/messages.yaml +0 -6
  284. /data/templates/default/attachment/{logo_thumb.bmp → tiny-logo thumb.bmp} +0 -0
data/README.txt CHANGED
@@ -2,6 +2,7 @@ h1. SOKS: Another Ruby Wiki
2
2
 
3
3
  * This application is a Wiki (a system to allow the easy and collaborative editing of web pages).
4
4
  * The project has been kindly hosted at http://rubyforge.org/projects/soks/
5
+ * The project wiki/home page is at www.soks.org
5
6
 
6
7
  Quickstart:
7
8
  # gem install Soks
@@ -17,12 +18,13 @@ h2. AUTHOR
17
18
 
18
19
  * This software is copyright (c) Thomas Counsell 2004, 2005. tamc@rubyforge.org
19
20
  * It is licensed under the Ruby Licence, a liberal open source licence. See LICENCE for more details.
21
+ * The author appreciates the code, suggestions and libraries provided by a buch of other people, see www.soks.org/author for individual acknowledgements.
20
22
 
21
23
  h2. INSTALL
22
24
 
23
25
  Preferably:
24
26
  # Install rubygems from http://rubyforge.org/projects/rubygems/
25
- # gem install Soks (you may need to be root first)
27
+ # @gem install Soks@ (you may need to be root first)
26
28
 
27
29
  Alternatively
28
30
  # Download the tar or zip file from http://rubyforge.org/projects/soks/
@@ -31,13 +33,17 @@ Alternatively
31
33
 
32
34
  h2. USE
33
35
 
34
- execute soks-create-wiki.rb (will be in your path if installed by gems, otherwise ./bin/soks-create-wiki.rb from the soks directory)
36
+ execute @soks-create-wiki.rb@ (will be in your path if installed by gems, otherwise @./bin/soks-create-wiki.rb@ from the soks directory)
35
37
  This will create a folder called soks-wiki in the current directory and launch the wiki. Surfing to http://localhost:8000 to see it (it is initially accessible from localhost only)
36
38
 
37
39
  To restart the wiki change into the soks-wiki directory and execute ruby start.rb
38
40
 
39
41
  To change the settings (url, port, etc) edit the start.rb file in the soks-wiki directory.
40
42
 
43
+ h2. UPGRADE
44
+
45
+ If you already have a previous version of soks then to upgrade, run @soks-create-wiki.rb --destination-dir=path/to/your/wiki@ and it will guide you through the upgrade.
46
+
41
47
  h2. FEATURES
42
48
 
43
49
  # Runs on its own webrick server (no independent web server required)
@@ -52,12 +58,16 @@ h2. FEATURES
52
58
  h2. BUGS
53
59
 
54
60
  I suspect there are many, as befits its version number. In particular it has:
55
- * No authentication on pictures and attachments
56
- * Punctuation in page titles problematic. ? <> and [] cause problems. : and / are ok.
57
61
  * Insert page commands are not inhibited by notextile, pre or code tags
62
+ * Does not permit browsers to cache pages
63
+ * Not user friendly in the way it handles simultaneous edits of a page (last person to save wins)
64
+ * Some bugs in layout and formatting of text.
65
+
66
+ See http://www.soks.org/wiki/KnownBugs for details.
58
67
 
59
68
  h2. RELEASES
60
69
 
70
+ # 2005 Mar 15 - soks-0.0.6 - Fourth public release (alpha)
61
71
  # 2005 Feb 12 - soks-0.0.5 - Third public release (alpha)
62
72
  # 2005 Jan 24 - soks-0.0.4 - Second public release (alpha)
63
73
  # 2005 Jan 11 - soks-0.0.2 - First public release (alpha)
@@ -95,7 +95,7 @@ if create && !File.exists?( destination)
95
95
  end
96
96
  puts "Creating wiki at #{destination} from #{source}"
97
97
  copy_template( source, destination )
98
- fill_out_script_template( destination, 'start.rb', { :root_directory => File.expand_path( destination ), :soks_libraries => soks_library, :url => url, :port => port } )
98
+ fill_out_script_template( destination, 'start.rb', { :root_directory => File.expand_path( destination ), :soks_libraries => soks_library, :url => url, :port => port, :version => version_number_from_wiki( destination ) } )
99
99
  end
100
100
 
101
101
  if upgrade
@@ -166,7 +166,7 @@ if upgrade
166
166
  old_port = prompt.ask("What port will this wiki be accessed from?",old_port )
167
167
  end
168
168
 
169
- fill_out_script_template( destination, 'start.rb', { :root_directory => File.expand_path( destination ), :soks_libraries => soks_library, :url => old_url, :port => old_port } )
169
+ fill_out_script_template( destination, 'start.rb', { :root_directory => File.expand_path( destination ), :soks_libraries => soks_library, :url => old_url, :port => old_port, :version => version_number_from_wiki( destination ) } )
170
170
 
171
171
  puts "\nI'm very sorry, but if you modified the authenticators, or added any AutomaticSummaries or AutomaticCalendars or suchlike, then you will need to copy them across manually from #{old_wiki}/start.rb to #{destination}/start.rb.\n Note that their api may have changed, so please look at the examples in #{destination}/start.rb\n\nOnce you have done that, run ruby #{destination}/start.rb to start."
172
172
  exit
@@ -297,7 +297,6 @@ class RedCloth < String
297
297
  clean_html text if filter_html
298
298
  text.strip!
299
299
  text
300
-
301
300
  end
302
301
 
303
302
  #######
@@ -114,7 +114,7 @@ class AutomaticSummary
114
114
  content, tail = $1, $2
115
115
  end
116
116
  end
117
- content ||= "h2. #{@settings[:pagename]}\n\np{font-size: x-small;}. #{@settings[:pagename]} was created automatically from pages whose title matches #{@settings[:regexp_for_title].inspect}.\n\n<automaticsummary>"
117
+ content ||= "h2. #{@settings[:pagename]}\n\np{font-size: x-small;}. #{@settings[:pagename]} was created automatically from pages whose title matches ==#{@settings[:regexp_for_title].inspect}==.\n\n<automaticsummary>"
118
118
  tail ||= "</automaticsummary>"
119
119
  content << "\n\n"
120
120
  if @pages_in_summary.empty?
@@ -160,13 +160,14 @@ class AutomaticRecentChanges
160
160
 
161
161
  def initialize( wiki, changes = 200, pagename = "Recent Changes to This Site", author = "AutomaticRecentChanges" )
162
162
  AutomaticSummary.new( wiki, { :pagename => pagename,
163
- :author => author,
164
- :only_new_pages => false,
165
- :sort_pages_by => :revised_on,
166
- :include_metadata => true,
167
- :summarise_revisions => true,
168
- :reverse_sort => true,
169
- :remove_deleted_pages => false,
163
+ :max_pages_to_show => changes,
164
+ :author => author,
165
+ :only_new_pages => false,
166
+ :sort_pages_by => :revised_on,
167
+ :include_metadata => true,
168
+ :summarise_revisions => true,
169
+ :reverse_sort => true,
170
+ :remove_deleted_pages => false,
170
171
  } )
171
172
  end
172
173
  end
@@ -227,7 +228,7 @@ class AutomaticCalendar
227
228
  end
228
229
 
229
230
  def calendar_for( month )
230
- content = "<div class='calendar'>\n"
231
+ content = "<div class='calendar'>\n\n"
231
232
  content << "|_. Su |_. Mo |_. Tu |_. We |_. Th |_. Fr |_. Sa |\n"
232
233
  1.upto( time_for( month, 1 ).wday ) { content << "| . " }
233
234
  day = nil
@@ -240,7 +241,7 @@ class AutomaticCalendar
240
241
  day.wday.upto( 5 ) { content << "| . " }
241
242
  content << "|\n"
242
243
  content << "\n\n< #{month_pagename( month-1 )} #{month_pagename( month+1 )} >\n"
243
- content << "</div>"
244
+ content << "\n</div>"
244
245
  end
245
246
 
246
247
  def time_for( month, day = 1 )
@@ -282,14 +283,14 @@ class AutomaticUpcomingEvents
282
283
  end
283
284
 
284
285
  def render_upcoming_events
285
- content = "<div class='upcomingevents'>\n"
286
+ content = "<div class='upcomingevents'>\n\n"
286
287
  Time.now.day.upto( Time.now.day+7 ) do |day|
287
288
  time = @calendar.time_for( Time.now.month, day )
288
289
  content << "| [[ #{relative_day( time ) } => #{@calendar.day_pagename( time )} ]] |"
289
290
  content << (@wiki.exists?( @calendar.day_pagename(time) ) ? render_event( @calendar.day_pagename( time ) ) : "&nbsp; |\n")
290
291
  end
291
292
  content << "\n\np(more). [[(more) => #{@calendar.month_pagename}]]\n\n"
292
- content << "</div>\n"
293
+ content << "\n</div>\n"
293
294
  @wiki.revise( "Upcoming Events", content , "AutomaticCalendar" )
294
295
  end
295
296
 
@@ -9,6 +9,7 @@ class Message
9
9
  envelope = @imap.fetch( @message_id, 'ENVELOPE' ).first.attr['ENVELOPE']
10
10
  @subject = envelope['subject']
11
11
  @sender_name = envelope['from'].first['name']
12
+ @date = envelope['date']
12
13
  @sender_email = envelope['from'].first['mailbox'] + '@' + envelope['from'].first['host']
13
14
  @text = plain_text_content_from_message( message_id )
14
15
  end
@@ -18,9 +19,14 @@ class Message
18
19
  text.gsub!(/\r\n/,"\n")
19
20
  text.gsub!(/\r/,"\n")
20
21
  text.gsub!(/=\n/,'')
21
- text.gsub!(/((?:=[0-9a-fA-F]{2})+)/n) { [$1.delete('=')].pack('H*') }
22
+ #text.gsub!(/((?:=[0-9a-fA-F]{2})+)/n) { [$1.delete('=')].pack('H*') }
23
+
22
24
  text
23
25
  end
26
+
27
+ def textile
28
+ text.gsub(/[\*-]{2,}/,'').gsub(/([^\n])\n([^\n])/,'\1\2').gsub(/^[ \t]+/,'')
29
+ end
24
30
 
25
31
  end
26
32
 
@@ -29,9 +35,9 @@ class Mail2WikiHelper
29
35
  DEFAULT_SETTINGS = {
30
36
  :server => 'imap.hermes.cam.ac.uk',
31
37
  :username => 'tamc2',
32
- :password => '',
38
+ :password => 'missing_a_password',
33
39
  :mailbox => 'mcr notices',
34
- :check_frequency => 600, # Seconds
40
+ :check_period => 600, # Seconds
35
41
  :subject_regexp => /.*/,
36
42
  }
37
43
 
@@ -41,7 +47,7 @@ class Mail2WikiHelper
41
47
  check_mailbox
42
48
  Thread.new do
43
49
  loop do
44
- sleep @settings[:check_frequency ]
50
+ sleep @settings[:check_period ]
45
51
  check_mailbox
46
52
  end
47
53
  end
@@ -52,7 +58,6 @@ class Mail2WikiHelper
52
58
  def check_mailbox
53
59
  login
54
60
  select_mailbox
55
- p "Checking for emails in #{@settings[:server]}"
56
61
  new_messages_for_wiki do |message_id|
57
62
  this_message = Message.new( @imap, message_id )
58
63
  if this_message.subject =~ @settings[:subject_regexp]
@@ -70,9 +75,9 @@ class Mail2WikiHelper
70
75
  else
71
76
  text = current_page.textile
72
77
  end
73
- text << "\n\n----\n\n"
78
+ text << "\n\n"
74
79
  text << "#{message.date} from #{message.sender_name} #{message.sender_email}\n"
75
- text << message.text.gsub(/[\*-]{2,}/,'').gsub(/\n\s+/,"\n").gsub(/\n/,"\n\n")
80
+ text << message.text
76
81
  @wiki.revise(message.subject, text, message.sender_name )
77
82
  end
78
83
 
@@ -0,0 +1,15 @@
1
+ require 'mail2wiki-helper'
2
+
3
+ @imap = Net::IMAP.new('imap.hermes.cam.ac.uk')
4
+ @imap.login( 'tamc2', 'iama8yes' )
5
+
6
+ @imap.select 'mcr notices'
7
+
8
+ message = Message.new( @imap, 1 )
9
+
10
+ p message.date
11
+ p message.subject
12
+ p message.textile
13
+
14
+ @imap.logout
15
+ @imap.disconnect
@@ -0,0 +1,60 @@
1
+ class Wiki2Html
2
+
3
+ DEFAULT_SETTINGS = {
4
+ :views_to_copy => ['view','meta','rss'],
5
+ :extension => '.html',
6
+ :destination_dir => '/Users/tamc2/Sites',
7
+ :destination_url => 'http://localhost/~tamc2'
8
+ }
9
+
10
+ def initialize( wiki, view, settings = {} )
11
+ @settings = DEFAULT_SETTINGS.merge( settings )
12
+ @wiki, @view = wiki, view
13
+ @wiki.watch_for( :page_created, :page_deleted ) { |event, page| new_page( page ) }
14
+ @wiki.watch_for( :page_revised ) { |event, page| page_revised( page ) }
15
+ update_all_pages
16
+ end
17
+
18
+ def new_page( page )
19
+ copy_all_views( page.name )
20
+ titleregex = Regexp.new( page.name, Regexp::IGNORECASE )
21
+ @wiki.each { |name, linkedpage |
22
+ page_revised( linkedpage ) if linkedpage.textile =~ titleregex
23
+ }
24
+ end
25
+
26
+ def page_revised( page )
27
+ copy_all_views( page.name )
28
+ page.inserted_into.each { |including_page| copy_all_views( including_page.name ) }
29
+ end
30
+
31
+ def update_all_pages
32
+ @wiki.each { |pagename, page| copy_all_views( pagename) }
33
+ end
34
+
35
+ def copy_all_views( pagename )
36
+ @settings[:views_to_copy].each { |view| copy_view( pagename, view ) }
37
+ end
38
+
39
+ def copy_view( pagename, view )
40
+ $stderr.puts "Copying #{pagename} #{view}"
41
+ html = @view.view( pagename, view )
42
+ update_links html
43
+ destination = "#{@settings[:destination_dir]}/#{view}/#{pagename}#{@settings[:extension]}".downcase
44
+ File.mkpath(File.dirname(destination)) unless File.exists?(File.dirname(destination))
45
+ File.open( destination,'w') {|file| file.puts html}
46
+ end
47
+
48
+ def update_links( html )
49
+ old_link = /['"]#{$SETTINGS[:url]}\/(.*?)\/(.*?)(\.\w*)?['"]/
50
+ html.gsub!(old_link) do |match|
51
+ if ($1.downcase == 'attachment' || @settings[:views_to_copy].include?( $1.downcase ))
52
+ "'#{@settings[:destination_url]}\/#{$1.downcase}\/#{$2.downcase}#{$3 || @settings[:extension]}'"
53
+ else
54
+ match
55
+ end
56
+ end
57
+ html
58
+ end
59
+
60
+ end
data/lib/soks-drb.rb ADDED
@@ -0,0 +1,20 @@
1
+ #!/usr/local/bin/ruby
2
+ require 'drb'
3
+
4
+ def start_wiki( settings = {}, &automatic_agents )
5
+
6
+ $SETTINGS.merge! settings
7
+ $MESSAGES = YAML.load( IO.readlines("#{$SETTINGS[:root_directory]}/views/messages.yaml").join )
8
+
9
+ wiki = Wiki.new( "#{$SETTINGS[:root_directory]}/content" )
10
+ view = View.new( wiki, $SETTINGS[:name] )
11
+
12
+ Thread.new( automatic_agents, wiki, view ) do |block, wiki, view|
13
+ block.call( wiki, view )
14
+ end.priority = -2
15
+
16
+ DRb.start_service( 'druby://localhost:9001', view)
17
+ DRb.thread.join
18
+
19
+ $stderr.puts "Wiki started as DRb on druby://localhost:9001"
20
+ end
data/lib/soks-fcgi.rb ADDED
@@ -0,0 +1,127 @@
1
+ #!/usr/local/bin/ruby
2
+ require 'cgi'
3
+ require 'drb'
4
+ # Require authenticators
5
+
6
+ class CGI
7
+ def redirect( where )
8
+ print this.header( { 'Status' => '302 Moved', 'location' =>
9
+ '#{where}' } )
10
+ end
11
+ end
12
+
13
+ # Default settings moved to soks.rb
14
+
15
+ class WikiCgi
16
+
17
+ def initialize( cgi, wiki, settings )
18
+ @cgi, @wiki, @name, @wikiurl, @authenticators = server, wiki, settings[:name] , settings[:url] , settings[:authenticators]
19
+ end
20
+
21
+ def service( cgi )
22
+ case cgi.path_translated
23
+ # Redirect some cgis to static file servlet
24
+ when '/robots.txt', '/favicon.ico' ;
25
+ cgi.redirect( "#{@wikiurl}/attachment#{cgi.path_translated}")
26
+ # If cgi of the form /verb/pagename then execute the approriate method
27
+ when /\/(\w+?)\/(.+)/
28
+ verb, pagename = $1, $2
29
+ # authenticate cgi, response
30
+ if self.respond_to?( "do#{verb.capitalize}" )
31
+ self.send( "do#{verb.capitalize}", cgi, pagename, cgi.remote_user )
32
+ else
33
+ cgi.out { @wiki.view( pagename, verb, cgi.remote_user ) }
34
+ end
35
+ when /\/(.+)/ ; redirect( cgi, $1, 'view' ) # No verb given
36
+ when "/" ; redirect( cgi, "Home Page", 'view' ) # No page or verb given
37
+ end
38
+
39
+ #response['Content-Type'] ||= "text/html"
40
+ #response['Cache-control'] ||= 'no-cache'
41
+ #response['Pragma'] ||= 'no-cache'
42
+ end
43
+
44
+ def authenticate( cgi )
45
+ @authenticators.each do |path_regex,authenticator|
46
+ if cgi.path_translated.downcase =~ path_regex
47
+ authenticator.authenticate( cgi )
48
+ break
49
+ end
50
+ end
51
+ end
52
+
53
+ def redirect( cgi, pagename, verb = 'view' )
54
+ pagename = pagename.url_encode # Reformat into url encoding
55
+ cgi.redirect( verb ? "#{@wikiurl}/#{verb}/#{pagename}" : "#{@wikiurl}/#{pagename}")
56
+ end
57
+
58
+ def doWiki( cgi, pagename, person )
59
+ redirect( pagename.gsub(/([a-z])([A-Z])/,'\1 \2') )
60
+ end
61
+
62
+ def doFind( cgi, pagename, person )
63
+ cgi.out { @wiki.find( cgi.query['regex'].strip ) }
64
+ end
65
+
66
+ def doSave( cgi, pagename, person )
67
+ content = cgi.query["content"].to_s
68
+ newpagename = cgi.query["titleprefix"].to_s + cgi.query["newtitle"].to_s
69
+ @wiki.revise( pagename, content.gsub(/\r\n/,"\n"), person, newpagename) if content
70
+ redirect( newpagename )
71
+ end
72
+
73
+ def doRollback( cgi, pagename, person )
74
+ revision = cgi.query['revision'] ? cgi.query['revision'].to_i : nil
75
+ @wiki.rollback( pagename, revision, person ) if revision
76
+ redirect( pagename )
77
+ end
78
+
79
+ def doDelete( cgi, pagename, person )
80
+ @wiki.delete( pagename, person )
81
+ redirect( pagename )
82
+ end
83
+
84
+ def doUpload( cgi, pagename, person )
85
+ newpagename = cgi.query["titleprefix"].to_s + cgi.query["newtitle"].to_s
86
+ unless cgi.query['file'] == ""
87
+ @wiki.revise( pagename, upload( cgi.query['file'].filename[/[0-9A-Za-z.]*$/], cgi.query['file'] ) , person, newpagename )
88
+ else
89
+ @wiki.move( pagename, person, newpagename )
90
+ end
91
+ redirect( newpagename )
92
+ end
93
+
94
+ def doRss( cgi, pagename, person )
95
+ cgi.out { @wiki.view( pagename, 'rss', person ) }
96
+ # response["Content-Type"] = "text/xml"
97
+ end
98
+
99
+ private
100
+
101
+ def upload( filename, filedata )
102
+ path = "#{$SETTINGS[:root_directory]}/attachment/"
103
+ filename = unique_filename( path ,filename )
104
+ File.open( File.join( path, filename ), 'wb' ) { |file| filedata.list.each { |data| file << data } }
105
+ "/attachment/#{filename}"
106
+ end
107
+
108
+ def unique_filename( path, filename )
109
+ bits = filename.split(/\./)
110
+ while File.exist? File.join( path, filename )
111
+ if bits.length >= 1
112
+ bits[-2].succ!
113
+ else
114
+ bits[0].succ!
115
+ end
116
+ filename = bits.join('.')
117
+ end
118
+ filename
119
+ end
120
+ end
121
+
122
+ wiki = DRbObject.new( nil, 'druby://localhost:9001')
123
+ settings = wiki.settings
124
+ cgi = CGI.new
125
+
126
+ cgi = WikiCgi.new( cgi, wiki, settings )
127
+ cgi.service
data/lib/soks-model.rb CHANGED
@@ -130,8 +130,8 @@ class UploadPage < Page
130
130
  end
131
131
 
132
132
  class ImagePage < UploadPage
133
- def textile( content = @content )
134
- deleted? ? content : "!#{content}(#{@name})!:/#{@name.url_encode}\n"
133
+ def textile( content = @content )
134
+ deleted? ? content : "!#{$SETTINGS[:url]}#{content.strip}!:#{$SETTINGS[:url]}/view/#{@name.url_encode}"
135
135
  end
136
136
 
137
137
  def name_for_index; @name[10..-1].strip.downcase end
@@ -139,7 +139,7 @@ end
139
139
 
140
140
  class AttachmentPage < UploadPage
141
141
  def textile( content = @content )
142
- deleted? ? content : %Q{"#{@name}":#{content}\n}
142
+ deleted? ? content : %Q{[[ #{name} => #{$SETTINGS[:url]}#{content} ]]\n}
143
143
  end
144
144
  def name_for_index; @name[ 9..-1].strip.downcase end
145
145
  end
@@ -159,10 +159,16 @@ class Wiki
159
159
  def initialize( folder )
160
160
  @folder = folder
161
161
  @pages = {}
162
+ @shutting_down = false
162
163
  load_all_pages
163
164
  start_watching_files
164
165
  end
165
166
 
167
+ def shutdown
168
+ sleep(1) until event_queue.empty?
169
+ @shutting_down = true # Stop further modifications
170
+ end
171
+
166
172
  def page( name )
167
173
  page_named( name )|| new_page( name, :empty )
168
174
  end
@@ -176,11 +182,13 @@ class Wiki
176
182
  end
177
183
 
178
184
  def revise( pagename, content, author )
185
+ raise "Sorry! Shutting down..." if @shutting_down
179
186
  check_disk_for_updated_page pagename
180
187
  mutate( pagename ) { |page| page.revise( content, author ) }
181
188
  end
182
189
 
183
190
  def rollback( pagename, number, author )
191
+ raise "Sorry! Shutting down..." if @shutting_down
184
192
  check_disk_for_updated_page pagename
185
193
  mutate( pagename ) { |page| page.rollback( number, author ) }
186
194
  end
data/lib/soks-servlet.rb CHANGED
@@ -6,31 +6,30 @@ require 'yaml'
6
6
 
7
7
  class WikiServlet < WEBrick::HTTPServlet::AbstractServlet
8
8
 
9
- def initialize( server, wiki, settings )
10
- @server, @wiki, @name, @wikiurl, @authenticators = server, wiki, settings[:name] , settings[:url] , settings[:authenticators]
9
+ def initialize( server, view, settings )
10
+ @server, @view, @wikiurl, @authenticators = server, view, settings[:url] , settings[:authenticators]
11
11
  end
12
12
 
13
13
  def service( request, response )
14
14
  case request.path
15
- # Redirect some requests to static file servlet
16
- when '/robots.txt', '/favicon.ico' ;
17
- response.set_redirect(WEBrick::HTTPStatus::Found, "#{@wikiurl}/attachment#{request.path}")
18
- # If request of the form /verb/pagename then execute the approriate method
19
- when /\/(\w+?)\/(.+)/
20
- verb, pagename = $1, $2
15
+ when '/robots.txt', '/favicon.ico' # Catch some requests to static files
16
+ doAttachment( request, response, request.path[1..-1] )
17
+ when /\/(\w+?)\/(.+)/ # If request of the form /verb/pagename then doVerb on this class
18
+ verb, pagename = $1, make_pagename_valid( $2 )
21
19
  authenticate request, response
22
20
  if self.respond_to?( "do#{verb.capitalize}" )
23
21
  self.send( "do#{verb.capitalize}", request, response, pagename, request.user )
24
22
  else
25
- response.body = @wiki.view( pagename, verb, request.user )
23
+ unknownView( request, response, pagename, verb, request.user )
26
24
  end
27
25
  when /\/(.+)/ ; redirect( response, $1, 'view' ) # No verb given
28
- when "/" ; redirect( response, "Home Page", 'view' ) # No page or verb given
26
+ when "/" ; redirect( response, $SETTINGS[:home_page], 'view' ) # No page or verb given
27
+ end
28
+
29
+ if $SETTINGS[:force_no_cache]
30
+ response['Cache-control'] ||= 'no-cache'
31
+ response['Pragma'] ||= 'no-cache'
29
32
  end
30
-
31
- response['Content-Type'] ||= "text/html"
32
- response['Cache-control'] ||= 'no-cache'
33
- response['Pragma'] ||= 'no-cache'
34
33
  end
35
34
 
36
35
  def authenticate( request, response )
@@ -47,67 +46,84 @@ class WikiServlet < WEBrick::HTTPServlet::AbstractServlet
47
46
  response.set_redirect(WEBrick::HTTPStatus::Found, verb ? "#{@wikiurl}/#{verb}/#{pagename}" : "#{@wikiurl}/#{pagename}")
48
47
  end
49
48
 
50
- def doWiki( request, response, pagename, person )
51
- redirect( response, pagename.gsub(/([a-z])([A-Z])/,'\1 \2') )
49
+ # These methods deal with the various views
50
+
51
+ def doAttachment( request, response, pagename, person = nil )
52
+ request.script_name = 'attachment'
53
+ request.path_info = "/#{pagename}"
54
+ WEBrick::HTTPServlet::FileHandler.get_instance(@server, "#{$SETTINGS[:root_directory] }/attachment",true).service(request, response)
52
55
  end
53
56
 
54
57
  def doFind( request, response, pagename, person )
55
- response.body = @wiki.find( request.query['regex'].strip )
58
+ response.body = @view.find( request.query['regex'].strip )
59
+ response['Content-Type'] ||= "text/html"
60
+ end
61
+
62
+ def doRss( request, response, pagename, person )
63
+ response.body = @view.view( pagename, 'rss', person )
64
+ response["Content-Type"] = "application/xml"
65
+ end
66
+
67
+ # This captures all unkown view types
68
+ def unknownView( request, response, pagename, view, person )
69
+ response.body = @view.view( pagename, view, person )
70
+ response['Content-Type'] ||= "text/html"
56
71
  end
57
72
 
73
+ # All the following methods change the wiki, then redirect
74
+
75
+ def doWiki( request, response, pagename, person )
76
+ redirect( response, pagename.gsub(/([a-z])([A-Z])/,'\1 \2') )
77
+ end
78
+
58
79
  def doSave( request, response, pagename, person )
59
80
  content = request.query["content"].to_s
60
- newpagename = request.query["titleprefix"].to_s + request.query["newtitle"].to_s
61
- @wiki.revise( pagename, content.gsub(/\r\n/,"\n"), person, newpagename) if content
81
+ newpagename = make_pagename_valid( request.query["titleprefix"].to_s + request.query["newtitle"].to_s)
82
+ @view.revise( pagename, content.gsub(/\r\n/,"\n"), person, newpagename) if content
62
83
  redirect( response, newpagename )
63
84
  end
64
85
 
65
86
  def doRollback( request, response, pagename, person )
66
87
  revision = request.query['revision'] ? request.query['revision'].to_i : nil
67
- @wiki.rollback( pagename, revision, person ) if revision
88
+ @view.rollback( pagename, revision, person ) if revision
68
89
  redirect( response, pagename )
69
90
  end
70
91
 
71
92
  def doDelete( request, response, pagename, person )
72
- @wiki.delete( pagename, person )
93
+ @view.delete( pagename, person )
73
94
  redirect( response, pagename )
74
95
  end
75
96
 
76
97
  def doUpload( request, response, pagename, person )
77
- newpagename = request.query["titleprefix"].to_s + request.query["newtitle"].to_s
98
+ newpagename = make_pagename_valid( request.query["titleprefix"].to_s + request.query["newtitle"].to_s)
78
99
  unless request.query['file'] == ""
79
- @wiki.revise( pagename, upload( request.query['file'].filename[/[0-9A-Za-z.]*$/], request.query['file'] ) , person, newpagename )
100
+ @view.revise( pagename, upload_file_data( request.query['file'] ), person, newpagename )
80
101
  else
81
- @wiki.move( pagename, person, newpagename )
102
+ @view.move( pagename, person, newpagename )
82
103
  end
83
104
  redirect( response, newpagename )
84
105
  end
85
-
86
- def doRss( request, response, pagename, person )
87
- response.body = @wiki.view( pagename, 'rss', person )
88
- response["Content-Type"] = "text/xml"
89
- end
90
106
 
91
107
  private
92
108
 
93
- def upload( filename, filedata )
109
+ def upload_file_data( upload_data )
94
110
  path = "#{$SETTINGS[:root_directory]}/attachment/"
95
- filename = unique_filename( path ,filename )
96
- File.open( File.join( path, filename ), 'wb' ) { |file| filedata.list.each { |data| file << data } }
111
+ filename = unique_filename( path , upload_data.filename )
112
+ File.open( File.join( path, filename ), 'wb' ) { |file| upload_data.list.each { |data| file << data } }
97
113
  "/attachment/#{filename}"
98
114
  end
99
115
 
100
116
  def unique_filename( path, filename )
101
- bits = filename.split(/\./)
102
- while File.exist? File.join( path, filename )
103
- if bits.length >= 1
104
- bits[-2].succ!
105
- else
106
- bits[0].succ!
107
- end
108
- filename = bits.join('.')
109
- end
110
- filename
117
+ filename.gsub!(' ','') # Unfortunately no spaces permitted in redcloth links
118
+ return filename unless File.exist? File.join( path, filename ) # Leave as is, if doesn't exist
119
+ name, counter, extension = File.basename( filename, '.*'), 1, File.extname( filename )
120
+ counter += 1 while File.exist? File.join( path, "#{name}#{counter}#{extension}" )
121
+ return "#{name}#{counter}#{extension}"
122
+ end
123
+
124
+ # Certain characters cause problems in titles, so delete
125
+ def make_pagename_valid( pagename )
126
+ pagename.tr('\[]?{}&^`<>','')
111
127
  end
112
128
  end
113
129
 
@@ -123,11 +139,18 @@ def start_wiki( settings = {}, &automatic_agents )
123
139
  block.call( wiki, view )
124
140
  end.priority = -2
125
141
 
126
- server = WEBrick::HTTPServer.new( { :Port => $SETTINGS[:port] } )
127
- server.mount("/attachment", WEBrick::HTTPServlet::FileHandler, "#{ $SETTINGS[:root_directory] }/attachment", true)
142
+ server = WEBrick::HTTPServer.new( { :Port => $SETTINGS[:port],
143
+ :ServerType=> $SETTINGS[:server_type]
144
+ } )
145
+
128
146
  server.mount("/", WikiServlet, view, $SETTINGS )
129
147
 
130
- trap("INT") { server.shutdown }
148
+ trap("INT") {
149
+ $stderr.puts "Trying to shutdown gracefully"
150
+ server.shutdown
151
+ wiki.shutdown
152
+ $stderr.puts "Shutdown."
153
+ }
131
154
 
132
155
  server.start
133
156
  end