publify_core 9.0.0.pre1

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 (372) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +21 -0
  3. data/README.rdoc +3 -0
  4. data/Rakefile +35 -0
  5. data/app/assets/fonts/open-sans-bold.woff +0 -0
  6. data/app/assets/fonts/open-sans.woff +0 -0
  7. data/app/assets/images/admin/loading.gif +0 -0
  8. data/app/assets/images/admin/typologo.gif +0 -0
  9. data/app/assets/images/calendar_date_select/calendar.gif +0 -0
  10. data/app/assets/images/close.gif +0 -0
  11. data/app/assets/images/closelabel.gif +0 -0
  12. data/app/assets/images/go.png +0 -0
  13. data/app/assets/images/loading.gif +0 -0
  14. data/app/assets/images/nextlabel.gif +0 -0
  15. data/app/assets/images/overlay.png +0 -0
  16. data/app/assets/images/powered.gif +0 -0
  17. data/app/assets/images/prevlabel.gif +0 -0
  18. data/app/assets/images/spinner-blue.gif +0 -0
  19. data/app/assets/images/spinner.gif +0 -0
  20. data/app/assets/images/thumb_blank.jpg +0 -0
  21. data/app/assets/javascripts/application.js +2 -0
  22. data/app/assets/javascripts/cookies.js +60 -0
  23. data/app/assets/javascripts/datetimepicker.js +1470 -0
  24. data/app/assets/javascripts/lang/da_DK.js +17 -0
  25. data/app/assets/javascripts/lang/default.js +21 -0
  26. data/app/assets/javascripts/lang/en_US.js +21 -0
  27. data/app/assets/javascripts/lang/fr_FR.js +21 -0
  28. data/app/assets/javascripts/lang/nl_NL.js +21 -0
  29. data/app/assets/javascripts/lang/zh_TW.js +17 -0
  30. data/app/assets/javascripts/lightbox.js +350 -0
  31. data/app/assets/javascripts/observe.js +28 -0
  32. data/app/assets/javascripts/publify.js +11 -0
  33. data/app/assets/javascripts/publify_admin.js +138 -0
  34. data/app/assets/javascripts/quicktags.js +440 -0
  35. data/app/assets/javascripts/set-timeago-lang.js +3 -0
  36. data/app/assets/javascripts/sidebar.js +28 -0
  37. data/app/assets/javascripts/spinnable.js +5 -0
  38. data/app/assets/javascripts/tagmanager.js +481 -0
  39. data/app/assets/javascripts/typeahead.js +1139 -0
  40. data/app/assets/javascripts/widearea.js +486 -0
  41. data/app/assets/stylesheets/accounts.css.scss +7 -0
  42. data/app/assets/stylesheets/administration_structure.css.scss +239 -0
  43. data/app/assets/stylesheets/coderay.css +135 -0
  44. data/app/assets/stylesheets/datetimepicker.css +306 -0
  45. data/app/assets/stylesheets/lightbox.css +63 -0
  46. data/app/assets/stylesheets/publify.css.scss +9 -0
  47. data/app/assets/stylesheets/publify_admin.css.scss +11 -0
  48. data/app/assets/stylesheets/rss.css +53 -0
  49. data/app/assets/stylesheets/sidebar_admin.css.scss +36 -0
  50. data/app/assets/stylesheets/tagmanager.css +102 -0
  51. data/app/assets/stylesheets/user-styles.css +29 -0
  52. data/app/assets/stylesheets/widearea.css +133 -0
  53. data/app/controllers/accounts_controller.rb +2 -0
  54. data/app/controllers/admin/base_controller.rb +41 -0
  55. data/app/controllers/admin/cache_controller.rb +33 -0
  56. data/app/controllers/admin/content_controller.rb +174 -0
  57. data/app/controllers/admin/dashboard_controller.rb +87 -0
  58. data/app/controllers/admin/feedback_controller.rb +159 -0
  59. data/app/controllers/admin/migrations_controller.rb +20 -0
  60. data/app/controllers/admin/notes_controller.rb +69 -0
  61. data/app/controllers/admin/pages_controller.rb +88 -0
  62. data/app/controllers/admin/post_types_controller.rb +56 -0
  63. data/app/controllers/admin/profiles_controller.rb +48 -0
  64. data/app/controllers/admin/redirects_controller.rb +47 -0
  65. data/app/controllers/admin/resources_controller.rb +30 -0
  66. data/app/controllers/admin/seo_controller.rb +45 -0
  67. data/app/controllers/admin/settings_controller.rb +53 -0
  68. data/app/controllers/admin/sidebar_controller.rb +66 -0
  69. data/app/controllers/admin/tags_controller.rb +53 -0
  70. data/app/controllers/admin/textfilters_controller.rb +6 -0
  71. data/app/controllers/admin/themes_controller.rb +37 -0
  72. data/app/controllers/admin/users_controller.rb +65 -0
  73. data/app/controllers/articles_controller.rb +205 -0
  74. data/app/controllers/authors_controller.rb +27 -0
  75. data/app/controllers/base_controller.rb +45 -0
  76. data/app/controllers/comments_controller.rb +69 -0
  77. data/app/controllers/content_controller.rb +31 -0
  78. data/app/controllers/feedback_controller.rb +47 -0
  79. data/app/controllers/notes_controller.rb +37 -0
  80. data/app/controllers/setup_controller.rb +62 -0
  81. data/app/controllers/tags_controller.rb +55 -0
  82. data/app/controllers/text_controller.rb +9 -0
  83. data/app/controllers/textfilter_controller.rb +3 -0
  84. data/app/controllers/theme_controller.rb +59 -0
  85. data/app/controllers/trackbacks_controller.rb +36 -0
  86. data/app/controllers/xml_controller.rb +70 -0
  87. data/app/helpers/admin/base_helper.rb +87 -0
  88. data/app/helpers/admin/feedback_helper.rb +42 -0
  89. data/app/helpers/articles_helper.rb +8 -0
  90. data/app/helpers/authors_helper.rb +39 -0
  91. data/app/helpers/base_helper.rb +246 -0
  92. data/app/helpers/blog_helper.rb +12 -0
  93. data/app/helpers/xml_helper.rb +16 -0
  94. data/app/mailers/notification_mailer.rb +38 -0
  95. data/app/models/ability.rb +52 -0
  96. data/app/models/archives_sidebar.rb +45 -0
  97. data/app/models/article/factory.rb +56 -0
  98. data/app/models/article/states.rb +178 -0
  99. data/app/models/article.rb +321 -0
  100. data/app/models/blog.rb +290 -0
  101. data/app/models/blog_sweeper.rb +86 -0
  102. data/app/models/comment.rb +53 -0
  103. data/app/models/config_manager.rb +81 -0
  104. data/app/models/content.rb +138 -0
  105. data/app/models/content_base.rb +95 -0
  106. data/app/models/feedback/states.rb +256 -0
  107. data/app/models/feedback.rb +225 -0
  108. data/app/models/meta_sidebar.rb +8 -0
  109. data/app/models/note.rb +144 -0
  110. data/app/models/page.rb +36 -0
  111. data/app/models/page_cache.rb +33 -0
  112. data/app/models/page_sidebar.rb +12 -0
  113. data/app/models/ping.rb +116 -0
  114. data/app/models/post_type.rb +15 -0
  115. data/app/models/redirect.rb +45 -0
  116. data/app/models/redirection.rb +4 -0
  117. data/app/models/resource.rb +28 -0
  118. data/app/models/search_sidebar.rb +7 -0
  119. data/app/models/sidebar.rb +138 -0
  120. data/app/models/static_sidebar.rb +20 -0
  121. data/app/models/tag.rb +63 -0
  122. data/app/models/tag_sidebar.rb +27 -0
  123. data/app/models/text_filter.rb +61 -0
  124. data/app/models/trackback.rb +58 -0
  125. data/app/models/trigger.rb +45 -0
  126. data/app/models/user.rb +148 -0
  127. data/app/services/migrator.rb +25 -0
  128. data/app/services/title_builder.rb +80 -0
  129. data/app/uploaders/resource_uploader.rb +30 -0
  130. data/app/views/accounts/confirm.html.erb +8 -0
  131. data/app/views/admin/cache/show.html.erb +18 -0
  132. data/app/views/admin/content/_article_list.html.erb +26 -0
  133. data/app/views/admin/content/_form.html.erb +165 -0
  134. data/app/views/admin/content/autosave.js.erb +5 -0
  135. data/app/views/admin/content/edit.html.erb +3 -0
  136. data/app/views/admin/content/index.html.erb +48 -0
  137. data/app/views/admin/content/index.js.erb +1 -0
  138. data/app/views/admin/content/new.html.erb +3 -0
  139. data/app/views/admin/dashboard/_comment.html.erb +18 -0
  140. data/app/views/admin/dashboard/_comments.html.erb +10 -0
  141. data/app/views/admin/dashboard/_drafts.html.erb +25 -0
  142. data/app/views/admin/dashboard/_inbound.html.erb +31 -0
  143. data/app/views/admin/dashboard/_overview.html.erb +23 -0
  144. data/app/views/admin/dashboard/_welcome.html.erb +28 -0
  145. data/app/views/admin/dashboard/index.html.erb +17 -0
  146. data/app/views/admin/feedback/_button.html.erb +19 -0
  147. data/app/views/admin/feedback/_feedback.html.erb +7 -0
  148. data/app/views/admin/feedback/_ham.html.erb +17 -0
  149. data/app/views/admin/feedback/_spam.html.erb +23 -0
  150. data/app/views/admin/feedback/article.html.erb +69 -0
  151. data/app/views/admin/feedback/edit.html.erb +48 -0
  152. data/app/views/admin/feedback/ham.js +1 -0
  153. data/app/views/admin/feedback/index.html.erb +53 -0
  154. data/app/views/admin/feedback/spam.js +1 -0
  155. data/app/views/admin/migrations/show.html.erb +39 -0
  156. data/app/views/admin/notes/_form.html.erb +37 -0
  157. data/app/views/admin/notes/_header.html.erb +6 -0
  158. data/app/views/admin/notes/_list.html.erb +13 -0
  159. data/app/views/admin/notes/_note.html.erb +14 -0
  160. data/app/views/admin/notes/edit.html.erb +11 -0
  161. data/app/views/admin/notes/index.html.erb +11 -0
  162. data/app/views/admin/notes/show.html.erb +14 -0
  163. data/app/views/admin/pages/_form.html.erb +101 -0
  164. data/app/views/admin/pages/_pages.html.erb +21 -0
  165. data/app/views/admin/pages/edit.html.erb +1 -0
  166. data/app/views/admin/pages/index.html.erb +17 -0
  167. data/app/views/admin/pages/new.html.erb +1 -0
  168. data/app/views/admin/post_types/_index_and_form.html.erb +65 -0
  169. data/app/views/admin/post_types/edit.html.erb +1 -0
  170. data/app/views/admin/post_types/index.html.erb +1 -0
  171. data/app/views/admin/profiles/index.html.erb +10 -0
  172. data/app/views/admin/redirects/_index_and_form.html.erb +68 -0
  173. data/app/views/admin/redirects/edit.html.erb +1 -0
  174. data/app/views/admin/redirects/index.html.erb +1 -0
  175. data/app/views/admin/resources/index.html.erb +68 -0
  176. data/app/views/admin/seo/_general.html.erb +123 -0
  177. data/app/views/admin/seo/_permalinks.html.erb +53 -0
  178. data/app/views/admin/seo/_titles.html.erb +210 -0
  179. data/app/views/admin/seo/show.html.erb +32 -0
  180. data/app/views/admin/settings/display.html.erb +110 -0
  181. data/app/views/admin/settings/feedback.html.erb +125 -0
  182. data/app/views/admin/settings/index.html.erb +73 -0
  183. data/app/views/admin/settings/write.html.erb +87 -0
  184. data/app/views/admin/shared/_edit.html.erb +4 -0
  185. data/app/views/admin/shared/_menu.html.erb +122 -0
  186. data/app/views/admin/shared/_twitter_alert.html.erb +3 -0
  187. data/app/views/admin/sidebar/_available.html.erb +6 -0
  188. data/app/views/admin/sidebar/_available.json.erb +6 -0
  189. data/app/views/admin/sidebar/_config.html.erb +27 -0
  190. data/app/views/admin/sidebar/_target.html.erb +9 -0
  191. data/app/views/admin/sidebar/_target_sidebar.html.erb +20 -0
  192. data/app/views/admin/sidebar/destroy.js.erb +1 -0
  193. data/app/views/admin/sidebar/index.html.erb +31 -0
  194. data/app/views/admin/sidebar/sortable.js.erb +3 -0
  195. data/app/views/admin/sidebar/update.js.erb +2 -0
  196. data/app/views/admin/tags/_index_and_form.html.erb +59 -0
  197. data/app/views/admin/tags/edit.html.erb +1 -0
  198. data/app/views/admin/tags/index.html.erb +1 -0
  199. data/app/views/admin/themes/index.html.erb +27 -0
  200. data/app/views/admin/users/_form.html.erb +215 -0
  201. data/app/views/admin/users/edit.html.erb +8 -0
  202. data/app/views/admin/users/index.html.erb +39 -0
  203. data/app/views/admin/users/new.html.erb +8 -0
  204. data/app/views/archives_sidebar/_content.html.erb +13 -0
  205. data/app/views/articles/_article.html.erb +9 -0
  206. data/app/views/articles/_article_collection.html.erb +8 -0
  207. data/app/views/articles/_article_content.html.erb +5 -0
  208. data/app/views/articles/_article_excerpt.html.erb +13 -0
  209. data/app/views/articles/_article_links.html.erb +10 -0
  210. data/app/views/articles/_comment.html.erb +1 -0
  211. data/app/views/articles/_comment_errors.html.erb +2 -0
  212. data/app/views/articles/_comment_form.html.erb +48 -0
  213. data/app/views/articles/_comment_list.html.erb +5 -0
  214. data/app/views/articles/_comment_preview.html.erb +4 -0
  215. data/app/views/articles/_full_article_content.html.erb +2 -0
  216. data/app/views/articles/_password_form.html.erb +10 -0
  217. data/app/views/articles/_protected_article_content.html.erb +6 -0
  218. data/app/views/articles/_trackback.html.erb +6 -0
  219. data/app/views/articles/archives.html.erb +25 -0
  220. data/app/views/articles/comment.js.erb +5 -0
  221. data/app/views/articles/comment_failed.js.erb +3 -0
  222. data/app/views/articles/error.html.erb +3 -0
  223. data/app/views/articles/feedback_atom_feed.atom.builder +8 -0
  224. data/app/views/articles/feedback_rss_feed.rss.builder +21 -0
  225. data/app/views/articles/index.html.erb +1 -0
  226. data/app/views/articles/index_atom_feed.atom.builder +8 -0
  227. data/app/views/articles/index_rss_feed.rss.builder +20 -0
  228. data/app/views/articles/live_search.html.erb +10 -0
  229. data/app/views/articles/read.html.erb +61 -0
  230. data/app/views/articles/search.html.erb +8 -0
  231. data/app/views/articles/trackback.xml.builder +5 -0
  232. data/app/views/articles/view_page.html.erb +3 -0
  233. data/app/views/authors/show.html.erb +40 -0
  234. data/app/views/authors/show_atom_feed.atom.builder +8 -0
  235. data/app/views/authors/show_rss_feed.rss.builder +20 -0
  236. data/app/views/comments/_comment.html.erb +16 -0
  237. data/app/views/comments/index.html.erb +1 -0
  238. data/app/views/comments/index_atom_feed.atom.builder +8 -0
  239. data/app/views/comments/index_rss_feed.rss.builder +20 -0
  240. data/app/views/comments/preview.html.erb +1 -0
  241. data/app/views/comments/preview.js.erb +3 -0
  242. data/app/views/devise/mailer/reset_password_instructions.html.erb +13 -0
  243. data/app/views/devise/passwords/edit.html.erb +28 -0
  244. data/app/views/devise/passwords/new.html.erb +20 -0
  245. data/app/views/devise/registrations/new.html.erb +36 -0
  246. data/app/views/devise/sessions/new.html.erb +32 -0
  247. data/app/views/devise/shared/_links.html.erb +15 -0
  248. data/app/views/errors/404.html.erb +2 -0
  249. data/app/views/layouts/accounts.html.erb +33 -0
  250. data/app/views/layouts/administration.html.erb +37 -0
  251. data/app/views/layouts/default.html.erb +32 -0
  252. data/app/views/layouts/editor.html.erb +31 -0
  253. data/app/views/meta_sidebar/_content.html.erb +8 -0
  254. data/app/views/notes/_note.html.erb +15 -0
  255. data/app/views/notes/error.html.erb +3 -0
  256. data/app/views/notes/index.html.erb +15 -0
  257. data/app/views/notes/show.html.erb +5 -0
  258. data/app/views/notes/show_in_reply.html.erb +16 -0
  259. data/app/views/notification_mailer/_mail_footer.html.erb +7 -0
  260. data/app/views/notification_mailer/_mail_header.html.erb +1 -0
  261. data/app/views/notification_mailer/article.html.erb +6 -0
  262. data/app/views/notification_mailer/comment.html.erb +11 -0
  263. data/app/views/notification_mailer/notif_user.html.erb +14 -0
  264. data/app/views/page_sidebar/_content.html.erb +12 -0
  265. data/app/views/search_sidebar/_content.html.erb +10 -0
  266. data/app/views/settings/done.html.erb +2 -0
  267. data/app/views/settings/install.html.erb +12 -0
  268. data/app/views/setup/index.html.erb +13 -0
  269. data/app/views/shared/_atom_header.atom.builder +6 -0
  270. data/app/views/shared/_atom_item_article.atom.builder +39 -0
  271. data/app/views/shared/_atom_item_comment.atom.builder +10 -0
  272. data/app/views/shared/_atom_item_trackback.atom.builder +9 -0
  273. data/app/views/shared/_flash.erb +10 -0
  274. data/app/views/shared/_page_header.html.erb +26 -0
  275. data/app/views/shared/_rss_item_article.rss.builder +35 -0
  276. data/app/views/shared/_rss_item_comment.rss.builder +8 -0
  277. data/app/views/shared/_rss_item_trackback.rss.builder +7 -0
  278. data/app/views/sidebar/_row.html.erb +1 -0
  279. data/app/views/sidebar/_sidebar.html.erb +5 -0
  280. data/app/views/sidebar/display_plugins.html.erb +5 -0
  281. data/app/views/sidebar/show.html.erb +1 -0
  282. data/app/views/static_sidebar/_content.html.erb +2 -0
  283. data/app/views/tag_sidebar/_content.html.erb +10 -0
  284. data/app/views/tags/index.html.erb +15 -0
  285. data/app/views/tags/show.html.erb +1 -0
  286. data/app/views/theme/static_view_test.html.erb +1 -0
  287. data/app/views/trackbacks/index_atom_feed.atom.builder +7 -0
  288. data/app/views/trackbacks/index_rss_feed.rss.builder +20 -0
  289. data/app/views/trackbacks/trackback.xml.builder +4 -0
  290. data/app/views/xml/_googlesitemap_item_article.googlesitemap.builder +5 -0
  291. data/app/views/xml/_googlesitemap_item_category.googlesitemap.builder +4 -0
  292. data/app/views/xml/_googlesitemap_item_page.googlesitemap.builder +4 -0
  293. data/app/views/xml/_googlesitemap_item_tag.googlesitemap.builder +4 -0
  294. data/app/views/xml/feed.googlesitemap.builder +7 -0
  295. data/app/views/xml/rsd.rsd.builder +8 -0
  296. data/config/i18n-tasks.yml +49 -0
  297. data/config/initializers/devise.rb +265 -0
  298. data/config/initializers/mime_types.rb +6 -0
  299. data/config/locales/da.yml +827 -0
  300. data/config/locales/de.yml +827 -0
  301. data/config/locales/en.yml +827 -0
  302. data/config/locales/es-MX.yml +827 -0
  303. data/config/locales/fr.yml +827 -0
  304. data/config/locales/he.yml +827 -0
  305. data/config/locales/it.yml +827 -0
  306. data/config/locales/ja.yml +827 -0
  307. data/config/locales/lt.yml +827 -0
  308. data/config/locales/nb-NO.yml +827 -0
  309. data/config/locales/nl.yml +827 -0
  310. data/config/locales/pl.yml +827 -0
  311. data/config/locales/pt-BR.yml +827 -0
  312. data/config/locales/ro.yml +827 -0
  313. data/config/locales/ru.yml +827 -0
  314. data/config/locales/sidebars.da.yml +20 -0
  315. data/config/locales/sidebars.de.yml +20 -0
  316. data/config/locales/sidebars.en.yml +20 -0
  317. data/config/locales/sidebars.es-MX.yml +20 -0
  318. data/config/locales/sidebars.fr.yml +20 -0
  319. data/config/locales/sidebars.he.yml +20 -0
  320. data/config/locales/sidebars.it.yml +20 -0
  321. data/config/locales/sidebars.ja.yml +20 -0
  322. data/config/locales/sidebars.lt.yml +20 -0
  323. data/config/locales/sidebars.nb-NO.yml +20 -0
  324. data/config/locales/sidebars.nl.yml +20 -0
  325. data/config/locales/sidebars.pl.yml +20 -0
  326. data/config/locales/sidebars.pt-BR.yml +20 -0
  327. data/config/locales/sidebars.ro.yml +20 -0
  328. data/config/locales/sidebars.ru.yml +20 -0
  329. data/config/locales/sidebars.zh-CN.yml +20 -0
  330. data/config/locales/sidebars.zh-TW.yml +20 -0
  331. data/config/locales/zh-CN.yml +827 -0
  332. data/config/locales/zh-TW.yml +827 -0
  333. data/config/routes.rb +177 -0
  334. data/db/migrate/113_initial_schema.rb +205 -0
  335. data/db/migrate/114_fixes_buggy_articles_and_notes.rb +52 -0
  336. data/db/migrate/115_drops_categories_for_tags.rb +34 -0
  337. data/db/migrate/20150207131657_add_missing_indexes.rb +19 -0
  338. data/db/migrate/20150807134129_simplify_redirect_relations.rb +38 -0
  339. data/db/migrate/20150808052637_add_blog_ids.rb +33 -0
  340. data/db/migrate/20150808191127_add_blog_id_to_redirects.rb +15 -0
  341. data/db/migrate/20150810094754_add_blog_id_to_tags.rb +15 -0
  342. data/db/migrate/20160108111120_add_devise_to_users.rb +53 -0
  343. data/db/migrate/20160108184201_move_last_connection_to_last_sign_in_at.rb +16 -0
  344. data/db/migrate/20160110094906_remove_profiles_rights.rb +14 -0
  345. data/db/migrate/20160605103918_replace_profile_id_with_string.rb +30 -0
  346. data/db/migrate/20160605154632_remove_profiles.rb +24 -0
  347. data/db/migrate/20160701061851_demand_blog_id_on_contents.rb +9 -0
  348. data/db/migrate/20160701062604_add_blog_id_to_resources.rb +28 -0
  349. data/db/seeds.rb +37 -0
  350. data/lib/email_notify.rb +26 -0
  351. data/lib/format.rb +17 -0
  352. data/lib/publify_core/engine.rb +23 -0
  353. data/lib/publify_core/lang.rb +5 -0
  354. data/lib/publify_core/version.rb +3 -0
  355. data/lib/publify_core.rb +56 -0
  356. data/lib/publify_guid.rb +9 -0
  357. data/lib/publify_plugins.rb +72 -0
  358. data/lib/publify_textfilter_markdown.rb +44 -0
  359. data/lib/publify_textfilter_none.rb +14 -0
  360. data/lib/publify_textfilter_smartypants.rb +14 -0
  361. data/lib/publify_textfilter_textile.rb +21 -0
  362. data/lib/publify_textfilter_twitterfilter.rb +33 -0
  363. data/lib/publify_time.rb +30 -0
  364. data/lib/sidebar_field.rb +115 -0
  365. data/lib/sidebar_registry.rb +33 -0
  366. data/lib/spam_protection.rb +101 -0
  367. data/lib/stateful.rb +106 -0
  368. data/lib/tasks/publify_core_tasks.rake +4 -0
  369. data/lib/text_filter_plugin.rb +182 -0
  370. data/lib/theme.rb +72 -0
  371. data/lib/transforms.rb +45 -0
  372. metadata +865 -0
@@ -0,0 +1,47 @@
1
+ class FeedbackController < BaseController
2
+ before_action :get_article, only: [:create]
3
+
4
+ cache_sweeper :blog_sweeper
5
+
6
+ # Used only by comments. Maybe need move to comments controller
7
+ # or use it in our code with send some feed about trackback
8
+ #
9
+ # Redirect to article with good anchor with /comments?article_id=xxx ou
10
+ # /trackacks?article_id=xxx
11
+ #
12
+ # If no article_id params, so no page found. TODO: See all
13
+ # comments/trackbacks with paginate ?
14
+ #
15
+ # If /comments.rss|atom or /trabacks.atom|rss see a feed about all comments
16
+ # or trackback
17
+ #
18
+ # If article_id params in feed see only this comment|feedback on this
19
+ # article.
20
+ #
21
+ # TODO: It's usefull but use anywhere. Create some extension in xml_sidebar
22
+ # to define this feed.
23
+ def index
24
+ @page_title = self.class.name.to_s.sub(/Controller$/, '')
25
+ respond_to do |format|
26
+ format.html do
27
+ if params[:article_id]
28
+ article = Article.find(params[:article_id])
29
+ redirect_to "#{URI.parse(article.permalink_url).path}\##{@page_title.underscore}"
30
+ else
31
+ render text: 'this space left blank'
32
+ end
33
+ end
34
+ feedbacks = Feedback.from(controller_name, params[:article_id]).limit(this_blog.per_page(params[:format]))
35
+ format.atom { render_feed 'atom', feedbacks }
36
+ format.rss { render_feed 'rss', feedbacks }
37
+ end
38
+ end
39
+
40
+ protected
41
+
42
+ def render_feed(format, collection)
43
+ ivar_name = "@#{self.class.to_s.sub(/Controller$/, '').underscore}"
44
+ instance_variable_set(ivar_name, collection)
45
+ render "index_#{format}_feed"
46
+ end
47
+ end
@@ -0,0 +1,37 @@
1
+ class NotesController < ContentController
2
+ require 'json'
3
+
4
+ layout :theme_layout
5
+ cache_sweeper :blog_sweeper
6
+ caches_page :index, :show, if: proc { |c| c.request.query_string == '' }
7
+
8
+ after_action :set_blog_infos
9
+
10
+ def index
11
+ @notes = Note.published.page(params[:page]).per(this_blog.limit_article_display)
12
+
13
+ if @notes.empty?
14
+ @message = I18n.t('errors.no_notes_found')
15
+ render 'notes/error', status: 200
16
+ end
17
+ end
18
+
19
+ def show
20
+ @note = Note.published.find_by permalink: CGI.escape(params[:permalink])
21
+
22
+ return render 'errors/404', status: 404 unless @note
23
+
24
+ if @note.in_reply_to_message.present?
25
+ @reply = JSON.parse(@note.in_reply_to_message)
26
+ render :show_in_reply
27
+ end
28
+ end
29
+
30
+ private
31
+
32
+ def set_blog_infos
33
+ @keywords = this_blog.meta_keywords
34
+ @page_title = this_blog.statuses_title_template.to_title(@notes, this_blog, params)
35
+ @description = this_blog.statuses_desc_template.to_title(@notes, this_blog, params)
36
+ end
37
+ end
@@ -0,0 +1,62 @@
1
+ class SetupController < BaseController
2
+ before_action :check_config, only: 'index'
3
+ layout 'accounts'
4
+
5
+ def index
6
+ return unless request.post?
7
+
8
+ this_blog.blog_name = params[:setting][:blog_name]
9
+ this_blog.base_url = blog_base_url
10
+
11
+ @user = User.new(login: 'admin',
12
+ email: params[:setting][:email],
13
+ nickname: 'Publify Admin')
14
+ @user.generate_password!
15
+ @user.name = @user.login
16
+
17
+ unless this_blog.valid? && @user.valid?
18
+ redirect_to setup_url
19
+ return
20
+ end
21
+
22
+ return unless this_blog.save
23
+
24
+ session[:tmppass] = @user.password
25
+
26
+ return unless @user.save
27
+
28
+ sign_in @user
29
+
30
+ if User.count == 1
31
+ create_first_post @user
32
+ create_first_page @user
33
+ end
34
+
35
+ redirect_to confirm_accounts_url
36
+ end
37
+
38
+ private
39
+
40
+ def create_first_post(user)
41
+ this_blog.articles.create(title: I18n.t('setup.article.title'),
42
+ author: user.login,
43
+ body: I18n.t('setup.article.body'),
44
+ allow_comments: 1,
45
+ allow_pings: 1,
46
+ published: 1,
47
+ user: user)
48
+ end
49
+
50
+ def create_first_page(user)
51
+ this_blog.pages.create(name: 'about',
52
+ published: true,
53
+ title: I18n.t('setup.page.about'),
54
+ user: user,
55
+ body: I18n.t('setup.page.body'))
56
+ end
57
+
58
+ def check_config
59
+ return unless this_blog.configured?
60
+ redirect_to controller: 'articles', action: 'index'
61
+ end
62
+ end
@@ -0,0 +1,55 @@
1
+ class TagsController < ContentController
2
+ before_action :auto_discovery_feed, only: [:show, :index]
3
+ layout :theme_layout
4
+ cache_sweeper :blog_sweeper
5
+
6
+ caches_page :index, :show, if: proc { |c|
7
+ c.request.query_string == ''
8
+ }
9
+
10
+ def index
11
+ @tags = Tag.page(params[:page]).per(100)
12
+ @page_title = controller_name.capitalize
13
+ @keywords = ''
14
+ @description = "#{self.class.to_s.sub(/Controller$/, '')} for #{this_blog.blog_name}"
15
+ end
16
+
17
+ def show
18
+ @grouping = Tag.find_by(name: params[:id])
19
+ if @grouping.nil?
20
+ @articles = []
21
+ else
22
+ @page_title = this_blog.tag_title_template.to_title(@grouping, this_blog, params)
23
+ @description = @grouping.description.to_s
24
+ @keywords = ''
25
+ @keywords << @grouping.keywords unless @grouping.keywords.blank?
26
+ @keywords << this_blog.meta_keywords unless this_blog.meta_keywords.blank?
27
+ @articles = @grouping.articles.published.page(params[:page]).per(10)
28
+ end
29
+ respond_to do |format|
30
+ format.html do
31
+ if @articles.empty?
32
+ render 'errors/404', status: 404
33
+ else
34
+ render template_name(params[:id])
35
+ end
36
+ end
37
+
38
+ format.atom do
39
+ @articles = @articles[0, this_blog.limit_rss_display]
40
+ render 'articles/index_atom_feed', layout: false
41
+ end
42
+
43
+ format.rss do
44
+ @articles = @articles[0, this_blog.limit_rss_display]
45
+ render 'articles/index_rss_feed', layout: false
46
+ end
47
+ end
48
+ end
49
+
50
+ private
51
+
52
+ def template_name(value)
53
+ template_exists?("tags/#{value}") ? value : :show
54
+ end
55
+ end
@@ -0,0 +1,9 @@
1
+ class TextController < BaseController
2
+ def humans
3
+ render text: this_blog.humans
4
+ end
5
+
6
+ def robots
7
+ render text: this_blog.robots
8
+ end
9
+ end
@@ -0,0 +1,3 @@
1
+ # TODO: Remove
2
+ class TextfilterController < BaseController
3
+ end
@@ -0,0 +1,59 @@
1
+ class ThemeController < ContentController
2
+ def stylesheets
3
+ render_theme_item(:stylesheets, params[:filename], 'text/css; charset=utf-8')
4
+ end
5
+
6
+ def javascript
7
+ render_theme_item(:javascript, params[:filename], 'text/javascript; charset=utf-8')
8
+ end
9
+
10
+ def images
11
+ render_theme_item(:images, params[:filename])
12
+ end
13
+
14
+ def fonts
15
+ render_theme_item(:fonts, params[:filename])
16
+ end
17
+
18
+ def error
19
+ render nothing: true, status: 404
20
+ end
21
+
22
+ def static_view_test
23
+ end
24
+
25
+ private
26
+
27
+ def render_theme_item(type, file, mime = nil)
28
+ mime ||= mime_for(file)
29
+ if file.split(%r{[\\/]}).include?('..')
30
+ return (render 'errors/404', status: 404)
31
+ end
32
+
33
+ src = this_blog.current_theme.path + "/#{type}/#{file}"
34
+ return (render text: 'Not Found', status: 404) unless File.exist? src
35
+
36
+ cache_page File.read(src) if perform_caching
37
+
38
+ send_file(src, type: mime, disposition: 'inline', stream: true)
39
+ end
40
+
41
+ def mime_for(filename)
42
+ case filename.downcase
43
+ when /\.js$/
44
+ 'text/javascript'
45
+ when /\.css$/
46
+ 'text/css'
47
+ when /\.gif$/
48
+ 'image/gif'
49
+ when /(\.jpg|\.jpeg)$/
50
+ 'image/jpeg'
51
+ when /\.png$/
52
+ 'image/png'
53
+ when /\.swf$/
54
+ 'application/x-shockwave-flash'
55
+ else
56
+ 'application/binary'
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,36 @@
1
+ class TrackbacksController < FeedbackController
2
+ def create
3
+ @error_message = catch(:error) do
4
+ if this_blog.global_pings_disable
5
+ throw :error, 'Trackback not saved'
6
+ elsif params[:__mode] == 'rss'
7
+ # Part of the trackback spec... not sure what we should be doing here though.
8
+ else
9
+ begin
10
+ @trackback = this_blog.ping_article! trackback_params
11
+ rescue ActiveRecord::RecordNotFound, ActiveRecord::StatementInvalid
12
+ throw :error, "Article id #{params[:id]} not found."
13
+ rescue ActiveRecord::RecordInvalid
14
+ throw :error, 'Trackback not saved'
15
+ end
16
+ end
17
+ end
18
+
19
+ respond_to do |format|
20
+ format.xml { render 'trackback', formats: [:xml], handlers: [:builder] }
21
+ format.html { render nothing: true }
22
+ end
23
+ end
24
+
25
+ protected
26
+
27
+ def trackback_params
28
+ params.
29
+ permit(:blog_name, :excerpt, :title, :url, :article_id).
30
+ merge(ip: request.remote_ip, published: true)
31
+ end
32
+
33
+ def get_article
34
+ true
35
+ end
36
+ end
@@ -0,0 +1,70 @@
1
+ class XmlController < BaseController
2
+ caches_page :feed, if: proc { |c|
3
+ c.request.query_string == ''
4
+ }
5
+
6
+ NORMALIZED_FORMAT_FOR = { 'atom' => 'atom', 'rss' => 'rss',
7
+ 'atom10' => 'atom', 'atom03' => 'atom', 'rss20' => 'rss',
8
+ 'googlesitemap' => 'googlesitemap', 'rsd' => 'rsd' }.freeze
9
+
10
+ ACCEPTED_TYPE = %w(feed comments article tag author trackbacks sitemap).freeze
11
+
12
+ def feed
13
+ @format = 'rss'
14
+ if params[:format]
15
+ @format = NORMALIZED_FORMAT_FOR[params[:format]]
16
+ return render(text: 'Unsupported format', status: 404) unless @format
17
+ end
18
+
19
+ # TODO: Move redirects into config/routes.rb, if possible
20
+ param_type = ACCEPTED_TYPE.dup.delete(params[:type])
21
+ param_id = params[:id] # .present? && params[:id].to_i # Think about a way to secure that to a valid tag/author for int value ...
22
+
23
+ case param_type
24
+ when 'feed'
25
+ redirect_to controller: 'articles', action: 'index', format: @format, status: :moved_permanently
26
+ when 'comments'
27
+ redirect_to admin_comments_url(format: @format), status: :moved_permanently
28
+ when 'article'
29
+ redirect_to this_blog.articles.find(param_id).feed_url(@format), status: :moved_permanently
30
+ when 'tag', 'author'
31
+ redirect_to send("#{param_type}_url", param_id, format: @format), status: :moved_permanently
32
+ when 'trackbacks'
33
+ redirect_to trackbacks_url(format: @format), status: :moved_permanently
34
+ when 'sitemap'
35
+ @items = []
36
+ @blog = this_blog
37
+
38
+ @feed_title = this_blog.blog_name
39
+ @link = this_blog.base_url
40
+ @self_url = url_for(params)
41
+
42
+ @items += Article.find_already_published(1000)
43
+ @items += Page.find_already_published(1000)
44
+ @items += Tag.find_all_with_article_counters unless this_blog.unindex_tags
45
+
46
+ respond_to do |format|
47
+ format.googlesitemap
48
+ end
49
+ else
50
+ return render(text: 'Unsupported feed type', status: 404)
51
+ end
52
+ end
53
+
54
+ # TODO: Move redirects into config/routes.rb, if possible
55
+ def articlerss
56
+ redirect_to(URI.parse(Article.find(params[:id]).feed_url('rss')).path, status: :moved_permanently)
57
+ end
58
+
59
+ def commentrss
60
+ redirect_to admin_comments_url(format: 'rss'), status: :moved_permanently
61
+ end
62
+
63
+ def trackbackrss
64
+ redirect_to trackbacks_url(format: 'rss'), status: :moved_permanently
65
+ end
66
+
67
+ def rsd
68
+ render 'rsd', formats: [:rsd], handlers: [:builder]
69
+ end
70
+ end
@@ -0,0 +1,87 @@
1
+ module Admin::BaseHelper
2
+ include ActionView::Helpers::DateHelper
3
+
4
+ def toggle_element(element, label = t('generic.change'))
5
+ link_to label, "##{element}", data: { toggle: :collapse }
6
+ end
7
+
8
+ def class_for_admin_state(sidebar, this_position)
9
+ case sidebar.admin_state
10
+ when :active
11
+ 'active alert-info'
12
+ when :will_change_position
13
+ if this_position == sidebar.active_position
14
+ 'will_change ghost'
15
+ else
16
+ 'will_change alert-warning'
17
+ end
18
+ else
19
+ raise sidebar.admin_state.inspect
20
+ end
21
+ end
22
+
23
+ def text_filter_options
24
+ 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]
32
+ end
33
+ end
34
+
35
+ def plugin_options(kind)
36
+ PublifyPlugins::Keeper.available_plugins(kind).map do |plugin|
37
+ [plugin.name, plugin.to_s]
38
+ end
39
+ end
40
+
41
+ def show_actions(item)
42
+ content_tag(:div, class: 'action', style: '') do
43
+ safe_join [button_to_edit(item),
44
+ button_to_delete(item),
45
+ button_to_short_url(item)], ' '
46
+ end
47
+ end
48
+
49
+ def display_pagination(collection, cols, _first = '', _last = '')
50
+ return if collection.count == 0
51
+ content_tag(:tr) do
52
+ content_tag(:td, paginate(collection), class: 'paginate', colspan: cols)
53
+ end
54
+ end
55
+
56
+ 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' })
58
+ end
59
+
60
+ 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
+ )
69
+ end
70
+
71
+ 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')
74
+ end
75
+
76
+ def twitter_available?(blog, user)
77
+ blog.has_twitter_configured? && user.has_twitter_configured?
78
+ end
79
+
80
+ def menu_item(name, url)
81
+ if current_page? url
82
+ content_tag(:li, link_to(name, '#'), class: 'active')
83
+ else
84
+ content_tag(:li, link_to(name, url))
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,42 @@
1
+ module Admin::FeedbackHelper
2
+ 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'
7
+ end
8
+
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
19
+ end
20
+
21
+ 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' })
23
+ end
24
+
25
+ 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' })
27
+ end
28
+
29
+ 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' })
31
+ end
32
+
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'
37
+
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 })
41
+ end
42
+ end
@@ -0,0 +1,8 @@
1
+ module ArticlesHelper
2
+ def tag_links(article)
3
+ tag_arr = article.tags.map do |tag|
4
+ link_to tag.display_name, tag.permalink_url(nil, true), rel: 'tag'
5
+ end
6
+ safe_join(tag_arr.sort, ', ')
7
+ end
8
+ end
@@ -0,0 +1,39 @@
1
+ module AuthorsHelper
2
+ include BlogHelper
3
+
4
+ def display_profile_item(item, item_desc)
5
+ return unless item.present?
6
+ item = link_to(item, item) if is_url?(item)
7
+ content_tag :li do
8
+ safe_join([item_desc, item], ' ')
9
+ end
10
+ end
11
+
12
+ def is_url?(str)
13
+ [URI::HTTP, URI::HTTPS].include?(URI.parse(str.to_s).class)
14
+ rescue URI::InvalidURIError
15
+ false
16
+ end
17
+
18
+ def author_description(user)
19
+ return unless user.description.present?
20
+
21
+ content_tag(:div, user.description, id: 'author-description')
22
+ end
23
+
24
+ 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
38
+ end
39
+ end