publify_core 9.0.0 → 9.2.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 (360) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +92 -37
  3. data/app/assets/javascripts/bootstrap-sprockets.js +8 -0
  4. data/app/assets/javascripts/bootstrap/affix.js +164 -0
  5. data/app/assets/javascripts/bootstrap/alert.js +95 -0
  6. data/app/assets/javascripts/bootstrap/button.js +125 -0
  7. data/app/assets/javascripts/bootstrap/collapse.js +212 -0
  8. data/app/assets/javascripts/bootstrap/dropdown.js +165 -0
  9. data/app/assets/javascripts/bootstrap/modal.js +358 -0
  10. data/app/assets/javascripts/bootstrap/tab.js +155 -0
  11. data/app/assets/javascripts/bootstrap/transition.js +59 -0
  12. data/app/assets/javascripts/lightbox.js +4 -4
  13. data/app/assets/javascripts/publify_admin.js +1 -35
  14. data/app/assets/stylesheets/_bootstrap-compass.scss +9 -0
  15. data/app/assets/stylesheets/_bootstrap-mincer.scss +19 -0
  16. data/app/assets/stylesheets/_bootstrap-sprockets.scss +9 -0
  17. data/app/assets/stylesheets/_bootstrap.scss +42 -0
  18. data/app/assets/stylesheets/administration_structure.css.scss +1 -45
  19. data/app/assets/stylesheets/bootstrap/_alerts.scss +73 -0
  20. data/app/assets/stylesheets/bootstrap/_button-groups.scss +242 -0
  21. data/app/assets/stylesheets/bootstrap/_buttons.scss +168 -0
  22. data/app/assets/stylesheets/bootstrap/_close.scss +37 -0
  23. data/app/assets/stylesheets/bootstrap/_code.scss +69 -0
  24. data/app/assets/stylesheets/bootstrap/_component-animations.scss +38 -0
  25. data/app/assets/stylesheets/bootstrap/_dropdowns.scss +213 -0
  26. data/app/assets/stylesheets/bootstrap/_forms.scss +586 -0
  27. data/app/assets/stylesheets/bootstrap/_grid.scss +94 -0
  28. data/app/assets/stylesheets/bootstrap/_labels.scss +66 -0
  29. data/app/assets/stylesheets/bootstrap/_media.scss +66 -0
  30. data/app/assets/stylesheets/bootstrap/_mixins.scss +37 -0
  31. data/app/assets/stylesheets/bootstrap/_modals.scss +150 -0
  32. data/app/assets/stylesheets/bootstrap/_navbar.scss +479 -0
  33. data/app/assets/stylesheets/bootstrap/_navs.scss +242 -0
  34. data/app/assets/stylesheets/bootstrap/_normalize.scss +427 -0
  35. data/app/assets/stylesheets/bootstrap/_pagination.scss +86 -0
  36. data/app/assets/stylesheets/bootstrap/_panels.scss +222 -0
  37. data/app/assets/stylesheets/bootstrap/_print.scss +99 -0
  38. data/app/assets/stylesheets/bootstrap/_scaffolding.scss +160 -0
  39. data/app/assets/stylesheets/bootstrap/_tables.scss +234 -0
  40. data/app/assets/stylesheets/bootstrap/_theme.scss +224 -0
  41. data/app/assets/stylesheets/bootstrap/_type.scss +296 -0
  42. data/app/assets/stylesheets/bootstrap/_utilities.scss +55 -0
  43. data/app/assets/stylesheets/bootstrap/_variables.scss +638 -0
  44. data/app/assets/stylesheets/bootstrap/_wells.scss +29 -0
  45. data/app/assets/stylesheets/bootstrap/mixins/_alerts.scss +15 -0
  46. data/app/assets/stylesheets/bootstrap/mixins/_background-variant.scss +12 -0
  47. data/app/assets/stylesheets/bootstrap/mixins/_border-radius.scss +18 -0
  48. data/app/assets/stylesheets/bootstrap/mixins/_buttons.scss +56 -0
  49. data/app/assets/stylesheets/bootstrap/mixins/_center-block.scss +7 -0
  50. data/app/assets/stylesheets/bootstrap/mixins/_clearfix.scss +22 -0
  51. data/app/assets/stylesheets/bootstrap/mixins/_forms.scss +82 -0
  52. data/app/assets/stylesheets/bootstrap/mixins/_gradients.scss +56 -0
  53. data/app/assets/stylesheets/bootstrap/mixins/_grid-framework.scss +81 -0
  54. data/app/assets/stylesheets/bootstrap/mixins/_grid.scss +122 -0
  55. data/app/assets/stylesheets/bootstrap/mixins/_hide-text.scss +21 -0
  56. data/app/assets/stylesheets/bootstrap/mixins/_image.scss +28 -0
  57. data/app/assets/stylesheets/bootstrap/mixins/_labels.scss +12 -0
  58. data/app/assets/stylesheets/bootstrap/mixins/_nav-divider.scss +10 -0
  59. data/app/assets/stylesheets/bootstrap/mixins/_nav-vertical-align.scss +9 -0
  60. data/app/assets/stylesheets/bootstrap/mixins/_opacity.scss +7 -0
  61. data/app/assets/stylesheets/bootstrap/mixins/_pagination.scss +24 -0
  62. data/app/assets/stylesheets/bootstrap/mixins/_panels.scss +20 -0
  63. data/app/assets/stylesheets/bootstrap/mixins/_reset-filter.scss +8 -0
  64. data/app/assets/stylesheets/bootstrap/mixins/_resize.scss +6 -0
  65. data/app/assets/stylesheets/bootstrap/mixins/_responsive-visibility.scss +17 -0
  66. data/app/assets/stylesheets/bootstrap/mixins/_size.scss +10 -0
  67. data/app/assets/stylesheets/bootstrap/mixins/_tab-focus.scss +9 -0
  68. data/app/assets/stylesheets/bootstrap/mixins/_table-row.scss +28 -0
  69. data/app/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss +12 -0
  70. data/app/assets/stylesheets/bootstrap/mixins/_text-overflow.scss +8 -0
  71. data/app/assets/stylesheets/bootstrap/mixins/_vendor-prefixes.scss +222 -0
  72. data/app/assets/stylesheets/lightbox.css +3 -3
  73. data/app/assets/stylesheets/publify_admin.css.scss +0 -1
  74. data/app/controllers/accounts_controller.rb +2 -0
  75. data/app/controllers/admin/base_controller.rb +8 -16
  76. data/app/controllers/admin/content_controller.rb +38 -36
  77. data/app/controllers/admin/dashboard_controller.rb +16 -65
  78. data/app/controllers/admin/feedback_controller.rb +45 -37
  79. data/app/controllers/admin/notes_controller.rb +16 -10
  80. data/app/controllers/admin/pages_controller.rb +19 -29
  81. data/app/controllers/admin/post_types_controller.rb +7 -5
  82. data/app/controllers/admin/profiles_controller.rb +15 -5
  83. data/app/controllers/admin/redirects_controller.rb +9 -5
  84. data/app/controllers/admin/resources_controller.rb +7 -4
  85. data/app/controllers/admin/seo_controller.rb +12 -10
  86. data/app/controllers/admin/settings_controller.rb +7 -5
  87. data/app/controllers/admin/sidebar_controller.rb +6 -5
  88. data/app/controllers/admin/tags_controller.rb +6 -3
  89. data/app/controllers/admin/themes_controller.rb +10 -7
  90. data/app/controllers/admin/users_controller.rb +10 -7
  91. data/app/controllers/articles_controller.rb +49 -33
  92. data/app/controllers/authors_controller.rb +6 -3
  93. data/app/controllers/base_controller.rb +9 -11
  94. data/app/controllers/comments_controller.rb +13 -13
  95. data/app/controllers/content_controller.rb +4 -2
  96. data/app/controllers/feedback_controller.rb +4 -2
  97. data/app/controllers/notes_controller.rb +5 -3
  98. data/app/controllers/setup_controller.rb +15 -12
  99. data/app/controllers/tags_controller.rb +6 -4
  100. data/app/controllers/text_controller.rb +2 -4
  101. data/app/controllers/textfilter_controller.rb +2 -0
  102. data/app/controllers/theme_controller.rb +18 -13
  103. data/app/controllers/xml_controller.rb +2 -0
  104. data/app/helpers/admin/base_helper.rb +28 -29
  105. data/app/helpers/admin/feedback_helper.rb +34 -24
  106. data/app/helpers/articles_helper.rb +4 -2
  107. data/app/helpers/authors_helper.rb +7 -16
  108. data/app/helpers/base_helper.rb +56 -52
  109. data/app/helpers/blog_helper.rb +4 -2
  110. data/app/helpers/xml_helper.rb +3 -1
  111. data/app/jobs/application_job.rb +2 -0
  112. data/app/mailers/notification_mailer.rb +5 -3
  113. data/app/models/ability.rb +25 -23
  114. data/app/models/archives_sidebar.rb +14 -11
  115. data/app/models/article.rb +42 -42
  116. data/app/models/article/factory.rb +14 -6
  117. data/app/models/blog.rb +86 -75
  118. data/app/models/comment.rb +10 -11
  119. data/app/models/config_manager.rb +4 -2
  120. data/app/models/content.rb +37 -50
  121. data/app/models/content_base.rb +10 -4
  122. data/app/models/feedback.rb +21 -17
  123. data/app/models/meta_sidebar.rb +4 -3
  124. data/app/models/note.rb +26 -25
  125. data/app/models/page.rb +9 -8
  126. data/app/models/page_sidebar.rb +4 -2
  127. data/app/models/ping.rb +3 -1
  128. data/app/models/post_type.rb +3 -3
  129. data/app/models/redirect.rb +13 -7
  130. data/app/models/redirection.rb +3 -1
  131. data/app/models/resource.rb +5 -3
  132. data/app/models/search_sidebar.rb +4 -2
  133. data/app/models/sidebar.rb +11 -6
  134. data/app/models/static_sidebar.rb +14 -13
  135. data/app/models/tag.rb +15 -11
  136. data/app/models/tag_sidebar.rb +6 -3
  137. data/app/models/text_filter.rb +85 -11
  138. data/app/models/trackback.rb +7 -11
  139. data/app/models/trigger.rb +7 -4
  140. data/app/models/user.rb +44 -43
  141. data/app/services/title_builder.rb +52 -45
  142. data/app/uploaders/resource_uploader.rb +5 -3
  143. data/app/views/accounts/confirm.html.erb +3 -3
  144. data/app/views/admin/content/_article_list.html.erb +23 -8
  145. data/app/views/admin/content/_form.html.erb +71 -47
  146. data/app/views/admin/content/autosave.js.erb +2 -2
  147. data/app/views/admin/content/edit.html.erb +1 -1
  148. data/app/views/admin/content/index.html.erb +25 -15
  149. data/app/views/admin/content/new.html.erb +2 -2
  150. data/app/views/admin/dashboard/_comment.html.erb +5 -5
  151. data/app/views/admin/dashboard/_comments.html.erb +2 -2
  152. data/app/views/admin/dashboard/_drafts.html.erb +5 -5
  153. data/app/views/admin/dashboard/_overview.html.erb +7 -9
  154. data/app/views/admin/dashboard/_welcome.html.erb +11 -11
  155. data/app/views/admin/dashboard/index.html.erb +12 -7
  156. data/app/views/admin/feedback/_button.html.erb +6 -6
  157. data/app/views/admin/feedback/_feedback.html.erb +3 -3
  158. data/app/views/admin/feedback/_ham.html.erb +27 -9
  159. data/app/views/admin/feedback/_spam.html.erb +26 -16
  160. data/app/views/admin/feedback/article.html.erb +20 -21
  161. data/app/views/admin/feedback/edit.html.erb +14 -15
  162. data/app/views/admin/feedback/{ham.js → ham.js.erb} +0 -0
  163. data/app/views/admin/feedback/index.html.erb +25 -23
  164. data/app/views/admin/feedback/{spam.js → spam.js.erb} +0 -0
  165. data/app/views/admin/migrations/show.html.erb +10 -11
  166. data/app/views/admin/notes/_form.html.erb +13 -13
  167. data/app/views/admin/notes/_list.html.erb +19 -8
  168. data/app/views/admin/notes/_note.html.erb +12 -7
  169. data/app/views/admin/notes/edit.html.erb +6 -1
  170. data/app/views/admin/notes/index.html.erb +5 -1
  171. data/app/views/admin/notes/show.html.erb +2 -2
  172. data/app/views/admin/pages/_form.html.erb +86 -77
  173. data/app/views/admin/pages/_pages.html.erb +11 -4
  174. data/app/views/admin/pages/edit.html.erb +3 -1
  175. data/app/views/admin/pages/index.html.erb +10 -6
  176. data/app/views/admin/pages/new.html.erb +3 -1
  177. data/app/views/admin/post_types/_index_and_form.html.erb +15 -16
  178. data/app/views/admin/post_types/edit.html.erb +1 -1
  179. data/app/views/admin/post_types/index.html.erb +1 -1
  180. data/app/views/admin/profiles/index.html.erb +2 -3
  181. data/app/views/admin/redirects/_index_and_form.html.erb +10 -11
  182. data/app/views/admin/redirects/edit.html.erb +1 -1
  183. data/app/views/admin/redirects/index.html.erb +1 -1
  184. data/app/views/admin/resources/index.html.erb +19 -16
  185. data/app/views/admin/seo/_general.html.erb +23 -47
  186. data/app/views/admin/seo/_permalinks.html.erb +16 -16
  187. data/app/views/admin/seo/_titles.html.erb +63 -64
  188. data/app/views/admin/seo/show.html.erb +14 -19
  189. data/app/views/admin/settings/display.html.erb +22 -25
  190. data/app/views/admin/settings/feedback.html.erb +31 -32
  191. data/app/views/admin/settings/index.html.erb +23 -24
  192. data/app/views/admin/settings/write.html.erb +21 -22
  193. data/app/views/admin/shared/_edit.html.erb +3 -3
  194. data/app/views/admin/shared/_menu.html.erb +26 -26
  195. data/app/views/admin/shared/_twitter_alert.html.erb +1 -1
  196. data/app/views/admin/sidebar/_config.html.erb +5 -5
  197. data/app/views/admin/sidebar/_target_sidebar.html.erb +4 -4
  198. data/app/views/admin/sidebar/index.html.erb +7 -7
  199. data/app/views/admin/tags/_index_and_form.html.erb +11 -12
  200. data/app/views/admin/tags/edit.html.erb +1 -1
  201. data/app/views/admin/tags/index.html.erb +1 -1
  202. data/app/views/admin/themes/index.html.erb +5 -6
  203. data/app/views/admin/users/_form.html.erb +34 -34
  204. data/app/views/admin/users/edit.html.erb +2 -2
  205. data/app/views/admin/users/index.html.erb +10 -12
  206. data/app/views/admin/users/new.html.erb +2 -2
  207. data/app/views/archives_sidebar/_content.html.erb +2 -2
  208. data/app/views/articles/_archives_article.html.erb +3 -3
  209. data/app/views/articles/_article.html.erb +7 -9
  210. data/app/views/articles/_article_author.html.erb +4 -0
  211. data/app/views/articles/_article_content.html.erb +2 -2
  212. data/app/views/articles/_article_excerpt.html.erb +2 -2
  213. data/app/views/articles/_article_links.html.erb +1 -1
  214. data/app/views/articles/_comment_errors.html.erb +1 -1
  215. data/app/views/articles/_comment_form.html.erb +12 -12
  216. data/app/views/articles/_comment_preview.html.erb +3 -3
  217. data/app/views/articles/_password_form.html.erb +4 -4
  218. data/app/views/articles/_trackback.html.erb +2 -2
  219. data/app/views/articles/archives.html.erb +1 -1
  220. data/app/views/articles/feedback_atom_feed.atom.builder +3 -1
  221. data/app/views/articles/feedback_rss_feed.rss.builder +9 -8
  222. data/app/views/articles/index_atom_feed.atom.builder +5 -3
  223. data/app/views/articles/index_rss_feed.rss.builder +10 -9
  224. data/app/views/articles/live_search.html.erb +3 -3
  225. data/app/views/articles/read.html.erb +16 -8
  226. data/app/views/articles/search.html.erb +2 -2
  227. data/app/views/articles/trackback.xml.builder +3 -1
  228. data/app/views/articles/view_page.html.erb +2 -2
  229. data/app/views/authors/show.html.erb +9 -9
  230. data/app/views/authors/show_atom_feed.atom.builder +4 -2
  231. data/app/views/authors/show_rss_feed.rss.builder +10 -9
  232. data/app/views/comments/_comment.html.erb +3 -3
  233. data/app/views/devise/mailer/reset_password_instructions.html.erb +7 -9
  234. data/app/views/devise/passwords/edit.html.erb +4 -4
  235. data/app/views/devise/passwords/new.html.erb +1 -1
  236. data/app/views/devise/registrations/new.html.erb +5 -5
  237. data/app/views/devise/sessions/new.html.erb +3 -3
  238. data/app/views/errors/404.html.erb +2 -2
  239. data/app/views/feedback/index.atom.builder +3 -1
  240. data/app/views/feedback/index.rss.builder +9 -8
  241. data/app/views/layouts/accounts.html.erb +26 -26
  242. data/app/views/layouts/administration.html.erb +31 -31
  243. data/app/views/layouts/default.html.erb +4 -3
  244. data/app/views/layouts/editor.html.erb +5 -19
  245. data/app/views/meta_sidebar/_content.html.erb +2 -2
  246. data/app/views/notes/_note.html.erb +1 -1
  247. data/app/views/notes/index.html.erb +1 -1
  248. data/app/views/notes/show_in_reply.html.erb +1 -1
  249. data/app/views/notification_mailer/_mail_footer.html.erb +3 -3
  250. data/app/views/notification_mailer/article.html.erb +2 -2
  251. data/app/views/notification_mailer/comment.html.erb +5 -5
  252. data/app/views/notification_mailer/notif_user.html.erb +1 -1
  253. data/app/views/page_sidebar/_content.html.erb +1 -1
  254. data/app/views/search_sidebar/_content.html.erb +2 -2
  255. data/app/views/settings/install.html.erb +2 -2
  256. data/app/views/setup/index.html.erb +7 -7
  257. data/app/views/shared/_atom_header.atom.builder +4 -4
  258. data/app/views/shared/_atom_item_article.atom.builder +19 -29
  259. data/app/views/shared/_atom_item_comment.atom.builder +4 -2
  260. data/app/views/shared/_atom_item_trackback.atom.builder +4 -2
  261. data/app/views/shared/_google_analytics.html.erb +8 -0
  262. data/app/views/shared/_page_header.html.erb +9 -12
  263. data/app/views/shared/_rss_item_article.rss.builder +9 -7
  264. data/app/views/shared/_rss_item_comment.rss.builder +3 -1
  265. data/app/views/shared/_rss_item_trackback.rss.builder +3 -1
  266. data/app/views/sidebar/display_plugins.html.erb +1 -1
  267. data/app/views/tag_sidebar/_content.html.erb +1 -1
  268. data/app/views/tags/index.html.erb +1 -1
  269. data/app/views/xml/_googlesitemap_item_article.googlesitemap.builder +2 -0
  270. data/app/views/xml/_googlesitemap_item_category.googlesitemap.builder +2 -0
  271. data/app/views/xml/_googlesitemap_item_page.googlesitemap.builder +2 -0
  272. data/app/views/xml/_googlesitemap_item_tag.googlesitemap.builder +2 -0
  273. data/app/views/xml/sitemap.googlesitemap.builder +4 -2
  274. data/config/i18n-tasks.yml +0 -5
  275. data/config/initializers/devise.rb +10 -4
  276. data/config/initializers/mime_types.rb +3 -1
  277. data/config/locales/da.yml +134 -73
  278. data/config/locales/de.yml +142 -77
  279. data/config/locales/en.yml +128 -68
  280. data/config/locales/es-MX.yml +135 -71
  281. data/config/locales/fr.yml +167 -88
  282. data/config/locales/he.yml +128 -72
  283. data/config/locales/it.yml +136 -74
  284. data/config/locales/ja.yml +110 -66
  285. data/config/locales/lt.yml +153 -76
  286. data/config/locales/nb-NO.yml +123 -67
  287. data/config/locales/nl.yml +140 -77
  288. data/config/locales/pl.yml +329 -240
  289. data/config/locales/pt-BR.yml +137 -72
  290. data/config/locales/ro.yml +148 -72
  291. data/config/locales/ru.yml +161 -71
  292. data/config/locales/zh-CN.yml +106 -61
  293. data/config/locales/zh-TW.yml +109 -63
  294. data/config/routes.rb +68 -63
  295. data/db/migrate/113_initial_schema.rb +191 -191
  296. data/db/migrate/114_fixes_buggy_articles_and_notes.rb +10 -7
  297. data/db/migrate/115_drops_categories_for_tags.rb +5 -4
  298. data/db/migrate/20150207131657_add_missing_indexes.rb +2 -0
  299. data/db/migrate/20150807134129_simplify_redirect_relations.rb +5 -0
  300. data/db/migrate/20150808052637_add_blog_ids.rb +9 -3
  301. data/db/migrate/20150808191127_add_blog_id_to_redirects.rb +2 -0
  302. data/db/migrate/20150810094754_add_blog_id_to_tags.rb +2 -0
  303. data/db/migrate/20160108111120_add_devise_to_users.rb +4 -2
  304. data/db/migrate/20160108184201_move_last_connection_to_last_sign_in_at.rb +2 -0
  305. data/db/migrate/20160110094906_remove_profiles_rights.rb +2 -0
  306. data/db/migrate/20160605103918_replace_profile_id_with_string.rb +2 -0
  307. data/db/migrate/20160605154632_remove_profiles.rb +10 -5
  308. data/db/migrate/20160701061851_demand_blog_id_on_contents.rb +2 -0
  309. data/db/migrate/20160701062604_add_blog_id_to_resources.rb +2 -0
  310. data/db/migrate/20170528093024_move_resources_to_content.rb +2 -0
  311. data/db/migrate/20170528094923_move_tags_to_content.rb +2 -0
  312. data/db/migrate/20170528201606_remove_separate_published_flag.rb +2 -0
  313. data/db/migrate/20170605071626_remove_extra_state_columns_from_feedback.rb +2 -0
  314. data/db/migrate/20170702105201_remove_published_at_from_feedback.rb +2 -0
  315. data/db/migrate/20190208151235_add_text_filter_name_fields.rb +9 -0
  316. data/db/migrate/20190208152646_move_text_filter_to_name.rb +97 -0
  317. data/db/migrate/20190209155717_remove_text_filter_ids.rb +19 -0
  318. data/db/migrate/20190209160610_remove_text_filters.rb +17 -0
  319. data/db/migrate/20200413140440_add_unique_indexes.rb +10 -0
  320. data/db/seeds.rb +8 -20
  321. data/lib/email_notify.rb +3 -1
  322. data/lib/format.rb +4 -12
  323. data/lib/publify_core.rb +36 -35
  324. data/lib/publify_core/engine.rb +11 -4
  325. data/lib/publify_core/lang.rb +5 -1
  326. data/lib/publify_core/testing_support/dns_mock.rb +15 -0
  327. data/lib/publify_core/testing_support/factories.rb +240 -0
  328. data/lib/publify_core/testing_support/feed_assertions.rb +48 -0
  329. data/lib/publify_core/testing_support/fixtures/exploit.svg +4 -0
  330. data/lib/publify_core/testing_support/fixtures/fakepng.png +1 -0
  331. data/lib/publify_core/testing_support/fixtures/otherfile.txt +1 -0
  332. data/lib/publify_core/testing_support/fixtures/testfile.png +0 -0
  333. data/lib/publify_core/testing_support/fixtures/testfile.txt +1 -0
  334. data/lib/publify_core/testing_support/upload_fixtures.rb +15 -0
  335. data/lib/publify_core/version.rb +3 -1
  336. data/lib/publify_guid.rb +3 -1
  337. data/lib/publify_plugins.rb +10 -5
  338. data/lib/publify_textfilter_markdown.rb +38 -25
  339. data/lib/publify_textfilter_none.rb +5 -3
  340. data/lib/publify_textfilter_smartypants.rb +5 -3
  341. data/lib/publify_textfilter_textile.rb +7 -4
  342. data/lib/publify_textfilter_twitterfilter.rb +13 -7
  343. data/lib/publify_time.rb +4 -0
  344. data/lib/sidebar_field.rb +15 -13
  345. data/lib/sidebar_registry.rb +5 -3
  346. data/lib/spam_protection.rb +19 -17
  347. data/lib/tasks/i18n.rake +9 -0
  348. data/lib/tasks/manifest.rake +30 -0
  349. data/lib/tasks/publify_core_tasks.rake +2 -0
  350. data/lib/text_filter_plugin.rb +30 -29
  351. data/lib/theme.rb +5 -5
  352. data/lib/transforms.rb +21 -20
  353. data/themes/plain/javascripts/theme.js +0 -0
  354. metadata +247 -109
  355. data/app/assets/javascripts/widearea.js +0 -486
  356. data/app/assets/stylesheets/widearea.css +0 -133
  357. data/app/controllers/admin/textfilters_controller.rb +0 -6
  358. data/app/views/admin/dashboard/_inbound.html.erb +0 -31
  359. data/app/views/admin/notes/_header.html.erb +0 -6
  360. data/app/views/articles/_protected_article_content.html.erb +0 -6
@@ -44,14 +44,14 @@
44
44
  opacity: 1;
45
45
  }
46
46
 
47
- .ekko-lightbox .glyphicon-chevron-left {
47
+ .ekko-lightbox .chevron-left {
48
48
  left: 0;
49
49
  float: left;
50
50
  padding-left: 15px;
51
51
  text-align: left;
52
52
  }
53
53
 
54
- .ekko-lightbox .glyphicon-chevron-right {
54
+ .ekko-lightbox .chevron-right {
55
55
  right: 0;
56
56
  float: right;
57
57
  padding-right: 15px;
@@ -60,4 +60,4 @@
60
60
 
61
61
  .ekko-lightbox .modal-footer {
62
62
  text-align: left;
63
- }
63
+ }
@@ -1,7 +1,6 @@
1
1
  /*
2
2
  *= require administration_structure
3
3
  *= require jquery-ui
4
- *= require widearea
5
4
  *= require tagmanager
6
5
  *= require sidebar_admin
7
6
  *= require datetimepicker
@@ -1,2 +1,4 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class AccountsController < BaseController
2
4
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Admin::BaseController < BaseController
2
4
  rescue_from CanCan::AccessDenied do |exception|
3
5
  redirect_to admin_dashboard_path, alert: exception.message
@@ -5,31 +7,21 @@ class Admin::BaseController < BaseController
5
7
 
6
8
  cattr_accessor :look_for_migrations
7
9
  @@look_for_migrations = true
8
- layout 'administration'
10
+ layout "administration"
9
11
 
10
12
  before_action :login_required, except: [:login, :signup]
11
13
 
12
14
  private
13
15
 
14
- def update_settings_with!(settings_param)
15
- Blog.transaction do
16
- settings_param.each { |k, v| this_blog.send("#{k}=", v) }
17
- if this_blog.save
18
- flash[:success] = I18n.t('admin.settings.update.success')
19
- else
20
- flash[:error] = I18n.t('admin.settings.update.error', messages: this_blog.errors.full_messages.join(', '))
21
- end
22
- end
23
- end
24
-
25
16
  def destroy_a(klass_to_destroy)
26
17
  @record = klass_to_destroy.find(params[:id])
27
18
  if @record.respond_to?(:access_by?) && !@record.access_by?(current_user)
28
- flash[:error] = I18n.t('admin.base.not_allowed')
29
- return(redirect_to action: 'index')
19
+ flash[:error] = I18n.t("admin.base.not_allowed")
20
+ return(redirect_to action: "index")
30
21
  end
31
22
  @record.destroy
32
- flash[:notice] = I18n.t('admin.base.successfully_deleted', name: controller_name.humanize)
33
- redirect_to action: 'index'
23
+ flash[:notice] = I18n.t("admin.base.successfully_deleted",
24
+ name: controller_name.humanize)
25
+ redirect_to action: "index"
34
26
  end
35
27
  end
@@ -1,13 +1,14 @@
1
- require 'base64'
1
+ # frozen_string_literal: true
2
+
3
+ require "base64"
2
4
 
3
5
  module Admin; end
4
6
 
5
7
  class Admin::ContentController < Admin::BaseController
6
- layout :get_layout
7
-
8
8
  def index
9
- @search = params[:search] ? params[:search] : {}
10
- @articles = this_blog.articles.search_with(@search).page(params[:page]).per(this_blog.admin_display_elements)
9
+ @search = params[:search] || {}
10
+ @articles = this_blog.articles.search_with(@search).page(params[:page]).
11
+ per(this_blog.admin_display_elements)
11
12
 
12
13
  if request.xhr?
13
14
  respond_to do |format|
@@ -21,14 +22,17 @@ class Admin::ContentController < Admin::BaseController
21
22
  def new
22
23
  @article = Article::Factory.new(this_blog, current_user).default
23
24
  load_resources
25
+ render layout: "editor"
24
26
  end
25
27
 
26
28
  def edit
27
29
  return unless access_granted?(params[:id])
30
+
28
31
  @article = Article.find(params[:id])
29
- @article.text_filter ||= current_user.default_text_filter
32
+ @article.text_filter ||= default_text_filter
30
33
  @article.keywords = Tag.collection_to_string @article.tags
31
34
  load_resources
35
+ render layout: "editor"
32
36
  end
33
37
 
34
38
  def create
@@ -38,28 +42,29 @@ class Admin::ContentController < Admin::BaseController
38
42
  update_article_attributes
39
43
 
40
44
  if @article.draft
41
- @article.state = 'draft'
45
+ @article.state = "draft"
42
46
  elsif @article.draft?
43
47
  @article.publish!
44
48
  end
45
49
 
46
50
  if @article.save
47
- flash[:success] = I18n.t('admin.content.create.success')
48
- redirect_to action: 'index'
51
+ flash[:success] = I18n.t("admin.content.create.success")
52
+ redirect_to action: "index"
49
53
  else
50
54
  @article.keywords = Tag.collection_to_string @article.tags
51
55
  load_resources
52
- render 'new'
56
+ render "new", layout: "editor"
53
57
  end
54
58
  end
55
59
 
56
60
  def update
57
61
  return unless access_granted?(params[:id])
62
+
58
63
  id = params[:article][:id] || params[:id]
59
64
  @article = Article.find(id)
60
65
 
61
66
  if params[:article][:draft]
62
- get_fresh_or_existing_draft_for_article
67
+ fetch_fresh_or_existing_draft_for_article
63
68
  else
64
69
  @article = Article.find(@article.parent_id) unless @article.parent_id.nil?
65
70
  end
@@ -67,19 +72,19 @@ class Admin::ContentController < Admin::BaseController
67
72
  update_article_attributes
68
73
 
69
74
  if @article.draft
70
- @article.state = 'draft'
75
+ @article.state = "draft"
71
76
  elsif @article.draft?
72
77
  @article.publish!
73
78
  end
74
79
 
75
80
  if @article.save
76
81
  Article.where(parent_id: @article.id).map(&:destroy) unless @article.draft
77
- flash[:success] = I18n.t('admin.content.update.success')
78
- redirect_to action: 'index'
82
+ flash[:success] = I18n.t("admin.content.update.success")
83
+ redirect_to action: "index"
79
84
  else
80
85
  @article.keywords = Tag.collection_to_string @article.tags
81
86
  load_resources
82
- render 'edit'
87
+ render "edit"
83
88
  end
84
89
  end
85
90
 
@@ -100,23 +105,26 @@ class Admin::ContentController < Admin::BaseController
100
105
  article_factory = Article::Factory.new(this_blog, current_user)
101
106
  @article = article_factory.get_or_build_from(id)
102
107
 
103
- get_fresh_or_existing_draft_for_article
108
+ fetch_fresh_or_existing_draft_for_article
104
109
 
105
110
  @article.attributes = params[:article].permit!
106
111
 
107
112
  @article.author = current_user
108
113
  @article.save_attachments!(params[:attachments])
109
- @article.state = 'draft' unless @article.withdrawn?
114
+ @article.state = "draft" unless @article.withdrawn?
110
115
  @article.text_filter ||= current_user.default_text_filter
111
116
 
112
117
  if @article.title.blank?
113
- lastid = Article.order('id desc').first.id
114
- @article.title = 'Draft article ' + lastid.to_s
118
+ lastid = Article.order("id desc").first.id
119
+ @article.title = "Draft article #{lastid}"
115
120
  end
116
121
 
117
122
  if @article.save
118
- flash[:success] = I18n.t('admin.content.autosave.success')
119
- @must_update_calendar = (params[:article][:published_at] and params[:article][:published_at].to_time.to_i < Time.now.to_time.to_i and @article.parent_id.nil?)
123
+ flash[:success] = I18n.t("admin.content.autosave.success")
124
+ @must_update_calendar =
125
+ (params[:article][:published_at] and
126
+ params[:article][:published_at].to_time.to_i < Time.zone.now.to_time.to_i and
127
+ @article.parent_id.nil?)
120
128
  respond_to do |format|
121
129
  format.js
122
130
  end
@@ -125,7 +133,7 @@ class Admin::ContentController < Admin::BaseController
125
133
 
126
134
  protected
127
135
 
128
- def get_fresh_or_existing_draft_for_article
136
+ def fetch_fresh_or_existing_draft_for_article
129
137
  return unless @article.published? && @article.id
130
138
 
131
139
  parent_id = @article.id
@@ -148,11 +156,11 @@ class Admin::ContentController < Admin::BaseController
148
156
  def access_granted?(article_id)
149
157
  article = Article.find(article_id)
150
158
  if article.access_by? current_user
151
- return true
159
+ true
152
160
  else
153
- flash[:error] = I18n.t('admin.content.access_granted.error')
154
- redirect_to action: 'index'
155
- return false
161
+ flash[:error] = I18n.t("admin.content.access_granted.error")
162
+ redirect_to action: "index"
163
+ false
156
164
  end
157
165
  end
158
166
 
@@ -160,7 +168,7 @@ class Admin::ContentController < Admin::BaseController
160
168
  @article.assign_attributes(update_params)
161
169
  @article.author = current_user
162
170
  @article.save_attachments!(params[:attachments])
163
- @article.text_filter ||= current_user.default_text_filter
171
+ @article.text_filter_name ||= default_text_filter
164
172
  end
165
173
 
166
174
  def update_params
@@ -174,18 +182,12 @@ class Admin::ContentController < Admin::BaseController
174
182
  :extended,
175
183
  :permalink,
176
184
  :published_at,
185
+ :text_filter_name,
177
186
  :title,
178
187
  :keywords)
179
188
  end
180
189
 
181
- def get_layout
182
- case action_name
183
- when 'new', 'edit', 'create'
184
- 'editor'
185
- when 'show', 'autosave'
186
- nil
187
- else
188
- 'administration'
189
- end
190
+ def default_text_filter
191
+ current_user.text_filter || this_blog.text_filter
190
192
  end
191
193
  end
@@ -1,13 +1,12 @@
1
- require 'feedjira'
1
+ # frozen_string_literal: true
2
2
 
3
3
  class Admin::DashboardController < Admin::BaseController
4
- require 'open-uri'
5
- require 'time'
6
- require 'rexml/document'
4
+ require "open-uri"
5
+ require "time"
6
+ require "rexml/document"
7
7
 
8
8
  def index
9
- t = Time.new
10
- today = t.strftime('%Y-%m-%d 00:00')
9
+ today = Time.zone.now.strftime("%Y-%m-%d 00:00")
11
10
 
12
11
  # Since last visit
13
12
  last_sign_in = current_user.last_sign_in_at
@@ -15,68 +14,20 @@ class Admin::DashboardController < Admin::BaseController
15
14
  @newcomments_count = Feedback.created_since(last_sign_in).count
16
15
 
17
16
  # Today
18
- @statposts = Article.published.where('published_at > ?', today).count
19
- @statsdrafts = Article.drafts.where('created_at > ?', today).count
20
- @statspages = Page.where('published_at > ?', today).count
21
- @statuses = Note.where('published_at > ?', today).count
22
- @statuserposts = Article.published.where('published_at > ?', today).where(user_id: current_user.id).count
23
- @statcomments = Comment.where('created_at > ?', today).count
24
- @presumedspam = Comment.presumed_spam.where('created_at > ?', today).count
25
- @confirmed = Comment.ham.where('created_at > ?', today).count
26
- @unconfirmed = Comment.unconfirmed.where('created_at > ?', today).count
17
+ @statposts = Article.published.where("published_at > ?", today).count
18
+ @statsdrafts = Article.drafts.where("created_at > ?", today).count
19
+ @statspages = Page.where("published_at > ?", today).count
20
+ @statuses = Note.where("published_at > ?", today).count
21
+ @statuserposts = Article.published.where("published_at > ?", today).
22
+ where(user_id: current_user.id).count
23
+ @statcomments = Comment.where("created_at > ?", today).count
24
+ @presumedspam = Comment.presumed_spam.where("created_at > ?", today).count
25
+ @confirmed = Comment.ham.where("created_at > ?", today).count
26
+ @unconfirmed = Comment.unconfirmed.where("created_at > ?", today).count
27
27
 
28
28
  @comments = Comment.last_published
29
- @drafts = Article.drafts.where('user_id = ?', current_user.id).limit(5)
29
+ @drafts = Article.drafts.where("user_id = ?", current_user.id).limit(5)
30
30
 
31
31
  @statspam = Comment.spam.count
32
- @inbound_links = inbound_links
33
- publify_version
34
- end
35
-
36
- def publify_version
37
- version = nil
38
- begin
39
- open(PUBLIFY_VERSION_URL) do |http|
40
- publify_version = http.read[0..5]
41
- version = publify_version.split('.')
42
- end
43
- rescue
44
- return
45
- end
46
- if version[0].to_i > TYPO_MAJOR.to_i
47
- flash[:error] = I18n.t('admin.dashboard.publify_version.error')
48
- elsif version[1].to_i > TYPO_SUB.to_i
49
- flash[:warning] = I18n.t('admin.dashboard.publify_version.warning')
50
- elsif version[2].to_i > TYPO_MINOR.to_i
51
- flash[:notice] = I18n.t('admin.dashboard.publify_version.notice')
52
- end
53
- end
54
-
55
- private
56
-
57
- def inbound_links
58
- host = URI.parse(this_blog.base_url).host
59
- return [] if Rails.env.development?
60
- url = "http://www.google.com/search?q=link:#{host}&tbm=blg&output=rss"
61
- fetch_rss(url).reverse.compact
62
- end
63
-
64
- def fetch_rss(url)
65
- open(url) do |http|
66
- return parse_rss(http.read)
67
- end
68
- rescue
69
- []
70
- end
71
-
72
- RssItem = Struct.new(:link, :title, :description, :description_link, :date, :author) do
73
- def to_s
74
- title
75
- end
76
- end
77
-
78
- def parse_rss(body)
79
- doc = Feedjira::Feed.parse(body)
80
- doc.entries
81
32
  end
82
33
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Admin::FeedbackController < Admin::BaseController
2
4
  ONLY_DOMAIN = %w(unapproved presumed_ham presumed_spam ham spam).freeze
3
5
 
@@ -9,7 +11,7 @@ class Admin::FeedbackController < Admin::BaseController
9
11
  scoped_feedback = scoped_feedback.send(@only_param) if @only_param
10
12
  end
11
13
 
12
- params.delete(:page) if params[:page].blank? || params[:page] == '0'
14
+ params.delete(:page) if params[:page].blank? || params[:page] == "0"
13
15
 
14
16
  @feedback = scoped_feedback.paginated(params[:page], this_blog.admin_display_elements)
15
17
  end
@@ -23,11 +25,11 @@ class Admin::FeedbackController < Admin::BaseController
23
25
 
24
26
  begin
25
27
  @record.destroy
26
- flash[:success] = I18n.t('admin.feedback.destroy.success')
28
+ flash[:success] = I18n.t("admin.feedback.destroy.success")
27
29
  rescue ActiveRecord::RecordNotFound
28
- flash[:error] = I18n.t('admin.feedback.destroy.error')
30
+ flash[:error] = I18n.t("admin.feedback.destroy.error")
29
31
  end
30
- redirect_to action: 'article', id: @record.article.id
32
+ redirect_to action: "article", id: @record.article.id
31
33
  end
32
34
 
33
35
  def create
@@ -36,12 +38,13 @@ class Admin::FeedbackController < Admin::BaseController
36
38
  @comment.user_id = current_user.id
37
39
 
38
40
  if request.post? && @comment.save
39
- # We should probably wave a spam filter over this, but for now, just mark it as published.
41
+ # We should probably wave a spam filter over this, but for now, just mark
42
+ # it as published.
40
43
  @comment.mark_as_ham
41
44
  @comment.save!
42
- flash[:success] = I18n.t('admin.feedback.create.success')
45
+ flash[:success] = I18n.t("admin.feedback.create.success")
43
46
  end
44
- redirect_to action: 'article', id: @article.id
47
+ redirect_to action: "article", id: @article.id
45
48
  end
46
49
 
47
50
  def edit
@@ -49,7 +52,7 @@ class Admin::FeedbackController < Admin::BaseController
49
52
  @article = @comment.article
50
53
  unless @article.access_by? current_user
51
54
  redirect_to admin_feedback_index_url
52
- return
55
+ nil
53
56
  end
54
57
  end
55
58
 
@@ -61,35 +64,31 @@ class Admin::FeedbackController < Admin::BaseController
61
64
  end
62
65
  comment.attributes = comment_params
63
66
  if request.post? && comment.save
64
- flash[:success] = I18n.t('admin.feedback.update.success')
65
- redirect_to action: 'article', id: comment.article.id
67
+ flash[:success] = I18n.t("admin.feedback.update.success")
68
+ redirect_to action: "article", id: comment.article.id
66
69
  else
67
- redirect_to action: 'edit', id: comment.id
70
+ redirect_to action: "edit", id: comment.id
68
71
  end
69
72
  end
70
73
 
71
74
  def article
72
75
  @article = this_blog.articles.find(params[:id])
73
- @feedback = @article.comments.ham if params[:ham] && params[:spam].blank?
74
- @feedback = @article.comments.spam if params[:spam] && params[:ham].blank?
75
- @feedback ||= @article.comments
76
+ @feedback = @article.comments
77
+ @feedback = @feedback.ham if params[:ham] && params[:spam].blank?
78
+ @feedback = @feedback.spam if params[:spam] && params[:ham].blank?
76
79
  end
77
80
 
78
- # TODO: Replace with actions that move to a specified state
79
81
  def change_state
80
82
  return unless request.xhr?
81
83
 
82
84
  @feedback = Feedback.find(params[:id])
83
- template = @feedback.change_state!
85
+ new_state = @feedback.change_state!
84
86
 
85
87
  respond_to do |format|
86
- if params[:context] != 'listing'
87
- @comments = Comment.last_published
88
- page.replace_html('commentList', partial: 'admin/dashboard/comment')
89
- elsif template == 'ham'
90
- format.js { render 'ham' }
88
+ if new_state == "ham"
89
+ format.js { render "ham" }
91
90
  else
92
- format.js { render 'spam' }
91
+ format.js { render "spam" }
93
92
  end
94
93
  end
95
94
  end
@@ -99,37 +98,46 @@ class Admin::FeedbackController < Admin::BaseController
99
98
  items = Feedback.find(ids)
100
99
  @unexpired = true
101
100
 
102
- bulkop = (params[:bulkop_top] || {}).empty? ? params[:bulkop_bottom] : params[:bulkop_top]
101
+ bulkop = if (params[:bulkop_top] || {}).empty?
102
+ params[:bulkop_bottom]
103
+ else
104
+ params[:bulkop_top]
105
+ end
103
106
 
104
107
  case bulkop
105
- when 'Delete Checked Items'
108
+ when "Delete Checked Items"
106
109
  count = 0
107
110
  ids.each do |id|
108
111
  count += Feedback.delete(id)
109
112
  end
110
- flash[:success] = I18n.t('admin.feedback.bulkops.success_deleted', count: count)
111
- when 'Mark Checked Items as Ham'
113
+ flash[:success] = I18n.t("admin.feedback.bulkops.success_deleted", count: count)
114
+ when "Mark Checked Items as Ham"
112
115
  update_feedback(items, :mark_as_ham!)
113
- flash[:success] = I18n.t('admin.feedback.bulkops.success_mark_as_ham', count: ids.size)
114
- when 'Mark Checked Items as Spam'
116
+ flash[:success] = I18n.t("admin.feedback.bulkops.success_mark_as_ham",
117
+ count: ids.size)
118
+ when "Mark Checked Items as Spam"
115
119
  update_feedback(items, :mark_as_spam!)
116
- flash[:success] = I18n.t('admin.feedback.bulkops.success_mark_as_spam', count: ids.size)
117
- when 'Confirm Classification of Checked Items'
120
+ flash[:success] = I18n.t("admin.feedback.bulkops.success_mark_as_spam",
121
+ count: ids.size)
122
+ when "Confirm Classification of Checked Items"
118
123
  update_feedback(items, :confirm_classification!)
119
- flash[:success] = I18n.t('admin.feedback.bulkops.success_classification', count: ids.size)
120
- when 'Delete all spam'
124
+ flash[:success] = I18n.t("admin.feedback.bulkops.success_classification",
125
+ count: ids.size)
126
+ when "Delete all spam"
121
127
  if request.post?
122
- Feedback.where('state = ?', 'spam').delete_all
123
- flash[:success] = I18n.t('admin.feedback.bulkops.success_deleted_spam')
128
+ Feedback.where("state = ?", "spam").delete_all
129
+ flash[:success] = I18n.t("admin.feedback.bulkops.success_deleted_spam")
124
130
  end
125
131
  else
126
- flash[:error] = I18n.t('admin.feedback.bulkops.error')
132
+ flash[:error] = I18n.t("admin.feedback.bulkops.error")
127
133
  end
128
134
 
129
135
  if params[:article_id]
130
- redirect_to action: 'article', id: params[:article_id], confirmed: params[:confirmed], published: params[:published]
136
+ redirect_to action: "article", id: params[:article_id], confirmed: params[:confirmed],
137
+ published: params[:published]
131
138
  else
132
- redirect_to action: 'index', page: params[:page], search: params[:search], confirmed: params[:confirmed], published: params[:published]
139
+ redirect_to action: "index", page: params[:page], search: params[:search],
140
+ confirmed: params[:confirmed], published: params[:published]
133
141
  end
134
142
  end
135
143