webmcp
annotate libraries/luatex/luatex.lua @ 2:72860d232f32
Version 1.0.2
Fixed bug with explicit garbage collection (requests > 256kB caused an error)
Views prefixed with an underscore can't be called externally
ui.paginate now displays the last page, if the selected page number is too high.
Fixed bug with explicit garbage collection (requests > 256kB caused an error)
Views prefixed with an underscore can't be called externally
ui.paginate now displays the last page, if the selected page number is too high.
author | jbe/bsw |
---|---|
date | Thu Dec 10 12:00:00 2009 +0100 (2009-12-10) |
parents | 9fdfb27f8e67 |
children | 3d43a5cf17c1 |
rev | line source |
---|---|
jbe/bsw@0 | 1 #!/usr/bin/env lua |
jbe/bsw@0 | 2 |
jbe/bsw@0 | 3 local _G = _G |
jbe/bsw@0 | 4 local _VERSION = _VERSION |
jbe/bsw@0 | 5 local assert = assert |
jbe/bsw@0 | 6 local collectgarbage = collectgarbage |
jbe/bsw@0 | 7 local dofile = dofile |
jbe/bsw@0 | 8 local error = error |
jbe/bsw@0 | 9 local getfenv = getfenv |
jbe/bsw@0 | 10 local getmetatable = getmetatable |
jbe/bsw@0 | 11 local ipairs = ipairs |
jbe/bsw@0 | 12 local load = load |
jbe/bsw@0 | 13 local loadfile = loadfile |
jbe/bsw@0 | 14 local loadstring = loadstring |
jbe/bsw@0 | 15 local module = module |
jbe/bsw@0 | 16 local next = next |
jbe/bsw@0 | 17 local pairs = pairs |
jbe/bsw@0 | 18 local pcall = pcall |
jbe/bsw@0 | 19 local print = print |
jbe/bsw@0 | 20 local rawequal = rawequal |
jbe/bsw@0 | 21 local rawget = rawget |
jbe/bsw@0 | 22 local rawset = rawset |
jbe/bsw@0 | 23 local require = require |
jbe/bsw@0 | 24 local select = select |
jbe/bsw@0 | 25 local setfenv = setfenv |
jbe/bsw@0 | 26 local setmetatable = setmetatable |
jbe/bsw@0 | 27 local tonumber = tonumber |
jbe/bsw@0 | 28 local tostring = tostring |
jbe/bsw@0 | 29 local type = type |
jbe/bsw@0 | 30 local unpack = unpack |
jbe/bsw@0 | 31 local xpcall = xpcall |
jbe/bsw@0 | 32 |
jbe/bsw@0 | 33 local coroutine = coroutine |
jbe/bsw@0 | 34 local debug = debug |
jbe/bsw@0 | 35 local io = io |
jbe/bsw@0 | 36 local math = math |
jbe/bsw@0 | 37 local os = os |
jbe/bsw@0 | 38 local package = package |
jbe/bsw@0 | 39 local string = string |
jbe/bsw@0 | 40 local table = table |
jbe/bsw@0 | 41 |
jbe/bsw@0 | 42 require("multirand") |
jbe/bsw@0 | 43 local multirand = multirand |
jbe/bsw@0 | 44 |
jbe/bsw@0 | 45 module(...) |
jbe/bsw@0 | 46 |
jbe/bsw@0 | 47 temp_dir = false -- has to be set to a private directory (/tmp can be unsafe) |
jbe/bsw@0 | 48 |
jbe/bsw@0 | 49 function escape(str) |
jbe/bsw@0 | 50 return ( |
jbe/bsw@0 | 51 string.gsub( |
jbe/bsw@0 | 52 str, |
jbe/bsw@0 | 53 "[\001-\031\127\\#$&~_^%%{}]", |
jbe/bsw@0 | 54 function(char) |
jbe/bsw@0 | 55 local b = string.byte(char) |
jbe/bsw@0 | 56 if (b > 1 and b < 31) or b == 127 then |
jbe/bsw@0 | 57 return " " |
jbe/bsw@0 | 58 elseif |
jbe/bsw@0 | 59 char == "#" or char == "$" or char == "&" or char == "_" or |
jbe/bsw@0 | 60 char == "%" or char == "{" or char == "}" |
jbe/bsw@0 | 61 then |
jbe/bsw@0 | 62 return "\\" .. char |
jbe/bsw@0 | 63 else |
jbe/bsw@0 | 64 return "\\symbol{" .. b .. "}" |
jbe/bsw@0 | 65 end |
jbe/bsw@0 | 66 end |
jbe/bsw@0 | 67 ) |
jbe/bsw@0 | 68 ) |
jbe/bsw@0 | 69 end |
jbe/bsw@0 | 70 |
jbe/bsw@0 | 71 document_methods = {} |
jbe/bsw@0 | 72 |
jbe/bsw@0 | 73 document_mt = { |
jbe/bsw@0 | 74 __index = document_methods, |
jbe/bsw@0 | 75 __call = function(...) return document_methods.write(...) end |
jbe/bsw@0 | 76 } |
jbe/bsw@0 | 77 |
jbe/bsw@0 | 78 function new_document() |
jbe/bsw@0 | 79 return setmetatable({}, document_mt) |
jbe/bsw@0 | 80 end |
jbe/bsw@0 | 81 |
jbe/bsw@0 | 82 function document_methods:write(...) |
jbe/bsw@0 | 83 local i = 1 |
jbe/bsw@0 | 84 while true do |
jbe/bsw@0 | 85 local v = select(i, ...) |
jbe/bsw@0 | 86 if v == nil then |
jbe/bsw@0 | 87 break |
jbe/bsw@0 | 88 end |
jbe/bsw@0 | 89 self[#self+1] = v |
jbe/bsw@0 | 90 i = i + 1 |
jbe/bsw@0 | 91 end |
jbe/bsw@0 | 92 end |
jbe/bsw@0 | 93 |
jbe/bsw@0 | 94 function document_methods:get_latex() |
jbe/bsw@0 | 95 local str = table.concat(self) |
jbe/bsw@0 | 96 for i in ipairs(self) do |
jbe/bsw@0 | 97 self[i] = nil |
jbe/bsw@0 | 98 end |
jbe/bsw@0 | 99 self[1] = str |
jbe/bsw@0 | 100 return str |
jbe/bsw@0 | 101 end |
jbe/bsw@0 | 102 |
jbe/bsw@0 | 103 function document_methods:get_pdf() |
jbe/bsw@0 | 104 -- TODO: proper escaping of shell commands (should not be a real risk) |
jbe/bsw@0 | 105 if not temp_dir then |
jbe/bsw@0 | 106 error("luatex.temp_dir not set") |
jbe/bsw@0 | 107 end |
jbe/bsw@0 | 108 local basename = temp_dir .. "/tmp.luatex_" .. multirand.string(16) |
jbe/bsw@0 | 109 local latex_file = assert(io.open(basename .. ".tex", "w")) |
jbe/bsw@0 | 110 latex_file:write(self:get_latex()) |
jbe/bsw@0 | 111 latex_file:close() |
jbe/bsw@0 | 112 local result = os.execute( |
jbe/bsw@0 | 113 'latex -output-format=pdf "-output-directory=' .. temp_dir .. '" ' .. |
jbe/bsw@0 | 114 basename .. '< /dev/null > /dev/null 2> /dev/null' |
jbe/bsw@0 | 115 ) |
jbe/bsw@0 | 116 if result ~= 0 then |
jbe/bsw@0 | 117 error('LaTeX failed, see "' .. basename .. '.log" for details.') |
jbe/bsw@0 | 118 end |
jbe/bsw@0 | 119 local pdf_file = assert(io.open(basename .. ".pdf", "r")) |
jbe/bsw@0 | 120 local pdf_data = pdf_file:read("*a") |
jbe/bsw@0 | 121 pdf_file:close() |
jbe/bsw@0 | 122 os.execute('rm -f "' .. basename .. '.*"') |
jbe/bsw@0 | 123 return pdf_data |
jbe/bsw@0 | 124 end |
jbe/bsw@0 | 125 |
jbe/bsw@0 | 126 --[[ |
jbe/bsw@0 | 127 |
jbe/bsw@0 | 128 require("luatex") |
jbe/bsw@0 | 129 luatex.temp_dir = "." |
jbe/bsw@0 | 130 |
jbe/bsw@0 | 131 local tex = luatex.new_document() |
jbe/bsw@0 | 132 |
jbe/bsw@0 | 133 tex "\\documentclass[a4paper,12pt]{article}\n" |
jbe/bsw@0 | 134 tex "\\usepackage{german}\n" |
jbe/bsw@0 | 135 tex "\\usepackage{amsfonts}\n" |
jbe/bsw@0 | 136 tex "\\usepackage{amssymb}\n" |
jbe/bsw@0 | 137 tex "\\usepackage{ulem}\n" |
jbe/bsw@0 | 138 tex "\\pagestyle{headings}\n" |
jbe/bsw@0 | 139 tex "\\begin{document}\n" |
jbe/bsw@0 | 140 tex "\\title{Demo}\n" |
jbe/bsw@0 | 141 tex "\\author{John Doe}\n" |
jbe/bsw@0 | 142 tex "\\date{\\small 25. August 2008}\n" |
jbe/bsw@0 | 143 tex "\\maketitle\n" |
jbe/bsw@0 | 144 tex "\\end{document}\n" |
jbe/bsw@0 | 145 |
jbe/bsw@0 | 146 local pdf = tex:get_pdf() |
jbe/bsw@0 | 147 |
jbe/bsw@0 | 148 --]] |