Here's the code. You're going to want to click on "tab" when you run it
By the way, you'll need the redirect API.
Here's the pastebin for redirect: pastebin get fU9Kj9zr redirect
[color=#282828][font=helvetica, arial, sans-serif][size=4]
if OneOS then
if shell.getRunningProgram() == "startup" then
--to make sure they're not running this in shell
--because if they are it'll crash.
OneOS.ToolBarColour = colours.lightGrey
end
end
--load redirect
if not redirect then
os.loadAPI("redirect")
end
--Credits:
--Developers:
--Hithere
--APIs
--Special thanks to:
--oeed, for OneOS, the OS Sapphari was
--designed for
--DEVELOPER CONFIG
local waitForMessage = false
--------------------------------------------------
sapphariVersionString = "1.0"
sapphariVersionNumber = 1
sapphariSites = {}
sapphariBlacklist = {}
--TESTS:
--might fix some crashes
--+function error()
--The script sets the news, then sets the url vars
--Note that this will be okay if the user
--has a script called pastebin
--because it runs it directly from rom
shell.run("rom/programs/http/pastebin run Jg8D7mLi")
--setting a new homepage:
--I would REALLY prefer you keep the default one so you can get
--updates on news and all that stuff and see cool new stuff
--and sapphari updates, but I'm not going to try to stop you from
--changing it. Uncomment out the line below and set it to the PasteID
--sapphariSites["home"] = "insertpagehere"
local sapphInt = {}
function sapphInt.redrawUI()
term.setBackgroundColor(colors.white)
term.setTextColor(colors.black)
term.clear()
--it's funny how often when GUI coding,
--ever since advanced computers you
--don't need to set the cursor pos as much.
--Kinda nice to clear in one line.
--But you do have to set background and
--text colors. Sadface.
local termX, termY = term.getSize()
for i=1,2 do
paintutils.drawLine(1,i,termX,i,colors.lightGray)
end
paintutils.drawLine(2,1,termX/3,1,colors.white)
term.setBackgroundColor(colors.green)
term.setCursorPos(termX/3+2,1)
term.write("Refresh")
--now it's the right length.
term.setBackgroundColor(colors.lightGray)
term.setCursorPos(2,2)
term.write"Bookmarks | Tabs"
end
--this function will get the data for a site,
--however, will not run it.
function sapphInt.getSite(pasteID)
local responce = http.get("http://pastebin.com/raw.php?i="..pasteID)
if responce then
return loadstring(responce.readAll())
else
return false
end
end
function sapphInt.handleMenu(typeClick, clickX, clickY,tabs,tabNames,bookmarks)
--handle the user clicking the menu
local termX,termY=term.getSize()
if typeClick == 1 then
--okay, it's a left click, passes first one'
if clickX>1 then --okay, in somewhere special
if clickX<termX/3+1 and clickY==1 then
--okay, the user wants to change the url.
term.setCursorPos(2,1)
term.setBackgroundColor(colors.white)
return "newsite",sapphInt.read(2,1,termX/3)
--we will return the input
elseif clickX<13 and clickY==2 then --bookmarks button
--bookmarks here
print"bok"
elseif clickX>13 and clickX<18 and clickY==2 then
--tabs button
--print"Tabz"
--insert the add a tab option
local otherReturn = sapphInt.dropDownMenu(tabNames,12,2)
return "tab",otherReturn
end
end
if clickX>termX/3+1 then
if clickX<termX/3+8 then
--need to refresh page nao
return currentSite
end
end
end
end
function sapphInt.decodeHumanReadableURL(HRURL)
--this is where we attempt to decode a
--human readable url. If fails, will tell
--calling function to attempt to use the
--plain url instead.
if sapphariSites[HRURL] then
--this must be an HRURL, so we'll give them'
--the pasteID
currentSite = sapphariSites[HRURL]
return sapphariSites[HRURL]
else
currentSite = HRURL
return HRURL
--this must be a PasteID then
end
end
--WEBSITE FUNCTON
--sapphutils, MUST be global!!!
sapphUtils = {}
--compatibility with Sapphari Beta:
function sapphUtils.pullEvent(filter)
return {os.pullEventRaw(filter)}
end
--this is a really crappy function we don;t
--want sites using. It's only for very
--very basic textboxes and you can;t
--use the arrow keys nor can you make
--it multiline. Maybe someday I'll fix it up.'
function sapphInt.read(startx, starty, endx)
local textThing = ""
local textThingPrint=""
while true do
evt, text = os.pullEvent()
if evt == "key" then
if text==14 then
textThingPrint=string.sub(textThingPrint,1,#textThingPrint-1)
term.setCursorPos(7,7)
textThing=string.sub(textThing,1,#textThing-1)
local textThingAdd=string.sub(textThing,#textThing-#textThingPrint,#textThing-#textThingPrint)
textThingPrint = textThingAdd..textThingPrint
elseif text==28 then
return textThing
end
elseif evt == "char" then
textThing=textThing..text
textThingPrint=textThingPrint..text
end
term.setCursorPos(startx,starty)
--format the string to fit the box
--patch for deleting under max text box
--length:
if #textThingPrint ==(endx-startx) then
textThingPrint = string.sub(textThingPrint,2,#textThingPrint)
end
--make some whitespace:
local whitespace=""
for i=1,endx-startx do
whitespace=whitespace.." "
end
term.write(whitespace)
--reset cursor
term.setCursorPos(startx,starty)
term.write(textThingPrint)
end
end
--this must get the pasteid, not the human
--redable url
function sapphInt.handleWebsite(url)
local rurl = sapphInt.decodeHumanReadableURL(url)
local site = sapphInt.getSite(rurl)
--we make a timer to refresh it
os.startTimer(0)
if site then
return coroutine.create(site)
else
return nil
end
end
function sapphInt.dropDownMenu(contents, x, y)
term.setTextColor(colors.black)
--YAY! GUI CODING! - Said Nobody, Ever
--find the longest variable in the table
local longestvar = #contents[1]
for i=1,#contents do
if #contents[i] > longestvar then
longestvar = #contents[i]
end
end
--okay, now let's give us some whitespace
local whitespace= ""
for i=1,longestvar do
whitespace = whitespace.." "
end
local termX,termY=term.getSize()
term.setBackgroundColor(colors.white)
--to refresh the menu for the first time
os.startTimer(0)
scrollDown = 0
while true do
local evt,keypress,mousex,mousey=os.pullEvent()
if evt == "key" and termY-y<#contents then
if keypress == 200 and scrollDown<0 then
scrollDown=scrollDown+1
elseif keypress == 208 and (scrollDown*-1)+termY-y<#contents then
scrollDown=scrollDown-1
end
elseif evt=="mouse_click" then
if mousex>x-1 and mousex<x+longestvar+1 then
--okay, the xpos is right. What about the
--ypos?
if mousey>y-1 and mousey<y+#contents+1 then
--we need to find the one clicked and minus
--it by the scroll variable.
return (mousey-y)-scrollDown
end
end
end
term.setBackgroundColor(colors.white)
if #contents<termY-y then
whiteSpaces = #contents
else
whiteSpaces=termY-y
end
for i=y+1,whiteSpaces do
term.setCursorPos(x,i)
print(whitespace)
end
term.setCursorPos(x-1,y)
contents[0] = ""
for i=1,whiteSpaces do
setX,setY=term.getCursorPos()
term.setCursorPos(x,setY+1)
term.write(contents[i-scrollDown])
end
end
end
function sapphInt.handleSapphari()
--fix os.pullEvent
oldPullEvent=os.pullEventRaw
os.pullEvent=os.pullEventRaw
local openSites = {}
local runningSite = 1
local siteNames = {}
local sitesPassed
termX,termY=term.getSize()
siteNames[1] = "Homepage"
--a table for open sites.
--Only the foucused site is ran
openSites[1] = sapphInt.handleWebsite("home")
termX,termY=term.getSize()
local siteBuffer = redirect.createRedirectBuffer(termX,termY-2,colors.black,colors.white,true)
local normalTerm = term.current()
sapphInt.redrawUI()
while true do -- so that they can get to a new site on the event the site dies
local events = {os.pullEventRaw(eventFilter)}
if events[1] == "mouse_click" and events[4] <3 then
local sitesPassed = siteNames
table.insert(sitesPassed,1,"Add Tab")
local what, returned = sapphInt.handleMenu(events[2],events[3],events[4],openSites,sitesPassed)
sitesPassed=nil
if what == "newsite" and returned then
local tempSite = sapphInt.handleWebsite(returned)
if tempSite then
openSites[runningSite] = tempSite -- kill the current site and replace it
end
elseif what =="tab" then
if returned == 1 then
--make a new tab
runningSite = #openSites+1
openSites[#openSites+1] = sapphInt.handleWebsite("home")
end
end
elseif events[1] == "terminate" then
print"Are you trying to kill Sapphari?(\"yes\" to kill, anything else to go to homepage)"
if read() == "yes" then
error"User opted to kill Sapphari."
end
openSites[runningSite] = sapphInt.handleWebsite("home")
end
if coroutine.status(openSites[runningSite]) == "dead" then
print"ded"
sapphInt.redrawUI()
if runningSite ==1 then
openSites[runningSite] = sapphInt.handleWebsite("home")
else
openSites[runningSite] = nil --let this site die
runningSite = 1 --switch their tab
end
end
if coroutine.status(openSites[runningSite]) == "suspended" then
term.redirect(siteBuffer)
--os.pullEvent = sapphInt.newPullEvent
if events[1] == "mouse_click" then
events[4] = events[4]-2
end
okay, eventFilter = coroutine.resume(openSites[runningSite], unpack(events))
term.redirect(normalTerm)
--now we want to print the buffer on the screen
--This means that Sapphari is double-buffered.
local termX,termY=term.getSize()
siteBuffer.blit(1,1,1,3,termX,termY)
end
end
end
---------------------------------------------------
function sapphInt.cleanup()
--so we don't leave crap floating arround.
--sometimes this gets left for some reason
--also we must reset pullEvent
openSites =nil
sapphUtils = nil
runningSite = nil
os.pullEvent=oldPullEvent
end
sapphInt.handleSapphari()
sapphInt.cleanup()
Edited by Geforce Fan, 11 June 2014 - 01:23 AM.











