1
0
mirror of https://github.com/rkd77/elinks.git synced 2024-06-05 22:00:54 +00:00

Move most of contrib/smjs/README into the manual.

Also document elinks.vs and elinks.action.

<kahmalo> Miciah: IMO most of contrib/smjs/README should be moved into
    the ELinks manual.  Specifically the parts that do not depend on
    contrib/smjs/hooks.js.  However manual.txt contains a notice:
    "Hold blameless the authors.  Any lawful use is allowed."  Will
    you allow that also for what is now in contrib/smjs/README?
<Miciah> Absolutely.
<Miciah> In fact, I would allow some lawless uses.
<Miciah> It seems a little silly to say that lawful uses are allowed.
This commit is contained in:
Kalle Olavi Niemitalo 2008-07-10 20:31:22 +03:00 committed by Kalle Olavi Niemitalo
parent 8ee5e8c4a1
commit 9954d37a68
3 changed files with 366 additions and 240 deletions

View File

@ -1,163 +1,15 @@
Methods
-------
Most of the SpiderMonkey scripting interface is documented in the
ELinks manual. This README describes only features added by
contrib/smjs/*.js.
do_file(path)
Load and evaluate the file with the given path (string). For example:
Multiple functions in the same hook
-----------------------------------
do_file("/home/me/.elinks/hooks.js");
will reload your hooks file.
elinks.alert(message)
Display the given message (string) in a message box. For example:
elinks.alert("Hello, world!");
will display a friendly greeting.
elinks.execute(command)
Execute the given command (string) on the current terminal. For example:
var quoted_uri = "'" + elinks.location.replace(/'/g, "'\\''") + "'";
elinks.execute("firefox " + quoted_uri);
will run Firefox with the URI of the current document.
Note: one must be very careful with elinks.execute, because depending
on the OS, the command may be subject to interpretation by a command shell
language. When constructing the command string, be sure to quote any
dubious parts (such as the URI of the current document, as above).
elinks.load_uri(uri, callback)
Load the given URI (string). When the URI completes loading, ELinks calls
the given callback (function). The callback is passed the cache object
that corresponds to the URI. For example:
elinks.load_uri("http://www.eldar.org/cgi-bin/fortune.pl?text_format=yes",
function (cached) { elinks.alert(cached.content); });
displays a fortune.
The cache object will not expire until after the callback returns.
Properties
----------
elinks.home (string)
ELinks's 'home' directory, where it stores its configuration files.
Read-only. For example,
do_file(elinks.home + "hooks.js");
will reload your hooks file.
elinks.location (string)
The URI of the currently open document. This can be read to get a string
with the URI or set to load a different document. For example,
elinks.location = elinks.location + "/..";
will go up a directory (if the URI doesn't end in a file).
elinks.bookmarks (hash)
This is a hash, the elements of which correspond to the bookmarks.
One can delve into the bookmarks hierarchy in a reasonably nifty
fashion, just by using standard ECMAScript syntax:
elinks.bookmarks.x.children.y.children.z.children.foo.title
gets the title of the bookmark titled 'foo' under the folder 'z',
which is a subfolder of 'y', which is a subfolder of 'x'.
A bookmark object has these properties:
item.title (string)
This is the title of the bookmark. It can be read and set.
item.url (string)
This is the URI of the bookmark. It can be read and set.
item.children (hash)
This is a hash, the elements of which are the bookmarks that
are children to the item. It is read-only.
elinks.globhist (hash)
This is a hash, the elements of which correspond to entries in ELinks's
global history. The hash is indexed by URI. For example,
elinks.globhist["file:///"]
will get you the history item for your root directory.
A history item has these properties:
item.title (string)
This is the title of the history item. It can be read and set.
item.url (string)
This is the URI of the history item. It can be read and set.
item.last_visit (number)
This is the UNIX time of the last visit time for the item. UNIX time
is the number of seconds that have passed between the UNIX epoch (which
is 1970-01-01 00:00:00 UTC) and the represented time. Note that this is
_seconds_ since the epoch, whereas ECMAScript likes to use _milliseconds_
since the epoch. This property can be set or read.
elinks.keybinding (hash)
This is a hash, the elements of which correspond to ELinks's keymaps.
Currently, there are three: elinks.keybinding.main, elinks.keybinding.edit,
and elinks.keybinding.menu. These elements are also hashes, the elements of
which correspond to bindings. For example, elinks.keymaps.main["q"] is
the binding to the 'q' key in the main map. These bindings can be red,
to get the name of the action to which the key is bound, or set, either
to a string with the name of the ELinks action or to a function, which will
thenceforth be called when the key is pressed. For example,
elinks.keymaps.main["!"] = function () { elinks.alert("Hello!"); }
binds the '!' key in the main map to a function that displays a friendly
alert.
elinks.keymaps.main["/"] = "search-typeahead-text";
changes the '/' key to use the nice typeahead search function instead of
opening that ugly old search dialogue box.
Hooks
-----
These are actually properties, but a special case: one assigns functions
to them, which functions are called at certain events.
Note that the default hooks file assigns functions that provide a mechanism
to register multiple functions to each hook. When these default hooks are
called, they iterate over all functions that are registered to them, calling
each one in serial.
The default hooks file contrib/smjs/hooks.js assigns functions that
provide a mechanism to register multiple functions to each hook. When
these default hooks are called, they iterate over all functions that
are registered to them, calling each one in serial.
If you want to register a preformat_html hook, for example,
the preferred way to do so is not this:
@ -173,87 +25,8 @@ elinks.preformat_html function will iterate.
If any function in that array returns false, the default hook
will stop iteration, not calling any more handlers. This applies
to all of the default hooks.
to all of the default hooks:
elinks.preformat_html(cached, vs)
This function is called every time a document is loaded, before the document
is actually rendered, to give scripts the opportunity to modify it. The
first parameter is the cache object and the second is the view_state object
(documented below). As explained above, it is preferred to add your hook
to elinks.preformat_html_hooks rather than to assign it to
elinks.preformat_html.
The cache object will not expire until after this function returns.
elinks.goto_url_hook(url)
This function is called every time the user enters something
in the Go to URL box. The url (string) can be modified or not,
and the returned string is substituted for what the user entered.
If the value false is returned, the URL is not changed and further hooks
in ELinks are not run. As explained above, it is preferred to add your hook
to elinks.goto_url_hooks rather than to assign it to elinks.goto_url_hook.
elinks.follow_url_hook(url)
This function is called every time the user tries to load a document,
whether by following a link, by entering a URI in the Go to URL box,
by setting elinks.location, or whatever. It behaves the same as
elinks.goto_url_hook above. As explained above, it is preferred to add your
hook to elinks.follow_url_hooks rather than to assign it to
elinks.follow_url_hook.
Other Objects
-------------
cache
The cache object mentioned in the descriptions of elinks.load_uri and
elinks.preformat_html is a wrapper for the internal ELinks cache object.
ELinks passes the ECMAScript cache object as an argument to your
ECMAScript function, and keeps the corresponding document in the
cache until the function returns. After that, ELinks may remove the
document from the cache, even if the function has saved the cache
object to some global variable. Such an expired cache object does
not work but it does not crash ELinks either.
The properties of the cache object are:
cached.content (string)
This is the content received from the server. It can be read and set.
cached.type (string)
This is the MIME type of the cache entry. It can be read and set.
cached.length (number)
This is the length of cached.content. It is read-only.
cached.head (string)
This is the header received from the server. It can be read and set.
cached.uri (string)
This is the URI of the cache entry. It is read-only.
view_state
The view_state object mentioned in the description of elinks.preformat_html
is a wrapper for the internal ELinks view_state object. The view state holds
information on how the current document is being displayed.
vs.plain (boolean)
Whether the current document is rendered as HTML or displayed
as plaintext. This can be read and set.
vs.uri (string)
This is the URI of the current document. It is read-only.
- elinks.preformat_html_hooks
- elinks.goto_url_hooks
- elinks.follow_url_hooks

View File

@ -59,3 +59,5 @@ include::exmode.txt[]
include::bittorrent.txt[]
include::lua-scripting.txt[]
include::smjs-scripting.txt[]

351
doc/smjs-scripting.txt Normal file
View File

@ -0,0 +1,351 @@
[[smjs-scripting]]
Scripting ELinks with ECMAScript
--------------------------------
As a user of ELinks, you can control its behaviour by writing scripts
in ECMAScript. Unlike <<ecmascript,scripts in SCRIPT elements of
HTML>>, these user scripts run with all the permissions of your user
account, the same as with <<lua-scripting,Lua>>. The object model is
very different too.
Support for ECMAScript user scripts was first added in ELinks 0.11.0.
The `configure` script enables it by default if the required SpiderMonkey
library has been installed, but you can disable it with `configure
\--disable-sm-scripting` or by <<CONFIG-SCRIPTING-SPIDERMONKEY,editing
features.conf>>.
WARNING: ECMAScript scripting is still a bit experimental: there seem to be
ways to crash ELinks with it, and the object model may change. However, if
you don't have a `hooks.js` file, the risk is minimal.
When ELinks starts up, it evaluates the ECMAScript file `hooks.js` in
your ELinks configuration directory (thus normally `~/.elinks/hooks.js`
on Unix-like systems), or if the file does not exist there, then in
the system-wide ELinks configuration directory (the location depends
on how ELinks was built, but `/etc/elinks/hooks.js` is typical).
In the ELinks source tree, the `contrib/smjs` directory contains some
examples about scripting ELinks with ECMAScript. Please see the
`README` file in that directory for details.
[[smjs-global-object]]
Global Object
~~~~~~~~~~~~~
The global object provided to ECMAScript user scripts contains the standard
ECMAScript classes, as well as the following:
[[smjs-global-methods]]
Global Object Methods
^^^^^^^^^^^^^^^^^^^^^
[[smjs-global.do_file]] do_file(path)::
Load and evaluate the file with the given path (string). For example:
+
--
----------------------------------------------------------------------
do_file("/home/me/.elinks/hooks.js");
----------------------------------------------------------------------
will reload your hooks file.
--
[[smjs-global-properties]]
Global Object Properties
^^^^^^^^^^^^^^^^^^^^^^^^
[[smjs-global.elinks]] elinks (elinks)::
A reference to the <<smjs-elinks-object,ELinks object>>.
[[smjs-elinks-object]]
ELinks Object
~~~~~~~~~~~~~
The global <<smjs-global.elinks,'elinks'>> property refers to this object.
[[smjs-elinks-methods]]
ELinks Object Methods
^^^^^^^^^^^^^^^^^^^^^
[[smjs-elinks.alert]] elinks.alert(message)::
Display the given message (string) in a message box. For example:
+
--
----------------------------------------------------------------------
elinks.alert("Hello, world!");
----------------------------------------------------------------------
will display a friendly greeting.
--
[[smjs-elinks.execute]] elinks.execute(command)::
Execute the given command (string) on the current terminal.
For example:
+
--
----------------------------------------------------------------------
var quoted_uri = "'" + elinks.location.replace(/'/g, "'\\''") + "'";
elinks.execute("firefox " + quoted_uri);
----------------------------------------------------------------------
will run Firefox with the URI of the current document.
WARNING: One must be very careful with 'elinks.execute', because depending
on the OS, the command may be subject to interpretation by a command
shell language. When constructing the command string, be sure to quote
any dubious parts (such as the URI of the current document, as above).
--
[[smjs-elinks.load_uri]] elinks.load_uri(uri, callback)::
Load the given URI (string). When the URI completes loading, ELinks
calls the given callback (function). The callback is passed the
<<smjs-cache_entry-object,cache object>> that corresponds to the URI.
For example:
+
--
----------------------------------------------------------------------
elinks.load_uri("http://www.eldar.org/cgi-bin/fortune.pl?text_format=yes",
function (cached) { elinks.alert(cached.content); });
----------------------------------------------------------------------
displays a fortune.
The <<smjs-cache_entry-object,cache object>> will not expire until after the
callback returns.
--
[[smjs-elinks-properties]]
ELinks Object Properties
^^^^^^^^^^^^^^^^^^^^^^^^
[[smjs-elinks.home]] elinks.home (string)::
ELinks's ``home'' directory, where it stores its configuration files.
Read-only. For example,
+
--
----------------------------------------------------------------------
do_file(elinks.home + "hooks.js");
----------------------------------------------------------------------
will reload your hooks file.
--
[[smjs-elinks.location]] elinks.location (string)::
The URI of the currently open document. This can be read to get a
string with the URI or set to load a different document.
For example,
+
--
----------------------------------------------------------------------
elinks.location = elinks.location + "/..";
----------------------------------------------------------------------
will go up a directory (if the URI doesn't end in a file).
--
[[smjs-elinks.bookmarks]] elinks.bookmarks (hash)::
This is a hash, the elements of which correspond to the bookmarks.
One can delve into the bookmarks hierarchy in a reasonably nifty
fashion, just by using standard ECMAScript syntax:
+
--
----------------------------------------------------------------------
elinks.bookmarks.x.children.y.children.z.children.foo.title
----------------------------------------------------------------------
gets the title of the bookmark titled ``foo'' under the folder ``z'',
which is a subfolder of ``y'', which is a subfolder of ``x''.
[[smjs-bookmark-properties]]
A bookmark object has these properties:
[[smjs-bookmark.title]] item.title (string)::
This is the title of the bookmark. It can be read and set.
[[smjs-bookmark.url]] item.url (string)::
This is the URI of the bookmark. It can be read and set.
[[smjs-bookmark.children]] item.children (hash)::
This is a hash, the elements of which are the bookmarks that
are children to the item. It is read-only.
--
[[smjs-elinks.globhist]] elinks.globhist (hash)::
This is a hash, the elements of which correspond to entries in ELinks's
global history. The hash is indexed by URI. For example,
+
--
----------------------------------------------------------------------
elinks.globhist["file:///"]
----------------------------------------------------------------------
will get you the history item for your root directory.
[[smjs-global_history_item-properties]]
A history item has these properties:
[[smjs-global_history_item.title]] item.title (string)::
This is the title of the history item. It can be read and set.
[[smjs-global_history_item.url]] item.url (string)::
This is the URI of the history item. It can be read and set.
[[smjs-global_history_item.last_visit]] item.last_visit (number)::
This is the UNIX time of the last visit time for the item. UNIX time
is the number of seconds that have passed between the UNIX epoch
(which is 1970-01-01 00:00:00 UTC) and the represented time. Note that
this is 'seconds' since the epoch, whereas ECMAScript likes to use
'milliseconds' since the epoch. This property can be set or read.
--
[[smjs-elinks.action]] elinks.action (hash)::
This hash lets you call the built-in actions of ELinks. For example,
you can call `elinks.action.auth_manager()` to open the authentication
manager. The names of the actions are the same as in elinks.conf or
in the keybinding manager, except they have underscores instead of
dashes in order to make them valid ECMAScript identifiers.
+
--
NOTE: When you read an action function from this hash, ELinks binds it to the
current tab; any later calls to the function affect that tab. This may be
changed in a future version. It is safest to call the function right away,
rather than save it in a variable and call it later.
--
[[smjs-elinks.keymaps]] elinks.keymaps (hash)::
This is a hash, the elements of which correspond to ELinks's keymaps.
Currently, there are three: 'elinks.keymaps.main', 'elinks.keymaps.edit',
and 'elinks.keymaps.menu'. These elements are also hashes, the elements of
which correspond to bindings. For example, `elinks.keymaps.main["q"]` is
the binding to the ``q'' key in the main map. These bindings can be red,
to get the name of the action to which the key is bound, or set, either
to a string with the name of the ELinks action or to a function, which will
thenceforth be called when the key is pressed. For example,
+
--
----------------------------------------------------------------------
elinks.keymaps.main["!"] = function () { elinks.alert("Hello!"); }
----------------------------------------------------------------------
binds the ``!'' key in the main map to a function that displays a friendly
alert.
----------------------------------------------------------------------
elinks.keymaps.main["/"] = "search-typeahead-text";
----------------------------------------------------------------------
changes the ``/'' key to use the nice typeahead search function instead of
opening that ugly old search dialogue box.
NOTE: Do not read a function from <<smjs-elinks.action,'elinks.action'>>,
e.g. `elinks.action.search_typeahead_text`, and place it in a keymap.
ELinks binds such functions to the current tab when the script reads
them from 'elinks.action', so they will not work right in other tabs.
Use the name of the action instead.
--
[[smjs-elinks.vs]] elinks.vs (view_state)::
This property refers to the <<smjs-view_state-object,view-state
object>> for the current document, if any.
[[smjs-elinks-hooks]]
ELinks Object Hooks
^^^^^^^^^^^^^^^^^^^
These are actually properties, but a special case: one assigns functions
to them, which functions are called at certain events.
In the ELinks source tree, `contrib/smjs/hooks.js` provides a mechanism
with which multiple scripts can add their functions to the same hooks.
Please see `contrib/smjs/README` for details.
[[smjs-elinks.preformat_html]] elinks.preformat_html(cached, vs)::
This function is called every time a document is loaded, before the
document is actually rendered, to give scripts the opportunity to
modify it. The first parameter is the <<smjs-cache_entry-object,cache
object>> and the second is the <<smjs-view_state-object,view-state
object>>.
+
--
The <<smjs-cache_entry-object,cache object>> will not expire until after this
function returns.
--
[[smjs-elinks.goto_url_hook]] elinks.goto_url_hook(url)::
This function is called every time the user enters something in the
'Go to URL' box. The url (string) can be modified or not, and the
returned string is substituted for what the user entered. If the
value `false` is returned, the URL is not changed and further hooks
in ELinks are not run.
[[smjs-elinks.follow_url_hook]] elinks.follow_url_hook(url)::
This function is called every time the user tries to load a document,
whether by following a link, by entering a URI in the Go to URL box,
by setting <<smjs-elinks.location,'elinks.location'>>, or whatever.
It behaves the same as <<smjs-elinks.goto_url_hook,'elinks.goto_url_hook'>>
above.
[[smjs-cache_entry-object]]
Cache Object
~~~~~~~~~~~~
The cache object mentioned in the descriptions of
<<smjs-elinks.load_uri,'elinks.load_uri'>> and
<<smjs-elinks.preformat_html,'elinks.preformat_html'>> is a wrapper for the
internal ELinks cache object. ELinks passes the ECMAScript cache object as an
argument to your ECMAScript function, and keeps the corresponding document in
the cache until the function returns. After that, ELinks may remove the
document from the cache, even if the function has saved the cache object to
some global variable. Such an expired cache object does not work but it does
not crash ELinks either.
[[smjs-cache_entry-properties]]
Cache Object Properties
^^^^^^^^^^^^^^^^^^^^^^^
[[smjs-cache_entry.content]] cached.content (string)::
This is the content received from the server. It can be read and set.
[[smjs-cache_entry.type]] cached.type (string)::
This is the MIME type of the cache entry. It can be read and set.
[[smjs-cache_entry.length]] cached.length (number)::
This is the length of cached.content. It is read-only.
[[smjs-cache_entry.head]] cached.head (string)::
This is the header received from the server. It can be read and set.
[[smjs-cache_entry.uri]] cached.uri (string)::
This is the URI of the cache entry. It is read-only.
[[smjs-view_state-object]]
View-state Object
~~~~~~~~~~~~~~~~~
The view-state object mentioned in the descriptions of
<<smjs-elinks.preformat_html,'elinks.preformat_html'>> and
<<smjs-elinks.vs,'elinks.vs'>> is a wrapper for the internal ELinks view_state
object. The view state holds information on how the current document is being
displayed.
[[smjs-view_state-properties]]
View-state Object Properties
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[[smjs.view_state.plain]] vs.plain (boolean)::
Whether the current document is rendered as HTML or displayed
as plaintext. This can be read and set.
[[smjs.view_state.uri]] vs.uri (string)::
This is the URI of the current document. It is read-only.