typo 4.1 → 4.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (251) hide show
  1. data/Rakefile +1 -1
  2. data/TODO-4.2 +14 -0
  3. data/TODO.MULTIUSERS +45 -0
  4. data/app/controllers/admin/base_controller.rb +18 -0
  5. data/app/controllers/admin/general_controller.rb +14 -0
  6. data/app/controllers/application.rb +2 -1
  7. data/app/controllers/articles_controller.rb +18 -21
  8. data/app/helpers/admin/base_helper.rb +4 -4
  9. data/app/helpers/admin/feedback_helper.rb +3 -3
  10. data/app/helpers/application_helper.rb +2 -6
  11. data/app/helpers/sidebar_helper.rb +2 -2
  12. data/app/models/blog.rb +9 -1
  13. data/app/models/category.rb +9 -9
  14. data/app/models/comment.rb +1 -1
  15. data/app/models/content_state/presumed_ham.rb +2 -2
  16. data/app/models/resource.rb +2 -0
  17. data/app/views/admin/categories/_categories.rhtml +10 -6
  18. data/app/views/admin/categories/edit.rhtml +3 -1
  19. data/app/views/admin/comments/_form.rhtml +3 -3
  20. data/app/views/admin/comments/list.rhtml +7 -5
  21. data/app/views/admin/comments/new.rhtml +3 -1
  22. data/app/views/admin/comments/show.rhtml +3 -1
  23. data/app/views/admin/content/_articles.rhtml +1 -1
  24. data/app/views/admin/content/_form.rhtml +4 -2
  25. data/app/views/admin/content/new.rhtml +1 -0
  26. data/app/views/admin/content/preview.rhtml +8 -8
  27. data/app/views/admin/feedback/_item.rhtml +3 -1
  28. data/app/views/admin/feedback/list.rhtml +4 -4
  29. data/app/views/admin/general/index.rhtml +14 -1
  30. data/app/views/admin/pages/_form.rhtml +1 -1
  31. data/app/views/admin/pages/destroy.rhtml +1 -1
  32. data/app/views/admin/pages/new.rhtml +1 -0
  33. data/app/views/admin/shared/_edit.rhtml +2 -2
  34. data/app/views/layouts/administration.rhtml +5 -2
  35. data/app/views/layouts/minimal.rhtml +134 -2
  36. data/config/boot.rb +1 -1
  37. data/config/environment.rb +11 -3
  38. data/config/environments/test.rb +0 -7
  39. data/config/routes.rb +3 -0
  40. data/db/migrate/004_add_sidebars.rb +21 -3
  41. data/db/migrate/056_create_notifications.rb +1 -1
  42. data/db/migrate/062_add_sitealizer_plugin.rb +18 -0
  43. data/db/schema.mysql-v3.sql +217 -0
  44. data/db/schema.mysql.sql +31 -5
  45. data/db/schema.postgresql.sql +31 -6
  46. data/db/schema.rb +17 -7
  47. data/db/schema.sqlite.sql +31 -6
  48. data/db/schema.sqlserver.sql +32 -6
  49. data/db/schema_version +1 -1
  50. data/lang/de_DE.rb +493 -0
  51. data/lang/fr_FR.rb +28 -4
  52. data/lang/ro_RO.rb +554 -0
  53. data/lib/tasks/release.rake +7 -7
  54. data/lib/typo_version.rb +1 -1
  55. data/public/images/sitealizer/bar.gif +0 -0
  56. data/public/images/sitealizer/uv.png +0 -0
  57. data/public/images/sitealizer/vh.png +0 -0
  58. data/public/javascripts/tiny_mce/blank.htm +9 -0
  59. data/public/javascripts/tiny_mce/langs/en.js +41 -0
  60. data/public/javascripts/tiny_mce/license.txt +504 -0
  61. data/public/javascripts/tiny_mce/themes/advanced/about.htm +52 -0
  62. data/public/javascripts/tiny_mce/themes/advanced/anchor.htm +33 -0
  63. data/public/javascripts/tiny_mce/themes/advanced/charmap.htm +53 -0
  64. data/public/javascripts/tiny_mce/themes/advanced/color_picker.htm +13 -0
  65. data/public/javascripts/tiny_mce/themes/advanced/css/editor_content.css +58 -0
  66. data/public/javascripts/tiny_mce/themes/advanced/css/editor_popup.css +331 -0
  67. data/public/javascripts/tiny_mce/themes/advanced/css/editor_ui.css +97 -0
  68. data/public/javascripts/tiny_mce/themes/advanced/docs/en/about.htm +31 -0
  69. data/public/javascripts/tiny_mce/themes/advanced/docs/en/common_buttons.htm +162 -0
  70. data/public/javascripts/tiny_mce/themes/advanced/docs/en/create_accessible_content.htm +45 -0
  71. data/public/javascripts/tiny_mce/themes/advanced/docs/en/images/insert_anchor_window.gif +0 -0
  72. data/public/javascripts/tiny_mce/themes/advanced/docs/en/images/insert_image_window.gif +0 -0
  73. data/public/javascripts/tiny_mce/themes/advanced/docs/en/images/insert_link_window.gif +0 -0
  74. data/public/javascripts/tiny_mce/themes/advanced/docs/en/images/insert_table_window.gif +0 -0
  75. data/public/javascripts/tiny_mce/themes/advanced/docs/en/index.htm +27 -0
  76. data/public/javascripts/tiny_mce/themes/advanced/docs/en/insert_anchor_button.htm +32 -0
  77. data/public/javascripts/tiny_mce/themes/advanced/docs/en/insert_image_button.htm +65 -0
  78. data/public/javascripts/tiny_mce/themes/advanced/docs/en/insert_link_button.htm +33 -0
  79. data/public/javascripts/tiny_mce/themes/advanced/docs/en/insert_table_button.htm +71 -0
  80. data/public/javascripts/tiny_mce/themes/advanced/docs/en/style.css +28 -0
  81. data/public/javascripts/tiny_mce/themes/advanced/editor_template.js +1 -0
  82. data/public/javascripts/tiny_mce/themes/advanced/editor_template_src.js +1534 -0
  83. data/public/javascripts/tiny_mce/themes/advanced/image.htm +100 -0
  84. data/public/javascripts/tiny_mce/themes/advanced/images/anchor.gif +0 -0
  85. data/public/javascripts/tiny_mce/themes/advanced/images/anchor_symbol.gif +0 -0
  86. data/public/javascripts/tiny_mce/themes/advanced/images/backcolor.gif +0 -0
  87. data/public/javascripts/tiny_mce/themes/advanced/images/bold.gif +0 -0
  88. data/public/javascripts/tiny_mce/themes/advanced/images/bold_de_se.gif +0 -0
  89. data/public/javascripts/tiny_mce/themes/advanced/images/bold_es.gif +0 -0
  90. data/public/javascripts/tiny_mce/themes/advanced/images/bold_fr.gif +0 -0
  91. data/public/javascripts/tiny_mce/themes/advanced/images/bold_ru.gif +0 -0
  92. data/public/javascripts/tiny_mce/themes/advanced/images/bold_tw.gif +0 -0
  93. data/public/javascripts/tiny_mce/themes/advanced/images/browse.gif +0 -0
  94. data/public/javascripts/tiny_mce/themes/advanced/images/bullist.gif +0 -0
  95. data/public/javascripts/tiny_mce/themes/advanced/images/button_menu.gif +0 -0
  96. data/public/javascripts/tiny_mce/themes/advanced/images/buttons.gif +0 -0
  97. data/public/javascripts/tiny_mce/themes/advanced/images/cancel_button_bg.gif +0 -0
  98. data/public/javascripts/tiny_mce/themes/advanced/images/charmap.gif +0 -0
  99. data/public/javascripts/tiny_mce/themes/advanced/images/cleanup.gif +0 -0
  100. data/public/javascripts/tiny_mce/themes/advanced/images/close.gif +0 -0
  101. data/public/javascripts/tiny_mce/themes/advanced/images/code.gif +0 -0
  102. data/public/javascripts/tiny_mce/themes/advanced/images/color.gif +0 -0
  103. data/public/javascripts/tiny_mce/themes/advanced/images/copy.gif +0 -0
  104. data/public/javascripts/tiny_mce/themes/advanced/images/custom_1.gif +0 -0
  105. data/public/javascripts/tiny_mce/themes/advanced/images/cut.gif +0 -0
  106. data/public/javascripts/tiny_mce/themes/advanced/images/forecolor.gif +0 -0
  107. data/public/javascripts/tiny_mce/themes/advanced/images/help.gif +0 -0
  108. data/public/javascripts/tiny_mce/themes/advanced/images/hr.gif +0 -0
  109. data/public/javascripts/tiny_mce/themes/advanced/images/image.gif +0 -0
  110. data/public/javascripts/tiny_mce/themes/advanced/images/indent.gif +0 -0
  111. data/public/javascripts/tiny_mce/themes/advanced/images/insert_button_bg.gif +0 -0
  112. data/public/javascripts/tiny_mce/themes/advanced/images/italic.gif +0 -0
  113. data/public/javascripts/tiny_mce/themes/advanced/images/italic_de_se.gif +0 -0
  114. data/public/javascripts/tiny_mce/themes/advanced/images/italic_es.gif +0 -0
  115. data/public/javascripts/tiny_mce/themes/advanced/images/italic_ru.gif +0 -0
  116. data/public/javascripts/tiny_mce/themes/advanced/images/italic_tw.gif +0 -0
  117. data/public/javascripts/tiny_mce/themes/advanced/images/justifycenter.gif +0 -0
  118. data/public/javascripts/tiny_mce/themes/advanced/images/justifyfull.gif +0 -0
  119. data/public/javascripts/tiny_mce/themes/advanced/images/justifyleft.gif +0 -0
  120. data/public/javascripts/tiny_mce/themes/advanced/images/justifyright.gif +0 -0
  121. data/public/javascripts/tiny_mce/themes/advanced/images/link.gif +0 -0
  122. data/public/javascripts/tiny_mce/themes/advanced/images/menu_check.gif +0 -0
  123. data/public/javascripts/tiny_mce/themes/advanced/images/newdocument.gif +0 -0
  124. data/public/javascripts/tiny_mce/themes/advanced/images/numlist.gif +0 -0
  125. data/public/javascripts/tiny_mce/themes/advanced/images/opacity.png +0 -0
  126. data/public/javascripts/tiny_mce/themes/advanced/images/outdent.gif +0 -0
  127. data/public/javascripts/tiny_mce/themes/advanced/images/paste.gif +0 -0
  128. data/public/javascripts/tiny_mce/themes/advanced/images/redo.gif +0 -0
  129. data/public/javascripts/tiny_mce/themes/advanced/images/removeformat.gif +0 -0
  130. data/public/javascripts/tiny_mce/themes/advanced/images/separator.gif +0 -0
  131. data/public/javascripts/tiny_mce/themes/advanced/images/spacer.gif +0 -0
  132. data/public/javascripts/tiny_mce/themes/advanced/images/statusbar_resize.gif +0 -0
  133. data/public/javascripts/tiny_mce/themes/advanced/images/strikethrough.gif +0 -0
  134. data/public/javascripts/tiny_mce/themes/advanced/images/sub.gif +0 -0
  135. data/public/javascripts/tiny_mce/themes/advanced/images/sup.gif +0 -0
  136. data/public/javascripts/tiny_mce/themes/advanced/images/underline.gif +0 -0
  137. data/public/javascripts/tiny_mce/themes/advanced/images/underline_es.gif +0 -0
  138. data/public/javascripts/tiny_mce/themes/advanced/images/underline_fr.gif +0 -0
  139. data/public/javascripts/tiny_mce/themes/advanced/images/underline_ru.gif +0 -0
  140. data/public/javascripts/tiny_mce/themes/advanced/images/underline_tw.gif +0 -0
  141. data/public/javascripts/tiny_mce/themes/advanced/images/undo.gif +0 -0
  142. data/public/javascripts/tiny_mce/themes/advanced/images/unlink.gif +0 -0
  143. data/public/javascripts/tiny_mce/themes/advanced/images/visualaid.gif +0 -0
  144. data/public/javascripts/tiny_mce/themes/advanced/images/xp/tab_bg.gif +0 -0
  145. data/public/javascripts/tiny_mce/themes/advanced/images/xp/tab_end.gif +0 -0
  146. data/public/javascripts/tiny_mce/themes/advanced/images/xp/tab_sel_bg.gif +0 -0
  147. data/public/javascripts/tiny_mce/themes/advanced/images/xp/tab_sel_end.gif +0 -0
  148. data/public/javascripts/tiny_mce/themes/advanced/images/xp/tabs_bg.gif +0 -0
  149. data/public/javascripts/tiny_mce/themes/advanced/jscripts/about.js +75 -0
  150. data/public/javascripts/tiny_mce/themes/advanced/jscripts/anchor.js +74 -0
  151. data/public/javascripts/tiny_mce/themes/advanced/jscripts/charmap.js +326 -0
  152. data/public/javascripts/tiny_mce/themes/advanced/jscripts/color_picker.js +108 -0
  153. data/public/javascripts/tiny_mce/themes/advanced/jscripts/image.js +81 -0
  154. data/public/javascripts/tiny_mce/themes/advanced/jscripts/link.js +70 -0
  155. data/public/javascripts/tiny_mce/themes/advanced/jscripts/source_editor.js +60 -0
  156. data/public/javascripts/tiny_mce/themes/advanced/langs/en.js +82 -0
  157. data/public/javascripts/tiny_mce/themes/advanced/link.htm +100 -0
  158. data/public/javascripts/tiny_mce/themes/advanced/source_editor.htm +32 -0
  159. data/public/javascripts/tiny_mce/tiny_mce.js +1 -0
  160. data/public/javascripts/tiny_mce/tiny_mce_popup.js +288 -0
  161. data/public/javascripts/tiny_mce/tiny_mce_src.js +7284 -0
  162. data/public/javascripts/tiny_mce/utils/editable_selects.js +61 -0
  163. data/public/javascripts/tiny_mce/utils/form_utils.js +210 -0
  164. data/public/javascripts/tiny_mce/utils/mclayer.js +210 -0
  165. data/public/javascripts/tiny_mce/utils/mctabs.js +74 -0
  166. data/public/javascripts/tiny_mce/utils/validate.js +219 -0
  167. data/public/stylesheets/administration.css +5 -1
  168. data/public/stylesheets/minimal.css +1 -0
  169. data/test/functional/admin/categories_controller_test.rb +2 -2
  170. data/test/functional/xml_controller_test.rb +72 -40
  171. data/test/test_helper.rb +1 -17
  172. data/test/unit/article_test.rb +1 -1
  173. data/test/unit/trigger_test.rb +1 -1
  174. data/themes/scribbish/views/articles/_comment.rhtml +13 -17
  175. data/themes/scribbish/views/articles/_comment_form.rhtml +7 -5
  176. data/themes/scribbish/views/articles/_comment_list.rhtml +7 -0
  177. data/themes/scribbish/views/articles/read.rhtml +1 -1
  178. data/vendor/plugins/aimpresence_sidebar/views/content.rhtml +1 -1
  179. data/vendor/plugins/archives_sidebar/views/content.rhtml +1 -1
  180. data/vendor/plugins/audioscrobbler_sidebar/MAINTAINERS +26 -0
  181. data/vendor/plugins/audioscrobbler_sidebar/MIT-LICENSE +21 -0
  182. data/vendor/plugins/audioscrobbler_sidebar/README +27 -0
  183. data/vendor/plugins/backpack_sidebar/MAINTAINERS +26 -0
  184. data/vendor/plugins/backpack_sidebar/MIT-LICENSE +21 -0
  185. data/vendor/plugins/backpack_sidebar/README +27 -0
  186. data/vendor/plugins/category_sidebar/views/content.rhtml +1 -1
  187. data/vendor/plugins/sitealizer/CHANGELOG +6 -0
  188. data/vendor/plugins/sitealizer/LICENSE +22 -0
  189. data/vendor/plugins/sitealizer/README +82 -0
  190. data/vendor/plugins/sitealizer/Rakefile +22 -0
  191. data/vendor/plugins/sitealizer/init.rb +24 -0
  192. data/vendor/plugins/sitealizer/install.rb +22 -0
  193. data/vendor/plugins/sitealizer/lib/app/assets/images/bar.gif +0 -0
  194. data/vendor/plugins/sitealizer/lib/app/assets/images/uv.png +0 -0
  195. data/vendor/plugins/sitealizer/lib/app/assets/images/vh.png +0 -0
  196. data/vendor/plugins/sitealizer/lib/app/controllers/sitealizer_controller.rb +118 -0
  197. data/vendor/plugins/sitealizer/lib/app/models/site_tracker.rb +145 -0
  198. data/vendor/plugins/sitealizer/lib/app/views/layouts/sitealizer.rhtml +66 -0
  199. data/vendor/plugins/sitealizer/lib/app/views/sitealizer/_browsers.rhtml +23 -0
  200. data/vendor/plugins/sitealizer/lib/app/views/sitealizer/_daily_stats.rhtml +67 -0
  201. data/vendor/plugins/sitealizer/lib/app/views/sitealizer/_hits_summary.rhtml +0 -0
  202. data/vendor/plugins/sitealizer/lib/app/views/sitealizer/_hosts.rhtml +21 -0
  203. data/vendor/plugins/sitealizer/lib/app/views/sitealizer/_keywords.rhtml +19 -0
  204. data/vendor/plugins/sitealizer/lib/app/views/sitealizer/_languages.rhtml +21 -0
  205. data/vendor/plugins/sitealizer/lib/app/views/sitealizer/_main_frame.rhtml +84 -0
  206. data/vendor/plugins/sitealizer/lib/app/views/sitealizer/_monthly_hits.rhtml +67 -0
  207. data/vendor/plugins/sitealizer/lib/app/views/sitealizer/_page_urls.rhtml +20 -0
  208. data/vendor/plugins/sitealizer/lib/app/views/sitealizer/_platforms.rhtml +21 -0
  209. data/vendor/plugins/sitealizer/lib/app/views/sitealizer/_referers.rhtml +22 -0
  210. data/vendor/plugins/sitealizer/lib/app/views/sitealizer/_robots.rhtml +19 -0
  211. data/vendor/plugins/sitealizer/lib/app/views/sitealizer/_search_engines.rhtml +19 -0
  212. data/vendor/plugins/sitealizer/lib/app/views/sitealizer/hourly_stats.rhtml +39 -0
  213. data/vendor/plugins/sitealizer/lib/app/views/sitealizer/index.rhtml +8 -0
  214. data/vendor/plugins/sitealizer/lib/app/views/sitealizer/login.rhtml +20 -0
  215. data/vendor/plugins/sitealizer/lib/app/views/sitealizer/menu.rhtml +74 -0
  216. data/vendor/plugins/sitealizer/lib/app/views/sitealizer/referrer_stats.rhtml +20 -0
  217. data/vendor/plugins/sitealizer/lib/app/views/sitealizer/search_stats.rhtml +25 -0
  218. data/vendor/plugins/sitealizer/lib/app/views/sitealizer/summary.rhtml +22 -0
  219. data/vendor/plugins/sitealizer/lib/app/views/sitealizer/visitor_info.rhtml +30 -0
  220. data/vendor/plugins/sitealizer/lib/config.yml +18 -0
  221. data/vendor/plugins/sitealizer/lib/sitealizer/parser.rb +347 -0
  222. data/vendor/plugins/sitealizer/lib/sitealizer.rb +78 -0
  223. data/vendor/plugins/sitealizer/lib/tasks/sitealizer.rake +36 -0
  224. data/vendor/plugins/sitealizer/test/fixtures/sitealizer.yml +89 -0
  225. data/vendor/plugins/sitealizer/test/sitealizer_controller_test.rb +208 -0
  226. data/vendor/plugins/sitealizer/test/sitealizer_parser_test.rb +169 -0
  227. data/vendor/plugins/sitealizer/test/test_helper.rb +7 -0
  228. data/vendor/plugins/tada_sidebar/MAINTAINERS +26 -0
  229. data/vendor/plugins/tada_sidebar/MIT-LICENSE +21 -0
  230. data/vendor/plugins/tada_sidebar/README +27 -0
  231. data/vendor/plugins/tag_sidebar/views/content.rhtml +1 -1
  232. data/vendor/plugins/tiny_mce/README +10 -0
  233. data/vendor/plugins/tiny_mce/Rakefile +22 -0
  234. data/vendor/plugins/tiny_mce/TODO +2 -0
  235. data/vendor/plugins/tiny_mce/changelog +1017 -0
  236. data/vendor/plugins/tiny_mce/init.rb +3 -0
  237. data/vendor/plugins/tiny_mce/install.rb +1 -0
  238. data/vendor/plugins/tiny_mce/lib/tiny_mce.rb +36 -0
  239. data/vendor/plugins/tiny_mce/lib/tiny_mce_helper.rb +48 -0
  240. data/vendor/plugins/tiny_mce/tasks/tiny_mce.rake +40 -0
  241. data/vendor/plugins/tiny_mce/test/helper_testcase.rb +38 -0
  242. data/vendor/plugins/tiny_mce/test/tiny_mce_helper_test.rb +67 -0
  243. data/vendor/plugins/tiny_mce/test/tiny_mce_test.rb +85 -0
  244. data/vendor/plugins/tiny_mce/tiny_mce_options.yml +121 -0
  245. data/vendor/plugins/xbox_sidebar/MAINTAINERS +26 -0
  246. data/vendor/plugins/xbox_sidebar/MIT-LICENSE +21 -0
  247. data/vendor/plugins/xbox_sidebar/README +27 -0
  248. data/vendor/plugins/xml_sidebar/lib/xml_sidebar.rb +1 -1
  249. data/vendor/plugins/xml_sidebar/views/content.rhtml +4 -4
  250. metadata +220 -4
  251. data/TODO-4.1 +0 -16
data/Rakefile CHANGED
@@ -7,4 +7,4 @@ require 'rake'
7
7
  require 'rake/testtask'
8
8
  require 'rake/rdoctask'
9
9
 
10
- require 'tasks/rails'
10
+ require 'tasks/rails'
data/TODO-4.2 ADDED
@@ -0,0 +1,14 @@
1
+ Short Term To-Do for 4.2
2
+ ------------------------
3
+
4
+ – Fix bugs
5
+ – Finish admin ergonomic revamping
6
+ – Change admin theme
7
+ – Change default theme for something more modern
8
+ – Convert submited patches as plugins (see on the trac)
9
+ – Add users contributed translations (ES, JP, BR...)
10
+
11
+ If I have the time :
12
+ – Real mutiple users roles
13
+ – Multi blogs
14
+ – Go to the grocery and buy more beer
data/TODO.MULTIUSERS ADDED
@@ -0,0 +1,45 @@
1
+ This documents aims at describing what I plan for Typo to go multiusers
2
+
3
+ A profile :
4
+ has many right
5
+
6
+ A user :
7
+ has one profile
8
+ has many rights
9
+
10
+ When a user is created, he's given a profile. His profile is marked as "clean"
11
+ The administrator can assign specific rights to that user. His profile is marked as "tainted"
12
+ When a profile is modified, changes are made on users who have a "clean" profile.
13
+
14
+ Here are the profiles and rights :
15
+
16
+ Administrator
17
+ - admin the blog
18
+ - create, edit, delete users
19
+ - create, edit, delete roles
20
+ - write, edit, publish, unpublish, delete drafts
21
+ - write, edit, publish, unpublish, delete posts
22
+ - write comments
23
+ - edit / delete his own comments
24
+ - edit / delete other people's comments
25
+ - moderate comments marked as spam
26
+
27
+ Publisher
28
+ - write, edit, publish, unpublish, delete drafts
29
+ - write, edit, publish, unpublish, delete posts
30
+ - write comments
31
+ - edit / delete his own comments
32
+ - moderate comments marked as spam
33
+
34
+ Writer
35
+ - write, edit, publish, unpublish, delete drafts
36
+ - write comments
37
+
38
+ Moderator
39
+ - write comments
40
+ - edit / delete his own comments
41
+ - edit / delete other people's comments
42
+ - moderate comments marked as spam
43
+
44
+ Subscriber
45
+ - write comments
@@ -1,6 +1,24 @@
1
1
  class Admin::BaseController < ApplicationController
2
2
  cattr_accessor :look_for_migrations
3
3
  @@look_for_migrations = true
4
+ if Blog.default && Blog.default.editor == 2
5
+ uses_tiny_mce(
6
+ :options => {
7
+ :theme => 'advanced',
8
+ :theme_advanced_toolbar_location => "top",
9
+ :theme_advanced_toolbar_align => "left",
10
+ :theme_advanced_resizing => true,
11
+ :theme_advanced_resize_horizontal => false,
12
+ :paste_auto_cleanup_on_paste => true,
13
+ :theme_advanced_buttons1 => %w{formatselect bold italic underline strikethrough
14
+ separator justifyleft justifycenter justifyright
15
+ separator bullist numlist forecolor backcolor
16
+ separator link unlink image},
17
+ :theme_advanced_buttons2 => [],
18
+ :theme_advanced_buttons3 => [],
19
+ :plugins => %w{contextmenu paste}},
20
+ :only => [:new, :edit])
21
+ end
4
22
 
5
23
  layout 'administration'
6
24
  before_filter :login_required, :except => [ :login, :signup ]
@@ -1,4 +1,7 @@
1
1
  class Admin::GeneralController < Admin::BaseController
2
+ # Deprecation warning for plugins removal
3
+ before_filter :deprecation_warning
4
+
2
5
  def index
3
6
  if this_blog.base_url.blank?
4
7
  this_blog.base_url = blog_base_url
@@ -38,5 +41,16 @@ class Admin::GeneralController < Admin::BaseController
38
41
  end
39
42
  end
40
43
 
44
+ # Deprecation warning for plugins removal
45
+ def deprecation_warning
46
+ if this_blog.deprecation_warning == 1
47
+ Blog.transaction do
48
+ this_blog.deprecation_warning = 0
49
+ this_blog.save
50
+ end
51
+ flash[:notice] = "Deprecation warning: please, notice that most plugins are going to be removed from the main engine in the next version. <a href='http://blog.typosphere.org/articles/2007/04/15/the-futur-of-typo-sidebar-plugins'>Read more on the official Typo blog</a>"
52
+ end
53
+ end
54
+
41
55
  private
42
56
  end
@@ -2,7 +2,8 @@
2
2
  # Likewise will all the methods added be available for all controllers.
3
3
  class ApplicationController < ActionController::Base
4
4
  include LoginSystem
5
- before_filter :reset_local_cache, :fire_triggers
5
+ include Sitealizer
6
+ before_filter :use_sitealizer, :reset_local_cache, :fire_triggers
6
7
  after_filter :reset_local_cache
7
8
 
8
9
 
@@ -89,33 +89,30 @@ class ArticlesController < ContentController
89
89
  end
90
90
 
91
91
  if request.post?
92
- begin
93
- @article = this_blog.published_articles.find(params[:id])
94
- params[:comment].merge!({:ip => request.remote_ip,
95
- :published => true,
96
- :user => session[:user],
97
- :user_agent => request.env['HTTP_USER_AGENT'],
98
- :referrer => request.env['HTTP_REFERER'],
99
- :permalink => @article.permalink_url})
100
- @comment = @article.comments.build(params[:comment])
101
- @comment.author ||= 'Anonymous'
102
- @comment.save!
103
- add_to_cookies(:author, @comment.author)
104
- add_to_cookies(:url, @comment.url)
105
-
106
- set_headers
107
- render :partial => "comment", :object => @comment
108
- rescue ActiveRecord::RecordInvalid
109
- STDERR.puts @comment.errors.inspect
110
- render_error(@comment)
111
- end
92
+ @article = this_blog.published_articles.find(params[:id])
93
+ params[:comment].merge!({:ip => request.remote_ip,
94
+ :published => true,
95
+ :user => session[:user],
96
+ :user_agent => request.env['HTTP_USER_AGENT'],
97
+ :referrer => request.env['HTTP_REFERER'],
98
+ :permalink => @article.permalink_url})
99
+ @comment = @article.comments.build(params[:comment])
100
+ @comment.author ||= 'Anonymous'
101
+ @comment.save
102
+ add_to_cookies(:author, @comment.author)
103
+ add_to_cookies(:url, @comment.url)
104
+
105
+ set_headers
106
+ render :partial => "comment", :object => @comment
112
107
  end
113
108
  end
114
109
 
115
110
  # Receive trackbacks linked to articles
116
111
  def trackback
117
112
  @error_message = catch(:error) do
118
- if params[:__mode] == "rss"
113
+ if this_blog.global_pings_disable
114
+ throw :error, "Trackback not saved"
115
+ elsif params[:__mode] == "rss"
119
116
  # Part of the trackback spec... will implement later
120
117
  # XXX. Should this throw an error?
121
118
  elsif !(params.has_key?(:url) && params.has_key?(:id))
@@ -29,7 +29,7 @@ module Admin::BaseHelper
29
29
  unless session[:user]
30
30
  link_to "log in", :controller => "/accounts", :action=>"login"
31
31
  else
32
- link_to "log out", :controller => "/accounts", :action=>"logout"
32
+ link_to _("log out"), :controller => "/accounts", :action=>"logout"
33
33
  end
34
34
  end
35
35
 
@@ -42,7 +42,7 @@ module Admin::BaseHelper
42
42
  end
43
43
 
44
44
  def cancel(url = {:action => 'list'})
45
- link_to "Cancel", url
45
+ link_to _("Cancel"), url
46
46
  end
47
47
 
48
48
  def save(val = "Store")
@@ -54,7 +54,7 @@ module Admin::BaseHelper
54
54
  end
55
55
 
56
56
  def link_to_show(record)
57
- link_to image_tag('go.png'), :action => 'show', :id => record.id
57
+ link_to image_tag('show.png'), :action => 'show', :id => record.id
58
58
  end
59
59
 
60
60
  def link_to_edit(record)
@@ -88,7 +88,7 @@ module Admin::BaseHelper
88
88
  end
89
89
 
90
90
  def task_overview
91
- task('Back to overview', 'list')
91
+ task(_('Back to overview'), 'list')
92
92
  end
93
93
 
94
94
  def task_new(title)
@@ -3,10 +3,10 @@ module Admin::FeedbackHelper
3
3
  link_to truncate(article.title, 60), :controller => '/admin/content', :action => 'edit', :id => article.id
4
4
  end
5
5
 
6
- def task_showmod(title)
6
+ def task_showmod(title, action)
7
7
  content_tag :li,
8
- link_to(title, :published => (title =~ /spam/ ? 'f' : ''),
9
- :confirmed => (title =~ /unconfirmed/ ? 'f' : ''),
8
+ link_to(title, :published => (action =~ /spam/ ? 'f' : ''),
9
+ :confirmed => (action =~ /unconfirmed/ ? 'f' : ''),
10
10
  :search => params[:search])
11
11
  end
12
12
  end
@@ -46,12 +46,8 @@ module ApplicationHelper
46
46
  end
47
47
 
48
48
  def js_distance_of_time_in_words_to_now(date)
49
- if date
50
- time = date.utc.strftime("%a, %d %b %Y %H:%M:%S GMT")
51
- else
52
- time = Time.now
53
- end
54
- "<span class=\"typo_date\" title=\"#{time}\">#{time}</span>"
49
+ time = date.utc.strftime("%a, %d %b %Y %H:%M:%S GMT")
50
+ "<span class=\"typo_date\" title=\"#{time}\">#{time}</span>"
55
51
  end
56
52
 
57
53
  def meta_tag(name, value)
@@ -1,6 +1,6 @@
1
1
  module SidebarHelper
2
- def render_sidebars
3
- this_blog.sidebars.inject('') do |acc, sb|
2
+ def render_sidebars(*sidebars)
3
+ (sidebars.blank? ? this_blog.sidebars : sidebars).inject('') do |acc, sb|
4
4
  @sidebar = sb
5
5
  sb.parse_request(contents, params)
6
6
  controller.response.lifetime = sb.lifetime if sb.lifetime
data/app/models/blog.rb CHANGED
@@ -78,11 +78,15 @@ class Blog < CachedModel
78
78
  setting :ping_urls, :string, "http://rpc.technorati.com/rpc/ping\nhttp://ping.blo.gs/\nhttp://rpc.weblogs.com/RPC2"
79
79
  setting :send_outbound_pings, :boolean, true
80
80
  setting :email_from, :string, 'typo@example.com'
81
+ setting :editor, :integer, 1
81
82
 
82
83
  # Jabber config
83
84
  setting :jabber_address, :string, ''
84
85
  setting :jabber_password, :string, ''
85
86
 
87
+ #deprecation warning for plugins removal
88
+ setting :deprecation_warning, :integer, 1
89
+
86
90
  def initialize(*args)
87
91
  super
88
92
  # Yes, this is weird - PDC
@@ -109,7 +113,11 @@ class Blog < CachedModel
109
113
  settings[:blog_id] = self.id
110
114
  article_id = settings[:id]
111
115
  settings.delete(:id)
112
- trackback = published_articles.find(article_id).trackbacks.create!(settings)
116
+ article = published_articles.find(article_id)
117
+ unless article.allow_pings?
118
+ throw :error, "Trackback not saved"
119
+ end
120
+ article.trackbacks.create!(settings)
113
121
  end
114
122
 
115
123
  # Check that all required blog settings have a value.
@@ -5,15 +5,15 @@ class Category < ActiveRecord::Base
5
5
  :order => "published_at DESC, created_at DESC"
6
6
 
7
7
  def self.find_all_with_article_counters(maxcount=nil)
8
- self.find_by_sql([%{
9
- SELECT categories.id, categories.name, categories.permalink, categories.position, COUNT(articles.id) AS article_counter
10
- FROM #{Category.table_name} categories
11
- LEFT OUTER JOIN #{Category.table_name_prefix}categorizations#{Category.table_name_suffix} articles_categories
12
- ON articles_categories.category_id = categories.id
13
- LEFT OUTER JOIN #{Article.table_name} articles
14
- ON (articles_categories.article_id = articles.id AND articles.published = ?)
15
- GROUP BY categories.id, categories.name, categories.position, categories.permalink
16
- ORDER BY position
8
+ self.find_by_sql([%{
9
+ SELECT categories.id, categories.name, categories.permalink, categories.position, COUNT(articles.id) AS article_counter
10
+ FROM #{Category.table_name} categories
11
+ LEFT OUTER JOIN #{Category.table_name_prefix}categorizations#{Category.table_name_suffix} articles_categories
12
+ ON articles_categories.category_id = categories.id
13
+ LEFT OUTER JOIN #{Article.table_name} articles
14
+ ON (articles_categories.article_id = articles.id AND articles.published = ?)
15
+ GROUP BY categories.id, categories.name, categories.position, categories.permalink
16
+ ORDER BY position
17
17
  }, true]).each {|item| item.article_counter = item.article_counter.to_i }
18
18
  end
19
19
 
@@ -21,7 +21,7 @@ class Comment < Feedback
21
21
  def notify_user_via_jabber(user)
22
22
  if user.notify_via_jabber?
23
23
  JabberNotify.send_message(user, "New comment", "A new comment was posted to '#{article.title}' on #{blog.blog_name} by #{author}:
24
- #{body} (#{controller.url_for :anchor => 'comments', :action => 'read', :id => article.id})", self.body_html)
24
+ #{body}", self.html(:body))
25
25
  end
26
26
  end
27
27
 
@@ -29,9 +29,9 @@ module ContentState
29
29
  'Ham?'
30
30
  end
31
31
 
32
- def send_notifications(content, controller)
32
+ def send_notifications(content)
33
33
  content.interested_users.each do |user|
34
- content.send_notification_to_user(controller, user)
34
+ content.send_notification_to_user(user)
35
35
  end
36
36
  end
37
37
  end
@@ -1,3 +1,5 @@
1
+ require 'tempfile'
2
+
1
3
  class Resource < ActiveRecord::Base
2
4
  validates_uniqueness_of :filename
3
5
  after_destroy :delete_filename_on_disk
@@ -1,14 +1,18 @@
1
1
  <table>
2
2
  <tr>
3
- <th><%= _("Category title")%></th>
4
- <th><%= _("Articles")%></th>
5
- <th><%= _("Delete")%></th>
3
+ <th><%= _("Category title") %></th>
4
+ <th><%= _("Articles") %></th>
5
+ <th><%= _("Status") %></th>
6
+ <th colspan="3"><%= _("Action") %></th>
6
7
  </tr>
7
8
  <% for category in @categories -%>
8
9
  <tr <%= alternate_class -%> id="category_<%= category.id -%>">
9
- <td><%= image_tag 'checked.gif' %> <%= link_to category.name, :action => 'show', :id => category.id %></td>
10
- <td><%= link_to pluralize(category.articles.size, 'article'), :action => 'show', :id => category.id %></td>
11
- <td class="operation"><%= link_to_destroy category %></td>
10
+ <td><%= category.name %></td>
11
+ <td><%= pluralize(category.articles.size, 'article') %></td>
12
+ <td class="operation"><%= image_tag 'checked.png' %></td>
13
+ <td class="operation"><%= link_to_show category %></td>
14
+ <td class="operation"><%= link_to_edit category %></td>
15
+ <td class="operation"><%= link_to_destroy category %></td>
12
16
  </tr>
13
17
  <% end -%>
14
18
  </table>
@@ -1,5 +1,7 @@
1
1
  <% @page_heading = _('Categories') %>
2
-
2
+ <% content_for('tasks') do %>
3
+ <%= task_overview %>
4
+ <% end %>
3
5
  <% form_tag :action=>"edit", :id => @category.id do %>
4
6
  <h3><% _("Editing category")%></h3>
5
7
  <div class="form">
@@ -2,15 +2,15 @@
2
2
  <!--[form:comment]-->
3
3
  <p>
4
4
  <label for="comment_author"><%= _("Author")%>:</label><br/>
5
- <%= text_field 'comment', 'author' %>
5
+ <%= text_field 'comment', 'author', "value" => (session[:user][:name] if controller.action_name == "new") %>
6
6
  </p>
7
7
  <p>
8
8
  <label for="comment_url"><%= _("Url") %>:</label><br/>
9
- <%= text_field 'comment', 'url' %>
9
+ <%= text_field 'comment', 'url', "value" => (this_blog.base_url if controller.action_name == "new") %>
10
10
  </p>
11
11
  <p>
12
12
  <label for="comment_email"><%= _("Email")%>:</label><br/>
13
- <%= text_field 'comment', 'email' %>
13
+ <%= text_field 'comment', 'email', "value" => (session[:user][:email] if controller.action_name == "new") %>
14
14
  </p>
15
15
  <p>
16
16
  <label for="comment_body"><%= _("Body")%>:</label><br/>
@@ -13,16 +13,18 @@
13
13
  <th><%= _("Body")%></th>
14
14
  <th><%= _("IP")%></th>
15
15
  <th><%= _("Posted date")%></th>
16
- <th><%= _("Edit")%></th>
17
- <th><%= _("Delete")%></th>
16
+ <th><%= _("Status")%></th>
17
+ <th colspan="3"><%= _("Action") %></th>
18
18
  </tr>
19
19
  <% for comment in @comments -%>
20
20
  <tr>
21
- <td class="field"><%= image_tag 'checked.gif' %> <%=link_to_unless comment.url.blank?, h(comment.author), comment.url %></td>
21
+ <td class="field"> <%=link_to_unless comment.url.blank?, h(comment.author), comment.url %></td>
22
22
  <td class="field"><%=h comment.email %></td>
23
- <td class="field"><%=link_to truncate((comment.body).strip_html), :action => 'show', :id => comment.id %> <%= link_to_permalink comment,image_tag('go.png') %></td>
23
+ <td class="field"><%= link_to_permalink comment, truncate((comment.body).strip_html) %></td>
24
24
  <td class="field"><%=h comment.ip %></td>
25
- <td class="field"><%=h distance_of_time_in_words_to_now(comment.created_at) %></td>
25
+ <td class="field"><%=comment.created_at.strftime("%d/%m/%Y at %H:%M") %></td>
26
+ <td class="operation"><%= image_tag 'checked.png' %></td>
27
+ <td class="operation"><%= link_to_show comment %></td>
26
28
  <td class="operation"><%= link_to_edit comment %></td>
27
29
  <td class="operation"><%= link_to_destroy comment %></td>
28
30
  </tr>
@@ -1,5 +1,7 @@
1
1
  <% @page_heading = _("Comments for") + " #{ link_to h(@article.title), :controller => '/admin/content', :action => 'show', :id => @article }" %>
2
-
2
+ <% content_for('tasks') do %>
3
+ <%= task_overview %>
4
+ <% end %>
3
5
  <h3><%= _("Creating comment")%></h3>
4
6
 
5
7
  <% form_tag :action=>"new" do %>
@@ -1,5 +1,7 @@
1
1
  <% @page_heading = _("Comments for") + " #{ link_to h(@article.title), :controller => '/admin/content', :action => 'show', :id => @article }" %>
2
-
2
+ <% content_for('tasks') do %>
3
+ <%= task_overview %>
4
+ <% end %>
3
5
  <div class="form">
4
6
  <label><%= _("Author")%>:</label> <span class="static"><%=h @comment.author %></span><br/>
5
7
  <label><%= _("URL")%>:</label> <span class="static"><%=h @comment.url %></span><br/>
@@ -10,7 +10,7 @@
10
10
  <% for article in @articles %>
11
11
  <tr <%= alternate_class %>>
12
12
  <td> <%= link_to_permalink article, h(article.title) %></td>
13
- <td><%= article.published_at.strftime("%d/%m/%Y at %H:%M")%></td>
13
+ <td><%= article.published_at.strftime("%d/%m/%Y at %H:%M") %></td>
14
14
  <td><%= link_to _(pluralize(article.comments.size, 'comment')), :controller => '/admin/comments', :article_id => article, :action => 'list' %></td>
15
15
  <td><%= link_to _(pluralize(article.trackbacks.size, 'trackback')), :controller => '/admin/trackbacks', :article_id => article, :action => 'list' %></td>
16
16
  <td class="operation"><%= (article.published?) ? image_tag('checked.png', :alt => "online", :title => _("Online")) : image_tag('cancel.png', :alt => "offline", :title => _("Offline")) %></td>
@@ -3,7 +3,7 @@
3
3
  <fieldset class="set admin" style="display: block">
4
4
  <legend><%=_("Article Body")%></legend>
5
5
  <iframe id="preview" class="post" style="display: none;"></iframe>
6
- <div style="width: 48%; float: left;">
6
+ <div <%='style="width: 48%; float: left;"' if this_blog.editor == 1 %>>
7
7
  <ul>
8
8
  <li>
9
9
  <label for="article_title" class="block">Title:</label>
@@ -14,10 +14,12 @@
14
14
  <%= markup_help_popup @article.text_filter, image_tag('help.png', :alt => "markup help", :title => "Markup Help") %>
15
15
  <%= text_area 'article', 'body', :rows => 25, :style => 'width: 100%;' %>
16
16
  </li>
17
+ <li>
18
+ <%= link_to_function _("Toggle Extended Content") + " (+/-)",update_page { |page| page.visual_effect(:toggle_blind, "extended", :duration => 0.5) } %>
19
+ </li>
17
20
  <li id="extended"<%- if @article.extended.blank? -%> style="display:none;"<%- end -%>>
18
21
  <label for="article_extended"><%= _("Extended Content")%>:</label>
19
22
  <%= text_area 'article', 'extended', :rows => 30, :style => 'width: 100%;' %>
20
- <%= link_to_function "Toggle Extended Content (+/-)",update_page { |page| page.visual_effect(:toggle_blind, "extended", :duration => 0.5) } %>
21
23
  </li>
22
24
  <li>
23
25
  <label for="categories" class="block"><%= _("Categories")%>:</label>
@@ -1,5 +1,6 @@
1
1
  <% content_for('tasks') do %>
2
2
  <%= tab _("Write a Page"), :controller=>"pages", :action=>"new" %>
3
+ <li><%= task_overview %></li>
3
4
  <% end %>
4
5
 
5
6
  <% @page_heading = _('Write an Article') %>
@@ -1,10 +1,10 @@
1
1
  <div class="post">
2
- <h2><%= @article[:title] %></h2>
3
- <p class="auth">
4
- <%_("Posted by")%>
5
- <%= author_link(@article) %>
6
- <%= js_distance_of_time_in_words_to_now @article[:published_at] %>
7
- </p>
2
+ <h2><%= @article[:title] %></h2>
3
+ <p class="auth">
4
+ <%_("Posted by")%>
5
+ <%= author_link(@article) %>
6
+ <%= js_distance_of_time_in_words_to_now(@article[:published_at] || Time.now) %>
7
+ </p>
8
8
 
9
- <%= @article.html %>
10
- </div>
9
+ <%= @article.html %>
10
+ </div>
@@ -12,6 +12,8 @@
12
12
  </td>
13
13
  <td class="field"><%=h truncate(item.body,80)%></td>
14
14
  <td class="field"><%=h item.ip %></td>
15
- <td class="field"><%=h distance_of_time_in_words_to_now(item.created_at) %> ago</td>
15
+ <td class="field"><%=item.created_at.strftime("%d/%m/%Y at %H:%M")%></td>
16
+ <td class="operation"><%= link_to image_tag('show.png', :alt => "show", :title => "Show content"), :controller => 'comments', :article_id => item.article_id, :action => 'show', :id => item.id %></td>
17
+ <td class="operation"><%= link_to image_tag('edit.png', :alt => "edit", :title => "Edit content"), :controller => 'comments', :article_id => item.article_id, :action => 'edit', :id => item.id %></td>
16
18
  <td class="operation"><%= link_to image_tag('delete.png'), {:action => 'delete', :id => item.id, :search => params[:search], :page => params[:page] }, :confirm => "Are you sure?", :method => :post %></td>
17
19
  </tr>
@@ -1,9 +1,9 @@
1
1
  <% @page_heading = _("Comments and Trackbacks for") + " #{ this_blog.settings['blog_name'] }" %>
2
2
 
3
3
  <% content_for('tasks') do %>
4
- <%= task_showmod _('Limit to spam') %>
5
- <%= task_showmod _("Limit to unconfirmed") %>
6
- <%= task_showmod _('Limit to unconfirmed spam') %>
4
+ <%= task_showmod(_('Limit to spam'), "Limit to spam") %>
5
+ <%= task_showmod(_("Limit to unconfirmed"), "Limit to unconfirmed") %>
6
+ <%= task_showmod(_("Limit to unconfirmed spam"), "Limit to unconfirmed spam") %>
7
7
  <%= tab _("Blacklist"), :controller=>"blacklist", :action=>"index"%>
8
8
  <% end %>
9
9
 
@@ -34,7 +34,7 @@
34
34
  <th><%= _("Body")%></th>
35
35
  <th><%= _("IP")%></th>
36
36
  <th><%= _("Posted date")%></th>
37
- <th><%= _("Delete") %></th>
37
+ <th colspan="3"><%= _("Action") %></th>
38
38
  </tr>
39
39
  <%= render :partial => 'item', :collection => @feedback %>
40
40
  </table>
@@ -81,8 +81,21 @@
81
81
 
82
82
  <fieldset id="write" class="set">
83
83
  <legend><%= _("Write")%></legend>
84
-
85
84
  <ul>
85
+ <li>
86
+ <label class="float"><%= _("Editor")%>:</label>
87
+ <input type="radio" name="setting[editor]" value="2" id="editor_2" <%= 'checked="checked"' if this_blog.editor == 2 %>/>
88
+ <label for="editor_2"><%= _("Use visual rich editor")%></label>
89
+ <span class="float">
90
+ <input type="radio" name="setting[editor]" value="1" id="editor_1" <%= 'checked="checked"' if this_blog.editor == 1 %>/>
91
+ <label for="editor_1"><%= _("Use simple editor with live preview (default)")%></label>
92
+ </span>
93
+ <span class="float">
94
+ <input type="radio" name="setting[editor]" value="0" id="editor_0" <%= 'checked="checked"' if this_blog.editor == 0 %>/>
95
+ <label for="editor_0"><%= _("Use simple editor without live preview")%></label>
96
+ </span>
97
+ </li>
98
+
86
99
  <li>
87
100
  <label class="float" for="text_filter"><%= _("Article filter")%>:</label>
88
101
  <select name="setting[text_filter]" id="text_filter">
@@ -3,7 +3,7 @@
3
3
  <fieldset class="set admin" style="display: block">
4
4
  <legend><%= _("Page Body")%></legend>
5
5
  <iframe id="preview" class="post" style="display: none;"></iframe>
6
- <div style="width: 48%; float: left;">
6
+ <div <%='style="width: 48%; float: left;"' if this_blog.editor == 1 %>>
7
7
  <ul>
8
8
  <li>
9
9
  <label for="page_title" class="block"><%= _("Title")%>:</label>
@@ -1,4 +1,4 @@
1
- <% @page_heading = <%= _("Pages") %>
1
+ <% @page_heading = _("Pages") %>
2
2
 
3
3
  <% content_for('tasks') do %>
4
4
  <%= task_show _("Show this page"), @page.id %>
@@ -1,5 +1,6 @@
1
1
  <% content_for('tasks') do %>
2
2
  <%= tab _("Write an Article"), :controller=>"content", :action=>"new" %>
3
+ <li><%= task_overview %></li>
3
4
  <% end %>
4
5
 
5
6
  <% @page_heading = _('Write a Page') %>
@@ -6,7 +6,7 @@
6
6
  <%= render :partial => "form" %>
7
7
 
8
8
  <div id="operations" class="tasks">
9
- <p class="r"><%= save(_("Save")) %> or <%= cancel %></p>
9
+ <p class="r"><%= save(_("Save")) %> <%= _("or") %> <%= cancel %></p>
10
10
  </div>
11
11
 
12
12
  <% end %>
@@ -14,4 +14,4 @@
14
14
  <%= observe_form "#{form_type}_form",
15
15
  :frequency => 2,
16
16
  :complete => "$('preview').src = request.responseText; Element.show('preview');",
17
- :url => { :action => "preview" } %>
17
+ :url => { :action => "preview" } if this_blog.editor == 1 %>