Warning: this is an htmlized version!
The original is here, and
the conversion rules are here.
-- This file:
--   http://anggtwu.net/LUA/Caepro4.lua.html
--   http://anggtwu.net/LUA/Caepro4.lua
--          (find-angg "LUA/Caepro4.lua")
-- Author: Eduardo Ochs <eduardoochs@gmail.com>
--
-- (defun e () (interactive) (find-angg "LUA/Caepro4.lua"))
--
-- (defun c1 () (interactive) (find-angg "LUA/Caepro1.lua"))
-- (defun c2 () (interactive) (find-angg "LUA/Caepro2.lua"))
-- (defun c3 () (interactive) (find-angg "LUA/Caepro3.lua"))
-- (defun c4 () (interactive) (find-angg "LUA/Caepro4.lua"))
--
-- (defun g2 () (interactive) (find-angg "LUA/Gram2.lua"))
-- (defun g3 () (interactive) (find-angg "LUA/Gram3.lua"))
--
-- (find-Deps1-links "Caepro4")
-- (find-Deps1-cps   "Caepro4")
-- (find-Deps1-anggs "Caepro4")

-- «.MkTable»		(to "MkTable")
-- «.MkTable-tests»	(to "MkTable-tests")
-- «.AnyOf»		(to "AnyOf")
-- «.AnyOf-tests»	(to "AnyOf-tests")
-- «.anyofs»		(to "anyofs")
-- «.anyofs-tests»	(to "anyofs-tests")
-- «.gram»		(to "gram")
-- «.gram-tests»	(to "gram-tests")
-- «.Abbrev»		(to "Abbrev")
-- «.Abbrev-tests»	(to "Abbrev-tests")
-- «.LaTeX»		(to "LaTeX")
-- «.LaTeX-tests»	(to "LaTeX-tests")
-- «.run_options»	(to "run_options")
-- «.run_options-tests»	(to "run_options-tests")

-- require "Gram2"   -- (find-angg "LUA/Gram2.lua")
require "ELpeg1"     -- (find-angg "LUA/ELpeg1.lua")

lpeg.ptmatch = function (pat, str) PP(pat:Ct():match(str)) end
lpeg.Copyto  = function (pat, tag) return pat:Cg(tag) * Cb(tag) end



--  __  __ _    _____     _     _      
-- |  \/  | | _|_   _|_ _| |__ | | ___ 
-- | |\/| | |/ / | |/ _` | '_ \| |/ _ \
-- | |  | |   <  | | (_| | |_) | |  __/
-- |_|  |_|_|\_\ |_|\__,_|_.__/|_|\___|
--                                     
-- «MkTable»  (to ".MkTable")
-- Superseded by: (find-angg "LUA/AnyOf1.lua" "MkTable")

MkTable = Class {
  type = "MkTable",
  from = function (bigstr, tag)
      local mkt = MkTable {bigstr=bigstr, tag=tag, _=VTable{}}
      for k,v in mkt:kvs() do mkt._[k] = v end
      return mkt
    end,
  __tostring = function (mkt) return mkt.bigstr end,
  __index = {
    pat = "(%S+) +%-> +(%S+)",
    kvs = function (mkt)   return mkt.bigstr:gmatch(mkt.pat) end,
    v   = function (mkt,k) return mkt._[k] end,
  },
}

mktable = function (bigstr) return MkTable.from(bigstr)._ end

-- «MkTable-tests»  (to ".MkTable-tests")
--[==[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Caepro4.lua"
bigstr = [[
  foobar  -> OOBAR    (Comment)
  foo     -> OO
  foob    -> OOB
]]
mkt = MkTable.from(bigstr)
= mkt
= mkt:v("foo")
= mkt._
  for k,v in mkt:kvs() do print(k,v) end

--]==]


--     _                 ___   __ 
--    / \   _ __  _   _ / _ \ / _|
--   / _ \ | '_ \| | | | | | | |_ 
--  / ___ \| | | | |_| | |_| |  _|
-- /_/   \_\_| |_|\__, |\___/|_|  
--                |___/           
--
-- «AnyOf»  (to ".AnyOf")
-- See: (find-angg "LUA/Gram2.lua" "anyof")

AnyOf = Class {
  type = "AnyOf",
  from = function (bigstr, tag, tag2, default)
      local mt = MkTable.from(bigstr)
      return AnyOf {mt=mt, tag=tag, tag2=tag2, default=default}
    end,
  __tostring = function (mtp) return mtp.mt.bigstr end,
  __index = {
    kvs = function (mtp)    return mtp.mt:kvs() end,
    v   = function (mtp, k) return mtp.mt:v(k)  end,
    pat = function (mtp)
        local p = P(false)
        for k,v in mtp:kvs() do p = p + Cs(k) end
        if mtp.default then p = p + Cc(mtp.default) end
     -- if mtp.tag     then p = p:Cg(mtp.tag) * Cb(mtp.tag) end
        if mtp.tag     then p = p:Copyto(mtp.tag) end
        if mtp.tag2    then p = p * (Cb(mtp.tag) / mtp.mt._):Cg(mtp.tag2) end
        return p
      end,
  },
}

-- «AnyOf-tests»  (to ".AnyOf-tests")
--[==[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Caepro4.lua"
bigstr = [[
  a -> AA
  b -> BB
  c -> CC
]]
  mtp = AnyOf.from(bigstr, "x", "xx", "b")
= mtp
  PPPV(mtp)
s = Cs"_"
p = mtp:pat()
(s * p * s):ptmatch("_a_")
(s * p * s):ptmatch("__")
(s * p * s):ptmatch("_d_")

--]==]



--                           __     
--   __ _ _ __  _   _  ___  / _|___ 
--  / _` | '_ \| | | |/ _ \| |_/ __|
-- | (_| | | | | |_| | (_) |  _\__ \
--  \__,_|_| |_|\__, |\___/|_| |___/
--              |___/               
--
-- «anyofs»  (to ".anyofs")

sems = AnyOf.from([[
    x -> 2019.1   y -> 2019.2
    a -> 2020.1   b -> 2020.2
    c -> 2021.1   d -> 2021.2
    e -> 2022.1   f -> 2022.2
    g -> 2023.1
  ]], "sem", "yyyy.s")

Ms = AnyOf.from([[
    2 -> C2   3 -> C3   4 -> C4
    5 -> ES   6 -> GA   7 -> LA
  ]], "M", "MM")

quadros = mktable [[
    2x -> 2019.1-C2/2019.1-C2.pdf   3x -> 2019.1-C3/2019.1-C3.pdf
    2y -> 2019.2-C2/2019.2-C2.pdf   3y -> 2019.2-C3/2019.2-C3.pdf
    2e -> 2022.1-C2/C2-quadros.pdf  3e -> 2022.1-C3/C3-quadros.pdf
    2f -> 2022.2-C2/C2-quadros.pdf  3f -> 2022.2-C3/C3-quadros.pdf
    2g -> 2023.1-C2/C2-quadros.pdf
    4g -> 2023.1-C4/C4-quadros.pdf
    5g -> 2023.1-ES/ES-quadros.pdf
    6g -> 2023.1-GA/GA-quadros.pdf
    7g -> 2023.1-LA/LA-quadros.pdf
  ]]

otherHtmls = AnyOf.from([[
                (find-TH "2023-caepro")

    Issomuda  -> 2023-caepro0
    SobreaVR  -> 2023-caepro-VR
    Oquesobra -> 2023-caepro-o-que-sobra
    Visaud    -> 2023-visual-vs-auditivo
    Slogans   -> 2023-precisamos-de-mais-slogans

    Sapt      -> 2021aulas-por-telegram
    Somas     -> 2021-1-C2-somas-1-dicas
    Cabos     -> 2021-2-c3-cabos-na-diagonal
    AprC2     -> 2022-apresentacao-sobre-C2
    CalcEasy  -> mathologer-calculus-easy

    Omnisys   -> omnisys

  ]], "short", "htmlstem")

anggPdfs = AnyOf.from([[
    Mpg     -> LATEX/material-para-GA
    ZHAs    -> LATEX/2017planar-has-1
    La2018  -> LATEX/2018-1-LA-material
    La2018Q -> 2018.1-LA/2018.1-LA
    Rosiak  -> tmp/rosiak__sheaf_theory_through_examples
    Missing -> LATEX/2022on-the-missing

    Bort3   -> 2019.2-C3/Bortolossi/bortolossi-cap-3
    Bort4   -> 2019.2-C3/Bortolossi/bortolossi-cap-4
    Bort5   -> 2019.2-C3/Bortolossi/bortolossi-cap-5
    Bort6   -> 2019.2-C3/Bortolossi/bortolossi-cap-6
    Bort7   -> 2019.2-C3/Bortolossi/bortolossi-cap-7
    Bort8   -> 2019.2-C3/Bortolossi/bortolossi-cap-8
    Bort10  -> 2019.2-C3/Bortolossi/bortolossi-cap-10
    Bort11  -> 2019.2-C3/Bortolossi/bortolossi-cap-11
    Bort12  -> 2019.2-C3/Bortolossi/bortolossi-cap-12
    Es1     -> BE/2012.1-BE
    Es2     -> 2012.2-ES/2012.2-ES
    Es3     -> 2013.1-ES/2013.1-ES
    Es4     -> 2013.2-ES/2013.2-ES
    Leit1   -> tmp/leithold-pt-cap1
    Leit2   -> tmp/leithold-pt-cap2
    Leit3   -> tmp/leithold-pt-cap3
    Leit4   -> tmp/leithold-pt-cap4
    Leit5   -> tmp/leithold-pt-cap5
    Leit6   -> tmp/leithold-pt-cap6
    Leit7   -> tmp/leithold-pt-cap7
    Leit8   -> tmp/leithold-pt-cap8
    Leit9   -> tmp/leithold-pt-cap9
    LeitA   -> tmp/leithold-pt-apA
    LeitF   -> tmp/leithold-pt-apF
    Stew17  -> tmp/stewart7-cap17
    Stew16  -> tmp/stewart7-cap16
    Stew15  -> tmp/stewart7-cap15
    Stew14  -> tmp/stewart7-cap14
    Stew13  -> tmp/stewart7-cap13
    Stew12  -> tmp/stewart7-cap12
    Stew11  -> tmp/stewart7-cap11
    Stew10  -> tmp/stewart7-cap10
    Stew9   -> tmp/stewart7-cap9
    Stew8   -> tmp/stewart7-cap8
    Stew7   -> tmp/stewart7-cap7
    Stew6   -> tmp/stewart7-cap6
    Stew5   -> tmp/stewart7-cap5
    Stew4   -> tmp/stewart7-cap4
    Stew3   -> tmp/stewart7-cap3
    Stew2   -> tmp/stewart7-cap2
    Stew1   -> tmp/stewart7-cap1
    Stew0   -> tmp/stewart7-cap0
    Thomas55 -> 2020.2-C2/thomas_secoes_5.5_e_5.6
    Thomas56 -> 2020.2-C2/thomas_secoes_5.5_e_5.6
    Apexcap4  -> 2022.2-C3/APEX_Calculus_Version_4_cap_4
    Apexcap7  -> 2022.2-C3/APEX_Calculus_Version_4_cap_7
    Apexcap12 -> 2022.2-C3/APEX_Calculus_Version_4_cap_12
    RossA     -> 2022.1-C2/ross__elementary_analysis_secs_10_32_33_34

    DFcap7 -> 2023.1-GA/Apostila_GACV_caps_07-09
    DFES1  -> 2023.1-GA/delgado_frensel_nedir__GA_I
    DFES2  -> 2023.1-GA/delgado_frensel_nedir__GA_II
    VenturiGA -> 2023.1-GA/venturi__algebra_vetorial_e_geometria_analitica
    MB6    -> tmp/morettin_bussab__estatistica_basica_6a_ed
    Rrj    -> LATEX/2021rrj

    MMM       -> tmp/carnielli_pizzi__modalities_and_multimodalities
    Chellas   -> tmp/chellas__modal_logic_an_introduction
    Hesseling -> tmp/hesseling__gnomes_in_the_fog_the_reception_of_brouwer_s_intuitionism_in_the_1920s
    ZillCullenInicio -> tmp/zill_cullen__equacoes_diferenciais__inicio
    NG -> tmp/nederpelt_geuvers__type_theory_and_formal_proof_an_introduction

    CaepDiff     -> LATEX/2023-caepro-hist
    CaepIssoMuda -> LATEX/2023-caepro
    CaepPlano    -> LATEX/2023-caepro-plano
    CaepVR       -> LATEX/2023-caepro-VR
    CaepColor    -> LATEX/2023-caepro-reclamacoes

  ]], "short", "pdfstem")

externalPdfs = AnyOf.from([[
    Miranda  -> http://hostel.ufabc.edu.br/~daniel.miranda/calculo/calculo.pdf
    Selinger -> https://www.mathstat.dal.ca/~selinger/papers/lambdanotes.pdf
    DiffyQs  -> https://www.jirka.org/diffyqs/diffyqs.pdf

  ]], "short", "pdfurl")

-- «anyofs-tests»  (to ".anyofs-tests")
--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Caepro4.lua"
sems        :pat():ptmatch("x")
Ms          :pat():ptmatch("5")
otherHtmls  :pat():ptmatch("Slogans01:23")
anggPdfs    :pat():ptmatch("Leit2")
externalPdfs:pat():ptmatch("Miranda")

--]]



--                            
--   __ _ _ __ __ _ _ __ ___  
--  / _` | '__/ _` | '_ ` _ \ 
-- | (_| | | | (_| | | | | | |
--  \__, |_|  \__,_|_| |_| |_|
--  |___/                     
--
-- «gram»  (to ".gram")

gr,V,VA,VE,PE  = Gram.new()

dottodash = function (s) return (s:gsub("%.", "-")) end
getquadro = function (M, sem) return quadros[M..sem] end
getquadro_pat = (Cb"M" * Cb"sem" / getquadro):Copyto"quadro"

V.N            = Cs(R"09"^1)
V.optN         = Cs(R"09"^1) + Cc("1")
V.optpN        = S"pP"^-1 * V.optN

V.M            = Ms:pat()
V.sem          = sems:pat() * (Cb"yyyy.s" / dottodash):Cg"yyyy-s"
V.optsem       = sems:pat() * (Cb"yyyy.s" / dottodash):Cg"yyyy-s"
V.turma        = Cs(S"cem"):Copyto"turma"
V.numpdf       = V.optN :Copyto"numpdf"
V.optpage      = V.optN :Copyto"page"
V.optppage     = V.optpN:Copyto"page"
V.anchor       = (P"#"^-1 * Cs(P(1)^1)) / function (str) return "#"..str end
V.optanchor    = (V.anchor + Cc""):Copyto"hanchor"


VA.Tudo        = V.M * V.optsem  * Cs("T") * V.optpage
VA.semPage     = V.M * V.optsem  * Cs("P") * V.optanchor
VA.quadros     = V.M * V.optsem  * Cs("Q") * V.optpage * getquadro_pat
VA.quadrosJpgs = V.M * V.optsem  * Cs("J") * V.optpage
VA.logPdfizado = V.M * V.optsem  * Cs("L") * V.numpdf * V.turma * V.optpage
VA.otherHtml   = otherHtmls:pat()   * V.optanchor
VA.anggPdf     = anggPdfs:pat()     * V.optppage
VA.externalPdf = externalPdfs:pat() * V.optppage

V.any          = V.Tudo        + V.semPage
               + V.quadros     + V.quadrosJpgs
               + V.logPdfizado + V.otherHtml
               + V.anggPdf     + V.externalPdf 

-- «gram-tests»  (to ".gram-tests")
--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Caepro4.lua"

= gr:cm ("Tudo", "2cT1")
  gr:cmp("Tudo", "2cT1")
  gr:cmp("Tudo", "2cT")
  gr:cmp("any",  "2eT4")
  gr:cmp("any",  "2xQ4")

= getquadro("2", "x")
(Cc"2":Cg"M" * Cc"x":Cg"Sem"):ptmatch("")
(Cc"2":Cg"M" * Cc"x":Cg"sem" * getquadro_pat):ptmatch("")
(Cc"2":Cg"M" * Cc"x":Cg"sem" * Cb"sem"):ptmatch("")

lpeg.pamatch = function (pat, str) PP(pat:Ct():match(str)) end

--]]


--     _    _     _                        
--    / \  | |__ | |__  _ __ _____   __
--   / _ \ | '_ \| '_ \| '__/ _ \ \ / /
--  / ___ \| |_) | |_) | | |  __/\ V /
-- /_/   \_\_.__/|_.__/|_|  \___| \_/
--                                         
-- «Abbrev»  (to ".Abbrev")

Abbrev = Class {
  type = "Abbrev",
  from = function (str)
      return Abbrev {str=str}
    end,
  sexp     = function (str) return Abbrev.from(str):psexp()    end,
  anggurl  = function (str) return Abbrev.from(str):panggurl() end,
  __index = {
    pat    = function (ab) return Abbrev.patc end,
    -- pat = function (ab) return gr:compile("any") end,
    print  = function (ab) print(ab.ast); print(); PPV(ab.ast); return ab end,
    subst  = function (ab, str)
        local f = function (s) return ab.ast[s] end
        return (str:gsub("<(.-)>", f))
      end,
    expand = function (ab)
        ab.ast    = ab:pat():match(ab.str)
        local ast = ab.ast
        ast.what  = ab.whats[ast[0]]
        ast.long  = ab:subst(ab.fmts[ast[0]])
        ast.hpage = ast.page and (ast.page == "" and "" or "#page="..ast.page)
        ast.sexp  = ab:subst(ab.sexps[ast.what])
        ast.anggurl = ab:subst(ab.anggurls[ast.what])
        return ab
      end,
    --
    -- Protected calls:
    pexpand  = function (ab) pcall(function () ab:expand() end); return ab end,
    past     = function (ab) return ab:pexpand().ast or {} end,
    psexp    = function (ab) return (ab:past() or {}).sexp    end,
    panggurl = function (ab) return (ab:past() or {}).anggurl end,
    --
    whats = mktable [[
        Tudo        -> pdf
        semPage     -> html
        logPdfizado -> pdf
        otherHtml   -> html
        anggPdf     -> pdf
        externalPdf -> externalpdf
        quadros     -> pdf
      ]],
    fmts = mktable [[
        Tudo        -> LATEX/<yyyy-s>-<MM>-tudo.pdf
        semPage     -> <yyyy.s>-<MM>.html
        logPdfizado -> logs-pdfizados/<M><sem>L<numpdf><turma>.pdf
        otherHtml   -> <htmlstem>.html<hanchor>
        anggPdf     -> <pdfstem>.pdf
        externalPdf -> <pdfurl>
        quadros     -> <quadro>
      ]],
    sexps = {
        html        = '(brg "file:///home/edrx/TH/L/<long>")',
        pdf         = '(find-pdf-page "~/<long>" <page>)',
        externalpdf = '(find-pdf-page (ee-url-to-fname "<long>") <page>)',
      },
    anggurls = {
        html        = 'http://anggtwu.net/<long>',
        pdf         = 'http://anggtwu.net/<long><hpage>',
        externalpdf = '<long><hpage>',
      },
  },
}

Abbrev.patc = gr:compile("any")

-- «Abbrev-tests»  (to ".Abbrev-tests")
--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Caepro4.lua"
test = function (str) print(Abbrev.sexp(str)); print(Abbrev.anggurl(str)) end
test = function (str) ab = Abbrev.from(str):pexpand():print() end
test "2eT"
test "2eT4"
test "Foo"
test "2eP"
test "2eP#foo"
test "2eQ4"
test "2aL1m4"
test "Slogans"
test "Slogans#01:23"
test "Bort7"
test "Bort7p22"
test "Miranda"
test "MirandaP22"
= Abbrev.sexp "MirandaP22"
= Abbrev.anggurl "MirandaP22"
run_options("-sexp", "MirandaP22")

-- falta quadrosjpgs

--]]




--  _         _____   __  __
-- | |    __ |_   _|__\ \/ /
-- | |   / _` || |/ _ \\  / 
-- | |__| (_| || |  __//  \ 
-- |_____\__,_||_|\___/_/\_\
--                          
-- «LaTeX»  (to ".LaTeX")
-- (find-LATEX "2023-1-C2-carro.tex" "defs-caepro")
--
Caurl = function (str)
    return (Abbrev.anggurl(str):gsub("#", "\\#"))
  end

-- «LaTeX-tests»  (to ".LaTeX-tests")
--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Caepro4.lua"
= Caurl "2eT3"

--]]




-- «run_options»  (to ".run_options")
-- (find-angg ".emacs" "caepro3")
--
run_options = function (a, b)
    if     a == nil        then return
    elseif a == "Caepro4"  then return
    elseif a == "-sexp"    then print(Abbrev.sexp(b))
    elseif a == "-anggurl" then print(Abbrev.anggurl(b))
    else PP("Bad options:", a, b)
    end
  end

run_options(...)

-- «run_options-tests»  (to ".run_options-tests")
--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Caepro4.lua"
run_options("-sexp", "2eT66")
run_options("-sexp", "Foo")
run_options("-sexp", "_2eT66")
run_options("-sexp", "Leit4")
run_options("-sexp", "Leit4p10")
run_options("-sexp", "7gQ")
run_options("-anggurl", "7gQ")

--]]














-- Local Variables:
-- coding:  utf-8-unix
-- End: