zen 0.1a → 0.2

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 (414) hide show
  1. data/CHANGELOG.md +17 -0
  2. data/MANIFEST +161 -264
  3. data/README.md +114 -0
  4. data/ROADMAP.md +31 -0
  5. data/Thorfile +8 -0
  6. data/lib/zen.rb +13 -10
  7. data/lib/zen/base/database.rb +34 -28
  8. data/lib/zen/base/language.rb +174 -92
  9. data/lib/zen/base/logger.rb +8 -6
  10. data/lib/zen/base/package.rb +36 -29
  11. data/lib/zen/base/version.rb +2 -1
  12. data/lib/zen/bin/zen_binary.rb +7 -71
  13. data/lib/zen/controller/admin_controller.rb +31 -11
  14. data/lib/zen/controller/base_controller.rb +13 -13
  15. data/lib/zen/controller/frontend_controller.rb +2 -0
  16. data/lib/zen/controller/main_controller.rb +9 -8
  17. data/lib/zen/helper/acl.rb +4 -1
  18. data/lib/zen/helper/asset.rb +5 -3
  19. data/lib/zen/helper/breadcrumb.rb +10 -8
  20. data/lib/zen/helper/common.rb +28 -13
  21. data/lib/zen/language/en/zen_general.yml +31 -0
  22. data/lib/zen/language/en/zen_models.yml +13 -0
  23. data/lib/zen/layout/admin.xhtml +76 -68
  24. data/lib/zen/layout/login.xhtml +48 -42
  25. data/lib/zen/liquid/controller_behavior.rb +2 -0
  26. data/lib/zen/liquid/general.rb +60 -9
  27. data/lib/zen/liquid/redirect.rb +29 -6
  28. data/lib/zen/liquid/strip.rb +3 -1
  29. data/lib/zen/model/methods.rb +7 -5
  30. data/lib/zen/model/settings.rb +69 -18
  31. data/lib/zen/package/all.rb +7 -0
  32. data/lib/zen/{packages → package}/categories/lib/categories.rb +3 -3
  33. data/lib/zen/package/categories/lib/categories/controller/categories.rb +250 -0
  34. data/lib/zen/package/categories/lib/categories/controller/category_groups.rb +216 -0
  35. data/lib/zen/package/categories/lib/categories/language/en/categories.yml +35 -0
  36. data/lib/zen/package/categories/lib/categories/language/en/category_groups.yml +32 -0
  37. data/lib/zen/package/categories/lib/categories/liquid/categories.rb +16 -0
  38. data/lib/zen/{packages → package}/categories/lib/categories/model/category.rb +9 -9
  39. data/lib/zen/{packages → package}/categories/lib/categories/model/category_group.rb +6 -4
  40. data/lib/zen/package/categories/lib/categories/view/admin/categories/edit.xhtml +7 -0
  41. data/lib/zen/package/categories/lib/categories/view/admin/categories/form.xhtml +59 -0
  42. data/lib/zen/package/categories/lib/categories/view/admin/categories/index.xhtml +78 -0
  43. data/lib/zen/package/categories/lib/categories/view/admin/categories/new.xhtml +7 -0
  44. data/lib/zen/package/categories/lib/categories/view/admin/category-groups/edit.xhtml +7 -0
  45. data/lib/zen/package/categories/lib/categories/view/admin/category-groups/form.xhtml +31 -0
  46. data/lib/zen/package/categories/lib/categories/view/admin/category-groups/index.xhtml +85 -0
  47. data/lib/zen/package/categories/lib/categories/view/admin/category-groups/new.xhtml +7 -0
  48. data/lib/zen/{packages → package}/categories/migrations/.gitkeep +0 -0
  49. data/lib/zen/{packages → package}/categories/migrations/1295282303_create_schema.rb +3 -2
  50. data/lib/zen/{packages → package}/comments/lib/comments.rb +1 -1
  51. data/lib/zen/{packages → package}/comments/lib/comments/controller/comments.rb +81 -41
  52. data/lib/zen/{packages → package}/comments/lib/comments/controller/comments_form.rb +15 -13
  53. data/lib/zen/package/comments/lib/comments/language/en/comments.yml +42 -0
  54. data/lib/zen/{packages → package}/comments/lib/comments/liquid/comment_form.rb +43 -13
  55. data/lib/zen/{packages → package}/comments/lib/comments/liquid/comments.rb +10 -12
  56. data/lib/zen/{packages → package}/comments/lib/comments/model/comment.rb +24 -0
  57. data/lib/zen/package/comments/lib/comments/view/admin/comments/edit.xhtml +7 -0
  58. data/lib/zen/package/comments/lib/comments/view/admin/comments/form.xhtml +57 -0
  59. data/lib/zen/package/comments/lib/comments/view/admin/comments/index.xhtml +79 -0
  60. data/lib/zen/{packages → package}/comments/migrations/.gitkeep +0 -0
  61. data/lib/zen/{packages → package}/comments/migrations/1295282202_create_schema.rb +6 -4
  62. data/lib/zen/{packages → package}/custom_fields/lib/custom_fields.rb +2 -2
  63. data/lib/zen/package/custom_fields/lib/custom_fields/controller/custom_field_groups.rb +224 -0
  64. data/lib/zen/package/custom_fields/lib/custom_fields/controller/custom_fields.rb +259 -0
  65. data/lib/zen/package/custom_fields/lib/custom_fields/language/en/custom_field_groups.yml +32 -0
  66. data/lib/zen/package/custom_fields/lib/custom_fields/language/en/custom_fields.yml +52 -0
  67. data/lib/zen/{packages → package}/custom_fields/lib/custom_fields/model/custom_field.rb +12 -7
  68. data/lib/zen/{packages → package}/custom_fields/lib/custom_fields/model/custom_field_group.rb +14 -4
  69. data/lib/zen/{packages → package}/custom_fields/lib/custom_fields/model/custom_field_value.rb +4 -2
  70. data/lib/zen/package/custom_fields/lib/custom_fields/view/admin/custom-field-groups/edit.xhtml +7 -0
  71. data/lib/zen/package/custom_fields/lib/custom_fields/view/admin/custom-field-groups/form.xhtml +30 -0
  72. data/lib/zen/package/custom_fields/lib/custom_fields/view/admin/custom-field-groups/index.xhtml +100 -0
  73. data/lib/zen/package/custom_fields/lib/custom_fields/view/admin/custom-field-groups/new.xhtml +7 -0
  74. data/lib/zen/package/custom_fields/lib/custom_fields/view/admin/custom-fields/edit.xhtml +7 -0
  75. data/lib/zen/package/custom_fields/lib/custom_fields/view/admin/custom-fields/form.xhtml +107 -0
  76. data/lib/zen/package/custom_fields/lib/custom_fields/view/admin/custom-fields/index.xhtml +84 -0
  77. data/lib/zen/package/custom_fields/lib/custom_fields/view/admin/custom-fields/new.xhtml +7 -0
  78. data/lib/zen/{packages → package}/custom_fields/migrations/.gitkeep +0 -0
  79. data/lib/zen/{packages → package}/custom_fields/migrations/1295255665_create_schema.rb +8 -7
  80. data/lib/zen/package/menus/lib/menus.rb +59 -0
  81. data/lib/zen/package/menus/lib/menus/controller/menu_items.rb +244 -0
  82. data/lib/zen/package/menus/lib/menus/controller/menus.rb +231 -0
  83. data/lib/zen/package/menus/lib/menus/helper/menu_item.rb +93 -0
  84. data/lib/zen/package/menus/lib/menus/language/en/menu_items.yml +41 -0
  85. data/lib/zen/package/menus/lib/menus/language/en/menus.yml +39 -0
  86. data/lib/zen/package/menus/lib/menus/liquid/menus.rb +152 -0
  87. data/lib/zen/package/menus/lib/menus/model/menu.rb +38 -0
  88. data/lib/zen/package/menus/lib/menus/model/menu_item.rb +33 -0
  89. data/lib/zen/package/menus/lib/menus/view/admin/menu-items/edit.xhtml +7 -0
  90. data/lib/zen/package/menus/lib/menus/view/admin/menu-items/form.xhtml +64 -0
  91. data/lib/zen/package/menus/lib/menus/view/admin/menu-items/index.xhtml +84 -0
  92. data/lib/zen/package/menus/lib/menus/view/admin/menu-items/new.xhtml +7 -0
  93. data/lib/zen/package/menus/lib/menus/view/admin/menus/edit.xhtml +7 -0
  94. data/lib/zen/package/menus/lib/menus/view/admin/menus/form.xhtml +42 -0
  95. data/lib/zen/package/menus/lib/menus/view/admin/menus/index.xhtml +95 -0
  96. data/lib/zen/package/menus/lib/menus/view/admin/menus/new.xhtml +7 -0
  97. data/lib/zen/{packages/sections → package/menus}/migrations/.gitkeep +0 -0
  98. data/lib/zen/package/menus/migrations/1297184342_create_schema.rb +33 -0
  99. data/lib/zen/{packages → package}/sections/lib/sections.rb +0 -0
  100. data/lib/zen/{packages → package}/sections/lib/sections/controller/section_entries.rb +132 -68
  101. data/lib/zen/{packages → package}/sections/lib/sections/controller/sections.rb +96 -48
  102. data/lib/zen/package/sections/lib/sections/language/en/section_entries.yml +43 -0
  103. data/lib/zen/package/sections/lib/sections/language/en/sections.yml +48 -0
  104. data/lib/zen/{packages → package}/sections/lib/sections/liquid/section_entries.rb +55 -43
  105. data/lib/zen/{packages → package}/sections/lib/sections/liquid/sections.rb +9 -8
  106. data/lib/zen/package/sections/lib/sections/model/section.rb +62 -0
  107. data/lib/zen/package/sections/lib/sections/model/section_entry.rb +53 -0
  108. data/lib/zen/package/sections/lib/sections/view/admin/edit.xhtml +7 -0
  109. data/lib/zen/package/sections/lib/sections/view/admin/form.xhtml +107 -0
  110. data/lib/zen/package/sections/lib/sections/view/admin/index.xhtml +93 -0
  111. data/lib/zen/package/sections/lib/sections/view/admin/new.xhtml +7 -0
  112. data/lib/zen/package/sections/lib/sections/view/admin/section-entries/edit.xhtml +7 -0
  113. data/lib/zen/package/sections/lib/sections/view/admin/section-entries/form.xhtml +233 -0
  114. data/lib/zen/package/sections/lib/sections/view/admin/section-entries/index.xhtml +82 -0
  115. data/lib/zen/package/sections/lib/sections/view/admin/section-entries/new.xhtml +7 -0
  116. data/lib/zen/{packages/settings → package/sections}/migrations/.gitkeep +0 -0
  117. data/lib/zen/{packages → package}/sections/migrations/1295251836_create_schema.rb +6 -6
  118. data/lib/zen/{packages → package}/settings/lib/settings.rb +0 -0
  119. data/lib/zen/{packages → package}/settings/lib/settings/controller/settings.rb +33 -24
  120. data/lib/zen/package/settings/lib/settings/language/en/settings.yml +26 -0
  121. data/lib/zen/{packages → package}/settings/lib/settings/liquid/setting.rb +5 -3
  122. data/lib/zen/package/settings/lib/settings/model/setting.rb +113 -0
  123. data/lib/zen/package/settings/lib/settings/view/admin/settings/index.xhtml +111 -0
  124. data/lib/zen/{packages/users → package/settings}/migrations/.gitkeep +0 -0
  125. data/lib/zen/{packages → package}/settings/migrations/1295597111_create_schema.rb +2 -2
  126. data/lib/zen/package/settings/migrations/1299538742_add_language_key.rb +62 -0
  127. data/lib/zen/{packages → package}/users/lib/users.rb +6 -2
  128. data/lib/zen/package/users/lib/users/controller/access_rules.rb +238 -0
  129. data/lib/zen/package/users/lib/users/controller/user_groups.rb +217 -0
  130. data/lib/zen/{packages → package}/users/lib/users/controller/users.rb +115 -57
  131. data/lib/zen/package/users/lib/users/language/en/access_rules.yml +35 -0
  132. data/lib/zen/package/users/lib/users/language/en/user_groups.yml +31 -0
  133. data/lib/zen/package/users/lib/users/language/en/users.yml +50 -0
  134. data/lib/zen/{packages → package}/users/lib/users/liquid/user.rb +8 -6
  135. data/lib/zen/{packages → package}/users/lib/users/liquid/users.rb +5 -3
  136. data/lib/zen/{packages → package}/users/lib/users/model/access_rule.rb +11 -3
  137. data/lib/zen/{packages → package}/users/lib/users/model/user.rb +5 -1
  138. data/lib/zen/{packages → package}/users/lib/users/model/user_group.rb +6 -3
  139. data/lib/zen/package/users/lib/users/public/admin/js/users/access_rules.js +42 -0
  140. data/lib/zen/package/users/lib/users/view/admin/access-rules/edit.xhtml +7 -0
  141. data/lib/zen/package/users/lib/users/view/admin/access-rules/form.xhtml +108 -0
  142. data/lib/zen/package/users/lib/users/view/admin/access-rules/index.xhtml +93 -0
  143. data/lib/zen/package/users/lib/users/view/admin/access-rules/new.xhtml +7 -0
  144. data/lib/zen/package/users/lib/users/view/admin/user-groups/edit.xhtml +7 -0
  145. data/lib/zen/package/users/lib/users/view/admin/user-groups/form.xhtml +37 -0
  146. data/lib/zen/package/users/lib/users/view/admin/user-groups/index.xhtml +76 -0
  147. data/lib/zen/package/users/lib/users/view/admin/user-groups/new.xhtml +7 -0
  148. data/lib/zen/package/users/lib/users/view/admin/users/edit.xhtml +7 -0
  149. data/lib/zen/package/users/lib/users/view/admin/users/form.xhtml +53 -0
  150. data/lib/zen/package/users/lib/users/view/admin/users/index.xhtml +81 -0
  151. data/lib/zen/package/users/lib/users/view/admin/users/login.xhtml +27 -0
  152. data/lib/zen/package/users/lib/users/view/admin/users/new.xhtml +7 -0
  153. data/{pkg → lib/zen/package/users/migrations}/.gitkeep +0 -0
  154. data/lib/zen/{packages → package}/users/migrations/1295281013_create_schema.rb +2 -2
  155. data/lib/zen/public/admin/css/boilerplate.css +62 -60
  156. data/lib/zen/public/admin/css/buttons.css +46 -0
  157. data/lib/zen/public/admin/css/datepicker.css +163 -0
  158. data/lib/zen/public/admin/css/editor.css +91 -0
  159. data/lib/zen/public/admin/css/forms.css +68 -0
  160. data/lib/zen/public/admin/css/general.css +34 -419
  161. data/lib/zen/public/admin/css/grid.css +26 -26
  162. data/lib/zen/public/admin/css/layout.css +73 -62
  163. data/lib/zen/public/admin/css/modals.css +63 -0
  164. data/lib/zen/public/admin/css/notifications.css +84 -0
  165. data/lib/zen/public/admin/css/tables.css +71 -0
  166. data/lib/zen/public/admin/css/tabs.css +53 -0
  167. data/lib/zen/public/admin/js/mootools/more.js +139 -51
  168. data/lib/zen/public/admin/js/vendor/datepicker/Picker.Attach.js +137 -0
  169. data/lib/zen/public/admin/js/vendor/datepicker/Picker.Date.js +576 -0
  170. data/lib/zen/public/admin/js/vendor/datepicker/Picker.js +291 -0
  171. data/lib/zen/public/admin/js/vendor/datepicker/README.md +325 -0
  172. data/lib/zen/public/admin/js/vendor/datepicker/locale.js +16 -0
  173. data/lib/zen/public/admin/js/zen/editor/base.js +173 -183
  174. data/lib/zen/public/admin/js/zen/editor/drivers/html.js +74 -89
  175. data/lib/zen/public/admin/js/zen/editor/drivers/markdown.js +72 -87
  176. data/lib/zen/public/admin/js/zen/editor/drivers/textile.js +72 -87
  177. data/lib/zen/public/admin/js/zen/init.js +65 -51
  178. data/lib/zen/public/admin/js/zen/modal.js +108 -121
  179. data/lib/zen/public/admin/js/zen/notification.js +163 -165
  180. data/lib/zen/public/admin/js/zen/tabs.js +203 -210
  181. data/lib/zen/task/build.rb +123 -0
  182. data/lib/zen/task/clean.rb +46 -0
  183. data/lib/zen/task/db.rb +120 -0
  184. data/lib/zen/task/package.rb +82 -0
  185. data/lib/zen/task/proto.rb +116 -0
  186. data/{LICENSE → license.txt} +2 -2
  187. data/proto/app/Thorfile +4 -0
  188. data/proto/app/config/middlewares.rb +3 -3
  189. data/proto/app/config/requires.rb +1 -6
  190. data/proto/app/start.rb +5 -10
  191. data/{lib/zen/packages/settings → proto/package}/LICENSE +0 -0
  192. data/{lib/zen/packages/categories → proto/package}/README.textile +0 -0
  193. data/proto/package/lib/package.rb +41 -0
  194. data/proto/{module/lib/module → package/lib/package}/controller/controllers.rb +3 -2
  195. data/proto/{module/lib/module → package/lib/package}/language/en/languages.rb +0 -0
  196. data/proto/{module/lib/module → package/lib/package}/model/model.rb +0 -0
  197. data/proto/{module/lib/module/view/admin → package/lib/package/view/admin/package}/edit.xhtml +0 -0
  198. data/proto/{module/lib/module/view/admin → package/lib/package/view/admin/package}/form.xhtml +0 -0
  199. data/proto/{module/lib/module/view/admin → package/lib/package/view/admin/package}/index.xhtml +0 -0
  200. data/proto/{module/lib/module/view/admin → package/lib/package/view/admin/package}/new.xhtml +0 -0
  201. data/proto/{module → package}/migrations/.gitkeep +0 -0
  202. metadata +199 -280
  203. data/README.textile +0 -42
  204. data/Rakefile +0 -6
  205. data/doc/Categories.html +0 -93
  206. data/doc/Categories/Controllers.html +0 -93
  207. data/doc/Categories/Controllers/Categories.html +0 -995
  208. data/doc/Categories/Controllers/CategoryGroups.html +0 -878
  209. data/doc/Categories/Models.html +0 -97
  210. data/doc/Categories/Models/Category.html +0 -269
  211. data/doc/Categories/Models/CategoryGroup.html +0 -231
  212. data/doc/Comments.html +0 -93
  213. data/doc/Comments/Controllers.html +0 -93
  214. data/doc/Comments/Controllers/Comments.html +0 -797
  215. data/doc/Comments/Controllers/CommentsForm.html +0 -487
  216. data/doc/Comments/Liquid.html +0 -93
  217. data/doc/Comments/Liquid/CommentForm.html +0 -522
  218. data/doc/Comments/Liquid/Comments.html +0 -543
  219. data/doc/Comments/Models.html +0 -95
  220. data/doc/Comments/Models/Comment.html +0 -260
  221. data/doc/CustomFields.html +0 -93
  222. data/doc/CustomFields/Controllers.html +0 -93
  223. data/doc/CustomFields/Controllers/CustomFieldGroups.html +0 -902
  224. data/doc/CustomFields/Controllers/CustomFields.html +0 -974
  225. data/doc/CustomFields/Models.html +0 -97
  226. data/doc/CustomFields/Models/CustomField.html +0 -272
  227. data/doc/CustomFields/Models/CustomFieldGroup.html +0 -259
  228. data/doc/CustomFields/Models/CustomFieldValue.html +0 -154
  229. data/doc/Ramaze.html +0 -93
  230. data/doc/Ramaze/Helper.html +0 -93
  231. data/doc/Ramaze/Helper/ACL.html +0 -531
  232. data/doc/Ramaze/Helper/Asset.html +0 -617
  233. data/doc/Ramaze/Helper/Breadcrumb.html +0 -411
  234. data/doc/Ramaze/Helper/Common.html +0 -738
  235. data/doc/Sections.html +0 -93
  236. data/doc/Sections/Controllers.html +0 -93
  237. data/doc/Sections/Controllers/SectionEntries.html +0 -1100
  238. data/doc/Sections/Controllers/Sections.html +0 -953
  239. data/doc/Sections/Liquid.html +0 -93
  240. data/doc/Sections/Liquid/SectionEntries.html +0 -674
  241. data/doc/Sections/Liquid/Sections.html +0 -494
  242. data/doc/Sections/Models.html +0 -97
  243. data/doc/Sections/Models/Section.html +0 -272
  244. data/doc/Sections/Models/SectionEntry.html +0 -264
  245. data/doc/Sequel.html +0 -91
  246. data/doc/Sequel/Model.html +0 -243
  247. data/doc/Settings.html +0 -93
  248. data/doc/Settings/Controllers.html +0 -91
  249. data/doc/Settings/Controllers/Settings.html +0 -565
  250. data/doc/Settings/Liquid.html +0 -91
  251. data/doc/Settings/Liquid/Setting.html +0 -426
  252. data/doc/Settings/Models.html +0 -95
  253. data/doc/Settings/Models/Setting.html +0 -293
  254. data/doc/Users.html +0 -93
  255. data/doc/Users/Controllers.html +0 -93
  256. data/doc/Users/Controllers/AccessRules.html +0 -904
  257. data/doc/Users/Controllers/UserGroups.html +0 -879
  258. data/doc/Users/Controllers/Users.html +0 -1124
  259. data/doc/Users/Liquid.html +0 -93
  260. data/doc/Users/Liquid/User.html +0 -480
  261. data/doc/Users/Liquid/Users.html +0 -495
  262. data/doc/Users/Models.html +0 -97
  263. data/doc/Users/Models/AccessRule.html +0 -257
  264. data/doc/Users/Models/User.html +0 -649
  265. data/doc/Users/Models/UserGroup.html +0 -267
  266. data/doc/Zen.html +0 -391
  267. data/doc/Zen/Bin.html +0 -113
  268. data/doc/Zen/Bin/Base.html +0 -727
  269. data/doc/Zen/Controllers.html +0 -115
  270. data/doc/Zen/Controllers/AdminController.html +0 -298
  271. data/doc/Zen/Controllers/BaseController.html +0 -272
  272. data/doc/Zen/Controllers/FrontendController.html +0 -164
  273. data/doc/Zen/Controllers/MainController.html +0 -421
  274. data/doc/Zen/Database.html +0 -498
  275. data/doc/Zen/Language.html +0 -660
  276. data/doc/Zen/Liquid.html +0 -117
  277. data/doc/Zen/Liquid/ControllerBehavior.html +0 -448
  278. data/doc/Zen/Liquid/General.html +0 -444
  279. data/doc/Zen/Liquid/Redirect.html +0 -435
  280. data/doc/Zen/Liquid/Strip.html +0 -447
  281. data/doc/Zen/Logger.html +0 -393
  282. data/doc/Zen/Package.html +0 -909
  283. data/doc/_index.html +0 -724
  284. data/doc/class_list.html +0 -36
  285. data/doc/css/common.css +0 -1
  286. data/doc/css/full_list.css +0 -53
  287. data/doc/css/style.css +0 -310
  288. data/doc/file.README.html +0 -86
  289. data/doc/file_list.html +0 -38
  290. data/doc/frames.html +0 -13
  291. data/doc/index.html +0 -86
  292. data/doc/js/app.js +0 -203
  293. data/doc/js/full_list.js +0 -149
  294. data/doc/js/jquery.js +0 -154
  295. data/doc/method_list.html +0 -1139
  296. data/doc/top-level-namespace.html +0 -88
  297. data/lib/zen/language/en/zen_general.rb +0 -21
  298. data/lib/zen/language/en/zen_models.rb +0 -39
  299. data/lib/zen/packages/categories/LICENSE +0 -19
  300. data/lib/zen/packages/categories/lib/categories/controller/categories.rb +0 -202
  301. data/lib/zen/packages/categories/lib/categories/controller/category_groups.rb +0 -173
  302. data/lib/zen/packages/categories/lib/categories/language/en/categories.rb +0 -38
  303. data/lib/zen/packages/categories/lib/categories/language/en/category_groups.rb +0 -37
  304. data/lib/zen/packages/categories/lib/categories/view/admin/categories/edit.xhtml +0 -7
  305. data/lib/zen/packages/categories/lib/categories/view/admin/categories/form.xhtml +0 -36
  306. data/lib/zen/packages/categories/lib/categories/view/admin/categories/index.xhtml +0 -70
  307. data/lib/zen/packages/categories/lib/categories/view/admin/categories/new.xhtml +0 -7
  308. data/lib/zen/packages/categories/lib/categories/view/admin/category_groups/edit.xhtml +0 -7
  309. data/lib/zen/packages/categories/lib/categories/view/admin/category_groups/form.xhtml +0 -18
  310. data/lib/zen/packages/categories/lib/categories/view/admin/category_groups/index.xhtml +0 -72
  311. data/lib/zen/packages/categories/lib/categories/view/admin/category_groups/new.xhtml +0 -7
  312. data/lib/zen/packages/comments/LICENSE +0 -19
  313. data/lib/zen/packages/comments/README.textile +0 -0
  314. data/lib/zen/packages/comments/lib/comments/language/en/comments.rb +0 -52
  315. data/lib/zen/packages/comments/lib/comments/view/admin/comments/edit.xhtml +0 -7
  316. data/lib/zen/packages/comments/lib/comments/view/admin/comments/form.xhtml +0 -31
  317. data/lib/zen/packages/comments/lib/comments/view/admin/comments/index.xhtml +0 -74
  318. data/lib/zen/packages/comments/migrations/1296949631_add_defensio_signature.rb +0 -11
  319. data/lib/zen/packages/custom_fields/LICENSE +0 -19
  320. data/lib/zen/packages/custom_fields/README.textile +0 -0
  321. data/lib/zen/packages/custom_fields/lib/custom_fields/controller/custom_field_groups.rb +0 -179
  322. data/lib/zen/packages/custom_fields/lib/custom_fields/controller/custom_fields.rb +0 -194
  323. data/lib/zen/packages/custom_fields/lib/custom_fields/language/en/custom_field_groups.rb +0 -45
  324. data/lib/zen/packages/custom_fields/lib/custom_fields/language/en/custom_fields.rb +0 -64
  325. data/lib/zen/packages/custom_fields/lib/custom_fields/view/admin/custom_field_groups/edit.xhtml +0 -7
  326. data/lib/zen/packages/custom_fields/lib/custom_fields/view/admin/custom_field_groups/form.xhtml +0 -18
  327. data/lib/zen/packages/custom_fields/lib/custom_fields/view/admin/custom_field_groups/index.xhtml +0 -88
  328. data/lib/zen/packages/custom_fields/lib/custom_fields/view/admin/custom_field_groups/new.xhtml +0 -7
  329. data/lib/zen/packages/custom_fields/lib/custom_fields/view/admin/custom_fields/edit.xhtml +0 -7
  330. data/lib/zen/packages/custom_fields/lib/custom_fields/view/admin/custom_fields/form.xhtml +0 -50
  331. data/lib/zen/packages/custom_fields/lib/custom_fields/view/admin/custom_fields/index.xhtml +0 -75
  332. data/lib/zen/packages/custom_fields/lib/custom_fields/view/admin/custom_fields/new.xhtml +0 -7
  333. data/lib/zen/packages/sections/LICENSE +0 -19
  334. data/lib/zen/packages/sections/README.textile +0 -43
  335. data/lib/zen/packages/sections/lib/sections/language/en/section_entries.rb +0 -58
  336. data/lib/zen/packages/sections/lib/sections/language/en/sections.rb +0 -63
  337. data/lib/zen/packages/sections/lib/sections/model/section.rb +0 -43
  338. data/lib/zen/packages/sections/lib/sections/model/section_entry.rb +0 -43
  339. data/lib/zen/packages/sections/lib/sections/view/admin/edit.xhtml +0 -7
  340. data/lib/zen/packages/sections/lib/sections/view/admin/form.xhtml +0 -54
  341. data/lib/zen/packages/sections/lib/sections/view/admin/index.xhtml +0 -77
  342. data/lib/zen/packages/sections/lib/sections/view/admin/new.xhtml +0 -7
  343. data/lib/zen/packages/sections/lib/sections/view/admin/section_entries/edit.xhtml +0 -7
  344. data/lib/zen/packages/sections/lib/sections/view/admin/section_entries/form.xhtml +0 -147
  345. data/lib/zen/packages/sections/lib/sections/view/admin/section_entries/index.xhtml +0 -74
  346. data/lib/zen/packages/sections/lib/sections/view/admin/section_entries/new.xhtml +0 -7
  347. data/lib/zen/packages/sections/migrations/1296335671_userdata_section_entries.rb +0 -18
  348. data/lib/zen/packages/sections/migrations/1296936110_drop_comment_antispam.rb +0 -11
  349. data/lib/zen/packages/settings/README.textile +0 -0
  350. data/lib/zen/packages/settings/lib/settings/language/en/settings.rb +0 -56
  351. data/lib/zen/packages/settings/lib/settings/model/setting.rb +0 -38
  352. data/lib/zen/packages/settings/lib/settings/view/admin/settings/index.xhtml +0 -79
  353. data/lib/zen/packages/users/LICENSE +0 -19
  354. data/lib/zen/packages/users/README.textile +0 -0
  355. data/lib/zen/packages/users/lib/users/controller/access_rules.rb +0 -186
  356. data/lib/zen/packages/users/lib/users/controller/user_groups.rb +0 -171
  357. data/lib/zen/packages/users/lib/users/language/en/access_rules.rb +0 -49
  358. data/lib/zen/packages/users/lib/users/language/en/user_groups.rb +0 -42
  359. data/lib/zen/packages/users/lib/users/language/en/users.rb +0 -63
  360. data/lib/zen/packages/users/lib/users/public/admin/js/users/access_rules.js +0 -43
  361. data/lib/zen/packages/users/lib/users/view/admin/access_rules/edit.xhtml +0 -7
  362. data/lib/zen/packages/users/lib/users/view/admin/access_rules/form.xhtml +0 -68
  363. data/lib/zen/packages/users/lib/users/view/admin/access_rules/index.xhtml +0 -85
  364. data/lib/zen/packages/users/lib/users/view/admin/access_rules/new.xhtml +0 -7
  365. data/lib/zen/packages/users/lib/users/view/admin/user_groups/edit.xhtml +0 -7
  366. data/lib/zen/packages/users/lib/users/view/admin/user_groups/form.xhtml +0 -19
  367. data/lib/zen/packages/users/lib/users/view/admin/user_groups/index.xhtml +0 -69
  368. data/lib/zen/packages/users/lib/users/view/admin/user_groups/new.xhtml +0 -7
  369. data/lib/zen/packages/users/lib/users/view/admin/users/edit.xhtml +0 -7
  370. data/lib/zen/packages/users/lib/users/view/admin/users/form.xhtml +0 -25
  371. data/lib/zen/packages/users/lib/users/view/admin/users/index.xhtml +0 -73
  372. data/lib/zen/packages/users/lib/users/view/admin/users/login.xhtml +0 -22
  373. data/lib/zen/packages/users/lib/users/view/admin/users/new.xhtml +0 -7
  374. data/lib/zen/tasks.rb +0 -6
  375. data/proto/app/Rakefile +0 -2
  376. data/proto/module/LICENSE +0 -0
  377. data/proto/module/README.textile +0 -0
  378. data/proto/module/lib/module.rb +0 -15
  379. data/spec/javascript/css/base.css +0 -177
  380. data/spec/javascript/css/style.css +0 -204
  381. data/spec/javascript/css/typography.css +0 -70
  382. data/spec/javascript/editor/index.html +0 -65
  383. data/spec/javascript/images/close.png +0 -0
  384. data/spec/javascript/images/info.png +0 -0
  385. data/spec/javascript/js/editor.js +0 -16
  386. data/spec/javascript/js/modal.js +0 -12
  387. data/spec/javascript/js/namespace.js +0 -2
  388. data/spec/javascript/js/notification.js +0 -43
  389. data/spec/javascript/js/tabs.js +0 -8
  390. data/spec/javascript/modal/index.html +0 -45
  391. data/spec/javascript/notification/index.html +0 -48
  392. data/spec/javascript/tabs/index.html +0 -73
  393. data/spec/javascript/tabs/tab_1.html +0 -1
  394. data/spec/javascript/tabs/tab_2.html +0 -1
  395. data/spec/zen/base/language.rb +0 -31
  396. data/spec/zen/base/logger.rb +0 -34
  397. data/spec/zen/base/package.rb +0 -47
  398. data/spec/zen/config/database.rb +0 -8
  399. data/spec/zen/helper/asset.rb +0 -26
  400. data/spec/zen/helper/breadcrumb.rb +0 -24
  401. data/spec/zen/language/en/general.rb +0 -4
  402. data/spec/zen/language/nl/general.rb +0 -4
  403. data/spec/zen/liquid/general.rb +0 -42
  404. data/spec/zen/logs/.gitkeep +0 -0
  405. data/spec/zen/spec.rb +0 -9
  406. data/spec/zen/spec_database.db +0 -0
  407. data/tasks/bacon.rake +0 -99
  408. data/tasks/build.rake +0 -72
  409. data/tasks/clean.rake +0 -18
  410. data/tasks/db.rake +0 -81
  411. data/tasks/doc.rake +0 -5
  412. data/tasks/extension.rake +0 -65
  413. data/tasks/proto.rake +0 -37
  414. data/tasks/theme.rake +0 -63
@@ -0,0 +1,114 @@
1
+ # README
2
+
3
+ Zen is a modular CMS written on top of the awesome Ramaze framework.
4
+ Zen was built out of the frustration with Expression Engine, a popular CMS built on top of
5
+ the Codeigniter framework which in turn is written using PHP. While I really like Codeigniter,
6
+ ExpressionEngine and EllisLab there were several problems that bothered me.
7
+ So I set out to write a system that's loosely based on ExpressionEngine but fits my needs.
8
+ Because of this certain features may seem similar to those provided by EE and while at
9
+ certain points there are similarities there are also pretty big differences.
10
+
11
+ ## Requirements
12
+
13
+ The following Gems are always required:
14
+
15
+ * Ramaze
16
+ * Sequel
17
+ * Liquid
18
+ * BCrypt
19
+ * JSON
20
+ * Ruby 1.9
21
+ * Defensio
22
+ * Thor
23
+ * Sequel Sluggable
24
+
25
+ These Gems are only required when developing/hacking Zen itself:
26
+
27
+ * RDiscount
28
+ * YARD
29
+ * RSpec 2
30
+ * Webrat
31
+
32
+ ## Installation
33
+
34
+ Installing Zen using Rubygems is probably the easiest way:
35
+
36
+ $ gem install zen
37
+ $ zen app application_name
38
+
39
+ If you like to hack with the core of Zen it's best to install it using Git:
40
+
41
+ $ git clone git://github.com/zen-cms/zen-core.git
42
+ $ cd zen-core
43
+ $ thor build:gem_clean
44
+
45
+ ## Database Support
46
+
47
+ Technically Zen should run on any given DBMS that's supported by Sequel as Zen doesn't
48
+ use any DBMS specific field types. However, there might be a chance that it won't work.
49
+ If you happen to have any problems getting Zen running using your database of choice
50
+ feel free to submit a ticket or post it on the mailing list.
51
+
52
+ The Zen website itself is tested and served using MySQL, SQLite3 works just as fine and
53
+ PostgreSQL will be tested in the near future.
54
+
55
+ ## Running Zen
56
+
57
+ Zen can be run using any webserver as long as it supports Rack. Thin, Unicorn or Passenger,
58
+ they should all work. The main website of Zen is served using Unicorn and Nginx, development
59
+ is done using WEBRick and Unicorn.
60
+
61
+ ## Documentation
62
+
63
+ The documentation (both the userguide and the API docs) can be found on the website,
64
+ located [here][zen documentation].
65
+
66
+ ## Hacking/Contributing
67
+
68
+ Zen follows a relatively strict set of guidelines when it comes to developing core features
69
+ and making sure everything goes along smoothly. When working with Git a branch model based
70
+ on [nvie's branch model][nvie branch model] is used. This means that the "master" branch
71
+ is directly used for pushing Gems and thus should *always* contain stable code. Develop
72
+ is used to contain less stable (but not unstable) commits that will be pushed into "master"
73
+ from time to time. All other branches, e.g. "rspec2" will be used for individual features.
74
+
75
+ Besides following this model developers are also expected to write tests using either
76
+ RSpec or Webrat for their features. Webrat is used to test controllers and browser based
77
+ tests while RSpec is used to test libraries, helpers, etc.
78
+
79
+ If you have a cool idea, implemented it and think it's worth merging into Zen itself feel
80
+ free to submit a pull request and I'll take a look at it.
81
+
82
+ ## Coding Standards
83
+
84
+ * 2 spaces per indentation level for Ruby code.
85
+ * 4 spaces per indentation level for Javascript, CSS and HTML.
86
+ * Document your code, that includes CSS and Javascript files.
87
+ * No tabs at all times
88
+ * Markdown is used for all markup
89
+ * Comments should be in English
90
+ * The maximum width of each line should be no more than 90 columns, this makes it easier
91
+ to read code in terminals or when using split view modes.
92
+ * Big changes should always be added to the file "CHANGELOG.md".
93
+
94
+ ## Community
95
+
96
+ * [Website][zen website]
97
+ * Mailing list
98
+
99
+ Zen does not have it's own IRC channel at this time but you can usually find me in any
100
+ of the following channels on Freenode (all are prefixed with a hash sign):
101
+
102
+ * forrst-chat
103
+ * ramaze
104
+ * codeigniter
105
+ * mootools
106
+
107
+ ## License
108
+
109
+ Zen is licensed under the MIT license. For more information about this license open
110
+ the file "license.txt".
111
+
112
+ [zen website]: http://zen-cms.com/
113
+ [zen documentation]: http://zen-cms.com/documentation/
114
+ [nvie branch model]: http://nvie.com/posts/a-successful-git-branching-model/
@@ -0,0 +1,31 @@
1
+ # Roadmap
2
+
3
+ Please note that the release dates in this roadmap may and most likely will change from
4
+ time to time. List items that contain a "(!)" are considered to be important and should
5
+ be solved/added before any of the other items. Items containing "(?)" are considered
6
+ to be unverified/undecided and might not be added/completed at all.
7
+
8
+ ## Planned Releases
9
+
10
+ ### 0.3 - June 2011
11
+
12
+ * Most parts of the core covered by specs. (!)
13
+ * A working (although probably rough) plugin system to extend the inner parts of Zen.
14
+ An example of a plugin would be something that allows the use of Akismet for comments
15
+ rather than Defensio.
16
+ * Website completely up and running. (!)
17
+ * Translation system for the Javascript used in the backend
18
+ * Documentation/Userguide online
19
+
20
+ ### 0.2 - March 2011
21
+
22
+ * General code improvements.
23
+ * Navigation module for the frontend.
24
+ * Improved Liquid tags.
25
+ * A working datepicker
26
+ * Refilling forms in case of errors (!)
27
+
28
+ ### 0.1a - February 2011
29
+
30
+ The first public alpha released, mainly meant to give people and idea of what Zen is
31
+ all about.
@@ -0,0 +1,8 @@
1
+ require File.expand_path('../lib/zen', __FILE__)
2
+ require 'thor'
3
+
4
+ task_dir = File.expand_path('../lib/zen/task', __FILE__)
5
+
6
+ Dir.glob("#{task_dir}/*.rb").each do |f|
7
+ require(f)
8
+ end
data/lib/zen.rb CHANGED
@@ -11,21 +11,21 @@ module Zen
11
11
  require 'bcrypt'
12
12
  require 'liquid'
13
13
  require 'json'
14
- require 'redcloth'
15
- require 'rdiscount'
16
14
  require 'defensio'
15
+ require 'thor'
16
+ require 'sequel_sluggable'
17
+ require 'yaml'
17
18
  require __DIR__('zen/base/version')
18
19
 
19
20
  include Innate::Optioned
20
21
 
21
22
  # Update several paths so we can load helpers/layouts from the Zen gem
22
- Innate::HelpersHelper.options.paths << __DIR__('zen')
23
- Ramaze.options.roots << __DIR__('zen')
23
+ Innate::HelpersHelper.options.paths.push(__DIR__('zen'))
24
+ Ramaze.options.roots.push(__DIR__('zen'))
24
25
 
25
26
  options.dsl do
26
27
  # General configuration options
27
28
  o 'The character encoding to use when dealing with data', :encoding, 'utf8'
28
- o 'The system language', :language, 'en'
29
29
  o 'The date format to use for log files and such.', :date_format, '%d-%m-%Y'
30
30
  o 'The base directory of Zen.', :root, ''
31
31
  end
@@ -49,11 +49,11 @@ module Zen
49
49
  require __DIR__ 'zen/liquid/strip'
50
50
 
51
51
  class << self
52
- attr_accessor :logger
52
+ attr_reader :languages
53
53
  end
54
54
 
55
55
  # Update the language paths
56
- Zen::Language.language_paths << __DIR__('zen')
56
+ Zen::Language.options.paths.push(__DIR__('zen'))
57
57
 
58
58
  # Register our Liquid tags
59
59
  ::Liquid::Template.register_tag('strip' , Liquid::Strip)
@@ -63,15 +63,18 @@ module Zen
63
63
  # Intitializes Zen by connecting the database and setting up various other things.
64
64
  #
65
65
  # @author Yorick Peterse
66
+ # @since 0.1
66
67
  #
67
68
  def self.init
68
69
  # Initialize the database
69
70
  Zen::Database.init
71
+ Zen::Language.load('zen_general')
70
72
 
71
73
  require __DIR__ 'zen/model/settings'
72
74
  require __DIR__ 'zen/model/methods'
73
75
 
74
- # Initialize the logger
75
- @logger = Zen::Logger.new("#{Zen.options.root}/logs/common")
76
+ @languages = {
77
+ 'en' => lang('zen_general.special.language_hash.en')
78
+ }
76
79
  end
77
- end
80
+ end
@@ -1,39 +1,45 @@
1
+ #:nodoc:
1
2
  module Zen
2
3
  ##
3
4
  # The database module is one of the most important classes in Zen (which is quite obvious).
4
- # Without this module the application wouldn't exist. The database module is basically a small
5
- # wrapper around the Sequel.connect method and allows developers to specify database
6
- # settings for various environments (live, test, production, etc) using a simple block.
5
+ # Without this module the application wouldn't exist. The database module is
6
+ # basically a small wrapper around the Sequel.connect method and allows developers
7
+ # to specify database settings for various environments (live, test, production, etc)
8
+ # using a simple block.
7
9
  #
8
- # h2. Database Configuration
10
+ # ## Database Configuration
9
11
  #
10
12
  # Connecting to a database is fairly easy and only requires a single configuration file.
11
- # In this file, called "database.rb" you'll define all your database environments (live, dev, test, etc).
13
+ # In this file, called "database.rb" you'll define all your database environments
14
+ # (live, dev, test, etc).
12
15
  #
13
- # bc.. Zen::Database.mode :dev do |db|
14
- # db.adapter = 'mysql'
15
- # db.host = 'localhost'
16
+ # Zen::Database.mode :dev do |db|
17
+ # db.adapter = 'mysql'
18
+ # db.host = 'localhost'
16
19
  #
17
- # db.username = 'root'
18
- # db.password = 'root'
19
- # db.database = 'database'
20
- # end
20
+ # db.username = 'root'
21
+ # db.password = 'root'
22
+ # db.database = 'database'
23
+ # end
21
24
  #
22
- # p. In this example we're connecting to "localhost" using the mysql adapter and selecting the database
23
- # called "database". When placing multiple environments in the same file you don't have to worry about
24
- # them overriding eachother, Zen will only load the environment settings of the block that matches
25
+ # In this example we're connecting to "localhost" using the mysql adapter and
26
+ # selecting the database called "database". When placing multiple environments in the
27
+ # same file you don't have to worry about them overriding eachother, Zen will only
28
+ # load the environment settings of the block that matches
25
29
  # the current environment set in Ramaze.options.mode.
26
30
  #
27
- # h2. Database Interaction
31
+ # ## Database Interaction
28
32
  #
29
- # Once your database configuration file has been loaded you can communicate with the database using
30
- # models. Each model should extend the base model provided by Sequel:
33
+ # Once your database configuration file has been loaded you can communicate with the
34
+ # database using models. Each model should extend the base model provided by Sequel:
31
35
  #
32
- # bc. class Comment < Sequel::Model
33
- # end
36
+ # class Comment < Sequel::Model
37
+ #
38
+ # end
34
39
  #
35
- # Models can be called like any other class and don't need to be initialized. For more information
36
- # on how to use models using Sequel you should read Sequel's documentation: http://sequel.rubyforge.com/
40
+ # Models can be called like any other class and don't need to be initialized. For
41
+ # more information on how to use models using Sequel you should read Sequel's
42
+ # documentation: http://sequel.rubyforge.com/
37
43
  #
38
44
  # @author Yorick Peterse
39
45
  # @since 0.1
@@ -73,7 +79,7 @@ module Zen
73
79
  :database => self.options.database,
74
80
  :username => self.options.username,
75
81
  :password => self.options.password,
76
- :logger => Zen::Logger.new("#{Zen.options.root}/logs/database"),
82
+ :logger => Zen::Logger.new("#{Zen.options.root}/log/database"),
77
83
  :test => true,
78
84
  :encoding => Zen.options.encoding)
79
85
 
@@ -84,10 +90,10 @@ module Zen
84
90
  end
85
91
 
86
92
  ##
87
- # Method that's used to provide the ability to use different database configurations for each
88
- # mode. This method basically just sets the Zen.options.db parameters based on the provided variables
89
- # in the block. If you don't want to use different database configurations you can just set the variables
90
- # directly using Zen.options.db.
93
+ # Method that's used to provide the ability to use different database configurations
94
+ # for each mode. This method basically just sets the Zen.options.db parameters based
95
+ # on the provided variables in the block. If you don't want to use different database
96
+ # configurations you can just set the variables directly using Zen.options.db.
91
97
  #
92
98
  # @author Yorick Peterse
93
99
  # @since 0.1
@@ -102,4 +108,4 @@ module Zen
102
108
  end
103
109
  end
104
110
  end
105
- end
111
+ end
@@ -1,132 +1,214 @@
1
- require 'ostruct'
2
-
1
+ #:nodoc:
3
2
  module Zen
4
3
  ##
5
- # The Language module enables developers to create multi-lingual applications/extensions using
6
- # nothing more than Ruby. While Ramaze already ships with multi-language support it relies on YAML
7
- # for it's language files. While YAML is nice for config/language files my aim is to keep everything in Ruby
8
- # as much as possible. Another problem with the language class provided by Ramaze is that at the time of writing
9
- # (October 2011) it was completely undocumented and didn't make much sense.
4
+ # The language module is used for writing and using text translations. Translations are
5
+ # stored in a simple YAML file inside a directory called "language" followed by a directory
6
+ # who's name matches the language code for which it's translations should be used.
7
+ # Say we wanted to translate "Login" and "Register" into different languages our YAML
8
+ # file would look like the following:
9
+ #
10
+ # ---
11
+ # login: "Login"
12
+ # register: "Register"
13
+ #
14
+ # If we save this file under parent_directory/language/en/tutorial.yml we could then
15
+ # load that file as following:
16
+ #
17
+ # Zen::Language.load('tutorial')
10
18
  #
11
- # h2. Usage
19
+ # ## Loading Translations
12
20
  #
13
- # Using the language system provided by Zen is fairly straight forward. Create a directory named "language"
14
- # and create a sub directory for each language. For example, if you're adding an English language pack this directory would be named "en".
15
- # Language files can be named whatever you like as long as they contain the following block:
21
+ # The load() method will look for a YAML file of which the name matches the given string
22
+ # and can be found in the directory for the current language. This means that if we were
23
+ # to switch our language without creating a translation file for that language we wouldn't
24
+ # be able to use it (makes sense right?).
16
25
  #
17
- # bc. Zen::Language.translation 'translation_name' do |item|
18
- # # ...
19
- # end
26
+ # Once your translation file is in place and it's loaded it can be used using the lang()
27
+ # method. Example:
20
28
  #
21
- # Inside this block you'll define your language items. For example, if we want a localized username and password we could
22
- # do something like the following:
29
+ # lang('tutorial.login') # => "Login"
23
30
  #
24
- # bc. Zen::Language.translation 'example' do |item|
25
- # item.username = 'Username'
26
- # item.passowrd = 'Password'
27
- # end
31
+ # ## Directory Structure
28
32
  #
29
- # This language file can then be loaded as following (assuming it's named "example.rb"):
30
- #
31
- # bc. lang = Zen::Language.load 'example'
32
- # # We can now access our translation items from the lang variable
33
- # lang.username
34
- # lang.password
33
+ # As mentioned earlier language files are saved in a certain directory. The structure
34
+ # of this directory looks like the following:
35
35
  #
36
- # Zen will use the setting Zen.options.language to determine what language should be loaded.
36
+ # parent directory
37
+ # |
38
+ # |__ language
39
+ # |
40
+ # |__ language key (e.g. "en")
41
+ # |
42
+ # |__ filename.yml
37
43
  #
38
- # h2. Sub Items
44
+ # When loading a language file this module will loop through a certain number of paths.
45
+ # The array containing all base directories to loop through can be updated as following:
39
46
  #
40
- # Since language files are nothing more than Ruby blocks you can do everything you normally can. This makes
41
- # it extremely easy to retrieve dynamic data for your language files (a list of installed extensions for example).
42
- # Sub items are generally specified as a hash:
47
+ # Zen::Language.options.paths.push('/path/to/directory')
43
48
  #
44
- # bc. item.sub_items = {:name => 'Name'}
49
+ # It's important that you _don't_ add a /language segment to the path, this will be done
50
+ # automatically.
45
51
  #
46
- # Note that Zen won't convert the keys from format A to B, if you specify a symbol it will stay a symbol.
52
+ # ## Options
53
+ #
54
+ # * language: Small string that defines the current language (e.g. "en").
55
+ # * paths: Array of paths to look for a language file
47
56
  #
48
57
  # @author Yorick Peterse
49
- # @since 0.1
58
+ # @since 0.2
50
59
  #
51
60
  module Language
52
- @language_keys = {}
53
- @language_paths = []
54
-
61
+ include Ramaze::Optioned
62
+
63
+ options.dsl do
64
+ o 'Small string that defines the current language (e.g. "en").', :language, 'en'
65
+ o 'Array of paths to look for a language file' , :paths , []
66
+ end
67
+
55
68
  class << self
56
- attr_accessor :language_keys
57
- attr_accessor :language_paths
69
+ attr_reader :translations
58
70
  end
59
71
 
60
72
  ##
61
- # Tries to load the specified language file from each directory specified in Ramaze.options.roots.
62
- # After a language file has been loaded the OpenStruct object will be stored in a hash and returned
63
- # in case the same language file is loaded multiple times.
64
- #
73
+ # Tries to load a language file for the given name. If no language files were found
74
+ # based on the name and the current language an exception will be raised.
75
+ #
65
76
  # @example
66
- # @user_lang = Zen::Language.load 'user'
67
- # @user_lang.username
77
+ # Zen::Language.load('user')
68
78
  #
69
79
  # @author Yorick Peterse
70
- # @param [String] lang_name The name of the language file to load. This name should match both
71
- # the filename and the name defined in Zen::Language.translation().
72
- # @return [Object] An OpenStruct object containing all the language keys and their values.
80
+ # @since 0.1
81
+ # @param [String] lang_name The name of the language file to load.
73
82
  #
74
- def self.load lang_name
75
- # Each language file is stored in the hash using a key with the following format:
76
- # language-name_language-file
77
- hash_key = Zen.options.language + '_' + lang_name
78
- hash_key = hash_key.to_sym
83
+ def self.load(lang_name)
84
+ @translations ||= {}
85
+ @translations[self.options.language.to_s] ||= {}
79
86
 
80
- # Let's see if the language file is already loaded
81
- if @language_keys.key?(hash_key)
82
- return @language_keys[hash_key]
87
+ if @translations[self.options.language.to_s][lang_name.to_s]
88
+ return
83
89
  end
84
-
85
- # Time to load the file
86
- paths = @language_paths + Ramaze.options.roots
87
-
88
- paths.each do |dir|
89
- lang_path = "#{dir}/language/#{Zen.options.language}/#{lang_name}.rb"
90
90
 
91
- # Load the file if it exists
92
- if File.exist?(lang_path)
93
- require lang_path
94
- return @language_keys[hash_key]
95
- end
91
+ self.options.paths.each do |path|
92
+ path += "/language/#{self.options.language}/#{lang_name}.yml"
93
+
94
+ # Load the file and save it
95
+ if File.exist?(path)
96
+ translation = YAML.load_file(path)
97
+
98
+ # Conver the hash to a dot based hash. This means that {:person => {:age => 18}}
99
+ # would result in {'person.age' => 18}.
100
+ translation = self.to_dotted_hash({lang_name.to_s => translation})
101
+
102
+ @translations[self.options.language.to_s] ||= {}
103
+ @translations[self.options.language.to_s].merge!(translation)
104
+
105
+ # Prevents the exception from being raised
106
+ return
107
+ end
96
108
  end
97
-
98
- # No language file found
99
- return false
109
+
110
+ raise "No language file could be found for \"#{lang_name}\""
100
111
  end
101
-
112
+
102
113
  ##
103
- # Given a block this method will store all the keys in the language_keys instance variable.
104
- # Using Zen::Language.load these variables will be returned as an OpenStruct object.
114
+ # Method for retrieving the correct language item based on the given string.
115
+ # If you want to retrieve sub-items you can separate each level with a dot:
116
+ #
117
+ # lang('tutorial.main.sub')
118
+ #
119
+ # This would require our YAML file to look something like the following:
120
+ #
121
+ # ---
122
+ # main:
123
+ # sub: "Something!"
124
+ #
125
+ # It's important to remember that your key should always include the name of the
126
+ # language file since once a file is loaded it will be kept in memory to reduce
127
+ # disk usage.
105
128
  #
106
129
  # @example
107
- # Zen::Language.translation 'example' do |lang|
108
- # lang.username = 'Username'
109
- # lang.password = 'Password'
110
- # end
130
+ # lang('username')
111
131
  #
112
132
  # @author Yorick Peterse
113
- # @param [Block] Block containing all the language items.
133
+ # @since 0.2
134
+ # @param [String] key The language key to select.
135
+ # @return [Mixed]
114
136
  #
115
- def self.translation lang_name, &block
116
- # Each language file is stored in the hash using a key with the following format:
117
- # language-name_language-file
118
- hash_key = Zen.options.language + '_' + lang_name
119
- hash_key = hash_key.to_sym
120
-
121
- # Does the language key already exist?
122
- if @language_keys.key?(hash_key)
123
- raise "There already is a language file named \"#{lang_name}\" for the language \"#{Zen.options.language}\"."
137
+ def lang(key)
138
+ lang = ::Zen::Language.options.language.to_s
139
+ groups = []
140
+ translations = ::Zen::Language.translations
141
+
142
+ if !translations or !translations.key?(lang)
143
+ raise "No translation files have been added for the language code \"#{lang}\""
144
+ end
145
+
146
+ if translations[lang][key]
147
+ return translations[lang][key]
124
148
  end
125
149
 
126
- # Process the language file
127
- @language_keys[hash_key] = OpenStruct.new
128
-
129
- yield @language_keys[hash_key]
150
+ raise "The specified language item \"#{key}\" does not exist"
151
+ end
152
+
153
+ private
154
+
155
+ ##
156
+ # Method that takes a hash or an array and converts it to a dot-based hash. For example,
157
+ # the following hash:
158
+ #
159
+ # {:name => 'Name', :location => {:street => 'Street', :address => 'Address'}}
160
+ #
161
+ # would result in the following:
162
+ #
163
+ # {'name' => 'Name', 'location.street' => 'Street', 'location.address' => 'Address'}
164
+ #
165
+ # Using arrays would result in the following:
166
+ #
167
+ # to_dotted_hash(["Hello", "World"]) # => {'1' => 'Hello', '2' => 'World'}
168
+ #
169
+ # While it looks a bit goofy this allows you to do the following:
170
+ #
171
+ # lang('1') # => 'Hello'
172
+ #
173
+ # @example
174
+ # self.to_dotted_hash({:name => "Yorick"}) # => {'name' => 'Yorick'}
175
+ #
176
+ # The code for this method was mostly taken from a comment on Stack Overflow.
177
+ # This comment can be found here: <http://bit.ly/dHTjVR>
178
+ #
179
+ # @author Yorick Peterse
180
+ # @since 0.2
181
+ # @param [Hash/Array] source The hash or array to conver to a dot-based hash.
182
+ # @param [Hash] target The hash to store the new key/values in.
183
+ # @param [String] namespace The namespace for the key (e.g. "user.location").
184
+ # @return [Hash] The converted hash where the keys are dot-based strings instead of
185
+ # regular strings/symbols with sub hashes.
186
+ #
187
+ def self.to_dotted_hash(source, target = {}, namespace = nil)
188
+ if namespace and !namespace.nil?
189
+ prefix = "#{namespace}."
190
+ else
191
+ prefix = ""
192
+ end
193
+
194
+ case source
195
+ when Hash
196
+ source.each do |k, v|
197
+ self.to_dotted_hash(v, target, "#{prefix}#{k}")
198
+ end
199
+ when Array
200
+ source.each_with_index do |v, i|
201
+ self.to_dotted_hash(v, target, "#{prefix}#{i}")
202
+ end
203
+ else
204
+ if !namespace.nil?
205
+ target[namespace] = source
206
+ else
207
+ target = source
208
+ end
209
+ end
210
+
211
+ return target
130
212
  end
131
213
  end
132
- end
214
+ end