summaryrefslogtreecommitdiff
path: root/tex/context/base/spac-chr.lua
diff options
context:
space:
mode:
authorContext Git Mirror Bot <phg42.2a@gmail.com>2016-01-12 17:15:07 +0100
committerContext Git Mirror Bot <phg42.2a@gmail.com>2016-01-12 17:15:07 +0100
commit8d8d528d2ad52599f11250cfc567fea4f37f2a8b (patch)
tree94286bc131ef7d994f9432febaf03fe23d10eef8 /tex/context/base/spac-chr.lua
parentf5aed2e51223c36c84c5f25a6cad238b2af59087 (diff)
downloadcontext-8d8d528d2ad52599f11250cfc567fea4f37f2a8b.tar.gz
2016-01-12 16:26:00
Diffstat (limited to 'tex/context/base/spac-chr.lua')
-rw-r--r--tex/context/base/spac-chr.lua304
1 files changed, 0 insertions, 304 deletions
diff --git a/tex/context/base/spac-chr.lua b/tex/context/base/spac-chr.lua
deleted file mode 100644
index 3eb348586..000000000
--- a/tex/context/base/spac-chr.lua
+++ /dev/null
@@ -1,304 +0,0 @@
-if not modules then modules = { } end modules ['spac-chr'] = {
- version = 1.001,
- comment = "companion to spac-chr.mkiv",
- author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright = "PRAGMA ADE / ConTeXt Development Team",
- license = "see context related readme files"
-}
-
-local byte, lower = string.byte, string.lower
-
--- beware: attribute copying is bugged ... there will be a proper luatex helper
--- for this
-
--- to be redone: characters will become tagged spaces instead as then we keep track of
--- spaceskip etc
-
--- todo: only setattr when export / use properties
-
-local next = next
-
-local trace_characters = false trackers.register("typesetters.characters", function(v) trace_characters = v end)
-local trace_nbsp = false trackers.register("typesetters.nbsp", function(v) trace_nbsp = v end)
-
-local report_characters = logs.reporter("typesetting","characters")
-
-local nodes, node = nodes, node
-
-local nuts = nodes.nuts
-
-local tonode = nuts.tonode
-local tonut = nuts.tonut
-
-local getfield = nuts.getfield
-local setfield = nuts.setfield
-local getnext = nuts.getnext
-local getprev = nuts.getprev
-local getid = nuts.getid
-local getattr = nuts.getattr
-local setattr = nuts.setattr
-local getfont = nuts.getfont
-local getchar = nuts.getchar
-local setsubtype = nuts.setsubtype
-
-local setcolor = nodes.tracers.colors.set
-
-local insert_node_before = nuts.insert_before
-local insert_node_after = nuts.insert_after
-local remove_node = nuts.remove
-local copy_node_list = nuts.copy_list
-local traverse_id = nuts.traverse_id
-
-local tasks = nodes.tasks
-
-local nodepool = nuts.pool
-local new_penalty = nodepool.penalty
-local new_glue = nodepool.glue
-local new_kern = nodepool.kern
-local new_rule = nodepool.rule
-
-local nodecodes = nodes.nodecodes
-local skipcodes = nodes.skipcodes
-local glyph_code = nodecodes.glyph
-local glue_code = nodecodes.glue
-
-local space_skip_code = skipcodes["spaceskip"]
-
-local chardata = characters.data
-local is_punctuation = characters.is_punctuation
-
-local typesetters = typesetters
-
-local unicodeblocks = characters.blocks
-
-local characters = typesetters.characters or { } -- can be predefined
-typesetters.characters = characters
-
-local fonthashes = fonts.hashes
-local fontparameters = fonthashes.parameters
-local fontcharacters = fonthashes.characters
-local fontquads = fonthashes.quads
-
-local setmetatableindex = table.setmetatableindex
-
-local a_character = attributes.private("characters")
-local a_alignstate = attributes.private("alignstate")
-
-local c_zero = byte('0')
-local c_period = byte('.')
-
-local function inject_quad_space(unicode,head,current,fraction)
- local attr = getfield(current,"attr")
- if fraction ~= 0 then
- fraction = fraction * fontquads[getfont(current)]
- end
- local glue = new_glue(fraction)
- setfield(glue,"attr",attr)
- setfield(current,"attr",nil)
- setattr(glue,a_character,unicode)
- head, current = insert_node_after(head,current,glue)
- return head, current
-end
-
-local function inject_char_space(unicode,head,current,parent)
- local attr = getfield(current,"attr")
- local font = getfont(current)
- local char = fontcharacters[font][parent]
- local glue = new_glue(char and char.width or fontparameters[font].space)
- setfield(glue,"attr",attr)
- setfield(current,"attr",nil)
- setattr(glue,a_character,unicode)
- head, current = insert_node_after(head,current,glue)
- return head, current
-end
-
-local function inject_nobreak_space(unicode,head,current,space,spacestretch,spaceshrink)
- local attr = getfield(current,"attr")
- local glue = new_glue(space,spacestretch,spaceshrink)
- local penalty = new_penalty(10000)
- setfield(glue,"attr",attr)
- setfield(current,"attr",nil)
- setattr(glue,a_character,unicode) -- bombs
- head, current = insert_node_after(head,current,penalty)
- if trace_nbsp then
- local rule = new_rule(space)
- local kern = new_kern(-space)
- local penalty = new_penalty(10000)
- setcolor(rule,"orange")
- head, current = insert_node_after(head,current,rule)
- head, current = insert_node_after(head,current,kern)
- head, current = insert_node_after(head,current,penalty)
- end
- head, current = insert_node_after(head,current,glue)
- return head, current
-end
-
-local function nbsp(head,current)
- local para = fontparameters[getfont(current)]
- if getattr(current,a_alignstate) == 1 then -- flushright
- head, current = inject_nobreak_space(0x00A0,head,current,para.space,0,0)
- setsubtype(current,space_skip_code)
- else
- head, current = inject_nobreak_space(0x00A0,head,current,para.space,para.spacestretch,para.spaceshrink)
- end
- return head, current
-end
-
--- assumes nuts or nodes, depending on callers .. so no tonuts here
-
-function characters.replacenbsp(head,original)
- local head, current = nbsp(head,original)
- head = remove_node(head,original,true)
- return head, current
-end
-
-function characters.replacenbspaces(head)
- for current in traverse_id(glyph_code,head) do
- if getchar(current) == 0x00A0 then
- local h = nbsp(head,current)
- if h then
- head = remove_node(h,current,true)
- end
- end
- end
- return head
-end
-
--- This initialization might move someplace else if we need more of it. The problem is that
--- this module depends on fonts so we have an order problem.
-
-local nbsphash = { } setmetatableindex(nbsphash,function(t,k)
- for i=unicodeblocks.devanagari.first,unicodeblocks.devanagari.last do nbsphash[i] = true end
- for i=unicodeblocks.kannada .first,unicodeblocks.kannada .last do nbsphash[i] = true end
- setmetatableindex(nbsphash,nil)
- return nbsphash[k]
-end)
-
-local methods = {
-
- -- The next one uses an attribute assigned to the character but still we
- -- don't have the 'local' value.
-
- [0x001F] = function(head,current)
- local next = getnext(current)
- if next and getid(next) == glyph_code then
- local char = getchar(next)
- head, current = remove_node(head,current,true)
- if not is_punctuation[char] then
- local p = fontparameters[getfont(next)]
- head, current = insert_node_before(head,current,new_glue(p.space,p.space_stretch,p.space_shrink))
- end
- end
- end,
-
- [0x00A0] = function(head,current) -- nbsp
- local next = getnext(current)
- if next and getid(next) == glyph_code then
- local char = getchar(next)
- if char == 0x200C or char == 0x200D then -- nzwj zwj
- next = getnext(next)
- if next and nbsphash[getchar(next)] then
- return false
- end
- elseif nbsphash[char] then
- return false
- end
- end
- local prev = getprev(current)
- if prev and getid(prev) == glyph_code and nbsphash[getchar(prev)] then
- return false
- end
- return nbsp(head,current)
- end,
-
- [0x2000] = function(head,current) -- enquad
- return inject_quad_space(0x2000,head,current,1/2)
- end,
-
- [0x2001] = function(head,current) -- emquad
- return inject_quad_space(0x2001,head,current,1)
- end,
-
- [0x2002] = function(head,current) -- enspace
- return inject_quad_space(0x2002,head,current,1/2)
- end,
-
- [0x2003] = function(head,current) -- emspace
- return inject_quad_space(0x2003,head,current,1)
- end,
-
- [0x2004] = function(head,current) -- threeperemspace
- return inject_quad_space(0x2004,head,current,1/3)
- end,
-
- [0x2005] = function(head,current) -- fourperemspace
- return inject_quad_space(0x2005,head,current,1/4)
- end,
-
- [0x2006] = function(head,current) -- sixperemspace
- return inject_quad_space(0x2006,head,current,1/6)
- end,
-
- [0x2007] = function(head,current) -- figurespace
- return inject_char_space(0x2007,head,current,c_zero)
- end,
-
- [0x2008] = function(head,current) -- punctuationspace
- return inject_char_space(0x2008,head,current,c_period)
- end,
-
- [0x2009] = function(head,current) -- breakablethinspace
- return inject_quad_space(0x2009,head,current,1/8) -- same as next
- end,
-
- [0x200A] = function(head,current) -- hairspace
- return inject_quad_space(0x200A,head,current,1/8) -- same as previous (todo)
- end,
-
- [0x200B] = function(head,current) -- zerowidthspace
- return inject_quad_space(0x200B,head,current,0)
- end,
-
- [0x202F] = function(head,current) -- narrownobreakspace
- return inject_nobreak_space(0x202F,head,current,fontquads[getfont(current)]/8)
- end,
-
- [0x205F] = function(head,current) -- math thinspace
- return inject_nobreak_space(0x205F,head,current,fontparameters[getfont(current)].space/8)
- end,
-
- -- [0xFEFF] = function(head,current) -- zerowidthnobreakspace
- -- return head, current
- -- end,
-
-}
-
-characters.methods = methods
-
-function characters.handler(head) -- todo: use traverse_id
- head = tonut(head)
- local current = head
- local done = false
- while current do
- local id = getid(current)
- if id == glyph_code then
- local next = getnext(current)
- local char = getchar(current)
- local method = methods[char]
- if method then
- if trace_characters then
- report_characters("replacing character %C, description %a",char,lower(chardata[char].description))
- end
- local h = method(head,current)
- if h then
- head = remove_node(h,current,true)
- end
- done = true
- end
- current = next
- else
- current = getnext(current)
- end
- end
- return tonode(head), done
-end