Sha256: 61ef0d4cb06707fc49fbf5753d23a094a48d5c07e963d5e9861c992dbb3c3b0e

Contents?: true

Size: 1.4 KB

Versions: 1

Compression:

Stored size: 1.4 KB

Contents

class SCSSBeautifier::Formatters::PropertySortOrder < SCSSBeautifier::Formatters::Base
  def visit_rule(node)
    order_children(node)
    visit_children(node)
  end

  private

  def order_children(node)
    prop_nodes = []
    comment_array = []
    seen_comments = []
    node.children.each do |child|
      hash_key = child.class.node_name.to_s
      if hash_key == 'comment'
        seen_comments << child
        prev_grouping = prop_nodes.last
        if prev_grouping && prop_node_for(prev_grouping).line == child.line
          prev_grouping << child
        else
          comment_array << child
        end
      elsif hash_key == 'prop'
        prop_nodes << comment_array.push(child)
        comment_array = []
      end
    end

    # account for remaining comments
    seen_comments -= comment_array

    prop_nodes.sort! { |x,y| prop_node_for(x).name[0] <=> prop_node_for(y).name[0] }
    # Replace children being respective of other types of props/funcs/etc
    children = []
    node.children.each do |child|
      hash_key = child.class.node_name.to_s
      if hash_key == 'prop'
        children.concat(prop_nodes.shift)
      elsif hash_key != 'comment' || !seen_comments.include?(child)
        children << child
      end
    end
    node.children = children
  end

  # In an Array of nodes, get the prop node
  def prop_node_for(grouping)
    grouping.find { |node| node.class.node_name == :prop }
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
scss_beautifier-0.1.19 lib/scss_beautifier/formatters/property_sort_order.rb