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,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class TagsController < ContentController
2
4
  before_action :auto_discovery_feed, only: [:show, :index]
3
5
  layout :theme_layout
@@ -5,7 +7,7 @@ class TagsController < ContentController
5
7
  def index
6
8
  @tags = Tag.page(params[:page]).per(100)
7
9
  @page_title = controller_name.capitalize
8
- @keywords = ''
10
+ @keywords = ""
9
11
  @description = "Tags for #{this_blog.blog_name}"
10
12
  end
11
13
 
@@ -13,7 +15,7 @@ class TagsController < ContentController
13
15
  @tag = Tag.find_by!(name: params[:id])
14
16
 
15
17
  @articles = @tag.
16
- contents.includes(:blog, :user, :tags, :resources, :text_filter).
18
+ contents.includes(:blog, :user, :tags, :resources).
17
19
  published.page(params[:page]).per(10)
18
20
 
19
21
  respond_to do |format|
@@ -30,12 +32,12 @@ class TagsController < ContentController
30
32
 
31
33
  format.atom do
32
34
  @articles = @articles[0, this_blog.limit_rss_display]
33
- render_cached_xml 'articles/index_atom_feed', @articles
35
+ render_cached_xml "articles/index_atom_feed", @articles
34
36
  end
35
37
 
36
38
  format.rss do
37
39
  @articles = @articles[0, this_blog.limit_rss_display]
38
- render_cached_xml 'articles/index_rss_feed', @articles
40
+ render_cached_xml "articles/index_rss_feed", @articles
39
41
  end
40
42
  end
41
43
  end
@@ -1,8 +1,6 @@
1
- class TextController < BaseController
2
- def humans
3
- render plain: this_blog.humans
4
- end
1
+ # frozen_string_literal: true
5
2
 
3
+ class TextController < BaseController
6
4
  def robots
7
5
  render plain: this_blog.robots
8
6
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # TODO: Remove
2
4
  class TextfilterController < BaseController
3
5
  end
@@ -1,13 +1,15 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ThemeController < ContentController
2
4
  # Allow javascripts via Get request
3
5
  skip_before_action :verify_authenticity_token, only: :javascripts
4
6
 
5
7
  def stylesheets
6
- render_theme_item(:stylesheets, params[:filename], 'text/css; charset=utf-8')
8
+ render_theme_item(:stylesheets, params[:filename], "text/css; charset=utf-8")
7
9
  end
8
10
 
9
11
  def javascripts
10
- render_theme_item(:javascripts, params[:filename], 'text/javascript; charset=utf-8')
12
+ render_theme_item(:javascripts, params[:filename], "text/javascript; charset=utf-8")
11
13
  end
12
14
 
13
15
  def images
@@ -27,35 +29,35 @@ class ThemeController < ContentController
27
29
  private
28
30
 
29
31
  def render_theme_item(type, file, mime = nil)
30
- return render_not_found if file.split(%r{[\\/]}).include?('..')
32
+ return render_not_found if file.split(%r{[\\/]}).include?("..")
31
33
 
32
34
  src = this_blog.current_theme.path + "/#{type}/#{file}"
33
35
  return render_not_found unless File.exist? src
34
36
 
35
37
  mime ||= mime_for(file)
36
- send_file(src, type: mime, disposition: 'inline', stream: true)
38
+ send_file(src, type: mime, disposition: "inline", stream: true)
37
39
  end
38
40
 
39
41
  def render_not_found
40
- render plain: 'Not Found', status: 404
42
+ render plain: "Not Found", status: :not_found
41
43
  end
42
44
 
43
45
  def mime_for(filename)
44
46
  case filename.downcase
45
47
  when /\.js$/
46
- 'text/javascript'
48
+ "text/javascript"
47
49
  when /\.css$/
48
- 'text/css'
50
+ "text/css"
49
51
  when /\.gif$/
50
- 'image/gif'
52
+ "image/gif"
51
53
  when /(\.jpg|\.jpeg)$/
52
- 'image/jpeg'
54
+ "image/jpeg"
53
55
  when /\.png$/
54
- 'image/png'
56
+ "image/png"
55
57
  when /\.swf$/
56
- 'application/x-shockwave-flash'
58
+ "application/x-shockwave-flash"
57
59
  else
58
- 'application/binary'
60
+ "application/binary"
59
61
  end
60
62
  end
61
63
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class XmlController < BaseController
2
4
  def sitemap
3
5
  @items = []
@@ -1,19 +1,21 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Admin::BaseHelper
2
4
  include ActionView::Helpers::DateHelper
3
5
 
4
- def toggle_element(element, label = t('generic.change'))
6
+ def toggle_element(element, label = t("generic.change"))
5
7
  link_to label, "##{element}", data: { toggle: :collapse }
6
8
  end
7
9
 
8
10
  def class_for_admin_state(sidebar, this_position)
9
11
  case sidebar.admin_state
10
12
  when :active
11
- 'active alert-info'
13
+ "active alert-info"
12
14
  when :will_change_position
13
15
  if this_position == sidebar.active_position
14
- 'will_change ghost'
16
+ "will_change ghost"
15
17
  else
16
- 'will_change alert-warning'
18
+ "will_change alert-warning"
17
19
  end
18
20
  else
19
21
  raise sidebar.admin_state.inspect
@@ -22,13 +24,7 @@ module Admin::BaseHelper
22
24
 
23
25
  def text_filter_options
24
26
  TextFilter.all.map do |filter|
25
- [filter.description, filter]
26
- end
27
- end
28
-
29
- def text_filter_options_with_id
30
- TextFilter.all.map do |filter|
31
- [filter.description, filter.id]
27
+ [filter.description, filter.name]
32
28
  end
33
29
  end
34
30
 
@@ -39,37 +35,41 @@ module Admin::BaseHelper
39
35
  end
40
36
 
41
37
  def show_actions(item)
42
- content_tag(:div, class: 'action', style: '') do
38
+ tag.div(class: "action", style: "") do
43
39
  safe_join [button_to_edit(item),
44
40
  button_to_delete(item),
45
- button_to_short_url(item)], ' '
41
+ button_to_short_url(item)], " "
46
42
  end
47
43
  end
48
44
 
49
- def display_pagination(collection, cols, _first = '', _last = '')
45
+ def display_pagination(collection, cols, _first = "", _last = "")
50
46
  return if collection.count == 0
51
- content_tag(:tr) do
52
- content_tag(:td, paginate(collection), class: 'paginate', colspan: cols)
47
+
48
+ tag.tr do
49
+ tag.td(paginate(collection), class: "paginate", colspan: cols)
53
50
  end
54
51
  end
55
52
 
56
53
  def button_to_edit(item)
57
- link_to(content_tag(:span, '', class: 'glyphicon glyphicon-pencil'), { action: 'edit', id: item.id }, { class: 'btn btn-primary btn-xs btn-action' })
54
+ link_to(t("generic.edit"),
55
+ { action: "edit", id: item.id },
56
+ { class: "btn btn-primary btn-xs btn-action" })
58
57
  end
59
58
 
60
59
  def button_to_delete(item)
61
- confirm_text = t('admin.shared.destroy.are_you_sure',
62
- element: item.class.name.downcase)
63
- link_to(
64
- content_tag(:span, '', class: 'glyphicon glyphicon-trash'),
65
- { action: 'destroy', id: item.id },
66
- { class: 'btn btn-danger btn-xs btn-action', method: :delete,
67
- data: { confirm: confirm_text } })
60
+ confirm_text = t("admin.shared.destroy.are_you_sure",
61
+ element: item.class.model_name.human.downcase)
62
+ link_to(t("generic.delete"),
63
+ { action: "destroy", id: item.id },
64
+ { class: "btn btn-danger btn-xs btn-action", method: :delete,
65
+ data: { confirm: confirm_text } })
68
66
  end
69
67
 
70
68
  def button_to_short_url(item)
71
- return '' if item.short_url.nil?
72
- link_to(content_tag(:span, '', class: 'glyphicon glyphicon-link'), item.short_url, class: 'btn btn-success btn-xs btn-action')
69
+ return "" if item.short_url.nil?
70
+
71
+ link_to(t("generic.short_url"), item.short_url,
72
+ class: "btn btn-success btn-xs btn-action")
73
73
  end
74
74
 
75
75
  def twitter_available?(blog, user)
@@ -78,9 +78,9 @@ module Admin::BaseHelper
78
78
 
79
79
  def menu_item(name, url)
80
80
  if current_page? url
81
- content_tag(:li, link_to(name, '#'), class: 'active')
81
+ tag.li(link_to(name, "#"), class: "active")
82
82
  else
83
- content_tag(:li, link_to(name, url))
83
+ tag.li(link_to(name, url))
84
84
  end
85
85
  end
86
86
  end
@@ -1,42 +1,52 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Admin::FeedbackHelper
2
4
  def comment_class(state)
3
- return 'label-info' if state.to_s.casecmp('presumed_ham').zero?
4
- return 'label-warning' if state.to_s.casecmp('presumed_spam').zero?
5
- return 'label-success' if state.to_s.casecmp('ham').zero?
6
- 'label-danger'
5
+ return "label-info" if state.to_s.casecmp("presumed_ham").zero?
6
+ return "label-warning" if state.to_s.casecmp("presumed_spam").zero?
7
+ return "label-success" if state.to_s.casecmp("ham").zero?
8
+
9
+ "label-danger"
7
10
  end
8
11
 
9
- def show_feedback_actions(item, context = 'listing')
10
- return unless can? :manage, 'admin/feedback'
11
- content_tag(:div, class: 'action', style: '') do
12
- safe_join [
13
- content_tag(:small, change_status(item, context)),
14
- button_to_edit_comment(item),
15
- button_to_delete_comment(item),
16
- button_to_conversation(item)
17
- ], ' '
18
- end
12
+ def show_feedback_actions(item, context = "listing")
13
+ return unless can? :manage, "admin/feedback"
14
+
15
+ safe_join [
16
+ change_status(item, context),
17
+ button_to_edit_comment(item),
18
+ button_to_delete_comment(item),
19
+ button_to_conversation(item),
20
+ ], " "
19
21
  end
20
22
 
21
23
  def button_to_edit_comment(item)
22
- link_to(content_tag(:span, '', class: 'glyphicon glyphicon-pencil'), { controller: 'admin/feedback', action: 'edit', id: item.id }, { class: 'btn btn-primary btn-xs btn-action' })
24
+ link_to(t("generic.edit"),
25
+ { controller: "admin/feedback", action: "edit", id: item.id },
26
+ { class: "btn btn-primary btn-xs btn-action" })
23
27
  end
24
28
 
25
29
  def button_to_delete_comment(item)
26
- link_to(content_tag(:span, '', class: 'glyphicon glyphicon-trash'), { controller: 'admin/feedback', action: 'destroy', id: item.id }, { class: 'btn btn-danger btn-xs btn-action' })
30
+ link_to(t("generic.delete"),
31
+ { controller: "admin/feedback", action: "destroy", id: item.id },
32
+ { class: "btn btn-danger btn-xs btn-action" })
27
33
  end
28
34
 
29
35
  def button_to_conversation(item)
30
- link_to(content_tag(:span, '', class: 'glyphicon glyphicon-share-alt'), { controller: 'admin/feedback', action: 'article', id: item.article_id }, { class: 'btn btn-default btn-xs btn-action' })
36
+ link_to(t("generic.conversation"),
37
+ { controller: "admin/feedback", action: "article", id: item.article_id },
38
+ { class: "btn btn-default btn-xs btn-action" })
31
39
  end
32
40
 
33
- def change_status(item, context = 'listing')
34
- spammy = item.state.to_s.downcase =~ /spam/
35
- direction = spammy ? 'up' : 'down'
36
- button_type = spammy ? 'success' : 'warning'
41
+ def change_status(item, context = "listing")
42
+ spammy = item.state.to_s.downcase.include? "spam"
43
+ link_text = spammy ? t("generic.mark_as_ham") : t("generic.mark_as_spam")
44
+ button_type = spammy ? "success" : "warning"
37
45
 
38
- link_to(content_tag(:span, '', class: "glyphicon glyphicon-thumbs-#{direction}"),
39
- { controller: 'admin/feedback', action: 'change_state', id: item.id, context: context },
40
- { class: "btn btn-#{button_type} btn-xs btn-action", remote: true })
46
+ link_to(link_text,
47
+ { controller: "admin/feedback", action: "change_state",
48
+ id: item.id, context: context },
49
+ { class: "btn btn-#{button_type} btn-xs btn-action",
50
+ method: :post, remote: true })
41
51
  end
42
52
  end
@@ -1,8 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ArticlesHelper
2
4
  def tag_links(article)
3
5
  tag_arr = article.tags.map do |tag|
4
- link_to tag.display_name, tag.permalink_url(nil, true), rel: 'tag'
6
+ link_to tag.display_name, tag.permalink_url(nil, true), rel: "tag"
5
7
  end
6
- safe_join(tag_arr.sort, ', ')
8
+ safe_join(tag_arr.sort, ", ")
7
9
  end
8
10
  end
@@ -1,11 +1,14 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module AuthorsHelper
2
4
  include BlogHelper
3
5
 
4
6
  def display_profile_item(item, item_desc)
5
7
  return if item.blank?
8
+
6
9
  item = link_to(item, item) if is_url?(item)
7
- content_tag :li do
8
- safe_join([item_desc, item], ' ')
10
+ tag.li do
11
+ safe_join([item_desc, item], " ")
9
12
  end
10
13
  end
11
14
 
@@ -18,7 +21,7 @@ module AuthorsHelper
18
21
  def author_description(user)
19
22
  return if user.description.blank?
20
23
 
21
- content_tag(:div, user.description, id: 'author-description')
24
+ tag.div(user.description, id: "author-description")
22
25
  end
23
26
 
24
27
  def author_link(article)
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Methods added to this helper will be available to all templates in the application.
2
- require 'digest/sha1'
4
+ require "digest/sha1"
3
5
 
4
6
  module BaseHelper
5
7
  include BlogHelper
@@ -17,11 +19,12 @@ module BaseHelper
17
19
  rescue => e
18
20
  logger.error e
19
21
  logger.error e.backtrace.join("\n")
20
- I18n.t('errors.render_sidebar')
22
+ I18n.t("errors.render_sidebar")
21
23
  end
22
24
 
23
25
  def render_sidebar(sidebar)
24
- render_to_string(partial: sidebar.content_partial, locals: sidebar.to_locals_hash, layout: false)
26
+ render_to_string(partial: sidebar.content_partial, locals: sidebar.to_locals_hash,
27
+ layout: false)
25
28
  end
26
29
 
27
30
  def themeable_stylesheet_link_tag(name)
@@ -38,10 +41,11 @@ module BaseHelper
38
41
  controller.send(:render_to_string, *args, &block)
39
42
  end
40
43
 
41
- def link_to_permalink(item, title, anchor = nil, style = nil, nofollow = nil, only_path = false)
44
+ def link_to_permalink(item, title, anchor = nil, style = nil, nofollow = nil,
45
+ only_path = false)
42
46
  options = {}
43
47
  options[:class] = style if style
44
- options[:rel] = 'nofollow' if nofollow
48
+ options[:rel] = "nofollow" if nofollow
45
49
  url = item.permalink_url(anchor, only_path)
46
50
  if url
47
51
  link_to title, url, options
@@ -54,9 +58,10 @@ module BaseHelper
54
58
  begin
55
59
  avatar_class = this_blog.plugin_avatar.constantize
56
60
  rescue NameError
57
- return ''
61
+ return ""
58
62
  end
59
- return '' unless avatar_class.respond_to?(:get_avatar)
63
+ return "" unless avatar_class.respond_to?(:get_avatar)
64
+
60
65
  avatar_class.get_avatar(options)
61
66
  end
62
67
 
@@ -66,18 +71,21 @@ module BaseHelper
66
71
 
67
72
  def markup_help_popup(markup, text)
68
73
  if markup && markup.commenthelp.size > 1
69
- link_to text, url_for(controller: 'articles', action: 'markup_help', id: markup.id), onclick: "return popup(this, 'Publify Markup Help')"
74
+ link_to(text,
75
+ url_for(controller: "articles", action: "markup_help", id: markup.name),
76
+ onclick: "return popup(this, 'Publify Markup Help')")
70
77
  else
71
- ''
78
+ ""
72
79
  end
73
80
  end
74
81
 
75
82
  def onhover_show_admin_tools(type, id = nil)
76
- admin_id = "#admin_#{[type, id].compact.join('_')}"
83
+ admin_id = "#admin_#{[type, id].compact.join("_")}"
77
84
  tag = []
78
- tag << %{ onmouseover="if (getCookie('publify_user_profile') == 'admin') { $('#{admin_id}').show(); }" }
85
+ tag << %{ onmouseover="if (getCookie('publify_user_profile') == 'admin')\
86
+ { $('#{admin_id}').show(); }" }
79
87
  tag << %{ onmouseout="$('#{admin_id}').hide();" }
80
- safe_join(tag, ' ')
88
+ safe_join(tag, " ")
81
89
  end
82
90
 
83
91
  def feed_title
@@ -94,51 +102,55 @@ module BaseHelper
94
102
  content.html(what)
95
103
  end
96
104
 
97
- def display_user_avatar(user, size = 'avatar', klass = 'alignleft')
105
+ def display_user_avatar(user, size = "avatar", klass = "alignleft")
98
106
  if user.resource.present?
99
107
  avatar_path = case size
100
- when 'thumb'
108
+ when "thumb"
101
109
  user.resource.upload.thumb.url
102
- when 'medium'
110
+ when "medium"
103
111
  user.resource.upload.medium.url
104
- when 'large'
112
+ when "large"
105
113
  user.resource.upload.large.url
106
114
  else
107
115
  user.resource.upload.avatar.url
108
116
  end
109
117
  return if avatar_path.nil?
118
+
110
119
  avatar_url = this_blog.file_url(avatar_path)
111
120
  elsif user.twitter_profile_image.present?
112
121
  avatar_url = user.twitter_profile_image
113
122
  end
114
123
  return unless avatar_url
124
+
115
125
  image_tag(avatar_url, alt: user.nickname, class: klass)
116
126
  end
117
127
 
118
128
  def author_picture(status)
119
129
  return if status.user.twitter_profile_image.blank?
120
130
 
121
- image_tag(status.user.twitter_profile_image, class: 'alignleft', alt: status.user.nickname)
131
+ image_tag(status.user.twitter_profile_image, class: "alignleft",
132
+ alt: status.user.nickname)
122
133
  end
123
134
 
124
135
  def page_header_includes
125
136
  content_array.map(&:whiteboard).map do |w|
126
- w.select { |k, _v| k =~ /^page_header_/ }.map do |_, v|
137
+ w.select { |k, _v| k.start_with?("page_header_") }.map do |_, v|
127
138
  v = v.chomp
128
139
  # trim the same number of spaces from the beginning of each line
129
140
  # this way plugins can indent nicely without making ugly source output
130
- spaces = /\A[ \t]*/.match(v)[0].gsub(/\t/, ' ')
131
- v.gsub!(/^#{spaces}/, ' ') # add 2 spaces to line up with the assumed position of the surrounding tags
141
+ spaces = /\A[ \t]*/.match(v)[0].gsub(/\t/, " ")
142
+ # add 2 spaces to line up with the assumed position of the surrounding tags
143
+ v.gsub!(/^#{spaces}/, " ")
132
144
  end
133
145
  end.flatten.uniq.join("\n")
134
146
  end
135
147
 
136
148
  def feed_atom
137
- feed_for('atom')
149
+ feed_for("atom")
138
150
  end
139
151
 
140
152
  def feed_rss
141
- feed_for('rss')
153
+ feed_for("rss")
142
154
  end
143
155
 
144
156
  def content_array
@@ -163,40 +175,43 @@ module BaseHelper
163
175
 
164
176
  def display_date_and_time(timestamp)
165
177
  return if timestamp.blank?
166
- if this_blog.date_format == 'setting_date_format_distance_of_time_in_words'
178
+
179
+ if this_blog.date_format == "setting_date_format_distance_of_time_in_words"
167
180
  timeago_tag timestamp, date_only: false
168
181
  else
169
- "#{display_date(timestamp)} #{t('helper.at')} #{display_time(timestamp)}"
182
+ "#{display_date(timestamp)} #{t("helper.at")} #{display_time(timestamp)}"
170
183
  end
171
184
  end
172
185
 
173
186
  def show_meta_keyword
174
187
  return unless this_blog.use_meta_keyword
175
- meta_tag 'keywords', @keywords if @keywords.present?
188
+
189
+ meta_tag "keywords", @keywords if @keywords.present?
176
190
  end
177
191
 
178
192
  def stop_index_robots?(blog)
179
193
  stop = (params[:year].present? || params[:page].present?)
180
- stop = blog.unindex_tags if controller_name == 'tags'
181
- stop = blog.unindex_categories if controller_name == 'categories'
194
+ stop = blog.unindex_tags if controller_name == "tags"
195
+ stop = blog.unindex_categories if controller_name == "categories"
182
196
  stop
183
197
  end
184
198
 
185
199
  def get_reply_context_url(reply)
186
- link_to(reply['user']['name'], reply['user']['entities']['url']['urls'][0]['expanded_url'])
200
+ link_to(reply["user"]["name"],
201
+ reply["user"]["entities"]["url"]["urls"][0]["expanded_url"])
187
202
  rescue
188
- link_to(reply['user']['name'], "https://twitter.com/#{reply['user']['name']}")
203
+ link_to(reply["user"]["name"], "https://twitter.com/#{reply["user"]["name"]}")
189
204
  end
190
205
 
191
206
  def get_reply_context_twitter_link(reply)
192
- link_to(display_date_and_time(reply['created_at'].to_time.in_time_zone),
193
- "https://twitter.com/#{reply['user']['screen_name']}/status/#{reply['id_str']}")
207
+ link_to(display_date_and_time(reply["created_at"].to_time.in_time_zone),
208
+ "https://twitter.com/#{reply["user"]["screen_name"]}/status/#{reply["id_str"]}")
194
209
  end
195
210
 
196
211
  private
197
212
 
198
213
  def feed_for(type)
199
- if params[:action] == 'search'
214
+ if params[:action] == "search"
200
215
  url_for(only_path: false, format: type, q: params[:q])
201
216
  elsif !@article.nil?
202
217
  @article.feed_url(type)
@@ -211,7 +226,8 @@ module BaseHelper
211
226
  # show the excerpt, or else we show the body
212
227
  def fetch_html_content_for_feeds(item, this_blog)
213
228
  if item.password_protected?
214
- "<p>This article is password protected. Please <a href='#{item.permalink_url}'>fill in your password</a> to read it</p>"
229
+ "<p>This article is password protected. Please " \
230
+ "<a href='#{item.permalink_url}'>fill in your password</a> to read it</p>"
215
231
  elsif this_blog.hide_extended_on_rss
216
232
  if item.excerpt? && !item.excerpt.empty?
217
233
  item.excerpt
@@ -235,7 +251,7 @@ module BaseHelper
235
251
  if this_blog.dofollowify
236
252
  link_to(text, url)
237
253
  else
238
- link_to(text, url, rel: 'nofollow')
254
+ link_to(text, url, rel: "nofollow")
239
255
  end
240
256
  end
241
257
  end