Class: SC::Helpers::EntrySorter

Inherits:
Object
  • Object
show all
Defined in:
lib/sproutcore/helpers/entry_sorter.rb

Overview

Sorts a set of entries, respecting any “requires” found in the entries. To use the sorter, just call the class method EntrySorter.sort() passing the entries to sort along with any filenames you prefer to have added to the top. If you don’t specify any filenames, then the entries will be sorted alphabetically except for requires.

When module_info.js is present, it will always be sorted first.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(preferred_filenames = []) ⇒ EntrySorter

Returns a new instance of EntrySorter.



38
39
40
# File 'lib/sproutcore/helpers/entry_sorter.rb', line 38

def initialize(preferred_filenames = [])
  @preferred_filenames = preferred_filenames
end

Instance Attribute Details

#preferred_filenamesObject (readonly)

Returns the value of attribute preferred_filenames.



42
43
44
# File 'lib/sproutcore/helpers/entry_sorter.rb', line 42

def preferred_filenames
  @preferred_filenames
end

Class Method Details

.sort(entries, preferred_filenames = []) ⇒ Object



34
35
36
# File 'lib/sproutcore/helpers/entry_sorter.rb', line 34

def self.sort(entries, preferred_filenames = [])
  self.new(preferred_filenames).sort(entries)
end

Instance Method Details

#sort(entries) ⇒ Object



44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/sproutcore/helpers/entry_sorter.rb', line 44

def sort(entries)
  moduleInfoEntry = []
  bundleLoadedEntry = []

  all_entries = {}
  entries.each do |e|
    name = e.extensionless_filename
    all_entries[name] = e
  end


  # first remove bundle entries which MUST be first or last
  entries = entries.select do |entry|
    if entry.normalized_filename == 'module_info.js'
      moduleInfoEntry = [entry]
      false
    else
      true
    end
  end

  entries.sort_by! do |entry|
    name = entry.normalized_filename

    result = case name
    when /main\.js$/
      [2, name]
    when /(?:lproj|resources)\/.+_page\.js$/
      [1, name]
    when /lproj\/strings.js$/
      [-2, name]
    when /lproj\/layout.js$/
      [-2, name]
    else
      [-1, name]
    end

    # force preferred filenames to the front on the list
    result.unshift(@preferred_filenames.include?(name) ? -1 : 1)
  end

  # now process each entry to handle requires
  seen = Set.new
  ret = []
  while cur = entries.shift
    add_entry_to_set(cur, ret, seen, entries, all_entries)
  end

  return moduleInfoEntry + ret
end