Whole document tree
Links with Lua extensions
patch 11Peter Wang
Links-Lua is a fork of the Links web browser thats adds Lua scripting capabilities in order to make Links more flexible and customisable.
It was written by Peter Wang and Cliff Cunnington. Right now we are taking a bit of a break, but if people express interest, development will probably pick up again. Regardless of that, and a couple of bugs, the software is quite usable (and addictive :-), which is why it's being released at this time.
The web site is at http://www.sourceforge.net/projects/links/, and the docs are at http://links.sourceforge.net/links-lua/. You can download patches against official versions of Links, or complete tarballs. One day we might put Links-Lua into CVS, so you can run cvs update to keep up to date. Since the changes we make to Links are quite small, we will keep tracking official Links releases.
UPDATE: An easier option than patching Links manually is to use ELinks (Experimental/Extended Links), available at http://pasky.ji.cz/elinks/. It has more features than regular Links and bugfixes often get into ELinks quicker.
Links can be found at http://links.browser.org.
Lua can be found at http://www.lua.org.
After you have read this manual and played around with the software, you might want to check out Cliff Cunnington's Links-Lua development directory at http://www.ccnet.demon.nl/links-lua/. He's working on an easier configuration system (incomplete), and there's a few more script examples too.
Links-Lua has only been tested under Linux, although it should work under other platforms that Links and Lua support (perhaps with some changes to source code).
Also, note that many of the scripts given here assume a Unix system. Your mileage will definitely vary on other platforms.
First public release.
Before you can compile Links-Lua, you must compile and install Lua. The
following instructions are for a Linux system. People on other systems
should try to enable
You have two options for installing Links-Lua, the compete tarball or a patch against an official version of Links. In both cases, please check that Lua has been detected on your system during the `configure' step.
tar zxf links-lua-0.96-p11.tar.gz cd links-lua-0.96-p11 ./configure make make install # optional
tar zxf links-0.96.tar.gz cd links-0.96 gzip -dc ~/download/links-lua-0.96-p11.diff.gz | patch -p1 ./configure make make install # optional
If you run make install you might overwrite your old copy of Links. It doesn't matter what the filename is called, so you can simply rename one of the copies or keep them in different directories.
Simply start Links as you normally would. To check you have Lua support compiled in, open up the "Help | About" dialog box. It should list "Lua" under "Features". If not, make sure you do not have other copies of Links running, or start Links again with the "-no-connect" option on the command-line.
Out of the box, Links-Lua will do nothing different from regular Links. You need to write some scripts.
Links-Lua is based on the idea of hooks. A hook is a function that gets called at a particular point during the execution of Links. To make Links-Lua do what you want, you can add and edit such hooks.
Links-Lua also adds an extra dialog box, which you can open while in Links with the comma (,) key. Here you can enter Lua expressions for evaluation, or override it to do something different.
And finally, you can bind keystrokes to Lua functions. These keystrokes won't let you do any more than is possible with the Lua Console, but they're more convenient.
Note that this document assumes you have some knowledge of programming in Lua. For that, you should refer to the Lua manual in the Lua distribution.
On startup, Links-Lua reads in two Lua scripts. Firstly, a system-wide
configuration file called `/etc/links-hooks.lua', then a file in
your home directory called `~/.links/hooks.lua'. From these files,
you can include other Lua files with
To see what kind of things you should put in here, download pwhooks.lua.
The following hooks are available.
As well as providing hooks, Links-Lua provides some functions in addition to the standard Lua functions.
There is one more little thing which Links-Lua adds, which will not be
described in detail here. It is the fake "user:" protocol, which can be
used when writing your own addons. It allows you to generate web pages
containing links to "user://blahblah", which can be intercepted by the
This chapter contains some example scripts that you can use. All of them come from pwhooks.lua. I really recommend you download it instead of copying code out of this document. Also, not everything in there is covered here.
If you would like to contribute scripts, that would be great! Please send them to me at email@example.com. Cliff and I plan to start a script repository, provided we get some contributions. As for script ideas, you'll just have to be a little creative :-)
There are some web sites that I visit often. Bookmarks are okay, but they are separate from the "Go to URL" dialog box, so I keep forgetting to use them. Also, when I visit a search engine home page, all I really want to do is enter a search term.
The following script allows me to type certain strings into the "Go to URL" dialog box, and it will convert them to the URL I actually want to visit. As a bonus, it allows me perform some searches on sites like Google without loading up the front page first.
function match (prefix, url) return strsub (url, 1, strlen (prefix)) == prefix end function strip (str) return gsub (str, "^%s*(.-)%s*$", "%1") end function plusify (str) return gsub (str, "%s", "+") end function goto_url_hook (url, current_url) -- Google search (e.g. ,gg unix browsers). if match (",gg", url) then url = plusify (strip (strsub (url, 4))) return "http://www.google.com/search?q="..url.."&btnG=Google+Search" -- Freshmeat search. elseif match (",fm", url) then url = plusify (strip (strsub (url, 4))) return "http://www.freshmeat.net/search/?q="..url -- Appwatch search (e.g. ,aw lynx). elseif match (",aw", url) then url = plusify (strip (strsub (url, 4))) return "http://www.appwatch.com/Linux/Users/find?q="..url -- Dictionary.com search (e.g. ,dict congenial). elseif match (",dict", url) then url = plusify (strip (strsub (url, 6))) return "http://www.dictionary.com/cgi-bin/dict.pl?db=%2A&term="..url -- RPM search (e.g. ,rpm links). elseif match (",rpm", url) then url = plusify (strip (strsub (url, 5))) return "http://www.rpmfind.net/linux/rpm2html/search.php?query=" ..url.."&submit=Search+..." -- Netcraft.com search (e.g. ,whatis www.google.com). elseif match (",whatis", url) then url = plusify (strip (strsub (url, 8))) return "http://uptime.netcraft.com/up/graph/?host="..url -- LinuxToday home page. elseif match (",lt", url) then return "http://linuxtoday.com/" -- Weather forecast for Melbourne, Australia. elseif match (",forecast", url) then return "http://www.bom.gov.au/cgi-bin/wrap_fwo.pl?IDF02V00.txt" -- Unmatched else return url end end
By adding an extra snippet of code to the previous example, we can make Links expand pathnames such as `~/foo/bar' and `~user/zappo', like in the shell and other Unix programs.
-- Home directory: If you do not enable system functions, you will need -- to set the following to your home directory. home_dir = (getenv and getenv ("HOME")) or "/home/MYSELF" function goto_url_hook (url, current_url) . . -- Expand ~ to home directories. elseif match ("~", url) then if strsub(url, 2, 2) == "/" then -- ~/foo return home_dir..strsub(url, 2) else -- ~foo/bar return "/home/"..strsub(url, 2) end . .
Many web pages nowadays have columns to the left and right of the text, which are utterly useless. If you happen to be viewing the page in a 80x25 screen, the text you want to read ends up crammed into a tiny space in the centre. We use Links-Lua to manipulate the HTML before it reaches the parser.
Linux Today has two problems when viewed in Links: the useless columns on the left and the right and all the text appears in cyan. Here is a quick recipe to fix that:
-- Plain strfind (no metacharacters) function sstrfind (s, pattern) return strfind (s, pattern, 1, 1) end function pre_format_html_hook (url, html) -- Strip the left and right columns from Linux Today pages -- and change the font colour to white. if sstrfind (url, "linuxtoday.com") then if sstrfind (url, "news_story") then html = gsub (html, '<TABLE CELLSPACING="0".-</TABLE>', '', 1) html = gsub (html, '<TR BGCOLOR="#FFF.-</TR></TABLE>', '', 1) else html = gsub (html, 'WIDTH="120">\n<TR.+</TABLE></TD>', '>', 1) end html = gsub (html, '<A HREF="http://www.internet.com.-', '') html = gsub (html, "<IFRAME.-</IFRAME>", "") -- emphasis in text is lost return gsub (html, 'text="#002244"', 'text="#001133"', 1) end return nil end
Here is a simpler example, for http://www.linuxgames.com/.
function pre_format_html_hook (url, html) . . elseif strfind (url, "linuxgames.com", 1, 1) then return gsub (html, "<CENTER>.-</center>", "", 1) . .
Sometimes documents come gzipped in order to save space, but then you need to uncompress them to read them with Links. Here is a recipe to handle gzipped files on a Unix system.
-- This script requires system functions. function pre_format_html_hook (url, html) . . -- Handle gzip'd files within reasonable size. if strfind (url, "%.gz$") and strlen (html) < 65536 then local tmp = tmpname () writeto (tmp) write (html) writeto () html = pipe_read ("(gzip -dc "..tmp.." || cat "..tmp..") 2>/dev/null") remove (tmp) return html end . .
Printing a web page with Links usually involves quite a few steps: Save the current document onto disk. Run it through Links on the command-line (so it fits into 80 columns) to generate a plain text version. Remove the 80th column from the text version, as it will make printers wrap down to the next line. Finally, run the processed file through `lpr', then delete it.
The following functions allow you to print web pages directly from Links, using `lpr' or `enscript'. Type lpr() or enscript() in the Lua Console to run them. (In the `pwhooks.lua', I have also made it so you can just type lpr or enscript.)
-- This script requires system functions. function catto (output) writeto (output) write (current_document_formatted (79)) writeto () end -- Send the current document to `lpr'. function lpr () -- You must compile Lua with `popen' support for pipes to work. -- See `config' in the Lua distribution. catto ("|lpr") end -- Send the current document to `enscript'. function enscript () catto ("|enscript -fCourier8") end
If you come across a brain-dead web page that is totally unreadable with Links, you'd probably want to open it with a graphical browser. The following function opens the current document in Netscape.
-- This function requires `execute', a system function. -- When starting Netscape: Set to `nil' if you do not want -- to open a new window for each document. netscape_new_window = 1 -- Open current document in Netscape. function netscape () local new = netscape_new_window and ",new_window" or "" execute ("( netscape -remote 'openURL("..current_url ()..new..")'" .." || netscape '"..current_url ().."' ) 2>/dev/null &") end
Many people would like to have a bookmark system with categories, and also to be able to view them and search for them in an HTML page. I have written an alternative bookmark system (for Links-Lua), which some people may like better than the standard bookmark system.
It is quite a big addon, so is described in a separate document, here: bookmark.html
This document was generated on 17 March 2002 using texi2html 1.56k.