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
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Admin::TagsController < Admin::BaseController
2
4
  before_action :fetch_tags, only: [:index, :edit]
3
5
  before_action :set_tag, only: [:edit, :update, :destroy]
@@ -12,7 +14,7 @@ class Admin::TagsController < Admin::BaseController
12
14
  @tag = this_blog.tags.new(tag_params)
13
15
 
14
16
  if @tag.save
15
- redirect_to admin_tags_url, notice: 'Tag was successfully created.'
17
+ redirect_to admin_tags_url, notice: "Tag was successfully created."
16
18
  else
17
19
  fetch_tags
18
20
  render :index
@@ -24,7 +26,7 @@ class Admin::TagsController < Admin::BaseController
24
26
  if @tag.update(tag_params)
25
27
  # TODO: Check whether these redirects are useful or ignored.
26
28
  Redirect.create(from_path: "/tag/#{old_name}", to_path: @tag.permalink_url(nil, true))
27
- redirect_to admin_tags_url, notice: I18n.t('admin.tags.edit.success')
29
+ redirect_to admin_tags_url, notice: I18n.t("admin.tags.edit.success")
28
30
  else
29
31
  render :edit
30
32
  end
@@ -47,6 +49,7 @@ class Admin::TagsController < Admin::BaseController
47
49
  end
48
50
 
49
51
  def fetch_tags
50
- @tags = Tag.order('display_name').page(params[:page]).per(this_blog.admin_display_elements)
52
+ @tags = Tag.order("display_name").page(params[:page]).
53
+ per(this_blog.admin_display_elements)
51
54
  end
52
55
  end
@@ -1,28 +1,31 @@
1
- require 'open-uri'
2
- require 'time'
3
- require 'rexml/document'
1
+ # frozen_string_literal: true
2
+
3
+ require "open-uri"
4
+ require "time"
5
+ require "rexml/document"
4
6
 
5
7
  class Admin::ThemesController < Admin::BaseController
6
8
  def index
7
9
  @themes = Theme.find_all
8
10
  @themes.each do |theme|
9
11
  # TODO: Move to Theme
10
- theme.description_html = TextFilter.filter_text(theme.description, [:markdown, :smartypants])
12
+ theme.description_html = TextFilter.filter_text(theme.description,
13
+ [:markdown, :smartypants])
11
14
  end
12
15
  @active = this_blog.current_theme
13
16
  end
14
17
 
15
18
  def preview
16
19
  theme = Theme.find(params[:theme])
17
- send_file File.join(theme.path, 'preview.png'),
18
- type: 'image/png', disposition: 'inline', stream: false
20
+ send_file File.join(theme.path, "preview.png"),
21
+ type: "image/png", disposition: "inline", stream: false
19
22
  end
20
23
 
21
24
  def switchto
22
25
  this_blog.theme = params[:theme]
23
26
  this_blog.save
24
27
  this_blog.current_theme(:reload)
25
- flash[:success] = I18n.t('admin.themes.switchto.success')
28
+ flash[:success] = I18n.t("admin.themes.switchto.success")
26
29
  redirect_to admin_themes_url
27
30
  end
28
31
  end
@@ -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
 
@@ -46,9 +49,9 @@ class Admin::UsersController < Admin::BaseController
46
49
  def user_params
47
50
  params.require(:user).permit(:login, :password, :password_confirmation,
48
51
  :email, :firstname, :lastname, :nickname,
49
- :display_name, :notify_via_email,
52
+ :name, :notify_via_email,
50
53
  :notify_on_new_articles, :notify_on_comments,
51
- :profile, :text_filter, :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,23 +1,19 @@
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
5
- before_action :configure_permitted_parameters, if: :devise_controller?
6
7
 
7
8
  private
8
9
 
9
- def configure_permitted_parameters
10
- # TODO: Check if this is still needed
11
- devise_parameter_sanitizer.permit(:sign_up, keys: [:email])
12
- end
13
-
14
10
  def login_required
15
11
  authenticate_user! && authorize!(params[:action], params[:controller])
16
12
  end
17
13
 
18
14
  def set_paths
19
15
  prepend_view_path this_blog.current_theme.view_path
20
- 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|
21
17
  append_view_path file
22
18
  end
23
19
  end
@@ -32,13 +28,15 @@ class BaseController < ApplicationController
32
28
  elsif I18n.available_locales.include?(this_blog.lang[0..1].to_sym)
33
29
  I18n.locale = this_blog.lang[0..1]
34
30
  # for the same language used in different areas, e.g. zh_CN, zh_TW
35
- elsif I18n.available_locales.include?(this_blog.lang.sub('_', '-').to_sym)
36
- 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("_", "-")
37
33
  end
38
34
  end
39
35
 
40
36
  def add_to_cookies(name, value, path = nil, _expires = nil)
41
- 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 }
42
40
  end
43
41
 
44
42
  include BlogHelper
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class CommentsController < BaseController
2
- before_action :get_article, only: [:create, :preview]
4
+ before_action :set_article, only: [:create, :preview]
3
5
 
4
6
  def create
5
7
  options = new_comment_defaults.merge comment_params.to_h
@@ -10,12 +12,10 @@ class CommentsController < BaseController
10
12
  @comment.user_id = current_user.id if current_user.id == session[:user_id]
11
13
  end
12
14
 
13
- set_cookies_for @comment
15
+ remember_author_info_for @comment
14
16
 
15
- partial = '/articles/comment_failed'
16
- if recaptcha_ok_for?(@comment) && @comment.save
17
- partial = '/articles/comment'
18
- end
17
+ partial = "/articles/comment_failed"
18
+ partial = "/articles/comment" if recaptcha_ok_for?(@comment) && @comment.save
19
19
  respond_to do |format|
20
20
  format.js { render partial }
21
21
  format.html { redirect_to URI.parse(@article.permalink_url).path }
@@ -23,14 +23,14 @@ class CommentsController < BaseController
23
23
  end
24
24
 
25
25
  def preview
26
- return render plain: 'Comments are closed' if @article.comments_closed?
26
+ return render plain: "Comments are closed" if @article.comments_closed?
27
27
 
28
28
  if comment_params[:body].blank?
29
29
  head :ok
30
30
  return
31
31
  end
32
32
 
33
- @comment = Comment.new(comment_params)
33
+ @comment = @article.comments.build(comment_params)
34
34
  end
35
35
 
36
36
  protected
@@ -42,14 +42,14 @@ class CommentsController < BaseController
42
42
 
43
43
  def new_comment_defaults
44
44
  { ip: request.remote_ip,
45
- author: 'Anonymous',
45
+ author: "Anonymous",
46
46
  user: @current_user,
47
- user_agent: request.env['HTTP_USER_AGENT'],
48
- referrer: request.env['HTTP_REFERER'],
47
+ user_agent: request.env["HTTP_USER_AGENT"],
48
+ referrer: request.env["HTTP_REFERER"],
49
49
  permalink: @article.permalink_url }.stringify_keys
50
50
  end
51
51
 
52
- def set_cookies_for(comment)
52
+ def remember_author_info_for(comment)
53
53
  add_to_cookies(:author, comment.author)
54
54
  add_to_cookies(:url, comment.url)
55
55
  if comment.email.present?
@@ -57,7 +57,7 @@ class CommentsController < BaseController
57
57
  end
58
58
  end
59
59
 
60
- def get_article
60
+ def set_article
61
61
  @article = Article.find(params[:article_id])
62
62
  end
63
63