Sha256: 41d5c1c910b55810859298766b5596527322ccd25b68e804357b74689dde7ebd

Contents?: true

Size: 1.1 KB

Versions: 3

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\n*\Z/).nil?
        else
          component.children.empty? || component.children.all?(&method(:blank?))
        end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
slacken-0.1.6 lib/slacken/filters/elim_blanks.rb
slacken-0.1.5 lib/slacken/filters/elim_blanks.rb
slacken-0.1.4 lib/slacken/filters/elim_blanks.rb