diff options
author | Hans Hagen <pragma@wxs.nl> | 2009-05-28 11:23:00 +0200 |
---|---|---|
committer | Hans Hagen <pragma@wxs.nl> | 2009-05-28 11:23:00 +0200 |
commit | 1d3090326210c6e6f7ec5432799ded25b75bba46 (patch) | |
tree | c5921203789ec669e6bccaba4bd56f9c072dc56b /tex/context/base/sort-ini.lua | |
parent | 94d83f84758766511c5e324721e39fea6ab71dae (diff) | |
download | context-1d3090326210c6e6f7ec5432799ded25b75bba46.tar.gz |
beta 2009.05.28 11:23
Diffstat (limited to 'tex/context/base/sort-ini.lua')
-rw-r--r-- | tex/context/base/sort-ini.lua | 135 |
1 files changed, 42 insertions, 93 deletions
diff --git a/tex/context/base/sort-ini.lua b/tex/context/base/sort-ini.lua index 3e367173d..b75950860 100644 --- a/tex/context/base/sort-ini.lua +++ b/tex/context/base/sort-ini.lua @@ -1,8 +1,10 @@ --- filename : sort-ini.lua --- comment : companion to sort-ini.tex --- author : Hans Hagen, PRAGMA-ADE, Hasselt NL --- copyright: PRAGMA ADE / ConTeXt Development Team --- license : see context related readme files +if not modules then modules = { } end modules ['sort-ini'] = { + version = 1.001, + comment = "companion to sort-ini.tex", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} -- todo: -- @@ -11,7 +13,9 @@ -- texutil compatible -- always expand to utf -if not versions then versions = { } end versions['sort-ini'] = 1.001 +local utf = unicode.utf8 +local gsub = string.gsub +local utfcharacters, utfvalues = string.utfcharacters, string.utfvalues sorters = { } sorters.comparers = { } @@ -21,8 +25,7 @@ sorters.mappings = { } sorters.replacements = { } sorters.language = 'en' -function sorters.comparers.basic(a,b,i) -- [2] has entry, key, cmp - local sort_a, sort_b = a[2][i][3], b[2][i][3] +function sorters.comparers.basic(sort_a,sort_b) if #sort_a > #sort_b then if #sort_b == 0 then return 1 @@ -62,67 +65,35 @@ function sorters.comparers.basic(a,b,i) -- [2] has entry, key, cmp return -1 end end - sort_a, sort_b = a[2][i][2], b[2][i][2] - if sort_a == "" then sort_a = a[2][i][1] end - if sort_b == "" then sort_b = b[2][i][1] end - if sort_a < sort_b then - return -1 - elseif sort_a > sort_b then - return 1 - else - return 0 - end - end -end - -function sorters.prepare(data,split,n) - local strip = sorters.strip - for k,v in ipairs(data) do - for i=1,n do - local vv = v[2][i] - if vv then - if vv[2] then - if vv[2] ~= "" then - vv[3] = split(strip(vv[2])) - else - vv[3] = split(strip(vv[1])) - end - else - vv[2] = { } - vv[3] = split(strip(vv[1])) - end - else - v[2][i] = { {}, {}, {} } - end - end + return 0 end end function sorters.strip(str) -- todo: only letters and such utf.gsub("([^%w%d])","") - str = str:gsub("\\%S*","") - str = str:gsub("[%s%[%](){}%$\"\']*","") - str = str:gsub("(%d+)",function(s) return (" "):rep(10-#s) .. s end) -- sort numbers properly + str = gsub(str,"\\%S*","") + str = gsub(str,"[%s%[%](){}%$\"\']*","") + str = gsub(str,"(%d+)",function(s) return (" "):rep(10-#s) .. s end) -- sort numbers properly return str end sorters.defaultlanguage = 'en' -function sorters.splitters.utf(str) +function sorters.splitters.utf(str) -- brrr, todo: language local r = sorters.replacements[sorters.language] or sorters.replacements[sorters.defaultlanguage] or { } local m = sorters.mappings [sorters.language] or sorters.mappings [sorters.defaultlanguage] or { } local u = characters.uncompose local b = utf.byte local t = { } - for _,v in pairs(r) do - str = str:gsub(v[1],v[2]) + for _,v in next, r do + str = gsub(str,v[1],v[2]) end - for c in str:utfcharacters() do + for c in utfcharacters(str) do if m[c] then t[#t+1] = m[c] elseif #c == 1 then t[#t+1] = b(c) else - for cc in string.characters(u(c)) do + for cc in string.characters(u(c)) do -- utf ? t[#t+1] = m[cc] or b(cc) end end @@ -130,52 +101,30 @@ function sorters.splitters.utf(str) return t end -function sorters.sort(data,cmp) - table.sort(data,function(a,b) return cmp(a,b) == -1 end) +function sorters.sort(entries,cmp) + table.sort(entries,function(a,b) return cmp(a,b) == -1 end) end -function sorters.cleanup(data) - for k,v in ipairs(data) do - for kk,vv in ipairs(v[2]) do - if vv and #vv[1] == 0 then - v[1][kk] = nil - else - vv[3] = nil - end - end - for kk,vv in pairs(v) do - if vv == "" then - v[kk] = nil - end - end - end -end +-- temp workaround (is gone) -function sorters.unique(data) - local prev, last = nil, 0 - for _,v in ipairs(data) do - if not prev or not table.are_equal(prev,v,2,3) then -- check range - last = last + 1 - data[last] = v - prev = v - end - end - for i=last+1,#data do - data[i] = nil - end +function sorters.process() + -- gone end -function sorters.process(kind,data) - if data.entries then - if not data.sorted then - sorters.language = data.language or sorters.language - sorters[kind].prepare(data.entries) - sorters[kind].sort(data.entries) - sorters[kind].unique(data.entries) - data.sorted = true - end - return sorters[kind].flush(sorters[kind].finalize(data.entries),data.class,data.flush) - else - return { } - end -end +-- was: + +--~ function sorters.process(kind,data) +--~ if data.entries then +--~ if not data.sorted then +--~ sorters.language = data.language or sorters.language +--~ sorters[kind].prepare(data.entries) +--~ sorters[kind].sort(data.entries) +--~ sorters[kind].unique(data.entries) +--~ data.sorted = true +--~ end +--~ return sorters[kind].flush(sorters[kind].finalize(data.entries),data.class,data.flush) +--~ else +--~ return { } +--~ end +--~ end + |