Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
-- texinfo.lua: -- This file: -- http://angg.twu.net/blogme4/texinfo.lua.html -- http://angg.twu.net/blogme4/texinfo.lua -- (find-blogme4 "texinfo.lua") -- Author: Eduardo Ochs <eduardoochs@gmail.com> -- Version: 2011sep27 -- License: GPL3 -- -- (find-es "texinfo") -- (find-angg "LUA/texinfo.lua") -- (find-dn5 "treesegs.lua") -- -- This does very little at the moment. -- «.TexiTree» (to "TexiTree") -- «.TOP-NODE-SUBNODES» (to "TOP-NODE-SUBNODES") -- «.MYNODE» (to "MYNODE") -- «.ANODE» (to "ANODE") require "eoo" -- (find-blogme4 "eoo.lua") require "def" -- (find-blogme4 "def.lua") -- «TexiTree» (to ".TexiTree") TexiTree = Class { type = "TexiTree", __index = { addnode_ = function (texitree, treepos, node) node.treepos = treepos table.insert(texitree.structure, treepos) texitree.nodes[treepos] = node end, addnode_at = function (texitree, level, node) local structure = texitree.structure local last_pos = structure[#structure] local last_level = #last_pos if last_level + 1 == level then return texitree:addnode_(last_pos.."A", node) else if last_level + 1 < level then error("Going too deep too fast") end local prev_pos = last_pos:sub(1, level) local prev_up = prev_pos:sub(1, -2) local prev_cb = prev_pos:sub(-1):byte() local node_pos = prev_up .. string.char(prev_cb + 1) return texitree:addnode_(node_pos, node) end end, add_at = function (texitree, level, node) if level == 1 then texitree:addnode_("_", node) else texitree:addnode_at(level, node) end end, add_top = function (texitree, node) texitree:add_at(1, node) end, add_chapter = function (texitree, node) texitree:add_at(2, node) end, add_section = function (texitree, node) texitree:add_at(3, node) end, add_subsection = function (texitree, node) texitree:add_at(4, node) end, -- menubody = function (texitree, pos) local items = {} for ascii=65,126 do local subpos = pos..string.char(ascii) local node = texitree.nodes[subpos] if not node then break end local short, long = node.short, node.long local left = "* "..short.."::" local line = string.format("%-32s%s\n", left, long) table.insert(items, line) end return table.concat(items) end, menufor = function (texitree, pos) local body = texitree:menubody(pos) if body ~= "" then return "\n\n@menu\n"..body.."@end menu\n" end end, -- up_prev_next = function (texitree, node) local pos_this = node.treepos local pos_up = pos_this:sub(1, -2) local pos_cb = pos_this:sub(-1):byte() local pos_prev = pos_up .. string.char(pos_cb - 1) local pos_next = pos_up .. string.char(pos_cb + 1) local up = texitree.nodes[pos_up] local prev = texitree.nodes[pos_prev] local next = texitree.nodes[pos_next] return up, prev, next end, node_head = function (texitree, node) local up, prev, next = texitree:up_prev_next(node) local up_short = (up and up.short) or "(dir)" local prev_short = (prev and prev.short) or "" local next_short = (next and next.short) or "" local short = node.short local long = node.long local command = ({"@top", "@chapter", "@section", "@subsection", "@subsubsection"})[#node.treepos] return string.format( "@node %s, %s, %s, %s\n" .. "@comment node-name, next, previous, up\n" .. "%s %s", short, next_short, prev_short, up_short, command, long) end, node_texi = function (texitree, node) local header = texitree:node_head(node) local body = node.body or "" return string.format("%s\n%s\n", header, body) end, nodes_texi = function (texitree) local f = function (pos) return texitree:node_texi(texitree.nodes[pos]) .. (texitree:menufor(pos) or "") end return mapconcat(f, texitree.structure, "\n") end, head_texi = function (texitree) local stem = texitree.stem or "foo" local title = texitree.title or "Foo" return "\\input texinfo\n" .. "@setfilename "..stem..".info\n" .. "@settitle "..title.."\n\n" end, foot_texi = function (texitree) return "\n@bye\n" end, full_texi = function (texitree) return texitree:head_texi() .. texitree:nodes_texi() .. texitree:foot_texi() end, print = function (texitree) print(texitree:nodes_texi()) end, print = function (texitree) print(texitree:full_texi()) end, writefile = function (texitree, fname) writefile(fname, texitree:full_texi()) end, -- srclink_fmt = '(find-blogme4 "doc/blogme4.b4texi" "%s")', infolink_fmt = '(find-node "(blogme4)%s")', srclink = function (texitree, anchor) return texitree.srclink_fmt:format(anchor) end, infolink = function (texitree, short) return texitree.infolink_fmt:format(short) end, }, } -- «TOP-NODE-SUBNODES» (to ".TOP-NODE-SUBNODES") Def [[ TOP 3 stem,title,body tt = TexiTree {structure={}, nodes={}, stem=stem, title=title} tt:add_at(1, {short="Top", long="Top", body=body}) tt.level = 2 ]] Def [[ NODE 3 short,long,body tt:add_at(tt.level, {short=short, long=long, body=body}) ]] Def [[ SUBNODES nop _ local oldlevel = tt.level tt.level = tt.level + 1 readvrest() -- process the body with level=level+1 tt.level = oldlevel ]] -- «MYNODE» (to ".MYNODE") -- (find-texinode "exampleindent") -- (find-texinode "Quotations and Examples") -- (find-texinode "Block Enclosing Commands") -- (find-texinode "example") -- (find-texinode "verbatim") -- (find-texinode "noindent") trim = function (str) return str:match("^(.-)[ \n\t]*$") end tquote = function (str) return (str:gsub("[{}@]", "@%1")) end def [[ IE 1 body "\n@example\n" ..tquote(trim(body)).."\n@end example\n" ]] def [[ LE 1 body "\n@verbatim\n"..tquote(trim(body)).."\n@end verbatim\n" ]] def [[ IE' 1Q body IE(body) ]] def [[ LE' 1Q body LE(body) ]] def [[ NI nop _ "@noindent " ]] def [[ PRELINK 1 anchor "" ]] def [[ PRELINK 1 anchor IE("src: "..tt:srclink(anchor).."\n") ]] Def [[ MYNODE 4 anchor,short,long,body print(tt:infolink(short)) return NODE(short, long, PRELINK(anchor)..body) ]] -- «ANODE» (to ".ANODE") -- (find-blogme4 "eval.lua" "parse_pattern") read_pattern = function (pat) if not parse_pattern(pat) then print("Failed pattern: "..pat) error() end return result end read_line = function () return read_pattern("^([^\n]+)\n?()") end read_line_pat = function (pat) return read_line():match(pat) end read_anchor = function () return read_line_pat("«([!-~]+)»") end read_qstr = function () return read_line_pat("\"([^\"]*)\"") end _A["A3"] = function () return read_anchor(), read_qstr(), readvvrest() end def [[ ANODE A3 anchor,short,long,body MYNODE(anchor,short,long,body) ]] -- dump-to: tests test1 = function () tt = TexiTree {structure={}, nodes={}} tt:addnode_("_", {short="Top", long="Top"}) tt:addnode_("_A", {short="Short A", long="Long A"}) tt:addnode_("_AA", {short="Short AA", long="Long AA"}) tt:addnode_("_AB", {short="Short AB", long="Long AB"}) tt:addnode_("_B", {short="Short B", long="Long B"}) tt:print() end test2 = function () tt = TexiTree {structure={}, nodes={}} tt:add_at(1, {short="Top", long="Top", body="Top body"}) tt:add_at(2, {short="Short A", long="Long A", body="A body" }) tt:add_at(3, {short="Short AA", long="Long AA", body="AA body" }) tt:add_at(3, {short="Short AB", long="Long AB", body="AB body" }) tt:add_at(2, {short="Short B", long="Long B", body="B body" }) tt:print() end -- (find-blogme4 "texinfo.lua") -- print(trim(" A B \n ").."!") -- def [[ TEST nop _ PP(read_line(), read_line(), readvvrest()) ]] -- def [[ TEST nop _ PP(read_anchor(), read_qstr(), readvvrest()) ]] --[==[ * (eepitch-lua51) * (eepitch-kill) * (eepitch-lua51) require "texinfo" test1() test2() print(tt:menufor("_A")) print(tt:menufor("_")) PP(tt) node = tt.nodes["_A"] PP(node) PP(tt:header(node)) PP(tt:nodes_texi()) * (eepitch-lua51) * (eepitch-kill) * (eepitch-lua51) require "texinfo" require "anggdefs" tt = TexiTree {structure={}, nodes={}} def [[ NODE 3 level,short,long,body tt:add_at(level+0, {short=short, long=long, body=body}) ]] NODE(1, "Top", "My manual", "topmatter") NODE(2, "short A", "long A", "body A") NODE(3, "short AA", "long AA", "body AA") NODE(3, "short AB", "long AB", "body AB") NODE(2, "short B", "long B", "body B") PP(tt) tt:print() * (message (find-sh0 "rm -v /tmp/foo.texi")) tt:writefile("/tmp/foo.texi") * (message (find-sh0 "ls -l /tmp/foo.texi")) -- (find-fline "/tmp/foo.texi") * (eepitch-lua51) * (eepitch-kill) * (eepitch-lua51) require "texinfo" test2() * (message (find-sh0 "rm -v /tmp/foo.texi")) tt:writefile("/tmp/foo.texi") * (message (find-sh0 "ls -l /tmp/foo.texi")) -- (find-fline "/tmp/foo.texi") * (eepitch-shell) * (eepitch-kill) * (eepitch-shell) cd /tmp/ makeinfo foo.texi -- (find-fline "/tmp/") # (find-node "(/tmp/eev)Top") -- (find-blogme4 "eval.lua" "blogme_eval") -- (find-blogme4 "eval.lua" "blogme_eval" "return wordf(argpf())") -- (find-blogme4 "eval.lua" "readqword") -- (find-blogme4 "eval.lua" "_A") -- (find-blogme4 "def.lua" "def") * (eepitch-lua51) * (eepitch-kill) * (eepitch-lua51) require "texinfo" require "eval" require "anggdefs" bev = blogme_eval pev = function (str) print(blogme_eval(str)) end pev [[ foo [IT bar] plic ]] mycount = 0 Def [[ PN nop _ mycount = mycount+1; print(mycount) ]] pev [[ [PN] [PN] [PN] ]] _A["pos"] = function () return pos end def [[ POS pos pos pos ]] pev [[ [POS] [POS] [POS] ]] Def [[ P* pos p local mycount_ = mycount mycount = mycount*10 local result = readvrest() mycount = mycount_ ]] mycount = 0 pev [=[ [PN] [PN] [P* [PN] [PN]] [PN] [PN] ]=] tt = TexiTree {structure={}, nodes={}, level=1} Def [[ NODE 3 short,long,body tt:add_at(tt.level, {short=short, long=long, body=body}) ]] Def [[ SUBNODES pos p local oldlevel = tt.level tt.level = tt.level + 1 readvrest() tt.level = oldlevel ]] bev [=[ [NODE [J Top] [J Top] Top body] [SUBNODES [NODE [J Short A] [J Long A] A body] [SUBNODES [NODE [J Short AA] [J Long AA] AA body] [NODE [J Short AB] [J Long AB] AB body] ] [NODE [J Short B] [J Long B] B boody] ] ]=] tt:print() * (eepitch-lua51) * (eepitch-kill) * (eepitch-lua51) require "texinfo" require "eval" require "anggdefs" bev = blogme_eval pev = function (str) print(blogme_eval(str)) end pev [[ foo [IT bar] plic ]] tt = TexiTree {structure={}, nodes={}, level=1} Def [[ TOP 3 stem,title,body tt = TexiTree {structure={}, nodes={}, stem=stem, title=title} tt:add_at(1, {short="Top", long="Top", body=body}) tt.level = 2 ]] Def [[ NODE 3 short,long,body tt:add_at(tt.level, {short=short, long=long, body=body}) ]] Def [[ SUBNODES pos p local oldlevel = tt.level tt.level = tt.level + 1 readvrest() tt.level = oldlevel ]] bev [=[ [TOP mystem [J My title] Top body] [NODE [J Short A] [J Long A] A body] [SUBNODES [NODE [J Short AA] [J Long AA] AA body] [NODE [J Short AB] [J Long AB] AB body] ] [NODE [J Short B] [J Long B] B boody] ]=] tt:print() tt:writefile("/tmp/"..tt.stem..".texi") --]==] -- (find-angg "LUA/texinfo.lua" "output") -- (find-texinode "First Node" "@node Top") -- (find-texinode "makeinfo top command" "@top Your Manual Title") -- (find-texinode "Node Menu Illustration") -- Local Variables: -- coding: raw-text-unix -- ee-anchor-format: "«%s»" -- End: