webmcp

annotate libraries/luatex/luatex.lua @ 10:e017c47d43b5

Modified encode.json to avoid special CDATA sequences in output
author jbe
date Wed Feb 03 00:57:18 2010 +0100 (2010-02-03)
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 --]]

Impressum / About Us