123456789_123456789_123456789_123456789_123456789_

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 = 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!"

Rendering - Attributes & Methods

Class Method Summary

Instance Attribute Summary

Instance Method Summary

Constructor Details

.new(content = nil, options = {}) ⇒ Content

[ GitHub ]

  
# File 'actiontext/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

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.fragment_by_canonicalizing_attachments(content)
  fragment = ActionText::AttachmentGallery.fragment_by_canonicalizing_attachment_galleries(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 ]

  
# File 'actiontext/lib/action_text/content.rb', line 27

delegate :blank?, :empty?, :html_safe, :present?, to: :to_html # Delegating to to_html to avoid including the layout

#render (readonly)

[ GitHub ]

  
# File 'actiontext/lib/action_text/rendering.rb', line 12

delegate :render, to: :class

Instance Method Details

#==(other)

[ GitHub ]

  
# File 'actiontext/lib/action_text/content.rb', line 149

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)

[ GitHub ]

  
# File 'actiontext/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

[ GitHub ]

  
# File 'actiontext/lib/action_text/content.rb', line 141

def as_json(*)
  to_html
end

#attachables

Extracts 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]
[ GitHub ]

  
# File 'actiontext/lib/action_text/content.rb', line 84

def attachables
  @attachables ||= attachment_nodes.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
  @attachment_galleries ||= attachment_gallery_nodes.map do |node|
    attachment_gallery_for_node(node)
  end
end

#attachments

Extracts 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 # => [#<ActionText::Attachment attachable=#<ActiveStorage::Blob...
[ GitHub ]

  
# File 'actiontext/lib/action_text/content.rb', line 62

def attachments
  @attachments ||= attachment_nodes.map do |node|
    attachment_for_node(node)
  end
end

#blank?Boolean

[ GitHub ]

  
# File 'actiontext/lib/action_text/content.rb', line 27

delegate :blank?, :empty?, :html_safe, :present?, to: :to_html # Delegating to to_html to avoid including the layout

#empty?Boolean

[ GitHub ]

  
# File 'actiontext/lib/action_text/content.rb', line 27

delegate :blank?, :empty?, :html_safe, :present?, to: :to_html # Delegating to to_html to avoid including the layout

#inspect

[ GitHub ]

  
# File 'actiontext/lib/action_text/content.rb', line 145

def inspect
  "#<#{self.class.name} #{to_html.truncate(25).inspect}>"
end

#present?Boolean

[ GitHub ]

  
# File 'actiontext/lib/action_text/content.rb', line 27

delegate :blank?, :empty?, :html_safe, :present?, to: :to_html # Delegating to to_html to avoid including the layout

#render_attachment_galleries(&block)

[ GitHub ]

  
# File 'actiontext/lib/action_text/content.rb', line 106

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)

[ GitHub ]

  
# File 'actiontext/lib/action_text/content.rb', line 95

def render_attachments(**options, &block)
  content = fragment.replace(ActionText::Attachment.tag_name) do |node|
    if node.key?("content")
      sanitized_content = sanitize_content_attachment(node.remove_attribute("content").to_s)
      node["content"] = sanitized_content if sanitized_content.present?
    end
    block.call(attachment_for_node(node, **options))
  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!"
[ GitHub ]

  
# File 'actiontext/lib/action_text/content.rb', line 117

def to_plain_text
  render_attachments(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
  render_attachments(&:to_trix_attachment).to_html
end