diff options
author | David Heinemeier Hansson <david@loudthinking.com> | 2018-04-13 16:23:04 -0700 |
---|---|---|
committer | David Heinemeier Hansson <david@loudthinking.com> | 2018-04-13 16:23:04 -0700 |
commit | f1d74871e7f00e8bbde3501a759487ac8cc4c3fc (patch) | |
tree | 2f1fa680bd1e6a356256fdc59cab5a6af8d74da7 /lib/action_text/content.rb | |
parent | 3bc244abc1800c7617cbfbbe1dd2597053a638c9 (diff) | |
download | rails-f1d74871e7f00e8bbde3501a759487ac8cc4c3fc.tar.gz rails-f1d74871e7f00e8bbde3501a759487ac8cc4c3fc.tar.bz2 rails-f1d74871e7f00e8bbde3501a759487ac8cc4c3fc.zip |
Rename from Active Text to Action Text
This is more like Action View than Active Model.
Diffstat (limited to 'lib/action_text/content.rb')
-rw-r--r-- | lib/action_text/content.rb | 84 |
1 files changed, 84 insertions, 0 deletions
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 |