Spec-Zone.ru › Ruby on Rails 7.2

class ActionText::Content

Parent:
Object

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

Атрибуты

fragment[R]

Публичные методы класса

fragment_by_canonicalizing_content(content) Показать исходный код
# File actiontext/lib/action_text/content.rb, line 33
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 = {}) Показать исходный код
# File actiontext/lib/action_text/content.rb, line 40
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

Публичные методы экземпляра

==(other) Показать исходный код
# File actiontext/lib/action_text/content.rb, line 169
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) Показать исходный код
# File actiontext/lib/action_text/content.rb, line 93
def append_attachables(attachables)
  attachments = ActionText::Attachment.from_attachables(attachables)
  self.class.new([self.to_s.presence, *attachments].compact.join("\n"))
end
as_json(*) Показать исходный код
# File actiontext/lib/action_text/content.rb, line 161
def as_json(*)
  to_html
end
attachables() Показать исходный код
# File actiontext/lib/action_text/content.rb, line 87
def attachables
  @attachables ||= attachment_nodes.map do |node|
    ActionText::Attachable.from_node(node)
  end
end

Извлекает ActionText::Attachable из HTML-фрагмента:

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]
attachment_galleries() Показать исходный код
# File actiontext/lib/action_text/content.rb, line 71
def attachment_galleries
  @attachment_galleries ||= attachment_gallery_nodes.map do |node|
    attachment_gallery_for_node(node)
  end
end
attachments() Показать исходный код
# File actiontext/lib/action_text/content.rb, line 65
def attachments
  @attachments ||= attachment_nodes.map do |node|
    attachment_for_node(node)
  end
end

Извлекает ActionText::Attachment из HTML-фрагмента:

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...
gallery_attachments() Показать исходный код
# File actiontext/lib/action_text/content.rb, line 77
def gallery_attachments
  @gallery_attachments ||= attachment_galleries.flat_map(&:attachments)
end
inspect() Показать исходный код
# File actiontext/lib/action_text/content.rb, line 165
def inspect
  "#<#{self.class.name} #{to_html.truncate(25).inspect}>"
end
links() Показать исходный код
# File actiontext/lib/action_text/content.rb, line 55
def links
  @links ||= fragment.find_all("a[href]").map { |a| a["href"] }.uniq
end

Извлекает ссылки из HTML-фрагмента:

html = '<a href="http://example.com/">Example</a>'
content = ActionText::Content.new(html)
content.links # => ["http://example.com/"]
render_attachment_galleries(&block) Показать исходный код
# File actiontext/lib/action_text/content.rb, line 109
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) Показать исходный код
# File actiontext/lib/action_text/content.rb, line 98
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() Показать исходный код
# File actiontext/lib/action_text/content.rb, line 138
def to_html
  fragment.to_html
end
to_partial_path() Показать исходный код
# File actiontext/lib/action_text/content.rb, line 146
def to_partial_path
  "action_text/contents/content"
end
to_plain_text() Показать исходный код
# File actiontext/lib/action_text/content.rb, line 130
def to_plain_text
  render_attachments(with_full_attributes: false, &:to_plain_text).fragment.to_plain_text
end

Возвращает версию разметки в формате простого текста, с удаленными тегами, но с закодированными HTML-сущностями.

content = ActionText::Content.new("<h1>Funny times!</h1>")
content.to_plain_text # => "Funny times!"

content = ActionText::Content.new("<div onclick='action()'>safe<script>unsafe</script></div>")
content.to_plain_text # => "safeunsafe"

ПРИМЕЧАНИЕ: возвращаемая строка не является безопасной для HTML и не должна отображаться в браузере.

content = ActionText::Content.new("&lt;script&gt;alert()&lt;/script&gt;")
content.to_plain_text # => "<script>alert()</script>"
to_rendered_html_with_layout() Показать исходный код
# File actiontext/lib/action_text/content.rb, line 142
def to_rendered_html_with_layout
  render layout: "action_text/contents/content", partial: to_partial_path, formats: :html, locals: { content: self }
end
to_s() Показать исходный код
# File actiontext/lib/action_text/content.rb, line 157
def to_s
  to_rendered_html_with_layout
end

Безопасно преобразует Content в HTML String.

content = ActionText::Content.new(content: "<h1>Funny times!</h1>")
content.to_s # => "<h1>Funny times!</h1>"

content = ActionText::Content.new("<div onclick='action()'>safe<script>unsafe</script></div>")
content.to_s # => "<div>safeunsafe</div>"
to_trix_html() Показать исходный код
# File actiontext/lib/action_text/content.rb, line 134
def to_trix_html
  render_attachments(&:to_trix_attachment).to_html
end

© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API