diff options
Diffstat (limited to 'lib/active_text/content.rb')
-rw-r--r-- | lib/active_text/content.rb | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/lib/active_text/content.rb b/lib/active_text/content.rb new file mode 100644 index 0000000000..0154cea17e --- /dev/null +++ b/lib/active_text/content.rb @@ -0,0 +1,80 @@ +module ActiveText + class Content + include Serialization + + attr_reader :fragment + + delegate :blank?, :empty?, :present?, to: :to_s + + 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 + fragment.to_html + 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 |