diff options
Diffstat (limited to 'tex/context/base/mkiv/symb-emj.lua')
-rw-r--r-- | tex/context/base/mkiv/symb-emj.lua | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/tex/context/base/mkiv/symb-emj.lua b/tex/context/base/mkiv/symb-emj.lua new file mode 100644 index 000000000..3075e0985 --- /dev/null +++ b/tex/context/base/mkiv/symb-emj.lua @@ -0,0 +1,82 @@ +if not modules then modules = { } end modules ['symb-emj'] = { + version = 1.001, + comment = "companion to symb-emj.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +local symbols = fonts.symbols + +-- emoji + +-- processors.hpack_filter does it all + +local resolvedemoji = characters.emoji.resolve +local processfeatures = fonts.handlers.otf.featuresprocessor +local injectspacing = nodes.injections.handler +local protectglyphs = nodes.handlers.protectglyphs +local tonodes = nodes.tonodes +local currentfont = font.current + +-- fast enough, no need to memoize + +local glyph_code = nodes.nodecodes.glyph +local remove_node = nodes.remove +local getid = nodes.getid +local getnext = nodes.getnext +local getchar = nodes.getchar + +local function removemodifiers(head) + local current = head + while current do + if getid(current) == glyph_code then + local char = getchar(current) -- using categories is too much + if char == 0x200D or (char >= 0x1F3FB and char <= 0x1F3FF) then + head, current = remove_node(head,current,true) + else + current = getnext(current) + end + else + current = getnext(current) + end + end + return head +end + +-- attributes + +local function checkedemoji(name,id) + local str = resolvedemoji(name) + if str then + if not id then + id = currentfont() + end + local head = tonodes(str,id,nil,nil,true) -- use current attributes + head = processfeatures(head,id,false) + if head then + head = injectspacing(head) + protectglyphs(head) + return removemodifiers(head) + end + end +end + +symbols.emoji = { + resolved = resolvedemoji, + checked = checkedemoji, +} + +interfaces.implement { + name = "resolvedemoji", + actions = { resolvedemoji, context.escaped }, + arguments = "string", +} + +interfaces.implement { + name = "checkedemoji", + actions = { checkedemoji, context }, + arguments = "string", +} + + |