Compressing Luafiles added
This commit is contained in:
90
tools/luasrcdiet/plugin/example.lua
Normal file
90
tools/luasrcdiet/plugin/example.lua
Normal file
@@ -0,0 +1,90 @@
|
||||
---------
|
||||
-- Example of a plugin for LuaSrcDiet.
|
||||
--
|
||||
-- WARNING: highly experimental! interface liable to change
|
||||
--
|
||||
-- **Notes:**
|
||||
--
|
||||
-- * Any function can be omitted and LuaSrcDiet won't call it.
|
||||
-- * The functions are:
|
||||
-- (1) init(_option, _srcfl, _destfl)
|
||||
-- (2) post_load(z) can return z
|
||||
-- (3) post_lex(toklist, seminfolist, toklnlist)
|
||||
-- (4) post_parse(globalinfo, localinfo)
|
||||
-- (5) post_optparse()
|
||||
-- (6) post_optlex(toklist, seminfolist, toklnlist)
|
||||
-- * Older tables can be copied and kept in the plugin and used later.
|
||||
-- * If you modify 'option', remember that LuaSrcDiet might be
|
||||
-- processing more than one file.
|
||||
-- * Arrangement of the functions is not final!
|
||||
-- * TODO: can't process additional options from command line yet
|
||||
----
|
||||
|
||||
local M = {}
|
||||
|
||||
local option -- local reference to list of options
|
||||
local srcfl, destfl -- filenames
|
||||
local old_quiet
|
||||
|
||||
local function print(...) -- handle quiet option
|
||||
if option.QUIET then return end
|
||||
_G.print(...)
|
||||
end
|
||||
|
||||
--- Initialization.
|
||||
--
|
||||
-- @tparam {[string]=bool,...} _option
|
||||
-- @tparam string _srcfl Path of the source file.
|
||||
-- @tparam string _destfl Path of the destination file.
|
||||
function M.init(_option, _srcfl, _destfl)
|
||||
option = _option
|
||||
srcfl, destfl = _srcfl, _destfl
|
||||
-- plugin can impose its own option starting from here
|
||||
end
|
||||
|
||||
--- Message display, post-load processing, can return z.
|
||||
function M.post_load(z)
|
||||
-- this message will print after the LuaSrcDiet title message
|
||||
print([[
|
||||
Example plugin module for LuaSrcDiet
|
||||
]])
|
||||
print("Example: source file name is '"..srcfl.."'")
|
||||
print("Example: destination file name is '"..destfl.."'")
|
||||
print("Example: the size of the source file is "..#z.." bytes")
|
||||
-- returning z is optional; this allows optional replacement of
|
||||
-- the source data prior to lexing
|
||||
return z
|
||||
end
|
||||
|
||||
--- Post-lexing processing, can work on lexer table output.
|
||||
function M.post_lex(toklist, seminfolist, toklnlist) --luacheck: ignore
|
||||
print("Example: the number of lexed elements is "..#toklist)
|
||||
end
|
||||
|
||||
--- Post-parsing processing, gives globalinfo, localinfo.
|
||||
function M.post_parse(globalinfo, localinfo)
|
||||
print("Example: size of globalinfo is "..#globalinfo)
|
||||
print("Example: size of localinfo is "..#localinfo)
|
||||
old_quiet = option.QUIET
|
||||
option.QUIET = true
|
||||
end
|
||||
|
||||
--- Post-parser optimization processing, can get tables from elsewhere.
|
||||
function M.post_optparse()
|
||||
option.QUIET = old_quiet
|
||||
print("Example: pretend to do post-optparse")
|
||||
end
|
||||
|
||||
--- Post-lexer optimization processing, can get tables from elsewhere.
|
||||
function M.post_optlex(toklist, seminfolist, toklnlist) --luacheck: ignore
|
||||
print("Example: pretend to do post-optlex")
|
||||
-- restore old settings, other file might need original settings
|
||||
option.QUIET = old_quiet
|
||||
-- option.EXIT can be set at the end of any post_* function to stop
|
||||
-- further processing and exit for the current file being worked on
|
||||
-- in this case, final stats printout is disabled and the output will
|
||||
-- not be written to the destination file
|
||||
option.EXIT = true
|
||||
end
|
||||
|
||||
return M
|
177
tools/luasrcdiet/plugin/html.lua
Normal file
177
tools/luasrcdiet/plugin/html.lua
Normal file
@@ -0,0 +1,177 @@
|
||||
---------
|
||||
-- Turns Lua 5.1 source code into HTML files.
|
||||
--
|
||||
-- WARNING: highly experimental! interface liable to change
|
||||
--
|
||||
-- **Notes:**
|
||||
--
|
||||
-- * This HTML highlighter marks globals brightly so that their usage
|
||||
-- can be manually optimized.
|
||||
-- * Either uses a .html extension for output files or it follows the
|
||||
-- -o <filespec> option.
|
||||
-- * The HTML style tries to follow that of the Lua wiki.
|
||||
----
|
||||
local fs = require "luasrcdiet.fs"
|
||||
|
||||
local concat = table.concat
|
||||
local find = string.find
|
||||
local fmt = string.format
|
||||
local sub = string.sub
|
||||
|
||||
local M = {}
|
||||
|
||||
local HTML_EXT = ".html"
|
||||
local ENTITIES = {
|
||||
["&"] = "&", ["<"] = "<", [">"] = ">",
|
||||
["'"] = "'", ["\""] = """,
|
||||
}
|
||||
|
||||
-- simple headers and footers
|
||||
local HEADER = [[
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<title>%s</title>
|
||||
<meta name="Generator" content="LuaSrcDiet">
|
||||
<style type="text/css">
|
||||
%s</style>
|
||||
</head>
|
||||
<body>
|
||||
<pre class="code">
|
||||
]]
|
||||
local FOOTER = [[
|
||||
</pre>
|
||||
</body>
|
||||
</html>
|
||||
]]
|
||||
-- for more, please see wikimain.css from the Lua wiki site
|
||||
local STYLESHEET = [[
|
||||
BODY {
|
||||
background: white;
|
||||
color: navy;
|
||||
}
|
||||
pre.code { color: black; }
|
||||
span.comment { color: #00a000; }
|
||||
span.string { color: #009090; }
|
||||
span.keyword { color: black; font-weight: bold; }
|
||||
span.number { color: #993399; }
|
||||
span.operator { }
|
||||
span.name { }
|
||||
span.global { color: #ff0000; font-weight: bold; }
|
||||
span.local { color: #0000ff; font-weight: bold; }
|
||||
]]
|
||||
|
||||
local option -- local reference to list of options
|
||||
local srcfl, destfl -- filenames
|
||||
local toklist, seminfolist -- token data
|
||||
|
||||
local function print(...) -- handle quiet option
|
||||
if option.QUIET then return end
|
||||
_G.print(...)
|
||||
end
|
||||
|
||||
--- Initialization.
|
||||
function M.init(_option, _srcfl)
|
||||
option = _option
|
||||
srcfl = _srcfl
|
||||
local extb, _ = find(srcfl, "%.[^%.%\\%/]*$")
|
||||
local basename = srcfl
|
||||
if extb and extb > 1 then
|
||||
basename = sub(srcfl, 1, extb - 1)
|
||||
end
|
||||
destfl = basename..HTML_EXT
|
||||
if option.OUTPUT_FILE then
|
||||
destfl = option.OUTPUT_FILE
|
||||
end
|
||||
if srcfl == destfl then
|
||||
error("output filename identical to input filename")
|
||||
end
|
||||
end
|
||||
|
||||
--- Message display, post-load processing.
|
||||
function M.post_load()
|
||||
print([[
|
||||
HTML plugin module for LuaSrcDiet
|
||||
]])
|
||||
print("Exporting: "..srcfl.." -> "..destfl.."\n")
|
||||
end
|
||||
|
||||
--- Post-lexing processing, can work on lexer table output.
|
||||
function M.post_lex(_toklist, _seminfolist)
|
||||
toklist, seminfolist = _toklist, _seminfolist
|
||||
end
|
||||
|
||||
--- Escapes the usual suspects for HTML/XML.
|
||||
local function do_entities(z)
|
||||
local i = 1
|
||||
while i <= #z do
|
||||
local c = sub(z, i, i)
|
||||
local d = ENTITIES[c]
|
||||
if d then
|
||||
c = d
|
||||
z = sub(z, 1, i - 1)..c..sub(z, i + 1)
|
||||
end
|
||||
i = i + #c
|
||||
end--while
|
||||
return z
|
||||
end
|
||||
|
||||
--- Post-parsing processing, gives globalinfo, localinfo.
|
||||
function M.post_parse(globalinfo, localinfo)
|
||||
local html = {}
|
||||
local function add(s) -- html helpers
|
||||
html[#html + 1] = s
|
||||
end
|
||||
local function span(class, s)
|
||||
add('<span class="'..class..'">'..s..'</span>')
|
||||
end
|
||||
|
||||
for i = 1, #globalinfo do -- mark global identifiers as TK_GLOBAL
|
||||
local obj = globalinfo[i]
|
||||
local xref = obj.xref
|
||||
for j = 1, #xref do
|
||||
local p = xref[j]
|
||||
toklist[p] = "TK_GLOBAL"
|
||||
end
|
||||
end--for
|
||||
|
||||
for i = 1, #localinfo do -- mark local identifiers as TK_LOCAL
|
||||
local obj = localinfo[i]
|
||||
local xref = obj.xref
|
||||
for j = 1, #xref do
|
||||
local p = xref[j]
|
||||
toklist[p] = "TK_LOCAL"
|
||||
end
|
||||
end--for
|
||||
|
||||
add(fmt(HEADER, -- header and leading stuff
|
||||
do_entities(srcfl),
|
||||
STYLESHEET))
|
||||
for i = 1, #toklist do -- enumerate token list
|
||||
local tok, info = toklist[i], seminfolist[i]
|
||||
if tok == "TK_KEYWORD" then
|
||||
span("keyword", info)
|
||||
elseif tok == "TK_STRING" or tok == "TK_LSTRING" then
|
||||
span("string", do_entities(info))
|
||||
elseif tok == "TK_COMMENT" or tok == "TK_LCOMMENT" then
|
||||
span("comment", do_entities(info))
|
||||
elseif tok == "TK_GLOBAL" then
|
||||
span("global", info)
|
||||
elseif tok == "TK_LOCAL" then
|
||||
span("local", info)
|
||||
elseif tok == "TK_NAME" then
|
||||
span("name", info)
|
||||
elseif tok == "TK_NUMBER" then
|
||||
span("number", info)
|
||||
elseif tok == "TK_OP" then
|
||||
span("operator", do_entities(info))
|
||||
elseif tok ~= "TK_EOS" then -- TK_EOL, TK_SPACE
|
||||
add(info)
|
||||
end
|
||||
end--for
|
||||
add(FOOTER)
|
||||
assert(fs.write_file(destfl, concat(html), "wb"))
|
||||
option.EXIT = true
|
||||
end
|
||||
|
||||
return M
|
89
tools/luasrcdiet/plugin/sloc.lua
Normal file
89
tools/luasrcdiet/plugin/sloc.lua
Normal file
@@ -0,0 +1,89 @@
|
||||
---------
|
||||
-- Calculates SLOC for Lua 5.1 scripts
|
||||
--
|
||||
-- WARNING: highly experimental! interface liable to change
|
||||
--
|
||||
-- **Notes:**
|
||||
--
|
||||
-- * SLOC's behaviour is based on David Wheeler's SLOCCount.
|
||||
-- * Empty lines and comment don't count as significant.
|
||||
-- * Empty lines in long strings are also insignificant. This is
|
||||
-- debatable. In SLOCCount, this allows counting of invalid multi-
|
||||
-- line strings for C. But an empty line is still an empty line.
|
||||
-- * Ignores the --quiet option, print own result line.
|
||||
----
|
||||
|
||||
local M = {}
|
||||
|
||||
local option -- local reference to list of options
|
||||
local srcfl -- source file name
|
||||
|
||||
function M.init(_option, _srcfl)
|
||||
option = _option
|
||||
option.QUIET = true
|
||||
srcfl = _srcfl
|
||||
end
|
||||
|
||||
--- Splits a block into a table of lines (minus EOLs).
|
||||
--
|
||||
-- @tparam string blk
|
||||
-- @treturn {string,...} lines
|
||||
local function split(blk)
|
||||
local lines = {}
|
||||
local i, nblk = 1, #blk
|
||||
while i <= nblk do
|
||||
local p, q, r, s = blk:find("([\r\n])([\r\n]?)", i)
|
||||
if not p then
|
||||
p = nblk + 1
|
||||
end
|
||||
lines[#lines + 1] = blk:sub(i, p - 1)
|
||||
i = p + 1
|
||||
if p < nblk and q > p and r ~= s then -- handle Lua-style CRLF, LFCR
|
||||
i = i + 1
|
||||
end
|
||||
end
|
||||
return lines
|
||||
end
|
||||
|
||||
--- Post-lexing processing, can work on lexer table output.
|
||||
function M.post_lex(toklist, seminfolist, toklnlist)
|
||||
local lnow, sloc = 0, 0
|
||||
local function chk(ln) -- if a new line, count it as an SLOC
|
||||
if ln > lnow then -- new line # must be > old line #
|
||||
sloc = sloc + 1; lnow = ln
|
||||
end
|
||||
end
|
||||
for i = 1, #toklist do -- enumerate over all tokens
|
||||
local tok, info, ln
|
||||
= toklist[i], seminfolist[i], toklnlist[i]
|
||||
|
||||
if tok == "TK_KEYWORD" or tok == "TK_NAME" or -- significant
|
||||
tok == "TK_NUMBER" or tok == "TK_OP" then
|
||||
chk(ln)
|
||||
|
||||
-- Both TK_STRING and TK_LSTRING may be multi-line, hence, a loop
|
||||
-- is needed in order to mark off lines one-by-one. Since llex.lua
|
||||
-- currently returns the line number of the last part of the string,
|
||||
-- we must subtract in order to get the starting line number.
|
||||
elseif tok == "TK_STRING" then -- possible multi-line
|
||||
local t = split(info)
|
||||
ln = ln - #t + 1
|
||||
for _ = 1, #t do
|
||||
chk(ln); ln = ln + 1
|
||||
end
|
||||
|
||||
elseif tok == "TK_LSTRING" then -- possible multi-line
|
||||
local t = split(info)
|
||||
ln = ln - #t + 1
|
||||
for j = 1, #t do
|
||||
if t[j] ~= "" then chk(ln) end
|
||||
ln = ln + 1
|
||||
end
|
||||
-- Other tokens are comments or whitespace and are ignored.
|
||||
end
|
||||
end--for
|
||||
print(srcfl..": "..sloc) -- display result
|
||||
option.EXIT = true
|
||||
end
|
||||
|
||||
return M
|
Reference in New Issue
Block a user