Class: ActionText::Content
Relationships & Source Files | |
Super Chains via Extension / Inclusion / Inheritance | |
Instance Chain:
self,
Serialization ,
ContentHelper
|
|
Inherits: | Object |
Defined in: | actiontext/lib/action_text/content.rb |
Overview
The 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 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!"
Rendering
- Attributes & Methods
- #render readonly
Class Method Summary
Instance Attribute Summary
- #fragment readonly
- #html_safe readonly
Instance Method Summary
- #==(other)
- #append_attachables(attachables)
- #as_json
-
#attachables
Extracts
Attachable
s from the HTML fragment: - #attachment_galleries
-
#attachments
Extracts
Attachment
s from the HTML fragment: - #blank? ⇒ Boolean
- #empty? ⇒ Boolean
- #gallery_attachments
- #inspect
-
#links
Extracts links from the HTML fragment:
- #present? ⇒ Boolean
- #render_attachment_galleries(&block)
- #render_attachments(**options, &block)
- #to_html
- #to_partial_path
-
#to_plain_text
Returns the content as plain text with all HTML tags removed.
- #to_rendered_html_with_layout
- #to_s
- #to_trix_html
Serialization
- Included
Constructor Details
.new(content = nil, options = {}) ⇒ Content
# File 'actiontext/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
Class Method Details
.fragment_by_canonicalizing_content(content)
[ GitHub ]# File 'actiontext/lib/action_text/content.rb', line 30
def fragment_by_canonicalizing_content(content) fragment = ActionText::Attachment. (content) fragment = ActionText::AttachmentGallery. (fragment) fragment end
Instance Attribute Details
#fragment (readonly)
[ GitHub ]# File 'actiontext/lib/action_text/content.rb', line 25
attr_reader :fragment
#html_safe (readonly)
[ GitHub ]#render (readonly)
[ GitHub ]# File 'actiontext/lib/action_text/rendering.rb', line 12
delegate :render, to: :class
Instance Method Details
#==(other)
[ GitHub ]#append_attachables(attachables)
[ GitHub ]# File 'actiontext/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
[ GitHub ]# File 'actiontext/lib/action_text/content.rb', line 141
def as_json(*) to_html end
#attachables
Extracts Attachable
s 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]
# File 'actiontext/lib/action_text/content.rb', line 84
def attachables @attachables ||= .map do |node| ActionText::Attachable.from_node(node) end end
#attachment_galleries
[ GitHub ]# File 'actiontext/lib/action_text/content.rb', line 68
def @attachment_galleries ||= .map do |node| (node) end end
#attachments
Extracts Attachment
s 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...
# File 'actiontext/lib/action_text/content.rb', line 62
def @attachments ||= .map do |node| (node) end end
#blank? ⇒ Boolean
#empty? ⇒ Boolean
#gallery_attachments
[ GitHub ]# File 'actiontext/lib/action_text/content.rb', line 74
def @gallery_attachments ||= .flat_map(&: ) end
#inspect
[ GitHub ]# File 'actiontext/lib/action_text/content.rb', line 145
def inspect "#<#{self.class.name} #{to_html.truncate(25).inspect}>" end
#links
Extracts links from the HTML fragment:
html = '<a href="http://example.com/">Example</a>'
content = ActionText::Content.new(html)
content.links # => ["http://example.com/"]
# File 'actiontext/lib/action_text/content.rb', line 52
def links @links ||= fragment.find_all("a[href]").map { |a| a["href"] }.uniq end
#present? ⇒ Boolean
#render_attachment_galleries(&block)
[ GitHub ]# File 'actiontext/lib/action_text/content.rb', line 106
def (&block) content = ActionText::AttachmentGallery. (fragment) do |node| block.call( (node)) end self.class.new(content, canonicalize: false) end
#render_attachments(**options, &block)
[ GitHub ]# File 'actiontext/lib/action_text/content.rb', line 95
def (**, &block) content = fragment.replace(ActionText::Attachment.tag_name) do |node| if node.key?("content") sanitized_content = (node.remove_attribute("content").to_s) node["content"] = sanitized_content if sanitized_content.present? end block.call( (node, ** )) end self.class.new(content, canonicalize: false) end
#to_html
[ GitHub ]# File 'actiontext/lib/action_text/content.rb', line 125
def to_html fragment.to_html end
#to_partial_path
[ GitHub ]# File 'actiontext/lib/action_text/content.rb', line 133
def to_partial_path "action_text/contents/content" end
#to_plain_text
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!"
# File 'actiontext/lib/action_text/content.rb', line 117
def to_plain_text (with_full_attributes: false, &:to_plain_text).fragment.to_plain_text end
#to_rendered_html_with_layout
[ GitHub ]# File 'actiontext/lib/action_text/content.rb', line 129
def to_rendered_html_with_layout render layout: "action_text/contents/content", partial: to_partial_path, formats: :html, locals: { content: self } end
#to_s
[ GitHub ]# File 'actiontext/lib/action_text/content.rb', line 137
def to_s to_rendered_html_with_layout end
#to_trix_html
[ GitHub ]# File 'actiontext/lib/action_text/content.rb', line 121
def to_trix_html (&: ).to_html end