collavre 0.22.0 → 0.23.0

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 (142) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -0
  3. data/app/assets/stylesheets/collavre/actiontext.css +251 -90
  4. data/app/assets/stylesheets/collavre/code_highlight.css +7 -201
  5. data/app/assets/stylesheets/collavre/comments_popup.css +118 -61
  6. data/app/assets/stylesheets/collavre/creatives.css +11 -2
  7. data/app/assets/stylesheets/collavre/modal_dialog.css +32 -0
  8. data/app/assets/stylesheets/collavre/tables.css +91 -0
  9. data/app/channels/collavre/inbox_badge_channel.rb +30 -0
  10. data/app/controllers/collavre/api/v1/mobile/agent_events_controller.rb +224 -0
  11. data/app/controllers/collavre/api/v1/mobile/base_controller.rb +95 -0
  12. data/app/controllers/collavre/api/v1/mobile/devices_controller.rb +31 -0
  13. data/app/controllers/collavre/api/v1/mobile/voice_commands_controller.rb +25 -0
  14. data/app/controllers/collavre/creatives_controller.rb +16 -5
  15. data/app/controllers/collavre/tasks_controller.rb +13 -4
  16. data/app/controllers/collavre/topics_controller.rb +49 -1
  17. data/app/controllers/collavre/typo_corrections_controller.rb +39 -0
  18. data/app/controllers/concerns/collavre/users_controller/profile_and_settings.rb +16 -1
  19. data/app/controllers/concerns/collavre/users_controller/registration.rb +41 -1
  20. data/app/helpers/collavre/application_helper.rb +1 -0
  21. data/app/javascript/collavre.js +2 -0
  22. data/app/javascript/components/ImageResizer.jsx +9 -3
  23. data/app/javascript/components/InlineLexicalEditor.jsx +155 -38
  24. data/app/javascript/components/creative_tree_row.js +20 -3
  25. data/app/javascript/components/plugins/list_tab_indent_plugin.jsx +16 -0
  26. data/app/javascript/components/plugins/table_hover_actions_plugin.jsx +405 -0
  27. data/app/javascript/controllers/__tests__/inbox_badge_controller.test.js +73 -0
  28. data/app/javascript/controllers/comment_controller.js +5 -4
  29. data/app/javascript/controllers/comment_version_controller.js +2 -1
  30. data/app/javascript/controllers/comments/__tests__/form_controller_double_submit.test.js +159 -0
  31. data/app/javascript/controllers/comments/__tests__/presence_controller.test.js +3 -2
  32. data/app/javascript/controllers/comments/__tests__/topics_controller_delete.test.js +94 -0
  33. data/app/javascript/controllers/comments/form_controller.js +21 -5
  34. data/app/javascript/controllers/comments/list_controller.js +18 -17
  35. data/app/javascript/controllers/comments/presence_controller.js +2 -1
  36. data/app/javascript/controllers/comments/topics_controller.js +14 -8
  37. data/app/javascript/controllers/creatives/__tests__/tree_controller.test.js +150 -0
  38. data/app/javascript/controllers/creatives/import_controller.js +2 -1
  39. data/app/javascript/controllers/creatives/select_mode_controller.js +2 -1
  40. data/app/javascript/controllers/creatives/tree_controller.js +142 -1
  41. data/app/javascript/controllers/image_lightbox_controller.js +2 -1
  42. data/app/javascript/controllers/inbox_badge_controller.js +33 -0
  43. data/app/javascript/controllers/index.js +4 -1
  44. data/app/javascript/controllers/share_modal_controller.js +4 -3
  45. data/app/javascript/controllers/topic_search_controller.js +2 -1
  46. data/app/javascript/creatives/drag_drop/event_handlers.js +14 -5
  47. data/app/javascript/creatives/topic_move_members_popup.js +156 -0
  48. data/app/javascript/creatives/tree_renderer.js +11 -0
  49. data/app/javascript/lib/__tests__/turbo_confirm.test.js +81 -0
  50. data/app/javascript/lib/__tests__/typo_correction.test.js +192 -0
  51. data/app/javascript/lib/api/__tests__/api_error.test.js +96 -0
  52. data/app/javascript/lib/api/__tests__/queue_manager.test.js +88 -1
  53. data/app/javascript/lib/api/api_error.js +108 -0
  54. data/app/javascript/lib/api/queue_manager.js +38 -4
  55. data/app/javascript/lib/common_popup.js +18 -5
  56. data/app/javascript/lib/editor/__tests__/code_edit_view_token_parity.test.js +121 -0
  57. data/app/javascript/lib/editor/__tests__/code_language_roundtrip.test.js +152 -0
  58. data/app/javascript/lib/editor/__tests__/code_languages.test.js +93 -0
  59. data/app/javascript/lib/editor/code_languages.js +173 -0
  60. data/app/javascript/lib/editor/code_token_theme.js +41 -0
  61. data/app/javascript/lib/lexical/__tests__/image_focus.test.js +139 -0
  62. data/app/javascript/lib/lexical/__tests__/list_tab_indent.test.js +633 -0
  63. data/app/javascript/lib/lexical/__tests__/markdown_serialize.test.js +627 -0
  64. data/app/javascript/lib/lexical/__tests__/minimize_html.test.js +20 -1
  65. data/app/javascript/lib/lexical/__tests__/selection_boundary.test.js +88 -0
  66. data/app/javascript/lib/lexical/__tests__/table_transformer.test.js +163 -0
  67. data/app/javascript/lib/lexical/__tests__/trailing_paragraph.test.js +104 -0
  68. data/app/javascript/lib/lexical/list_tab_indent.js +210 -0
  69. data/app/javascript/lib/lexical/markdown_serialize.js +320 -0
  70. data/app/javascript/lib/lexical/selection_boundary.js +58 -0
  71. data/app/javascript/lib/lexical/table_transformer.js +182 -0
  72. data/app/javascript/lib/lexical/trailing_paragraph.js +29 -0
  73. data/app/javascript/lib/turbo_confirm.js +46 -0
  74. data/app/javascript/lib/typo_correction.js +146 -0
  75. data/app/javascript/lib/utils/__tests__/confirm_dialog.test.js +88 -0
  76. data/app/javascript/lib/utils/__tests__/dialog.test.js +92 -0
  77. data/app/javascript/lib/utils/__tests__/markdown.test.js +153 -0
  78. data/app/javascript/lib/utils/__tests__/sanitize_description.test.js +68 -0
  79. data/app/javascript/lib/utils/__tests__/table_download.test.js +93 -0
  80. data/app/javascript/lib/utils/confirm_dialog.js +10 -0
  81. data/app/javascript/lib/utils/dialog.js +300 -0
  82. data/app/javascript/lib/utils/markdown.js +154 -67
  83. data/app/javascript/lib/utils/sanitize_description.js +31 -0
  84. data/app/javascript/lib/utils/table_download.js +15 -0
  85. data/app/javascript/modules/__tests__/typo_corrector.test.js +365 -0
  86. data/app/javascript/modules/creative_row_editor.js +110 -70
  87. data/app/javascript/modules/export_to_markdown.js +2 -1
  88. data/app/javascript/modules/lexical_inline_editor.jsx +2 -1
  89. data/app/javascript/modules/slide_view.js +11 -2
  90. data/app/javascript/modules/typo_corrector.js +534 -0
  91. data/app/jobs/collavre/ai_agent_job.rb +7 -4
  92. data/app/jobs/collavre/compress_job.rb +6 -2
  93. data/app/models/collavre/comment/broadcastable.rb +46 -7
  94. data/app/models/collavre/comment/notifiable.rb +14 -4
  95. data/app/models/collavre/comment.rb +79 -31
  96. data/app/models/collavre/creative/describable.rb +89 -10
  97. data/app/models/collavre/task.rb +15 -0
  98. data/app/models/collavre/user.rb +57 -1
  99. data/app/services/collavre/ai_client.rb +28 -10
  100. data/app/services/collavre/auto_theme_generator.rb +1 -1
  101. data/app/services/collavre/creatives/index_query.rb +85 -16
  102. data/app/services/collavre/creatives/tree_builder.rb +2 -1
  103. data/app/services/collavre/gemini_parent_recommender.rb +1 -1
  104. data/app/services/collavre/inbox_reply_service.rb +5 -0
  105. data/app/services/collavre/markdown_converter.rb +13 -3
  106. data/app/services/collavre/mobile/event_summarizer.rb +40 -0
  107. data/app/services/collavre/orchestration/agent_orchestrator.rb +33 -7
  108. data/app/services/collavre/orchestration/arbiter.rb +16 -0
  109. data/app/services/collavre/orchestration/matcher.rb +79 -4
  110. data/app/services/collavre/orchestration/policy_resolver.rb +4 -3
  111. data/app/services/collavre/orchestration/stuck_detector.rb +141 -34
  112. data/app/services/collavre/tools/creative_batch_service.rb +3 -2
  113. data/app/services/collavre/tools/creative_create_service.rb +8 -8
  114. data/app/services/collavre/tools/creative_update_service.rb +23 -8
  115. data/app/services/collavre/typo_corrector.rb +188 -0
  116. data/app/views/collavre/comments/_comment.html.erb +5 -0
  117. data/app/views/collavre/comments/_comments_popup.html.erb +14 -1
  118. data/app/views/collavre/creatives/_inline_edit_form.html.erb +1 -0
  119. data/app/views/collavre/creatives/_topic_move_members_modal.html.erb +42 -0
  120. data/app/views/collavre/creatives/index.html.erb +14 -1
  121. data/app/views/collavre/creatives/slide_view.html.erb +1 -1
  122. data/app/views/collavre/users/show.html.erb +3 -0
  123. data/app/views/collavre/users/typo_correction.html.erb +50 -0
  124. data/app/views/layouts/collavre/slide.html.erb +1 -0
  125. data/config/locales/comments.en.yml +15 -0
  126. data/config/locales/comments.ko.yml +15 -0
  127. data/config/locales/integrations.en.yml +1 -1
  128. data/config/locales/integrations.ko.yml +1 -1
  129. data/config/locales/mobile.en.yml +16 -0
  130. data/config/locales/mobile.ko.yml +16 -0
  131. data/config/locales/orchestration.en.yml +1 -0
  132. data/config/locales/orchestration.ko.yml +1 -0
  133. data/config/locales/users.en.yml +15 -0
  134. data/config/locales/users.ko.yml +15 -0
  135. data/config/routes.rb +13 -0
  136. data/db/migrate/20260612000000_add_topic_concurrency_defer_to_comments.rb +38 -0
  137. data/db/migrate/20260617090000_add_typo_correction_settings_to_users.rb +18 -0
  138. data/db/seeds.rb +51 -0
  139. data/lib/collavre/version.rb +1 -1
  140. data/lib/generators/collavre/install/install_generator.rb +1 -0
  141. metadata +55 -2
  142. data/app/services/collavre/tools/description_normalizable.rb +0 -16
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: collavre
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.22.0
4
+ version: 0.23.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Collavre
@@ -192,11 +192,13 @@ files:
192
192
  - app/assets/stylesheets/collavre/print.css
193
193
  - app/assets/stylesheets/collavre/search_popup.css
194
194
  - app/assets/stylesheets/collavre/slide_view.css
195
+ - app/assets/stylesheets/collavre/tables.css
195
196
  - app/assets/stylesheets/collavre/trigger_status.css
196
197
  - app/assets/stylesheets/collavre/user_menu.css
197
198
  - app/channels/collavre/agent_channel.rb
198
199
  - app/channels/collavre/comments_presence_channel.rb
199
200
  - app/channels/collavre/creatives_channel.rb
201
+ - app/channels/collavre/inbox_badge_channel.rb
200
202
  - app/channels/collavre/slide_view_channel.rb
201
203
  - app/channels/collavre/topics_channel.rb
202
204
  - app/components/collavre/autocomplete_popup_component.html.erb
@@ -216,6 +218,10 @@ files:
216
218
  - app/controllers/collavre/admin/settings_controller.rb
217
219
  - app/controllers/collavre/api/v1/agents_controller.rb
218
220
  - app/controllers/collavre/api/v1/base_controller.rb
221
+ - app/controllers/collavre/api/v1/mobile/agent_events_controller.rb
222
+ - app/controllers/collavre/api/v1/mobile/base_controller.rb
223
+ - app/controllers/collavre/api/v1/mobile/devices_controller.rb
224
+ - app/controllers/collavre/api/v1/mobile/voice_commands_controller.rb
219
225
  - app/controllers/collavre/application_controller.rb
220
226
  - app/controllers/collavre/attachments_controller.rb
221
227
  - app/controllers/collavre/calendar_events_controller.rb
@@ -248,6 +254,7 @@ files:
248
254
  - app/controllers/collavre/sessions_controller.rb
249
255
  - app/controllers/collavre/tasks_controller.rb
250
256
  - app/controllers/collavre/topics_controller.rb
257
+ - app/controllers/collavre/typo_corrections_controller.rb
251
258
  - app/controllers/collavre/user_creative_preferences_controller.rb
252
259
  - app/controllers/collavre/user_themes_controller.rb
253
260
  - app/controllers/collavre/users_controller.rb
@@ -277,7 +284,10 @@ files:
277
284
  - app/javascript/components/creative_tree_row.js
278
285
  - app/javascript/components/plugins/attachment_cleanup_plugin.jsx
279
286
  - app/javascript/components/plugins/image_upload_plugin.jsx
287
+ - app/javascript/components/plugins/list_tab_indent_plugin.jsx
280
288
  - app/javascript/components/plugins/markdown_shortcuts_plugin.jsx
289
+ - app/javascript/components/plugins/table_hover_actions_plugin.jsx
290
+ - app/javascript/controllers/__tests__/inbox_badge_controller.test.js
281
291
  - app/javascript/controllers/__tests__/link_creative_controller.test.js
282
292
  - app/javascript/controllers/__tests__/popup_menu_controller.test.js
283
293
  - app/javascript/controllers/agent_trigger_controller.js
@@ -285,11 +295,13 @@ files:
285
295
  - app/javascript/controllers/comment_badge_controller.js
286
296
  - app/javascript/controllers/comment_controller.js
287
297
  - app/javascript/controllers/comment_version_controller.js
298
+ - app/javascript/controllers/comments/__tests__/form_controller_double_submit.test.js
288
299
  - app/javascript/controllers/comments/__tests__/form_controller_review.test.js
289
300
  - app/javascript/controllers/comments/__tests__/list_controller_selection.test.js
290
301
  - app/javascript/controllers/comments/__tests__/popup_controller.test.js
291
302
  - app/javascript/controllers/comments/__tests__/presence_controller.test.js
292
303
  - app/javascript/controllers/comments/__tests__/review_quotes_store.test.js
304
+ - app/javascript/controllers/comments/__tests__/topics_controller_delete.test.js
293
305
  - app/javascript/controllers/comments/__tests__/topics_controller_override.test.js
294
306
  - app/javascript/controllers/comments/contexts_controller.js
295
307
  - app/javascript/controllers/comments/drop_trigger_controller.js
@@ -311,6 +323,7 @@ files:
311
323
  - app/javascript/controllers/creatives/sync_controller.js
312
324
  - app/javascript/controllers/creatives/tree_controller.js
313
325
  - app/javascript/controllers/image_lightbox_controller.js
326
+ - app/javascript/controllers/inbox_badge_controller.js
314
327
  - app/javascript/controllers/index.js
315
328
  - app/javascript/controllers/landing_video_controller.js
316
329
  - app/javascript/controllers/link_creative_controller.js
@@ -329,10 +342,15 @@ files:
329
342
  - app/javascript/creatives/drag_drop/indicator.js
330
343
  - app/javascript/creatives/drag_drop/operations.js
331
344
  - app/javascript/creatives/drag_drop/state.js
345
+ - app/javascript/creatives/topic_move_members_popup.js
332
346
  - app/javascript/creatives/tree_renderer.js
333
347
  - app/javascript/lib/__tests__/chat_history.test.js
334
348
  - app/javascript/lib/__tests__/html_code_block_wrapper.test.js
349
+ - app/javascript/lib/__tests__/turbo_confirm.test.js
350
+ - app/javascript/lib/__tests__/typo_correction.test.js
351
+ - app/javascript/lib/api/__tests__/api_error.test.js
335
352
  - app/javascript/lib/api/__tests__/queue_manager.test.js
353
+ - app/javascript/lib/api/api_error.js
336
354
  - app/javascript/lib/api/creatives.js
337
355
  - app/javascript/lib/api/csrf_fetch.js
338
356
  - app/javascript/lib/api/drag_drop.js
@@ -341,27 +359,54 @@ files:
341
359
  - app/javascript/lib/apply_lexical_styles.js
342
360
  - app/javascript/lib/chat_history.js
343
361
  - app/javascript/lib/common_popup.js
362
+ - app/javascript/lib/editor/__tests__/code_edit_view_token_parity.test.js
363
+ - app/javascript/lib/editor/__tests__/code_language_roundtrip.test.js
364
+ - app/javascript/lib/editor/__tests__/code_languages.test.js
365
+ - app/javascript/lib/editor/code_languages.js
366
+ - app/javascript/lib/editor/code_token_theme.js
344
367
  - app/javascript/lib/gnb_popup_manager.js
345
368
  - app/javascript/lib/html_code_block_wrapper.js
346
369
  - app/javascript/lib/lexical/__tests__/attachment_payload.test.js
347
370
  - app/javascript/lib/lexical/__tests__/color_import.test.js
371
+ - app/javascript/lib/lexical/__tests__/image_focus.test.js
372
+ - app/javascript/lib/lexical/__tests__/list_tab_indent.test.js
373
+ - app/javascript/lib/lexical/__tests__/markdown_serialize.test.js
348
374
  - app/javascript/lib/lexical/__tests__/minimize_html.test.js
375
+ - app/javascript/lib/lexical/__tests__/selection_boundary.test.js
376
+ - app/javascript/lib/lexical/__tests__/table_transformer.test.js
377
+ - app/javascript/lib/lexical/__tests__/trailing_paragraph.test.js
349
378
  - app/javascript/lib/lexical/attachment_node.jsx
350
379
  - app/javascript/lib/lexical/attachment_payload.js
351
380
  - app/javascript/lib/lexical/color_import.js
352
381
  - app/javascript/lib/lexical/image_node.jsx
382
+ - app/javascript/lib/lexical/list_tab_indent.js
383
+ - app/javascript/lib/lexical/markdown_serialize.js
353
384
  - app/javascript/lib/lexical/minimize_html.js
385
+ - app/javascript/lib/lexical/selection_boundary.js
354
386
  - app/javascript/lib/lexical/style_attributes.js
387
+ - app/javascript/lib/lexical/table_transformer.js
388
+ - app/javascript/lib/lexical/trailing_paragraph.js
355
389
  - app/javascript/lib/lexical/video_node.jsx
356
390
  - app/javascript/lib/responsive_images.js
357
391
  - app/javascript/lib/touch_drag.js
392
+ - app/javascript/lib/turbo_confirm.js
358
393
  - app/javascript/lib/turbo_stream_actions.js
394
+ - app/javascript/lib/typo_correction.js
395
+ - app/javascript/lib/utils/__tests__/confirm_dialog.test.js
396
+ - app/javascript/lib/utils/__tests__/dialog.test.js
397
+ - app/javascript/lib/utils/__tests__/markdown.test.js
398
+ - app/javascript/lib/utils/__tests__/sanitize_description.test.js
399
+ - app/javascript/lib/utils/__tests__/table_download.test.js
400
+ - app/javascript/lib/utils/confirm_dialog.js
401
+ - app/javascript/lib/utils/dialog.js
359
402
  - app/javascript/lib/utils/markdown.js
403
+ - app/javascript/lib/utils/sanitize_description.js
360
404
  - app/javascript/lib/utils/table_download.js
361
405
  - app/javascript/modules/__tests__/command_args_form.test.js
362
406
  - app/javascript/modules/__tests__/creative_progress.test.js
363
407
  - app/javascript/modules/__tests__/html_content_empty.test.js
364
408
  - app/javascript/modules/__tests__/markdown_source_reconcile.test.js
409
+ - app/javascript/modules/__tests__/typo_corrector.test.js
365
410
  - app/javascript/modules/command_args_form.js
366
411
  - app/javascript/modules/command_menu.js
367
412
  - app/javascript/modules/creative_guide.js
@@ -378,6 +423,7 @@ files:
378
423
  - app/javascript/modules/mention_menu.js
379
424
  - app/javascript/modules/modal_dialog.js
380
425
  - app/javascript/modules/slide_view.js
426
+ - app/javascript/modules/typo_corrector.js
381
427
  - app/javascript/services/cable.js
382
428
  - app/javascript/services/creatives_channel.js
383
429
  - app/javascript/slide_view.js
@@ -516,6 +562,7 @@ files:
516
562
  - app/services/collavre/markdown_importer.rb
517
563
  - app/services/collavre/mcp_service.rb
518
564
  - app/services/collavre/mention_parser.rb
565
+ - app/services/collavre/mobile/event_summarizer.rb
519
566
  - app/services/collavre/orchestration/agent_context_builder.rb
520
567
  - app/services/collavre/orchestration/agent_orchestrator.rb
521
568
  - app/services/collavre/orchestration/arbiter.rb
@@ -541,13 +588,13 @@ files:
541
588
  - app/services/collavre/tools/cron_create_service.rb
542
589
  - app/services/collavre/tools/cron_list_service.rb
543
590
  - app/services/collavre/tools/cron_update_service.rb
544
- - app/services/collavre/tools/description_normalizable.rb
545
591
  - app/services/collavre/tools/permission_denied_error.rb
546
592
  - app/services/collavre/tools/preview_attach_service.rb
547
593
  - app/services/collavre/tools/preview_detach_service.rb
548
594
  - app/services/collavre/tools/topic_authorizer.rb
549
595
  - app/services/collavre/topic_branch_service.rb
550
596
  - app/services/collavre/topics/orphaned_cron_notifier.rb
597
+ - app/services/collavre/typo_corrector.rb
551
598
  - app/views/admin/shared/_tabs.html.erb
552
599
  - app/views/collavre/admin/integrations/_category.html.erb
553
600
  - app/views/collavre/admin/integrations/_setting_row.html.erb
@@ -571,6 +618,7 @@ files:
571
618
  - app/views/collavre/creatives/_integration_triggers.html.erb
572
619
  - app/views/collavre/creatives/_integrations_menu.html.erb
573
620
  - app/views/collavre/creatives/_share_modal.html.erb
621
+ - app/views/collavre/creatives/_topic_move_members_modal.html.erb
574
622
  - app/views/collavre/creatives/edit.html.erb
575
623
  - app/views/collavre/creatives/index.html.erb
576
624
  - app/views/collavre/creatives/new.html.erb
@@ -619,6 +667,7 @@ files:
619
667
  - app/views/collavre/users/new_ai.html.erb
620
668
  - app/views/collavre/users/passkeys.html.erb
621
669
  - app/views/collavre/users/show.html.erb
670
+ - app/views/collavre/users/typo_correction.html.erb
622
671
  - app/views/inbox/badge_component/_count.html.erb
623
672
  - app/views/layouts/collavre/landing.html.erb
624
673
  - app/views/layouts/collavre/slide.html.erb
@@ -646,6 +695,8 @@ files:
646
695
  - config/locales/invites.ko.yml
647
696
  - config/locales/landing.en.yml
648
697
  - config/locales/landing.ko.yml
698
+ - config/locales/mobile.en.yml
699
+ - config/locales/mobile.ko.yml
649
700
  - config/locales/notifications.en.yml
650
701
  - config/locales/notifications.ko.yml
651
702
  - config/locales/orchestration.en.yml
@@ -782,6 +833,8 @@ files:
782
833
  - db/migrate/20260609020000_add_last_seen_at_to_agent_subscriptions.rb
783
834
  - db/migrate/20260609030000_add_session_id_to_agent_subscriptions.rb
784
835
  - db/migrate/20260609190659_backfill_creative_files_into_description.rb
836
+ - db/migrate/20260612000000_add_topic_concurrency_defer_to_comments.rb
837
+ - db/migrate/20260617090000_add_typo_correction_settings_to_users.rb
785
838
  - db/seeds.rb
786
839
  - lib/collavre.rb
787
840
  - lib/collavre/aws_credentials.rb
@@ -1,16 +0,0 @@
1
- module Collavre
2
- module Tools
3
- module DescriptionNormalizable
4
- private
5
-
6
- def normalize_description(desc)
7
- return desc if desc.blank?
8
- stripped = desc.strip
9
- # If it already looks like HTML, return as-is
10
- return stripped if stripped.start_with?("<")
11
- # Otherwise wrap in <p> tags
12
- "<p>#{ERB::Util.html_escape(stripped)}</p>"
13
- end
14
- end
15
- end
16
- end