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