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,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,18 +1,20 @@
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
- def index
6
- end
7
+ def index; end
7
8
 
8
9
  def create
9
10
  this_blog.blog_name = params[:setting][:blog_name]
10
11
  this_blog.base_url = blog_base_url
11
12
 
12
- @user = User.new(login: 'admin',
13
+ @user = User.new(login: "admin",
13
14
  email: params[:setting][:email],
14
15
  password: params[:setting][:password],
15
- nickname: 'Publify Admin')
16
+ text_filter_name: this_blog.text_filter,
17
+ nickname: "Publify Admin")
16
18
  @user.name = @user.login
17
19
 
18
20
  unless this_blog.save && @user.save
@@ -35,24 +37,25 @@ class SetupController < BaseController
35
37
  private
36
38
 
37
39
  def create_first_post(user)
38
- this_blog.articles.build(title: I18n.t('setup.article.title'),
40
+ this_blog.articles.build(title: I18n.t("setup.article.title"),
39
41
  author: user.login,
40
- body: I18n.t('setup.article.body'),
42
+ body: I18n.t("setup.article.body"),
41
43
  allow_comments: 1,
42
44
  allow_pings: 1,
43
45
  user: user).publish!
44
46
  end
45
47
 
46
48
  def create_first_page(user)
47
- this_blog.pages.create(name: 'about',
48
- state: 'published',
49
- title: I18n.t('setup.page.about'),
49
+ this_blog.pages.create(name: "about",
50
+ state: "published",
51
+ title: I18n.t("setup.page.about"),
50
52
  user: user,
51
- body: I18n.t('setup.page.body'))
53
+ body: I18n.t("setup.page.body"))
52
54
  end
53
55
 
54
56
  def check_config
55
57
  return unless this_blog.configured?
56
- redirect_to controller: 'articles', action: 'index'
58
+
59
+ redirect_to controller: "articles", action: "index"
57
60
  end
58
61
  end
@@ -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,10 +1,15 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ThemeController < ContentController
4
+ # Allow javascripts via Get request
5
+ skip_before_action :verify_authenticity_token, only: :javascripts
6
+
2
7
  def stylesheets
3
- render_theme_item(:stylesheets, params[:filename], 'text/css; charset=utf-8')
8
+ render_theme_item(:stylesheets, params[:filename], "text/css; charset=utf-8")
4
9
  end
5
10
 
6
- def javascript
7
- render_theme_item(:javascript, params[:filename], 'text/javascript; charset=utf-8')
11
+ def javascripts
12
+ render_theme_item(:javascripts, params[:filename], "text/javascript; charset=utf-8")
8
13
  end
9
14
 
10
15
  def images
@@ -24,35 +29,35 @@ class ThemeController < ContentController
24
29
  private
25
30
 
26
31
  def render_theme_item(type, file, mime = nil)
27
- return render_not_found if file.split(%r{[\\/]}).include?('..')
32
+ return render_not_found if file.split(%r{[\\/]}).include?("..")
28
33
 
29
34
  src = this_blog.current_theme.path + "/#{type}/#{file}"
30
35
  return render_not_found unless File.exist? src
31
36
 
32
37
  mime ||= mime_for(file)
33
- send_file(src, type: mime, disposition: 'inline', stream: true)
38
+ send_file(src, type: mime, disposition: "inline", stream: true)
34
39
  end
35
40
 
36
41
  def render_not_found
37
- render plain: 'Not Found', status: 404
42
+ render plain: "Not Found", status: :not_found
38
43
  end
39
44
 
40
45
  def mime_for(filename)
41
46
  case filename.downcase
42
47
  when /\.js$/
43
- 'text/javascript'
48
+ "text/javascript"
44
49
  when /\.css$/
45
- 'text/css'
50
+ "text/css"
46
51
  when /\.gif$/
47
- 'image/gif'
52
+ "image/gif"
48
53
  when /(\.jpg|\.jpeg)$/
49
- 'image/jpeg'
54
+ "image/jpeg"
50
55
  when /\.png$/
51
- 'image/png'
56
+ "image/png"
52
57
  when /\.swf$/
53
- 'application/x-shockwave-flash'
58
+ "application/x-shockwave-flash"
54
59
  else
55
- 'application/binary'
60
+ "application/binary"
56
61
  end
57
62
  end
58
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,38 +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 } }
68
- )
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 } })
69
66
  end
70
67
 
71
68
  def button_to_short_url(item)
72
- return '' if item.short_url.nil?
73
- 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")
74
73
  end
75
74
 
76
75
  def twitter_available?(blog, user)
@@ -79,9 +78,9 @@ module Admin::BaseHelper
79
78
 
80
79
  def menu_item(name, url)
81
80
  if current_page? url
82
- content_tag(:li, link_to(name, '#'), class: 'active')
81
+ tag.li(link_to(name, "#"), class: "active")
83
82
  else
84
- content_tag(:li, link_to(name, url))
83
+ tag.li(link_to(name, url))
85
84
  end
86
85
  end
87
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,22 +21,10 @@ 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)
25
- return h(article.author) if just_author?(article.user)
26
- return h(article.user.name) if just_name?(article.user)
27
- content_tag(:a, href: "mailto:#{h article.user.email}") { h(article.user.name) }
28
- end
29
-
30
- private
31
-
32
- def just_author?(author)
33
- author.nil? || author.name.blank?
34
- end
35
-
36
- def just_name?(author)
37
- author.present? && !this_blog.link_to_author
28
+ h(article.author_name)
38
29
  end
39
30
  end