Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
-- This file: -- http://angg.twu.net/LUA/elispwt.lua.html -- http://angg.twu.net/LUA/elispwt.lua -- (find-angg "LUA/elispwt.lua") -- Author: Eduardo Ochs <eduardoochs@gmail.com> -- -- "Elisp with targets". -- This was the first version of, and was superseded by: -- (find-blogme3 "sandwiches.lua") -- (find-blogme3 "sandwiches-defs.lua") -- -- Experimental, intended to supersede this: -- (find-angg "LUA/lua50init.lua" "ELispH") -- (find-angg "LUA/lua50init.lua" "ELispHF") -- (find-angg "LUA/lua50init.lua" "SexpSkel") -- (find-blogme3 "sexp.lua") -- «.SexpTarget» (to "SexpTarget") -- «.SexpTarget-tests» (to "SexpTarget-tests") -- «.SexpIntervals» (to "SexpIntervals") -- «.SexpIntervals-tests» (to "SexpIntervals-tests") -- «.SexpHead» (to "SexpHead") -- «.SexpHead-tests» (to "SexpHead-tests") -- -- «.code_c_d_angg» (to "code_c_d_angg") -- «.code_c_d_angg-tests» (to "code_c_d_angg-tests") -- «.code_c_m_b» (to "code_c_m_b") -- «.code_c_m_b-tests» (to "code_c_m_b-tests") -- «.find-node» (to "find-node") -- «.find-node-test» (to "find-node-test") -- «.code_intro» (to "code_intro") -- «.code_intro-tests» (to "code_intro-tests") -- «.code_youtube» (to "code_youtube") -- «.code_youtube-tests» (to "code_youtube-tests") -- «.code_helponly» (to "code_helponly") -- «.code_helponly-tests» (to "code_helponly-tests") -- -- «.code_c_m_bs» (to "code_c_m_bs") -- «.code_c_d_anggs» (to "code_c_d_anggs") -- «SexpTarget» (to ".SexpTarget") -- Uses: (find-angg "LUA/lua50init.lua" "getsexp") -- SexpTarget = Class { type = "SexpTarget", fromtext = function (text) return SexpTarget {text=text} end, from = function (o) if type(o) == "string" then return SexpTarget.fromtext(o) end if otype(o) == "SexpTarget" then return o end error() end, __tostring = mytabletostring, __index = { url = function (st) if st.f then return st[st.f](st) end return st.text end, -- find_angg = function (st) local fname,anchor = st.fname, st.anchor return "http://angg.twu.net/"..fname..".html".. (anchor and ("#"..anchor) or "") end, find_intro = function (st) local stem,anchor = st.stem, st.anchor local anggurl = "eev-intros/find-"..stem.."-intro.html" if anchor then anggurl = anggurl.."#"..anchor end return "http://angg.twu.net/"..anggurl end, find_node = function (st) local manual,node = st.manual, st.node local baseurl = infomanual_basedir[manual] local shre = "([-'/ &])" local shtable = {["-"] = "_002d", ["'"] = "_0027", ["/"] = "_002f", [" "] = "-", ["&"] = "-"} local shnode = node:gsub("%s+", " "):gsub(shre, shtable) return baseurl..shnode end, find_youtube = function (st) local hash,time = st.hash, st.time return youtube_make_url(hash, time) end, }, } -- «SexpTarget-tests» (to ".SexpTarget-tests") --[[ * (eepitch-lua51) * (eepitch-kill) * (eepitch-lua51) dofile "elispwt.lua" st = SexpTarget.fromtext("foo") = st = st:url() SexpTarget.__index.foo = function (st) return st.f.."FOO" end st.f = "foo" = st:url() code_c_m_b = function (c, manual, basedir) infomanual_basedir[manual] = basedir -- local find_cnode = "find-"..c.."node" -- _EHF[find_cnode] = ELispHF.newnode(find_cnode, c, manual) end code_c_m_b("e", "emacs", "http://www.gnu.org/software/emacs/manual/html_node/emacs/") code_c_m_b("el", "elisp", "http://www.gnu.org/software/emacs/manual/html_node/elisp/") st = SexpTarget {f="find_node", manual="emacs", node="Keys", text="ek"} = st = st:url() st = SexpTarget {f="find_intro", stem="eev", anchor="1"} st = SexpTarget {f="find_intro", stem="eev"} = st = st:url() st = SexpTarget {f="find_angg", fname="LATEX/2021haskell.tex", anchor="title"} st = SexpTarget {f="find_angg", fname="LATEX/2021haskell.tex"} = st = st:url() -- (find-blogme3 "sexp.lua" "find-xxxnodes") --]] -- «SexpIntervals» (to ".SexpIntervals") -- Example: -- bigstr = [[# (find-eev-intro "1. `eev-mode'")]] -- si = SexpIntervals.fromline(bigstr) -- si:addtint(1, nil, "head") -- si:addtint("e", nil, "end") -- print(si) -- --> (find-eev-intro "1. `eev-mode'") -- -------------- : head -- --: end -- -- Supersedes: (find-angg "LUA/lua50init.lua" "SexpSkel") -- Uses: (find-angg "LUA/lua50init.lua" "getsexp") -- SexpIntervals = Class { type = "SexpIntervals", fromline = function (str) local sexp, head, skel, left = getsexp(str) if not sexp then return end local si = SexpIntervals { line=str, -- Like '# (find-eev-intro "1.")' sexp=sexp, -- like '(find-eev-intro "1.")' head=head, -- like 'find-eev-intro' skel=skel, -- like '(find-eev-intro "__")' left=left -- like '# ' } local skelbody = " "..si.skel:sub(2,-2).." " local allintervals = {} for b,e in skelbody:gmatch("()[^ \t]+()") do table.insert(allintervals, {b=b, e=e}) end si.allintervals = allintervals si.tintervals = {} -- intervals with targets; use `b's as keys si.tintervalnames = {} -- `b's <-> `name's; for example 2 <-> "1" return si end, -- -- SexpIntervals.htmlizeline(linestr) always returns a string. -- It is a very high-level function that uses the table _SH of -- `SexpHead' that is defined below. htmlizeline = function (linestr) local si = SexpIntervals.fromline(linestr) if si and _SH[si.head] then si:applyhead() return si:linehtml(), si end return SexpIntervals({}):hzleft(linestr) end, -- __tostring = function (si) return si:tostring() end, __index = { sexpsub = function (si, b, e) return si.sexp:sub(b, e-1) end, rawarg = function (si, n) if not si.allintervals[n] then return end local be = si.allintervals[n] return si.sexp:sub(be.b, be.e-1) end, strarg = function (si, n) local rawarg = si:rawarg(n) if not rawarg then return end if not rawarg:match('^".*"$') then return end return rawarg:sub(2, -2) end, narg = function (si, n) local rawarg = si:rawarg(n) if not rawarg then return end if rawarg:match('^[-+]?%d+$') then return tonumber(rawarg) end local body = rawarg:match('^%(%+ (.*)%)') if body then local total = 0 for _,k in ipairs(map(tonumber, split(body))) do total = total + k end return total end end, argbe = function (si, n, delta) local be = si.allintervals[n] return be.b+(delta or 0), be.e-(delta or 0) end, endbe = function (si) local e = #si.sexp+1 local b = (si.sexp:sub(-2, -2) == '"') and e-2 or e-1 return b,e end, -- sortedtintervals = function (si) local tints = {} for _,b in ipairs(sorted(keys(si.tintervals))) do table.insert(tints, si.tintervals[b]) end return tints end, addtinterval = function (si, tint) si.tintervals[tint.b] = tint si.tintervalnames[tint.b] = tint.name si.tintervalnames[tint.name] = tint.b end, addtint = function (si, n, delta, text, st) local b,e,name,tint if n == "e" then name,b,e = n, si:endbe() else name,b,e = n..(delta==1 and "m" or ""), si:argbe(n, delta) end if st == nil then st = text end if type(st) == "string" then st = SexpTarget.fromtext(st) end tint = {b=b, e=e, name=name, text=text, st=st} si:addtinterval(tint) return si end, -- dash = function (si, b, e) return (" "):rep(b-1) .. ("-"):rep(e-b) .. (" "):rep(#si.sexp-e+1) end, tostring = function (si) local A = {si.sexp} for i,tint in ipairs(si:sortedtintervals()) do local b,e,text,name = tint.b, tint.e, tint.text, tint.name table.insert(A, si:dash(b, e)..":"..name..": "..(text or "")) end return table.concat(A, "\n") end, -- hzleft = function (si, str) return str end, hztext = function (si, str) return str end, hzhref = function (si, str) return str end, makehref = function (si, st, text) return format('<a href="%s">%s</a>', st:url(), si:hzhref(text)) end, -- linehtml = function (si) return si:hzleft(si.left) .. si:sexphtml() end, sexphtml = function (si) return si:sexphtml0(si:splitattargets()) end, sexphtml0 = function (si, A) html = si:hztext(A[1].text) for i=2,#A,2 do html = html .. si:makehref(A[i].st, A[i].text) .. si:hztext(A[i+1].text) end return html end, -- splitattargets = function (si) local A,lastpos = {}, 1 local addtoA = function (b, e, st) table.insert(A, {b=b, e=e, text=si:sexpsub(b, e), st=st}) end for i,tint in ipairs(si:sortedtintervals()) do addtoA(lastpos, tint.b) addtoA(tint.b, tint.e, tint.st) lastpos = tint.e end addtoA(lastpos, #si.sexp+1) return A end, -- -- :applyhead() uses the table of SexpHeads defined below. applyhead = function (si) local sh = _SH[si.head] sh:f(si) return si end, }, } -- «SexpIntervals-tests» (to ".SexpIntervals-tests") --[==[ * (eepitch-lua51) * (eepitch-kill) * (eepitch-lua51) dofile "elispwt.lua" bigstr = [[# (find-eev-intro "1. `eev-mode'")]] = SexpIntervals.htmlizeline(bigstr) si = SexpIntervals.fromline(bigstr) si:addtint(1, nil, "head") si:addtint("e", nil, "end") = si PPV(si) PPV(si:splitattargets()) print(si:linehtml()) = SexpTarget.fromtext("foo") = SexpTarget.fromtext("foo"):url() * (eepitch-lua51) * (eepitch-kill) * (eepitch-lua51) dofile "elispwt.lua" bigstr = '# (find-eev-intro "1." (+ -2 -3) +4 "foo" "bar")' si = SexpIntervals.fromline(bigstr) PPV(si) PP(si:rawarg(1)) PP(si:strarg(1)) PP(si:strarg(2)) PP(si:strarg(4)) -- nil PP(si:narg(3)) PP(si:narg(4)) = si si:addtint(1, nil, "head") si:addtint("e", nil, "end") si:addtint(2, 1, "sec") = si PPV(si) PPV(si:splitattargets()) = si --]==] -- «SexpHead» (to ".SexpHead") -- SexpHead = Class { type = "SexpHead", __tostring = mytabletostring, __index = { }, } _SH = VerticalTable {} -- «SexpHead-tests» (to ".SexpHead-tests") -- --[==[ * (eepitch-lua51) * (eepitch-kill) * (eepitch-lua51) dofile "elispwt.lua" _SH["foo"] = SexpHead { f = function (sh, si) si:addtint(1, nil, "FOO") end, } bigstr = [[(foo)]] h, si = SexpIntervals.htmlizeline(bigstr) = h = si PPV(si) PPV(si:splitattargets()) --]==] -- «code_c_d_angg» (to ".code_c_d_angg") -- code_c_d_angg = function (c, d) local find_c = "find-"..c _SH[find_c] = SexpHead { head = find_c, -- (find-eev-quick-intro "9. Shorter hyperlinks") help = SexpTarget {f="find_intro", stem="eev-quick", anchor="9"}, f = function (sh, si) si:addtint(1, nil, "help", sh.help) local a, b = si:strarg(2), si:strarg(3) if a then local target = SexpTarget {f="find_angg", fname=d..a, anchor=b} si:addtint("e", nil, "target", target) end end, } end -- «code_c_d_angg-tests» (to ".code_c_d_angg-tests") --[==[ * (eepitch-lua51) * (eepitch-kill) * (eepitch-lua51) dofile "elispwt.lua" bigstr = [[# (find-LATEX "2021haskell.tex" "title")]] = SexpIntervals.htmlizeline(bigstr) code_c_d_angg("LATEX", "LATEX/") = (SexpIntervals.htmlizeline(bigstr)) --]==] -- «code_c_m_b» (to ".code_c_m_b") -- code_c_m_b = function (c, manual, basedir) infomanual_basedir[manual] = basedir local find_cnode = "find-"..c.."node" _SH[find_cnode] = SexpHead { head = find_cnode, -- (find-eev-quick-intro "9.2. Extra arguments to `code-c-d'") help = SexpTarget {f="find_intro", stem="eev-quick", anchor="9.2"}, f = function (sh, si) si:addtint(1, nil, "help", sh.help) local a = si:strarg(2) if not a then return end local target = SexpTarget {f="find_node", manual=manual, node=a} si:addtint("e", nil, "target", target) end, } end code_c_m_b("e", "emacs", "http://www.gnu.org/software/emacs/manual/html_node/emacs/") code_c_m_b("el", "elisp", "http://www.gnu.org/software/emacs/manual/html_node/elisp/") -- «code_c_m_b-tests» (to ".code_c_m_b-tests") --[==[ * (eepitch-lua51) * (eepitch-kill) * (eepitch-lua51) dofile "elispwt.lua" bigstr = [[# (find-enode "Keys")]] = (SexpIntervals.htmlizeline(bigstr)) --]==] -- «find-node» (to ".find-node") -- _SH["find-node"] = SexpHead { head = "find-node", -- (find-eev-quick-intro "3. Elisp hyperlinks") help = SexpTarget {f="find_intro", stem="eev-quick", anchor="3"}, f = function (sh, si) si:addtint(1, nil, "help", sh.help) local ab = si:strarg(2) if not ab then return end local a, b = ab:match("^%(([^()]+)%)(.*)$") if not a then return end local target = SexpTarget {f="find_node", manual=a, node=b} si:addtint("e", nil, "target", target) end, } -- «find-node-test» (to ".find-node-test") --[==[ * (eepitch-lua51) * (eepitch-kill) * (eepitch-lua51) dofile "elispwt.lua" bigstr = [[# (find-node "(emacs)Keys")]] = (SexpIntervals.htmlizeline(bigstr)) --]==] -- «code_intro» (to ".code_intro") -- code_intro = function (stem) local find_stem_intro = "find-"..stem.."-intro" _SH[find_stem_intro] = SexpHead { head = find_stem_intro, help = SexpTarget {f="find_intro", stem=stem, anchor=nil}, f = function (sh, si) si:addtint(1, nil, "help", sh.help) local a = si:strarg(2) if not a then return end local anchor = a:match("^%d[.%d]*%.") if not anchor then return end local target = SexpTarget {f="find_intro", stem=stem, anchor=anchor} si:addtint("e", nil, "target", target) end, } end -- «code_intro-tests» (to ".code_intro-tests") --[==[ * (eepitch-lua51) * (eepitch-kill) * (eepitch-lua51) dofile "elispwt.lua" bigstr = [[# (find-foo-intro "12.34. bar")]] = (SexpIntervals.htmlizeline(bigstr)) code_intro("foo") bigstr = [[# (find-foo-intro "12.34. bar")]] = (SexpIntervals.htmlizeline(bigstr)) --]==] ee_intro_stems = [[ anchors audiovideo bounded brxxx channels code-c-d defun eejump eepitch eev eev-quick eev-install elisp emacs emacs-keys escripts eval git here-links links-conv links multiwindow org pdf-like prepared psne rcirc refining templates three-main-keys videos windows-beginner wrap ]] for _,stem in ipairs(split(ee_intro_stems)) do code_intro(stem) end -- «code_youtube» (to ".code_youtube") -- code_youtube = function (c, hash) local find_c = "find-"..c _SH[find_c] = SexpHead { head = find_c, -- (find-audiovideo-intro "4. Short hyperlinks to audio and video files") help = SexpTarget {f="find_intro", stem="audiovideo", anchor="4"}, f = function (sh, si) si:addtint(1, nil, "help", sh.help) local time = si:strarg(2) if time then local target = SexpTarget {f="find_youtube", hash=hash, time=time} si:addtint(2, 1, "target", target) end end, } end -- «code_youtube-tests» (to ".code_youtube-tests") -- --[==[ * (eepitch-lua51) * (eepitch-kill) * (eepitch-lua51) dofile "elispwt.lua" code_youtube("eev2019video", "86yiRG8YJD0") bigstr = [[# (find-eev2019video "15:56")]] = (SexpIntervals.htmlizeline(bigstr)) --]==] -- «code_c_m_bs» (to ".code_c_m_bs") code_c_m_b("e", "emacs", "http://www.gnu.org/software/emacs/manual/html_node/emacs/") code_c_m_b("el", "elisp", "http://www.gnu.org/software/emacs/manual/html_node/elisp/") code_c_m_b("eli", "eintr", "http://www.gnu.org/software/emacs/emacs-lisp-intro/html_node/") code_c_m_b("efaq", "efaq", "https://www.gnu.org/software/emacs/manual/html_node/efaq/") code_c_m_b("cl", "cl", "http://www.gnu.org/software/emacs/manual/html_node/cl/") code_c_m_b("gnus", "gnus", "http://www.gnu.org/software/emacs/manual/html_node/gnus/") code_c_m_b("message", "message", "http://www.gnu.org/software/emacs/manual/html_node/message/") code_c_m_b("woman", "woman", "http://www.gnu.org/software/emacs/manual/html_node/woman/") code_c_m_b("rcirc", "rcirc", "http://www.gnu.org/software/emacs/manual/html_node/rcirc/") code_c_m_b("org", "org", "http://www.gnu.org/software/emacs/manual/html_node/org/") code_c_m_b("gst", "gst", "http://www.gnu.org/software/smalltalk/manual/html_node/") code_c_m_b("gstbase", "gst-base", "http://www.gnu.org/software/smalltalk/manual-base/html_node/") code_c_m_b("gstlibs", "gst-libs", "http://www.gnu.org/software/smalltalk/manual-libs/html_node/") code_c_m_b("pclcvs", "pcl-cvs", "http://www.gnu.org/software/emacs/manual/html_node/pcl-cvs/") code_c_m_b("autotype", "autotype", "http://www.gnu.org/software/emacs/manual/html_node/autotype/") code_c_m_b("libc", "libc", "http://www.gnu.org/software/libc/manual/html_node/") code_c_m_b("make", "make", "http://www.gnu.org/software/make/manual/html_node/") code_c_m_b("grub", "grub", "https://www.gnu.org/software/grub/manual/grub/html_node/") code_c_m_b("gawk", "gawk", "http://www.gnu.org/software/gawk/manual/html_node/") code_c_m_b("texi", "texinfo", "http://www.gnu.org/software/texinfo/manual/texinfo/html_node/") code_c_m_b("gcc", "gcc-4.1", "http://gcc.gnu.org/onlinedocs/gcc-4.2.2/gcc/") code_c_m_b("coreutils", "coreutils", "http://www.gnu.org/software/coreutils/manual/html_node/") code_c_m_b("bash", "bash", "http://www.gnu.org/software/bash/manual/html_node/") code_c_m_b("bash", "bashref", "http://www.gnu.org/software/bash/manual/html_node/") code_c_m_b("wget", "wget", "http://www.gnu.org/software/wget/manual/html_node/") code_c_m_b("slime", "slime", "http://common-lisp.net/project/slime/doc/html/") code_c_m_b("bison", "bison", "http://www.gnu.org/software/bison/manual/html_node/") code_c_m_b("octave", "octave", "http://www.gnu.org/software/octave/doc/interpreter/") code_c_m_b("rcirc", "rcirc", "http://www.gnu.org/software/emacs/manual/html_node/rcirc/") code_c_m_b("binutils", "binutils", "http://sourceware.org/binutils/docs/binutils/") code_c_m_b("gdb", "gdb", "http://sourceware.org/gdb/download/onlinedocs/gdb/") code_c_m_b("parted", "parted", "https://www.gnu.org/software/parted/manual/html_node/") -- «code_c_d_anggs» (to ".code_c_d_anggs") code_c_d_angg("angg", "") code_c_d_angg("es", "e/") code_c_d_angg("dednat4", "dednat4/") code_c_d_angg("dn4", "dednat4/") code_c_d_angg("dn4ex", "dednat4/examples/") code_c_d_angg("dn5", "dednat5/") code_c_d_angg("dn6", "LATEX/dednat6/") code_c_d_angg("dednat6", "dednat6/") code_c_d_angg("blogme", "blogme/") code_c_d_angg("blogme3", "blogme3/") code_c_d_angg("blogme4", "blogme4/") code_c_d_angg("eev", "eev-current/") code_c_d_angg("flua", "flua/") code_c_d_angg("rubyforth", "rubyforth/") code_c_d_angg("vtutil", "vtutil/") code_c_d_angg("vtutil4", "vtutil4/") code_c_d_angg("RETRO", "RETRO/") code_c_d_angg("gab", "gab/") code_c_d_angg("eevvideos", "eev-videos/") code_c_d_angg("quadr", "quadradinho/") code_c_d_angg("ydb", "youtube-db/") code_c_d_angg("fbcache", "fbcache/") code_c_d_angg("clg", "2019-CLG/") code_c_d_angg("books", "books/") -- «code_helponly» (to ".code_helponly") -- code_helponly = function (head, stem, anchor) _SH[head] = SexpHead { head = head, help = SexpTarget {f="find_intro", stem=stem, anchor=anchor}, f = function (sh, si) si:addtint(1, nil, "help", sh.help) end, } end code_helponly_line = function (linestr) local si = SexpIntervals.fromline(linestr) if not si then return end local head = bitrim(si.left) local stem = si.head:match "find%-(.*)%-intro(.*)" local posspec = si:strarg(2) local anchor = posspec and posspec:match "^(%d[.%d]*)%." code_helponly(head, stem, anchor) end code_helponly_lines = function (bigstr) for _,linestr in ipairs(splitlines(bigstr)) do code_helponly_line(linestr) end end code_helponly_lines [[ eelatex-bounded (find-bounded-intro) eev-bounded (find-bounded-intro) eek (find-eev-quick-intro "3. Elisp hyperlinks") find-efunction (find-eev-quick-intro "3. Elisp hyperlinks") find-efunctiondescr (find-eev-quick-intro "3. Elisp hyperlinks") find-elongkey-links (find-eev-quick-intro "4.2. `find-ekey-links' and friends") find-fline (find-eev-quick-intro "3. Elisp hyperlinks") find-man (find-eev-quick-intro "3. Elisp hyperlinks") find-node (find-eev-quick-intro "3. Elisp hyperlinks") find-sh (find-eev-quick-intro "3. Elisp hyperlinks") find-sh0 (find-eev-quick-intro "3. Elisp hyperlinks") eepitch (find-eev-quick-intro "6. Controlling shell-like programs") eepitch-kill (find-eev-quick-intro "6. Controlling shell-like programs") eepitch-shell (find-eev-quick-intro "6. Controlling shell-like programs") eepitch-lua51 (find-eev-quick-intro "6. Controlling shell-like programs") eepitch (find-eepitch-intro "2.3. `eepitch'") eepitch-kill (find-eepitch-intro "2.2. `(eepitch-kill)'") code-c-d (find-eev-quick-intro "9. Shorter hyperlinks") find-xpdfpage (find-eev-quick-intro "9.3. Hyperlinks to PDF files") find-pdf-page (find-pdf-like-intro "4. Hyperlinks to pages of PDF files") find-pdf-text (find-pdf-like-intro "4. Hyperlinks to pages of PDF files") code-pdf-page (find-pdf-like-intro "7. Shorter hyperlinks to PDF files") code-pdf-text (find-pdf-like-intro "7. Shorter hyperlinks to PDF files") code-audio (find-audiovideo-intro "4. Short hyperlinks to audio and video files") code-video (find-audiovideo-intro "4. Short hyperlinks to audio and video files") ]] -- «code_helponly-tests» (to ".code_helponly-tests") -- --[==[ * (eepitch-lua51) * (eepitch-kill) * (eepitch-lua51) dofile "elispwt.lua" bigstr = [[# (find-man)]] = (SexpIntervals.htmlizeline(bigstr)) --]==] --[==[ * (eepitch-lua51) * (eepitch-kill) * (eepitch-lua51) dofile "elispwt.lua" bigstr = [[# (find-LATEX "2021haskell.tex" "title")]] = SexpIntervals.htmlizeline(bigstr) code_c_d_angg("LATEX", "LATEX/") = SexpIntervals.htmlizeline(bigstr) si = SexpIntervals.fromline(bigstr) = si = si:applyhead() = si:linehtml() * (eepitch-lua51) * (eepitch-kill) * (eepitch-lua51) code_c_d_angg("LATEX", "LATEX/") bigstr = [[# (find-LATEX "2021haskell.tex" "title")]] = si.head PPV(si) sh = _SH[si.head] = sh = sh.head = sh.help = sh.help:url() = sh:f(si) = si PPV(si) PPV(si.tintervals) = si:linehtml() = _SH = _SH["find-LATEX"] PPV(_SH["find-LATEX"]) = _SH["find-LATEX"].help = _SH["find-LATEX"].help:url() --]==] use_new_htmlizeline = function () -- -- (find-blogme3 "escripts.lua" ".htmlizelines") -- (find-blogme3 "escripts.lua" ".htmlizeline") -- SpecialT = UrlT + AnchorT + SexpLinkT * Eol -- SpecialT = UrlT + AnchorT + PipeAmpT + PipeSnarfDirT + HereDocT + SexpLinkT * Eol SpecialT = UrlT + AnchorT + PipeAmpT + PipeSnarfDirT + HereDocT EtcChar = 1 - lpeg.S "\n" EtcSpecial = Pos * lpeg.P { [1] = Pos * SpecialT + EtcChar * lpeg.V(1) } EtcSpecials = EtcSpecial^0 EtcSpecialsEtc = EtcSpecials * Pos * EtcChar^0 * Pos -- htmlizelineleft = function (str) return lpeg.match(lpeg.Ct(EtcSpecialsEtc) / sbeconcat(str, Q), str) end -- SexpIntervals.__index.hzleft = function (si, str) return htmlizelineleft(str) end SexpIntervals.__index.hztext = function (si, str) return Q(str) end SexpIntervals.__index.hzhref = function (si, str) return Q(str) end -- htmlizeline = function (str) return SexpIntervals.htmlizeline(str) end -- end -- Local Variables: -- coding: utf-8-unix -- End: