File: sidebar.rb

package info (click to toggle)
kazehakase 0.4.2-1etch2
  • links: PTS
  • area: main
  • in suites: etch
  • size: 7,260 kB
  • ctags: 7,377
  • sloc: ansic: 62,697; cpp: 13,422; sh: 9,083; ruby: 1,588; makefile: 1,026; xml: 372
file content (54 lines) | stat: -rw-r--r-- 1,367 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
module Kz
  module SidebarFactory
    @@entries = nil

    module_function
    def entries
      Kz.barrier([]) do
        if @@entries.nil?
          load_sidebars
          @@entries = {}
          ObjectSpace.each_object(Class) do |klass|
            if klass.respond_to?(:sidebar_entry?) and klass.sidebar_entry? and
                klass.respond_to?(:priority_hint) and
                klass.respond_to?(:label) and
                klass.respond_to?(:icon) and
                klass.respond_to?(:create)
              @@entries[klass.label] = klass
            end
          end
        end
        @@entries.collect do |key, entry|
          [entry.priority_hint, entry.label, entry.icon]
        end
      end
    end

    def create(label, sidebar)
      Kz.barrier do
        return nil unless @@entries.has_key?(label)
        entry = @@entries[label]
        entry.create(sidebar)
      end
    end

    def load_sidebars
      search_dirs.each do |dir|
        next unless File.exist?(dir)
        Dir[File.join(dir, "*.rb")].each do |sidebar|
          Kz.barrier do
            require sidebar.sub(/\.rb/, '')
          end
        end
      end
    end

    def search_dirs
      dirs = $LOAD_PATH.collect do |path|
        File.join(File.expand_path(path), "kz", "sidebars")
      end
      dirs.unshift(Kz::SIDEBARS_DIR)
      dirs
    end
  end
end