Sha256: c4f65edd45a2c0d4db62d28bf764788fb81d272f109504866663278dfed987cd

Contents?: true

Size: 1.1 KB

Versions: 2

Compression:

Stored size: 1.1 KB

Contents

module Slacken::Filters
  # Public: Reject blank elements.
  class ElimBlanks < Slacken::Filter
    def call(component)
      if component.type.member_of?(:pre)
        component
      else
        component.derive(
          component.children.reject(&method(:blank?)).map(&method(:call))
        )
      end
    end

    def valid?(component)
      if component.type.member_of?(:pre)
        true
      else
        !blank?(component) && component.children.all?(&method(:valid?))
      end
    end

    private

    def blank?(component)
      # Reduce complexity of calculation by marking.
      # (`blank?` traces the given tree to its leaf nodes.)
      return component.marks[:blank] if component.marks.has_key?(:blank)

      component.marks[:blank] =
        case component.type.name
        when :pre, :ul, :li, :br, :hr, :img, :checkbox, :td
          false
        when :text, :emoji
          content = component.attrs[:content]
          content.nil? || !content.match(/\A\s*\Z/).nil?
        else
          component.children.empty? || component.children.all?(&method(:blank?))
        end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
slacken-0.1.3 lib/slacken/filters/elim_blanks.rb
slacken-0.1.2 lib/slacken/filters/elim_blanks.rb