aboutsummaryrefslogtreecommitdiffstats
path: root/English.lproj/Moxie Help/pages/.svn/text-base
diff options
context:
space:
mode:
Diffstat (limited to 'English.lproj/Moxie Help/pages/.svn/text-base')
-rw-r--r--English.lproj/Moxie Help/pages/.svn/text-base/bugs.html.svn-base20
-rw-r--r--English.lproj/Moxie Help/pages/.svn/text-base/faq.html.svn-base81
-rw-r--r--English.lproj/Moxie Help/pages/.svn/text-base/function-template.html.svn-base30
-rw-r--r--English.lproj/Moxie Help/pages/.svn/text-base/glossary.html.svn-base27
-rw-r--r--English.lproj/Moxie Help/pages/.svn/text-base/lisp-functions.html.svn-base947
-rw-r--r--English.lproj/Moxie Help/pages/.svn/text-base/lisp-glossary.html.svn-base68
-rw-r--r--English.lproj/Moxie Help/pages/.svn/text-base/navigation.html.svn-base24
-rw-r--r--English.lproj/Moxie Help/pages/.svn/text-base/overview.html.svn-base36
-rw-r--r--English.lproj/Moxie Help/pages/.svn/text-base/plugin.html.svn-base203
-rw-r--r--English.lproj/Moxie Help/pages/.svn/text-base/todo.html.svn-base24
-rw-r--r--English.lproj/Moxie Help/pages/.svn/text-base/whatsnew.html.svn-base83
11 files changed, 1543 insertions, 0 deletions
diff --git a/English.lproj/Moxie Help/pages/.svn/text-base/bugs.html.svn-base b/English.lproj/Moxie Help/pages/.svn/text-base/bugs.html.svn-base
new file mode 100644
index 0000000..b2a5fd5
--- /dev/null
+++ b/English.lproj/Moxie Help/pages/.svn/text-base/bugs.html.svn-base
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+ "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
+<html lang="en">
+ <head>
+ <title>Known Bugs</title>
+ <meta name="generator" content="Emacs!">
+ </head>
+
+ <body>
+ <h1>Known Bugs</h1>
+ <ul>
+ <li>The world selector will not raise the window you select if it's already the frontmost
+ Moxie window, even if Moxie is in the background (it comes next-to-top, for reasons I don't
+ at all understand).</li>
+ <li>Fonts get screwed up fairly frequently, especially when trying to set them via the font panel.</li>
+ <li>The "Choose" button for choosing the REPL font doesn't work at all.</li>
+ <li>Reading from standard-input in Lisp will hang Moxie.</li>
+ </ul>
+ </body>
+</html>
diff --git a/English.lproj/Moxie Help/pages/.svn/text-base/faq.html.svn-base b/English.lproj/Moxie Help/pages/.svn/text-base/faq.html.svn-base
new file mode 100644
index 0000000..a80cde3
--- /dev/null
+++ b/English.lproj/Moxie Help/pages/.svn/text-base/faq.html.svn-base
@@ -0,0 +1,81 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+ "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
+<html lang="en">
+ <head>
+ <title>Frequently Asked Questions</title>
+ <meta name="generator" content="Emacs!">
+ </head>
+
+ <body>
+ <h1>Frequently Asked Questions</h1>
+
+ <dt><strong>How do I write a trigger, alias, or macro?</strong></dt>
+ <dd>
+ <p>First of all, Moxie makes no distinction between triggers, aliases, and macros. We
+ treat all of these things in the same way: as a <a href="plugin.html">plugin</a>.</p>
+
+ <p>All plugins are written in Common Lisp, so you'll have to have some grounding in
+ Lisp to do anything serious at the moment (although I have some ideas for simpler
+ interfaces for the non-programming-minded in the future). There are a few support
+ routines included in the MOXIE <a href="lisp-glossary.html#package">package</a> to
+ simplify common plugin tasks, such as triggers and aliases.</p>
+ </dd>
+
+ <dt><strong>LISP?! Why would you do that?</strong></dt>
+ <dd>
+ <p>Because I didn't want to have to write my own language for triggers, aliases, and
+ macros. No matter how much I worked on it, I wasn't going to get the kind of
+ programmability I wanted without embedding a full programming language.
+ I also think it's something of a waste of time to learn a new language just for the
+ purpose of programming a trigger in your MUX client.
+ </p>
+ <p>I could have just used AppleScript as the language of choice, and came very
+ close to doing so a number of times, but I had too much trouble trying to get
+ AS and ObjC talking as well as I'd liked, and, frankly, I don't consider it to
+ be full-featured enough.</p>
+ <p>So I chose to embed a language. There are, theoretically, a fair number
+ of popular languages I could have embedded, however, I chose Lisp for the
+ following reasons:
+ <ul>
+ <li>Real-time development. I feel that, in the scope of Moxie, having a fully
+ interactive development style is extremely useful. As far as I know, this
+ excludes PERL as a possibility.</li>
+ <li>Lisp has been ratified by ANSI, and is one of the few languages to do so. It
+ has a very large "library" that is standard from one lisp implementation to the
+ next, so as long as you've found code that's "Common Lisp" you've found code that
+ will work with Moxie.</li>
+ <li>Lisp is the second-oldest language still in use, after FORTRAN. While not
+ the largest consideration, it does guarantee that there's a fair amount of code
+ available for free in the world. Emacs, for example, has a huge amount of contributed
+ Emacs-Lisp code (which, while not common-lisp, is often easily ported).</li>
+ <li>And finally, because I can. I like Lisp, and I'm writing Moxie, so I get to pick.
+ "Give me real macros, or give me death!"</li>
+ </ul>
+ </p>
+ </dd>
+
+ <dt><strong>Where can I find more information on Lisp programming?</strong></dt>
+ <dd>
+ <p>There are a number of web sites devoted to Lisp programming. Below, I'll list a few
+ resources that should get you pointed in the right direction:
+ <ul>
+ <li><a href="lisp-glossary.html#cliki">CLiki's</a>
+ <a href="http://www.cliki.net/Online%20Tutorial" target="new">Online Tutorial</a> page
+ can get you started if you're completely new.</li>
+ <li><a href="http://www.paulgraham.com" target="new">Paul Graham</a> has a lot of
+ information on Lisp, including a free book for the more serious programmers.</li>
+ </ul>
+ </p>
+ </dd>
+
+ <dt><strong>What is the REPL?</strong></dt>
+ <dd>
+ <p>The <a href="lisp-glossary.html#repl">REPL</a> is your direct
+ interface to the Lisp sub-system. It is the key to fully interactive programming. Via
+ the REPL you can input Lisp commands directly and see the results - any Lisp will work
+ here, including function definitions. This allows you to write a function, test it, and
+ debug it, all without leaving the REPL, and with a much finer grain of control than with
+ a compile cycle.</p>
+ </dd>
+ </body>
+</html>
diff --git a/English.lproj/Moxie Help/pages/.svn/text-base/function-template.html.svn-base b/English.lproj/Moxie Help/pages/.svn/text-base/function-template.html.svn-base
new file mode 100644
index 0000000..da624de
--- /dev/null
+++ b/English.lproj/Moxie Help/pages/.svn/text-base/function-template.html.svn-base
@@ -0,0 +1,30 @@
+ <hr>
+ <p><a id="NAME"><i>Function</i> <b>NAME</b></a></p>
+ <p><b>Syntax:</b></p>
+ <p>
+ <b>NAME</b> <i>ARG</i> => <i>RETURN-VALUE</i>
+ </p>
+
+ <p><b>Arguments and Values:</b></p>
+ <p>
+ <p><i>ARG</i>---A <i>TYPE</i>.</p>
+ <p><i>RETURN-VALUE</i>---An <i>TYPE</i>.</p>
+ </p>
+
+ <p><b>Description:</b> None.</p>
+
+ <p><b>Examples:</b></p>
+ <p><pre>CODE</pre></p>
+
+ <p><b>Side Effects:</b> None.</p>
+
+ <p><b>Affected By:</b> None.</p>
+
+ <p><b>Exceptional Situations:</b> None</p>
+
+ <p><b>See Also:</b></p>
+ <p>
+ <b><a href="#function">FUNCTION</a></b>
+ </p>
+
+ <p><b>Notes:</b> None</p>
diff --git a/English.lproj/Moxie Help/pages/.svn/text-base/glossary.html.svn-base b/English.lproj/Moxie Help/pages/.svn/text-base/glossary.html.svn-base
new file mode 100644
index 0000000..3606388
--- /dev/null
+++ b/English.lproj/Moxie Help/pages/.svn/text-base/glossary.html.svn-base
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+ "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
+<html lang="en">
+ <head>
+ <title>
+ Glossary
+ </title>
+ <meta name="generator" content="Emacs!">
+ </head>
+
+ <body>
+ <h1>
+ Glossary
+ </h1>
+ <ul>
+ <li>
+ <dt> <a id="mux">MUX</a> </dt>
+ <dd> A generic term meaning any of the variety of multi-user environments:
+ MUSH, MUD, MOO, etc.,.</dd>
+ </li>
+ <li>
+ <dt><a id="world">World</a></dt>
+ <dd>The file containing the preferences for a particular connection.</dd>
+ </li>
+ </ul>
+ </body>
+</html>
diff --git a/English.lproj/Moxie Help/pages/.svn/text-base/lisp-functions.html.svn-base b/English.lproj/Moxie Help/pages/.svn/text-base/lisp-functions.html.svn-base
new file mode 100644
index 0000000..a6091c7
--- /dev/null
+++ b/English.lproj/Moxie Help/pages/.svn/text-base/lisp-functions.html.svn-base
@@ -0,0 +1,947 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+ "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
+
+
+<html lang="en">
+ <head>
+ <title>Lisp Functions</title>
+ <meta name="generator" content="Emacs!">
+ </head>
+
+ <body>
+ <h1>Moxie plugin functions</h1>
+ <p>These functions are all exported from the <code>MOXIE</code>
+ <a href="lisp-glossary.html#package">package</a>.
+ </p>
+ <p>
+ Contents:
+ <ul>
+ <li><a href="#world-var">world-var</a></li>
+ <li><a href="#add-hook">add-hook</a></li>
+ <li><a href="#remove-hook">remove-hook</a></li>
+ <li><a href="#run-hook">run-hook</a></li>
+ <li><a href="#add-keyword">add-keyword</a></li>
+ <li><a href="#remove-keyword">remove-keyword</a></li>
+ <li><a href="#add-keystroke-macro">add-keystroke-macro</a></li>
+ <li><a href="#remove-keystroke-macro">remove-keystroke-macro</a></li>
+ <li><a href="#send-to-mux">send-to-mux</a></li>
+ <li><a href="#print-to-world">print-to-world</a></li>
+ <li><a href="#set-status-buffer">set-status-buffer</a></li>
+ <li><a href="#enable-logging">enable-logging</a></li>
+ <li><a href="#disable-logging">disable-logging</a></li>
+ <li><a href="#make-attributed-string">make-attributed-string</a></li>
+<!--
+ We're going to lose these functions, in preference to a key/value
+ system.
+
+ <li><a href="#make-range">make-range</a></li>
+ <li><a href="#make-font">make-font</a></li>
+ <li><a href="#make-color">make-color</a></li>
+ <li><a href="#make-super">make-super</a></li>
+ <li><a href="#make-underline">make-underline</a></li>
+ <li><a href="#make-link">make-link</a></li> -->
+
+ <li><a href="#escape-mux-string">escape-mux-string</a></li>
+ <li><a href="#map-variables">map-variables</a></li>
+ </ul>
+ </p>
+
+ <hr>
+ <p><a id="world-var"><i>Function</i> <b>WORLD-VAR</b></a></p>
+ <p><b>Syntax:</b></p>
+ <p>
+ <b>world-var</b> <i>name</i> <code>&amp;optional</code> (<i>world-id</i> <i>*world*</i>) => <i>result</i>
+ </p>
+ <p>
+ (setf (<b>world-var</b> <i>name</i> <code>&amp;optional</code> (<i>world-id</i> *world*)) <i>new-value</i>)
+ </p>
+
+ <p><b>Arguments and Values:</b></p>
+ <p>
+ <p><i>name</i>---an <i><a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_o.htm#object">object</a></i>.</p>
+ <p><i>world-id</i>---an <i><a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_o.htm#object">object</a></i>.</p>
+ <p><i>result</i>---an <i><a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_o.htm#object">object</a></i>.</p>
+ </p>
+
+ <p><b>Description:</b></p>
+ <p>
+ <b>world-var</b> is used to associate <a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_v.htm#value">values</a></i>, which are persistent throughout the application's lifetime, with <i>name</i> for a particular Moxie world, which has the unique identifier, <i>world-id</i>.
+ </p>
+ <p>
+ <b><a href="http://www.lispworks.com/reference/HyperSpec/Body/m_setf_.htm#setf">setf</a></b> may be used with <b><a href="#world-var">world-var</a></b> to modify the <i><a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_v.htm#value">values</a></i> associated with a given <i>name</i>, or to add a new entry.
+ </p>
+
+ <p><b>Examples:</b></p>
+ <p><pre> (setf (world-var :foo 0) 'bar) => BAR
+ (world-var :foo 0) => BAR
+ (world-var :foo 1) => NIL
+ (setf (world-var :foo 1) 'YOW) => YOW
+ (world-var :foo 1) => YOW
+ (world-var :foo 0) => BAR</pre></p>
+
+ <p><b>Side Effects:</b> None.</p>
+
+ <p><b>Affected By:</b> None.</p>
+
+ <p><b>Exceptional Situations:</b> None</p>
+
+ <p><b>Notes:</b></p>
+ <p>
+ <i>world-id</i> is available as the <code>*world*</code> special variable.
+ </p>
+
+ <hr>
+ <p><a id="add-hook"><i>Function</i> <b>ADD-HOOK</b></a></p>
+ <p><b>Syntax:</b></p>
+ <p>
+ <b>add-hook</b> <i>function</i> <i>mode</i> => <i>hook-list</i>
+ </p>
+
+ <p><b>Arguments and Values:</b></p>
+ <p>
+ <p><i>function</i>--a <i><a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_f.htm#function_designator">function designator</a></i>.
+ <p><i>mode</i>---A <i><a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_k.htm#keyword">keyword</a></i>.</p>
+ <p><i>hook-list</i>---A <i><a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_l.htm#list">list</a></i> containing the active <i>functions</i> for <i>mode</i>.</p>
+ </p>
+
+ <p><b>Description:</b></p>
+ <p><b>add-hook</b> adds <i>function</i> to the list of functions to be run when
+ the hook <i>mode</i> is executed via <b>run-hook</b>.</p>
+
+ <p><b>Examples:</b></p>
+ <p><pre>
+ (defun my-printer (string)
+ (let ((string (if (stringp string) string (car string))))
+ (concatenate 'string "TEST: " string))) => MY-PRINTER
+ (add-hook 'my-printer :output-from-server-hook) => (MY-PRINTER)
+ (run-hook :output-from-server-hook "foo") => "TEST: foo"
+ (defun 'do-nothing (&amp;rest args) nil) => DO-NOTHING
+ (add-hook 'do-nothing :output-from-server-hook) => (MY-PRINTER DO-NOTHING)
+ (run-hook :output-from-server-hook "foo") => "TEST: foo"</pre>
+ </p>
+
+ <p><b>Side Effects:</b></p>
+ <p><i>function</i> will be run by <b>run-hook</b> for <i>mode</i>.</p>
+
+ <p><b>Affected By:</b> None.</p>
+
+ <p><b>Exceptional Situations:</b> None</p>
+
+ <p><b>See Also:</b></p>
+ <p>
+ <b><a href="#remove-hook">remove-hook</a></b>
+ <b><a href="#run-hook">run-hook</a></b>
+ </p>
+
+ <p><b>Notes:</b>
+ <p>If <i>function</i> is already on the hook list for <i>mode</i>, it will
+ not be added again.</p>
+
+ <hr>
+ <p><a id="remove-hook"><i>Function</i> <b>REMOVE-HOOK</b></a></p>
+ <p><b>Syntax:</b></p>
+ <p>
+ <b>remove-hook</b> <i>function</i> <i>mode</i> => <i>hook-list</i>
+ </p>
+
+ <p><b>Arguments and Values:</b></p>
+ <p>
+ <p><i>function</i>--a <i><a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_f.htm#function_designator">function designator</a></i>.
+ <p><i>mode</i>---A <i><a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_k.htm#keyword">keyword</a></i>.</p>
+ <p><i>hook-list</i>---A <i><a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_l.htm#list">list</a></i> containing the active <i>functions</i> for <i>mode</i>.</p>
+ </p>
+
+ <p><b>Description:</b> None.</p>
+
+ <p><b>Examples:</b></p>
+ <p><pre>
+ (remove-hook 'my-printer :output-from-server-hook) => NIL</pre></p>
+
+ <p><b>Side Effects:</b></p>
+ <p><i>function</i> is no longer called by <code>run-hook</code>.</p>
+
+ <p><b>Affected By:</b> None.</p>
+
+ <p><b>Exceptional Situations:</b> None</p>
+
+ <p><b>See Also:</b></p>
+ <p>
+ <b><a href="#add-hook">add-hook</a></b>
+ <b><a href="#run-hook">run-hook</a></b>
+ </p>
+
+ <p><b>Notes:</b></p>
+ <p>
+ If <i>function</i> is not on the hook list for <i>mode</i>, the hook list is
+ returned without change. You can use this facility to get the current list
+ of <i>functions</i> for <i>mode</i> by removing <a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_n.htm#nil">NIL</a> from the hook list.
+ </p>
+
+ <hr>
+ <p><a id="run-hook"><i>Function</i> <b>RUN-HOOK</b></a></p>
+ <p><b>Syntax:</b></p>
+ <p>
+ <b>run-hook</b> <i>mode</i> <code><i>&amp;optional</i></code> <i>arg</i>
+ => <i>result*</i>
+ </p>
+
+ <p><b>Arguments and Values:</b></p>
+ <p>
+ <p><i>mode</i>---a <i><a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_k.htm#keyword">keyword</a></i>.</p>
+ <p><i>arg</i>---an <i><a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_o.htm#object">object</a></i>.</p>
+ <p><i>results</i>---the <i><a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_v.htm#value">values</a></i> returned by the last non-NIL terminating function.</p>
+ </p>
+
+ <p><b>Description:</b></p>
+ <p>
+ <a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_a.htm#apply">Applies</a> the
+ <i>functions</i> for <i>mode</i> to the <i>args</i>.
+ </p>
+ <p>
+ A hook-list acts as a filter, passing the output of one filter into the input of
+ the next. If a function on the hook-list returns <b>NIL</b>, it is treated in this iteration
+ as if it hadn't been on the hook-list in the first place. Thus, the only time
+ <b>run-hook</b> returns <b>NIL</b> is when every function on the hook-list returns
+ <b>NIL</b>.
+ </p>
+
+ <p><b>Examples:</b></p>
+ <p><pre>
+ (run-hook :output-from-server-hook "Foobar!") => "TEST: Foobar!"</pre></p>
+
+ <p><b>Side Effects:</b> None.</p>
+
+ <p><b>Affected By:</b></p>
+ <p>
+ The hook list for <i>mode</i>. All the functions on the list are called, in
+ order. The last function which returns a non-nil value is used as the result
+ function.
+ </p>
+
+ <p><b>Exceptional Situations:</b></p>
+ <p>
+ If a <i>function</i> on the hook list for <i>mode</i> is not a function
+ designator, an error will be raised.
+ </p>
+
+ <p><b>See Also:</b></p>
+ <p>
+ <b><a href="#add-hook">add-hook</a></b>
+ <b><a href="#remove-hook">remove-hook</a></b>
+ </p>
+
+ <p><b>Notes:</b> None.</p>
+
+ <hr>
+ <p><a id="add-keyword"><i>Function</i> <b>ADD-KEYWORD</b></a></p>
+ <p><b>Syntax:</b></p>
+ <p>
+ <b>add-keyword</b> <i>function</i> <i>keyword</i> => <i>result</i>
+ </p>
+
+ <p><b>Arguments and Values:</b></p>
+ <p>
+ <p><i>function</i>--a <i><a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_f.htm#function_designator">function designator</a></i>.
+ <p><i>keyword</i>---a <i><a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_s.htm#string">string</a></i>.</p>
+ <p><i>result</i>---the <i><a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_f.htm#function_designator">function designator</a></i> for <i>keyword</i>.</p>
+ </p>
+
+ <p><b>Description:</b> None.</p>
+
+ <p><b>Examples:</b></p>
+ <p><pre> (defun my-keyword (args)
+ (format t "Keyword expander: ~S~%" args)) => MY-KEYWORD
+ (add-keyword 'my-keyword "foo") => MY-KEYWORD</pre></p>
+
+ <p><b>Side Effects:</b></p>
+ <p>
+ <i>keyword</i> is registered for keyword expansion.
+ </p>
+
+ <p><b>Affected By:</b> None.</p>
+
+ <p><b>Exceptional Situations:</b> None</p>
+
+ <p><b>See Also:</b></p>
+ <p>
+ <b><a href="#remove-keyword">remove-keyword</a></b>
+ </p>
+
+ <p><b>Notes:</b></p>
+ <p>
+ The keyword expander compares keywords in a case insensitive fashion. So "FOO" and
+ "foo" are equivalent.
+ </p>
+
+ <hr>
+ <p><a id="remove-keyword"><i>Function</i> <b>REMOVE-KEYWORD</b></a></p>
+ <p><b>Syntax:</b></p>
+ <p>
+ <b>remove-keyword</b> <i>keyword</i> => <i>result</i>
+ </p>
+
+ <p><b>Arguments and Values:</b></p>
+ <p>
+ <p><i>keyword</i>---a <i><a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_s.htm#string">string</a></i>.</p>
+ <p><i>result</i>---the <a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_t.htm#t">T</a> on successful removal. <a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_n.htm#nil">NIL</a> otherwise.
+ </p>
+
+ <p><b>Description:</b> None.</p>
+
+ <p><b>Examples:</b></p>
+ <p><pre> (remove-keyword "foo") => T
+ (remove-keyword "foo") => NIL</pre></p>
+
+ <p><b>Side Effects:</b></p>
+ <p>
+ <i>keyword</i> is no longer expanded by the keyword expander.
+ </p>
+
+ <p><b>Affected By:</b> None.</p>
+
+ <p><b>Exceptional Situations:</b> None</p>
+
+ <p><b>See Also:</b></p>
+ <p>
+ <b><a href="#add-keyword">add-keyword</a></b>
+ </p>
+
+ <p><b>Notes:</b></p>
+ <p>
+ The keyword expander compares keywords in a case insensitive fashion. So "FOO" and
+ "foo" are equivalent.
+ </p>
+
+ <hr>
+ <p><a id="add-keystroke-macro"><i>Function</i> <b>ADD-KEYSTROKE-MACRO</b></a></p>
+ <p><b>Syntax:</b></p>
+ <p>
+ <b>add-keystroke-macro</b> <i>function</i> <i>keystroke</i> => <i>result</i>
+ </p>
+
+ <p><b>Arguments and Values:</b></p>
+ <p>
+ <p><i>function</i>--a <i><a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_f.htm#function_designator">function designator</a></i>.
+ <p><i>keystroke</i>---a <i><a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_k.htm#keyword">keyword</a></i>.</p>
+ <p><i>result</i>---the <i><a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_f.htm#function_designator">function designator</a></i> for <i>keyword</i>.</p>
+ </p>
+
+ <p><b>Description:</b> None.</p>
+
+ <p><b>Examples:</b></p>
+ <p><pre> (defun my-keystroke-macro (keystroke)
+ (format t "Should expand keystroke ~S here.~%" keystroke)) => MY-KEYSTROKE-MACRO
+ (add-keystroke-macro 'my-keystroke-macro :f1) => MY-KEYSTROKE-MACRO</pre></p>
+
+ <p><b>Side Effects:</b></p>
+ <p>
+ <i>function</i> is called when <i>keystroke</i> is pressed.
+ </p>
+
+ <p><b>Affected By:</b> None.</p>
+
+ <p><b>Exceptional Situations:</b> None</p>
+
+ <p><b>See Also:</b></p>
+ <p>
+ <b><a href="#remove-keystroke-macro">remove-keystroke-macro</a></b>
+ </p>
+
+ <p><b>Notes:</b></p>
+ <p>
+ Unlike most other functions defined here, keystrokes don't do anything by default.
+ This means that in order to achieve some user-visible result, you'll have to use
+ the lower level functions <b>print-to-world</b>, or <b>send-to-mux</b>..
+ </p>
+ <p><b>This format is likely to change very soon!</b></p>
+ <p>
+ Keystrokes, currently, are <i><a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_k.htm#keyword">keywords</a></i> with the following format:
+ <pre>
+ keystroke := :[&lt;modifier&gt;-]*&lt;keycode&gt;
+ modifier := cmd|opt|ctrl|shift|numpad
+ keycode := &lt;fkey&gt;|character
+ fkey := f1 .. fn .. f35</pre>
+ So, hitting 8 on the number pad, while the command key is down yields the keyword: <code>:cmd-numpad-8</code>
+ </p>
+
+ <hr>
+ <p><a id="remove-keystroke-macro"><i>Function</i> <b>REMOVE-KEYSTROKE-MACRO</b></a></p>
+ <p><b>Syntax:</b></p>
+ <p>
+ <b>remove-keystroke-macro</b> <i>keystroke</i> => <i>result</i>
+ </p>
+
+ <p><b>Arguments and Values:</b></p>
+ <p>
+ <p><i>keystroke</i>---a <i><a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_k.htm#keyword">keyword</a></i>.</p>
+ <p><i>result</i>---<a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_t.htm#t">T</a>, if the keystroke was previously registered, <a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_t.htm#nil">NIL</a> otherwise.</p>
+ </p>
+
+ <p><b>Description:</b> None.</p>
+
+ <p><b>Examples:</b></p>
+ <p><pre> (remove-keystroke-macro :f1) => T
+ (remove-keystroke-macro :f1) => NIL</pre></p>
+
+ <p><b>Side Effects:</b></p>
+ <p>
+ <i>keystroke</i> no longer triggers a function call.
+ </p>
+
+ <p><b>Affected By:</b> None.</p>
+
+ <p><b>Exceptional Situations:</b> None</p>
+
+ <p><b>See Also:</b></p>
+ <p>
+ <b><a href="#add-keystroke-macro">add-keystroke-macro</a></b>
+ </p>
+
+ <p><b>Notes:</b></p>
+ <p><b>This format is likely to change very soon!</b></p>
+ <p>
+ Keystrokes, currently, are <i><a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_k.htm#keyword">keywords</a></i> with the following format:
+ <pre>
+ keystroke := :[&lt;modifier&gt;-]*&lt;keycode&gt;
+ modifier := cmd|opt|ctrl|shift|numpad
+ keycode := &lt;fkey&gt;|character
+ fkey := f1 .. fn .. f35</pre>
+ So, hitting 8 on the number pad, while the command key is down yields the keyword: <code>:cmd-numpad-8</code>
+ </p>
+
+ <hr>
+ <p><a id="send-to-mux"><i>Function</i> <b>SEND-TO-MUX</b></a></p>
+ <p><b>Syntax:</b></p>
+ <p>
+ <b>send-to-mux</b> <i>world-id</i> <i>string</i>
+ </p>
+
+ <p><b>Arguments and Values:</b></p>
+ <p>
+ <p><i>world-id</i>---an <i><a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_o.htm#object">object</a></i>.</p>
+ <p><i>string</i>---a <i><a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_s.htm#string">string</a></i>.</p>
+ </p>
+
+ <p><b>Description:</b></p>
+ <p>
+ This is the low-level function to send data to the MUX server associated with
+ <i>world-id</i>. Currently, you can only send a string command, which will be
+ interpreted by the MUX directly. This may change in the future to allow for
+ attributed strings.
+ </p>
+
+ <p><b>Examples:</b></p>
+ <p><pre> (send-to-mux *world* (format nil "Wauug!~%"))</pre></p>
+
+ <p><b>Side Effects:</b> None.</p>
+
+ <p><b>Affected By:</b> None.</p>
+
+ <p><b>Exceptional Situations:</b> None</p>
+
+ <p><b>See Also:</b></p>
+ <p>
+ <b><a href="#print-to-world">print-to-world</a></b>
+ <b><a href="#set-status-buffer">set-status-buffer</a></b>
+ </p>
+
+ <p><b>Notes:</b></p>
+ <p>
+ <i>world-id</i> is available as the <code>*world*</code> special variable.
+ </p>
+
+ <hr>
+ <p><a id="print-to-world"><i>Function</i> <b>PRINT-TO-WORLD</b></a></p>
+ <p><b>Syntax:</b></p>
+ <p>
+ <b>print-to-world</b> <i>world-id</i> <i>arg</i>
+ </p>
+
+ <p><b>Arguments and Values:</b></p>
+ <p>
+ <p><i>world-id</i>---an <i><a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_o.htm#object">object</a></i>.</p>
+ <p><i>string</i>---a <i><a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_s.htm#string">string</a></i>.</p>
+ </p>
+
+ <p><b>Description:</b></p>
+ <p>
+ This is the low-level function to send data to the Moxie's world output view
+ associated with <i>world-id</i>. You can send either a normal string or an
+ attributed string for printing.
+ </p>
+
+ <p><b>Examples:</b></p>
+ <p><pre> (print-to-world *world* (format nil "Wauug!~%"))</pre></p>
+
+ <p><b>Side Effects:</b> None.</p>
+
+ <p><b>Affected By:</b> None.</p>
+
+ <p><b>Exceptional Situations:</b> None</p>
+
+ <p><b>See Also:</b></p>
+ <p>
+ <b><a href="#send-to-mux">send-to-mux</a></b>
+ <b><a href="#set-status-buffer">set-status-buffer</a></b>
+ <b><a href="#make-attributed-string">make-attributed-string</a></b>
+ </p>
+
+ <p><b>Notes:</b></p>
+ <p>
+ <i>world-id</i> is available as the <code>*world*</code> special variable.
+ </p>
+
+ <hr>
+ <p><a id="set-status-buffer"><i>Function</i> <b>SET-STATUS-BUFFER</b></a></p>
+ <p><b>Syntax:</b></p>
+ <p>
+ <b>set-status-buffer</b> <i>world-id</i> <i>string</i>
+ </p>
+
+ <p><b>Arguments and Values:</b></p>
+ <p>
+ <p><i>world-id</i>---an <i><a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_o.htm#object">object</a></i>.</p>
+ <p><i>string</i>---a <i><a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_s.htm#string">string</a></i>.</p>
+ </p>
+
+ <p><b>Description:</b></p>
+ <p>
+ Sets the status buffer of the window associated with <i>world-id</i> to <i>string</i>.
+ </p>
+
+ <p><b>Examples:</b></p>
+ <p><pre> (set-status-buffer *world* "Hello, world!")</pre></p>
+
+ <p><b>Side Effects:</b> None.</p>
+
+ <p><b>Affected By:</b> None.</p>
+
+ <p><b>Exceptional Situations:</b> None</p>
+
+ <p><b>See Also:</b></p>
+ <p>
+ <b><a href="#send-to-mux">send-to-mux</a></b>
+ <b><a href="#print-to-world">print-to-world</a></b>
+ </p>
+
+ <p><b>Notes:</b></p>
+ <p>
+ <i>world-id</i> is available as the <code>*world*</code> special variable.
+ </p>
+
+ <hr>
+ <p><a id="enable-logging"><i>Function</i> <b>ENABLE-LOGGING</b></a></p>
+ <p><b>Syntax:</b></p>
+ <p>
+ <b>enable-logging</b> <i>world-id</i>
+ </p>
+
+ <p><b>Arguments and Values:</b></p>
+ <p>
+ <p><i>world-id</i>---an <i><a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_o.htm#object">object</a></i>.</p>
+ </p>
+
+ <p><b>Description:</b></p>
+ <p>
+ Enables logging for the world associated with <i>world-id</i>.
+ </p>
+
+ <p><b>Examples:</b></p>
+ <p><pre> (enable-logging *world*)</pre></p>
+
+ <p><b>Side Effects:</b> None.</p>
+
+ <p><b>Affected By:</b> None.</p>
+
+ <p><b>Exceptional Situations:</b> None</p>
+
+ <p><b>See Also:</b></p>
+ <p>
+ <b><a href="#disable-logging">disable-logging</a></b>
+ </p>
+
+ <p><b>Notes:</b></p>
+ <p>
+ <i>world-id</i> is available as the <code>*world*</code> special variable.
+ </p>
+
+ <hr>
+ <p><a id="disable-logging"><i>Function</i> <b>DISABLE-LOGGING</b></a></p>
+ <p><b>Syntax:</b></p>
+ <p>
+ <b>disable-logging</b> <i>world-id</i>
+ </p>
+
+ <p><b>Arguments and Values:</b></p>
+ <p>
+ <p><i>world-id</i>---an <i><a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_o.htm#object">object</a></i>.</p>
+ </p>
+
+ <p><b>Description:</b></p>
+ <p>
+ Disables logging for the world associated with <i>world-id</i>.
+ </p>
+
+ <p><b>Examples:</b></p>
+ <p><pre> (disable-logging *world*)</pre></p>
+
+ <p><b>Side Effects:</b> None.</p>
+
+ <p><b>Affected By:</b> None.</p>
+
+ <p><b>Exceptional Situations:</b> None</p>
+
+ <p><b>See Also:</b></p>
+ <p>
+ <b><a href="#enable-logging">enable-logging</a></b>
+ </p>
+
+ <p><b>Notes:</b></p>
+ <p>
+ <i>world-id</i> is available as the <code>*world*</code> special variable.
+ </p>
+
+ <hr>
+ <p><a id="make-attributed-string"><i>Function</i> <b>MAKE-ATTRIBUTED-STRING</b></a></p>
+ <p><b>Syntax:</b></p>
+ <p>
+ <b>make-attributed-string</b> <i>string</i> <code>&amp;rest</code> <i>attribute*</i> => <i>result</i>
+ </p>
+
+ <p><b>Arguments and Values:</b></p>
+ <p>
+ <p><i>string</i>---a <i><a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_s.htm#string">string</a></i>.</p>
+ <p><i>attributes</i>---a <i><a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_l.htm#list">list</a></i>.</p>
+ <p><i>result</i>---a <i><a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_l.htm#list">list</a></i>.</p>
+ </p>
+
+ <p><b>Description:</b></p>
+ <p>
+ Creates a string with attributes applied to it. This allows you to change various display properties of the string, such as the color, font, and style.
+ </p>
+
+ <p><b>Examples:</b></p>
+ <p><pre>
+ (make-attributed-string "Wauug!" (make-range 0 (length "Wauug!"))
+ (make-color 100 100 100)
+ (make-underline 1)) => ("Wauug!" ((:RANGE 0 6)
+ (:COLOR 100 100 100)
+ (:UNDERLINE 1)))</pre></p>
+
+ <p><b>Side Effects:</b> None.</p>
+
+ <p><b>Affected By:</b> None.</p>
+
+ <p><b>Exceptional Situations:</b> None</p>
+
+ <p><b>See Also:</b></p>
+ <p>
+ <b><a href="#make-range">make-range</a></b>
+ <b><a href="#make-font">make-font</a></b>
+ <b><a href="#make-color">make-color</a></b>
+ <b><a href="#make-super">make-super</a></b>
+ <b><a href="#make-underline">make-underline</a></b>
+ <b><a href="#make-link">make-link</a></b>
+ </p>
+
+ <p><b>Notes:</b></p>
+ <p>
+ The only hook, currently, which can use attributed strings is <code>:output-from-server-hook</code>, which calls on <code>print-to-world</code> to display results. Those are the only places within Moxie to which you should be sending attributed strings.
+ </p>
+
+ <hr>
+ <p><a id="make-range"><i>Function</i> <b>MAKE-RANGE</b></a></p>
+ <p><b>Syntax:</b></p>
+ <p>
+ <b>make-range</b> <i>index</i> <i>length</i> => <i>result</i>
+ </p>
+
+ <p><b>Arguments and Values:</b></p>
+ <p>
+ <p><i>index</i>---a <i><a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_b.htm#bounding_index_designator">bounding index designator</a></i>.
+ <p><i>length</i>---a non-negative <i><a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_i.htm#integer">integer</a></i>.
+ <p><i>result</i>---a <i><a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_l.htm#list">list</a></i>.</p>
+ </p>
+
+ <p><b>Description:</b></p>
+ <p>
+ Creates a <i>range</i> object from <i>index</i> for a <i>length</i>.
+ </p>
+
+ <p><b>Examples:</b></p>
+ <p><pre> (make-range 0 (length "Wauug!")) => (:RANGE 0 6)</pre></p>
+
+ <p><b>Side Effects:</b> None.</p>
+
+ <p><b>Affected By:</b> None.</p>
+
+ <p><b>Exceptional Situations:</b> None</p>
+
+ <p><b>See Also:</b></p>
+ <p>
+ <b><a href="#make-attributed-string">make-attributed-string</a></b>
+ <b><a href="#make-font">make-font</a></b>
+ <b><a href="#make-color">make-color</a></b>
+ <b><a href="#make-super">make-super</a></b>
+ <b><a href="#make-underline">make-underline</a></b>
+ <b><a href="#make-link">make-link</a></b>
+ </p>
+
+ <p><b>Notes:</b></p>
+ <p>
+ This function is likely to go away in the future as the attributed string mechansism gets cleaned up.
+ </p>
+
+ <hr>
+ <p><a id="make-font"><i>Function</i> <b>MAKE-FONT</b></a></p>
+ <p><b>Syntax:</b></p>
+ <p>
+ <b>make-font</b> <i>name</i> <i>size</i> => <i>result</i>
+ </p>
+
+ <p><b>Arguments and Values:</b></p>
+ <p>
+ <p><i>name</i>---a <i><a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_s.htm#string">string</a></i>.</p>
+ <p><i>size</i>---a <i><a href="http://www.lispworks.com/reference/HyperSpec/Body/t_real.htm#real">real</a></i>.
+ </p>
+ <p><i>result</i>---a <i><a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_l.htm#list">list</a></i>.</p>
+ </p>
+
+ <p><b>Description:</b></p>
+ <p>
+ Creates a <i>font</i> object. The font is located by <i>name</i> and is <i>size</i> points high.
+ </p>
+
+ <p><b>Examples:</b></p>
+ <p><pre> (make-font "apple-monaco" 12.0) => (:FONT "apple-monaco" 12.0)</pre></p>
+
+ <p><b>Side Effects:</b> None.</p>
+
+ <p><b>Affected By:</b> None.</p>
+
+ <p><b>Exceptional Situations:</b> None</p>
+
+ <p><b>See Also:</b></p>
+ <p>
+ <b><a href="#make-attributed-string">make-attributed-string</a></b>
+ <b><a href="#make-range">make-range</a></b>
+ <b><a href="#make-color">make-color</a></b>
+ <b><a href="#make-super">make-super</a></b>
+ <b><a href="#make-underline">make-underline</a></b>
+ <b><a href="#make-link">make-link</a></b>
+ </p>
+
+ <hr>
+ <p><a id="make-color"><i>Function</i> <b>MAKE-COLOR</b></a></p>
+ <p><b>Syntax:</b></p>
+ <p>
+ <b>make-color</b> <i>red-value</i> <i>green-value</i> <i>blue-value</i> => <i>result</i>
+ </p>
+
+ <p><b>Arguments and Values:</b></p>
+ <p>
+ <p><i>red-value</i>---an <i><a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_i.htm#integer">integer</a></i> between 0 and 255.
+ <p><i>green-value</i>---an <i><a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_i.htm#integer">integer</a></i> between 0 and 255.
+ <p><i>blue-value</i>---an <i><a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_i.htm#integer">integer</a></i> between 0 and 255.
+ <p><i>result</i>---a <i><a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_l.htm#list">list</a></i>.</p>
+ </p>
+
+ <p><b>Description:</b></p>
+ <p>
+ Creates a <i>color</i> object with the specified values for red, green, and blue.
+ </p>
+
+ <p><b>Examples:</b></p>
+ <p><pre> (make-color 100 100 100) => (:COLOR 100 100 100)</pre></p>
+
+ <p><b>Side Effects:</b> None.</p>
+
+ <p><b>Affected By:</b> None.</p>
+
+ <p><b>Exceptional Situations:</b> None</p>
+
+ <p><b>See Also:</b></p>
+ <p>
+ <b><a href="#make-attributed-string">make-attributed-string</a></b>
+ <b><a href="#make-range">make-range</a></b>
+ <b><a href="#make-font">make-font</a></b>
+ <b><a href="#make-super">make-super</a></b>
+ <b><a href="#make-underline">make-underline</a></b>
+ <b><a href="#make-link">make-link</a></b>
+ </p>
+
+ <hr>
+ <p><a id="make-super"><i>Function</i> <b>MAKE-SUPER</b></a></p>
+ <p><b>Syntax:</b></p>
+ <p>
+ <b>make-super</b> <i>level</i> => <i>result</i>
+ </p>
+
+ <p><b>Arguments and Values:</b></p>
+ <p>
+ <p><i>level</i>---a non-negative <i><a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_i.htm#integer">integer</a></i>.
+ <p><i>result</i>---a <i><a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_l.htm#list">list</a></i>.</p>
+ </p>
+
+ <p><b>Description:</b></p>
+ <p>
+ Creates a <i>superscript</i> attribute at the specified <i>level</i>. At level 0, the text is inline with normally attributed text, at each level above 0, the text moves higher and becomes smaller, denoting a superscript.
+ </p>
+
+ <p><b>Examples:</b></p>
+ <p><pre> (make-super 1) => (:SUPER 1)</pre></p>
+
+ <p><b>Side Effects:</b> None.</p>
+
+ <p><b>Affected By:</b> None.</p>
+
+ <p><b>Exceptional Situations:</b> None</p>
+
+ <p><b>See Also:</b></p>
+ <p>
+ <b><a href="#make-attributed-string">make-attributed-string</a></b>
+ <b><a href="#make-range">make-range</a></b>
+ <b><a href="#make-font">make-font</a></b>
+ <b><a href="#make-color">make-color</a></b>
+ <b><a href="#make-underline">make-underline</a></b>
+ <b><a href="#make-link">make-link</a></b>
+ </p>
+
+ <hr>
+ <p><a id="make-underline"><i>Function</i> <b>MAKE-UNDERLINE</b></a></p>
+ <p><b>Syntax:</b></p>
+ <p>
+ <b>make-underline</b> <i>level</i> => <i>result</i>
+ </p>
+
+ <p><b>Arguments and Values:</b></p>
+ <p>
+ <p><i>level</i>---a non-negative <i><a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_i.htm#integer">integer</a></i>.
+ <p><i>result</i>---a <i><a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_l.htm#list">list</a></i>.</p>
+ </p>
+
+ <p><b>Description:</b></p>
+ <p>
+ Creates an <i>underline</i> attribute with <i>level</i> number of underline strokes.
+ </p>
+
+ <p><b>Examples:</b></p>
+ <p><pre> (make-underline 1) => (:UNDERLINE 1)</pre></p>
+
+ <p><b>Side Effects:</b> None.</p>
+
+ <p><b>Affected By:</b> None.</p>
+
+ <p><b>Exceptional Situations:</b> None</p>
+
+ <p><b>See Also:</b></p>
+ <p>
+ <b><a href="#make-attributed-string">make-attributed-string</a></b>
+ <b><a href="#make-range">make-range</a></b>
+ <b><a href="#make-font">make-font</a></b>
+ <b><a href="#make-color">make-color</a></b>
+ <b><a href="#make-super">make-super</a></b>
+ <b><a href="#make-link">make-link</a></b>
+ </p>
+
+ <hr>
+ <p><a id="make-link"><i>Function</i> <b>MAKE-LINK</b></a></p>
+ <p><b>Syntax:</b></p>
+ <p>
+ <b>make-link</b> <i>url</i> => <i>result</i>
+ </p>
+
+ <p><b>Arguments and Values:</b></p>
+ <p>
+ <p><i>url</i>---a <i><a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_s.htm#string">string</a></i>.</p>
+ <p><i>result</i>---a <i><a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_l.htm#list">list</a></i>.</p>
+ </p>
+
+ <p><b>Description:</b></p>
+ <p>
+ Creates a <i>link</i> attribute, pointing to <i>url</i>.
+ </p>
+
+ <p><b>Examples:</b></p>
+ <p><pre> (make-link "http://www.spork.org/") => (:LINK "http://www.spork.org/")</pre></p>
+
+ <p><b>Side Effects:</b> None.</p>
+
+ <p><b>Affected By:</b> None.</p>
+
+ <p><b>Exceptional Situations:</b> None</p>
+
+ <p><b>See Also:</b></p>
+ <p>
+ <b><a href="#make-attributed-string">make-attributed-string</a></b>
+ <b><a href="#make-range">make-range</a></b>
+ <b><a href="#make-font">make-font</a></b>
+ <b><a href="#make-color">make-color</a></b>
+ <b><a href="#make-super">make-super</a></b>
+ <b><a href="#make-underline">make-underline</a></b>
+ </p>
+
+ <hr>
+ <p><a id="escape-mux-string"><i>Function</i> <b>ESCAPE-MUX-STRING</b></a></p>
+ <p><b>Syntax:</b></p>
+ <p>
+ <b>escape-mux-string</b> <i>string</i> => <i>result</i>
+ </p>
+
+ <p><b>Arguments and Values:</b></p>
+ <p>
+ <p><i>string</i>---a <i><a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_s.htm#string">string</a></i>.</p>
+ <p><i>result</i>---a <i><a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_s.htm#string">string</a></i>.</p>
+ </p>
+
+ <p><b>Description:</b></p>
+ <p>
+ This function is used to create pre-formatted strings for a MUX. MUXes normally ignore sequences of white space, and error on newlines, ignoring tab markins except as their capacity for white space. You can get around this by injecting %r, %t, and %b for newlines, tab characters, and white space, respectively. This function does that for you.
+ </p>
+
+ <p><b>Examples:</b></p>
+ <p><pre> (escape-mux-string "xyzzy plugh") => "xyzzy%bplugh"</pre></p>
+
+ <p><b>Side Effects:</b> None.</p>
+
+ <p><b>Affected By:</b> None.</p>
+
+ <p><b>Exceptional Situations:</b> None</p>
+
+ <p><b>Notes:</b></p>
+ <p>
+ This function may only be useful for MUSHes. If your MUX escapes strings differently than a MUSH, then you will need a new function.
+ </p>
+
+ <hr>
+ <p><a id="map-variables"><i>Function</i> <b>MAP-VARIABLES</b></a></p>
+ <p><b>Syntax:</b></p>
+ <p>
+ <b>map-variables</b> <i>string</i> <i>variable-list</i>=> <i>result-string</i>
+ </p>
+
+ <p><b>Arguments and Values:</b></p>
+ <p>
+ <p><i>string</i>---a <i><a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_s.htm#string">string</a></i>.</p>
+ <p><i>variable-list</i>---a <i><a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_l.htm#list">list</a></i> containing the variable substitutions for <i>string</i>.
+ <p><i>result-string</i>---a <i><a href="http://www.lispworks.com/reference/HyperSpec/Body/26_glo_s.htm#string">string</a></i>.</p>
+ </p>
+
+ <p><b>Description:</b></p>
+ <p>
+ <b>map-variables</b> returns a <i>string</i> composed by substituting patterns of
+ the form $<i>number</i>$ from <i>string</i> with those places in <i>variable-list</i>.
+ So, <code>$1$</code> refers to the first position (<i>i.e., car</i>) of the list
+ <i>variable-list</i>.
+ </p>
+
+ <p><b>Examples:</b></p>
+ <p><pre>
+ (map-variables "one: $1$ two: $2$ three: $3$" '(1 2 3)) => "one: 1 two: 2 three: 3"</pre></p>
+ <p><b>Side Effects:</b> None.</p>
+
+ <p><b>Affected By:</b> None.</p>
+
+ <p><b>Exceptional Situations:</b> None</p>
+ </body>
+</html>
diff --git a/English.lproj/Moxie Help/pages/.svn/text-base/lisp-glossary.html.svn-base b/English.lproj/Moxie Help/pages/.svn/text-base/lisp-glossary.html.svn-base
new file mode 100644
index 0000000..6f64434
--- /dev/null
+++ b/English.lproj/Moxie Help/pages/.svn/text-base/lisp-glossary.html.svn-base
@@ -0,0 +1,68 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+ "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
+<html lang="en">
+ <head>
+ <title>Lisp Glossary</title>
+ <meta name="generator" content="Emacs!">
+ </head>
+
+ <body>
+ <h1>Lisp Glossary</h1>
+
+ <dt><strong><a id="asdf">ASDF</a></strong></dt>
+ <dd><p><em>(abbrev, "Another System Definition Facility"</em> A way to
+ package a lisp bundle together. See the <a href="#cliki">CLiki</a>
+ <a href="http://www.cliki.net/asdf" target="new">page</a> for further
+ details.</p></dd>
+
+ <dt><strong><a id="bjc-utils">bjc-utils</a></strong></dt>
+ <dd><p>A collection of utilities the author (bjc) finds useful, and so,
+ in order to facilitate his hacking, he has also included within
+ Moxie.</p></dd>
+
+ <dt><strong><a id="clhs">CLHS</a></strong></dt>
+ <dd><p><em>(abbrev, "Common Lisp HyperSpec")</em> The authoritative
+ reference for the ANSI ratified Common Lisp.<p>
+
+ <p>You may find a version of the HyperSpec online at:
+ <a href="http://www.lispworks.com/reference/HyperSpec/index.html"
+ target="new">
+ LispWorks</a></p></dd>
+
+ <dt><strong><a id="cliki">CLiki</a></strong></dt>
+ <dd><p><em>(from "Common Lisp" and "Wiki")</em> A Wiki devoted to
+ Common Lisp.</p>
+
+ <p>See <a href="http://www.cliki.net/" target="new">http://www.cliki.net/</a></p></dd>
+
+ <dt><strong><a id="cl-ppcre">CL-PPCRE</a></strong></dt>
+ <dd><p><em>(abbrev, "Common Lisp Portable Perl Compatible Regular Expression")</em>
+ A Lisp <a href="#package">package</a> with functions to parse and match
+ with PERL-style Regular Expressions.</p>
+
+ <p>See the <a href="#cliki">CLiki</a>
+ <a href="http://www.cliki.net/cl-ppcre" target="new">page</a> for
+ further details.</p></dd>
+
+ <dt><strong><a id="ecl">ECL</a></strong></dt>
+ <dd><p><em>(abbrev, "Embeddable Common Lisp")</em> Moxie uses ECL for
+ its lisp sub-system. More information on ECL can be found on the
+ <a href="http://ecls.sourceforge.net/" target="new">SourceForge
+ project page</a></p></dd>
+
+ <dt><strong><a id="package">package</a></strong></dt>
+ <dd><p>Packages are a kind of lisp "library". See the <a href="#clhs">CLHS</a>
+ <a href="http://www.lispworks.com/reference/HyperSpec/Body/11_.htm"
+ target="new">Chapter 11.</a></p></dd>
+
+ <dt><strong><a id="repl">REPL</a></strong></dt>
+ <dd><p><em>(abbrev, "Read, Eval, Print Loop")</em> The main loop responsible
+ for accepting user input, evaluating the input, and printing the results
+ of that evaluation. The REPL is often used synonymously with
+ <a href="#toplevel">"top level."</a></p></dd>
+
+ <dt><strong><a id="toplevel">Top Level</a></strong></dt>
+ <dd><p>The top-most <a href="#repl">REPL</a>. It is the first loop instantiated
+ by the lisp sub-system, from which everything else is evaluated.</p></dd>
+ </body>
+</html>
diff --git a/English.lproj/Moxie Help/pages/.svn/text-base/navigation.html.svn-base b/English.lproj/Moxie Help/pages/.svn/text-base/navigation.html.svn-base
new file mode 100644
index 0000000..b639388
--- /dev/null
+++ b/English.lproj/Moxie Help/pages/.svn/text-base/navigation.html.svn-base
@@ -0,0 +1,24 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+ "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
+<html lang="en">
+<head>
+ <title>Navigation</title>
+ <meta name="generator" content="Emacs!">
+</head>
+
+<body>
+ <center><img src="../images/Moxie.png" alt="" width="128" height="128"></center>
+ <ul>
+ <li><a href="overview.html" target="contentsFrame">Overview</a></li>
+ <li><a href="faq.html" target="contentsFrame">Frequently Asked Questions</a></li>
+ <li><a href="plugin.html" target="contentsFrame">Plugin System</a></li>
+ <ul>
+ <li><a href="lisp-functions.html" target="contentsFrame">Plugin Dictionary</a></li>
+ </ul>
+ <li><a href="whatsnew.html" target="contentsFrame">What's new</a></li>
+ <li><a href="bugs.html" target="contentsFrame">Known Bugs</a></li>
+ <li><a href="todo.html" target="contentsFrame">To Do</a></li>
+ <li><a href="http://www.kublai.com/~shmit/software/Moxie/" target="new">Website</a></li>
+ </ul>
+</body>
+</html>
diff --git a/English.lproj/Moxie Help/pages/.svn/text-base/overview.html.svn-base b/English.lproj/Moxie Help/pages/.svn/text-base/overview.html.svn-base
new file mode 100644
index 0000000..a32bb6c
--- /dev/null
+++ b/English.lproj/Moxie Help/pages/.svn/text-base/overview.html.svn-base
@@ -0,0 +1,36 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+ "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
+<html lang="en">
+ <head>
+ <title>Overview</title>
+ <meta name="generator" content="Emacs!">
+ </head>
+
+ <body>
+ <h1>Overview</h1>
+ <p>Moxie is a client for <a href="glossary.html#mux">MUX</a> systems. Some of its
+ notable features are:</p>
+
+ <ul>
+ <li>ANSI color support is supplied via a plug in.</li>
+ <li>It has trigger, alias, and macro support via the <a href="plugin.html">plugin</a> sub-system.</li>
+ <li>Lisp-based plugin system, instead of a custom scripting language, so you can write
+ any kind of plug in you can imagine.</li>
+ <li>Transparent windows.</li>
+ <li>Command History via the CMD-Up/Down arrows. This also works in the Lisp REPL.</li>
+ <li>MUX-formatted pasting, which translates whitespace to %r, %t, %b as appropriate.</li>
+ <li>Auto-login to servers.</li>
+ <li>Startup worlds allow you to auto-open worlds when Moxie starts up.</li>
+ <li>Logging of sessions to plain-text files.</li>
+ <li>An innovative "World Selector" which allows you to switch between worlds very
+ quickly, shows status (New Activity, Connected, Disconnected), allowing for:</li>
+ <li>Clean and simple tab-less design, hearkening back to older MacOS days.</li>
+ </ul>
+
+ <p>You can create sessions ("<a href="glossary.html#world">Worlds</a>" in Moxie)
+ which contain all your preferences for a given world, as well as configure
+ global preferences (such as what worlds to start up when Moxie launches).</p>
+
+ <p>If you want to learn more about any of this, click a topic on the left.</p>
+ </body>
+</html>
diff --git a/English.lproj/Moxie Help/pages/.svn/text-base/plugin.html.svn-base b/English.lproj/Moxie Help/pages/.svn/text-base/plugin.html.svn-base
new file mode 100644
index 0000000..1f048c1
--- /dev/null
+++ b/English.lproj/Moxie Help/pages/.svn/text-base/plugin.html.svn-base
@@ -0,0 +1,203 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+ "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
+<html lang="en">
+ <head>
+ <title>Plugin Lifestyle</title>
+ <meta name="generator" content="BBEdit 6.5">
+ </head>
+
+ <body>
+ <h1><a id="intro">Introduction</a></h1>
+ <h2>Or: The worlds of MUXing are varied, so why shouldn't my viewer be?</h2>
+ <p>
+ Most MUXes are built off very similar codebases and design patters, but
+ within those similar roots are an infinite and varied number of worlds.
+ </p>
+ <p>
+ In order to cope with the almost maddening variety in MUXing,
+ programmatically, you have to develop some kind of programming language.
+ For instance, TinyFugue's trigger's are a simple programming language.
+ </p>
+ <p>
+ So, to allow for the largest amount of flexibility in Moxie, Moxie
+ includes a full programming language. While inventing one specifically
+ for Moxie would certainly be the norm, it is not something that should
+ be valued highly. In fact, by using a standard language, you get a lot
+ of benefits of useably free code-base.
+ </p>
+ <p>
+ So, Moxie includes an <a href="http://clisp.cons.org/">embedded lisp
+ interpreter</a>. This gives you the full power of the Lisp language from
+ within your plugin code. What kind of things you write, and how you want to
+ interact with Moxie and your MUX are limited only by your imagination.
+ </p>
+ <p>
+ This does mean you'll have to learn Lisp - at least a little - in order
+ to write any plugins for Moxie, although I will endeavour to keep things
+ as simple as possible throughout this document.
+ </p>
+
+ <h1><a id="quickstart">Quick Start</a></h1>
+ <h2>Or: Just Gimme the Code, and I'll Come Back When I Need You.</h2>
+ <p>
+ The simplest plugins are keyword expansions: when you type
+ "/foobar baz" into Moxie, it will try to trigger keyword expansion for
+ the keyword "foobar".
+ </p>
+ <p>
+ To register a keyword expander, you first have to write the code
+ for the expander, then register it with the keyword expansion hook.
+ all the functions referenced here are exported from the MOXIE
+ <a href="lisp-glossary.html#package">package</a>.
+ </p>
+ <p>
+ First, we'll create a package for our test plugin, and use the moxie
+ <a href="lisp-glossary.html#package">package</a>, as well as the
+ <a href="lisp-glossary.html#bjc-utils">bjc-utils</a> package.
+ </p>
+ <pre>
+ (defpackage test-plugin
+ (:use :cl :cl-user :moxie :bjc-utils))
+ (in-package :test-plugin)
+ </pre>
+ <p>
+ Then we define our expander function. We just want to take a name off
+ of the argument line, and page them with "hello!". For the sake of
+ debugging, we also want to print out what we got as the argument
+ to the lisp <a href="lisp-glossary.html#repl">REPL</a>:
+ </p>
+ <pre>
+ (defun foobar-handler (string)
+ (format t "foobar-handler got: ~A~%" string)
+ (map-variables "page $1$ = hello!"
+ (split string #\Space)))
+ </pre>
+ <p>
+ The function we've defined returns the string from the map-variables
+ command. This return value is what's sent to the MUX. If we don't want
+ to send anything to the MUX you can return an empty string ("") or
+ nil.
+ </p>
+ <p>
+ Now that we have the function defined, we want to register it with
+ the keyword expansion hook:
+ </p>
+ <pre>
+ (add-keyword 'foobar-handler "foobar")
+ </pre>
+ <p>
+ To test this, first bring up the REPL window so we can see what's
+ being printed out by the function as it runs. To do this, select
+ "Lisp REPL" from the "Window" menu.
+ </p>
+ <p>
+ Now, in Moxie, type "/foobar me", and, assuming you're connected
+ to a MUX, you should get a page from yourself saying, "hello!".
+ In the REPL window, however, you'll see:
+ </p>
+ <pre>
+ foobar-handler got: me
+ </pre>
+ <p>
+ Which means the handler received the string "me" as the argument
+ string.
+ </p>
+ <p>
+ If you're curious how the functions map-variables and split work,
+ in the REPL, type "(documentation 'map-variables 'function)" to view
+ their documentation.
+ </p>
+ <p>
+ There are other pre-defined triggers that work in a similar fashion.
+ There is a list of them in the moxie.lisp file in the
+ <a href="#app-source">resources directory</a>.
+ </p>
+
+ <h1><a id="app-predefs">Appendix: Pre-defined variables and triggers</a></h1>
+ <p>
+ Moxie uses a set of pre-defined symbols to communicate with the lisp
+ sub-system. Below is a table of symbols, what type they are, and what
+ they do.
+ </p>
+ <table border=1>
+ <tr>
+ <td>Name</td>
+ <td>Type</td>
+ <td>Description</td>
+ </tr>
+ <tr>
+ <td>moxie::*moxie-result-stream*</td>
+ <td>stream</td>
+ <td>The stream for communicating with Moxie.</td>
+ </tr>
+ <tr>
+ <td>moxie::*world*</td>
+ <td>object</td>
+ <td>The currently active world-id. This may be 0, if a world hasn't called into
+ the plugin system.</td>
+ </tr>
+ <tr>
+ <td>moxie::eval-hook</td>
+ <td>function</td>
+ <td>Used by Moxie to send data from the REPL window to the
+ lisp plugin system.</td>
+ </tr>
+ <tr>
+ <td>moxie::input-to-server-hook</td>
+ <td>function</td>
+ <td>Used by Moxie to send data to the lisp plugins after receiving
+ something from the input line.</td>
+ </tr>
+ <tr>
+ <td>moxie::output-from-server-hook</td>
+ <td>function</td>
+ <td>Used by Moxie when data is received from the MUX for display
+ on the screen.</td>
+ </tr>
+ <tr>
+ <td>moxie::keystroke-hook</td>
+ <td>function</td>
+ <td>Used by Moxie when a registered keystroke is pressed to call into its
+ function</td>
+ </tr>
+ <tr>
+ <td>moxie::world-opened-hook</td>
+ <td>function</td>
+ <td>Used by Moxie to tell the plugin system a new world has opened.</td>
+ </tr>
+ <tr>
+ <td>moxie::world-closed-hook</td>
+ <td>function</td>
+ <td>Used by Moxie to tell the plugin system a world has closed.</td>
+ </tr>
+ <tr>
+ <td>moxie::start-logging-hook</td>
+ <td>function</td>
+ <td>Used by Moxie to tell the plugin system it wishes to log transcripts.</td>
+ </tr>
+ <tr>
+ <td>moxie::stop-logging-hook</td>
+ <td>function</td>
+ <td>Used by Moxie to tell the plugin system it no longer wishes to log.</td>
+ </tr>
+ </table>
+
+ <h1><a id="app-source">Appendix: Sample source code</a></h1>
+ <p>
+ You can find definitions for all the built in functions in the Application
+ bundle: <code>Contents/Resources/*.lisp</code>. The file <code>startlisp</code>
+ parses the file <code>init-template.lisp</code> and starts the lisp with the parsed
+ file, loading the rest of the plug in system with it.
+ </p>
+ <p>
+ There are certain hooks in <code>tpl.lisp</code> which the application calls. You
+ can have a look at them, and even change them if you want, but don't
+ rename them or Moxie won't work anymore.
+ </p>
+ <p>
+ Also included in the Application Plug-Ins directory are a few pre-supplied plug ins
+ which you can use as an example. This includes the default logger, numpad movement macros,
+ and ANSI color support.
+ </p>
+ </body>
+</html
diff --git a/English.lproj/Moxie Help/pages/.svn/text-base/todo.html.svn-base b/English.lproj/Moxie Help/pages/.svn/text-base/todo.html.svn-base
new file mode 100644
index 0000000..4a413de
--- /dev/null
+++ b/English.lproj/Moxie Help/pages/.svn/text-base/todo.html.svn-base
@@ -0,0 +1,24 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+ "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
+<html lang="en">
+ <head>
+ <title>To Do</title>
+ <meta name="generator" content="Emacs!">
+ </head>
+
+ <body>
+ <h1>To Do</h1>
+
+ <ul>
+ <li>Parenthesis highlighting in the REPL. Programming lisp without this is a
+ complete pain for larger functions.</li>
+ <li>Create a better attributed string mechanism for Plug Ins. The current system
+ works, but is ugly.</li>
+ <li>Tab completion and indentation in the REPL.</li>
+ <li>Symbol lookup in the CLHS from the REPL.</li>
+ <li>Complete documentation.</li>
+ <li>Clean up the attributed string interface w/regards to hooks. Having to
+ conditionally extract the string is very annoying.</li>
+ </ul>
+ </body>
+</html>
diff --git a/English.lproj/Moxie Help/pages/.svn/text-base/whatsnew.html.svn-base b/English.lproj/Moxie Help/pages/.svn/text-base/whatsnew.html.svn-base
new file mode 100644
index 0000000..b990505
--- /dev/null
+++ b/English.lproj/Moxie Help/pages/.svn/text-base/whatsnew.html.svn-base
@@ -0,0 +1,83 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+ "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
+<html lang="en">
+ <head>
+ <title>What's New</title>
+ <meta name="generator" content="Emacs!">
+ </head>
+
+ <body>
+ <h1>What's new</h1>
+ <h3>Since 0.4</h3>
+ <ul>
+ <li>A timer hook now fires every second. You can attach to it by adding
+ a function to <code>:timer-hook</code>.</li>
+ <li>Telnet DONT and WONT are handled properly now.</li>
+ <li>The lisp image includes ASDF and CL-PPCRE, so startup times should be faster
+ if you use CL-PPCRE in your plugins.</li>
+ </ul>
+
+ <h3>Since 0.3</h3>
+ <ul>
+ <li>ANSI color support is now supplied via a built-in plug in.</li>
+ <li>You can send a lone enter key press.</li>
+ <li>Telnet protocol support.</li>
+ <li>You can clear your screen from the plug in interface now. For convenience,
+ the command "/clear" will clear your screen, as well as the <code>clear</code>
+ key on the numeric keypad.</li>
+ <li>Numpad keybindings have been added via a plug in.</li>
+ <li>Hooks use the results of the previous hook in a mode if applicable now, to
+ allow for multiple levels of filter feeding off of each other. This does complicate
+ things a little more, but it also allows hooks to play nice with each other.</li>
+ <li>Hooks no longer set arbitrary keywords. Those have been replaced by special
+ variables which will do the right thing, and greatly simplify plugin code.</li>
+ <li>Attributed strings changed. You can now set multiple attributes across multiple
+ ranges of the string.</li>
+ </ul>
+
+ <h3>Since 0.2:</h3>
+ <ul>
+ <li>Moxie now scans for plugins in ~/Library/Moxie, and the usual variations
+ thereof for Network, Local, and System directories.</li>
+ <li>There's a new package, CLHS-LOOKUP, which will lookup symbols in the CLHS.</li>
+ <li>The world view is no longer cleared when reconnecting.</li>
+ <li>Lisp is now initialized at startup time.</li>
+ <li>The Lisp system is no longer embedded. You can use any CL system you wish
+ now. The communications channels have become asynchronous, as well. The lisp
+ system should never hang Moxie again, although it is still required for its
+ functioning. You can now also use the built-in debugging features of whichever
+ lisp you choose.</li>
+ <li>CLISP is now included as the default lisp implementation. You can get more
+ information on CLISP at <a href="http://clisp.cons.org/">the website.</a></li>
+ <li>Logging has been moved into a plugin. You can now enable and disable it
+ from within plugins, and for convenience, the command "/log [filename]" in
+ a Moxie window will enable logging to FILENAME, if it exists, otherwise it
+ will toggle logging to the current log file.</li>
+ <li>The plug in system now defines "keystroke macros" which run when individual
+ keys are pressed. See the plug in documentation for further details.</li>
+ <li>Logging can be enabled and disabled from the plug in system.</li>
+ <li>The status buffer (the text field next to the lag indicator) can now
+ be set from the plug in system.</li>
+ <li>World-local variables are now available in the plug in system via the
+ <code>world-var</code> function. These variables differ depending upon
+ which world is calling into the plug in, and can be used to keep state
+ information. See the plug in documentation for further information.</li>
+ <li>CL-PPCRE moved into the PlugIns directory.</li>
+ <li>Plug in documentation updated for all exported functions.</li>
+ </ul>
+
+ <h3>Since 0.1:</h3>
+ <ul>
+ <li>Plugin System is here. The plugins are written in Lisp thanks to
+ <a href="http://ecls.sourceforge.net/" target="new">ECL.</a>
+ <a href="http://www.cliki.net/asdf" target="new">ASDF</a> and
+ <a href="http://www.cliki.net/cl-ppcre" target="new">CL-PPCRE</a> are
+ also included. See the help file for details.</li>
+
+ <li>Help is now available in the standard place. It's pretty empty at
+ the moment, but includes some pointers on how to get started with the
+ plugin system. There is also a sample plugin provided in the application
+ bundle, in the "PlugIns" directory.</li>
+ </ul>
+ </body>
+</html>