From 0a964418bc66e27bdc4733bd834819c2dd10d52d Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Thu, 31 May 2018 21:52:21 +0000 Subject: luavlna (31may18) git-svn-id: svn://tug.org/texlive/trunk@47892 c570f23f-e606-0410-a88d-b1316a301751 --- .../tex/luatex/luavlna/luavlna-langno.lua | 120 +++++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 Master/texmf-dist/tex/luatex/luavlna/luavlna-langno.lua (limited to 'Master/texmf-dist/tex/luatex/luavlna/luavlna-langno.lua') diff --git a/Master/texmf-dist/tex/luatex/luavlna/luavlna-langno.lua b/Master/texmf-dist/tex/luatex/luavlna/luavlna-langno.lua new file mode 100644 index 00000000000..f4c654ff5fa --- /dev/null +++ b/Master/texmf-dist/tex/luatex/luavlna/luavlna-langno.lua @@ -0,0 +1,120 @@ +-- langno.lua +-- library for working with luatex's language numbers +-- glyph nodes have numerical lang field, but the language names for +-- these numbers aren't saved. +-- +-- this library tries to find language names by parsing `language.dat` file +-- + +local M = {} + +local tex = tex or {} + +local format = tex.formatname -- or "luatex" + +-- languages object +local lang_obj = function(names, numbers) + local obj = {} + obj.__index = obj + local self = setmetatable({},obj) + self.names = names + self.numbers = numbers + -- get language name by number + self.get_name = function(self, number) + return self.numbers[number] + end + -- get language number by name + self.get_number = function(self, name) + return self.names[name] + end + return self +end + + +-- default language loader, language.dat file is parsed +local load_lang_dat = function(start) + -- languages are saved in the file language.dat + local lang_dat = kpse.find_file("language.dat") + if not lang_dat then + return nil, "Cannot load file language.dat" + end + local f = io.open(lang_dat, "r") + local i = start or 0 + local numlang = {} -- return language name + local langnum = {} -- return language number + for line in f:lines() do + -- match comment, equal sign and first word on a line + local first, language = line:match("%s*([%%%=]?)([%a]*)") + if first ~="%" then -- ignore comments + langnum[language] = i + if first ~="=" then -- on lines starting with eq are language synonyms + --print(i, language) + numlang[i] = language + i = i + 1 + end + end + end + return lang_obj(langnum, numlang)--{numbers = numlang, names = langnum} +end + +local load_lang_dat_lualatex = function() + return load_lang_dat(1) +end + +local load_csplain= function() + local l = require "luavlna-csplain-langs" + local langnum = {} + local numlang = {} + for k, v in pairs(l) do + local first = k:gsub(" *;.*","") + --print(first) + langnum[first] = v + for _,i in ipairs(v) do + numlang[i] = first + end + end + return lang_obj(langnum, numlang) +end + + +-- because different formats may use different ways to load languages +-- driver mechanism is provided. +local drivers = {} +drivers["lualatex"] = load_lang_dat_lualatex +drivers["luatex"] = load_lang_dat +drivers["default"] = load_lang_dat +drivers["csplain"] = load_csplain +drivers["pdfcsplain"] = load_csplain +drivers["luaplain"] = load_csplain + +local load_languages = function(name) + local name = name or format + print ("Load driver: "..name) + local func = drivers[name] or drivers["default"] + if not func then return nil, "Cannot find driver function "..name end + return func() +end + +-- only load_languages function is provided to the outside world +M.load_languages = load_languages + +return M +--[[ + +-- sample usage: +local j = load_languages() +print(j:get_name(16)) +print(j:get_number("slovak")) +for k, v in pairs(j.numbers) do + print(k,v) +end +--]] + +-- this may be used in future, if I find a way how does local language.dat +-- affect language loading +-- load local language.dat +--[[ +local loc = kpse.var_value('TEXMFLOCAL') .. "tex/generic/config/language.dat" +local f, msg = io.open(loc, "r") +f:read("*all") +--]] -- cgit v1.2.3