diff options
Diffstat (limited to 'manual/2html')
| -rwxr-xr-x | manual/2html | 518 |
1 files changed, 518 insertions, 0 deletions
diff --git a/manual/2html b/manual/2html new file mode 100755 index 00000000..6a6740fb --- /dev/null +++ b/manual/2html | |||
| @@ -0,0 +1,518 @@ | |||
| 1 | #!/usr/bin/env lua5.2 | ||
| 2 | |||
| 3 | |||
| 4 | -- special marks: | ||
| 5 | -- \1 - paragraph (empty line) | ||
| 6 | -- \4 - remove spaces around it | ||
| 7 | -- \3 - ref (followed by label|) | ||
| 8 | |||
| 9 | --------------------------------------------------------------- | ||
| 10 | header = [[ | ||
| 11 | <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> | ||
| 12 | <html> | ||
| 13 | |||
| 14 | <head> | ||
| 15 | <title>Lua 5.3 Reference Manual</title> | ||
| 16 | <meta http-equiv="Content-Type" content="text/html;charset=utf-8"> | ||
| 17 | <link rel="stylesheet" href="lua.css"> | ||
| 18 | <link rel="stylesheet" href="manual.css"> | ||
| 19 | </head> | ||
| 20 | |||
| 21 | <body bgcolor="#FFFFFF"> | ||
| 22 | |||
| 23 | <hr> | ||
| 24 | <h1> | ||
| 25 | <a href="http://www.lua.org/home.html"><img src="logo.gif" alt="[Lua logo]" border="0"></a> | ||
| 26 | Lua 5.3 Reference Manual | ||
| 27 | </h1> | ||
| 28 | |||
| 29 | by Roberto Ierusalimschy, Luiz Henrique de Figueiredo, Waldemar Celes | ||
| 30 | <p> | ||
| 31 | <small> | ||
| 32 | <a href="http://www.lua.org/copyright.html">Copyright</a> | ||
| 33 | © 2015 Lua.org, PUC-Rio. All rights reserved. | ||
| 34 | </small> | ||
| 35 | <hr> | ||
| 36 | |||
| 37 | <!-- ====================================================================== --> | ||
| 38 | <p> | ||
| 39 | |||
| 40 | ]] | ||
| 41 | |||
| 42 | footer = "\n\n</body></html>\n\n" | ||
| 43 | |||
| 44 | local seefmt = '(see %s)' | ||
| 45 | |||
| 46 | if arg[1] == 'port' then | ||
| 47 | seefmt = '(ver %s)' | ||
| 48 | header = string.gsub(header, "by (.-)\n", | ||
| 49 | "%1\n<p>Tradução: Sérgio Queiroz de Medeiros", 1) | ||
| 50 | header = string.gsub(header, "Lua (%d+.%d+) Reference Manual", | ||
| 51 | "Manual de Referência de Lua %1") | ||
| 52 | header = string.gsub(header, "All rights reserved", | ||
| 53 | "Todos os direitos reservados") | ||
| 54 | end | ||
| 55 | |||
| 56 | |||
| 57 | --------------------------------------------------------------- | ||
| 58 | |||
| 59 | local function compose (f,g) | ||
| 60 | assert(f and g) | ||
| 61 | return function (s) return g(f(s)) end | ||
| 62 | end | ||
| 63 | |||
| 64 | local function concat (f, g) | ||
| 65 | assert(f and g) | ||
| 66 | return function (s) return f(s) .. g(s) end | ||
| 67 | end | ||
| 68 | |||
| 69 | |||
| 70 | local Tag = {} | ||
| 71 | |||
| 72 | |||
| 73 | setmetatable(Tag, { | ||
| 74 | __index = function (t, tag) | ||
| 75 | local v = function (n, att) | ||
| 76 | local e = "" | ||
| 77 | if type(att) == "table" then | ||
| 78 | for k,v in pairs(att) do e = string.format('%s %s="%s"', e, k, v) end | ||
| 79 | end | ||
| 80 | if n then | ||
| 81 | return string.format("<%s%s>%s</%s>", tag, e, n, tag) | ||
| 82 | else | ||
| 83 | return string.format("<%s%s>", tag, e) | ||
| 84 | end | ||
| 85 | end | ||
| 86 | t[tag] = v | ||
| 87 | return v | ||
| 88 | end | ||
| 89 | }) | ||
| 90 | |||
| 91 | |||
| 92 | |||
| 93 | --------------------------------------------------------------- | ||
| 94 | local labels = {} | ||
| 95 | |||
| 96 | |||
| 97 | local function anchor (text, label, link, textlink) | ||
| 98 | if labels[label] then | ||
| 99 | error("label " .. label .. " already defined") | ||
| 100 | end | ||
| 101 | labels[label] = {text = textlink, link = link} | ||
| 102 | return Tag.a(text, {name=link}) | ||
| 103 | end | ||
| 104 | |||
| 105 | local function makeref (label) | ||
| 106 | assert(not string.find(label, "|")) | ||
| 107 | return string.format("\3%s\3", label) | ||
| 108 | end | ||
| 109 | |||
| 110 | local function ref (label) | ||
| 111 | local l = labels[label] | ||
| 112 | if not l then | ||
| 113 | io.stderr:write("label ", label, " undefined\n") | ||
| 114 | return "@@@@@@@" | ||
| 115 | else | ||
| 116 | return Tag.a(l.text, {href="#"..l.link}) | ||
| 117 | end | ||
| 118 | end | ||
| 119 | |||
| 120 | --------------------------------------------------------------- | ||
| 121 | local function nopara (t) | ||
| 122 | t = string.gsub(t, "\1", "\n\n") | ||
| 123 | t = string.gsub(t, "<p>%s*</p>", "") | ||
| 124 | return t | ||
| 125 | end | ||
| 126 | |||
| 127 | local function fixpara (t) | ||
| 128 | t = string.gsub(t, "\1", "\n</p>\n\n<p>\n") | ||
| 129 | t = string.gsub(t, "<p>%s*</p>", "") | ||
| 130 | return t | ||
| 131 | end | ||
| 132 | |||
| 133 | local function antipara (t) | ||
| 134 | return "</p>\n" .. t .. "<p>" | ||
| 135 | end | ||
| 136 | |||
| 137 | |||
| 138 | Tag.pre = compose(Tag.pre, antipara) | ||
| 139 | Tag.ul = compose(Tag.ul, antipara) | ||
| 140 | |||
| 141 | --------------------------------------------------------------- | ||
| 142 | local Gfoots = 0 | ||
| 143 | local footnotes = {} | ||
| 144 | |||
| 145 | local line = Tag.hr(nil) | ||
| 146 | |||
| 147 | local function dischargefoots () | ||
| 148 | if #footnotes == 0 then return "" end | ||
| 149 | local fn = table.concat(footnotes) | ||
| 150 | footnotes = {} | ||
| 151 | return line .. Tag.h3"footnotes:" .. fn .. line | ||
| 152 | end | ||
| 153 | |||
| 154 | |||
| 155 | local Glists = 0 | ||
| 156 | local listings = {} | ||
| 157 | |||
| 158 | local function dischargelist () | ||
| 159 | if #listings == 0 then return "" end | ||
| 160 | local l = listings | ||
| 161 | listings = {} | ||
| 162 | return line .. table.concat(l, line..line) .. line | ||
| 163 | end | ||
| 164 | |||
| 165 | --------------------------------------------------------------- | ||
| 166 | local counters = { | ||
| 167 | h1 = {val = 1}, | ||
| 168 | h2 = {father = "h1", val = 1}, | ||
| 169 | h3 = {father = "h2", val = 1}, | ||
| 170 | listing = {father = "h1", val = 1}, | ||
| 171 | } | ||
| 172 | |||
| 173 | local function inccounter (count) | ||
| 174 | counters[count].val = counters[count].val + 1 | ||
| 175 | for c, v in pairs(counters) do | ||
| 176 | if v.father == count then v.val = 1 end | ||
| 177 | end | ||
| 178 | end | ||
| 179 | |||
| 180 | local function getcounter (count) | ||
| 181 | local c = counters[count] | ||
| 182 | if c.father then | ||
| 183 | return getcounter(c.father) .. "." .. c.val | ||
| 184 | else | ||
| 185 | return c.val .. "" | ||
| 186 | end | ||
| 187 | end | ||
| 188 | --------------------------------------------------------------- | ||
| 189 | |||
| 190 | |||
| 191 | local function fixed (x) | ||
| 192 | return function () return x end | ||
| 193 | end | ||
| 194 | |||
| 195 | local function id (x) return x end | ||
| 196 | |||
| 197 | |||
| 198 | local function prepos (x, y) | ||
| 199 | assert(x and y) | ||
| 200 | return function (s) return string.format("%s%s%s", x, s, y) end | ||
| 201 | end | ||
| 202 | |||
| 203 | |||
| 204 | local rw = Tag.b | ||
| 205 | |||
| 206 | |||
| 207 | |||
| 208 | |||
| 209 | local function LuaName (name) | ||
| 210 | return Tag.code(name) | ||
| 211 | end | ||
| 212 | |||
| 213 | |||
| 214 | local function getparam (s) | ||
| 215 | local i, e = string.find(s, "^[^%s@|]+|") | ||
| 216 | if not i then return nil, s | ||
| 217 | else return string.sub(s, i, e - 1), string.sub(s, e + 1) | ||
| 218 | end | ||
| 219 | end | ||
| 220 | |||
| 221 | |||
| 222 | local function gettitle (h) | ||
| 223 | local title, p = assert(string.match(h, "<title>(.-)</title>()")) | ||
| 224 | return title, string.sub(h, p) | ||
| 225 | end | ||
| 226 | |||
| 227 | local function getparamtitle (what, h, nonum) | ||
| 228 | local label, title, c, count | ||
| 229 | label, h = getparam(h) | ||
| 230 | title, h = gettitle(h) | ||
| 231 | if not nonum then | ||
| 232 | count = getcounter(what) | ||
| 233 | inccounter(what) | ||
| 234 | c = string.format("%s – ", count) | ||
| 235 | else | ||
| 236 | c = "" | ||
| 237 | end | ||
| 238 | label = label or count | ||
| 239 | if label then | ||
| 240 | title = anchor(title, label, count, "§"..count) | ||
| 241 | end | ||
| 242 | title = string.format("%s%s", c, title) | ||
| 243 | return title, h | ||
| 244 | end | ||
| 245 | |||
| 246 | local function section (what, nonum) | ||
| 247 | return function (h) | ||
| 248 | local title | ||
| 249 | title, h = getparamtitle(what, h, nonum) | ||
| 250 | local fn = what == "h1" and dischargefoots() or "" | ||
| 251 | h = fixpara(Tag.p(h)) | ||
| 252 | return "</p>\n" .. Tag[what](title) .. h .. fn .. | ||
| 253 | dischargelist() .. "<p>" | ||
| 254 | end | ||
| 255 | end | ||
| 256 | |||
| 257 | |||
| 258 | local function verbatim (s) | ||
| 259 | s = nopara(s) | ||
| 260 | s = string.gsub(s, "\n", "\n ") | ||
| 261 | s = string.gsub(s, "\n%s*$", "\n") | ||
| 262 | return Tag.pre(s) | ||
| 263 | end | ||
| 264 | |||
| 265 | |||
| 266 | local function verb (s) | ||
| 267 | return Tag.code(s) | ||
| 268 | end | ||
| 269 | |||
| 270 | |||
| 271 | local function lua2link (e) | ||
| 272 | return string.find(e, "luaL?_") and e or "pdf-"..e | ||
| 273 | end | ||
| 274 | |||
| 275 | |||
| 276 | local verbfixed = verb | ||
| 277 | |||
| 278 | |||
| 279 | local Tex = { | ||
| 280 | |||
| 281 | ANSI = function (func) | ||
| 282 | return "ISO C function " .. Tag.code(func) | ||
| 283 | end, | ||
| 284 | At = fixed"@", | ||
| 285 | B = Tag.b, | ||
| 286 | bigskip = fixed"", | ||
| 287 | bignum = id, | ||
| 288 | C = fixed"", | ||
| 289 | Ci = prepos("<!-- ", " -->"), | ||
| 290 | CId = function (func) | ||
| 291 | return "C function " .. Tag.code(func) | ||
| 292 | end, | ||
| 293 | chapter = section"h1", | ||
| 294 | Char = compose(verbfixed, prepos("'", "'")), | ||
| 295 | Cdots = fixed"···", | ||
| 296 | Close = fixed"}", | ||
| 297 | col = Tag.td, | ||
| 298 | defid = function (name) | ||
| 299 | local l = lua2link(name) | ||
| 300 | local c = Tag.code(name) | ||
| 301 | return anchor(c, l, l, c) | ||
| 302 | end, | ||
| 303 | def = Tag.em, | ||
| 304 | description = compose(nopara, Tag.ul), | ||
| 305 | Em = fixed("\4" .. "—" .. "\4"), | ||
| 306 | emph = Tag.em, | ||
| 307 | emphx = Tag.em, -- emphasis plus index (if there was an index) | ||
| 308 | En = fixed("–"), | ||
| 309 | format = fixed"", | ||
| 310 | ["false"] = fixed(Tag.b"false"), | ||
| 311 | id = Tag.code, | ||
| 312 | idx = Tag.code, | ||
| 313 | index = fixed"", | ||
| 314 | Lidx = fixed"", -- Tag.code, | ||
| 315 | ldots = fixed"...", | ||
| 316 | x = id, | ||
| 317 | itemize = compose(nopara, Tag.ul), | ||
| 318 | leq = fixed"≤", | ||
| 319 | Lid = function (s) | ||
| 320 | return makeref(lua2link(s)) | ||
| 321 | end, | ||
| 322 | M = Tag.em, | ||
| 323 | N = function (s) return (string.gsub(s, " ", " ")) end, | ||
| 324 | NE = id, -- tag"foreignphrase", | ||
| 325 | num = id, | ||
| 326 | ["nil"] = fixed(Tag.b"nil"), | ||
| 327 | Open = fixed"{", | ||
| 328 | part = section("h1", true), | ||
| 329 | Pat = compose(verbfixed, prepos("'", "'")), | ||
| 330 | preface = section("h1", true), | ||
| 331 | psect = section("h2", true), | ||
| 332 | Q = prepos('"', '"'), | ||
| 333 | refchp = makeref, | ||
| 334 | refcode = makeref, | ||
| 335 | refsec = makeref, | ||
| 336 | |||
| 337 | pi = fixed"π", | ||
| 338 | rep = Tag.em, -- compose(prepos("<", ">"), Tag.em), | ||
| 339 | Rw = rw, | ||
| 340 | rw = rw, | ||
| 341 | sb = Tag.sub, | ||
| 342 | sp = Tag.sup, | ||
| 343 | St = compose(verbfixed, prepos('"', '"')), | ||
| 344 | sect1 = section"h1", | ||
| 345 | sect2 = section"h2", | ||
| 346 | sect3 = section"h3", | ||
| 347 | sect4 = section("h4", true), | ||
| 348 | simplesect = id, | ||
| 349 | Tab2 = function (s) return Tag.table(s, {border=1}) end, | ||
| 350 | row = Tag.tr, | ||
| 351 | title = Tag.title, | ||
| 352 | todo = Tag.todo, | ||
| 353 | ["true"] = fixed(Tag.b"true"), | ||
| 354 | T = verb, | ||
| 355 | |||
| 356 | item = function (s) | ||
| 357 | local t, p = string.match(s, "^([^\n|]+)|()") | ||
| 358 | if t then | ||
| 359 | s = string.sub(s, p) | ||
| 360 | s = Tag.b(t..": ") .. s | ||
| 361 | end | ||
| 362 | return Tag.li(fixpara(s)) | ||
| 363 | end, | ||
| 364 | |||
| 365 | verbatim = verbatim, | ||
| 366 | |||
| 367 | manual = id, | ||
| 368 | |||
| 369 | |||
| 370 | -- for the manual | ||
| 371 | |||
| 372 | link =function (s) | ||
| 373 | local l, t = getparam(s) | ||
| 374 | assert(l) | ||
| 375 | return string.format("%s (%s)", t, makeref(l)) | ||
| 376 | end, | ||
| 377 | |||
| 378 | see = function (s) return string.format(seefmt, makeref(s)) end, | ||
| 379 | See = makeref, | ||
| 380 | seeC = function (s) | ||
| 381 | return string.format(seefmt, makeref(s)) | ||
| 382 | end, | ||
| 383 | |||
| 384 | seeF = function (s) | ||
| 385 | return string.format(seefmt, makeref(lua2link(s))) | ||
| 386 | end, | ||
| 387 | |||
| 388 | APIEntry = function (e) | ||
| 389 | local h, name | ||
| 390 | h, e = string.match(e, "^%s*(.-)%s*|(.*)$") | ||
| 391 | name = string.match(h, "(luaL?_[%w_]+)%)? +%(") or | ||
| 392 | string.match(h, "luaL?_[%w_]+") | ||
| 393 | local a = anchor(Tag.code(name), name, name, Tag.code(name)) | ||
| 394 | local apiicmd, ne = string.match(e, "^(.-</span>)(.*)") | ||
| 395 | --io.stderr:write(e) | ||
| 396 | if not apiicmd then | ||
| 397 | return antipara(Tag.hr() .. Tag.h3(a)) .. Tag.pre(h) .. e | ||
| 398 | else | ||
| 399 | return antipara(Tag.hr() .. Tag.h3(a)) .. apiicmd .. Tag.pre(h) .. ne | ||
| 400 | end | ||
| 401 | end, | ||
| 402 | |||
| 403 | LibEntry = function (e) | ||
| 404 | local h, name | ||
| 405 | h, e = string.match(e, "^(.-)|(.*)$") | ||
| 406 | name = string.gsub(h, " (.+", "") | ||
| 407 | local l = lua2link(name) | ||
| 408 | local a = anchor(Tag.code(h), l, l, Tag.code(name)) | ||
| 409 | return Tag.hr() .. Tag.h3(a) .. e | ||
| 410 | end, | ||
| 411 | |||
| 412 | Produc = compose(nopara, Tag.pre), | ||
| 413 | producname = prepos("\t", " ::= "), | ||
| 414 | Or = fixed" | ", | ||
| 415 | VerBar = fixed"|", -- vertical bar | ||
| 416 | OrNL = fixed" | \4", | ||
| 417 | bnfNter = prepos("", ""), | ||
| 418 | bnfopt = prepos("[", "]"), | ||
| 419 | bnfrep = prepos("{", "}"), | ||
| 420 | bnfter = compose(Tag.b, prepos("‘", "’")), | ||
| 421 | producbody = function (s) | ||
| 422 | s = string.gsub(s, "%s+", " ") | ||
| 423 | s = string.gsub(s, "\4", "\n\t\t") | ||
| 424 | return s | ||
| 425 | end, | ||
| 426 | |||
| 427 | apii = function (s) | ||
| 428 | local pop,push,err = string.match(s, "^(.-),(.-),(.*)$") | ||
| 429 | if pop ~= "?" and string.find(pop, "%W") then | ||
| 430 | pop = "(" .. pop .. ")" | ||
| 431 | end | ||
| 432 | if push ~= "?" and string.find(push, "%W") then | ||
| 433 | push = "(" .. push .. ")" | ||
| 434 | end | ||
| 435 | err = (err == "-") and "–" or Tag.em(err) | ||
| 436 | return Tag.span( | ||
| 437 | string.format("[-%s, +%s, %s]", pop, push, err), | ||
| 438 | {class="apii"} | ||
| 439 | ) | ||
| 440 | end, | ||
| 441 | } | ||
| 442 | |||
| 443 | local others = prepos("?? "," ??") | ||
| 444 | |||
| 445 | local function trata (t) | ||
| 446 | t = string.gsub(t, "@(%w+)(%b{})", function (w, f) | ||
| 447 | f = trata(string.sub(f, 2, -2)) | ||
| 448 | if type(Tex[w]) ~= "function" then | ||
| 449 | io.stderr:write(w .. "\n") | ||
| 450 | return others(f) | ||
| 451 | else | ||
| 452 | return Tex[w](f, w) | ||
| 453 | end | ||
| 454 | end) | ||
| 455 | return t | ||
| 456 | end | ||
| 457 | |||
| 458 | |||
| 459 | --------------------------------------------------------------------- | ||
| 460 | --------------------------------------------------------------------- | ||
| 461 | |||
| 462 | -- read whole book | ||
| 463 | t = io.read"*a" | ||
| 464 | |||
| 465 | t = string.gsub(t, "[<>&\128-\255]", | ||
| 466 | {["<"] = "<", | ||
| 467 | [">"] = ">", | ||
| 468 | ["&"] = "&", | ||
| 469 | ["\170"] = "ª", | ||
| 470 | ["\186"] = "º", | ||
| 471 | ["\192"] = "À", | ||
| 472 | ["\193"] = "Á", | ||
| 473 | ["\194"] = "Â", | ||
| 474 | ["\195"] = "Ã", | ||
| 475 | ["\199"] = "Ç", | ||
| 476 | ["\201"] = "É", | ||
| 477 | ["\202"] = "Ê", | ||
| 478 | ["\205"] = "Í", | ||
| 479 | ["\211"] = "Ó", | ||
| 480 | ["\212"] = "Ô", | ||
| 481 | ["\218"] = "Ú", | ||
| 482 | ["\224"] = "à", | ||
| 483 | ["\225"] = "á", | ||
| 484 | ["\226"] = "â", | ||
| 485 | ["\227"] = "ã", | ||
| 486 | ["\231"] = "ç", | ||
| 487 | ["\233"] = "é", | ||
| 488 | ["\234"] = "ê", | ||
| 489 | ["\237"] = "í", | ||
| 490 | ["\243"] = "ó", | ||
| 491 | ["\244"] = "ô", | ||
| 492 | ["\245"] = "õ", | ||
| 493 | ["\250"] = "ú", | ||
| 494 | ["\252"] = "ü" | ||
| 495 | }) | ||
| 496 | |||
| 497 | t = string.gsub(t, "\n\n+", "\1") | ||
| 498 | |||
| 499 | |||
| 500 | |||
| 501 | -- complete macros with no arguments | ||
| 502 | t = string.gsub(t, "(@%w+)([^{%w])", "%1{}%2") | ||
| 503 | |||
| 504 | t = trata(t) | ||
| 505 | |||
| 506 | -- correct references | ||
| 507 | t = string.gsub(t, "\3(.-)\3", ref) | ||
| 508 | |||
| 509 | -- remove extra space (??) | ||
| 510 | t = string.gsub(t, "%s*\4%s*", "") | ||
| 511 | |||
| 512 | t = nopara(t) | ||
| 513 | |||
| 514 | -- HTML 3.2 does not need </p> (but complains when it is in wrong places :) | ||
| 515 | t = string.gsub(t, "</p>", "") | ||
| 516 | |||
| 517 | io.write(header, t, footer) | ||
| 518 | |||
