publify_core 9.0.0 → 9.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (360) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +92 -37
  3. data/app/assets/javascripts/bootstrap-sprockets.js +8 -0
  4. data/app/assets/javascripts/bootstrap/affix.js +164 -0
  5. data/app/assets/javascripts/bootstrap/alert.js +95 -0
  6. data/app/assets/javascripts/bootstrap/button.js +125 -0
  7. data/app/assets/javascripts/bootstrap/collapse.js +212 -0
  8. data/app/assets/javascripts/bootstrap/dropdown.js +165 -0
  9. data/app/assets/javascripts/bootstrap/modal.js +358 -0
  10. data/app/assets/javascripts/bootstrap/tab.js +155 -0
  11. data/app/assets/javascripts/bootstrap/transition.js +59 -0
  12. data/app/assets/javascripts/lightbox.js +4 -4
  13. data/app/assets/javascripts/publify_admin.js +1 -35
  14. data/app/assets/stylesheets/_bootstrap-compass.scss +9 -0
  15. data/app/assets/stylesheets/_bootstrap-mincer.scss +19 -0
  16. data/app/assets/stylesheets/_bootstrap-sprockets.scss +9 -0
  17. data/app/assets/stylesheets/_bootstrap.scss +42 -0
  18. data/app/assets/stylesheets/administration_structure.css.scss +1 -45
  19. data/app/assets/stylesheets/bootstrap/_alerts.scss +73 -0
  20. data/app/assets/stylesheets/bootstrap/_button-groups.scss +242 -0
  21. data/app/assets/stylesheets/bootstrap/_buttons.scss +168 -0
  22. data/app/assets/stylesheets/bootstrap/_close.scss +37 -0
  23. data/app/assets/stylesheets/bootstrap/_code.scss +69 -0
  24. data/app/assets/stylesheets/bootstrap/_component-animations.scss +38 -0
  25. data/app/assets/stylesheets/bootstrap/_dropdowns.scss +213 -0
  26. data/app/assets/stylesheets/bootstrap/_forms.scss +586 -0
  27. data/app/assets/stylesheets/bootstrap/_grid.scss +94 -0
  28. data/app/assets/stylesheets/bootstrap/_labels.scss +66 -0
  29. data/app/assets/stylesheets/bootstrap/_media.scss +66 -0
  30. data/app/assets/stylesheets/bootstrap/_mixins.scss +37 -0
  31. data/app/assets/stylesheets/bootstrap/_modals.scss +150 -0
  32. data/app/assets/stylesheets/bootstrap/_navbar.scss +479 -0
  33. data/app/assets/stylesheets/bootstrap/_navs.scss +242 -0
  34. data/app/assets/stylesheets/bootstrap/_normalize.scss +427 -0
  35. data/app/assets/stylesheets/bootstrap/_pagination.scss +86 -0
  36. data/app/assets/stylesheets/bootstrap/_panels.scss +222 -0
  37. data/app/assets/stylesheets/bootstrap/_print.scss +99 -0
  38. data/app/assets/stylesheets/bootstrap/_scaffolding.scss +160 -0
  39. data/app/assets/stylesheets/bootstrap/_tables.scss +234 -0
  40. data/app/assets/stylesheets/bootstrap/_theme.scss +224 -0
  41. data/app/assets/stylesheets/bootstrap/_type.scss +296 -0
  42. data/app/assets/stylesheets/bootstrap/_utilities.scss +55 -0
  43. data/app/assets/stylesheets/bootstrap/_variables.scss +638 -0
  44. data/app/assets/stylesheets/bootstrap/_wells.scss +29 -0
  45. data/app/assets/stylesheets/bootstrap/mixins/_alerts.scss +15 -0
  46. data/app/assets/stylesheets/bootstrap/mixins/_background-variant.scss +12 -0
  47. data/app/assets/stylesheets/bootstrap/mixins/_border-radius.scss +18 -0
  48. data/app/assets/stylesheets/bootstrap/mixins/_buttons.scss +56 -0
  49. data/app/assets/stylesheets/bootstrap/mixins/_center-block.scss +7 -0
  50. data/app/assets/stylesheets/bootstrap/mixins/_clearfix.scss +22 -0
  51. data/app/assets/stylesheets/bootstrap/mixins/_forms.scss +82 -0
  52. data/app/assets/stylesheets/bootstrap/mixins/_gradients.scss +56 -0
  53. data/app/assets/stylesheets/bootstrap/mixins/_grid-framework.scss +81 -0
  54. data/app/assets/stylesheets/bootstrap/mixins/_grid.scss +122 -0
  55. data/app/assets/stylesheets/bootstrap/mixins/_hide-text.scss +21 -0
  56. data/app/assets/stylesheets/bootstrap/mixins/_image.scss +28 -0
  57. data/app/assets/stylesheets/bootstrap/mixins/_labels.scss +12 -0
  58. data/app/assets/stylesheets/bootstrap/mixins/_nav-divider.scss +10 -0
  59. data/app/assets/stylesheets/bootstrap/mixins/_nav-vertical-align.scss +9 -0
  60. data/app/assets/stylesheets/bootstrap/mixins/_opacity.scss +7 -0
  61. data/app/assets/stylesheets/bootstrap/mixins/_pagination.scss +24 -0
  62. data/app/assets/stylesheets/bootstrap/mixins/_panels.scss +20 -0
  63. data/app/assets/stylesheets/bootstrap/mixins/_reset-filter.scss +8 -0
  64. data/app/assets/stylesheets/bootstrap/mixins/_resize.scss +6 -0
  65. data/app/assets/stylesheets/bootstrap/mixins/_responsive-visibility.scss +17 -0
  66. data/app/assets/stylesheets/bootstrap/mixins/_size.scss +10 -0
  67. data/app/assets/stylesheets/bootstrap/mixins/_tab-focus.scss +9 -0
  68. data/app/assets/stylesheets/bootstrap/mixins/_table-row.scss +28 -0
  69. data/app/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss +12 -0
  70. data/app/assets/stylesheets/bootstrap/mixins/_text-overflow.scss +8 -0
  71. data/app/assets/stylesheets/bootstrap/mixins/_vendor-prefixes.scss +222 -0
  72. data/app/assets/stylesheets/lightbox.css +3 -3
  73. data/app/assets/stylesheets/publify_admin.css.scss +0 -1
  74. data/app/controllers/accounts_controller.rb +2 -0
  75. data/app/controllers/admin/base_controller.rb +8 -16
  76. data/app/controllers/admin/content_controller.rb +38 -36
  77. data/app/controllers/admin/dashboard_controller.rb +16 -65
  78. data/app/controllers/admin/feedback_controller.rb +45 -37
  79. data/app/controllers/admin/notes_controller.rb +16 -10
  80. data/app/controllers/admin/pages_controller.rb +19 -29
  81. data/app/controllers/admin/post_types_controller.rb +7 -5
  82. data/app/controllers/admin/profiles_controller.rb +15 -5
  83. data/app/controllers/admin/redirects_controller.rb +9 -5
  84. data/app/controllers/admin/resources_controller.rb +7 -4
  85. data/app/controllers/admin/seo_controller.rb +12 -10
  86. data/app/controllers/admin/settings_controller.rb +7 -5
  87. data/app/controllers/admin/sidebar_controller.rb +6 -5
  88. data/app/controllers/admin/tags_controller.rb +6 -3
  89. data/app/controllers/admin/themes_controller.rb +10 -7
  90. data/app/controllers/admin/users_controller.rb +10 -7
  91. data/app/controllers/articles_controller.rb +49 -33
  92. data/app/controllers/authors_controller.rb +6 -3
  93. data/app/controllers/base_controller.rb +9 -11
  94. data/app/controllers/comments_controller.rb +13 -13
  95. data/app/controllers/content_controller.rb +4 -2
  96. data/app/controllers/feedback_controller.rb +4 -2
  97. data/app/controllers/notes_controller.rb +5 -3
  98. data/app/controllers/setup_controller.rb +15 -12
  99. data/app/controllers/tags_controller.rb +6 -4
  100. data/app/controllers/text_controller.rb +2 -4
  101. data/app/controllers/textfilter_controller.rb +2 -0
  102. data/app/controllers/theme_controller.rb +18 -13
  103. data/app/controllers/xml_controller.rb +2 -0
  104. data/app/helpers/admin/base_helper.rb +28 -29
  105. data/app/helpers/admin/feedback_helper.rb +34 -24
  106. data/app/helpers/articles_helper.rb +4 -2
  107. data/app/helpers/authors_helper.rb +7 -16
  108. data/app/helpers/base_helper.rb +56 -52
  109. data/app/helpers/blog_helper.rb +4 -2
  110. data/app/helpers/xml_helper.rb +3 -1
  111. data/app/jobs/application_job.rb +2 -0
  112. data/app/mailers/notification_mailer.rb +5 -3
  113. data/app/models/ability.rb +25 -23
  114. data/app/models/archives_sidebar.rb +14 -11
  115. data/app/models/article.rb +42 -42
  116. data/app/models/article/factory.rb +14 -6
  117. data/app/models/blog.rb +86 -75
  118. data/app/models/comment.rb +10 -11
  119. data/app/models/config_manager.rb +4 -2
  120. data/app/models/content.rb +37 -50
  121. data/app/models/content_base.rb +10 -4
  122. data/app/models/feedback.rb +21 -17
  123. data/app/models/meta_sidebar.rb +4 -3
  124. data/app/models/note.rb +26 -25
  125. data/app/models/page.rb +9 -8
  126. data/app/models/page_sidebar.rb +4 -2
  127. data/app/models/ping.rb +3 -1
  128. data/app/models/post_type.rb +3 -3
  129. data/app/models/redirect.rb +13 -7
  130. data/app/models/redirection.rb +3 -1
  131. data/app/models/resource.rb +5 -3
  132. data/app/models/search_sidebar.rb +4 -2
  133. data/app/models/sidebar.rb +11 -6
  134. data/app/models/static_sidebar.rb +14 -13
  135. data/app/models/tag.rb +15 -11
  136. data/app/models/tag_sidebar.rb +6 -3
  137. data/app/models/text_filter.rb +85 -11
  138. data/app/models/trackback.rb +7 -11
  139. data/app/models/trigger.rb +7 -4
  140. data/app/models/user.rb +44 -43
  141. data/app/services/title_builder.rb +52 -45
  142. data/app/uploaders/resource_uploader.rb +5 -3
  143. data/app/views/accounts/confirm.html.erb +3 -3
  144. data/app/views/admin/content/_article_list.html.erb +23 -8
  145. data/app/views/admin/content/_form.html.erb +71 -47
  146. data/app/views/admin/content/autosave.js.erb +2 -2
  147. data/app/views/admin/content/edit.html.erb +1 -1
  148. data/app/views/admin/content/index.html.erb +25 -15
  149. data/app/views/admin/content/new.html.erb +2 -2
  150. data/app/views/admin/dashboard/_comment.html.erb +5 -5
  151. data/app/views/admin/dashboard/_comments.html.erb +2 -2
  152. data/app/views/admin/dashboard/_drafts.html.erb +5 -5
  153. data/app/views/admin/dashboard/_overview.html.erb +7 -9
  154. data/app/views/admin/dashboard/_welcome.html.erb +11 -11
  155. data/app/views/admin/dashboard/index.html.erb +12 -7
  156. data/app/views/admin/feedback/_button.html.erb +6 -6
  157. data/app/views/admin/feedback/_feedback.html.erb +3 -3
  158. data/app/views/admin/feedback/_ham.html.erb +27 -9
  159. data/app/views/admin/feedback/_spam.html.erb +26 -16
  160. data/app/views/admin/feedback/article.html.erb +20 -21
  161. data/app/views/admin/feedback/edit.html.erb +14 -15
  162. data/app/views/admin/feedback/{ham.js → ham.js.erb} +0 -0
  163. data/app/views/admin/feedback/index.html.erb +25 -23
  164. data/app/views/admin/feedback/{spam.js → spam.js.erb} +0 -0
  165. data/app/views/admin/migrations/show.html.erb +10 -11
  166. data/app/views/admin/notes/_form.html.erb +13 -13
  167. data/app/views/admin/notes/_list.html.erb +19 -8
  168. data/app/views/admin/notes/_note.html.erb +12 -7
  169. data/app/views/admin/notes/edit.html.erb +6 -1
  170. data/app/views/admin/notes/index.html.erb +5 -1
  171. data/app/views/admin/notes/show.html.erb +2 -2
  172. data/app/views/admin/pages/_form.html.erb +86 -77
  173. data/app/views/admin/pages/_pages.html.erb +11 -4
  174. data/app/views/admin/pages/edit.html.erb +3 -1
  175. data/app/views/admin/pages/index.html.erb +10 -6
  176. data/app/views/admin/pages/new.html.erb +3 -1
  177. data/app/views/admin/post_types/_index_and_form.html.erb +15 -16
  178. data/app/views/admin/post_types/edit.html.erb +1 -1
  179. data/app/views/admin/post_types/index.html.erb +1 -1
  180. data/app/views/admin/profiles/index.html.erb +2 -3
  181. data/app/views/admin/redirects/_index_and_form.html.erb +10 -11
  182. data/app/views/admin/redirects/edit.html.erb +1 -1
  183. data/app/views/admin/redirects/index.html.erb +1 -1
  184. data/app/views/admin/resources/index.html.erb +19 -16
  185. data/app/views/admin/seo/_general.html.erb +23 -47
  186. data/app/views/admin/seo/_permalinks.html.erb +16 -16
  187. data/app/views/admin/seo/_titles.html.erb +63 -64
  188. data/app/views/admin/seo/show.html.erb +14 -19
  189. data/app/views/admin/settings/display.html.erb +22 -25
  190. data/app/views/admin/settings/feedback.html.erb +31 -32
  191. data/app/views/admin/settings/index.html.erb +23 -24
  192. data/app/views/admin/settings/write.html.erb +21 -22
  193. data/app/views/admin/shared/_edit.html.erb +3 -3
  194. data/app/views/admin/shared/_menu.html.erb +26 -26
  195. data/app/views/admin/shared/_twitter_alert.html.erb +1 -1
  196. data/app/views/admin/sidebar/_config.html.erb +5 -5
  197. data/app/views/admin/sidebar/_target_sidebar.html.erb +4 -4
  198. data/app/views/admin/sidebar/index.html.erb +7 -7
  199. data/app/views/admin/tags/_index_and_form.html.erb +11 -12
  200. data/app/views/admin/tags/edit.html.erb +1 -1
  201. data/app/views/admin/tags/index.html.erb +1 -1
  202. data/app/views/admin/themes/index.html.erb +5 -6
  203. data/app/views/admin/users/_form.html.erb +34 -34
  204. data/app/views/admin/users/edit.html.erb +2 -2
  205. data/app/views/admin/users/index.html.erb +10 -12
  206. data/app/views/admin/users/new.html.erb +2 -2
  207. data/app/views/archives_sidebar/_content.html.erb +2 -2
  208. data/app/views/articles/_archives_article.html.erb +3 -3
  209. data/app/views/articles/_article.html.erb +7 -9
  210. data/app/views/articles/_article_author.html.erb +4 -0
  211. data/app/views/articles/_article_content.html.erb +2 -2
  212. data/app/views/articles/_article_excerpt.html.erb +2 -2
  213. data/app/views/articles/_article_links.html.erb +1 -1
  214. data/app/views/articles/_comment_errors.html.erb +1 -1
  215. data/app/views/articles/_comment_form.html.erb +12 -12
  216. data/app/views/articles/_comment_preview.html.erb +3 -3
  217. data/app/views/articles/_password_form.html.erb +4 -4
  218. data/app/views/articles/_trackback.html.erb +2 -2
  219. data/app/views/articles/archives.html.erb +1 -1
  220. data/app/views/articles/feedback_atom_feed.atom.builder +3 -1
  221. data/app/views/articles/feedback_rss_feed.rss.builder +9 -8
  222. data/app/views/articles/index_atom_feed.atom.builder +5 -3
  223. data/app/views/articles/index_rss_feed.rss.builder +10 -9
  224. data/app/views/articles/live_search.html.erb +3 -3
  225. data/app/views/articles/read.html.erb +16 -8
  226. data/app/views/articles/search.html.erb +2 -2
  227. data/app/views/articles/trackback.xml.builder +3 -1
  228. data/app/views/articles/view_page.html.erb +2 -2
  229. data/app/views/authors/show.html.erb +9 -9
  230. data/app/views/authors/show_atom_feed.atom.builder +4 -2
  231. data/app/views/authors/show_rss_feed.rss.builder +10 -9
  232. data/app/views/comments/_comment.html.erb +3 -3
  233. data/app/views/devise/mailer/reset_password_instructions.html.erb +7 -9
  234. data/app/views/devise/passwords/edit.html.erb +4 -4
  235. data/app/views/devise/passwords/new.html.erb +1 -1
  236. data/app/views/devise/registrations/new.html.erb +5 -5
  237. data/app/views/devise/sessions/new.html.erb +3 -3
  238. data/app/views/errors/404.html.erb +2 -2
  239. data/app/views/feedback/index.atom.builder +3 -1
  240. data/app/views/feedback/index.rss.builder +9 -8
  241. data/app/views/layouts/accounts.html.erb +26 -26
  242. data/app/views/layouts/administration.html.erb +31 -31
  243. data/app/views/layouts/default.html.erb +4 -3
  244. data/app/views/layouts/editor.html.erb +5 -19
  245. data/app/views/meta_sidebar/_content.html.erb +2 -2
  246. data/app/views/notes/_note.html.erb +1 -1
  247. data/app/views/notes/index.html.erb +1 -1
  248. data/app/views/notes/show_in_reply.html.erb +1 -1
  249. data/app/views/notification_mailer/_mail_footer.html.erb +3 -3
  250. data/app/views/notification_mailer/article.html.erb +2 -2
  251. data/app/views/notification_mailer/comment.html.erb +5 -5
  252. data/app/views/notification_mailer/notif_user.html.erb +1 -1
  253. data/app/views/page_sidebar/_content.html.erb +1 -1
  254. data/app/views/search_sidebar/_content.html.erb +2 -2
  255. data/app/views/settings/install.html.erb +2 -2
  256. data/app/views/setup/index.html.erb +7 -7
  257. data/app/views/shared/_atom_header.atom.builder +4 -4
  258. data/app/views/shared/_atom_item_article.atom.builder +19 -29
  259. data/app/views/shared/_atom_item_comment.atom.builder +4 -2
  260. data/app/views/shared/_atom_item_trackback.atom.builder +4 -2
  261. data/app/views/shared/_google_analytics.html.erb +8 -0
  262. data/app/views/shared/_page_header.html.erb +9 -12
  263. data/app/views/shared/_rss_item_article.rss.builder +9 -7
  264. data/app/views/shared/_rss_item_comment.rss.builder +3 -1
  265. data/app/views/shared/_rss_item_trackback.rss.builder +3 -1
  266. data/app/views/sidebar/display_plugins.html.erb +1 -1
  267. data/app/views/tag_sidebar/_content.html.erb +1 -1
  268. data/app/views/tags/index.html.erb +1 -1
  269. data/app/views/xml/_googlesitemap_item_article.googlesitemap.builder +2 -0
  270. data/app/views/xml/_googlesitemap_item_category.googlesitemap.builder +2 -0
  271. data/app/views/xml/_googlesitemap_item_page.googlesitemap.builder +2 -0
  272. data/app/views/xml/_googlesitemap_item_tag.googlesitemap.builder +2 -0
  273. data/app/views/xml/sitemap.googlesitemap.builder +4 -2
  274. data/config/i18n-tasks.yml +0 -5
  275. data/config/initializers/devise.rb +10 -4
  276. data/config/initializers/mime_types.rb +3 -1
  277. data/config/locales/da.yml +134 -73
  278. data/config/locales/de.yml +142 -77
  279. data/config/locales/en.yml +128 -68
  280. data/config/locales/es-MX.yml +135 -71
  281. data/config/locales/fr.yml +167 -88
  282. data/config/locales/he.yml +128 -72
  283. data/config/locales/it.yml +136 -74
  284. data/config/locales/ja.yml +110 -66
  285. data/config/locales/lt.yml +153 -76
  286. data/config/locales/nb-NO.yml +123 -67
  287. data/config/locales/nl.yml +140 -77
  288. data/config/locales/pl.yml +329 -240
  289. data/config/locales/pt-BR.yml +137 -72
  290. data/config/locales/ro.yml +148 -72
  291. data/config/locales/ru.yml +161 -71
  292. data/config/locales/zh-CN.yml +106 -61
  293. data/config/locales/zh-TW.yml +109 -63
  294. data/config/routes.rb +68 -63
  295. data/db/migrate/113_initial_schema.rb +191 -191
  296. data/db/migrate/114_fixes_buggy_articles_and_notes.rb +10 -7
  297. data/db/migrate/115_drops_categories_for_tags.rb +5 -4
  298. data/db/migrate/20150207131657_add_missing_indexes.rb +2 -0
  299. data/db/migrate/20150807134129_simplify_redirect_relations.rb +5 -0
  300. data/db/migrate/20150808052637_add_blog_ids.rb +9 -3
  301. data/db/migrate/20150808191127_add_blog_id_to_redirects.rb +2 -0
  302. data/db/migrate/20150810094754_add_blog_id_to_tags.rb +2 -0
  303. data/db/migrate/20160108111120_add_devise_to_users.rb +4 -2
  304. data/db/migrate/20160108184201_move_last_connection_to_last_sign_in_at.rb +2 -0
  305. data/db/migrate/20160110094906_remove_profiles_rights.rb +2 -0
  306. data/db/migrate/20160605103918_replace_profile_id_with_string.rb +2 -0
  307. data/db/migrate/20160605154632_remove_profiles.rb +10 -5
  308. data/db/migrate/20160701061851_demand_blog_id_on_contents.rb +2 -0
  309. data/db/migrate/20160701062604_add_blog_id_to_resources.rb +2 -0
  310. data/db/migrate/20170528093024_move_resources_to_content.rb +2 -0
  311. data/db/migrate/20170528094923_move_tags_to_content.rb +2 -0
  312. data/db/migrate/20170528201606_remove_separate_published_flag.rb +2 -0
  313. data/db/migrate/20170605071626_remove_extra_state_columns_from_feedback.rb +2 -0
  314. data/db/migrate/20170702105201_remove_published_at_from_feedback.rb +2 -0
  315. data/db/migrate/20190208151235_add_text_filter_name_fields.rb +9 -0
  316. data/db/migrate/20190208152646_move_text_filter_to_name.rb +97 -0
  317. data/db/migrate/20190209155717_remove_text_filter_ids.rb +19 -0
  318. data/db/migrate/20190209160610_remove_text_filters.rb +17 -0
  319. data/db/migrate/20200413140440_add_unique_indexes.rb +10 -0
  320. data/db/seeds.rb +8 -20
  321. data/lib/email_notify.rb +3 -1
  322. data/lib/format.rb +4 -12
  323. data/lib/publify_core.rb +36 -35
  324. data/lib/publify_core/engine.rb +11 -4
  325. data/lib/publify_core/lang.rb +5 -1
  326. data/lib/publify_core/testing_support/dns_mock.rb +15 -0
  327. data/lib/publify_core/testing_support/factories.rb +240 -0
  328. data/lib/publify_core/testing_support/feed_assertions.rb +48 -0
  329. data/lib/publify_core/testing_support/fixtures/exploit.svg +4 -0
  330. data/lib/publify_core/testing_support/fixtures/fakepng.png +1 -0
  331. data/lib/publify_core/testing_support/fixtures/otherfile.txt +1 -0
  332. data/lib/publify_core/testing_support/fixtures/testfile.png +0 -0
  333. data/lib/publify_core/testing_support/fixtures/testfile.txt +1 -0
  334. data/lib/publify_core/testing_support/upload_fixtures.rb +15 -0
  335. data/lib/publify_core/version.rb +3 -1
  336. data/lib/publify_guid.rb +3 -1
  337. data/lib/publify_plugins.rb +10 -5
  338. data/lib/publify_textfilter_markdown.rb +38 -25
  339. data/lib/publify_textfilter_none.rb +5 -3
  340. data/lib/publify_textfilter_smartypants.rb +5 -3
  341. data/lib/publify_textfilter_textile.rb +7 -4
  342. data/lib/publify_textfilter_twitterfilter.rb +13 -7
  343. data/lib/publify_time.rb +4 -0
  344. data/lib/sidebar_field.rb +15 -13
  345. data/lib/sidebar_registry.rb +5 -3
  346. data/lib/spam_protection.rb +19 -17
  347. data/lib/tasks/i18n.rake +9 -0
  348. data/lib/tasks/manifest.rake +30 -0
  349. data/lib/tasks/publify_core_tasks.rake +2 -0
  350. data/lib/text_filter_plugin.rb +30 -29
  351. data/lib/theme.rb +5 -5
  352. data/lib/transforms.rb +21 -20
  353. data/themes/plain/javascripts/theme.js +0 -0
  354. metadata +247 -109
  355. data/app/assets/javascripts/widearea.js +0 -486
  356. data/app/assets/stylesheets/widearea.css +0 -133
  357. data/app/controllers/admin/textfilters_controller.rb +0 -6
  358. data/app/views/admin/dashboard/_inbound.html.erb +0 -31
  359. data/app/views/admin/notes/_header.html.erb +0 -6
  360. data/app/views/articles/_protected_article_content.html.erb +0 -6
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Article::Factory
2
4
  attr_reader :blog, :user
3
5
 
@@ -10,13 +12,14 @@ class Article::Factory
10
12
  blog.articles.build.tap do |art|
11
13
  art.allow_comments = blog.default_allow_comments
12
14
  art.allow_pings = blog.default_allow_pings
13
- art.text_filter = user.default_text_filter
14
- art.state = 'draft'
15
+ art.text_filter_name = default_text_filter
16
+ art.state = "draft"
15
17
  end
16
18
  end
17
19
 
18
20
  def get_or_build_from(id)
19
21
  return blog.articles.find(id) if id.present?
22
+
20
23
  default
21
24
  end
22
25
 
@@ -31,10 +34,10 @@ class Article::Factory
31
34
  end
32
35
 
33
36
  def extract_params(path, format)
34
- specs = format.split('/')
35
- specs.delete('')
36
- parts = path.split('/')
37
- parts.delete('')
37
+ specs = format.split("/")
38
+ specs.delete("")
39
+ parts = path.split("/")
40
+ parts.delete("")
38
41
 
39
42
  return if parts.length != specs.length
40
43
 
@@ -45,6 +48,7 @@ class Article::Factory
45
48
  after_format = Regexp.last_match[3]
46
49
  item =~ /^#{before_format}(.*)#{after_format}$/
47
50
  break unless Regexp.last_match
51
+
48
52
  value = Regexp.last_match[1]
49
53
  result[format_string.to_sym] = value
50
54
  elsif spec != item
@@ -53,4 +57,8 @@ class Article::Factory
53
57
  result
54
58
  end
55
59
  end
60
+
61
+ def default_text_filter
62
+ user.text_filter_name || blog.text_filter
63
+ end
56
64
  end
data/app/models/blog.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # The Blog class represents the one and only blog. It stores most
2
4
  # configuration settings and is linked to most of the assorted content
3
5
  # classes via has_many.
@@ -5,7 +7,7 @@
5
7
  # Once upon a time, there were plans to make publify handle multiple blogs,
6
8
  # but it never happened and publify is now firmly single-blog.
7
9
  #
8
- class Blog < ActiveRecord::Base
10
+ class Blog < ApplicationRecord
9
11
  include ConfigManager
10
12
  include Rails.application.routes.url_helpers
11
13
 
@@ -13,122 +15,126 @@ class Blog < ActiveRecord::Base
13
15
  has_many :articles
14
16
  has_many :feedback, through: :articles
15
17
 
16
- has_many :published_articles, ->() { published }, class_name: 'Article'
18
+ has_many :published_articles, ->() { published }, class_name: "Article"
17
19
 
18
20
  has_many :pages
19
21
  has_many :tags
20
22
  has_many :notes
21
23
 
22
24
  has_many :redirects
23
- has_many :sidebars, ->() { order('active_position ASC') }
25
+ has_many :sidebars, ->() { order("active_position ASC") }
24
26
 
25
27
  attr_accessor :custom_permalink
26
28
 
27
- default_scope -> { order('id') }
29
+ default_scope -> { order("id") }
28
30
 
29
31
  validates :blog_name, presence: true
30
32
 
31
33
  serialize :settings, Hash
32
34
 
33
35
  # Description
34
- setting :blog_name, :string, 'My Shiny Weblog!'
35
- setting :blog_subtitle, :string, ''
36
- setting :geourl_location, :string, ''
37
- setting :canonical_server_url, :string, '' # Deprecated
38
- setting :lang, :string, 'en_US'
39
- setting :title_prefix, :integer, 0 # Deprecated but needed for a migration
36
+ setting :blog_name, :string, "My Shiny Weblog!"
37
+ setting :blog_subtitle, :string, ""
38
+ setting :geourl_location, :string, ""
39
+ setting :canonical_server_url, :string, "" # Deprecated
40
+ setting :lang, :string, "en_US"
40
41
 
41
42
  # Spam
42
43
  setting :sp_global, :boolean, false
43
44
  setting :sp_article_auto_close, :integer, 0
44
45
  setting :sp_url_limit, :integer, 0
45
- setting :sp_akismet_key, :string, ''
46
+ setting :sp_akismet_key, :string, ""
46
47
  setting :use_recaptcha, :boolean, false
47
48
 
48
49
  # Mostly Behaviour
49
- setting :text_filter, :string, 'markdown smartypants'
50
- setting :comment_text_filter, :string, 'markdown smartypants'
50
+ setting :text_filter, :string, "markdown smartypants"
51
+ setting :comment_text_filter, :string, "markdown smartypants"
51
52
  setting :limit_article_display, :integer, 10
52
53
  setting :limit_archives_display, :integer, 20
53
54
  setting :limit_rss_display, :integer, 10
54
55
  setting :default_allow_pings, :boolean, false
55
56
  setting :default_allow_comments, :boolean, true
56
57
  setting :default_moderate_comments, :boolean, false
57
- setting :link_to_author, :boolean, false
58
- setting :show_extended_on_rss, :boolean, true # deprecated but still needed for backward compatibility
58
+ # deprecated but still needed for backward compatibility
59
+ setting :show_extended_on_rss, :boolean, true
59
60
  setting :hide_extended_on_rss, :boolean, false
60
- setting :theme, :string, 'plain'
61
- setting :plugin_avatar, :string, ''
61
+ setting :theme, :string, "plain"
62
+ setting :plugin_avatar, :string, ""
62
63
  setting :global_pings_disable, :boolean, false
63
64
  setting :send_outbound_pings, :boolean, true
64
- setting :email_from, :string, 'publify@example.com'
65
+ setting :email_from, :string, "publify@example.com"
65
66
  setting :allow_signup, :integer, 0
66
- setting :date_format, :string, '%d/%m/%Y'
67
- setting :time_format, :string, '%Hh%M'
67
+ setting :date_format, :string, "%d/%m/%Y"
68
+ setting :time_format, :string, "%Hh%M"
68
69
  setting :image_avatar_size, :integer, 48
69
70
  setting :image_thumb_size, :integer, 125
70
71
  setting :image_medium_size, :integer, 600
71
72
 
72
73
  # SEO
73
- setting :meta_description, :string, ''
74
- setting :meta_keywords, :string, ''
75
- setting :google_analytics, :string, ''
74
+ setting :meta_description, :string, ""
75
+ setting :meta_keywords, :string, ""
76
+ setting :google_analytics, :string, ""
76
77
  setting :rss_description, :boolean, false
77
- setting :rss_description_text, :string, <<EOS.strip_heredoc
78
+ setting :rss_description_text, :string, <<-HTML.strip_heredoc
78
79
  <hr />
79
80
  <p><small>Original article written by %author% and published on <a href='%blog_url%'>%blog_name%</a>
80
81
  | <a href='%permalink_url%'>direct link to this article</a>
81
82
  | If you are reading this article anywhere other than on <a href='%blog_url%'>%blog_name%</a>,
82
83
  it has been illegally reproduced and without proper authorization.</small></p>
83
- EOS
84
- setting :permalink_format, :string, '/%year%/%month%/%day%/%title%'
84
+ HTML
85
+ setting :permalink_format, :string, "/%year%/%month%/%day%/%title%"
85
86
  setting :robots, :string, 'User-agent: *\nAllow: /\nDisallow: /admin\n'
86
- setting :humans, :string, <<EOS.strip_heredoc
87
+ setting :humans, :string, <<-TEXT.strip_heredoc
87
88
  /* TEAM */
88
89
  Your title: Your name.
89
90
  Site: email, link to a contact form, etc.
90
91
  Twitter: your Twitter username.
91
92
 
92
93
  /* SITE */
93
- Software: Publify [http://publify.co] #{PublifyCore::VERSION}
94
- EOS
95
- setting :index_categories, :boolean, true # deprecated but still needed for backward compatibility
94
+ Software: Publify [https://publify.github.io/] #{PublifyCore::VERSION}
95
+ TEXT
96
+ # deprecated but still needed for backward compatibility
97
+ setting :index_categories, :boolean, true
96
98
  setting :unindex_categories, :boolean, false
97
- setting :index_tags, :boolean, true # deprecated but still needed for backward compatibility
99
+ # deprecated but still needed for backward compatibility
100
+ setting :index_tags, :boolean, true
98
101
  setting :unindex_tags, :boolean, false
99
102
  setting :admin_display_elements, :integer, 10
100
- setting :google_verification, :string, ''
101
- setting :nofollowify, :boolean, true # deprecated but still needed for backward compatibility
103
+ setting :google_verification, :string, ""
104
+ # deprecated but still needed for backward compatibility
105
+ setting :nofollowify, :boolean, true
102
106
  setting :dofollowify, :boolean, false
103
- setting :use_canonical_url, :boolean, false
104
107
  setting :use_meta_keyword, :boolean, true
105
- setting :home_title_template, :string, '%blog_name% | %blog_subtitle%' # spec OK
106
- setting :home_desc_template, :string, '%blog_name% | %blog_subtitle% | %meta_keywords%' # OK
107
- setting :article_title_template, :string, '%title% | %blog_name%'
108
- setting :article_desc_template, :string, '%excerpt%'
109
- setting :page_title_template, :string, '%title% | %blog_name%'
110
- setting :page_desc_template, :string, '%excerpt%'
111
- setting :paginated_title_template, :string, '%blog_name% | %blog_subtitle% %page%'
112
- setting :paginated_desc_template, :string, '%blog_name% | %blog_subtitle% | %meta_keywords% %page%'
113
- setting :tag_title_template, :string, 'Tag: %name% | %blog_name% %page%'
114
- setting :tag_desc_template, :string, '%name% | %blog_name% | %blog_subtitle% %page%'
115
- setting :author_title_template, :string, '%author% | %blog_name%'
116
- setting :author_desc_template, :string, '%author% | %blog_name% | %blog_subtitle%'
117
- setting :archives_title_template, :string, 'Archives for %blog_name% %date% %page%'
118
- setting :archives_desc_template, :string, 'Archives for %blog_name% %date% %page% %blog_subtitle%'
119
- setting :search_title_template, :string, 'Results for %search% | %blog_name% %page%'
120
- setting :search_desc_template, :string, 'Results for %search% | %blog_name% | %blog_subtitle% %page%'
121
- setting :statuses_title_template, :string, 'Notes | %blog_name% %page%'
122
- setting :statuses_desc_template, :string, 'Notes | %blog_name% | %blog_subtitle% %page%'
123
- setting :status_title_template, :string, '%body% | %blog_name%'
124
- setting :status_desc_template, :string, '%excerpt%'
125
-
126
- setting :custom_tracking_field, :string, ''
108
+ setting :home_title_template, :string, "%blog_name% | %blog_subtitle%"
109
+ setting :home_desc_template, :string, "%blog_name% | %blog_subtitle% | %meta_keywords%"
110
+ setting :article_title_template, :string, "%title% | %blog_name%"
111
+ setting :article_desc_template, :string, "%excerpt%"
112
+ setting :page_title_template, :string, "%title% | %blog_name%"
113
+ setting :page_desc_template, :string, "%excerpt%"
114
+ setting :paginated_title_template, :string, "%blog_name% | %blog_subtitle% %page%"
115
+ setting :paginated_desc_template, :string,
116
+ "%blog_name% | %blog_subtitle% | %meta_keywords% %page%"
117
+ setting :tag_title_template, :string, "Tag: %name% | %blog_name% %page%"
118
+ setting :tag_desc_template, :string, "%name% | %blog_name% | %blog_subtitle% %page%"
119
+ setting :author_title_template, :string, "%author% | %blog_name%"
120
+ setting :author_desc_template, :string, "%author% | %blog_name% | %blog_subtitle%"
121
+ setting :archives_title_template, :string, "Archives for %blog_name% %date% %page%"
122
+ setting :archives_desc_template, :string,
123
+ "Archives for %blog_name% %date% %page% %blog_subtitle%"
124
+ setting :search_title_template, :string, "Results for %search% | %blog_name% %page%"
125
+ setting :search_desc_template, :string,
126
+ "Results for %search% | %blog_name% | %blog_subtitle% %page%"
127
+ setting :statuses_title_template, :string, "Notes | %blog_name% %page%"
128
+ setting :statuses_desc_template, :string, "Notes | %blog_name% | %blog_subtitle% %page%"
129
+ setting :status_title_template, :string, "%body% | %blog_name%"
130
+ setting :status_desc_template, :string, "%excerpt%"
131
+
132
+ setting :custom_tracking_field, :string, ""
127
133
  # setting :meta_author_template, :string, "%blog_name% | %nickname%"
128
134
 
129
- setting :twitter_consumer_key, :string, ''
130
- setting :twitter_consumer_secret, :string, ''
131
- setting :custom_url_shortener, :string, ''
135
+ setting :twitter_consumer_key, :string, ""
136
+ setting :twitter_consumer_secret, :string, ""
137
+ setting :custom_url_shortener, :string, ""
132
138
  setting :statuses_in_timeline, :boolean, true
133
139
 
134
140
  validate :permalink_has_identifier
@@ -147,13 +153,13 @@ EOS
147
153
 
148
154
  # Check that all required blog settings have a value.
149
155
  def configured?
150
- settings.key?('blog_name')
156
+ settings.key?("blog_name")
151
157
  end
152
158
 
153
159
  # The +Theme+ object for the current theme.
154
160
  def current_theme(reload = nil)
155
161
  @current_theme = nil if reload
156
- @current_theme ||= Theme.find(theme) || Theme.new('', '')
162
+ @current_theme ||= Theme.find(theme) || Theme.new("", "")
157
163
  end
158
164
 
159
165
  module BasedUrlFor
@@ -166,20 +172,22 @@ EOS
166
172
  def url_for(options = {}, extra_params = {})
167
173
  case options
168
174
  when String
175
+ options = options.sub(%r{^/}, "")
169
176
  url_generated = if extra_params[:only_path]
170
177
  root_path
171
178
  else
172
179
  base_url
173
180
  end
174
- url_generated += "/#{options}" # They asked for 'url_for "/some/path"', so return it unedited.
181
+ # They asked for 'url_for "/some/path"', so return it unedited.
182
+ url_generated += "/#{options}"
175
183
  url_generated += "##{extra_params[:anchor]}" if extra_params[:anchor]
176
184
  url_generated
177
185
  when Hash
178
- merged_opts = options.reverse_merge!(only_path: false, controller: '',
179
- action: 'permalink',
186
+ merged_opts = options.reverse_merge!(only_path: false, controller: "",
187
+ action: "permalink",
180
188
  host: host_with_port,
181
189
  script_name: root_path)
182
- cache_key = merged_opts.values.prepend('blog-urlfor-withbaseurl').join('-')
190
+ cache_key = merged_opts.values.prepend("blog-urlfor-withbaseurl").join("-")
183
191
  unless Rails.cache.exist?(cache_key)
184
192
  Rails.cache.write(cache_key, super(merged_opts))
185
193
  end
@@ -194,7 +202,7 @@ EOS
194
202
 
195
203
  # The URL for a static file.
196
204
  def file_url(filename)
197
- if CarrierWave.configure { |config| config.storage.name == 'CarrierWave::Storage::Fog' }
205
+ if CarrierWave.configure { |config| config.storage.name == "CarrierWave::Storage::Fog" }
198
206
  filename
199
207
  else
200
208
  url_for filename, only_path: false
@@ -206,7 +214,8 @@ EOS
206
214
  end
207
215
 
208
216
  def per_page(format)
209
- return limit_article_display if format.nil? || format == 'html'
217
+ return limit_article_display if format.nil? || format == "html"
218
+
210
219
  limit_rss_display
211
220
  end
212
221
 
@@ -220,12 +229,12 @@ EOS
220
229
  end
221
230
 
222
231
  def permalink_has_identifier
223
- unless permalink_format =~ /(%title%)/
224
- errors.add(:base, I18n.t('errors.permalink_need_a_title'))
232
+ unless /(%title%)/.match?(permalink_format)
233
+ errors.add(:base, I18n.t("errors.permalink_need_a_title"))
225
234
  end
226
235
 
227
- if permalink_format =~ /\.(atom|rss)$/
228
- errors.add(:permalink_format, I18n.t('errors.cant_end_with_rss_or_atom'))
236
+ if /\.(atom|rss)$/.match?(permalink_format)
237
+ errors.add(:permalink_format, I18n.t("errors.cant_end_with_rss_or_atom"))
229
238
  end
230
239
  end
231
240
 
@@ -240,6 +249,7 @@ EOS
240
249
  def has_twitter_configured?
241
250
  return false if twitter_consumer_key.nil? || twitter_consumer_secret.nil?
242
251
  return false if twitter_consumer_key.empty? || twitter_consumer_secret.empty?
252
+
243
253
  true
244
254
  end
245
255
 
@@ -259,10 +269,11 @@ EOS
259
269
 
260
270
  def split_base_url
261
271
  unless @split_base_url
262
- unless base_url =~ /(https?):\/\/([^\/]*)(.*)/
263
- raise "Invalid base_url: #{base_url}"
264
- end
265
- @split_base_url = { protocol: Regexp.last_match[1], host_with_port: Regexp.last_match[2], root_path: Regexp.last_match[3].gsub(%r{/$}, '') }
272
+ raise "Invalid base_url: #{base_url}" unless base_url =~ %r{(https?)://([^/]*)(.*)}
273
+
274
+ @split_base_url = { protocol: Regexp.last_match[1],
275
+ host_with_port: Regexp.last_match[2],
276
+ root_path: Regexp.last_match[3].gsub(%r{/$}, "") }
266
277
  end
267
278
  @split_base_url
268
279
  end
@@ -1,4 +1,6 @@
1
- require 'timeout'
1
+ # frozen_string_literal: true
2
+
3
+ require "timeout"
2
4
 
3
5
  class Comment < Feedback
4
6
  belongs_to :user, optional: true
@@ -7,14 +9,14 @@ class Comment < Feedback
7
9
 
8
10
  attr_accessor :referrer, :permalink
9
11
 
10
- scope :spam, -> { where(state: 'spam') }
12
+ scope :spam, -> { where(state: "spam") }
11
13
  scope :not_spam, -> { where("state != 'spam'") }
12
- scope :presumed_spam, -> { where(state: 'presumed_spam') }
13
- scope :presumed_ham, -> { where(state: 'presumed_ham') }
14
- scope :ham, -> { where(state: 'ham') }
14
+ scope :presumed_spam, -> { where(state: "presumed_spam") }
15
+ scope :presumed_ham, -> { where(state: "presumed_ham") }
16
+ scope :ham, -> { where(state: "ham") }
15
17
  scope :unconfirmed, -> { where(state: %w(presumed_spam presumed_ham)) }
16
18
 
17
- scope :last_published, -> { published.limit(5).order('created_at DESC') }
19
+ scope :last_published, -> { published.limit(5).order("created_at DESC") }
18
20
 
19
21
  def notify_user_via_email(user)
20
22
  EmailNotify.send_comment(self, user) if user.notify_via_email?
@@ -40,15 +42,12 @@ class Comment < Feedback
40
42
 
41
43
  def article_allows_feedback?
42
44
  return true if article.allow_comments?
43
- errors.add(:article, 'Article is not open to comments')
45
+
46
+ errors.add(:article, "Article is not open to comments")
44
47
  false
45
48
  end
46
49
 
47
50
  def originator
48
51
  author
49
52
  end
50
-
51
- def content_fields
52
- [:body]
53
- end
54
53
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ConfigManager
2
4
  def self.append_features(base)
3
5
  super
@@ -35,7 +37,7 @@ module ConfigManager
35
37
  raw_value.nil? ? item.default : raw_value
36
38
  end
37
39
  if item.ruby_type == :boolean
38
- send(:define_method, item.name + '?') do
40
+ send(:define_method, "#{item.name}?") do
39
41
  raw_value = settings[item.name]
40
42
  raw_value.nil? ? item.default : raw_value
41
43
  end
@@ -62,7 +64,7 @@ module ConfigManager
62
64
  case ruby_type
63
65
  when :boolean
64
66
  case value
65
- when '0', 0, '', false, 'false', 'f', nil
67
+ when "0", 0, "", false, "false", "f", nil
66
68
  false
67
69
  else
68
70
  true
@@ -1,38 +1,40 @@
1
- require 'set'
2
- require 'uri'
1
+ # frozen_string_literal: true
3
2
 
4
- class Content < ActiveRecord::Base
3
+ require "set"
4
+ require "uri"
5
+
6
+ class Content < ApplicationRecord
5
7
  include ContentBase
6
8
 
7
- belongs_to :text_filter, optional: true
8
9
  belongs_to :user, optional: true, touch: true
9
10
  belongs_to :blog
10
11
 
11
12
  validates :blog, presence: true
12
13
 
13
- has_one :redirect, dependent: :destroy, inverse_of: :contents
14
+ has_one :redirect, dependent: :destroy, inverse_of: :content
14
15
 
15
16
  has_many :triggers, as: :pending_item, dependent: :delete_all
16
17
  has_many :resources, inverse_of: :content, dependent: :nullify
17
18
  has_and_belongs_to_many :tags
18
19
 
19
- scope :user_id, ->(user_id) { where('user_id = ?', user_id) }
20
- scope :published, -> { where(state: 'published'). order(default_order) }
21
- scope :published_at, ->(time_params) {
22
- published.
23
- where(published_at: PublifyTime.delta(*time_params)).
24
- order('published_at DESC')
25
- }
26
- scope :not_published, -> { where.not(state: 'published') }
27
- scope :drafts, -> { where(state: 'draft').order('created_at DESC') }
28
- scope :no_draft, -> { where.not(state: 'draft').order('published_at DESC') }
20
+ scope :user_id, ->(user_id) { where("user_id = ?", user_id) }
21
+ scope :published, -> { where(state: "published").order(default_order) }
22
+ scope :published_at, lambda { |time_params|
23
+ published.where(published_at: PublifyTime.delta(*time_params))
24
+ }
25
+ scope :not_published, -> { where.not(state: "published") }
26
+ scope :drafts, -> { where(state: "draft").order("created_at DESC") }
27
+ scope :no_draft, -> { where.not(state: "draft").order("published_at DESC") }
29
28
  scope :searchstring, lambda { |search_string|
30
- tokens = search_string.split(' ').map { |c| "%#{c.downcase}%" }
31
- where('state = ? AND ' + (['(LOWER(body) LIKE ? OR LOWER(extended) LIKE ? OR LOWER(title) LIKE ?)'] * tokens.size).join(' AND '),
32
- 'published', *tokens.map { |token| [token] * 3 }.flatten)
29
+ tokens = search_string.split(" ").map { |c| "%#{c.downcase}%" }
30
+ matcher = "(LOWER(body) LIKE ? OR LOWER(extended) LIKE ? OR LOWER(title) LIKE ?)"
31
+ template = "state = ? AND #{([matcher] * tokens.size).join(" AND ")}"
32
+ where(template, "published", *tokens.map { |token| [token] * 3 }.flatten)
33
33
  }
34
34
 
35
- scope :published_at_like, ->(date_at) { where(published_at: PublifyTime.delta_like(date_at)) }
35
+ scope :published_at_like, lambda { |date_at|
36
+ where(published_at: PublifyTime.delta_like(date_at))
37
+ }
36
38
 
37
39
  serialize :whiteboard
38
40
 
@@ -45,21 +47,12 @@ class Content < ActiveRecord::Base
45
47
  end
46
48
  end
47
49
 
48
- # Set the text filter for this object.
49
- # NOTE: Due to how Rails injects association methods, this cannot be put in ContentBase
50
- # TODO: Allowing assignment of a string here is not very clean.
51
- def text_filter=(filter)
52
- filter_object = case filter
53
- when TextFilter
54
- filter
55
- else
56
- TextFilter.find_or_default(filter)
57
- end
58
- self.text_filter_id = if filter_object
59
- filter_object.id
60
- else
61
- filter.to_i
62
- end
50
+ def author_name
51
+ if user.present? && user.name.present?
52
+ user.name
53
+ else
54
+ author
55
+ end
63
56
  end
64
57
 
65
58
  def shorten_url
@@ -67,6 +60,7 @@ class Content < ActiveRecord::Base
67
60
 
68
61
  if redirect.present?
69
62
  return if redirect.to_path == permalink_url
63
+
70
64
  redirect.to_path = permalink_url
71
65
  redirect.save
72
66
  else
@@ -85,9 +79,7 @@ class Content < ActiveRecord::Base
85
79
  def self.search_with(params)
86
80
  params ||= {}
87
81
  scoped = unscoped
88
- if params[:searchstring].present?
89
- scoped = scoped.searchstring(params[:searchstring])
90
- end
82
+ scoped = scoped.searchstring(params[:searchstring]) if params[:searchstring].present?
91
83
 
92
84
  if params[:published_at].present? && /(\d\d\d\d)-(\d\d)/ =~ params[:published_at]
93
85
  scoped = scoped.published_at_like(params[:published_at])
@@ -98,8 +90,8 @@ class Content < ActiveRecord::Base
98
90
  end
99
91
 
100
92
  if params[:published].present?
101
- scoped = scoped.published if params[:published].to_s == '1'
102
- scoped = scoped.not_published if params[:published].to_s == '0'
93
+ scoped = scoped.published if params[:published].to_s == "1"
94
+ scoped = scoped.not_published if params[:published].to_s == "0"
103
95
  end
104
96
 
105
97
  scoped
@@ -109,19 +101,14 @@ class Content < ActiveRecord::Base
109
101
  self[:whiteboard] ||= {}
110
102
  end
111
103
 
112
- def link_to_author?
113
- user.email.present? && blog.link_to_author
114
- end
115
-
116
- def get_rss_description
117
- return '' unless blog.rss_description
118
- return '' unless respond_to?(:user) && user && user.name
104
+ def rss_description
105
+ return "" unless blog.rss_description
119
106
 
120
107
  rss_desc = blog.rss_description_text
121
- rss_desc.gsub!('%author%', user.name)
122
- rss_desc.gsub!('%blog_url%', blog.base_url)
123
- rss_desc.gsub!('%blog_name%', blog.blog_name)
124
- rss_desc.gsub!('%permalink_url%', permalink_url)
108
+ rss_desc.gsub!("%author%", author_name)
109
+ rss_desc.gsub!("%blog_url%", blog.base_url)
110
+ rss_desc.gsub!("%blog_name%", blog.blog_name)
111
+ rss_desc.gsub!("%permalink_url%", permalink_url)
125
112
  rss_desc
126
113
  end
127
114