mirror of
https://github.com/koreader/koreader.git
synced 2025-08-10 00:52:38 +00:00
better argument parsing and option for gamma correction
included MIT-licensed alt_getopt implementation: http://files.luaforge.net/releases/alt-getopt/alt-getopt/alt-getopt-0.7.0 created example use of gamma correction. reader.lua now has usage notes for its invocation syntax.
This commit is contained in:
2
Makefile
2
Makefile
@@ -91,7 +91,7 @@ thirdparty: $(MUPDFDIR)/cmapdump.host $(MUPDFDIR)/fontdump.host
|
||||
|
||||
install:
|
||||
# install to kindle using USB networking
|
||||
scp kpdfview reader.lua root@192.168.2.2:/mnt/us/test/
|
||||
scp kpdfview reader.lua alt_getopt.lua root@192.168.2.2:/mnt/us/test/
|
||||
|
||||
display:
|
||||
# run mplayer on a FIFO, fed by using the framebuffer emulation
|
||||
|
||||
166
alt_getopt.lua
Normal file
166
alt_getopt.lua
Normal file
@@ -0,0 +1,166 @@
|
||||
-- Copyright (c) 2009 Aleksey Cheusov <vle@gmx.net>
|
||||
--
|
||||
-- Permission is hereby granted, free of charge, to any person obtaining
|
||||
-- a copy of this software and associated documentation files (the
|
||||
-- "Software"), to deal in the Software without restriction, including
|
||||
-- without limitation the rights to use, copy, modify, merge, publish,
|
||||
-- distribute, sublicense, and/or sell copies of the Software, and to
|
||||
-- permit persons to whom the Software is furnished to do so, subject to
|
||||
-- the following conditions:
|
||||
--
|
||||
-- The above copyright notice and this permission notice shall be
|
||||
-- included in all copies or substantial portions of the Software.
|
||||
--
|
||||
-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
-- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
-- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
-- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
-- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
local type, pairs, ipairs, io, os = type, pairs, ipairs, io, os
|
||||
|
||||
module ("alt_getopt")
|
||||
|
||||
local function convert_short2long (opts)
|
||||
local i = 1
|
||||
local len = #opts
|
||||
local ret = {}
|
||||
|
||||
for short_opt, accept_arg in opts:gmatch("(%w)(:?)") do
|
||||
ret[short_opt]=#accept_arg
|
||||
end
|
||||
|
||||
return ret
|
||||
end
|
||||
|
||||
local function exit_with_error (msg, exit_status)
|
||||
io.stderr:write (msg)
|
||||
os.exit (exit_status)
|
||||
end
|
||||
|
||||
local function err_unknown_opt (opt)
|
||||
exit_with_error ("Unknown option `-" ..
|
||||
(#opt > 1 and "-" or "") .. opt .. "'\n", 1)
|
||||
end
|
||||
|
||||
local function canonize (options, opt)
|
||||
if not options [opt] then
|
||||
err_unknown_opt (opt)
|
||||
end
|
||||
|
||||
while type (options [opt]) == "string" do
|
||||
opt = options [opt]
|
||||
|
||||
if not options [opt] then
|
||||
err_unknown_opt (opt)
|
||||
end
|
||||
end
|
||||
|
||||
return opt
|
||||
end
|
||||
|
||||
function get_ordered_opts (arg, sh_opts, long_opts)
|
||||
local i = 1
|
||||
local count = 1
|
||||
local opts = {}
|
||||
local optarg = {}
|
||||
|
||||
local options = convert_short2long (sh_opts)
|
||||
for k,v in pairs (long_opts) do
|
||||
options [k] = v
|
||||
end
|
||||
|
||||
while i <= #arg do
|
||||
local a = arg [i]
|
||||
|
||||
if a == "--" then
|
||||
i = i + 1
|
||||
break
|
||||
|
||||
elseif a == "-" then
|
||||
break
|
||||
|
||||
elseif a:sub (1, 2) == "--" then
|
||||
local pos = a:find ("=", 1, true)
|
||||
|
||||
if pos then
|
||||
local opt = a:sub (3, pos-1)
|
||||
|
||||
opt = canonize (options, opt)
|
||||
|
||||
if options [opt] == 0 then
|
||||
exit_with_error ("Bad usage of option `" .. a .. "'\n", 1)
|
||||
end
|
||||
|
||||
optarg [count] = a:sub (pos+1)
|
||||
opts [count] = opt
|
||||
else
|
||||
local opt = a:sub (3)
|
||||
|
||||
opt = canonize (options, opt)
|
||||
|
||||
if options [opt] == 0 then
|
||||
opts [count] = opt
|
||||
else
|
||||
if i == #arg then
|
||||
exit_with_error ("Missed value for option `" .. a .. "'\n", 1)
|
||||
end
|
||||
|
||||
optarg [count] = arg [i+1]
|
||||
opts [count] = opt
|
||||
i = i + 1
|
||||
end
|
||||
end
|
||||
count = count + 1
|
||||
|
||||
elseif a:sub (1, 1) == "-" then
|
||||
local j
|
||||
for j=2,a:len () do
|
||||
local opt = canonize (options, a:sub (j, j))
|
||||
|
||||
if options [opt] == 0 then
|
||||
opts [count] = opt
|
||||
count = count + 1
|
||||
elseif a:len () == j then
|
||||
if i == #arg then
|
||||
exit_with_error ("Missed value for option `-" .. opt .. "'\n", 1)
|
||||
end
|
||||
|
||||
optarg [count] = arg [i+1]
|
||||
opts [count] = opt
|
||||
i = i + 1
|
||||
count = count + 1
|
||||
break
|
||||
else
|
||||
optarg [count] = a:sub (j+1)
|
||||
opts [count] = opt
|
||||
count = count + 1
|
||||
break
|
||||
end
|
||||
end
|
||||
else
|
||||
break
|
||||
end
|
||||
|
||||
i = i + 1
|
||||
end
|
||||
|
||||
return opts,i,optarg
|
||||
end
|
||||
|
||||
function get_opts (arg, sh_opts, long_opts)
|
||||
local ret = {}
|
||||
|
||||
local opts,optind,optarg = get_ordered_opts (arg, sh_opts, long_opts)
|
||||
for i,v in ipairs (opts) do
|
||||
if optarg [i] then
|
||||
ret [v] = optarg [i]
|
||||
else
|
||||
ret [v] = 1
|
||||
end
|
||||
end
|
||||
|
||||
return ret,optind
|
||||
end
|
||||
54
reader.lua
54
reader.lua
@@ -17,8 +17,7 @@
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
]]--
|
||||
|
||||
input.open("/dev/input/event0")
|
||||
input.open("/dev/input/event1")
|
||||
require "alt_getopt"
|
||||
|
||||
KEY_PAGE_UP = 109
|
||||
KEY_PAGE_DOWN = 124
|
||||
@@ -33,11 +32,28 @@ KEY_LEFT = 105
|
||||
KEY_RIGHT = 106
|
||||
KEY_BTN = 92
|
||||
|
||||
if ARGV[1] == nil then
|
||||
print("needs PDF filename as first argument.")
|
||||
end
|
||||
if ARGV[2] == nil then
|
||||
ARGV[2] = ""
|
||||
-- option parsing:
|
||||
longopts = {
|
||||
password = "p",
|
||||
gamma = "G",
|
||||
device = "d",
|
||||
help = "h"
|
||||
}
|
||||
optarg, optind = alt_getopt.get_opts(ARGV, "p:G:h", longopts)
|
||||
if optarg["h"] or ARGV[optind] == nil then
|
||||
print("usage: ./reader.lua [OPTION] ... DOCUMENT.PDF")
|
||||
print("Read PDFs on your E-Ink reader")
|
||||
print("")
|
||||
print("-p, --password=PASSWORD set password for reading PDF document")
|
||||
print("-G, --gamma=GAMMA set gamma correction")
|
||||
print(" (floating point notation, e.g. \"1.5\")")
|
||||
print("-d, --device=DEVICE set device specific configuration,")
|
||||
print(" currently one of \"kdxg\" (default), \"k3\"")
|
||||
print("-h, --help show this usage help")
|
||||
print("")
|
||||
print("This software is licensed under the GPLv3.")
|
||||
print("See http://github.com/hwhw/kindlepdfviewer for more info.")
|
||||
return
|
||||
end
|
||||
|
||||
rcount = 5
|
||||
@@ -45,7 +61,17 @@ rcountmax = 5
|
||||
|
||||
globalzoom = -1
|
||||
|
||||
doc = pdf.openDocument(ARGV[1], ARGV[2])
|
||||
if optarg["d"] == "k3" then
|
||||
-- for now, the only difference is the additional input device
|
||||
input.open("/dev/input/event0")
|
||||
input.open("/dev/input/event1")
|
||||
input.open("/dev/input/event2")
|
||||
else
|
||||
input.open("/dev/input/event0")
|
||||
input.open("/dev/input/event1")
|
||||
end
|
||||
|
||||
doc = pdf.openDocument(ARGV[optind], optarg["p"] or "")
|
||||
|
||||
print("pdf has "..doc:getPages().." pages.")
|
||||
|
||||
@@ -128,6 +154,18 @@ function setzoom(cacheslot)
|
||||
|
||||
cache[cacheslot].dc:setZoom(zoom)
|
||||
cache[cacheslot].dc:setOffset(offset_x, offset_y)
|
||||
|
||||
-- set gamma here, we don't have any other good place for this right now:
|
||||
if optarg["G"] then
|
||||
print("gamma correction: "..optarg["G"])
|
||||
cache[cacheslot].dc:setGamma(optarg["G"])
|
||||
else
|
||||
-- there's still a bug in the DC initialization in C code,
|
||||
-- so we disable gamma correction here explicitly
|
||||
-- (it should be disabled by default)
|
||||
-- TODO: correct bug in C API
|
||||
cache[cacheslot].dc:setGamma(-1.0)
|
||||
end
|
||||
end
|
||||
|
||||
function show(no)
|
||||
|
||||
Reference in New Issue
Block a user