From f41c65c404b9bc45ca6398febf461f1c4883240a Mon Sep 17 00:00:00 2001 From: Philipp Gesang Date: Wed, 6 Jun 2012 18:21:11 +0200 Subject: moved space node generation into callback --- .../third/enigma/examples/enigma-example-latex.tex | 2 - tex/context/third/enigma/enigma.lua | 54 ++++++++++++++++------ tex/plain/enigma/enigma.tex | 4 +- 3 files changed, 41 insertions(+), 19 deletions(-) diff --git a/doc/context/third/enigma/examples/enigma-example-latex.tex b/doc/context/third/enigma/examples/enigma-example-latex.tex index e3e86f7..d04dbad 100644 --- a/doc/context/third/enigma/examples/enigma-example-latex.tex +++ b/doc/context/third/enigma/examples/enigma-example-latex.tex @@ -1,7 +1,5 @@ \documentclass[a5paper]{scrartcl} \parindent0pt -% \usepackage{fontspec} -% \defaultfontfeatures{Ligatures={NoRequired, NoCommon, NoContextual}} %······································································% \usepackage {enigma} %%·····································································% diff --git a/tex/context/third/enigma/enigma.lua b/tex/context/third/enigma/enigma.lua index b283085..3ccf593 100644 --- a/tex/context/third/enigma/enigma.lua +++ b/tex/context/third/enigma/enigma.lua @@ -124,7 +124,7 @@ local KERN_NODE = node and nodeid"kern" local DISC_NODE = node and nodeid"disc" local IGNORE_NODES = { - [GLUE_NODE] = true, +--[GLUE_NODE] = true, [KERN_NODE] = true, --[DISC_NODE] = true, } @@ -1322,6 +1322,28 @@ argument of a callback only (...‽), so we’ll have to do some variable shuffling on the function side. \stopparagraph +\startparagraph +When grouping output into the traditional blocks of five letters we +insert space nodes. As their properties depend on the font we need to +recreate the space item for every paragraph. Also, as \CONTEXT\ does not +preload a font we lack access to font metrics before \type{\starttext}. +Thus creating the space earlier will result in an error. +The function \luafunction{generate_space} will be called inside the +callback in order to get an appropriate space glue. +\stopparagraph +--ichd]]-- + +local generate_space = function () + local current_fontparms = font.getfont(font.current()).parameters + local space_node = nodenew(GLUE_NODE) + space_node.spec = nodenew(GLUE_SPEC_NODE) + space_node.spec.width = current_fontparms.space + space_node.spec.shrink = current_fontparms.space_shrink + space_node.spec.stretch = current_fontparms.space_stretch + return space_node +end + +--[[ichd-- \startparagraph \useURL[khaled_hosny_texsx] [http://tex.stackexchange.com/a/11970] [] [tex.sx] @@ -1335,17 +1357,14 @@ on \dots\ many thanks to Khaled Hosny, who posted an answer to local new_callback = function (machine, name) enigma.machines [name] = machine + local space_node local mod_5 = 0 - local current_fontparms = font.getfont(font.current()).parameters - local space_node = nodenew(GLUE_NODE) - space_node.spec = nodenew(GLUE_SPEC_NODE) - space_node.spec.width = current_fontparms.space - space_node.spec.shrink = current_fontparms.space_shrink - space_node.spec.stretch = current_fontparms.space_stretch local insert_with_spacing = function (head, n, replacement) local insertion = nodecopy(n) - insertion.char = utf8byte(replacement) - --print(utf8char(n.char), "=>", utf8char(insertion.char)) + if replacement then -- inefficient but bulletproof + insertion.char = utf8byte(replacement) + --print(utf8char(n.char), "=>", utf8char(insertion.char)) + end nodeinsert_before(head, n, insertion) mod_5 = mod_5 + 1 if mod_5 >= 5 then @@ -1353,10 +1372,10 @@ local new_callback = function (machine, name) nodeinsert_after(head, insertion, nodecopy(space_node)) end noderemove(head, n) - return head end local format_is_context_p = format_is_context_p local cbk = function (a, _, c) + space_node = generate_space () local head = format_is_context_p and c or a mod_5 = 0 for n in nodetraverse(head) do @@ -1364,18 +1383,24 @@ local new_callback = function (machine, name) if nid == GLYPH_NODE then local chr = utf8char(n.char) --print(chr, n) - local replacement = machine:encode(chr) + local replacement = machine:encode(chr) + local treplacement = replacement and type(replacement) --if replacement == false then if not replacement then - if not machine.other_chars then + if machine.other_chars then + insert_with_spacing(head, n, nil) + else noderemove(head, n) end - elseif type(replacement) == "string" then + elseif treplacement == "string" then insert_with_spacing(head, n, replacement) - elseif type(replacement) == "table" then + elseif treplacement == "table" then for i=1, #replacement do insert_with_spacing(head, n, replacement) end + end + elseif nid == GLUE_NODE then + if n.subtype ~= 15 then -- keeping the parfillskip is convenient noderemove(head, n) end elseif IGNORE_NODES[nid] then @@ -1392,6 +1417,7 @@ local new_callback = function (machine, name) end noderemove(head, n) --else + -- TODO other node types -- print(n) end end diff --git a/tex/plain/enigma/enigma.tex b/tex/plain/enigma/enigma.tex index 41d6b2d..0cd0e61 100644 --- a/tex/plain/enigma/enigma.tex +++ b/tex/plain/enigma/enigma.tex @@ -1,6 +1,5 @@ -\expandafter\let\expandafter\x\csname ver@enigma.sty\endcsname \newif\ifenigmaisrunningplain -\ifx\x\relax +\ifcsname ver@enigma.sty\endcsname\else \enigmaisrunningplaintrue \input{luatexbase.sty} \catcode`\@=11 @@ -13,7 +12,6 @@ \def\luastringsep{===} % this permits \typefile{self} otherwise nested b/e sep problems \edef\!!bs{[\luastringsep[} \edef\!!es{]\luastringsep]} - %D \startdocsection[title=Prerequisites] %D \startparagraph %D Package loading and the namespacing issue are commented on in -- cgit v1.2.3