webmcp
annotate libraries/luatex/luatex.lua @ 7:f7413a1a872c
Tags for v1.0.0 to v1.0.6 added
| author | jbe | 
|---|---|
| date | Sat Jan 30 12:41:37 2010 +0100 (2010-01-30) | 
| 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 --]] |