2018-02-07 19:26:19 -05:00
|
|
|
module ActiveText
|
|
|
|
class Content
|
|
|
|
include Serialization
|
|
|
|
|
|
|
|
attr_reader :fragment
|
|
|
|
|
2018-02-13 16:01:26 -05:00
|
|
|
delegate :blank?, :empty?, :html_safe, :present?, to: :to_s
|
2018-02-07 19:26:19 -05:00
|
|
|
|
|
|
|
def initialize(content = nil)
|
|
|
|
@fragment = ActiveText::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|
|
|
|
|
ActiveText::Attachable.from_node(node)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def append_attachables(attachables)
|
|
|
|
attachments = ActiveText::Attachment.from_attachables(attachables)
|
|
|
|
self.class.new([self.to_s.presence, *attachments].compact.join("\n"))
|
|
|
|
end
|
|
|
|
|
|
|
|
def render_attachments(**options, &block)
|
|
|
|
fragment.replace(ActiveText::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
|
2018-02-13 16:00:14 -05:00
|
|
|
render_attachments do |attachment|
|
|
|
|
attachment.node.tap do |node|
|
2018-02-14 09:43:49 -05:00
|
|
|
node.inner_html = ActiveText.renderer.render(attachment)
|
2018-02-13 16:00:14 -05:00
|
|
|
end
|
|
|
|
end.to_html
|
2018-02-07 19:26:19 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def to_s
|
|
|
|
to_html
|
|
|
|
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(ActiveText::Attachment::SELECTOR)
|
|
|
|
end
|
|
|
|
|
|
|
|
def attachment_for_node(node, with_full_attributes: true)
|
|
|
|
attachment = ActiveText::Attachment.from_node(node)
|
|
|
|
with_full_attributes ? attachment.with_full_attributes : attachment
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|