diff options
Diffstat (limited to 'tex/context/base/typo-drp.lua')
-rw-r--r-- | tex/context/base/typo-drp.lua | 475 |
1 files changed, 0 insertions, 475 deletions
diff --git a/tex/context/base/typo-drp.lua b/tex/context/base/typo-drp.lua deleted file mode 100644 index 4bbf0b8e9..000000000 --- a/tex/context/base/typo-drp.lua +++ /dev/null @@ -1,475 +0,0 @@ -if not modules then modules = { } end modules ['typo-drp'] = { - version = 1.001, - comment = "companion to typo-drp.mkiv", - author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", - copyright = "PRAGMA ADE / ConTeXt Development Team", - license = "see context related readme files" -} - --- This ons is sensitive for order (e.g. when combined with first line --- processing. - -local tonumber, type, next = tonumber, type, next -local ceil = math.ceil -local settings_to_hash = utilities.parsers.settings_to_hash - -local trace_initials = false trackers.register("typesetters.initials", function(v) trace_initials = v end) -local report_initials = logs.reporter("nodes","initials") - -local initials = typesetters.paragraphs or { } -typesetters.initials = initials or { } - -local nodes = nodes -local tasks = nodes.tasks - -local nuts = nodes.nuts -local tonut = nuts.tonut -local tonode = nuts.tonode - -local getnext = nuts.getnext -local getprev = nuts.getprev -local getchar = nuts.getchar -local getid = nuts.getid -local getsubtype = nuts.getsubtype -local getfield = nuts.getfield -local setfield = nuts.setfield -local getattr = nuts.getattr -local setattr = nuts.setattr - -local hpack_nodes = nuts.hpack - -local nodecodes = nodes.nodecodes -local whatsitcodes = nodes.whatsitcodes - -local nodepool = nuts.pool -local new_kern = nodepool.kern - -local insert_before = nuts.insert_before -local insert_after = nuts.insert_after -local remove_node = nuts.remove -local traverse_id = nuts.traverse_id -local traverse = nuts.traverse -local free_node = nuts.free - -local variables = interfaces.variables -local v_default = variables.default -local v_margin = variables.margin -local v_auto = variables.auto -local v_first = variables.first -local v_last = variables.last - -local texget = tex.get -local texsetattribute = tex.setattribute -local unsetvalue = attributes.unsetvalue - -local glyph_code = nodecodes.glyph -local hlist_code = nodecodes.hlist -local glue_code = nodecodes.glue -local kern_code = nodecodes.kern -local whatsit_code = nodecodes.whatsit -local localpar_code = whatsitcodes.localpar - -local actions = { } -initials.actions = actions - -local a_initial = attributes.private("initial") -local a_color = attributes.private('color') -local a_transparency = attributes.private('transparency') -local a_colorspace = attributes.private('colormodel') - -local category = characters.category - -local settings = nil - -function initials.set(specification) - settings = specification or { } - settings.enabled = true - tasks.enableaction("processors","typesetters.initials.handler") - if trace_initials then - report_initials("enabling initials") - end - texsetattribute(a_initial,1) -end - -interfaces.implement { - name = "setinitial", - actions = initials.set, - arguments = { - { - { "location" }, - { "enabled", "boolean" }, - { "method" }, - { "distance" ,"dimen" }, - { "hoffset" ,"dimen" }, - { "voffset" ,"dimen" }, - { "font", "integer" }, - { "dynamic", "integer" }, - { "ca", "integer" }, - { "ma", "integer" }, - { "ta", "integer" }, - { "n", "integer" }, - { "m", "integer" }, - } - } -} - --- dropped caps experiment (will be done properly when luatex --- stores the state in the local par node) .. btw, search still --- works with dropped caps, as does an export - --- we need a 'par' attribute and in fact for dropped caps we don't need --- need an attribute ... dropit will become s state counter (or end up --- in the localpar user data - --- for the moment, each paragraph gets a number as id (attribute) ..problem --- with nesting .. or anyhow, needed for tagging anyway - --- todo: prevent linebreak .. but normally a initial ends up at the top of --- a page so this has a low priority - --- actions[v_default] = function(head,setting) --- local done = false --- if getid(head) == whatsit_code and getsubtype(head) == localpar_code then --- -- begin of par --- local first = getnext(head) --- -- parbox .. needs to be set at 0 --- if first and getid(first) == hlist_code then --- first = getnext(first) --- end --- -- we need to skip over kerns and glues (signals) --- while first and getid(first) ~= glyph_code do --- first = getnext(first) --- end --- if first and getid(first) == glyph_code then --- local char = getchar(first) --- local prev = getprev(first) --- local next = getnext(first) --- -- if getid(prev) == hlist_code then --- -- -- set the width to 0 --- -- end --- if next and getid(next) == kern_code then --- setfield(next,"kern",0) --- end --- if setting.font then --- setfield(first,"font",setting.font) --- end --- if setting.dynamic > 0 then --- setattr(first,0,setting.dynamic) --- end --- -- can be a helper --- local ma = setting.ma or 0 --- local ca = setting.ca --- local ta = setting.ta --- if ca and ca > 0 then --- setattr(first,a_colorspace,ma == 0 and 1 or ma) --- setattr(first,a_color,ca) --- end --- if ta and ta > 0 then --- setattr(first,a_transparency,ta) --- end --- -- --- local width = getfield(first,"width") --- local height = getfield(first,"height") --- local depth = getfield(first,"depth") --- local distance = setting.distance or 0 --- local voffset = setting.voffset or 0 --- local hoffset = setting.hoffset or 0 --- local parindent = tex.parindent --- local baseline = texget("baselineskip").width --- local lines = tonumber(setting.n) or 0 --- -- --- setfield(first,"xoffset",- width - hoffset - distance - parindent) --- setfield(first,"yoffset",- voffset) -- no longer - height here --- -- We pack so that successive handling cannot touch the dropped cap. Packaging --- -- in a hlist is also needed because we cannot locally adapt e.g. parindent (not --- -- yet stored in with localpar). --- setfield(first,"prev",nil) --- setfield(first,"next",nil) --- local h = hpack_nodes(first) --- setfield(h,"width",0) --- setfield(h,"height",0) --- setfield(h,"depth",0) --- setfield(prev,"next",h) --- setfield(next,"prev",h) --- setfield(h,"next",next) --- setfield(h,"prev",prev) --- first = h --- -- end of packaging --- if setting.location == v_margin then --- -- okay --- else --- if lines == 0 then -- safeguard, not too precise --- lines = ceil((height+voffset) / baseline) --- end --- -- We cannot set parshape yet ... when we can I'll add a slope --- -- option (positive and negative, in emwidth). --- local hangafter = - lines --- local hangindent = width + distance + parindent --- if trace_initials then --- report_initials("setting hangafter to %i and hangindent to %p",hangafter,hangindent) --- end --- tex.hangafter = hangafter --- tex.hangindent = hangindent --- if parindent ~= 0 then --- insert_after(first,first,new_kern(-parindent)) --- end --- end --- done = true --- end --- end --- return head, done --- end - -actions[v_default] = function(head,setting) - local done = false - if getid(head) == whatsit_code and getsubtype(head) == localpar_code then - -- begin of par - local first = getnext(head) - local indent = false - -- parbox .. needs to be set at 0 - if first and getid(first) == hlist_code then - first = getnext(first) - indent = true - end - -- we need to skip over kerns and glues (signals) - while first and getid(first) ~= glyph_code do - first = getnext(first) - end - if first and getid(first) == glyph_code then - local ma = setting.ma or 0 - local ca = setting.ca - local ta = setting.ta - local last = first - local distance = setting.distance or 0 - local voffset = setting.voffset or 0 - local hoffset = setting.hoffset or 0 - local parindent = tex.parindent - local baseline = texget("baselineskip").width - local lines = tonumber(setting.n) or 0 - local dynamic = setting.dynamic - local font = setting.font - local method = settings_to_hash(setting.method) - local length = tonumber(setting.m) or 1 - -- - -- 1 char | n chars | skip first quote | ignore punct | keep punct - -- - if getattr(first,a_initial) then - for current in traverse(getnext(first)) do - if getattr(current,a_initial) then - last = current - else - break - end - end - elseif method[v_auto] then - local char = getchar(first) - local kind = category(char) - if kind == "po" or kind == "pi" then - if method[v_first] then - -- remove quote etc before initial - local next = getnext(first) - if not next then - -- don't start with a quote or so - return head, false - end - last = nil - for current in traverse_id(glyph_code,next) do - head, first = remove_node(head,first,true) - first = current - last = first - break - end - if not last then - -- no following glyph or so - return head, false - end - else - -- keep quote etc with initial - local next = getnext(first) - if not next then - -- don't start with a quote or so - return head, false - end - for current in traverse_id(glyph_code,next) do - last = current - break - end - if last == first then - return head, false - end - end - elseif kind == "pf" then - -- error: final quote - else - -- okay - end - -- maybe also: get all A. B. etc - local next = getnext(first) - if next then - for current in traverse_id(glyph_code,next) do - local char = getchar(current) - local kind = category(char) - if kind == "po" then - if method[v_last] then - -- remove period etc after initial - remove_node(head,current,true) - else - -- keep period etc with initial - last = current - end - end - break - end - end - else - for current in traverse_id(glyph_code,first) do - last = current - if length <= 1 then - break - else - length = length - 1 - end - end - end - local current = first - while true do - local id = getid(current) - if id == kern_code then - setfield(current,"kern",0) - elseif id == glyph_code then - local next = getnext(current) - if font then - setfield(current,"font",font) - end - if dynamic > 0 then - setattr(current,0,dynamic) - end --- apply font - --- local g = nodes.copy(tonode(current)) --- g.subtype = 0 --- nodes.handlers.characters(g) --- nodes.handlers.protectglyphs(g) --- setfield(current,"char",g.char) --- nodes.free(g) - - -- can be a helper - if ca and ca > 0 then - setattr(current,a_colorspace,ma == 0 and 1 or ma) - setattr(current,a_color,ca) - end - if ta and ta > 0 then - setattr(current,a_transparency,ta) - end - -- - end - if current == last then - break - else - current = getnext(current) - end - end - -- We pack so that successive handling cannot touch the dropped cap. Packaging - -- in a hlist is also needed because we cannot locally adapt e.g. parindent (not - -- yet stored in with localpar). - local prev = getprev(first) - local next = getnext(last) - -- - setfield(first,"prev",nil) - setfield(last,"next",nil) - local dropper = hpack_nodes(first) - local width = getfield(dropper,"width") - local height = getfield(dropper,"height") - local depth = getfield(dropper,"depth") - setfield(dropper,"width",0) - setfield(dropper,"height",0) - setfield(dropper,"depth",0) - -- - setfield(prev,"next",dropper) - if next then - setfield(next,"prev",dropper) - end - setfield(dropper,"next",next) - setfield(dropper,"prev",prev) - -- - if next then - local current = next - while current do - local id = getid(current) - if id == glue_code or id == kern_code then - local next = getnext(current) - -- remove_node(current,current,true) -- created an invalid next link and dangling remains - remove_node(head,current,true) - current = next - else - break - end - end - end - -- - local hoffset = width + hoffset + distance + (indent and parindent or 0) - for current in traverse_id(glyph_code,first) do - setfield(current,"xoffset",- hoffset ) - setfield(current,"yoffset",- voffset) -- no longer - height here - if current == last then - break - end - end - -- - first = dropper - -- - if setting.location == v_margin then - -- okay - else - if lines == 0 then -- safeguard, not too precise - lines = ceil((height+voffset) / baseline) - end - -- We cannot set parshape yet ... when we can I'll add a slope - -- option (positive and negative, in emwidth). - local hangafter = - lines - local hangindent = width + distance - if trace_initials then - report_initials("setting hangafter to %i and hangindent to %p",hangafter,hangindent) - end - tex.hangafter = hangafter - tex.hangindent = hangindent - end - if indent then - insert_after(first,first,new_kern(-parindent)) - end - done = true - end - end - return head, done -end - -function initials.handler(head) - head = tonut(head) - local start = head - local attr = nil - while start do - attr = getattr(start,a_initial) - if attr then - break - elseif getid(start) == glyph then - break - else - start = getnext(start) - end - end - if attr then - -- here as we can process nested boxes first so we need to keep state - tasks.disableaction("processors","typesetters.initials.handler") - -- texsetattribute(attribute,unsetvalue) - local alternative = settings.alternative or v_default - local action = actions[alternative] or actions[v_default] - if action then - if trace_initials then - report_initials("processing initials, alternative %a",alternative) - end - local head, done = action(head,settings) - return tonode(head), done - end - end - return tonode(head), false -end |