diff options
author | Sam Stephenson <sam@37signals.com> | 2018-02-07 18:26:19 -0600 |
---|---|---|
committer | Sam Stephenson <sam@37signals.com> | 2018-02-07 18:26:19 -0600 |
commit | 68d350ddacedf604717f0d1074d7624fa57757c2 (patch) | |
tree | a01852130448e37368ed2fd4af7e930e6c2cd0f2 /lib/active_text/content.rb | |
parent | e22ba227a694b8426e69dbce640c5b0e4f39f574 (diff) | |
download | rails-68d350ddacedf604717f0d1074d7624fa57757c2.tar.gz rails-68d350ddacedf604717f0d1074d7624fa57757c2.tar.bz2 rails-68d350ddacedf604717f0d1074d7624fa57757c2.zip |
Initial import from BC3 RichText
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 |