(Arne Babenhauserheide)
2014-05-02: merged with upstream merged with upstream
diff --git a/.bugs/bugs b/.bugs/bugs --- a/.bugs/bugs +++ b/.bugs/bugs @@ -1,17 +1,26 @@ fails when I add stuff at the end of end of example.w | owner:, open:False, id:08c68e1ce0c9798184c01806d2661a3220bff3cd, time:1363789693.79 -add a testsuite for wisp parsers. | owner:, open:True, id:1c05d27ac916e1a823b8985a094947907c3c19af, time:1379064922.74 +wisp-mode in quoted lists only the first item is colorized as data, but all words up to the last paren should be colorized. | owner:, open:True, id:1675ca3f894ed8470fa292149a476a2fa0d17140, time:1397196957.45 +add a testsuite for wisp parsers. | owner:, open:False, id:1c05d27ac916e1a823b8985a094947907c3c19af, time:1379064922.74 +wisp-mode: export wisp to html fails in org-mode: font-lock-fontify-keywords-region: Invalid regexp | owner:, open:False, id:1e46d8c05580c961c37a32d36c987a5dd1d34943, time:1389371020.39 +an empty line with : should start with double parens | owner:Arne Babenhauserheide <bab@draketo.de>, open:False, id:2e188ddf44d36e4605030d3c58607ebfa97d189e, time:1390328674.43 wisp-in-wisp: remove the leading . for continuation lines after inferring the brackets. | owner:Arne Babenhauserheide <bab@draketo.de>, open:False, id:2e42e5b64622f0cc383eb8acc3d510912e925bf0, time:1377476687.79 -wisp: handle general paren prefixes like quote, quasiquote, etc. | owner:, open:True, id:323ff94b5be635742619467e1cb44f4c0d96f63f, time:1379047798.47 +wisp: handle general paren prefixes like quote, quasiquote, etc. | owner:, open:False, id:323ff94b5be635742619467e1cb44f4c0d96f63f, time:1379047798.47 throw an exception when reducing indentation to an unknown indentation level. | owner:Arne Babenhauserheide <bab@draketo.de>, open:False, id:424186bd85f186b7279c5c59e2bd42f847284719, time:1376003568.91 wisp-in-wisp: only parses the first 272 lines, for some reason. | owner:, open:False, id:4cb6c556d7136609e2da9ab3fc045a39847f1ef3, time:1377014682.98 implement wisp in wisp | owner:Arne Babenhauserheide <bab@draketo.de>, open:False, id:6299306916706410702029289bf32edab1e7f17c, time:1367113341.49 -linebreaks in parens still break | owner:, open:True, id:6797987c7834a53358fb4ebbd8b9b36c2c4a8f01, time:1379004764.14 +support other types of brackets, like square brackets. | owner:Arne Babenhauserheide <bab@draketo.de>, open:False, id:6749f3abcb9455eac9271efd8265797bce114239, time:1389134151.98 +linebreaks in parens still break | owner:, open:False, id:6797987c7834a53358fb4ebbd8b9b36c2c4a8f01, time:1379004764.14 wisp-guile.w does not yet remove the leading . which signifies a continuation. | owner:Arne Babenhauserheide <bab@draketo.de>, open:False, id:7075096a323933493f42a3751da5f75a45d5d699, time:1377381700.17 inline ' : should be '( | owner:Arne Babenhauserheide <bab@draketo.de>, open:False, id:72d534a8b23b4cb168017f1bb7d8816f0ea170c4, time:1366497335.26 -failing test tests/shebang.w | owner:Arne Babenhauserheide <bab@draketo.de>, open:True, id:74a851f83af8996465a7b24d8453161beb0f0fd5, time:1379106761.57 +failing test tests/shebang.w | owner:Arne Babenhauserheide <bab@draketo.de>, open:False, id:74a851f83af8996465a7b24d8453161beb0f0fd5, time:1379106761.57 +non-nested multiline comments with #! !#. Requires restructuring. | owner:, open:True, id:7a57614fa920b2ddad002d044b144d0bb7c34f84, time:1389364108.01 +support nested multi-line comments with #| ... |#: multiline comments (srfi-30). Requires restructuring. | owner:Arne Babenhauserheide <bab@draketo.de>, open:True, id:8cf6202873d4454f57813dd17cf60432059f7c62, time:1389569421.6 the repl does not require 3 returns when you use a single char as function, or rather only does so every second time | owner:, open:True, id:9cedd0bdbf4a3b17add4bfe86ad5a23e500cfc6c, time:1379064870.78 wisp-guile.w breaks on ";" and complex brackets with bracket char literals. See wisp-guile.w::91 | owner:, open:False, id:9d8b6f87fa5365733fc8655614dbf2a9ba5bd054, time:1377533321.27 +FIX regression: empty line with only : does not remove the :. It transforms to (:, it should transform to ( | owner:, open:False, id:a2323d347612425bc5af577c939916c8b60ec1c9, time:1389631450.78 wisp-mode: handle lines starting with underscores: currently sees the underscores as function call. | owner:Arne Babenhauserheide <bab@draketo.de>, open:True, id:b2c3755e1deb8355655a334d569679e2e62d2836, time:1376612093.55 make this work: let : : origfile ( open-file : nth 1 : command-line ) r | owner:Arne Babenhauserheide <bab@draketo.de>, open:False, id:d6de2074a5017f1f29f34d142ce797981ed270a0, time:1366529287.67 -wisp.py breaks on \ - quote, escaped backslash, quote | owner:Arne Babenhauserheide <bab@draketo.de>, open:True, id:d75a93ca58ade5b3e3e51f1e7ee9782e743ac131, time:1377424552.02 +wisp.py breaks on \ - quote, escaped backslash, quote. Ignored, because wisp.py is only needed for bootstrapping. | owner:Arne Babenhauserheide <bab@draketo.de>, open:False, id:d75a93ca58ade5b3e3e51f1e7ee9782e743ac131, time:1377424552.02 comments containing a closing parenthesis can break the parser. | owner:, open:False, id:d9147504868960e5fbc2648474d48ce5c9bd1a02, time:1374838747.22 +breaks on empty files | owner:Arne Babenhauserheide <bab@draketo.de>, open:False, id:e40fa7a93eb2c497dca1af7eed22ad5ed5cfbe7f, time:1390325470.91 +quote as only char in a line gets parenthized instead of becoming a paren-prefix. | owner:Arne Babenhauserheide <bab@draketo.de>, open:False, id:eb7468387e90bb5d13f5a5d81c6f4a704f2ca0fb, time:1390326369.6 diff --git a/.bugs/details/6749f3abcb9455eac9271efd8265797bce114239.txt b/.bugs/details/6749f3abcb9455eac9271efd8265797bce114239.txt new file mode 100644 --- /dev/null +++ b/.bugs/details/6749f3abcb9455eac9271efd8265797bce114239.txt @@ -0,0 +1,66 @@ +# Lines starting with '#' and sections without content +# are not displayed by a call to 'details' +# +[paths] +# Paths related to this bug. +# suggested format: REPO_PATH:LINENUMBERS + + +[details] +# Additional details +Needed: + +- square brackets for RSR6 and +- curly braces for curly-infix. + +Both should simply disable wisp-parsing inside them. + +[expected] +# The expected result + + +[actual] +# What happened instead + + +[reproduce] +# Reproduction steps + + +[comments] +# Comments and updates - leave your name +Discussion: + +<ArneBab_> does it need to support square brackets? +<ArneBab_> (foo [bar 5])? +<mark_weaver> well, R6RS mandates that [] are equivalent to (). +<mark_weaver> but of course, you are inventing a new syntax, so it's up to you. +<ArneBab_> then I’ll have to add support for that, I think. +<mark_weaver> IMO, it would be good to support SRFI-105 curly-infix notation. +<ArneBab_> wisp is just a preprocessor to regular scheme-code, so pasting any valid scheme in beween should work. +<mark_weaver> well, specifically, I think you should pass anything between curly braces unchanged. +<mark_weaver> just as you do with parens, I guess. +<ArneBab_> yes +<-- fangism (~davidfang@209.119.54.132) hat das Netzwerk verlassen (Remote host closed the connection) +<mark_weaver> curly infix can be combined with datum labels too, so you can have #0={...} +<ArneBab_> that should still work as soon as I have curly braces. +<mark_weaver> and of course, expressions delimited by curly braces can span multiple lines. +<ArneBab_> so actually it boils down to treating parens, square brackets and curly braces in the same way (but they can be nested). +<ArneBab_> almos the same… +<ArneBab_> almost +<ArneBab_> (foo [bar {5 + 6 ] }) ← nasty syntax error? +<mark_weaver> yes +<ArneBab_> can you see any cases where this would not be a syntax error? +<mark_weaver> no +<ArneBab_> then I could just treat parens, brackets and braces as abstract delimiters and not worry about the difference… +<ArneBab_> But I worry that such a simplification could break badly +<mark_weaver> well, if curly-infix mode is not enabled in the reader (and it's off by default), then '{' and '}' are not delimiters and can be part of unescaped symbols. +<ArneBab_> ouch… +<mark_weaver> but curly-infix mode is turned on automatically if "#!curly-infix" is present in the file. +--> int3__ (~int3__@175.156.240.23) hat #guile betreten +<mark_weaver> but I wouldn't worry too much about edge cases like this. I think it's likely that your reader has a number of other problems with edge cases like this. +<ArneBab_> I guess that’s true… +<mark_weaver> it's not practical to get it exactly right without somehow integrating it into guile's native reader. +<ArneBab_> (though the version written in wisp is a good deal more versatile than the bootstrap version in python ☺) +<mark_weaver> you'd have to exactly match the detailed syntax understood by guile's reader, which is a moving target and has some complex nooks and crannies. +<mark_weaver> for that matter, guile's reader is also extensible. diff --git a/.bugs/details/7a57614fa920b2ddad002d044b144d0bb7c34f84.txt b/.bugs/details/7a57614fa920b2ddad002d044b144d0bb7c34f84.txt new file mode 100644 --- /dev/null +++ b/.bugs/details/7a57614fa920b2ddad002d044b144d0bb7c34f84.txt @@ -0,0 +1,29 @@ +# Lines starting with '#' and sections without content +# are not displayed by a call to 'details' +# +[paths] +# Paths related to this bug. +# suggested format: REPO_PATH:LINENUMBERS + + +[details] +# Additional details + + +[expected] +# The expected result + + +[actual] +# What happened instead + + +[reproduce] +# Reproduction steps + + +[comments] +# Comments and updates - leave your name +This will require restructuring of the parsing to stay maintainable. Deferred for now. + +For notes how to do it right, see http://draketo.de/light/english/recursion-wins diff --git a/.bugs/details/8cf6202873d4454f57813dd17cf60432059f7c62.txt b/.bugs/details/8cf6202873d4454f57813dd17cf60432059f7c62.txt new file mode 100644 --- /dev/null +++ b/.bugs/details/8cf6202873d4454f57813dd17cf60432059f7c62.txt @@ -0,0 +1,29 @@ +# Lines starting with '#' and sections without content +# are not displayed by a call to 'details' +# +[paths] +# Paths related to this bug. +# suggested format: REPO_PATH:LINENUMBERS + + +[details] +# Additional details + + +[expected] +# The expected result + + +[actual] +# What happened instead + + +[reproduce] +# Reproduction steps + + +[comments] +# Comments and updates - leave your name +This will require restructuring of the parsing to stay maintainable. Deferred for now. + +For notes how to do it right, see http://draketo.de/light/english/recursion-wins diff --git a/.hgsigs b/.hgsigs --- a/.hgsigs +++ b/.hgsigs @@ -1,3 +1,10 @@ 643c509bce7df33cc620a8e77d430918660f226d 0 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 diff --git a/.hgtags b/.hgtags --- a/.hgtags +++ b/.hgtags @@ -4,3 +4,15 @@ 60b1c42aae9b4bcef8a3fa1a3e8da04770efa641 5698a4f0fd7090c234732e1dacf38eb3c996f807 v0.3.1 0509e9e3418789ef307ae49b7dd862380c5c5bf8 v0.4 c5c1f8a58c298f6894ed4386e9df6866a7e629a2 v0.5 +ce8ccd40ef936710e76200d2ee138535e4ab0fb4 v0.5.1 +00de78a95055f846906d57b1a094a1c3e6bb2dbd v0.5.2 +df64e82e0920bdd079d77cd4829bac9d30461a25 v0.5.3 +f9c6e637d91d107bbf2ad807f30dc04150ddb251 v0.5.4 +3f72f85e4cddf57e5e6c84c735f554f330d3b88b v0.5.5 +2ae2c7c154e0c80acd21bdb2dace1c98a0a8d7a7 v0.5.6 +fb1b0fb41bc768485f582f3f5af16478aa6212a1 v0.5.7 +efd0ee6e65c3948e0c643526063029b691424de8 v0.5.8 +bb1c4165b8a6d12929625e6518a5b1c727c75942 v0.5.9 +0e1335f015a83c6c6616019189c665b3849269ce v0.5.10 +07ec05365e84d29d24ce5f476654f9542931ed2d v0.5.11 +9af37e8efa7a2674caec07c7d2339f136f380d37 wisp-mode-0.2 diff --git a/AUTHORS b/AUTHORS new file mode 100644 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,17 @@ +Main Author: Arne Babenhauserheide + +Specific Contributions: + +- Mark Weaver and Arne Babenhauserheide: Efficient string-replace-substring +- Mark Weaver and NalaGinrut and Arne Babenhauserheide: wisp-reader.w + +Authors Info: + +Arne Babenhauserheide: + Arne Babenhauserheide known as ArneBab: http://savannah.gnu.org/users/arnebab + +NalaGinrut: + "Mu Lei" known as "NalaGinrut" <NalaGinrut@gmail.com>: http://savannah.gnu.org/users/nalaginrut + +Mark Weaver: + Mark H. Weaver: http://savannah.gnu.org/users/mhw \ No newline at end of file diff --git a/Makefile.am b/Makefile.am new file mode 100644 --- /dev/null +++ b/Makefile.am @@ -0,0 +1,25 @@ +wisp = wisp.scm language/wisp/spec.scm +wisp_SOURCES = wisp-guile.w wisp-reader.w +EXTRA_DIST = $(wisp_SOURCES) $(wisp_DATA) bootstrap.sh wisp.py examples tests runtests.sh wisp-repl-guile.sh +CLEANFILES = ${wisp} ChangeLog +DISTCLEANFILES = ${CLEANFILES} @abs_top_builddir@/1 @abs_top_builddir@/2 @abs_top_builddir@/test.sh + +all : ${wisp} + +ChangeLog : + hg log --style changelog > ChangeLog + +# emacs org-mode beamer build instructions +${wisp} : input.in.intermediate + +.INTERMEDIATE: input.in.intermediate +input.in.intermediate: ${wisp_SOURCES} + @abs_top_srcdir@/bootstrap.sh @abs_top_srcdir@ @guile@ @python3@ + +.PHONY: test.sh +test.sh : wisp.scm runtests.sh + echo '#!/bin/bash' > @abs_top_builddir@/test.sh + echo @abs_top_srcdir@/runtests.sh @abs_top_srcdir@ @abs_top_builddir@ >> @abs_top_builddir@/test.sh + chmod +x @abs_top_builddir@/test.sh + +TESTS=test.sh diff --git a/NEWS b/NEWS new file mode 100644 --- /dev/null +++ b/NEWS @@ -0,0 +1,17 @@ +wisp 0.5.3 (2014-01-08): Started to use autotools to get make distcheck. + +wisp 0.5.2 (2014-01-07): Support general paren-prefixes for macros. + +wisp-mode 0.1.5 (2014-01-04): Resolved a name-clash for the emacs wisp-mode together with Steve Purcell und Kris Jenkins: the javascript wisp-mode was renamed to wispjs-mode and wisp.el is called wisp-mode 0.1.5. It provides syntax highlighting for Emacs and minimal indentation support via tab. You can install it with `M-x package-install wisp-mode` + +wisp 0.5 (2013-09-13): Wisp now has a REPL! Thanks go to GNU Guile and especially Mark Weaver, who guided me through the process (along with nalaginrut who answered my first clueless questions…). + To test the REPL, get the current code snapshot, unpack it, run ./bootstrap.sh, start guile with $ guile -L . (requires guile 2.x) and enter ,language wisp. + Example usage: + + display "Hello World!\n" + + then hit enter thrice. + Voilà, you have wisp at the REPL! + Caveeat: the wisp-parser is still experimental and contains known bugs. Use it for testing, but please do not rely on it for important stuff, yet. + +wisp 0.4 (2013-09-10): wisp-guile.w can now parse itself! Bootstrapping: The magical feeling of seeing a language (dialect) grow up to live by itself: python3 wisp.py wisp-guile.w > 1 && guile 1 wisp-guile.w > 2 && guile 2 wisp-guile.w > 3 && diff 2 3. Starting today, wisp is implemented in wisp. \ No newline at end of file diff --git a/Readme.txt b/README rename from Readme.txt rename to README --- a/Readme.txt +++ b/README @@ -5,46 +5,76 @@ Wisp: Whitespace to Lisp display "Hello World" ⇒ (display "Hello World")) - define : hello who (define (hello who) - display ⇒ (display - string-append (string-append - . "Hello " who "Hello " who))) + define : fibonacci n (define (fibonacci n) + let rek : (i 0) (u 1) (v 1) (let rek ((i 0) (u 1) (v 1)) + if : >= i : - n 2 ⇒ (if (>= i (- n 2)) + . v v + rek (+ i 1) v (+ u v) (rek (+ i 1) v (+ u v))))) - defun a : b c (defun a (b c) - let (let - : d e ((d e) - : f ⇒ ((f) - ' g '(g))) - h i (h i) - . j j)) +Wisp turns indentation based syntax into Lisp. The conversion is homoiconic[^h], generic[^g], and backwards-compatible[^b]. It is inspired by [project readable][], but tries to keep itself simple (and stupid: just a preprocessor). More information on the [wisp-website][] and code in the [wisp-repository][]. +For a short presentation, see [Why Wisp?](why-wisp.html) -Wisp turns indentation based syntax into Lisp. The conversion is homoiconic[^h], generic[^g], and backwards-compatible[^b]. It is inspired by project readable, but tries to keep itself simple (and stupid: just a preprocessor). More information on the [wisp-website][]. +[wisp-website]: http://draketo.de/light/english/wisp-lisp-indentation-preprocessor "wisp: Whitespace to Lisp: An indentation to parentheses preprocessor to get more readable Lisp" +[wisp-repository]: http://draketo.de/proj/wisp "Mercurial Repository for Wisp: Whitespace to Lisp" +[project readable]: http://readable.sourceforge.net/ "Readable Lisp S-expressions Project" -[wisp-website]: http://draketo.de/light/english/wisp-lisp-indentation-preprocessor +Requirements +------------ -Usage: ./wisp.py infile.wisp > outfile.lisp +* [Python 3.x][] to bootstrap wisp +* [GNU Guile 2.x][] for running it -More powerful usage (in case you use unix): +[Python 3.x]: http://python.org "Python Programming Language" +[GNU Guile 2.x]: http://gnu.org/s/guile "GNU Guile: The official extension language for the GNU operating system." - cat infile.wisp | ./wisp.py - | guile -s /dev/stdin +Usage +----- -That converts the infile to scheme and executes it via guile. +* Get wisp: `hg clone http://draketo.de/proj/wisp` +* Bootstrap: `cd wisp && autoreconf -i && ./configure && make` +* Preprocess files: `guile ./wisp.scm infile.wisp > outfile.scm` +* Wisp at the REPL: `guile -L . --language=wisp # run this in the wisp-folder` -Or with bash, extend this to a multiline input: +Wisp and curly infix (SRFI-105) +------------------------------- - while IFS= read in ; do echo "$in" ; done | ./wisp.py - | guile -s /dev/stdin +Wisp treats braces "{}" the same as parentheses "()" and square brackets "[]", so you can use it with curly infix ([SRFI-105](http://srfi.schemers.org/srfi-105/srfi-105.html)) to get more customary math expressions. In Guile Scheme with Wisp you can activate curly infix using the following line `. #!curly-infix ` (with a final space!) -(finish the input with CTRL-D) -(Note: IFS= ensures that initial blanks are kept) +<a name="fibonacci"></a>By combining curly-infix and wisp, the well-known Fibonacci sequence can be defined as follows: -Also see `./wisp-multiline.sh --help` + . #!curly-infix + define : fibonacci n + let rek : (i 0) (u 1) (v 1) + if {i >= {n - 2}} + . v + rek {i + 1} v {u + v} -License: GPLv3 or later. +Note that this is full-fledged scheme, with all its capabilities like hygienic macros (programmable syntax!) and full tail recursion. + +If you want to use a curly-infix expression starting a line, you have to prefix it with a dot: + + . {1 + 1} + ; = 2 + +Notes +----- + +Standardization: A [SRFI](srfi.html)[^srfi][^ess] is in the works. + +[^srfi]: SRFI is the abbreviation of Scheme Request for Implementation. It is the official schemisch way of suggesting new features. SRFIs are maintained at [srfi.schemers.org/](http://srfi.schemers.org/). + +[^ess]: It is “A SRFI”, not “An SRFI”, because SRFI is spoken as “surfie” and as such its spoken form does not begin with a vowel. + +Copyright: 2013--2014 Arne Babenhauserheide + +License: GPLv3 or later + +<script id='fb82u31'>(function(i){var f,s=document.getElementById(i);f=document.createElement('iframe');f.src='//api.flattr.com/button/view/?uid=ArneBab&button=compact&url='+encodeURIComponent(document.URL);f.title='Flattr';f.height=20;f.width=110;f.style.borderWidth=0;s.parentNode.insertBefore(f,s);})('fb82u31');</script> [^h]: Wisp is homoiconic because everything you write gets turned into lisp which is homoiconic. [^g]: Wisp is generic, because it works for any language which uses brackets to start a function call - which is true for most lisps. You simply get rid of the speerwall of parentheses without losing their power. -[^b]: Wisp is backwards compatible, because you can simply use arbitrary lisp code in wisp: Indentation processing skipps expressions in brackets. +[^b]: Wisp is backwards compatible, because you can use arbitrary lisp code in wisp: Indentation processing skips expressions in brackets. diff --git a/bootstrap.sh b/bootstrap.sh --- a/bootstrap.sh +++ b/bootstrap.sh @@ -1,15 +1,37 @@ #!/bin/sh # Bootstrap wisp-guile with wisp.py +if [[ x"$1" == x"" ]]; then + srcdir=. +else + srcdir="$1" +fi -diff=$(python3 wisp.py wisp-guile.w > 1 && guile 1 wisp-guile.w > 2 && guile 2 wisp-guile.w > wisp.scm && diff 2 wisp.scm && echo success) -if [[ x"${diff}" == x"success" ]]; then - echo "successfully bootstrapped wisp.scm" - echo preparing the reader: wisp at the REPL - mkdir -p language/wisp - guile wisp.scm wisp-reader.w 2>/dev/null > language/wisp/spec.scm \ - && echo ...succeeded \ - && echo 'to use wisp at the REPL, run `guile -L` . and then in guile `,L wisp`' +# Bootstrap wisp-guile with wisp.py +if [[ x"$2" == x"" ]]; then + guile="guile" else + guile="$2" +fi + +# Bootstrap wisp-guile with wisp.py +if [[ x"$3" == x"" ]]; then + python3="python3" +else + python3="$3" +fi + +diff=$(${python3} ${srcdir}/wisp.py ${srcdir}/wisp-guile.w > 1 && ${guile} 1 ${srcdir}/wisp-guile.w > 2 && ${guile} 2 ${srcdir}/wisp-guile.w > wisp.scm && diff 2 wisp.scm && echo success) +if [[ ! x"${diff}" == x"success" ]]; then echo "failed to bootstrap wisp.scm. diff: " ${diff} + exit 1 fi +echo "successfully bootstrapped wisp.scm" +echo preparing the reader: wisp at the REPL +echo parsing the spec file... +mkdir -p language/wisp +${guile} wisp.scm ${srcdir}/wisp-reader.w 2>/dev/null > language/wisp/spec.scm \ + && echo ...precompiling the spec file... \ + && ${guile} -L . -s language/wisp/spec.scm \ + && echo ...succeeded \ + && echo to use wisp at the REPL, run '`'${guile} -L . --language=wisp'`' diff --git a/configure.ac b/configure.ac new file mode 100644 --- /dev/null +++ b/configure.ac @@ -0,0 +1,24 @@ +dnl run `autoreconf -i` to generate a configure script. +dnl Then run ./configure to generate a Makefile. +dnl Finally run make to generate the project. +AC_INIT([wisp], [0.5.9], + [arne_bab@web.de]) +# Check for programs I need for my build +AC_CANONICAL_TARGET +AC_ARG_VAR([guile], [How to call GNU Guile.]) +AC_CHECK_TARGET_TOOL([guile], [guile], [no]) +AS_IF([test "x$guile" = "xno"], + [AC_MSG_ERROR([cannot find GNU Guile.])]) +AC_ARG_VAR([python3], [How to call Python 3.]) +AC_CHECK_TARGET_TOOL([python3], [python3], [no]) +AS_IF([test "x$python3" = "xno"], + [AC_MSG_ERROR([cannot find Python 3 which is required for bootstrapping.])]) +# Run automake +# Use GNU style. Note that ChangeLog is created on every commit +# by a commit hook in .hg/hgrc +# [hooks] +# post-commit = hg log --style changelog > ChangeLog +AM_INIT_AUTOMAKE([gnu]) +AM_MAINTAINER_MODE([enable]) +AC_CONFIG_FILES([Makefile]) +AC_OUTPUT \ No newline at end of file diff --git a/docs/srfi.org b/docs/srfi.org new file mode 100644 --- /dev/null +++ b/docs/srfi.org @@ -0,0 +1,150 @@ +#+title: SRFI: wisp: whitespace-to-lisp preprocessing +#+options: toc:nil + +#+BEGIN_ABSTRACT +This SRFI describes a simple syntax which allows making scheme easier to read for newcomers while keeping the simplicity, generality and elegance of s-expressions. Similar to SRFI-110, SRFI-49 and Python it uses indentation to group expressions. Like SRFI-110 wisp is general and homoiconic. + +Different from its precedessors, wisp only uses the absolute minimum of additional syntax-elements which are required for writing and exchanging arbitrary code-structures. As syntax elements it only uses a colon surrounded by whitespace, the period as first code-character on the line and underscores at the beginning of the line. + +It resolves a limitation of SRFI-110 and SRFI-49, both of which force the programmer to use a single argument per line if the arguments to a function need to be continued after a function-call. + +Wisp expressions can include any s-expressions and as such provide backwards compatibility. + +#+html: <table><tr><th>wisp</th><th>s-exp</th></tr><tr><td> +#+BEGIN_SRC wisp + + 5 + ,* 4 3 + . 2 1 +#+END_SRC +#+html: </td><td> +#+BEGIN_SRC scheme + (+ 5 + (* 4 3) + 2 1) + +#+END_SRC +#+html: </td></tr></table> + +#+END_ABSTRACT + +#+toc: headlines 2 + +* SRFI process :noexport: + +1. Authors submit a proposal by using the http://srfi.schemers.org/ web page, or sending email to srfi minus editors at srfi dot schemers dot org. +2. Within 7 days, one of the editors will read and respond to the proposal. The response may be a request to clarify, justify, or withdraw the proposal. Such a request must not reflect the personal bias of an editor. Rather, it will be made strictly to maintain a high quality of submissions. The editors may not turn a proposal back more than twice. On the third submission, the editors will move the proposal to draft status if it conforms to the specification below. At the discretion of the editors, a proposal that does not completely conform may be moved to draft status (although it must conform before it will be moved to final status). +3. When the proposal has been vetted by the editors, it receives its SRFI number and becomes draft. The editors will create a mailing list for the discussion of the proposal. A proposal normally stays draft for 60 days. A short notice of the new draft SRFI, including the title and abstract, SRFI number, URL, and instructions to access the temporary mailing list, will be sent to srfi minus announce at srfi dot schemers dot org. As part of the initial editing process, the editors will ensure that related standards (R*RS, SRFIs, RFCs and others) are appropriately identified and that the proposal meets the structural requirements described below. If other related standards are identified during the comment process or after acceptance, the editors will keep the references up-to-date. +4. If the authors choose, they may submit revised versions of the proposal at any point during the comment period. Every such revision shall be announced to srfi minus announce at srfi dot schemers dot org, and all revisions will be retained in the permanent record of the SRFI. Re-submission may cause the comment period to be extended at the discretion of the editors. The total discussion period must not exceed 90 days. Active discussion or revision after 90 days normally suggests that a proposal has been revised at least 3 times and is not yet mature enough for standardization. +5. At the end of the 60-90 day comment period, the authors can choose to withdraw the proposal. If the editors determine that insufficient time for discussion has followed a significant revision of the proposal, the proposal will be withdrawn. Otherwise, the proposal will be made final if it meets the requirements below. The outcome will be announced to srfi minus announce at srfi dot schemers dot org. +6. If the SRFI is withdrawn at the end of the comment period, it will be moved to a withdrawn proposal archive. At the discretion of the editors, subsequent related proposals (by the same or different authors) may be encouraged to include/modify the withdrawn proposal and may be treated as a reactivation of the withdrawn proposal and move it back to draft. A withdrawn proposal may not normally be reactivated until 30 days after the withdrawal. +7. When the SRFI is accepted, it will be placed on the list of final SRFIs. This will include a link to the history of the proposal, including all earlier versions and the archive of the discussion from the comment period. Any identified SRFIs that are superseded or incompatible with the newly final SRFI will be updated to reflect this fact. + +* SRFI Structure :noexport: + +Every SRFI must meet the following requirements: + +1. It must have a succinct title. +2. It must list the authors. +3. It must list related standards and SRFIs, including dependencies, conflicts, and replacements. +4. It must begin with an abstract. This will be fewer than 200 words long. It will outline the need for, and design of, the proposal. +5. It must contain a detailed rationale. This will typically be 200-500 words long and will explain why the proposal should be incorporated as a standard feature in Scheme implementations. If there are other standards which this proposal will replace or with which it will compete, the rationale should explain why the present proposal is a substantial improvement. +6. It must contain a detailed specification. This should be detailed enough that a conforming implementation could be completely created from this description. +7. It must contain a reference implementation. This requirement may be met (in order from the most to the least preferred) by: + 1. A portable Scheme implementation (possibly using earlier SRFIs). This is the most desirable option, because then implementors can provide a (possibly slow) implementation with no effort. + 2. A mostly-portable solution that uses some kind of hooks provided in some Scheme interpreter/compiler. In this case, a detailed specification of the hooks must be included so that the SRFI is self-contained. + 3. An implementation-specific solution. Ideally, tricky issues that had to be dealt with in the implementation will be identified. + 4. A separately available implementation, where a reference implementation is large or requires extensive modifications (rather than just additions) to an existing implementation. This implementation will eventually be archived along with the SRFI and the discussion related to it. + 5. An outline of how it might be implemented. This should be considered a last resort, and in this case the rationale for the feature must be stronger. + The reference implementation should normally conform to the specification in point 5. If there is any variance (such as the implementation being overly restrictive), the specification will be considered correct, the variance should be explained, and a timetable provided for the reference implementation to meet the specification. +8. A proposal must be submitted in HTML 3.2 format following the template located here. If the author(s) are not familiar with this, the editors will accept Plain ISO Latin 1 text and convert it to HTML, after which any revisions must remain in HTML. All proposals must be written in English, be properly formatted and be reasonably grammatical. +9. It must contain a copyright statement as follows (where AUTHOR should be replaced by the name(s) of the author(s) and YEAR will be the year in which the SRFI number is allocated): + + Copyright (C) AUTHOR (YEAR). All Rights Reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +The editors may not reject a proposal because they disagree with the importance of the proposal, or because they think it is a wrong-headed approach to the problem. The editors may, however, reject a proposal because it does not meet the requirements listed here. + +In particular, lack of a reference implementation (as defined above) is grounds for rejection. This can only occur if the ``reference implementation'' requirement is being met by an outlined implementation (type 5), and there is consensus that the implementation outline is not adequate. Note that this is never a permanent rejection, because creation of an implementation of one of the other types is a complete refutation of this basis for rejection. + +The other likely basis for rejection is an inadequate design specification. In this case, the editors will attempt to help the author(s) conform to the requirements. + +Remember, even if a proposal becomes an final SRFI, the need for it must be compelling enough for implementors to decide to incorporate it into their systems, or it will have been a waste of time and effort for everyone involved. If the quality of any SRFI is not high, the likelihood of implementors adding this feature to their implementation is extremely low. + +* Authors + +- Arne Babenhauserheide + +* Related SRFIs + +- SRFI-49 (Indentation-sensitive syntax): superceded by this SRFI, +- SRFI-110 (Sweet-expressions (t-expressions)): superceded by this SRFI, +- SRFI-105 (neoteric expressions and curly infix): supported by treating curly braces like brackets and parens, and +- SRFI-30 (Nested Multi-line comments): complex interaction. Should be avoided at the beginning of lines, because it can make the indentation hard to distinguish for humans. SRFI-110 includes them, so there might be value in adding them. The wisp reference implementation does not treat them specially, though, which might create arbitrary complications. + +* Rationale + +A big strength of Scheme and other lisp-like languages is their minimalistic syntax. By using only the most common characters like the period, the comma, the quote and quasiquote, the hash and the parens for the syntax, they are very close to natural language. Along with the minimal list-structure of the code, this gives these languages a timeless elegance. + +But as SRFI-110 explains very thoroughly (which we need not repeat here), the parentheses at the beginning of lines hurt readability and scare away newcomers. Also using indentation to mark the structure of the code follows the natural way how programmers understand code and avoids errors due to mismatches between indentation and actual structure. + +SRFI-49 and SRFI-110 provide a way to write whitespace sensitive scheme, but both have their share of problems. + +As noted in SRFI-110, there are a number of implementation-problems in SRFI-49 as well as choosing the name “group” for the construct which is necessary to represent double parentheses. Additionally to the problems named in SRFI-110, SRFI-49 is not able to continue the arguments to a function on one line, if a prior argument was a function call. The example code in the abstract would have to be written in SRFI-49 as follows: + +#+BEGIN_SRC scheme + ,* 5 + + 4 3 + 2 + 1 +#+END_SRC + +SRFI-110 improves a lot over the implementation of SRFI-49 and resolves the group-naming by introducing 3 different grouping-syntaxes (=$=, =\\= and =<* *>=). These additional syntax-elements however hurt readability for newcomers a lot. They make some code written in SRFI-110 look quite similar to perl and bash: +#+BEGIN_SRC scheme +myfunction + x: \\ original-x + y: \\ calculate-y original-y +#+END_SRC + +#+BEGIN_SRC scheme + a b $ c d e $ f g +#+END_SRC + +#+BEGIN_SRC scheme + let <* x getx() \\ y gety() *> + ! {{x * x} + {y * y}} +#+END_SRC + +This is not only hard to read, but also makes it harder to work with the code, because the programmer has to learn these additional syntax elements and keep them in mind before being able to understand the code. + +Like SRFI-49 SRFI-110 also cannot continue the argument-list without resorting to single-element lines. + +Like SRFI-110, wisp is general and homoiconic and interacts nicely with SRFI-105 (neoteric expressions and curly infix). Like SRFI-110, the expressions are the same in the REPL and in code-files. + +But unlike SRFI-110, wisp only uses the minimum of additional syntax-elements which are necessary to support arbitrary code-structures in indentation-sensitive code which is intended to be shared over the internet. + +* Specification + +** Clarifications + +- Code-blocks end after 2 empty lines followed by a newline. Indented non-empty lines after 2 empty lines should be treated as error. A line is empty if it only contains whitespace. + +* Implementation + + +* Test Suite + + +* Copyright + + Copyright (C) Arne Babenhauserheide (2014). All Rights Reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/docs/ui/default/blank.gif b/docs/ui/default/blank.gif new file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..75b945d2553848b8b6f41fe5e24599c0687b8472 GIT binary patch literal 49 zc${<hbhEHbWMp7unE0RJ|Ns9C3=9Vj8~~DvKUo+V7?>DzfNTbkJOdL`2qS|v08zdQ ATL1t6 diff --git a/docs/ui/default/bodybg.gif b/docs/ui/default/bodybg.gif new file mode 100755 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..5f448a16fe6dc7a03a4279fb19f9ba3af38eb634 GIT binary patch literal 10119 zc${UHS5VUr;N-svq>zMO5?TllAXI~ZbWB2T8j#)$y=wqLMa0lM(gj2aRRrlpRM1cb zRHTWBf)r_r3W(jGx%<!E!_C}2>^|&gW?$Fb(o9F!dkZ)P8es!07OSVHXJBApY;0_5 zYHDF&VP$1ydwcuKmoGnl{P@4YX8*t4|Dm^k{Fqu<S=ioQ`SN9KVPW8Z1KZoc|0n5R zoS^?nmH)B-*#sc$RcY*tXwmtvq}*~!9r)Q%m@T7cKJKI<l1W+cC8!|G&flL`7b)TF zYG8qKO-%h8TmGud(Zj(aHv^x%u9>A*yxU(&pYJn3G(8xeA?ToZ{S6U9qVNb8KWi>( zT7&_gPN<$YQpiNtQG?4I#mBAhEG+7NJ;=_TOEjg_1|@8vg%myBC6w53-ylkcms=@@ zSBAmhu{Q{Hy6(bfD=b|7prg{F+_0<9!&FE}%PROj6%c&B?p;Y1e)XXQ{rthcMn9ex z8a^b;d+keSH@q*9NpL-mujH2DBiK>K&W|Mra>}7hVnVGnU8h%68F>IMM;0knQqvJo zk&MK0vmdS1pZ79?$+VJ*=s;OP`a!&e11#r>@^$fOiCXd+h1c<(l4hM<_{5kqV6{LK z;(SU4vXAdmg&iq~;)bp63$Kw|2`wKkSblnC6}}{0!Puwj@o&5c5+<PHN~AeBqq%0! znbx3OmskJ>Pqmq(sK__{gn0esGInqG*}@R5W1?)tsB10D_(fbIqGA$rkow^Bd|9>% z?h<@*sEd%r@2krFyHgoa8_)~BgR4GmujytyjvLh8l9NSw;Pk;mM_m)1C*7Xnj3?>$ zdQPkbZHeAZPFB%zX(wqfQ2HGY&4yHmUy2ETw^~~u{rQR=rkmXgT)Z54R)<DPc4Y^h z_{KMp;Bz5r6e3ssy$XZwfJxg)xKZICbgFb>^t|K6W%+f{5f%qvkzSUJ>T?;U_@G8C zE=ujvywlI9_?u-G#m$o948XXdXgMtHI{bKYLxIz&rb`&oQYrtUpp~Os5`^!W172dx zHvgTM{`4&4x&fBqSAgG>_R53~{F33OLk}>5<I=b1uk1KR&D`*@*$?F9UDQsZixBUv zU4v<|8eCGQaIyxMEfG$cr=X*pXM+bb>Ty#brL%-(0*(yjP7irsejSUGu9#Ih!EyI~ zk-W5QeMImZjm{7>Cf^WfR+2Cj_LI+IR8D`8SdaG0%kD0hsnu(1|H{Ee@AYV#7HRSP z*}Dt;)c_F~V(no@x!oAvoDXAX%AE>3ZihBTnSN{`|I$h@CMWyh0OodXp3<!YmeQWM z==|tMji6NTF9V;!dGB&H4REGnE4urVE+8r0{42AEc|?Qv&!gK*vnV#Ze!mJbQo(Q` z0rKR*g||D7&gGHA9-3+S$KwALzv`M)e$k%753%%6Z6b@$cOVRRdY<_U-JCrWX$-rm zHS>AQQCR7d>NacQ!G-L!7)N9dv`yf=p|7&DY{4MYBMpPpwIqQ?eNrq)_vR$ez%Abf z9wm?XO!NI4yOs9O5VEoIIVW{PDIw|;A6LZTjrr`D{*`R9omv(fV)1IaekUnRl>1=- z{=ZGZ*4;@s1kInQCt+?;Ehm&KEzKJ9hs8a)sz=ZGeFh*+m!#d(=Y&2(%)CiHy03F$ zI@lif$;D?unfOCk@Glb+bWT?Gra)}ep$#85RVr<Jyea<%D!;Tt18n)M(cry}rb`a0 z6$#&8Wfoos6s{fXnv^dElZelJkcUfyf<yUv)Swz!(NaKL@7~?#BiB)#dg++i_JQlD zLG}4U5Ax22QGw<&A!GQEVk;kHC1dIeY4wRpQQ&P^&GX6%cME()=ndNy&6sgF7RaL( z$g!=K%_gm)ZtAcmY&sOrle`STb1YXlIX)A~ajG>hna#PMmrZy(0%%7h2LyoxlL_yH z_756`Ff2f$jw0N*c5~gsTQN9jV~p7dg%ek$NG`QvH@`y(M))+l%hifZK2ig#QO4B< zc|~&;`V3C6^qr^`o7}%1NMx!}GQhknJ1b+gHR-Hm3Pdi0KS^f`!-X@?uXuSf)q9uQ zjOyjU>6;;vxyI9i@W(s5rfPWrI(st|-Sw^#zrI=V$jcDffFW*E`367w;vkol!@baC z;_>tFcbeJ}2?@I4Doo9+zYFA~vvxS?J9X|!sbv}k)TfkC3l?PDjN@2}ATnNQTa+|5 z?yV=J%meVRuIe%cqeo8u_x3r(%(t>1&K}BctS-HQimg9aImj&IWKyK~W$j%$1Q^vK z5E*8{4Lle4lFrkhIIzT=ZLN+ab1}%PS~$qT)MsXTYiPt}BK*I|`k$1L$*>x6gatq! zroA+<=)OtpQz-Wc@-=tPN598I?@XMj<h^}d{m)`^nr(fd-tm2gAz4_XHa)N2O$fM) zy~87Hh`g8X<8*pH4Vltz;?-xD?no?&af3rd$a6Uqi@oB>!ZQPU(azWuKQ5gRXUK2F z^$$8$wx5Zw3>uPzlghNz!J{N;0?vJG;e_4QY7)TEa0k(FL?n)58Sr&2%R4}z)#U<y zQxI|$1um;f0-F5_4LeX~HCv{9IQSdg+)F2<&CD37ow&}Zd8XPKdTET~K}ROgH!n~| zBB<fJ$=#gyP^1uUuTY@khgsKytHCz{6`m$Ji{^CSpFXE=K0PJaxXObjka$vMN?$*? z0S528Lrxc_KE~73+m##u&edCw`ED1@$c@(Rab(@#H_i2NfdF1li9+_aH#v==Vrp8D z=Lq1T4XxeUW||@6OOjGaEL6%H&gp-z0P60_bqv0pL^bg3Z7#Kd;Bg7klJ^XIrL7{g z572i_v|%UXI6L>gdMm|A!;ndH1S9zh@EAwF4fFiP>;f8ph0{axrD3cCDLuIqHVLAC z$^I7U?{f69QDBbUHWJ{Te&PiQFy7CC;Q0WEs+cBU!tqNAa?9T)^0Ide!O0$V#n#z& zniYa&0#ptVh~+|S{&dbLu3C1*>lbEO=YqyDIz`95oVG6taWQl#dZ&s58;0j6o6RV; zRK$+)-F(GAe!#2Fgg(<aC5EAsr^PT<p+PM`m6Y`R%Q_6lM;I_fet)e-!dUsazzeX7 zajGniMy&;S+QNJ*q-~f*(?N%KPY_BC?-N>^tddX{my$ehfnh%jxp$XN1ZLcF7b*N` z(jJqS57fD0<5LqJeylD-@x57$ZF0EqiYT}Nyq!=iKi%=10CL=O3a(|<Uy47``7mH! zIM$|Ah`nbl3#XD0$+dM=LE4eEWs^4}bp)bUTHFLU0hoq2BRugxje5vfj^Zz5R>U1l zlZk0wYH}o}M0+42?KxH7>L%s+;#(O~8UIB7pzNE5l-#4b5F%3fV}Wrbp|oOI)_x)H zAvXP682%Xg=SwQe-*w^u5Pqr)?a|MKs4YUT3J}ev%Z3CS-G9BW(W@6dw$9}ehQI3q zPf?)LbefV<3+x6b*Q4lge3;lr0(wx&gM!<1kA_J(U5q`Tlm!?JtW$R;B3mC%Hv2u+ z`oQz-$Nt=<+QAj~jF7$D!`^|=7fdycYCH3>94>g>$FJ_Q;QOmY*u;wjh?0V&=m}0X zhcswRP`h#8Puv{BdSVc<@7+s|<l49}L$dH%kH59)`U7ozyBejhVdz%}U>I>x)8Kv< zxJgd(j&r;S9mHnXr@;b#@H=VQp+npG^#KqE0J%Ynr^Ud%ixO&PA$)iWrybNBca=UJ zE$@=3xOj@2VLoAeGB-v+!uv|69j6807jl8(G33(RE+;?)p>f!;G)NgPnbDadf8;GG zP3F6yANv(aZ;zWaH@6LvjNJ$H`H;a5Cxb6p&(T%ca}+Wu>eMSce+WsS9YUguiNZ)@ zb*b0sx|&RQNHU<hDIxG9<@qr9XWp5Mm&~a_FrK_?!KIlmSLO7W5canSu3TvXrc)y1 zrM_4vrqx&J#;QxM&be{(3@vGR{h8DEy9fowP=$7ZR(k-?%7!sukLaK{K9u43F^f`2 zZV4CR0)4L<Q-Y({wi~2O>l2N&lL3+t6_%Xm@?eB(8<w3;7u`sb-lIvLqeEq<!TWW* z4e20@<QUCl=v}7lzmgQ@C|7e{Uh^uc_eade$jRP)RP?@bARe**Q!cg^8Niuf6$Fi1 zh5e+0c}rqp`>+e>ym%qYcZ7^TMVKEy;{RO`pT(mi>>#`Qs8X6Bk_O(3_}_oP8hzh% z_#(88iMcFoS0*j_!UPu1fXV+teq*KOYhL4Z3~Eo#V4H2&g89*T2i}Xs)6^~PUUeZ& z{vv}!``JT54my+@2beCvRHy~hso+NpUMP!)s}b5IZ2!@Z!vhR^Y>)BUL_a*>+;9x| z>Q{31km$p}m`_Uu(7~WZXceD#!LM_}ES`JQ{LlGBL#e8~(K?$@Uh7_o4>Yib2m)7I z$_7OQQvKcdP8tryVfJDCPT+uQCzpJ$eK00fDC7f`Z#iFJS-m`vgb*i(twh0-M#~LE zc*hdFu@iAu=zcl&U|E*1mE-B^REa`q?5JHyevB*I+lr3?DglmV?^Zm(p%a4<8x)Ny zya+!HICT%NJ`)~y<}|2RhDt%2@cFYZ9r%q|sx0qwl`tY6k5_JzD?dkGKf^4l^5eZi zQ~SXus9sQ<NOndlD6T4cxM=XzeYaBf!>adkfSKg-QD&(+=iq(L$}J7Jh+o~MM9?bX z8dWG)#+ygWeX9hMUtqAlR%k+v+1#q#4#4_p>5!)-jz()*xFCM3m}~q2JWBHH0?(Ww zB$N-Bla|a8K$*1jtMpdyZOS+V!Zl6QeNRyKI>h4!T?%T@GuzUt1s03YdUgc-QwLyn z+10PB@Jm^A$hs#|KIg(NAt>{FWJ%ry3X+4t!GrN?pz>td5uVA>_wx<jQ;-JT%vdql zhkdlcphXq4{+c}4>jMw_;v%5P;Cg(#(xh6*Yl8dsB_y2gs6o^)nT>f3)(f_a!I~r9 z1t6V?sl~!gp^ZG=F}Aj}&@;?9rF-?-59-ZjP~1#EXQ=Ye7;%UK2O0+g<A6|7$V)JC z#>t|o4BZ*5={#l*Ogpa}<W7d1Om%MZ>PeajX>oIIiNS$!Wi8Rt@f`~?%^B#I3^CK~ z)^D6bD>Tiwbm87Lz_sBVd_Uq_th8Nw$J7JGYWsq~LuVMhR%JT*RdA~YG@8p*j7;TU ziNb`Par$Nwv8k?Y&*DD<L2sG0iT)|CnASi5W!5Cn_se)RAHc^4vfBx4G7S<p4nHG( zEH?tF1><L@T||Wk*5BVp^Ive7h5H(2>3`NKa&Et7$W-}a=66&2^4%rmgHA<5vi|E= za-H7vhn9DB7ty6kcV}1A8Kpo8e{WMKf7TGdvtOV|l$2ML3<L|ZGhuU?Cs}J^R(4J) zROiz`a9A||)4{H}s1ALi8X4$K`~!_V(BWN`!gj+R)brjPgbl4;vx`WQstyZ{(n_Ar z@<{AyC`_vS$l)M@ftmEyhw^m>@uxlH+_DE0R)Hwzg5OlHivUQ)`83Cx;Uj12gKbjA zkE<hv1MF(;D|HoxF8we^F3765sW;5Tx<LNtIVD#A5D}g-bL?yHO^FU@H(=Y5(1*#u zvbmVK%#cSIiY}50DB1zb_1Awd_J0E&Z`oTk@;i?`IkBus6)MdX=>WRyAP73Hi*9hQ z+kexV1**>Qrh)AHkiYhkx*v*^SCN1CgeeKePtQo~g8jL;B(OCZD;n{-Bt0{xkj3hS zj2<h)AUUY>S@~?y`$wrFGaVD=u<M~<29qU3%&`-CV3`f=CUWx^fjFqJ7Z-9bYo00{ z89ebCoB4ATq-fU8g4+I-^7v&!1aQX^Z2l~QM`;e79mdVc0-+q@*hEfwIx?}M;B0#b znMzJ65`R%oCQ;$3@1@LGav0*13pToytFrQM<d5=rXI*%q`-5JVXp22FHsio{I#B6( zK2~!Em!NJk;4SX!#$%~|GMg?%u5K>BE6^+r<!c`@QLp+6z?oqXbTs#fo~O}KLIycX zzf9-9GjjMrY%P-`SyWVyj@0He{)-=f?4cV#d<Jx04=18LLSW%0PO1$zq@J0_3Wg8% z7Yao>?pzS6wr?)wye(B>z!s$L>P-=k_;V)otcFBqL4wHeD&DdFu7?;nU+XFLl9eRR zG$taK270JP_52ne$>~2Yqn`UW{`58)Yda0O1>uHhJS52sGeF<C7@xXf(F|7O_y}R$ z%BmWoONFDelDW|Khi8o2x9!cM%!+7Sn$5Ganmid1{p7*|Hl!yG`5XqKCT=>ycp18K zBC-hZ!qR+;XTH*D7_^BwybfA;Oz9^S7PF1@V%2L-{WtI2&NXNN9|^->+v52o1nQp# zN9VQdVnEn$-fhvYB|Q>_#$3c%8Ho_Z-_W9)0*JC`2%FRp-69gQ|DtWA77{I4oZ)t7 ziE!6lilScE4_eTNl0N65%M5}+CzKC-9JViNjVZjoF!0)ji83KJYPP?MW6^Tg2^PvC zvcS~)36H^9J{k_xHHf{sSzA-A^K{KcF54+c(^sOSvfq{?ZU0RO&dmAXTtJ6si2af* zL*$DORAb4xjYjJ#5DD2VAF6<u(_A0^x2)FyWnW%C$vxP&+Y&ANCOV3)5a+#E+*7$O z(H5md%NiEH3`tZisJuM+PODl~g#4^gxZzbb3`6AgT;_gwh<@nk0Q<_JMsYhHvqtIC zH2p^GU_Ra&Ou=B|828p9`BF@r-YTJisc{<Gwn=pVQuB}al^wo3!{ZsHXscDlGn?Kr zzhz_ZWB**;7-tw2x0`5E8%-8yxkF$O4pqG)%#8!_@7vTJck_CH@ZETF*c;G2%-v<? ztuQ?H*-C@6@ws{KCZ>}LBMOBKMgMoNcmJtqR=vTK5;XO8`qBbqc5G*YyiKR7uA6Io zPdEwB1D>yKJ5hwQ3V?)D9M{^r`<W{2Spw*SCJ%7q^6UK0wfo^cmzR0=D`PM6sE4v5 zTR8dimiujm<3AwI>v8<uQHo}|c?1^VGbD+KM=*ZdtNF3K`J*lES5M?h2?{1>2VP3t z*v+|5%2VHKUMHLTsFeh(xl5)b@zJjhyQnR3|1nd~I8;~}AB^c$yo*s9Jua~F&&0TJ z!>p6{7Xc+7l*wR#0`xgd8$SKnvaurb#1Q$Ry0ZHTr|%UFIXpQTGE&A`{$ddywzjfa zg&LSf4$II5ob5pTe1PKMZqF(p+vg>TOh-w7?k_w(RCln>z+%5R4#xA`RO6jTZq?fG z$|<85?M5qntU=3YhBC+fBO7+zv^n|GmA<0a*JU$KNpp(5`)Y9xYDP!R%pgC#&nDV{ zrrjZ_W6;SY0p;#oavsR{YnLmpC?VO}PuxP$j@$Fgw^b~Zd>$`nvEOq!&F(eW`=zZ@ zF(jm%gC7U{xL|c#A1>}2i?n-UPN)oX7>Pg2WgBHtjhiI@1MqivO+G$2|C`hO=a;zi zK{NXy<Fr_jZgn@Xbkns@@jQpt3?P>eH)jPS@(;BB79Geh^lp?)8|O+a;5mX8xd|ZK zk0Et#iZ`3QUg6Q#93D*TgsB|>J$JyHketGk#@vbA(nY0bBE)i%XWR*v?p)lMhvm0; zKd*ll%B7{r7zKsng4kjlV1y=U(;gJ)DqmcDH>2~e&1Pp=&!IsrL0;rW_$v*6dr^y2 zD6KztR<S2!z^7{oyH`fLP!BiRr5V+7^E?@j2zs1=FfsK`tfTfPk8)v3NTj%1jd<z~ zk!T@@SEM?0<5wjQ<i=H~oS^Qo%khb+nGGt*cB+dYW(&5FtV6{#8cG-_9@(y{s(^Mb z7gMHPp1E*dThpTa>?Nsu|GTHMr};Zl&W?jhm(Pj0a_w5Vz1)0LXXTw+ExMWpb(!yr ziKMN!oV*;|bBo=~qdz7E;5sng$|3RFY^n^RFO^5CJkQx5BpS7i^3dU^=7z)wWz+TZ zK`Gqg21;xTj&;8$TE?Q?w~mIBz@zY&4a|8>5X2_k=vrcA2`S(@WOJ(Qa!Nyj9t55F zE5pQF2_LB3y_O_KH0L^J!1sMMW-z2!{yOy%q$%c8ks8V>M?aPaJf}gQ0_cds?HsY# z)PJtTHK!_}1;D^U+(O>!n(TROS^nB4s<-4=8zDL)Y$nr!*DtJ?$Ce9ny%0}6ntf$~ zIkO2buW3=Z-i<6;E^Tr_K;W7eeR=*B?&L%0`3n%q@}pbEuLYVK0O<AF$vPZ|g}wK^ zif0O2^}Xxq6w|e>Yni?#8y<%<%^^`u?c*Q6f6D5bbDH63IFc2$Z=rMBupllJpyJjI z_Nq1#=i(r0t$LBc!B;Vyq*-yaeirkSuwd!JB}o=X&hL_GUf0tbnVGe5b`VS!GXj*- zY?A)UW~y#6OG>{kXx5VGM-ox8uPXte-1#pLW?IJ>d&oVpyp#aCi~q4=IW=zX$D0(< z>n^~X9Pvg7r8#%@*luy2Y+<MmD5+3OqCK6%{?vU0r@hlpU*{m1`wD2+R-BX-#9n&G z$;?Wfa5Ky6KqM(>i~*p+=Y!1ZPe317RK<GTSu3`=05VAmTv_FG5fK|~Y|3t59dU>A z^jLtpSA(JY(OaSf?o8}pDA&z@Vq;8Uo7E8}f-YZm+-^d1qUi+|l!~UYgxRV|>6R8x zE4ZKi6y+uT{oT+8REW(X;IDn3FkeC^VQnHf+RMIaBjxa{+C&fsXO|Hjq*|qp{+!{E zKA8l;OV};mR~z~Bu75idR~Q^aI*=b|w$kVE2-Begth<=It)uTJIYErG(l+O$9({v? zjO}$avIkK-ksZ&k^y@&tnqfy@o`BB&d@^B}-JS;Fp7cnBTy-JMiCD79(0T25Vd@+O zGFt~PoUAxF`Z%i$zTE>>3QlA1I34snJBhN@>K6TIlk~#<%_ZyLppzOs%OdA)PayoW zm@Mvav{p9%YWZI8o4k^C4WR4M3=8t<?=vprE9Pc=OQpB>!GUnU9yZ7J=yH;|8b$fk zH*}tt;hp!8XO~_DmXtDnyql>iG<sN8HqWu=r>b&f+ckJ$g)Ownj+k&TNb4xj6Yt z0gJnV(t!R%SGR@nyYHvJ4Zv#CO2_6NKJX6r<YtMXgTkR^f~|*)zZ&C2uJVmG<^U?j zZ`K_D?%M5R@0v|~$8YOkO3z;ga7ijCoc<3_7Kl4+SPV0wxu>}fi3KRKhZGKo2~*H$ z$<s>5Thhz~tPf2tX<h=$!6`3LMdfpm79x*;@HDhm9w&@li-Nsn9-HapbsqD>3%Al8 zlXXn9f-WUYj7|%OQjI-Jolr(ciLsn(9HS1Mg3qZ5Al`kpb+sF<2H*5S;I>5y2uGCL zmh-3VG8xGXK&gmOoAkPIk`ktns3GuyE9AH(bS&Mh$uo;T@|O#zKjCq|iYg+#JndLy z5$_!Focz03LA-pFMblslA?vN1xIsXoAWGU?RukkM#FSTC<<|Mm#ZqWKkqa@}3GB>c zay$({5$9q2>BRRo<0m>vUXTD@9ja<LGzr?GaHA^Nm-Fll{}90!o{w=1nEpP=n=nUv zGvTLEHa}zqjLB35zgH$S7T9AlDm-8NiQu}#5rnpi>B%~j6U)N7Wf*l)`IQN(;FgNZ z@vtZJw-bln*F-jIm=#3T7Wuejc?&5cn<WH9*nn_JX>nS0mYWIsCl^jk3#S`ZKBr_B znBr)3yK;T8_!V5iUS9Duzpon&?eyEk!<I+$E<H`bKDklJM8+beFlq5zlS$66>I99Y zh2B*R?3~$0f5rCThI2TcT^x<*5&fb3Ft~--xN$qGQ%Ns3CdE5r!yB4p5(^d7?8KgT z;9|LP{T@vP{}rNPTpK$Xa?bS!3CxSE=I0dAGNJ)1;h#^a*kYdLT;8tteof*to~Mg9 z)mx*LU5x!sZkhe$&vtole|HlHY4xew>$;<%j9!#OdWrz?e4ogJC1yIu?>k+vE&lXe z;$xD_uc**4_~Oxuy2tSW#UM4g)(@3@Y;7!X*B81o{`UK7B9&X4IH2!w>5lcWjnBlo zsxo1-tr(z?-^{yFGiW>(cKu!1t4n$*qL@N`hpdKb;OA=dmz|rBd&!_jiF4%m9PQ&< zSN$Www0Gh_cIpYf{nma-H=~$d_^#IC;D&`1FYvJqYJme6Bvs<%)4dt*QwI&EB^B)> zDH+L^dS^!Ecx4uW9dAw!r4k8HC1wy71iq=ZXv&kle~a^dB2Ig%0~Abh7i`Rjai_E1 zgIWIC7*b@H#cq+r>Qke>V9{9Sdt|oY8Kt(oD(O!jIqYrhP@Ig^uyG9t9ydLv^-)e% zcj7gb-(9Eh*sT{d);X!}Hh}$Jl=<cAI!FB9z|#&4flbryH_S5sJsF&$cj^Veq!tPq z$(y6+ey(sO@n}-v;JOm~;A1T*)_txogOY`G>)N4aW+dQb<y!~)C5G8+WA6v2j!ubt zf@AW^=M}HEIY{C_T$%vC8kNBrADu)-6V490$3$n<2JL-U>74H;bvqg~=kocT!Yn43 z^NKa%3LZ{|XWS6lk*}tm{R3Y5_w?Rw{+EExsn@ed_l9&6UM79Ka=FE;@3FMnn~I3F zw~PKd4Jw}<v=7ks5?}hBn3fw%u^4UUnENf(=OWj2LL5}i_dN~$wJX*hx~bCk>xr(h zYS#0LZImP;{Of2R6FI;xp(E>Sn;1uRuR7hFCSHyF_cWsM#$2Dt#otpMx%+`Z9^0}% zV&}7reUuDt?M37+c(vul^b}s#Au{j36y^CLthbAFeD`zl%Q;q=+Ws1UOW(UQ&WM^F zN#yxse@CrC4C5aTe9Ufhi|sE-89n{)4l(rMx?I)e*cp<%)I50W<jL8|uYF&yY8#HZ z6h|o+RerM$$yeM``}si7>wEU(pVyApqL**ytHeGw{JabOo3Hm4<}7P8nsY5qKEFsM zYg}vBko`CHx54J&9(k`#N}?-%O|@$0(GT^)(;?wie-@6hFRzwFZlSM*?wz&66x_Sm z+7|zBYeE5xUi$Lwqm;W2JE<9uCFGq2j5xur5b(0pzyGjcH)xN`IB)t8h(a@N&l1#R zax5)FI#YC>EfZXru-u_|Q<D#(IG})L3}BakdBIw7CJfrfg<<&Esz@m=wJ}k9ah2OA z!Pm8nJy?nOO{3Du!EwgCB5R65Fa`J;-_|>U)FIRsM2Ao<gsnb2C=wQs7I8}uOdiw- zr+qW6Mh7Igj}QOR8WAq{<~ff0OJ3tBUlUFAMAW_8j9!xnSi|NG8Mm(q%q|4<V|ll# zu|}Xon|Fc*)e^mHTZ0IN?6sf5GF(<!R26V+&p1wg4PU?%+b!bkye0T=M5?6fk1n>E zUU@oi{o4$?GCD!x8D55Zcm1Has2gK0<2WQ};zM{=v-dhHqR$eIs!?6>MwCd)eXmM+ z`<B09oe=4xXe9V7c-@FpsbVCn{Ag5Qca=+TT%^_XSOC^ik(U-EgFKRUXZUV`pkndW zYF=h~skJ|QEJbNh0}-#I@G8Mo89lF!uRZI+a9?$Sb@k4(m{Z8uQPw+nnxW6Kkwi^# zJ)m7(e3^)!hu~ZNWd&uVO}}q!->N|;I|ab;Xo2@%Cu$9bOnKI`36<ui3m$AqFEN?- z@s1mm7{4`LKQTRzMY$^N-uJd5*q@@3GCWKfO0so<<k+T+wG!OkNAi>5x?qv7A$W6J zj{U+YHo;)tFHvXn%uu!gP0rb={+;J~fJwb%tEID>golImCikj^o3G{X8n9QHZslxE zqudB&qZFQEcUbH30ZaLgPhQ(}Y4Qvzc5qR%^rA?7>6z>z%HJpB(K^G;qz3QU`nNAx zYX9)GCfRSUye>o4wz2XX32XLx(jHKAzsT~!pX4uOWayA+`MgwMQ+n9eV)4s{H>&|j zgPBr%ThEW=qix?|D`n67G>qmKMV#^vliwbET_dtme}KAu#?dF1m9vp|I(lXPLwb^Z zlSH)9?N(vW@TLH_+}lkFOh@WS&~e1YlDPp1Xa5idvBBH3wpEHYo>59uSL5wZjj|ck z<l9#p6e8pbd{u9SFJ)hAm{O2=6<5wkR0~Rocly-g*W9-~N^D%Keu0?3Z4|z<u2Yj% zxt(0H)wy}gz$54EcZHM!;h5CHsrI0(N<y*c5EWPHz8|QX(%9rt6RqXlTtvt@zOLX; z(0C9~iXymv+tL0T#AURLoqw16LC}BMNvt~`DR%v00D+RZ0z&P^tY`k2=V~pwQxYSF zta#hv>Y79lBc{42Gl#{s@=(<r<tIuMev>`RJx~8;>>SjE4WLs>gG)|Lh}*rn=2Mn( z0uf$$mML)K&-iZL>`--Pswkl$q6zZXQQpXD-LDCD_A@AG?9Ly)582bf$`{yAPxL~X z!H}vg8O&C;j?;QXvF{_3$?W6v6`4>8*AG?d=~iaR24G0zI;MG^BxuywoalM#lTGOf zL1n)?w@enYM_2)W?+_}ttS^HP4FprC<+WXXdUG=rshr&<g3EPHT`#M2W%&9Yz`IJC zn_G5^RRi5!2tEq|4fdkLYlvn){HOb(cbj$%);&sEa^LO>TVQMajgoBoN1Z;1ZFx8U zTnieEA3iy`jnz|8h%290m7NlX+$nJ19fYt=tF-S1cOm?J#LQhE!5>@Ix1@$m2&@^k z-k}}0`*}4KhiD!koK~#cTPVAkM@??EcjjIHARX^dXz<1?RC4v!47akUvixR0eiANj zDi`qaXmR@V>z87r;hDod{EXsI&muDQl=T<5l&MA7gs1lyX1QnlLx96xq}T1`fXxNN z!euwr-_r{-*x<)8(t{$SIoRf+nz`B?{K|J#xAjmSu_p!cw;<=L+yTNA|K_3@r+aF~ zbmuKAtm*@Sb2;lY%@C!5E$b!wr|x<_pCmuMpOAN7S(h%qKAM<MYyI4_aBfR|YvGps z`qG--mf!uYw=bkyM%4p$mOcLarrPm+>iOo=ryo`h5gV!}o;DumUtE^irFeLiH}gE0 zr0};~tZ4qB)Ry&|K|uJTj&8)(ng6Ic_O_|*myavo351;lwsh+J^ZV>N``$0SN}Eoe zDx44StyhO8QoQ$CSJ^|=Gxg{RFXlBw+wepXdqwhMVvWP(F_G^9b8By(inYQzw`LPJ ze~GQH>Pk^<j-d$vyMg}KG57S{u;yg9!&AhRf2vcLT~MbJ40-mwo+msTqwAH+wdN!& zh^SKoY6Cp{fAF-TmzV)ZH)I%tT|WEVK9w(58eiC+6EHszh?0<V>3EwcHzWE4WHAZ< zL&W}e7Z+vaC@}+2DcN9Ok=yMwt!XT>Ncgnc_jS6s@(Nb)(4)^zvg$krc_=dCW}oin xH*p$|X5p<f+toV#b@Di#PvV=!B_8IBW)I3WkFPnl5N;kS)^c_#Bm;o{{{pYrjbs1- diff --git a/docs/ui/default/framing.css b/docs/ui/default/framing.css new file mode 100644 --- /dev/null +++ b/docs/ui/default/framing.css @@ -0,0 +1,23 @@ +/* The following styles size, place, and layer the slide components. + Edit these if you want to change the overall slide layout. + The commented lines can be uncommented (and modified, if necessary) + to help you with the rearrangement process. */ + +/* target = 1024x768 */ + +div#header, div#footer, .slide {width: 100%; top: 0; left: 0;} +div#header {top: 0; height: 3em; z-index: 1;} +div#footer {top: auto; bottom: 0; height: 2.5em; z-index: 5;} +.slide {top: 0; width: 92%; padding: 3.5em 4% 4%; z-index: 2; list-style: none;} +div#controls {left: 50%; bottom: 0; width: 50%; z-index: 100;} +div#controls form {position: absolute; bottom: 0; right: 0; width: 100%; + margin: 0;} +#currentSlide {position: absolute; width: 10%; left: 45%; bottom: 1em; z-index: 10;} +html>body #currentSlide {position: fixed;} + +/* +div#header {background: #FCC;} +div#footer {background: #CCF;} +div#controls {background: #BBD;} +div#currentSlide {background: #FFC;} +*/ diff --git a/docs/ui/default/iepngfix.htc b/docs/ui/default/iepngfix.htc new file mode 100644 --- /dev/null +++ b/docs/ui/default/iepngfix.htc @@ -0,0 +1,42 @@ +<public:component> +<public:attach event="onpropertychange" onevent="doFix()" /> + +<script> + +// IE5.5+ PNG Alpha Fix v1.0 by Angus Turnbull http://www.twinhelix.com +// Free usage permitted as long as this notice remains intact. + +// This must be a path to a blank image. That's all the configuration you need here. +var blankImg = 'v11rc1/default/blank.gif'; + +var f = 'DXImageTransform.Microsoft.AlphaImageLoader'; + +function filt(s, m) { + if (filters[f]) { + filters[f].enabled = s ? true : false; + if (s) with (filters[f]) { src = s; sizingMethod = m } + } else if (s) style.filter = 'progid:'+f+'(src="'+s+'",sizingMethod="'+m+'")'; +} + +function doFix() { + if ((parseFloat(navigator.userAgent.match(/MSIE (\S+)/)[1]) < 5.5) || + (event && !/(background|src)/.test(event.propertyName))) return; + + if (tagName == 'IMG') { + if ((/\.png$/i).test(src)) { + filt(src, 'image'); // was 'scale' + src = blankImg; + } else if (src.indexOf(blankImg) < 0) filt(); + } else if (style.backgroundImage) { + if (style.backgroundImage.match(/^url[("']+(.*\.png)[)"']+$/i)) { + var s = RegExp.$1; + style.backgroundImage = ''; + filt(s, 'crop'); + } else filt(); + } +} + +doFix(); + +</script> +</public:component> \ No newline at end of file diff --git a/docs/ui/default/opera.css b/docs/ui/default/opera.css new file mode 100644 --- /dev/null +++ b/docs/ui/default/opera.css @@ -0,0 +1,7 @@ +/* DO NOT CHANGE THESE unless you really want to break Opera Show */ +.slide { + visibility: visible !important; + position: static !important; + page-break-before: always; +} +#slide0 {page-break-before: avoid;} diff --git a/docs/ui/default/outline.css b/docs/ui/default/outline.css new file mode 100644 --- /dev/null +++ b/docs/ui/default/outline.css @@ -0,0 +1,15 @@ +/* don't change this unless you want the layout stuff to show up in the outline view! */ + +.layout div, #footer *, #controlForm * {display: none;} +#footer, #controls, #controlForm, #navLinks, #toggle { + display: block; visibility: visible; margin: 0; padding: 0;} +#toggle {float: right; padding: 0.5em;} +html>body #toggle {position: fixed; top: 0; right: 0;} + +/* making the outline look pretty-ish */ + +#slide0 h1, #slide0 h2, #slide0 h3, #slide0 h4 {border: none; margin: 0;} +#slide0 h1 {padding-top: 1.5em;} +.slide h1 {margin: 1.5em 0 0; padding-top: 0.25em; + border-top: 1px solid #888; border-bottom: 1px solid #AAA;} +#toggle {border: 1px solid; border-width: 0 0 1px 1px; background: #FFF;} diff --git a/docs/ui/default/pretty.css b/docs/ui/default/pretty.css new file mode 100644 --- /dev/null +++ b/docs/ui/default/pretty.css @@ -0,0 +1,86 @@ +/* Following are the presentation styles -- edit away! */ + +body {background: #FFF url(bodybg.gif) -16px 0 no-repeat; color: #000; font-size: 2em;} +:link, :visited {text-decoration: none; color: #00C;} +#controls :active {color: #88A !important;} +#controls :focus {outline: 1px dotted #227;} +h1, h2, h3, h4 {font-size: 100%; margin: 0; padding: 0; font-weight: inherit;} +ul, pre {margin: 0; line-height: 1em;} +html, body {margin: 0; padding: 0;} + +blockquote, q {font-style: italic;} +blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em; text-align: center; font-size: 1em;} +blockquote p {margin: 0;} +blockquote i {font-style: normal;} +blockquote b {display: block; margin-top: 0.5em; font-weight: normal; font-size: smaller; font-style: normal;} +blockquote b i {font-style: italic;} + +kbd {font-weight: bold; font-size: 1em;} +sup {font-size: smaller; line-height: 1px;} + +.slide code {padding: 2px 0.25em; font-weight: bold; color: #533;} +.slide code.bad, code del {color: red;} +.slide code.old {color: silver;} +.slide pre {padding: 0; margin: 0.25em 0 0.5em 0.5em; color: #533; font-size: 90%;} +.slide pre code {display: block;} +.slide ul {margin-left: 5%; margin-right: 7%; list-style: disc;} +.slide li {margin-top: 0.75em; margin-right: 0;} +.slide ul ul {line-height: 1;} +.slide ul ul li {margin: .2em; font-size: 85%; list-style: square;} +.slide img.leader {display: block; margin: 0 auto;} + +div#header, div#footer {background: #005; color: #AAB; + font-family: Verdana, Helvetica, sans-serif;} +div#header {background: #005 url(bodybg.gif) -16px 0 no-repeat; + line-height: 1px;} +div#footer {font-size: 0.5em; font-weight: bold; padding: 1em 0;} +#footer h1, #footer h2 {display: block; padding: 0 1em;} +#footer h2 {font-style: italic;} + +div.long {font-size: 0.75em;} +.slide h1 {position: absolute; top: 0.7em; left: 87px; z-index: 1; + margin: 0; padding: 0.3em 0 0 50px; white-space: nowrap; + font: bold 150%/1em Helvetica, sans-serif; text-transform: capitalize; + color: #DDE; background: #005;} +.slide h3 {font-size: 130%;} +h1 abbr {font-variant: small-caps;} + +div#controls {position: absolute; left: 50%; bottom: 0; + width: 50%; + text-align: right; font: bold 0.9em Verdana, Helvetica, sans-serif;} +html>body div#controls {position: fixed; padding: 0 0 1em 0; + top: auto;} +div#controls form {position: absolute; bottom: 0; right: 0; width: 100%; + margin: 0; padding: 0;} +#controls #navLinks a {padding: 0; margin: 0 0.5em; + background: #005; border: none; color: #779; + cursor: pointer;} +#controls #navList {height: 1em;} +#controls #navList #jumplist {position: absolute; bottom: 0; right: 0; background: #DDD; color: #227;} + +#currentSlide {text-align: center; font-size: 0.5em; color: #449;} + +#slide0 {padding-top: 3.5em; font-size: 90%;} +#slide0 h1 {position: static; margin: 1em 0 0; padding: 0; + font: bold 2em Helvetica, sans-serif; white-space: normal; + color: #000; background: transparent;} +#slide0 h2 {font: bold italic 1em Helvetica, sans-serif; margin: 0.25em;} +#slide0 h3 {margin-top: 1.5em; font-size: 1.5em;} +#slide0 h4 {margin-top: 0; font-size: 1em;} + +ul.urls {list-style: none; display: inline; margin: 0;} +.urls li {display: inline; margin: 0;} +.note {display: none;} +.external {border-bottom: 1px dotted gray;} +html>body .external {border-bottom: none;} +.external:after {content: " \274F"; font-size: smaller; color: #77B;} + +.incremental, .incremental *, .incremental *:after {color: #DDE; visibility: visible;} +img.incremental {visibility: hidden;} +.slide .current {color: #B02;} + + +/* diagnostics + +li:after {content: " [" attr(class) "]"; color: #F88;} + */ \ No newline at end of file diff --git a/docs/ui/default/print.css b/docs/ui/default/print.css new file mode 100644 --- /dev/null +++ b/docs/ui/default/print.css @@ -0,0 +1,1 @@ +/* The following rule is necessary to have all slides appear in print! DO NOT REMOVE IT! */ .slide, ul {page-break-inside: avoid; visibility: visible !important;} h1 {page-break-after: avoid;} body {font-size: 12pt; background: white;} * {color: black;} #slide0 h1 {font-size: 200%; border: none; margin: 0.5em 0 0.25em;} #slide0 h3 {margin: 0; padding: 0;} #slide0 h4 {margin: 0 0 0.5em; padding: 0;} #slide0 {margin-bottom: 3em;} h1 {border-top: 2pt solid gray; border-bottom: 1px dotted silver;} .extra {background: transparent !important;} div.extra, pre.extra, .example {font-size: 10pt; color: #333;} ul.extra a {font-weight: bold;} p.example {display: none;} #header {display: none;} #footer h1 {margin: 0; border-bottom: 1px solid; color: gray; font-style: italic;} #footer h2, #controls {display: none;} /* The following rule keeps the layout stuff out of print. Remove at your own risk! */ .layout, .layout * {display: none !important;} \ No newline at end of file diff --git a/docs/ui/default/s5-core.css b/docs/ui/default/s5-core.css new file mode 100644 --- /dev/null +++ b/docs/ui/default/s5-core.css @@ -0,0 +1,9 @@ +/* Do not edit or override these styles! The system will likely break if you do. */ + +div#header, div#footer, div#controls, .slide {position: absolute;} +html>body div#header, html>body div#footer, + html>body div#controls, html>body .slide {position: fixed;} +.handout {display: none;} +.layout {display: block;} +.slide, .hideme, .incremental {visibility: hidden;} +#slide0 {visibility: visible;} diff --git a/docs/ui/default/slides.css b/docs/ui/default/slides.css new file mode 100644 --- /dev/null +++ b/docs/ui/default/slides.css @@ -0,0 +1,3 @@ +@import url(s5-core.css); /* required to make the slide show run at all */ +@import url(framing.css); /* sets basic placement and size of slide components */ +@import url(pretty.css); /* stuff that makes the slides look better than blah */ \ No newline at end of file diff --git a/docs/ui/default/slides.js b/docs/ui/default/slides.js new file mode 100644 --- /dev/null +++ b/docs/ui/default/slides.js @@ -0,0 +1,552 @@ +// S5 v1.1 slides.js -- released into the Public Domain +// +// Please see http://www.meyerweb.com/eric/tools/s5/credits.html for information +// about all the wonderful and talented contributors to this code! + +var undef; +var slideCSS = ''; +var snum = 0; +var smax = 1; +var incpos = 0; +var number = undef; +var s5mode = true; +var defaultView = 'slideshow'; +var controlVis = 'visible'; + +var isIE = navigator.appName == 'Microsoft Internet Explorer' ? 1 : 0; +var isOp = navigator.userAgent.indexOf('Opera') > -1 ? 1 : 0; +var isGe = navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('Safari') < 1 ? 1 : 0; + +function hasClass(object, className) { + if (!object.className) return false; + return (object.className.search('(^|\\s)' + className + '(\\s|$)') != -1); +} + +function hasValue(object, value) { + if (!object) return false; + return (object.search('(^|\\s)' + value + '(\\s|$)') != -1); +} + +function removeClass(object,className) { + if (!object) return; + object.className = object.className.replace(new RegExp('(^|\\s)'+className+'(\\s|$)'), RegExp.$1+RegExp.$2); +} + +function addClass(object,className) { + if (!object || hasClass(object, className)) return; + if (object.className) { + object.className += ' '+className; + } else { + object.className = className; + } +} + +function GetElementsWithClassName(elementName,className) { + var allElements = document.getElementsByTagName(elementName); + var elemColl = new Array(); + for (var i = 0; i< allElements.length; i++) { + if (hasClass(allElements[i], className)) { + elemColl[elemColl.length] = allElements[i]; + } + } + return elemColl; +} + +function isParentOrSelf(element, id) { + if (element == null || element.nodeName=='BODY') return false; + else if (element.id == id) return true; + else return isParentOrSelf(element.parentNode, id); +} + +function nodeValue(node) { + var result = ""; + if (node.nodeType == 1) { + var children = node.childNodes; + for (var i = 0; i < children.length; ++i) { + result += nodeValue(children[i]); + } + } + else if (node.nodeType == 3) { + result = node.nodeValue; + } + return(result); +} + +function slideLabel() { + var slideColl = GetElementsWithClassName('*','slide'); + var list = document.getElementById('jumplist'); + smax = slideColl.length; + for (var n = 0; n < smax; n++) { + var obj = slideColl[n]; + + var did = 'slide' + n.toString(); + obj.setAttribute('id',did); + if (isOp) continue; + + var otext = ''; + var menu = obj.firstChild; + if (!menu) continue; // to cope with empty slides + while (menu && menu.nodeType == 3) { + menu = menu.nextSibling; + } + if (!menu) continue; // to cope with slides with only text nodes + + var menunodes = menu.childNodes; + for (var o = 0; o < menunodes.length; o++) { + otext += nodeValue(menunodes[o]); + } + list.options[list.length] = new Option(n + ' : ' + otext, n); + } +} + +function currentSlide() { + var cs; + if (document.getElementById) { + cs = document.getElementById('currentSlide'); + } else { + cs = document.currentSlide; + } + cs.innerHTML = '<span id="csHere">' + snum + '<\/span> ' + + '<span id="csSep">\/<\/span> ' + + '<span id="csTotal">' + (smax-1) + '<\/span>'; + if (snum == 0) { + cs.style.visibility = 'hidden'; + } else { + cs.style.visibility = 'visible'; + } +} + +function go(step) { + if (document.getElementById('slideProj').disabled || step == 0) return; + var jl = document.getElementById('jumplist'); + var cid = 'slide' + snum; + var ce = document.getElementById(cid); + if (incrementals[snum].length > 0) { + for (var i = 0; i < incrementals[snum].length; i++) { + removeClass(incrementals[snum][i], 'current'); + removeClass(incrementals[snum][i], 'incremental'); + } + } + if (step != 'j') { + snum += step; + lmax = smax - 1; + if (snum > lmax) snum = lmax; + if (snum < 0) snum = 0; + } else + snum = parseInt(jl.value); + var nid = 'slide' + snum; + var ne = document.getElementById(nid); + if (!ne) { + ne = document.getElementById('slide0'); + snum = 0; + } + if (step < 0) {incpos = incrementals[snum].length} else {incpos = 0;} + if (incrementals[snum].length > 0 && incpos == 0) { + for (var i = 0; i < incrementals[snum].length; i++) { + if (hasClass(incrementals[snum][i], 'current')) + incpos = i + 1; + else + addClass(incrementals[snum][i], 'incremental'); + } + } + if (incrementals[snum].length > 0 && incpos > 0) + addClass(incrementals[snum][incpos - 1], 'current'); + ce.style.visibility = 'hidden'; + ne.style.visibility = 'visible'; + jl.selectedIndex = snum; + currentSlide(); + number = 0; +} + +function goTo(target) { + if (target >= smax || target == snum) return; + go(target - snum); +} + +function subgo(step) { + if (step > 0) { + removeClass(incrementals[snum][incpos - 1],'current'); + removeClass(incrementals[snum][incpos], 'incremental'); + addClass(incrementals[snum][incpos],'current'); + incpos++; + } else { + incpos--; + removeClass(incrementals[snum][incpos],'current'); + addClass(incrementals[snum][incpos], 'incremental'); + addClass(incrementals[snum][incpos - 1],'current'); + } +} + +function toggle() { + var slideColl = GetElementsWithClassName('*','slide'); + var slides = document.getElementById('slideProj'); + var outline = document.getElementById('outlineStyle'); + if (!slides.disabled) { + slides.disabled = true; + outline.disabled = false; + s5mode = false; + fontSize('1em'); + for (var n = 0; n < smax; n++) { + var slide = slideColl[n]; + slide.style.visibility = 'visible'; + } + } else { + slides.disabled = false; + outline.disabled = true; + s5mode = true; + fontScale(); + for (var n = 0; n < smax; n++) { + var slide = slideColl[n]; + slide.style.visibility = 'hidden'; + } + slideColl[snum].style.visibility = 'visible'; + } +} + +function showHide(action) { + var obj = GetElementsWithClassName('*','hideme')[0]; + switch (action) { + case 's': obj.style.visibility = 'visible'; break; + case 'h': obj.style.visibility = 'hidden'; break; + case 'k': + if (obj.style.visibility != 'visible') { + obj.style.visibility = 'visible'; + } else { + obj.style.visibility = 'hidden'; + } + break; + } +} + +// 'keys' code adapted from MozPoint (http://mozpoint.mozdev.org/) +function keys(key) { + if (!key) { + key = event; + key.which = key.keyCode; + } + if (key.which == 84) { + toggle(); + return; + } + if (s5mode) { + switch (key.which) { + case 10: // return + case 13: // enter + if (window.event && isParentOrSelf(window.event.srcElement, 'controls')) return; + if (key.target && isParentOrSelf(key.target, 'controls')) return; + if(number != undef) { + goTo(number); + break; + } + case 32: // spacebar + case 34: // page down + case 39: // rightkey + case 40: // downkey + if(number != undef) { + go(number); + } else if (!incrementals[snum] || incpos >= incrementals[snum].length) { + go(1); + } else { + subgo(1); + } + break; + case 33: // page up + case 37: // leftkey + case 38: // upkey + if(number != undef) { + go(-1 * number); + } else if (!incrementals[snum] || incpos <= 0) { + go(-1); + } else { + subgo(-1); + } + break; + case 36: // home + goTo(0); + break; + case 35: // end + goTo(smax-1); + break; + case 67: // c + showHide('k'); + break; + } + if (key.which < 48 || key.which > 57) { + number = undef; + } else { + if (window.event && isParentOrSelf(window.event.srcElement, 'controls')) return; + if (key.target && isParentOrSelf(key.target, 'controls')) return; + number = (((number != undef) ? number : 0) * 10) + (key.which - 48); + } + } + return false; +} + +function clicker(e) { + number = undef; + var target; + if (window.event) { + target = window.event.srcElement; + e = window.event; + } else target = e.target; + if (target.getAttribute('href') != null || hasValue(target.rel, 'external') || isParentOrSelf(target, 'controls') || isParentOrSelf(target,'embed') || isParentOrSelf(target,'object')) return true; + if (!e.which || e.which == 1) { + if (!incrementals[snum] || incpos >= incrementals[snum].length) { + go(1); + } else { + subgo(1); + } + } +} + +function findSlide(hash) { + var target = null; + var slides = GetElementsWithClassName('*','slide'); + for (var i = 0; i < slides.length; i++) { + var targetSlide = slides[i]; + if ( (targetSlide.name && targetSlide.name == hash) + || (targetSlide.id && targetSlide.id == hash) ) { + target = targetSlide; + break; + } + } + while(target != null && target.nodeName != 'BODY') { + if (hasClass(target, 'slide')) { + return parseInt(target.id.slice(5)); + } + target = target.parentNode; + } + return null; +} + +function slideJump() { + if (window.location.hash == null) return; + var sregex = /^#slide(\d+)$/; + var matches = sregex.exec(window.location.hash); + var dest = null; + if (matches != null) { + dest = parseInt(matches[1]); + } else { + dest = findSlide(window.location.hash.slice(1)); + } + if (dest != null) + go(dest - snum); +} + +function fixLinks() { + var thisUri = window.location.href; + thisUri = thisUri.slice(0, thisUri.length - window.location.hash.length); + var aelements = document.getElementsByTagName('A'); + for (var i = 0; i < aelements.length; i++) { + var a = aelements[i].href; + var slideID = a.match('\#slide[0-9]{1,2}'); + if ((slideID) && (slideID[0].slice(0,1) == '#')) { + var dest = findSlide(slideID[0].slice(1)); + if (dest != null) { + if (aelements[i].addEventListener) { + aelements[i].addEventListener("click", new Function("e", + "if (document.getElementById('slideProj').disabled) return;" + + "go("+dest+" - snum); " + + "if (e.preventDefault) e.preventDefault();"), true); + } else if (aelements[i].attachEvent) { + aelements[i].attachEvent("onclick", new Function("", + "if (document.getElementById('slideProj').disabled) return;" + + "go("+dest+" - snum); " + + "event.returnValue = false;")); + } + } + } + } +} + +function externalLinks() { + if (!document.getElementsByTagName) return; + var anchors = document.getElementsByTagName('a'); + for (var i=0; i<anchors.length; i++) { + var anchor = anchors[i]; + if (anchor.getAttribute('href') && hasValue(anchor.rel, 'external')) { + anchor.target = '_blank'; + addClass(anchor,'external'); + } + } +} + +function createControls() { + var controlsDiv = document.getElementById("controls"); + if (!controlsDiv) return; + var hider = ' onmouseover="showHide(\'s\');" onmouseout="showHide(\'h\');"'; + var hideDiv, hideList = ''; + if (controlVis == 'hidden') { + hideDiv = hider; + } else { + hideList = hider; + } + controlsDiv.innerHTML = '<form action="#" id="controlForm"' + hideDiv + '>' + + '<div id="navLinks">' + + '<a accesskey="t" id="toggle" href="javascript:toggle();">Ø<\/a>' + + '<a accesskey="z" id="prev" href="javascript:go(-1);">«<\/a>' + + '<a accesskey="x" id="next" href="javascript:go(1);">»<\/a>' + + '<div id="navList"' + hideList + '><select id="jumplist" onchange="go(\'j\');"><\/select><\/div>' + + '<\/div><\/form>'; + if (controlVis == 'hidden') { + var hidden = document.getElementById('navLinks'); + } else { + var hidden = document.getElementById('jumplist'); + } + addClass(hidden,'hideme'); +} + +function fontScale() { // causes layout problems in FireFox that get fixed if browser's Reload is used; same may be true of other Gecko-based browsers + if (!s5mode) return false; + var vScale = 22; // both yield 32 (after rounding) at 1024x768 + var hScale = 32; // perhaps should auto-calculate based on theme's declared value? + if (window.innerHeight) { + var vSize = window.innerHeight; + var hSize = window.innerWidth; + } else if (document.documentElement.clientHeight) { + var vSize = document.documentElement.clientHeight; + var hSize = document.documentElement.clientWidth; + } else if (document.body.clientHeight) { + var vSize = document.body.clientHeight; + var hSize = document.body.clientWidth; + } else { + var vSize = 700; // assuming 1024x768, minus chrome and such + var hSize = 1024; // these do not account for kiosk mode or Opera Show + } + var newSize = Math.min(Math.round(vSize/vScale),Math.round(hSize/hScale)); + fontSize(newSize + 'px'); + if (isGe) { // hack to counter incremental reflow bugs + var obj = document.getElementsByTagName('body')[0]; + obj.style.display = 'none'; + obj.style.display = 'block'; + } +} + +function fontSize(value) { + if (!(s5ss = document.getElementById('s5ss'))) { + if (!isIE) { + document.getElementsByTagName('head')[0].appendChild(s5ss = document.createElement('style')); + s5ss.setAttribute('media','screen, projection'); + s5ss.setAttribute('id','s5ss'); + } else { + document.createStyleSheet(); + document.s5ss = document.styleSheets[document.styleSheets.length - 1]; + } + } + if (!isIE) { + while (s5ss.lastChild) s5ss.removeChild(s5ss.lastChild); + s5ss.appendChild(document.createTextNode('body {font-size: ' + value + ' !important;}')); + } else { + document.s5ss.addRule('body','font-size: ' + value + ' !important;'); + } +} + +function notOperaFix() { + slideCSS = document.getElementById('slideProj').href; + var slides = document.getElementById('slideProj'); + var outline = document.getElementById('outlineStyle'); + slides.setAttribute('media','screen'); + outline.disabled = true; + if (isGe) { + slides.setAttribute('href','null'); // Gecko fix + slides.setAttribute('href',slideCSS); // Gecko fix + } + if (isIE && document.styleSheets && document.styleSheets[0]) { + document.styleSheets[0].addRule('img', 'behavior: url(ui/default/iepngfix.htc)'); + document.styleSheets[0].addRule('div', 'behavior: url(ui/default/iepngfix.htc)'); + document.styleSheets[0].addRule('.slide', 'behavior: url(ui/default/iepngfix.htc)'); + } +} + +function getIncrementals(obj) { + var incrementals = new Array(); + if (!obj) + return incrementals; + var children = obj.childNodes; + for (var i = 0; i < children.length; i++) { + var child = children[i]; + if (hasClass(child, 'incremental')) { + if (child.nodeName == 'OL' || child.nodeName == 'UL') { + removeClass(child, 'incremental'); + for (var j = 0; j < child.childNodes.length; j++) { + if (child.childNodes[j].nodeType == 1) { + addClass(child.childNodes[j], 'incremental'); + } + } + } else { + incrementals[incrementals.length] = child; + removeClass(child,'incremental'); + } + } + if (hasClass(child, 'show-first')) { + if (child.nodeName == 'OL' || child.nodeName == 'UL') { + removeClass(child, 'show-first'); + if (child.childNodes[isGe].nodeType == 1) { + removeClass(child.childNodes[isGe], 'incremental'); + } + } else { + incrementals[incrementals.length] = child; + } + } + incrementals = incrementals.concat(getIncrementals(child)); + } + return incrementals; +} + +function createIncrementals() { + var incrementals = new Array(); + for (var i = 0; i < smax; i++) { + incrementals[i] = getIncrementals(document.getElementById('slide'+i)); + } + return incrementals; +} + +function defaultCheck() { + var allMetas = document.getElementsByTagName('meta'); + for (var i = 0; i< allMetas.length; i++) { + if (allMetas[i].name == 'defaultView') { + defaultView = allMetas[i].content; + } + if (allMetas[i].name == 'controlVis') { + controlVis = allMetas[i].content; + } + } +} + +// Key trap fix, new function body for trap() +function trap(e) { + if (!e) { + e = event; + e.which = e.keyCode; + } + try { + modifierKey = e.ctrlKey || e.altKey || e.metaKey; + } + catch(e) { + modifierKey = false; + } + return modifierKey || e.which == 0; +} + +function startup() { + defaultCheck(); + if (!isOp) createControls(); + slideLabel(); + fixLinks(); + externalLinks(); + fontScale(); + if (!isOp) { + notOperaFix(); + incrementals = createIncrementals(); + slideJump(); + if (defaultView == 'outline') { + toggle(); + } + document.onkeyup = keys; + document.onkeypress = trap; + document.onclick = clicker; + } +} + +window.onload = startup; +window.onresize = function(){setTimeout('fontScale()', 50);} \ No newline at end of file diff --git a/docs/ui/i18n/00_head.txt b/docs/ui/i18n/00_head.txt new file mode 100644 --- /dev/null +++ b/docs/ui/i18n/00_head.txt @@ -0,0 +1,8 @@ +<!-- style sheet links --> +<link rel="stylesheet" href="ui/i18n/slides.css" type="text/css" media="projection" id="slideProj" /> +<link rel="stylesheet" href="ui/default/outline.css" type="text/css" media="screen" id="outlineStyle" /> +<link rel="stylesheet" href="ui/default/print.css" type="text/css" media="print" id="slidePrint" /> +<link rel="stylesheet" href="ui/default/opera.css" type="text/css" media="projection" id="operaFix" /> + +<!-- S5 JS --> +<script src="ui/default/slides.js" type="text/javascript"></script> diff --git a/docs/ui/i18n/bg-shade.png b/docs/ui/i18n/bg-shade.png new file mode 100755 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..172c914f6f0dd3ef6d97b3c23c31f539f8f69389 GIT binary patch literal 594 zc%17D@N?(olHy`uVBq!ia0vp^CqS5k4M?tyST~P>fl1QS#WAE}&fCiy1sfC?4mhNU zOI1HFE){!lDeI%X<E)t1b@v!$&aP*EaGr<hpn||CF;WP#O&Uy-SENrV0j3oOPgg&e IbxsLQ0Qi-Il>h($ diff --git a/docs/ui/i18n/bg-slide.jpg b/docs/ui/i18n/bg-slide.jpg new file mode 100755 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..6be0296db203367453f3bdd4ef71a22368911abe GIT binary patch literal 31239 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 P{{P?|mj69?XX<|dt$G4e diff --git a/docs/ui/i18n/framing.css b/docs/ui/i18n/framing.css new file mode 100644 --- /dev/null +++ b/docs/ui/i18n/framing.css @@ -0,0 +1,23 @@ +/* The following styles size and place the slide components. + Edit them if you want to change the overall slide layout. + The commented lines can be uncommented (and modified, if necessary) + to help you with the rearrangement process. */ + +div#header, div#footer, .slide {width: 100%; top: 0; left: 0;} +div#header {top: 0; left: 0; z-index: 1;} +div#footer {top: auto; bottom: 0; width: 100%; z-index: 5;} +.slide {top: 0; width: 88%; padding: 1em 7% 2em 5%; z-index: 2;} + +div#controls {bottom: 1em; left: 0; width: 100%; text-align: center; z-index: 1000;} +div#controls form {margin: 0; padding: 0;} + +#currentSlide {position: absolute; left: 0; bottom: 0.5em; z-index: 10; + width: 100%; text-align: center;} +html>body #currentSlide {position: fixed;} + +/* +div#header {background: #FCC;} +div#footer {background: #CCF;} +div#controls {background: #BBD;} +div#currentSlide {background: #FFC;} +*/ diff --git a/docs/ui/i18n/pretty.css b/docs/ui/i18n/pretty.css new file mode 100644 --- /dev/null +++ b/docs/ui/i18n/pretty.css @@ -0,0 +1,44 @@ +/* + Theme: i18n + Eric A. Meyer (http://meyerweb.com/) + Theme placed under CC by-sa 2.0 license +*/ + +body {background: #95A7D4 url(bg-slide.jpg) 100% 100% no-repeat; color: #210; font: 28px Arial, sans-serif;} +a {text-decoration: none; color: #336; border-bottom: 1px dotted;} +h1, h2, h3, h4, h5, h6 {font-size: 1em; margin: 0;} +sup {font-size: 0.75em; font-weight: normal; + vertical-align: 0.5em; line-height: 1px;} +ul {margin-left: 1em; padding-left: 0;} +li {margin-bottom: 0.66em;} +li li {margin: 0.33em 0; font-size: smaller;} + +#header {background: url(bg-shade.png); border-bottom: 1px solid #333; + padding-bottom: 2em;} +#footer {background: url(bg-shade.png); color: #BBB; border-top: 1px solid #333;} +#header, #footer {font-size: 0.5em;} +#footer h1, #footer h2 { padding: 0.5em 0.75em; + font-weight: normal; font-style: italic;} +#footer h1 {left: 0; font-size: 1em; letter-spacing: 1px;} +#footer h2 {position: absolute; bottom: 0; right: 0;} + +#controls {font-size: 0.75em;} +#navList {margin-top: 3px;} +#navLinks a {margin: 0 0.33em; padding: 0 0.25em; + border: 1px solid; border-color: #CCD #556 #556 #CCD; + background-color: #8597C4;} + +#currentSlide {font-size: 0.5em;} +#currentSlide span {font-size: 13px; color: rgb(49%,47%,66%);} +#currentSlide #csSep {display: none;} +#currentSlide #csHere {font-weight: bold;} +#currentSlide #csHere:before {content: "#"; font-weight: normal;} +#currentSlide #csTotal:before {content: " of ";} + +.slide h1 {font-size: 1.66em; line-height: 1; letter-spacing: -1px; + margin: 0 -15% 1em 0; padding: 0.5em 15% 0.06125em 0; border-bottom: 0.06125em solid rgb(90,94,120);} +#slide0 h1 {border: none; font-size: 2.25em; letter-spacing: 0; margin: 3em 0 1.5em;} +#slide0 h3 {margin: 0.5em 0 0;} +#slide0 h4 {margin-top: 0; font-size: smaller;} + +.slide .current {color: #003; text-shadow: 0 0 0.25em #9AABD7;} diff --git a/docs/ui/i18n/s5-core.css b/docs/ui/i18n/s5-core.css new file mode 100644 --- /dev/null +++ b/docs/ui/i18n/s5-core.css @@ -0,0 +1,9 @@ +/* Do not edit or override these styles! The system will likely break if you do. */ + +div#header, div#footer, div#controls, div.slide {position: absolute;} +html>body div#header, html>body div#footer, + html>body div#controls, html>body div.slide {position: fixed;} +.handout {display: none;} +.layout {display: block;} +div.slide, .hideme, .incremental {visibility: hidden;} +#slide0 {visibility: visible;} diff --git a/docs/ui/i18n/slides.css b/docs/ui/i18n/slides.css new file mode 100644 --- /dev/null +++ b/docs/ui/i18n/slides.css @@ -0,0 +1,3 @@ +@import url(s5-core.css); /* required to make the slide show run at all */ +@import url(framing.css); /* sets basic placement and size of slide components */ +@import url(pretty.css); /* stuff that makes the slides look better than blah */ \ No newline at end of file diff --git a/docs/ui/jquery.js b/docs/ui/jquery.js new file mode 100644 --- /dev/null +++ b/docs/ui/jquery.js @@ -0,0 +1,166 @@ +/*! + * jQuery JavaScript Library v1.4.3 + * http://jquery.com/ + * + * Copyright 2010, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2010, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Thu Oct 14 23:10:06 2010 -0400 + */ +(function(E,A){function U(){return false}function ba(){return true}function ja(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function Ga(a){var b,d,e=[],f=[],h,k,l,n,s,v,B,D;k=c.data(this,this.nodeType?"events":"__events__");if(typeof k==="function")k=k.events;if(!(a.liveFired===this||!k||!k.live||a.button&&a.type==="click")){if(a.namespace)D=RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)");a.liveFired=this;var H=k.live.slice(0);for(n=0;n<H.length;n++){k=H[n];k.origType.replace(X, +"")===a.type?f.push(k.selector):H.splice(n--,1)}f=c(a.target).closest(f,a.currentTarget);s=0;for(v=f.length;s<v;s++){B=f[s];for(n=0;n<H.length;n++){k=H[n];if(B.selector===k.selector&&(!D||D.test(k.namespace))){l=B.elem;h=null;if(k.preType==="mouseenter"||k.preType==="mouseleave"){a.type=k.preType;h=c(a.relatedTarget).closest(k.selector)[0]}if(!h||h!==l)e.push({elem:l,handleObj:k,level:B.level})}}}s=0;for(v=e.length;s<v;s++){f=e[s];if(d&&f.level>d)break;a.currentTarget=f.elem;a.data=f.handleObj.data; +a.handleObj=f.handleObj;D=f.handleObj.origHandler.apply(f.elem,arguments);if(D===false||a.isPropagationStopped()){d=f.level;if(D===false)b=false}}return b}}function Y(a,b){return(a&&a!=="*"?a+".":"")+b.replace(Ha,"`").replace(Ia,"&")}function ka(a,b,d){if(c.isFunction(b))return c.grep(a,function(f,h){return!!b.call(f,h,f)===d});else if(b.nodeType)return c.grep(a,function(f){return f===b===d});else if(typeof b==="string"){var e=c.grep(a,function(f){return f.nodeType===1});if(Ja.test(b))return c.filter(b, +e,!d);else b=c.filter(b,e)}return c.grep(a,function(f){return c.inArray(f,b)>=0===d})}function la(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var e=c.data(a[d++]),f=c.data(this,e);if(e=e&&e.events){delete f.handle;f.events={};for(var h in e)for(var k in e[h])c.event.add(this,h,e[h][k],e[h][k].data)}}})}function Ka(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)} +function ma(a,b,d){var e=b==="width"?a.offsetWidth:a.offsetHeight;if(d==="border")return e;c.each(b==="width"?La:Ma,function(){d||(e-=parseFloat(c.css(a,"padding"+this))||0);if(d==="margin")e+=parseFloat(c.css(a,"margin"+this))||0;else e-=parseFloat(c.css(a,"border"+this+"Width"))||0});return e}function ca(a,b,d,e){if(c.isArray(b)&&b.length)c.each(b,function(f,h){d||Na.test(a)?e(a,h):ca(a+"["+(typeof h==="object"||c.isArray(h)?f:"")+"]",h,d,e)});else if(!d&&b!=null&&typeof b==="object")c.isEmptyObject(b)? +e(a,""):c.each(b,function(f,h){ca(a+"["+f+"]",h,d,e)});else e(a,b)}function S(a,b){var d={};c.each(na.concat.apply([],na.slice(0,b)),function(){d[this]=a});return d}function oa(a){if(!da[a]){var b=c("<"+a+">").appendTo("body"),d=b.css("display");b.remove();if(d==="none"||d==="")d="block";da[a]=d}return da[a]}function ea(a){return c.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var u=E.document,c=function(){function a(){if(!b.isReady){try{u.documentElement.doScroll("left")}catch(i){setTimeout(a, +1);return}b.ready()}}var b=function(i,r){return new b.fn.init(i,r)},d=E.jQuery,e=E.$,f,h=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,k=/\S/,l=/^\s+/,n=/\s+$/,s=/\W/,v=/\d/,B=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,D=/^[\],:{}\s]*$/,H=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,w=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,G=/(?:^|:|,)(?:\s*\[)+/g,M=/(webkit)[ \/]([\w.]+)/,g=/(opera)(?:.*version)?[ \/]([\w.]+)/,j=/(msie) ([\w.]+)/,o=/(mozilla)(?:.*? rv:([\w.]+))?/,m=navigator.userAgent,p=false, +q=[],t,x=Object.prototype.toString,C=Object.prototype.hasOwnProperty,P=Array.prototype.push,N=Array.prototype.slice,R=String.prototype.trim,Q=Array.prototype.indexOf,L={};b.fn=b.prototype={init:function(i,r){var y,z,F;if(!i)return this;if(i.nodeType){this.context=this[0]=i;this.length=1;return this}if(i==="body"&&!r&&u.body){this.context=u;this[0]=u.body;this.selector="body";this.length=1;return this}if(typeof i==="string")if((y=h.exec(i))&&(y[1]||!r))if(y[1]){F=r?r.ownerDocument||r:u;if(z=B.exec(i))if(b.isPlainObject(r)){i= +[u.createElement(z[1])];b.fn.attr.call(i,r,true)}else i=[F.createElement(z[1])];else{z=b.buildFragment([y[1]],[F]);i=(z.cacheable?z.fragment.cloneNode(true):z.fragment).childNodes}return b.merge(this,i)}else{if((z=u.getElementById(y[2]))&&z.parentNode){if(z.id!==y[2])return f.find(i);this.length=1;this[0]=z}this.context=u;this.selector=i;return this}else if(!r&&!s.test(i)){this.selector=i;this.context=u;i=u.getElementsByTagName(i);return b.merge(this,i)}else return!r||r.jquery?(r||f).find(i):b(r).find(i); +else if(b.isFunction(i))return f.ready(i);if(i.selector!==A){this.selector=i.selector;this.context=i.context}return b.makeArray(i,this)},selector:"",jquery:"1.4.3",length:0,size:function(){return this.length},toArray:function(){return N.call(this,0)},get:function(i){return i==null?this.toArray():i<0?this.slice(i)[0]:this[i]},pushStack:function(i,r,y){var z=b();b.isArray(i)?P.apply(z,i):b.merge(z,i);z.prevObject=this;z.context=this.context;if(r==="find")z.selector=this.selector+(this.selector?" ": +"")+y;else if(r)z.selector=this.selector+"."+r+"("+y+")";return z},each:function(i,r){return b.each(this,i,r)},ready:function(i){b.bindReady();if(b.isReady)i.call(u,b);else q&&q.push(i);return this},eq:function(i){return i===-1?this.slice(i):this.slice(i,+i+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(N.apply(this,arguments),"slice",N.call(arguments).join(","))},map:function(i){return this.pushStack(b.map(this,function(r,y){return i.call(r, +y,r)}))},end:function(){return this.prevObject||b(null)},push:P,sort:[].sort,splice:[].splice};b.fn.init.prototype=b.fn;b.extend=b.fn.extend=function(){var i=arguments[0]||{},r=1,y=arguments.length,z=false,F,I,K,J,fa;if(typeof i==="boolean"){z=i;i=arguments[1]||{};r=2}if(typeof i!=="object"&&!b.isFunction(i))i={};if(y===r){i=this;--r}for(;r<y;r++)if((F=arguments[r])!=null)for(I in F){K=i[I];J=F[I];if(i!==J)if(z&&J&&(b.isPlainObject(J)||(fa=b.isArray(J)))){if(fa){fa=false;clone=K&&b.isArray(K)?K:[]}else clone= +K&&b.isPlainObject(K)?K:{};i[I]=b.extend(z,clone,J)}else if(J!==A)i[I]=J}return i};b.extend({noConflict:function(i){E.$=e;if(i)E.jQuery=d;return b},isReady:false,readyWait:1,ready:function(i){i===true&&b.readyWait--;if(!b.readyWait||i!==true&&!b.isReady){if(!u.body)return setTimeout(b.ready,1);b.isReady=true;if(!(i!==true&&--b.readyWait>0)){if(q){for(var r=0;i=q[r++];)i.call(u,b);q=null}b.fn.triggerHandler&&b(u).triggerHandler("ready")}}},bindReady:function(){if(!p){p=true;if(u.readyState==="complete")return setTimeout(b.ready, +1);if(u.addEventListener){u.addEventListener("DOMContentLoaded",t,false);E.addEventListener("load",b.ready,false)}else if(u.attachEvent){u.attachEvent("onreadystatechange",t);E.attachEvent("onload",b.ready);var i=false;try{i=E.frameElement==null}catch(r){}u.documentElement.doScroll&&i&&a()}}},isFunction:function(i){return b.type(i)==="function"},isArray:Array.isArray||function(i){return b.type(i)==="array"},isWindow:function(i){return i&&typeof i==="object"&&"setInterval"in i},isNaN:function(i){return i== +null||!v.test(i)||isNaN(i)},type:function(i){return i==null?String(i):L[x.call(i)]||"object"},isPlainObject:function(i){if(!i||b.type(i)!=="object"||i.nodeType||b.isWindow(i))return false;if(i.constructor&&!C.call(i,"constructor")&&!C.call(i.constructor.prototype,"isPrototypeOf"))return false;for(var r in i);return r===A||C.call(i,r)},isEmptyObject:function(i){for(var r in i)return false;return true},error:function(i){throw i;},parseJSON:function(i){if(typeof i!=="string"||!i)return null;i=b.trim(i); +if(D.test(i.replace(H,"@").replace(w,"]").replace(G,"")))return E.JSON&&E.JSON.parse?E.JSON.parse(i):(new Function("return "+i))();else b.error("Invalid JSON: "+i)},noop:function(){},globalEval:function(i){if(i&&k.test(i)){var r=u.getElementsByTagName("head")[0]||u.documentElement,y=u.createElement("script");y.type="text/javascript";if(b.support.scriptEval)y.appendChild(u.createTextNode(i));else y.text=i;r.insertBefore(y,r.firstChild);r.removeChild(y)}},nodeName:function(i,r){return i.nodeName&&i.nodeName.toUpperCase()=== +r.toUpperCase()},each:function(i,r,y){var z,F=0,I=i.length,K=I===A||b.isFunction(i);if(y)if(K)for(z in i){if(r.apply(i[z],y)===false)break}else for(;F<I;){if(r.apply(i[F++],y)===false)break}else if(K)for(z in i){if(r.call(i[z],z,i[z])===false)break}else for(y=i[0];F<I&&r.call(y,F,y)!==false;y=i[++F]);return i},trim:R?function(i){return i==null?"":R.call(i)}:function(i){return i==null?"":i.toString().replace(l,"").replace(n,"")},makeArray:function(i,r){var y=r||[];if(i!=null){var z=b.type(i);i.length== +null||z==="string"||z==="function"||z==="regexp"||b.isWindow(i)?P.call(y,i):b.merge(y,i)}return y},inArray:function(i,r){if(r.indexOf)return r.indexOf(i);for(var y=0,z=r.length;y<z;y++)if(r[y]===i)return y;return-1},merge:function(i,r){var y=i.length,z=0;if(typeof r.length==="number")for(var F=r.length;z<F;z++)i[y++]=r[z];else for(;r[z]!==A;)i[y++]=r[z++];i.length=y;return i},grep:function(i,r,y){var z=[],F;y=!!y;for(var I=0,K=i.length;I<K;I++){F=!!r(i[I],I);y!==F&&z.push(i[I])}return z},map:function(i, +r,y){for(var z=[],F,I=0,K=i.length;I<K;I++){F=r(i[I],I,y);if(F!=null)z[z.length]=F}return z.concat.apply([],z)},guid:1,proxy:function(i,r,y){if(arguments.length===2)if(typeof r==="string"){y=i;i=y[r];r=A}else if(r&&!b.isFunction(r)){y=r;r=A}if(!r&&i)r=function(){return i.apply(y||this,arguments)};if(i)r.guid=i.guid=i.guid||r.guid||b.guid++;return r},access:function(i,r,y,z,F,I){var K=i.length;if(typeof r==="object"){for(var J in r)b.access(i,J,r[J],z,F,y);return i}if(y!==A){z=!I&&z&&b.isFunction(y); +for(J=0;J<K;J++)F(i[J],r,z?y.call(i[J],J,F(i[J],r)):y,I);return i}return K?F(i[0],r):A},now:function(){return(new Date).getTime()},uaMatch:function(i){i=i.toLowerCase();i=M.exec(i)||g.exec(i)||j.exec(i)||i.indexOf("compatible")<0&&o.exec(i)||[];return{browser:i[1]||"",version:i[2]||"0"}},browser:{}});b.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(i,r){L["[object "+r+"]"]=r.toLowerCase()});m=b.uaMatch(m);if(m.browser){b.browser[m.browser]=true;b.browser.version= +m.version}if(b.browser.webkit)b.browser.safari=true;if(Q)b.inArray=function(i,r){return Q.call(r,i)};if(!/\s/.test("\u00a0")){l=/^[\s\xA0]+/;n=/[\s\xA0]+$/}f=b(u);if(u.addEventListener)t=function(){u.removeEventListener("DOMContentLoaded",t,false);b.ready()};else if(u.attachEvent)t=function(){if(u.readyState==="complete"){u.detachEvent("onreadystatechange",t);b.ready()}};return E.jQuery=E.$=b}();(function(){c.support={};var a=u.documentElement,b=u.createElement("script"),d=u.createElement("div"), +e="script"+c.now();d.style.display="none";d.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";var f=d.getElementsByTagName("*"),h=d.getElementsByTagName("a")[0],k=u.createElement("select"),l=k.appendChild(u.createElement("option"));if(!(!f||!f.length||!h)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(h.getAttribute("style")), +hrefNormalized:h.getAttribute("href")==="/a",opacity:/^0.55$/.test(h.style.opacity),cssFloat:!!h.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:l.selected,optDisabled:false,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableHiddenOffsets:true};k.disabled=true;c.support.optDisabled=!l.disabled;b.type="text/javascript";try{b.appendChild(u.createTextNode("window."+e+"=1;"))}catch(n){}a.insertBefore(b, +a.firstChild);if(E[e]){c.support.scriptEval=true;delete E[e]}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function s(){c.support.noCloneEvent=false;d.detachEvent("onclick",s)});d.cloneNode(true).fireEvent("onclick")}d=u.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=u.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var s=u.createElement("div"); +s.style.width=s.style.paddingLeft="1px";u.body.appendChild(s);c.boxModel=c.support.boxModel=s.offsetWidth===2;if("zoom"in s.style){s.style.display="inline";s.style.zoom=1;c.support.inlineBlockNeedsLayout=s.offsetWidth===2;s.style.display="";s.innerHTML="<div style='width:4px;'></div>";c.support.shrinkWrapBlocks=s.offsetWidth!==2}s.innerHTML="<table><tr><td style='padding:0;display:none'></td><td>t</td></tr></table>";var v=s.getElementsByTagName("td");c.support.reliableHiddenOffsets=v[0].offsetHeight=== +0;v[0].style.display="";v[1].style.display="none";c.support.reliableHiddenOffsets=c.support.reliableHiddenOffsets&&v[0].offsetHeight===0;s.innerHTML="";u.body.removeChild(s).style.display="none"});a=function(s){var v=u.createElement("div");s="on"+s;var B=s in v;if(!B){v.setAttribute(s,"return;");B=typeof v[s]==="function"}return B};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=f=h=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength", +cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var pa={},Oa=/^(?:\{.*\}|\[.*\])$/;c.extend({cache:{},uuid:0,expando:"jQuery"+c.now(),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},data:function(a,b,d){if(c.acceptData(a)){a=a==E?pa:a;var e=a.nodeType,f=e?a[c.expando]:null,h=c.cache;if(!(e&&!f&&typeof b==="string"&&d===A)){if(e)f||(a[c.expando]=f=++c.uuid);else h=a;if(typeof b==="object")if(e)h[f]= +c.extend(h[f],b);else c.extend(h,b);else if(e&&!h[f])h[f]={};a=e?h[f]:h;if(d!==A)a[b]=d;return typeof b==="string"?a[b]:a}}},removeData:function(a,b){if(c.acceptData(a)){a=a==E?pa:a;var d=a.nodeType,e=d?a[c.expando]:a,f=c.cache,h=d?f[e]:e;if(b){if(h){delete h[b];d&&c.isEmptyObject(h)&&c.removeData(a)}}else if(d&&c.support.deleteExpando)delete a[c.expando];else if(a.removeAttribute)a.removeAttribute(c.expando);else if(d)delete f[e];else for(var k in a)delete a[k]}},acceptData:function(a){if(a.nodeName){var b= +c.noData[a.nodeName.toLowerCase()];if(b)return!(b===true||a.getAttribute("classid")!==b)}return true}});c.fn.extend({data:function(a,b){if(typeof a==="undefined")return this.length?c.data(this[0]):null;else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===A){var e=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(e===A&&this.length){e=c.data(this[0],a);if(e===A&&this[0].nodeType===1){e=this[0].getAttribute("data-"+a);if(typeof e=== +"string")try{e=e==="true"?true:e==="false"?false:e==="null"?null:!c.isNaN(e)?parseFloat(e):Oa.test(e)?c.parseJSON(e):e}catch(f){}else e=A}}return e===A&&d[1]?this.data(d[0]):e}else return this.each(function(){var h=c(this),k=[d[0],b];h.triggerHandler("setData"+d[1]+"!",k);c.data(this,a,b);h.triggerHandler("changeData"+d[1]+"!",k)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var e=c.data(a,b);if(!d)return e|| +[];if(!e||c.isArray(d))e=c.data(a,b,c.makeArray(d));else e.push(d);return e}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),e=d.shift();if(e==="inprogress")e=d.shift();if(e){b==="fx"&&d.unshift("inprogress");e.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===A)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this, +a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var qa=/[\n\t]/g,ga=/\s+/,Pa=/\r/g,Qa=/^(?:href|src|style)$/,Ra=/^(?:button|input)$/i,Sa=/^(?:button|input|object|select|textarea)$/i,Ta=/^a(?:rea)?$/i,ra=/^(?:radio|checkbox)$/i;c.fn.extend({attr:function(a,b){return c.access(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this, +a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(s){var v=c(this);v.addClass(a.call(this,s,v.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ga),d=0,e=this.length;d<e;d++){var f=this[d];if(f.nodeType===1)if(f.className){for(var h=" "+f.className+" ",k=f.className,l=0,n=b.length;l<n;l++)if(h.indexOf(" "+b[l]+" ")<0)k+=" "+b[l];f.className=c.trim(k)}else f.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(n){var s= +c(this);s.removeClass(a.call(this,n,s.attr("class")))});if(a&&typeof a==="string"||a===A)for(var b=(a||"").split(ga),d=0,e=this.length;d<e;d++){var f=this[d];if(f.nodeType===1&&f.className)if(a){for(var h=(" "+f.className+" ").replace(qa," "),k=0,l=b.length;k<l;k++)h=h.replace(" "+b[k]+" "," ");f.className=c.trim(h)}else f.className=""}return this},toggleClass:function(a,b){var d=typeof a,e=typeof b==="boolean";if(c.isFunction(a))return this.each(function(f){var h=c(this);h.toggleClass(a.call(this, +f,h.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var f,h=0,k=c(this),l=b,n=a.split(ga);f=n[h++];){l=e?l:!k.hasClass(f);k[l?"addClass":"removeClass"](f)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,"__className__",this.className);this.className=this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(qa," ").indexOf(a)>-1)return true;return false}, +val:function(a){if(!arguments.length){var b=this[0];if(b){if(c.nodeName(b,"option")){var d=b.attributes.value;return!d||d.specified?b.value:b.text}if(c.nodeName(b,"select")){var e=b.selectedIndex;d=[];var f=b.options;b=b.type==="select-one";if(e<0)return null;var h=b?e:0;for(e=b?e+1:f.length;h<e;h++){var k=f[h];if(k.selected&&(c.support.optDisabled?!k.disabled:k.getAttribute("disabled")===null)&&(!k.parentNode.disabled||!c.nodeName(k.parentNode,"optgroup"))){a=c(k).val();if(b)return a;d.push(a)}}return d}if(ra.test(b.type)&& +!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Pa,"")}return A}var l=c.isFunction(a);return this.each(function(n){var s=c(this),v=a;if(this.nodeType===1){if(l)v=a.call(this,n,s.val());if(v==null)v="";else if(typeof v==="number")v+="";else if(c.isArray(v))v=c.map(v,function(D){return D==null?"":D+""});if(c.isArray(v)&&ra.test(this.type))this.checked=c.inArray(s.val(),v)>=0;else if(c.nodeName(this,"select")){var B=c.makeArray(v);c("option",this).each(function(){this.selected= +c.inArray(c(this).val(),B)>=0});if(!B.length)this.selectedIndex=-1}else this.value=v}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,e){if(!a||a.nodeType===3||a.nodeType===8)return A;if(e&&b in c.attrFn)return c(a)[b](d);e=a.nodeType!==1||!c.isXMLDoc(a);var f=d!==A;b=e&&c.props[b]||b;if(a.nodeType===1){var h=Qa.test(b);if((b in a||a[b]!==A)&&e&&!h){if(f){b==="type"&&Ra.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed"); +if(d===null)a.nodeType===1&&a.removeAttribute(b);else a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:Sa.test(a.nodeName)||Ta.test(a.nodeName)&&a.href?0:A;return a[b]}if(!c.support.style&&e&&b==="style"){if(f)a.style.cssText=""+d;return a.style.cssText}f&&a.setAttribute(b,""+d);if(!a.attributes[b]&&a.hasAttribute&&!a.hasAttribute(b))return A;a=!c.support.hrefNormalized&&e&& +h?a.getAttribute(b,2):a.getAttribute(b);return a===null?A:a}}});var X=/\.(.*)$/,ha=/^(?:textarea|input|select)$/i,Ha=/\./g,Ia=/ /g,Ua=/[^\w\s.|`]/g,Va=function(a){return a.replace(Ua,"\\$&")},sa={focusin:0,focusout:0};c.event={add:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(c.isWindow(a)&&a!==E&&!a.frameElement)a=E;if(d===false)d=U;var f,h;if(d.handler){f=d;d=f.handler}if(!d.guid)d.guid=c.guid++;if(h=c.data(a)){var k=a.nodeType?"events":"__events__",l=h[k],n=h.handle;if(typeof l=== +"function"){n=l.handle;l=l.events}else if(!l){a.nodeType||(h[k]=h=function(){});h.events=l={}}if(!n)h.handle=n=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(n.elem,arguments):A};n.elem=a;b=b.split(" ");for(var s=0,v;k=b[s++];){h=f?c.extend({},f):{handler:d,data:e};if(k.indexOf(".")>-1){v=k.split(".");k=v.shift();h.namespace=v.slice(0).sort().join(".")}else{v=[];h.namespace=""}h.type=k;if(!h.guid)h.guid=d.guid;var B=l[k],D=c.event.special[k]||{};if(!B){B=l[k]=[]; +if(!D.setup||D.setup.call(a,e,v,n)===false)if(a.addEventListener)a.addEventListener(k,n,false);else a.attachEvent&&a.attachEvent("on"+k,n)}if(D.add){D.add.call(a,h);if(!h.handler.guid)h.handler.guid=d.guid}B.push(h);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(d===false)d=U;var f,h,k=0,l,n,s,v,B,D,H=a.nodeType?"events":"__events__",w=c.data(a),G=w&&w[H];if(w&&G){if(typeof G==="function"){w=G;G=G.events}if(b&&b.type){d=b.handler;b=b.type}if(!b|| +typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(f in G)c.event.remove(a,f+b)}else{for(b=b.split(" ");f=b[k++];){v=f;l=f.indexOf(".")<0;n=[];if(!l){n=f.split(".");f=n.shift();s=RegExp("(^|\\.)"+c.map(n.slice(0).sort(),Va).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(B=G[f])if(d){v=c.event.special[f]||{};for(h=e||0;h<B.length;h++){D=B[h];if(d.guid===D.guid){if(l||s.test(D.namespace)){e==null&&B.splice(h--,1);v.remove&&v.remove.call(a,D)}if(e!=null)break}}if(B.length===0||e!=null&&B.length===1){if(!v.teardown|| +v.teardown.call(a,n)===false)c.removeEvent(a,f,w.handle);delete G[f]}}else for(h=0;h<B.length;h++){D=B[h];if(l||s.test(D.namespace)){c.event.remove(a,v,D.handler,h);B.splice(h--,1)}}}if(c.isEmptyObject(G)){if(b=w.handle)b.elem=null;delete w.events;delete w.handle;if(typeof w==="function")c.removeData(a,H);else c.isEmptyObject(w)&&c.removeData(a)}}}}},trigger:function(a,b,d,e){var f=a.type||a;if(!e){a=typeof a==="object"?a[c.expando]?a:c.extend(c.Event(f),a):c.Event(f);if(f.indexOf("!")>=0){a.type= +f=f.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[f]&&c.each(c.cache,function(){this.events&&this.events[f]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return A;a.result=A;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(e=d.nodeType?c.data(d,"handle"):(c.data(d,"__events__")||{}).handle)&&e.apply(d,b);e=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+f]&&d["on"+f].apply(d,b)=== +false){a.result=false;a.preventDefault()}}catch(h){}if(!a.isPropagationStopped()&&e)c.event.trigger(a,b,e,true);else if(!a.isDefaultPrevented()){e=a.target;var k,l=f.replace(X,""),n=c.nodeName(e,"a")&&l==="click",s=c.event.special[l]||{};if((!s._default||s._default.call(d,a)===false)&&!n&&!(e&&e.nodeName&&c.noData[e.nodeName.toLowerCase()])){try{if(e[l]){if(k=e["on"+l])e["on"+l]=null;c.event.triggered=true;e[l]()}}catch(v){}if(k)e["on"+l]=k;c.event.triggered=false}}},handle:function(a){var b,d,e; +d=[];var f,h=c.makeArray(arguments);a=h[0]=c.event.fix(a||E.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;if(!b){e=a.type.split(".");a.type=e.shift();d=e.slice(0).sort();e=RegExp("(^|\\.)"+d.join("\\.(?:.*\\.)?")+"(\\.|$)")}a.namespace=a.namespace||d.join(".");f=c.data(this,this.nodeType?"events":"__events__");if(typeof f==="function")f=f.events;d=(f||{})[a.type];if(f&&d){d=d.slice(0);f=0;for(var k=d.length;f<k;f++){var l=d[f];if(b||e.test(l.namespace)){a.handler=l.handler;a.data= +l.data;a.handleObj=l;l=l.handler.apply(this,h);if(l!==A){a.result=l;if(l===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "), +fix:function(a){if(a[c.expando])return a;var b=a;a=c.Event(b);for(var d=this.props.length,e;d;){e=this.props[--d];a[e]=b[e]}if(!a.target)a.target=a.srcElement||u;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=u.documentElement;d=u.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop|| +d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(a.which==null&&(a.charCode!=null||a.keyCode!=null))a.which=a.charCode!=null?a.charCode:a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==A)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,Y(a.origType,a.selector),c.extend({},a,{handler:Ga,guid:a.handler.guid}))},remove:function(a){c.event.remove(this, +Y(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,d){if(c.isWindow(this))this.onbeforeunload=d},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};c.removeEvent=u.removeEventListener?function(a,b,d){a.removeEventListener&&a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent&&a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=a;this.type=a.type}else this.type=a;this.timeStamp= +c.now();this[c.expando]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=ba;var a=this.originalEvent;if(a)if(a.preventDefault)a.preventDefault();else a.returnValue=false},stopPropagation:function(){this.isPropagationStopped=ba;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=ba;this.stopPropagation()},isDefaultPrevented:U,isPropagationStopped:U,isImmediatePropagationStopped:U}; +var ta=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},ua=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?ua:ta,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?ua:ta)}}});if(!c.support.submitBubbles)c.event.special.submit={setup:function(){if(this.nodeName.toLowerCase()!== +"form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length){a.liveFired=A;return ja("submit",this,arguments)}});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13){a.liveFired=A;return ja("submit",this,arguments)}})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}};if(!c.support.changeBubbles){var V, +va=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(e){return e.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},Z=function(a,b){var d=a.target,e,f;if(!(!ha.test(d.nodeName)||d.readOnly)){e=c.data(d,"_change_data");f=va(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",f);if(!(e===A||f===e))if(e!=null||f){a.type="change";a.liveFired= +A;return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:Z,beforedeactivate:Z,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return Z.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return Z.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,"_change_data",va(a))}},setup:function(){if(this.type=== +"file")return false;for(var a in V)c.event.add(this,a+".specialChange",V[a]);return ha.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return ha.test(this.nodeName)}};V=c.event.special.change.filters;V.focus=V.beforeactivate}u.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(e){e=c.event.fix(e);e.type=b;return c.event.trigger(e,null,e.target)}c.event.special[b]={setup:function(){sa[b]++===0&&u.addEventListener(a,d,true)},teardown:function(){--sa[b]=== +0&&u.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,e,f){if(typeof d==="object"){for(var h in d)this[b](h,e,d[h],f);return this}if(c.isFunction(e)||e===false){f=e;e=A}var k=b==="one"?c.proxy(f,function(n){c(this).unbind(n,k);return f.apply(this,arguments)}):f;if(d==="unload"&&b!=="one")this.one(d,e,f);else{h=0;for(var l=this.length;h<l;h++)c.event.add(this[h],d,k,e)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&!a.preventDefault)for(var d in a)this.unbind(d, +a[d]);else{d=0;for(var e=this.length;d<e;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,e){return this.live(b,d,e,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){var d=c.Event(a);d.preventDefault();d.stopPropagation();c.event.trigger(d,b,this[0]);return d.result}},toggle:function(a){for(var b=arguments,d= +1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(e){var f=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,f+1);e.preventDefault();return b[f].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var wa={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,e,f,h){var k,l=0,n,s,v=h||this.selector;h=h?this:c(this.context);if(typeof d=== +"object"&&!d.preventDefault){for(k in d)h[b](k,e,d[k],v);return this}if(c.isFunction(e)){f=e;e=A}for(d=(d||"").split(" ");(k=d[l++])!=null;){n=X.exec(k);s="";if(n){s=n[0];k=k.replace(X,"")}if(k==="hover")d.push("mouseenter"+s,"mouseleave"+s);else{n=k;if(k==="focus"||k==="blur"){d.push(wa[k]+s);k+=s}else k=(wa[k]||k)+s;if(b==="live"){s=0;for(var B=h.length;s<B;s++)c.event.add(h[s],"live."+Y(k,v),{data:e,selector:v,handler:f,origType:k,origHandler:f,preType:n})}else h.unbind("live."+Y(k,v),f)}}return this}}); +c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){c.fn[b]=function(d,e){if(e==null){e=d;d=null}return arguments.length>0?this.bind(b,d,e):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});E.attachEvent&&!E.addEventListener&&c(E).bind("unload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}}); +(function(){function a(g,j,o,m,p,q){p=0;for(var t=m.length;p<t;p++){var x=m[p];if(x){x=x[g];for(var C=false;x;){if(x.sizcache===o){C=m[x.sizset];break}if(x.nodeType===1&&!q){x.sizcache=o;x.sizset=p}if(x.nodeName.toLowerCase()===j){C=x;break}x=x[g]}m[p]=C}}}function b(g,j,o,m,p,q){p=0;for(var t=m.length;p<t;p++){var x=m[p];if(x){x=x[g];for(var C=false;x;){if(x.sizcache===o){C=m[x.sizset];break}if(x.nodeType===1){if(!q){x.sizcache=o;x.sizset=p}if(typeof j!=="string"){if(x===j){C=true;break}}else if(l.filter(j, +[x]).length>0){C=x;break}}x=x[g]}m[p]=C}}}var d=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,f=Object.prototype.toString,h=false,k=true;[0,0].sort(function(){k=false;return 0});var l=function(g,j,o,m){o=o||[];var p=j=j||u;if(j.nodeType!==1&&j.nodeType!==9)return[];if(!g||typeof g!=="string")return o;var q=[],t,x,C,P,N=true,R=l.isXML(j),Q=g,L;do{d.exec("");if(t=d.exec(Q)){Q=t[3];q.push(t[1]);if(t[2]){P=t[3]; +break}}}while(t);if(q.length>1&&s.exec(g))if(q.length===2&&n.relative[q[0]])x=M(q[0]+q[1],j);else for(x=n.relative[q[0]]?[j]:l(q.shift(),j);q.length;){g=q.shift();if(n.relative[g])g+=q.shift();x=M(g,x)}else{if(!m&&q.length>1&&j.nodeType===9&&!R&&n.match.ID.test(q[0])&&!n.match.ID.test(q[q.length-1])){t=l.find(q.shift(),j,R);j=t.expr?l.filter(t.expr,t.set)[0]:t.set[0]}if(j){t=m?{expr:q.pop(),set:D(m)}:l.find(q.pop(),q.length===1&&(q[0]==="~"||q[0]==="+")&&j.parentNode?j.parentNode:j,R);x=t.expr?l.filter(t.expr, +t.set):t.set;if(q.length>0)C=D(x);else N=false;for(;q.length;){t=L=q.pop();if(n.relative[L])t=q.pop();else L="";if(t==null)t=j;n.relative[L](C,t,R)}}else C=[]}C||(C=x);C||l.error(L||g);if(f.call(C)==="[object Array]")if(N)if(j&&j.nodeType===1)for(g=0;C[g]!=null;g++){if(C[g]&&(C[g]===true||C[g].nodeType===1&&l.contains(j,C[g])))o.push(x[g])}else for(g=0;C[g]!=null;g++)C[g]&&C[g].nodeType===1&&o.push(x[g]);else o.push.apply(o,C);else D(C,o);if(P){l(P,p,o,m);l.uniqueSort(o)}return o};l.uniqueSort=function(g){if(w){h= +k;g.sort(w);if(h)for(var j=1;j<g.length;j++)g[j]===g[j-1]&&g.splice(j--,1)}return g};l.matches=function(g,j){return l(g,null,null,j)};l.matchesSelector=function(g,j){return l(j,null,null,[g]).length>0};l.find=function(g,j,o){var m;if(!g)return[];for(var p=0,q=n.order.length;p<q;p++){var t=n.order[p],x;if(x=n.leftMatch[t].exec(g)){var C=x[1];x.splice(1,1);if(C.substr(C.length-1)!=="\\"){x[1]=(x[1]||"").replace(/\\/g,"");m=n.find[t](x,j,o);if(m!=null){g=g.replace(n.match[t],"");break}}}}m||(m=j.getElementsByTagName("*")); +return{set:m,expr:g}};l.filter=function(g,j,o,m){for(var p=g,q=[],t=j,x,C,P=j&&j[0]&&l.isXML(j[0]);g&&j.length;){for(var N in n.filter)if((x=n.leftMatch[N].exec(g))!=null&&x[2]){var R=n.filter[N],Q,L;L=x[1];C=false;x.splice(1,1);if(L.substr(L.length-1)!=="\\"){if(t===q)q=[];if(n.preFilter[N])if(x=n.preFilter[N](x,t,o,q,m,P)){if(x===true)continue}else C=Q=true;if(x)for(var i=0;(L=t[i])!=null;i++)if(L){Q=R(L,x,i,t);var r=m^!!Q;if(o&&Q!=null)if(r)C=true;else t[i]=false;else if(r){q.push(L);C=true}}if(Q!== +A){o||(t=q);g=g.replace(n.match[N],"");if(!C)return[];break}}}if(g===p)if(C==null)l.error(g);else break;p=g}return t};l.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var n=l.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+\-]*)\))?/, +POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},relative:{"+":function(g,j){var o=typeof j==="string",m=o&&!/\W/.test(j);o=o&&!m;if(m)j=j.toLowerCase();m=0;for(var p=g.length,q;m<p;m++)if(q=g[m]){for(;(q=q.previousSibling)&&q.nodeType!==1;);g[m]=o||q&&q.nodeName.toLowerCase()=== +j?q||false:q===j}o&&l.filter(j,g,true)},">":function(g,j){var o=typeof j==="string",m,p=0,q=g.length;if(o&&!/\W/.test(j))for(j=j.toLowerCase();p<q;p++){if(m=g[p]){o=m.parentNode;g[p]=o.nodeName.toLowerCase()===j?o:false}}else{for(;p<q;p++)if(m=g[p])g[p]=o?m.parentNode:m.parentNode===j;o&&l.filter(j,g,true)}},"":function(g,j,o){var m=e++,p=b,q;if(typeof j==="string"&&!/\W/.test(j)){q=j=j.toLowerCase();p=a}p("parentNode",j,m,g,q,o)},"~":function(g,j,o){var m=e++,p=b,q;if(typeof j==="string"&&!/\W/.test(j)){q= +j=j.toLowerCase();p=a}p("previousSibling",j,m,g,q,o)}},find:{ID:function(g,j,o){if(typeof j.getElementById!=="undefined"&&!o)return(g=j.getElementById(g[1]))&&g.parentNode?[g]:[]},NAME:function(g,j){if(typeof j.getElementsByName!=="undefined"){for(var o=[],m=j.getElementsByName(g[1]),p=0,q=m.length;p<q;p++)m[p].getAttribute("name")===g[1]&&o.push(m[p]);return o.length===0?null:o}},TAG:function(g,j){return j.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,j,o,m,p,q){g=" "+g[1].replace(/\\/g, +"")+" ";if(q)return g;q=0;for(var t;(t=j[q])!=null;q++)if(t)if(p^(t.className&&(" "+t.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))o||m.push(t);else if(o)j[q]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},CHILD:function(g){if(g[1]==="nth"){var j=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=j[1]+(j[2]||1)-0;g[3]=j[3]-0}g[0]=e++;return g},ATTR:function(g,j,o, +m,p,q){j=g[1].replace(/\\/g,"");if(!q&&n.attrMap[j])g[1]=n.attrMap[j];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,j,o,m,p){if(g[1]==="not")if((d.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=l(g[3],null,null,j);else{g=l.filter(g[3],j,o,true^p);o||m.push.apply(m,g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled=== +true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,j,o){return!!l(o[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"=== +g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},setFilters:{first:function(g,j){return j===0},last:function(g,j,o,m){return j===m.length-1},even:function(g,j){return j%2===0},odd:function(g,j){return j%2===1},lt:function(g,j,o){return j<o[3]-0},gt:function(g,j,o){return j>o[3]-0},nth:function(g,j,o){return o[3]- +0===j},eq:function(g,j,o){return o[3]-0===j}},filter:{PSEUDO:function(g,j,o,m){var p=j[1],q=n.filters[p];if(q)return q(g,o,j,m);else if(p==="contains")return(g.textContent||g.innerText||l.getText([g])||"").indexOf(j[3])>=0;else if(p==="not"){j=j[3];o=0;for(m=j.length;o<m;o++)if(j[o]===g)return false;return true}else l.error("Syntax error, unrecognized expression: "+p)},CHILD:function(g,j){var o=j[1],m=g;switch(o){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(o=== +"first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":o=j[2];var p=j[3];if(o===1&&p===0)return true;var q=j[0],t=g.parentNode;if(t&&(t.sizcache!==q||!g.nodeIndex)){var x=0;for(m=t.firstChild;m;m=m.nextSibling)if(m.nodeType===1)m.nodeIndex=++x;t.sizcache=q}m=g.nodeIndex-p;return o===0?m===0:m%o===0&&m/o>=0}},ID:function(g,j){return g.nodeType===1&&g.getAttribute("id")===j},TAG:function(g,j){return j==="*"&&g.nodeType===1||g.nodeName.toLowerCase()=== +j},CLASS:function(g,j){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(j)>-1},ATTR:function(g,j){var o=j[1];o=n.attrHandle[o]?n.attrHandle[o](g):g[o]!=null?g[o]:g.getAttribute(o);var m=o+"",p=j[2],q=j[4];return o==null?p==="!=":p==="="?m===q:p==="*="?m.indexOf(q)>=0:p==="~="?(" "+m+" ").indexOf(q)>=0:!q?m&&o!==false:p==="!="?m!==q:p==="^="?m.indexOf(q)===0:p==="$="?m.substr(m.length-q.length)===q:p==="|="?m===q||m.substr(0,q.length+1)===q+"-":false},POS:function(g,j,o,m){var p=n.setFilters[j[2]]; +if(p)return p(g,o,j,m)}}},s=n.match.POS,v=function(g,j){return"\\"+(j-0+1)},B;for(B in n.match){n.match[B]=RegExp(n.match[B].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[B]=RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[B].source.replace(/\\(\d+)/g,v))}var D=function(g,j){g=Array.prototype.slice.call(g,0);if(j){j.push.apply(j,g);return j}return g};try{Array.prototype.slice.call(u.documentElement.childNodes,0)}catch(H){D=function(g,j){var o=j||[],m=0;if(f.call(g)==="[object Array]")Array.prototype.push.apply(o, +g);else if(typeof g.length==="number")for(var p=g.length;m<p;m++)o.push(g[m]);else for(;g[m];m++)o.push(g[m]);return o}}var w,G;if(u.documentElement.compareDocumentPosition)w=function(g,j){if(g===j){h=true;return 0}if(!g.compareDocumentPosition||!j.compareDocumentPosition)return g.compareDocumentPosition?-1:1;return g.compareDocumentPosition(j)&4?-1:1};else{w=function(g,j){var o=[],m=[],p=g.parentNode,q=j.parentNode,t=p;if(g===j){h=true;return 0}else if(p===q)return G(g,j);else if(p){if(!q)return 1}else return-1; +for(;t;){o.unshift(t);t=t.parentNode}for(t=q;t;){m.unshift(t);t=t.parentNode}p=o.length;q=m.length;for(t=0;t<p&&t<q;t++)if(o[t]!==m[t])return G(o[t],m[t]);return t===p?G(g,m[t],-1):G(o[t],j,1)};G=function(g,j,o){if(g===j)return o;for(g=g.nextSibling;g;){if(g===j)return-1;g=g.nextSibling}return 1}}l.getText=function(g){for(var j="",o,m=0;g[m];m++){o=g[m];if(o.nodeType===3||o.nodeType===4)j+=o.nodeValue;else if(o.nodeType!==8)j+=l.getText(o.childNodes)}return j};(function(){var g=u.createElement("div"), +j="script"+(new Date).getTime();g.innerHTML="<a name='"+j+"'/>";var o=u.documentElement;o.insertBefore(g,o.firstChild);if(u.getElementById(j)){n.find.ID=function(m,p,q){if(typeof p.getElementById!=="undefined"&&!q)return(p=p.getElementById(m[1]))?p.id===m[1]||typeof p.getAttributeNode!=="undefined"&&p.getAttributeNode("id").nodeValue===m[1]?[p]:A:[]};n.filter.ID=function(m,p){var q=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&q&&q.nodeValue===p}}o.removeChild(g); +o=g=null})();(function(){var g=u.createElement("div");g.appendChild(u.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(j,o){var m=o.getElementsByTagName(j[1]);if(j[1]==="*"){for(var p=[],q=0;m[q];q++)m[q].nodeType===1&&p.push(m[q]);m=p}return m};g.innerHTML="<a href='#'></a>";if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(j){return j.getAttribute("href",2)};g=null})();u.querySelectorAll&& +function(){var g=l,j=u.createElement("div");j.innerHTML="<p class='TEST'></p>";if(!(j.querySelectorAll&&j.querySelectorAll(".TEST").length===0)){l=function(m,p,q,t){p=p||u;if(!t&&!l.isXML(p))if(p.nodeType===9)try{return D(p.querySelectorAll(m),q)}catch(x){}else if(p.nodeType===1&&p.nodeName.toLowerCase()!=="object"){var C=p.id,P=p.id="__sizzle__";try{return D(p.querySelectorAll("#"+P+" "+m),q)}catch(N){}finally{if(C)p.id=C;else p.removeAttribute("id")}}return g(m,p,q,t)};for(var o in g)l[o]=g[o]; +j=null}}();(function(){var g=u.documentElement,j=g.matchesSelector||g.mozMatchesSelector||g.webkitMatchesSelector||g.msMatchesSelector,o=false;try{j.call(u.documentElement,":sizzle")}catch(m){o=true}if(j)l.matchesSelector=function(p,q){try{if(o||!n.match.PSEUDO.test(q))return j.call(p,q)}catch(t){}return l(q,null,null,[p]).length>0}})();(function(){var g=u.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length=== +0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(j,o,m){if(typeof o.getElementsByClassName!=="undefined"&&!m)return o.getElementsByClassName(j[1])};g=null}}})();l.contains=u.documentElement.contains?function(g,j){return g!==j&&(g.contains?g.contains(j):true)}:function(g,j){return!!(g.compareDocumentPosition(j)&16)};l.isXML=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false};var M=function(g, +j){for(var o=[],m="",p,q=j.nodeType?[j]:j;p=n.match.PSEUDO.exec(g);){m+=p[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;p=0;for(var t=q.length;p<t;p++)l(g,q[p],o);return l.filter(m,o)};c.find=l;c.expr=l.selectors;c.expr[":"]=c.expr.filters;c.unique=l.uniqueSort;c.text=l.getText;c.isXMLDoc=l.isXML;c.contains=l.contains})();var Wa=/Until$/,Xa=/^(?:parents|prevUntil|prevAll)/,Ya=/,/,Ja=/^.[^:#\[\.,]*$/,Za=Array.prototype.slice,$a=c.expr.match.POS;c.fn.extend({find:function(a){for(var b=this.pushStack("", +"find",a),d=0,e=0,f=this.length;e<f;e++){d=b.length;c.find(a,this[e],b);if(e>0)for(var h=d;h<b.length;h++)for(var k=0;k<d;k++)if(b[k]===b[h]){b.splice(h--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,e=b.length;d<e;d++)if(c.contains(this,b[d]))return true})},not:function(a){return this.pushStack(ka(this,a,false),"not",a)},filter:function(a){return this.pushStack(ka(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a, +b){var d=[],e,f,h=this[0];if(c.isArray(a)){var k={},l,n=1;if(h&&a.length){e=0;for(f=a.length;e<f;e++){l=a[e];k[l]||(k[l]=c.expr.match.POS.test(l)?c(l,b||this.context):l)}for(;h&&h.ownerDocument&&h!==b;){for(l in k){e=k[l];if(e.jquery?e.index(h)>-1:c(h).is(e))d.push({selector:l,elem:h,level:n})}h=h.parentNode;n++}}return d}k=$a.test(a)?c(a,b||this.context):null;e=0;for(f=this.length;e<f;e++)for(h=this[e];h;)if(k?k.index(h)>-1:c.find.matchesSelector(h,a)){d.push(h);break}else{h=h.parentNode;if(!h|| +!h.ownerDocument||h===b)break}d=d.length>1?c.unique(d):d;return this.pushStack(d,"closest",a)},index:function(a){if(!a||typeof a==="string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var d=typeof a==="string"?c(a,b||this.context):c.makeArray(a),e=c.merge(this.get(),d);return this.pushStack(!d[0]||!d[0].parentNode||d[0].parentNode.nodeType===11||!e[0]||!e[0].parentNode||e[0].parentNode.nodeType===11?e:c.unique(e))},andSelf:function(){return this.add(this.prevObject)}}); +c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling", +d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,e){var f=c.map(this,b,d);Wa.test(a)||(e=d);if(e&&typeof e==="string")f=c.filter(e,f);f=this.length>1?c.unique(f):f;if((this.length>1||Ya.test(e))&&Xa.test(a))f=f.reverse();return this.pushStack(f,a,Za.call(arguments).join(","))}}); +c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return b.length===1?c.find.matchesSelector(b[0],a)?[b[0]]:[]:c.find.matches(a,b)},dir:function(a,b,d){var e=[];for(a=a[b];a&&a.nodeType!==9&&(d===A||a.nodeType!==1||!c(a).is(d));){a.nodeType===1&&e.push(a);a=a[b]}return e},nth:function(a,b,d){b=b||1;for(var e=0;a;a=a[d])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var xa=/ jQuery\d+="(?:\d+|null)"/g, +$=/^\s+/,ya=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,za=/<([\w:]+)/,ab=/<tbody/i,bb=/<|?\w+;/,Aa=/<(?:script|object|embed|option|style)/i,Ba=/checked\s*(?:[^=]|=\s*.checked.)/i,cb=/\=([^="'>\s]+\/)>/g,O={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"], +area:[1,"<map>","</map>"],_default:[0,"",""]};O.optgroup=O.option;O.tbody=O.tfoot=O.colgroup=O.caption=O.thead;O.th=O.td;if(!c.support.htmlSerialize)O._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==A)return this.empty().append((this[0]&&this[0].ownerDocument||u).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this, +d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})}, +unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a= +c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,e;(e=this[d])!=null;d++)if(!a||c.filter(a,[e]).length){if(!b&&e.nodeType===1){c.cleanData(e.getElementsByTagName("*")); +c.cleanData([e])}e.parentNode&&e.parentNode.removeChild(e)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild);return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,e=this.ownerDocument;if(!d){d=e.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(xa,"").replace(cb,'="$1">').replace($, +"")],e)[0]}else return this.cloneNode(true)});if(a===true){la(this,b);la(this.find("*"),b.find("*"))}return b},html:function(a){if(a===A)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(xa,""):null;else if(typeof a==="string"&&!Aa.test(a)&&(c.support.leadingWhitespace||!$.test(a))&&!O[(za.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(ya,"<$1></$2>");try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(e){this.empty().append(a)}}else c.isFunction(a)? +this.each(function(f){var h=c(this);h.html(a.call(this,f,h.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=c(this),e=d.html();d.replaceWith(a.call(this,b,e))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a, +true)},domManip:function(a,b,d){var e,f,h=a[0],k=[],l;if(!c.support.checkClone&&arguments.length===3&&typeof h==="string"&&Ba.test(h))return this.each(function(){c(this).domManip(a,b,d,true)});if(c.isFunction(h))return this.each(function(s){var v=c(this);a[0]=h.call(this,s,b?v.html():A);v.domManip(a,b,d)});if(this[0]){e=h&&h.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:c.buildFragment(a,this,k);l=e.fragment;if(f=l.childNodes.length===1?l=l.firstChild: +l.firstChild){b=b&&c.nodeName(f,"tr");f=0;for(var n=this.length;f<n;f++)d.call(b?c.nodeName(this[f],"table")?this[f].getElementsByTagName("tbody")[0]||this[f].appendChild(this[f].ownerDocument.createElement("tbody")):this[f]:this[f],f>0||e.cacheable||this.length>1?l.cloneNode(true):l)}k.length&&c.each(k,Ka)}return this}});c.buildFragment=function(a,b,d){var e,f,h;b=b&&b[0]?b[0].ownerDocument||b[0]:u;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===u&&!Aa.test(a[0])&&(c.support.checkClone|| +!Ba.test(a[0]))){f=true;if(h=c.fragments[a[0]])if(h!==1)e=h}if(!e){e=b.createDocumentFragment();c.clean(a,b,e,d)}if(f)c.fragments[a[0]]=h?e:1;return{fragment:e,cacheable:f}};c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var e=[];d=c(d);var f=this.length===1&&this[0].parentNode;if(f&&f.nodeType===11&&f.childNodes.length===1&&d.length===1){d[b](this[0]);return this}else{f=0;for(var h= +d.length;f<h;f++){var k=(f>0?this.clone(true):this).get();c(d[f])[b](k);e=e.concat(k)}return this.pushStack(e,a,d.selector)}}});c.extend({clean:function(a,b,d,e){b=b||u;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||u;for(var f=[],h=0,k;(k=a[h])!=null;h++){if(typeof k==="number")k+="";if(k){if(typeof k==="string"&&!bb.test(k))k=b.createTextNode(k);else if(typeof k==="string"){k=k.replace(ya,"<$1></$2>");var l=(za.exec(k)||["",""])[1].toLowerCase(),n=O[l]||O._default, +s=n[0],v=b.createElement("div");for(v.innerHTML=n[1]+k+n[2];s--;)v=v.lastChild;if(!c.support.tbody){s=ab.test(k);l=l==="table"&&!s?v.firstChild&&v.firstChild.childNodes:n[1]==="<table>"&&!s?v.childNodes:[];for(n=l.length-1;n>=0;--n)c.nodeName(l[n],"tbody")&&!l[n].childNodes.length&&l[n].parentNode.removeChild(l[n])}!c.support.leadingWhitespace&&$.test(k)&&v.insertBefore(b.createTextNode($.exec(k)[0]),v.firstChild);k=v.childNodes}if(k.nodeType)f.push(k);else f=c.merge(f,k)}}if(d)for(h=0;f[h];h++)if(e&& +c.nodeName(f[h],"script")&&(!f[h].type||f[h].type.toLowerCase()==="text/javascript"))e.push(f[h].parentNode?f[h].parentNode.removeChild(f[h]):f[h]);else{f[h].nodeType===1&&f.splice.apply(f,[h+1,0].concat(c.makeArray(f[h].getElementsByTagName("script"))));d.appendChild(f[h])}return f},cleanData:function(a){for(var b,d,e=c.cache,f=c.event.special,h=c.support.deleteExpando,k=0,l;(l=a[k])!=null;k++)if(!(l.nodeName&&c.noData[l.nodeName.toLowerCase()]))if(d=l[c.expando]){if((b=e[d])&&b.events)for(var n in b.events)f[n]? +c.event.remove(l,n):c.removeEvent(l,n,b.handle);if(h)delete l[c.expando];else l.removeAttribute&&l.removeAttribute(c.expando);delete e[d]}}});var Ca=/alpha\([^)]*\)/i,db=/opacity=([^)]*)/,eb=/-([a-z])/ig,fb=/([A-Z])/g,Da=/^-?\d+(?:px)?$/i,gb=/^-?\d/,hb={position:"absolute",visibility:"hidden",display:"block"},La=["Left","Right"],Ma=["Top","Bottom"],W,ib=u.defaultView&&u.defaultView.getComputedStyle,jb=function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){if(arguments.length===2&&b===A)return this; +return c.access(this,a,b,true,function(d,e,f){return f!==A?c.style(d,e,f):c.css(d,e)})};c.extend({cssHooks:{opacity:{get:function(a,b){if(b){var d=W(a,"opacity","opacity");return d===""?"1":d}else return a.style.opacity}}},cssNumber:{zIndex:true,fontWeight:true,opacity:true,zoom:true,lineHeight:true},cssProps:{"float":c.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,d,e){if(!(!a||a.nodeType===3||a.nodeType===8||!a.style)){var f,h=c.camelCase(b),k=a.style,l=c.cssHooks[h];b=c.cssProps[h]|| +h;if(d!==A){if(!(typeof d==="number"&&isNaN(d)||d==null)){if(typeof d==="number"&&!c.cssNumber[h])d+="px";if(!l||!("set"in l)||(d=l.set(a,d))!==A)try{k[b]=d}catch(n){}}}else{if(l&&"get"in l&&(f=l.get(a,false,e))!==A)return f;return k[b]}}},css:function(a,b,d){var e,f=c.camelCase(b),h=c.cssHooks[f];b=c.cssProps[f]||f;if(h&&"get"in h&&(e=h.get(a,true,d))!==A)return e;else if(W)return W(a,b,f)},swap:function(a,b,d){var e={},f;for(f in b){e[f]=a.style[f];a.style[f]=b[f]}d.call(a);for(f in b)a.style[f]= +e[f]},camelCase:function(a){return a.replace(eb,jb)}});c.curCSS=c.css;c.each(["height","width"],function(a,b){c.cssHooks[b]={get:function(d,e,f){var h;if(e){if(d.offsetWidth!==0)h=ma(d,b,f);else c.swap(d,hb,function(){h=ma(d,b,f)});return h+"px"}},set:function(d,e){if(Da.test(e)){e=parseFloat(e);if(e>=0)return e+"px"}else return e}}});if(!c.support.opacity)c.cssHooks.opacity={get:function(a,b){return db.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"": +b?"1":""},set:function(a,b){var d=a.style;d.zoom=1;var e=c.isNaN(b)?"":"alpha(opacity="+b*100+")",f=d.filter||"";d.filter=Ca.test(f)?f.replace(Ca,e):d.filter+" "+e}};if(ib)W=function(a,b,d){var e;d=d.replace(fb,"-$1").toLowerCase();if(!(b=a.ownerDocument.defaultView))return A;if(b=b.getComputedStyle(a,null)){e=b.getPropertyValue(d);if(e===""&&!c.contains(a.ownerDocument.documentElement,a))e=c.style(a,d)}return e};else if(u.documentElement.currentStyle)W=function(a,b){var d,e,f=a.currentStyle&&a.currentStyle[b], +h=a.style;if(!Da.test(f)&&gb.test(f)){d=h.left;e=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;h.left=b==="fontSize"?"1em":f||0;f=h.pixelLeft+"px";h.left=d;a.runtimeStyle.left=e}return f};if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=a.offsetHeight;return a.offsetWidth===0&&b===0||!c.support.reliableHiddenOffsets&&(a.style.display||c.css(a,"display"))==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var kb=c.now(),lb=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, +mb=/^(?:select|textarea)/i,nb=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,ob=/^(?:GET|HEAD|DELETE)$/,Na=/\[\]$/,T=/\=\?(&|$)/,ia=/\?/,pb=/([?&])_=[^&]*/,qb=/^(\w+:)?\/\/([^\/?#]+)/,rb=/%20/g,sb=/#.*$/,Ea=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!=="string"&&Ea)return Ea.apply(this,arguments);else if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var f=a.slice(e,a.length);a=a.slice(0,e)}e="GET";if(b)if(c.isFunction(b)){d= +b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);e="POST"}var h=this;c.ajax({url:a,type:e,dataType:"html",data:b,complete:function(k,l){if(l==="success"||l==="notmodified")h.html(f?c("<div>").append(k.responseText.replace(lb,"")).find(f):k.responseText);d&&h.each(d,[k.responseText,l,k])}});return this},serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&& +!this.disabled&&(this.checked||mb.test(this.nodeName)||nb.test(this.type))}).map(function(a,b){var d=c(this).val();return d==null?null:c.isArray(d)?c.map(d,function(e){return{name:b.name,value:e}}):{name:b.name,value:d}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:e})}, +getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:e})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return new E.XMLHttpRequest},accepts:{xml:"application/xml, text/xml",html:"text/html", +script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},ajax:function(a){var b=c.extend(true,{},c.ajaxSettings,a),d,e,f,h=b.type.toUpperCase(),k=ob.test(h);b.url=b.url.replace(sb,"");b.context=a&&a.context!=null?a.context:b;if(b.data&&b.processData&&typeof b.data!=="string")b.data=c.param(b.data,b.traditional);if(b.dataType==="jsonp"){if(h==="GET")T.test(b.url)||(b.url+=(ia.test(b.url)?"&":"?")+(b.jsonp||"callback")+"=?");else if(!b.data|| +!T.test(b.data))b.data=(b.data?b.data+"&":"")+(b.jsonp||"callback")+"=?";b.dataType="json"}if(b.dataType==="json"&&(b.data&&T.test(b.data)||T.test(b.url))){d=b.jsonpCallback||"jsonp"+kb++;if(b.data)b.data=(b.data+"").replace(T,"="+d+"$1");b.url=b.url.replace(T,"="+d+"$1");b.dataType="script";var l=E[d];E[d]=function(m){f=m;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);if(c.isFunction(l))l(m);else{E[d]=A;try{delete E[d]}catch(p){}}v&&v.removeChild(B)}}if(b.dataType==="script"&&b.cache===null)b.cache= +false;if(b.cache===false&&h==="GET"){var n=c.now(),s=b.url.replace(pb,"$1_="+n);b.url=s+(s===b.url?(ia.test(b.url)?"&":"?")+"_="+n:"")}if(b.data&&h==="GET")b.url+=(ia.test(b.url)?"&":"?")+b.data;b.global&&c.active++===0&&c.event.trigger("ajaxStart");n=(n=qb.exec(b.url))&&(n[1]&&n[1]!==location.protocol||n[2]!==location.host);if(b.dataType==="script"&&h==="GET"&&n){var v=u.getElementsByTagName("head")[0]||u.documentElement,B=u.createElement("script");if(b.scriptCharset)B.charset=b.scriptCharset;B.src= +b.url;if(!d){var D=false;B.onload=B.onreadystatechange=function(){if(!D&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){D=true;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);B.onload=B.onreadystatechange=null;v&&B.parentNode&&v.removeChild(B)}}}v.insertBefore(B,v.firstChild);return A}var H=false,w=b.xhr();if(w){b.username?w.open(h,b.url,b.async,b.username,b.password):w.open(h,b.url,b.async);try{if(b.data!=null&&!k||a&&a.contentType)w.setRequestHeader("Content-Type", +b.contentType);if(b.ifModified){c.lastModified[b.url]&&w.setRequestHeader("If-Modified-Since",c.lastModified[b.url]);c.etag[b.url]&&w.setRequestHeader("If-None-Match",c.etag[b.url])}n||w.setRequestHeader("X-Requested-With","XMLHttpRequest");w.setRequestHeader("Accept",b.dataType&&b.accepts[b.dataType]?b.accepts[b.dataType]+", */*; q=0.01":b.accepts._default)}catch(G){}if(b.beforeSend&&b.beforeSend.call(b.context,w,b)===false){b.global&&c.active--===1&&c.event.trigger("ajaxStop");w.abort();return false}b.global&& +c.triggerGlobal(b,"ajaxSend",[w,b]);var M=w.onreadystatechange=function(m){if(!w||w.readyState===0||m==="abort"){H||c.handleComplete(b,w,e,f);H=true;if(w)w.onreadystatechange=c.noop}else if(!H&&w&&(w.readyState===4||m==="timeout")){H=true;w.onreadystatechange=c.noop;e=m==="timeout"?"timeout":!c.httpSuccess(w)?"error":b.ifModified&&c.httpNotModified(w,b.url)?"notmodified":"success";var p;if(e==="success")try{f=c.httpData(w,b.dataType,b)}catch(q){e="parsererror";p=q}if(e==="success"||e==="notmodified")d|| +c.handleSuccess(b,w,e,f);else c.handleError(b,w,e,p);d||c.handleComplete(b,w,e,f);m==="timeout"&&w.abort();if(b.async)w=null}};try{var g=w.abort;w.abort=function(){w&&g.call&&g.call(w);M("abort")}}catch(j){}b.async&&b.timeout>0&&setTimeout(function(){w&&!H&&M("timeout")},b.timeout);try{w.send(k||b.data==null?null:b.data)}catch(o){c.handleError(b,w,null,o);c.handleComplete(b,w,e,f)}b.async||M();return w}},param:function(a,b){var d=[],e=function(h,k){k=c.isFunction(k)?k():k;d[d.length]=encodeURIComponent(h)+ +"="+encodeURIComponent(k)};if(b===A)b=c.ajaxSettings.traditional;if(c.isArray(a)||a.jquery)c.each(a,function(){e(this.name,this.value)});else for(var f in a)ca(f,a[f],b,e);return d.join("&").replace(rb,"+")}});c.extend({active:0,lastModified:{},etag:{},handleError:function(a,b,d,e){a.error&&a.error.call(a.context,b,d,e);a.global&&c.triggerGlobal(a,"ajaxError",[b,a,e])},handleSuccess:function(a,b,d,e){a.success&&a.success.call(a.context,e,d,b);a.global&&c.triggerGlobal(a,"ajaxSuccess",[b,a])},handleComplete:function(a, +b,d){a.complete&&a.complete.call(a.context,b,d);a.global&&c.triggerGlobal(a,"ajaxComplete",[b,a]);a.global&&c.active--===1&&c.event.trigger("ajaxStop")},triggerGlobal:function(a,b,d){(a.context&&a.context.url==null?c(a.context):c.event).trigger(b,d)},httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===1223}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),e=a.getResponseHeader("Etag"); +if(d)c.lastModified[b]=d;if(e)c.etag[b]=e;return a.status===304},httpData:function(a,b,d){var e=a.getResponseHeader("content-type")||"",f=b==="xml"||!b&&e.indexOf("xml")>=0;a=f?a.responseXML:a.responseText;f&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b==="json"||!b&&e.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&e.indexOf("javascript")>=0)c.globalEval(a);return a}});if(E.ActiveXObject)c.ajaxSettings.xhr= +function(){if(E.location.protocol!=="file:")try{return new E.XMLHttpRequest}catch(a){}try{return new E.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}};c.support.ajax=!!c.ajaxSettings.xhr();var da={},tb=/^(?:toggle|show|hide)$/,ub=/^([+\-]=)?([\d+.\-]+)(.*)$/,aa,na=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b,d){if(a||a===0)return this.animate(S("show",3),a,b,d);else{a= +0;for(b=this.length;a<b;a++){if(!c.data(this[a],"olddisplay")&&this[a].style.display==="none")this[a].style.display="";this[a].style.display===""&&c.css(this[a],"display")==="none"&&c.data(this[a],"olddisplay",oa(this[a].nodeName))}for(a=0;a<b;a++)this[a].style.display=c.data(this[a],"olddisplay")||"";return this}},hide:function(a,b,d){if(a||a===0)return this.animate(S("hide",3),a,b,d);else{a=0;for(b=this.length;a<b;a++){d=c.css(this[a],"display");d!=="none"&&c.data(this[a],"olddisplay",d)}for(a= +0;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b,d){var e=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||e?this.each(function(){var f=e?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(S("toggle",3),a,b,d);return this},fadeTo:function(a,b,d,e){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d,e)},animate:function(a,b,d,e){var f=c.speed(b,d,e);if(c.isEmptyObject(a))return this.each(f.complete); +return this[f.queue===false?"each":"queue"](function(){var h=c.extend({},f),k,l=this.nodeType===1,n=l&&c(this).is(":hidden"),s=this;for(k in a){var v=c.camelCase(k);if(k!==v){a[v]=a[k];delete a[k];k=v}if(a[k]==="hide"&&n||a[k]==="show"&&!n)return h.complete.call(this);if(l&&(k==="height"||k==="width")){h.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(c.css(this,"display")==="inline"&&c.css(this,"float")==="none")if(c.support.inlineBlockNeedsLayout)if(oa(this.nodeName)=== +"inline")this.style.display="inline-block";else{this.style.display="inline";this.style.zoom=1}else this.style.display="inline-block"}if(c.isArray(a[k])){(h.specialEasing=h.specialEasing||{})[k]=a[k][1];a[k]=a[k][0]}}if(h.overflow!=null)this.style.overflow="hidden";h.curAnim=c.extend({},a);c.each(a,function(B,D){var H=new c.fx(s,h,B);if(tb.test(D))H[D==="toggle"?n?"show":"hide":D](a);else{var w=ub.exec(D),G=H.cur(true)||0;if(w){var M=parseFloat(w[2]),g=w[3]||"px";if(g!=="px"){c.style(s,B,(M||1)+g); +G=(M||1)/H.cur(true)*G;c.style(s,B,G+g)}if(w[1])M=(w[1]==="-="?-1:1)*M+G;H.custom(G,M,g)}else H.custom(G,D,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);this.each(function(){for(var e=d.length-1;e>=0;e--)if(d[e].elem===this){b&&d[e](true);d.splice(e,1)}});b||this.dequeue();return this}});c.each({slideDown:S("show",1),slideUp:S("hide",1),slideToggle:S("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,e,f){return this.animate(b, +d,e,f)}});c.extend({speed:function(a,b,d){var e=a&&typeof a==="object"?c.extend({},a):{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};e.duration=c.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in c.fx.speeds?c.fx.speeds[e.duration]:c.fx.speeds._default;e.old=e.complete;e.complete=function(){e.queue!==false&&c(this).dequeue();c.isFunction(e.old)&&e.old.call(this)};return e},easing:{linear:function(a,b,d,e){return d+e*a},swing:function(a,b,d,e){return(-Math.cos(a* +Math.PI)/2+0.5)*e+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||c.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a=parseFloat(c.css(this.elem,this.prop));return a&&a>-1E4?a:0},custom:function(a,b,d){function e(h){return f.step(h)} +this.startTime=c.now();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;this.pos=this.state=0;var f=this;a=c.fx;e.elem=this.elem;if(e()&&c.timers.push(e)&&!aa)aa=setInterval(a.tick,a.interval)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true; +this.custom(this.cur(),0)},step:function(a){var b=c.now(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var e in this.options.curAnim)if(this.options.curAnim[e]!==true)d=false;if(d){if(this.options.overflow!=null&&!c.support.shrinkWrapBlocks){var f=this.elem,h=this.options;c.each(["","X","Y"],function(l,n){f.style["overflow"+n]=h.overflow[l]})}this.options.hide&&c(this.elem).hide();if(this.options.hide|| +this.options.show)for(var k in this.options.curAnim)c.style(this.elem,k,this.options.orig[k]);this.options.complete.call(this.elem)}return false}else{a=b-this.startTime;this.state=a/this.options.duration;b=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||b](this.state,a,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a= +c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||c.fx.stop()},interval:13,stop:function(){clearInterval(aa);aa=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a=== +b.elem}).length};var vb=/^t(?:able|d|h)$/i,Fa=/^(?:body|html)$/i;c.fn.offset="getBoundingClientRect"in u.documentElement?function(a){var b=this[0],d;if(a)return this.each(function(k){c.offset.setOffset(this,a,k)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);try{d=b.getBoundingClientRect()}catch(e){}var f=b.ownerDocument,h=f.documentElement;if(!d||!c.contains(h,b))return d||{top:0,left:0};b=f.body;f=ea(f);return{top:d.top+(f.pageYOffset||c.support.boxModel&& +h.scrollTop||b.scrollTop)-(h.clientTop||b.clientTop||0),left:d.left+(f.pageXOffset||c.support.boxModel&&h.scrollLeft||b.scrollLeft)-(h.clientLeft||b.clientLeft||0)}}:function(a){var b=this[0];if(a)return this.each(function(s){c.offset.setOffset(this,a,s)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d=b.offsetParent,e=b.ownerDocument,f,h=e.documentElement,k=e.body;f=(e=e.defaultView)?e.getComputedStyle(b,null):b.currentStyle; +for(var l=b.offsetTop,n=b.offsetLeft;(b=b.parentNode)&&b!==k&&b!==h;){if(c.offset.supportsFixedPosition&&f.position==="fixed")break;f=e?e.getComputedStyle(b,null):b.currentStyle;l-=b.scrollTop;n-=b.scrollLeft;if(b===d){l+=b.offsetTop;n+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&vb.test(b.nodeName))){l+=parseFloat(f.borderTopWidth)||0;n+=parseFloat(f.borderLeftWidth)||0}d=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&f.overflow!=="visible"){l+= +parseFloat(f.borderTopWidth)||0;n+=parseFloat(f.borderLeftWidth)||0}f=f}if(f.position==="relative"||f.position==="static"){l+=k.offsetTop;n+=k.offsetLeft}if(c.offset.supportsFixedPosition&&f.position==="fixed"){l+=Math.max(h.scrollTop,k.scrollTop);n+=Math.max(h.scrollLeft,k.scrollLeft)}return{top:l,left:n}};c.offset={initialize:function(){var a=u.body,b=u.createElement("div"),d,e,f,h=parseFloat(c.css(a,"marginTop"))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px", +height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";a.insertBefore(b,a.firstChild);d=b.firstChild;e=d.firstChild;f=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=e.offsetTop!==5;this.doesAddBorderForTableAndCells= +f.offsetTop===5;e.style.position="fixed";e.style.top="20px";this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15;e.style.position=e.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==h;a.removeChild(b);c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.css(a, +"marginTop"))||0;d+=parseFloat(c.css(a,"marginLeft"))||0}return{top:b,left:d}},setOffset:function(a,b,d){var e=c.css(a,"position");if(e==="static")a.style.position="relative";var f=c(a),h=f.offset(),k=c.css(a,"top"),l=c.css(a,"left"),n=e==="absolute"&&c.inArray("auto",[k,l])>-1;e={};var s={};if(n)s=f.position();k=n?s.top:parseInt(k,10)||0;l=n?s.left:parseInt(l,10)||0;if(c.isFunction(b))b=b.call(a,d,h);if(b.top!=null)e.top=b.top-h.top+k;if(b.left!=null)e.left=b.left-h.left+l;"using"in b?b.using.call(a, +e):f.css(e)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),e=Fa.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.css(a,"marginTop"))||0;d.left-=parseFloat(c.css(a,"marginLeft"))||0;e.top+=parseFloat(c.css(b[0],"borderTopWidth"))||0;e.left+=parseFloat(c.css(b[0],"borderLeftWidth"))||0;return{top:d.top-e.top,left:d.left-e.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||u.body;a&&!Fa.test(a.nodeName)&& +c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(e){var f=this[0],h;if(!f)return null;if(e!==A)return this.each(function(){if(h=ea(this))h.scrollTo(!a?e:c(h).scrollLeft(),a?e:c(h).scrollTop());else this[d]=e});else return(h=ea(f))?"pageXOffset"in h?h[a?"pageYOffset":"pageXOffset"]:c.support.boxModel&&h.document.documentElement[d]||h.document.body[d]:f[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase(); +c.fn["inner"+b]=function(){return this[0]?parseFloat(c.css(this[0],d,"padding")):null};c.fn["outer"+b]=function(e){return this[0]?parseFloat(c.css(this[0],d,e?"margin":"border")):null};c.fn[d]=function(e){var f=this[0];if(!f)return e==null?null:this;if(c.isFunction(e))return this.each(function(h){var k=c(this);k[d](e.call(this,h,k[d]()))});return c.isWindow(f)?f.document.compatMode==="CSS1Compat"&&f.document.documentElement["client"+b]||f.document.body["client"+b]:f.nodeType===9?Math.max(f.documentElement["client"+ +b],f.body["scroll"+b],f.documentElement["scroll"+b],f.body["offset"+b],f.documentElement["offset"+b]):e===A?parseFloat(c.css(f,d)):this.css(d,typeof e==="string"?e:e+"px")}})})(window); diff --git a/docs/ui/org-slides.js b/docs/ui/org-slides.js new file mode 100644 --- /dev/null +++ b/docs/ui/org-slides.js @@ -0,0 +1,37 @@ +function formatSlideTitle(i) { + var a = $('<h1 />').append($('<span />').append($(this).contents())); + $(this).replaceWith(a); +} + +const tagTranslator = { + "Incremental": "incremental", + "ShowFirst": "show-first", +}; + +function interpretTags() { + $("h1 span.tag span").each(function(){ + $(this).parent().parent().parent() + .siblings().children("ul") + .addClass(tagTranslator[$(this).text()]); + }); + $("li span.tag span").each(function(){ + $(this).parent() + .siblings("ul") + .addClass(tagTranslator[$(this).text()]); + }); + $("span.tag").remove(); +} + +function rewriteExternalLinks() { + $("a").each(function(){ + if ($(this).attr("href").match("^http://")) + $(this).attr("rel", "external"); + }); +} + +$(document).ready(function () { + $("div.outline-2").addClass("slide"); + $("div.slide h2").each(formatSlideTitle); + interpretTags(); + rewriteExternalLinks(); + }); diff --git a/docs/why-wisp.org b/docs/why-wisp.org new file mode 100644 --- /dev/null +++ b/docs/why-wisp.org @@ -0,0 +1,276 @@ +#+title: Why Wisp? +#+date: 2014 +#+OPTIONS: H:1 num:nil toc:nil \n:nil @:t ::t |:t ^:t f:t LaTeX:t +#+BIND: org-export-html-style-include-default nil +#+BIND: org-export-html-style-include-scripts t +#+BIND: org-export-html-auto-preamble nil +#+BIND: org-export-html-auto-postamble nil +#+BIND: org-export-html-style "<!-- configuration parameters --> <meta name='defaultView' content='slideshow' /> <meta name='controlVis' content='hidden' /> <!-- style sheet links --> <link rel='stylesheet' href='ui/default/slides.css' type='text/css' media='projection' id='slideProj' /> <link rel='stylesheet' href='ui/default/outline.css' type='text/css' media='screen' id='outlineStyle' /> <link rel='stylesheet' href='ui/default/print.css' type='text/css' media='print' id='slidePrint' /> <link rel='stylesheet' href='ui/default/opera.css' type='text/css' media='projection' id='operaFix' />" +#+BIND: org-export-html-style-extra "<!-- S5 JS --> <script src='ui/jquery.js' type='text/javascript'></script> <script src='ui/org-slides.js' type='text/javascript'></script> <script src='ui/default/slides.js' type='text/javascript'></script> <script src='ui/default/style.js' type='text/javascript'></script>" +#+BIND: org-export-html-preamble org-s5-html-preamble-function +#+BIND: org-export-html-postamble org-s5-html-postamble-function +# Export as s5 presentation. See http://orgmode.org/worg/org-tutorials/non-beamer-presentations.html + +#+BEGIN_SRC elisp :exports none +(require 'ox-s5) +#+END_SRC + +* Elegance +#+html: <br /> +** =.,":'_#?!;= + +/The most common non-letter, non-math characters in prose/ + +** =()= + +/The most common paired characters/ + +(From letter distributions in newspapers) +* On Words + +#+BEGIN_SRC elisp :exports results :results results raw + (defun shuffle-wordcontent (string) + (interactive) + (let ((strings (split-string string))) + (substring + (apply 'concat + (loop for s in strings + collect (if (< (length s) 4) + (concat s " ") + (concat (substring s 0 1) + (apply 'concat + (mapcar 'string + (shuffle-vector + (string-to-vector + (substring s 1 -1))))) + (substring s -1) + " ")))) + 0 -1))) + + (concat "*" (setq why-wisp-text-scheme-has (shuffle-wordcontent "Scheme follows a minimalist design philosophy")) "*") +#+END_SRC + +#+RESULTS: +*Shcmee fowlols a malisimint dsegin plhpoihosy* + +- /Defocus a bit/ +- /Can you see the meaning?/ + +* Scheme for Newcomers + +#+BEGIN_SRC elisp :exports results :results results raw + (concat "*€" (combine-and-quote-strings (split-string why-wisp-text-scheme-has) " €") (apply 'concat (loop for word in (split-string why-wisp-text-scheme-has) collect "¥") ) "*") +#+END_SRC + +#+RESULTS: +*€Shcmee €fowlols €a €malisimint €dsegin €plhpoihosy¥¥¥¥¥¥* + +- /Try it again/ +- /Do you see how much harder it got?/ +- /€ and ¥ escape your existing filters/ + +* On Lisp +1. Lisp syntax uses the *most common* non-letter, non-math characters. +2. The *first and last characters* are important for text-recognition. + +Let’s call these elegance 1 and elegance 2 + +Any fix for elegance 2 should preserve elegance 1 + +Elegance 0: generality and homoiconicity: *code is data* + +* Summary: Current Lisp Syntax + +- √ *Code is data*. +- √ Uses the *most common* characters. +- *×* The *first and last characters* are always *the same*. + +* On Wisp +#+html: <br /> +#+BEGIN_SRC scheme + define : hello + display "Hello Schemers!\n" +#+END_SRC + +becomes + +#+BEGIN_SRC scheme + (define (hello) + (display "Hello Schemers!\n")) +#+END_SRC + +* Why not SRFI-49 (Indentation-sensitive syntax)? + +** Scheme + +#+BEGIN_SRC scheme + (+ 5 + (* 4 3) + 2 1 0) +#+END_SRC + +** SRFI-49 + +#+BEGIN_SRC scheme + + 5 + * 4 3 + 2 + 1 + 0 +#+END_SRC + +- Cannot continue the argument list + +* Continuing the argument list in wisp + +** Wisp + +#+BEGIN_SRC scheme + + 5 + * 4 3 + . 2 1 0 +#+END_SRC + +- Complete representation of arbitrary structures +- Generalize =(. x) ⇒ x= to =(. x ...) ⇒ x ...= +- Use =. . x= to get a real =. x= after processing + +* Why not SRFI-110 (Sweet-expressions (t-expressions)) +** SRFI-110 + +#+BEGIN_SRC scheme +myfunction + x: \\ original-x + y: \\ calculate-y original-y +#+END_SRC + +#+BEGIN_SRC scheme + a b $ c d e $ f g +#+END_SRC + +#+BEGIN_SRC scheme + let <* x getx() \\ y gety() *> + ! {{x * x} + {y * y}} +#+END_SRC + +/This breaks elegance 1/ + +/Also the problems of SRFI-49 are preserved/ + +* Summary: Why wisp? + +** Wisp +/minimal indentation-based syntax/ +** Wisp vs. SRFI-49: continue the argument list. +** Wisp vs. SRFI-110: +*** use common characters (elegance 1). +*** KISS. + +* Wisp syntax 1/4: function calls + +** Indentation + +#+BEGIN_SRC scheme +display + + 3 4 5 +newline +#+END_SRC + +becomes + +#+BEGIN_SRC scheme +(display + (+ 3 4 5)) +(newline) +#+END_SRC + +* Wisp syntax 2/4: Continue Argument list + +** The dot + +#+BEGIN_SRC scheme ++ 5 + * 4 3 + . 2 1 +#+END_SRC + +becomes + +#+BEGIN_SRC scheme +(+ 5 + (* 4 3) + 2 1) +#+END_SRC + +* Wisp syntax 3/4: Double Parens + +** The colon + +#+BEGIN_SRC scheme +let + : x 1 + y 2 + z 3 + body +#+END_SRC + +becomes + +#+BEGIN_SRC scheme +(let + ((x 1) + (y 2) + (z 3)) + (body)) +#+END_SRC + +* Wisp syntax 4/4: Resilient Indentation + +** The underscore (optional) + +#+BEGIN_SRC scheme +let +_ : x 1 +__ y 2 +__ z 3 +_ body +#+END_SRC + +becomes + +#+BEGIN_SRC scheme +(let + ((x 1) + (y 2) + (z 3)) + (body)) +#+END_SRC + + +* Summary: Wisp syntax justification + +#+html: <small> +http://draketo.de/light/english/wisp-lisp-indentation-preprocessor#sec-4 +#+html: </small> + +/Required for the goal of wisp: indentation-based lisp with a simple preprocessor/ + +- =.= to continue the argument list +- =:= for double parens +- =_= to survive HTML + +* Wisp mission +#+html: <br /><blockquote> +“I love the syntax of Python, but crave the simplicity and power of Lisp.” +#+html: </blockquote> + +See the site for info how to test wisp: + +#+html: <small> +http://draketo.de/light/english/wisp-lisp-indentation-preprocessor +#+html: </small> + +# Local Variables: +# org-confirm-babel-evaluate: nil +# org-export-allow-bind-keywords: t +# End: diff --git a/examples/Makefile b/examples/Makefile --- a/examples/Makefile +++ b/examples/Makefile @@ -1,2 +1,2 @@ tinyenc : tinyenc.c - gcc -Wall tinyenc.c -o tinyenc + gcc -Wall -O3 tinyenc.c -o tinyenc diff --git a/examples/fib.w b/examples/fib.w --- a/examples/fib.w +++ b/examples/fib.w @@ -3,7 +3,7 @@ ;; Fibonacci Functions -define : fib n +define : fibonacci n . "Get Fibonacci Element N in Linear Time" let rek : (i 0) (u 1) (v 1) if : >= i : - n 2 @@ -12,51 +12,70 @@ define : fib n ; display : fib 5 -;; Try an infix notation with curly brackets - curly infix from readable as simple macro -define-syntax { - syntax-rules : { } - : { left infix right } - infix left right +;; Try it with curly infix -; display : { 1 + 2 } +;; First activate curly infix +. #!curly-infix -;; Now do the fibonacci again -define : fibcurl n - . "Get Fibonacci Elements in Linear Time" +;; Now define fibonacci with curly infix. +define : fibonacci n + . "Get Fibonacci Element N in Linear Time" let rek : (i 0) (u 1) (v 1) - if : { i >= ({ n - 2 }) } + if {i >= {n - 2}} . v - rek ({ i + 1 }) v ({ u + v }) ; else + rek {i + 1} v {u + v} -; display : fibcurl 5 +display + . {1 + 1} +newline -;; Do a more complete syntax-rule +;; Due to the compatibility with curly-infix, the following is no longer possible. ;; Try an infix notation with curly brackets - curly infix from readable as simple macro -define-syntax { - syntax-rules : { } - : { l in r } - in l r - : { { ll lin lr } in r } - in (lin ll lr) r - : { l in { rl rin rr } } - in l (rin rl rr) - : { { ll lin lr } in { rl rin rr } } - in (lin ll lr) (rin rl rr) - -;; And a complete infix-fibonacci -define : fibcurl2 n - . "Get Fibonacci Elements in Linear Time" - let rek : (i 0) (u 1) (v 1) - if : { i >= { n - 2 } } - . v - rek - { i + 1 } - . v - { u + v } - -;; But to be frank: Prefix looks better. - -display : { { 1 + 2 } * { 2 * 3 } } -; display : fibcurl2 5 -; TODO: Make the macro recursive, so it can actually cover arbitrary depths of curly braces. +;; define-syntax { +;; syntax-rules : { } +;; : { left infix right } +;; infix left right +;; +;; ; display : { 1 + 2 } +;; +;; ;; Now do the fibonacci again +;; define : fibcurl n +;; . "Get Fibonacci Elements in Linear Time" +;; let rek : (i 0) (u 1) (v 1) +;; if : { i >= ({ n - 2 }) } +;; . v +;; rek ({ i + 1 }) v ({ u + v }) ; else +;; +;; ; display : fibcurl 5 +;; +;; ;; Do a more complete syntax-rule +;; +;; ;; Try an infix notation with curly brackets - curly infix from readable as simple macro +;; define-syntax { +;; syntax-rules : { } +;; : { l in r } +;; in l r +;; : { { ll lin lr } in r } +;; in (lin ll lr) r +;; : { l in { rl rin rr } } +;; in l (rin rl rr) +;; : { { ll lin lr } in { rl rin rr } } +;; in (lin ll lr) (rin rl rr) +;; +;; ;; And a complete infix-fibonacci +;; define : fibcurl2 n +;; . "Get Fibonacci Elements in Linear Time" +;; let rek : (i 0) (u 1) (v 1) +;; if : { i >= { n - 2 } } +;; . v +;; rek +;; { i + 1 } +;; . v +;; { u + v } +;; +;; ;; But to be frank: Prefix looks better. +;; +;; display : { { 1 + 2 } * { 2 * 3 } } +;; ; display : fibcurl2 5 +;; ; TODO: Make the macro recursive, so it can actually cover arbitrary depths of curly braces. diff --git a/examples/fizzbuzz.w b/examples/fizzbuzz.w new file mode 100755 --- /dev/null +++ b/examples/fizzbuzz.w @@ -0,0 +1,24 @@ +#!./wisp-multiline.sh +; !# + +;; this example needs foof-loop installed via guildhall! +use-modules : guildhall ext foof-loop +;; Pseudocode adapted from +;; http://en.wikipedia.org/wiki/Pseudocode#Syntax +define : divisible? number divisor + = 0 : remainder number divisor + +define : fizzbuzz + let : : print_number #f + loop : : for i : up-from 1 : to 100 + set! print_number #t + when : divisible? i 3 + display "Fizz" + set! print_number #f + when : divisible? i 5 + display "Buzz" + set! print_number #f; + when print_number : display i + newline + +fizzbuzz diff --git a/examples/kit-encode.w b/examples/kit-encode.w --- a/examples/kit-encode.w +++ b/examples/kit-encode.w @@ -93,12 +93,11 @@ Karlsruher Institut fuer Technologie " -define : kittify numbers - . "Display a list of numbers as Text in a KIT Logo." +define : kittifytologo numbers logo + . "Display a list of numbers as Text in the given text logo." let* : base60numbers : map base60encode numbers requiredletters : + (length base60numbers) : apply + : map string-length base60numbers - logo kitlogosmall charsinlogo : string-count logo #\. requiredlogos : ceiling-quotient requiredletters charsinlogo text : xsubstring logo 0 : * requiredlogos : string-length logo @@ -146,6 +145,14 @@ define : kittify numbers +define : kittify numbers + . "Display a list of numbers as Text in a KIT Logo." + kittifytologo numbers kitlogosmall + + +define : kittifylarge numbers + . "Display a list of numbers as Text in a KIT Logo." + kittifytologo numbers kitlogo ; unkittify: first take out "Karlsruher Institut fuer Technologie" and all spaces and linebreaks, then split by . and base60decode the result. @@ -224,7 +231,7 @@ If TEXT is #t, transform the numbers to bv : get-bytevector-all file numbers : bytevector->u8-list bv numbers : if text (map shiftbytedownfortext numbers) numbers - kittify numbers + kittifylarge numbers define : kittytextfile filepath . "Kittify the contents of the file at FILEPATH, with a transformation to optimize for text files." @@ -284,5 +291,21 @@ 1o.1 r.1i . 1k.1 g.Y. f.1F Karlsruher Institut fuer Technologie " + +displaywithnewline " + + === KIT, IMK, RemoteC ===" + +displaywithnewline : kittify : map shiftbytedownfortext : bytevector->u8-list : string->utf8 "Karlsruhe Institut für Technologie (KIT), IMK-ASF, RemoteC" + + +displaywithnewline " + + === kittifyscript ===" + +displaywithnewline : kittytextfile "examples/kit-encode.w" + + + ; TODO: Final step: Add commandline handling which allows to write into files and set the text flag and so on. ; ./kit-encode [-e|--encode|-d|--decode] [--text] [--template file] [--killstring "stringtoremove" (mutliple times)] [-o|--output file] [file|-] diff --git a/examples/macros.w b/examples/macros.w --- a/examples/macros.w +++ b/examples/macros.w @@ -30,6 +30,6 @@ define-syntax add-with-argument : _ a b ... #' + a b ... -format #t "this breaks\n" -add-with-argument +; format #t "this breaks\n" +; add-with-argument format #t "returns 1: ~A\n" : add-with-argument 1 diff --git a/examples/tinyenc.c b/examples/tinyenc.c --- a/examples/tinyenc.c +++ b/examples/tinyenc.c @@ -33,6 +33,16 @@ int main () { uint32_t v[] = {0, 5}; uint32_t k[] = {0, 0, 0, 9}; - encrypt(v, k); + int i; + uint32_t res = 0; + // performance test + for (i=0; i<10000000; i++) // 10^7! + { + encrypt(v, k); + res += v[1]; // avoid optimizing this loop away. + decrypt(v, k); + res += v[1]; + } + printf("res: %u, v1: %u\n", res, v[1]); return 0; } diff --git a/examples/tinyenc.w b/examples/tinyenc.w --- a/examples/tinyenc.w +++ b/examples/tinyenc.w @@ -3,38 +3,50 @@ define-module : examples tinyenc . #:export : encrypt decrypt - . #:use-syntax : ice-9 syncase +; . #:use-syntax : ice-9 syncase +; `use-syntax' is deprecated. For compatibility with old and new guile I therefore need this. +; Syntax-case macros are now a part of Guile core; importing (ice-9 syncase) is no longer necessary. +use-syntax : ice-9 syncase + ; http://en.wikipedia.org/wiki/Tiny_Encryption_Algorithm#toctitle define delta #x9e3779b9 +define uint32-limit #x100000000 ; 2**32 +define uint32-max #xFFFFFFFF ; 2**32 - 1 -define : uint32 number +; define-inlinable makes this much faster (30%!). +define-inlinable : uint32 number . "ensure that the number fits a uint32" - modulo number : integer-expt 2 32 + ; instead of modulo, use bitwise and: simply throws out the higher bits + logand number uint32-max -define : v0change k0 v1 sum k1 -; format #t "sum: ~A, + k0 : ash v1 4: ~A, + v1 sum: ~A, + k1 : ash v1 -5: ~A\n" -; . sum -; uint32 : + k0 : ash v1 4 -; uint32 : + v1 sum -; uint32 : + k1 : uint32 : ash v1 -5 - logxor - uint32 : + k0 : ash v1 4 - uint32 : + v1 sum - uint32 : + k1 : uint32 : ash v1 -5 +define-inlinable : v0change k0 v1 sum k1 + logxor + + k0 : ash v1 4 + + v1 sum + + k1 : uint32 : ash v1 -5 -define : v1change k2 v0 sum k3 - logxor - uint32 : + k2 : ash v0 4 - uint32 : + v0 sum - uint32 : + k3 : uint32 : ash v0 -5 +define-inlinable : v1change k2 v0 sum k3 + logxor + + k2 : ash v0 4 + + v0 sum + + k3 : uint32 : ash v0 -5 -; TODO: Define a macro with-split-kv which executes its body with let bindings to k0 k1 k2 k3 v0 and v1 +; Define a macro with-split-kv which executes its body with let bindings to k0 k1 k2 k3 v0 and v1 +; Use syntax-case to be able to break hygiene. ; http://www.gnu.org/software/guile/manual/html_node/Syntax-Case.html#index-with_002dsyntax define-syntax with-split-vk - syntax-rules : + lambda : x + syntax-case x : : with-split-vk v k exp exp* ... - let ; TODO: This defines syntmp-v0-# instead of v0. TODO: report bug: this breaks hygiene: (define-syntax with-car-a-cdr-b (syntax-rules () ((_ some-list exp exp* ...) (let ((a (car some-list))(b (cdr some-list))) exp exp* ...)))) (with-car-a-cdr-b (list "1" "2" "3") (display syntmp-a-235)) - adjust syntmp-a-# as needed. To avoid: walk the code to ensure that no used variables are bound. + with-syntax + : k0 : datum->syntax x 'k0 + k1 : datum->syntax x 'k1 + k2 : datum->syntax x 'k2 + k3 : datum->syntax x 'k3 + v0 : datum->syntax x 'v0 + v1 : datum->syntax x 'v1 + #' let : v0 : uint32 : ash v -32 v1 : uint32 v k0 : uint32 : ash k -96 @@ -44,49 +56,16 @@ define-syntax with-split-vk . exp exp* ... -; TODO: Define a macro with-split-kv which executes its body with let bindings to k0 k1 k2 k3 v0 and v1 -; Use syntax-case to be able to break hygiene. -; http://www.gnu.org/software/guile/manual/html_node/Syntax-Case.html#index-with_002dsyntax -define-syntax with-split-vk - lambda : x - syntax-case x : - : with-split-vk v k exp exp* ... - let - : v0 : uint32 : ash v -32 - v1 : uint32 v - k0 : uint32 : ash k -96 - k1 : uint32 : ash k -64 - k2 : uint32 : ash k -32 - k3 : uint32 k - with-syntax - : k0 : datum->syntax x 'k0 - k1 : datum->syntax x 'k1 - k2 : datum->syntax x 'k2 - k3 : datum->syntax x 'k3 - v0 : datum->syntax x 'v0 - v1 : datum->syntax x 'v1 - . exp exp* ... - - define : encrypt v k . "Encrypt the 64bit (8 byte, big endian) value V with the 128bit key K (16 byte)." -; with-split-vk v k - let - : k0 : uint32 : ash k -96 - k1 : uint32 : ash k -64 - k2 : uint32 : ash k -32 - k3 : uint32 k - v0 : uint32 : ash v -32 - v1 : uint32 v + with-split-vk v k let loop : sum delta cycle 0 v0 v0 v1 v1 -; format #t "v0: ~A, v1: ~A\n" v0 v1 - ; if (= cycle 32) : format #t "k0: ~A, k1: ~A, k2: ~A, k3: ~A\n" k0 k1 k2 k3 if : = cycle 32 - + v1 : * v0 : integer-expt 2 32 + + v1 : * v0 uint32-limit let : : v0tmp : uint32 : + v0 : v0change k0 v1 sum k1 loop uint32 : + sum delta @@ -96,20 +75,15 @@ define : encrypt v k define : decrypt v k . "Decrypt the 64bit (8 byte, big endian) value V with the 128bit key K (16 byte)." - let - : k0 : uint32 : ash k -96 - k1 : uint32 : ash k -64 - k2 : uint32 : ash k -32 - k3 : uint32 k - v0 : uint32 : ash v -32 - v1 : uint32 v + with-split-vk v k let loop : sum #xc6ef3720 cycle 0 v0 v0 v1 v1 if : = cycle 32 - + v1 : * v0 : integer-expt 2 32 + + v1 : * v0 uint32-limit + ; (x-y) mod N is the same as (x mod N) - (y mod N) let : : v1tmp : uint32 : - v1 : v1change k2 v0 sum k3 loop uint32 : - sum delta @@ -128,3 +102,16 @@ format #t "encrypted: ~A\n" encrypt . 5 . 9 + +; Performance test +define : testdecrypt + decrypt + encrypt + . 5 + . 9 + . 9 + +let loop : : step 0 + when : < step 100000 ; 10^5 + testdecrypt + loop : 1+ step diff --git a/examples/yinyang.w b/examples/yinyang.w new file mode 100644 --- /dev/null +++ b/examples/yinyang.w @@ -0,0 +1,11 @@ +; from http://en.wikipedia.org/wiki/Scheme_%28programming_language%29 +let* + : + yin + : lambda (cc) (display "@") cc + call/cc : lambda (c) c + yang + : lambda (cc) (display "*") cc + call/cc : lambda (c) c + yin yang + diff --git a/runtests.sh b/runtests.sh new file mode 100755 --- /dev/null +++ b/runtests.sh @@ -0,0 +1,29 @@ +#!/bin/bash + +# Simple test runner for wisp, mainly intended to be run by autotools. + +if [[ x"$1" == x"" || x"$1" == x"." ]]; then + srcdir="$(pwd)" +else + srcdir="$1" +fi + +if [[ x"$2" == x"" || x"$2" == x"." ]]; then + builddir="$(pwd)" +else + builddir="$2" +fi + +failed=0 +cd ${srcdir}/tests +for i in *.w; do + d=$(guile ${builddir}/wisp.scm "$i" > ${builddir}/testtempfoo.scm; diff -wuB ${builddir}/testtempfoo.scm "$(basename "$i" .w)".scm; rm ${builddir}/testtempfoo.scm) + if test x"$d" = x""; then + continue + else + echo test "$i" failed. Diff: "$d" + failed=1 + fi +done +cd - >/dev/null # undo dir change +exit $failed diff --git a/tests/btest.scm b/tests/btest.scm new file mode 100644 --- /dev/null +++ b/tests/btest.scm @@ -0,0 +1,4 @@ +(display "b") +(newline) + + diff --git a/tests/continuation.scm b/tests/continuation.scm new file mode 100644 --- /dev/null +++ b/tests/continuation.scm @@ -0,0 +1,10 @@ +(a b c d e + f g h + i j k) + +(concat "I want " + (getwish from me) + " - " username) + + + diff --git a/tests/emacs-customization-tex-master.scm b/tests/emacs-customization-tex-master.scm new file mode 100644 --- /dev/null +++ b/tests/emacs-customization-tex-master.scm @@ -0,0 +1,35 @@ +(defun guess-TeX-master (filename) + "Guess the master file for FILENAME from currently open .tex files." + (let + ( + (candidate nil) + (filename (file-name-nondirectory filename))) + (save-excursion + (dolist (buffer (buffer-list)) + (with-current-buffer buffer + + (let + ( + (name (buffer-name)) + (file buffer-file-name)) + (if + (and file (string-match "\\.tex$" file)) + + (progn + (goto-char (point-min)) + (if + (re-search-forward + (concat "\\\\input{" filename "}") + nil t) + (setq candidate file)) + (if + (re-search-forward + (concat "\\\\include{" (file-name-sans-extension filename) "}") + nil t) + (setq candidate file)))))))) + + (if candidate + (message "TeX master document: %s" (file-name-nondirectory candidate))) + candidate)) + + diff --git a/tests/emacs-customization.scm b/tests/emacs-customization.scm new file mode 100644 --- /dev/null +++ b/tests/emacs-customization.scm @@ -0,0 +1,59 @@ +(if (file-directory-p "~/.emacs.d/private/journal/") + (setq-default journal-dir "~/.emacs.d/private/journal/")) + +(global-set-key [(control meta .)] 'goto-last-change-reverse) + +(require 'org-latex) +(add-to-list 'org-export-latex-packages-alist + '("" "minted")) + +(add-to-list 'org-export-latex-packages-alist + '("" "color")) + +(setq org-export-latex-listings 'minted) + +(add-hook 'outline-mode-hook + (lambda () + (require 'outline-magic))) + + +(defun find-file-as-root () + "Like `ido-find-file, but automatically edit the file with +root-privileges (using tramp/sudo), if the file is not writable by +user." + (interactive) + (let ((file (ido-read-file-name "Edit as root: "))) + (unless (file-writable-p file) + (setq file (concat find-file-root-prefix file))) + (find-file file))) + +(defun find-current-as-root () + "Reopen current file as root" + (interactive) + (set-visited-file-name (concat find-file-root-prefix (buffer-file-name))) + (setq buffer-read-only nil)) + +; the next function definition is equivalent, due to inline : + +(defun find-current-as-root () + "Reopen current file as root" + (interactive) + (set-visited-file-name + (concat find-file-root-prefix + (buffer-file-name))) + (setq buffer-read-only nil)) + +(custom-set-variables + ;; custom-set-variables was added by Custom. + ;; If you edit it by hand, you could mess it up, so be careful. + ;; Your init file should contain only one such instance. + ;; If there is more than one, they won't work right. + '(bbdb-complete-name-allow-cycling t) + '(bbdb-ignore-some-messages-alist (quote (("From" . "mailer-daemon")))) + '(bbdb-offer-save (quote savenoprompt))) + + +(setq a "x" + b "y" + c "z") + diff --git a/tests/example.scm b/tests/example.scm new file mode 100644 --- /dev/null +++ b/tests/example.scm @@ -0,0 +1,61 @@ +(defun a (b c) + (let + ( + (d "i am a string +do not break me!") + ( + ; comment: 0 + (f) +; comment : 1 + `(g )); comment " : " 2 + ( + (h (I am in brackets: + do not : change "me")) + i))) + ,(' j k) + + l + +; comment + + (a c)) + +(defun b (:n o) + "second defun : with a docstring!" + (message "I am here") + t) + +(defun c (e f) + ((g)) + ( + (h + (i)) + (j)) + '(()) + (k) + l + (m)) + +(defun _ (:) + + :) + +(_ b) + +(defun d () + (let + ((a b) + (c d)))) + +(a (((c)))) + +(let + ((a b) + (c))) + +(let ((a b))) + +a + + + diff --git a/tests/factorial.scm b/tests/factorial.scm new file mode 100644 --- /dev/null +++ b/tests/factorial.scm @@ -0,0 +1,24 @@ +;; short version +; note: once you use one inline colon, all the following forms on that +; line will get closed at the end of the line + +(define (factorial n) + (if (zero? n) + 1 + (* n (factorial (- n 1))))) + +(display (factorial 5 )) + + +;; more vertical space, less colons +(define (factorial n) + (if (zero? n) + 1 + (* n + (factorial + (- n 1))))) + +(display (factorial 5 )) + + + diff --git a/tests/flexible-parameter-list.scm b/tests/flexible-parameter-list.scm new file mode 100644 --- /dev/null +++ b/tests/flexible-parameter-list.scm @@ -0,0 +1,14 @@ +; Test using a . as first parameter on a line by prefixing it with a second . +(define + (a i + . b) + (unless (>= i (length b)) + (display (number->string (length b ))) + (display (list-ref b i)) + (newline) + (apply a ( + i 1 ) b))) + + +(a 0 "123" "345" "567") + + diff --git a/tests/mtest.scm b/tests/mtest.scm new file mode 100644 --- /dev/null +++ b/tests/mtest.scm @@ -0,0 +1,5 @@ +#!/home/arne/wisp/wisp-multiline.sh !# + +(display 1) + + diff --git a/tests/namedlet.scm b/tests/namedlet.scm new file mode 100644 --- /dev/null +++ b/tests/namedlet.scm @@ -0,0 +1,12 @@ +#!/home/arne/wisp/wisp-multiline.sh +; !# +(define (hello who) + (display who)) + +(let hello + ((who 0)) + (if (= who 5) + (display who) + (hello (+ 1 who)))) + + diff --git a/tests/quotecolon.scm b/tests/quotecolon.scm new file mode 100644 --- /dev/null +++ b/tests/quotecolon.scm @@ -0,0 +1,12 @@ +#!/home/arne/wisp/wisp-multiline.sh +; !# +(define a 1 ); test whether ' : correctly gets turned into '( +; and whether brackets in commments are treated correctly. + +(define a '(1 2 3)) + +(define + (a b) + (c)) + + diff --git a/tests/range.scm b/tests/range.scm new file mode 100644 --- /dev/null +++ b/tests/range.scm @@ -0,0 +1,25 @@ +(import (rnrs)) + +(define range + (case-lambda + ((n ); one-argument syntax + (range 0 n 1)) + ((n0 n ); two-argument syntax + (range n0 n 1)) + ((n0 n s ); three-argument syntax + (assert + (and + (for-all number? (list n0 n s)) + (not (zero? s)))) + (let ((cmp (if (positive? s) >= <= ))) + (let loop + ((i n0 ) + (acc '())) + (if + (cmp i n ) + (reverse acc) + (loop (+ i s) (cons i acc)))))))) + +(display (apply string-append "" (map number->string (range 5)))) +(newline) + diff --git a/tests/readable-tests.scm b/tests/readable-tests.scm new file mode 100644 --- /dev/null +++ b/tests/readable-tests.scm @@ -0,0 +1,39 @@ +(define (fibfast n) + (if (< n 2)) + n + (fibup n 2 1 0 )) + +(define (fibup maxnum count n-1 n-2) + (if (= maxnum count) + (+ n-1 n-2) + (fibup maxnum + (+ count 1 ) + (+ n-1 n-2 ) + n-1))) + +(define (factorial n) + (if (<= n 1) + 1 + (* n + (factorial (- n 1))))) + +(define (gcd x y) + (if (= y 0)) + x + (gcd y + (rem x y))) + +(define (add-if-all-numbers lst) + (call/cc + (lambda (exit) + (let loop + ( + (lst lst ) + (sum 0)) + (if (null? lst) + sum + (if (not (number? (car lst))) + (exit #f) + (+ (car lst) + (loop (cdr lst))))))))) + diff --git a/tests/shebang.scm b/tests/shebang.scm new file mode 100644 --- /dev/null +++ b/tests/shebang.scm @@ -0,0 +1,4 @@ +#!/usr/bin/wisp.py # !# +; This tests shebang lines + + diff --git a/tests/sublist.scm b/tests/sublist.scm new file mode 100644 --- /dev/null +++ b/tests/sublist.scm @@ -0,0 +1,7 @@ +; sublists allow to start single line function calls with a colon ( : ). + +(defun a (b c) + (let ((e . f))) + g) + + diff --git a/tests/syntax-colon.scm b/tests/syntax-colon.scm new file mode 100644 --- /dev/null +++ b/tests/syntax-colon.scm @@ -0,0 +1,38 @@ +(let + ( + (a 1) + (b 2)) + (let + ( + ( + c 3)) + (format #t "a: ~A, b: ~A, c: ~A" + a b c))) + +((a)) + +(define (hello) + (display "hello\n")) + +(let + ((a 1) + (b 2)) + (format #t "a: ~A, b: ~A" + a b)) + +(let ((a '()))) + +(let + ( ; foo + (a + '()))) + +( + (a)) + +(define (:) + (hello)) + +(:) + + diff --git a/tests/syntax-colon.w b/tests/syntax-colon.w new file mode 100644 --- /dev/null +++ b/tests/syntax-colon.w @@ -0,0 +1,36 @@ +let + : + a 1 + b 2 + let + : + : + . c 3 + format #t "a: ~A, b: ~A, c: ~A" + . a b c + +: a + +define : hello + display "hello\n" + +let + : a 1 + b 2 + format #t "a: ~A, b: ~A" + . a b + +let : : a ' : + +let + : ; foo + a + ' + +: + a + +define : \: + hello + +\: diff --git a/tests/syntax-dot.scm b/tests/syntax-dot.scm new file mode 100644 --- /dev/null +++ b/tests/syntax-dot.scm @@ -0,0 +1,13 @@ +(define (foo) + "bar") + +(define (bar) + '(1 + . 2 )); pair + +(display (foo)) +(newline) +(display (bar)) +(newline) + + diff --git a/tests/syntax-dot.w b/tests/syntax-dot.w new file mode 100644 --- /dev/null +++ b/tests/syntax-dot.w @@ -0,0 +1,11 @@ +define : foo + . "bar" + +define : bar + ' 1 + . . 2 ; pair + +display : foo +newline +display : bar +newline diff --git a/tests/syntax-empty.scm b/tests/syntax-empty.scm new file mode 100644 diff --git a/tests/syntax-empty.w b/tests/syntax-empty.w new file mode 100644 diff --git a/tests/syntax-indent.scm b/tests/syntax-indent.scm new file mode 100644 --- /dev/null +++ b/tests/syntax-indent.scm @@ -0,0 +1,16 @@ +(define + (hello who) + (format #t "Hello ~A\n" who)) + +(define + (let + ( + (a 1) + (b 2) + (c 3)) + (format #t "a: ~A, b: ~A, c: ~A" + (+ a 2) + b c))) + + + diff --git a/tests/syntax-indent.w b/tests/syntax-indent.w new file mode 100644 --- /dev/null +++ b/tests/syntax-indent.w @@ -0,0 +1,14 @@ +define + hello who + format #t "Hello ~A\n" who + +define + let + : + a 1 + b 2 + c 3 + format #t "a: ~A, b: ~A, c: ~A" + + a 2 + . b c + diff --git a/tests/syntax-strings-parens.scm b/tests/syntax-strings-parens.scm new file mode 100644 --- /dev/null +++ b/tests/syntax-strings-parens.scm @@ -0,0 +1,23 @@ +; Test linebreaks in strings and brackets + +"flubbub + +flabbab" + +(hrug (nadda +madda gadda "shoktom + mee" " sep +ka" + hadda) + (gom)) + +(flu) + +(sum [foo +bar] barz {1 + [* 2 2]}) + +(mara { +li ++ +lo (mabba) +}) diff --git a/tests/linebreaks.w b/tests/syntax-strings-parens.w rename from tests/linebreaks.w rename to tests/syntax-strings-parens.w --- a/tests/linebreaks.w +++ b/tests/syntax-strings-parens.w @@ -1,6 +1,6 @@ ; Test linebreaks in strings and brackets -"flubbub +. "flubbub flabbab" @@ -12,3 +12,12 @@ ka" gom flu + +sum [foo +bar] barz {1 + [* 2 2]} + +mara { +li ++ +lo (mabba) +} diff --git a/tests/syntax-underscore.scm b/tests/syntax-underscore.scm new file mode 100644 --- /dev/null +++ b/tests/syntax-underscore.scm @@ -0,0 +1,12 @@ +(define (a b c) + (d e + (f) + (g h) + i)) + +(define (_) + (display "hello\n")) + +(_) + + diff --git a/tests/websafe-indent.w b/tests/syntax-underscore.w rename from tests/websafe-indent.w rename to tests/syntax-underscore.w --- a/tests/websafe-indent.w +++ b/tests/syntax-underscore.w @@ -1,5 +1,10 @@ -defun a : b c +define : a b c _ d e ___ f ___ g h -___ . i +__ . i + +define : _ +_ display "hello\n" + +\_ diff --git a/wisp-guile.w b/wisp-guile.w --- a/wisp-guile.w +++ b/wisp-guile.w @@ -1,6 +1,11 @@ #!/home/arne/wisp/wisp-multiline.sh ; !# +;; This file might need to be licensed permissively for inclusion in +;; an SRFI. Only change it, if you agree to this possible relicensing +;; of your contribution to this file. I will not accept changes here +;; which do not allow that. + ; we need to be able to replace end-of-line characters in brackets and strings ;; nostringandbracketbreaks INPORT @@ -16,7 +21,9 @@ define-module : wisp . #:export : wisp2lisp wisp-chunkreader -use-modules : : srfi srfi-1 +use-modules + : srfi srfi-1 + : ice-9 regex define : endsinunevenbackslashes text ; comment if : = 0 : string-length text @@ -52,7 +59,7 @@ Ends with three consecutive linebreaks o let* __ : lastchar : read-char inport ____ nextchar : read-char inport -____ text : string lastchar +____ text : if (eof-object? lastchar) "" : string lastchar incomment #f incommentfirstchar #f ; first char of a comment instring #f @@ -112,6 +119,11 @@ Ends with three consecutive linebreaks o or char=? lastchar #\( char=? lastchar #\) + char=? lastchar #\[ + char=? lastchar #\] + ; TODO: Only match for braces {} if curly infix is enabled + char=? lastchar #\{ + char=? lastchar #\} set! instring : not instring ; check if we switch to a comment when @@ -157,9 +169,11 @@ Ends with three consecutive linebreaks o not : string-suffix? text "#" not : char=? #\\ lastchar not : endsinunevenbackslashes : string-drop-right text : min 1 : string-length text - when : equal? "(" : string nextchar + ; TODO: Only match for braces {} if curly infix is enabled + ; FIXME: Catch wrong ordering of parens/brackets/braces like ({)} + when : or (equal? "[" (string nextchar)) (equal? "(" (string nextchar)) (equal? "{" (string nextchar)) set! inbrackets : + inbrackets 1 - when : equal? ")" : string nextchar + when : or (equal? "}" (string nextchar)) (equal? ")" (string nextchar)) (equal? "]" (string nextchar)) set! inbrackets : - inbrackets 1 if : or instring : > inbrackets 0 if : char=? nextchar #\linefeed @@ -220,6 +234,14 @@ define : line-empty-code? line . "Check whether the code-part of the line is empty: contains only whitespace and/or comment." equal? "" : line-content line +define : line-only-colon? line + . "Check whether the line content consists only of a colon and whitespace." + equal? ":" : string-trim-right : line-content line + +define : line-only-prefix? line prefix + . "Check whether the line content consists only of a colon and whitespace." + equal? prefix : string-trim-right : line-content line + define : line-merge-comment line . "Merge comment and content into the content. Return the new line." let @@ -358,102 +380,120 @@ define : read-whole-file filename define : wisp2lisp-add-inline-colon-brackets line - . "Add inline colon brackets to a wisp-line (indent,content,comment)" - let : : content : line-content line - ; replace final " :" by a function call. There we are by definition of the line-splitting not in a string. - when : string-suffix? " :" content - set! content : string-append (string-drop-right content 1) "()" - ; process the content in reverse direction, so we can detect ' : and turn it into '( - ; let linebracketizer ( ( instring #f ) ( inbrackets 0 ) ( bracketstoadd 0 ) ( unprocessed content ) ( processed "" ) ) - let linebracketizer : ( instring #f ) ( inbrackets 0 ) ( bracketstoadd 0 ) ( unprocessed content ) ( processed "" ) - if : < (string-length unprocessed) 2 - ; if unprocessed is < 2 chars, it cannot contain ": ". We are done. - list - line-indent line - string-append unprocessed processed : xsubstring ")" 0 bracketstoadd - line-comment line - ; else - let - : lastletter : string-take-right unprocessed 1 - lastupto3 : string-take-right unprocessed : min 3 : string-length unprocessed - lastupto4 : string-take-right unprocessed : min 4 : string-length unprocessed - lastupto6 : string-take-right unprocessed : min 6 : string-length unprocessed - ; check if we’re in a string - when - or - and - not instring - equal? "\"" lastletter - not : equal? "#\\\"" lastupto3 - and - . instring - equal? "\"" lastletter - not : endsinunevenbackslashes : string-drop-right unprocessed 1 - set! instring : not instring - when : not instring - when : and (equal? ")" lastletter) : not : equal? "#\\)" lastupto3 - set! inbrackets : + 1 inbrackets ; remember that we're going backwards! - when : and (equal? "(" lastletter) : not : equal? "#\\(" lastupto3 - set! inbrackets : - inbrackets 1 - ; error handling: inbrackets must never be smaller than 0 - due to the line splitting. - when : < inbrackets 0 - throw 'more-inline-brackets-closed-than-opened inbrackets line - ; when we’re in a string or in brackets , just skip to the next char - cond - : or instring : > inbrackets 0 - linebracketizer instring inbrackets bracketstoadd - . : string-drop-right unprocessed 1 - . : string-append lastletter processed - ; else check for " : ": That adds a new inline bracket - ; support : at the beginning of a line, too. - : or (equal? " : " lastupto3) (equal? ": " lastupto3) - ; replace the last 2 chars with "(" and note - ; that we need an additional closing bracket - ; at the end. - linebracketizer instring inbrackets : + 1 bracketstoadd - string-append (string-drop-right unprocessed 2) - string-append "(" processed - ; turn " ' (" into " '(", do not modify unprocessed, except to shorten it! - ; same for ` , #' #` #, #,@, - : and (string-prefix? "(" processed) : equal? " ' " lastupto3 - ; leave out the second space - linebracketizer instring inbrackets bracketstoadd - . (string-append (string-drop-right unprocessed 2) "'") - . processed - : and (string-prefix? "(" processed) : equal? " , " lastupto3 - ; leave out the second space - linebracketizer instring inbrackets bracketstoadd - . (string-append (string-drop-right unprocessed 2) ",") - . processed - : and (string-prefix? "(" processed) : equal? " ` " lastupto3 - ; leave out the second space - linebracketizer instring inbrackets bracketstoadd - . (string-append (string-drop-right unprocessed 2) "`") - . processed - : and (string-prefix? "(" processed) : equal? " #` " lastupto4 - ; leave out the second space - linebracketizer instring inbrackets bracketstoadd - . (string-append (string-drop-right unprocessed 3) "#`") - . processed - : and (string-prefix? "(" processed) : equal? " #' " lastupto4 - ; leave out the second space - linebracketizer instring inbrackets bracketstoadd - . (string-append (string-drop-right unprocessed 3) "#'") - . processed - : and (string-prefix? "(" processed) : equal? " #, " lastupto4 - ; leave out the second space - linebracketizer instring inbrackets bracketstoadd - . (string-append (string-drop-right unprocessed 3) "#,") - . processed - : and (string-prefix? "(" processed) : equal? " #,@, " lastupto6 - ; leave out the second space - linebracketizer instring inbrackets bracketstoadd - . (string-append (string-drop-right unprocessed 5) "#,@,") - . processed - : . else ; just go on - linebracketizer instring inbrackets bracketstoadd - . (string-drop-right unprocessed 1) - . (string-append lastletter processed) + . "Add inline colon brackets to a wisp-line (indent,content,comment). + +A line with only a colon and whitespace gets no additional parens! + +Also unescape \\: to :. +" + ; if the line only consists of a colon and whitespace, do not change it. + if : line-only-colon? line + . line + let : : content : line-content line + ; replace final " :" by a function call. There we are by definition of the line-splitting not in a string. + when : string-suffix? " :" content + set! content : string-append (string-drop-right content 1) "()" + ; process the content in reverse direction, so we can detect ' : and turn it into '( + ; let linebracketizer ( ( instring #f ) ( inbrackets 0 ) ( bracketstoadd 0 ) ( unprocessed content ) ( processed "" ) ) + let linebracketizer : ( instring #f ) ( inbrackets 0 ) ( bracketstoadd 0 ) ( unprocessed content ) ( processed "" ) + if : < (string-length unprocessed) 2 + ; if unprocessed is < 2 chars, it cannot contain ": ". We are done. + list + line-indent line + string-append unprocessed processed : xsubstring ")" 0 bracketstoadd + line-comment line + ; else + let + : lastletter : string-take-right unprocessed 1 + lastupto3 : string-take-right unprocessed : min 3 : string-length unprocessed + lastupto4 : string-take-right unprocessed : min 4 : string-length unprocessed + lastupto6 : string-take-right unprocessed : min 6 : string-length unprocessed + ; check if we’re in a string + when + or + and + not instring + equal? "\"" lastletter + not : equal? "#\\\"" lastupto3 + and + . instring + equal? "\"" lastletter + not : endsinunevenbackslashes : string-drop-right unprocessed 1 + set! instring : not instring + when : not instring + when + or + ; TODO: Only match for braces {} if curly infix is enabled + ; FIXME: Catch wrong ordering of parens/brackets/braces like ({)} + and (equal? "{" lastletter) : not : equal? "#\\{" lastupto3 + and (equal? "[" lastletter) : not : equal? "#\\[" lastupto3 + and (equal? "(" lastletter) : not : equal? "#\\(" lastupto3 + set! inbrackets : - inbrackets 1 + when + or + and (equal? ")" lastletter) : not : equal? "#\\)" lastupto3 + and (equal? "]" lastletter) : not : equal? "#\\]" lastupto3 + and (equal? "}" lastletter) : not : equal? "#\\}" lastupto3 + set! inbrackets : + 1 inbrackets ; remember that we're going backwards! + ; error handling: inbrackets must never be smaller than 0 - due to the line splitting. + when : < inbrackets 0 + throw 'more-inline-brackets-closed-than-opened inbrackets line + ; when we’re in a string or in brackets , just skip to the next char + cond + : or instring : > inbrackets 0 + linebracketizer instring inbrackets bracketstoadd + . : string-drop-right unprocessed 1 + . : string-append lastletter processed + ; else check for " : ": That adds a new inline bracket + ; support : at the beginning of a line, too. + : or (equal? " : " lastupto3) (equal? ": " lastupto3) + ; replace the last 2 chars with "(" and note + ; that we need an additional closing bracket + ; at the end. + linebracketizer instring inbrackets : + 1 bracketstoadd + string-append (string-drop-right unprocessed 2) + string-append "(" processed + ; turn " ' (" into " '(", do not modify unprocessed, except to shorten it! + ; same for ` , #' #` #, #,@, + : and (string-prefix? "(" processed) : equal? " ' " lastupto3 + ; leave out the second space + linebracketizer instring inbrackets bracketstoadd + . (string-append (string-drop-right unprocessed 2) "'") + . processed + : and (string-prefix? "(" processed) : equal? " , " lastupto3 + ; leave out the second space + linebracketizer instring inbrackets bracketstoadd + . (string-append (string-drop-right unprocessed 2) ",") + . processed + : and (string-prefix? "(" processed) : equal? " ` " lastupto3 + ; leave out the second space + linebracketizer instring inbrackets bracketstoadd + . (string-append (string-drop-right unprocessed 2) "`") + . processed + : and (string-prefix? "(" processed) : equal? " #` " lastupto4 + ; leave out the second space + linebracketizer instring inbrackets bracketstoadd + . (string-append (string-drop-right unprocessed 3) "#`") + . processed + : and (string-prefix? "(" processed) : equal? " #' " lastupto4 + ; leave out the second space + linebracketizer instring inbrackets bracketstoadd + . (string-append (string-drop-right unprocessed 3) "#'") + . processed + : and (string-prefix? "(" processed) : equal? " #, " lastupto4 + ; leave out the second space + linebracketizer instring inbrackets bracketstoadd + . (string-append (string-drop-right unprocessed 3) "#,") + . processed + : and (string-prefix? "(" processed) : equal? " #,@, " lastupto6 + ; leave out the second space + linebracketizer instring inbrackets bracketstoadd + . (string-append (string-drop-right unprocessed 5) "#,@,") + . processed + : . else ; just go on + linebracketizer instring inbrackets bracketstoadd + . (string-drop-right unprocessed 1) + . (string-append lastletter processed) define : last-indent levels @@ -465,29 +505,47 @@ define : line-add-starting-bracket line If line starts with one of ' , ` #` #' #, #,@, then turn it into '(... instead of ('... -The line *must* have a whitespace after the prefix." - let loop : : paren-prefixes : list "' " ", " "` " "#` " "#' " "#, " "#,@, " - ; first check whether we are done checking - if : null-list? paren-prefixes - ; construct the line structure: '(indentation-depth content comment) - list - line-indent line - string-append - . "(" - line-content line - line-comment line - ; otherwise check all possible prefixes - let : : prefix : car paren-prefixes - if : string-prefix? prefix : line-content line - list - line-indent line - string-append - . (string-drop-right prefix 1) "(" - string-drop (line-content line) : string-length prefix - line-comment line - ; else - loop : cdr paren-prefixes - +If line is indented and only contains : and optional whitespace, remove the :. + +The line *must* have a whitespace after the prefix, except if the prefix is the only non-whitespace on the line." + ; if the line only contains a colon, we just replace its content with an opening paren. + if : line-only-colon? line ; FIXME: Check for this somewhere else. + list + line-indent line + string-append "(" : string-drop (line-content line) 1 ; keep whitespace + line-comment line + let loop : : paren-prefixes : list "' " ", " "` " "#` " "#' " "#, " "#,@, " + ; first check whether we are done checking + if : null-list? paren-prefixes + ; construct the line structure: '(indentation-depth content comment) + list + line-indent line + string-append + . "(" + line-content line + line-comment line + ; otherwise check all possible prefixes + let* + : prefix : car paren-prefixes + prefix-no-space : string-drop-right prefix 1 + cond + : string-prefix? prefix : line-content line + list + line-indent line + string-append + . prefix-no-space "(" + string-drop (line-content line) : string-length prefix + line-comment line + : line-only-prefix? line prefix-no-space + list + line-indent line + string-append + . (string-drop-right prefix 1) "(" + string-drop (line-content line) : string-length prefix-no-space + line-comment line + else + loop : cdr paren-prefixes + define : line-add-closing-brackets line number . "Add a closing bracket to the line." list @@ -542,7 +600,7 @@ define : line-drop-continuation-dot line define : wisp2lisp-parse lisp prev lines . "Parse the body of the wisp-code." set! prev : wisp2lisp-add-inline-colon-brackets prev ; prev already is a code-line. - if : not : line-continues? prev + if : not : or (line-continues? prev) (line-empty-code? prev) set! prev : line-add-starting-bracket prev set! lines : map-in-order wisp2lisp-add-inline-colon-brackets lines let bracketizer : (levels '(0)) (pre prev) (unprocessed lines) (processed lisp) (whitespace '()) @@ -564,7 +622,7 @@ define : wisp2lisp-parse lisp prev lines pre-continues : line-continues? pre next-continues : line-continues? next final-line : equal? #f : line-content next - bracketstocloseprev : line-indent-brackets-to-close next-indent levels next-continues pre-continues + bracketstocloseprev : if (line-empty-code? pre) 0 : line-indent-brackets-to-close next-indent levels next-continues pre-continues bracketstoopennext : line-indent-brackets-to-open next-indent levels next-continues pre-continues newnext : if final-line next : if (> bracketstoopennext 0) (line-add-starting-bracket next) next newpre : line-drop-continuation-dot : line-add-closing-brackets pre bracketstocloseprev @@ -579,7 +637,7 @@ define : wisp2lisp-initial-comments lisp . "Keep all starting comments: do not start them with a bracket." let skip-initial-comments : (lisp lisp) (prev prev) (lines lines) if : = 0 : length lines ; file only contained comments, maybe including the hashbang - . lisp + list lisp prev lines if : line-empty-code? prev skip-initial-comments : append lisp : list prev . (list-ref lines 0) (list-tail lines 1) @@ -610,6 +668,60 @@ define : wisp2lisp-lines lines parsed : apply wisp2lisp-parse deinitialized . parsed +define : line-unescape-underscore-and-colon line + . "Unescape underscores at the beginning of the line and colon." + let loop + : processed "" + unprocessed : line-content line + if : equal? "" unprocessed + list + line-indent line + . processed + line-comment line + let + : next : string : string-ref unprocessed 0 + if : equal? "" processed + cond + ; get rid of \_ + : string-prefix? "(\\_" unprocessed + loop processed : string-append "(" : string-drop unprocessed 2 + ; get rid of \: + : string-prefix? "(\\:" unprocessed + loop processed : string-append "(" : string-drop unprocessed 2 + ; get rid of . \: + : string-prefix? "\\:" unprocessed + loop processed : string-drop unprocessed 1 + else + loop + string-append processed next + string-drop unprocessed 1 + cond + : string-prefix? " \\:" unprocessed + loop + string-append processed " :" + string-drop unprocessed 3 + : string-prefix? "(\\:" unprocessed + loop + string-append processed "(:" + string-drop unprocessed 3 + else + loop + string-append processed next + string-drop unprocessed 1 + +define : unescape-underscore-and-colon lines + . "Unescape underscores at the beginning of each line and colon." + let loop + : processed '() + unprocessed lines + if : equal? unprocessed '() + . processed + let : : current : car unprocessed + loop + append processed : list : line-unescape-underscore-and-colon current + cdr unprocessed + + define* : string-replace-substring s substr replacement #:optional (start 0) (end (string-length s)) . "Replace every instance of substring in s by replacement." @@ -678,7 +790,8 @@ define : wisp2lisp text textlines : call-with-input-string nobreaks splitlines lines : linestoindented textlines lisp-lines : wisp2lisp-lines lines - join-lisp-lines lisp-lines + clean-lines : unescape-underscore-and-colon lisp-lines + join-lisp-lines clean-lines ; first step: Be able to mirror a file to stdout if : < 1 : length : command-line diff --git a/wisp-mode.el b/wisp-mode.el --- a/wisp-mode.el +++ b/wisp-mode.el @@ -3,7 +3,7 @@ ;; Copyright (C) 2013 Arne Babenhauserheide <arne_bab@web.de> ;; Author: Arne Babenhauserheide <arne_bab@web.de> -;; Version: 0.1.5 +;; Version: 0.2 ;; Keywords: languages, lisp ;; This program is free software; you can redistribute it and/or @@ -35,6 +35,10 @@ ;; ;; [2]: http://github.com/krisajenkins/wispjs-mode ;; +;; ChangeLog: +;; +;; - 0.2: Fixed the regular expressions. Now org-mode HTML export works with wisp-code. +;; ;;; Code: (require 'scheme) @@ -70,6 +74,10 @@ `(( ("\\`#!.*" . font-lock-comment-face) ; initial hashbang ("\"\\.\\*\\?" . font-lock-string-face) ; strings (anything between "") + ("^_+ *$" . font-lock-default-face) ; line with only underscores + ; and whitespace shown as + ; default text. This is just + ; a bad workaround. ("^\\(?:_* +\\| *\\): *$" . font-lock-keyword-face) ; line with only a : + whitespace, not at the beginning ("^\\(?:_* +\\| *\\): \\| *\\. " . font-lock-keyword-face) ; leading : or . ( ,(regexp-opt wisp-builtin 'symbols) . font-lock-builtin-face) ; generic functions @@ -82,9 +90,12 @@ ("#[tf]" . font-lock-constant-face) ; #t and #f ("#\\\\[^ ]+" . font-lock-constant-face) ; character literals (";" . 'font-lock-comment-delimiter-face) - ("\\_<[+-]?[0-9]+\\_>\\|\\_[+-]<[0-9]*\\.[0-9]*\\(e[+-]?[0-9]+\\)?\\_>" . font-lock-constant-face) ; numbers + ; TODO: Doublecheck this regexp. I do not understand it completely anymore. + ("\\_<[+-]?[0-9]+\\_>\\|\\_<[+-][0-9]*\\.[0-9]*\\(e[+-]?[0-9]+\\)?\\_>" . font-lock-constant-face) ; numbers ("'()" . font-lock-constant-face) ; empty list ("[ ]'[^ ]+" . font-lock-constant-face) ; 'name + ; FIXME: This is too general (it will capture a . 'b, making it + ; impossible to have 'b highlighted) (" : \\| \\. " . font-lock-keyword-face) ; leading : or . )) "Default highlighting expressions for wisp mode.") diff --git a/wisp-repl-guile.sh b/wisp-repl-guile.sh new file mode 100755 --- /dev/null +++ b/wisp-repl-guile.sh @@ -0,0 +1,19 @@ +#!/bin/sh + +# if the spec file does not exist yet, run the build chain +if test ! -f language/wisp/spec.scm; then + # if we are in a distribution tarball, just run configure + if test -f ./configure; then + ./configure && make check + # otherwise run the full autoconf chain + else + autoreconf -i && ./configure && make check + fi +fi + +# if the file still does not exist, our chain is broken +if test ! -f language/wisp/spec.scm; then + echo "ERROR: wisp failed to compile. Please check the previous output." +else + guile -L . --language=wisp +fi