summaryrefslogtreecommitdiff
path: root/tex/context/base/font-chk.lua
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/font-chk.lua')
-rw-r--r--tex/context/base/font-chk.lua90
1 files changed, 90 insertions, 0 deletions
diff --git a/tex/context/base/font-chk.lua b/tex/context/base/font-chk.lua
new file mode 100644
index 000000000..32fdf8894
--- /dev/null
+++ b/tex/context/base/font-chk.lua
@@ -0,0 +1,90 @@
+if not modules then modules = { } end modules ['font-chk'] = {
+ version = 1.001,
+ comment = "companion to font-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- possible optimization: delayed initialization of vectors
+
+fonts = fonts or { }
+fonts.checkers = fonts.checkers or { }
+
+local checkers = fonts.checkers
+local fontdata = fonts.ids
+local is_character = characters.is_character
+local chardata = characters.data
+
+local glyph = node.id('glyph')
+local traverse_id = node.traverse_id
+local remove_node = nodes.remove
+
+-- maybe in fonts namespace
+-- deletion can be option
+
+checkers.enabled = false
+checkers.delete = false
+
+function fonts.register_message(font,char,message)
+ local tfmdata = fontdata[font]
+ local shared = tfmdata.shared
+ local messages = shared.messages
+ if not messages then
+ messages = { }
+ shared.messages = messages
+ end
+ local category = messages[message]
+ if not category then
+ category = { }
+ messages[message] = category
+ end
+ if not category[char] then
+ logs.report("fonts","char U+%04X in font '%s' with id %s: %s",char,tfmdata.fullname,font,message)
+ category[char] = true
+ end
+end
+
+function checkers.missing(head)
+ if checkers.enabled then
+ local lastfont, characters, found = nil, nil, nil
+ for n in traverse_id(glyph,head) do
+ local font, char = n.font, n.char
+ if font ~= lastfont then
+ characters = fontdata[font].characters
+ end
+ if not characters[char] and is_character[chardata[char].category] then
+ if checkers.delete then
+ fonts.register_message(font,char,"missing (will be deleted)")
+ else
+ fonts.register_message(font,char,"missing")
+ end
+ if not found then
+ found = { n }
+ else
+ found[#found+1] = n
+ end
+ end
+ end
+ if found and checkers.delete then
+ for i=1,#found do
+ head = remove_node(head,found[i],true)
+ end
+ end
+ end
+ return head, false
+end
+
+trackers.register("fonts.missing", function(v)
+ tasks.enableaction("processors", "fonts.checkers.missing") -- always on then
+ checkers.enabled = v
+end)
+
+function checkers.enable(delete)
+ tasks.enableaction("processors", "fonts.checkers.missing") -- always on then
+ if delete ~= nil then
+ checkers.delete = delete
+ end
+ checkers.enabled = true
+end
+