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
  module ContentBase
2
4
  def self.included(base)
3
5
  base.extend ClassMethods
@@ -24,7 +26,7 @@ module ContentBase
24
26
  elsif html_map(field)
25
27
  generate_html(field)
26
28
  else
27
- raise "Unknown field: #{field.inspect} in content.html"
29
+ raise ArgumentError, "Field #{field.inspect} is not valid for #{self.class}"
28
30
  end
29
31
  end
30
32
 
@@ -52,7 +54,7 @@ module ContentBase
52
54
  end
53
55
 
54
56
  def excerpt_text(length = 160)
55
- text = if respond_to?(:excerpt) && (excerpt || '') != ''
57
+ text = if respond_to?(:excerpt) && (excerpt || "") != ""
56
58
  generate_html(:excerpt, excerpt)
57
59
  else
58
60
  html(:all)
@@ -61,7 +63,11 @@ module ContentBase
61
63
  text = text.strip_html
62
64
 
63
65
  text.slice(0, length) +
64
- (text.length > length ? '...' : '')
66
+ (text.length > length ? "..." : "")
67
+ end
68
+
69
+ def text_filter
70
+ TextFilter.make_filter(text_filter_name)
65
71
  end
66
72
 
67
73
  # The default text filter. Generally, this is the filter specified by blog.text_filter,
@@ -76,7 +82,7 @@ module ContentBase
76
82
  end
77
83
 
78
84
  def default_order
79
- 'published_at DESC'
85
+ "published_at DESC"
80
86
  end
81
87
  end
82
88
  end
@@ -1,12 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'aasm'
4
- require 'akismet'
3
+ require "aasm"
4
+ require "akismet"
5
5
 
6
- class Feedback < ActiveRecord::Base
7
- self.table_name = 'feedback'
6
+ class Feedback < ApplicationRecord
7
+ self.table_name = "feedback"
8
8
 
9
- belongs_to :text_filter, optional: true
10
9
  belongs_to :article, touch: true
11
10
 
12
11
  include PublifyGuid
@@ -21,17 +20,17 @@ class Feedback < ActiveRecord::Base
21
20
  validate :feedback_not_closed, on: :create
22
21
  validates :article, presence: true
23
22
 
24
- before_create :create_guid, :article_allows_this_feedback
25
23
  before_save :correct_url, :classify_content
24
+ before_create :create_guid, :article_allows_this_feedback
26
25
 
27
26
  # TODO: Rename so it doesn't sound like only approved ham
28
27
  scope :ham, -> { where(state: %w(presumed_ham ham)) }
29
28
 
30
- scope :spam, -> { where(state: 'spam') }
31
- scope :created_since, ->(time) { ham.where('created_at > ?', time) }
32
- scope :presumed_ham, -> { where(state: 'presumed_ham') }
33
- scope :presumed_spam, -> { where(state: 'presumed_spam') }
34
- scope :unapproved, -> { where(state: ['presumed_spam', 'presumed_ham']) }
29
+ scope :spam, -> { where(state: "spam") }
30
+ scope :created_since, ->(time) { ham.where("created_at > ?", time) }
31
+ scope :presumed_ham, -> { where(state: "presumed_ham") }
32
+ scope :presumed_spam, -> { where(state: "presumed_spam") }
33
+ scope :unapproved, -> { where(state: ["presumed_spam", "presumed_ham"]) }
35
34
 
36
35
  scope :published, -> { ham }
37
36
  scope :oldest_first, -> { order(:created_at) }
@@ -68,6 +67,7 @@ class Feedback < ActiveRecord::Base
68
67
  end
69
68
  end
70
69
 
70
+ # FIXME: Inline this method
71
71
  def self.paginated(page, per_page)
72
72
  page(page).per(per_page)
73
73
  end
@@ -96,7 +96,8 @@ class Feedback < ActiveRecord::Base
96
96
 
97
97
  def correct_url
98
98
  return if url.blank?
99
- self.url = 'http://' + url.to_s unless url =~ %r{^https?://}
99
+
100
+ self.url = "http://#{url}" unless %r{^https?://}.match?(url)
100
101
  end
101
102
 
102
103
  def article_allows_this_feedback
@@ -156,13 +157,13 @@ class Feedback < ActiveRecord::Base
156
157
  end
157
158
 
158
159
  def change_state!
159
- result = ''
160
+ result = ""
160
161
  if spam? || presumed_spam?
161
162
  mark_as_ham!
162
- result = 'ham'
163
+ result = "ham"
163
164
  else
164
165
  mark_as_spam!
165
- result = 'spam'
166
+ result = "spam"
166
167
  end
167
168
  result
168
169
  end
@@ -182,6 +183,7 @@ class Feedback < ActiveRecord::Base
182
183
 
183
184
  def report_as_spam
184
185
  return if akismet.nil?
186
+
185
187
  begin
186
188
  Timeout.timeout(5) do
187
189
  akismet.submit_spam(ip, user_agent, akismet_options)
@@ -193,6 +195,7 @@ class Feedback < ActiveRecord::Base
193
195
 
194
196
  def report_as_ham
195
197
  return if akismet.nil?
198
+
196
199
  begin
197
200
  Timeout.timeout(5) do
198
201
  akismet.ham(ip, user_agent, akismet_options)
@@ -203,7 +206,7 @@ class Feedback < ActiveRecord::Base
203
206
  end
204
207
 
205
208
  def feedback_not_closed
206
- errors.add(:article_id, 'Comment are closed') if article.comments_closed?
209
+ errors.add(:article_id, "Comment are closed") if article.comments_closed?
207
210
  end
208
211
 
209
212
  def send_notifications
@@ -232,9 +235,10 @@ class Feedback < ActiveRecord::Base
232
235
 
233
236
  def akismet_client
234
237
  return nil if blog.sp_akismet_key.blank?
238
+
235
239
  client = Akismet::Client.new(blog.sp_akismet_key, blog.base_url)
236
240
  begin
237
- return client.verify_key ? client : nil
241
+ client.verify_key ? client : nil
238
242
  rescue SocketError
239
243
  nil
240
244
  end
@@ -1,9 +1,10 @@
1
- # coding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  class MetaSidebar < Sidebar
4
- description "This widget just displays links to Publify main site, this blog's admin and RSS."
4
+ description "This widget just displays links to Publify main site," \
5
+ " this blog's admin and RSS."
5
6
 
6
- setting :title, 'Meta'
7
+ setting :title, "Meta"
7
8
  end
8
9
 
9
10
  SidebarRegistry.register_sidebar MetaSidebar
data/app/models/note.rb CHANGED
@@ -1,27 +1,29 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Note < Content
2
- require 'twitter'
3
- require 'json'
4
- require 'uri'
4
+ require "twitter"
5
+ require "json"
6
+ require "uri"
5
7
  include PublifyGuid
6
8
  include ConfigManager
7
9
 
8
10
  serialize :settings, Hash
9
11
 
10
- setting :twitter_id, :string, ''
11
- setting :in_reply_to_status_id, :string, ''
12
+ setting :twitter_id, :string, ""
13
+ setting :in_reply_to_status_id, :string, ""
12
14
  setting :in_reply_to_protected, :boolean, false
13
- setting :in_reply_to_message, :string, ''
15
+ setting :in_reply_to_message, :string, ""
14
16
 
15
17
  validates :body, presence: true
16
18
  validates :permalink, :guid, uniqueness: true
17
19
 
18
- after_create :set_permalink, :shorten_url
19
20
  before_create :create_guid
21
+ after_create :set_permalink, :shorten_url
20
22
 
21
23
  scope :published, lambda {
22
- where(state: 'published').where('published_at <= ?', Time.zone.now).order(default_order)
24
+ where(state: "published").where("published_at <= ?", Time.zone.now).order(default_order)
23
25
  }
24
- default_scope { order('published_at DESC') }
26
+ default_scope { order("published_at DESC") }
25
27
 
26
28
  TWITTER_FTP_URL_LENGTH = 19
27
29
  TWITTER_HTTP_URL_LENGTH = 20
@@ -46,10 +48,10 @@ class Note < Content
46
48
  end
47
49
 
48
50
  def truncate(message, length)
49
- if message[length + 1] == ' '
51
+ if message[length + 1] == " "
50
52
  message[0..length]
51
53
  else
52
- message[0..(message[0..length].rindex(' ') - 1)]
54
+ message[0..(message[0..length].rindex(" ") - 1)]
53
55
  end
54
56
  end
55
57
 
@@ -65,7 +67,7 @@ class Note < Content
65
67
 
66
68
  # FIXME: This breaks if the user changes or deletes their handle.
67
69
  def twitter_url
68
- File.join('https://twitter.com', user.twitter, 'status', twitter_id)
70
+ File.join("https://twitter.com", user.twitter, "status", twitter_id)
69
71
  end
70
72
 
71
73
  def send_to_twitter
@@ -81,7 +83,7 @@ class Note < Content
81
83
 
82
84
  begin
83
85
  options = {}
84
- if in_reply_to_status_id && in_reply_to_status_id != ''
86
+ if in_reply_to_status_id && in_reply_to_status_id != ""
85
87
  options = { in_reply_to_status_id: in_reply_to_status_id }
86
88
  self.in_reply_to_message = twitter.status(in_reply_to_status_id).to_json
87
89
  end
@@ -109,12 +111,11 @@ class Note < Content
109
111
 
110
112
  def permalink_url(anchor = nil, only_path = false)
111
113
  blog.url_for(
112
- controller: '/notes',
113
- action: 'show',
114
+ controller: "/notes",
115
+ action: "show",
114
116
  permalink: permalink,
115
117
  anchor: anchor,
116
- only_path: only_path
117
- )
118
+ only_path: only_path)
118
119
  end
119
120
 
120
121
  def short_link
@@ -123,11 +124,11 @@ class Note < Content
123
124
  end
124
125
 
125
126
  def prefix
126
- blog.shortener_url.sub(/^https?\:\/\//, '')
127
+ blog.shortener_url.sub(%r{^https?://}, "")
127
128
  end
128
129
 
129
130
  def published?
130
- state == 'published'
131
+ state == "published"
131
132
  end
132
133
 
133
134
  private
@@ -136,13 +137,13 @@ class Note < Content
136
137
  uris = URI.extract(message, %w(http https ftp))
137
138
  uris << prefix
138
139
  uris.each do |uri|
139
- payload = case uri.split(':')[0]
140
- when 'https'
141
- '-' * TWITTER_HTTPS_URL_LENGTH
142
- when 'ftp'
143
- '-' * TWITTER_FTP_URL_LENGTH
140
+ payload = case uri.split(":")[0]
141
+ when "https"
142
+ "-" * TWITTER_HTTPS_URL_LENGTH
143
+ when "ftp"
144
+ "-" * TWITTER_FTP_URL_LENGTH
144
145
  else
145
- '-' * TWITTER_HTTP_URL_LENGTH
146
+ "-" * TWITTER_HTTP_URL_LENGTH
146
147
  end
147
148
  message = message.gsub(uri, payload)
148
149
  end
data/app/models/page.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Page < Content
2
4
  validates :title, :body, presence: true
3
5
  validates :name, uniqueness: true
@@ -5,7 +7,7 @@ class Page < Content
5
7
  include ConfigManager
6
8
 
7
9
  serialize :settings, Hash
8
- setting :password, :string, ''
10
+ setting :password, :string, ""
9
11
 
10
12
  before_save :set_permalink
11
13
  after_save :shorten_url
@@ -17,25 +19,24 @@ class Page < Content
17
19
  content_fields :body
18
20
 
19
21
  def self.default_order
20
- 'title ASC'
22
+ "title ASC"
21
23
  end
22
24
 
23
25
  def permalink_url(anchor = nil, only_path = false)
24
26
  blog.url_for(
25
- controller: '/articles',
26
- action: 'view_page',
27
+ controller: "/articles",
28
+ action: "view_page",
27
29
  name: name,
28
30
  anchor: anchor,
29
- only_path: only_path
30
- )
31
+ only_path: only_path)
31
32
  end
32
33
 
33
34
  def publish!
34
- self.state = 'published'
35
+ self.state = "published"
35
36
  save!
36
37
  end
37
38
 
38
39
  def published?
39
- state == 'published'
40
+ state == "published"
40
41
  end
41
42
  end
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class PageSidebar < Sidebar
2
- display_name 'Page'
3
- description 'Show pages for this blog'
4
+ display_name "Page"
5
+ description "Show pages for this blog"
4
6
 
5
7
  setting :maximum_pages, 10
6
8
 
data/app/models/ping.rb CHANGED
@@ -1,3 +1,5 @@
1
- class Ping < ActiveRecord::Base
1
+ # frozen_string_literal: true
2
+
3
+ class Ping < ApplicationRecord
2
4
  belongs_to :article
3
5
  end
@@ -1,13 +1,13 @@
1
- # coding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
- class PostType < ActiveRecord::Base
3
+ class PostType < ApplicationRecord
4
4
  validates :name, uniqueness: true
5
5
  validates :name, presence: true
6
6
  validate :name_is_not_read
7
7
  before_save :sanitize_title
8
8
 
9
9
  def name_is_not_read
10
- errors.add(:name, I18n.t('errors.article_type_already_exist')) if name == 'read'
10
+ errors.add(:name, I18n.t("errors.article_type_already_exist")) if name == "read"
11
11
  end
12
12
 
13
13
  def sanitize_title
@@ -1,5 +1,7 @@
1
- class Redirect < ActiveRecord::Base
2
- belongs_to :contents, optional: true, touch: true
1
+ # frozen_string_literal: true
2
+
3
+ class Redirect < ApplicationRecord
4
+ belongs_to :content, optional: true, touch: true
3
5
  belongs_to :blog
4
6
 
5
7
  validates :from_path, uniqueness: true
@@ -8,9 +10,13 @@ class Redirect < ActiveRecord::Base
8
10
 
9
11
  def full_to_path
10
12
  path = to_path
11
- return path if path =~ /^(https?):\/\/([^\/]*)(.*)/
13
+ # FIXME: Unify HTTP URI matchers
14
+ return path if %r{^(https?)://([^/]*)(.*)}.match?(path)
15
+
12
16
  url_root = blog.root_path
13
- path = File.join(url_root, path) unless url_root.nil? || path[0, url_root.length] == url_root
17
+ unless url_root.nil? || path[0, url_root.length] == url_root
18
+ path = File.join(url_root, path)
19
+ end
14
20
  path
15
21
  end
16
22
 
@@ -23,7 +29,7 @@ class Redirect < ActiveRecord::Base
23
29
  end
24
30
 
25
31
  def to_url
26
- raise 'Use #from_url'
32
+ raise "Use #from_url"
27
33
  end
28
34
 
29
35
  def from_url
@@ -33,8 +39,8 @@ class Redirect < ActiveRecord::Base
33
39
  private
34
40
 
35
41
  def random_token
36
- characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890'
37
- temp_token = ''
42
+ characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890"
43
+ temp_token = ""
38
44
  srand
39
45
  6.times do
40
46
  pos = rand(characters.length)
@@ -1,4 +1,6 @@
1
- class Redirection < ActiveRecord::Base
1
+ # frozen_string_literal: true
2
+
3
+ class Redirection < ApplicationRecord
2
4
  belongs_to :content
3
5
  belongs_to :redirect
4
6
  end
@@ -1,7 +1,9 @@
1
- require 'carrierwave'
2
- require 'carrierwave/orm/activerecord'
1
+ # frozen_string_literal: true
3
2
 
4
- class Resource < ActiveRecord::Base
3
+ require "carrierwave"
4
+ require "carrierwave/orm/activerecord"
5
+
6
+ class Resource < ApplicationRecord
5
7
  belongs_to :blog
6
8
  belongs_to :content, optional: true
7
9
 
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class SearchSidebar < Sidebar
2
- description 'Adds basic search sidebar in your Publify blog'
4
+ description "Adds basic search sidebar in your Publify blog"
3
5
 
4
- setting :title, 'Search'
6
+ setting :title, "Search"
5
7
  end
6
8
 
7
9
  SidebarRegistry.register_sidebar SearchSidebar