File: miquire.rb

package info (click to toggle)
mikutter 3.8.6%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 10,544 kB
  • sloc: ruby: 20,548; sh: 99; makefile: 19
file content (102 lines) | stat: -rw-r--r-- 3,936 bytes parent folder | download | duplicates (5)
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
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
94
95
96
97
98
99
100
101
102
# -*- coding: utf-8 -*-
# 多くの人に最初に突っ込まれるメソッドを定義する

require 'set'

$LOAD_PATH.
  unshift(File.expand_path(File.join(File.dirname(__FILE__)))).
  unshift(File.expand_path(File.join(File.dirname(__FILE__), '../vendor/'))).
  unshift(File.expand_path(File.join(File.dirname(__FILE__), 'lib')))

# ミクってかわいいよねぇ。
# ツインテールいいよねー。
# どう良いのかを書くとコードより長くなりそうだから詳しくは書かないけどいいよねぇ。
# ふたりで寒い時とかに歩いてたら首にまいてくれるんだよー。
# 我ながらなんてわかりやすい説明なんだろう。
# (訳: Miquire::miquire のエイリアス)
def miquire(*args)
  Miquire.miquire(*args)
end

module Miquire
  class << self

    PATH_KIND_CONVERTER = Hash.new{ |h, k| h[k] = k.to_s + '/' }
    # PATH_KIND_CONVERTER[:mui] = 'mui/gtk_'
    PATH_KIND_CONVERTER[:mui] = Class.new{
      define_method(:+){ |other|
        render = lambda{ |r| File.join('mui', "#{r}_" + other) }
        if other == '*' or FileTest.exist?(File.join(File.dirname(__FILE__), render[:cairo] + '.rb'))
          render[:cairo]
        else
          render[:gtk] end } }.new
    PATH_KIND_CONVERTER[:core] = File.expand_path(File.join(File.dirname(__FILE__)))+"/"
    PATH_KIND_CONVERTER[:user_plugin] = '../plugin/'
    PATH_KIND_CONVERTER[:lib] = Class.new{
      define_method(:+){ |other|
        render = lambda{ |r| File.join(r, other) }
        if FileTest.exist?(render["../vendor"] + '.rb')
          render["../vendor"]
        elsif FileTest.exist?(render["lib"] + '.rb')
          render["lib"]
        else
          other end } }.new

    # CHIのコアソースコードファイルを読み込む。
    # _kind_ はファイルの種類、 _file_ はファイル名(拡張子を除く)。
    # _file_ を省略すると、そのディレクトリ下のrubyファイルを全て読み込む。
    # その際、そのディレクトリ下にディレクトリがあれば、そのディレクトリ内に
    # そのディレクトリと同じ名前のRubyファイルがあると仮定して読み込もうとする。
    # == Example
    #  miquire :plugin
    # == Directory hierarchy
    #  plugins/
    #  + a.rb
    #  `- b/
    #     + README
    #     + b.rb
    #     ` c.rb
    #  a.rbとb.rbが読み込まれる(c.rbやREADMEは読み込まれない)
    def miquire(kind, *files)
      kind = kind.to_sym
      if files.empty?
        miquire_all_files(kind)
      else
        if kind == :lib
          files.each{ |file|
            path = File.expand_path(PATH_KIND_CONVERTER[:lib] + file)
            directory = File.dirname(path)
            if FileTest.exist?(directory)
              Dir.chdir(File.dirname(path)) {
                miquire_original_require file }
            else
              miquire_original_require file end }
        else
          files.each{ |file|
            file_or_directory_require PATH_KIND_CONVERTER[kind] + file.to_s } end end end

    # miquireと同じだが、全てのファイルが対象になる
    def miquire_all_files(kind)
      kind = kind.to_sym
      Dir.glob(PATH_KIND_CONVERTER[kind] + '*'.freeze).select{ |x| FileTest.directory?(x) or x.end_with?('.rb'.freeze) }.sort.each{ |rb|
        file_or_directory_require(rb) } end

    def file_or_directory_require(rb)
      if(match = rb.match(/\A(.*)\.rb\Z/))
        rb = match[1] end
      case
      when FileTest.directory?(File.join(rb))
        plugin = (File.join(rb, File.basename(rb)))
        if FileTest.exist? plugin or FileTest.exist? "#{plugin}.rb"
          miquire_original_require plugin
        else
          miquire_original_require rb end
      else
        miquire_original_require rb end end

    def miquire_original_require(file)
      require file end
  end

  class LoadError < StandardError; end
end