class ActionText::Content

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 # => #<ActionText::Content "<div class=\"trix-conte...">
body.to_s # => "<h1>Funny times!</h1>"
body.to_plain_text # => "Funny times!"

Attributes

fragment[R]

Public Class Methods

fragment_by_canonicalizing_content(content) click to toggle source
# File lib/action_text/content.rb, line 30
def fragment_by_canonicalizing_content(content)
  fragment = ActionText::Attachment.fragment_by_canonicalizing_attachments(content)
  fragment = ActionText::AttachmentGallery.fragment_by_canonicalizing_attachment_galleries(fragment)
  fragment
end
new(content = nil, options = {}) click to toggle source
# 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

Public Instance Methods

==(other) click to toggle source
# 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) click to toggle source
# 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(*) click to toggle source
# File lib/action_text/content.rb, line 137
def as_json(*)
  to_html
end
attachables() click to toggle source

Extracts +ActionText::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 lib/action_text/content.rb, line 84
def attachables
  @attachables ||= attachment_nodes.map do |node|
    ActionText::Attachable.from_node(node)
  end
end
attachment_galleries() click to toggle source
# 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() click to toggle source

Extracts +ActionText::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.attachments # => [#<ActionText::Attachment attachable=#<ActiveStorage::Blob...
# File lib/action_text/content.rb, line 62
def attachments
  @attachments ||= attachment_nodes.map do |node|
    attachment_for_node(node)
  end
end
inspect() click to toggle source
# File lib/action_text/content.rb, line 141
def inspect
  "#<#{self.class.name} #{to_html.truncate(25).inspect}>"
end
render_attachment_galleries(&block) click to toggle source
# File lib/action_text/content.rb, line 102
def render_attachment_galleries(&block)
  content = ActionText::AttachmentGallery.fragment_by_replacing_attachment_gallery_nodes(fragment) do |node|
    block.call(attachment_gallery_for_node(node))
  end
  self.class.new(content, canonicalize: false)
end
render_attachments(**options, &block) click to toggle source
# File lib/action_text/content.rb, line 95
def render_attachments(**options, &block)
  content = fragment.replace(ActionText::Attachment.tag_name) do |node|
    block.call(attachment_for_node(node, **options))
  end
  self.class.new(content, canonicalize: false)
end
to_html() click to toggle source
# File lib/action_text/content.rb, line 121
def to_html
  fragment.to_html
end
to_partial_path() click to toggle source
# File lib/action_text/content.rb, line 129
def to_partial_path
  "action_text/contents/content"
end
to_plain_text() click to toggle source

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 lib/action_text/content.rb, line 113
def to_plain_text
  render_attachments(with_full_attributes: false, &:to_plain_text).fragment.to_plain_text
end
to_rendered_html_with_layout() click to toggle source
# 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() click to toggle source
# File lib/action_text/content.rb, line 133
def to_s
  to_rendered_html_with_layout
end
to_trix_html() click to toggle source
# File lib/action_text/content.rb, line 117
def to_trix_html
  render_attachments(&:to_trix_attachment).to_html
end

Private Instance Methods

attachment_for_node(node, with_full_attributes: true) click to toggle source
# File lib/action_text/content.rb, line 162
def attachment_for_node(node, with_full_attributes: true)
  attachment = ActionText::Attachment.from_node(node)
  with_full_attributes ? attachment.with_full_attributes : attachment
end
attachment_nodes() click to toggle source
# File lib/action_text/content.rb, line 154
def attachment_nodes
  @attachment_nodes ||= fragment.find_all(ActionText::Attachment.tag_name)
end