zen 0.1a

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 (338) hide show
  1. data/LICENSE +19 -0
  2. data/MANIFEST +337 -0
  3. data/README.textile +42 -0
  4. data/Rakefile +6 -0
  5. data/bin/zen +9 -0
  6. data/doc/Categories.html +93 -0
  7. data/doc/Categories/Controllers.html +93 -0
  8. data/doc/Categories/Controllers/Categories.html +995 -0
  9. data/doc/Categories/Controllers/CategoryGroups.html +878 -0
  10. data/doc/Categories/Models.html +97 -0
  11. data/doc/Categories/Models/Category.html +269 -0
  12. data/doc/Categories/Models/CategoryGroup.html +231 -0
  13. data/doc/Comments.html +93 -0
  14. data/doc/Comments/Controllers.html +93 -0
  15. data/doc/Comments/Controllers/Comments.html +797 -0
  16. data/doc/Comments/Controllers/CommentsForm.html +487 -0
  17. data/doc/Comments/Liquid.html +93 -0
  18. data/doc/Comments/Liquid/CommentForm.html +522 -0
  19. data/doc/Comments/Liquid/Comments.html +543 -0
  20. data/doc/Comments/Models.html +95 -0
  21. data/doc/Comments/Models/Comment.html +260 -0
  22. data/doc/CustomFields.html +93 -0
  23. data/doc/CustomFields/Controllers.html +93 -0
  24. data/doc/CustomFields/Controllers/CustomFieldGroups.html +902 -0
  25. data/doc/CustomFields/Controllers/CustomFields.html +974 -0
  26. data/doc/CustomFields/Models.html +97 -0
  27. data/doc/CustomFields/Models/CustomField.html +272 -0
  28. data/doc/CustomFields/Models/CustomFieldGroup.html +259 -0
  29. data/doc/CustomFields/Models/CustomFieldValue.html +154 -0
  30. data/doc/Ramaze.html +93 -0
  31. data/doc/Ramaze/Helper.html +93 -0
  32. data/doc/Ramaze/Helper/ACL.html +531 -0
  33. data/doc/Ramaze/Helper/Asset.html +617 -0
  34. data/doc/Ramaze/Helper/Breadcrumb.html +411 -0
  35. data/doc/Ramaze/Helper/Common.html +738 -0
  36. data/doc/Sections.html +93 -0
  37. data/doc/Sections/Controllers.html +93 -0
  38. data/doc/Sections/Controllers/SectionEntries.html +1100 -0
  39. data/doc/Sections/Controllers/Sections.html +953 -0
  40. data/doc/Sections/Liquid.html +93 -0
  41. data/doc/Sections/Liquid/SectionEntries.html +674 -0
  42. data/doc/Sections/Liquid/Sections.html +494 -0
  43. data/doc/Sections/Models.html +97 -0
  44. data/doc/Sections/Models/Section.html +272 -0
  45. data/doc/Sections/Models/SectionEntry.html +264 -0
  46. data/doc/Sequel.html +91 -0
  47. data/doc/Sequel/Model.html +243 -0
  48. data/doc/Settings.html +93 -0
  49. data/doc/Settings/Controllers.html +91 -0
  50. data/doc/Settings/Controllers/Settings.html +565 -0
  51. data/doc/Settings/Liquid.html +91 -0
  52. data/doc/Settings/Liquid/Setting.html +426 -0
  53. data/doc/Settings/Models.html +95 -0
  54. data/doc/Settings/Models/Setting.html +293 -0
  55. data/doc/Users.html +93 -0
  56. data/doc/Users/Controllers.html +93 -0
  57. data/doc/Users/Controllers/AccessRules.html +904 -0
  58. data/doc/Users/Controllers/UserGroups.html +879 -0
  59. data/doc/Users/Controllers/Users.html +1124 -0
  60. data/doc/Users/Liquid.html +93 -0
  61. data/doc/Users/Liquid/User.html +480 -0
  62. data/doc/Users/Liquid/Users.html +495 -0
  63. data/doc/Users/Models.html +97 -0
  64. data/doc/Users/Models/AccessRule.html +257 -0
  65. data/doc/Users/Models/User.html +649 -0
  66. data/doc/Users/Models/UserGroup.html +267 -0
  67. data/doc/Zen.html +391 -0
  68. data/doc/Zen/Bin.html +113 -0
  69. data/doc/Zen/Bin/Base.html +727 -0
  70. data/doc/Zen/Controllers.html +115 -0
  71. data/doc/Zen/Controllers/AdminController.html +298 -0
  72. data/doc/Zen/Controllers/BaseController.html +272 -0
  73. data/doc/Zen/Controllers/FrontendController.html +164 -0
  74. data/doc/Zen/Controllers/MainController.html +421 -0
  75. data/doc/Zen/Database.html +498 -0
  76. data/doc/Zen/Language.html +660 -0
  77. data/doc/Zen/Liquid.html +117 -0
  78. data/doc/Zen/Liquid/ControllerBehavior.html +448 -0
  79. data/doc/Zen/Liquid/General.html +444 -0
  80. data/doc/Zen/Liquid/Redirect.html +435 -0
  81. data/doc/Zen/Liquid/Strip.html +447 -0
  82. data/doc/Zen/Logger.html +393 -0
  83. data/doc/Zen/Package.html +909 -0
  84. data/doc/_index.html +724 -0
  85. data/doc/class_list.html +36 -0
  86. data/doc/css/common.css +1 -0
  87. data/doc/css/full_list.css +53 -0
  88. data/doc/css/style.css +310 -0
  89. data/doc/file.README.html +86 -0
  90. data/doc/file_list.html +38 -0
  91. data/doc/frames.html +13 -0
  92. data/doc/index.html +86 -0
  93. data/doc/js/app.js +203 -0
  94. data/doc/js/full_list.js +149 -0
  95. data/doc/js/jquery.js +154 -0
  96. data/doc/method_list.html +1139 -0
  97. data/doc/top-level-namespace.html +88 -0
  98. data/lib/zen.rb +77 -0
  99. data/lib/zen/base/database.rb +105 -0
  100. data/lib/zen/base/language.rb +132 -0
  101. data/lib/zen/base/logger.rb +54 -0
  102. data/lib/zen/base/package.rb +233 -0
  103. data/lib/zen/base/version.rb +11 -0
  104. data/lib/zen/bin/zen_binary.rb +173 -0
  105. data/lib/zen/controller/admin_controller.rb +60 -0
  106. data/lib/zen/controller/base_controller.rb +39 -0
  107. data/lib/zen/controller/frontend_controller.rb +16 -0
  108. data/lib/zen/controller/main_controller.rb +93 -0
  109. data/lib/zen/helper/acl.rb +124 -0
  110. data/lib/zen/helper/asset.rb +104 -0
  111. data/lib/zen/helper/breadcrumb.rb +71 -0
  112. data/lib/zen/helper/common.rb +157 -0
  113. data/lib/zen/language/en/zen_general.rb +21 -0
  114. data/lib/zen/language/en/zen_models.rb +39 -0
  115. data/lib/zen/layout/admin.xhtml +72 -0
  116. data/lib/zen/layout/login.xhtml +44 -0
  117. data/lib/zen/liquid/controller_behavior.rb +55 -0
  118. data/lib/zen/liquid/general.rb +69 -0
  119. data/lib/zen/liquid/redirect.rb +47 -0
  120. data/lib/zen/liquid/strip.rb +58 -0
  121. data/lib/zen/model/methods.rb +26 -0
  122. data/lib/zen/model/settings.rb +27 -0
  123. data/lib/zen/packages/categories/LICENSE +19 -0
  124. data/lib/zen/packages/categories/README.textile +0 -0
  125. data/lib/zen/packages/categories/lib/categories.rb +24 -0
  126. data/lib/zen/packages/categories/lib/categories/controller/categories.rb +202 -0
  127. data/lib/zen/packages/categories/lib/categories/controller/category_groups.rb +173 -0
  128. data/lib/zen/packages/categories/lib/categories/language/en/categories.rb +38 -0
  129. data/lib/zen/packages/categories/lib/categories/language/en/category_groups.rb +37 -0
  130. data/lib/zen/packages/categories/lib/categories/model/category.rb +42 -0
  131. data/lib/zen/packages/categories/lib/categories/model/category_group.rb +29 -0
  132. data/lib/zen/packages/categories/lib/categories/view/admin/categories/edit.xhtml +7 -0
  133. data/lib/zen/packages/categories/lib/categories/view/admin/categories/form.xhtml +36 -0
  134. data/lib/zen/packages/categories/lib/categories/view/admin/categories/index.xhtml +70 -0
  135. data/lib/zen/packages/categories/lib/categories/view/admin/categories/new.xhtml +7 -0
  136. data/lib/zen/packages/categories/lib/categories/view/admin/category_groups/edit.xhtml +7 -0
  137. data/lib/zen/packages/categories/lib/categories/view/admin/category_groups/form.xhtml +18 -0
  138. data/lib/zen/packages/categories/lib/categories/view/admin/category_groups/index.xhtml +72 -0
  139. data/lib/zen/packages/categories/lib/categories/view/admin/category_groups/new.xhtml +7 -0
  140. data/lib/zen/packages/categories/migrations/.gitkeep +0 -0
  141. data/lib/zen/packages/categories/migrations/1295282303_create_schema.rb +40 -0
  142. data/lib/zen/packages/comments/LICENSE +19 -0
  143. data/lib/zen/packages/comments/README.textile +0 -0
  144. data/lib/zen/packages/comments/lib/comments.rb +26 -0
  145. data/lib/zen/packages/comments/lib/comments/controller/comments.rb +157 -0
  146. data/lib/zen/packages/comments/lib/comments/controller/comments_form.rb +135 -0
  147. data/lib/zen/packages/comments/lib/comments/language/en/comments.rb +52 -0
  148. data/lib/zen/packages/comments/lib/comments/liquid/comment_form.rb +97 -0
  149. data/lib/zen/packages/comments/lib/comments/liquid/comments.rb +115 -0
  150. data/lib/zen/packages/comments/lib/comments/model/comment.rb +34 -0
  151. data/lib/zen/packages/comments/lib/comments/view/admin/comments/edit.xhtml +7 -0
  152. data/lib/zen/packages/comments/lib/comments/view/admin/comments/form.xhtml +31 -0
  153. data/lib/zen/packages/comments/lib/comments/view/admin/comments/index.xhtml +74 -0
  154. data/lib/zen/packages/comments/migrations/.gitkeep +0 -0
  155. data/lib/zen/packages/comments/migrations/1295282202_create_schema.rb +24 -0
  156. data/lib/zen/packages/comments/migrations/1296949631_add_defensio_signature.rb +11 -0
  157. data/lib/zen/packages/custom_fields/LICENSE +19 -0
  158. data/lib/zen/packages/custom_fields/README.textile +0 -0
  159. data/lib/zen/packages/custom_fields/lib/custom_fields.rb +24 -0
  160. data/lib/zen/packages/custom_fields/lib/custom_fields/controller/custom_field_groups.rb +179 -0
  161. data/lib/zen/packages/custom_fields/lib/custom_fields/controller/custom_fields.rb +194 -0
  162. data/lib/zen/packages/custom_fields/lib/custom_fields/language/en/custom_field_groups.rb +45 -0
  163. data/lib/zen/packages/custom_fields/lib/custom_fields/language/en/custom_fields.rb +64 -0
  164. data/lib/zen/packages/custom_fields/lib/custom_fields/model/custom_field.rb +41 -0
  165. data/lib/zen/packages/custom_fields/lib/custom_fields/model/custom_field_group.rb +32 -0
  166. data/lib/zen/packages/custom_fields/lib/custom_fields/model/custom_field_value.rb +20 -0
  167. data/lib/zen/packages/custom_fields/lib/custom_fields/view/admin/custom_field_groups/edit.xhtml +7 -0
  168. data/lib/zen/packages/custom_fields/lib/custom_fields/view/admin/custom_field_groups/form.xhtml +18 -0
  169. data/lib/zen/packages/custom_fields/lib/custom_fields/view/admin/custom_field_groups/index.xhtml +88 -0
  170. data/lib/zen/packages/custom_fields/lib/custom_fields/view/admin/custom_field_groups/new.xhtml +7 -0
  171. data/lib/zen/packages/custom_fields/lib/custom_fields/view/admin/custom_fields/edit.xhtml +7 -0
  172. data/lib/zen/packages/custom_fields/lib/custom_fields/view/admin/custom_fields/form.xhtml +50 -0
  173. data/lib/zen/packages/custom_fields/lib/custom_fields/view/admin/custom_fields/index.xhtml +75 -0
  174. data/lib/zen/packages/custom_fields/lib/custom_fields/view/admin/custom_fields/new.xhtml +7 -0
  175. data/lib/zen/packages/custom_fields/migrations/.gitkeep +0 -0
  176. data/lib/zen/packages/custom_fields/migrations/1295255665_create_schema.rb +53 -0
  177. data/lib/zen/packages/sections/LICENSE +19 -0
  178. data/lib/zen/packages/sections/README.textile +43 -0
  179. data/lib/zen/packages/sections/lib/sections.rb +33 -0
  180. data/lib/zen/packages/sections/lib/sections/controller/section_entries.rb +251 -0
  181. data/lib/zen/packages/sections/lib/sections/controller/sections.rb +205 -0
  182. data/lib/zen/packages/sections/lib/sections/language/en/section_entries.rb +58 -0
  183. data/lib/zen/packages/sections/lib/sections/language/en/sections.rb +63 -0
  184. data/lib/zen/packages/sections/lib/sections/liquid/section_entries.rb +209 -0
  185. data/lib/zen/packages/sections/lib/sections/liquid/sections.rb +76 -0
  186. data/lib/zen/packages/sections/lib/sections/model/section.rb +43 -0
  187. data/lib/zen/packages/sections/lib/sections/model/section_entry.rb +43 -0
  188. data/lib/zen/packages/sections/lib/sections/view/admin/edit.xhtml +7 -0
  189. data/lib/zen/packages/sections/lib/sections/view/admin/form.xhtml +54 -0
  190. data/lib/zen/packages/sections/lib/sections/view/admin/index.xhtml +77 -0
  191. data/lib/zen/packages/sections/lib/sections/view/admin/new.xhtml +7 -0
  192. data/lib/zen/packages/sections/lib/sections/view/admin/section_entries/edit.xhtml +7 -0
  193. data/lib/zen/packages/sections/lib/sections/view/admin/section_entries/form.xhtml +147 -0
  194. data/lib/zen/packages/sections/lib/sections/view/admin/section_entries/index.xhtml +74 -0
  195. data/lib/zen/packages/sections/lib/sections/view/admin/section_entries/new.xhtml +7 -0
  196. data/lib/zen/packages/sections/migrations/.gitkeep +0 -0
  197. data/lib/zen/packages/sections/migrations/1295251836_create_schema.rb +35 -0
  198. data/lib/zen/packages/sections/migrations/1296335671_userdata_section_entries.rb +18 -0
  199. data/lib/zen/packages/sections/migrations/1296936110_drop_comment_antispam.rb +11 -0
  200. data/lib/zen/packages/settings/LICENSE +0 -0
  201. data/lib/zen/packages/settings/README.textile +0 -0
  202. data/lib/zen/packages/settings/lib/settings.rb +22 -0
  203. data/lib/zen/packages/settings/lib/settings/controller/settings.rb +113 -0
  204. data/lib/zen/packages/settings/lib/settings/language/en/settings.rb +56 -0
  205. data/lib/zen/packages/settings/lib/settings/liquid/setting.rb +56 -0
  206. data/lib/zen/packages/settings/lib/settings/model/setting.rb +38 -0
  207. data/lib/zen/packages/settings/lib/settings/view/admin/settings/index.xhtml +79 -0
  208. data/lib/zen/packages/settings/migrations/.gitkeep +0 -0
  209. data/lib/zen/packages/settings/migrations/1295597111_create_schema.rb +31 -0
  210. data/lib/zen/packages/users/LICENSE +19 -0
  211. data/lib/zen/packages/users/README.textile +0 -0
  212. data/lib/zen/packages/users/lib/users.rb +35 -0
  213. data/lib/zen/packages/users/lib/users/controller/access_rules.rb +186 -0
  214. data/lib/zen/packages/users/lib/users/controller/user_groups.rb +171 -0
  215. data/lib/zen/packages/users/lib/users/controller/users.rb +240 -0
  216. data/lib/zen/packages/users/lib/users/language/en/access_rules.rb +49 -0
  217. data/lib/zen/packages/users/lib/users/language/en/user_groups.rb +42 -0
  218. data/lib/zen/packages/users/lib/users/language/en/users.rb +63 -0
  219. data/lib/zen/packages/users/lib/users/liquid/user.rb +75 -0
  220. data/lib/zen/packages/users/lib/users/liquid/users.rb +80 -0
  221. data/lib/zen/packages/users/lib/users/model/access_rule.rb +29 -0
  222. data/lib/zen/packages/users/lib/users/model/user.rb +96 -0
  223. data/lib/zen/packages/users/lib/users/model/user_group.rb +38 -0
  224. data/lib/zen/packages/users/lib/users/public/admin/js/users/access_rules.js +43 -0
  225. data/lib/zen/packages/users/lib/users/view/admin/access_rules/edit.xhtml +7 -0
  226. data/lib/zen/packages/users/lib/users/view/admin/access_rules/form.xhtml +68 -0
  227. data/lib/zen/packages/users/lib/users/view/admin/access_rules/index.xhtml +85 -0
  228. data/lib/zen/packages/users/lib/users/view/admin/access_rules/new.xhtml +7 -0
  229. data/lib/zen/packages/users/lib/users/view/admin/user_groups/edit.xhtml +7 -0
  230. data/lib/zen/packages/users/lib/users/view/admin/user_groups/form.xhtml +19 -0
  231. data/lib/zen/packages/users/lib/users/view/admin/user_groups/index.xhtml +69 -0
  232. data/lib/zen/packages/users/lib/users/view/admin/user_groups/new.xhtml +7 -0
  233. data/lib/zen/packages/users/lib/users/view/admin/users/edit.xhtml +7 -0
  234. data/lib/zen/packages/users/lib/users/view/admin/users/form.xhtml +25 -0
  235. data/lib/zen/packages/users/lib/users/view/admin/users/index.xhtml +73 -0
  236. data/lib/zen/packages/users/lib/users/view/admin/users/login.xhtml +22 -0
  237. data/lib/zen/packages/users/lib/users/view/admin/users/new.xhtml +7 -0
  238. data/lib/zen/packages/users/migrations/.gitkeep +0 -0
  239. data/lib/zen/packages/users/migrations/1295281013_create_schema.rb +54 -0
  240. data/lib/zen/public/admin/css/boilerplate.css +174 -0
  241. data/lib/zen/public/admin/css/general.css +485 -0
  242. data/lib/zen/public/admin/css/grid.css +119 -0
  243. data/lib/zen/public/admin/css/layout.css +111 -0
  244. data/lib/zen/public/admin/images/general/noise.jpg +0 -0
  245. data/lib/zen/public/admin/images/icons/accept.png +0 -0
  246. data/lib/zen/public/admin/images/icons/add.png +0 -0
  247. data/lib/zen/public/admin/images/icons/back.png +0 -0
  248. data/lib/zen/public/admin/images/icons/bold.png +0 -0
  249. data/lib/zen/public/admin/images/icons/close.png +0 -0
  250. data/lib/zen/public/admin/images/icons/delete.png +0 -0
  251. data/lib/zen/public/admin/images/icons/edit.png +0 -0
  252. data/lib/zen/public/admin/images/icons/error.png +0 -0
  253. data/lib/zen/public/admin/images/icons/help.png +0 -0
  254. data/lib/zen/public/admin/images/icons/info.png +0 -0
  255. data/lib/zen/public/admin/images/icons/italic.png +0 -0
  256. data/lib/zen/public/admin/images/icons/large/error.png +0 -0
  257. data/lib/zen/public/admin/images/icons/large/notice.png +0 -0
  258. data/lib/zen/public/admin/images/icons/large/success.png +0 -0
  259. data/lib/zen/public/admin/images/icons/link.png +0 -0
  260. data/lib/zen/public/admin/images/icons/logout.png +0 -0
  261. data/lib/zen/public/admin/images/icons/ol.png +0 -0
  262. data/lib/zen/public/admin/images/icons/pdf.png +0 -0
  263. data/lib/zen/public/admin/images/icons/ul.png +0 -0
  264. data/lib/zen/public/admin/images/icons/user.png +0 -0
  265. data/lib/zen/public/admin/images/icons/view.png +0 -0
  266. data/lib/zen/public/admin/js/mootools/core.js +436 -0
  267. data/lib/zen/public/admin/js/mootools/more.js +288 -0
  268. data/lib/zen/public/admin/js/zen/editor/base.js +265 -0
  269. data/lib/zen/public/admin/js/zen/editor/drivers/html.js +104 -0
  270. data/lib/zen/public/admin/js/zen/editor/drivers/markdown.js +102 -0
  271. data/lib/zen/public/admin/js/zen/editor/drivers/textile.js +102 -0
  272. data/lib/zen/public/admin/js/zen/init.js +57 -0
  273. data/lib/zen/public/admin/js/zen/modal.js +159 -0
  274. data/lib/zen/public/admin/js/zen/notification.js +213 -0
  275. data/lib/zen/public/admin/js/zen/tabs.js +263 -0
  276. data/lib/zen/tasks.rb +6 -0
  277. data/pkg/.gitkeep +0 -0
  278. data/proto/app/Rakefile +2 -0
  279. data/proto/app/app.rb +20 -0
  280. data/proto/app/config.ru +18 -0
  281. data/proto/app/config/config.rb +17 -0
  282. data/proto/app/config/database.rb +18 -0
  283. data/proto/app/config/middlewares.rb +23 -0
  284. data/proto/app/config/requires.rb +8 -0
  285. data/proto/app/logs/.gitkeep +0 -0
  286. data/proto/app/public/.gitkeep +0 -0
  287. data/proto/app/start.rb +22 -0
  288. data/proto/app/vendor/.gitkeep +0 -0
  289. data/proto/app/vendor/themes/.gitkeep +0 -0
  290. data/proto/migration.rb +11 -0
  291. data/proto/module/LICENSE +0 -0
  292. data/proto/module/README.textile +0 -0
  293. data/proto/module/lib/module.rb +15 -0
  294. data/proto/module/lib/module/controller/controllers.rb +86 -0
  295. data/proto/module/lib/module/language/en/languages.rb +3 -0
  296. data/proto/module/lib/module/model/model.rb +12 -0
  297. data/proto/module/lib/module/view/admin/edit.xhtml +0 -0
  298. data/proto/module/lib/module/view/admin/form.xhtml +0 -0
  299. data/proto/module/lib/module/view/admin/index.xhtml +0 -0
  300. data/proto/module/lib/module/view/admin/new.xhtml +0 -0
  301. data/proto/module/migrations/.gitkeep +0 -0
  302. data/spec/javascript/css/base.css +177 -0
  303. data/spec/javascript/css/style.css +204 -0
  304. data/spec/javascript/css/typography.css +70 -0
  305. data/spec/javascript/editor/index.html +65 -0
  306. data/spec/javascript/images/close.png +0 -0
  307. data/spec/javascript/images/info.png +0 -0
  308. data/spec/javascript/js/editor.js +16 -0
  309. data/spec/javascript/js/modal.js +12 -0
  310. data/spec/javascript/js/namespace.js +2 -0
  311. data/spec/javascript/js/notification.js +43 -0
  312. data/spec/javascript/js/tabs.js +8 -0
  313. data/spec/javascript/modal/index.html +45 -0
  314. data/spec/javascript/notification/index.html +48 -0
  315. data/spec/javascript/tabs/index.html +73 -0
  316. data/spec/javascript/tabs/tab_1.html +1 -0
  317. data/spec/javascript/tabs/tab_2.html +1 -0
  318. data/spec/zen/base/language.rb +31 -0
  319. data/spec/zen/base/logger.rb +34 -0
  320. data/spec/zen/base/package.rb +47 -0
  321. data/spec/zen/config/database.rb +8 -0
  322. data/spec/zen/helper/asset.rb +26 -0
  323. data/spec/zen/helper/breadcrumb.rb +24 -0
  324. data/spec/zen/language/en/general.rb +4 -0
  325. data/spec/zen/language/nl/general.rb +4 -0
  326. data/spec/zen/liquid/general.rb +42 -0
  327. data/spec/zen/logs/.gitkeep +0 -0
  328. data/spec/zen/spec.rb +9 -0
  329. data/spec/zen/spec_database.db +0 -0
  330. data/tasks/bacon.rake +99 -0
  331. data/tasks/build.rake +72 -0
  332. data/tasks/clean.rake +18 -0
  333. data/tasks/db.rake +81 -0
  334. data/tasks/doc.rake +5 -0
  335. data/tasks/extension.rake +65 -0
  336. data/tasks/proto.rake +37 -0
  337. data/tasks/theme.rake +63 -0
  338. metadata +512 -0
@@ -0,0 +1,26 @@
1
+
2
+ # Load all our classes
3
+ require __DIR__ 'comments/model/comment.rb'
4
+ require __DIR__ 'comments/controller/comments'
5
+ require __DIR__ 'comments/controller/comments_form'
6
+ require __DIR__ 'comments/liquid/comments'
7
+ require __DIR__ 'comments/liquid/comment_form'
8
+
9
+ Liquid::Template.register_tag('comments' , Comments::Liquid::Comments)
10
+ Liquid::Template.register_tag('comment_form', Comments::Liquid::CommentForm)
11
+
12
+ Zen::Package.add do |p|
13
+ p.type = 'extension'
14
+ p.name = 'Comments'
15
+ p.author = 'Yorick Peterse'
16
+ p.url = 'http://yorickpeterse.com/'
17
+ p.version = '0.1'
18
+ p.about = "Allow users to post comments on any given section entry (as long as the section allows it)."
19
+ p.identifier = 'com.zen.comments'
20
+ p.directory = __DIR__('comments')
21
+
22
+ p.menu = [{
23
+ :title => "Comments",
24
+ :url => "admin/comments"
25
+ }]
26
+ end
@@ -0,0 +1,157 @@
1
+ module Comments
2
+ module Controllers
3
+ ##
4
+ # Controller used for managing comments. Administrations can't actually
5
+ # add new comments using the backend controller but can edit or delete them.
6
+ # Comments can be submitted to any section entry as long as the section
7
+ # allows it. When submitting a comment the user data such as the name and email
8
+ # will be retrieved from either the users table (if the user is logged in) or
9
+ # from the form that was submitted.
10
+ #
11
+ # @author Yorick Peterse
12
+ # @since 0.1
13
+ #
14
+ class Comments < Zen::Controllers::AdminController
15
+ map '/admin/comments'
16
+
17
+ trait :extension_identifier => 'com.zen.comments'
18
+
19
+ include ::Comments::Models
20
+
21
+ before_all do
22
+ csrf_protection :save, :delete do
23
+ respond("The specified request can't be executed without a valid CSRF token", 401)
24
+ end
25
+ end
26
+
27
+ ##
28
+ # Constructor method that pre-loads several variables.
29
+ #
30
+ # @author Yorick Peterse
31
+ # @since 0.1
32
+ #
33
+ def initialize
34
+ super
35
+
36
+ @form_save_url = '/admin/comments/save'
37
+ @form_delete_url = '/admin/comments/delete'
38
+ @comments_lang = Zen::Language.load 'comments'
39
+
40
+ # Set the page title
41
+ if !action.method.nil?
42
+ method = action.method.to_sym
43
+
44
+ if @comments_lang.titles.key? method
45
+ @page_title = @comments_lang.titles[method]
46
+ end
47
+ end
48
+ end
49
+
50
+ ##
51
+ # Shows an overview of all posted comments along with their status,
52
+ # author and so on.
53
+ #
54
+ # @author Yorick Peterse
55
+ # @since 0.1
56
+ #
57
+ def index
58
+ if !user_authorized?([:read])
59
+ respond(@zen_general_lang.errors[:not_authorized], 403)
60
+ end
61
+
62
+ set_breadcrumbs @comments_lang.titles[:index]
63
+
64
+ @comments = Comment.all
65
+ end
66
+
67
+ ##
68
+ # Edits an existing comment based on the ID.
69
+ #
70
+ # @author Yorick Peterse
71
+ # @param [Integer] id The ID of the comment to retrieve so that we can edit it.
72
+ # @since 0.1
73
+ #
74
+ def edit id
75
+ if !user_authorized?([:read, :update])
76
+ respond(@zen_general_lang.errors[:not_authorized], 403)
77
+ end
78
+
79
+ set_breadcrumbs anchor_to(@comments_lang.titles[:index], "admin/comments"), @page_title
80
+
81
+ @comment = Comment[id]
82
+ end
83
+
84
+ ##
85
+ # Saves a comment based on the current POST data. Note that this
86
+ # method won't create a new comment as this can't be done using the backend.
87
+ #
88
+ # @author Yorick Peterse
89
+ # @since 0.1
90
+ #
91
+ def save
92
+ if !user_authorized?([:update])
93
+ respond(@zen_general_lang.errors[:not_authorized], 403)
94
+ end
95
+
96
+ # Copy the POST data so we can work with it without messing things up
97
+ post = request.params.dup
98
+
99
+ # Remove all empty fields
100
+ post.each do |key, value|
101
+ post.delete(key) if value.empty?
102
+ end
103
+
104
+ @comment = Comment[post["id"]]
105
+
106
+ begin
107
+ @comment.update(post)
108
+ notification(:success, @comments_lang.titles[:index], @comments_lang.success[:save])
109
+ rescue
110
+ notification(:error, @comments_lang.titles[:index], @comments_lang.errors[:save])
111
+
112
+ flash[:form_errors] = @comment.errors
113
+ end
114
+
115
+ # Redirect the user to the proper page.
116
+ if @comment.id
117
+ redirect "/admin/comments/edit/#{@comment.id}"
118
+ else
119
+ redirect_referrer
120
+ end
121
+ end
122
+
123
+ ##
124
+ # Deletes a number of comments based on the comment IDs specified
125
+ # in the POST array "comment_ids".
126
+ #
127
+ # @author Yorick Peterse
128
+ # @since 0.1
129
+ #
130
+ def delete
131
+ if !user_authorized?([:delete])
132
+ respond(@zen_general_lang.errors[:not_authorized], 403)
133
+ end
134
+
135
+ # Obviously we'll require some IDs
136
+ if !request.params["comment_ids"] or request.params["comment_ids"].empty?
137
+ notification(:error, @comments_lang.titles[:index], @comments_lang.errors[:no_delete])
138
+ redirect_referrer
139
+ end
140
+
141
+ # Delete each section
142
+ request.params["comment_ids"].each do |id|
143
+ @comment = Comment[id]
144
+
145
+ begin
146
+ @comment.delete
147
+ notification(:success, @comments_lang.titles[:index], @comments_lang.success[:delete] % id)
148
+ rescue
149
+ notification(:error, @comments_lang.titles[:index], @comments_lang.errors[:delete] % id)
150
+ end
151
+ end
152
+
153
+ redirect_referrer
154
+ end
155
+ end
156
+ end
157
+ end
@@ -0,0 +1,135 @@
1
+ module Comments
2
+ module Controllers
3
+ ##
4
+ # Frontend controller for the comments system used for saving user-submitted comments.
5
+ # When the anti-spam system is enabled Zen will use Defensio to check if the comment is
6
+ # spam or ham.
7
+ #
8
+ # @author Yorick Peterse
9
+ # @since 0.1
10
+ #
11
+ class CommentsForm < Zen::Controllers::FrontendController
12
+ include ::Comments::Models
13
+
14
+ map '/comments_form'
15
+ trait :extension_identifier => 'com.zen.comments'
16
+
17
+ before_all do
18
+ csrf_protection :save do
19
+ respond(@zen_general_lang.errors[:csrf], 401)
20
+ end
21
+ end
22
+
23
+ ##
24
+ # Creates a new comment for the section entry. Once the comment has been saved
25
+ # the user will be redirected back to the previous page.
26
+ #
27
+ # @author Yorick Peterse
28
+ # @since 0.1
29
+ #
30
+ def save
31
+ comments_lang = Zen::Language.load('comments')
32
+
33
+ comment = Comment.new
34
+ post = request.params.dup
35
+ entry = ::Sections::Models::SectionEntry[h(post['section_entry']).to_i]
36
+
37
+ # Remove empty values
38
+ post.each { |k, v| post.delete(k) if v.empty? }
39
+
40
+ if post.key?('user_id')
41
+ comment.user_id = post['user_id']
42
+ end
43
+
44
+ # Set the comment data
45
+ comment.comment = post['comment']
46
+
47
+ if !post.key?('user_id')
48
+ ['name', 'website', 'email'].each do |k|
49
+ if post.key?(k)
50
+ comment.send("#{k}=", post[k])
51
+ end
52
+ end
53
+ end
54
+
55
+ comment.section_entry_id = entry.id
56
+
57
+ # Validate the section entry
58
+ if entry.nil?
59
+ flash[:error] = comments_lang.errors[:invalid_entry]
60
+ redirect_referrer
61
+ end
62
+
63
+ section = entry.section
64
+
65
+ # Comments allowed?
66
+ if section.comment_allow == false
67
+ flash[:error] = comments_lang.errors[:comments_not_allowed]
68
+ redirect_referrer
69
+ end
70
+
71
+ # Comments require an account?
72
+ if section.comment_require_account == true and session[:user].nil?
73
+ flash[:error] = comments_lang.errors[:comments_require_account]
74
+ redirect_referrer
75
+ end
76
+
77
+ # Require moderation?
78
+ if section.comment_moderate == true
79
+ comment.status = 'closed'
80
+ end
81
+
82
+ # Require anti-spam validation?
83
+ if session[:settings][:enable_antispam] == '1'
84
+ # Validate the comment
85
+ api_key = session[:settings][:defensio_key]
86
+
87
+ if api_key.nil?
88
+ flash[:error] = comments_lang.errors[:no_api_key]
89
+ redirect_referrer
90
+ end
91
+
92
+ defensio = ::Defensio.new(api_key)
93
+ status, response = defensio.post_document(
94
+ :content => post['comment'],
95
+ :platform => "zen",
96
+ :type => "comment"
97
+ )
98
+
99
+ if status != 200
100
+ flash[:error] = comments_lang.errors[:defensio_status]
101
+ redirect_referrer
102
+ end
103
+
104
+ # Time to validate the Defensio response
105
+ if response['allow'] == true and response['spaminess'] <= 0.85
106
+ if section.comment_moderate == true
107
+ comment.status = 'closed'
108
+ else
109
+ comment.status = 'open'
110
+ end
111
+
112
+ comment.defensio_signature = response['signature']
113
+ else
114
+ comment.status = 'spam'
115
+ end
116
+ end
117
+
118
+ # Save the comment
119
+ begin
120
+ comment.save
121
+
122
+ if section.comment_moderate == true
123
+ flash[:success] = comments_lang.success[:moderate]
124
+ else
125
+ flash[:success] = comments_lang.success[:new]
126
+ end
127
+ rescue
128
+ flash[:error] = comments_lang.errors[:new]
129
+ end
130
+
131
+ redirect_referrer
132
+ end
133
+ end
134
+ end
135
+ end
@@ -0,0 +1,52 @@
1
+ Zen::Language.translation 'comments' do |item|
2
+
3
+ item.titles = {
4
+ :index => 'Comments',
5
+ :edit => 'Edit Comment'
6
+ }
7
+
8
+ item.labels = {
9
+ :id => '#',
10
+ :website => 'Website',
11
+ :entry => 'Section entry',
12
+ :email => 'Email',
13
+ :status => 'Status',
14
+ :comment => 'Comment',
15
+ :name => 'Name',
16
+ :created_at => 'Created',
17
+ :updated_at => 'Updated',
18
+ :defensio_signature => 'Defensio signature'
19
+ }
20
+
21
+ item.special = {
22
+ :status_hash => {'open' => 'Open', 'closed' => 'Closed', 'spam' => 'Spam'}
23
+ }
24
+
25
+ item.messages = {
26
+ :no_comments => 'No comments have been added yet.'
27
+ }
28
+
29
+ item.errors = {
30
+ :new => "Failed to create a new comment.",
31
+ :save => "Failed to save the comment.",
32
+ :delete => "Failed to delete the comment with ID #%s",
33
+ :no_delete => "You haven't specified any comments to delete.",
34
+ :invalid_entry => "The specified section entry is invalid",
35
+ :comments_not_allowed => "Comments aren't allowed for this section",
36
+ :comments_require_account => "This section requires you to be logged in in order to post a comment",
37
+ :no_api_key => "You need to specify an API key for the Defension system in your settings panel.",
38
+ :defensio_status => "The comment could not be saved due to a problem with the Defensio server."
39
+ }
40
+
41
+ item.success = {
42
+ :new => "The new comment has been created.",
43
+ :save => "The comment has been modified.",
44
+ :delete => "The comment with ID #%s has been deleted.",
45
+ :moderate => "The comment has been posted but must be approved by an administrator before it's displayed."
46
+ }
47
+
48
+ item.buttons = {
49
+ :delete_comments => 'Delete selected comments',
50
+ :save_comment => 'Save comment'
51
+ }
52
+ end
@@ -0,0 +1,97 @@
1
+ require 'ramaze/gestalt'
2
+
3
+ module Comments
4
+ module Liquid
5
+ ##
6
+ # Describe...
7
+ #
8
+ # The following arguments can be used:
9
+ #
10
+ # * section_entry
11
+ # * section_entry_id
12
+ #
13
+ # @author Yorick Peterse
14
+ # @since 0.1
15
+ #
16
+ class CommentForm < ::Liquid::Block
17
+ include ::Zen::Liquid::General
18
+ include ::Zen::Liquid::ControllerBehavior
19
+ include ::Ramaze::Helper::CSRF
20
+ include ::Ramaze::Helper::BlueForm
21
+
22
+ ##
23
+ # Creates a new instance of the block and passes the tag name,
24
+ # all additional arguments and the HTML to the constructor method.
25
+ #
26
+ # @author Yorick Peterse
27
+ # @param [String] tag_name The name of the tag that was called.
28
+ # @param [String] arguments All additional arguments passed as a string.
29
+ # @param [String] html The HTML inside the block.
30
+ # @since 0.1
31
+ #
32
+ def initialize(tag_name, arguments, html)
33
+ super
34
+
35
+ @arguments = parse_key_values(arguments)
36
+ @args_parsed = false
37
+ end
38
+
39
+ ##
40
+ # Renders the tag block.
41
+ #
42
+ # @author Yorick Peterse
43
+ # @since 0.1
44
+ #
45
+ def render(context)
46
+ if @args_parsed == false
47
+ @arguments.each do |k, v|
48
+ v = v.to_s
49
+
50
+ if context.has_key?(v)
51
+ @arguments[k] = h(context[v])
52
+ end
53
+ end
54
+ end
55
+
56
+ @args_parsed = true
57
+ g = Ramaze::Gestalt.new
58
+ user_html = ''
59
+
60
+ super(context).each do |h|
61
+ user_html += h
62
+ end
63
+
64
+ # Get our section to which this form belongs
65
+ if @arguments.key?('section_entry')
66
+ section_entry = ::Sections::Models::SectionEntry[:slug => @arguments['section_entry']]
67
+ else
68
+ section_entry = ::Sections::Models::SectionEntry[@arguments['section_entry_id'].to_i]
69
+ end
70
+
71
+ # Get the section entry's ID
72
+ if !section_entry.nil?
73
+ section_entry_id = section_entry.id
74
+ else
75
+ section_entry_id = nil
76
+ end
77
+
78
+ # Get the user's ID if he/she is logged in
79
+ if !session[:user].nil?
80
+ user_id = session[:user].id
81
+ else
82
+ user_id = nil
83
+ end
84
+
85
+ g_html = form_for(nil, :method => :post, :action => "/comments_form/save") do |f|
86
+ f.input_hidden :csrf_token, get_csrf_token
87
+ f.input_hidden :section_entry, section_entry_id
88
+ f.input_hidden :user_id, user_id
89
+
90
+ user_html
91
+ end
92
+
93
+ return g_html
94
+ end
95
+ end
96
+ end
97
+ end