diff options
Diffstat (limited to 'language/hyph-utf8/source/generic/hyph-utf8/lib/tex/hyphen/texlive/loader.rb')
-rw-r--r-- | language/hyph-utf8/source/generic/hyph-utf8/lib/tex/hyphen/texlive/loader.rb | 193 |
1 files changed, 193 insertions, 0 deletions
diff --git a/language/hyph-utf8/source/generic/hyph-utf8/lib/tex/hyphen/texlive/loader.rb b/language/hyph-utf8/source/generic/hyph-utf8/lib/tex/hyphen/texlive/loader.rb new file mode 100644 index 0000000000..2fcb3945d3 --- /dev/null +++ b/language/hyph-utf8/source/generic/hyph-utf8/lib/tex/hyphen/texlive/loader.rb @@ -0,0 +1,193 @@ +module TeX + module Hyphen + module TeXLive + module Loader + + def unicode_only? # TODO Spec out + ['cu', 'sa','as','bn','gu','hi','hy','kn','lo','mul-ethi','ml','mr','or','pa','ta','te', 'pi'].include? @bcp47 + end + + def string_enc + (encoding == nil) ? "" : encoding.upcase + " " + end + + def lcchars + if isgreek? + # some catcodes for XeTeX + return { + lccode: { + 0x0027 => '\'', + 0x2019 => '’', + 0x02BC => 'ʼ', + 0x1FBD => '᾽', + 0x1FBF => '᾿', + } + } + end + + return { } unless unicode_only? + + default = { + comment: 'Set \lccode for ZWNJ and ZWJ.', + lccode: { + 0x200C => false, + 0x200D => false, + } + } + + { + 'mul-ethi' => { + comment: 'Set \lccode for Ethiopian word space.', + lccode: { + 0x1361 => false, + 0x1362 => false, + } + }, + 'cu' => { + comment: 'fix lccodes for some characters (they were recently included in Unicode)', + lccode: { + 0x1C82 => 'sharp o in lowercase "uk"', + 0x1DF6 => false, + 0x1DF7 => false, + 0x1DF8 => false, + 0x1DF9 => false, + 0xA69E => false, + 0x1C86 => false, + 0xA67E => false, + 0xFE2E => false, + 0xFE2F => false, + } + }, + 'sa' => { + comment: 'Set \lccode for ZWNJ and ZWJ.', + lccode: { + 0x200C => false, + 0x200D => "\n% Set \\lccode for KANNADA SIGN JIHVAMULIYA and KANNADA SIGN UPADHMANIYA.", + 0x0CF1 => false, + 0x0CF2 => false, + } + }, + }[@bcp47] || default + end + + def utf8_engine_message + if serbian? + 'UTF-8 Serbian hyphenation patterns' + else + sprintf('UTF-8 %s', message) + end + end + + def non_utf8_engine_message + if unicode_only? + sprintf('No %s - only for Unicode engines', message) + else + sprintf('%s%s', string_enc, message) + end + end + + def engine_message(engine) + if engine == 'UTF-8' + { + comment: 'Unicode-aware engine (such as XeTeX or LuaTeX) only sees a single (2-byte) argument', + message: utf8_engine_message + } + else # engine is 8-bit or pTeX + { + comment: engine + + if engine == '8-bit' then " engine (such as TeX or pdfTeX)" else "" end, + message: non_utf8_engine_message + } + end + end + + def input_8bit_file + if @bcp47 == 'la-x-liturgic' + { + input: [pTeX_patterns] + } + elsif use_old_patterns_comment + # explain why we are still using the old patterns + { + comment: use_old_patterns_comment, + input: [legacy_patterns] + } + elsif !italic? + { + input: [sprintf('conv-utf8-%s.tex', encoding), sprintf('hyph-%s.tex', @bcp47)] + } + else + { + input: [sprintf('hyph-%s.tex', @bcp47)] + } + end + end + + def input_utf8_line + if serbian? + { + comment: 'We load both scripts at the same time to simplify usage', + input: ['hyph-sh-latn.tex', 'hyph-sh-cyrl.tex'] + } + else + { + input: [sprintf('hyph-%s.tex', @bcp47)] + } + end + end + + def format_inputs(specification) + if specification.is_a? Array + return specification.map do |hash| + format_inputs(hash) + end + end + + byebug unless specification.is_a? Hash + comment = specification[:comment] + message = specification[:message] + if comment then [sprintf('%% %s', comment)] else [] end + + if message then [sprintf('\\message{%s}', message)] else [] end + + (specification[:lccode] || []).map do |code, comment| + sprintf '\\lccode"%04X="%04X%s', code, code, if comment then sprintf ' %% %s', comment else '' end + end + + (specification[:input] || []).map do |input| + sprintf '\\input %s', input + end + end + + def input_line(engine) + if engine == '8-bit' + input_8bit_file + elsif engine == 'pTeX' + { input: [pTeX_patterns] } + elsif engine == 'UTF-8' + input_utf8_line + end + end + + def utf8_chunk + [ + engine_message('UTF-8'), + # lccodes + lcchars, + input_line('UTF-8'), + if has_apostrophes? then { input: [sprintf('hyph-quote-%s.tex', bcp47)] } end + ].compact + end + + def nonutf8_chunk(engine) + [engine_message(engine), unless unicode_only? then input_line(engine) end].compact + end + + def loadhyph + if use_old_loader + legacy_patterns + else + sprintf 'loadhyph-%s.tex', @bcp47.gsub(/^sh-/, 'sr-') + end + end + end + end + end +end |