diff options
Diffstat (limited to 'tex/context/base/verb-tex.lua')
-rw-r--r-- | tex/context/base/verb-tex.lua | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/tex/context/base/verb-tex.lua b/tex/context/base/verb-tex.lua new file mode 100644 index 000000000..dbb483ad5 --- /dev/null +++ b/tex/context/base/verb-tex.lua @@ -0,0 +1,122 @@ +-- filename : type-tex.lua +-- comment : companion to core-buf.tex +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +if not buffers then buffers = { } end +if not buffers.visualizers then buffers.visualizers = { } end +if not buffers.visualizers.tex then buffers.visualizers.tex = { } end + +buffers.visualizers.tex.colors = { + "prettytwo", + "prettyone", + "prettythree", + "prettyfour" +} + +buffers.visualizers.tex.states = { + ['$']=2, ['{']=2, ['}']=2, + ['[']=3, [']']=3, ['(']=3, [')']=3, ['<']=3, ['>']=3, ['#']=3, ['=']=3, ['"']=3, + ['/']=4, ['^']=4, ['_']=4, ['-']=4, ['&']=4, ['+']=4, ["'"]=4, ['`']=4, ['|']=4, ['%']=4 +} + +-- using a table to store the result does not make sense here (actually, +-- it's substantial slower since we're flushing lines on the fly) +-- +-- we could use a special catcode regime: only \ { } + +function buffers.visualizers.tex.flush_line(str,nested) + local result, state = { }, 0 + local first, escaping = false, false + local byte, find = utf.byte, utf.find + local finish, change = buffers.finish_state, buffers.change_state + buffers.currentcolors = buffers.visualizers.tex.colors + for c in string.utfcharacters(str) do + if c == " " then + if escaping then + result[#result+1] = " " + else + state = finish(state, result) + result[#result+1] = "\\obs " + end + escaping, first = false, false + elseif c == "\t" then + if escaping then + result[#result+1] = " " + else + state = finish(state, result) + result[#result+1] = "\\obs " + end + if buffers.visualizers.enabletab then + result[#result+1] = string.rep("\\obs ",i%buffers.visualizers.tablength) + end + escaping, first = false, false + elseif buffers.visualizers.enableescape and (c == buffers.visualizers.escapetoken) then + if escaping then + if first then + if find(c,"^[%a%!%?%@]$") then + result[#result+1] =c + else + result[#result+1] ="\\char" .. byte(c) .. " " + end + first = false + else + result[#result+1] = "\\" + first = true + end + else + state = finish(state, result) + result[#result+1] = "\\" + escaping, first = true, true + end + elseif escaping then + if find(c,"^[%a%!%?%@]$") then + result[#result+1] = c + else + result[#result+1] = "\\char" .. byte(c) .. " " + end + first = false + elseif first then + state = 1 + if find(c,"^[%a%!%?%@]$") then + result[#result+1] = c + else + result[#result+1] = "\\char" .. byte(c) .. " " + state = finish(state, result) + end + first = false + elseif state == 1 then + if find(c,"^[%a%!%?%@]$") then + result[#result+1] = c + first = false + elseif c == "\\" then + state = change(1, state, result) + result[#result+1] = "\\char" .. byte(c) .. " " + first = true + else + state = change(buffers.visualizers.tex.states[c], state, result) + if state == 0 then + result[#result+1] = c + else + result[#result+1] = "\\char" .. byte(c) .. " " + end + first = false + end + elseif c == "\\" then + first = true + state = change(1, state, result) + result[#result+1] = "\\char" .. byte(c) .. " " + else + state = change(buffers.visualizers.tex.states[c], state, result) + if state == 0 then + result[#result+1] = c + else + result[#result+1] = "\\char" .. byte(c) .. " " + end + first = false + end + end + state = finish(state, result) + buffers.flush_result(result,nested) +end |