• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/usr/bin/env ruby
2
3require_relative 'hyph-utf8'
4require_relative 'lib/tex/hyphen'
5require_relative 'lib/tex/hyphen/texlive'
6include TeX::Hyphen
7include TeXLive
8
9# this file generates patterns for pTeX out of the plain ones
10
11# load encodings
12encodings_list =
13  Dir.glob(File.expand_path(File.join(__dir__, 'data/encodings/*.dat'))).map do |encdat|
14    encdat.gsub /^.*\/(.*)\.dat$/, '\1'
15end
16encodings = Hash.new
17encodings_list.each do |encoding_name|
18  encodings[encoding_name] = HyphEncoding.new(encoding_name)
19end
20
21header = <<-HEADER
22%% pTeX-friendly hyphenation patterns
23%%
24%% language: %s (%s)
25%% encoding: %s
26%%
27%% This file has been auto-generated from hyph-%s.tex
28%% with a script [texmf]/scripts/generic/hyph-utf8/generate-ptex-patterns.rb
29%% See the original file for details about author, licence etc.
30%%
31HEADER
32
33print 'Generating pTeX patterns for (skipped # reason): '
34Language.all.sort.each do |language|
35  if language.use_old_patterns_comment || !language.encoding || language.encoding == 'ascii'
36    if language.use_old_patterns_comment
37      reason = 'legacy patterns'
38    else
39      reason = sprintf 'encoding: %s', language.encoding.inspect
40    end
41    print '(', language.bcp47, ' # ', reason, ') '
42
43    next
44  else
45    encoding = encodings[language.encoding]
46  end
47
48  bcp47 = language.bcp47
49
50  print bcp47,  ' '
51  File.open(File.join(PATH::PTEX, sprintf('hyph-%s.%s.tex', bcp47, language.encoding)), 'w') do |file_ptex|
52    patterns   = language.patterns
53    exceptions = language.exceptions
54
55    characters = patterns.join('').gsub(/[.0-9]/,'').unpack('U*').sort.uniq
56
57    if language.encoding != 'ascii' then
58      patterns   = encoding.convert_to_escaped_characters(patterns)
59      exceptions = encoding.convert_to_escaped_characters(exceptions)
60    end
61
62    file_ptex.printf(header, language.babelname, language.bcp47, language.encoding, language.bcp47)
63
64    file_ptex.puts("\\bgroup")
65    # setting lccodes for letters
66    characters.each do |c|
67      if (c == 0x01FD or c == 0x0301) and language.bcp47 == 'la-x-liturgic'
68        # skip
69      elsif c >= 128 then
70        code = encoding.unicode_characters[c].code_enc
71        file_ptex.printf("\\lccode\"%02X=\"%02X\n", code, code)
72      end
73    end
74    # patterns
75    if patterns.length > 0 then
76      file_ptex.puts("\\patterns{\n#{patterns.join("\n")}\n}")
77    end
78    # exceptions
79    if exceptions.length > 0 then
80      file_ptex.puts("\\hyphenation{\n#{exceptions.join("\n")}\n}")
81    end
82    file_ptex.puts("\\egroup")
83  end
84end
85puts
86