Sha256: 2cc8ff204825a66c3fd03404981e8f67b182ad39f92cc4fb4ce986b2fc939a01

Contents?: true

Size: 1.7 KB

Versions: 7

Compression:

Stored size: 1.7 KB

Contents

module DraftjsHtml
  class FromHtml < Nokogiri::XML::SAX::Document
    class StyleStack
      def initialize
        @stack = []
      end

      def clear_finished
        @stack.delete_if { !!_1[:finish] }
      end

      def each(&block)
        @stack.reverse_each.group_by { _1[:tagname] }.each do |_, descriptors|
          overlapping_ranges = find_overlapping_styles(descriptors)
          widest_descriptor = overlapping_ranges.max_by { (_1[:start].._1[:finish]).size }

          applicable_styles = descriptors - overlapping_ranges + [widest_descriptor].compact
          applicable_styles.each(&block)
        end
      end

      def track_start(tagname, current_character_offset)
        style = DraftjsHtml::HtmlDefaults::HTML_STYLE_TAGS_TO_STYLE[tagname]
        @stack.unshift({ tagname: tagname, style: style, start: current_character_offset })
      end

      def track_end(tagname, current_character_offset)
        descriptor_index = @stack.find_index { _1[:tagname] == tagname && !_1[:finish] }
        descriptor = @stack[descriptor_index]
        descriptor[:finish] = current_character_offset
      end

      private

      def find_overlapping_styles(descriptors)
        descriptors.select do |candidate_a|
          candidate_range = candidate_a[:start]..candidate_a[:finish]
          (descriptors - [candidate_a]).any? do |other|
            other_range = other[:start]..other[:finish]
            range_overlaps?(candidate_range, other_range)
          end
        end
      end

      def range_overlaps?(candidate_range, other_range)
        other_range.begin == candidate_range.begin || candidate_range.cover?(other_range.begin) || other_range.cover?(candidate_range.begin)
      end
    end
  end
end

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
draftjs_html-0.21.0 lib/draftjs_html/from_html/style_stack.rb
draftjs_html-0.20.0 lib/draftjs_html/from_html/style_stack.rb
draftjs_html-0.19.0 lib/draftjs_html/from_html/style_stack.rb
draftjs_html-0.18.0 lib/draftjs_html/from_html/style_stack.rb
draftjs_html-0.17.0 lib/draftjs_html/from_html/style_stack.rb
draftjs_html-0.16.0 lib/draftjs_html/from_html/style_stack.rb
draftjs_html-0.15.0 lib/draftjs_html/from_html/style_stack.rb