Monday, November 08, 2010 at 12:03 AM.
system.verbs.builtins.Frontier.tools.newTool
on newTool (f) { <<Changes: <<5/26/09; 9:30:48 AM by DW <<New tools don't have their threads turned on. Create an init script. Rewrite install code for statuscenter script, thread script. <<6/12/02; 12:26:44 AM by JES <<Add a toolSuite.callbacks.radio table to new Tools. This table is for callback scripts which will be installed at user.radio.callbacks, when the Tool is installed. <<12/4/01; 1:33:29 PM by JES <<New Tools now have a toolSuite.statusCenterMessage script, which returns the string, "I'm a cool Tool!". <<11/27/01; 3:13:21 AM by JES <<Added a description element to the toolInfo table for new tools. <<09/19/01; 7:05:20 PM by JES <<Added initialization of the toolInfo table, which contains information about the Tool and the tool's author. <<06/8/01; 12:12:16 PM by JES <<Bug fix: The condition for the responder checked string.lower (path) against the inner-case name, which would always fail. Now it checks string.lower (path) against string.lower (toolName). <<07/02/01; 2:57:22 AM by JES <<Create an empty windowTypes table. <<01/11/01; 12:18:44 PM by JES <<Don't enable the responder for new tools. <<09/30/00; 11:48:06 PM by PBS <<Take the path to the tool as parameter, not the name of the tool. <<09/25/00; 11:47:56 PM by JES <<Create a new, empty tool database. local (fname = file.fileFromPath (f)); local (name = Frontier.tools.cleanToolName (fname)); local (firstUpperName = string.upper (name[1]) + string.mid (name, 2, infinity)); local (adrTool); bundle { // create the database fileMenu.new (f, true); adrTool = @[f]}; on newTable (t) { //create a subtable, return its address local (adrTable = @adrTool^.[name + t]); new (tableType, adrTable); return (adrTable)}; on newScriptWithComment (adrScript, comment) { new (scriptType, adrScript); local (oldTarget = target.set (adrScript)); op.setLineText (comment); script.makeComment (); try {target.set (oldTarget)}}; newTable ("RpcHandlers"); newTable ("SoapHandlers"); newTable ("NodeTypes"); newTable ("WindowTypes"); bundle { //toolData and prefs subtable local (adrData = newTable ("Data")); new (tableType, @adrData^.prefs)}; bundle { //toolResponder (with sample any method) local (adrResponder = newTable ("Responder")); adrResponder^.condition = "(string.lower (path) beginsWith \"/" + string.lower (name) + "/\")"; adrResponder^.enabled = false; //01/11/01 JES: don't initially enable responder new (tableType, @adrResponder^.methods); local (s = "on any (pta) //boilerplate for your responder\r"); s = s + "\tpta^.responseHeaders.[\"Content-Type\"] = \"text/html\"\r"; s = s + "\tpta^.code = 200; //everything was OK\r"; s = s + "\tpta^.responseBody = \"\" //build response\r"; s = s + "\treturn (true)"; script.newScriptObject (s, @adrResponder^.methods.any); local (oldTarget = target.set (@adrResponder^.methods.any)); op.firstSummit (); op.fullExpand (); try {target.set (oldTarget)}}; bundle { //toolSuite (background, callbacks, menu) local (adrSuite = newTable ("Suite")); bundle { //background new (tableType, @adrSuite^.background); newScriptWithComment (@adrSuite^.background.everyMinute, "This script runs every minute."); newScriptWithComment (@adrSuite^.background.everyHour, "This script runs every hour."); newScriptWithComment (@adrSuite^.background.everyNight, "This script runs every night.")}; bundle { //callbacks new (tableType, @adrSuite^.callbacks); new (tableType, @adrSuite^.callbacks.fileMenu); new (tableType, @adrSuite^.callbacks.radio); new (tableType, @adrSuite^.callbacks.user)}; bundle { //menu new (menubarType, @adrSuite^.menu); local (oldTarget = target.set (@adrSuite^.menu)); op.setLineText (firstUpperName); try {target.set (oldTarget)}; menu.addMenuCommand (@adrSuite^.menu, firstUpperName, "Hello World", "dialog.notify (\"Hello, World!\")")}; bundle { //statusCenterMessage, 5/26/09 by DW -- rewrite <<local (adrscript = @adrSuite^.statusCenterMessage) <<newScriptWithComment (adrscript, "This script returns a string which appears in the Status Center on the Radio UserLand home page.") <<local (oldTarget = target.set (adrscript)) <<op.insert ("return (\"I'm a cool Tool!\")", down) <<try {target.set (oldTarget)} Frontier.tools.newToolScript (@Frontier.tools.data.scripts.statusCenterMessage, @adrSuite^.statusCenterMessage, name)}; bundle { //init //5/26/09 by DW Frontier.tools.newToolScript (@Frontier.tools.data.scripts.init, @adrSuite^.init, name)}}; bundle { //toolThread local (adrThread = newTable ("Thread")); adrThread^.ct = 0; adrThread^.enabled = false; //5/26/09 by DW Frontier.tools.newToolScript (@Frontier.tools.data.scripts.threadScript, @adrThread^.script, name); }; <<newScriptWithComment (@adrThread^.script, "This script runs in its own thread.") <<local (oldTarget = target.set (@adrThread^.script)) <<op.insert ("loop //loop until the application quits", down) <<op.insert ("Add your code here.", right) <<script.makeComment () <<op.insert ("thread.sleepFor (10) //sleep for ten seconds", down) <<try {target.set (oldTarget)} bundle { //toolWebsite local (adrSite = newTable ("Website")); adrSite^ = Frontier.tools.data.virginWebsite; local (adrFtpSite = @adrSite^.["#ftpSite"]); adrFtpSite^.url = "http://127.0.0.1/" + name + "/"}; bundle { //toolInfo local (adrInfo = newTable ("Info")); adrInfo^.author = user.prefs.name; adrInfo^.authorEmail = user.prefs.mailAddress; adrInfo^.description = ""; adrInfo^.homePageUrl = ""; adrInfo^.name = string.popSuffix (file.fileFromPath (f), '.'); adrInfo^.releaseDate = clock.now (); adrInfo^.version = "0.1"}; bundle { //clean up try {delete (@adrTool^.["item #1"])}; local (oldTarget = target.set (adrTool)); wp.setTextMode (false); op.firstSummit (); try {target.set (oldTarget)}; fileMenu.save (f)}; bundle { //install now if in Tools folder local (toolsFolder = Frontier.tools.getToolsFolderPath ()); local (lowerToolsFolder = string.lower (toolsFolder)); local (folder = file.folderFromPath (f)); local (lowerFolder = string.lower (folder)); if lowerFolder == lowerToolsFolder { Frontier.tools.install (f)}}; //install now return (adrTool)}
This listing is for code that runs in the OPML Editor environment. I created these listings because I wanted the search engines to index it, so that when I want to look up something in my codebase I don't have to use the much slower search functionality in my object database. Dave Winer.