threddedDANIEL 0.14.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (367) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +744 -0
  4. data/app/assets/images/favicons/README.md +3 -0
  5. data/app/assets/images/favicons/amazon.png +0 -0
  6. data/app/assets/images/favicons/github.png +0 -0
  7. data/app/assets/images/favicons/google_branding/logo_calendar_128px.png +0 -0
  8. data/app/assets/images/favicons/google_branding/logo_docs_48px.png +0 -0
  9. data/app/assets/images/favicons/google_branding/logo_drive_48px.png +0 -0
  10. data/app/assets/images/favicons/google_branding/logo_forms_48px.png +0 -0
  11. data/app/assets/images/favicons/google_branding/logo_sheets_48px.png +0 -0
  12. data/app/assets/images/favicons/google_branding/logo_slides_48px.png +0 -0
  13. data/app/assets/images/favicons/stackexchange.png +0 -0
  14. data/app/assets/images/favicons/twitter.png +0 -0
  15. data/app/assets/images/favicons/wikipedia.png +0 -0
  16. data/app/assets/images/thredded/breadcrumb-chevron.svg +1 -0
  17. data/app/assets/images/thredded/follow.svg +1 -0
  18. data/app/assets/images/thredded/lock.svg +1 -0
  19. data/app/assets/images/thredded/moderation.svg +1 -0
  20. data/app/assets/images/thredded/private-messages.svg +1 -0
  21. data/app/assets/images/thredded/settings.svg +1 -0
  22. data/app/assets/images/thredded/three-dot-menu.svg +3 -0
  23. data/app/assets/images/thredded/unfollow.svg +1 -0
  24. data/app/assets/javascripts/thredded.es6 +2 -0
  25. data/app/assets/javascripts/thredded/components/currently_online.es6 +32 -0
  26. data/app/assets/javascripts/thredded/components/flash_messages.es6 +9 -0
  27. data/app/assets/javascripts/thredded/components/mention_autocompletion.es6 +40 -0
  28. data/app/assets/javascripts/thredded/components/post_form.es6 +37 -0
  29. data/app/assets/javascripts/thredded/components/preview_area.es6 +56 -0
  30. data/app/assets/javascripts/thredded/components/quote_post.es6 +49 -0
  31. data/app/assets/javascripts/thredded/components/time_stamps.es6 +25 -0
  32. data/app/assets/javascripts/thredded/components/topic_form.es6 +94 -0
  33. data/app/assets/javascripts/thredded/components/topics.es6 +46 -0
  34. data/app/assets/javascripts/thredded/components/turboforms.es6 +25 -0
  35. data/app/assets/javascripts/thredded/components/user_preferences_form.es6 +66 -0
  36. data/app/assets/javascripts/thredded/components/user_textcomplete.es6 +50 -0
  37. data/app/assets/javascripts/thredded/components/users_select.es6 +122 -0
  38. data/app/assets/javascripts/thredded/core/csrf_tokens.es6 +9 -0
  39. data/app/assets/javascripts/thredded/core/debounce.es6 +32 -0
  40. data/app/assets/javascripts/thredded/core/escape_html.es6 +7 -0
  41. data/app/assets/javascripts/thredded/core/hide_soft_keyboard.es6 +7 -0
  42. data/app/assets/javascripts/thredded/core/on_page_load.es6 +54 -0
  43. data/app/assets/javascripts/thredded/core/serialize_form.es6 +9 -0
  44. data/app/assets/javascripts/thredded/core/thredded.es6 +1 -0
  45. data/app/assets/javascripts/thredded/dependencies.js +8 -0
  46. data/app/assets/javascripts/thredded/dependencies/autosize.js +1 -0
  47. data/app/assets/javascripts/thredded/dependencies/textcomplete.js +1 -0
  48. data/app/assets/javascripts/thredded/dependencies/timeago.js +1 -0
  49. data/app/assets/javascripts/thredded/dependencies/ujs.js +1 -0
  50. data/app/assets/javascripts/thredded/thredded.es6 +2 -0
  51. data/app/assets/stylesheets/thredded.scss +3 -0
  52. data/app/assets/stylesheets/thredded/_base.scss +13 -0
  53. data/app/assets/stylesheets/thredded/_dependencies.scss +0 -0
  54. data/app/assets/stylesheets/thredded/_email.scss +51 -0
  55. data/app/assets/stylesheets/thredded/_thredded.scss +33 -0
  56. data/app/assets/stylesheets/thredded/base/_alerts.scss +44 -0
  57. data/app/assets/stylesheets/thredded/base/_buttons.scss +73 -0
  58. data/app/assets/stylesheets/thredded/base/_dropdown-menu.scss +83 -0
  59. data/app/assets/stylesheets/thredded/base/_forms.scss +84 -0
  60. data/app/assets/stylesheets/thredded/base/_grid.scss +58 -0
  61. data/app/assets/stylesheets/thredded/base/_lists.scss +31 -0
  62. data/app/assets/stylesheets/thredded/base/_nav.scss +67 -0
  63. data/app/assets/stylesheets/thredded/base/_tables.scss +17 -0
  64. data/app/assets/stylesheets/thredded/base/_typography.scss +72 -0
  65. data/app/assets/stylesheets/thredded/base/_variables.scss +141 -0
  66. data/app/assets/stylesheets/thredded/components/_alerts.scss +19 -0
  67. data/app/assets/stylesheets/thredded/components/_base.scss +25 -0
  68. data/app/assets/stylesheets/thredded/components/_currently-online.scss +54 -0
  69. data/app/assets/stylesheets/thredded/components/_empty.scss +11 -0
  70. data/app/assets/stylesheets/thredded/components/_flash-message.scss +19 -0
  71. data/app/assets/stylesheets/thredded/components/_following.scss +14 -0
  72. data/app/assets/stylesheets/thredded/components/_form-list.scss +39 -0
  73. data/app/assets/stylesheets/thredded/components/_icons.scss +3 -0
  74. data/app/assets/stylesheets/thredded/components/_main-section.scss +9 -0
  75. data/app/assets/stylesheets/thredded/components/_mention-autocomplete.scss +57 -0
  76. data/app/assets/stylesheets/thredded/components/_messageboard.scss +155 -0
  77. data/app/assets/stylesheets/thredded/components/_onebox.scss +275 -0
  78. data/app/assets/stylesheets/thredded/components/_pagination.scss +35 -0
  79. data/app/assets/stylesheets/thredded/components/_post-form.scss +27 -0
  80. data/app/assets/stylesheets/thredded/components/_post.scss +138 -0
  81. data/app/assets/stylesheets/thredded/components/_preferences.scss +19 -0
  82. data/app/assets/stylesheets/thredded/components/_preview_area.scss +11 -0
  83. data/app/assets/stylesheets/thredded/components/_topic-delete.scss +8 -0
  84. data/app/assets/stylesheets/thredded/components/_topic-header.scss +111 -0
  85. data/app/assets/stylesheets/thredded/components/_topics.scss +186 -0
  86. data/app/assets/stylesheets/thredded/layout/_main-container.scss +16 -0
  87. data/app/assets/stylesheets/thredded/layout/_main-navigation.scss +79 -0
  88. data/app/assets/stylesheets/thredded/layout/_moderation.scss +97 -0
  89. data/app/assets/stylesheets/thredded/layout/_navigation.scss +87 -0
  90. data/app/assets/stylesheets/thredded/layout/_search-navigation.scss +126 -0
  91. data/app/assets/stylesheets/thredded/layout/_user-navigation.scss +20 -0
  92. data/app/assets/stylesheets/thredded/layout/_user.scss +10 -0
  93. data/app/assets/stylesheets/thredded/utilities/_is-compact.scss +26 -0
  94. data/app/assets/stylesheets/thredded/utilities/_is-expanded.scss +16 -0
  95. data/app/commands/thredded/at_notification_extractor.rb +23 -0
  96. data/app/commands/thredded/autofollow_users.rb +62 -0
  97. data/app/commands/thredded/create_messageboard.rb +42 -0
  98. data/app/commands/thredded/mark_all_read.rb +22 -0
  99. data/app/commands/thredded/moderate_post.rb +48 -0
  100. data/app/commands/thredded/notify_following_users.rb +78 -0
  101. data/app/commands/thredded/notify_private_topic_users.rb +34 -0
  102. data/app/controllers/concerns/thredded/new_post_params.rb +21 -0
  103. data/app/controllers/concerns/thredded/new_private_post_params.rb +21 -0
  104. data/app/controllers/concerns/thredded/new_private_topic_params.rb +25 -0
  105. data/app/controllers/concerns/thredded/new_topic_params.rb +19 -0
  106. data/app/controllers/concerns/thredded/render_preview.rb +16 -0
  107. data/app/controllers/thredded/application_controller.rb +145 -0
  108. data/app/controllers/thredded/autocomplete_users_controller.rb +52 -0
  109. data/app/controllers/thredded/messageboard_groups_controller.rb +31 -0
  110. data/app/controllers/thredded/messageboards_controller.rb +53 -0
  111. data/app/controllers/thredded/moderation_controller.rb +103 -0
  112. data/app/controllers/thredded/post_permalinks_controller.rb +11 -0
  113. data/app/controllers/thredded/post_previews_controller.rb +29 -0
  114. data/app/controllers/thredded/posts_controller.rb +97 -0
  115. data/app/controllers/thredded/preferences_controller.rb +42 -0
  116. data/app/controllers/thredded/private_post_permalinks_controller.rb +12 -0
  117. data/app/controllers/thredded/private_post_previews_controller.rb +29 -0
  118. data/app/controllers/thredded/private_posts_controller.rb +96 -0
  119. data/app/controllers/thredded/private_topic_previews_controller.rb +15 -0
  120. data/app/controllers/thredded/private_topics_controller.rb +102 -0
  121. data/app/controllers/thredded/read_states_controller.rb +13 -0
  122. data/app/controllers/thredded/theme_previews_controller.rb +34 -0
  123. data/app/controllers/thredded/topic_previews_controller.rb +15 -0
  124. data/app/controllers/thredded/topics_controller.rb +205 -0
  125. data/app/forms/thredded/edit_topic_form.rb +51 -0
  126. data/app/forms/thredded/post_form.rb +54 -0
  127. data/app/forms/thredded/private_post_form.rb +50 -0
  128. data/app/forms/thredded/private_topic_form.rb +160 -0
  129. data/app/forms/thredded/topic_form.rb +95 -0
  130. data/app/forms/thredded/user_preferences_form.rb +110 -0
  131. data/app/helpers/thredded/application_helper.rb +129 -0
  132. data/app/helpers/thredded/nav_helper.rb +42 -0
  133. data/app/helpers/thredded/render_helper.rb +15 -0
  134. data/app/helpers/thredded/urls_helper.rb +134 -0
  135. data/app/jobs/thredded/activity_updater_job.rb +21 -0
  136. data/app/jobs/thredded/auto_follow_and_notify_job.rb +14 -0
  137. data/app/jobs/thredded/notify_private_topic_users_job.rb +12 -0
  138. data/app/mailer_previews/thredded/base_mailer_preview.rb +118 -0
  139. data/app/mailer_previews/thredded/post_mailer_preview.rb +13 -0
  140. data/app/mailer_previews/thredded/private_topic_mailer_preview.rb +13 -0
  141. data/app/mailers/thredded/base_mailer.rb +18 -0
  142. data/app/mailers/thredded/post_mailer.rb +21 -0
  143. data/app/mailers/thredded/private_topic_mailer.rb +21 -0
  144. data/app/models/concerns/thredded/content_moderation_state.rb +67 -0
  145. data/app/models/concerns/thredded/friendly_id_reserved_words_and_pagination.rb +17 -0
  146. data/app/models/concerns/thredded/moderation_state.rb +14 -0
  147. data/app/models/concerns/thredded/notifier_preference.rb +19 -0
  148. data/app/models/concerns/thredded/post_common.rb +76 -0
  149. data/app/models/concerns/thredded/search_parser.rb +41 -0
  150. data/app/models/concerns/thredded/topic_common.rb +94 -0
  151. data/app/models/concerns/thredded/topics_search.rb +67 -0
  152. data/app/models/concerns/thredded/user_topic_read_state_common.rb +42 -0
  153. data/app/models/thredded/category.rb +18 -0
  154. data/app/models/thredded/messageboard.rb +120 -0
  155. data/app/models/thredded/messageboard_group.rb +19 -0
  156. data/app/models/thredded/messageboard_notifications_for_followed_topics.rb +30 -0
  157. data/app/models/thredded/messageboard_user.rb +14 -0
  158. data/app/models/thredded/notifications_for_followed_topics.rb +25 -0
  159. data/app/models/thredded/notifications_for_private_topics.rb +22 -0
  160. data/app/models/thredded/null_user.rb +51 -0
  161. data/app/models/thredded/null_user_topic_read_state.rb +17 -0
  162. data/app/models/thredded/post.rb +77 -0
  163. data/app/models/thredded/post_moderation_record.rb +56 -0
  164. data/app/models/thredded/private_post.rb +63 -0
  165. data/app/models/thredded/private_topic.rb +89 -0
  166. data/app/models/thredded/private_user.rb +8 -0
  167. data/app/models/thredded/stats.rb +25 -0
  168. data/app/models/thredded/topic.rb +179 -0
  169. data/app/models/thredded/topic_category.rb +8 -0
  170. data/app/models/thredded/user_detail.rb +27 -0
  171. data/app/models/thredded/user_extender.rb +75 -0
  172. data/app/models/thredded/user_messageboard_preference.rb +45 -0
  173. data/app/models/thredded/user_permissions/admin/if_admin_column_true.rb +14 -0
  174. data/app/models/thredded/user_permissions/admin/none.rb +14 -0
  175. data/app/models/thredded/user_permissions/message/readers_of_writeable_boards.rb +15 -0
  176. data/app/models/thredded/user_permissions/moderate/if_moderator_column_true.rb +16 -0
  177. data/app/models/thredded/user_permissions/moderate/none.rb +16 -0
  178. data/app/models/thredded/user_permissions/read/all.rb +27 -0
  179. data/app/models/thredded/user_permissions/write/all.rb +16 -0
  180. data/app/models/thredded/user_permissions/write/none.rb +16 -0
  181. data/app/models/thredded/user_post_notification.rb +29 -0
  182. data/app/models/thredded/user_preference.rb +26 -0
  183. data/app/models/thredded/user_private_topic_read_state.rb +13 -0
  184. data/app/models/thredded/user_topic_follow.rb +34 -0
  185. data/app/models/thredded/user_topic_read_state.rb +13 -0
  186. data/app/notifiers/thredded/email_notifier.rb +25 -0
  187. data/app/policies/thredded/messageboard_group_policy.rb +16 -0
  188. data/app/policies/thredded/messageboard_policy.rb +49 -0
  189. data/app/policies/thredded/post_policy.rb +64 -0
  190. data/app/policies/thredded/private_post_policy.rb +38 -0
  191. data/app/policies/thredded/private_topic_policy.rb +24 -0
  192. data/app/policies/thredded/topic_policy.rb +49 -0
  193. data/app/view_hooks/thredded/all_view_hooks.rb +125 -0
  194. data/app/view_models/thredded/base_topic_view.rb +43 -0
  195. data/app/view_models/thredded/messageboard_group_view.rb +27 -0
  196. data/app/view_models/thredded/post_view.rb +89 -0
  197. data/app/view_models/thredded/posts_page_view.rb +27 -0
  198. data/app/view_models/thredded/private_topic_view.rb +20 -0
  199. data/app/view_models/thredded/private_topics_page_view.rb +31 -0
  200. data/app/view_models/thredded/topic_email_view.rb +18 -0
  201. data/app/view_models/thredded/topic_posts_page_view.rb +17 -0
  202. data/app/view_models/thredded/topic_view.rb +68 -0
  203. data/app/view_models/thredded/topics_page_view.rb +38 -0
  204. data/app/views/layouts/thredded/application.html.erb +18 -0
  205. data/app/views/thredded/categories/_category.html.erb +1 -0
  206. data/app/views/thredded/error_pages/forbidden.html.erb +6 -0
  207. data/app/views/thredded/error_pages/not_found.html.erb +6 -0
  208. data/app/views/thredded/kaminari/_first_page.html.erb +11 -0
  209. data/app/views/thredded/kaminari/_gap.html.erb +8 -0
  210. data/app/views/thredded/kaminari/_last_page.html.erb +11 -0
  211. data/app/views/thredded/kaminari/_next_page.html.erb +11 -0
  212. data/app/views/thredded/kaminari/_page.html.erb +12 -0
  213. data/app/views/thredded/kaminari/_paginator.html.erb +23 -0
  214. data/app/views/thredded/kaminari/_prev_page.html.erb +11 -0
  215. data/app/views/thredded/messageboard_groups/new.html.erb +28 -0
  216. data/app/views/thredded/messageboards/_form.html.erb +30 -0
  217. data/app/views/thredded/messageboards/_messageboard.html.erb +20 -0
  218. data/app/views/thredded/messageboards/_messageboard_meta.html.erb +13 -0
  219. data/app/views/thredded/messageboards/edit.html.erb +15 -0
  220. data/app/views/thredded/messageboards/index.html.erb +34 -0
  221. data/app/views/thredded/messageboards/new.html.erb +15 -0
  222. data/app/views/thredded/moderation/_nav.html.erb +19 -0
  223. data/app/views/thredded/moderation/_post.html.erb +19 -0
  224. data/app/views/thredded/moderation/_post_moderation_actions.html.erb +12 -0
  225. data/app/views/thredded/moderation/_post_moderation_record.html.erb +46 -0
  226. data/app/views/thredded/moderation/_user_moderation_state.html.erb +3 -0
  227. data/app/views/thredded/moderation/_user_post.html.erb +12 -0
  228. data/app/views/thredded/moderation/_users_search_form.html.erb +13 -0
  229. data/app/views/thredded/moderation/activity.html.erb +20 -0
  230. data/app/views/thredded/moderation/history.html.erb +13 -0
  231. data/app/views/thredded/moderation/pending.html.erb +24 -0
  232. data/app/views/thredded/moderation/user.html.erb +54 -0
  233. data/app/views/thredded/moderation/users.html.erb +41 -0
  234. data/app/views/thredded/post_mailer/post_notification.html.erb +26 -0
  235. data/app/views/thredded/post_mailer/post_notification.text.erb +14 -0
  236. data/app/views/thredded/post_previews/preview.html.erb +1 -0
  237. data/app/views/thredded/post_previews/update.html.erb +1 -0
  238. data/app/views/thredded/posts/_content.html.erb +1 -0
  239. data/app/views/thredded/posts/_form.html.erb +5 -0
  240. data/app/views/thredded/posts/_post.html.erb +13 -0
  241. data/app/views/thredded/posts/_user.html.erb +3 -0
  242. data/app/views/thredded/posts/edit.html.erb +16 -0
  243. data/app/views/thredded/posts/new.html.erb +15 -0
  244. data/app/views/thredded/posts_common/_actions.html.erb +28 -0
  245. data/app/views/thredded/posts_common/_content.html.erb +3 -0
  246. data/app/views/thredded/posts_common/_form.html.erb +22 -0
  247. data/app/views/thredded/posts_common/_header.html.erb +8 -0
  248. data/app/views/thredded/posts_common/_header_with_topic.html.erb +15 -0
  249. data/app/views/thredded/posts_common/_header_with_user_and_topic.html.erb +18 -0
  250. data/app/views/thredded/posts_common/actions/_delete.html.erb +4 -0
  251. data/app/views/thredded/posts_common/actions/_edit.html.erb +3 -0
  252. data/app/views/thredded/posts_common/actions/_mark_as_unread.html.erb +2 -0
  253. data/app/views/thredded/posts_common/actions/_quote.html.erb +4 -0
  254. data/app/views/thredded/posts_common/form/_after_content.html.erb +8 -0
  255. data/app/views/thredded/posts_common/form/_before_content.html.erb +8 -0
  256. data/app/views/thredded/posts_common/form/_content.html.erb +7 -0
  257. data/app/views/thredded/posts_common/form/_content_field.html.erb +8 -0
  258. data/app/views/thredded/posts_common/form/_preview_area.html.erb +16 -0
  259. data/app/views/thredded/preferences/_form.html.erb +95 -0
  260. data/app/views/thredded/preferences/_messageboards_nav.html.erb +8 -0
  261. data/app/views/thredded/preferences/_messageboards_nav_item.html.erb +2 -0
  262. data/app/views/thredded/preferences/edit.html.erb +20 -0
  263. data/app/views/thredded/private_post_previews/preview.html.erb +1 -0
  264. data/app/views/thredded/private_post_previews/update.html.erb +1 -0
  265. data/app/views/thredded/private_posts/_content.html.erb +1 -0
  266. data/app/views/thredded/private_posts/_form.html.erb +6 -0
  267. data/app/views/thredded/private_posts/_private_post.html.erb +6 -0
  268. data/app/views/thredded/private_posts/edit.html.erb +16 -0
  269. data/app/views/thredded/private_posts/new.html.erb +11 -0
  270. data/app/views/thredded/private_topic_mailer/message_notification.html.erb +26 -0
  271. data/app/views/thredded/private_topic_mailer/message_notification.text.erb +15 -0
  272. data/app/views/thredded/private_topic_previews/preview.html.erb +1 -0
  273. data/app/views/thredded/private_topics/_breadcrumbs.html.erb +4 -0
  274. data/app/views/thredded/private_topics/_form.html.erb +39 -0
  275. data/app/views/thredded/private_topics/_header.html.erb +17 -0
  276. data/app/views/thredded/private_topics/_no_private_topics.html.erb +6 -0
  277. data/app/views/thredded/private_topics/_private_topic.html.erb +23 -0
  278. data/app/views/thredded/private_topics/edit.html.erb +35 -0
  279. data/app/views/thredded/private_topics/header/_participant.html.erb +1 -0
  280. data/app/views/thredded/private_topics/index.html.erb +32 -0
  281. data/app/views/thredded/private_topics/new.html.erb +11 -0
  282. data/app/views/thredded/private_topics/private_topic/_participant.html.erb +1 -0
  283. data/app/views/thredded/private_topics/show.html.erb +28 -0
  284. data/app/views/thredded/search/_form.html.erb +13 -0
  285. data/app/views/thredded/shared/_breadcrumbs.html.erb +6 -0
  286. data/app/views/thredded/shared/_content_moderation_blocked_state.html.erb +8 -0
  287. data/app/views/thredded/shared/_currently_online.html.erb +6 -0
  288. data/app/views/thredded/shared/_flash_messages.html.erb +7 -0
  289. data/app/views/thredded/shared/_header.html.erb +3 -0
  290. data/app/views/thredded/shared/_nav.html.erb +19 -0
  291. data/app/views/thredded/shared/_page.html.erb +15 -0
  292. data/app/views/thredded/shared/currently_online/_header.html.erb +5 -0
  293. data/app/views/thredded/shared/currently_online/_user_list.html.erb +3 -0
  294. data/app/views/thredded/shared/currently_online/_user_list_item.html.erb +6 -0
  295. data/app/views/thredded/shared/nav/_moderation.html.erb +14 -0
  296. data/app/views/thredded/shared/nav/_notification_preferences.html.erb +8 -0
  297. data/app/views/thredded/shared/nav/_private_topics.html.erb +12 -0
  298. data/app/views/thredded/shared/nav/_standalone.html.erb +12 -0
  299. data/app/views/thredded/shared/nav/_standalone_profile.html.erb +3 -0
  300. data/app/views/thredded/shared/preview.html.erb +10 -0
  301. data/app/views/thredded/theme_previews/_section_title.html.erb +3 -0
  302. data/app/views/thredded/theme_previews/show.html.erb +99 -0
  303. data/app/views/thredded/topic_previews/preview.html.erb +1 -0
  304. data/app/views/thredded/topics/_followers.html.erb +12 -0
  305. data/app/views/thredded/topics/_form.html.erb +32 -0
  306. data/app/views/thredded/topics/_header.html.erb +32 -0
  307. data/app/views/thredded/topics/_sticky_topics_divider.html.erb +1 -0
  308. data/app/views/thredded/topics/_topic.html.erb +47 -0
  309. data/app/views/thredded/topics/_topic_form_admin_options.html.erb +12 -0
  310. data/app/views/thredded/topics/edit.html.erb +50 -0
  311. data/app/views/thredded/topics/index.html.erb +35 -0
  312. data/app/views/thredded/topics/new.html.erb +12 -0
  313. data/app/views/thredded/topics/search.html.erb +39 -0
  314. data/app/views/thredded/topics/show.html.erb +46 -0
  315. data/app/views/thredded/users/_link.html.erb +14 -0
  316. data/app/views/thredded/users/_post.html.erb +6 -0
  317. data/app/views/thredded/users/_posts.html.erb +7 -0
  318. data/bin/rails +6 -0
  319. data/config/i18n-tasks.yml +16 -0
  320. data/config/locales/de.yml +257 -0
  321. data/config/locales/en.yml +253 -0
  322. data/config/locales/es.yml +257 -0
  323. data/config/locales/fr.yml +255 -0
  324. data/config/locales/it.yml +257 -0
  325. data/config/locales/pl.yml +257 -0
  326. data/config/locales/pt-BR.yml +258 -0
  327. data/config/locales/ru.yml +255 -0
  328. data/config/locales/zh-CN.yml +246 -0
  329. data/config/routes.rb +87 -0
  330. data/db/migrate/20160329231848_create_thredded.rb +257 -0
  331. data/db/seeds.rb +4 -0
  332. data/db/upgrade_migrations/20160611094616_upgrade_v0_5_to_v0_6.rb +28 -0
  333. data/db/upgrade_migrations/20160723012349_upgrade_v0_6_to_v0_7.rb +46 -0
  334. data/db/upgrade_migrations/20161019150201_upgrade_v0_7_to_v0_8.rb +34 -0
  335. data/db/upgrade_migrations/20161113161801_upgrade_v0_8_to_v0_9.rb +60 -0
  336. data/db/upgrade_migrations/20170125033319_upgrade_v0_9_to_v0_10.rb +36 -0
  337. data/db/upgrade_migrations/20170312131417_upgrade_thredded_v0_10_to_v0_11.rb +23 -0
  338. data/db/upgrade_migrations/20170420163138_upgrade_thredded_v0_11_to_v0_12.rb +28 -0
  339. data/db/upgrade_migrations/20170811090735_upgrade_thredded_v0_13_to_v_014.rb +21 -0
  340. data/lib/generators/thredded/install/USAGE +8 -0
  341. data/lib/generators/thredded/install/install_generator.rb +20 -0
  342. data/lib/generators/thredded/install/templates/initializer.rb +160 -0
  343. data/lib/tasks/thredded_tasks.rake +14 -0
  344. data/lib/thredded.rb +190 -0
  345. data/lib/thredded/base_migration.rb +14 -0
  346. data/lib/thredded/base_notifier.rb +28 -0
  347. data/lib/thredded/collection_to_strings_with_cache_renderer.rb +86 -0
  348. data/lib/thredded/content_formatter.rb +129 -0
  349. data/lib/thredded/database_seeder.rb +290 -0
  350. data/lib/thredded/db_tools.rb +103 -0
  351. data/lib/thredded/email_transformer.rb +22 -0
  352. data/lib/thredded/email_transformer/base.rb +47 -0
  353. data/lib/thredded/email_transformer/onebox.rb +21 -0
  354. data/lib/thredded/engine.rb +28 -0
  355. data/lib/thredded/errors.rb +68 -0
  356. data/lib/thredded/formatting_demo_content.rb +30 -0
  357. data/lib/thredded/html_pipeline/at_mention_filter.rb +78 -0
  358. data/lib/thredded/html_pipeline/autolink_filter.rb +15 -0
  359. data/lib/thredded/html_pipeline/kramdown_filter.rb +39 -0
  360. data/lib/thredded/html_pipeline/onebox_filter.rb +143 -0
  361. data/lib/thredded/html_pipeline/wrap_iframes_filter.rb +13 -0
  362. data/lib/thredded/version.rb +5 -0
  363. data/lib/thredded/view_hooks/config.rb +37 -0
  364. data/lib/thredded/view_hooks/renderer.rb +30 -0
  365. data/vendor/assets/javascripts/autosize.min.js +6 -0
  366. data/vendor/assets/javascripts/textcomplete.min.js +2 -0
  367. metadata +1035 -0
@@ -0,0 +1,143 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'onebox'
4
+
5
+ module Thredded
6
+ module HtmlPipeline
7
+ class OneboxFilter < ::HTML::Pipeline::Filter
8
+ SANITIZE_CONFIG = Sanitize::Config.merge(
9
+ Sanitize::Config::ONEBOX,
10
+ attributes: {
11
+ 'a' => Sanitize::Config::ONEBOX[:attributes]['a'] + %w[target],
12
+ },
13
+ add_attributes: {
14
+ 'iframe' => {
15
+ 'seamless' => 'seamless',
16
+ 'sandbox' => 'allow-same-origin allow-scripts allow-forms allow-popups allow-popups-to-escape-sandbox' \
17
+ ' allow-presentation',
18
+ }
19
+ },
20
+ transformers: (Sanitize::Config::ONEBOX[:transformers] || []) + [
21
+ lambda do |env|
22
+ next unless env[:node_name] == 'a'
23
+ a_tag = env[:node]
24
+ a_tag['href'] ||= '#'
25
+ if a_tag['href'] =~ %r{^(?:[a-z]+:)?//}
26
+ a_tag['target'] = '_blank'
27
+ a_tag['rel'] = 'nofollow noopener'
28
+ else
29
+ a_tag.remove_attribute('target')
30
+ end
31
+ end
32
+ ]
33
+ )
34
+
35
+ class << self
36
+ # In development and test, caching is usually disabled.
37
+ # Regardless, always store the onebox in a file cache to enable offline development,
38
+ # persistence between test runs, and to improve performance.
39
+ attr_accessor :onebox_views_cache
40
+ attr_accessor :onebox_data_cache
41
+ end
42
+
43
+ if Rails.env.development? || Rails.env.test?
44
+ self.onebox_views_cache = ActiveSupport::Cache::FileStore.new('tmp/cache/onebox-views')
45
+ self.onebox_data_cache = ActiveSupport::Cache::FileStore.new('tmp/cache/onebox-data')
46
+ end
47
+
48
+ def call
49
+ doc.css('a').each do |element|
50
+ url = element['href'].to_s
51
+ next unless url.present? && url == element.content && on_its_own_line?(element)
52
+ onebox_html = render_onebox_with_cache(url)
53
+ next if onebox_html.empty?
54
+ fixup_paragraph! element
55
+ element.swap onebox_html
56
+ end
57
+ doc
58
+ end
59
+
60
+ private
61
+
62
+ def render_onebox_with_cache(url)
63
+ onebox_views_cache.fetch("onebox-views:#{url}#{':p' if context[:onebox_placeholders]}",
64
+ expires_in: context[:onebox_views_cache_expires_in] || 1.week) do
65
+ render_onebox(url)
66
+ end
67
+ end
68
+
69
+ def render_onebox(url)
70
+ preview = Onebox.preview(url, onebox_options(url))
71
+ if context[:onebox_placeholders]
72
+ %(<p><a href="#{ERB::Util.html_escape(url)}" target="_blank" rel="nofollow noopener">) \
73
+ "#{preview.placeholder_html}</a></p>"
74
+ else
75
+ preview.to_s.strip
76
+ end
77
+ rescue StandardError => e
78
+ Rails.logger.error("Onebox error for #{url}: #{e}")
79
+ <<~HTML
80
+ <p><a href="#{ERB::Util.html_escape(url)}" target="_blank" rel="nofollow noopener">#{ERB::Util.html_escape(url)}</p>
81
+ HTML
82
+ end
83
+
84
+ def onebox_options(_url)
85
+ { cache: context[:onebox_data_cache] || self.class.onebox_data_cache || Rails.cache,
86
+ sanitize_config: SANITIZE_CONFIG }
87
+ end
88
+
89
+ def onebox_views_cache
90
+ context[:onebox_views_cache] || self.class.onebox_views_cache || Rails.cache
91
+ end
92
+
93
+ def on_its_own_line?(element)
94
+ siblings = element.parent.children
95
+ element_index = siblings.index(element)
96
+ all_blank_until_br?(siblings[0...element_index].reverse) &&
97
+ all_blank_until_br?(siblings[element_index + 1..-1])
98
+ end
99
+
100
+ def all_blank_until_br?(nodes)
101
+ nodes.take_while { |node| !node_name?(node, 'br') }
102
+ .all? { |node| node.text? && node.blank? }
103
+ end
104
+
105
+ def fixup_paragraph!(element)
106
+ # Can't have a div inside a paragraph, so split the paragraph
107
+ p = element.parent
108
+ return unless node_name?(p, 'p')
109
+ children_after = p.children[p.children.index(element) + 1..-1]
110
+ remove_leading_blanks! children_after
111
+ # Move the onebox out of and after the paragraph
112
+ p.add_next_sibling element
113
+ # Move all the elements after the onebox to a new paragraph
114
+ unless children_after.empty?
115
+ new_p = Nokogiri::XML::Node.new 'p', doc
116
+ element.add_next_sibling new_p
117
+ children_after.each { |child| new_p.add_child child }
118
+ end
119
+ # The original paragraph might have been split just after a <br> or whitespace, remove them if so:
120
+ remove_leading_blanks! p.children.reverse
121
+ p.remove if p.children.empty?
122
+ end
123
+
124
+ # @param children [Nokogiri::XML::NodeSet]
125
+ def remove_leading_blanks!(children)
126
+ to_remove = children.take_while do |c|
127
+ if node_name?(c, 'br') || c.text? && c.content.blank?
128
+ c.remove
129
+ true
130
+ else
131
+ c.content = c.content.lstrip
132
+ false
133
+ end
134
+ end
135
+ to_remove.each { |c| children.delete(c) }
136
+ end
137
+
138
+ def node_name?(node, node_name)
139
+ node && node.node_name && node.node_name.casecmp(node_name).zero?
140
+ end
141
+ end
142
+ end
143
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Thredded
4
+ module HtmlPipeline
5
+ # Wraps iframes with a <div class="thredded--embed-16-by-9"/>
6
+ class WrapIframesFilter < ::HTML::Pipeline::Filter
7
+ def call
8
+ doc.css('iframe').wrap('<div class="thredded--embed-16-by-9"/>')
9
+ doc
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Thredded
4
+ VERSION = '0.14.5'
5
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Thredded
4
+ module ViewHooks
5
+ class Config
6
+ def initialize
7
+ # @type Array<Proc>
8
+ @before = []
9
+ # @type Array<Proc>
10
+ @replace = []
11
+ # @type Array<Proc>
12
+ @after = []
13
+ end
14
+
15
+ # @param [Proc] block
16
+ # @return [Array<Proc>]
17
+ def before(&block)
18
+ @before << block if block
19
+ @before
20
+ end
21
+
22
+ # @param [Proc] block
23
+ # @return [Array<Proc>]
24
+ def replace(&block)
25
+ @replace << block if block
26
+ @replace
27
+ end
28
+
29
+ # @param [Proc] block
30
+ # @return [Array<Proc>]
31
+ def after(&block)
32
+ @after << block if block
33
+ @after
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Thredded
4
+ module ViewHooks
5
+ class Renderer
6
+ # @param config [Thredded::ViewHooks::Config]
7
+ def initialize(view_context, config)
8
+ @view_context = view_context
9
+ @config = config
10
+ end
11
+
12
+ # @return [String]
13
+ def render(**args, &original_content)
14
+ @view_context.safe_join [
15
+ *@config.before,
16
+ *(@config.replace.presence || [original_content]),
17
+ *@config.after,
18
+ ].map { |proc| render_proc(**args, &proc) }, ''
19
+ end
20
+
21
+ private
22
+
23
+ def render_proc(**args, &proc)
24
+ @view_context.capture do
25
+ @view_context.instance_exec(**args, &proc)
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,6 @@
1
+ /*!
2
+ Autosize 4.0.0
3
+ license: MIT
4
+ http://www.jacklmoore.com/autosize
5
+ */
6
+ !function(e,t){if("function"==typeof define&&define.amd)define(["exports","module"],t);else if("undefined"!=typeof exports&&"undefined"!=typeof module)t(exports,module);else{var n={exports:{}};t(n.exports,n),e.autosize=n.exports}}(this,function(e,t){"use strict";function n(e){function t(){var t=window.getComputedStyle(e,null);"vertical"===t.resize?e.style.resize="none":"both"===t.resize&&(e.style.resize="horizontal"),s="content-box"===t.boxSizing?-(parseFloat(t.paddingTop)+parseFloat(t.paddingBottom)):parseFloat(t.borderTopWidth)+parseFloat(t.borderBottomWidth),isNaN(s)&&(s=0),l()}function n(t){var n=e.style.width;e.style.width="0px",e.offsetWidth,e.style.width=n,e.style.overflowY=t}function o(e){for(var t=[];e&&e.parentNode&&e.parentNode instanceof Element;)e.parentNode.scrollTop&&t.push({node:e.parentNode,scrollTop:e.parentNode.scrollTop}),e=e.parentNode;return t}function r(){var t=e.style.height,n=o(e),r=document.documentElement&&document.documentElement.scrollTop;e.style.height="";var i=e.scrollHeight+s;return 0===e.scrollHeight?void(e.style.height=t):(e.style.height=i+"px",u=e.clientWidth,n.forEach(function(e){e.node.scrollTop=e.scrollTop}),void(r&&(document.documentElement.scrollTop=r)))}function l(){r();var t=Math.round(parseFloat(e.style.height)),o=window.getComputedStyle(e,null),i="content-box"===o.boxSizing?Math.round(parseFloat(o.height)):e.offsetHeight;if(i!==t?"hidden"===o.overflowY&&(n("scroll"),r(),i="content-box"===o.boxSizing?Math.round(parseFloat(window.getComputedStyle(e,null).height)):e.offsetHeight):"hidden"!==o.overflowY&&(n("hidden"),r(),i="content-box"===o.boxSizing?Math.round(parseFloat(window.getComputedStyle(e,null).height)):e.offsetHeight),a!==i){a=i;var l=d("autosize:resized");try{e.dispatchEvent(l)}catch(e){}}}if(e&&e.nodeName&&"TEXTAREA"===e.nodeName&&!i.has(e)){var s=null,u=e.clientWidth,a=null,c=function(){e.clientWidth!==u&&l()},p=function(t){window.removeEventListener("resize",c,!1),e.removeEventListener("input",l,!1),e.removeEventListener("keyup",l,!1),e.removeEventListener("autosize:destroy",p,!1),e.removeEventListener("autosize:update",l,!1),Object.keys(t).forEach(function(n){e.style[n]=t[n]}),i.delete(e)}.bind(e,{height:e.style.height,resize:e.style.resize,overflowY:e.style.overflowY,overflowX:e.style.overflowX,wordWrap:e.style.wordWrap});e.addEventListener("autosize:destroy",p,!1),"onpropertychange"in e&&"oninput"in e&&e.addEventListener("keyup",l,!1),window.addEventListener("resize",c,!1),e.addEventListener("input",l,!1),e.addEventListener("autosize:update",l,!1),e.style.overflowX="hidden",e.style.wordWrap="break-word",i.set(e,{destroy:p,update:l}),t()}}function o(e){var t=i.get(e);t&&t.destroy()}function r(e){var t=i.get(e);t&&t.update()}var i="function"==typeof Map?new Map:function(){var e=[],t=[];return{has:function(t){return e.indexOf(t)>-1},get:function(n){return t[e.indexOf(n)]},set:function(n,o){e.indexOf(n)===-1&&(e.push(n),t.push(o))},delete:function(n){var o=e.indexOf(n);o>-1&&(e.splice(o,1),t.splice(o,1))}}}(),d=function(e){return new Event(e,{bubbles:!0})};try{new Event("test")}catch(e){d=function(e){var t=document.createEvent("Event");return t.initEvent(e,!0,!1),t}}var l=null;"undefined"==typeof window||"function"!=typeof window.getComputedStyle?(l=function(e){return e},l.destroy=function(e){return e},l.update=function(e){return e}):(l=function(e,t){return e&&Array.prototype.forEach.call(e.length?e:[e],function(e){return n(e,t)}),e},l.destroy=function(e){return e&&Array.prototype.forEach.call(e.length?e:[e],o),e},l.update=function(e){return e&&Array.prototype.forEach.call(e.length?e:[e],r),e}),t.exports=l});
@@ -0,0 +1,2 @@
1
+ /** https://unpkg.com/textcomplete@0.14.5/dist/textcomplete.min.js **/
2
+ !function(e){function t(r){if(n[r])return n[r].exports;var i=n[r]={i:r,l:!1,exports:{}};return e[r].call(i.exports,i,i.exports,t),i.l=!0,i.exports}var n={};t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=6)}([function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),o=n(2),s=(function(e){e&&e.__esModule}(o),function(){function e(t,n,i){r(this,e),this.data=t,this.term=n,this.strategy=i}return i(e,[{key:"replace",value:function(e,t){var n=this.strategy.replace(this.data);if(null!==n){Array.isArray(n)&&(t=n[1]+t,n=n[0]);var r=this.strategy.matchText(e);if(r)return n=n.replace(/\$&/g,r[0]).replace(/\$(\d)/g,function(e,t){return r[parseInt(t,10)]}),[[e.slice(0,r.index),n,e.slice(r.index+r[0].length)].join(""),t]}}},{key:"render",value:function(){return this.strategy.template(this.data,this.term)}}]),e}());t.default=s},function(e){"use strict";function t(){}function n(e,t,n){this.fn=e,this.context=t,this.once=n||!1}function r(){this._events=new t,this._eventsCount=0}var i=Object.prototype.hasOwnProperty,o="~";Object.create&&(t.prototype=Object.create(null),(new t).__proto__||(o=!1)),r.prototype.eventNames=function(){var e,t,n=[];if(0===this._eventsCount)return n;for(t in e=this._events)i.call(e,t)&&n.push(o?t.slice(1):t);return Object.getOwnPropertySymbols?n.concat(Object.getOwnPropertySymbols(e)):n},r.prototype.listeners=function(e,t){var n=o?o+e:e,r=this._events[n];if(t)return!!r;if(!r)return[];if(r.fn)return[r.fn];for(var i=0,s=r.length,u=new Array(s);i<s;i++)u[i]=r[i].fn;return u},r.prototype.emit=function(e,t,n,r,i,s){var u=o?o+e:e;if(!this._events[u])return!1;var a,l,c=this._events[u],h=arguments.length;if(c.fn){switch(c.once&&this.removeListener(e,c.fn,void 0,!0),h){case 1:return c.fn.call(c.context),!0;case 2:return c.fn.call(c.context,t),!0;case 3:return c.fn.call(c.context,t,n),!0;case 4:return c.fn.call(c.context,t,n,r),!0;case 5:return c.fn.call(c.context,t,n,r,i),!0;case 6:return c.fn.call(c.context,t,n,r,i,s),!0}for(l=1,a=new Array(h-1);l<h;l++)a[l-1]=arguments[l];c.fn.apply(c.context,a)}else{var f,d=c.length;for(l=0;l<d;l++)switch(c[l].once&&this.removeListener(e,c[l].fn,void 0,!0),h){case 1:c[l].fn.call(c[l].context);break;case 2:c[l].fn.call(c[l].context,t);break;case 3:c[l].fn.call(c[l].context,t,n);break;case 4:c[l].fn.call(c[l].context,t,n,r);break;default:if(!a)for(f=1,a=new Array(h-1);f<h;f++)a[f-1]=arguments[f];c[l].fn.apply(c[l].context,a)}}return!0},r.prototype.on=function(e,t,r){var i=new n(t,r||this),s=o?o+e:e;return this._events[s]?this._events[s].fn?this._events[s]=[this._events[s],i]:this._events[s].push(i):(this._events[s]=i,this._eventsCount++),this},r.prototype.once=function(e,t,r){var i=new n(t,r||this,!0),s=o?o+e:e;return this._events[s]?this._events[s].fn?this._events[s]=[this._events[s],i]:this._events[s].push(i):(this._events[s]=i,this._eventsCount++),this},r.prototype.removeListener=function(e,n,r,i){var s=o?o+e:e;if(!this._events[s])return this;if(!n)return 0==--this._eventsCount?this._events=new t:delete this._events[s],this;var u=this._events[s];if(u.fn)u.fn!==n||i&&!u.once||r&&u.context!==r||(0==--this._eventsCount?this._events=new t:delete this._events[s]);else{for(var a=0,l=[],c=u.length;a<c;a++)(u[a].fn!==n||i&&!u[a].once||r&&u[a].context!==r)&&l.push(u[a]);l.length?this._events[s]=1===l.length?l[0]:l:0==--this._eventsCount?this._events=new t:delete this._events[s]}return this},r.prototype.removeAllListeners=function(e){var n;return e?(n=o?o+e:e,this._events[n]&&(0==--this._eventsCount?this._events=new t:delete this._events[n])):(this._events=new t,this._eventsCount=0),this},r.prototype.off=r.prototype.removeListener,r.prototype.addListener=r.prototype.on,r.prototype.setMaxListeners=function(){return this},r.prefixed=o,r.EventEmitter=r,e.exports=r},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e){return e}Object.defineProperty(t,"__esModule",{value:!0});var o=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),s=n(10),u=function(e){return e&&e.__esModule?e:{default:e}}(s),a=function(){function e(t){r(this,e),this.props=t,this.cache=t.cache?{}:null}return o(e,[{key:"destroy",value:function(){return this.cache=null,this}},{key:"buildQuery",value:function(e){if("function"==typeof this.props.context){var t=this.props.context(e);if("string"==typeof t)e=t;else if(!t)return null}var n=this.matchText(e);return n?new u.default(this,n[this.index],n):null}},{key:"search",value:function(e,t,n){this.cache?this.searchWithCache(e,t,n):this.props.search(e,t,n)}},{key:"replace",value:function(e){return this.props.replace(e)}},{key:"searchWithCache",value:function(e,t,n){var r=this;this.cache&&this.cache[e]?t(this.cache[e]):this.props.search(e,function(n){r.cache&&(r.cache[e]=n),t(n)},n)}},{key:"matchText",value:function(e){return"function"==typeof this.match?this.match(e):e.match(this.match)}},{key:"match",get:function(){return this.props.match}},{key:"index",get:function(){return"number"==typeof this.props.index?this.props.index:2}},{key:"template",get:function(){return this.props.template||i}}]),e}();t.default=a},function(e,t){"use strict";function n(e){var t=e.getBoundingClientRect(),n=e.ownerDocument,r=n.defaultView,i=n.documentElement,o={top:t.top+r.pageYOffset,left:t.left+r.pageXOffset};return i&&(o.top-=i.clientTop,o.left-=i.clientLeft),o}function r(e){return e>=o&&e<=s}function i(e){var t=window.getComputedStyle(e);if(r(t.lineHeight.charCodeAt(0)))return r(t.lineHeight.charCodeAt(t.lineHeight.length-1))?parseFloat(t.lineHeight)*parseFloat(t.fontSize):parseFloat(t.lineHeight);var n=document.body;if(!n)return 0;var i=document.createElement(e.nodeName);i.innerHTML="&nbsp;",i.style.fontSize=t.fontSize,i.style.fontFamily=t.fontFamily,n.appendChild(i);var o=i.offsetHeight;return n.removeChild(i),o}Object.defineProperty(t,"__esModule",{value:!0}),t.calculateElementOffset=n,t.getLineHeightPx=i;var o=(t.createCustomEvent=function(){return"function"==typeof window.CustomEvent?function(e,t){return new document.defaultView.CustomEvent(e,{cancelable:t&&t.cancelable||!1,detail:t&&t.detail||void 0})}:function(e,t){var n=document.createEvent("CustomEvent");return n.initCustomEvent(e,!1,t&&t.cancelable||!1,t&&t.detail||void 0),n}}(),"0".charCodeAt(0)),s="9".charCodeAt(0)},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var u=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),a=n(1),l=r(a),c=n(3),h=n(0),f=(r(h),function(e){function t(){return i(this,t),o(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return s(t,e),u(t,[{key:"destroy",value:function(){return this}},{key:"applySearchResult",value:function(){throw new Error("Not implemented.")}},{key:"getCursorOffset",value:function(){throw new Error("Not implemented.")}},{key:"getBeforeCursor",value:function(){throw new Error("Not implemented.")}},{key:"emitMoveEvent",value:function(e){var t=(0,c.createCustomEvent)("move",{cancelable:!0,detail:{code:e}});return this.emit("move",t),t}},{key:"emitEnterEvent",value:function(){var e=(0,c.createCustomEvent)("enter",{cancelable:!0});return this.emit("enter",e),e}},{key:"emitChangeEvent",value:function(){var e=(0,c.createCustomEvent)("change",{detail:{beforeCursor:this.getBeforeCursor()}});return this.emit("change",e),e}},{key:"emitEscEvent",value:function(){var e=(0,c.createCustomEvent)("esc",{cancelable:!0});return this.emit("esc",e),e}},{key:"getCode",value:function(e){return 9===e.keyCode?"ENTER":13===e.keyCode?"ENTER":27===e.keyCode?"ESC":38===e.keyCode?"UP":40===e.keyCode?"DOWN":78===e.keyCode&&e.ctrlKey?"DOWN":80===e.keyCode&&e.ctrlKey?"UP":"OTHER"}}]),t}(l.default));t.default=f},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var u=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),a=n(1),l=r(a),c=n(11),h=r(c),f=n(0),d=(r(f),n(3)),p="dropdown-menu textcomplete-dropdown",v=function(e){function t(e){i(this,t);var n=o(this,(t.__proto__||Object.getPrototypeOf(t)).call(this));n.shown=!1,n.items=[],n.activeItem=null,n.footer=e.footer,n.header=e.header,n.maxCount=e.maxCount||10,n.el.className=e.className||p,n.rotate=!e.hasOwnProperty("rotate")||e.rotate,n.placement=e.placement;var r=e.style;return r&&Object.keys(r).forEach(function(e){n.el.style[e]=r[e]}),n}return s(t,e),u(t,null,[{key:"createElement",value:function(){var e=document.createElement("ul"),t=e.style;t.display="none",t.position="absolute",t.zIndex="10000";var n=document.body;return n&&n.appendChild(e),e}}]),u(t,[{key:"destroy",value:function(){var e=this.el.parentNode;return e&&e.removeChild(this.el),this.clear()._el=null,this}},{key:"render",value:function(e,t){var n=(0,d.createCustomEvent)("render",{cancelable:!0});if(this.emit("render",n),n.defaultPrevented)return this;var r=e.map(function(e){return e.data}),i=e.slice(0,this.maxCount||e.length).map(function(e){return new h.default(e)});return this.clear().setStrategyId(e[0]).renderEdge(r,"header").append(i).renderEdge(r,"footer").setOffset(t).show(),this.emit("rendered",(0,d.createCustomEvent)("rendered")),this}},{key:"deactivate",value:function(){return this.hide().clear()}},{key:"select",value:function(e){var t={searchResult:e.searchResult},n=(0,d.createCustomEvent)("select",{cancelable:!0,detail:t});return this.emit("select",n),n.defaultPrevented?this:(this.deactivate(),this.emit("selected",(0,d.createCustomEvent)("selected",{detail:t})),this)}},{key:"up",value:function(e){return this.shown?this.moveActiveItem("prev",e):this}},{key:"down",value:function(e){return this.shown?this.moveActiveItem("next",e):this}},{key:"getActiveItem",value:function(){return this.activeItem}},{key:"append",value:function(e){var t=this,n=document.createDocumentFragment();return e.forEach(function(e){t.items.push(e),e.appended(t),n.appendChild(e.el)}),this.el.appendChild(n),this}},{key:"setOffset",value:function(e){if(e.left?this.el.style.left=e.left+"px":e.right&&(this.el.style.right=e.right+"px"),this.isPlacementTop()){var t=document.documentElement;t&&(this.el.style.bottom=t.clientHeight-e.top+e.lineHeight+"px")}else this.el.style.top=e.top+"px";return this}},{key:"show",value:function(){if(!this.shown){var e=(0,d.createCustomEvent)("show",{cancelable:!0});if(this.emit("show",e),e.defaultPrevented)return this;this.el.style.display="block",this.shown=!0,this.emit("shown",(0,d.createCustomEvent)("shown"))}return this}},{key:"hide",value:function(){if(this.shown){var e=(0,d.createCustomEvent)("hide",{cancelable:!0});if(this.emit("hide",e),e.defaultPrevented)return this;this.el.style.display="none",this.shown=!1,this.emit("hidden",(0,d.createCustomEvent)("hidden"))}return this}},{key:"clear",value:function(){return this.el.innerHTML="",this.items.forEach(function(e){return e.destroy()}),this.items=[],this}},{key:"moveActiveItem",value:function(e,t){var n="next"===e?this.activeItem?this.activeItem.next:this.items[0]:this.activeItem?this.activeItem.prev:this.items[this.items.length-1];return n&&(n.activate(),t.preventDefault()),this}},{key:"setStrategyId",value:function(e){var t=e&&e.strategy.props.id;return t?this.el.setAttribute("data-strategy",t):this.el.removeAttribute("data-strategy"),this}},{key:"renderEdge",value:function(e,t){var n=("header"===t?this.header:this.footer)||"",r="function"==typeof n?n(e):n,i=document.createElement("li");return i.classList.add("textcomplete-"+t),i.innerHTML=r,this.el.appendChild(i),this}},{key:"isPlacementTop",value:function(){return"top"===this.placement}},{key:"el",get:function(){return this._el||(this._el=t.createElement()),this._el}}]),t}(l.default);t.default=v},function(e,t,n){"use strict";(function(e){function t(e){return e&&e.__esModule?e:{default:e}}var r=n(8),i=t(r),o=n(12),s=t(o),u=void 0;u=e.Textcomplete&&e.Textcomplete.editors?e.Textcomplete.editors:{},u.Textarea=s.default,e.Textcomplete=i.default,e.Textcomplete.editors=u}).call(t,n(7))},function(e){var t;t=function(){return this}();try{t=t||Function("return this")()||(0,eval)("this")}catch(e){"object"==typeof window&&(t=window)}e.exports=t},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var u=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),a=n(9),l=r(a),c=n(4),h=(r(c),n(5)),f=r(h),d=n(2),p=r(d),v=n(0),y=(r(v),n(1)),m=r(y),g=["handleChange","handleEnter","handleEsc","handleHit","handleMove","handleSelect"],b=function(e){function t(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};i(this,t);var r=o(this,(t.__proto__||Object.getPrototypeOf(t)).call(this));return r.completer=new l.default,r.isQueryInFlight=!1,r.nextPendingQuery=null,r.dropdown=new f.default(n.dropdown||{}),r.editor=e,r.options=n,g.forEach(function(e){r[e]=r[e].bind(r)}),r.startListening(),r}return s(t,e),u(t,[{key:"destroy",value:function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];return this.completer.destroy(),this.dropdown.destroy(),e&&this.editor.destroy(),this.stopListening(),this}},{key:"register",value:function(e){var t=this;return e.forEach(function(e){t.completer.registerStrategy(new p.default(e))}),this}},{key:"trigger",value:function(e){return this.isQueryInFlight?this.nextPendingQuery=e:(this.isQueryInFlight=!0,this.nextPendingQuery=null,this.completer.run(e)),this}},{key:"handleHit",value:function(e){var t=e.searchResults;t.length?this.dropdown.render(t,this.editor.getCursorOffset()):this.dropdown.deactivate(),this.isQueryInFlight=!1,null!==this.nextPendingQuery&&this.trigger(this.nextPendingQuery)}},{key:"handleMove",value:function(e){"UP"===e.detail.code?this.dropdown.up(e):this.dropdown.down(e)}},{key:"handleEnter",value:function(e){var t=this.dropdown.getActiveItem();t?(this.dropdown.select(t),e.preventDefault()):this.dropdown.deactivate()}},{key:"handleEsc",value:function(e){this.dropdown.shown&&(this.dropdown.deactivate(),e.preventDefault())}},{key:"handleChange",value:function(e){null!=e.detail.beforeCursor?this.trigger(e.detail.beforeCursor):this.dropdown.deactivate()}},{key:"handleSelect",value:function(e){this.emit("select",e),e.defaultPrevented||this.editor.applySearchResult(e.detail.searchResult)}},{key:"startListening",value:function(){var e=this;this.editor.on("move",this.handleMove).on("enter",this.handleEnter).on("esc",this.handleEsc).on("change",this.handleChange),this.dropdown.on("select",this.handleSelect),["show","shown","render","rendered","selected","hidden","hide"].forEach(function(t){e.dropdown.on(t,function(){return e.emit(t)})}),this.completer.on("hit",this.handleHit)}},{key:"stopListening",value:function(){this.completer.removeAllListeners(),this.dropdown.removeAllListeners(),this.editor.removeListener("move",this.handleMove).removeListener("enter",this.handleEnter).removeListener("esc",this.handleEsc).removeListener("change",this.handleChange)}}]),t}(m.default);t.default=b},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var u=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),a=n(1),l=r(a),c=n(2),h=(r(c),n(0)),f=(r(h),["handleQueryResult"]),d=function(e){function t(){i(this,t);var e=o(this,(t.__proto__||Object.getPrototypeOf(t)).call(this));return e.strategies=[],f.forEach(function(t){e[t]=e[t].bind(e)}),e}return s(t,e),u(t,[{key:"destroy",value:function(){return this.strategies.forEach(function(e){return e.destroy()}),this}},{key:"registerStrategy",value:function(e){return this.strategies.push(e),this}},{key:"run",value:function(e){var t=this.extractQuery(e);t?t.execute(this.handleQueryResult):this.handleQueryResult([])}},{key:"extractQuery",value:function(e){for(var t=0;t<this.strategies.length;t++){var n=this.strategies[t].buildQuery(e);if(n)return n}return null}},{key:"handleQueryResult",value:function(e){this.emit("hit",{searchResults:e})}}]),t}(l.default);t.default=d},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var o=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),s=n(0),u=r(s),a=n(2),l=(r(a),function(){function e(t,n,r){i(this,e),this.strategy=t,this.term=n,this.match=r}return o(e,[{key:"execute",value:function(e){var t=this;this.strategy.search(this.term,function(n){e(n.map(function(e){return new u.default(e,t.term,t.strategy)}))},this.match)}}]),e}());t.default=l},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0}),t.CLASS_NAME=void 0;var o=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),s=n(5),u=(r(s),n(0)),a=(r(u),t.CLASS_NAME="textcomplete-item"),l=a+" active",c=["onClick","onMouseover"],h=function(){function e(t){var n=this;i(this,e),this.searchResult=t,this.active=!1,c.forEach(function(e){n[e]=n[e].bind(n)})}return o(e,[{key:"destroy",value:function(){this.el.removeEventListener("mousedown",this.onClick,!1),this.el.removeEventListener("mouseover",this.onMouseover,!1),this.el.removeEventListener("touchstart",this.onClick,!1),this.active&&(this.dropdown.activeItem=null),this._el=null}},{key:"appended",value:function(e){this.dropdown=e,this.siblings=e.items,this.index=this.siblings.length-1}},{key:"activate",value:function(){if(!this.active){var e=this.dropdown.getActiveItem();e&&e.deactivate(),this.dropdown.activeItem=this,this.active=!0,this.el.className=l}return this}},{key:"deactivate",value:function(){return this.active&&(this.active=!1,this.el.className=a,this.dropdown.activeItem=null),this}},{key:"onClick",value:function(e){e.preventDefault(),this.dropdown.select(this)}},{key:"onMouseover",value:function(){this.activate()}},{key:"el",get:function(){if(this._el)return this._el;var e=document.createElement("li");e.className=this.active?l:a;var t=document.createElement("a");return t.innerHTML=this.searchResult.render(),e.appendChild(t),this._el=e,e.addEventListener("mousedown",this.onClick),e.addEventListener("mouseover",this.onMouseover),e.addEventListener("touchstart",this.onClick),e}},{key:"next",get:function(){var e=void 0;if(this.index===this.siblings.length-1){if(!this.dropdown.rotate)return null;e=0}else e=this.index+1;return this.siblings[e]}},{key:"prev",get:function(){var e=void 0;if(0===this.index){if(!this.dropdown.rotate)return null;e=this.siblings.length-1}else e=this.index-1;return this.siblings[e]}}]),e}();t.default=h},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var u=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),a=function e(t,n,r){null===t&&(t=Function.prototype);var i=Object.getOwnPropertyDescriptor(t,n);if(void 0===i){var o=Object.getPrototypeOf(t);return null===o?void 0:e(o,n,r)}if("value"in i)return i.value;var s=i.get;if(void 0!==s)return s.call(r)},l=n(13),c=r(l),h=n(4),f=r(h),d=n(3),p=n(0),v=(r(p),n(14)),y=["onInput","onKeydown"],m=function(e){function t(e){i(this,t);var n=o(this,(t.__proto__||Object.getPrototypeOf(t)).call(this));return n.el=e,y.forEach(function(e){n[e]=n[e].bind(n)}),n.startListening(),n}return s(t,e),u(t,[{key:"destroy",value:function(){return a(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"destroy",this).call(this),this.stopListening(),this.el=null,this}},{key:"applySearchResult",value:function(e){var t=this.getBeforeCursor();if(null!=t){var n=e.replace(t,this.getAfterCursor());this.el.focus(),Array.isArray(n)&&((0,c.default)(this.el,n[0],n[1]),this.el.dispatchEvent(new Event("input")))}}},{key:"getCursorOffset",value:function(){var e=(0,d.calculateElementOffset)(this.el),t=this.getElScroll(),n=this.getCursorPosition(),r=(0,d.getLineHeightPx)(this.el),i=e.top-t.top+n.top+r,o=e.left-t.left+n.left;return"rtl"!==this.el.dir?{top:i,left:o,lineHeight:r}:{top:i,right:document.documentElement?document.documentElement.clientWidth-o:0,lineHeight:r}}},{key:"getBeforeCursor",value:function(){return this.el.selectionStart!==this.el.selectionEnd?null:this.el.value.substring(0,this.el.selectionEnd)}},{key:"getAfterCursor",value:function(){return this.el.value.substring(this.el.selectionEnd)}},{key:"getElScroll",value:function(){return{top:this.el.scrollTop,left:this.el.scrollLeft}}},{key:"getCursorPosition",value:function(){return v(this.el,this.el.selectionEnd)}},{key:"onInput",value:function(){this.emitChangeEvent()}},{key:"onKeydown",value:function(e){var t=this.getCode(e),n=void 0;"UP"===t||"DOWN"===t?n=this.emitMoveEvent(t):"ENTER"===t?n=this.emitEnterEvent():"ESC"===t&&(n=this.emitEscEvent()),n&&n.defaultPrevented&&e.preventDefault()}},{key:"startListening",value:function(){this.el.addEventListener("input",this.onInput),this.el.addEventListener("keydown",this.onKeydown)}},{key:"stopListening",value:function(){this.el.removeEventListener("input",this.onInput),this.el.removeEventListener("keydown",this.onKeydown)}}]),t}(f.default);t.default=m},function(e,t){"use strict";function n(){if("undefined"!=typeof Event)return new Event("input",{bubbles:!0,cancelable:!0});var e=document.createEvent("Event");return e.initEvent("input",!0,!0),e}Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,r){for(var i=e.value,o=t+(r||""),s=document.activeElement,u=0,a=0;u<i.length&&u<o.length&&i[u]===o[u];)u++;for(;i.length-a-1>=0&&o.length-a-1>=0&&i[i.length-a-1]===o[o.length-a-1];)a++;u=Math.min(u,Math.min(i.length,o.length)-a),e.setSelectionRange(u,i.length-a);var l=o.substring(u,o.length-a);return e.focus(),document.execCommand("insertText",!1,l)||(e.value=o,e.dispatchEvent(n())),e.setSelectionRange(t.length,t.length),s&&s.focus(),e}},function(e){!function(){function t(e,t,o){if(!r)throw new Error("textarea-caret-position#getCaretCoordinates should only be called in a browser");var s=o&&o.debug||!1;if(s){var u=document.querySelector("#input-textarea-caret-position-mirror-div");u&&u.parentNode.removeChild(u)}var a=document.createElement("div");a.id="input-textarea-caret-position-mirror-div",document.body.appendChild(a);var l=a.style,c=window.getComputedStyle?getComputedStyle(e):e.currentStyle;l.whiteSpace="pre-wrap","INPUT"!==e.nodeName&&(l.wordWrap="break-word"),l.position="absolute",s||(l.visibility="hidden"),n.forEach(function(e){l[e]=c[e]}),i?e.scrollHeight>parseInt(c.height)&&(l.overflowY="scroll"):l.overflow="hidden",a.textContent=e.value.substring(0,t),"INPUT"===e.nodeName&&(a.textContent=a.textContent.replace(/\s/g," "));var h=document.createElement("span");h.textContent=e.value.substring(t)||".",a.appendChild(h);var f={top:h.offsetTop+parseInt(c.borderTopWidth),left:h.offsetLeft+parseInt(c.borderLeftWidth)};return s?h.style.backgroundColor="#aaa":document.body.removeChild(a),f}var n=["direction","boxSizing","width","height","overflowX","overflowY","borderTopWidth","borderRightWidth","borderBottomWidth","borderLeftWidth","borderStyle","paddingTop","paddingRight","paddingBottom","paddingLeft","fontStyle","fontVariant","fontWeight","fontStretch","fontSize","fontSizeAdjust","lineHeight","fontFamily","textAlign","textTransform","textIndent","textDecoration","letterSpacing","wordSpacing","tabSize","MozTabSize"],r="undefined"!=typeof window,i=r&&null!=window.mozInnerScreenX;void 0!==e&&void 0!==e.exports?e.exports=t:r&&(window.getCaretCoordinates=t)}()}]);
metadata ADDED
@@ -0,0 +1,1035 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: threddedDANIEL
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.14.5
5
+ platform: ruby
6
+ authors:
7
+ - Joel Oliveira
8
+ - Gleb Mazovetskiy
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2018-06-05 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: pundit
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: 1.1.0
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ version: 1.1.0
28
+ - !ruby/object:Gem::Dependency
29
+ name: active_record_union
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: 1.3.0
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: 1.3.0
42
+ - !ruby/object:Gem::Dependency
43
+ name: db_text_search
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: 0.2.0
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: 0.2.0
56
+ - !ruby/object:Gem::Dependency
57
+ name: friendly_id
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: htmlentities
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :runtime
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ - !ruby/object:Gem::Dependency
85
+ name: kaminari
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ type: :runtime
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ - !ruby/object:Gem::Dependency
99
+ name: nokogiri
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ type: :runtime
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ - !ruby/object:Gem::Dependency
113
+ name: rails
114
+ requirement: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: 4.2.10
119
+ type: :runtime
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - ">="
124
+ - !ruby/object:Gem::Version
125
+ version: 4.2.10
126
+ - !ruby/object:Gem::Dependency
127
+ name: rb-gravatar
128
+ requirement: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ type: :runtime
134
+ prerelease: false
135
+ version_requirements: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - ">="
138
+ - !ruby/object:Gem::Version
139
+ version: '0'
140
+ - !ruby/object:Gem::Dependency
141
+ name: inline_svg
142
+ requirement: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - ">="
145
+ - !ruby/object:Gem::Version
146
+ version: '0'
147
+ type: :runtime
148
+ prerelease: false
149
+ version_requirements: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - ">="
152
+ - !ruby/object:Gem::Version
153
+ version: '0'
154
+ - !ruby/object:Gem::Dependency
155
+ name: kramdown
156
+ requirement: !ruby/object:Gem::Requirement
157
+ requirements:
158
+ - - ">="
159
+ - !ruby/object:Gem::Version
160
+ version: '0'
161
+ type: :runtime
162
+ prerelease: false
163
+ version_requirements: !ruby/object:Gem::Requirement
164
+ requirements:
165
+ - - ">="
166
+ - !ruby/object:Gem::Version
167
+ version: '0'
168
+ - !ruby/object:Gem::Dependency
169
+ name: onebox
170
+ requirement: !ruby/object:Gem::Requirement
171
+ requirements:
172
+ - - "~>"
173
+ - !ruby/object:Gem::Version
174
+ version: '1.8'
175
+ - - ">="
176
+ - !ruby/object:Gem::Version
177
+ version: 1.8.13
178
+ type: :runtime
179
+ prerelease: false
180
+ version_requirements: !ruby/object:Gem::Requirement
181
+ requirements:
182
+ - - "~>"
183
+ - !ruby/object:Gem::Version
184
+ version: '1.8'
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ version: 1.8.13
188
+ - !ruby/object:Gem::Dependency
189
+ name: html-pipeline
190
+ requirement: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - ">="
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
195
+ type: :runtime
196
+ prerelease: false
197
+ version_requirements: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - ">="
200
+ - !ruby/object:Gem::Version
201
+ version: '0'
202
+ - !ruby/object:Gem::Dependency
203
+ name: rinku
204
+ requirement: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - ">="
207
+ - !ruby/object:Gem::Version
208
+ version: '0'
209
+ type: :runtime
210
+ prerelease: false
211
+ version_requirements: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - ">="
214
+ - !ruby/object:Gem::Version
215
+ version: '0'
216
+ - !ruby/object:Gem::Dependency
217
+ name: gemoji
218
+ requirement: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - "~>"
221
+ - !ruby/object:Gem::Version
222
+ version: 2.1.0
223
+ type: :runtime
224
+ prerelease: false
225
+ version_requirements: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - "~>"
228
+ - !ruby/object:Gem::Version
229
+ version: 2.1.0
230
+ - !ruby/object:Gem::Dependency
231
+ name: sanitize
232
+ requirement: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - ">="
235
+ - !ruby/object:Gem::Version
236
+ version: '0'
237
+ type: :runtime
238
+ prerelease: false
239
+ version_requirements: !ruby/object:Gem::Requirement
240
+ requirements:
241
+ - - ">="
242
+ - !ruby/object:Gem::Version
243
+ version: '0'
244
+ - !ruby/object:Gem::Dependency
245
+ name: sass
246
+ requirement: !ruby/object:Gem::Requirement
247
+ requirements:
248
+ - - ">="
249
+ - !ruby/object:Gem::Version
250
+ version: 3.4.21
251
+ type: :runtime
252
+ prerelease: false
253
+ version_requirements: !ruby/object:Gem::Requirement
254
+ requirements:
255
+ - - ">="
256
+ - !ruby/object:Gem::Version
257
+ version: 3.4.21
258
+ - !ruby/object:Gem::Dependency
259
+ name: autoprefixer-rails
260
+ requirement: !ruby/object:Gem::Requirement
261
+ requirements:
262
+ - - ">="
263
+ - !ruby/object:Gem::Version
264
+ version: '0'
265
+ type: :runtime
266
+ prerelease: false
267
+ version_requirements: !ruby/object:Gem::Requirement
268
+ requirements:
269
+ - - ">="
270
+ - !ruby/object:Gem::Version
271
+ version: '0'
272
+ - !ruby/object:Gem::Dependency
273
+ name: timeago_js
274
+ requirement: !ruby/object:Gem::Requirement
275
+ requirements:
276
+ - - ">="
277
+ - !ruby/object:Gem::Version
278
+ version: '0'
279
+ type: :runtime
280
+ prerelease: false
281
+ version_requirements: !ruby/object:Gem::Requirement
282
+ requirements:
283
+ - - ">="
284
+ - !ruby/object:Gem::Version
285
+ version: '0'
286
+ - !ruby/object:Gem::Dependency
287
+ name: sprockets-es6
288
+ requirement: !ruby/object:Gem::Requirement
289
+ requirements:
290
+ - - ">="
291
+ - !ruby/object:Gem::Version
292
+ version: '0'
293
+ type: :runtime
294
+ prerelease: false
295
+ version_requirements: !ruby/object:Gem::Requirement
296
+ requirements:
297
+ - - ">="
298
+ - !ruby/object:Gem::Version
299
+ version: '0'
300
+ - !ruby/object:Gem::Dependency
301
+ name: capybara
302
+ requirement: !ruby/object:Gem::Requirement
303
+ requirements:
304
+ - - "~>"
305
+ - !ruby/object:Gem::Version
306
+ version: '2.4'
307
+ type: :development
308
+ prerelease: false
309
+ version_requirements: !ruby/object:Gem::Requirement
310
+ requirements:
311
+ - - "~>"
312
+ - !ruby/object:Gem::Version
313
+ version: '2.4'
314
+ - !ruby/object:Gem::Dependency
315
+ name: selenium-webdriver
316
+ requirement: !ruby/object:Gem::Requirement
317
+ requirements:
318
+ - - ">="
319
+ - !ruby/object:Gem::Version
320
+ version: 3.5.0
321
+ type: :development
322
+ prerelease: false
323
+ version_requirements: !ruby/object:Gem::Requirement
324
+ requirements:
325
+ - - ">="
326
+ - !ruby/object:Gem::Version
327
+ version: 3.5.0
328
+ - !ruby/object:Gem::Dependency
329
+ name: webmock
330
+ requirement: !ruby/object:Gem::Requirement
331
+ requirements:
332
+ - - ">="
333
+ - !ruby/object:Gem::Version
334
+ version: '0'
335
+ type: :development
336
+ prerelease: false
337
+ version_requirements: !ruby/object:Gem::Requirement
338
+ requirements:
339
+ - - ">="
340
+ - !ruby/object:Gem::Version
341
+ version: '0'
342
+ - !ruby/object:Gem::Dependency
343
+ name: database_cleaner
344
+ requirement: !ruby/object:Gem::Requirement
345
+ requirements:
346
+ - - ">="
347
+ - !ruby/object:Gem::Version
348
+ version: '0'
349
+ type: :development
350
+ prerelease: false
351
+ version_requirements: !ruby/object:Gem::Requirement
352
+ requirements:
353
+ - - ">="
354
+ - !ruby/object:Gem::Version
355
+ version: '0'
356
+ - !ruby/object:Gem::Dependency
357
+ name: factory_bot_rails
358
+ requirement: !ruby/object:Gem::Requirement
359
+ requirements:
360
+ - - ">="
361
+ - !ruby/object:Gem::Version
362
+ version: '0'
363
+ type: :development
364
+ prerelease: false
365
+ version_requirements: !ruby/object:Gem::Requirement
366
+ requirements:
367
+ - - ">="
368
+ - !ruby/object:Gem::Version
369
+ version: '0'
370
+ - !ruby/object:Gem::Dependency
371
+ name: faker
372
+ requirement: !ruby/object:Gem::Requirement
373
+ requirements:
374
+ - - ">="
375
+ - !ruby/object:Gem::Version
376
+ version: 1.6.2
377
+ type: :development
378
+ prerelease: false
379
+ version_requirements: !ruby/object:Gem::Requirement
380
+ requirements:
381
+ - - ">="
382
+ - !ruby/object:Gem::Version
383
+ version: 1.6.2
384
+ - !ruby/object:Gem::Dependency
385
+ name: launchy
386
+ requirement: !ruby/object:Gem::Requirement
387
+ requirements:
388
+ - - ">="
389
+ - !ruby/object:Gem::Version
390
+ version: '0'
391
+ type: :development
392
+ prerelease: false
393
+ version_requirements: !ruby/object:Gem::Requirement
394
+ requirements:
395
+ - - ">="
396
+ - !ruby/object:Gem::Version
397
+ version: '0'
398
+ - !ruby/object:Gem::Dependency
399
+ name: rspec-rails
400
+ requirement: !ruby/object:Gem::Requirement
401
+ requirements:
402
+ - - ">="
403
+ - !ruby/object:Gem::Version
404
+ version: 3.5.0
405
+ type: :development
406
+ prerelease: false
407
+ version_requirements: !ruby/object:Gem::Requirement
408
+ requirements:
409
+ - - ">="
410
+ - !ruby/object:Gem::Version
411
+ version: 3.5.0
412
+ - !ruby/object:Gem::Dependency
413
+ name: simplecov
414
+ requirement: !ruby/object:Gem::Requirement
415
+ requirements:
416
+ - - ">="
417
+ - !ruby/object:Gem::Version
418
+ version: '0'
419
+ type: :development
420
+ prerelease: false
421
+ version_requirements: !ruby/object:Gem::Requirement
422
+ requirements:
423
+ - - ">="
424
+ - !ruby/object:Gem::Version
425
+ version: '0'
426
+ - !ruby/object:Gem::Dependency
427
+ name: rubocop
428
+ requirement: !ruby/object:Gem::Requirement
429
+ requirements:
430
+ - - '='
431
+ - !ruby/object:Gem::Version
432
+ version: 0.49.1
433
+ type: :development
434
+ prerelease: false
435
+ version_requirements: !ruby/object:Gem::Requirement
436
+ requirements:
437
+ - - '='
438
+ - !ruby/object:Gem::Version
439
+ version: 0.49.1
440
+ - !ruby/object:Gem::Dependency
441
+ name: rails-i18n
442
+ requirement: !ruby/object:Gem::Requirement
443
+ requirements:
444
+ - - ">="
445
+ - !ruby/object:Gem::Version
446
+ version: '0'
447
+ type: :development
448
+ prerelease: false
449
+ version_requirements: !ruby/object:Gem::Requirement
450
+ requirements:
451
+ - - ">="
452
+ - !ruby/object:Gem::Version
453
+ version: '0'
454
+ - !ruby/object:Gem::Dependency
455
+ name: kaminari-i18n
456
+ requirement: !ruby/object:Gem::Requirement
457
+ requirements:
458
+ - - ">="
459
+ - !ruby/object:Gem::Version
460
+ version: '0'
461
+ type: :development
462
+ prerelease: false
463
+ version_requirements: !ruby/object:Gem::Requirement
464
+ requirements:
465
+ - - ">="
466
+ - !ruby/object:Gem::Version
467
+ version: '0'
468
+ - !ruby/object:Gem::Dependency
469
+ name: http_accept_language
470
+ requirement: !ruby/object:Gem::Requirement
471
+ requirements:
472
+ - - ">="
473
+ - !ruby/object:Gem::Version
474
+ version: '0'
475
+ type: :development
476
+ prerelease: false
477
+ version_requirements: !ruby/object:Gem::Requirement
478
+ requirements:
479
+ - - ">="
480
+ - !ruby/object:Gem::Version
481
+ version: '0'
482
+ - !ruby/object:Gem::Dependency
483
+ name: mysql2
484
+ requirement: !ruby/object:Gem::Requirement
485
+ requirements:
486
+ - - ">="
487
+ - !ruby/object:Gem::Version
488
+ version: '0'
489
+ type: :development
490
+ prerelease: false
491
+ version_requirements: !ruby/object:Gem::Requirement
492
+ requirements:
493
+ - - ">="
494
+ - !ruby/object:Gem::Version
495
+ version: '0'
496
+ - !ruby/object:Gem::Dependency
497
+ name: pg
498
+ requirement: !ruby/object:Gem::Requirement
499
+ requirements:
500
+ - - ">="
501
+ - !ruby/object:Gem::Version
502
+ version: '0'
503
+ type: :development
504
+ prerelease: false
505
+ version_requirements: !ruby/object:Gem::Requirement
506
+ requirements:
507
+ - - ">="
508
+ - !ruby/object:Gem::Version
509
+ version: '0'
510
+ - !ruby/object:Gem::Dependency
511
+ name: sqlite3
512
+ requirement: !ruby/object:Gem::Requirement
513
+ requirements:
514
+ - - ">="
515
+ - !ruby/object:Gem::Version
516
+ version: '0'
517
+ type: :development
518
+ prerelease: false
519
+ version_requirements: !ruby/object:Gem::Requirement
520
+ requirements:
521
+ - - ">="
522
+ - !ruby/object:Gem::Version
523
+ version: '0'
524
+ - !ruby/object:Gem::Dependency
525
+ name: puma
526
+ requirement: !ruby/object:Gem::Requirement
527
+ requirements:
528
+ - - ">="
529
+ - !ruby/object:Gem::Version
530
+ version: '0'
531
+ type: :development
532
+ prerelease: false
533
+ version_requirements: !ruby/object:Gem::Requirement
534
+ requirements:
535
+ - - ">="
536
+ - !ruby/object:Gem::Version
537
+ version: '0'
538
+ - !ruby/object:Gem::Dependency
539
+ name: rails_email_preview
540
+ requirement: !ruby/object:Gem::Requirement
541
+ requirements:
542
+ - - ">="
543
+ - !ruby/object:Gem::Version
544
+ version: 2.0.1
545
+ type: :development
546
+ prerelease: false
547
+ version_requirements: !ruby/object:Gem::Requirement
548
+ requirements:
549
+ - - ">="
550
+ - !ruby/object:Gem::Version
551
+ version: 2.0.1
552
+ - !ruby/object:Gem::Dependency
553
+ name: roadie-rails
554
+ requirement: !ruby/object:Gem::Requirement
555
+ requirements:
556
+ - - ">="
557
+ - !ruby/object:Gem::Version
558
+ version: '0'
559
+ type: :development
560
+ prerelease: false
561
+ version_requirements: !ruby/object:Gem::Requirement
562
+ requirements:
563
+ - - ">="
564
+ - !ruby/object:Gem::Version
565
+ version: '0'
566
+ - !ruby/object:Gem::Dependency
567
+ name: i18n-tasks
568
+ requirement: !ruby/object:Gem::Requirement
569
+ requirements:
570
+ - - ">="
571
+ - !ruby/object:Gem::Version
572
+ version: 0.9.18
573
+ type: :development
574
+ prerelease: false
575
+ version_requirements: !ruby/object:Gem::Requirement
576
+ requirements:
577
+ - - ">="
578
+ - !ruby/object:Gem::Version
579
+ version: 0.9.18
580
+ - !ruby/object:Gem::Dependency
581
+ name: web-console
582
+ requirement: !ruby/object:Gem::Requirement
583
+ requirements:
584
+ - - ">="
585
+ - !ruby/object:Gem::Version
586
+ version: '0'
587
+ type: :development
588
+ prerelease: false
589
+ version_requirements: !ruby/object:Gem::Requirement
590
+ requirements:
591
+ - - ">="
592
+ - !ruby/object:Gem::Version
593
+ version: '0'
594
+ - !ruby/object:Gem::Dependency
595
+ name: thredded-markdown_coderay
596
+ requirement: !ruby/object:Gem::Requirement
597
+ requirements:
598
+ - - ">="
599
+ - !ruby/object:Gem::Version
600
+ version: '0'
601
+ type: :development
602
+ prerelease: false
603
+ version_requirements: !ruby/object:Gem::Requirement
604
+ requirements:
605
+ - - ">="
606
+ - !ruby/object:Gem::Version
607
+ version: '0'
608
+ - !ruby/object:Gem::Dependency
609
+ name: thredded-markdown_katex
610
+ requirement: !ruby/object:Gem::Requirement
611
+ requirements:
612
+ - - ">="
613
+ - !ruby/object:Gem::Version
614
+ version: '0'
615
+ type: :development
616
+ prerelease: false
617
+ version_requirements: !ruby/object:Gem::Requirement
618
+ requirements:
619
+ - - ">="
620
+ - !ruby/object:Gem::Version
621
+ version: '0'
622
+ - !ruby/object:Gem::Dependency
623
+ name: turbolinks
624
+ requirement: !ruby/object:Gem::Requirement
625
+ requirements:
626
+ - - ">="
627
+ - !ruby/object:Gem::Version
628
+ version: '0'
629
+ type: :development
630
+ prerelease: false
631
+ version_requirements: !ruby/object:Gem::Requirement
632
+ requirements:
633
+ - - ">="
634
+ - !ruby/object:Gem::Version
635
+ version: '0'
636
+ description: |-
637
+ The best Rails 4.2+ forums engine ever. Its goal is to be as simple and feature rich as possible.
638
+ Thredded works with SQLite, MySQL (v5.6.4+), and PostgreSQL. See the demo at https://thredded.org/.
639
+ email:
640
+ - joel@thredded.com
641
+ - glex.spb@gmail.com
642
+ executables: []
643
+ extensions: []
644
+ extra_rdoc_files: []
645
+ files:
646
+ - MIT-LICENSE
647
+ - README.md
648
+ - app/assets/images/favicons/README.md
649
+ - app/assets/images/favicons/amazon.png
650
+ - app/assets/images/favicons/github.png
651
+ - app/assets/images/favicons/google_branding/logo_calendar_128px.png
652
+ - app/assets/images/favicons/google_branding/logo_docs_48px.png
653
+ - app/assets/images/favicons/google_branding/logo_drive_48px.png
654
+ - app/assets/images/favicons/google_branding/logo_forms_48px.png
655
+ - app/assets/images/favicons/google_branding/logo_sheets_48px.png
656
+ - app/assets/images/favicons/google_branding/logo_slides_48px.png
657
+ - app/assets/images/favicons/stackexchange.png
658
+ - app/assets/images/favicons/twitter.png
659
+ - app/assets/images/favicons/wikipedia.png
660
+ - app/assets/images/thredded/breadcrumb-chevron.svg
661
+ - app/assets/images/thredded/follow.svg
662
+ - app/assets/images/thredded/lock.svg
663
+ - app/assets/images/thredded/moderation.svg
664
+ - app/assets/images/thredded/private-messages.svg
665
+ - app/assets/images/thredded/settings.svg
666
+ - app/assets/images/thredded/three-dot-menu.svg
667
+ - app/assets/images/thredded/unfollow.svg
668
+ - app/assets/javascripts/thredded.es6
669
+ - app/assets/javascripts/thredded/components/currently_online.es6
670
+ - app/assets/javascripts/thredded/components/flash_messages.es6
671
+ - app/assets/javascripts/thredded/components/mention_autocompletion.es6
672
+ - app/assets/javascripts/thredded/components/post_form.es6
673
+ - app/assets/javascripts/thredded/components/preview_area.es6
674
+ - app/assets/javascripts/thredded/components/quote_post.es6
675
+ - app/assets/javascripts/thredded/components/time_stamps.es6
676
+ - app/assets/javascripts/thredded/components/topic_form.es6
677
+ - app/assets/javascripts/thredded/components/topics.es6
678
+ - app/assets/javascripts/thredded/components/turboforms.es6
679
+ - app/assets/javascripts/thredded/components/user_preferences_form.es6
680
+ - app/assets/javascripts/thredded/components/user_textcomplete.es6
681
+ - app/assets/javascripts/thredded/components/users_select.es6
682
+ - app/assets/javascripts/thredded/core/csrf_tokens.es6
683
+ - app/assets/javascripts/thredded/core/debounce.es6
684
+ - app/assets/javascripts/thredded/core/escape_html.es6
685
+ - app/assets/javascripts/thredded/core/hide_soft_keyboard.es6
686
+ - app/assets/javascripts/thredded/core/on_page_load.es6
687
+ - app/assets/javascripts/thredded/core/serialize_form.es6
688
+ - app/assets/javascripts/thredded/core/thredded.es6
689
+ - app/assets/javascripts/thredded/dependencies.js
690
+ - app/assets/javascripts/thredded/dependencies/autosize.js
691
+ - app/assets/javascripts/thredded/dependencies/textcomplete.js
692
+ - app/assets/javascripts/thredded/dependencies/timeago.js
693
+ - app/assets/javascripts/thredded/dependencies/ujs.js
694
+ - app/assets/javascripts/thredded/thredded.es6
695
+ - app/assets/stylesheets/thredded.scss
696
+ - app/assets/stylesheets/thredded/_base.scss
697
+ - app/assets/stylesheets/thredded/_dependencies.scss
698
+ - app/assets/stylesheets/thredded/_email.scss
699
+ - app/assets/stylesheets/thredded/_thredded.scss
700
+ - app/assets/stylesheets/thredded/base/_alerts.scss
701
+ - app/assets/stylesheets/thredded/base/_buttons.scss
702
+ - app/assets/stylesheets/thredded/base/_dropdown-menu.scss
703
+ - app/assets/stylesheets/thredded/base/_forms.scss
704
+ - app/assets/stylesheets/thredded/base/_grid.scss
705
+ - app/assets/stylesheets/thredded/base/_lists.scss
706
+ - app/assets/stylesheets/thredded/base/_nav.scss
707
+ - app/assets/stylesheets/thredded/base/_tables.scss
708
+ - app/assets/stylesheets/thredded/base/_typography.scss
709
+ - app/assets/stylesheets/thredded/base/_variables.scss
710
+ - app/assets/stylesheets/thredded/components/_alerts.scss
711
+ - app/assets/stylesheets/thredded/components/_base.scss
712
+ - app/assets/stylesheets/thredded/components/_currently-online.scss
713
+ - app/assets/stylesheets/thredded/components/_empty.scss
714
+ - app/assets/stylesheets/thredded/components/_flash-message.scss
715
+ - app/assets/stylesheets/thredded/components/_following.scss
716
+ - app/assets/stylesheets/thredded/components/_form-list.scss
717
+ - app/assets/stylesheets/thredded/components/_icons.scss
718
+ - app/assets/stylesheets/thredded/components/_main-section.scss
719
+ - app/assets/stylesheets/thredded/components/_mention-autocomplete.scss
720
+ - app/assets/stylesheets/thredded/components/_messageboard.scss
721
+ - app/assets/stylesheets/thredded/components/_onebox.scss
722
+ - app/assets/stylesheets/thredded/components/_pagination.scss
723
+ - app/assets/stylesheets/thredded/components/_post-form.scss
724
+ - app/assets/stylesheets/thredded/components/_post.scss
725
+ - app/assets/stylesheets/thredded/components/_preferences.scss
726
+ - app/assets/stylesheets/thredded/components/_preview_area.scss
727
+ - app/assets/stylesheets/thredded/components/_topic-delete.scss
728
+ - app/assets/stylesheets/thredded/components/_topic-header.scss
729
+ - app/assets/stylesheets/thredded/components/_topics.scss
730
+ - app/assets/stylesheets/thredded/layout/_main-container.scss
731
+ - app/assets/stylesheets/thredded/layout/_main-navigation.scss
732
+ - app/assets/stylesheets/thredded/layout/_moderation.scss
733
+ - app/assets/stylesheets/thredded/layout/_navigation.scss
734
+ - app/assets/stylesheets/thredded/layout/_search-navigation.scss
735
+ - app/assets/stylesheets/thredded/layout/_user-navigation.scss
736
+ - app/assets/stylesheets/thredded/layout/_user.scss
737
+ - app/assets/stylesheets/thredded/utilities/_is-compact.scss
738
+ - app/assets/stylesheets/thredded/utilities/_is-expanded.scss
739
+ - app/commands/thredded/at_notification_extractor.rb
740
+ - app/commands/thredded/autofollow_users.rb
741
+ - app/commands/thredded/create_messageboard.rb
742
+ - app/commands/thredded/mark_all_read.rb
743
+ - app/commands/thredded/moderate_post.rb
744
+ - app/commands/thredded/notify_following_users.rb
745
+ - app/commands/thredded/notify_private_topic_users.rb
746
+ - app/controllers/concerns/thredded/new_post_params.rb
747
+ - app/controllers/concerns/thredded/new_private_post_params.rb
748
+ - app/controllers/concerns/thredded/new_private_topic_params.rb
749
+ - app/controllers/concerns/thredded/new_topic_params.rb
750
+ - app/controllers/concerns/thredded/render_preview.rb
751
+ - app/controllers/thredded/application_controller.rb
752
+ - app/controllers/thredded/autocomplete_users_controller.rb
753
+ - app/controllers/thredded/messageboard_groups_controller.rb
754
+ - app/controllers/thredded/messageboards_controller.rb
755
+ - app/controllers/thredded/moderation_controller.rb
756
+ - app/controllers/thredded/post_permalinks_controller.rb
757
+ - app/controllers/thredded/post_previews_controller.rb
758
+ - app/controllers/thredded/posts_controller.rb
759
+ - app/controllers/thredded/preferences_controller.rb
760
+ - app/controllers/thredded/private_post_permalinks_controller.rb
761
+ - app/controllers/thredded/private_post_previews_controller.rb
762
+ - app/controllers/thredded/private_posts_controller.rb
763
+ - app/controllers/thredded/private_topic_previews_controller.rb
764
+ - app/controllers/thredded/private_topics_controller.rb
765
+ - app/controllers/thredded/read_states_controller.rb
766
+ - app/controllers/thredded/theme_previews_controller.rb
767
+ - app/controllers/thredded/topic_previews_controller.rb
768
+ - app/controllers/thredded/topics_controller.rb
769
+ - app/forms/thredded/edit_topic_form.rb
770
+ - app/forms/thredded/post_form.rb
771
+ - app/forms/thredded/private_post_form.rb
772
+ - app/forms/thredded/private_topic_form.rb
773
+ - app/forms/thredded/topic_form.rb
774
+ - app/forms/thredded/user_preferences_form.rb
775
+ - app/helpers/thredded/application_helper.rb
776
+ - app/helpers/thredded/nav_helper.rb
777
+ - app/helpers/thredded/render_helper.rb
778
+ - app/helpers/thredded/urls_helper.rb
779
+ - app/jobs/thredded/activity_updater_job.rb
780
+ - app/jobs/thredded/auto_follow_and_notify_job.rb
781
+ - app/jobs/thredded/notify_private_topic_users_job.rb
782
+ - app/mailer_previews/thredded/base_mailer_preview.rb
783
+ - app/mailer_previews/thredded/post_mailer_preview.rb
784
+ - app/mailer_previews/thredded/private_topic_mailer_preview.rb
785
+ - app/mailers/thredded/base_mailer.rb
786
+ - app/mailers/thredded/post_mailer.rb
787
+ - app/mailers/thredded/private_topic_mailer.rb
788
+ - app/models/concerns/thredded/content_moderation_state.rb
789
+ - app/models/concerns/thredded/friendly_id_reserved_words_and_pagination.rb
790
+ - app/models/concerns/thredded/moderation_state.rb
791
+ - app/models/concerns/thredded/notifier_preference.rb
792
+ - app/models/concerns/thredded/post_common.rb
793
+ - app/models/concerns/thredded/search_parser.rb
794
+ - app/models/concerns/thredded/topic_common.rb
795
+ - app/models/concerns/thredded/topics_search.rb
796
+ - app/models/concerns/thredded/user_topic_read_state_common.rb
797
+ - app/models/thredded/category.rb
798
+ - app/models/thredded/messageboard.rb
799
+ - app/models/thredded/messageboard_group.rb
800
+ - app/models/thredded/messageboard_notifications_for_followed_topics.rb
801
+ - app/models/thredded/messageboard_user.rb
802
+ - app/models/thredded/notifications_for_followed_topics.rb
803
+ - app/models/thredded/notifications_for_private_topics.rb
804
+ - app/models/thredded/null_user.rb
805
+ - app/models/thredded/null_user_topic_read_state.rb
806
+ - app/models/thredded/post.rb
807
+ - app/models/thredded/post_moderation_record.rb
808
+ - app/models/thredded/private_post.rb
809
+ - app/models/thredded/private_topic.rb
810
+ - app/models/thredded/private_user.rb
811
+ - app/models/thredded/stats.rb
812
+ - app/models/thredded/topic.rb
813
+ - app/models/thredded/topic_category.rb
814
+ - app/models/thredded/user_detail.rb
815
+ - app/models/thredded/user_extender.rb
816
+ - app/models/thredded/user_messageboard_preference.rb
817
+ - app/models/thredded/user_permissions/admin/if_admin_column_true.rb
818
+ - app/models/thredded/user_permissions/admin/none.rb
819
+ - app/models/thredded/user_permissions/message/readers_of_writeable_boards.rb
820
+ - app/models/thredded/user_permissions/moderate/if_moderator_column_true.rb
821
+ - app/models/thredded/user_permissions/moderate/none.rb
822
+ - app/models/thredded/user_permissions/read/all.rb
823
+ - app/models/thredded/user_permissions/write/all.rb
824
+ - app/models/thredded/user_permissions/write/none.rb
825
+ - app/models/thredded/user_post_notification.rb
826
+ - app/models/thredded/user_preference.rb
827
+ - app/models/thredded/user_private_topic_read_state.rb
828
+ - app/models/thredded/user_topic_follow.rb
829
+ - app/models/thredded/user_topic_read_state.rb
830
+ - app/notifiers/thredded/email_notifier.rb
831
+ - app/policies/thredded/messageboard_group_policy.rb
832
+ - app/policies/thredded/messageboard_policy.rb
833
+ - app/policies/thredded/post_policy.rb
834
+ - app/policies/thredded/private_post_policy.rb
835
+ - app/policies/thredded/private_topic_policy.rb
836
+ - app/policies/thredded/topic_policy.rb
837
+ - app/view_hooks/thredded/all_view_hooks.rb
838
+ - app/view_models/thredded/base_topic_view.rb
839
+ - app/view_models/thredded/messageboard_group_view.rb
840
+ - app/view_models/thredded/post_view.rb
841
+ - app/view_models/thredded/posts_page_view.rb
842
+ - app/view_models/thredded/private_topic_view.rb
843
+ - app/view_models/thredded/private_topics_page_view.rb
844
+ - app/view_models/thredded/topic_email_view.rb
845
+ - app/view_models/thredded/topic_posts_page_view.rb
846
+ - app/view_models/thredded/topic_view.rb
847
+ - app/view_models/thredded/topics_page_view.rb
848
+ - app/views/layouts/thredded/application.html.erb
849
+ - app/views/thredded/categories/_category.html.erb
850
+ - app/views/thredded/error_pages/forbidden.html.erb
851
+ - app/views/thredded/error_pages/not_found.html.erb
852
+ - app/views/thredded/kaminari/_first_page.html.erb
853
+ - app/views/thredded/kaminari/_gap.html.erb
854
+ - app/views/thredded/kaminari/_last_page.html.erb
855
+ - app/views/thredded/kaminari/_next_page.html.erb
856
+ - app/views/thredded/kaminari/_page.html.erb
857
+ - app/views/thredded/kaminari/_paginator.html.erb
858
+ - app/views/thredded/kaminari/_prev_page.html.erb
859
+ - app/views/thredded/messageboard_groups/new.html.erb
860
+ - app/views/thredded/messageboards/_form.html.erb
861
+ - app/views/thredded/messageboards/_messageboard.html.erb
862
+ - app/views/thredded/messageboards/_messageboard_meta.html.erb
863
+ - app/views/thredded/messageboards/edit.html.erb
864
+ - app/views/thredded/messageboards/index.html.erb
865
+ - app/views/thredded/messageboards/new.html.erb
866
+ - app/views/thredded/moderation/_nav.html.erb
867
+ - app/views/thredded/moderation/_post.html.erb
868
+ - app/views/thredded/moderation/_post_moderation_actions.html.erb
869
+ - app/views/thredded/moderation/_post_moderation_record.html.erb
870
+ - app/views/thredded/moderation/_user_moderation_state.html.erb
871
+ - app/views/thredded/moderation/_user_post.html.erb
872
+ - app/views/thredded/moderation/_users_search_form.html.erb
873
+ - app/views/thredded/moderation/activity.html.erb
874
+ - app/views/thredded/moderation/history.html.erb
875
+ - app/views/thredded/moderation/pending.html.erb
876
+ - app/views/thredded/moderation/user.html.erb
877
+ - app/views/thredded/moderation/users.html.erb
878
+ - app/views/thredded/post_mailer/post_notification.html.erb
879
+ - app/views/thredded/post_mailer/post_notification.text.erb
880
+ - app/views/thredded/post_previews/preview.html.erb
881
+ - app/views/thredded/post_previews/update.html.erb
882
+ - app/views/thredded/posts/_content.html.erb
883
+ - app/views/thredded/posts/_form.html.erb
884
+ - app/views/thredded/posts/_post.html.erb
885
+ - app/views/thredded/posts/_user.html.erb
886
+ - app/views/thredded/posts/edit.html.erb
887
+ - app/views/thredded/posts/new.html.erb
888
+ - app/views/thredded/posts_common/_actions.html.erb
889
+ - app/views/thredded/posts_common/_content.html.erb
890
+ - app/views/thredded/posts_common/_form.html.erb
891
+ - app/views/thredded/posts_common/_header.html.erb
892
+ - app/views/thredded/posts_common/_header_with_topic.html.erb
893
+ - app/views/thredded/posts_common/_header_with_user_and_topic.html.erb
894
+ - app/views/thredded/posts_common/actions/_delete.html.erb
895
+ - app/views/thredded/posts_common/actions/_edit.html.erb
896
+ - app/views/thredded/posts_common/actions/_mark_as_unread.html.erb
897
+ - app/views/thredded/posts_common/actions/_quote.html.erb
898
+ - app/views/thredded/posts_common/form/_after_content.html.erb
899
+ - app/views/thredded/posts_common/form/_before_content.html.erb
900
+ - app/views/thredded/posts_common/form/_content.html.erb
901
+ - app/views/thredded/posts_common/form/_content_field.html.erb
902
+ - app/views/thredded/posts_common/form/_preview_area.html.erb
903
+ - app/views/thredded/preferences/_form.html.erb
904
+ - app/views/thredded/preferences/_messageboards_nav.html.erb
905
+ - app/views/thredded/preferences/_messageboards_nav_item.html.erb
906
+ - app/views/thredded/preferences/edit.html.erb
907
+ - app/views/thredded/private_post_previews/preview.html.erb
908
+ - app/views/thredded/private_post_previews/update.html.erb
909
+ - app/views/thredded/private_posts/_content.html.erb
910
+ - app/views/thredded/private_posts/_form.html.erb
911
+ - app/views/thredded/private_posts/_private_post.html.erb
912
+ - app/views/thredded/private_posts/edit.html.erb
913
+ - app/views/thredded/private_posts/new.html.erb
914
+ - app/views/thredded/private_topic_mailer/message_notification.html.erb
915
+ - app/views/thredded/private_topic_mailer/message_notification.text.erb
916
+ - app/views/thredded/private_topic_previews/preview.html.erb
917
+ - app/views/thredded/private_topics/_breadcrumbs.html.erb
918
+ - app/views/thredded/private_topics/_form.html.erb
919
+ - app/views/thredded/private_topics/_header.html.erb
920
+ - app/views/thredded/private_topics/_no_private_topics.html.erb
921
+ - app/views/thredded/private_topics/_private_topic.html.erb
922
+ - app/views/thredded/private_topics/edit.html.erb
923
+ - app/views/thredded/private_topics/header/_participant.html.erb
924
+ - app/views/thredded/private_topics/index.html.erb
925
+ - app/views/thredded/private_topics/new.html.erb
926
+ - app/views/thredded/private_topics/private_topic/_participant.html.erb
927
+ - app/views/thredded/private_topics/show.html.erb
928
+ - app/views/thredded/search/_form.html.erb
929
+ - app/views/thredded/shared/_breadcrumbs.html.erb
930
+ - app/views/thredded/shared/_content_moderation_blocked_state.html.erb
931
+ - app/views/thredded/shared/_currently_online.html.erb
932
+ - app/views/thredded/shared/_flash_messages.html.erb
933
+ - app/views/thredded/shared/_header.html.erb
934
+ - app/views/thredded/shared/_nav.html.erb
935
+ - app/views/thredded/shared/_page.html.erb
936
+ - app/views/thredded/shared/currently_online/_header.html.erb
937
+ - app/views/thredded/shared/currently_online/_user_list.html.erb
938
+ - app/views/thredded/shared/currently_online/_user_list_item.html.erb
939
+ - app/views/thredded/shared/nav/_moderation.html.erb
940
+ - app/views/thredded/shared/nav/_notification_preferences.html.erb
941
+ - app/views/thredded/shared/nav/_private_topics.html.erb
942
+ - app/views/thredded/shared/nav/_standalone.html.erb
943
+ - app/views/thredded/shared/nav/_standalone_profile.html.erb
944
+ - app/views/thredded/shared/preview.html.erb
945
+ - app/views/thredded/theme_previews/_section_title.html.erb
946
+ - app/views/thredded/theme_previews/show.html.erb
947
+ - app/views/thredded/topic_previews/preview.html.erb
948
+ - app/views/thredded/topics/_followers.html.erb
949
+ - app/views/thredded/topics/_form.html.erb
950
+ - app/views/thredded/topics/_header.html.erb
951
+ - app/views/thredded/topics/_sticky_topics_divider.html.erb
952
+ - app/views/thredded/topics/_topic.html.erb
953
+ - app/views/thredded/topics/_topic_form_admin_options.html.erb
954
+ - app/views/thredded/topics/edit.html.erb
955
+ - app/views/thredded/topics/index.html.erb
956
+ - app/views/thredded/topics/new.html.erb
957
+ - app/views/thredded/topics/search.html.erb
958
+ - app/views/thredded/topics/show.html.erb
959
+ - app/views/thredded/users/_link.html.erb
960
+ - app/views/thredded/users/_post.html.erb
961
+ - app/views/thredded/users/_posts.html.erb
962
+ - bin/rails
963
+ - config/i18n-tasks.yml
964
+ - config/locales/de.yml
965
+ - config/locales/en.yml
966
+ - config/locales/es.yml
967
+ - config/locales/fr.yml
968
+ - config/locales/it.yml
969
+ - config/locales/pl.yml
970
+ - config/locales/pt-BR.yml
971
+ - config/locales/ru.yml
972
+ - config/locales/zh-CN.yml
973
+ - config/routes.rb
974
+ - db/migrate/20160329231848_create_thredded.rb
975
+ - db/seeds.rb
976
+ - db/upgrade_migrations/20160611094616_upgrade_v0_5_to_v0_6.rb
977
+ - db/upgrade_migrations/20160723012349_upgrade_v0_6_to_v0_7.rb
978
+ - db/upgrade_migrations/20161019150201_upgrade_v0_7_to_v0_8.rb
979
+ - db/upgrade_migrations/20161113161801_upgrade_v0_8_to_v0_9.rb
980
+ - db/upgrade_migrations/20170125033319_upgrade_v0_9_to_v0_10.rb
981
+ - db/upgrade_migrations/20170312131417_upgrade_thredded_v0_10_to_v0_11.rb
982
+ - db/upgrade_migrations/20170420163138_upgrade_thredded_v0_11_to_v0_12.rb
983
+ - db/upgrade_migrations/20170811090735_upgrade_thredded_v0_13_to_v_014.rb
984
+ - lib/generators/thredded/install/USAGE
985
+ - lib/generators/thredded/install/install_generator.rb
986
+ - lib/generators/thredded/install/templates/initializer.rb
987
+ - lib/tasks/thredded_tasks.rake
988
+ - lib/thredded.rb
989
+ - lib/thredded/base_migration.rb
990
+ - lib/thredded/base_notifier.rb
991
+ - lib/thredded/collection_to_strings_with_cache_renderer.rb
992
+ - lib/thredded/content_formatter.rb
993
+ - lib/thredded/database_seeder.rb
994
+ - lib/thredded/db_tools.rb
995
+ - lib/thredded/email_transformer.rb
996
+ - lib/thredded/email_transformer/base.rb
997
+ - lib/thredded/email_transformer/onebox.rb
998
+ - lib/thredded/engine.rb
999
+ - lib/thredded/errors.rb
1000
+ - lib/thredded/formatting_demo_content.rb
1001
+ - lib/thredded/html_pipeline/at_mention_filter.rb
1002
+ - lib/thredded/html_pipeline/autolink_filter.rb
1003
+ - lib/thredded/html_pipeline/kramdown_filter.rb
1004
+ - lib/thredded/html_pipeline/onebox_filter.rb
1005
+ - lib/thredded/html_pipeline/wrap_iframes_filter.rb
1006
+ - lib/thredded/version.rb
1007
+ - lib/thredded/view_hooks/config.rb
1008
+ - lib/thredded/view_hooks/renderer.rb
1009
+ - vendor/assets/javascripts/autosize.min.js
1010
+ - vendor/assets/javascripts/textcomplete.min.js
1011
+ homepage: https://thredded.org
1012
+ licenses:
1013
+ - MIT
1014
+ metadata: {}
1015
+ post_install_message:
1016
+ rdoc_options: []
1017
+ require_paths:
1018
+ - lib
1019
+ required_ruby_version: !ruby/object:Gem::Requirement
1020
+ requirements:
1021
+ - - "~>"
1022
+ - !ruby/object:Gem::Version
1023
+ version: '2.1'
1024
+ required_rubygems_version: !ruby/object:Gem::Requirement
1025
+ requirements:
1026
+ - - ">="
1027
+ - !ruby/object:Gem::Version
1028
+ version: '0'
1029
+ requirements: []
1030
+ rubyforge_project:
1031
+ rubygems_version: 2.6.8
1032
+ signing_key:
1033
+ specification_version: 4
1034
+ summary: The best Rails forums engine ever.
1035
+ test_files: []