added an FRequest browser for KittenOS NEO I guess

This commit is contained in:
Izaya 2018-04-19 12:06:00 +10:00
parent b3848e6886
commit 1c8f5f75bf
1 changed files with 205 additions and 0 deletions

View File

@ -0,0 +1,205 @@
local event = require("event")(neo)
local neoux = require("neoux")(event, neo)
local minitel = neo.requireAccess("x.svc.minitel","minitel daemon access")
local computer = neo.requireAccess("k.computer","pushing packets")
local net = require("net")(event,computer,minitel)
local tb = {}
local rtext = "FRequest Browser v2\nAlt-hjkl to resize\n^J and ^K to scroll"
local url = ""
local blines, dlines = {}, {}
local bbuttons, dbuttons = {}, {}
local wwidth, wheight = 30,10
local hheight = 2
local cscroll = 1
local minwidth, minheight = 16, 8
local ctrl, alt = false, false
function tb.fget(host,port,path)
local socket = net.open(host,port)
socket:write("t"..path.."\n")
local c
repeat
c = socket:read(1)
event.pull()
until c ~= ""
local buffer = ""
repeat
l = socket:read(1024)
buffer=buffer..l
event.sleepTo(os.uptime()+1)
until socket.state == "closed" and l == ""
if c == "n" then
return path..": Not found."
elseif c == "f" then
return "Failure: "..buffer
elseif c == "d" then
local t = {}
for s in buffer:gmatch("[^\r?\n]+") do
t[#t+1] = s
end
return t
end
return buffer
end
function tb.parseURL(url)
local hp, path = url:match("(.-)(/.+)")
hp, path = hp or url, path or "/"
local host, port = hp:match("(.+):(.+)")
host, port = host or hp, port or 70
return host, port, path
end
function tb.loadpage()
if url:sub(-1) == "/" then
url = url:sub(1,-2)
end
local host, port, path = tb.parseURL(url)
local page = tb.fget(host, port, path)
if type(page) == "string" then
rtext = page
bbuttons = {}
elseif type(page) == "table" then
rtext = "Index of "..path
bbuttons = page
end
cscroll = 1
tb.format()
tb.redraw()
end
-- UI stuff
function tb.mkbutton(name,x,y)
x = x or 1
return neoux.tcbutton(x,y,name,function(w)
if name:sub(-1) == "/" then
name = name:sub(1,-2)
end
url = url .."/".. name
tb.loadpage()
end)
end
function tb.format()
blines = neoux.fmtText(rtext, wwidth)
dlines = {}
for i = cscroll, cscroll + wheight do
dlines[#dlines+1] = blines[i]
end
dbuttons = {}
for i = cscroll, cscroll + wheight do
dbuttons[#dbuttons+1] = bbuttons[i]
end
end
function tb.genwindow()
local r1,r2,r2o,r2l = 1,2,1,wwidth
fillh = 0
hheight = 2
if wwidth > 25 then
r2 = 1
r2o = 7
r2l = wwidth - 6
hheight = 1
end
tb.format()
local wtab = {
neoux.tcbutton(1,r1,unicode.char(8593),tb.bup),
neoux.tcbutton(4,r1,unicode.char(9661),tb.bsave),
--neoux.tcbutton(wwidth-2,r1,unicode.char(9711),tb.breload)
neoux.tcfield(r2o,r2,r2l-3,tb.furl),
neoux.tcbutton(r2o+r2l-3,r2,unicode.char(9655),tb.loadpage),
neoux.tcrawview(1,hheight+1,dlines,wwidth)
}
for k,v in pairs(dbuttons) do
wtab[#wtab+1] = tb.mkbutton(v,1,hheight+1+k)
end
return wtab
end
-- button callbacks
function tb.bup(w)
local tURL = {}
for s in url:gmatch("[^/]+") do
tURL[#tURL+1] = s
end
if #tURL > 1 then
tURL[#tURL] = nil
end
url = ""
for k,v in ipairs(tURL) do
url = url .. "/" .. v
end
url=url:sub(2)
tb.breload()
end
function tb.breload(w)
tb.loadpage()
tb.redraw()
end
function tb.bsave()
local f = neoux.fileDialog(true)
if f then
f.write(rtext.."\n")
for k,v in pairs(bbuttons) do
f.write(v.."\n")
end
f.close()
end
end
function tb.furl(nv)
if not nv then return url end
url = nv
end
tb.window = neoux.create(wwidth, wheight, "FGet", neoux.tcwindow(wwidth,wheight,tb.genwindow(),function (w) w.close() done = true end, 0xFFFFFF, 0))
function tb.redraw()
for i = 1, 2 do -- I'm a bad person.
tb.window.reset(wwidth, wheight, "FGet", neoux.tcwindow(wwidth,wheight,tb.genwindow(),function (w) w.close() done = true end, 0xFFFFFF, 0))
end
end
while not done do
local et, _, et2, k1, k2 = event.pull()
if et == "x.neo.pub.window" and et2 == "key" then
if k1 == 0 and k2 == 56 then -- alt pressed
alt = not alt
elseif k1 == 0 and k2 == 157 then -- ctrl pressed
ctrl = not ctrl
elseif alt and k1 == 104 and k2 == 35 then -- alt-h, reduce width
wwidth = wwidth - 1
if wwidth < minwidth then
wwidth = minwidth
end
tb.redraw()
elseif alt and k1 == 106 and k2 == 36 then -- alt-j, increase height
wheight = wheight + 1
tb.redraw()
elseif alt and k1 == 107 and k2 == 37 then -- alt-k, decrease height
wheight = wheight - 1
if wheight < minheight then
wheight = minheight
end
tb.redraw()
elseif alt and k1 == 108 and k2 == 38 then -- alt-l, increase width
wwidth = wwidth + 1
tb.redraw()
elseif k1 == 10 and k2 == 36 then -- ctrl-j, scroll down
cscroll = cscroll + 1
if cscroll > #blines+#bbuttons then cscroll = #tlines end
tb.redraw()
elseif k1 == 11 and k2 == 37 then -- ctrl-k scroll up
cscroll = cscroll - 1
if cscroll < 1 then cscroll = 1 end
tb.redraw()
end
end
end