Lua scripting capabilities permit users to customize the ELinks behaviour to unusual degree - they allow automatic rewriting of HTML code of the received documents, rewriting of the URLs entered by user etc. You can even write your own bookmarks system with Lua. See also contrib/lua/ for some examples of the possibilities of ELinks Lua support.
Please do not confuse Lua scripting with JavaScript, EcmaScript, VBScript and similiar. Those are embedded in page, allowing per-document scripting related to its presentation and providing some degree of interactivity etc. On the contrary, the current Lua support permits scripts to be embedded to the browser directly, changing the behaviour of the browser, not the document.
The original Lua support (in the form of Links-Lua fork of original Links) was written by Peter Wang and Cliff Cunnington. There are some rough edges remaining, but is suitable for everyday use (I have been using it every day for a year).
The Lua scripting support comes with the stock ELinks distribution, no additional patches and tweaks should be needed.
The web site of the original Links-Lua is at http://links.sourceforge.net/links-lua/. Some older patches against regular Links are available at http://www.sourceforge.net/projects/links/, but they are not being maintained.
ELinks can be found at http://elinks.or.cz/.
Links can be found at http://links.browser.org/.
Lua can be found at http://www.lua.org/.
The Lua support has only been tested under Linux, although it should work under other platforms that ELinks 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.
Before you can compile ELinks with Lua support, you must compile and install
Lua. The following instructions are for a Linux system. People on other
systems should try to enable popen support, but this is not necessary
(you will lose a bit of functionality though).
POPEN line.
INSTALL_ROOT line.
Follow the instructions for building ELinks (it is the standard "./configure; make; make install" procedure). During the configure step make sure that Lua has been detected on your system.
Simply start ELinks 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 ELinks running, or start ELinks again with the "-no-connect" option on the command-line.
Out of the box, ELinks with Lua will do nothing different from regular ELinks. You need to write some scripts.
The Lua support is based on the idea of hooks. A hook is a function that gets called at a particular point during the execution of ELinks. To make ELinks do what you want, you can add and edit such hooks.
The Lua support also adds an extra dialog box, which you can open while in ELinks 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 reference manual (http://www.lua.org/docs.html). In fact, the language is relatively trivial, though. You could already do wonders with simply refactoring the example scripts.
On startup, ELinks reads in two Lua scripts. Firstly, a system-wide
configuration file called `/etc/elinks/hooks.lua', then a file in
your home directory called `~/.elinks/hooks.lua'. From these files,
you can include other Lua files with dofile, if necessary.
To see what kind of things you should put in here, look at `contrib/lua/hooks.lua'.
The following hooks are available.
nil). It should return a string, which is the URL that
Links should follow, or nil to cancel the operation.
nil to stop
Links following the URL.
nil if there were no
modifications.
nil), and
a second argument, which is the shell command to run or the Lua
expression to evaluate.
Examples:
return "run", "someprogram"
will attempt to run the program `someprogram'.
return "eval", "somefunction(1+2)"
will attempt to call the Lua function somefunction with an
argument, 3.
return "goto-url", "http://www.bogus.com"
will ask Links to visit the URL "http://www.bogus.com".
return nil
will do nothing.
As well as providing hooks, ELinks provides some functions in addition to the standard Lua functions.
The functions are: openfile, closefile, readfrom,
writeto, appendto, pipe_read, remove,
rename, flush, seek, tmpname, read,
write execute, exit, clock, date,
getenv, setlocale.
Note: setlocale is a standard Lua function and will not affect
the current ELinks locale.
nil if none is
selected.
nil if none.
read seems to crash ELinks when used in pipe-reading
mode.
lua_console_hook.
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
follow_url_hook (among other things) to perform unusual actions.
For a concrete example, see the bookmark addon.
This chapter contains some example scripts that you can use. All of them come from `contrib/lua/hooks.lua'. I really recommend you to see it directly 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 tjaden@users.sourceforge.net. 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 :-)
Also take a look at the `contrib/lua/' directory in the ELinks distribution. Note that Peter and Cliff don't maintain the Lua support intensively anymore, thus it would be probably nice to Cc me (pasky@ucw.cz) if you want to contribute some patch, so that I would be able to add it to the ELinks distribution.
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
(Note that this was noticably enhanced and rewritten in the ELinks standart hooks.)
By adding an extra snippet of code to the previous example, we can make ELinks 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 ELinks Lua support to manipulate the HTML before it reaches the parser.
Note: This recipe is out of date.
Linux Today has two problems when viewed in ELinks: 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)
.
.
Note: ELinks already supports gzipped files natively.
Sometimes documents come gzipped in order to save space, but then you need to uncompress them to read them with ELinks. 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 ELinks usually involves quite a few steps: Save the current document onto disk. Run it through ELinks 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 ELinks, using `lpr' or `enscript'. Type lpr() or enscript() in the Lua Console to run them. (In the `hooks.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 ELinks, 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 (note that ELinks already supports that, marketing name Hiearchical bookmarks), and also to be able to view them and search for them in an HTML page. I have written an alternative bookmark system (for ELinks), 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
$Id: elinks-lua.texi,v 1.2 2002/11/29 13:08:27 pasky Exp $
Current history:
$Log: elinks-lua.texi,v $ Revision 1.2 2002/11/29 13:08:27 pasky ELinksified.
Original history:
This document was generated on 11 January 2003 using texi2html 1.56k.