Class: ActionText::Content
Overview
Action Text Content
The ActionText::Content
class wraps an HTML fragment to add support for parsing, rendering and serialization. It can be used to extract links and attachments, convert the fragment to plain text, or serialize the fragment to the database.
The ActionText::RichText record serializes the ‘body` attribute as ActionText::Content
.
class Message < ActiveRecord::Base
has_rich_text :content
end
message = Message.create!(content: "<h1>Funny times!</h1>")
body = message.content.body body.to_s body.to_plain_text
Instance Attribute Summary collapse
Class Method Summary
collapse
Instance Method Summary
collapse
#_dump
#render_action_text_attachment, #render_action_text_attachments, #render_action_text_content, #sanitize_action_text_content, #sanitize_content_attachment, #sanitizer_allowed_attributes, #sanitizer_allowed_tags
Constructor Details
#initialize(content = nil, options = {}) ⇒ Content
Returns a new instance of Content.
37
38
39
40
41
42
43
44
45
|
# File 'lib/action_text/content.rb', line 37
def initialize(content = nil, options = {})
options.with_defaults! canonicalize: true
if options[:canonicalize]
@fragment = self.class.fragment_by_canonicalizing_content(content)
else
@fragment = ActionText::Fragment.wrap(content)
end
end
|
Instance Attribute Details
#fragment ⇒ Object
Returns the value of attribute fragment.
25
26
27
|
# File 'lib/action_text/content.rb', line 25
def fragment
@fragment
end
|
Class Method Details
.fragment_by_canonicalizing_content(content) ⇒ Object
Instance Method Details
#==(other) ⇒ Object
146
147
148
149
150
151
152
|
# File 'lib/action_text/content.rb', line 146
def ==(other)
if self.class == other.class
to_html == other.to_html
elsif other.is_a?(self.class)
to_s == other.to_s
end
end
|
#append_attachables(attachables) ⇒ Object
90
91
92
93
|
# File 'lib/action_text/content.rb', line 90
def append_attachables(attachables)
attachments = ActionText::Attachment.from_attachables(attachables)
self.class.new([self.to_s.presence, *attachments].compact.join("\n"))
end
|
#as_json ⇒ Object
138
139
140
|
# File 'lib/action_text/content.rb', line 138
def as_json(*)
to_html
end
|
#attachables ⇒ Object
Extracts ActionText::Attachables from the HTML fragment:
attachable = ActiveStorage::Blob.first
html = %Q(<action-text-attachment sgid="#{attachable.attachable_sgid}" caption="Captioned"></action-text-attachment>)
content = ActionText::Content.new(html)
content.attachables
84
85
86
87
88
|
# File 'lib/action_text/content.rb', line 84
def attachables
@attachables ||= attachment_nodes.map do |node|
ActionText::Attachable.from_node(node)
end
end
|
#attachment_galleries ⇒ Object
68
69
70
71
72
|
# File 'lib/action_text/content.rb', line 68
def attachment_galleries
@attachment_galleries ||= attachment_gallery_nodes.map do |node|
attachment_gallery_for_node(node)
end
end
|
#attachments ⇒ Object
Extracts ActionText::Attachments from the HTML fragment:
attachable = ActiveStorage::Blob.first
html = %Q(<action-text-attachment sgid="#{attachable.attachable_sgid}" caption="Captioned"></action-text-attachment>)
content = ActionText::Content.new(html)
content.attachments
62
63
64
65
66
|
# File 'lib/action_text/content.rb', line 62
def attachments
@attachments ||= attachment_nodes.map do |node|
attachment_for_node(node)
end
end
|
#gallery_attachments ⇒ Object
74
75
76
|
# File 'lib/action_text/content.rb', line 74
def gallery_attachments
@gallery_attachments ||= attachment_galleries.flat_map(&:attachments)
end
|
#inspect ⇒ Object
142
143
144
|
# File 'lib/action_text/content.rb', line 142
def inspect
"#<#{self.class.name} #{to_html.truncate(25).inspect}>"
end
|
#links ⇒ Object
Extracts links from the HTML fragment:
html = '<a href="http://example.com/">Example</a>'
content = ActionText::Content.new(html)
content.links
52
53
54
|
# File 'lib/action_text/content.rb', line 52
def links
@links ||= fragment.find_all("a[href]").map { |a| a["href"] }.uniq
end
|
#render_attachment_galleries(&block) ⇒ Object
#render_attachments(**options, &block) ⇒ Object
95
96
97
98
99
100
101
|
# File 'lib/action_text/content.rb', line 95
def render_attachments(**options, &block)
content = fragment.replace(ActionText::Attachment.tag_name) do |node|
node["content"] = sanitize_content_attachment(node["content"])
block.call(attachment_for_node(node, **options))
end
self.class.new(content, canonicalize: false)
end
|
#to_html ⇒ Object
122
123
124
|
# File 'lib/action_text/content.rb', line 122
def to_html
fragment.to_html
end
|
#to_partial_path ⇒ Object
130
131
132
|
# File 'lib/action_text/content.rb', line 130
def to_partial_path
"action_text/contents/content"
end
|
#to_plain_text ⇒ Object
Returns the content as plain text with all HTML tags removed.
content = ActionText::Content.new("<h1>Funny times!</h1>")
content.to_plain_text
114
115
116
|
# File 'lib/action_text/content.rb', line 114
def to_plain_text
render_attachments(with_full_attributes: false, &:to_plain_text).fragment.to_plain_text
end
|
#to_rendered_html_with_layout ⇒ Object
126
127
128
|
# File 'lib/action_text/content.rb', line 126
def to_rendered_html_with_layout
render layout: "action_text/contents/content", partial: to_partial_path, formats: :html, locals: { content: self }
end
|
#to_s ⇒ Object
134
135
136
|
# File 'lib/action_text/content.rb', line 134
def to_s
to_rendered_html_with_layout
end
|
#to_trix_html ⇒ Object
118
119
120
|
# File 'lib/action_text/content.rb', line 118
def to_trix_html
render_attachments(&:to_trix_attachment).to_html
end
|