From f1d74871e7f00e8bbde3501a759487ac8cc4c3fc Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Fri, 13 Apr 2018 16:23:04 -0700 Subject: Rename from Active Text to Action Text This is more like Action View than Active Model. --- lib/action_text/content.rb | 84 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 lib/action_text/content.rb (limited to 'lib/action_text/content.rb') diff --git a/lib/action_text/content.rb b/lib/action_text/content.rb new file mode 100644 index 0000000000..c63e0c3525 --- /dev/null +++ b/lib/action_text/content.rb @@ -0,0 +1,84 @@ +module ActionText + class Content + include Serialization + + attr_reader :fragment + + delegate :blank?, :empty?, :html_safe, :present?, to: :to_s + + def initialize(content = nil) + @fragment = ActionText::Attachment.fragment_by_canonicalizing_attachments(content) + end + + def links + @links ||= fragment.find_all("a[href]").map { |a| a["href"] }.uniq + end + + def attachments + @attachments ||= attachment_nodes.map do |node| + attachment_for_node(node) + end + end + + def attachables + @attachables ||= attachment_nodes.map do |node| + ActionText::Attachable.from_node(node) + end + end + + def append_attachables(attachables) + attachments = ActionText::Attachment.from_attachables(attachables) + self.class.new([self.to_s.presence, *attachments].compact.join("\n")) + end + + def render_attachments(**options, &block) + fragment.replace(ActionText::Attachment::SELECTOR) do |node| + block.call(attachment_for_node(node, **options)) + end + end + + def to_plain_text + render_attachments(with_full_attributes: false, &:to_plain_text).to_plain_text + end + + def to_trix_html + render_attachments(&:to_trix_attachment).to_html + end + + def to_html + render_attachments do |attachment| + attachment.node.tap do |node| + node.inner_html = ActionText.renderer.render(attachment) + end + end.to_html + end + + def to_s + to_html.html_safe + end + + def as_json(*) + to_html + end + + def inspect + "#<#{self.class.name} #{to_s.truncate(25).inspect}>" + end + + def ==(other) + if other.is_a?(self.class) + to_s == other.to_s + end + end + + private + def attachment_nodes + @attachment_nodes ||= fragment.find_all(ActionText::Attachment::SELECTOR) + end + + def attachment_for_node(node, with_full_attributes: true) + attachment = ActionText::Attachment.from_node(node) + with_full_attributes ? attachment.with_full_attributes : attachment + end + end +end -- cgit v1.2.3