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
@@ -1,13 +1,16 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Admin::UsersController < Admin::BaseController
2
4
  before_action :set_user, only: [:edit, :update, :destroy]
3
5
 
4
6
  def index
5
- @users = User.order('login asc').page(params[:page]).per(this_blog.admin_display_elements)
7
+ @users = User.order("login asc").page(params[:page]).
8
+ per(this_blog.admin_display_elements)
6
9
  end
7
10
 
8
11
  def new
9
12
  @user = User.new
10
- @user.text_filter = TextFilter.find_by(name: this_blog.text_filter)
13
+ @user.text_filter_name = this_blog.text_filter
11
14
  end
12
15
 
13
16
  def edit
@@ -18,7 +21,7 @@ class Admin::UsersController < Admin::BaseController
18
21
  @user = User.new(user_params)
19
22
  @user.name = @user.login
20
23
  if @user.save
21
- redirect_to admin_users_url, notice: I18n.t('admin.users.new.success')
24
+ redirect_to admin_users_url, notice: I18n.t("admin.users.new.success")
22
25
  else
23
26
  render :new
24
27
  end
@@ -26,14 +29,14 @@ class Admin::UsersController < Admin::BaseController
26
29
 
27
30
  def update
28
31
  if @user.update(update_params)
29
- redirect_to admin_users_url, notice: 'User was successfully updated.'
32
+ redirect_to admin_users_url, notice: "User was successfully updated."
30
33
  else
31
34
  render :edit
32
35
  end
33
36
  end
34
37
 
35
38
  def destroy
36
- @user.destroy if User.where('profile = ? and id != ?', User::ADMIN, @user.id).count > 1
39
+ @user.destroy if User.where("profile = ? and id != ?", User::ADMIN, @user.id).count > 1
37
40
  redirect_to admin_users_url
38
41
  end
39
42
 
@@ -48,7 +51,7 @@ class Admin::UsersController < Admin::BaseController
48
51
  :email, :firstname, :lastname, :nickname,
49
52
  :name, :notify_via_email,
50
53
  :notify_on_new_articles, :notify_on_comments,
51
- :profile, :text_filter_id, :state,
54
+ :profile, :text_filter_name, :state,
52
55
  :twitter_account, :twitter_oauth_token,
53
56
  :twitter_oauth_token_secret, :description,
54
57
  :url, :msn, :yahoo, :jabber, :aim, :twitter)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ArticlesController < ContentController
2
4
  before_action :login_required, only: [:preview, :preview_page]
3
5
  before_action :auto_discovery_feed, only: [:show, :index]
@@ -8,7 +10,7 @@ class ArticlesController < ContentController
8
10
  helper :'admin/base'
9
11
 
10
12
  def index
11
- wanted_types = this_blog.statuses_in_timeline ? ['Article', 'Note'] : ['Article']
13
+ wanted_types = this_blog.statuses_in_timeline ? ["Article", "Note"] : ["Article"]
12
14
 
13
15
  limit = this_blog.per_page(params[:format])
14
16
  articles_base = if params[:year].blank?
@@ -16,7 +18,7 @@ class ArticlesController < ContentController
16
18
  else
17
19
  this_blog.contents.published_at(params.values_at(:year, :month, :day))
18
20
  end
19
- @articles = articles_base.includes(:user, :resources, :tags, :text_filter).
21
+ @articles = articles_base.includes(:user, :resources, :tags).
20
22
  where(type: wanted_types).page(params[:page]).per(limit)
21
23
 
22
24
  respond_to do |format|
@@ -27,24 +29,27 @@ class ArticlesController < ContentController
27
29
  render_paginated_index
28
30
  end
29
31
  format.atom do
30
- render_articles_feed('atom')
32
+ render_articles_feed("atom")
31
33
  end
32
34
  format.rss do
33
35
  auto_discovery_feed(only_path: false)
34
- render_articles_feed('rss')
36
+ render_articles_feed("rss")
35
37
  end
36
38
  end
37
39
  end
38
40
 
39
41
  def search
40
- @articles = this_blog.articles_matching(params[:q], page: params[:page], per_page: this_blog.per_page(params[:format]))
42
+ @articles = this_blog.articles_matching(params[:q],
43
+ page: params[:page],
44
+ per_page: this_blog.per_page(params[:format]))
41
45
  return error! if @articles.empty?
46
+
42
47
  @page_title = this_blog.search_title_template.to_title(@articles, this_blog, params)
43
48
  @description = this_blog.search_desc_template.to_title(@articles, this_blog, params)
44
49
  respond_to do |format|
45
- format.html { render 'search' }
46
- format.rss { render_articles_feed 'rss' }
47
- format.atom { render_articles_feed 'atom' }
50
+ format.html { render "search" }
51
+ format.rss { render_articles_feed "rss" }
52
+ format.atom { render_articles_feed "atom" }
48
53
  end
49
54
  end
50
55
 
@@ -57,16 +62,17 @@ class ArticlesController < ContentController
57
62
  def preview
58
63
  @article = Article.last_draft(params[:id])
59
64
  @page_title = this_blog.article_title_template.to_title(@article, this_blog, params)
60
- render 'read'
65
+ render "read"
61
66
  end
62
67
 
63
68
  def check_password
64
69
  return unless request.xhr?
70
+
65
71
  @article = Article.find(params[:article][:id])
66
72
  if @article.password == params[:article][:password]
67
- render partial: 'articles/full_article_content', locals: { article: @article }
73
+ render partial: "articles/full_article_content", locals: { article: @article }
68
74
  else
69
- render partial: 'articles/password_form', locals: { article: @article }
75
+ render partial: "articles/password_form", locals: { article: @article }
70
76
  end
71
77
  end
72
78
 
@@ -79,15 +85,18 @@ class ArticlesController < ContentController
79
85
 
80
86
  # Redirect old version with /:year/:month/:day/:title to new format,
81
87
  # because it's changed
82
- ['%year%/%month%/%day%/%title%', 'articles/%year%/%month%/%day%/%title%'].each do |part|
88
+ ["%year%/%month%/%day%/%title%", "articles/%year%/%month%/%day%/%title%"].each do |part|
83
89
  @article = factory.match_permalink_format(from, part)
84
- return redirect_to URI.parse(@article.permalink_url).path, status: 301 if @article
90
+ if @article
91
+ return redirect_to URI.parse(@article.permalink_url).path,
92
+ status: :moved_permanently
93
+ end
85
94
  end
86
95
 
87
96
  r = Redirect.find_by!(from_path: from)
88
97
  # TODO: If linked to article, directly redirect to the article.
89
98
  # Let redirection made outside of the blog on purpose (deal with it, Brakeman!)
90
- redirect_to r.full_to_path, status: 301 if r
99
+ redirect_to r.full_to_path, status: :moved_permanently if r
91
100
  end
92
101
 
93
102
  def archives
@@ -99,24 +108,29 @@ class ArticlesController < ContentController
99
108
  end
100
109
 
101
110
  def tag
102
- redirect_to tags_path, status: 301
111
+ redirect_to tags_path, status: :moved_permanently
103
112
  end
104
113
 
105
114
  def preview_page
106
115
  @page = Page.find(params[:id])
107
- render 'view_page'
116
+ render "view_page"
108
117
  end
109
118
 
110
119
  def view_page
111
- @page = Page.published.find_by!(name: Array(params[:name]).join('/'))
120
+ @page = Page.published.find_by!(name: Array(params[:name]).join("/"))
112
121
  @page_title = @page.title
113
122
  @description = this_blog.meta_description
114
123
  @keywords = this_blog.meta_keywords
115
124
  end
116
125
 
117
- # TODO: Move to TextfilterController?
126
+ # TODO: Move to TextfilterController
118
127
  def markup_help
119
- render html: TextFilter.find(params[:id]).commenthelp
128
+ filter = TextFilter.make_filter(params[:id])
129
+ if filter
130
+ render html: filter.commenthelp
131
+ else
132
+ render plain: "Unknown filter"
133
+ end
120
134
  end
121
135
 
122
136
  private
@@ -137,7 +151,7 @@ class ArticlesController < ContentController
137
151
 
138
152
  def verify_config
139
153
  if !this_blog.configured?
140
- redirect_to controller: 'setup', action: 'index'
154
+ redirect_to controller: "setup", action: "index"
141
155
  elsif User.count == 0
142
156
  redirect_to new_user_registration_path
143
157
  else
@@ -154,12 +168,12 @@ class ArticlesController < ContentController
154
168
  @page_title = this_blog.article_title_template.to_title(@article, this_blog, params)
155
169
  @description = this_blog.article_desc_template.to_title(@article, this_blog, params)
156
170
 
157
- @keywords = @article.tags.map(&:name).join(', ')
171
+ @keywords = @article.tags.map(&:name).join(", ")
158
172
  render "articles/#{@article.post_type}"
159
173
  end
160
- format.atom { render_feedback_feed('atom') }
161
- format.rss { render_feedback_feed('rss') }
162
- format.xml { render_feedback_feed('atom') }
174
+ format.atom { render_feedback_feed("atom") }
175
+ format.rss { render_feedback_feed("rss") }
176
+ format.xml { render_feedback_feed("atom") }
163
177
  end
164
178
  rescue ActiveRecord::RecordNotFound
165
179
  error!
@@ -175,23 +189,25 @@ class ArticlesController < ContentController
175
189
 
176
190
  def render_paginated_index
177
191
  return error! if @articles.empty?
192
+
178
193
  auto_discovery_feed(only_path: false)
179
- render 'index'
194
+ render "index"
180
195
  end
181
196
 
182
197
  def extract_feed_format(from)
183
- if from =~ /^.*\.rss$/
184
- request.format = 'rss'
185
- from = from.gsub(/\.rss/, '')
186
- elsif from =~ /^.*\.atom$/
187
- request.format = 'atom'
188
- from = from.gsub(/\.atom$/, '')
198
+ case from
199
+ when /^.*\.rss$/
200
+ request.format = "rss"
201
+ from = from.gsub(/\.rss/, "")
202
+ when /^.*\.atom$/
203
+ request.format = "atom"
204
+ from = from.gsub(/\.atom$/, "")
189
205
  end
190
206
  from
191
207
  end
192
208
 
193
209
  def error!
194
- @message = I18n.t('errors.no_posts_found')
195
- render 'articles/error', status: 200
210
+ @message = I18n.t("errors.no_posts_found")
211
+ render "articles/error", status: :ok
196
212
  end
197
213
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class AuthorsController < ContentController
2
4
  layout :theme_layout
3
5
 
@@ -5,7 +7,8 @@ class AuthorsController < ContentController
5
7
  @author = User.find_by(login: params[:id])
6
8
  raise ActiveRecord::RecordNotFound unless @author
7
9
 
8
- @articles = @author.articles.published.page(params[:page]).per(this_blog.per_page(params[:format]))
10
+ @articles = @author.articles.published.page(params[:page]).
11
+ per(this_blog.per_page(params[:format]))
9
12
  @page_title = this_blog.author_title_template.to_title(@author, this_blog, params)
10
13
  @keywords = this_blog.meta_keywords
11
14
  @description = this_blog.author_desc_template.to_title(@author, this_blog, params)
@@ -13,8 +16,8 @@ class AuthorsController < ContentController
13
16
  auto_discovery_feed(only_path: false)
14
17
 
15
18
  respond_to do |format|
16
- format.rss { render_feed 'rss' }
17
- format.atom { render_feed 'atom' }
19
+ format.rss { render_feed "rss" }
20
+ format.atom { render_feed "atom" }
18
21
  format.html
19
22
  end
20
23
  end
@@ -1,4 +1,6 @@
1
- require 'cancancan'
1
+ # frozen_string_literal: true
2
+
3
+ require "cancancan"
2
4
 
3
5
  class BaseController < ApplicationController
4
6
  before_action :fire_triggers, :load_lang, :set_paths
@@ -11,7 +13,7 @@ class BaseController < ApplicationController
11
13
 
12
14
  def set_paths
13
15
  prepend_view_path this_blog.current_theme.view_path
14
- Dir.glob(File.join(::Rails.root.to_s, 'lib', '*_sidebar/app/views')).select do |file|
16
+ Dir.glob(File.join(::Rails.root.to_s, "lib", "*_sidebar/app/views")).select do |file|
15
17
  append_view_path file
16
18
  end
17
19
  end
@@ -26,13 +28,15 @@ class BaseController < ApplicationController
26
28
  elsif I18n.available_locales.include?(this_blog.lang[0..1].to_sym)
27
29
  I18n.locale = this_blog.lang[0..1]
28
30
  # for the same language used in different areas, e.g. zh_CN, zh_TW
29
- elsif I18n.available_locales.include?(this_blog.lang.sub('_', '-').to_sym)
30
- I18n.locale = this_blog.lang.sub('_', '-')
31
+ elsif I18n.available_locales.include?(this_blog.lang.sub("_", "-").to_sym)
32
+ I18n.locale = this_blog.lang.sub("_", "-")
31
33
  end
32
34
  end
33
35
 
34
36
  def add_to_cookies(name, value, path = nil, _expires = nil)
35
- cookies[name] = { value: value, path: path || "/#{controller_name}", expires: 6.weeks.from_now }
37
+ cookies[name] = { value: value,
38
+ path: path || "/#{controller_name}",
39
+ expires: 6.weeks.from_now }
36
40
  end
37
41
 
38
42
  include BlogHelper
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class CommentsController < BaseController
2
4
  before_action :set_article, only: [:create, :preview]
3
5
 
@@ -12,8 +14,8 @@ class CommentsController < BaseController
12
14
 
13
15
  remember_author_info_for @comment
14
16
 
15
- partial = '/articles/comment_failed'
16
- partial = '/articles/comment' if recaptcha_ok_for?(@comment) && @comment.save
17
+ partial = "/articles/comment_failed"
18
+ partial = "/articles/comment" if recaptcha_ok_for?(@comment) && @comment.save
17
19
  respond_to do |format|
18
20
  format.js { render partial }
19
21
  format.html { redirect_to URI.parse(@article.permalink_url).path }
@@ -21,14 +23,14 @@ class CommentsController < BaseController
21
23
  end
22
24
 
23
25
  def preview
24
- return render plain: 'Comments are closed' if @article.comments_closed?
26
+ return render plain: "Comments are closed" if @article.comments_closed?
25
27
 
26
28
  if comment_params[:body].blank?
27
29
  head :ok
28
30
  return
29
31
  end
30
32
 
31
- @comment = Comment.new(comment_params)
33
+ @comment = @article.comments.build(comment_params)
32
34
  end
33
35
 
34
36
  protected
@@ -40,17 +42,19 @@ class CommentsController < BaseController
40
42
 
41
43
  def new_comment_defaults
42
44
  { ip: request.remote_ip,
43
- author: 'Anonymous',
45
+ author: "Anonymous",
44
46
  user: @current_user,
45
- user_agent: request.env['HTTP_USER_AGENT'],
46
- referrer: request.env['HTTP_REFERER'],
47
+ user_agent: request.env["HTTP_USER_AGENT"],
48
+ referrer: request.env["HTTP_REFERER"],
47
49
  permalink: @article.permalink_url }.stringify_keys
48
50
  end
49
51
 
50
52
  def remember_author_info_for(comment)
51
53
  add_to_cookies(:author, comment.author)
52
54
  add_to_cookies(:url, comment.url)
53
- add_to_cookies(:gravatar_id, Digest::MD5.hexdigest(comment.email.strip)) if comment.email.present?
55
+ if comment.email.present?
56
+ add_to_cookies(:gravatar_id, Digest::MD5.hexdigest(comment.email.strip))
57
+ end
54
58
  end
55
59
 
56
60
  def set_article
@@ -1,11 +1,13 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ContentController < BaseController
2
4
  private
3
5
 
4
6
  # TODO: Make this work for all content.
5
7
  def auto_discovery_feed(options = {})
6
8
  with_options(options.reverse_merge(only_path: true)) do |opts|
7
- @auto_discovery_url_rss = opts.url_for(format: 'rss', only_path: false)
8
- @auto_discovery_url_atom = opts.url_for(format: 'atom', only_path: false)
9
+ @auto_discovery_url_rss = opts.url_for(format: "rss", only_path: false)
10
+ @auto_discovery_url_atom = opts.url_for(format: "atom", only_path: false)
9
11
  end
10
12
  end
11
13
 
@@ -1,11 +1,13 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class FeedbackController < BaseController
2
4
  def index
3
5
  @feedback = Feedback.ham.
4
6
  newest_first.
5
7
  limit(this_blog.per_page(params[:format]))
6
8
  respond_to do |format|
7
- format.atom { render 'index', format: 'atom' }
8
- format.rss { render 'index', format: 'rss' }
9
+ format.atom { render "index", format: "atom" }
10
+ format.rss { render "index", format: "rss" }
9
11
  end
10
12
  end
11
13
  end
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class NotesController < ContentController
2
- require 'json'
4
+ require "json"
3
5
 
4
6
  layout :theme_layout
5
7
 
@@ -9,8 +11,8 @@ class NotesController < ContentController
9
11
  @notes = Note.published.page(params[:page]).per(this_blog.limit_article_display)
10
12
 
11
13
  if @notes.empty?
12
- @message = I18n.t('errors.no_notes_found')
13
- render 'notes/error', status: 200
14
+ @message = I18n.t("errors.no_notes_found")
15
+ render "notes/error", status: :ok
14
16
  end
15
17
  end
16
18
 
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class SetupController < BaseController
2
4
  before_action :check_config
3
- layout 'accounts'
5
+ layout "accounts"
4
6
 
5
7
  def index; end
6
8
 
@@ -8,10 +10,11 @@ class SetupController < BaseController
8
10
  this_blog.blog_name = params[:setting][:blog_name]
9
11
  this_blog.base_url = blog_base_url
10
12
 
11
- @user = User.new(login: 'admin',
13
+ @user = User.new(login: "admin",
12
14
  email: params[:setting][:email],
13
15
  password: params[:setting][:password],
14
- nickname: 'Publify Admin')
16
+ text_filter_name: this_blog.text_filter,
17
+ nickname: "Publify Admin")
15
18
  @user.name = @user.login
16
19
 
17
20
  unless this_blog.save && @user.save
@@ -34,24 +37,25 @@ class SetupController < BaseController
34
37
  private
35
38
 
36
39
  def create_first_post(user)
37
- this_blog.articles.build(title: I18n.t('setup.article.title'),
40
+ this_blog.articles.build(title: I18n.t("setup.article.title"),
38
41
  author: user.login,
39
- body: I18n.t('setup.article.body'),
42
+ body: I18n.t("setup.article.body"),
40
43
  allow_comments: 1,
41
44
  allow_pings: 1,
42
45
  user: user).publish!
43
46
  end
44
47
 
45
48
  def create_first_page(user)
46
- this_blog.pages.create(name: 'about',
47
- state: 'published',
48
- title: I18n.t('setup.page.about'),
49
+ this_blog.pages.create(name: "about",
50
+ state: "published",
51
+ title: I18n.t("setup.page.about"),
49
52
  user: user,
50
- body: I18n.t('setup.page.body'))
53
+ body: I18n.t("setup.page.body"))
51
54
  end
52
55
 
53
56
  def check_config
54
57
  return unless this_blog.configured?
55
- redirect_to controller: 'articles', action: 'index'
58
+
59
+ redirect_to controller: "articles", action: "index"
56
60
  end
57
61
  end