Class: ActionText::Content
- Inherits:
-
Object
- Object
- ActionText::Content
- Includes:
- Rendering, Serialization
- Defined in:
- lib/action_text/content.rb
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.create!(content: "<h1>Funny times!</h1>")
body = .content.body # => #<ActionText::Content "<div class=\"trix-conte...">
body.to_s # => "<h1>Funny times!</h1>"
body.to_plain_text # => "Funny times!"
Instance Attribute Summary collapse
-
#fragment ⇒ Object
readonly
Returns the value of attribute fragment.
Class Method Summary collapse
Instance Method Summary collapse
- #==(other) ⇒ Object
- #append_attachables(attachables) ⇒ Object
- #as_json ⇒ Object
-
#attachables ⇒ Object
Extracts ActionText::Attachables from the HTML fragment:.
- #attachment_galleries ⇒ Object
-
#attachments ⇒ Object
Extracts ActionText::Attachments from the HTML fragment:.
- #gallery_attachments ⇒ Object
-
#initialize(content = nil, options = {}) ⇒ Content
constructor
A new instance of Content.
- #inspect ⇒ Object
-
#links ⇒ Object
Extracts links from the HTML fragment:.
- #render_attachment_galleries(&block) ⇒ Object
- #render_attachments(**options, &block) ⇒ Object
- #to_html ⇒ Object
- #to_partial_path ⇒ Object
-
#to_plain_text ⇒ Object
Returns the content as plain text with all HTML tags removed.
- #to_rendered_html_with_layout ⇒ Object
- #to_s ⇒ Object
- #to_trix_html ⇒ Object
Methods included from Serialization
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, = {}) .with_defaults! canonicalize: true if [:canonicalize] @fragment = self.class.fragment_by_canonicalizing_content(content) else @fragment = ActionText::Fragment.wrap(content) end end |
Instance Attribute Details
#fragment ⇒ Object (readonly)
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
30 31 32 33 34 |
# File 'lib/action_text/content.rb', line 30 def fragment_by_canonicalizing_content(content) fragment = ActionText::Attachment.(content) fragment = ActionText::AttachmentGallery.(fragment) fragment end |
Instance Method Details
#==(other) ⇒ Object
145 146 147 148 149 150 151 |
# File 'lib/action_text/content.rb', line 145 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) = ActionText::Attachment.from_attachables(attachables) self.class.new([self.to_s.presence, *].compact.join("\n")) end |
#as_json ⇒ Object
137 138 139 |
# File 'lib/action_text/content.rb', line 137 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 # => [attachable]
84 85 86 87 88 |
# File 'lib/action_text/content.rb', line 84 def attachables @attachables ||= .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 ||= .map do |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. # => [#<ActionText::Attachment attachable=#<ActiveStorage::Blob...
62 63 64 65 66 |
# File 'lib/action_text/content.rb', line 62 def @attachments ||= .map do |node| (node) end end |
#gallery_attachments ⇒ Object
74 75 76 |
# File 'lib/action_text/content.rb', line 74 def @gallery_attachments ||= .flat_map(&:attachments) end |
#inspect ⇒ Object
141 142 143 |
# File 'lib/action_text/content.rb', line 141 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 # => ["http://example.com/"]
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
102 103 104 105 106 107 |
# File 'lib/action_text/content.rb', line 102 def (&block) content = ActionText::AttachmentGallery.(fragment) do |node| block.call((node)) end self.class.new(content, canonicalize: false) end |
#render_attachments(**options, &block) ⇒ Object
95 96 97 98 99 100 |
# File 'lib/action_text/content.rb', line 95 def (**, &block) content = fragment.replace(ActionText::Attachment.tag_name) do |node| block.call((node, **)) end self.class.new(content, canonicalize: false) end |
#to_html ⇒ Object
121 122 123 |
# File 'lib/action_text/content.rb', line 121 def to_html fragment.to_html end |
#to_partial_path ⇒ Object
129 130 131 |
# File 'lib/action_text/content.rb', line 129 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 # => "Funny times!"
113 114 115 |
# File 'lib/action_text/content.rb', line 113 def to_plain_text (with_full_attributes: false, &:to_plain_text).fragment.to_plain_text end |
#to_rendered_html_with_layout ⇒ Object
125 126 127 |
# File 'lib/action_text/content.rb', line 125 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
133 134 135 |
# File 'lib/action_text/content.rb', line 133 def to_s to_rendered_html_with_layout end |
#to_trix_html ⇒ Object
117 118 119 |
# File 'lib/action_text/content.rb', line 117 def to_trix_html (&:to_trix_attachment).to_html end |