jbe/bsw@0: #!/usr/bin/env lua jbe/bsw@0: jbe/bsw@0: local _G = _G jbe/bsw@0: local _VERSION = _VERSION jbe/bsw@0: local assert = assert jbe/bsw@0: local collectgarbage = collectgarbage jbe/bsw@0: local dofile = dofile jbe/bsw@0: local error = error jbe/bsw@0: local getfenv = getfenv jbe/bsw@0: local getmetatable = getmetatable jbe/bsw@0: local ipairs = ipairs jbe/bsw@0: local load = load jbe/bsw@0: local loadfile = loadfile jbe/bsw@0: local loadstring = loadstring jbe/bsw@0: local module = module jbe/bsw@0: local next = next jbe/bsw@0: local pairs = pairs jbe/bsw@0: local pcall = pcall jbe/bsw@0: local print = print jbe/bsw@0: local rawequal = rawequal jbe/bsw@0: local rawget = rawget jbe/bsw@0: local rawset = rawset jbe/bsw@0: local require = require jbe/bsw@0: local select = select jbe/bsw@0: local setfenv = setfenv jbe/bsw@0: local setmetatable = setmetatable jbe/bsw@0: local tonumber = tonumber jbe/bsw@0: local tostring = tostring jbe/bsw@0: local type = type jbe/bsw@0: local unpack = unpack jbe/bsw@0: local xpcall = xpcall jbe/bsw@0: jbe/bsw@0: local coroutine = coroutine jbe/bsw@0: local debug = debug jbe/bsw@0: local io = io jbe/bsw@0: local math = math jbe/bsw@0: local os = os jbe/bsw@0: local package = package jbe/bsw@0: local string = string jbe/bsw@0: local table = table jbe/bsw@0: jbe/bsw@0: require("multirand") jbe/bsw@0: local multirand = multirand jbe/bsw@0: jbe/bsw@0: module(...) jbe/bsw@0: jbe/bsw@0: temp_dir = false -- has to be set to a private directory (/tmp can be unsafe) jbe/bsw@0: jbe/bsw@0: function escape(str) jbe/bsw@0: return ( jbe/bsw@0: string.gsub( jbe/bsw@0: str, jbe/bsw@0: "[\001-\031\127\\#$&~_^%%{}]", jbe/bsw@0: function(char) jbe/bsw@0: local b = string.byte(char) jbe/bsw@0: if (b > 1 and b < 31) or b == 127 then jbe/bsw@0: return " " jbe/bsw@0: elseif jbe/bsw@0: char == "#" or char == "$" or char == "&" or char == "_" or jbe/bsw@0: char == "%" or char == "{" or char == "}" jbe/bsw@0: then jbe/bsw@0: return "\\" .. char jbe/bsw@0: else jbe/bsw@0: return "\\symbol{" .. b .. "}" jbe/bsw@0: end jbe/bsw@0: end jbe/bsw@0: ) jbe/bsw@0: ) jbe/bsw@0: end jbe/bsw@0: jbe/bsw@0: document_methods = {} jbe/bsw@0: jbe/bsw@0: document_mt = { jbe/bsw@0: __index = document_methods, jbe/bsw@0: __call = function(...) return document_methods.write(...) end jbe/bsw@0: } jbe/bsw@0: jbe/bsw@0: function new_document() jbe/bsw@0: return setmetatable({}, document_mt) jbe/bsw@0: end jbe/bsw@0: jbe/bsw@0: function document_methods:write(...) jbe/bsw@0: local i = 1 jbe/bsw@0: while true do jbe/bsw@0: local v = select(i, ...) jbe/bsw@0: if v == nil then jbe/bsw@0: break jbe/bsw@0: end jbe/bsw@0: self[#self+1] = v jbe/bsw@0: i = i + 1 jbe/bsw@0: end jbe/bsw@0: end jbe/bsw@0: jbe/bsw@0: function document_methods:get_latex() jbe/bsw@0: local str = table.concat(self) jbe/bsw@0: for i in ipairs(self) do jbe/bsw@0: self[i] = nil jbe/bsw@0: end jbe/bsw@0: self[1] = str jbe/bsw@0: return str jbe/bsw@0: end jbe/bsw@0: jbe/bsw@0: function document_methods:get_pdf() jbe/bsw@0: -- TODO: proper escaping of shell commands (should not be a real risk) jbe/bsw@0: if not temp_dir then jbe/bsw@0: error("luatex.temp_dir not set") jbe/bsw@0: end jbe/bsw@0: local basename = temp_dir .. "/tmp.luatex_" .. multirand.string(16) jbe/bsw@0: local latex_file = assert(io.open(basename .. ".tex", "w")) jbe/bsw@0: latex_file:write(self:get_latex()) jbe/bsw@0: latex_file:close() jbe/bsw@0: local result = os.execute( jbe/bsw@0: 'latex -output-format=pdf "-output-directory=' .. temp_dir .. '" ' .. jbe/bsw@0: basename .. '< /dev/null > /dev/null 2> /dev/null' jbe/bsw@0: ) jbe/bsw@0: if result ~= 0 then jbe/bsw@0: error('LaTeX failed, see "' .. basename .. '.log" for details.') jbe/bsw@0: end jbe/bsw@0: local pdf_file = assert(io.open(basename .. ".pdf", "r")) jbe/bsw@0: local pdf_data = pdf_file:read("*a") jbe/bsw@0: pdf_file:close() jbe/bsw@0: os.execute('rm -f "' .. basename .. '.*"') jbe/bsw@0: return pdf_data jbe/bsw@0: end jbe/bsw@0: jbe/bsw@0: --[[ jbe/bsw@0: jbe/bsw@0: require("luatex") jbe/bsw@0: luatex.temp_dir = "." jbe/bsw@0: jbe/bsw@0: local tex = luatex.new_document() jbe/bsw@0: jbe/bsw@0: tex "\\documentclass[a4paper,12pt]{article}\n" jbe/bsw@0: tex "\\usepackage{german}\n" jbe/bsw@0: tex "\\usepackage{amsfonts}\n" jbe/bsw@0: tex "\\usepackage{amssymb}\n" jbe/bsw@0: tex "\\usepackage{ulem}\n" jbe/bsw@0: tex "\\pagestyle{headings}\n" jbe/bsw@0: tex "\\begin{document}\n" jbe/bsw@0: tex "\\title{Demo}\n" jbe/bsw@0: tex "\\author{John Doe}\n" jbe/bsw@0: tex "\\date{\\small 25. August 2008}\n" jbe/bsw@0: tex "\\maketitle\n" jbe/bsw@0: tex "\\end{document}\n" jbe/bsw@0: jbe/bsw@0: local pdf = tex:get_pdf() jbe/bsw@0: jbe/bsw@0: --]]