publify_core 9.1.0 → 9.2.0

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 (357) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +34 -1
  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 -5
  76. data/app/controllers/admin/content_controller.rb +37 -24
  77. data/app/controllers/admin/dashboard_controller.rb +16 -64
  78. data/app/controllers/admin/feedback_controller.rb +45 -38
  79. data/app/controllers/admin/notes_controller.rb +15 -9
  80. data/app/controllers/admin/pages_controller.rb +18 -15
  81. data/app/controllers/admin/post_types_controller.rb +7 -5
  82. data/app/controllers/admin/profiles_controller.rb +4 -2
  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 +14 -10
  86. data/app/controllers/admin/settings_controller.rb +7 -5
  87. data/app/controllers/admin/sidebar_controller.rb +7 -4
  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 +9 -6
  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 -5
  94. data/app/controllers/comments_controller.rb +12 -8
  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 +14 -10
  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 +14 -12
  103. data/app/controllers/xml_controller.rb +2 -0
  104. data/app/helpers/admin/base_helper.rb +28 -28
  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 +6 -3
  108. data/app/helpers/base_helper.rb +50 -34
  109. data/app/helpers/blog_helper.rb +4 -2
  110. data/app/helpers/xml_helper.rb +2 -0
  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 +44 -32
  116. data/app/models/article/factory.rb +14 -6
  117. data/app/models/blog.rb +85 -65
  118. data/app/models/comment.rb +10 -7
  119. data/app/models/config_manager.rb +4 -2
  120. data/app/models/content.rb +34 -40
  121. data/app/models/content_base.rb +9 -3
  122. data/app/models/feedback.rb +19 -16
  123. data/app/models/meta_sidebar.rb +5 -2
  124. data/app/models/note.rb +25 -23
  125. data/app/models/page.rb +8 -6
  126. data/app/models/page_sidebar.rb +4 -2
  127. data/app/models/ping.rb +2 -0
  128. data/app/models/post_type.rb +3 -1
  129. data/app/models/redirect.rb +11 -6
  130. data/app/models/redirection.rb +2 -0
  131. data/app/models/resource.rb +4 -2
  132. data/app/models/search_sidebar.rb +4 -2
  133. data/app/models/sidebar.rb +10 -5
  134. data/app/models/static_sidebar.rb +15 -12
  135. data/app/models/tag.rb +14 -10
  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 +6 -3
  140. data/app/models/user.rb +43 -42
  141. data/app/services/title_builder.rb +56 -45
  142. data/app/uploaders/resource_uploader.rb +7 -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/edit.html.erb +1 -1
  147. data/app/views/admin/content/index.html.erb +25 -15
  148. data/app/views/admin/content/new.html.erb +2 -2
  149. data/app/views/admin/dashboard/_comment.html.erb +5 -5
  150. data/app/views/admin/dashboard/_comments.html.erb +2 -2
  151. data/app/views/admin/dashboard/_drafts.html.erb +5 -5
  152. data/app/views/admin/dashboard/_overview.html.erb +7 -9
  153. data/app/views/admin/dashboard/_welcome.html.erb +11 -11
  154. data/app/views/admin/dashboard/index.html.erb +12 -7
  155. data/app/views/admin/feedback/_button.html.erb +6 -6
  156. data/app/views/admin/feedback/_feedback.html.erb +3 -3
  157. data/app/views/admin/feedback/_ham.html.erb +27 -9
  158. data/app/views/admin/feedback/_spam.html.erb +26 -16
  159. data/app/views/admin/feedback/article.html.erb +20 -21
  160. data/app/views/admin/feedback/edit.html.erb +14 -15
  161. data/app/views/admin/feedback/{ham.js → ham.js.erb} +0 -0
  162. data/app/views/admin/feedback/index.html.erb +25 -23
  163. data/app/views/admin/feedback/{spam.js → spam.js.erb} +0 -0
  164. data/app/views/admin/migrations/show.html.erb +10 -11
  165. data/app/views/admin/notes/_form.html.erb +13 -13
  166. data/app/views/admin/notes/_list.html.erb +19 -8
  167. data/app/views/admin/notes/_note.html.erb +12 -7
  168. data/app/views/admin/notes/edit.html.erb +6 -1
  169. data/app/views/admin/notes/index.html.erb +5 -1
  170. data/app/views/admin/notes/show.html.erb +2 -2
  171. data/app/views/admin/pages/_form.html.erb +86 -77
  172. data/app/views/admin/pages/_pages.html.erb +11 -4
  173. data/app/views/admin/pages/edit.html.erb +3 -1
  174. data/app/views/admin/pages/index.html.erb +10 -6
  175. data/app/views/admin/pages/new.html.erb +3 -1
  176. data/app/views/admin/post_types/_index_and_form.html.erb +15 -16
  177. data/app/views/admin/post_types/edit.html.erb +1 -1
  178. data/app/views/admin/post_types/index.html.erb +1 -1
  179. data/app/views/admin/profiles/index.html.erb +2 -3
  180. data/app/views/admin/redirects/_index_and_form.html.erb +10 -11
  181. data/app/views/admin/redirects/edit.html.erb +1 -1
  182. data/app/views/admin/redirects/index.html.erb +1 -1
  183. data/app/views/admin/resources/index.html.erb +19 -16
  184. data/app/views/admin/seo/_general.html.erb +23 -47
  185. data/app/views/admin/seo/_permalinks.html.erb +14 -14
  186. data/app/views/admin/seo/_titles.html.erb +63 -64
  187. data/app/views/admin/seo/show.html.erb +14 -19
  188. data/app/views/admin/settings/display.html.erb +22 -25
  189. data/app/views/admin/settings/feedback.html.erb +31 -32
  190. data/app/views/admin/settings/index.html.erb +23 -24
  191. data/app/views/admin/settings/write.html.erb +21 -22
  192. data/app/views/admin/shared/_edit.html.erb +3 -3
  193. data/app/views/admin/shared/_menu.html.erb +26 -26
  194. data/app/views/admin/shared/_twitter_alert.html.erb +1 -1
  195. data/app/views/admin/sidebar/_config.html.erb +5 -5
  196. data/app/views/admin/sidebar/_target_sidebar.html.erb +4 -4
  197. data/app/views/admin/sidebar/index.html.erb +7 -7
  198. data/app/views/admin/tags/_index_and_form.html.erb +11 -12
  199. data/app/views/admin/tags/edit.html.erb +1 -1
  200. data/app/views/admin/tags/index.html.erb +1 -1
  201. data/app/views/admin/themes/index.html.erb +5 -6
  202. data/app/views/admin/users/_form.html.erb +34 -34
  203. data/app/views/admin/users/edit.html.erb +2 -2
  204. data/app/views/admin/users/index.html.erb +10 -12
  205. data/app/views/admin/users/new.html.erb +2 -2
  206. data/app/views/archives_sidebar/_content.html.erb +2 -2
  207. data/app/views/articles/_archives_article.html.erb +3 -3
  208. data/app/views/articles/_article.html.erb +7 -9
  209. data/app/views/articles/_article_author.html.erb +4 -0
  210. data/app/views/articles/_article_content.html.erb +2 -2
  211. data/app/views/articles/_article_excerpt.html.erb +2 -2
  212. data/app/views/articles/_article_links.html.erb +1 -1
  213. data/app/views/articles/_comment_errors.html.erb +1 -1
  214. data/app/views/articles/_comment_form.html.erb +12 -12
  215. data/app/views/articles/_comment_preview.html.erb +3 -3
  216. data/app/views/articles/_password_form.html.erb +4 -4
  217. data/app/views/articles/_trackback.html.erb +2 -2
  218. data/app/views/articles/archives.html.erb +1 -1
  219. data/app/views/articles/feedback_atom_feed.atom.builder +3 -1
  220. data/app/views/articles/feedback_rss_feed.rss.builder +9 -7
  221. data/app/views/articles/index_atom_feed.atom.builder +5 -3
  222. data/app/views/articles/index_rss_feed.rss.builder +10 -8
  223. data/app/views/articles/live_search.html.erb +3 -3
  224. data/app/views/articles/read.html.erb +16 -8
  225. data/app/views/articles/search.html.erb +2 -2
  226. data/app/views/articles/trackback.xml.builder +3 -1
  227. data/app/views/articles/view_page.html.erb +1 -1
  228. data/app/views/authors/show.html.erb +9 -9
  229. data/app/views/authors/show_atom_feed.atom.builder +4 -2
  230. data/app/views/authors/show_rss_feed.rss.builder +10 -8
  231. data/app/views/comments/_comment.html.erb +3 -3
  232. data/app/views/devise/mailer/reset_password_instructions.html.erb +7 -9
  233. data/app/views/devise/passwords/edit.html.erb +4 -4
  234. data/app/views/devise/passwords/new.html.erb +1 -1
  235. data/app/views/devise/registrations/new.html.erb +5 -5
  236. data/app/views/devise/sessions/new.html.erb +3 -3
  237. data/app/views/errors/404.html.erb +2 -2
  238. data/app/views/feedback/index.atom.builder +3 -1
  239. data/app/views/feedback/index.rss.builder +9 -7
  240. data/app/views/layouts/accounts.html.erb +26 -26
  241. data/app/views/layouts/administration.html.erb +31 -31
  242. data/app/views/layouts/default.html.erb +3 -3
  243. data/app/views/layouts/editor.html.erb +5 -19
  244. data/app/views/meta_sidebar/_content.html.erb +2 -2
  245. data/app/views/notes/_note.html.erb +1 -1
  246. data/app/views/notes/index.html.erb +1 -1
  247. data/app/views/notes/show_in_reply.html.erb +1 -1
  248. data/app/views/notification_mailer/_mail_footer.html.erb +3 -3
  249. data/app/views/notification_mailer/article.html.erb +2 -2
  250. data/app/views/notification_mailer/comment.html.erb +5 -5
  251. data/app/views/notification_mailer/notif_user.html.erb +1 -1
  252. data/app/views/page_sidebar/_content.html.erb +1 -1
  253. data/app/views/search_sidebar/_content.html.erb +2 -2
  254. data/app/views/settings/install.html.erb +2 -2
  255. data/app/views/setup/index.html.erb +7 -7
  256. data/app/views/shared/_atom_header.atom.builder +4 -2
  257. data/app/views/shared/_atom_item_article.atom.builder +11 -6
  258. data/app/views/shared/_atom_item_comment.atom.builder +4 -2
  259. data/app/views/shared/_atom_item_trackback.atom.builder +4 -2
  260. data/app/views/shared/_page_header.html.erb +9 -12
  261. data/app/views/shared/_rss_item_article.rss.builder +6 -3
  262. data/app/views/shared/_rss_item_comment.rss.builder +3 -1
  263. data/app/views/shared/_rss_item_trackback.rss.builder +3 -1
  264. data/app/views/sidebar/display_plugins.html.erb +1 -1
  265. data/app/views/tag_sidebar/_content.html.erb +1 -1
  266. data/app/views/tags/index.html.erb +1 -1
  267. data/app/views/xml/_googlesitemap_item_article.googlesitemap.builder +2 -0
  268. data/app/views/xml/_googlesitemap_item_category.googlesitemap.builder +2 -0
  269. data/app/views/xml/_googlesitemap_item_page.googlesitemap.builder +2 -0
  270. data/app/views/xml/_googlesitemap_item_tag.googlesitemap.builder +2 -0
  271. data/app/views/xml/sitemap.googlesitemap.builder +4 -2
  272. data/config/i18n-tasks.yml +0 -5
  273. data/config/initializers/devise.rb +10 -4
  274. data/config/initializers/mime_types.rb +3 -1
  275. data/config/locales/da.yml +134 -71
  276. data/config/locales/de.yml +142 -75
  277. data/config/locales/en.yml +128 -66
  278. data/config/locales/es-MX.yml +135 -69
  279. data/config/locales/fr.yml +167 -86
  280. data/config/locales/he.yml +128 -70
  281. data/config/locales/it.yml +136 -72
  282. data/config/locales/ja.yml +110 -64
  283. data/config/locales/lt.yml +153 -74
  284. data/config/locales/nb-NO.yml +123 -65
  285. data/config/locales/nl.yml +140 -75
  286. data/config/locales/pl.yml +160 -69
  287. data/config/locales/pt-BR.yml +137 -70
  288. data/config/locales/ro.yml +148 -70
  289. data/config/locales/ru.yml +161 -69
  290. data/config/locales/zh-CN.yml +106 -59
  291. data/config/locales/zh-TW.yml +109 -61
  292. data/config/routes.rb +68 -63
  293. data/db/migrate/113_initial_schema.rb +192 -190
  294. data/db/migrate/114_fixes_buggy_articles_and_notes.rb +9 -6
  295. data/db/migrate/115_drops_categories_for_tags.rb +3 -1
  296. data/db/migrate/20150207131657_add_missing_indexes.rb +2 -0
  297. data/db/migrate/20150807134129_simplify_redirect_relations.rb +8 -1
  298. data/db/migrate/20150808052637_add_blog_ids.rb +4 -2
  299. data/db/migrate/20150808191127_add_blog_id_to_redirects.rb +2 -0
  300. data/db/migrate/20150810094754_add_blog_id_to_tags.rb +2 -0
  301. data/db/migrate/20160108111120_add_devise_to_users.rb +4 -2
  302. data/db/migrate/20160108184201_move_last_connection_to_last_sign_in_at.rb +2 -0
  303. data/db/migrate/20160110094906_remove_profiles_rights.rb +2 -0
  304. data/db/migrate/20160605103918_replace_profile_id_with_string.rb +2 -0
  305. data/db/migrate/20160605154632_remove_profiles.rb +10 -5
  306. data/db/migrate/20160701061851_demand_blog_id_on_contents.rb +2 -0
  307. data/db/migrate/20160701062604_add_blog_id_to_resources.rb +2 -0
  308. data/db/migrate/20170528093024_move_resources_to_content.rb +2 -0
  309. data/db/migrate/20170528094923_move_tags_to_content.rb +2 -0
  310. data/db/migrate/20170528201606_remove_separate_published_flag.rb +2 -0
  311. data/db/migrate/20170605071626_remove_extra_state_columns_from_feedback.rb +2 -0
  312. data/db/migrate/20170702105201_remove_published_at_from_feedback.rb +2 -0
  313. data/db/migrate/20190208151235_add_text_filter_name_fields.rb +9 -0
  314. data/db/migrate/20190208152646_move_text_filter_to_name.rb +97 -0
  315. data/db/migrate/20190209155717_remove_text_filter_ids.rb +19 -0
  316. data/db/migrate/20190209160610_remove_text_filters.rb +17 -0
  317. data/db/migrate/20200413140440_add_unique_indexes.rb +10 -0
  318. data/db/seeds.rb +9 -19
  319. data/lib/email_notify.rb +3 -1
  320. data/lib/format.rb +4 -2
  321. data/lib/publify_core.rb +36 -35
  322. data/lib/publify_core/engine.rb +8 -6
  323. data/lib/publify_core/lang.rb +5 -1
  324. data/lib/publify_core/testing_support/dns_mock.rb +15 -0
  325. data/lib/publify_core/testing_support/factories.rb +240 -0
  326. data/lib/publify_core/testing_support/feed_assertions.rb +48 -0
  327. data/lib/publify_core/testing_support/fixtures/exploit.svg +4 -0
  328. data/lib/publify_core/testing_support/fixtures/fakepng.png +1 -0
  329. data/lib/publify_core/testing_support/fixtures/otherfile.txt +1 -0
  330. data/lib/publify_core/testing_support/fixtures/testfile.png +0 -0
  331. data/lib/publify_core/testing_support/fixtures/testfile.txt +1 -0
  332. data/lib/publify_core/testing_support/upload_fixtures.rb +15 -0
  333. data/lib/publify_core/version.rb +3 -1
  334. data/lib/publify_guid.rb +3 -1
  335. data/lib/publify_plugins.rb +10 -5
  336. data/lib/publify_textfilter_markdown.rb +38 -25
  337. data/lib/publify_textfilter_none.rb +5 -3
  338. data/lib/publify_textfilter_smartypants.rb +5 -3
  339. data/lib/publify_textfilter_textile.rb +7 -4
  340. data/lib/publify_textfilter_twitterfilter.rb +13 -7
  341. data/lib/publify_time.rb +4 -0
  342. data/lib/sidebar_field.rb +15 -13
  343. data/lib/sidebar_registry.rb +5 -3
  344. data/lib/spam_protection.rb +16 -13
  345. data/lib/tasks/i18n.rake +9 -0
  346. data/lib/tasks/manifest.rake +30 -0
  347. data/lib/tasks/publify_core_tasks.rake +2 -0
  348. data/lib/text_filter_plugin.rb +27 -25
  349. data/lib/theme.rb +5 -3
  350. data/lib/transforms.rb +22 -19
  351. metadata +217 -87
  352. data/app/assets/javascripts/widearea.js +0 -486
  353. data/app/assets/stylesheets/widearea.css +0 -133
  354. data/app/controllers/admin/textfilters_controller.rb +0 -6
  355. data/app/views/admin/dashboard/_inbound.html.erb +0 -31
  356. data/app/views/admin/notes/_header.html.erb +0 -6
  357. 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,7 +7,7 @@ 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
 
@@ -14,11 +16,12 @@ class Admin::BaseController < BaseController
14
16
  def destroy_a(klass_to_destroy)
15
17
  @record = klass_to_destroy.find(params[:id])
16
18
  if @record.respond_to?(:access_by?) && !@record.access_by?(current_user)
17
- flash[:error] = I18n.t('admin.base.not_allowed')
18
- return(redirect_to action: 'index')
19
+ flash[:error] = I18n.t("admin.base.not_allowed")
20
+ return(redirect_to action: "index")
19
21
  end
20
22
  @record.destroy
21
- flash[:notice] = I18n.t('admin.base.successfully_deleted', name: controller_name.humanize)
22
- redirect_to action: 'index'
23
+ flash[:notice] = I18n.t("admin.base.successfully_deleted",
24
+ name: controller_name.humanize)
25
+ redirect_to action: "index"
23
26
  end
24
27
  end
@@ -1,11 +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
8
  def index
7
- @search = params[:search] ? params[:search] : {}
8
- @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)
9
12
 
10
13
  if request.xhr?
11
14
  respond_to do |format|
@@ -19,16 +22,17 @@ class Admin::ContentController < Admin::BaseController
19
22
  def new
20
23
  @article = Article::Factory.new(this_blog, current_user).default
21
24
  load_resources
22
- render layout: 'editor'
25
+ render layout: "editor"
23
26
  end
24
27
 
25
28
  def edit
26
29
  return unless access_granted?(params[:id])
30
+
27
31
  @article = Article.find(params[:id])
28
- @article.text_filter ||= current_user.default_text_filter
32
+ @article.text_filter ||= default_text_filter
29
33
  @article.keywords = Tag.collection_to_string @article.tags
30
34
  load_resources
31
- render layout: 'editor'
35
+ render layout: "editor"
32
36
  end
33
37
 
34
38
  def create
@@ -38,23 +42,24 @@ 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', layout: 'editor'
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
 
@@ -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
 
@@ -106,17 +111,20 @@ class Admin::ContentController < Admin::BaseController
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.zone.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
@@ -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,7 +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
189
+
190
+ def default_text_filter
191
+ current_user.text_filter || this_blog.text_filter
192
+ end
180
193
  end
@@ -1,12 +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
- today = Time.zone.now.strftime('%Y-%m-%d 00:00')
9
+ today = Time.zone.now.strftime("%Y-%m-%d 00:00")
10
10
 
11
11
  # Since last visit
12
12
  last_sign_in = current_user.last_sign_in_at
@@ -14,68 +14,20 @@ class Admin::DashboardController < Admin::BaseController
14
14
  @newcomments_count = Feedback.created_since(last_sign_in).count
15
15
 
16
16
  # Today
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).where(user_id: current_user.id).count
22
- @statcomments = Comment.where('created_at > ?', today).count
23
- @presumedspam = Comment.presumed_spam.where('created_at > ?', today).count
24
- @confirmed = Comment.ham.where('created_at > ?', today).count
25
- @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
26
27
 
27
28
  @comments = Comment.last_published
28
- @drafts = Article.drafts.where('user_id = ?', current_user.id).limit(5)
29
+ @drafts = Article.drafts.where("user_id = ?", current_user.id).limit(5)
29
30
 
30
31
  @statspam = Comment.spam.count
31
- @inbound_links = inbound_links
32
- publify_version
33
- end
34
-
35
- def publify_version
36
- version = nil
37
- begin
38
- open(PUBLIFY_VERSION_URL) do |http|
39
- publify_version = http.read[0..5]
40
- version = publify_version.split('.')
41
- end
42
- rescue
43
- return
44
- end
45
- if version[0].to_i > TYPO_MAJOR.to_i
46
- flash[:error] = I18n.t('admin.dashboard.publify_version.error')
47
- elsif version[1].to_i > TYPO_SUB.to_i
48
- flash[:warning] = I18n.t('admin.dashboard.publify_version.warning')
49
- elsif version[2].to_i > TYPO_MINOR.to_i
50
- flash[:notice] = I18n.t('admin.dashboard.publify_version.notice')
51
- end
52
- end
53
-
54
- private
55
-
56
- def inbound_links
57
- host = URI.parse(this_blog.base_url).host
58
- return [] if Rails.env.development?
59
- url = "http://www.google.com/search?q=link:#{host}&tbm=blg&output=rss"
60
- fetch_rss(url).reverse.compact
61
- end
62
-
63
- def fetch_rss(url)
64
- open(url) do |http|
65
- return parse_rss(http.read)
66
- end
67
- rescue
68
- []
69
- end
70
-
71
- RssItem = Struct.new(:link, :title, :description, :description_link, :date, :author) do
72
- def to_s
73
- title
74
- end
75
- end
76
-
77
- def parse_rss(body)
78
- doc = Feedjira::Feed.parse(body)
79
- doc.entries
80
32
  end
81
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,36 +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
- # TODO: Make this special case not necessary
87
- if params[:context] != 'listing'
88
- @comments = Comment.last_published
89
- page.replace_html('commentList', partial: 'admin/dashboard/comment')
90
- elsif template == 'ham'
91
- format.js { render 'ham' }
88
+ if new_state == "ham"
89
+ format.js { render "ham" }
92
90
  else
93
- format.js { render 'spam' }
91
+ format.js { render "spam" }
94
92
  end
95
93
  end
96
94
  end
@@ -100,37 +98,46 @@ class Admin::FeedbackController < Admin::BaseController
100
98
  items = Feedback.find(ids)
101
99
  @unexpired = true
102
100
 
103
- 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
104
106
 
105
107
  case bulkop
106
- when 'Delete Checked Items'
108
+ when "Delete Checked Items"
107
109
  count = 0
108
110
  ids.each do |id|
109
111
  count += Feedback.delete(id)
110
112
  end
111
- flash[:success] = I18n.t('admin.feedback.bulkops.success_deleted', count: count)
112
- 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"
113
115
  update_feedback(items, :mark_as_ham!)
114
- flash[:success] = I18n.t('admin.feedback.bulkops.success_mark_as_ham', count: ids.size)
115
- 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"
116
119
  update_feedback(items, :mark_as_spam!)
117
- flash[:success] = I18n.t('admin.feedback.bulkops.success_mark_as_spam', count: ids.size)
118
- 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"
119
123
  update_feedback(items, :confirm_classification!)
120
- flash[:success] = I18n.t('admin.feedback.bulkops.success_classification', count: ids.size)
121
- when 'Delete all spam'
124
+ flash[:success] = I18n.t("admin.feedback.bulkops.success_classification",
125
+ count: ids.size)
126
+ when "Delete all spam"
122
127
  if request.post?
123
- Feedback.where('state = ?', 'spam').delete_all
124
- 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")
125
130
  end
126
131
  else
127
- flash[:error] = I18n.t('admin.feedback.bulkops.error')
132
+ flash[:error] = I18n.t("admin.feedback.bulkops.error")
128
133
  end
129
134
 
130
135
  if params[:article_id]
131
- 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]
132
138
  else
133
- 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]
134
141
  end
135
142
  end
136
143