diff options
author | Taco Hoekwater <taco@elvenkind.com> | 2009-08-23 11:11:32 +0000 |
---|---|---|
committer | Taco Hoekwater <taco@elvenkind.com> | 2009-08-23 11:11:32 +0000 |
commit | 8fc3039c82d48605b5ca8b2eda3f4fdd755681e1 (patch) | |
tree | 3cd9bbdd599bc4d1ac0409e167fee2136e4c0ec9 /Master/texmf-dist/scripts/context/lua/mtx-chars.lua | |
parent | 850fc99b7cd3ae7a20065531fe866ff7bae642ec (diff) |
this is context 2009.08.19 17:10
git-svn-id: svn://tug.org/texlive/trunk@14827 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/scripts/context/lua/mtx-chars.lua')
-rw-r--r-- | Master/texmf-dist/scripts/context/lua/mtx-chars.lua | 336 |
1 files changed, 238 insertions, 98 deletions
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-chars.lua b/Master/texmf-dist/scripts/context/lua/mtx-chars.lua index a05ab9f0860..d4330ca304d 100644 --- a/Master/texmf-dist/scripts/context/lua/mtx-chars.lua +++ b/Master/texmf-dist/scripts/context/lua/mtx-chars.lua @@ -6,39 +6,12 @@ if not modules then modules = { } end modules ['mtx-chars'] = { license = "see context related readme files" } -texmf.instance = instance -- we need to get rid of this / maybe current instance in global table +local format, concat, utfchar, upper = string.format, table.concat, unicode.utf8.char, string.upper scripts = scripts or { } scripts.chars = scripts.chars or { } -function scripts.chars.stixtomkiv(inname,outname) - if inname == "" then - logs.report("aquiring math data","invalid datafilename") - end - local f = io.open(inname) - if not f then - logs.report("aquiring math data","invalid datafile") - else - logs.report("aquiring math data","processing " .. inname) - if not outname or outname == "" then - outname = "char-mth.lua" - end - local classes = { - N = "normal", - A = "alphabetic", - D = "diacritic", - P = "punctuation", - B = "binary", - R = "relation", - L = "large", - O = "opening", - C = "closing", - F = "fence" - } - local format, concat = string.format, table.concat - local valid, done = false, { } - local g = io.open(outname,'w') - g:write([[ +local banner = [[ -- filename : char-mth.lua -- comment : companion to char-mth.tex (in ConTeXt) -- author : Hans Hagen, PRAGMA-ADE, Hasselt NL @@ -47,136 +20,303 @@ function scripts.chars.stixtomkiv(inname,outname) if not versions then versions = { } end versions['char-mth'] = 1.001 if not characters then characters = { } end - ]]) - g:write(format("\ncharacters.math = {\n")) - for l in f:lines() do - if not valid then - valid = l:find("AMS/TeX name") - end - if valid then - local unicode = l:sub(2,6) - if unicode:sub(1,1) ~= " " and unicode ~= "" and not done[unicode] then - local mathclass, adobename, texname = l:sub(57,57) or "", l:sub(13,36) or "", l:sub(84,109) or "" - texname, adobename = texname:gsub("[\\ ]",""), adobename:gsub("[\\ ]","") - local t = { } - if mathclass ~= "" then t[#t+1] = format("mathclass='%s'", classes[mathclass] or "unknown") end - if adobename ~= "" then t[#t+1] = format("adobename='%s'", adobename ) end - if texname ~= "" then t[#t+1] = format("texname='%s'" , texname ) end - if #t > 0 then - g:write(format("\t[0x%s] = { %s },\n",unicode, concat(t,", "))) +]] + +--~ function scripts.chars.stixtomkiv(inname,outname) +--~ if inname == "" then +--~ logs.report("aquiring math data","invalid datafilename") +--~ end +--~ local f = io.open(inname) +--~ if not f then +--~ logs.report("aquiring math data","invalid datafile") +--~ else +--~ logs.report("aquiring math data","processing " .. inname) +--~ if not outname or outname == "" then +--~ outname = "char-mth.lua" +--~ end +--~ local classes = { +--~ N = "normal", +--~ A = "alphabetic", +--~ D = "diacritic", +--~ P = "punctuation", +--~ B = "binary", +--~ R = "relation", +--~ L = "large", +--~ O = "opening", +--~ C = "closing", +--~ F = "fence" +--~ } +--~ local valid, done = false, { } +--~ local g = io.open(outname,'w') +--~ g:write(banner) +--~ g:write(format("\ncharacters.math = {\n")) +--~ for l in f:lines() do +--~ if not valid then +--~ valid = l:find("AMS/TeX name") +--~ end +--~ if valid then +--~ local unicode = l:sub(2,6) +--~ if unicode:sub(1,1) ~= " " and unicode ~= "" and not done[unicode] then +--~ local mathclass, adobename, texname = l:sub(57,57) or "", l:sub(13,36) or "", l:sub(84,109) or "" +--~ texname, adobename = texname:gsub("[\\ ]",""), adobename:gsub("[\\ ]","") +--~ local t = { } +--~ if mathclass ~= "" then t[#t+1] = format("mathclass='%s'", classes[mathclass] or "unknown") end +--~ if adobename ~= "" then t[#t+1] = format("adobename='%s'", adobename ) end +--~ if texname ~= "" then t[#t+1] = format("texname='%s'" , texname ) end +--~ if #t > 0 then +--~ g:write(format("\t[0x%s] = { %s },\n",unicode, concat(t,", "))) +--~ end +--~ done[unicode] = true +--~ end +--~ end +--~ end +--~ if not valid then +--~ g:write("\t-- The data file is corrupt, invalid or maybe the format has changed.\n") +--~ logs.report("aquiring math data","problems with data table") +--~ else +--~ logs.report("aquiring math data","table saved in " .. outname) +--~ end +--~ g:write("}\n") +--~ g:close() +--~ f:close() +--~ end +--~ end + +function scripts.chars.stixtomkiv(inname,outname) + logs.report("we no longer use this options but use our own tables instead") +end + +local banner_pdf_1 = [[ +% filename : pdfr-def.tex +% comment : generated by mtxrun --script chars --pdf +% author : Hans Hagen, PRAGMA-ADE, Hasselt NL +% copyright: PRAGMA ADE / ConTeXt Development Team +% license : see context related readme files +% +]] + +local banner_pdf_2 = [[ +% +\endinput +]] + +function scripts.chars.makepdfr() + local chartable = resolvers.find_file("char-def.lua") or "" + if chartable ~= "" then + dofile(chartable) + if characters and characters.data then + local f = io.open("pdfr-def.tex", 'w') + if f then + f:write(banner_pdf_1) + local cd = characters.data + local sd = table.sortedkeys(cd) + for i=1,#sd do + local char = cd[sd[i]] + if char.adobename then + f:write(format("\\pdfglyphtounicode{%s}{%04X}%%\n",char.adobename,char.unicodeslot)) end - done[unicode] = true end + f:write(banner_pdf_2) + f:close() end end - if not valid then - g:write("\t-- The data file is corrupt, invalid or maybe the format has changed.\n") - logs.report("aquiring math data","problems with data table") - else - logs.report("aquiring math data","table saved in " .. outname) - end - g:write("}\n") - g:close() - f:close() end end -scripts.chars.banner_utf_1 = [[ -% filename : enco-utf.tex -% comment : generated by mtxrun --script chars --utf -% author : Hans Hagen, PRAGMA-ADE, Hasselt NL -% copyright: PRAGMA ADE / ConTeXt Development Team -% license : see context related readme files +local banner_utf_module = [[ +%% filename : %s +%% comment : generated by mtxrun --script chars --xtx +%% author : Hans Hagen, PRAGMA-ADE, Hasselt NL +%% copyright: PRAGMA ADE / ConTeXt Development Team +%% license : see context related readme files +]] -\ifx\setcclcucx\undefined +local banner_utf_mappings = [[ - \def\setcclcucx #1 #2 #3 % - {\global\catcode"#1=11 - \global\lccode "#1="#2 - \global\uccode "#1="#3 } +% lc/uc/catcode mappings -\fi ]] -scripts.chars.banner_utf_2 = [[ +local banner_utf_patch = [[ -% lc/uc/catcode mappings +% patch needed for turkish +\setXTXcharcodes "201C "201C "201C +\setXTXcharcodes "201D "201D "201D ]] -scripts.chars.banner_utf_3 = [[ +local banner_utf_names = [[ % named characters mapped onto utf (\\char is needed for accents) ]] -scripts.chars.banner_utf_4 = [[ +local banner_utf_classes = [[ + +% some character classes for xetex; seems to be rather hard coded, these numbers +% and also a mix of several classes; here we do linebreaks + +]] + +local banner_utf_finish = [[ \endinput ]] +local xtxclasses = { + id = 1, + ex = 3, + is = 3, + cm = 256, + op = 2, + ns = 3, + cl = 3, +} + function scripts.chars.makeencoutf() - local chartable = input.find_file(instance,"char-def.lua") or "" + local chartable = resolvers.find_file("char-def.lua") or "" if chartable ~= "" then dofile(chartable) - if characters and characters.data then - local f = io.open("enco-utf.tex", 'w') + local function open(name,banner) + local f = io.open(name,'w') + if f then + logs.simple("writing '%s'",name) + f:write(format(banner_utf_module,name)) + f:write(banner) + f:write() + return f + end + end + local function close(f) + f:write(banner_utf_finish) + f:close() + end + local data = characters and characters.data + if data then + local list = table.sortedkeys(characters.data) + local f = open("xetx-utf.tex",banner_utf_mappings) if f then - local char, format = unicode.utf8.char, string.format - f:write(scripts.chars.banner_utf_1) - f:write(scripts.chars.banner_utf_2) - local list = table.sortedkeys(characters.data) - local length = 0 for i=1,#list do local code = list[i] if code <= 0xFFFF then - local chr = characters.data[code] + local chr = data[code] local cc = chr.category if cc == 'll' or cc == 'lu' or cc == 'lt' then if not chr.lccode then chr.lccode = code end if not chr.uccode then chr.uccode = code end - f:write(format("\\setcclcucx %04X %04X %04X %% %s\n",code,chr.lccode,chr.uccode,chr.description)) + f:write(format('\\setXTXcharcodes "%05X "%05X "%05X %% %s\n',code,chr.lccode,chr.uccode,chr.description)) + end + end + end + f:write("\n") + for i=1,#list do + local code = list[i] + local chr = data[code] + if chr and chr.range then + local cc = chr.category + if cc == 'lo' then + f:write(format('\\dofastrecurse{"%05X}{"%05X}{1}{\\dosetXTXcharcodes\\recurselevel\\recurselevel\\recurselevel}\n',code,chr.range)) end - if #(chr.contextname or "") > length then + end + end + f:write(banner_utf_patch) + close(f) + end + local f = open("xetx-chr.tex",banner_utf_names) + if f then + local length = 0 + for i=1,#list do + local code = list[i] + if code > 0x5B and code <= 0xFFFF then + local chr = data[code] + if chr and #(chr.contextname or "") > length then length = #chr.contextname end end end - f:write(scripts.chars.banner_utf_3) for i=1,#list do local code = list[i] if code > 0x5B and code <= 0xFFFF then - local chr = characters.data[code] - if chr.contextname then - local ch = char(code) ---~ if ch:find("[~#$%%^&{}\\]") then - f:write(format("\\def\\%s{\\char\"%04X } %% %s: %s\n", chr.contextname:rpadd(length," "), code, chr.description, ch)) ---~ else ---~ f:write(format("\\def\\%s{%s} %% %s\n", chr.contextname:rpadd(length," "), ch,chr.description)) ---~ end + local chr = data[code] + if chr and chr.contextname then + local ch = utfchar(code) + f:write(format("\\def\\%s{\\char\"%05X } %% %s: %s\n", chr.contextname:rpadd(length," "), code, chr.description, ch)) end end end - f:write(scripts.chars.banner_utf_4) - f:close() + close(f) + end + local f = open("xetx-cls.tex",banner_utf_classes) + if f then + for k, v in pairs(xtxclasses) do + f:write(format("\\defineXTXcharinjectionclass[lb:%s]\n",k)) + end + f:write("\n") + local i_first, i_last, i_clb = nil, nil, nil + local function flush() + if i_first then + if i_first == i_last then + f:write(format('\\dosetXTXcharacterclass{"%05X}{lb:%s}\n',i_first,i_clb)) + else + f:write(format('\\dofastrecurse{"%05X}{"%05X}{1}{\\dosetXTXcharacterclass\\fastrecursecounter{lb:%s}}\n',i_first,i_last,i_clb)) + end + end + i_first, i_last, i_clb = nil, nil, nil + end + for i=1,#list do + local code = list[i] + local code_next = list[i+1] + local chr = data[code] + local chr_next = data[code_next] + local clb = chr and chr.linebreak + local lbc = xtxclasses[clb] + if not lbc then + flush() + elseif clb == i_clb then + if i_first then + i_last = code + else + i_first, i_last, i_clb = code, code, clb + end + else + flush() + i_first, i_last, i_clb = code, code, clb + end + end + flush() + f:write("\n") + for i=1,#list do + local code = list[i] + local chr = data[code] + if chr and chr.range then + local lbc = chr.linebreak + if xtxclasses[lbc] then + f:write(format('\\dofastrecurse{"%05X}{"%05X}{1}{\\dosetXTXcharacterclass\\fastrecursecounter{lb:%s}}\n',code,chr.range,lbc)) + end + end + end + close(f) end end end end -banner = banner .. " | character tools " +logs.extendbanner("Character Tools 0.10") messages.help = [[ --stix convert stix table to math table ---utf generate enco-utf.tex (used by xetex) +--xtx generate xetx-*.tex (used by xetex) +--pdf generate pdfr-def.tex (used by pdftex) ]] if environment.argument("stix") then local inname = environment.files[1] or "" local outname = environment.files[2] or "" scripts.chars.stixtomkiv(inname,outname) -elseif environment.argument("utf") then +elseif environment.argument("xtx") then scripts.chars.makeencoutf() +elseif environment.argument("pdf") then + scripts.chars.makepdfr() else - input.help(banner,messages.help) + logs.help(messages.help) end |