Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
-- texfile.lua: the TexFile class for dednat6 -- This file: -- http://angg.twu.net/dednat5/texfile.lua -- http://angg.twu.net/dednat5/texfile.lua.html -- (find-angg "dednat5/texfile.lua") -- -- We read each .tex file into a TexFile object. -- Older version: (find-angg "LUA/picture.lua" "Texfile") -- -- «.heads» (to "heads") -- «.Texfile» (to "Texfile") -- «.Texfile-tests» (to "Texfile-tests") require "heads6" -- (find-dn5 "heads6.lua") -- _____ __ _ _ _ -- |_ _|____ __/ _(_) | ___ ___| | __ _ ___ ___ -- | |/ _ \ \/ / |_| | |/ _ \ / __| |/ _` / __/ __| -- | | __/> <| _| | | __/ | (__| | (_| \__ \__ \ -- |_|\___/_/\_\_| |_|_|\___| \___|_|\__,_|___/___/ -- -- «Texfile» (to ".Texfile") TexFile = Class { type = "TexFile", new = function (name, bigstr) return TexFile({name=name}):setlines(bigstr) end, read = function (fname) return TexFile.new(fnamenondirectory(fname), ee_readfile(fname)) end, __index = { setlines = function (tf, bigstr) tf.lines = splitlines(bigstr) tf.lines.abbrev = {} tf.lines.begriff = {} tf.lines.diag = {} tf.lines.lua = {} tf.lines.tree = {} tf.lines.zrect = {} tf.blocks = {} tf.nline = 1 return tf end, head = function (tf, i) local li = tf.lines[i or tf.nline] local p = function (len) return heads[li:sub(1, len)] end return li and (p(3) or p(2) or p(1) or p(0)) end, nexthead = function (tf) return tf:head(tf.nline + 1) end, valid = function (tf, i) return (i or tf.nline) <= #(tf.lines) end, nextvalid = function (tf) return (tf.nline + 1) <= #(tf.lines) end, eof = function (tf) return not tf:valid() end, advance = function (tf) tf.nline = tf.nline + 1 end, getij = function (tf) local i = tf.nline tf.thishead = tf:head() while tf:nextvalid() and tf:nexthead() == tf.thishead do tf:advance() end local j = tf.nline return i,j end, getrest = function (tf, i) local headstr = tf.thishead.headstr return untabify(tf.lines[i]):sub(#headstr+2) end, getblock = function (tf) local i,j = tf:getij() local name = tf.thishead.name local rests = {} for k=i,j do local rest = tf:getrest(k) if tf.lines[name] then tf.lines[name][k] = rest end table.insert(rests, rest) end table.insert(tf.blocks, {i=i, j=j, name=name}) return i,j,rests end, process1 = function (tf) linestr = tf.lines[tf.nline] -- PP(tf:head().headstr, linestr) local action = tf:head().action if action then action() end tf:advance() end, process = function (tf) while not tf:eof() do tf:process1() end end, processuntil = function (tf, nline) nline = nline or tex.inputlineno while not tf:eof() and tf.nline < nline do tf:process1() end end, }, } -- «Texfile-tests» (to ".Texfile-tests") --[==[ * (eepitch-lua51) * (eepitch-kill) * (eepitch-lua51) dofile "texfile.lua" -- (find-LATEX "2008dclosed.tex") tf = TexFile.read "~/LATEX/2008dclosed.tex" -- while tf.nline <= #tf.lines do while not tf:eof() do tf:getblock() local nb = #tf.blocks PP(nb, tf.blocks[nb]) tf:advance() end = tf.nline = #tf.lines * (eepitch-lua51) * (eepitch-kill) * (eepitch-lua51) dofile "texfile.lua" tf = TexFile.new("1", [[ One %L print(2, %L 22) Two %L print(3) End ]]) tf:process() PP(tf.blocks) PP(tf) while tf.nline <= #tf.lines do tf:getblock() local nb = #tf.blocks PP(nb, tf.blocks[nb]) tf:advance() end --]==] -- Local Variables: -- coding: raw-text-unix -- End: