threddedDANIEL 0.14.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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: []