• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1module TeX
2  module Hyphen
3    module TeXLive
4      class Package
5        attr_reader :name
6
7        @@metadata = YAML::load File.read File.expand_path '../packages.yml', __dir__
8
9        def initialize(name)
10          @name = name
11          @languages = []
12        end
13
14        def add_language(language)
15          @languages << language
16          @languages.sort!
17        end
18
19        def languages
20          @languages
21        end
22
23        def self.packages
24          # a hash with the names of TeX Live packages, either individual language names,
25          # or an array of languages as the value
26          @@packages ||= Language.all.inject(Hash.new) do |packages, language|
27            if name = language.package || language.babelname # Package name, otherwise single language
28              packages[name] ||= Package.new(name) # Create new package if necessary
29              packages[name].add_language language
30            end
31
32            packages
33          end
34        end
35
36        def self.all
37          packages.values
38        end
39
40        def description_s
41          override = @@metadata.dig(@name, 'shortdesc_full')
42          return override if override
43
44          leader = @@metadata.dig(@name, 'shortdesc') || @name.titlecase
45          sprintf '%s hyphenation patterns', leader
46        end
47
48        def description
49          description = @@metadata.dig(@name, 'description')
50          if description
51            description
52          elsif @languages.count == 1
53            @languages.first.description
54          else
55            ''
56          end
57        end
58
59        def has_dependency?
60          @@metadata.dig(name, 'dependency')
61        end
62
63        def list_dependencies
64          dependencies = [
65            "depend hyphen-base",
66            "depend hyph-utf8",
67          ]
68
69          # external dependencies
70          if dependency = has_dependency?
71            dependencies << sprintf("depend %s", dependency)
72          end
73
74          dependencies
75        end
76
77        def list_support_files(type) # type is ‘doc’ or ‘source’
78          # Cache directory contents
79          (@dirlist ||= { })[type] ||= Dir.glob(sprintf(PATH::SUPPORT, type)).select do |file|
80            File.directory?(file)
81          end.map do |dir|
82            dir.gsub /^.*\//, ''
83          end
84
85          files = (languages.map(&:bcp47) & @dirlist[type]).map do |bcp47|
86            sprintf("%s/generic/hyph-utf8/languages/%s", type, bcp47)
87          end
88
89          if special = @@metadata.dig(name, type)
90            files << special
91          end
92
93          files
94        end
95
96        def list_run_files
97          files = []
98          files << "tex/generic/hyph-utf8/patterns/tex/hyph-no.tex" if name == "norwegian"
99
100          files = languages.inject(files) do |files, language|
101            files + language.list_run_files
102          end
103
104          unless has_dependency?
105            languages.each do |language|
106              if language.use_old_patterns_comment and language.legacy_patterns != "zerohyph.tex" and language.bcp47 != 'cop'
107                if ['la-x-classic', 'mk'].include? language.bcp47 # FIXME.  Yes, fix it ;-)
108                  files << sprintf("tex/generic/hyph-utf8/patterns/tex-8bit/%s", language.legacy_patterns)
109                else
110                  files << sprintf("tex/generic/hyphen/%s", language.legacy_patterns)
111                end
112              end
113            end
114          end
115
116          files
117        end
118
119        def <=>(other)
120          name <=> other.name
121        end
122
123        # TODO Spec out
124        def self.find(name)
125          packages[name]
126        end
127      end
128    end
129  end
130end
131