summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/generic/hyph-utf8/lib/tex/hyphen/texlive/package.rb
blob: 1d40dc512e8bfbed83cffaa4768c49d0c8629c9e (plain)
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
module TeX
  module Hyphen
    module TeXLive
      class Package
        attr_reader :name

        @@metadata = YAML::load File.read File.expand_path '../packages.yml', __dir__

        def initialize(name)
          @name = name
          @languages = []
        end

        def add_language(language)
          @languages << language
          @languages.sort!
        end

        def languages
          @languages
        end

        def self.packages
          # a hash with the names of TeX Live packages, either individual language names,
          # or an array of languages as the value
          @@packages ||= Language.all.inject(Hash.new) do |packages, language|
            if name = language.package || language.babelname # Package name, otherwise single language
              packages[name] ||= Package.new(name) # Create new package if necessary
              packages[name].add_language language
            end

            packages
          end
        end

        def self.all
          packages.values
        end

        def description_s
          override = @@metadata.dig(@name, 'shortdesc_full')
          return override if override

          leader = @@metadata.dig(@name, 'shortdesc') || @name.titlecase
          sprintf '%s hyphenation patterns', leader
        end

        def description
          description = @@metadata.dig(@name, 'description')
          if description
            description
          elsif @languages.count == 1
            @languages.first.description
          else
            ''
          end
        end

        def has_dependency?
          @@metadata.dig(name, 'dependency')
        end

        def list_dependencies
          dependencies = [
            "depend hyphen-base",
            "depend hyph-utf8",
          ]

          # external dependencies
          if dependency = has_dependency?
            dependencies << sprintf("depend %s", dependency)
          end

          dependencies
        end

        def list_support_files(type) # type is ‘doc’ or ‘source’
          # Cache directory contents
          (@dirlist ||= { })[type] ||= Dir.glob(sprintf(PATH::SUPPORT, type)).select do |file|
            File.directory?(file)
          end.map do |dir|
            dir.gsub /^.*\//, ''
          end

          files = (languages.map(&:bcp47) & @dirlist[type]).map do |bcp47|
            sprintf("%s/generic/hyph-utf8/languages/%s", type, bcp47)
          end

          if special = @@metadata.dig(name, type)
            files << special
          end

          files
        end

        def list_run_files
          files = []
          files << "tex/generic/hyph-utf8/patterns/tex/hyph-no.tex" if name == "norwegian"

          files = languages.inject(files) do |files, language|
            files + language.list_run_files
          end

          unless has_dependency?
            languages.each do |language|
              if language.use_old_patterns_comment and language.legacy_patterns != "zerohyph.tex" and language.bcp47 != 'cop'
                if language.bcp47 == 'la-x-classic'
                  files << sprintf("tex/generic/hyph-utf8/patterns/tex-8bit/%s", language.legacy_patterns)
                else
                  files << sprintf("tex/generic/hyphen/%s", language.legacy_patterns)
                end
              end
            end
          end

          files
        end

        def <=>(other)
          name <=> other.name
        end

        # TODO Spec out
        def self.find(name)
          packages[name]
        end
      end
    end
  end
end