summaryrefslogtreecommitdiff
path: root/tex
diff options
context:
space:
mode:
Diffstat (limited to 'tex')
-rw-r--r--tex/context/base/buff-ver.mkiv1
-rw-r--r--tex/context/base/bxml-apa.mkiv14
-rw-r--r--tex/context/base/cont-new.tex2
-rw-r--r--tex/context/base/context.mkiv1
-rw-r--r--tex/context/base/context.tex2
-rw-r--r--tex/context/base/l-table.lua55
-rw-r--r--tex/context/base/lang-sla.tex10
-rw-r--r--tex/context/base/lang-wrd.lua138
-rw-r--r--tex/context/base/lang-wrd.mkiv17
-rw-r--r--tex/context/base/lxml-sor.lua13
-rw-r--r--tex/context/base/lxml-xml.lua6
-rw-r--r--tex/context/base/node-tsk.lua1
-rw-r--r--tex/context/base/sort-ini.lua216
-rw-r--r--tex/context/base/sort-lan.lua48
-rw-r--r--tex/context/base/sort-lan.mkii50
-rw-r--r--tex/context/base/strc-reg.lua31
-rw-r--r--tex/context/base/strc-reg.mkiv3
-rw-r--r--tex/context/base/strc-syn.lua8
-rw-r--r--tex/generic/context/luatex-fonts-merged.lua57
19 files changed, 431 insertions, 242 deletions
diff --git a/tex/context/base/buff-ver.mkiv b/tex/context/base/buff-ver.mkiv
index e547e6f77..e80d2e773 100644
--- a/tex/context/base/buff-ver.mkiv
+++ b/tex/context/base/buff-ver.mkiv
@@ -566,6 +566,7 @@
\else
\doadaptleftskip{\typingparameter\c!margin}%
\fi
+ % no symbolic blanks !
\edef\!!stringa{\executeifdefined{\??bo\typingparameter\c!blank}{\typingparameter\c!blank}}%
\scratchskip\executeifdefined{\??tp:\c!blank:\!!stringa}\!!stringa\relax
\ifgridsnapping
diff --git a/tex/context/base/bxml-apa.mkiv b/tex/context/base/bxml-apa.mkiv
index 6ff21f59a..5fc87e5ef 100644
--- a/tex/context/base/bxml-apa.mkiv
+++ b/tex/context/base/bxml-apa.mkiv
@@ -188,7 +188,7 @@
\startxmlsetups bibtex:apa:common:title-it-and-series
\bibxmldoif {title} {
- \bgroup\it\bibxmlflush{title}\egroup
+ \bgroup\it\bibxmlflush{title}\/\egroup
\bibxmldoif {series} {
\bibtexlparent\bibxmlflush{series}\bibtexrparent
}
@@ -314,7 +314,7 @@
\bibxmlflush{title}\bibtexperiod
}
\bibxmldoifelse {journal} {
- \bgroup\it\bibxmlflush{journal}\egroup
+ \bgroup\it\bibxmlflush{journal}\/\egroup
} {
\bibxmldoif {crossref} {
In\bibtexspace\bibxmlflush{crossref}
@@ -372,7 +372,7 @@
\bibxmldoif {volume} {
\bibtexcomma volume\nonbreakablespace\bibxmlflush{volume}
\bibxmldoif {series} {
- \bibtexspace of\nonbreakablespace\bgroup\it\bibxmlflush{series}\egroup
+ \bibtexspace of\nonbreakablespace\bgroup\it\bibxmlflush{series}\/\egroup
}
\bibxmldoif {chapter} {
\bibtexcomma\bibxmlflush{chapter}
@@ -427,7 +427,7 @@
\bibxmldoif {volume} {
\bibtexcomma volume\nonbreakablespace\bibxmlflush{volume}
\bibxmldoif {series} {
- \bibtexspace of\nonbreakablespace\bgroup\it\bibxmlflush{series}\egroup
+ \bibtexspace of\nonbreakablespace\bgroup\it\bibxmlflush{series}\/\egroup
}
\bibxmldoif {chapter} {
\bibtexcomma\bibxmlflush{chapter}
@@ -470,7 +470,7 @@
In\bibtexspace
\bibxmldoifelse {title} {
\bibxmlsetup{bibtex:format:editors}\bibtexcomma
- \bgroup\it\bibxmlflush{title}\egroup
+ \bgroup\it\bibxmlflush{title}\/\egroup
\bibxmldoif {series} {
\bibxmldoif {volume} {
\bibtexcomma number\bibtexspace\bibxmlflush{volume}\bibtexspace in
@@ -509,7 +509,7 @@
\bibxmlflush{bibtex:apa:format:editors}
\bibtexcomma\bibtexsingularplural{editor}{editors}\bibtexcomma
}
- \bgroup\it\bibxmlflush{title}\egroup
+ \bgroup\it\bibxmlflush{title}\/\egroup
\bibxmldoif {series} {
\bibxmldoif {volume} {
\bibtexcomma number~\bibxmlflush{volume} in
@@ -539,7 +539,7 @@
\startxmlsetups bibtex:apa:proceedings
\bibxmlsetup{bibtex:apa:common:editor-or-key-and-year}
\bibxmldoif {title} {
- \bgroup\it\bibxmlflush{title}\egroup
+ \bgroup\it\bibxmlflush{title}\/\egroup
\bibxmldoif {volume} {
\bibtexcomma number\bibtexspace\bibxmlflush{volume}\bibtexspace in\bibtexspace
}
diff --git a/tex/context/base/cont-new.tex b/tex/context/base/cont-new.tex
index 8b86a64bf..8ef09e1a0 100644
--- a/tex/context/base/cont-new.tex
+++ b/tex/context/base/cont-new.tex
@@ -11,7 +11,7 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-\newcontextversion{2010.05.19 16:24}
+\newcontextversion{2010.05.20 20:00}
%D This file is loaded at runtime, thereby providing an
%D excellent place for hacks, patches, extensions and new
diff --git a/tex/context/base/context.mkiv b/tex/context/base/context.mkiv
index 861b329d8..ce3d7c684 100644
--- a/tex/context/base/context.mkiv
+++ b/tex/context/base/context.mkiv
@@ -117,6 +117,7 @@
\loadmarkfile{lang-ini}
\loadmarkfile{lang-lab}
+\loadmarkfile{lang-wrd}
\loadmarkfile{unic-ini}
diff --git a/tex/context/base/context.tex b/tex/context/base/context.tex
index 6b3441616..ec96c88cb 100644
--- a/tex/context/base/context.tex
+++ b/tex/context/base/context.tex
@@ -20,7 +20,7 @@
%D your styles an modules.
\edef\contextformat {\jobname}
-\edef\contextversion{2010.05.19 16:24}
+\edef\contextversion{2010.05.20 20:00}
%D For those who want to use this:
diff --git a/tex/context/base/l-table.lua b/tex/context/base/l-table.lua
index 97929c973..ee395d0f1 100644
--- a/tex/context/base/l-table.lua
+++ b/tex/context/base/l-table.lua
@@ -12,7 +12,55 @@ local concat, sort, insert, remove = table.concat, table.sort, table.insert, tab
local format, find, gsub, lower, dump, match = string.format, string.find, string.gsub, string.lower, string.dump, string.match
local getmetatable, setmetatable = getmetatable, setmetatable
local type, next, tostring, tonumber, ipairs = type, next, tostring, tonumber, ipairs
-local unpack = unpack or table.unpack
+
+-- Starting with version 5.2 Lua no longer provide ipairs, which makes
+-- sense. As we already used the for loop and # in most places the
+-- impact on ConTeXt was not that large; the remaining ipairs already
+-- have been replaced. In a similar fashio we also hardly used pairs.
+--
+-- Just in case, we provide the fallbacks as discussed in Programming
+-- in Lua (http://www.lua.org/pil/7.3.html):
+
+if not ipairs then
+
+ -- for k, v in ipairs(t) do ... end
+ -- for k=1,#t do local v = t[k] ... end
+
+ local function iterate(a,i)
+ i = i + 1
+ local v = a[i]
+ if v ~= nil then
+ return i, v --, nil
+ end
+ end
+
+ function ipairs(a)
+ return iterate, a, 0
+ end
+
+end
+
+if not pairs then
+
+ -- for k, v in pairs(t) do ... end
+ -- for k, v in next, t do ... end
+
+ function pairs(t)
+ return next, t -- , nil
+ end
+
+end
+
+-- Also, unpack has been moved to the table table, and for compatiility
+-- reasons we provide both now.
+
+if not table.unpack then
+ table.unpack = _G.unpack
+elseif not unpack then
+ _G.unpack = table.unpack
+end
+
+-- extra functions, some might go (when not used)
function table.strip(tab)
local lst = { }
@@ -199,7 +247,7 @@ end
table.fastcopy = fastcopy
table.copy = copy
--- rougly: copy-loop : unpack : sub == 0.9 : 0.4 : 0.45 (so in critical apps, use unpack)
+-- roughly: copy-loop : unpack : sub == 0.9 : 0.4 : 0.45 (so in critical apps, use unpack)
function table.sub(t,i,j)
return { unpack(t,i,j) }
@@ -222,7 +270,7 @@ function table.one_entry(t) -- obolete, use inline code instead
return n and not next(t,n)
end
---~ function table.starts_at(t) -- obsolete, not nice
+--~ function table.starts_at(t) -- obsolete, not nice anyway
--~ return ipairs(t,1)(t,0)
--~ end
@@ -859,3 +907,4 @@ function table.insert_after_value(t,value,extra)
end
insert(t,#t+1,extra)
end
+
diff --git a/tex/context/base/lang-sla.tex b/tex/context/base/lang-sla.tex
index dbed4e10a..2c645af5a 100644
--- a/tex/context/base/lang-sla.tex
+++ b/tex/context/base/lang-sla.tex
@@ -82,7 +82,7 @@
\installlanguage
[\s!cs]
- [\c!spacing=\v!packed,
+ [\c!spacing=\v!packed,
\c!leftsentence=\thickglue--\thickglue\penalty-20\relax, % hh, \relax added
\c!rightsentence=\thickglue--\thickglue\penalty-20\relax,
\c!leftsubsentence=~---~\penalty-20\relax,
@@ -193,19 +193,19 @@
\setupheadtext [\s!sl] [\v!content=Kazalo]
\setupheadtext [\s!pl] [\v!tables=Tabele]
-\setupheadtext [\s!cs] [\v!tables=Tabulek]
+\setupheadtext [\s!cs] [\v!tables=Tabulky]
\setupheadtext [\s!sk] [\v!tables=Tabuliek]
\setupheadtext [\s!hr] [\v!tables=Tablice]
\setupheadtext [\s!sl] [\v!tables=Tabele]
\setupheadtext [\s!pl] [\v!figures=Ilustracje]
-\setupheadtext [\s!cs] [\v!figures=Obr\aacute zk\uring]
+\setupheadtext [\s!cs] [\v!figures=Obr\aacute zky]
\setupheadtext [\s!sk] [\v!figures=Obr\aacute zkov]
\setupheadtext [\s!hr] [\v!figures=Slike]
\setupheadtext [\s!sl] [\v!figures=Slike]
\setupheadtext [\s!pl] [\v!graphics=Grafika]
-\setupheadtext [\s!cs] [\v!graphics=Graf]
+\setupheadtext [\s!cs] [\v!graphics=Grafy]
\setupheadtext [\s!sk] [\v!graphics=Graf]
\setupheadtext [\s!hr] [\v!graphics=Slike]
\setupheadtext [\s!sl] [\v!graphics=Slike]
@@ -241,7 +241,7 @@
\setupheadtext [\s!sl] [\v!units=Enote]
%setupheadtext [\s!pl] [pubs=?]
-%setupheadtext [\s!cs] [pubs=?]
+\setupheadtext [\s!cs] [pubs=Literatura]
%setupheadtext [\s!sk] [pubs=?]
%setupheadtext [\s!hr] [pubs=?]
\setupheadtext [\s!sl] [pubs=Literatura]
diff --git a/tex/context/base/lang-wrd.lua b/tex/context/base/lang-wrd.lua
index 1452d5279..095e44443 100644
--- a/tex/context/base/lang-wrd.lua
+++ b/tex/context/base/lang-wrd.lua
@@ -10,12 +10,26 @@ local utf = unicode.utf8
local lower, utfchar = string.lower, utf.char
local lpegmatch = lpeg.match
-languages.words = languages.words or {}
-languages.words.data = languages.words.data or {}
-languages.words.enables = false
-languages.words.threshold = 4
+languages.words = languages.words or { }
-languages.words.colors = {
+local words = languages.words
+
+words.data = words.data or { }
+words.enables = false
+words.threshold = 4
+
+local set_attribute = node.set_attribute
+local unset_attribute = node.unset_attribute
+local traverse_nodes = node.traverse
+local node_id = node.id
+local wordsdata = words.data
+local chardata = characters.data
+
+local glyph_node = node_id('glyph')
+local disc_node = node_id('disc')
+local kern_node = node_id('kern')
+
+words.colors = {
["known"] = "green",
["unknown"] = "red",
}
@@ -27,23 +41,30 @@ local rbrace = lpeg.P("}")
local disc = (lbrace * (1-rbrace)^0 * rbrace)^1 -- or just 3 times, time this
local word = lpeg.Cs((markup/"" + disc/"" + (1-spacing))^1)
-function languages.words.load(tag, filename)
- local filename = resolvers.find_file(filename,'other text file') or ""
- if filename ~= "" then
+local loaded = { } -- we share lists
+
+function words.load(tag,filename)
+ local fullname = resolvers.find_file(filename,'other text file') or ""
+ if fullname ~= "" then
statistics.starttiming(languages)
- local data = io.loaddata(filename) or ""
- local words = languages.words.data[tag] or {}
- parser = (spacing + word/function(s) words[s] = true end)^0
- lpegmatch(parser,data)
- languages.words.data[tag] = words
+ local list = loaded[fullname]
+ if not list then
+ list = wordsdata[tag] or { }
+ local parser = (spacing + word/function(s) list[s] = true end)^0
+ lpegmatch(parser,io.loaddata(fullname) or "")
+ loaded[fullname] = list
+ end
+ wordsdata[tag] = list
statistics.stoptiming(languages)
+ else
+ logs.report("languages","missing words file '%s'",filename)
end
end
-function languages.words.found(id, str)
- local tag = numbers[id]
+function words.found(id, str)
+ local tag = languages.numbers[id]
if tag then
- local data = languages.words.data[tag]
+ local data = wordsdata[tag]
return data and (data[str] or data[lower(str)])
else
return false
@@ -53,16 +74,11 @@ end
-- The following code is an adaption of experimental code for
-- hyphenating and spell checking.
-local glyph, disc, kern = node.id('glyph'), node.id('disc'), node.id('kern')
-
-local bynode = node.traverse
-local chardata = characters.data
-
-local function mark_words(head,found) -- can be optimized
+local function mark_words(head,whenfound) -- can be optimized
local current, start, str, language, n = head, nil, "", nil, 0
local function action()
if #str > 0 then
- local f = found(language,str)
+ local f = whenfound(language,str)
if f then
for i=1,n do
f(start)
@@ -74,7 +90,7 @@ local function mark_words(head,found) -- can be optimized
end
while current do
local id = current.id
- if id == glyph then
+ if id == glyph_node then
local a = current.lang
if a then
if a ~= language then
@@ -91,7 +107,7 @@ local function mark_words(head,found) -- can be optimized
if components then
start = start or current
n = n + 1
- for g in bynode(components) do
+ for g in traverse_nodes(components) do
str = str .. utfchar(g.char)
end
else
@@ -104,10 +120,11 @@ local function mark_words(head,found) -- can be optimized
action()
end
end
- elseif id == disc then
- if n > 0 then n = n + 1 end
- -- ok
- elseif id == kern and current.subtype == 0 and start then
+ elseif id == disc_node then
+ if n > 0 then
+ n = n + 1
+ end
+ elseif id == kern_node and current.subtype == 0 and start then
-- ok
elseif start then
action()
@@ -120,23 +137,21 @@ local function mark_words(head,found) -- can be optimized
return head
end
-languages.words.methods = { }
-languages.words.method = 1
+words.methods = { }
+words.method = 1
-local lw = languages.words
+local methods = words.methods
-languages.words.methods[1] = function(head, attribute, yes, nop)
- local set = node.set_attribute
- local unset = node.unset_attribute
+methods[1] = function(head, attribute, yes, nop)
local right, wrong = false, false
- if yes then right = function(n) set(n,attribute,yes) end end
- if nop then wrong = function(n) set(n,attribute,nop) end end
- for n in node.traverse(head) do
- unset(n,attribute) -- hm
+ if yes then right = function(n) set_attribute(n,attribute,yes) end end
+ if nop then wrong = function(n) set_attribute(n,attribute,nop) end end
+ for n in traverse_nodes(head) do
+ unset_attribute(n,attribute) -- hm, not that selective (reset color)
end
- local found, done = languages.words.found, false
+ local found, done = words.found, false
mark_words(head, function(language,str)
- if #str < lw.threshold then
+ if #str < words.threshold then
return false
elseif found(language,str) then
done = true
@@ -149,25 +164,50 @@ languages.words.methods[1] = function(head, attribute, yes, nop)
return head, done
end
+local list, dump = { }, false -- todo: per language
+
+local lower = characters.lower
+
+methods[2] = function(head, attribute)
+ dump = true
+ mark_words(head, function(language,str)
+ if #str >= words.threshold then
+ str = lower(str)
+ list[str] = (list[str] or 0) + 1
+ end
+ end)
+ return head, true
+end
+
+words.used = list
+
+function words.dump_used_words(name)
+ if dump then
+ logs.report("languages","saving list of used words in '%s'",name)
+ io.savedata(name,table.serialize(list))
+ end
+end
+
local color = attributes.private('color')
-function languages.words.check(head)
- if lw.enabled and head.next then
- local colors = lw.colors
+function words.check(head)
+ if words.enabled and head.next then
+ local colors = words.colors
local alc = attributes.list[color]
- return lw.methods[lw.method](head, color, alc[colors.known], alc[colors.unknown])
+ return methods[words.method](head, color, alc[colors.known], alc[colors.unknown])
else
return head, false
end
end
-function languages.words.enable()
+function words.enable(method)
tasks.enableaction("processors","languages.words.check")
- languages.words.enabled = true
+ words.method = method or words.method or 1
+ words.enabled = true
end
-function languages.words.disable()
- languages.words.enabled = false
+function words.disable()
+ words.enabled = false
end
-- for the moment we hook it into the attribute handler
diff --git a/tex/context/base/lang-wrd.mkiv b/tex/context/base/lang-wrd.mkiv
index e517ab5ae..774c2d335 100644
--- a/tex/context/base/lang-wrd.mkiv
+++ b/tex/context/base/lang-wrd.mkiv
@@ -19,12 +19,14 @@
\unprotect
-% mkiv only -- todo: internationalize command names
-
% \loadspellchecklist[en][words-en.txt]
% \loadspellchecklist[us][words-en.txt]
% \loadspellchecklist[nl][words-nl.txt]
-% \setupspellchecking[state=start]
+% \setupspellchecking[state=start,method=1]
+%
+% \setupspellchecking[state=start,method=2]
+% ...
+% \typefile{\jobname.words}
\def\loadspellchecklist
{\dodoubleempty\doloadspellchecklist}
@@ -38,10 +40,15 @@
\def\setupspellchecking[#1]% todo colors
{\getparameters[\??wl][#1]%
\doifelse\@@wlstate\v!start
- {\ctxlua{languages.words.enable()}}
+ {\ctxlua{languages.words.enable(\@@wlmethod)}}
{\ctxlua{languages.words.disable()}}}
\setupspellchecking
- [\c!state=\v!stop]
+ [\c!state=\v!stop,
+ \c!method=1]
+
+\appendtoks
+ \ctxlua{languages.words.dump_used_words("\jobname.words")}%
+\to \everybye
\protect \endinput
diff --git a/tex/context/base/lxml-sor.lua b/tex/context/base/lxml-sor.lua
index 7aebef79d..e220bfad6 100644
--- a/tex/context/base/lxml-sor.lua
+++ b/tex/context/base/lxml-sor.lua
@@ -91,9 +91,7 @@ function lxml.sorters.show(name)
end
end
-function lxml.sorters.compare(a,b)
- return sorters.comparers.basic(a.split,b.split)
-end
+lxml.sorters.compare = sorters.comparers.basic -- (a,b)
function lxml.sorters.sort(name)
local list = lists[name]
@@ -112,6 +110,7 @@ function lxml.sorters.sort(name)
-- preparation
local strip = sorters.strip
local splitter = sorters.splitters.utf
+ local firstofsplit = sorters.firstofsplit
for i=1, #results do
local r = results[i]
r.split = splitter(strip(r.key))
@@ -123,7 +122,7 @@ function lxml.sorters.sort(name)
local split = { }
for k=1,#results do -- rather generic so maybe we need a function
local v = results[k]
- local entry, tag = sorters.firstofsplit(v.split)
+ local entry, tag = firstofsplit(v)
local s = split[entry] -- keeps track of change
if not s then
s = { tag = tag, data = { } }
@@ -140,19 +139,19 @@ end
function lxml.sorters.flush(name,setup)
local list = lists[name]
local results = list and list.results
+ local xmlw = context.xmlw
if results and next(results) then
for key, result in next, results do
local tag, data = result.tag, result.data
for d=1,#data do
- local dr = data[d]
- texsprint(ctxcatcodes,"\\xmlw{",setup,"}{",dr.entry,"}")
+ xmlw(setup,data[d].entry)
end
end
else
local entries = list and list.entries
if entries then
for i=1,#entries do
- texsprint(ctxcatcodes,"\\xmlw{",setup,"}{",entries[i][1],"}")
+ xmlw(setup,entries[i][1])
end
end
end
diff --git a/tex/context/base/lxml-xml.lua b/tex/context/base/lxml-xml.lua
index bde11cd53..f791ec0f8 100644
--- a/tex/context/base/lxml-xml.lua
+++ b/tex/context/base/lxml-xml.lua
@@ -34,8 +34,10 @@ local function reverse(collected)
end
local function attribute(collected,name)
- local at = collected and collected[1].at
- return at and at[name]
+ if collected and #collected > 0 then
+ local at = collected[1].at
+ return at and at[name]
+ end
end
local function att(id,name)
diff --git a/tex/context/base/node-tsk.lua b/tex/context/base/node-tsk.lua
index 84001f5bc..206b4a266 100644
--- a/tex/context/base/node-tsk.lua
+++ b/tex/context/base/node-tsk.lua
@@ -241,6 +241,7 @@ function tasks.table(name) --maybe move this to task-deb.lua
end
end
end
+
tasks.new (
"processors",
{
diff --git a/tex/context/base/sort-ini.lua b/tex/context/base/sort-ini.lua
index 0aa997632..a2d65f28d 100644
--- a/tex/context/base/sort-ini.lua
+++ b/tex/context/base/sort-ini.lua
@@ -6,12 +6,10 @@ if not modules then modules = { } end modules ['sort-ini'] = {
license = "see context related readme files"
}
--- todo:
---
--- out of range
--- uppercase
--- texutil compatible
--- always expand to utf
+-- It took a while to get there, but with Fleetwood Mac's "Don't Stop"
+-- playing in the background we sort of got it done.
+
+-- todo: cleanup splits (in other modules)
local utf = unicode.utf8
local gsub, rep, sort, concat = string.gsub, string.rep, table.sort, table.concat
@@ -27,34 +25,38 @@ sorters.splitters = { }
sorters.entries = { }
sorters.mappings = { }
sorters.replacements = { }
-sorters.language = 'en'
local mappings = sorters.mappings
local entries = sorters.entries
local replacements = sorters.replacements
-function sorters.comparers.basic(sort_a,sort_b,map)
- -- sm assignment is slow, will become sorters.initialize
- local sm = map or mappings[sorters.language or sorters.defaultlanguage] or mappings.en
+local language, defaultlanguage, dummy = 'en', 'en', { }
+
+local currentreplacements, currentmappings, currententries
+
+function sorters.setlanguage(lang)
+ language = lang or language or defaultlanguage
+ currentreplacements = replacements[language] or replacements[defaultlanguage] or dummy
+ currentmappings = mappings [language] or mappings [defaultlanguage] or dummy
+ currententries = entries [language] or entries [defaultlanguage] or dummy
+ return currentreplacements, currentmappings, currententries
+end
+
+sorters.setlanguage()
+
+-- maybe inline code if it's too slow
+
+local function basicsort(sort_a,sort_b)
if #sort_a > #sort_b then
if #sort_b == 0 then
return 1
else
for i=1,#sort_b do
local ai, bi = sort_a[i], sort_b[i]
- local am, bm = sm[ai], sm[bi]
- if am and bm then
- if am > bm then
- return 1
- elseif am < bm then
- return -1
- end
- else
- if ai > bi then
- return 1
- elseif ai < bi then
- return -1
- end
+ if ai > bi then
+ return 1
+ elseif ai < bi then
+ return -1
end
end
return 1
@@ -65,19 +67,10 @@ function sorters.comparers.basic(sort_a,sort_b,map)
else
for i=1,#sort_a do
local ai, bi = sort_a[i], sort_b[i]
- local am, bm = sm[ai], sm[bi]
- if am and bm then
- if am > bm then
- return 1
- elseif am < bm then
- return -1
- end
- else
- if ai > bi then
- return 1
- elseif ai < bi then
- return -1
- end
+ if ai > bi then
+ return 1
+ elseif ai < bi then
+ return -1
end
end
return -1
@@ -87,25 +80,48 @@ function sorters.comparers.basic(sort_a,sort_b,map)
else
for i=1,#sort_a do
local ai, bi = sort_a[i], sort_b[i]
- local am, bm = sm[ai], sm[bi]
- if am and bm then
- if am > bm then
- return 1
- elseif am < bm then
- return -1
- end
- else
- if ai > bi then
- return 1
- elseif ai < bi then
- return -1
- end
+ if ai > bi then
+ return 1
+ elseif ai < bi then
+ return -1
end
end
return 0
end
end
+function sorters.comparers.basic(a,b)
+ local ea, eb = a.split, b.split
+ local na, nb = #ea, #eb
+ if na == 0 and nb == 0 then
+ -- simple variant (single word)
+ local result = basicsort(ea.e,eb.e)
+ return result == 0 and result or basicsort(ea.m,eb.m)
+ else
+ -- complex variant, used in register (multiple words)
+ local result = 0
+ for i=1,nb < na and nb or na do
+ local eai, ebi = ea[i], eb[i]
+ result = basicsort(eai.e,ebi.e)
+ if result == 0 then
+ result = basicsort(eai.m,ebi.m)
+ end
+ if result ~= 0 then
+ break
+ end
+ end
+ if result ~= 0 then
+ return result
+ elseif na > nb then
+ return 1
+ elseif nb > na then
+ return -1
+ else
+ return 0
+ end
+ end
+end
+
local function padd(s) return rep(" ",10-#s) .. s end -- or format with padd
function sorters.strip(str) -- todo: only letters and such utf.gsub("([^%w%d])","")
@@ -119,30 +135,38 @@ function sorters.strip(str) -- todo: only letters and such utf.gsub("([^%w%d])",
end
end
-function sorters.firstofsplit(split)
+local function firstofsplit(entry)
-- numbers are left padded by spaces
- local se = entries[sorters.language or sorters.defaultlanguage] or entries.en -- slow, will become sorters.initialize
- local vs = split[1]
- local entry = vs and vs[1] or ""
- return entry, (se and se[entry]) or "\000"
+ local split = entry.split
+ if #split > 0 then
+ split = split[1].s
+ else
+ split = split.s
+ end
+ local entry = split and split[1] or ""
+ return entry, currententries[entry] or "\000"
end
-sorters.defaultlanguage = 'en'
+sorters.firstofsplit = firstofsplit
-- beware, numbers get spaces in front
-function sorters.splitters.utf(str) -- brrr, todo: language
- local r = sorters.replacements[sorters.language] or sorters.replacements[sorters.defaultlanguage] or { }
- -- local m = mappings [sorters.language] or mappings [sorters.defaultlanguage] or { }
- local u = characters.uncompose
- local t = { }
- for _,v in next, r do
- str = gsub(str,v[1],v[2])
+function sorters.splitters.utf(str)
+ if #currentreplacements > 0 then
+ for k=1,#currentreplacements do
+ local v = currentreplacements[k]
+ str = gsub(str,v[1],v[2])
+ end
end
- for c in utfcharacters(str) do -- maybe an lpeg
- t[#t+1] = c
+ local s, m, e, n = { }, { }, { }, 0
+ for sc in utfcharacters(str) do -- maybe an lpeg
+ n = n + 1
+ local mc, ec = currentmappings[sc] or utfbyte(sc), currententries[sc]
+ s[n] = sc
+ m[n] = mc
+ e[n] = currentmappings[ec] or mc
end
- return t
+ return { s = s, m = m, e = e }
end
function table.remap(t)
@@ -153,49 +177,51 @@ function table.remap(t)
return tt
end
-function sorters.sort(entries,cmp)
- local language = sorters.language or sorters.defaultlanguage
- local map = mappings[language] or mappings.en
- if trace_tests then
- local function pack(l)
- local t = { }
- for i=1,#l do
- local tt, li = { }, l[i]
- for j=1,#li do
- local lij = li[j]
- if utfbyte(lij) > 0xFF00 then
- tt[j] = "[]"
- else
- tt[j] = li[j]
- end
- end
- t[i] = concat(tt)
+local function pack(entry)
+ local t = { }
+ local split = entry.split
+ if #split > 0 then
+ for i=1,#split do
+ local tt, li = { }, split[i].s
+ for j=1,#li do
+ local lij = li[j]
+ tt[j] = utfbyte(lij) > 0xFF00 and "[]" or lij
end
- return concat(t," + ")
+ t[i] = concat(tt)
end
- sort(entries, function(a,b)
- local r = cmp(a,b,map)
- local as, bs = a.split, b.split
- if as and bs then
- logs.report("sorter","%s %s %s",pack(as),(not r and "?") or (r<0 and "<") or (r>0 and ">") or "=",pack(bs))
- end
+ return concat(t," + ")
+ else
+ local t, li = { }, split.s
+ for j=1,#li do
+ local lij = li[j]
+ t[j] = utfbyte(lij) > 0xFF00 and "[]" or lij
+ end
+ return concat(t)
+ end
+end
+
+function sorters.sort(entries,cmp)
+ if trace_tests then
+ sort(entries,function(a,b)
+ local r = cmp(a,b)
+ logs.report("sorter","%s %s %s",pack(a),(not r and "?") or (r<0 and "<") or (r>0 and ">") or "=",pack(b))
return r == -1
end)
local s
for i=1,#entries do
- local split = entries[i].split
- local entry, first = sorters.firstofsplit(split)
+ local entry = entries[i]
+ local letter, first = firstofsplit(entry)
if first == s then
first = " "
else
s = first
- logs.report("sorter",">> %s 0x%05X (%s 0x%05X)",first,utfbyte(first),entry,utfbyte(entry))
+ logs.report("sorter",">> %s 0x%05X (%s 0x%05X)",first,utfbyte(first),letter,utfbyte(letter))
end
- logs.report("sorter"," %s",pack(split))
+ logs.report("sorter"," %s",pack(entry))
end
else
- sort(entries, function(a,b)
- return cmp(a,b,map) == -1
+ sort(entries,function(a,b)
+ return cmp(a,b) == -1
end)
end
end
diff --git a/tex/context/base/sort-lan.lua b/tex/context/base/sort-lan.lua
index e6466043a..56af2d16c 100644
--- a/tex/context/base/sort-lan.lua
+++ b/tex/context/base/sort-lan.lua
@@ -81,7 +81,7 @@ sorters.entries['cz'] = {
['c'] = "c", -- c
[uc(0x010D)] = uc(0x010D), -- ccaron
['d'] = "d", -- d
- [uc(0x010F)] = uc(0x010F), -- dcaron
+ [uc(0x010F)] = "d", -- dcaron
['e'] = "e", -- e
[uc(0x00E9)] = "e", -- eacute
[uc(0x011B)] = "e", -- ecaron
@@ -96,16 +96,16 @@ sorters.entries['cz'] = {
['l'] = "l", -- l
['m'] = "m", -- m
['n'] = "n", -- n
- [uc(0x0147)] = uc(0x0147), -- ncaron
+ ['ň'] = "n", -- ncaron
['o'] = "o", -- o
['p'] = "p", -- p
['q'] = "q", -- q
['r'] = "r", -- r
- [uc(0x0147)] = uc(0x0147), -- rcaron
+ ['ř'] = "ř", -- rcaron
['s'] = "s", -- s
[uc(0x0161)] = uc(0x0161), -- scaron
['t'] = "t", -- t
- [uc(0x0165)] = uc(0x0165), -- tcaron
+ [uc(0x0165)] = "t", -- tcaron
['u'] = "u", -- u
[uc(0x00FA)] = "u", -- uacute
[uc(0x016F)] = "u", -- uring
@@ -113,7 +113,7 @@ sorters.entries['cz'] = {
['w'] = "w", -- w
['x'] = "x", -- x
['y'] = "y", -- y
- [uc(0x00FD)] = uc(0x00FD), -- yacute
+ [uc(0x00FD)] = "y", -- yacute
['z'] = "z", -- z
[uc(0x017E)] = uc(0x017E), -- zcaron
}
@@ -140,12 +140,12 @@ sorters.mappings['cz'] = {
['l'] = 37, -- l
['m'] = 39, -- m
['n'] = 41, -- n
- [uc(0x0147)] = 43, -- ncaron
+ ['ň'] = 43, -- ncaron
['o'] = 45, -- o
['p'] = 47, -- p
['q'] = 49, -- q
['r'] = 51, -- r
- [uc(0x0147)] = 53, -- rcaron
+ ['ř'] = 53, -- rcaron
['s'] = 55, -- s
[uc(0x0161)] = 57, -- scaron
['t'] = 59, -- t
@@ -162,13 +162,13 @@ sorters.mappings['cz'] = {
[uc(0x017E)] = 81, -- zcaron
}
+sorters.add_uppercase_entries (sorters.entries.cz)
+sorters.add_uppercase_mappings(sorters.mappings.cz,0) -- 1 can be option (but then we need a runtime variant)
+
sorters.replacements['cs'] = sorters.replacements['cz']
sorters.entries ['cs'] = sorters.entries ['cz']
sorters.mappings ['cs'] = sorters.mappings ['cz']
-sorters.add_uppercase_entries (sorters.entries.cs)
-sorters.add_uppercase_mappings(sorters.mappings.cs,1)
-
--~ print(table.serialize(sorters.mappings.cs))
-- French
@@ -191,7 +191,7 @@ sorters.replacements['DIN 5007-2'] = {
{ "ü", 'ue' },
{ "Ä", 'Ae' },
{ "Ö", 'Oe' },
- { "Ü", 'Ue' }
+ { "Ü", 'Ue' },
}
sorters.entries ['DIN 5007-2'] = sorters.entries ['en']
@@ -287,6 +287,32 @@ sorters.entries['fi'] = {
["Z"] = "z", ["Å"] = "å", ["Ä"] = "ä", ["Ö"] = "ö",
}
+-- slovenian
+--
+-- MM: this will change since we need to add accented vowels
+
+sorters.entries['sl'] = {
+ ["a"] = "a", ["b"] = "b", ["c"] = "c", ["č"] = "č", ["ć"] = "ć", ["d"] = "d",
+ ["đ"] = "đ", ["e"] = "e", ["f"] = "f", ["g"] = "g", ["h"] = "h", ["i"] = "i",
+ ["j"] = "j", ["k"] = "k", ["l"] = "l", ["m"] = "m", ["n"] = "n", ["o"] = "o",
+ ["p"] = "p", ["q"] = "q", ["r"] = "r", ["s"] = "s", ["š"] = "š", ["t"] = "t",
+ ["u"] = "u", ["v"] = "v", ["w"] = "w", ["x"] = "x", ["y"] = "y", ["z"] = "z",
+ ["ž"] = "ž",
+}
+
+
+sorters.mappings['sl'] = {
+ ["a"] = 1, ["b"] = 3, ["c"] = 5, ["č"] = 7, ["ć"] = 9, ["d"] = 11,
+ ["đ"] = 13, ["e"] = 15, ["f"] = 17, ["g"] = 19, ["h"] = 21, ["i"] = 23,
+ ["j"] = 25, ["k"] = 27, ["l"] = 29, ["m"] = 31, ["n"] = 33, ["o"] = 35,
+ ["p"] = 37, ["q"] = 39, ["r"] = 41, ["s"] = 43, ["š"] = 45, ["t"] = 47,
+ ["u"] = 49, ["v"] = 51, ["w"] = 53, ["x"] = 55, ["y"] = 57, ["z"] = 59,
+ ["ž"] = 61,
+}
+
+sorters.add_uppercase_entries (sorters.entries.sl)
+sorters.add_uppercase_mappings(sorters.mappings.sl,0) -- cf. MM
+
--~ sorters.test = ''
--~ sorters.test = 'nl'
--~ sorters.test = 'cz'
diff --git a/tex/context/base/sort-lan.mkii b/tex/context/base/sort-lan.mkii
index 97df559bf..db52c63fb 100644
--- a/tex/context/base/sort-lan.mkii
+++ b/tex/context/base/sort-lan.mkii
@@ -156,45 +156,45 @@
\gdef\czsortdivisionCh{Ch}
\startmode[sortorder-cz]
- \exportsortexpansion {aacute} {a+1}
- \exportsortexpansion {Aacute} {A+1}
+ \exportsortexpansion {aacute} {a}
+ \exportsortexpansion {Aacute} {A}
\exportsortexpansion {ccaron} {c+1}
\exportsortexpansion {Ccaron} {C+1}
\exportsortdivision {c+1} {ccaron}
- \exportsortexpansion {dcaron} {d+1}
- \exportsortexpansion {Dcaron} {D+1}
- \exportsortdivision {d+1} {dcaron}
- \exportsortexpansion {eacute} {e+1}
- \exportsortexpansion {Eacute} {E+1}
- \exportsortexpansion {ecaron} {e+2}
- \exportsortexpansion {Ecaron} {E+2}
+ \exportsortexpansion {dcaron} {d}
+ \exportsortexpansion {Dcaron} {D}
+ %\exportsortdivision {d+1} {dcaron}
+ \exportsortexpansion {eacute} {e}
+ \exportsortexpansion {Eacute} {E}
+ \exportsortexpansion {ecaron} {e}
+ \exportsortexpansion {Ecaron} {E}
\exportsortreduction {ch} {h+1}
\exportsortexpansion {ch} {h+1}
\exportsortreduction {Ch} {H+1}
\exportsortexpansion {Ch} {H+1}
\exportsortdivision {h+1} {czsortdivisionch}
- \exportsortexpansion {iacute} {i+1}
- \exportsortexpansion {Iacute} {I+1}
- \exportsortexpansion {ncaron} {n+1}
- \exportsortexpansion {Ncaron} {N+1}
- \exportsortdivision {n+1} {ncaron}
- \exportsortexpansion {oacute} {o+1}
- \exportsortexpansion {Oacute} {O+1}
+ \exportsortexpansion {iacute} {i}
+ \exportsortexpansion {Iacute} {I}
+ \exportsortexpansion {ncaron} {n}
+ \exportsortexpansion {Ncaron} {N}
+ %\exportsortdivision {n+1} {ncaron}
+ \exportsortexpansion {oacute} {o}
+ \exportsortexpansion {Oacute} {O}
\exportsortexpansion {rcaron} {r+1}
\exportsortexpansion {Rcaron} {R+1}
\exportsortdivision {r+1} {rcaron}
\exportsortexpansion {scaron} {s+1}
\exportsortexpansion {Scaron} {S+1}
\exportsortdivision {s+1} {scaron}
- \exportsortexpansion {tcaron} {t+1}
- \exportsortexpansion {Tcaron} {T+1}
- \exportsortdivision {t+1} {tcaron}
- \exportsortexpansion {uacute} {u+1}
- \exportsortexpansion {Uacute} {U+1}
- \exportsortexpansion {uring} {u+2}
- \exportsortexpansion {Uring} {U+2}
- \exportsortexpansion {yacute} {y+1}
- \exportsortexpansion {Yacute} {Y+1}
+ \exportsortexpansion {tcaron} {t}
+ \exportsortexpansion {Tcaron} {T}
+ %\exportsortdivision {t+1} {tcaron}
+ \exportsortexpansion {uacute} {u}
+ \exportsortexpansion {Uacute} {U}
+ \exportsortexpansion {uring} {u}
+ \exportsortexpansion {Uring} {U}
+ \exportsortexpansion {yacute} {y}
+ \exportsortexpansion {Yacute} {Y}
\exportsortexpansion {zcaron} {z+1}
\exportsortexpansion {Zcaron} {Z+1}
\exportsortdivision {z+1} {zcaron}
diff --git a/tex/context/base/strc-reg.lua b/tex/context/base/strc-reg.lua
index 0bdbcf2a8..519396276 100644
--- a/tex/context/base/strc-reg.lua
+++ b/tex/context/base/strc-reg.lua
@@ -24,6 +24,10 @@ local documents = structure.documents
local pages = structure.pages
local processors = structure.processors
+local mappings = sorters.mappings
+local entries = sorters.entries
+local replacements = sorters.replacements
+
local processor_split = processors.split
local matching_till_depth, number_at_depth = sections.matching_till_depth, sections.number_at_depth
@@ -302,26 +306,12 @@ end
-- sorting and rendering
+local compare = sorters.comparers.basic
+
function jobregisters.compare(a,b)
- local result = 0
- local compare = sorters.comparers.basic
- local ea, eb = a.split, b.split
- local na, nb = #ea, #eb
- local max = na
- if nb < max then max = nb end
- for i=1,max do
- if result == 0 then
- result = compare(ea[i],eb[i])
- else
- break
- end
- end
+ local result = compare(a,b)
if result ~= 0 then
return result
- elseif na > nb then
- return 1
- elseif nb > na then
- return -1
elseif a.metadata.kind == 'entry' then -- e/f/t
local page_a, page_b = a.references.realpage, b.references.realpage
if not page_a or not page_b then
@@ -331,9 +321,8 @@ function jobregisters.compare(a,b)
elseif page_a > page_b then
return 1
end
- else
- return 0
end
+ return 0
end
function jobregisters.filter(data,options)
@@ -405,7 +394,7 @@ function jobregisters.finalize(data,options)
-- maps character to index (order)
for k=1,#result do
local v = result[k]
- local entry, tag = sorters.firstofsplit(v.split)
+ local entry, tag = sorters.firstofsplit(v)
if tag ~= lasttag then
if trace_registers then
logs.report("registers","splitting at %s",tag)
@@ -424,7 +413,7 @@ function jobregisters.analysed(class,options)
local data = collected[class]
if data and data.entries then
options = options or { }
- sorters.language = options.language or sorters.defaultlanguage
+ sorters.setlanguage(options.language)
jobregisters.filter(data,options) -- filter entries into results (criteria)
jobregisters.prepare(data,options) -- adds split table parallel to list table
jobregisters.sort(data,options) -- sorts results
diff --git a/tex/context/base/strc-reg.mkiv b/tex/context/base/strc-reg.mkiv
index 09c65b64b..0e690edcc 100644
--- a/tex/context/base/strc-reg.mkiv
+++ b/tex/context/base/strc-reg.mkiv
@@ -658,8 +658,7 @@
\def\withregisterpagecommand#1#2#3%
{\def\currentregisterpageindex{#1}%
\iflocation
- % \goto{\registerparameter\c!pagecommand{#3}}[internal(#1)]%
- \goto{\registerparameter\c!pagecommand{#3}}[page(#3)]%
+ \goto{\registerparameter\c!pagecommand{#3}}[internal(#1)]%
\else
\registerparameter\c!pagecommand{#3}%
\fi}
diff --git a/tex/context/base/strc-syn.lua b/tex/context/base/strc-syn.lua
index 9c5a9392c..d6f38c2c7 100644
--- a/tex/context/base/strc-syn.lua
+++ b/tex/context/base/strc-syn.lua
@@ -92,9 +92,7 @@ function joblists.meaning(class,tag)
end
end
-function joblists.compare(a,b)
- return sorters.comparers.basic(a.split,b.split)
-end
+joblists.compare = sorters.comparers.basic -- (a,b)
function joblists.filter(data,options)
local result = { }
@@ -136,7 +134,7 @@ function joblists.finalize(data,options)
local split = { }
for k=1,#result do
local v = result[k]
- local entry, tag = sorters.firstofsplit(v.split)
+ local entry, tag = sorters.firstofsplit(v)
local s = split[entry] -- keeps track of change
if not s then
s = { tag = tag, data = { } }
@@ -172,6 +170,8 @@ end
function joblists.analysed(class,options)
local data = joblists.collected[class]
if data and data.entries then
+ options = options or { }
+ sorters.setlanguage(options.language)
joblists.filter(data,options) -- filters entries to result
joblists.prepare(data,options) -- adds split table parallel to list table
joblists.sort(data,options) -- sorts entries in result
diff --git a/tex/generic/context/luatex-fonts-merged.lua b/tex/generic/context/luatex-fonts-merged.lua
index 655f83fe8..8891356ed 100644
--- a/tex/generic/context/luatex-fonts-merged.lua
+++ b/tex/generic/context/luatex-fonts-merged.lua
@@ -1,6 +1,6 @@
-- merged file : luatex-fonts-merged.lua
-- parent file : luatex-fonts.lua
--- merge date : 05/19/10 16:24:38
+-- merge date : 05/20/10 20:00:41
do -- begin closure to overcome local limits and interference
@@ -587,7 +587,55 @@ local concat, sort, insert, remove = table.concat, table.sort, table.insert, tab
local format, find, gsub, lower, dump, match = string.format, string.find, string.gsub, string.lower, string.dump, string.match
local getmetatable, setmetatable = getmetatable, setmetatable
local type, next, tostring, tonumber, ipairs = type, next, tostring, tonumber, ipairs
-local unpack = unpack or table.unpack
+
+-- Starting with version 5.2 Lua no longer provide ipairs, which makes
+-- sense. As we already used the for loop and # in most places the
+-- impact on ConTeXt was not that large; the remaining ipairs already
+-- have been replaced. In a similar fashio we also hardly used pairs.
+--
+-- Just in case, we provide the fallbacks as discussed in Programming
+-- in Lua (http://www.lua.org/pil/7.3.html):
+
+if not ipairs then
+
+ -- for k, v in ipairs(t) do ... end
+ -- for k=1,#t do local v = t[k] ... end
+
+ local function iterate(a,i)
+ i = i + 1
+ local v = a[i]
+ if v ~= nil then
+ return i, v --, nil
+ end
+ end
+
+ function ipairs(a)
+ return iterate, a, 0
+ end
+
+end
+
+if not pairs then
+
+ -- for k, v in pairs(t) do ... end
+ -- for k, v in next, t do ... end
+
+ function pairs(t)
+ return next, t -- , nil
+ end
+
+end
+
+-- Also, unpack has been moved to the table table, and for compatiility
+-- reasons we provide both now.
+
+if not table.unpack then
+ table.unpack = _G.unpack
+elseif not unpack then
+ _G.unpack = table.unpack
+end
+
+-- extra functions, some might go (when not used)
function table.strip(tab)
local lst = { }
@@ -774,7 +822,7 @@ end
table.fastcopy = fastcopy
table.copy = copy
--- rougly: copy-loop : unpack : sub == 0.9 : 0.4 : 0.45 (so in critical apps, use unpack)
+-- roughly: copy-loop : unpack : sub == 0.9 : 0.4 : 0.45 (so in critical apps, use unpack)
function table.sub(t,i,j)
return { unpack(t,i,j) }
@@ -797,7 +845,7 @@ function table.one_entry(t) -- obolete, use inline code instead
return n and not next(t,n)
end
---~ function table.starts_at(t) -- obsolete, not nice
+--~ function table.starts_at(t) -- obsolete, not nice anyway
--~ return ipairs(t,1)(t,0)
--~ end
@@ -1435,6 +1483,7 @@ function table.insert_after_value(t,value,extra)
insert(t,#t+1,extra)
end
+
end -- closure
do -- begin closure to overcome local limits and interference