/
rich_text.rb
93 lines (83 loc) · 3.29 KB
/
rich_text.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# frozen_string_literal: true
# :markup: markdown
module ActionText
# # Action Text RichText
#
# The RichText record holds the content produced by the Trix editor in a
# serialized `body` attribute. It also holds all the references to the embedded
# files, which are stored using Active Storage. This record is then associated
# with the Active Record model the application desires to have rich text content
# using the `has_rich_text` class method.
#
# class Message < ActiveRecord::Base
# has_rich_text :content
# end
#
# message = Message.create!(content: "<h1>Funny times!</h1>")
# message.content #=> #<ActionText::RichText....
# message.content.to_s # => "<h1>Funny times!</h1>"
# message.content.to_plain_text # => "Funny times!"
#
# message = Message.create!(content: "<div onclick='action()'>safe<script>unsafe</script></div>")
# message.content #=> #<ActionText::RichText....
# message.content.to_s # => "<div>safeunsafe</div>"
# message.content.to_plain_text # => "safeunsafe"
class RichText < Record
##
# :method: to_s
#
# Safely transforms RichText into an HTML String.
#
# message = Message.create!(content: "<h1>Funny times!</h1>")
# message.content.to_s # => "<h1>Funny times!</h1>"
#
# message = Message.create!(content: "<div onclick='action()'>safe<script>unsafe</script></div>")
# message.content.to_s # => "<div>safeunsafe</div>"
serialize :body, coder: ActionText::Content
delegate :to_s, :nil?, to: :body
##
# :method: record
#
# Returns the associated record.
belongs_to :record, polymorphic: true, touch: true
##
# :method: embeds
#
# Returns the `ActiveStorage::Blob`s of the embedded files.
has_many_attached :embeds
before_save do
self.embeds = body.attachables.grep(ActiveStorage::Blob).uniq if body.present?
end
# Returns a plain-text version of the markup contained by the `body` attribute,
# with tags removed but HTML entities encoded.
#
# message = Message.create!(content: "<h1>Funny times!</h1>")
# message.content.to_plain_text # => "Funny times!"
#
# NOTE: that the returned string is not HTML safe and should not be rendered in
# browsers.
#
# message = Message.create!(content: "<script>alert()</script>")
# message.content.to_plain_text # => "<script>alert()</script>"
def to_plain_text
body&.to_plain_text.to_s
end
# Returns the `body` attribute in a format that makes it editable in the Trix
# editor. Previews of attachments are rendered inline.
#
# content = "<h1>Funny Times!</h1><figure data-trix-attachment='{\"sgid\":\"..."\}'></figure>"
# message = Message.create!(content: content)
# message.content.to_trix_html # =>
# # <div class="trix-content">
# # <h1>Funny times!</h1>
# # <figure data-trix-attachment='{\"sgid\":\"..."\}'>
# # <img src="http://example.org/rails/active_storage/.../funny.jpg">
# # </figure>
# # </div>
def to_trix_html
body&.to_trix_html
end
delegate :blank?, :empty?, :present?, to: :to_plain_text
end
end
ActiveSupport.run_load_hooks :action_text_rich_text, ActionText::RichText