diff options
author | Chris Johns <chrisj@rtems.org> | 2013-03-03 15:18:07 +1100 |
---|---|---|
committer | Chris Johns <chrisj@rtems.org> | 2013-03-03 15:18:07 +1100 |
commit | dac950217ae0030fb3d09322d463546d40b884d1 (patch) | |
tree | e6b625a905a08cb825071298bc821c257934dcac /source-builder | |
parent | Add html as a format and now asciidoc gives you the asciidoc text. (diff) | |
download | rtems-source-builder-dac950217ae0030fb3d09322d463546d40b884d1.tar.bz2 |
Import more of asciidoc.
Diffstat (limited to '')
60 files changed, 9816 insertions, 0 deletions
diff --git a/source-builder/sb/asciidoc/COPYRIGHT b/source-builder/sb/asciidoc/COPYRIGHT new file mode 100644 index 0000000..13273f3 --- /dev/null +++ b/source-builder/sb/asciidoc/COPYRIGHT @@ -0,0 +1,18 @@ +Copyright (C) 2000-2007 Stuart Rackham + +Email: srackham@gmail.com + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or (at +your option) any later version. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, +USA. diff --git a/source-builder/sb/asciidoc/common.aap b/source-builder/sb/asciidoc/common.aap new file mode 100644 index 0000000..233d190 --- /dev/null +++ b/source-builder/sb/asciidoc/common.aap @@ -0,0 +1,9 @@ +# +# Executed by all main.aap's before anything else. +# + +_parent.VERS = 8.6.8 +_parent.DATE = 17 July 2012 + +all: + :pass diff --git a/source-builder/sb/asciidoc/filters/code/code-filter-readme.txt b/source-builder/sb/asciidoc/filters/code/code-filter-readme.txt new file mode 100644 index 0000000..2a35f86 --- /dev/null +++ b/source-builder/sb/asciidoc/filters/code/code-filter-readme.txt @@ -0,0 +1,37 @@ +AsciiDoc Code Filter +==================== + +This simple minded filter highlights source code keywords and +comments. + +NOTE: The filter is to demonstrate how to write a filter -- it's much +to simplistic to be passed off as a code syntax highlighter. If you +want a full featured highlighter use the 'source highlighter filter. + + +Files +----- +code-filter.py:: + The filter Python script. +code-filter.conf:: + The AsciiDoc filter configuration file. +code-filter-test.txt:: + Short AsciiDoc document to test the filter. + + +Installation +------------ +The code filter is installed in the distribution `filters` directory +as part of the standard AsciiDoc install. + +Test it on the `code-filter-test.txt` file: + + $ asciidoc -v code-filter-test.txt + $ firefox code-filter-test.txt & + + +Help +---- +Execute the filter with the help option: + + $ ./code-filter.py --help diff --git a/source-builder/sb/asciidoc/filters/code/code-filter-test.txt b/source-builder/sb/asciidoc/filters/code/code-filter-test.txt new file mode 100644 index 0000000..c9e8192 --- /dev/null +++ b/source-builder/sb/asciidoc/filters/code/code-filter-test.txt @@ -0,0 +1,15 @@ +Code Filter Test +================ + +[python] +code~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +''' A multi-line + comment.''' +def sub_word(mo): + ''' Single line comment.''' + word = mo.group('word') # Inline comment + if word in keywords[language]: + return quote + word + quote + else: + return word +code~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/source-builder/sb/asciidoc/filters/code/code-filter.conf b/source-builder/sb/asciidoc/filters/code/code-filter.conf new file mode 100644 index 0000000..5cdab96 --- /dev/null +++ b/source-builder/sb/asciidoc/filters/code/code-filter.conf @@ -0,0 +1,8 @@ +# +# AsciiDoc code filter configuration file. +# +# Documented in code-filter-readme.txt +# + +[blockdef-listing] +code-style=template="listingblock",presubs=(),postsubs=("callouts",),posattrs=("style","language"),filter="code-filter.py -b {basebackend} -l {language}" diff --git a/source-builder/sb/asciidoc/filters/code/code-filter.py b/source-builder/sb/asciidoc/filters/code/code-filter.py new file mode 100755 index 0000000..a0d0e49 --- /dev/null +++ b/source-builder/sb/asciidoc/filters/code/code-filter.py @@ -0,0 +1,239 @@ +#!/usr/bin/env python +''' +NAME + code-filter - AsciiDoc filter to highlight language keywords + +SYNOPSIS + code-filter -b backend -l language [ -t tabsize ] + [ --help | -h ] [ --version | -v ] + +DESCRIPTION + This filter reads source code from the standard input, highlights language + keywords and comments and writes to the standard output. + + The purpose of this program is to demonstrate how to write an AsciiDoc + filter -- it's much to simplistic to be passed off as a code syntax + highlighter. Use the 'source-highlight-filter' instead. + + +OPTIONS + --help, -h + Print this documentation. + + -b + Backend output file format: 'docbook', 'linuxdoc', 'html', 'css'. + + -l + The name of the source code language: 'python', 'ruby', 'c++', 'c'. + + -t tabsize + Expand source tabs to tabsize spaces. + + --version, -v + Print program version number. + +BUGS + - Code on the same line as a block comment is treated as comment. + Keywords inside literal strings are highlighted. + - There doesn't appear to be an easy way to accomodate linuxdoc so + just pass it through without markup. + +AUTHOR + Written by Stuart Rackham, <srackham@gmail.com> + +URLS + http://sourceforge.net/projects/asciidoc/ + http://asciidoc.org/ + +COPYING + Copyright (C) 2002-2006 Stuart Rackham. Free use of this software is + granted under the terms of the GNU General Public License (GPL). +''' + +import os, sys, re, string + +VERSION = '1.1.2' + +# Globals. +language = None +backend = None +tabsize = 8 +keywordtags = { + 'html': + ('<strong>','</strong>'), + 'css': + ('<strong>','</strong>'), + 'docbook': + ('<emphasis role="strong">','</emphasis>'), + 'linuxdoc': + ('','') +} +commenttags = { + 'html': + ('<i>','</i>'), + 'css': + ('<i>','</i>'), + 'docbook': + ('<emphasis>','</emphasis>'), + 'linuxdoc': + ('','') +} +keywords = { + 'python': + ('and', 'del', 'for', 'is', 'raise', 'assert', 'elif', 'from', + 'lambda', 'return', 'break', 'else', 'global', 'not', 'try', 'class', + 'except', 'if', 'or', 'while', 'continue', 'exec', 'import', 'pass', + 'yield', 'def', 'finally', 'in', 'print'), + 'ruby': + ('__FILE__', 'and', 'def', 'end', 'in', 'or', 'self', 'unless', + '__LINE__', 'begin', 'defined?' 'ensure', 'module', 'redo', 'super', + 'until', 'BEGIN', 'break', 'do', 'false', 'next', 'rescue', 'then', + 'when', 'END', 'case', 'else', 'for', 'nil', 'retry', 'true', 'while', + 'alias', 'class', 'elsif', 'if', 'not', 'return', 'undef', 'yield'), + 'c++': + ('asm', 'auto', 'bool', 'break', 'case', 'catch', 'char', 'class', + 'const', 'const_cast', 'continue', 'default', 'delete', 'do', 'double', + 'dynamic_cast', 'else', 'enum', 'explicit', 'export', 'extern', + 'false', 'float', 'for', 'friend', 'goto', 'if', 'inline', 'int', + 'long', 'mutable', 'namespace', 'new', 'operator', 'private', + 'protected', 'public', 'register', 'reinterpret_cast', 'return', + 'short', 'signed', 'sizeof', 'static', 'static_cast', 'struct', + 'switch', 'template', 'this', 'throw', 'true', 'try', 'typedef', + 'typeid', 'typename', 'union', 'unsigned', 'using', 'virtual', 'void', + 'volatile', 'wchar_t', 'while') +} +block_comments = { + 'python': ("'''","'''"), + 'ruby': None, + 'c++': ('/*','*/') +} +inline_comments = { + 'python': '#', + 'ruby': '#', + 'c++': '//' +} + +def print_stderr(line): + sys.stderr.write(line+os.linesep) + +def sub_keyword(mo): + '''re.subs() argument to tag keywords.''' + word = mo.group('word') + if word in keywords[language]: + stag,etag = keywordtags[backend] + return stag+word+etag + else: + return word + +def code_filter(): + '''This function does all the work.''' + global language, backend + inline_comment = inline_comments[language] + blk_comment = block_comments[language] + if blk_comment: + blk_comment = (re.escape(block_comments[language][0]), + re.escape(block_comments[language][1])) + stag,etag = commenttags[backend] + in_comment = 0 # True if we're inside a multi-line block comment. + tag_comment = 0 # True if we should tag the current line as a comment. + line = sys.stdin.readline() + while line: + line = string.rstrip(line) + line = string.expandtabs(line,tabsize) + # Escape special characters. + line = string.replace(line,'&','&') + line = string.replace(line,'<','<') + line = string.replace(line,'>','>') + # Process block comment. + if blk_comment: + if in_comment: + if re.match(r'.*'+blk_comment[1]+r'$',line): + in_comment = 0 + else: + if re.match(r'^\s*'+blk_comment[0]+r'.*'+blk_comment[1],line): + # Single line block comment. + tag_comment = 1 + elif re.match(r'^\s*'+blk_comment[0],line): + # Start of multi-line block comment. + tag_comment = 1 + in_comment = 1 + else: + tag_comment = 0 + if tag_comment: + if line: line = stag+line+etag + else: + if inline_comment: + pos = string.find(line,inline_comment) + else: + pos = -1 + if pos >= 0: + # Process inline comment. + line = re.sub(r'\b(?P<word>\w+)\b',sub_keyword,line[:pos]) \ + + stag + line[pos:] + etag + else: + line = re.sub(r'\b(?P<word>\w+)\b',sub_keyword,line) + sys.stdout.write(line + os.linesep) + line = sys.stdin.readline() + +def usage(msg=''): + if msg: + print_stderr(msg) + print_stderr('Usage: code-filter -b backend -l language [ -t tabsize ]') + print_stderr(' [ --help | -h ] [ --version | -v ]') + +def main(): + global language, backend, tabsize + # Process command line options. + import getopt + opts,args = getopt.getopt(sys.argv[1:], + 'b:l:ht:v', + ['help','version']) + if len(args) > 0: + usage() + sys.exit(1) + for o,v in opts: + if o in ('--help','-h'): + print __doc__ + sys.exit(0) + if o in ('--version','-v'): + print('code-filter version %s' % (VERSION,)) + sys.exit(0) + if o == '-b': backend = v + if o == '-l': + v = string.lower(v) + if v == 'c': v = 'c++' + language = v + if o == '-t': + try: + tabsize = int(v) + except: + usage('illegal tabsize') + sys.exit(1) + if tabsize <= 0: + usage('illegal tabsize') + sys.exit(1) + if backend is None: + usage('backend option is mandatory') + sys.exit(1) + if not keywordtags.has_key(backend): + usage('illegal backend option') + sys.exit(1) + if language is None: + usage('language option is mandatory') + sys.exit(1) + if not keywords.has_key(language): + usage('illegal language option') + sys.exit(1) + # Do the work. + code_filter() + +if __name__ == "__main__": + try: + main() + except (KeyboardInterrupt, SystemExit): + pass + except: + print_stderr("%s: unexpected exit status: %s" % + (os.path.basename(sys.argv[0]), sys.exc_info()[1])) + # Exit with previous sys.exit() status or zero if no sys.exit(). + sys.exit(sys.exc_info()[1]) diff --git a/source-builder/sb/asciidoc/filters/graphviz/asciidoc-graphviz-sample.txt b/source-builder/sb/asciidoc/filters/graphviz/asciidoc-graphviz-sample.txt new file mode 100644 index 0000000..4be6ba9 --- /dev/null +++ b/source-builder/sb/asciidoc/filters/graphviz/asciidoc-graphviz-sample.txt @@ -0,0 +1,170 @@ += Graphviz filter for AsciiDoc = + +Author: Gouichi Iisaka + +Version: 1.1.3 + +== Introduction == + +The Graphviz(link:http://www.graphviz.org[]) is a way of representing structural information +as diagrams of abstract graphs and networks. + + +Automatic graph drawing has many important applications +in software engineering, database and web design, networking, +and in visual interfaces for many other domains. + +Graphviz take descriptions of graphs in a simple text language, +And has many useful features for concrete diagrams, +such as options for colors, fonts, tabular node layouts, +line styles, hyperlinks, and custom shapes. + +AsciiDoc can external shell commands used to process Paragraph and +DelimitedBlock content by Filter. + +So now, AsciiDoc can draw graphs via graphviz filter. + +== Examples == + +=== Simple === +..................................................................... +[graphviz] +--------------------------------------------------------------------- +digraph G { rankdir=LR; Graphviz->AsciiDoc->HTML} +--------------------------------------------------------------------- +..................................................................... + +[graphviz] +--------------------------------------------------------------------- +digraph G { rankdir=LR; Graphviz->AsciiDoc->HTML} +--------------------------------------------------------------------- + +=== Using options === +..................................................................... +["graphviz", "sample2.png"] +--------------------------------------------------------------------- +digraph automata_0 { + size ="8.5, 11"; + node [shape = circle]; + 0 [ style = filled, color=lightgrey ]; + 2 [ shape = doublecircle ]; + 0 -> 2 [ label = "a " ]; + 0 -> 1 [ label = "other " ]; + 1 -> 2 [ label = "a " ]; + 1 -> 1 [ label = "other " ]; + 2 -> 2 [ label = "a " ]; + 2 -> 1 [ label = "other " ]; + "Machine: a" [ shape = plaintext ]; +} +--------------------------------------------------------------------- +..................................................................... + +["graphviz", "sample2.png"] +--------------------------------------------------------------------- +digraph automata_0 { + size ="8.5, 11"; + node [shape = circle]; + 0 [ style = filled, color=lightgrey ]; + 2 [ shape = doublecircle ]; + 0 -> 2 [ label = "a " ]; + 0 -> 1 [ label = "other " ]; + 1 -> 2 [ label = "a " ]; + 1 -> 1 [ label = "other " ]; + 2 -> 2 [ label = "a " ]; + 2 -> 1 [ label = "other " ]; + "Machine: a" [ shape = plaintext ]; +} +--------------------------------------------------------------------- + +=== Using Layout === + +..................................................................... +["graphviz", "sample3.png", "dot"] +--------------------------------------------------------------------- +digraph finite_state_machine { + rankdir=LR; + size="8,5" + node [shape = doublecircle]; LR_0 LR_3 LR_4 LR_8; + node [shape = circle]; + LR_0 -> LR_2 [ label = "SS(B)" ]; + LR_0 -> LR_1 [ label = "SS(S)" ]; + LR_1 -> LR_3 [ label = "S($end)" ]; + LR_2 -> LR_6 [ label = "SS(b)" ]; + LR_2 -> LR_5 [ label = "SS(a)" ]; + LR_2 -> LR_4 [ label = "S(A)" ]; + LR_5 -> LR_7 [ label = "S(b)" ]; + LR_5 -> LR_5 [ label = "S(a)" ]; + LR_6 -> LR_6 [ label = "S(b)" ]; + LR_6 -> LR_5 [ label = "S(a)" ]; + LR_7 -> LR_8 [ label = "S(b)" ]; + LR_7 -> LR_5 [ label = "S(a)" ]; + LR_8 -> LR_6 [ label = "S(b)" ]; + LR_8 -> LR_5 [ label = "S(a)" ]; +} +--------------------------------------------------------------------- +..................................................................... + +["graphviz", "sample3.png", "dot"] +--------------------------------------------------------------------- +digraph finite_state_machine { + rankdir=LR; + size="8,5" + node [shape = doublecircle]; LR_0 LR_3 LR_4 LR_8; + node [shape = circle]; + LR_0 -> LR_2 [ label = "SS(B)" ]; + LR_0 -> LR_1 [ label = "SS(S)" ]; + LR_1 -> LR_3 [ label = "S($end)" ]; + LR_2 -> LR_6 [ label = "SS(b)" ]; + LR_2 -> LR_5 [ label = "SS(a)" ]; + LR_2 -> LR_4 [ label = "S(A)" ]; + LR_5 -> LR_7 [ label = "S(b)" ]; + LR_5 -> LR_5 [ label = "S(a)" ]; + LR_6 -> LR_6 [ label = "S(b)" ]; + LR_6 -> LR_5 [ label = "S(a)" ]; + LR_7 -> LR_8 [ label = "S(b)" ]; + LR_7 -> LR_5 [ label = "S(a)" ]; + LR_8 -> LR_6 [ label = "S(b)" ]; + LR_8 -> LR_5 [ label = "S(a)" ]; + } +--------------------------------------------------------------------- + + +== Layout == + +Layout for graphviz as follows. The default is `dot'. + + *dot;; + 'dot' draws directed graphs. + It works well on DAGs and other graphs that can be drawn as hierarchies. + It reads attributed graph files and writes drawings. + + *neato;; + 'neato' draws undirected graphs using ‘‘spring'' models (see Kamada and + Kawai, Information Processing Letters 31:1, April 1989). + Input files must be formatted in the dot attributed graph language. + + *twopi;; + 'twopi' draws graphs using a radial layout (see G. Wills, Symposium on + Graph Drawing GD'97, September, 1997). + Basically, one node is chosen as the center and put at the origin. + The remaining nodes are placed on a sequence of concentric circles + centered about the origin, each a fixed radial distance from + the previous circle. + + *circro;; + 'circo' draws graphs using a circular layout (see Six and Tollis, GD '99 + and ALENEX '99, and Kaufmann and Wiese, GD '02.) + The tool identifies biconnected components and draws the nodes + of the component on a circle. + The block‐cutpoint tree is then laid out using a recursive radial + algorithm. + Edge crossings within a circle are minimized by placing as + many edges on the circle's perimeter as possible. + In particular, if the component is outerplanar, + the component will have a planar layout. + + *fdp;; + 'fdp' draws undirected graphs using a ‘‘spring'' model. + It relies on a force‐directed approach in the spirit of Fruchterman + and Reingold + (cf. Software‐Practice & Experience 21(11), 1991, pp. 1129‐1164). diff --git a/source-builder/sb/asciidoc/filters/graphviz/graphviz-filter.conf b/source-builder/sb/asciidoc/filters/graphviz/graphviz-filter.conf new file mode 100644 index 0000000..f1ca264 --- /dev/null +++ b/source-builder/sb/asciidoc/filters/graphviz/graphviz-filter.conf @@ -0,0 +1,53 @@ +# +# AsciiDoc Graphviz filter configuration file. +# +# Version: 1.0 +# Gouici Iisaka <iisaka51 at gmail dot com> + +[graphviz-filter-style] +# When the filter output image is data-uri encoded write it to the indir +# (instead of the outdir) so that encoder can find it. +ifndef::data-uri[] +graphviz-style=template="graphviz{format?-{format}}-block",subs=(),posattrs=("style","target","layout","format"),filter='graphviz2png.py {verbose?-v} -o "{outdir={indir}}/{imagesdir=}{imagesdir?/}{target}" -L {layout=dot} -F {format=png} -' +endif::data-uri[] +ifdef::data-uri[] +graphviz-style=template="graphviz{format?-{format}}-block",subs=(),posattrs=("style","target","layout","format"),filter='graphviz2png.py {verbose?-v} -o "{indir={outdir}}/{imagesdir=}{imagesdir?/}{target}" -L {layout=dot} -F {format=png} -' +endif::data-uri[] + +[blockdef-open] +template::[graphviz-filter-style] + +[blockdef-listing] +template::[graphviz-filter-style] + +[paradef-default] +template::[graphviz-filter-style] + +[graphviz-block] +template::[filter-image-blockmacro] + +# EXPERIMENTAL: xhtml11 backend SVG image block. +ifdef::basebackend-xhtml11[] +[graphviz-svg-block] +<div class="imageblock"{id? id="{id}"}{align? style="text-align:{align};"}{float? style="float:{float};"}> +<div class="content"> +<a class="image" href="{link}"> +<object data="{imagesdir=}{imagesdir?/}{target}" type="image/svg+xml" /> +{link#}</a> +</div> +<div class="title">{caption={figure-caption} {counter:figure-number}. }{title}</div> +</div> +endif::basebackend-xhtml11[] + +# +# DEPRECATED: Pre 8.2.7 filter definition. +# +[blockdef-graphviz] +delimiter=^graphviz~{4,}$ +template=graphviz-block +presubs=none +filter=graphviz2png.py {verbose?-v} -o "{outdir={indir}}/{target}" -L {layout=dot} - +posattrs=target,format +# +# DEPRECATED: End +# diff --git a/source-builder/sb/asciidoc/filters/graphviz/graphviz2png.py b/source-builder/sb/asciidoc/filters/graphviz/graphviz2png.py new file mode 100755 index 0000000..a3d43f5 --- /dev/null +++ b/source-builder/sb/asciidoc/filters/graphviz/graphviz2png.py @@ -0,0 +1,169 @@ +#!/usr/bin/env python + +import os, sys, subprocess +from optparse import * + +__AUTHOR__ = "Gouichi Iisaka <iisaka51@gmail.com>" +__VERSION__ = '1.1.4' + +class EApp(Exception): + '''Application specific exception.''' + pass + +class Application(): + ''' +NAME + graphviz2png - Converts textual graphviz notation to PNG file + +SYNOPSIS + graphviz2png [options] INFILE + +DESCRIPTION + This filter reads Graphviz notation text from the input file + INFILE (or stdin if INFILE is -), converts it to a PNG image file. + + +OPTIONS + -o OUTFILE, --outfile=OUTFILE + The file name of the output file. If not specified the output file is + named like INFILE but with a .png file name extension. + + -L LAYOUT, --layout=LAYOUT + Graphviz layout: dot, neato, twopi, circo, fdp + Default is 'dot'. + + -F FORMAT, --format=FORMAT + Graphviz output format: png, svg, or any other format Graphviz + supports. Run dot -T? to get the full list. + Default is 'png'. + + -v, --verbose + Verbosely print processing information to stderr. + + -h, --help + Print this documentation. + + -V, --version + Print program version number. + +SEE ALSO + graphviz(1) + +AUTHOR + Written by Gouichi Iisaka, <iisaka51@gmail.com> + Format support added by Elmo Todurov, <todurov@gmail.com> + +THANKS + Stuart Rackham, <srackham@gmail.com> + This script was inspired by his music2png.py and AsciiDoc + +LICENSE + Copyright (C) 2008-2009 Gouichi Iisaka. + Free use of this software is granted under the terms of + the GNU General Public License (GPL). + ''' + + def __init__(self, argv=None): + # Run dot, get the list of supported formats. It's prefixed by some junk. + format_output = subprocess.Popen(["dot", "-T?"], stderr=subprocess.PIPE, stdout=subprocess.PIPE).communicate()[1] + # The junk contains : and ends with :. So we split it, then strip the final endline, then split the list for future usage. + supported_formats = format_output.split(": ")[2][:-1].split(" ") + + if not argv: + argv = sys.argv + + self.usage = '%prog [options] inputfile' + self.version = 'Version: %s\n' % __VERSION__ + self.version += 'Copyright(c) 2008-2009: %s\n' % __AUTHOR__ + + self.option_list = [ + Option("-o", "--outfile", action="store", + dest="outfile", + help="Output file"), + Option("-L", "--layout", action="store", + dest="layout", default="dot", type="choice", + choices=['dot','neato','twopi','circo','fdp'], + help="Layout type. LAYOUT=<dot|neato|twopi|circo|fdp>"), + Option("-F", "--format", action="store", + dest="format", default="png", type="choice", + choices=supported_formats, + help="Format type. FORMAT=<" + "|".join(supported_formats) + ">"), + Option("--debug", action="store_true", + dest="do_debug", + help=SUPPRESS_HELP), + Option("-v", "--verbose", action="store_true", + dest="do_verbose", default=False, + help="verbose output"), + ] + + self.parser = OptionParser( usage=self.usage, version=self.version, + option_list=self.option_list) + (self.options, self.args) = self.parser.parse_args() + + if len(self.args) != 1: + self.parser.print_help() + sys.exit(1) + + self.options.infile = self.args[0] + + def systemcmd(self, cmd): + if self.options.do_verbose: + msg = 'Execute: %s' % cmd + sys.stderr.write(msg + os.linesep) + else: + cmd += ' 2>%s' % os.devnull + if os.system(cmd): + raise EApp, 'failed command: %s' % cmd + + def graphviz2png(self, infile, outfile): + '''Convert Graphviz notation in file infile to + PNG file named outfile.''' + + outfile = os.path.abspath(outfile) + outdir = os.path.dirname(outfile) + + if not os.path.isdir(outdir): + raise EApp, 'directory does not exist: %s' % outdir + + basefile = os.path.splitext(outfile)[0] + saved_cwd = os.getcwd() + os.chdir(outdir) + try: + cmd = '%s -T%s "%s" > "%s"' % ( + self.options.layout, self.options.format, infile, outfile) + self.systemcmd(cmd) + finally: + os.chdir(saved_cwd) + + if not self.options.do_debug: + os.unlink(infile) + + def run(self): + if self.options.format == '': + self.options.format = 'png' + + if self.options.infile == '-': + if self.options.outfile is None: + sys.stderr.write('OUTFILE must be specified') + sys.exit(1) + infile = os.path.splitext(self.options.outfile)[0] + '.txt' + lines = sys.stdin.readlines() + open(infile, 'w').writelines(lines) + + if not os.path.isfile(infile): + raise EApp, 'input file does not exist: %s' % infile + + if self.options.outfile is None: + outfile = os.path.splitext(infile)[0] + '.png' + else: + outfile = self.options.outfile + + self.graphviz2png(infile, outfile) + + # To suppress asciidoc 'no output from filter' warnings. + if self.options.infile == '-': + sys.stdout.write(' ') + +if __name__ == "__main__": + app = Application() + app.run() diff --git a/source-builder/sb/asciidoc/filters/latex/latex-filter.conf b/source-builder/sb/asciidoc/filters/latex/latex-filter.conf new file mode 100644 index 0000000..93c09e4 --- /dev/null +++ b/source-builder/sb/asciidoc/filters/latex/latex-filter.conf @@ -0,0 +1,28 @@ +# +# AsciiDoc latex filter configuration file. +# +# Documented in latex-filter.txt in AsciiDoc distribution +# ./examples/website/ directory. +# + +[latex-filter-style] +# When the filter output image is data-uri encoded write it to the indir +# (instead of the outdir) so that encoder can find it. +ifndef::data-uri[] +latex-style=template="latex-block",subs=(),posattrs=("style","target","dpi"),filter='latex2png.py -m{verbose? -v}{dpi? -D {dpi}} -o "{outdir={indir}}/{imagesdir=}{imagesdir?/}{target}" -' +endif::data-uri[] +ifdef::data-uri[] +latex-style=template="latex-block",subs=(),posattrs=("style","target","dpi"),filter='latex2png.py -m{verbose? -v}{dpi? -D {dpi}} -o "{indir={outdir}}/{imagesdir=}{imagesdir?/}{target}" -' +endif::data-uri[] + +[blockdef-open] +template::[latex-filter-style] + +[blockdef-listing] +template::[latex-filter-style] + +[paradef-default] +template::[latex-filter-style] + +[latex-block] +template::[filter-image-blockmacro] diff --git a/source-builder/sb/asciidoc/filters/latex/latex2png.py b/source-builder/sb/asciidoc/filters/latex/latex2png.py new file mode 100755 index 0000000..3cae7c9 --- /dev/null +++ b/source-builder/sb/asciidoc/filters/latex/latex2png.py @@ -0,0 +1,232 @@ +#!/usr/bin/env python +''' +NAME + latex2png - Converts LaTeX source to PNG file + +SYNOPSIS + latex2png [options] INFILE + +DESCRIPTION + This filter reads LaTeX source text from the input file + INFILE (or stdin if INFILE is -) and renders it to PNG image file. + Typically used to render math equations. + + Requires latex(1), dvipng(1) commands and LaTeX math packages. + +OPTIONS + -D DPI + Set the output resolution to DPI dots per inch. Use this option to + scale the output image size. + + -o OUTFILE + The file name of the output file. If not specified the output file is + named like INFILE but with a .png file name extension. + + -m + Skip if the PNG output file is newer that than the INFILE. + Compares timestamps on INFILE and OUTFILE. If + INFILE is - (stdin) then compares MD5 checksum stored in file + named like OUTFILE but with a .md5 file name extension. + The .md5 file is created if the -m option is used and the + INFILE is - (stdin). + + -v + Verbosely print processing information to stderr. + + --help, -h + Print this documentation. + + --version + Print program version number. + +SEE ALSO + latex(1), dvipng(1) + +AUTHOR + Written by Stuart Rackham, <srackham@gmail.com> + The code was inspired by Kjell Magne Fauske's code: + http://fauskes.net/nb/htmleqII/ + + See also: + http://www.amk.ca/python/code/mt-math + http://code.google.com/p/latexmath2png/ + +COPYING + Copyright (C) 2010 Stuart Rackham. Free use of this software is + granted under the terms of the MIT License. +''' + +# Suppress warning: "the md5 module is deprecated; use hashlib instead" +import warnings +warnings.simplefilter('ignore',DeprecationWarning) + +import os, sys, tempfile, md5 + +VERSION = '0.1.0' + +# Include LaTeX packages and commands here. +TEX_HEADER = r'''\documentclass{article} +\usepackage{amsmath} +\usepackage{amsthm} +\usepackage{amssymb} +\usepackage{bm} +\newcommand{\mx}[1]{\mathbf{\bm{#1}}} % Matrix command +\newcommand{\vc}[1]{\mathbf{\bm{#1}}} % Vector command +\newcommand{\T}{\text{T}} % Transpose +\pagestyle{empty} +\begin{document}''' + +TEX_FOOTER = r'''\end{document}''' + +# Globals. +verbose = False + +class EApp(Exception): pass # Application specific exception. + +def print_stderr(line): + sys.stderr.write(line + os.linesep) + +def print_verbose(line): + if verbose: + print_stderr(line) + +def write_file(filename, data, mode='w'): + f = open(filename, mode) + try: + f.write(data) + finally: + f.close() + +def read_file(filename, mode='r'): + f = open(filename, mode) + try: + return f.read() + finally: + f.close() + +def run(cmd): + global verbose + if verbose: + cmd += ' 1>&2' + else: + cmd += ' 2>%s 1>&2' % os.devnull + print_verbose('executing: %s' % cmd) + if os.system(cmd): + raise EApp, 'failed command: %s' % cmd + +def latex2png(infile, outfile, dpi, modified): + '''Convert LaTeX input file infile to PNG file named outfile.''' + outfile = os.path.abspath(outfile) + outdir = os.path.dirname(outfile) + if not os.path.isdir(outdir): + raise EApp, 'directory does not exist: %s' % outdir + texfile = tempfile.mktemp(suffix='.tex', dir=os.path.dirname(outfile)) + basefile = os.path.splitext(texfile)[0] + dvifile = basefile + '.dvi' + temps = [basefile + ext for ext in ('.tex','.dvi', '.aux', '.log')] + skip = False + if infile == '-': + tex = sys.stdin.read() + if modified: + checksum = md5.new(tex).digest() + md5_file = os.path.splitext(outfile)[0] + '.md5' + if os.path.isfile(md5_file) and os.path.isfile(outfile) and \ + checksum == read_file(md5_file,'rb'): + skip = True + else: + if not os.path.isfile(infile): + raise EApp, 'input file does not exist: %s' % infile + tex = read_file(infile) + if modified and os.path.isfile(outfile) and \ + os.path.getmtime(infile) <= os.path.getmtime(outfile): + skip = True + if skip: + print_verbose('skipped: no change: %s' % outfile) + return + tex = '%s\n%s\n%s\n' % (TEX_HEADER, tex.strip(), TEX_FOOTER) + print_verbose('tex:\n%s' % tex) + write_file(texfile, tex) + saved_pwd = os.getcwd() + os.chdir(outdir) + try: + # Compile LaTeX document to DVI file. + run('latex %s' % texfile) + # Convert DVI file to PNG. + cmd = 'dvipng' + if dpi: + cmd += ' -D %s' % dpi + cmd += ' -T tight -x 1000 -z 9 -bg Transparent --truecolor -o "%s" "%s" ' \ + % (outfile,dvifile) + run(cmd) + finally: + os.chdir(saved_pwd) + for f in temps: + if os.path.isfile(f): + print_verbose('deleting: %s' % f) + os.remove(f) + if 'md5_file' in locals(): + print_verbose('writing: %s' % md5_file) + write_file(md5_file, checksum, 'wb') + +def usage(msg=''): + if msg: + print_stderr(msg) + print_stderr('\n' + 'usage:\n' + ' latex2png [options] INFILE\n' + '\n' + 'options:\n' + ' -D DPI\n' + ' -o OUTFILE\n' + ' -m\n' + ' -v\n' + ' --help\n' + ' --version') + +def main(): + # Process command line options. + global verbose + dpi = None + outfile = None + modified = False + import getopt + opts,args = getopt.getopt(sys.argv[1:], 'D:o:mhv', ['help','version']) + for o,v in opts: + if o in ('--help','-h'): + print __doc__ + sys.exit(0) + if o =='--version': + print('latex2png version %s' % (VERSION,)) + sys.exit(0) + if o == '-D': dpi = v + if o == '-o': outfile = v + if o == '-m': modified = True + if o == '-v': verbose = True + if len(args) != 1: + usage() + sys.exit(1) + infile = args[0] + if dpi and not dpi.isdigit(): + usage('invalid DPI') + sys.exit(1) + if outfile is None: + if infile == '-': + usage('OUTFILE must be specified') + sys.exit(1) + outfile = os.path.splitext(infile)[0] + '.png' + # Do the work. + latex2png(infile, outfile, dpi, modified) + # Print something to suppress asciidoc 'no output from filter' warnings. + if infile == '-': + sys.stdout.write(' ') + +if __name__ == "__main__": + try: + main() + except SystemExit: + raise + except KeyboardInterrupt: + sys.exit(1) + except Exception, e: + print_stderr("%s: %s" % (os.path.basename(sys.argv[0]), str(e))) + sys.exit(1) diff --git a/source-builder/sb/asciidoc/filters/music/music-filter-test.txt b/source-builder/sb/asciidoc/filters/music/music-filter-test.txt new file mode 100644 index 0000000..c1886bd --- /dev/null +++ b/source-builder/sb/asciidoc/filters/music/music-filter-test.txt @@ -0,0 +1,40 @@ +Music Filter Test +================= + +Details of the filter can be found in `./doc/music-filter.txt`. + + +A tune generated from ABC notation +---------------------------------- + +[music,music1.png] +--------------------------------------------------------------------- +T:The Butterfly +R:slip jig +C:Tommy Potts +H:Fiddle player Tommy Potts made this tune from two older slip jigs, +H:one of which is called "Skin the Peelers" in Roche's collection. +D:Bothy Band: 1975. +M:9/8 +K:Em +vB2(E G2)(E F3)|B2(E G2)(E F)ED|vB2(E G2)(E F3)|(B2d) d2(uB A)FD:| +|:(vB2c) (e2f) g3|(uB2d) (g2e) (dBA)|(B2c) (e2f) g2(ua|b2a) (g2e) (dBA):| +|:~B3 (B2A) G2A|~B3 BA(uB d)BA|~B3 (B2A) G2(A|B2d) (g2e) (dBA):| +--------------------------------------------------------------------- + + +A fragment generated from LilyPond source +------------------------------------------ + +["music", "music2.png", "ly", link="music2.ly"] +--------------------------------------------------------------------- +\version "2.10.0" +\paper { + ragged-right = ##t +} +{ + \time 3/4 + \clef bass + c2 e4 g2. f4 e d c2 r4 +} +--------------------------------------------------------------------- diff --git a/source-builder/sb/asciidoc/filters/music/music-filter.conf b/source-builder/sb/asciidoc/filters/music/music-filter.conf new file mode 100644 index 0000000..eaafe97 --- /dev/null +++ b/source-builder/sb/asciidoc/filters/music/music-filter.conf @@ -0,0 +1,42 @@ +# +# AsciiDoc music filter configuration file. +# +# Documented in music-filter.txt in AsciiDoc distribution +# ./examples/website/ directory. +# + +[music-filter-style] + +# When the filter output image is data-uri encoded write it to the indir +# (instead of the outdir) so that encoder can find it. +ifndef::data-uri[] +music-style=template="music-block",subs=(),posattrs=("style","target","format"),filter='music2png.py -m{verbose? -v}{format? -f {format}} -o "{outdir={indir}}/{imagesdir=}{imagesdir?/}{target}" -' +endif::data-uri[] +ifdef::data-uri[] +music-style=template="music-block",subs=(),posattrs=("style","target","format"),filter='music2png.py -m{verbose? -v}{format? -f {format}} -o "{indir={outdir}}/{imagesdir=}{imagesdir?/}{target}" -' +endif::data-uri[] + +[blockdef-open] +template::[music-filter-style] + +[blockdef-listing] +template::[music-filter-style] + +[paradef-default] +template::[music-filter-style] + +[music-block] +template::[filter-image-blockmacro] + +# +# DEPRECATED: Pre 8.2.7 filter definition. +# +[blockdef-music] +delimiter=^music~{4,}$ +template=music-block +presubs=none +filter=music2png.py{verbose? -v} -f {format=abc} -o "{outdir={indir}}/{imagesdir=}{imagesdir?/}{target}" - +posattrs=target,format +# +# DEPRECATED: End +# diff --git a/source-builder/sb/asciidoc/filters/music/music2png.py b/source-builder/sb/asciidoc/filters/music/music2png.py new file mode 100755 index 0000000..a0224df --- /dev/null +++ b/source-builder/sb/asciidoc/filters/music/music2png.py @@ -0,0 +1,213 @@ +#!/usr/bin/env python +''' +NAME + music2png - Converts textual music notation to classically notated PNG file + +SYNOPSIS + music2png [options] INFILE + +DESCRIPTION + This filter reads LilyPond or ABC music notation text from the input file + INFILE (or stdin if INFILE is -), converts it to classical music notation + and writes it to a trimmed PNG image file. + + This script is a wrapper for LilyPond and ImageMagick commands. + +OPTIONS + -f FORMAT + The INFILE music format. 'abc' for ABC notation, 'ly' for LilyPond + notation. Defaults to 'abc' unless source starts with backslash. + + -o OUTFILE + The file name of the output file. If not specified the output file is + named like INFILE but with a .png file name extension. + + -m + Skip if the PNG output file is newer that than the INFILE. + Compares timestamps on INFILE and OUTFILE. If + INFILE is - (stdin) then compares MD5 checksum stored in file + named like OUTFILE but with a .md5 file name extension. + The .md5 file is created if the -m option is used and the + INFILE is - (stdin). + + -v + Verbosely print processing information to stderr. + + --help, -h + Print this documentation. + + --version + Print program version number. + +SEE ALSO + lilypond(1), abc2ly(1), convert(1) + +AUTHOR + Written by Stuart Rackham, <srackham@gmail.com> + +COPYING + Copyright (C) 2006 Stuart Rackham. Free use of this software is + granted under the terms of the GNU General Public License (GPL). +''' + +# Suppress warning: "the md5 module is deprecated; use hashlib instead" +import warnings +warnings.simplefilter('ignore',DeprecationWarning) + +import os, sys, tempfile, md5 + +VERSION = '0.1.2' + +# Globals. +verbose = False + +class EApp(Exception): pass # Application specific exception. + +def print_stderr(line): + sys.stderr.write(line + os.linesep) + +def print_verbose(line): + if verbose: + print_stderr(line) + +def write_file(filename, data, mode='w'): + f = open(filename, mode) + try: + f.write(data) + finally: + f.close() + +def read_file(filename, mode='r'): + f = open(filename, mode) + try: + return f.read() + finally: + f.close() + +def run(cmd): + global verbose + if not verbose: + cmd += ' 2>%s' % os.devnull + print_verbose('executing: %s' % cmd) + if os.system(cmd): + raise EApp, 'failed command: %s' % cmd + +def music2png(format, infile, outfile, modified): + '''Convert ABC notation in file infile to cropped PNG file named outfile.''' + outfile = os.path.abspath(outfile) + outdir = os.path.dirname(outfile) + if not os.path.isdir(outdir): + raise EApp, 'directory does not exist: %s' % outdir + basefile = tempfile.mktemp(dir=os.path.dirname(outfile)) + temps = [basefile + ext for ext in ('.abc', '.ly', '.ps', '.midi')] + skip = False + if infile == '-': + source = sys.stdin.read() + checksum = md5.new(source).digest() + filename = os.path.splitext(outfile)[0] + '.md5' + if modified: + if os.path.isfile(filename) and os.path.isfile(outfile) and \ + checksum == read_file(filename,'rb'): + skip = True + else: + write_file(filename, checksum, 'wb') + else: + if not os.path.isfile(infile): + raise EApp, 'input file does not exist: %s' % infile + if modified and os.path.isfile(outfile) and \ + os.path.getmtime(infile) <= os.path.getmtime(outfile): + skip = True + source = read_file(infile) + if skip: + print_verbose('skipped: no change: %s' % outfile) + return + if format is None: + if source and source.startswith('\\'): # Guess input format. + format = 'ly' + else: + format = 'abc' + # Write temporary source file. + write_file('%s.%s' % (basefile,format), source) + abc = basefile + '.abc' + ly = basefile + '.ly' + png = basefile + '.png' + saved_pwd = os.getcwd() + os.chdir(outdir) + try: + if format == 'abc': + run('abc2ly -o "%s" "%s"' % (ly,abc)) + run('lilypond --png -o "%s" "%s"' % (basefile,ly)) + os.rename(png, outfile) + finally: + os.chdir(saved_pwd) + # Chop the bottom 75 pixels off to get rid of the page footer then crop the + # music image. The -strip option necessary because FOP does not like the + # custom PNG color profile used by Lilypond. + run('convert "%s" -strip -gravity South -chop 0x75 -trim "%s"' % (outfile, outfile)) + for f in temps: + if os.path.isfile(f): + print_verbose('deleting: %s' % f) + os.remove(f) + +def usage(msg=''): + if msg: + print_stderr(msg) + print_stderr('\n' + 'usage:\n' + ' music2png [options] INFILE\n' + '\n' + 'options:\n' + ' -f FORMAT\n' + ' -o OUTFILE\n' + ' -m\n' + ' -v\n' + ' --help\n' + ' --version') + +def main(): + # Process command line options. + global verbose + format = None + outfile = None + modified = False + import getopt + opts,args = getopt.getopt(sys.argv[1:], 'f:o:mhv', ['help','version']) + for o,v in opts: + if o in ('--help','-h'): + print __doc__ + sys.exit(0) + if o =='--version': + print('music2png version %s' % (VERSION,)) + sys.exit(0) + if o == '-f': format = v + if o == '-o': outfile = v + if o == '-m': modified = True + if o == '-v': verbose = True + if len(args) != 1: + usage() + sys.exit(1) + infile = args[0] + if format not in (None, 'abc', 'ly'): + usage('invalid FORMAT') + sys.exit(1) + if outfile is None: + if infile == '-': + usage('OUTFILE must be specified') + sys.exit(1) + outfile = os.path.splitext(infile)[0] + '.png' + # Do the work. + music2png(format, infile, outfile, modified) + # Print something to suppress asciidoc 'no output from filter' warnings. + if infile == '-': + sys.stdout.write(' ') + +if __name__ == "__main__": + try: + main() + except SystemExit: + raise + except KeyboardInterrupt: + sys.exit(1) + except Exception, e: + print_stderr("%s: %s" % (os.path.basename(sys.argv[0]), str(e))) + sys.exit(1) diff --git a/source-builder/sb/asciidoc/filters/source/source-highlight-filter-test.txt b/source-builder/sb/asciidoc/filters/source/source-highlight-filter-test.txt new file mode 100644 index 0000000..cd2390c --- /dev/null +++ b/source-builder/sb/asciidoc/filters/source/source-highlight-filter-test.txt @@ -0,0 +1,19 @@ +Source Hightlight Filter Test +============================= + +Details of the filter can be found in +`./doc/source-highlight-filter.txt`. + +[source,python] +--------------------------------------------------------------------- +''' A multi-line + comment.''' +def sub_word(mo): + ''' Single line comment.''' + word = mo.group('word') # Inline comment + if word in keywords[language]: + return quote + word + quote + else: + return word +--------------------------------------------------------------------- + diff --git a/source-builder/sb/asciidoc/filters/source/source-highlight-filter.conf b/source-builder/sb/asciidoc/filters/source/source-highlight-filter.conf new file mode 100644 index 0000000..efe4dbe --- /dev/null +++ b/source-builder/sb/asciidoc/filters/source/source-highlight-filter.conf @@ -0,0 +1,140 @@ +# +# AsciiDoc source code highlight filter configuration file. +# +# Documented in source-hightlight-filter.txt in AsciiDoc distribution +# ./examples/website/ directory. +# +# HTML outputs require GNU source-highlight (xhtml11, html4 outputs) +# http://www.gnu.org/software/src-highlite/source-highlight.html +# +# or Pygments (xhtml11 outputs): +# http://pygments.org/ +# +# GNU source-hightlight is default, define the 'pygments' attribute to use +# Pygments. +# + +######################## +# Source block templates +######################## +[source-highlight-block] +template::[listingblock] + +ifdef::basebackend-html[] +[source-highlight-block] +<a name="{id}"></a> +<p><b>{title}</b></p> +<table{role? class="{role}"} border="0" bgcolor="#e8e8e8" width="100%" cellpadding="10"><tr><td> +{source-highlighter$highlight:}<pre><code> +| +{source-highlighter$highlight:}</code></pre> +</td></tr></table> +endif::basebackend-html[] + +ifdef::basebackend-xhtml11,basebackend-html5[] +[source-highlight-block] +<div class="listingblock{role? {role}}"> +<a id="{id}"></a> +<div class="title">{caption=}{title}</div> +<div class="content"> +{source-highlighter$highlight:}<pre><code> +| +{source-highlighter$highlight:}</code></pre> +</div></div> +endif::basebackend-xhtml11,basebackend-html5[] + +# Use DocBook programlisting element. +ifdef::basebackend-docbook[] +[source-highlight-block] +<formalpara{id? id="{id}"}{role? role="{role}"}{reftext? xreflabel="{reftext}"}><title>{title}</title><para> +{title#}<programlisting language="{language}" linenumbering="{src_numbered=unnumbered}"{args? {args}}> +{title%}<programlisting language="{language}"{role? role="{role}"} linenumbering="{src_numbered=unnumbered}"{args? {args}}> +| +</programlisting> +{title#}</para></formalpara> +endif::basebackend-docbook[] + +# Source styles template. +ifdef::basebackend-html[] +[source-filter-style] +ifeval::["{source-highlighter}"=="source-highlight"] +source-style=template="source-highlight-block",presubs=(),postsubs=("callouts",),posattrs=("style","language","src_numbered","src_tab"),filter="source-highlight -f xhtml -s {language} {src_numbered?--line-number=' '} {src_tab?--tab={src_tab}} {args=}" +endif::[] +ifeval::["{source-highlighter}"=="highlight"] +source-style=template="source-highlight-block",presubs=(),postsubs=("callouts",),posattrs=("style","language","src_numbered","src_tab"),filter="highlight --no-doc --inline-css --out-format=xhtml --syntax={language@python:py:{language}} {src_numbered?--line-number} {src_tab?--tab={src_tab}} --encoding={encoding} {args=}" +endif::[] +ifeval::["{source-highlighter}"=="pygments"] +source-style=template="source-highlight-block",presubs=(),postsubs=("callouts",),posattrs=("style","language","src_numbered"),filter="pygmentize -f html -l {language} {src_numbered?-O linenos=table} {encoding?-O encoding={encoding}} {args=}" +endif::[] +# DEPRECATED: 'pygments' attribute. +ifdef::pygments[] +source-style=template="source-highlight-block",presubs=(),postsubs=("callouts",),posattrs=("style","language","src_numbered"),filter="pygmentize -f html -l {language} {src_numbered?-O linenos=table} {encoding?-O encoding={encoding}} {args=}" +endif::[] +endif::basebackend-html[] + +ifdef::basebackend-html4[] +[source-filter-style] +# html4 does not use pygments. +ifeval::["{source-highlighter}"=="source-highlight"] +source-style=template="source-highlight-block",presubs=(),postsubs=("callouts",),posattrs=("style","language","src_numbered","src_tab"),filter="source-highlight -f html -s {language} {src_numbered?--line-number=' '} {src_tab?--tab={src_tab}} {args=}" +endif::[] +ifeval::["{source-highlighter}"=="highlight"] +source-style=template="source-highlight-block",presubs=(),postsubs=("callouts",),posattrs=("style","language","src_numbered","src_tab"),filter="highlight --no-doc --inline-css --out-format=html --syntax={language@python:py:{language}} {src_numbered?--line-number} {src_tab?--tab={src_tab}} {args=}" +endif::[] +endif::basebackend-html4[] + +ifdef::basebackend-docbook[] +[source-filter-style] +source-style=template="source-highlight-block",presubs=(),postsubs=("specialcharacters","callouts"),posattrs=("style","language","src_numbered","src_tab") +endif::basebackend-docbook[] + +######################### +# Source paragraph styles +######################### +[paradef-default] +template::[source-filter-style] + +[paradef-literal] +template::[source-filter-style] + +######################### +# Source block styles +######################### +[blockdef-open] +template::[source-filter-style] + +[blockdef-listing] +template::[source-filter-style] + + +# +# DEPRECATED: Pre 8.2.7 filter definition. +# + +######################### +# Source block definition +######################### +[blockdef-source-highlight] +# The old ^ delimiter is for backward compatibility, may be removed from +# in future versions. +delimiter=(^source~{4,}$)|(^\^{4,}$) +template=source-highlight-block +presubs=none +posattrs=language,src_numbered,src_tab + +ifndef::basebackend-docbook[] +postsubs=callouts +# GNU Source Highlight filter. +filter=source-highlight -f {basebackend-xhtml11?xhtml}{basebackend-html4?html} -s {language} {src_numbered?--line-number} {src_tab?--tab={src_tab}} +endif::basebackend-docbook[] + +ifdef::basebackend-docbook[] +postsubs=specialcharacters,callouts +# In the case of DocBook just pass the listing through and let the DocBook +# toolchain handle it. +filter= +endif::basebackend-docbook[] + +# +# DEPRECATED: End +# diff --git a/source-builder/sb/asciidoc/help.conf b/source-builder/sb/asciidoc/help.conf new file mode 100644 index 0000000..fadcb9c --- /dev/null +++ b/source-builder/sb/asciidoc/help.conf @@ -0,0 +1,394 @@ +# AsciiDoc help file. +# +# INI section format, each section contains a topic. +# Displayed with 'asciidoc --help sectionname' command. +# + +# +# Default help topic. +# +[default] + +Man page: asciidoc --help manpage +Syntax: asciidoc --help syntax + +[manpage] + +NAME + + asciidoc - converts an AsciiDoc text file to HTML or DocBook + +SYNOPSIS + + asciidoc [OPTIONS] FILE + +DESCRIPTION + + The asciidoc(1) command translates the AsciiDoc text file FILE to + DocBook or HTML. If FILE is - then the standard input is used. + +OPTIONS + + -a, --attribute=ATTRIBUTE + Define or delete document attribute. ATTRIBUTE is formatted like + NAME=VALUE. Command-line attributes take precedence over + document and configuration file attributes. Alternate acceptable + forms are NAME (the VALUE defaults to an empty string); NAME! + (delete the NAME attribute); NAME=VALUE@ (do not override + document or configuration file attributes). Values containing + spaces should be enclosed in double-quote characters. This + option may be specified more than once. A special attribute + named trace controls the output of diagnostic information. + + -b, --backend=BACKEND + Backend output file format: docbook45, xhtml11, html4, html5, + slidy, wordpress or latex (the latex backend is experimental). + You can also use the backend alias names html (aliased to + xhtml11) or docbook (aliased to docbook45). Defaults to + html. The --backend option is also used to manage backend + plugins (see [1]PLUGIN COMMANDS). + + -f, --conf-file=CONF_FILE + Use configuration file CONF_FILE.Configuration files processed + in command-line order (after implicit configuration files). This + option may be specified more than once. + + --doctest + Run Python doctests in asciidoc module. + + -d, --doctype=DOCTYPE + Document type: article, manpage or book. The book document type + is only supported by the docbook backend. Default document type + is article. + + -c, --dump-conf + Dump configuration to stdout. + + --filter=FILTER + Specify the name of a filter to be loaded (used to load filters + that are not auto-loaded). This option may be specified more + than once. The --filter option is also used to manage filter + plugins (see [2]PLUGIN COMMANDS). + + -h, --help [TOPIC] + Print help TOPIC. --help topics will print a list of help + topics, --help syntax summarizes AsciiDoc syntax, --help manpage + prints the AsciiDoc manpage. + + -e, --no-conf + Exclude implicitly loaded configuration files except for those + named like the input file (infile.conf and infile-backend.conf). + + -s, --no-header-footer + Suppress document header and footer output. + + -o, --out-file=OUT_FILE + Write output to file OUT_FILE. Defaults to the base name of + input file with backend extension. If the input is stdin then + the outfile defaults to stdout. If OUT_FILE is - then the + standard output is used. + + -n, --section-numbers + Auto-number HTML article section titles. Synonym for --attribute + numbered. + + --safe + Enable safe mode. Safe mode is disabled by default. AsciiDoc + safe mode skips potentially dangerous scripted sections in + AsciiDoc source files. + + --theme=THEME + Specify a theme name. Synonym for --attribute theme=THEME. The + --theme option is also used to manage theme plugins (see + [3]PLUGIN COMMANDS). + + -v, --verbose + Verbosely print processing information and configuration file + checks to stderr. + + --version + Print program version number. + +PLUGIN COMMANDS + + The asciidoc(1) --filter, --backend and --theme options are used to + install, remove and list AsciiDoc filter, backend and theme plugins. + Syntax: + + asciidoc OPTION install ZIP_FILE [PLUGINS_DIR] + asciidoc OPTION remove PLUGIN_NAME [PLUGINS_DIR] + asciidoc OPTION list + asciidoc OPTION build ZIP_FILE PLUGIN_SOURCE + + Where: + + OPTION + asciidoc(1) --filter, --backend or --theme option specifying the + type of plugin. + + PLUGIN_NAME + A unique plugin name containing only alphanumeric or underscore + characters. + + ZIP_FILE + A Zip file containing plugin resources, the name must start with + the plugin name e.g. my_filter-1.0.zip packages filter + my_filter. + + PLUGINS_DIR + The directory containing installed plugins. Each plugin is + contained in its own separate subdirectory which has the same + name as the plugin. PLUGINS_DIR defaults to the + $HOME/.asciidoc/filters (for filter plugins) or + $HOME/.asciidoc/backends (for backend plugins) or + $HOME/.asciidoc/themes (for theme plugins). + + PLUGIN_SOURCE + The name of a directory containing the plugin source files or + the name of a single source file. + + The plugin commands perform as follows: + + install + Create a subdirectory in PLUGINS_DIR with the same name as the + plugin then extract the ZIP_FILE into it. + + remove + Delete the PLUGIN_NAME plugin subdirectory and all its contents + from the PLUGINS_DIR. + + list + List the names and locations of all installed filter or theme + plugins (including standard plugins installed in the global + configuration directory). + + build + Create a plugin file named ZIP_FILE containing the files and + subdirectories specified by PLUGIN_SOURCE. File and directory + names starting with a period are skipped. + +EXIT STATUS + + 0 + Success + + 1 + Failure (syntax or usage error; configuration error; document + processing failure; unexpected error). + +BUGS + + See the AsciiDoc distribution BUGS file. + +AUTHOR + + AsciiDoc was originally written by Stuart Rackham. Many people have + contributed to it. + +RESOURCES + + SourceForge: [4]http://sourceforge.net/projects/asciidoc/ + + Main web site: [5]http://asciidoc.org/ + +COPYING + + Copyright (C) 2002-2011 Stuart Rackham. Free use of this software is + granted under the terms of the GNU General Public License (GPL). + + +[syntax] + +AsciiDoc Markup Syntax Summary +============================== + +A summary of the most commonly used markup. +For a complete reference see the 'AsciiDoc User Guide'. + +Text formatting +--------------- + *bold text* (boldface font) + _emphasized text_ (normally italics) + 'emphasized text' + +monospaced text+ (proportional font) + `monospaced text` (inline literal passthrough) + +Document links +-------------- + [[id]] (define link target) + <<id,caption>> (link to target id) + link:filename#id[caption] (link to external HTML file) + +URLs +---- + Use normal URL and email addess syntax or: + + http:address[caption] (link to web page) + mailto:address[caption] (link to mail recipient) + +Images +------ + image:filename[caption] (inline image) + image::filename[caption] (block image) + +Document header +--------------- + + The Document Title + ================== + author <email> + revision, date + +author, email, revision and date are optional. + +Section title underlines +------------------------ + Underlined: + + Level 0 (document title) + ======= + Level 1 + ------- + Level 2 + ~~~~~~~ + Level 3 + ^^^^^^^ + Level 4 (bottom level) + +++++++ + + Single line: + + = Level 0 = (document title) + == Level 1 == + === Level 2 === + ==== Level 3 ==== + ===== Level 4 ===== (bottom level) + +Paragraphs +---------- +A normal paragraph. (styles: literal,verse,quote,listing, + NOTE,TIP,WARNING,IMPORTANT,CAUTION) + An indented literal + paragraph. + +Delimited blocks +---------------- +Delimiters must begin at left margin. + + ------------------- (styles: source,music,graphviz) + listing block + ------------------- + + ................... (styles: listing,verse) + literal block + ................... + + ******************* + sidebar block + ******************* + + [style, author, cite] + ___________________ (styles: quote,verse) + quote block + ___________________ + + =================== (styles: NOTE,TIP,WARNING, + example block IMPORTANT,CAUTION) + =================== + + /////////////////// + comment block + /////////////////// + + +++++++++++++++++++ (styles: pass,asciimath,latexmath) + passthrough block + +++++++++++++++++++ + + [style] (styles: abstract,partintro) + -- + open block + -- + +More block elements +------------------- + [attributes list] + .Block title + // Comment line + include::filename[] + +Tables +------ + .An example table + [width="40%",cols="^,2m",frame="topbot",options="header,footer"] + |====================== + |Column 1 |Column 2 + |1 |Item 1 + |2 |Item 2 + |3 |Item 3 + |6 |Three items + |====================== + + Common attributes: + + grid: none,cols,rows,all + frame: topbot,none,sides,all + options: header,footer + format: psv,csv,dsv + valign: top,bottom,middle + width: 1%..100% + cols: colspec[,colspec,...] + + colspec: [multiplier*][align][width][style] + multiplier: 1... + width: 1... or 1%...100% + align: [horiz][.vert] + horiz: < (left), ^ (center), > (right) + vert: < (top), ^ (middle), > (bottom) + style: d[efault], e[mphasis], m[onospaced], a[sciidoc], + s[trong], l[iteral], v[erse], h[eader] + cell: [cellspec]|data + cellspec: [span*|+][align][style] + span: [colspan][.rowspan] + colspan: 1... + rowspan: 1... + +Bulleted lists +-------------- + - item text + * item text + ** item text + *** item text + **** item text + ***** item text + + (styles: callout,bibliography) + +Numbered lists +-------------- + 1. arabic (decimal) numbering + a. loweralpha numbering + F. upperalpha numbering + iii) lowerroman numbering + IX) upperroman numbering + + . arabic (decimal) numbering + .. loweralpha numbering + ... lowerroman numbering + .... upperalpha numbering + ..... upperroman numbering + + (styles: arabic,loweralpha,upperalpha,lowerroman,upperroman) + +Labeled lists +------------- + label:: item text + label;; item text + label::: item text + label:::: item text + + (styles: horizontal,vertical,glossary,qanda,bibliograpy) + +More inline elements +-------------------- + footnote:[footnote text] (document footnote) + diff --git a/source-builder/sb/asciidoc/html4.conf b/source-builder/sb/asciidoc/html4.conf new file mode 100644 index 0000000..317d9ae --- /dev/null +++ b/source-builder/sb/asciidoc/html4.conf @@ -0,0 +1,517 @@ +# +# html4.conf +# +# Asciidoc HTML 4.01 configuration file. +# + +[miscellaneous] +outfilesuffix=.html + +[attributes] +basebackend=html +basebackend-html= +basebackend-html4= +hr=<hr> + +[replacements2] +# Line break. +(?m)^(.*)\s\+$=\1<br> + +[replacements] +ifdef::asciidoc7compatible[] +# Superscripts. +\^(.+?)\^=<sup>\1</sup> +# Subscripts. +~(.+?)~=<sub>\1</sub> +endif::asciidoc7compatible[] + +[ruler-blockmacro] +<hr> + +[pagebreak-blockmacro] +<div style="page-break-after:always"></div> + +[pi-blockmacro] +<?{target}{0? {0}}?> + +[pi-inlinemacro] +template::[pi-blockmacro] + +[image-inlinemacro] +<a href="{link}"{role? class="{role}"}> +# src attribute must be first attribute for blogpost compatibility. +{data-uri%}<img src="{imagesdir=}{imagesdir?/}{target}" style="border-width: 0; vertical-align: text-bottom;" alt="{alt={target}}"{width? width="{width}"}{height? height="{height}"}{title? title="{title}"}> +{data-uri#}<img style="border-width: 0; vertical-align: text-bottom;" alt="{alt={target}}"{width? width="{width}"}{height? height="{height}"}{title? title="{title}"} +{data-uri#}{sys:"{python}" -u -c "import mimetypes,base64,sys; print 'src=\"data:'+mimetypes.guess_type(r'{target}')[0]+';base64,'; base64.encode(sys.stdin,sys.stdout)" < "{eval:os.path.join(r"{indir={outdir}}",r"{imagesdir=}",r"{target}")}"}"> +{link#}</a> + +[image-blockmacro] +<div{align? align="{align}"}{role? class="{role}"}{float? style="float:{float};"}> +<a name="{id}"></a> +<a href="{link}"> +{data-uri%}<img src="{imagesdir=}{imagesdir?/}{target}" style="border-width: 0;" alt="{alt={target}}"{width? width="{width}"}{height? height="{height}"}> +{data-uri#}<img alt="{alt={target}}"{width? width="{width}"}{height? height="{height}"} +{data-uri#}{sys:"{python}" -u -c "import mimetypes,base64,sys; print 'src=\"data:'+mimetypes.guess_type(r'{target}')[0]+';base64,'; base64.encode(sys.stdin,sys.stdout)" < "{eval:os.path.join(r"{indir={outdir}}",r"{imagesdir=}",r"{target}")}"}"> +{link#}</a> +<p><b>{caption={figure-caption} {counter:figure-number}. }</b>{title}</p> +</div> + +[unfloat-blockmacro] +<br clear="all"> + +[indexterm-inlinemacro] +# Index term. +{empty} + +[indexterm2-inlinemacro] +# Index term. +# Single entry index term that is visible in the primary text flow. +{1} + +[footnote-inlinemacro] +# footnote:[<text>]. +<br><i>[{0}]</i><br> + +[footnoteref-inlinemacro] +# footnoteref:[<id>], create reference to footnote. +{2%}<br><i><a href="#_footnote_{1}">[{1}]</a></i><br> +# footnoteref:[<id>,<text>], create footnote with ID. +{2#}<br><i><a name="_footnote_{1}">[{2}]</a></i><br> + +[callout-inlinemacro] +# Callout. +<b><{index}></b> + +# Comment line macros. +[comment-inlinemacro] +{showcomments#}<br><span style="background:yellow;">{passtext}</span><br> + +[comment-blockmacro] +{showcomments#}<p><span style="background:yellow;">{passtext}</span></p> + +[literal-inlinemacro] +# Inline literal. +<code>{passtext}</code> + +# List tags. +[listtags-bulleted] +list={id?<a name="{id}"></a>}{title?<p><b>{title}</b></p>}<ul{role? class="{role}"}>|</ul> +item=<li>|</li> +text=<p>|</p> + +[listtags-numbered] +list={id?<a name="{id}"></a>}{title?<p><b>{title}</b></p>}<ol type="{style@arabic:1}{style@loweralpha:a}{style@upperalpha:A}{style@lowerroman:i}{style@upperroman:I}"{start? start="{start}"}{role? class="{role}"}>|</ol> +item=<li>|</li> +text=<p>|</p> + +[listtags-labeled] +list={id?<a name="{id}"></a>}{title?<p><b>{title}</b></p>}<dl{role? class="{role}"}>|</dl> +entry= +label= +term=<dt>{strong-option?<strong>}|{strong-option?</strong>}</dt> +item=<dd>|</dd> +text=<p>|</p> + +[listtags-horizontal] +list={id?<a name="{id}"></a>}{title?<p><b>{title}</b></p>}<table cellpadding="4"{role? class="{role}"}>|</table> +entry=<tr valign="top">|</tr> +label=<td{labelwidth? width="{labelwidth}%"}>{strong-option?<strong>}|{strong-option?</strong>}</td> +term=|<br> +item=<td{itemwidth? width="{itemwidth}%"}>|</td> +text=<p>|</p> + +[listtags-callout] +list={id?<a name="{id}"></a>}{title?<p><b>{title}</b></p>}<ol{role? class="{role}"}>|</ol> +item=<li>|</li> +text=<p>|</p> + +[listtags-qanda] +list={id?<a name="{id}"></a>}{title?<p><b>{title}</b></p>}<ol{role? class="{role}"}>|</ol> +entry=<li>|</li> +label= +term=<p><em>|</em></p> +item= +text=<p>|</p> + +[listtags-glossary] +list={id?<a name="{id}"></a>}{title?<p><b>{title}</b></p>}<dl{role? class="{role}"}>|</dl> +entry= +label= +term=<dt>|</dt> +item=<dd>|</dd> +text=<p>|</p> + +[listtags-bibliography] +list={id?<a name="{id}"></a>}{title?<p><b>{title}</b></p>}<ul{role? class="{role}"}>|</ul> +item=<li>|</li> +text=<p>|</p> + +[tags] +# Quoted text. +emphasis=<em>{1?<span class="{1}">}|{1?</span>}</em> +strong=<strong>{1?<span class="{1}">}|{1?</span>}</strong> +monospaced=<code>{1?<span class="{1}">}|{1?</span>}</code> +singlequoted={lsquo}{1?<span class="{1}">}|{1?</span>}{rsquo} +doublequoted={ldquo}{1?<span class="{1}">}|{1?</span>}{rdquo} +unquoted={1?<span class="{1}">}|{1?</span>} +superscript=<sup>{1?<span class="{1}">}|{1?</span>}</sup> +subscript=<sub>{1?<span class="{1}">}|{1?</span>}</sub> + +ifdef::deprecated-quotes[] +# Override with deprecated quote attributes. +emphasis={role?<span class="{role}">}<em{1,2,3? style="}{1?color:{1};}{2?background-color:{2};}{3?font-size:{3}em;}{1,2,3?"}>|</em>{role?</span>} +strong={role?<span class="{role}">}<strong{1,2,3? style="}{1?color:{1};}{2?background-color:{2};}{3?font-size:{3}em;}{1,2,3?"}>|</strong>{role?</span>} +monospaced={role?<span class="{role}">}<code{1,2,3? style="}{1?color:{1};}{2?background-color:{2};}{3?font-size:{3}em;}{1,2,3?"}>|</code>{role?</span>} +singlequoted={role?<span class="{role}">}{1,2,3?<span style="}{1?color:{1};}{2?background-color:{2};}{3?font-size:{3}em;}{1,2,3?">}{amp}#8216;|{amp}#8217;{1,2,3?</span>}{role?</span>} +doublequoted={role?<span class="{role}">}{1,2,3?<span style="}{1?color:{1};}{2?background-color:{2};}{3?font-size:{3}em;}{1,2,3?">}{amp}#8220;|{amp}#8221;{1,2,3?</span>}{role?</span>} +unquoted={role?<span class="{role}">}{1,2,3?<span style="{1?color:{1};}{2?background-color:{2};}{3?font-size:{3}em;}">}|{1,2,3?</span>}{role?</span>} +superscript={role?<span class="{role}">}<sup{1,2,3? style="}{1?color:{1};}{2?background-color:{2};}{3?font-size:{3}em;}{1,2,3?"}>|</sup>{role?</span>} +subscript={role?<span class="{role}">}<sub{1,2,3? style="}{1?color:{1};}{2?background-color:{2};}{3?font-size:{3}em;}{1,2,3?"}>|</sub>{role?</span>} +endif::deprecated-quotes[] + +# Inline macros +[http-inlinemacro] +<a href="{name}:{target}">{0={name}:{target}}</a> +[https-inlinemacro] +<a href="{name}:{target}">{0={name}:{target}}</a> +[ftp-inlinemacro] +<a href="{name}:{target}">{0={name}:{target}}</a> +[file-inlinemacro] +<a href="{name}:{target}">{0={name}:{target}}</a> +[irc-inlinemacro] +<a href="{name}:{target}">{0={name}:{target}}</a> +[mailto-inlinemacro] +<a href="mailto:{target}">{0={target}}</a> +[callto-inlinemacro] +<a href="{name}:{target}">{0={target}}</a> +[link-inlinemacro] +<a href="{target}">{0={target}}</a> +# anchor:id[text] +[anchor-inlinemacro] +<a name="{target}"></a> +# [[id,text]] +[anchor2-inlinemacro] +<a name="{1}"></a> +# [[[id]]] +[anchor3-inlinemacro] +<a name="{1}"></a>[{1}] +# xref:id[text] +[xref-inlinemacro] +<a href="#{target}">{0=[{target}]}</a> +# <<id,text>> +[xref2-inlinemacro] +<a href="#{1}">{2=[{1}]}</a> + +# Special word substitution. +[emphasizedwords] +<em>{words}</em> +[monospacedwords] +<code>{words}</code> +[strongwords] +<strong>{words}</strong> + +# Paragraph substitution. +[paragraph] +<p{role? class="{role}"}>{id?<a name="{id}"></a>}{title?<b>{title}</b><br>} +| +</p> + +[admonitionparagraph] +template::[admonitionblock] + +# Delimited blocks. +[passthroughblock] +| + +[listingblock] +<a name="{id}"></a> +<p><b>{title}</b></p> +<table border="0" bgcolor="#e8e8e8" width="100%" cellpadding="4"{role? class="{role}"}><tr><td> +<pre><code> +| +</code></pre> +</td></tr></table> + +[literalblock] +<a name="{id}"></a> +<p><b>{title}</b></p> +<pre{role? class="{role}"}><code> +| +</code></pre> + +[sidebarblock] +<a name="{id}"></a> +<table frame="border" bgcolor="#ffffee" width="100%" cellpadding="4"{role? class="{role}"}> +<tr><td> +<p><em>{title}</em></p> +| +</td></tr></table> + +[openblock] +<div{id? id="{id}"}{role? class="{role}"}> +<p><b>{title}</b></p> +| +</div> + +[partintroblock] +template::[openblock] + +[abstractblock] +template::[quoteblock] + +[quoteblock] +<a name="{id}"></a> +<blockquote{role? class="{role}"}> +<p><b>{title}</b></p> +| +<p align="right"> +<em>{citetitle}</em>{attribution?<br>} +— {attribution} +</p> +</blockquote> + +[verseblock] +<a name="{id}"></a> +<blockquote{role? class="{role}"}> +<p><b>{title}</b></p> +# Font inheritance broken in IE6. +<pre style="font-family: inherit;"> +| +</pre> +<p align="left"> +<em>{citetitle}</em>{attribution?<br>} +— {attribution} +</p> +</blockquote> + +[exampleblock] +<a name="{id}"></a> +<table frame="void" width="100%" cellpadding="4"{role? class="{role}"}> +<tr><td style="border-left: 2px solid silver;"> +| +</td></tr></table> +<p><b>{caption={example-caption} {counter:example-number}. }</b>{title}</p> + +[admonitionblock] +<a name="{id}"></a> +<table frame="void" cellpadding="4"{role? class="{role}"}> +<tr valign="top"> +<td> +{data-uri%}{icons#}<img src="{icon={iconsdir}/{name}.png}" alt="{caption}"> +{data-uri#}{icons#}<img alt="{caption}" src="data:image/png;base64, +{data-uri#}{icons#}{sys:"{python}" -u -c "import base64,sys; base64.encode(sys.stdin,sys.stdout)" < "{eval:os.path.join(r"{indir={outdir}}",r"{icon={iconsdir}/{name}.png}")}"}"> +{icons%}<p><b><u>{caption}</u></b></p> +</td> +<td style="border-left: 1px solid silver;"> +<p><b>{title}</b></p> +| +</td></tr></table> + +[mathblock] +# Here to suppress missing block warning (html4 does not include math +# JavaScripts). +<a name="{id}"></a> +<p><b>{title}</b></p> +<div{role? class="{role}"}> +| +</div> + +# Tables. +[tabletags-default] +bodyrow=<tr>|</tr> +headdata=<th {colspan@1::colspan="{colspan}" }{rowspan@1::rowspan="{rowspan}" }align="{halign}"{autowidth-option! width="{colpcwidth}%"} valign="{valign}">|</th> +footdata=<td {colspan@1::colspan="{colspan}" }{rowspan@1::rowspan="{rowspan}" }align="{halign}"{autowidth-option! width="{colpcwidth}%"} style="font-weight:bold" valign="{valign}">|</td> +bodydata=<td {colspan@1::colspan="{colspan}" }{rowspan@1::rowspan="{rowspan}" }align="{halign}"{autowidth-option! width="{colpcwidth}%"} valign="{valign}">|</td> +paragraph=<p>|</p> + +[tabletags-header] +paragraph=<p><strong>|</strong></p> + +[tabletags-emphasis] +paragraph=<p><em>|</em></p> + +[tabletags-strong] +paragraph=<p><strong>|</strong></p> + +[tabletags-monospaced] +paragraph=<p><code>|</code></p> + +[tabletags-verse] +bodydata=<td {colspan@1::colspan="{colspan}" }{rowspan@1::rowspan="{rowspan}" }align="{halign}"{autowidth-option! width="{colpcwidth}%"} valign="{valign}"><pre style="font-family: inherit;">|</pre></td> +paragraph= + +[tabletags-literal] +bodydata=<td {colspan@1::colspan="{colspan}" }{rowspan@1::rowspan="{rowspan}" }align="{halign}"{autowidth-option! width="{colpcwidth}%"} valign="{valign}"><pre><code>|</code></pre></td> +paragraph= + +[tabletags-asciidoc] +bodydata=<td {colspan@1::colspan="{colspan}" }{rowspan@1::rowspan="{rowspan}" }align="{halign}"{autowidth-option! width="{colpcwidth}%"} valign="{valign}"><div>|</div></td> +paragraph= + +[table] +<div{align? align="{align}"}{role? class="{role}"}> +<a name="{id}"></a> +<table rules="{grid=all}" +style="float:{float};" +{autowidth-option%}width="{tablepcwidth}%" +{autowidth-option#}{width#width="{tablepcwidth}%"} +frame="{frame%border}" +frame="{frame@topbot:hsides}{frame@all:border}{frame@none:void}{frame@sides:vsides}" +cellspacing="0" cellpadding="4"> +{headrows#}<thead> +{headrows} +{headrows#}</thead> +{footrows#}<tfoot> +{footrows} +{footrows#}</tfoot> +<tbody> +{bodyrows} +</tbody> +</table> +<p><b>{caption={table-caption} {counter:table-number}. }</b>{title}</p> +</div> + +#-------------------------------------------------------------------- +# Deprecated old table definitions. +# + +[miscellaneous] +# Screen width in pixels. +pagewidth=800 +pageunits= + +[old_tabledef-default] +template=old_table +bodyrow=<tr>|</tr> +headdata=<th align="{colalign}" width="{colwidth}{pageunits}">|</th> +footdata=<td align="{colalign}" width="{colwidth}{pageunits}"><strong>|</strong></td> +bodydata=<td align="{colalign}" width="{colwidth}{pageunits}" valign="top">|</td> + +[old_table] +<p><b>{caption={table-caption}}</b>{title}</p> +<a name="{id}"></a> +<table rules="{grid=none}" +frame="{frame%hsides}" +frame="{frame@topbot:hsides}{frame@all:border}{frame@none:void}{frame@sides:vsides}" +cellspacing="0" cellpadding="4"> +{headrows#}<thead> +{headrows} +{headrows#}</thead> +{footrows#}<tfoot> +{footrows} +{footrows#}</tfoot> +<tbody> +{bodyrows} +</tbody> +</table> + +# End of deprecated old table definitions. +#-------------------------------------------------------------------- + +[floatingtitle] +<h{level@1:2}{level@2:3}{level@3:4}{level@4:5}>{id?<a name="{id}"></a>}{title}</h{level@1:2}{level@2:3}{level@3:4}{level@4:5}> + +[preamble] +# Untitled elements between header and first section title. +<a name="preamble"></a> +| + +[sect0] +{doctype-manpage%}{hr} +<h1>{id?<a name="{id}"></a>}{title}</h1> +| + +[sect1] +{doctype-manpage%}{hr} +<h2{role? class="{role}"}>{id?<a name="{id}"></a>}{numbered?{sectnum} }{title}</h2> +| + +[sect2] +<h3{role? class="{role}"}>{id?<a name="{id}"></a>}{numbered?{sectnum} }{title}</h3> +| + +[sect3] +<h4{role? class="{role}"}>{id?<a name="{id}"></a>}{numbered?{sectnum} }{title}</h4> +| + +[sect4] +<h5{role? class="{role}"}>{id?<a name="{id}"></a>}{title}</h5> +| + +[appendix] +{hr} +<h2{role? class="{role}"}>{id?<a name="{id}"></a>}{numbered?{sectnum} }{appendix-caption} {counter:appendix-number:A}: {title}</h2> +| + +[footer] +<p></p> +<p></p> +<hr><p><small> +template::[footer-text] +</small></p> +</body> +</html> + +[header-declarations] +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset={encoding}"> +<meta name="generator" content="AsciiDoc {asciidoc-version}"> +<meta name="description" content="{description}"> +<meta name="keywords" content="{keywords}"> +<title>{title}</title> +{title%}<title>{doctitle=}</title> +{docinfo1,docinfo2#}{include:{docdir}/docinfo.html} +{docinfo,docinfo2#}{include:{docdir}/{docname}-docinfo.html} +template::[docinfo] +</head> + +#-------------------------------- +# article and book document types +#-------------------------------- +ifndef::doctype-manpage[] + +[header] +template::[header-declarations] +<body> +{notitle%}<h1>{doctitle}</h1> +{doctitle#}<p> +{doctitle#}<strong>{author}</strong><br> +{doctitle#}<code><<a href="mailto:{email}">{email}</a>></code><br> +{doctitle#}version {revnumber}{revdate?,} +{doctitle#}{revdate} +{doctitle#}<br>{revremark} +{doctitle#}</p> + +endif::doctype-manpage[] + +#------------------------- +# manpage document type +#------------------------- +ifdef::doctype-manpage[] + +[tags] +# This is more inline with man page convention. +emphasis=<b>|</b> +vlistterm=<dt><b>|</b></dt> + +[header] +template::[header-declarations] +<body> +{hr} +<h1> + {doctitle} Manual Page +</h1> +{hr} + +[name] +<h2>{manname-title}</h2> +<p>{manname} - + {manpurpose} +</p> + +[synopsis] +template::[sect1] + +endif::doctype-manpage[] diff --git a/source-builder/sb/asciidoc/html5.conf b/source-builder/sb/asciidoc/html5.conf new file mode 100644 index 0000000..dbd8164 --- /dev/null +++ b/source-builder/sb/asciidoc/html5.conf @@ -0,0 +1,695 @@ +# +# html5.conf +# +# Asciidoc configuration file. +# html5 backend. +# + +[miscellaneous] +outfilesuffix=.html + +[attributes] +basebackend=html +basebackend-html= +basebackend-html5= + +[replacements2] +# Line break. +(?m)^(.*)\s\+$=\1<br> + +[replacements] +ifdef::asciidoc7compatible[] +# Superscripts. +\^(.+?)\^=<sup>\1</sup> +# Subscripts. +~(.+?)~=<sub>\1</sub> +endif::asciidoc7compatible[] + +[ruler-blockmacro] +<hr> + +[pagebreak-blockmacro] +<div style="page-break-after:always"></div> + +[blockdef-pass] +asciimath-style=template="asciimathblock",subs=() +latexmath-style=template="latexmathblock",subs=() + +[macros] +(?u)^(?P<name>audio|video)::(?P<target>\S*?)(\[(?P<attrlist>.*?)\])$=# +# math macros. +# Special characters are escaped in HTML math markup. +(?su)[\\]?(?P<name>asciimath|latexmath):(?P<subslist>\S*?)\[(?P<passtext>.*?)(?<!\\)\]=[specialcharacters] +(?u)^(?P<name>asciimath|latexmath)::(?P<subslist>\S*?)(\[(?P<passtext>.*?)\])$=#[specialcharacters] + +[asciimath-inlinemacro] +`{passtext}` + +[asciimath-blockmacro] +<div class="mathblock{role? {role}}{unbreakable-option? unbreakable}"{id? id="{id}"}> +<div class="content"> +<div class="title">{title}</div> +`{passtext}` +</div></div> + +[asciimathblock] +<div class="mathblock{role? {role}}{unbreakable-option? unbreakable}"{id? id="{id}"}> +<div class="content"> +<div class="title">{title}</div> +`|` +</div></div> + +[latexmath-inlinemacro] +{passtext} + +[latexmath-blockmacro] +<div class="mathblock{role? {role}}{unbreakable-option? unbreakable}"{id? id="{id}"}> +<div class="content"> +<div class="title">{title}</div> +{passtext} +</div></div> + +[latexmathblock] +<div class="mathblock{role? {role}}{unbreakable-option? unbreakable}"{id? id="{id}"}> +<div class="content"> +<div class="title">{title}</div> +| +</div></div> + +[image-inlinemacro] +<span class="image{role? {role}}"> +<a class="image" href="{link}"> +{data-uri%}<img src="{imagesdir=}{imagesdir?/}{target}" alt="{alt={target}}"{width? width="{width}"}{height? height="{height}"}{title? title="{title}"}> +{data-uri#}<img alt="{alt={target}}"{width? width="{width}"}{height? height="{height}"}{title? title="{title}"} +{data-uri#}{sys:"{python}" -u -c "import mimetypes,base64,sys; print 'src=\"data:'+mimetypes.guess_type(r'{target}')[0]+';base64,'; base64.encode(sys.stdin,sys.stdout)" < "{eval:os.path.join(r"{indir={outdir}}",r"{imagesdir=}",r"{target}")}"}"> +{link#}</a> +</span> + +[image-blockmacro] +<div class="imageblock{style? {style}}{role? {role}}{unbreakable-option? unbreakable}"{id? id="{id}"}{align? style="text-align:{align};"}{float? style="float:{float};"}> +<div class="content"> +<a class="image" href="{link}"> +{data-uri%}<img src="{imagesdir=}{imagesdir?/}{target}" alt="{alt={target}}"{width? width="{width}"}{height? height="{height}"}> +{data-uri#}<img alt="{alt={target}}"{width? width="{width}"}{height? height="{height}"} +{data-uri#}{sys:"{python}" -u -c "import mimetypes,base64,sys; print 'src=\"data:'+mimetypes.guess_type(r'{target}')[0]+';base64,'; base64.encode(sys.stdin,sys.stdout)" < "{eval:os.path.join(r"{indir={outdir}}",r"{imagesdir=}",r"{target}")}"}"> +{link#}</a> +</div> +<div class="title">{caption={figure-caption} {counter:figure-number}. }{title}</div> +</div> + +[audio-blockmacro] +<div class="audioblock{role? {role}}{unbreakable-option? unbreakable}"{id? id="{id}"}> +<div class="title">{caption=}{title}</div> +<div class="content"> +<audio src="{imagesdir=}{imagesdir?/}{target}"{autoplay-option? autoplay}{nocontrols-option! controls}{loop-option? loop}> +Your browser does not support the audio tag. +</audio> +</div></div> + +[video-blockmacro] +<div class="videoblock{role? {role}}{unbreakable-option? unbreakable}"{id? id="{id}"}> +<div class="title">{caption=}{title}</div> +<div class="content"> +<video src="{imagesdir=}{imagesdir?/}{target}"{width? width="{width}"}{height? height="{height}"}{poster? poster="{poster}"}{autoplay-option? autoplay}{nocontrols-option! controls}{loop-option? loop}> +Your browser does not support the video tag. +</video> +</div></div> + +[unfloat-blockmacro] +<div style="clear:both;"></div> + +[toc-blockmacro] +template::[toc] + +[indexterm-inlinemacro] +# Index term. +{empty} + +[indexterm2-inlinemacro] +# Index term. +# Single entry index term that is visible in the primary text flow. +{1} + +[footnote-inlinemacro] +# footnote:[<text>]. +<span class="footnote"><br>[{0}]<br></span> + +[footnoteref-inlinemacro] +# footnoteref:[<id>], create reference to footnote. +{2%}<span class="footnoteref"><br><a href="#_footnote_{1}">[{1}]</a><br></span> +# footnoteref:[<id>,<text>], create footnote with ID. +{2#}<span class="footnote" id="_footnote_{1}"><br>[{2}]<br></span> + +[callout-inlinemacro] +ifndef::icons[] +<b><{index}></b> +endif::icons[] +ifdef::icons[] +ifndef::data-uri[] +<img src="{icon={iconsdir}/callouts/{index}.png}" alt="{index}"> +endif::data-uri[] +ifdef::data-uri[] +<img alt="{index}" src="data:image/png;base64, +{sys:"{python}" -u -c "import base64,sys; base64.encode(sys.stdin,sys.stdout)" < "{eval:os.path.join(r"{indir={outdir}}",r"{icon={iconsdir}/callouts/{index}.png}")}"}"> +endif::data-uri[] +endif::icons[] + +# Comment line macros. +[comment-inlinemacro] +{showcomments#}<br><span class="comment">{passtext}</span><br> + +[comment-blockmacro] +{showcomments#}<p><span class="comment">{passtext}</span></p> + +[literal-inlinemacro] +# Inline literal. +<span class="monospaced">{passtext}</span> + +# List tags. +[listtags-bulleted] +list=<div class="ulist{style? {style}}{compact-option? compact}{role? {role}}"{id? id="{id}"}>{title?<div class="title">{title}</div>}<ul>|</ul></div> +item=<li>|</li> +text=<p>|</p> + +[listtags-numbered] +# The start attribute is not valid XHTML 1.1 but all browsers support it. +list=<div class="olist{style? {style}}{compact-option? compact}{role? {role}}"{id? id="{id}"}>{title?<div class="title">{title}</div>}<ol class="{style}"{start? start="{start}"}>|</ol></div> +item=<li>|</li> +text=<p>|</p> + +[listtags-labeled] +list=<div class="dlist{compact-option? compact}{role? {role}}"{id? id="{id}"}>{title?<div class="title">{title}</div>}<dl>|</dl></div> +entry= +label= +term=<dt class="hdlist1{strong-option? strong}">|</dt> +item=<dd>|</dd> +text=<p>|</p> + +[listtags-horizontal] +list=<div class="hdlist{compact-option? compact}{role? {role}}"{id? id="{id}"}>{title?<div class="title">{title}</div>}<table>{labelwidth?<col width="{labelwidth}%">}{itemwidth?<col width="{itemwidth}%">}|</table></div> +label=<td class="hdlist1{strong-option? strong}">|</td> +term=|<br> +entry=<tr>|</tr> +item=<td class="hdlist2">|</td> +text=<p style="margin-top: 0;">|</p> + +[listtags-qanda] +list=<div class="qlist{style? {style}}{role? {role}}"{id? id="{id}"}>{title?<div class="title">{title}</div>}<ol>|</ol></div> +entry=<li>|</li> +label= +term=<p><em>|</em></p> +item= +text=<p>|</p> + +[listtags-callout] +ifndef::icons[] +list=<div class="colist{style? {style}}{role? {role}}"{id? id="{id}"}>{title?<div class="title">{title}</div>}<ol>|</ol></div> +item=<li>|</li> +text=<p>|</p> +endif::icons[] +ifdef::icons[] +list=<div class="colist{style? {style}}{role? {role}}"{id? id="{id}"}>{title?<div class="title">{title}</div>}<table>|</table></div> +ifndef::data-uri[] +item=<tr><td><img src="{iconsdir}/callouts/{listindex}.png" alt="{listindex}"></td><td>|</td></tr> +endif::data-uri[] +ifdef::data-uri[] +item=<tr><td><img alt="{listindex}" src="data:image/png;base64, {sys:"{python}" -u -c "import base64,sys; base64.encode(sys.stdin,sys.stdout)" < "{eval:os.path.join(r"{indir={outdir}}",r"{icon={iconsdir}/callouts/{listindex}.png}")}"}"></td><td>|</td></tr> +endif::data-uri[] +text=| +endif::icons[] + +[listtags-glossary] +list=<div class="dlist{style? {style}}{role? {role}}"{id? id="{id}"}>{title?<div class="title">{title}</div>}<dl>|</dl></div> +label= +entry= +term=<dt>|</dt> +item=<dd>|</dd> +text=<p>|</p> + +[listtags-bibliography] +list=<div class="ulist{style? {style}}{role? {role}}"{id? id="{id}"}>{title?<div class="title">{title}</div>}<ul>|</ul></div> +item=<li>|</li> +text=<p>|</p> + +[tags] +# Quoted text. +emphasis=<em>{1?<span class="{1}">}|{1?</span>}</em> +strong=<strong>{1?<span class="{1}">}|{1?</span>}</strong> +monospaced=<span class="monospaced{1? {1}}">|</span> +singlequoted={lsquo}{1?<span class="{1}">}|{1?</span>}{rsquo} +doublequoted={ldquo}{1?<span class="{1}">}|{1?</span>}{rdquo} +unquoted={1?<span class="{1}">}|{1?</span>} +superscript=<sup>{1?<span class="{1}">}|{1?</span>}</sup> +subscript=<sub>{1?<span class="{1}">}|{1?</span>}</sub> + +ifdef::deprecated-quotes[] +# Override with deprecated quote attributes. +emphasis={role?<span class="{role}">}<em{1,2,3? style="}{1?color:{1};}{2?background-color:{2};}{3?font-size:{3}em;}{1,2,3?"}>|</em>{role?</span>} +strong={role?<span class="{role}">}<strong{1,2,3? style="}{1?color:{1};}{2?background-color:{2};}{3?font-size:{3}em;}{1,2,3?"}>|</strong>{role?</span>} +monospaced=<span class="monospaced{role? {role}}"{1,2,3? style="}{1?color:{1};}{2?background-color:{2};}{3?font-size:{3}em;}{1,2,3?"}>|</span> +singlequoted={role?<span class="{role}">}{1,2,3?<span style="}{1?color:{1};}{2?background-color:{2};}{3?font-size:{3}em;}{1,2,3?">}{amp}#8216;|{amp}#8217;{1,2,3?</span>}{role?</span>} +doublequoted={role?<span class="{role}">}{1,2,3?<span style="}{1?color:{1};}{2?background-color:{2};}{3?font-size:{3}em;}{1,2,3?">}{amp}#8220;|{amp}#8221;{1,2,3?</span>}{role?</span>} +unquoted={role?<span class="{role}">}{1,2,3?<span style="{1?color:{1};}{2?background-color:{2};}{3?font-size:{3}em;}">}|{1,2,3?</span>}{role?</span>} +superscript={role?<span class="{role}">}<sup{1,2,3? style="}{1?color:{1};}{2?background-color:{2};}{3?font-size:{3}em;}{1,2,3?"}>|</sup>{role?</span>} +subscript={role?<span class="{role}">}<sub{1,2,3? style="}{1?color:{1};}{2?background-color:{2};}{3?font-size:{3}em;}{1,2,3?"}>|</sub>{role?</span>} +endif::deprecated-quotes[] + +# Inline macros +[http-inlinemacro] +<a href="{name}:{target}">{0={name}:{target}}</a> +[https-inlinemacro] +<a href="{name}:{target}">{0={name}:{target}}</a> +[ftp-inlinemacro] +<a href="{name}:{target}">{0={name}:{target}}</a> +[file-inlinemacro] +<a href="{name}:{target}">{0={name}:{target}}</a> +[irc-inlinemacro] +<a href="{name}:{target}">{0={name}:{target}}</a> +[mailto-inlinemacro] +<a href="mailto:{target}">{0={target}}</a> +[link-inlinemacro] +<a href="{target}">{0={target}}</a> +[callto-inlinemacro] +<a href="{name}:{target}">{0={target}}</a> +# anchor:id[text] +[anchor-inlinemacro] +<a id="{target}"></a> +# [[id,text]] +[anchor2-inlinemacro] +<a id="{1}"></a> +# [[[id]]] +[anchor3-inlinemacro] +<a id="{1}"></a>[{1}] +# xref:id[text] +[xref-inlinemacro] +<a href="#{target}">{0=[{target}]}</a> +# <<id,text>> +[xref2-inlinemacro] +<a href="#{1}">{2=[{1}]}</a> + +# Special word substitution. +[emphasizedwords] +<em>{words}</em> +[monospacedwords] +<span class="monospaced">{words}</span> +[strongwords] +<strong>{words}</strong> + +# Paragraph substitution. +[paragraph] +<div class="paragraph{role? {role}}{unbreakable-option? unbreakable}"{id? id="{id}"}>{title?<div class="title">{title}</div>}<p> +| +</p></div> + +[admonitionparagraph] +template::[admonitionblock] + +# Delimited blocks. +[listingblock] +<div class="listingblock{role? {role}}{unbreakable-option? unbreakable}"{id? id="{id}"}> +<div class="title">{caption=}{title}</div> +<div class="content monospaced"> +<pre> +| +</pre> +</div></div> + +[literalblock] +<div class="literalblock{role? {role}}{unbreakable-option? unbreakable}"{id? id="{id}"}> +<div class="title">{title}</div> +<div class="content monospaced"> +<pre> +| +</pre> +</div></div> + +[sidebarblock] +<div class="sidebarblock{role? {role}}{unbreakable-option? unbreakable}"{id? id="{id}"}> +<div class="content"> +<div class="title">{title}</div> +| +</div></div> + +[openblock] +<div class="openblock{role? {role}}{unbreakable-option? unbreakable}"{id? id="{id}"}> +<div class="title">{title}</div> +<div class="content"> +| +</div></div> + +[partintroblock] +template::[openblock] + +[abstractblock] +template::[quoteblock] + +[quoteblock] +<div class="quoteblock{role? {role}}{unbreakable-option? unbreakable}"{id? id="{id}"}> +<div class="title">{title}</div> +<div class="content"> +| +</div> +<div class="attribution"> +<em>{citetitle}</em>{attribution?<br>} +— {attribution} +</div></div> + +[verseblock] +<div class="verseblock{role? {role}}{unbreakable-option? unbreakable}"{id? id="{id}"}> +<div class="title">{title}</div> +<pre class="content"> +| +</pre> +<div class="attribution"> +<em>{citetitle}</em>{attribution?<br>} +— {attribution} +</div></div> + +[exampleblock] +<div class="exampleblock{role? {role}}{unbreakable-option? unbreakable}"{id? id="{id}"}> +<div class="title">{caption={example-caption} {counter:example-number}. }{title}</div> +<div class="content"> +| +</div></div> + +[admonitionblock] +<div class="admonitionblock{role? {role}}{unbreakable-option? unbreakable}"{id? id="{id}"}> +<table><tr> +<td class="icon"> +{data-uri%}{icons#}<img src="{icon={iconsdir}/{name}.png}" alt="{caption}"> +{data-uri#}{icons#}<img alt="{caption}" src="data:image/png;base64, +{data-uri#}{icons#}{sys:"{python}" -u -c "import base64,sys; base64.encode(sys.stdin,sys.stdout)" < "{eval:os.path.join(r"{indir={outdir}}",r"{icon={iconsdir}/{name}.png}")}"}"> +{icons%}<div class="title">{caption}</div> +</td> +<td class="content"> +<div class="title">{title}</div> +| +</td> +</tr></table> +</div> + +# Tables. +[tabletags-default] +colspec=<col{autowidth-option! style="width:{colpcwidth}%;"}> +bodyrow=<tr>|</tr> +headdata=<th class="tableblock halign-{halign=left} valign-{valign=top}" {colspan@1::colspan="{colspan}" }{rowspan@1::rowspan="{rowspan}" }>|</th> +bodydata=<td class="tableblock halign-{halign=left} valign-{valign=top}" {colspan@1::colspan="{colspan}" }{rowspan@1::rowspan="{rowspan}" }>|</td> +paragraph=<p class="tableblock">|</p> + +[tabletags-header] +paragraph=<p class="tableblock header">|</p> + +[tabletags-emphasis] +paragraph=<p class="tableblock"><em>|</em></p> + +[tabletags-strong] +paragraph=<p class="tableblock"><strong>|</strong></p> + +[tabletags-monospaced] +paragraph=<p class="tableblock monospaced">|</p> + +[tabletags-verse] +bodydata=<td class="tableblock halign-{halign=left} valign-{valign=top}" {colspan@1::colspan="{colspan}" }{rowspan@1::rowspan="{rowspan}" }><div class="verse">|</div></td> +paragraph= + +[tabletags-literal] +bodydata=<td class="tableblock halign-{halign=left} valign-{valign=top}" {colspan@1::colspan="{colspan}" }{rowspan@1::rowspan="{rowspan}" }><div class="literal monospaced"><pre>|</pre></div></td> +paragraph= + +[tabletags-asciidoc] +bodydata=<td class="tableblock halign-{halign=left} valign-{valign=top}" {colspan@1::colspan="{colspan}" }{rowspan@1::rowspan="{rowspan}" }><div>|</div></td> +paragraph= + +[table] +<table class="tableblock frame-{frame=all} grid-{grid=all}{role? {role}}{unbreakable-option? unbreakable}"{id? id="{id}"} +style=" +margin-left:{align@left:0}{align@center|right:auto}; margin-right:{align@left|center:auto}{align@right:0}; +float:{float}; +{autowidth-option%}width:{tablepcwidth}%; +{autowidth-option#}{width#style=width:{tablepcwidth}%;} +"> +<caption class="title">{caption={table-caption} {counter:table-number}. }{title}</caption> +{colspecs} +{headrows#}<thead> +{headrows} +{headrows#}</thead> +{footrows#}<tfoot> +{footrows} +{footrows#}</tfoot> +<tbody> +{bodyrows} +</tbody> +</table> + +#-------------------------------------------------------------------- +# Deprecated old table definitions. +# + +[miscellaneous] +# Screen width in pixels. +pagewidth=800 +pageunits=px + +[old_tabledef-default] +template=old_table +colspec=<col style="width:{colwidth}{pageunits};" /> +bodyrow=<tr>|</tr> +headdata=<th class="tableblock halign-{colalign=left}">|</th> +footdata=<td class="tableblock halign-{colalign=left}">|</td> +bodydata=<td class="tableblock halign-{colalign=left}">|</td> + +[old_table] +<table class="tableblock frame-{frame=all} grid-{grid=all}"{id? id="{id}"}> +<caption class="title">{caption={table-caption}}{title}</caption> +{colspecs} +{headrows#}<thead> +{headrows} +{headrows#}</thead> +{footrows#}<tfoot> +{footrows} +{footrows#}</tfoot> +<tbody style="vertical-align:top;"> +{bodyrows} +</tbody> +</table> + +# End of deprecated old table definitions. +#-------------------------------------------------------------------- + +[floatingtitle] +<h{level@0:1}{level@1:2}{level@2:3}{level@3:4}{level@4:5}{id? id="{id}"} class="float">{title}</h{level@0:1}{level@1:2}{level@2:3}{level@3:4}{level@4:5}> + +[preamble] +# Untitled elements between header and first section title. +<div id="preamble"> +<div class="sectionbody"> +| +</div> +</div> + +# Document sections. +[sect0] +<h1{id? id="{id}"}>{title}</h1> +| + +[sect1] +<div class="sect1{style? {style}}{role? {role}}"> +<h2{id? id="{id}"}>{numbered?{sectnum} }{title}</h2> +<div class="sectionbody"> +| +</div> +</div> + +[sect2] +<div class="sect2{style? {style}}{role? {role}}"> +<h3{id? id="{id}"}>{numbered?{sectnum} }{title}</h3> +| +</div> + +[sect3] +<div class="sect3{style? {style}}{role? {role}}"> +<h4{id? id="{id}"}>{numbered?{sectnum} }{title}</h4> +| +</div> + +[sect4] +<div class="sect4{style? {style}}{role? {role}}"> +<h5{id? id="{id}"}>{title}</h5> +| +</div> + +[appendix] +<div class="sect1{style? {style}}{role? {role}}"> +<h2{id? id="{id}"}>{numbered?{sectnum} }{appendix-caption} {counter:appendix-number:A}: {title}</h2> +<div class="sectionbody"> +| +</div> +</div> + +[toc] +<div id="toc"> + <div id="toctitle">{toc-title}</div> + <noscript><p><b>JavaScript must be enabled in your browser to display the table of contents.</b></p></noscript> +</div> + +[header] +<!DOCTYPE html> +<html lang="{lang=en}"> +<head> +<meta http-equiv="Content-Type" content="text/html; charset={encoding}"> +<meta name="generator" content="AsciiDoc {asciidoc-version}"> +<meta name="description" content="{description}"> +<meta name="keywords" content="{keywords}"> +<title>{title}</title> +{title%}<title>{doctitle=}</title> +ifdef::linkcss[] +<link rel="stylesheet" href="{stylesdir=.}/{theme=asciidoc}.css" type="text/css"> +ifeval::["{source-highlighter}"=="pygments"] +<link rel="stylesheet" href="{stylesdir=.}/pygments.css" type="text/css"> +endif::[] + +# DEPRECATED: 'pygments' attribute. +ifdef::pygments[<link rel="stylesheet" href="{stylesdir=.}/pygments.css" type="text/css">] + +ifdef::toc2[<link rel="stylesheet" href="{stylesdir=.}/toc2.css" type="text/css" />] +<link rel="stylesheet" href="{stylesdir=.}/{stylesheet}" type="text/css"> +endif::linkcss[] +ifndef::linkcss[] +<style type="text/css"> +include1::{theme%}{stylesdir=./stylesheets}/asciidoc.css[] +include1::{themedir}/{theme}.css[] +ifeval::["{source-highlighter}"=="pygments"] +include1::{stylesdir=./stylesheets}/pygments.css[] +endif::[] + +# DEPRECATED: 'pygments' attribute. +ifdef::pygments[] +include1::{stylesdir=./stylesheets}/pygments.css[] +endif::pygments[] + +ifdef::toc2[] +include1::{stylesdir=./stylesheets}/toc2.css[] +endif::toc2[] +include1::{stylesheet}[] +</style> +endif::linkcss[] +ifndef::disable-javascript[] +ifdef::linkcss[] +<script type="text/javascript" src="{scriptsdir=.}/asciidoc.js"></script> +<script type="text/javascript" src="{scriptsdir=.}/{theme}.js"></script> +<script type="text/javascript"> +#TODO: Escape not necessary in HTML5? +# Escape as CDATA to pass validators. +/*<![CDATA[*/ +asciidoc.install({toc,toc2?{toclevels}}); +/*]]>*/ +</script> +endif::linkcss[] +ifndef::linkcss[] +<script type="text/javascript"> +# Escape as CDATA to pass validators. +/*<![CDATA[*/ +include1::{scriptsdir=./javascripts}/asciidoc.js[] +include1::{themedir}/{theme}.js[warnings=False] +asciidoc.install({toc,toc2?{toclevels}}); +/*]]>*/ +</script> +endif::linkcss[] +endif::disable-javascript[] +ifdef::asciimath[] +ifdef::linkcss[] +<script type="text/javascript" src="{scriptsdir=.}/ASCIIMathML.js"></script> +endif::linkcss[] +ifndef::linkcss[] +<script type="text/javascript"> +# Escape as CDATA to pass validators. +/*<![CDATA[*/ +include1::{scriptsdir=./javascripts}/ASCIIMathML.js[] +/*]]>*/ +</script> +endif::linkcss[] +endif::asciimath[] +ifdef::latexmath[] +ifdef::linkcss[] +<script type="text/javascript" src="{scriptsdir=.}/LaTeXMathML.js"></script> +endif::linkcss[] +ifndef::linkcss[] +<script type="text/javascript"> +# Escape as CDATA to pass validators. +/*<![CDATA[*/ +include1::{scriptsdir=./javascripts}/LaTeXMathML.js[] +/*]]>*/ +</script> +endif::linkcss[] +endif::latexmath[] +{docinfo1,docinfo2#}{include:{docdir}/docinfo.html} +{docinfo,docinfo2#}{include:{docdir}/{docname}-docinfo.html} +template::[docinfo] +</head> +<body class="{doctype}"{max-width? style="max-width:{max-width}"}{css-signature? id="{css-signature}"}> +# Article, book header. +ifndef::doctype-manpage[] +<div id="header"> +ifndef::notitle[<h1>{doctitle}</h1>] +ifdef::doctitle[] +<span id="author">{author}</span><br> +<span id="email" class="monospaced"><<a href="mailto:{email}">{email}</a>></span><br> +<span id="revnumber">version {revnumber}{revdate?,}</span> +<span id="revdate">{revdate}</span> +<br><span id="revremark">{revremark}</span> +endif::doctitle[] +{toc,toc2#}{toc-placement$auto:}{template:toc} +</div> +endif::doctype-manpage[] +# Man page header. +ifdef::doctype-manpage[] +<div id="header"> +<h1> +{doctitle} Manual Page +</h1> +{toc,toc2#}{toc-placement$auto:}{template:toc} +<h2>{manname-title}</h2> +<div class="sectionbody"> +<p>{manname} - + {manpurpose} +</p> +</div> +</div> +endif::doctype-manpage[] +<div id="content"> + +[footer] +</div> +{disable-javascript%<div id="footnotes"><hr></div>} +<div id="footer"> +<div id="footer-text"> +template::[footer-text] +</div> +ifdef::badges[] +<div id="footer-badges"> +ifndef::icons[] +Valid <a href="http://validator.w3.org/check?uri=referer">HTML5</a> +and <a href="http://jigsaw.w3.org/css-validator/check/referer">CSS</a>. +endif::icons[] +ifdef::icons[] +<a href="http://validator.w3.org/check?uri=referer"> + <img src="http://www.w3.org/html/logo/badge/html5-badge-h-solo.png" + width="30" alt="HTML5 Powered" title="HTML5 Powered"> +</a> +<a href="http://jigsaw.w3.org/css-validator/check/referer"> + <img style="border:0;width:88px;height:31px" + src="http://www.w3.org/Icons/valid-css" + alt="Valid CSS!"> +</a> +endif::icons[] +</div> +endif::badges[] +</div> +</body> +</html> + +ifdef::doctype-manpage[] +[synopsis] +template::[sect1] +endif::doctype-manpage[] + diff --git a/source-builder/sb/asciidoc/images/highlighter.png b/source-builder/sb/asciidoc/images/highlighter.png Binary files differnew file mode 100644 index 0000000..b311459 --- /dev/null +++ b/source-builder/sb/asciidoc/images/highlighter.png diff --git a/source-builder/sb/asciidoc/images/icons/README b/source-builder/sb/asciidoc/images/icons/README new file mode 100644 index 0000000..f12b2a7 --- /dev/null +++ b/source-builder/sb/asciidoc/images/icons/README @@ -0,0 +1,5 @@ +Replaced the plain DocBook XSL admonition icons with Jimmac's DocBook +icons (http://jimmac.musichall.cz/ikony.php3). I dropped transparency +from the Jimmac icons to get round MS IE and FOP PNG incompatibilies. + +Stuart Rackham diff --git a/source-builder/sb/asciidoc/images/icons/callouts/1.png b/source-builder/sb/asciidoc/images/icons/callouts/1.png Binary files differnew file mode 100644 index 0000000..7d47343 --- /dev/null +++ b/source-builder/sb/asciidoc/images/icons/callouts/1.png diff --git a/source-builder/sb/asciidoc/images/icons/callouts/10.png b/source-builder/sb/asciidoc/images/icons/callouts/10.png Binary files differnew file mode 100644 index 0000000..997bbc8 --- /dev/null +++ b/source-builder/sb/asciidoc/images/icons/callouts/10.png diff --git a/source-builder/sb/asciidoc/images/icons/callouts/11.png b/source-builder/sb/asciidoc/images/icons/callouts/11.png Binary files differnew file mode 100644 index 0000000..ce47dac --- /dev/null +++ b/source-builder/sb/asciidoc/images/icons/callouts/11.png diff --git a/source-builder/sb/asciidoc/images/icons/callouts/12.png b/source-builder/sb/asciidoc/images/icons/callouts/12.png Binary files differnew file mode 100644 index 0000000..31daf4e --- /dev/null +++ b/source-builder/sb/asciidoc/images/icons/callouts/12.png diff --git a/source-builder/sb/asciidoc/images/icons/callouts/13.png b/source-builder/sb/asciidoc/images/icons/callouts/13.png Binary files differnew file mode 100644 index 0000000..14021a8 --- /dev/null +++ b/source-builder/sb/asciidoc/images/icons/callouts/13.png diff --git a/source-builder/sb/asciidoc/images/icons/callouts/14.png b/source-builder/sb/asciidoc/images/icons/callouts/14.png Binary files differnew file mode 100644 index 0000000..64014b7 --- /dev/null +++ b/source-builder/sb/asciidoc/images/icons/callouts/14.png diff --git a/source-builder/sb/asciidoc/images/icons/callouts/15.png b/source-builder/sb/asciidoc/images/icons/callouts/15.png Binary files differnew file mode 100644 index 0000000..0d65765 --- /dev/null +++ b/source-builder/sb/asciidoc/images/icons/callouts/15.png diff --git a/source-builder/sb/asciidoc/images/icons/callouts/2.png b/source-builder/sb/asciidoc/images/icons/callouts/2.png Binary files differnew file mode 100644 index 0000000..5d09341 --- /dev/null +++ b/source-builder/sb/asciidoc/images/icons/callouts/2.png diff --git a/source-builder/sb/asciidoc/images/icons/callouts/3.png b/source-builder/sb/asciidoc/images/icons/callouts/3.png Binary files differnew file mode 100644 index 0000000..ef7b700 --- /dev/null +++ b/source-builder/sb/asciidoc/images/icons/callouts/3.png diff --git a/source-builder/sb/asciidoc/images/icons/callouts/4.png b/source-builder/sb/asciidoc/images/icons/callouts/4.png Binary files differnew file mode 100644 index 0000000..adb8364 --- /dev/null +++ b/source-builder/sb/asciidoc/images/icons/callouts/4.png diff --git a/source-builder/sb/asciidoc/images/icons/callouts/5.png b/source-builder/sb/asciidoc/images/icons/callouts/5.png Binary files differnew file mode 100644 index 0000000..4d7eb46 --- /dev/null +++ b/source-builder/sb/asciidoc/images/icons/callouts/5.png diff --git a/source-builder/sb/asciidoc/images/icons/callouts/6.png b/source-builder/sb/asciidoc/images/icons/callouts/6.png Binary files differnew file mode 100644 index 0000000..0ba694a --- /dev/null +++ b/source-builder/sb/asciidoc/images/icons/callouts/6.png diff --git a/source-builder/sb/asciidoc/images/icons/callouts/7.png b/source-builder/sb/asciidoc/images/icons/callouts/7.png Binary files differnew file mode 100644 index 0000000..472e96f --- /dev/null +++ b/source-builder/sb/asciidoc/images/icons/callouts/7.png diff --git a/source-builder/sb/asciidoc/images/icons/callouts/8.png b/source-builder/sb/asciidoc/images/icons/callouts/8.png Binary files differnew file mode 100644 index 0000000..5e60973 --- /dev/null +++ b/source-builder/sb/asciidoc/images/icons/callouts/8.png diff --git a/source-builder/sb/asciidoc/images/icons/callouts/9.png b/source-builder/sb/asciidoc/images/icons/callouts/9.png Binary files differnew file mode 100644 index 0000000..a0676d2 --- /dev/null +++ b/source-builder/sb/asciidoc/images/icons/callouts/9.png diff --git a/source-builder/sb/asciidoc/images/icons/caution.png b/source-builder/sb/asciidoc/images/icons/caution.png Binary files differnew file mode 100644 index 0000000..9a8c515 --- /dev/null +++ b/source-builder/sb/asciidoc/images/icons/caution.png diff --git a/source-builder/sb/asciidoc/images/icons/example.png b/source-builder/sb/asciidoc/images/icons/example.png Binary files differnew file mode 100644 index 0000000..1199e86 --- /dev/null +++ b/source-builder/sb/asciidoc/images/icons/example.png diff --git a/source-builder/sb/asciidoc/images/icons/home.png b/source-builder/sb/asciidoc/images/icons/home.png Binary files differnew file mode 100644 index 0000000..37a5231 --- /dev/null +++ b/source-builder/sb/asciidoc/images/icons/home.png diff --git a/source-builder/sb/asciidoc/images/icons/important.png b/source-builder/sb/asciidoc/images/icons/important.png Binary files differnew file mode 100644 index 0000000..be685cc --- /dev/null +++ b/source-builder/sb/asciidoc/images/icons/important.png diff --git a/source-builder/sb/asciidoc/images/icons/next.png b/source-builder/sb/asciidoc/images/icons/next.png Binary files differnew file mode 100644 index 0000000..64e126b --- /dev/null +++ b/source-builder/sb/asciidoc/images/icons/next.png diff --git a/source-builder/sb/asciidoc/images/icons/note.png b/source-builder/sb/asciidoc/images/icons/note.png Binary files differnew file mode 100644 index 0000000..7c1f3e2 --- /dev/null +++ b/source-builder/sb/asciidoc/images/icons/note.png diff --git a/source-builder/sb/asciidoc/images/icons/prev.png b/source-builder/sb/asciidoc/images/icons/prev.png Binary files differnew file mode 100644 index 0000000..3e8f12f --- /dev/null +++ b/source-builder/sb/asciidoc/images/icons/prev.png diff --git a/source-builder/sb/asciidoc/images/icons/tip.png b/source-builder/sb/asciidoc/images/icons/tip.png Binary files differnew file mode 100644 index 0000000..f087c73 --- /dev/null +++ b/source-builder/sb/asciidoc/images/icons/tip.png diff --git a/source-builder/sb/asciidoc/images/icons/up.png b/source-builder/sb/asciidoc/images/icons/up.png Binary files differnew file mode 100644 index 0000000..2db1ce6 --- /dev/null +++ b/source-builder/sb/asciidoc/images/icons/up.png diff --git a/source-builder/sb/asciidoc/images/icons/warning.png b/source-builder/sb/asciidoc/images/icons/warning.png Binary files differnew file mode 100644 index 0000000..d41edb9 --- /dev/null +++ b/source-builder/sb/asciidoc/images/icons/warning.png diff --git a/source-builder/sb/asciidoc/images/smallnew.png b/source-builder/sb/asciidoc/images/smallnew.png Binary files differnew file mode 100644 index 0000000..411c2e1 --- /dev/null +++ b/source-builder/sb/asciidoc/images/smallnew.png diff --git a/source-builder/sb/asciidoc/images/tiger.png b/source-builder/sb/asciidoc/images/tiger.png Binary files differnew file mode 100644 index 0000000..332b11f --- /dev/null +++ b/source-builder/sb/asciidoc/images/tiger.png diff --git a/source-builder/sb/asciidoc/javascripts/ASCIIMathML.js b/source-builder/sb/asciidoc/javascripts/ASCIIMathML.js new file mode 100644 index 0000000..489b312 --- /dev/null +++ b/source-builder/sb/asciidoc/javascripts/ASCIIMathML.js @@ -0,0 +1,938 @@ +/* +ASCIIMathML.js +============== +This file contains JavaScript functions to convert ASCII math notation +to Presentation MathML. The conversion is done while the (X)HTML page +loads, and should work with Firefox/Mozilla/Netscape 7+ and Internet +Explorer 6+MathPlayer (http://www.dessci.com/en/products/mathplayer/). +Just add the next line to your (X)HTML page with this file in the same folder: +This is a convenient and inexpensive solution for authoring MathML. + +Version 1.4.7 Dec 15, 2005, (c) Peter Jipsen http://www.chapman.edu/~jipsen +Latest version at http://www.chapman.edu/~jipsen/mathml/ASCIIMathML.js +For changes see http://www.chapman.edu/~jipsen/mathml/asciimathchanges.txt +If you use it on a webpage, please send the URL to jipsen@chapman.edu + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or (at +your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License (at http://www.gnu.org/copyleft/gpl.html) +for more details. +*/ + +var checkForMathML = true; // check if browser can display MathML +var notifyIfNoMathML = true; // display note if no MathML capability +var alertIfNoMathML = false; // show alert box if no MathML capability +var mathcolor = ""; // change it to "" (to inherit) or any other color +var mathfontfamily = "serif"; // change to "" to inherit (works in IE) + // or another family (e.g. "arial") +var displaystyle = true; // puts limits above and below large operators +var showasciiformulaonhover = true; // helps students learn ASCIIMath +var decimalsign = "."; // change to "," if you like, beware of `(1,2)`! +var AMdelimiter1 = "`", AMescape1 = "\\\\`"; // can use other characters +var AMdelimiter2 = "$", AMescape2 = "\\\\\\$", AMdelimiter2regexp = "\\$"; +var doubleblankmathdelimiter = false; // if true, x+1 is equal to `x+1` + // for IE this works only in <!-- --> +//var separatetokens;// has been removed (email me if this is a problem) +var isIE = document.createElementNS==null; + +if (document.getElementById==null) + alert("This webpage requires a recent browser such as\ +\nMozilla/Netscape 7+ or Internet Explorer 6+MathPlayer") + +// all further global variables start with "AM" + +function AMcreateElementXHTML(t) { + if (isIE) return document.createElement(t); + else return document.createElementNS("http://www.w3.org/1999/xhtml",t); +} + +function AMnoMathMLNote() { + var nd = AMcreateElementXHTML("h3"); + nd.setAttribute("align","center") + nd.appendChild(AMcreateElementXHTML("p")); + nd.appendChild(document.createTextNode("To view the ")); + var an = AMcreateElementXHTML("a"); + an.appendChild(document.createTextNode("ASCIIMathML")); + an.setAttribute("href","http://www.chapman.edu/~jipsen/asciimath.html"); + nd.appendChild(an); + nd.appendChild(document.createTextNode(" notation use Internet Explorer 6+")); + an = AMcreateElementXHTML("a"); + an.appendChild(document.createTextNode("MathPlayer")); + an.setAttribute("href","http://www.dessci.com/en/products/mathplayer/download.htm"); + nd.appendChild(an); + nd.appendChild(document.createTextNode(" or Netscape/Mozilla/Firefox")); + nd.appendChild(AMcreateElementXHTML("p")); + return nd; +} + +function AMisMathMLavailable() { + if (navigator.appName.slice(0,8)=="Netscape") + if (navigator.appVersion.slice(0,1)>="5") return null; + else return AMnoMathMLNote(); + else if (navigator.appName.slice(0,9)=="Microsoft") + try { + var ActiveX = new ActiveXObject("MathPlayer.Factory.1"); + return null; + } catch (e) { + return AMnoMathMLNote(); + } + else return AMnoMathMLNote(); +} + +// character lists for Mozilla/Netscape fonts +var AMcal = [0xEF35,0x212C,0xEF36,0xEF37,0x2130,0x2131,0xEF38,0x210B,0x2110,0xEF39,0xEF3A,0x2112,0x2133,0xEF3B,0xEF3C,0xEF3D,0xEF3E,0x211B,0xEF3F,0xEF40,0xEF41,0xEF42,0xEF43,0xEF44,0xEF45,0xEF46]; +var AMfrk = [0xEF5D,0xEF5E,0x212D,0xEF5F,0xEF60,0xEF61,0xEF62,0x210C,0x2111,0xEF63,0xEF64,0xEF65,0xEF66,0xEF67,0xEF68,0xEF69,0xEF6A,0x211C,0xEF6B,0xEF6C,0xEF6D,0xEF6E,0xEF6F,0xEF70,0xEF71,0x2128]; +var AMbbb = [0xEF8C,0xEF8D,0x2102,0xEF8E,0xEF8F,0xEF90,0xEF91,0x210D,0xEF92,0xEF93,0xEF94,0xEF95,0xEF96,0x2115,0xEF97,0x2119,0x211A,0x211D,0xEF98,0xEF99,0xEF9A,0xEF9B,0xEF9C,0xEF9D,0xEF9E,0x2124]; + +var CONST = 0, UNARY = 1, BINARY = 2, INFIX = 3, LEFTBRACKET = 4, + RIGHTBRACKET = 5, SPACE = 6, UNDEROVER = 7, DEFINITION = 8, + LEFTRIGHT = 9, TEXT = 10; // token types + +var AMsqrt = {input:"sqrt", tag:"msqrt", output:"sqrt", tex:null, ttype:UNARY}, + AMroot = {input:"root", tag:"mroot", output:"root", tex:null, ttype:BINARY}, + AMfrac = {input:"frac", tag:"mfrac", output:"/", tex:null, ttype:BINARY}, + AMdiv = {input:"/", tag:"mfrac", output:"/", tex:null, ttype:INFIX}, + AMover = {input:"stackrel", tag:"mover", output:"stackrel", tex:null, ttype:BINARY}, + AMsub = {input:"_", tag:"msub", output:"_", tex:null, ttype:INFIX}, + AMsup = {input:"^", tag:"msup", output:"^", tex:null, ttype:INFIX}, + AMtext = {input:"text", tag:"mtext", output:"text", tex:null, ttype:TEXT}, + AMmbox = {input:"mbox", tag:"mtext", output:"mbox", tex:null, ttype:TEXT}, + AMquote = {input:"\"", tag:"mtext", output:"mbox", tex:null, ttype:TEXT}; + +var AMsymbols = [ +//some greek symbols +{input:"alpha", tag:"mi", output:"\u03B1", tex:null, ttype:CONST}, +{input:"beta", tag:"mi", output:"\u03B2", tex:null, ttype:CONST}, +{input:"chi", tag:"mi", output:"\u03C7", tex:null, ttype:CONST}, +{input:"delta", tag:"mi", output:"\u03B4", tex:null, ttype:CONST}, +{input:"Delta", tag:"mo", output:"\u0394", tex:null, ttype:CONST}, +{input:"epsi", tag:"mi", output:"\u03B5", tex:"epsilon", ttype:CONST}, +{input:"varepsilon", tag:"mi", output:"\u025B", tex:null, ttype:CONST}, +{input:"eta", tag:"mi", output:"\u03B7", tex:null, ttype:CONST}, +{input:"gamma", tag:"mi", output:"\u03B3", tex:null, ttype:CONST}, +{input:"Gamma", tag:"mo", output:"\u0393", tex:null, ttype:CONST}, +{input:"iota", tag:"mi", output:"\u03B9", tex:null, ttype:CONST}, +{input:"kappa", tag:"mi", output:"\u03BA", tex:null, ttype:CONST}, +{input:"lambda", tag:"mi", output:"\u03BB", tex:null, ttype:CONST}, +{input:"Lambda", tag:"mo", output:"\u039B", tex:null, ttype:CONST}, +{input:"mu", tag:"mi", output:"\u03BC", tex:null, ttype:CONST}, +{input:"nu", tag:"mi", output:"\u03BD", tex:null, ttype:CONST}, +{input:"omega", tag:"mi", output:"\u03C9", tex:null, ttype:CONST}, +{input:"Omega", tag:"mo", output:"\u03A9", tex:null, ttype:CONST}, +{input:"phi", tag:"mi", output:"\u03C6", tex:null, ttype:CONST}, +{input:"varphi", tag:"mi", output:"\u03D5", tex:null, ttype:CONST}, +{input:"Phi", tag:"mo", output:"\u03A6", tex:null, ttype:CONST}, +{input:"pi", tag:"mi", output:"\u03C0", tex:null, ttype:CONST}, +{input:"Pi", tag:"mo", output:"\u03A0", tex:null, ttype:CONST}, +{input:"psi", tag:"mi", output:"\u03C8", tex:null, ttype:CONST}, +{input:"Psi", tag:"mi", output:"\u03A8", tex:null, ttype:CONST}, +{input:"rho", tag:"mi", output:"\u03C1", tex:null, ttype:CONST}, +{input:"sigma", tag:"mi", output:"\u03C3", tex:null, ttype:CONST}, +{input:"Sigma", tag:"mo", output:"\u03A3", tex:null, ttype:CONST}, +{input:"tau", tag:"mi", output:"\u03C4", tex:null, ttype:CONST}, +{input:"theta", tag:"mi", output:"\u03B8", tex:null, ttype:CONST}, +{input:"vartheta", tag:"mi", output:"\u03D1", tex:null, ttype:CONST}, +{input:"Theta", tag:"mo", output:"\u0398", tex:null, ttype:CONST}, +{input:"upsilon", tag:"mi", output:"\u03C5", tex:null, ttype:CONST}, +{input:"xi", tag:"mi", output:"\u03BE", tex:null, ttype:CONST}, +{input:"Xi", tag:"mo", output:"\u039E", tex:null, ttype:CONST}, +{input:"zeta", tag:"mi", output:"\u03B6", tex:null, ttype:CONST}, + +//binary operation symbols +{input:"*", tag:"mo", output:"\u22C5", tex:"cdot", ttype:CONST}, +{input:"**", tag:"mo", output:"\u22C6", tex:"star", ttype:CONST}, +{input:"//", tag:"mo", output:"/", tex:null, ttype:CONST}, +{input:"\\\\", tag:"mo", output:"\\", tex:"backslash", ttype:CONST}, +{input:"setminus", tag:"mo", output:"\\", tex:null, ttype:CONST}, +{input:"xx", tag:"mo", output:"\u00D7", tex:"times", ttype:CONST}, +{input:"-:", tag:"mo", output:"\u00F7", tex:"divide", ttype:CONST}, +{input:"@", tag:"mo", output:"\u2218", tex:"circ", ttype:CONST}, +{input:"o+", tag:"mo", output:"\u2295", tex:"oplus", ttype:CONST}, +{input:"ox", tag:"mo", output:"\u2297", tex:"otimes", ttype:CONST}, +{input:"o.", tag:"mo", output:"\u2299", tex:"odot", ttype:CONST}, +{input:"sum", tag:"mo", output:"\u2211", tex:null, ttype:UNDEROVER}, +{input:"prod", tag:"mo", output:"\u220F", tex:null, ttype:UNDEROVER}, +{input:"^^", tag:"mo", output:"\u2227", tex:"wedge", ttype:CONST}, +{input:"^^^", tag:"mo", output:"\u22C0", tex:"bigwedge", ttype:UNDEROVER}, +{input:"vv", tag:"mo", output:"\u2228", tex:"vee", ttype:CONST}, +{input:"vvv", tag:"mo", output:"\u22C1", tex:"bigvee", ttype:UNDEROVER}, +{input:"nn", tag:"mo", output:"\u2229", tex:"cap", ttype:CONST}, +{input:"nnn", tag:"mo", output:"\u22C2", tex:"bigcap", ttype:UNDEROVER}, +{input:"uu", tag:"mo", output:"\u222A", tex:"cup", ttype:CONST}, +{input:"uuu", tag:"mo", output:"\u22C3", tex:"bigcup", ttype:UNDEROVER}, + +//binary relation symbols +{input:"!=", tag:"mo", output:"\u2260", tex:"ne", ttype:CONST}, +{input:":=", tag:"mo", output:":=", tex:null, ttype:CONST}, +{input:"lt", tag:"mo", output:"<", tex:null, ttype:CONST}, +{input:"<=", tag:"mo", output:"\u2264", tex:"le", ttype:CONST}, +{input:"lt=", tag:"mo", output:"\u2264", tex:"leq", ttype:CONST}, +{input:">=", tag:"mo", output:"\u2265", tex:"ge", ttype:CONST}, +{input:"geq", tag:"mo", output:"\u2265", tex:null, ttype:CONST}, +{input:"-<", tag:"mo", output:"\u227A", tex:"prec", ttype:CONST}, +{input:"-lt", tag:"mo", output:"\u227A", tex:null, ttype:CONST}, +{input:">-", tag:"mo", output:"\u227B", tex:"succ", ttype:CONST}, +{input:"-<=", tag:"mo", output:"\u2AAF", tex:"preceq", ttype:CONST}, +{input:">-=", tag:"mo", output:"\u2AB0", tex:"succeq", ttype:CONST}, +{input:"in", tag:"mo", output:"\u2208", tex:null, ttype:CONST}, +{input:"!in", tag:"mo", output:"\u2209", tex:"notin", ttype:CONST}, +{input:"sub", tag:"mo", output:"\u2282", tex:"subset", ttype:CONST}, +{input:"sup", tag:"mo", output:"\u2283", tex:"supset", ttype:CONST}, +{input:"sube", tag:"mo", output:"\u2286", tex:"subseteq", ttype:CONST}, +{input:"supe", tag:"mo", output:"\u2287", tex:"supseteq", ttype:CONST}, +{input:"-=", tag:"mo", output:"\u2261", tex:"equiv", ttype:CONST}, +{input:"~=", tag:"mo", output:"\u2245", tex:"cong", ttype:CONST}, +{input:"~~", tag:"mo", output:"\u2248", tex:"approx", ttype:CONST}, +{input:"prop", tag:"mo", output:"\u221D", tex:"propto", ttype:CONST}, + +//logical symbols +{input:"and", tag:"mtext", output:"and", tex:null, ttype:SPACE}, +{input:"or", tag:"mtext", output:"or", tex:null, ttype:SPACE}, +{input:"not", tag:"mo", output:"\u00AC", tex:"neg", ttype:CONST}, +{input:"=>", tag:"mo", output:"\u21D2", tex:"implies", ttype:CONST}, +{input:"if", tag:"mo", output:"if", tex:null, ttype:SPACE}, +{input:"<=>", tag:"mo", output:"\u21D4", tex:"iff", ttype:CONST}, +{input:"AA", tag:"mo", output:"\u2200", tex:"forall", ttype:CONST}, +{input:"EE", tag:"mo", output:"\u2203", tex:"exists", ttype:CONST}, +{input:"_|_", tag:"mo", output:"\u22A5", tex:"bot", ttype:CONST}, +{input:"TT", tag:"mo", output:"\u22A4", tex:"top", ttype:CONST}, +{input:"|--", tag:"mo", output:"\u22A2", tex:"vdash", ttype:CONST}, +{input:"|==", tag:"mo", output:"\u22A8", tex:"models", ttype:CONST}, + +//grouping brackets +{input:"(", tag:"mo", output:"(", tex:null, ttype:LEFTBRACKET}, +{input:")", tag:"mo", output:")", tex:null, ttype:RIGHTBRACKET}, +{input:"[", tag:"mo", output:"[", tex:null, ttype:LEFTBRACKET}, +{input:"]", tag:"mo", output:"]", tex:null, ttype:RIGHTBRACKET}, +{input:"{", tag:"mo", output:"{", tex:null, ttype:LEFTBRACKET}, +{input:"}", tag:"mo", output:"}", tex:null, ttype:RIGHTBRACKET}, +{input:"|", tag:"mo", output:"|", tex:null, ttype:LEFTRIGHT}, +//{input:"||", tag:"mo", output:"||", tex:null, ttype:LEFTRIGHT}, +{input:"(:", tag:"mo", output:"\u2329", tex:"langle", ttype:LEFTBRACKET}, +{input:":)", tag:"mo", output:"\u232A", tex:"rangle", ttype:RIGHTBRACKET}, +{input:"<<", tag:"mo", output:"\u2329", tex:null, ttype:LEFTBRACKET}, +{input:">>", tag:"mo", output:"\u232A", tex:null, ttype:RIGHTBRACKET}, +{input:"{:", tag:"mo", output:"{:", tex:null, ttype:LEFTBRACKET, invisible:true}, +{input:":}", tag:"mo", output:":}", tex:null, ttype:RIGHTBRACKET, invisible:true}, + +//miscellaneous symbols +{input:"int", tag:"mo", output:"\u222B", tex:null, ttype:CONST}, +{input:"dx", tag:"mi", output:"{:d x:}", tex:null, ttype:DEFINITION}, +{input:"dy", tag:"mi", output:"{:d y:}", tex:null, ttype:DEFINITION}, +{input:"dz", tag:"mi", output:"{:d z:}", tex:null, ttype:DEFINITION}, +{input:"dt", tag:"mi", output:"{:d t:}", tex:null, ttype:DEFINITION}, +{input:"oint", tag:"mo", output:"\u222E", tex:null, ttype:CONST}, +{input:"del", tag:"mo", output:"\u2202", tex:"partial", ttype:CONST}, +{input:"grad", tag:"mo", output:"\u2207", tex:"nabla", ttype:CONST}, +{input:"+-", tag:"mo", output:"\u00B1", tex:"pm", ttype:CONST}, +{input:"O/", tag:"mo", output:"\u2205", tex:"emptyset", ttype:CONST}, +{input:"oo", tag:"mo", output:"\u221E", tex:"infty", ttype:CONST}, +{input:"aleph", tag:"mo", output:"\u2135", tex:null, ttype:CONST}, +{input:"...", tag:"mo", output:"...", tex:"ldots", ttype:CONST}, +{input:":.", tag:"mo", output:"\u2234", tex:"therefore", ttype:CONST}, +{input:"/_", tag:"mo", output:"\u2220", tex:"angle", ttype:CONST}, +{input:"\\ ", tag:"mo", output:"\u00A0", tex:null, ttype:CONST}, +{input:"quad", tag:"mo", output:"\u00A0\u00A0", tex:null, ttype:CONST}, +{input:"qquad", tag:"mo", output:"\u00A0\u00A0\u00A0\u00A0", tex:null, ttype:CONST}, +{input:"cdots", tag:"mo", output:"\u22EF", tex:null, ttype:CONST}, +{input:"vdots", tag:"mo", output:"\u22EE", tex:null, ttype:CONST}, +{input:"ddots", tag:"mo", output:"\u22F1", tex:null, ttype:CONST}, +{input:"diamond", tag:"mo", output:"\u22C4", tex:null, ttype:CONST}, +{input:"square", tag:"mo", output:"\u25A1", tex:null, ttype:CONST}, +{input:"|__", tag:"mo", output:"\u230A", tex:"lfloor", ttype:CONST}, +{input:"__|", tag:"mo", output:"\u230B", tex:"rfloor", ttype:CONST}, +{input:"|~", tag:"mo", output:"\u2308", tex:"lceiling", ttype:CONST}, +{input:"~|", tag:"mo", output:"\u2309", tex:"rceiling", ttype:CONST}, +{input:"CC", tag:"mo", output:"\u2102", tex:null, ttype:CONST}, +{input:"NN", tag:"mo", output:"\u2115", tex:null, ttype:CONST}, +{input:"QQ", tag:"mo", output:"\u211A", tex:null, ttype:CONST}, +{input:"RR", tag:"mo", output:"\u211D", tex:null, ttype:CONST}, +{input:"ZZ", tag:"mo", output:"\u2124", tex:null, ttype:CONST}, +{input:"f", tag:"mi", output:"f", tex:null, ttype:UNARY, func:true}, +{input:"g", tag:"mi", output:"g", tex:null, ttype:UNARY, func:true}, + +//standard functions +{input:"lim", tag:"mo", output:"lim", tex:null, ttype:UNDEROVER}, +{input:"Lim", tag:"mo", output:"Lim", tex:null, ttype:UNDEROVER}, +{input:"sin", tag:"mo", output:"sin", tex:null, ttype:UNARY, func:true}, +{input:"cos", tag:"mo", output:"cos", tex:null, ttype:UNARY, func:true}, +{input:"tan", tag:"mo", output:"tan", tex:null, ttype:UNARY, func:true}, +{input:"sinh", tag:"mo", output:"sinh", tex:null, ttype:UNARY, func:true}, +{input:"cosh", tag:"mo", output:"cosh", tex:null, ttype:UNARY, func:true}, +{input:"tanh", tag:"mo", output:"tanh", tex:null, ttype:UNARY, func:true}, +{input:"cot", tag:"mo", output:"cot", tex:null, ttype:UNARY, func:true}, +{input:"sec", tag:"mo", output:"sec", tex:null, ttype:UNARY, func:true}, +{input:"csc", tag:"mo", output:"csc", tex:null, ttype:UNARY, func:true}, +{input:"log", tag:"mo", output:"log", tex:null, ttype:UNARY, func:true}, +{input:"ln", tag:"mo", output:"ln", tex:null, ttype:UNARY, func:true}, +{input:"det", tag:"mo", output:"det", tex:null, ttype:UNARY, func:true}, +{input:"dim", tag:"mo", output:"dim", tex:null, ttype:CONST}, +{input:"mod", tag:"mo", output:"mod", tex:null, ttype:CONST}, +{input:"gcd", tag:"mo", output:"gcd", tex:null, ttype:UNARY, func:true}, +{input:"lcm", tag:"mo", output:"lcm", tex:null, ttype:UNARY, func:true}, +{input:"lub", tag:"mo", output:"lub", tex:null, ttype:CONST}, +{input:"glb", tag:"mo", output:"glb", tex:null, ttype:CONST}, +{input:"min", tag:"mo", output:"min", tex:null, ttype:UNDEROVER}, +{input:"max", tag:"mo", output:"max", tex:null, ttype:UNDEROVER}, + +//arrows +{input:"uarr", tag:"mo", output:"\u2191", tex:"uparrow", ttype:CONST}, +{input:"darr", tag:"mo", output:"\u2193", tex:"downarrow", ttype:CONST}, +{input:"rarr", tag:"mo", output:"\u2192", tex:"rightarrow", ttype:CONST}, +{input:"->", tag:"mo", output:"\u2192", tex:"to", ttype:CONST}, +{input:"|->", tag:"mo", output:"\u21A6", tex:"mapsto", ttype:CONST}, +{input:"larr", tag:"mo", output:"\u2190", tex:"leftarrow", ttype:CONST}, +{input:"harr", tag:"mo", output:"\u2194", tex:"leftrightarrow", ttype:CONST}, +{input:"rArr", tag:"mo", output:"\u21D2", tex:"Rightarrow", ttype:CONST}, +{input:"lArr", tag:"mo", output:"\u21D0", tex:"Leftarrow", ttype:CONST}, +{input:"hArr", tag:"mo", output:"\u21D4", tex:"Leftrightarrow", ttype:CONST}, + +//commands with argument +AMsqrt, AMroot, AMfrac, AMdiv, AMover, AMsub, AMsup, +{input:"hat", tag:"mover", output:"\u005E", tex:null, ttype:UNARY, acc:true}, +{input:"bar", tag:"mover", output:"\u00AF", tex:"overline", ttype:UNARY, acc:true}, +{input:"vec", tag:"mover", output:"\u2192", tex:null, ttype:UNARY, acc:true}, +{input:"dot", tag:"mover", output:".", tex:null, ttype:UNARY, acc:true}, +{input:"ddot", tag:"mover", output:"..", tex:null, ttype:UNARY, acc:true}, +{input:"ul", tag:"munder", output:"\u0332", tex:"underline", ttype:UNARY, acc:true}, +AMtext, AMmbox, AMquote, +{input:"bb", tag:"mstyle", atname:"fontweight", atval:"bold", output:"bb", tex:null, ttype:UNARY}, +{input:"mathbf", tag:"mstyle", atname:"fontweight", atval:"bold", output:"mathbf", tex:null, ttype:UNARY}, +{input:"sf", tag:"mstyle", atname:"fontfamily", atval:"sans-serif", output:"sf", tex:null, ttype:UNARY}, +{input:"mathsf", tag:"mstyle", atname:"fontfamily", atval:"sans-serif", output:"mathsf", tex:null, ttype:UNARY}, +{input:"bbb", tag:"mstyle", atname:"mathvariant", atval:"double-struck", output:"bbb", tex:null, ttype:UNARY, codes:AMbbb}, +{input:"mathbb", tag:"mstyle", atname:"mathvariant", atval:"double-struck", output:"mathbb", tex:null, ttype:UNARY, codes:AMbbb}, +{input:"cc", tag:"mstyle", atname:"mathvariant", atval:"script", output:"cc", tex:null, ttype:UNARY, codes:AMcal}, +{input:"mathcal", tag:"mstyle", atname:"mathvariant", atval:"script", output:"mathcal", tex:null, ttype:UNARY, codes:AMcal}, +{input:"tt", tag:"mstyle", atname:"fontfamily", atval:"monospace", output:"tt", tex:null, ttype:UNARY}, +{input:"mathtt", tag:"mstyle", atname:"fontfamily", atval:"monospace", output:"mathtt", tex:null, ttype:UNARY}, +{input:"fr", tag:"mstyle", atname:"mathvariant", atval:"fraktur", output:"fr", tex:null, ttype:UNARY, codes:AMfrk}, +{input:"mathfrak", tag:"mstyle", atname:"mathvariant", atval:"fraktur", output:"mathfrak", tex:null, ttype:UNARY, codes:AMfrk} +]; + +function compareNames(s1,s2) { + if (s1.input > s2.input) return 1 + else return -1; +} + +var AMnames = []; //list of input symbols + +function AMinitSymbols() { + var texsymbols = [], i; + for (i=0; i<AMsymbols.length; i++) + if (AMsymbols[i].tex) + texsymbols[texsymbols.length] = {input:AMsymbols[i].tex, + tag:AMsymbols[i].tag, output:AMsymbols[i].output, ttype:AMsymbols[i].ttype}; + AMsymbols = AMsymbols.concat(texsymbols); + AMsymbols.sort(compareNames); + for (i=0; i<AMsymbols.length; i++) AMnames[i] = AMsymbols[i].input; +} + +var AMmathml = "http://www.w3.org/1998/Math/MathML"; + +function AMcreateElementMathML(t) { + if (isIE) return document.createElement("m:"+t); + else return document.createElementNS(AMmathml,t); +} + +function AMcreateMmlNode(t,frag) { +// var node = AMcreateElementMathML(name); + if (isIE) var node = document.createElement("m:"+t); + else var node = document.createElementNS(AMmathml,t); + node.appendChild(frag); + return node; +} + +function newcommand(oldstr,newstr) { + AMsymbols = AMsymbols.concat([{input:oldstr, tag:"mo", output:newstr, + tex:null, ttype:DEFINITION}]); +} + +function AMremoveCharsAndBlanks(str,n) { +//remove n characters and any following blanks + var st; + if (str.charAt(n)=="\\" && str.charAt(n+1)!="\\" && str.charAt(n+1)!=" ") + st = str.slice(n+1); + else st = str.slice(n); + for (var i=0; i<st.length && st.charCodeAt(i)<=32; i=i+1); + return st.slice(i); +} + +function AMposition(arr, str, n) { +// return position >=n where str appears or would be inserted +// assumes arr is sorted + if (n==0) { + var h,m; + n = -1; + h = arr.length; + while (n+1<h) { + m = (n+h) >> 1; + if (arr[m]<str) n = m; else h = m; + } + return h; + } else + for (var i=n; i<arr.length && arr[i]<str; i++); + return i; // i=arr.length || arr[i]>=str +} + +function AMgetSymbol(str) { +//return maximal initial substring of str that appears in names +//return null if there is none + var k = 0; //new pos + var j = 0; //old pos + var mk; //match pos + var st; + var tagst; + var match = ""; + var more = true; + for (var i=1; i<=str.length && more; i++) { + st = str.slice(0,i); //initial substring of length i + j = k; + k = AMposition(AMnames, st, j); + if (k<AMnames.length && str.slice(0,AMnames[k].length)==AMnames[k]){ + match = AMnames[k]; + mk = k; + i = match.length; + } + more = k<AMnames.length && str.slice(0,AMnames[k].length)>=AMnames[k]; + } + AMpreviousSymbol=AMcurrentSymbol; + if (match!=""){ + AMcurrentSymbol=AMsymbols[mk].ttype; + return AMsymbols[mk]; + } +// if str[0] is a digit or - return maxsubstring of digits.digits + AMcurrentSymbol=CONST; + k = 1; + st = str.slice(0,1); + var integ = true; + while ("0"<=st && st<="9" && k<=str.length) { + st = str.slice(k,k+1); + k++; + } + if (st == decimalsign) { + st = str.slice(k,k+1); + if ("0"<=st && st<="9") { + integ = false; + k++; + while ("0"<=st && st<="9" && k<=str.length) { + st = str.slice(k,k+1); + k++; + } + } + } + if ((integ && k>1) || k>2) { + st = str.slice(0,k-1); + tagst = "mn"; + } else { + k = 2; + st = str.slice(0,1); //take 1 character + tagst = (("A">st || st>"Z") && ("a">st || st>"z")?"mo":"mi"); + } + if (st=="-" && AMpreviousSymbol==INFIX) { + AMcurrentSymbol = INFIX; //trick "/" into recognizing "-" on second parse + return {input:st, tag:tagst, output:st, ttype:UNARY, func:true}; + } + return {input:st, tag:tagst, output:st, ttype:CONST}; +} + +function AMremoveBrackets(node) { + var st; + if (node.nodeName=="mrow") { + st = node.firstChild.firstChild.nodeValue; + if (st=="(" || st=="[" || st=="{") node.removeChild(node.firstChild); + } + if (node.nodeName=="mrow") { + st = node.lastChild.firstChild.nodeValue; + if (st==")" || st=="]" || st=="}") node.removeChild(node.lastChild); + } +} + +/*Parsing ASCII math expressions with the following grammar +v ::= [A-Za-z] | greek letters | numbers | other constant symbols +u ::= sqrt | text | bb | other unary symbols for font commands +b ::= frac | root | stackrel binary symbols +l ::= ( | [ | { | (: | {: left brackets +r ::= ) | ] | } | :) | :} right brackets +S ::= v | lEr | uS | bSS Simple expression +I ::= S_S | S^S | S_S^S | S Intermediate expression +E ::= IE | I/I Expression +Each terminal symbol is translated into a corresponding mathml node.*/ + +var AMnestingDepth,AMpreviousSymbol,AMcurrentSymbol; + +function AMparseSexpr(str) { //parses str and returns [node,tailstr] + var symbol, node, result, i, st,// rightvert = false, + newFrag = document.createDocumentFragment(); + str = AMremoveCharsAndBlanks(str,0); + symbol = AMgetSymbol(str); //either a token or a bracket or empty + if (symbol == null || symbol.ttype == RIGHTBRACKET && AMnestingDepth > 0) { + return [null,str]; + } + if (symbol.ttype == DEFINITION) { + str = symbol.output+AMremoveCharsAndBlanks(str,symbol.input.length); + symbol = AMgetSymbol(str); + } + switch (symbol.ttype) { + case UNDEROVER: + case CONST: + str = AMremoveCharsAndBlanks(str,symbol.input.length); + return [AMcreateMmlNode(symbol.tag, //its a constant + document.createTextNode(symbol.output)),str]; + case LEFTBRACKET: //read (expr+) + AMnestingDepth++; + str = AMremoveCharsAndBlanks(str,symbol.input.length); + result = AMparseExpr(str,true); + AMnestingDepth--; + if (typeof symbol.invisible == "boolean" && symbol.invisible) + node = AMcreateMmlNode("mrow",result[0]); + else { + node = AMcreateMmlNode("mo",document.createTextNode(symbol.output)); + node = AMcreateMmlNode("mrow",node); + node.appendChild(result[0]); + } + return [node,result[1]]; + case TEXT: + if (symbol!=AMquote) str = AMremoveCharsAndBlanks(str,symbol.input.length); + if (str.charAt(0)=="{") i=str.indexOf("}"); + else if (str.charAt(0)=="(") i=str.indexOf(")"); + else if (str.charAt(0)=="[") i=str.indexOf("]"); + else if (symbol==AMquote) i=str.slice(1).indexOf("\"")+1; + else i = 0; + if (i==-1) i = str.length; + st = str.slice(1,i); + if (st.charAt(0) == " ") { + node = AMcreateElementMathML("mspace"); + node.setAttribute("width","1ex"); + newFrag.appendChild(node); + } + newFrag.appendChild( + AMcreateMmlNode(symbol.tag,document.createTextNode(st))); + if (st.charAt(st.length-1) == " ") { + node = AMcreateElementMathML("mspace"); + node.setAttribute("width","1ex"); + newFrag.appendChild(node); + } + str = AMremoveCharsAndBlanks(str,i+1); + return [AMcreateMmlNode("mrow",newFrag),str]; + case UNARY: + str = AMremoveCharsAndBlanks(str,symbol.input.length); + result = AMparseSexpr(str); + if (result[0]==null) return [AMcreateMmlNode(symbol.tag, + document.createTextNode(symbol.output)),str]; + if (typeof symbol.func == "boolean" && symbol.func) { // functions hack + st = str.charAt(0); + if (st=="^" || st=="_" || st=="/" || st=="|" || st==",") { + return [AMcreateMmlNode(symbol.tag, + document.createTextNode(symbol.output)),str]; + } else { + node = AMcreateMmlNode("mrow", + AMcreateMmlNode(symbol.tag,document.createTextNode(symbol.output))); + node.appendChild(result[0]); + return [node,result[1]]; + } + } + AMremoveBrackets(result[0]); + if (symbol.input == "sqrt") { // sqrt + return [AMcreateMmlNode(symbol.tag,result[0]),result[1]]; + } else if (typeof symbol.acc == "boolean" && symbol.acc) { // accent + node = AMcreateMmlNode(symbol.tag,result[0]); + node.appendChild(AMcreateMmlNode("mo",document.createTextNode(symbol.output))); + return [node,result[1]]; + } else { // font change command + if (!isIE && typeof symbol.codes != "undefined") { + for (i=0; i<result[0].childNodes.length; i++) + if (result[0].childNodes[i].nodeName=="mi" || result[0].nodeName=="mi") { + st = (result[0].nodeName=="mi"?result[0].firstChild.nodeValue: + result[0].childNodes[i].firstChild.nodeValue); + var newst = []; + for (var j=0; j<st.length; j++) + if (st.charCodeAt(j)>64 && st.charCodeAt(j)<91) newst = newst + + String.fromCharCode(symbol.codes[st.charCodeAt(j)-65]); + else newst = newst + st.charAt(j); + if (result[0].nodeName=="mi") + result[0]=AMcreateElementMathML("mo"). + appendChild(document.createTextNode(newst)); + else result[0].replaceChild(AMcreateElementMathML("mo"). + appendChild(document.createTextNode(newst)),result[0].childNodes[i]); + } + } + node = AMcreateMmlNode(symbol.tag,result[0]); + node.setAttribute(symbol.atname,symbol.atval); + return [node,result[1]]; + } + case BINARY: + str = AMremoveCharsAndBlanks(str,symbol.input.length); + result = AMparseSexpr(str); + if (result[0]==null) return [AMcreateMmlNode("mo", + document.createTextNode(symbol.input)),str]; + AMremoveBrackets(result[0]); + var result2 = AMparseSexpr(result[1]); + if (result2[0]==null) return [AMcreateMmlNode("mo", + document.createTextNode(symbol.input)),str]; + AMremoveBrackets(result2[0]); + if (symbol.input=="root" || symbol.input=="stackrel") + newFrag.appendChild(result2[0]); + newFrag.appendChild(result[0]); + if (symbol.input=="frac") newFrag.appendChild(result2[0]); + return [AMcreateMmlNode(symbol.tag,newFrag),result2[1]]; + case INFIX: + str = AMremoveCharsAndBlanks(str,symbol.input.length); + return [AMcreateMmlNode("mo",document.createTextNode(symbol.output)),str]; + case SPACE: + str = AMremoveCharsAndBlanks(str,symbol.input.length); + node = AMcreateElementMathML("mspace"); + node.setAttribute("width","1ex"); + newFrag.appendChild(node); + newFrag.appendChild( + AMcreateMmlNode(symbol.tag,document.createTextNode(symbol.output))); + node = AMcreateElementMathML("mspace"); + node.setAttribute("width","1ex"); + newFrag.appendChild(node); + return [AMcreateMmlNode("mrow",newFrag),str]; + case LEFTRIGHT: +// if (rightvert) return [null,str]; else rightvert = true; + AMnestingDepth++; + str = AMremoveCharsAndBlanks(str,symbol.input.length); + result = AMparseExpr(str,false); + AMnestingDepth--; + var st = ""; + if (result[0].lastChild!=null) + st = result[0].lastChild.firstChild.nodeValue; + if (st == "|") { // its an absolute value subterm + node = AMcreateMmlNode("mo",document.createTextNode(symbol.output)); + node = AMcreateMmlNode("mrow",node); + node.appendChild(result[0]); + return [node,result[1]]; + } else { // the "|" is a \mid + node = AMcreateMmlNode("mo",document.createTextNode(symbol.output)); + node = AMcreateMmlNode("mrow",node); + return [node,str]; + } + default: +//alert("default"); + str = AMremoveCharsAndBlanks(str,symbol.input.length); + return [AMcreateMmlNode(symbol.tag, //its a constant + document.createTextNode(symbol.output)),str]; + } +} + +function AMparseIexpr(str) { + var symbol, sym1, sym2, node, result, underover; + str = AMremoveCharsAndBlanks(str,0); + sym1 = AMgetSymbol(str); + result = AMparseSexpr(str); + node = result[0]; + str = result[1]; + symbol = AMgetSymbol(str); + if (symbol.ttype == INFIX && symbol.input != "/") { + str = AMremoveCharsAndBlanks(str,symbol.input.length); +// if (symbol.input == "/") result = AMparseIexpr(str); else ... + result = AMparseSexpr(str); + if (result[0] == null) // show box in place of missing argument + result[0] = AMcreateMmlNode("mo",document.createTextNode("\u25A1")); + else AMremoveBrackets(result[0]); + str = result[1]; +// if (symbol.input == "/") AMremoveBrackets(node); + if (symbol.input == "_") { + sym2 = AMgetSymbol(str); + underover = (sym1.ttype == UNDEROVER); + if (sym2.input == "^") { + str = AMremoveCharsAndBlanks(str,sym2.input.length); + var res2 = AMparseSexpr(str); + AMremoveBrackets(res2[0]); + str = res2[1]; + node = AMcreateMmlNode((underover?"munderover":"msubsup"),node); + node.appendChild(result[0]); + node.appendChild(res2[0]); + node = AMcreateMmlNode("mrow",node); // so sum does not stretch + } else { + node = AMcreateMmlNode((underover?"munder":"msub"),node); + node.appendChild(result[0]); + } + } else { + node = AMcreateMmlNode(symbol.tag,node); + node.appendChild(result[0]); + } + } + return [node,str]; +} + +function AMparseExpr(str,rightbracket) { + var symbol, node, result, i, nodeList = [], + newFrag = document.createDocumentFragment(); + do { + str = AMremoveCharsAndBlanks(str,0); + result = AMparseIexpr(str); + node = result[0]; + str = result[1]; + symbol = AMgetSymbol(str); + if (symbol.ttype == INFIX && symbol.input == "/") { + str = AMremoveCharsAndBlanks(str,symbol.input.length); + result = AMparseIexpr(str); + if (result[0] == null) // show box in place of missing argument + result[0] = AMcreateMmlNode("mo",document.createTextNode("\u25A1")); + else AMremoveBrackets(result[0]); + str = result[1]; + AMremoveBrackets(node); + node = AMcreateMmlNode(symbol.tag,node); + node.appendChild(result[0]); + newFrag.appendChild(node); + symbol = AMgetSymbol(str); + } + else if (node!=undefined) newFrag.appendChild(node); + } while ((symbol.ttype != RIGHTBRACKET && + (symbol.ttype != LEFTRIGHT || rightbracket) + || AMnestingDepth == 0) && symbol!=null && symbol.output!=""); + if (symbol.ttype == RIGHTBRACKET || symbol.ttype == LEFTRIGHT) { +// if (AMnestingDepth > 0) AMnestingDepth--; + var len = newFrag.childNodes.length; + if (len>0 && newFrag.childNodes[len-1].nodeName == "mrow" && len>1 && + newFrag.childNodes[len-2].nodeName == "mo" && + newFrag.childNodes[len-2].firstChild.nodeValue == ",") { //matrix + var right = newFrag.childNodes[len-1].lastChild.firstChild.nodeValue; + if (right==")" || right=="]") { + var left = newFrag.childNodes[len-1].firstChild.firstChild.nodeValue; + if (left=="(" && right==")" && symbol.output != "}" || + left=="[" && right=="]") { + var pos = []; // positions of commas + var matrix = true; + var m = newFrag.childNodes.length; + for (i=0; matrix && i<m; i=i+2) { + pos[i] = []; + node = newFrag.childNodes[i]; + if (matrix) matrix = node.nodeName=="mrow" && + (i==m-1 || node.nextSibling.nodeName=="mo" && + node.nextSibling.firstChild.nodeValue==",")&& + node.firstChild.firstChild.nodeValue==left && + node.lastChild.firstChild.nodeValue==right; + if (matrix) + for (var j=0; j<node.childNodes.length; j++) + if (node.childNodes[j].firstChild.nodeValue==",") + pos[i][pos[i].length]=j; + if (matrix && i>1) matrix = pos[i].length == pos[i-2].length; + } + if (matrix) { + var row, frag, n, k, table = document.createDocumentFragment(); + for (i=0; i<m; i=i+2) { + row = document.createDocumentFragment(); + frag = document.createDocumentFragment(); + node = newFrag.firstChild; // <mrow>(-,-,...,-,-)</mrow> + n = node.childNodes.length; + k = 0; + node.removeChild(node.firstChild); //remove ( + for (j=1; j<n-1; j++) { + if (typeof pos[i][k] != "undefined" && j==pos[i][k]){ + node.removeChild(node.firstChild); //remove , + row.appendChild(AMcreateMmlNode("mtd",frag)); + k++; + } else frag.appendChild(node.firstChild); + } + row.appendChild(AMcreateMmlNode("mtd",frag)); + if (newFrag.childNodes.length>2) { + newFrag.removeChild(newFrag.firstChild); //remove <mrow>)</mrow> + newFrag.removeChild(newFrag.firstChild); //remove <mo>,</mo> + } + table.appendChild(AMcreateMmlNode("mtr",row)); + } + node = AMcreateMmlNode("mtable",table); + if (typeof symbol.invisible == "boolean" && symbol.invisible) node.setAttribute("columnalign","left"); + newFrag.replaceChild(node,newFrag.firstChild); + } + } + } + } + str = AMremoveCharsAndBlanks(str,symbol.input.length); + if (typeof symbol.invisible != "boolean" || !symbol.invisible) { + node = AMcreateMmlNode("mo",document.createTextNode(symbol.output)); + newFrag.appendChild(node); + } + } + return [newFrag,str]; +} + +function AMparseMath(str) { + var result, node = AMcreateElementMathML("mstyle"); + if (mathcolor != "") node.setAttribute("mathcolor",mathcolor); + if (displaystyle) node.setAttribute("displaystyle","true"); + if (mathfontfamily != "") node.setAttribute("fontfamily",mathfontfamily); + AMnestingDepth = 0; + node.appendChild(AMparseExpr(str.replace(/^\s+/g,""),false)[0]); + node = AMcreateMmlNode("math",node); + if (showasciiformulaonhover) //fixed by djhsu so newline + node.setAttribute("title",str.replace(/\s+/g," "));//does not show in Gecko + if (mathfontfamily != "" && (isIE || mathfontfamily != "serif")) { + var fnode = AMcreateElementXHTML("font"); + fnode.setAttribute("face",mathfontfamily); + fnode.appendChild(node); + return fnode; + } + return node; +} + +function AMstrarr2docFrag(arr, linebreaks) { + var newFrag=document.createDocumentFragment(); + var expr = false; + for (var i=0; i<arr.length; i++) { + if (expr) newFrag.appendChild(AMparseMath(arr[i])); + else { + var arri = (linebreaks ? arr[i].split("\n\n") : [arr[i]]); + newFrag.appendChild(AMcreateElementXHTML("span"). + appendChild(document.createTextNode(arri[0]))); + for (var j=1; j<arri.length; j++) { + newFrag.appendChild(AMcreateElementXHTML("p")); + newFrag.appendChild(AMcreateElementXHTML("span"). + appendChild(document.createTextNode(arri[j]))); + } + } + expr = !expr; + } + return newFrag; +} + +function AMprocessNodeR(n, linebreaks) { + var mtch, str, arr, frg, i; + if (n.childNodes.length == 0) { + if ((n.nodeType!=8 || linebreaks) && + n.parentNode.nodeName!="form" && n.parentNode.nodeName!="FORM" && + n.parentNode.nodeName!="textarea" && n.parentNode.nodeName!="TEXTAREA" && + n.parentNode.nodeName!="pre" && n.parentNode.nodeName!="PRE") { + str = n.nodeValue; + if (!(str == null)) { + str = str.replace(/\r\n\r\n/g,"\n\n"); + if (doubleblankmathdelimiter) { + str = str.replace(/\x20\x20\./g," "+AMdelimiter1+"."); + str = str.replace(/\x20\x20,/g," "+AMdelimiter1+","); + str = str.replace(/\x20\x20/g," "+AMdelimiter1+" "); + } + str = str.replace(/\x20+/g," "); + str = str.replace(/\s*\r\n/g," "); + mtch = false; + str = str.replace(new RegExp(AMescape2, "g"), + function(st){mtch=true;return "AMescape2"}); + str = str.replace(new RegExp(AMescape1, "g"), + function(st){mtch=true;return "AMescape1"}); + str = str.replace(new RegExp(AMdelimiter2regexp, "g"),AMdelimiter1); + arr = str.split(AMdelimiter1); + for (i=0; i<arr.length; i++) + arr[i]=arr[i].replace(/AMescape2/g,AMdelimiter2). + replace(/AMescape1/g,AMdelimiter1); + if (arr.length>1 || mtch) { + if (checkForMathML) { + checkForMathML = false; + var nd = AMisMathMLavailable(); + AMnoMathML = nd != null; + if (AMnoMathML && notifyIfNoMathML) + if (alertIfNoMathML) + alert("To view the ASCIIMathML notation use Internet Explorer 6 +\nMathPlayer (free from www.dessci.com)\n\ + or Firefox/Mozilla/Netscape"); + else AMbody.insertBefore(nd,AMbody.childNodes[0]); + } + if (!AMnoMathML) { + frg = AMstrarr2docFrag(arr,n.nodeType==8); + var len = frg.childNodes.length; + n.parentNode.replaceChild(frg,n); + return len-1; + } else return 0; + } + } + } else return 0; + } else if (n.nodeName!="math") { + for (i=0; i<n.childNodes.length; i++) + i += AMprocessNodeR(n.childNodes[i], linebreaks); + } + return 0; +} + +function AMprocessNode(n, linebreaks, spanclassAM) { + var frag,st; + if (spanclassAM!=null) { + frag = document.getElementsByTagName("span") + for (var i=0;i<frag.length;i++) + if (frag[i].className == "AM") + AMprocessNodeR(frag[i],linebreaks); + } else { + try { + st = n.innerHTML; + } catch(err) {} + if (st==null || + st.indexOf(AMdelimiter1)!=-1 || st.indexOf(AMdelimiter2)!=-1) + AMprocessNodeR(n,linebreaks); + } + if (isIE) { //needed to match size and font of formula to surrounding text + frag = document.getElementsByTagName('math'); + for (var i=0;i<frag.length;i++) frag[i].update() + } +} + +var AMbody; +var AMnoMathML = false, AMtranslated = false; + +function translate(spanclassAM) { + if (!AMtranslated) { // run this only once + AMtranslated = true; + AMinitSymbols(); + AMbody = document.getElementsByTagName("body")[0]; + AMprocessNode(AMbody, false, spanclassAM); + } +} + +if (isIE) { // avoid adding MathPlayer info explicitly to each webpage + document.write("<object id=\"mathplayer\"\ + classid=\"clsid:32F66A20-7614-11D4-BD11-00104BD3F987\"></object>"); + document.write("<?import namespace=\"m\" implementation=\"#mathplayer\"?>"); +} + +// GO1.1 Generic onload by Brothercake +// http://www.brothercake.com/ +//onload function (replaces the onload="translate()" in the <body> tag) +function generic() +{ + translate(); +}; +//setup onload function +if(typeof window.addEventListener != 'undefined') +{ + //.. gecko, safari, konqueror and standard + window.addEventListener('load', generic, false); +} +else if(typeof document.addEventListener != 'undefined') +{ + //.. opera 7 + document.addEventListener('load', generic, false); +} +else if(typeof window.attachEvent != 'undefined') +{ + //.. win/ie + window.attachEvent('onload', generic); +} +//** remove this condition to degrade older browsers +else +{ + //.. mac/ie5 and anything else that gets this far + //if there's an existing onload function + if(typeof window.onload == 'function') + { + //store it + var existing = onload; + //add new onload handler + window.onload = function() + { + //call existing onload function + existing(); + //call generic onload function + generic(); + }; + } + else + { + //setup onload function + window.onload = generic; + } +} diff --git a/source-builder/sb/asciidoc/javascripts/LaTeXMathML.js b/source-builder/sb/asciidoc/javascripts/LaTeXMathML.js new file mode 100644 index 0000000..51dba70 --- /dev/null +++ b/source-builder/sb/asciidoc/javascripts/LaTeXMathML.js @@ -0,0 +1,1223 @@ +/*
+LaTeXMathML.js
+==============
+
+This file, in this form, is due to Douglas Woodall, June 2006.
+It contains JavaScript functions to convert (most simple) LaTeX
+math notation to Presentation MathML. It was obtained by
+downloading the file ASCIIMathML.js from
+ http://www1.chapman.edu/~jipsen/mathml/asciimathdownload/
+and modifying it so that it carries out ONLY those conversions
+that would be carried out in LaTeX. A description of the original
+file, with examples, can be found at
+ www1.chapman.edu/~jipsen/mathml/asciimath.html
+ ASCIIMathML: Math on the web for everyone
+
+Here is the header notice from the original file:
+
+ASCIIMathML.js
+==============
+This file contains JavaScript functions to convert ASCII math notation
+to Presentation MathML. The conversion is done while the (X)HTML page
+loads, and should work with Firefox/Mozilla/Netscape 7+ and Internet
+Explorer 6+MathPlayer (http://www.dessci.com/en/products/mathplayer/).
+Just add the next line to your (X)HTML page with this file in the same folder:
+This is a convenient and inexpensive solution for authoring MathML.
+
+Version 1.4.7 Dec 15, 2005, (c) Peter Jipsen http://www.chapman.edu/~jipsen
+Latest version at http://www.chapman.edu/~jipsen/mathml/ASCIIMathML.js
+For changes see http://www.chapman.edu/~jipsen/mathml/asciimathchanges.txt
+If you use it on a webpage, please send the URL to jipsen@chapman.edu
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or (at
+your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License (at http://www.gnu.org/copyleft/gpl.html)
+for more details.
+
+LaTeXMathML.js (ctd)
+==============
+
+The instructions for use are the same as for the original
+ASCIIMathML.js, except that of course the line you add to your
+file should be
+Or use absolute path names if the file is not in the same folder
+as your (X)HTML page.
+*/
+
+var checkForMathML = true; // check if browser can display MathML
+var notifyIfNoMathML = true; // display note if no MathML capability
+var alertIfNoMathML = false; // show alert box if no MathML capability
+// was "red":
+var mathcolor = ""; // change it to "" (to inherit) or any other color
+// was "serif":
+var mathfontfamily = ""; // change to "" to inherit (works in IE)
+ // or another family (e.g. "arial")
+var showasciiformulaonhover = true; // helps students learn ASCIIMath
+/*
+// Commented out by DRW -- not now used -- see DELIMITERS (twice) near the end
+var displaystyle = false; // puts limits above and below large operators
+var decimalsign = "."; // change to "," if you like, beware of `(1,2)`!
+var AMdelimiter1 = "`", AMescape1 = "\\\\`"; // can use other characters
+var AMdelimiter2 = "$", AMescape2 = "\\\\\\$", AMdelimiter2regexp = "\\$";
+var doubleblankmathdelimiter = false; // if true, x+1 is equal to `x+1`
+ // for IE this works only in <!-- -->
+//var separatetokens;// has been removed (email me if this is a problem)
+*/
+var isIE = document.createElementNS==null;
+
+if (document.getElementById==null)
+ alert("This webpage requires a recent browser such as\
+\nMozilla/Netscape 7+ or Internet Explorer 6+MathPlayer")
+
+// all further global variables start with "AM"
+
+function AMcreateElementXHTML(t) {
+ if (isIE) return document.createElement(t);
+ else return document.createElementNS("http://www.w3.org/1999/xhtml",t);
+}
+
+function AMnoMathMLNote() {
+ var nd = AMcreateElementXHTML("h3");
+ nd.setAttribute("align","center")
+ nd.appendChild(AMcreateElementXHTML("p"));
+ nd.appendChild(document.createTextNode("To view the "));
+ var an = AMcreateElementXHTML("a");
+ an.appendChild(document.createTextNode("LaTeXMathML"));
+ an.setAttribute("href","http://www.maths.nott.ac.uk/personal/drw/lm.html");
+ nd.appendChild(an);
+ nd.appendChild(document.createTextNode(" notation use Internet Explorer 6+"));
+ an = AMcreateElementXHTML("a");
+ an.appendChild(document.createTextNode("MathPlayer"));
+ an.setAttribute("href","http://www.dessci.com/en/products/mathplayer/download.htm");
+ nd.appendChild(an);
+ nd.appendChild(document.createTextNode(" or Netscape/Mozilla/Firefox"));
+ nd.appendChild(AMcreateElementXHTML("p"));
+ return nd;
+}
+
+function AMisMathMLavailable() {
+ if (navigator.appName.slice(0,8)=="Netscape")
+ if (navigator.appVersion.slice(0,1)>="5") return null;
+ else return AMnoMathMLNote();
+ else if (navigator.appName.slice(0,9)=="Microsoft")
+ try {
+ var ActiveX = new ActiveXObject("MathPlayer.Factory.1");
+ return null;
+ } catch (e) {
+ return AMnoMathMLNote();
+ }
+ else return AMnoMathMLNote();
+}
+
+// character lists for Mozilla/Netscape fonts
+var AMcal = [0xEF35,0x212C,0xEF36,0xEF37,0x2130,0x2131,0xEF38,0x210B,0x2110,0xEF39,0xEF3A,0x2112,0x2133,0xEF3B,0xEF3C,0xEF3D,0xEF3E,0x211B,0xEF3F,0xEF40,0xEF41,0xEF42,0xEF43,0xEF44,0xEF45,0xEF46];
+var AMfrk = [0xEF5D,0xEF5E,0x212D,0xEF5F,0xEF60,0xEF61,0xEF62,0x210C,0x2111,0xEF63,0xEF64,0xEF65,0xEF66,0xEF67,0xEF68,0xEF69,0xEF6A,0x211C,0xEF6B,0xEF6C,0xEF6D,0xEF6E,0xEF6F,0xEF70,0xEF71,0x2128];
+var AMbbb = [0xEF8C,0xEF8D,0x2102,0xEF8E,0xEF8F,0xEF90,0xEF91,0x210D,0xEF92,0xEF93,0xEF94,0xEF95,0xEF96,0x2115,0xEF97,0x2119,0x211A,0x211D,0xEF98,0xEF99,0xEF9A,0xEF9B,0xEF9C,0xEF9D,0xEF9E,0x2124];
+
+var CONST = 0, UNARY = 1, BINARY = 2, INFIX = 3, LEFTBRACKET = 4,
+ RIGHTBRACKET = 5, SPACE = 6, UNDEROVER = 7, DEFINITION = 8,
+ TEXT = 9, BIG = 10, LONG = 11, STRETCHY = 12, MATRIX = 13; // token types
+
+var AMsqrt = {input:"\\sqrt", tag:"msqrt", output:"sqrt", ttype:UNARY},
+ AMroot = {input:"\\root", tag:"mroot", output:"root", ttype:BINARY},
+ AMfrac = {input:"\\frac", tag:"mfrac", output:"/", ttype:BINARY},
+ AMover = {input:"\\stackrel", tag:"mover", output:"stackrel", ttype:BINARY},
+ AMatop = {input:"\\atop", tag:"mfrac", output:"", ttype:INFIX},
+ AMchoose = {input:"\\choose", tag:"mfrac", output:"", ttype:INFIX},
+ AMsub = {input:"_", tag:"msub", output:"_", ttype:INFIX},
+ AMsup = {input:"^", tag:"msup", output:"^", ttype:INFIX},
+ AMtext = {input:"\\mathrm", tag:"mtext", output:"text", ttype:TEXT},
+ AMmbox = {input:"\\mbox", tag:"mtext", output:"mbox", ttype:TEXT};
+
+// Commented out by DRW to prevent 1/2 turning into a 2-line fraction
+// AMdiv = {input:"/", tag:"mfrac", output:"/", ttype:INFIX},
+// Commented out by DRW so that " prints literally in equations
+// AMquote = {input:"\"", tag:"mtext", output:"mbox", ttype:TEXT};
+
+var AMsymbols = [
+//Greek letters
+{input:"\\alpha", tag:"mi", output:"\u03B1", ttype:CONST},
+{input:"\\beta", tag:"mi", output:"\u03B2", ttype:CONST},
+{input:"\\gamma", tag:"mi", output:"\u03B3", ttype:CONST},
+{input:"\\delta", tag:"mi", output:"\u03B4", ttype:CONST},
+{input:"\\epsilon", tag:"mi", output:"\u03B5", ttype:CONST},
+{input:"\\varepsilon", tag:"mi", output:"\u025B", ttype:CONST},
+{input:"\\zeta", tag:"mi", output:"\u03B6", ttype:CONST},
+{input:"\\eta", tag:"mi", output:"\u03B7", ttype:CONST},
+{input:"\\theta", tag:"mi", output:"\u03B8", ttype:CONST},
+{input:"\\vartheta", tag:"mi", output:"\u03D1", ttype:CONST},
+{input:"\\iota", tag:"mi", output:"\u03B9", ttype:CONST},
+{input:"\\kappa", tag:"mi", output:"\u03BA", ttype:CONST},
+{input:"\\lambda", tag:"mi", output:"\u03BB", ttype:CONST},
+{input:"\\mu", tag:"mi", output:"\u03BC", ttype:CONST},
+{input:"\\nu", tag:"mi", output:"\u03BD", ttype:CONST},
+{input:"\\xi", tag:"mi", output:"\u03BE", ttype:CONST},
+{input:"\\pi", tag:"mi", output:"\u03C0", ttype:CONST},
+{input:"\\varpi", tag:"mi", output:"\u03D6", ttype:CONST},
+{input:"\\rho", tag:"mi", output:"\u03C1", ttype:CONST},
+{input:"\\varrho", tag:"mi", output:"\u03F1", ttype:CONST},
+{input:"\\varsigma", tag:"mi", output:"\u03C2", ttype:CONST},
+{input:"\\sigma", tag:"mi", output:"\u03C3", ttype:CONST},
+{input:"\\tau", tag:"mi", output:"\u03C4", ttype:CONST},
+{input:"\\upsilon", tag:"mi", output:"\u03C5", ttype:CONST},
+{input:"\\phi", tag:"mi", output:"\u03C6", ttype:CONST},
+{input:"\\varphi", tag:"mi", output:"\u03D5", ttype:CONST},
+{input:"\\chi", tag:"mi", output:"\u03C7", ttype:CONST},
+{input:"\\psi", tag:"mi", output:"\u03C8", ttype:CONST},
+{input:"\\omega", tag:"mi", output:"\u03C9", ttype:CONST},
+{input:"\\Gamma", tag:"mo", output:"\u0393", ttype:CONST},
+{input:"\\Delta", tag:"mo", output:"\u0394", ttype:CONST},
+{input:"\\Theta", tag:"mo", output:"\u0398", ttype:CONST},
+{input:"\\Lambda", tag:"mo", output:"\u039B", ttype:CONST},
+{input:"\\Xi", tag:"mo", output:"\u039E", ttype:CONST},
+{input:"\\Pi", tag:"mo", output:"\u03A0", ttype:CONST},
+{input:"\\Sigma", tag:"mo", output:"\u03A3", ttype:CONST},
+{input:"\\Upsilon", tag:"mo", output:"\u03A5", ttype:CONST},
+{input:"\\Phi", tag:"mo", output:"\u03A6", ttype:CONST},
+{input:"\\Psi", tag:"mo", output:"\u03A8", ttype:CONST},
+{input:"\\Omega", tag:"mo", output:"\u03A9", ttype:CONST},
+
+//fractions
+{input:"\\frac12", tag:"mo", output:"\u00BD", ttype:CONST},
+{input:"\\frac14", tag:"mo", output:"\u00BC", ttype:CONST},
+{input:"\\frac34", tag:"mo", output:"\u00BE", ttype:CONST},
+{input:"\\frac13", tag:"mo", output:"\u2153", ttype:CONST},
+{input:"\\frac23", tag:"mo", output:"\u2154", ttype:CONST},
+{input:"\\frac15", tag:"mo", output:"\u2155", ttype:CONST},
+{input:"\\frac25", tag:"mo", output:"\u2156", ttype:CONST},
+{input:"\\frac35", tag:"mo", output:"\u2157", ttype:CONST},
+{input:"\\frac45", tag:"mo", output:"\u2158", ttype:CONST},
+{input:"\\frac16", tag:"mo", output:"\u2159", ttype:CONST},
+{input:"\\frac56", tag:"mo", output:"\u215A", ttype:CONST},
+{input:"\\frac18", tag:"mo", output:"\u215B", ttype:CONST},
+{input:"\\frac38", tag:"mo", output:"\u215C", ttype:CONST},
+{input:"\\frac58", tag:"mo", output:"\u215D", ttype:CONST},
+{input:"\\frac78", tag:"mo", output:"\u215E", ttype:CONST},
+
+//binary operation symbols
+{input:"\\pm", tag:"mo", output:"\u00B1", ttype:CONST},
+{input:"\\mp", tag:"mo", output:"\u2213", ttype:CONST},
+{input:"\\triangleleft",tag:"mo", output:"\u22B2", ttype:CONST},
+{input:"\\triangleright",tag:"mo",output:"\u22B3", ttype:CONST},
+{input:"\\cdot", tag:"mo", output:"\u22C5", ttype:CONST},
+{input:"\\star", tag:"mo", output:"\u22C6", ttype:CONST},
+{input:"\\ast", tag:"mo", output:"\u002A", ttype:CONST},
+{input:"\\times", tag:"mo", output:"\u00D7", ttype:CONST},
+{input:"\\div", tag:"mo", output:"\u00F7", ttype:CONST},
+{input:"\\circ", tag:"mo", output:"\u2218", ttype:CONST},
+//{input:"\\bullet", tag:"mo", output:"\u2219", ttype:CONST},
+{input:"\\bullet", tag:"mo", output:"\u2022", ttype:CONST},
+{input:"\\oplus", tag:"mo", output:"\u2295", ttype:CONST},
+{input:"\\ominus", tag:"mo", output:"\u2296", ttype:CONST},
+{input:"\\otimes", tag:"mo", output:"\u2297", ttype:CONST},
+{input:"\\bigcirc", tag:"mo", output:"\u25CB", ttype:CONST},
+{input:"\\oslash", tag:"mo", output:"\u2298", ttype:CONST},
+{input:"\\odot", tag:"mo", output:"\u2299", ttype:CONST},
+{input:"\\land", tag:"mo", output:"\u2227", ttype:CONST},
+{input:"\\wedge", tag:"mo", output:"\u2227", ttype:CONST},
+{input:"\\lor", tag:"mo", output:"\u2228", ttype:CONST},
+{input:"\\vee", tag:"mo", output:"\u2228", ttype:CONST},
+{input:"\\cap", tag:"mo", output:"\u2229", ttype:CONST},
+{input:"\\cup", tag:"mo", output:"\u222A", ttype:CONST},
+{input:"\\sqcap", tag:"mo", output:"\u2293", ttype:CONST},
+{input:"\\sqcup", tag:"mo", output:"\u2294", ttype:CONST},
+{input:"\\uplus", tag:"mo", output:"\u228E", ttype:CONST},
+{input:"\\amalg", tag:"mo", output:"\u2210", ttype:CONST},
+{input:"\\bigtriangleup",tag:"mo",output:"\u25B3", ttype:CONST},
+{input:"\\bigtriangledown",tag:"mo",output:"\u25BD", ttype:CONST},
+{input:"\\dag", tag:"mo", output:"\u2020", ttype:CONST},
+{input:"\\dagger", tag:"mo", output:"\u2020", ttype:CONST},
+{input:"\\ddag", tag:"mo", output:"\u2021", ttype:CONST},
+{input:"\\ddagger", tag:"mo", output:"\u2021", ttype:CONST},
+{input:"\\lhd", tag:"mo", output:"\u22B2", ttype:CONST},
+{input:"\\rhd", tag:"mo", output:"\u22B3", ttype:CONST},
+{input:"\\unlhd", tag:"mo", output:"\u22B4", ttype:CONST},
+{input:"\\unrhd", tag:"mo", output:"\u22B5", ttype:CONST},
+
+
+//BIG Operators
+{input:"\\sum", tag:"mo", output:"\u2211", ttype:UNDEROVER},
+{input:"\\prod", tag:"mo", output:"\u220F", ttype:UNDEROVER},
+{input:"\\bigcap", tag:"mo", output:"\u22C2", ttype:UNDEROVER},
+{input:"\\bigcup", tag:"mo", output:"\u22C3", ttype:UNDEROVER},
+{input:"\\bigwedge", tag:"mo", output:"\u22C0", ttype:UNDEROVER},
+{input:"\\bigvee", tag:"mo", output:"\u22C1", ttype:UNDEROVER},
+{input:"\\bigsqcap", tag:"mo", output:"\u2A05", ttype:UNDEROVER},
+{input:"\\bigsqcup", tag:"mo", output:"\u2A06", ttype:UNDEROVER},
+{input:"\\coprod", tag:"mo", output:"\u2210", ttype:UNDEROVER},
+{input:"\\bigoplus", tag:"mo", output:"\u2A01", ttype:UNDEROVER},
+{input:"\\bigotimes", tag:"mo", output:"\u2A02", ttype:UNDEROVER},
+{input:"\\bigodot", tag:"mo", output:"\u2A00", ttype:UNDEROVER},
+{input:"\\biguplus", tag:"mo", output:"\u2A04", ttype:UNDEROVER},
+{input:"\\int", tag:"mo", output:"\u222B", ttype:CONST},
+{input:"\\oint", tag:"mo", output:"\u222E", ttype:CONST},
+
+//binary relation symbols
+{input:":=", tag:"mo", output:":=", ttype:CONST},
+{input:"\\lt", tag:"mo", output:"<", ttype:CONST},
+{input:"\\gt", tag:"mo", output:">", ttype:CONST},
+{input:"\\ne", tag:"mo", output:"\u2260", ttype:CONST},
+{input:"\\neq", tag:"mo", output:"\u2260", ttype:CONST},
+{input:"\\le", tag:"mo", output:"\u2264", ttype:CONST},
+{input:"\\leq", tag:"mo", output:"\u2264", ttype:CONST},
+{input:"\\leqslant", tag:"mo", output:"\u2264", ttype:CONST},
+{input:"\\ge", tag:"mo", output:"\u2265", ttype:CONST},
+{input:"\\geq", tag:"mo", output:"\u2265", ttype:CONST},
+{input:"\\geqslant", tag:"mo", output:"\u2265", ttype:CONST},
+{input:"\\equiv", tag:"mo", output:"\u2261", ttype:CONST},
+{input:"\\ll", tag:"mo", output:"\u226A", ttype:CONST},
+{input:"\\gg", tag:"mo", output:"\u226B", ttype:CONST},
+{input:"\\doteq", tag:"mo", output:"\u2250", ttype:CONST},
+{input:"\\prec", tag:"mo", output:"\u227A", ttype:CONST},
+{input:"\\succ", tag:"mo", output:"\u227B", ttype:CONST},
+{input:"\\preceq", tag:"mo", output:"\u227C", ttype:CONST},
+{input:"\\succeq", tag:"mo", output:"\u227D", ttype:CONST},
+{input:"\\subset", tag:"mo", output:"\u2282", ttype:CONST},
+{input:"\\supset", tag:"mo", output:"\u2283", ttype:CONST},
+{input:"\\subseteq", tag:"mo", output:"\u2286", ttype:CONST},
+{input:"\\supseteq", tag:"mo", output:"\u2287", ttype:CONST},
+{input:"\\sqsubset", tag:"mo", output:"\u228F", ttype:CONST},
+{input:"\\sqsupset", tag:"mo", output:"\u2290", ttype:CONST},
+{input:"\\sqsubseteq", tag:"mo", output:"\u2291", ttype:CONST},
+{input:"\\sqsupseteq", tag:"mo", output:"\u2292", ttype:CONST},
+{input:"\\sim", tag:"mo", output:"\u223C", ttype:CONST},
+{input:"\\simeq", tag:"mo", output:"\u2243", ttype:CONST},
+{input:"\\approx", tag:"mo", output:"\u2248", ttype:CONST},
+{input:"\\cong", tag:"mo", output:"\u2245", ttype:CONST},
+{input:"\\Join", tag:"mo", output:"\u22C8", ttype:CONST},
+{input:"\\bowtie", tag:"mo", output:"\u22C8", ttype:CONST},
+{input:"\\in", tag:"mo", output:"\u2208", ttype:CONST},
+{input:"\\ni", tag:"mo", output:"\u220B", ttype:CONST},
+{input:"\\owns", tag:"mo", output:"\u220B", ttype:CONST},
+{input:"\\propto", tag:"mo", output:"\u221D", ttype:CONST},
+{input:"\\vdash", tag:"mo", output:"\u22A2", ttype:CONST},
+{input:"\\dashv", tag:"mo", output:"\u22A3", ttype:CONST},
+{input:"\\models", tag:"mo", output:"\u22A8", ttype:CONST},
+{input:"\\perp", tag:"mo", output:"\u22A5", ttype:CONST},
+{input:"\\smile", tag:"mo", output:"\u2323", ttype:CONST},
+{input:"\\frown", tag:"mo", output:"\u2322", ttype:CONST},
+{input:"\\asymp", tag:"mo", output:"\u224D", ttype:CONST},
+{input:"\\notin", tag:"mo", output:"\u2209", ttype:CONST},
+
+//matrices
+{input:"\\begin{eqnarray}", output:"X", ttype:MATRIX, invisible:true},
+{input:"\\begin{array}", output:"X", ttype:MATRIX, invisible:true},
+{input:"\\\\", output:"}&{", ttype:DEFINITION},
+{input:"\\end{eqnarray}", output:"}}", ttype:DEFINITION},
+{input:"\\end{array}", output:"}}", ttype:DEFINITION},
+
+//grouping and literal brackets -- ieval is for IE
+{input:"\\big", tag:"mo", output:"X", atval:"1.2", ieval:"2.2", ttype:BIG},
+{input:"\\Big", tag:"mo", output:"X", atval:"1.6", ieval:"2.6", ttype:BIG},
+{input:"\\bigg", tag:"mo", output:"X", atval:"2.2", ieval:"3.2", ttype:BIG},
+{input:"\\Bigg", tag:"mo", output:"X", atval:"2.9", ieval:"3.9", ttype:BIG},
+{input:"\\left", tag:"mo", output:"X", ttype:LEFTBRACKET},
+{input:"\\right", tag:"mo", output:"X", ttype:RIGHTBRACKET},
+{input:"{", output:"{", ttype:LEFTBRACKET, invisible:true},
+{input:"}", output:"}", ttype:RIGHTBRACKET, invisible:true},
+
+{input:"(", tag:"mo", output:"(", atval:"1", ttype:STRETCHY},
+{input:"[", tag:"mo", output:"[", atval:"1", ttype:STRETCHY},
+{input:"\\lbrack", tag:"mo", output:"[", atval:"1", ttype:STRETCHY},
+{input:"\\{", tag:"mo", output:"{", atval:"1", ttype:STRETCHY},
+{input:"\\lbrace", tag:"mo", output:"{", atval:"1", ttype:STRETCHY},
+{input:"\\langle", tag:"mo", output:"\u2329", atval:"1", ttype:STRETCHY},
+{input:"\\lfloor", tag:"mo", output:"\u230A", atval:"1", ttype:STRETCHY},
+{input:"\\lceil", tag:"mo", output:"\u2308", atval:"1", ttype:STRETCHY},
+
+// rtag:"mi" causes space to be inserted before a following sin, cos, etc.
+// (see function AMparseExpr() )
+{input:")", tag:"mo",output:")", rtag:"mi",atval:"1",ttype:STRETCHY},
+{input:"]", tag:"mo",output:"]", rtag:"mi",atval:"1",ttype:STRETCHY},
+{input:"\\rbrack",tag:"mo",output:"]", rtag:"mi",atval:"1",ttype:STRETCHY},
+{input:"\\}", tag:"mo",output:"}", rtag:"mi",atval:"1",ttype:STRETCHY},
+{input:"\\rbrace",tag:"mo",output:"}", rtag:"mi",atval:"1",ttype:STRETCHY},
+{input:"\\rangle",tag:"mo",output:"\u232A", rtag:"mi",atval:"1",ttype:STRETCHY},
+{input:"\\rfloor",tag:"mo",output:"\u230B", rtag:"mi",atval:"1",ttype:STRETCHY},
+{input:"\\rceil", tag:"mo",output:"\u2309", rtag:"mi",atval:"1",ttype:STRETCHY},
+
+// "|", "\\|", "\\vert" and "\\Vert" modified later: lspace = rspace = 0em
+{input:"|", tag:"mo", output:"\u2223", atval:"1", ttype:STRETCHY},
+{input:"\\|", tag:"mo", output:"\u2225", atval:"1", ttype:STRETCHY},
+{input:"\\vert", tag:"mo", output:"\u2223", atval:"1", ttype:STRETCHY},
+{input:"\\Vert", tag:"mo", output:"\u2225", atval:"1", ttype:STRETCHY},
+{input:"\\mid", tag:"mo", output:"\u2223", atval:"1", ttype:STRETCHY},
+{input:"\\parallel", tag:"mo", output:"\u2225", atval:"1", ttype:STRETCHY},
+{input:"/", tag:"mo", output:"/", atval:"1.01", ttype:STRETCHY},
+{input:"\\backslash", tag:"mo", output:"\u2216", atval:"1", ttype:STRETCHY},
+{input:"\\setminus", tag:"mo", output:"\\", ttype:CONST},
+
+//miscellaneous symbols
+{input:"\\!", tag:"mspace", atname:"width", atval:"-0.167em", ttype:SPACE},
+{input:"\\,", tag:"mspace", atname:"width", atval:"0.167em", ttype:SPACE},
+{input:"\\>", tag:"mspace", atname:"width", atval:"0.222em", ttype:SPACE},
+{input:"\\:", tag:"mspace", atname:"width", atval:"0.222em", ttype:SPACE},
+{input:"\\;", tag:"mspace", atname:"width", atval:"0.278em", ttype:SPACE},
+{input:"~", tag:"mspace", atname:"width", atval:"0.333em", ttype:SPACE},
+{input:"\\quad", tag:"mspace", atname:"width", atval:"1em", ttype:SPACE},
+{input:"\\qquad", tag:"mspace", atname:"width", atval:"2em", ttype:SPACE},
+//{input:"{}", tag:"mo", output:"\u200B", ttype:CONST}, // zero-width
+{input:"\\prime", tag:"mo", output:"\u2032", ttype:CONST},
+{input:"'", tag:"mo", output:"\u02B9", ttype:CONST},
+{input:"''", tag:"mo", output:"\u02BA", ttype:CONST},
+{input:"'''", tag:"mo", output:"\u2034", ttype:CONST},
+{input:"''''", tag:"mo", output:"\u2057", ttype:CONST},
+{input:"\\ldots", tag:"mo", output:"\u2026", ttype:CONST},
+{input:"\\cdots", tag:"mo", output:"\u22EF", ttype:CONST},
+{input:"\\vdots", tag:"mo", output:"\u22EE", ttype:CONST},
+{input:"\\ddots", tag:"mo", output:"\u22F1", ttype:CONST},
+{input:"\\forall", tag:"mo", output:"\u2200", ttype:CONST},
+{input:"\\exists", tag:"mo", output:"\u2203", ttype:CONST},
+{input:"\\Re", tag:"mo", output:"\u211C", ttype:CONST},
+{input:"\\Im", tag:"mo", output:"\u2111", ttype:CONST},
+{input:"\\aleph", tag:"mo", output:"\u2135", ttype:CONST},
+{input:"\\hbar", tag:"mo", output:"\u210F", ttype:CONST},
+{input:"\\ell", tag:"mo", output:"\u2113", ttype:CONST},
+{input:"\\wp", tag:"mo", output:"\u2118", ttype:CONST},
+{input:"\\emptyset", tag:"mo", output:"\u2205", ttype:CONST},
+{input:"\\infty", tag:"mo", output:"\u221E", ttype:CONST},
+{input:"\\surd", tag:"mo", output:"\\sqrt{}", ttype:DEFINITION},
+{input:"\\partial", tag:"mo", output:"\u2202", ttype:CONST},
+{input:"\\nabla", tag:"mo", output:"\u2207", ttype:CONST},
+{input:"\\triangle", tag:"mo", output:"\u25B3", ttype:CONST},
+{input:"\\therefore", tag:"mo", output:"\u2234", ttype:CONST},
+{input:"\\angle", tag:"mo", output:"\u2220", ttype:CONST},
+//{input:"\\\\ ", tag:"mo", output:"\u00A0", ttype:CONST},
+{input:"\\diamond", tag:"mo", output:"\u22C4", ttype:CONST},
+//{input:"\\Diamond", tag:"mo", output:"\u25CA", ttype:CONST},
+{input:"\\Diamond", tag:"mo", output:"\u25C7", ttype:CONST},
+{input:"\\neg", tag:"mo", output:"\u00AC", ttype:CONST},
+{input:"\\lnot", tag:"mo", output:"\u00AC", ttype:CONST},
+{input:"\\bot", tag:"mo", output:"\u22A5", ttype:CONST},
+{input:"\\top", tag:"mo", output:"\u22A4", ttype:CONST},
+{input:"\\square", tag:"mo", output:"\u25AB", ttype:CONST},
+{input:"\\Box", tag:"mo", output:"\u25A1", ttype:CONST},
+{input:"\\wr", tag:"mo", output:"\u2240", ttype:CONST},
+
+//standard functions
+//Note UNDEROVER *must* have tag:"mo" to work properly
+{input:"\\arccos", tag:"mi", output:"arccos", ttype:UNARY, func:true},
+{input:"\\arcsin", tag:"mi", output:"arcsin", ttype:UNARY, func:true},
+{input:"\\arctan", tag:"mi", output:"arctan", ttype:UNARY, func:true},
+{input:"\\arg", tag:"mi", output:"arg", ttype:UNARY, func:true},
+{input:"\\cos", tag:"mi", output:"cos", ttype:UNARY, func:true},
+{input:"\\cosh", tag:"mi", output:"cosh", ttype:UNARY, func:true},
+{input:"\\cot", tag:"mi", output:"cot", ttype:UNARY, func:true},
+{input:"\\coth", tag:"mi", output:"coth", ttype:UNARY, func:true},
+{input:"\\csc", tag:"mi", output:"csc", ttype:UNARY, func:true},
+{input:"\\deg", tag:"mi", output:"deg", ttype:UNARY, func:true},
+{input:"\\det", tag:"mi", output:"det", ttype:UNARY, func:true},
+{input:"\\dim", tag:"mi", output:"dim", ttype:UNARY, func:true}, //CONST?
+{input:"\\exp", tag:"mi", output:"exp", ttype:UNARY, func:true},
+{input:"\\gcd", tag:"mi", output:"gcd", ttype:UNARY, func:true}, //CONST?
+{input:"\\hom", tag:"mi", output:"hom", ttype:UNARY, func:true},
+{input:"\\inf", tag:"mo", output:"inf", ttype:UNDEROVER},
+{input:"\\ker", tag:"mi", output:"ker", ttype:UNARY, func:true},
+{input:"\\lg", tag:"mi", output:"lg", ttype:UNARY, func:true},
+{input:"\\lim", tag:"mo", output:"lim", ttype:UNDEROVER},
+{input:"\\liminf", tag:"mo", output:"liminf", ttype:UNDEROVER},
+{input:"\\limsup", tag:"mo", output:"limsup", ttype:UNDEROVER},
+{input:"\\ln", tag:"mi", output:"ln", ttype:UNARY, func:true},
+{input:"\\log", tag:"mi", output:"log", ttype:UNARY, func:true},
+{input:"\\max", tag:"mo", output:"max", ttype:UNDEROVER},
+{input:"\\min", tag:"mo", output:"min", ttype:UNDEROVER},
+{input:"\\Pr", tag:"mi", output:"Pr", ttype:UNARY, func:true},
+{input:"\\sec", tag:"mi", output:"sec", ttype:UNARY, func:true},
+{input:"\\sin", tag:"mi", output:"sin", ttype:UNARY, func:true},
+{input:"\\sinh", tag:"mi", output:"sinh", ttype:UNARY, func:true},
+{input:"\\sup", tag:"mo", output:"sup", ttype:UNDEROVER},
+{input:"\\tan", tag:"mi", output:"tan", ttype:UNARY, func:true},
+{input:"\\tanh", tag:"mi", output:"tanh", ttype:UNARY, func:true},
+
+//arrows
+{input:"\\gets", tag:"mo", output:"\u2190", ttype:CONST},
+{input:"\\leftarrow", tag:"mo", output:"\u2190", ttype:CONST},
+{input:"\\to", tag:"mo", output:"\u2192", ttype:CONST},
+{input:"\\rightarrow", tag:"mo", output:"\u2192", ttype:CONST},
+{input:"\\leftrightarrow", tag:"mo", output:"\u2194", ttype:CONST},
+{input:"\\uparrow", tag:"mo", output:"\u2191", ttype:CONST},
+{input:"\\downarrow", tag:"mo", output:"\u2193", ttype:CONST},
+{input:"\\updownarrow", tag:"mo", output:"\u2195", ttype:CONST},
+{input:"\\Leftarrow", tag:"mo", output:"\u21D0", ttype:CONST},
+{input:"\\Rightarrow", tag:"mo", output:"\u21D2", ttype:CONST},
+{input:"\\Leftrightarrow", tag:"mo", output:"\u21D4", ttype:CONST},
+{input:"\\iff", tag:"mo", output:"~\\Longleftrightarrow~", ttype:DEFINITION},
+{input:"\\Uparrow", tag:"mo", output:"\u21D1", ttype:CONST},
+{input:"\\Downarrow", tag:"mo", output:"\u21D3", ttype:CONST},
+{input:"\\Updownarrow", tag:"mo", output:"\u21D5", ttype:CONST},
+{input:"\\mapsto", tag:"mo", output:"\u21A6", ttype:CONST},
+{input:"\\longleftarrow", tag:"mo", output:"\u2190", ttype:LONG},
+{input:"\\longrightarrow", tag:"mo", output:"\u2192", ttype:LONG},
+{input:"\\longleftrightarrow", tag:"mo", output:"\u2194", ttype:LONG},
+{input:"\\Longleftarrow", tag:"mo", output:"\u21D0", ttype:LONG},
+{input:"\\Longrightarrow", tag:"mo", output:"\u21D2", ttype:LONG},
+{input:"\\Longleftrightarrow", tag:"mo", output:"\u21D4", ttype:LONG},
+{input:"\\longmapsto", tag:"mo", output:"\u21A6", ttype:CONST},
+ // disaster if LONG
+
+//commands with argument
+AMsqrt, AMroot, AMfrac, AMover, AMsub, AMsup, AMtext, AMmbox, AMatop, AMchoose,
+//AMdiv, AMquote,
+
+//diacritical marks
+{input:"\\acute", tag:"mover", output:"\u00B4", ttype:UNARY, acc:true},
+//{input:"\\acute", tag:"mover", output:"\u0317", ttype:UNARY, acc:true},
+//{input:"\\acute", tag:"mover", output:"\u0301", ttype:UNARY, acc:true},
+//{input:"\\grave", tag:"mover", output:"\u0300", ttype:UNARY, acc:true},
+//{input:"\\grave", tag:"mover", output:"\u0316", ttype:UNARY, acc:true},
+{input:"\\grave", tag:"mover", output:"\u0060", ttype:UNARY, acc:true},
+{input:"\\breve", tag:"mover", output:"\u02D8", ttype:UNARY, acc:true},
+{input:"\\check", tag:"mover", output:"\u02C7", ttype:UNARY, acc:true},
+{input:"\\dot", tag:"mover", output:".", ttype:UNARY, acc:true},
+{input:"\\ddot", tag:"mover", output:"..", ttype:UNARY, acc:true},
+//{input:"\\ddot", tag:"mover", output:"\u00A8", ttype:UNARY, acc:true},
+{input:"\\mathring", tag:"mover", output:"\u00B0", ttype:UNARY, acc:true},
+{input:"\\vec", tag:"mover", output:"\u20D7", ttype:UNARY, acc:true},
+{input:"\\overrightarrow",tag:"mover",output:"\u20D7", ttype:UNARY, acc:true},
+{input:"\\overleftarrow",tag:"mover", output:"\u20D6", ttype:UNARY, acc:true},
+{input:"\\hat", tag:"mover", output:"\u005E", ttype:UNARY, acc:true},
+{input:"\\widehat", tag:"mover", output:"\u0302", ttype:UNARY, acc:true},
+{input:"\\tilde", tag:"mover", output:"~", ttype:UNARY, acc:true},
+//{input:"\\tilde", tag:"mover", output:"\u0303", ttype:UNARY, acc:true},
+{input:"\\widetilde", tag:"mover", output:"\u02DC", ttype:UNARY, acc:true},
+{input:"\\bar", tag:"mover", output:"\u203E", ttype:UNARY, acc:true},
+{input:"\\overbrace", tag:"mover", output:"\u23B4", ttype:UNARY, acc:true},
+{input:"\\overline", tag:"mover", output:"\u00AF", ttype:UNARY, acc:true},
+{input:"\\underbrace", tag:"munder", output:"\u23B5", ttype:UNARY, acc:true},
+{input:"\\underline", tag:"munder", output:"\u00AF", ttype:UNARY, acc:true},
+//{input:"underline", tag:"munder", output:"\u0332", ttype:UNARY, acc:true},
+
+//typestyles and fonts
+{input:"\\displaystyle",tag:"mstyle",atname:"displaystyle",atval:"true", ttype:UNARY},
+{input:"\\textstyle",tag:"mstyle",atname:"displaystyle",atval:"false", ttype:UNARY},
+{input:"\\scriptstyle",tag:"mstyle",atname:"scriptlevel",atval:"1", ttype:UNARY},
+{input:"\\scriptscriptstyle",tag:"mstyle",atname:"scriptlevel",atval:"2", ttype:UNARY},
+{input:"\\textrm", tag:"mstyle", output:"\\mathrm", ttype: DEFINITION},
+{input:"\\mathbf", tag:"mstyle", atname:"mathvariant", atval:"bold", ttype:UNARY},
+{input:"\\textbf", tag:"mstyle", atname:"mathvariant", atval:"bold", ttype:UNARY},
+{input:"\\mathit", tag:"mstyle", atname:"mathvariant", atval:"italic", ttype:UNARY},
+{input:"\\textit", tag:"mstyle", atname:"mathvariant", atval:"italic", ttype:UNARY},
+{input:"\\mathtt", tag:"mstyle", atname:"mathvariant", atval:"monospace", ttype:UNARY},
+{input:"\\texttt", tag:"mstyle", atname:"mathvariant", atval:"monospace", ttype:UNARY},
+{input:"\\mathsf", tag:"mstyle", atname:"mathvariant", atval:"sans-serif", ttype:UNARY},
+{input:"\\mathbb", tag:"mstyle", atname:"mathvariant", atval:"double-struck", ttype:UNARY, codes:AMbbb},
+{input:"\\mathcal",tag:"mstyle", atname:"mathvariant", atval:"script", ttype:UNARY, codes:AMcal},
+{input:"\\mathfrak",tag:"mstyle",atname:"mathvariant", atval:"fraktur",ttype:UNARY, codes:AMfrk}
+];
+
+function compareNames(s1,s2) {
+ if (s1.input > s2.input) return 1
+ else return -1;
+}
+
+var AMnames = []; //list of input symbols
+
+function AMinitSymbols() {
+ AMsymbols.sort(compareNames);
+ for (i=0; i<AMsymbols.length; i++) AMnames[i] = AMsymbols[i].input;
+}
+
+var AMmathml = "http://www.w3.org/1998/Math/MathML";
+
+function AMcreateElementMathML(t) {
+ if (isIE) return document.createElement("m:"+t);
+ else return document.createElementNS(AMmathml,t);
+}
+
+function AMcreateMmlNode(t,frag) {
+// var node = AMcreateElementMathML(name);
+ if (isIE) var node = document.createElement("m:"+t);
+ else var node = document.createElementNS(AMmathml,t);
+ node.appendChild(frag);
+ return node;
+}
+
+function newcommand(oldstr,newstr) {
+ AMsymbols = AMsymbols.concat([{input:oldstr, tag:"mo", output:newstr,
+ ttype:DEFINITION}]);
+}
+
+function AMremoveCharsAndBlanks(str,n) {
+//remove n characters and any following blanks
+ var st;
+ st = str.slice(n);
+ for (var i=0; i<st.length && st.charCodeAt(i)<=32; i=i+1);
+ return st.slice(i);
+}
+
+function AMposition(arr, str, n) {
+// return position >=n where str appears or would be inserted
+// assumes arr is sorted
+ if (n==0) {
+ var h,m;
+ n = -1;
+ h = arr.length;
+ while (n+1<h) {
+ m = (n+h) >> 1;
+ if (arr[m]<str) n = m; else h = m;
+ }
+ return h;
+ } else
+ for (var i=n; i<arr.length && arr[i]<str; i++);
+ return i; // i=arr.length || arr[i]>=str
+}
+
+function AMgetSymbol(str) {
+//return maximal initial substring of str that appears in names
+//return null if there is none
+ var k = 0; //new pos
+ var j = 0; //old pos
+ var mk; //match pos
+ var st;
+ var tagst;
+ var match = "";
+ var more = true;
+ for (var i=1; i<=str.length && more; i++) {
+ st = str.slice(0,i); //initial substring of length i
+ j = k;
+ k = AMposition(AMnames, st, j);
+ if (k<AMnames.length && str.slice(0,AMnames[k].length)==AMnames[k]){
+ match = AMnames[k];
+ mk = k;
+ i = match.length;
+ }
+ more = k<AMnames.length && str.slice(0,AMnames[k].length)>=AMnames[k];
+ }
+ AMpreviousSymbol=AMcurrentSymbol;
+ if (match!=""){
+ AMcurrentSymbol=AMsymbols[mk].ttype;
+ return AMsymbols[mk];
+ }
+ AMcurrentSymbol=CONST;
+ k = 1;
+ st = str.slice(0,1); //take 1 character
+ if ("0"<=st && st<="9") tagst = "mn";
+ else tagst = (("A">st || st>"Z") && ("a">st || st>"z")?"mo":"mi");
+/*
+// Commented out by DRW (not fully understood, but probably to do with
+// use of "/" as an INFIX version of "\\frac", which we don't want):
+//}
+//if (st=="-" && AMpreviousSymbol==INFIX) {
+// AMcurrentSymbol = INFIX; //trick "/" into recognizing "-" on second parse
+// return {input:st, tag:tagst, output:st, ttype:UNARY, func:true};
+//}
+*/
+ return {input:st, tag:tagst, output:st, ttype:CONST};
+}
+
+
+/*Parsing ASCII math expressions with the following grammar
+v ::= [A-Za-z] | greek letters | numbers | other constant symbols
+u ::= sqrt | text | bb | other unary symbols for font commands
+b ::= frac | root | stackrel binary symbols
+l ::= { | \left left brackets
+r ::= } | \right right brackets
+S ::= v | lEr | uS | bSS Simple expression
+I ::= S_S | S^S | S_S^S | S Intermediate expression
+E ::= IE | I/I Expression
+Each terminal symbol is translated into a corresponding mathml node.*/
+
+var AMpreviousSymbol,AMcurrentSymbol;
+
+function AMparseSexpr(str) { //parses str and returns [node,tailstr,(node)tag]
+ var symbol, node, result, result2, i, st,// rightvert = false,
+ newFrag = document.createDocumentFragment();
+ str = AMremoveCharsAndBlanks(str,0);
+ symbol = AMgetSymbol(str); //either a token or a bracket or empty
+ if (symbol == null || symbol.ttype == RIGHTBRACKET)
+ return [null,str,null];
+ if (symbol.ttype == DEFINITION) {
+ str = symbol.output+AMremoveCharsAndBlanks(str,symbol.input.length);
+ symbol = AMgetSymbol(str);
+ if (symbol == null || symbol.ttype == RIGHTBRACKET)
+ return [null,str,null];
+ }
+ str = AMremoveCharsAndBlanks(str,symbol.input.length);
+ switch (symbol.ttype) {
+ case SPACE:
+ node = AMcreateElementMathML(symbol.tag);
+ node.setAttribute(symbol.atname,symbol.atval);
+ return [node,str,symbol.tag];
+ case UNDEROVER:
+ if (isIE) {
+ if (symbol.input.substr(0,4) == "\\big") { // botch for missing symbols
+ str = "\\"+symbol.input.substr(4)+str; // make \bigcup = \cup etc.
+ symbol = AMgetSymbol(str);
+ symbol.ttype = UNDEROVER;
+ str = AMremoveCharsAndBlanks(str,symbol.input.length);
+ }
+ }
+ return [AMcreateMmlNode(symbol.tag,
+ document.createTextNode(symbol.output)),str,symbol.tag];
+ case CONST:
+ var output = symbol.output;
+ if (isIE) {
+ if (symbol.input == "'")
+ output = "\u2032";
+ else if (symbol.input == "''")
+ output = "\u2033";
+ else if (symbol.input == "'''")
+ output = "\u2033\u2032";
+ else if (symbol.input == "''''")
+ output = "\u2033\u2033";
+ else if (symbol.input == "\\square")
+ output = "\u25A1"; // same as \Box
+ else if (symbol.input.substr(0,5) == "\\frac") {
+ // botch for missing fractions
+ var denom = symbol.input.substr(6,1);
+ if (denom == "5" || denom == "6") {
+ str = symbol.input.replace(/\\frac/,"\\frac ")+str;
+ return [node,str,symbol.tag];
+ }
+ }
+ }
+ node = AMcreateMmlNode(symbol.tag,document.createTextNode(output));
+ return [node,str,symbol.tag];
+ case LONG: // added by DRW
+ node = AMcreateMmlNode(symbol.tag,document.createTextNode(symbol.output));
+ node.setAttribute("minsize","1.5");
+ node.setAttribute("maxsize","1.5");
+ node = AMcreateMmlNode("mover",node);
+ node.appendChild(AMcreateElementMathML("mspace"));
+ return [node,str,symbol.tag];
+ case STRETCHY: // added by DRW
+ if (isIE && symbol.input == "\\backslash")
+ symbol.output = "\\"; // doesn't expand, but then nor does "\u2216"
+ node = AMcreateMmlNode(symbol.tag,document.createTextNode(symbol.output));
+ if (symbol.input == "|" || symbol.input == "\\vert" ||
+ symbol.input == "\\|" || symbol.input == "\\Vert") {
+ node.setAttribute("lspace","0em");
+ node.setAttribute("rspace","0em");
+ }
+ node.setAttribute("maxsize",symbol.atval); // don't allow to stretch here
+ if (symbol.rtag != null)
+ return [node,str,symbol.rtag];
+ else
+ return [node,str,symbol.tag];
+ case BIG: // added by DRW
+ var atval = symbol.atval;
+ if (isIE)
+ atval = symbol.ieval;
+ symbol = AMgetSymbol(str);
+ if (symbol == null)
+ return [null,str,null];
+ str = AMremoveCharsAndBlanks(str,symbol.input.length);
+ node = AMcreateMmlNode(symbol.tag,document.createTextNode(symbol.output));
+ if (isIE) { // to get brackets to expand
+ var space = AMcreateElementMathML("mspace");
+ space.setAttribute("height",atval+"ex");
+ node = AMcreateMmlNode("mrow",node);
+ node.appendChild(space);
+ } else { // ignored in IE
+ node.setAttribute("minsize",atval);
+ node.setAttribute("maxsize",atval);
+ }
+ return [node,str,symbol.tag];
+ case LEFTBRACKET: //read (expr+)
+ if (symbol.input == "\\left") { // left what?
+ symbol = AMgetSymbol(str);
+ if (symbol != null) {
+ if (symbol.input == ".")
+ symbol.invisible = true;
+ str = AMremoveCharsAndBlanks(str,symbol.input.length);
+ }
+ }
+ result = AMparseExpr(str,true,false);
+ if (symbol==null ||
+ (typeof symbol.invisible == "boolean" && symbol.invisible))
+ node = AMcreateMmlNode("mrow",result[0]);
+ else {
+ node = AMcreateMmlNode("mo",document.createTextNode(symbol.output));
+ node = AMcreateMmlNode("mrow",node);
+ node.appendChild(result[0]);
+ }
+ return [node,result[1],result[2]];
+ case MATRIX: //read (expr+)
+ if (symbol.input == "\\begin{array}") {
+ var mask = "";
+ symbol = AMgetSymbol(str);
+ str = AMremoveCharsAndBlanks(str,0);
+ if (symbol == null)
+ mask = "l";
+ else {
+ str = AMremoveCharsAndBlanks(str,symbol.input.length);
+ if (symbol.input != "{")
+ mask = "l";
+ else do {
+ symbol = AMgetSymbol(str);
+ if (symbol != null) {
+ str = AMremoveCharsAndBlanks(str,symbol.input.length);
+ if (symbol.input != "}")
+ mask = mask+symbol.input;
+ }
+ } while (symbol != null && symbol.input != "" && symbol.input != "}");
+ }
+ result = AMparseExpr("{"+str,true,true);
+// if (result[0]==null) return [AMcreateMmlNode("mo",
+// document.createTextNode(symbol.input)),str];
+ node = AMcreateMmlNode("mtable",result[0]);
+ mask = mask.replace(/l/g,"left ");
+ mask = mask.replace(/r/g,"right ");
+ mask = mask.replace(/c/g,"center ");
+ node.setAttribute("columnalign",mask);
+ node.setAttribute("displaystyle","false");
+ if (isIE)
+ return [node,result[1],null];
+// trying to get a *little* bit of space around the array
+// (IE already includes it)
+ var lspace = AMcreateElementMathML("mspace");
+ lspace.setAttribute("width","0.167em");
+ var rspace = AMcreateElementMathML("mspace");
+ rspace.setAttribute("width","0.167em");
+ var node1 = AMcreateMmlNode("mrow",lspace);
+ node1.appendChild(node);
+ node1.appendChild(rspace);
+ return [node1,result[1],null];
+ } else { // eqnarray
+ result = AMparseExpr("{"+str,true,true);
+ node = AMcreateMmlNode("mtable",result[0]);
+ if (isIE)
+ node.setAttribute("columnspacing","0.25em"); // best in practice?
+ else
+ node.setAttribute("columnspacing","0.167em"); // correct (but ignored?)
+ node.setAttribute("columnalign","right center left");
+ node.setAttribute("displaystyle","true");
+ node = AMcreateMmlNode("mrow",node);
+ return [node,result[1],null];
+ }
+ case TEXT:
+ if (str.charAt(0)=="{") i=str.indexOf("}");
+ else i = 0;
+ if (i==-1)
+ i = str.length;
+ st = str.slice(1,i);
+ if (st.charAt(0) == " ") {
+ node = AMcreateElementMathML("mspace");
+ node.setAttribute("width","0.33em"); // was 1ex
+ newFrag.appendChild(node);
+ }
+ newFrag.appendChild(
+ AMcreateMmlNode(symbol.tag,document.createTextNode(st)));
+ if (st.charAt(st.length-1) == " ") {
+ node = AMcreateElementMathML("mspace");
+ node.setAttribute("width","0.33em"); // was 1ex
+ newFrag.appendChild(node);
+ }
+ str = AMremoveCharsAndBlanks(str,i+1);
+ return [AMcreateMmlNode("mrow",newFrag),str,null];
+ case UNARY:
+ result = AMparseSexpr(str);
+ if (result[0]==null) return [AMcreateMmlNode(symbol.tag,
+ document.createTextNode(symbol.output)),str];
+ if (typeof symbol.func == "boolean" && symbol.func) { // functions hack
+ st = str.charAt(0);
+// if (st=="^" || st=="_" || st=="/" || st=="|" || st==",") {
+ if (st=="^" || st=="_" || st==",") {
+ return [AMcreateMmlNode(symbol.tag,
+ document.createTextNode(symbol.output)),str,symbol.tag];
+ } else {
+ node = AMcreateMmlNode("mrow",
+ AMcreateMmlNode(symbol.tag,document.createTextNode(symbol.output)));
+ if (isIE) {
+ var space = AMcreateElementMathML("mspace");
+ space.setAttribute("width","0.167em");
+ node.appendChild(space);
+ }
+ node.appendChild(result[0]);
+ return [node,result[1],symbol.tag];
+ }
+ }
+ if (symbol.input == "\\sqrt") { // sqrt
+ if (isIE) { // set minsize, for \surd
+ var space = AMcreateElementMathML("mspace");
+ space.setAttribute("height","1.2ex");
+ space.setAttribute("width","0em"); // probably no effect
+ node = AMcreateMmlNode(symbol.tag,result[0])
+// node.setAttribute("minsize","1"); // ignored
+// node = AMcreateMmlNode("mrow",node); // hopefully unnecessary
+ node.appendChild(space);
+ return [node,result[1],symbol.tag];
+ } else
+ return [AMcreateMmlNode(symbol.tag,result[0]),result[1],symbol.tag];
+ } else if (typeof symbol.acc == "boolean" && symbol.acc) { // accent
+ node = AMcreateMmlNode(symbol.tag,result[0]);
+ var output = symbol.output;
+ if (isIE) {
+ if (symbol.input == "\\hat")
+ output = "\u0302";
+ else if (symbol.input == "\\widehat")
+ output = "\u005E";
+ else if (symbol.input == "\\bar")
+ output = "\u00AF";
+ else if (symbol.input == "\\grave")
+ output = "\u0300";
+ else if (symbol.input == "\\tilde")
+ output = "\u0303";
+ }
+ var node1 = AMcreateMmlNode("mo",document.createTextNode(output));
+ if (symbol.input == "\\vec" || symbol.input == "\\check")
+ // don't allow to stretch
+ node1.setAttribute("maxsize","1.2");
+ // why doesn't "1" work? \vec nearly disappears in firefox
+ if (isIE && symbol.input == "\\bar")
+ node1.setAttribute("maxsize","0.5");
+ if (symbol.input == "\\underbrace" || symbol.input == "\\underline")
+ node1.setAttribute("accentunder","true");
+ else
+ node1.setAttribute("accent","true");
+ node.appendChild(node1);
+ if (symbol.input == "\\overbrace" || symbol.input == "\\underbrace")
+ node.ttype = UNDEROVER;
+ return [node,result[1],symbol.tag];
+ } else { // font change or displaystyle command
+ if (!isIE && typeof symbol.codes != "undefined") {
+ for (i=0; i<result[0].childNodes.length; i++)
+ if (result[0].childNodes[i].nodeName=="mi" || result[0].nodeName=="mi") {
+ st = (result[0].nodeName=="mi"?result[0].firstChild.nodeValue:
+ result[0].childNodes[i].firstChild.nodeValue);
+ var newst = [];
+ for (var j=0; j<st.length; j++)
+ if (st.charCodeAt(j)>64 && st.charCodeAt(j)<91) newst = newst +
+ String.fromCharCode(symbol.codes[st.charCodeAt(j)-65]);
+ else newst = newst + st.charAt(j);
+ if (result[0].nodeName=="mi")
+ result[0]=AMcreateElementMathML("mo").
+ appendChild(document.createTextNode(newst));
+ else result[0].replaceChild(AMcreateElementMathML("mo").
+ appendChild(document.createTextNode(newst)),result[0].childNodes[i]);
+ }
+ }
+ node = AMcreateMmlNode(symbol.tag,result[0]);
+ node.setAttribute(symbol.atname,symbol.atval);
+ if (symbol.input == "\\scriptstyle" ||
+ symbol.input == "\\scriptscriptstyle")
+ node.setAttribute("displaystyle","false");
+ return [node,result[1],symbol.tag];
+ }
+ case BINARY:
+ result = AMparseSexpr(str);
+ if (result[0]==null) return [AMcreateMmlNode("mo",
+ document.createTextNode(symbol.input)),str,null];
+ result2 = AMparseSexpr(result[1]);
+ if (result2[0]==null) return [AMcreateMmlNode("mo",
+ document.createTextNode(symbol.input)),str,null];
+ if (symbol.input=="\\root" || symbol.input=="\\stackrel")
+ newFrag.appendChild(result2[0]);
+ newFrag.appendChild(result[0]);
+ if (symbol.input=="\\frac") newFrag.appendChild(result2[0]);
+ return [AMcreateMmlNode(symbol.tag,newFrag),result2[1],symbol.tag];
+ case INFIX:
+ str = AMremoveCharsAndBlanks(str,symbol.input.length);
+ return [AMcreateMmlNode("mo",document.createTextNode(symbol.output)),
+ str,symbol.tag];
+ default:
+ return [AMcreateMmlNode(symbol.tag, //its a constant
+ document.createTextNode(symbol.output)),str,symbol.tag];
+ }
+}
+
+function AMparseIexpr(str) {
+ var symbol, sym1, sym2, node, result, tag, underover;
+ str = AMremoveCharsAndBlanks(str,0);
+ sym1 = AMgetSymbol(str);
+ result = AMparseSexpr(str);
+ node = result[0];
+ str = result[1];
+ tag = result[2];
+ symbol = AMgetSymbol(str);
+ if (symbol.ttype == INFIX) {
+ str = AMremoveCharsAndBlanks(str,symbol.input.length);
+ result = AMparseSexpr(str);
+ if (result[0] == null) // show box in place of missing argument
+ result[0] = AMcreateMmlNode("mo",document.createTextNode("\u25A1"));
+ str = result[1];
+ tag = result[2];
+ if (symbol.input == "_" || symbol.input == "^") {
+ sym2 = AMgetSymbol(str);
+ tag = null; // no space between x^2 and a following sin, cos, etc.
+// This is for \underbrace and \overbrace
+ underover = ((sym1.ttype == UNDEROVER) || (node.ttype == UNDEROVER));
+// underover = (sym1.ttype == UNDEROVER);
+ if (symbol.input == "_" && sym2.input == "^") {
+ str = AMremoveCharsAndBlanks(str,sym2.input.length);
+ var res2 = AMparseSexpr(str);
+ str = res2[1];
+ tag = res2[2]; // leave space between x_1^2 and a following sin etc.
+ node = AMcreateMmlNode((underover?"munderover":"msubsup"),node);
+ node.appendChild(result[0]);
+ node.appendChild(res2[0]);
+ } else if (symbol.input == "_") {
+ node = AMcreateMmlNode((underover?"munder":"msub"),node);
+ node.appendChild(result[0]);
+ } else {
+ node = AMcreateMmlNode((underover?"mover":"msup"),node);
+ node.appendChild(result[0]);
+ }
+ node = AMcreateMmlNode("mrow",node); // so sum does not stretch
+ } else {
+ node = AMcreateMmlNode(symbol.tag,node);
+ if (symbol.input == "\\atop" || symbol.input == "\\choose")
+ node.setAttribute("linethickness","0ex");
+ node.appendChild(result[0]);
+ if (symbol.input == "\\choose")
+ node = AMcreateMmlNode("mfenced",node);
+ }
+ }
+ return [node,str,tag];
+}
+
+function AMparseExpr(str,rightbracket,matrix) {
+ var symbol, node, result, i, tag,
+ newFrag = document.createDocumentFragment();
+ do {
+ str = AMremoveCharsAndBlanks(str,0);
+ result = AMparseIexpr(str);
+ node = result[0];
+ str = result[1];
+ tag = result[2];
+ symbol = AMgetSymbol(str);
+ if (node!=undefined) {
+ if ((tag == "mn" || tag == "mi") && symbol!=null &&
+ typeof symbol.func == "boolean" && symbol.func) {
+ // Add space before \sin in 2\sin x or x\sin x
+ var space = AMcreateElementMathML("mspace");
+ space.setAttribute("width","0.167em");
+ node = AMcreateMmlNode("mrow",node);
+ node.appendChild(space);
+ }
+ newFrag.appendChild(node);
+ }
+ } while ((symbol.ttype != RIGHTBRACKET)
+ && symbol!=null && symbol.output!="");
+ tag = null;
+ if (symbol.ttype == RIGHTBRACKET) {
+ if (symbol.input == "\\right") { // right what?
+ str = AMremoveCharsAndBlanks(str,symbol.input.length);
+ symbol = AMgetSymbol(str);
+ if (symbol != null && symbol.input == ".")
+ symbol.invisible = true;
+ if (symbol != null)
+ tag = symbol.rtag;
+ }
+ if (symbol!=null)
+ str = AMremoveCharsAndBlanks(str,symbol.input.length); // ready to return
+ var len = newFrag.childNodes.length;
+ if (matrix &&
+ len>0 && newFrag.childNodes[len-1].nodeName == "mrow" && len>1 &&
+ newFrag.childNodes[len-2].nodeName == "mo" &&
+ newFrag.childNodes[len-2].firstChild.nodeValue == "&") { //matrix
+ var pos = []; // positions of ampersands
+ var m = newFrag.childNodes.length;
+ for (i=0; matrix && i<m; i=i+2) {
+ pos[i] = [];
+ node = newFrag.childNodes[i];
+ for (var j=0; j<node.childNodes.length; j++)
+ if (node.childNodes[j].firstChild.nodeValue=="&")
+ pos[i][pos[i].length]=j;
+ }
+ var row, frag, n, k, table = document.createDocumentFragment();
+ for (i=0; i<m; i=i+2) {
+ row = document.createDocumentFragment();
+ frag = document.createDocumentFragment();
+ node = newFrag.firstChild; // <mrow> -&-&...&-&- </mrow>
+ n = node.childNodes.length;
+ k = 0;
+ for (j=0; j<n; j++) {
+ if (typeof pos[i][k] != "undefined" && j==pos[i][k]){
+ node.removeChild(node.firstChild); //remove &
+ row.appendChild(AMcreateMmlNode("mtd",frag));
+ k++;
+ } else frag.appendChild(node.firstChild);
+ }
+ row.appendChild(AMcreateMmlNode("mtd",frag));
+ if (newFrag.childNodes.length>2) {
+ newFrag.removeChild(newFrag.firstChild); //remove <mrow> </mrow>
+ newFrag.removeChild(newFrag.firstChild); //remove <mo>&</mo>
+ }
+ table.appendChild(AMcreateMmlNode("mtr",row));
+ }
+ return [table,str];
+ }
+ if (typeof symbol.invisible != "boolean" || !symbol.invisible) {
+ node = AMcreateMmlNode("mo",document.createTextNode(symbol.output));
+ newFrag.appendChild(node);
+ }
+ }
+ return [newFrag,str,tag];
+}
+
+function AMparseMath(str) {
+ var result, node = AMcreateElementMathML("mstyle");
+ if (mathcolor != "") node.setAttribute("mathcolor",mathcolor);
+ if (mathfontfamily != "") node.setAttribute("fontfamily",mathfontfamily);
+ node.appendChild(AMparseExpr(str.replace(/^\s+/g,""),false,false)[0]);
+ node = AMcreateMmlNode("math",node);
+ if (showasciiformulaonhover) //fixed by djhsu so newline
+ node.setAttribute("title",str.replace(/\s+/g," "));//does not show in Gecko
+ if (mathfontfamily != "" && (isIE || mathfontfamily != "serif")) {
+ var fnode = AMcreateElementXHTML("font");
+ fnode.setAttribute("face",mathfontfamily);
+ fnode.appendChild(node);
+ return fnode;
+ }
+ return node;
+}
+
+function AMstrarr2docFrag(arr, linebreaks) {
+ var newFrag=document.createDocumentFragment();
+ var expr = false;
+ for (var i=0; i<arr.length; i++) {
+ if (expr) newFrag.appendChild(AMparseMath(arr[i]));
+ else {
+ var arri = (linebreaks ? arr[i].split("\n\n") : [arr[i]]);
+ newFrag.appendChild(AMcreateElementXHTML("span").
+ appendChild(document.createTextNode(arri[0])));
+ for (var j=1; j<arri.length; j++) {
+ newFrag.appendChild(AMcreateElementXHTML("p"));
+ newFrag.appendChild(AMcreateElementXHTML("span").
+ appendChild(document.createTextNode(arri[j])));
+ }
+ }
+ expr = !expr;
+ }
+ return newFrag;
+}
+
+function AMprocessNodeR(n, linebreaks) {
+ var mtch, str, arr, frg, i;
+ if (n.childNodes.length == 0) {
+ if ((n.nodeType!=8 || linebreaks) &&
+ n.parentNode.nodeName!="form" && n.parentNode.nodeName!="FORM" &&
+ n.parentNode.nodeName!="textarea" && n.parentNode.nodeName!="TEXTAREA" &&
+ n.parentNode.nodeName!="pre" && n.parentNode.nodeName!="PRE") {
+ str = n.nodeValue;
+ if (!(str == null)) {
+ str = str.replace(/\r\n\r\n/g,"\n\n");
+ str = str.replace(/\x20+/g," ");
+ str = str.replace(/\s*\r\n/g," ");
+// DELIMITERS:
+ mtch = (str.indexOf("\$")==-1 ? false : true);
+ str = str.replace(/([^\\])\$/g,"$1 \$");
+ str = str.replace(/^\$/," \$"); // in case \$ at start of string
+ arr = str.split(" \$");
+ for (i=0; i<arr.length; i++)
+ arr[i]=arr[i].replace(/\\\$/g,"\$");
+ if (arr.length>1 || mtch) {
+ if (checkForMathML) {
+ checkForMathML = false;
+ var nd = AMisMathMLavailable();
+ AMnoMathML = nd != null;
+ if (AMnoMathML && notifyIfNoMathML)
+ if (alertIfNoMathML)
+ alert("To view the ASCIIMathML notation use Internet Explorer 6 +\nMathPlayer (free from www.dessci.com)\n\
+ or Firefox/Mozilla/Netscape");
+ else AMbody.insertBefore(nd,AMbody.childNodes[0]);
+ }
+ if (!AMnoMathML) {
+ frg = AMstrarr2docFrag(arr,n.nodeType==8);
+ var len = frg.childNodes.length;
+ n.parentNode.replaceChild(frg,n);
+ return len-1;
+ } else return 0;
+ }
+ }
+ } else return 0;
+ } else if (n.nodeName!="math") {
+ for (i=0; i<n.childNodes.length; i++)
+ i += AMprocessNodeR(n.childNodes[i], linebreaks);
+ }
+ return 0;
+}
+
+function AMprocessNode(n, linebreaks, spanclassAM) {
+ var frag,st;
+ if (spanclassAM!=null) {
+ frag = document.getElementsByTagName("span")
+ for (var i=0;i<frag.length;i++)
+ if (frag[i].className == "AM")
+ AMprocessNodeR(frag[i],linebreaks);
+ } else {
+ try {
+ st = n.innerHTML;
+ } catch(err) {}
+// DELIMITERS:
+ if (st==null || st.indexOf("\$")!=-1)
+ AMprocessNodeR(n,linebreaks);
+ }
+ if (isIE) { //needed to match size and font of formula to surrounding text
+ frag = document.getElementsByTagName('math');
+ for (var i=0;i<frag.length;i++) frag[i].update()
+ }
+}
+
+var AMbody;
+var AMnoMathML = false, AMtranslated = false;
+
+function translate(spanclassAM) {
+ if (!AMtranslated) { // run this only once
+ AMtranslated = true;
+ AMinitSymbols();
+ AMbody = document.getElementsByTagName("body")[0];
+ AMprocessNode(AMbody, false, spanclassAM);
+ }
+}
+
+if (isIE) { // avoid adding MathPlayer info explicitly to each webpage
+ document.write("<object id=\"mathplayer\"\
+ classid=\"clsid:32F66A20-7614-11D4-BD11-00104BD3F987\"></object>");
+ document.write("<?import namespace=\"m\" implementation=\"#mathplayer\"?>");
+}
+
+// GO1.1 Generic onload by Brothercake
+// http://www.brothercake.com/
+//onload function (replaces the onload="translate()" in the <body> tag)
+function generic()
+{
+ translate();
+};
+//setup onload function
+if(typeof window.addEventListener != 'undefined')
+{
+ //.. gecko, safari, konqueror and standard
+ window.addEventListener('load', generic, false);
+}
+else if(typeof document.addEventListener != 'undefined')
+{
+ //.. opera 7
+ document.addEventListener('load', generic, false);
+}
+else if(typeof window.attachEvent != 'undefined')
+{
+ //.. win/ie
+ window.attachEvent('onload', generic);
+}
+//** remove this condition to degrade older browsers
+else
+{
+ //.. mac/ie5 and anything else that gets this far
+ //if there's an existing onload function
+ if(typeof window.onload == 'function')
+ {
+ //store it
+ var existing = onload;
+ //add new onload handler
+ window.onload = function()
+ {
+ //call existing onload function
+ existing();
+ //call generic onload function
+ generic();
+ };
+ }
+ else
+ {
+ //setup onload function
+ window.onload = generic;
+ }
+}
diff --git a/source-builder/sb/asciidoc/javascripts/asciidoc.js b/source-builder/sb/asciidoc/javascripts/asciidoc.js new file mode 100644 index 0000000..ac36563 --- /dev/null +++ b/source-builder/sb/asciidoc/javascripts/asciidoc.js @@ -0,0 +1,189 @@ +var asciidoc = { // Namespace. + +///////////////////////////////////////////////////////////////////// +// Table Of Contents generator +///////////////////////////////////////////////////////////////////// + +/* Author: Mihai Bazon, September 2002 + * http://students.infoiasi.ro/~mishoo + * + * Table Of Content generator + * Version: 0.4 + * + * Feel free to use this script under the terms of the GNU General Public + * License, as long as you do not remove or alter this notice. + */ + + /* modified by Troy D. Hanson, September 2006. License: GPL */ + /* modified by Stuart Rackham, 2006, 2009. License: GPL */ + +// toclevels = 1..4. +toc: function (toclevels) { + + function getText(el) { + var text = ""; + for (var i = el.firstChild; i != null; i = i.nextSibling) { + if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants. + text += i.data; + else if (i.firstChild != null) + text += getText(i); + } + return text; + } + + function TocEntry(el, text, toclevel) { + this.element = el; + this.text = text; + this.toclevel = toclevel; + } + + function tocEntries(el, toclevels) { + var result = new Array; + var re = new RegExp('[hH]([1-'+(toclevels+1)+'])'); + // Function that scans the DOM tree for header elements (the DOM2 + // nodeIterator API would be a better technique but not supported by all + // browsers). + var iterate = function (el) { + for (var i = el.firstChild; i != null; i = i.nextSibling) { + if (i.nodeType == 1 /* Node.ELEMENT_NODE */) { + var mo = re.exec(i.tagName); + if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") { + result[result.length] = new TocEntry(i, getText(i), mo[1]-1); + } + iterate(i); + } + } + } + iterate(el); + return result; + } + + var toc = document.getElementById("toc"); + if (!toc) { + return; + } + + // Delete existing TOC entries in case we're reloading the TOC. + var tocEntriesToRemove = []; + var i; + for (i = 0; i < toc.childNodes.length; i++) { + var entry = toc.childNodes[i]; + if (entry.nodeName.toLowerCase() == 'div' + && entry.getAttribute("class") + && entry.getAttribute("class").match(/^toclevel/)) + tocEntriesToRemove.push(entry); + } + for (i = 0; i < tocEntriesToRemove.length; i++) { + toc.removeChild(tocEntriesToRemove[i]); + } + + // Rebuild TOC entries. + var entries = tocEntries(document.getElementById("content"), toclevels); + for (var i = 0; i < entries.length; ++i) { + var entry = entries[i]; + if (entry.element.id == "") + entry.element.id = "_toc_" + i; + var a = document.createElement("a"); + a.href = "#" + entry.element.id; + a.appendChild(document.createTextNode(entry.text)); + var div = document.createElement("div"); + div.appendChild(a); + div.className = "toclevel" + entry.toclevel; + toc.appendChild(div); + } + if (entries.length == 0) + toc.parentNode.removeChild(toc); +}, + + +///////////////////////////////////////////////////////////////////// +// Footnotes generator +///////////////////////////////////////////////////////////////////// + +/* Based on footnote generation code from: + * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html + */ + +footnotes: function () { + // Delete existing footnote entries in case we're reloading the footnodes. + var i; + var noteholder = document.getElementById("footnotes"); + if (!noteholder) { + return; + } + var entriesToRemove = []; + for (i = 0; i < noteholder.childNodes.length; i++) { + var entry = noteholder.childNodes[i]; + if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote") + entriesToRemove.push(entry); + } + for (i = 0; i < entriesToRemove.length; i++) { + noteholder.removeChild(entriesToRemove[i]); + } + + // Rebuild footnote entries. + var cont = document.getElementById("content"); + var spans = cont.getElementsByTagName("span"); + var refs = {}; + var n = 0; + for (i=0; i<spans.length; i++) { + if (spans[i].className == "footnote") { + n++; + var note = spans[i].getAttribute("data-note"); + if (!note) { + // Use [\s\S] in place of . so multi-line matches work. + // Because JavaScript has no s (dotall) regex flag. + note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1]; + spans[i].innerHTML = + "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n + + "' title='View footnote' class='footnote'>" + n + "</a>]"; + spans[i].setAttribute("data-note", note); + } + noteholder.innerHTML += + "<div class='footnote' id='_footnote_" + n + "'>" + + "<a href='#_footnoteref_" + n + "' title='Return to text'>" + + n + "</a>. " + note + "</div>"; + var id =spans[i].getAttribute("id"); + if (id != null) refs["#"+id] = n; + } + } + if (n == 0) + noteholder.parentNode.removeChild(noteholder); + else { + // Process footnoterefs. + for (i=0; i<spans.length; i++) { + if (spans[i].className == "footnoteref") { + var href = spans[i].getElementsByTagName("a")[0].getAttribute("href"); + href = href.match(/#.*/)[0]; // Because IE return full URL. + n = refs[href]; + spans[i].innerHTML = + "[<a href='#_footnote_" + n + + "' title='View footnote' class='footnote'>" + n + "</a>]"; + } + } + } +}, + +install: function(toclevels) { + var timerId; + + function reinstall() { + asciidoc.footnotes(); + if (toclevels) { + asciidoc.toc(toclevels); + } + } + + function reinstallAndRemoveTimer() { + clearInterval(timerId); + reinstall(); + } + + timerId = setInterval(reinstall, 500); + if (document.addEventListener) + document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false); + else + window.onload = reinstallAndRemoveTimer; +} + +} diff --git a/source-builder/sb/asciidoc/javascripts/slidy.js b/source-builder/sb/asciidoc/javascripts/slidy.js new file mode 100644 index 0000000..04e51a2 --- /dev/null +++ b/source-builder/sb/asciidoc/javascripts/slidy.js @@ -0,0 +1,2845 @@ +/* slidy.js + + Copyright (c) 2005-2010 W3C (MIT, ERCIM, Keio), All Rights Reserved. + W3C liability, trademark, document use and software licensing + rules apply, see: + + http://www.w3.org/Consortium/Legal/copyright-documents + http://www.w3.org/Consortium/Legal/copyright-software +*/ + +// the slidy object implementation +var w3c_slidy = { + // classify which kind of browser we're running under + ns_pos: (typeof window.pageYOffset!='undefined'), + khtml: ((navigator.userAgent).indexOf("KHTML") >= 0 ? true : false), + opera: ((navigator.userAgent).indexOf("Opera") >= 0 ? true : false), + ipad: ((navigator.userAgent).indexOf("iPad") >= 0 ? true : false), + iphone: ((navigator.userAgent).indexOf("iPhone") >= 0 ? true : false), + ie: (typeof document.all != "undefined" && !this.opera), + ie6: (!this.ns_pos && navigator.userAgent.indexOf("MSIE 6") != -1), + ie7: (!this.ns_pos && navigator.userAgent.indexOf("MSIE 7") != -1), + ie8: (!this.ns_pos && navigator.userAgent.indexOf("MSIE 8") != -1), + ie9: (!this.ns_pos && navigator.userAgent.indexOf("MSIE 9") != -1), + keyboardless: (this.ipad || this.iphone), + + // are we running as XHTML? (doesn't work on Opera) + is_xhtml: /xml/.test(document.contentType), + + slide_number: 0, // integer slide count: 0, 1, 2, ... + slide_number_element: null, // element containing slide number + slides: [], // set to array of slide div's + notes: [], // set to array of handout div's + backgrounds: [], // set to array of background div's + toolbar: null, // element containing toolbar + title: null, // document title + last_shown: null, // last incrementally shown item + eos: null, // span element for end of slide indicator + toc: null, // table of contents + outline: null, // outline element with the focus + selected_text_len: 0, // length of drag selection on document + view_all: 0, // 1 to view all slides + handouts + want_toolbar: true, // user preference to show/hide toolbar + mouse_click_enabled: true, // enables left click for next slide + scroll_hack: 0, // IE work around for position: fixed + disable_slide_click: false, // used by clicked anchors + + lang: "en", // updated to language specified by html file + + help_anchor: null, // used for keyboard focus hack in showToolbar() + help_page: "http://www.w3.org/Talks/Tools/Slidy2/help/help.html", + help_text: "Navigate with mouse click, space bar, Cursor Left/Right, " + + "or Pg Up and Pg Dn. Use S and B to change font size.", + + size_index: 0, + size_adjustment: 0, + sizes: new Array("10pt", "12pt", "14pt", "16pt", "18pt", "20pt", + "22pt", "24pt", "26pt", "28pt", "30pt", "32pt"), + + // needed for efficient resizing + last_width: 0, + last_height: 0, + + + // Needed for cross browser support for relative width/height on + // object elements. The work around is to save width/height attributes + // and then to recompute absolute width/height dimensions on resizing + objects: [], + + // attach initialiation event handlers + set_up: function () { + var init = function() { w3c_slidy.init(); }; + if (typeof window.addEventListener != "undefined") + window.addEventListener("load", init, false); + else + window.attachEvent("onload", init); + }, + + hide_slides: function () { + if (document.body && !w3c_slidy.initialized) + document.body.style.visibility = "hidden"; + else + setTimeout(w3c_slidy.hide_slides, 50); + }, + + // hack to persuade IE to compute correct document height + // as needed for simulating fixed positioning of toolbar + ie_hack: function () { + window.resizeBy(0,-1); + window.resizeBy(0, 1); + }, + + init: function () { + //alert("slidy starting test 10"); + document.body.style.visibility = "visible"; + w3c_slidy_i18n.init(); + this.add_toolbar(); + this.wrap_implicit_slides(); + this.collect_slides(); + this.collect_notes(); + this.collect_backgrounds(); + this.objects = document.body.getElementsByTagName("object"); + this.patch_anchors(); + this.slide_number = this.find_slide_number(location.href); + window.offscreenbuffering = true; + this.size_adjustment = this.find_size_adjust(); + this.time_left = this.find_duration(); + this.hide_image_toolbar(); // suppress IE image toolbar popup + this.init_outliner(); // activate fold/unfold support + this.title = document.title; + + // work around for opera bug + this.is_xhtml = (document.body.tagName == "BODY" ? false : true); + + if (this.slides.length > 0) + { + var slide = this.slides[this.slide_number]; + + if (this.slide_number > 0) + { + this.set_visibility_all_incremental("visible"); + this.last_shown = this.previous_incremental_item(null); + this.set_eos_status(true); + } + else + { + this.last_shown = null; + this.set_visibility_all_incremental("hidden"); + this.set_eos_status(!this.next_incremental_item(this.last_shown)); + } + + this.set_location(); + this.add_class(this.slides[0], "first-slide"); + w3c_slidy.show_slide(slide); + } + + this.toc = this.table_of_contents(); + + this.add_initial_prompt(); + + // bind event handlers without interfering with custom page scripts + // Tap events behave too weirdly to support clicks reliably on + // iPhone and iPad, so exclude these from click handler + + if (!this.keyboardless) + this.add_listener(document.body, "click", this.mouse_button_click); + + this.add_listener(document, "keydown", this.key_down); + this.add_listener(document, "keypress", this.key_press); + this.add_listener(window, "resize", this.resized); + this.add_listener(window, "scroll", this.scrolled); + this.add_listener(window, "unload", this.unloaded); + + if (!document.body.onclick) + document.body.onclick = function () { }; + + this.single_slide_view(); + + //this.set_location(); + + this.resized(); + + if (this.ie7) + setTimeout(w3c_slidy.ie_hack, 100); + + this.show_toolbar(); + + // for back button detection + setInterval(function () { w3c_slidy.check_location(); }, 200); + w3c_slidy.initialized = true; + }, + + // create div element with links to each slide + table_of_contents: function () { + var toc = this.create_element("div"); + this.add_class(toc, "slidy_toc hidden"); + //toc.setAttribute("tabindex", "0"); + + var heading = this.create_element("div"); + this.add_class(heading, "toc-heading"); + heading.innerHTML = "Table of Contents".localize(); + + toc.appendChild(heading); + var previous = null; + + for (var i = 0; i < this.slides.length; ++i) + { + var title = this.has_class(this.slides[i], "title"); + var num = document.createTextNode((i + 1) + ". "); + + toc.appendChild(num); + + var a = this.create_element("a"); + a.setAttribute("href", "#(" + (i+1) + ")"); + + if (title) + this.add_class(a, "titleslide"); + + var name = document.createTextNode(this.slide_name(i)); + a.appendChild(name); + a.onclick = w3c_slidy.toc_click; + a.onkeydown = w3c_slidy.toc_keydown; + a.previous = previous; + + if (previous) + previous.next = a; + + toc.appendChild(a); + + if (i == 0) + toc.first = a; + + if (i < this.slides.length - 1) + { + var br = this.create_element("br"); + toc.appendChild(br); + } + + previous = a; + } + + toc.focus = function () { + if (this.first) + this.first.focus(); + } + + toc.onmouseup = w3c_slidy.mouse_button_up; + + toc.onclick = function (e) { + e||(e=window.event); + + if (w3c_slidy.selected_text_len <= 0) + w3c_slidy.hide_table_of_contents(); + + w3c_slidy.stop_propagation(e); + + if (e.cancel != undefined) + e.cancel = true; + + if (e.returnValue != undefined) + e.returnValue = false; + + return false; + }; + + document.body.insertBefore(toc, document.body.firstChild); + return toc; + }, + + is_shown_toc: function () { + return !w3c_slidy.has_class(w3c_slidy.toc, "hidden"); + }, + + show_table_of_contents: function () { + w3c_slidy.remove_class(w3c_slidy.toc, "hidden"); + var toc = w3c_slidy.toc; + toc.focus(); + + if (w3c_slidy.ie7 && w3c_slidy.slide_number == 0) + setTimeout(w3c_slidy.ie_hack, 100); + }, + + hide_table_of_contents: function () { + w3c_slidy.add_class(w3c_slidy.toc, "hidden"); + + if (!w3c_slidy.opera) + w3c_slidy.help_anchor.focus(); + }, + + toggle_table_of_contents: function () { + if (w3c_slidy.is_shown_toc()) + w3c_slidy.hide_table_of_contents(); + else + w3c_slidy.show_table_of_contents(); + }, + + // called on clicking toc entry + toc_click: function (e) { + if (!e) + e = window.event; + + var target = w3c_slidy.get_target(e); + + if (target && target.nodeType == 1) + { + var uri = target.getAttribute("href"); + + if (uri) + { + //alert("going to " + uri); + var slide = w3c_slidy.slides[w3c_slidy.slide_number]; + w3c_slidy.hide_slide(slide); + w3c_slidy.slide_number = w3c_slidy.find_slide_number(uri); + slide = w3c_slidy.slides[w3c_slidy.slide_number]; + w3c_slidy.last_shown = null; + w3c_slidy.set_location(); + w3c_slidy.set_visibility_all_incremental("hidden"); + w3c_slidy.set_eos_status(!w3c_slidy.next_incremental_item(w3c_slidy.last_shown)); + w3c_slidy.show_slide(slide); + //target.focus(); + + try + { + if (!w3c_slidy.opera) + w3c_slidy.help_anchor.focus(); + } + catch (e) + { + } + } + } + + w3c_slidy.hide_table_of_contents(e); + if (w3c_slidy.ie7) w3c_slidy.ie_hack(); + w3c_slidy.stop_propagation(e); + return w3c_slidy.cancel(e); + }, + + // called onkeydown for toc entry + toc_keydown: function (event) { + var key; + + if (!event) + var event = window.event; + + // kludge around NS/IE differences + if (window.event) + key = window.event.keyCode; + else if (event.which) + key = event.which; + else + return true; // Yikes! unknown browser + + // ignore event if key value is zero + // as for alt on Opera and Konqueror + if (!key) + return true; + + // check for concurrent control/command/alt key + // but are these only present on mouse events? + + if (event.ctrlKey || event.altKey) + return true; + + if (key == 13) + { + var uri = this.getAttribute("href"); + + if (uri) + { + //alert("going to " + uri); + var slide = w3c_slidy.slides[w3c_slidy.slide_number]; + w3c_slidy.hide_slide(slide); + w3c_slidy.slide_number = w3c_slidy.find_slide_number(uri); + slide = w3c_slidy.slides[w3c_slidy.slide_number]; + w3c_slidy.last_shown = null; + w3c_slidy.set_location(); + w3c_slidy.set_visibility_all_incremental("hidden"); + w3c_slidy.set_eos_status(!w3c_slidy.next_incremental_item(w3c_slidy.last_shown)); + w3c_slidy.show_slide(slide); + //target.focus(); + + try + { + if (!w3c_slidy.opera) + w3c_slidy.help_anchor.focus(); + } + catch (e) + { + } + } + + w3c_slidy.hide_table_of_contents(); + + if (self.ie7) + w3c_slidy.ie_hack(); + + return w3c_slidy.cancel(event); + } + + if (key == 40 && this.next) + { + this.next.focus(); + return w3c_slidy.cancel(event); + } + + if (key == 38 && this.previous) + { + this.previous.focus(); + return w3c_slidy.cancel(event); + } + + return true; + }, + + + // ### OBSOLETE ### + before_print: function () { + this.show_all_slides(); + this.hide_toolbar(); + alert("before print"); + }, + + // ### OBSOLETE ### + after_print: function () { + if (!this.view_all) + { + this.single_slide_view(); + this.show_toolbar(); + } + alert("after print"); + }, + + // ### OBSOLETE ### + print_slides: function () { + this.before_print(); + window.print(); + this.after_print(); + }, + + // ### OBSOLETE ?? ### + toggle_view: function () { + if (this.view_all) + { + this.single_slide_view(); + this.show_toolbar(); + this.view_all = 0; + } + else + { + this.show_all_slides(); + this.hide_toolbar(); + this.view_all = 1; + } + }, + + // prepare for printing ### OBSOLETE ### + show_all_slides: function () { + this.remove_class(document.body, "single_slide"); + this.set_visibility_all_incremental("visible"); + }, + + // restore after printing ### OBSOLETE ### + single_slide_view: function () { + this.add_class(document.body, "single_slide"); + this.set_visibility_all_incremental("visible"); + this.last_shown = this.previous_incremental_item(null); + }, + + // suppress IE's image toolbar pop up + hide_image_toolbar: function () { + if (!this.ns_pos) + { + var images = document.getElementsByTagName("IMG"); + + for (var i = 0; i < images.length; ++i) + images[i].setAttribute("galleryimg", "no"); + } + }, + + unloaded: function (e) { + //alert("unloaded"); + }, + + // Safari and Konqueror don't yet support getComputedStyle() + // and they always reload page when location.href is updated + is_KHTML: function () { + var agent = navigator.userAgent; + return (agent.indexOf("KHTML") >= 0 ? true : false); + }, + + // find slide name from first h1 element + // default to document title + slide number + slide_name: function (index) { + var name = null; + var slide = this.slides[index]; + + var heading = this.find_heading(slide); + + if (heading) + name = this.extract_text(heading); + + if (!name) + name = this.title + "(" + (index + 1) + ")"; + + name.replace(/\&/g, "&"); + name.replace(/\</g, "<"); + name.replace(/\>/g, ">"); + + return name; + }, + + // find first h1 element in DOM tree + find_heading: function (node) { + if (!node || node.nodeType != 1) + return null; + + if (node.nodeName == "H1" || node.nodeName == "h1") + return node; + + var child = node.firstChild; + + while (child) + { + node = this.find_heading(child); + + if (node) + return node; + + child = child.nextSibling; + } + + return null; + }, + + // recursively extract text from DOM tree + extract_text: function (node) { + if (!node) + return ""; + + // text nodes + if (node.nodeType == 3) + return node.nodeValue; + + // elements + if (node.nodeType == 1) + { + node = node.firstChild; + var text = ""; + + while (node) + { + text = text + this.extract_text(node); + node = node.nextSibling; + } + + return text; + } + + return ""; + }, + + // find copyright text from meta element + find_copyright: function () { + var name, content; + var meta = document.getElementsByTagName("meta"); + + for (var i = 0; i < meta.length; ++i) + { + name = meta[i].getAttribute("name"); + content = meta[i].getAttribute("content"); + + if (name == "copyright") + return content; + } + + return null; + }, + + find_size_adjust: function () { + var name, content, offset; + var meta = document.getElementsByTagName("meta"); + + for (var i = 0; i < meta.length; ++i) + { + name = meta[i].getAttribute("name"); + content = meta[i].getAttribute("content"); + + if (name == "font-size-adjustment") + return 1 * content; + } + + return 1; + }, + + // <meta name="duration" content="20" /> for 20 minutes + find_duration: function () { + var name, content, offset; + var meta = document.getElementsByTagName("meta"); + + for (var i = 0; i < meta.length; ++i) + { + name = meta[i].getAttribute("name"); + content = meta[i].getAttribute("content"); + + if (name == "duration") + return 60000 * content; + } + + return null; + }, + + replace_by_non_breaking_space: function (str) { + for (var i = 0; i < str.length; ++i) + str[i] = 160; + }, + + // ### CHECK ME ### is use of "li" okay for text/html? + // for XHTML do we also need to specify namespace? + init_outliner: function () { + var items = document.getElementsByTagName("li"); + + for (var i = 0; i < items.length; ++i) + { + var target = items[i]; + + if (!this.has_class(target.parentNode, "outline")) + continue; + + target.onclick = this.outline_click; +/* ### more work needed for IE6 + if (!this.ns_pos) + { + target.onmouseover = this.hover_outline; + target.onmouseout = this.unhover_outline; + } +*/ + if (this.foldable(target)) + { + target.foldable = true; + target.onfocus = function () {w3c_slidy.outline = this;}; + target.onblur = function () {w3c_slidy.outline = null;}; + + if (!target.getAttribute("tabindex")) + target.setAttribute("tabindex", "0"); + + if (this.has_class(target, "expand")) + this.unfold(target); + else + this.fold(target); + } + else + { + this.add_class(target, "nofold"); + target.visible = true; + target.foldable = false; + } + } + }, + + foldable: function (item) { + if (!item || item.nodeType != 1) + return false; + + var node = item.firstChild; + + while (node) + { + if (node.nodeType == 1 && this.is_block(node)) + return true; + + node = node.nextSibling; + } + + return false; + }, + + // ### CHECK ME ### switch to add/remove "hidden" class + fold: function (item) { + if (item) + { + this.remove_class(item, "unfolded"); + this.add_class(item, "folded"); + } + + var node = item ? item.firstChild : null; + + while (node) + { + if (node.nodeType == 1 && this.is_block(node)) // element + { + w3c_slidy.add_class(node, "hidden"); + } + + node = node.nextSibling; + } + + item.visible = false; + }, + + // ### CHECK ME ### switch to add/remove "hidden" class + unfold: function (item) { + if (item) + { + this.add_class(item, "unfolded"); + this.remove_class(item, "folded"); + } + + var node = item ? item.firstChild : null; + + while (node) + { + if (node.nodeType == 1 && this.is_block(node)) // element + { + w3c_slidy.remove_class(node, "hidden"); + } + + node = node.nextSibling; + } + + item.visible = true; + }, + + outline_click: function (e) { + if (!e) + e = window.event; + + var rightclick = false; + var target = w3c_slidy.get_target(e); + + while (target && target.visible == undefined) + target = target.parentNode; + + if (!target) + return true; + + if (e.which) + rightclick = (e.which == 3); + else if (e.button) + rightclick = (e.button == 2); + + if (!rightclick && target.visible != undefined) + { + if (target.foldable) + { + if (target.visible) + w3c_slidy.fold(target); + else + w3c_slidy.unfold(target); + } + + w3c_slidy.stop_propagation(e); + e.cancel = true; + e.returnValue = false; + } + + return false; + }, + + add_initial_prompt: function () { + var prompt = this.create_element("div"); + prompt.setAttribute("class", "initial_prompt"); + + var p1 = this.create_element("p"); + prompt.appendChild(p1); + p1.setAttribute("class", "help"); + + if (this.keyboardless) + p1.innerHTML = "Tap footer to move to next slide"; + else + p1.innerHTML = "Space or Right Arrow to move to next " + + "slide, click help below for more details"; + + this.add_listener(prompt, "click", function (e) { + document.body.removeChild(prompt); + w3c_slidy.stop_propagation(e); + + if (e.cancel != undefined) + e.cancel = true; + + if (e.returnValue != undefined) + e.returnValue = false; + + return false; + }); + + document.body.appendChild(prompt); + this.initial_prompt = prompt; + setTimeout(function() {document.body.removeChild(prompt);}, 5000); + }, + + add_toolbar: function () { + var counter, page; + + this.toolbar = this.create_element("div"); + this.toolbar.setAttribute("class", "toolbar"); + + // a reasonably behaved browser + if (this.ns_pos || !this.ie6) + { + var right = this.create_element("div"); + right.setAttribute("style", "float: right; text-align: right"); + + counter = this.create_element("span") + counter.innerHTML = "slide".localize() + " n/m"; + right.appendChild(counter); + this.toolbar.appendChild(right); + + var left = this.create_element("div"); + left.setAttribute("style", "text-align: left"); + + // global end of slide indicator + this.eos = this.create_element("span"); + this.eos.innerHTML = "* "; + left.appendChild(this.eos); + + var help = this.create_element("a"); + help.setAttribute("href", this.help_page); + help.setAttribute("title", this.help_text.localize()); + help.innerHTML = "help?".localize(); + left.appendChild(help); + this.help_anchor = help; // save for focus hack + + var gap1 = document.createTextNode(" "); + left.appendChild(gap1); + + var contents = this.create_element("a"); + contents.setAttribute("href", "javascript:w3c_slidy.toggle_table_of_contents()"); + contents.setAttribute("title", "table of contents".localize()); + contents.innerHTML = "contents?".localize(); + left.appendChild(contents); + + var gap2 = document.createTextNode(" "); + left.appendChild(gap2); + + var copyright = this.find_copyright(); + + if (copyright) + { + var span = this.create_element("span"); + span.className = "copyright"; + span.innerHTML = copyright; + left.appendChild(span); + } + + this.toolbar.setAttribute("tabindex", "0"); + this.toolbar.appendChild(left); + } + else // IE6 so need to work around its poor CSS support + { + this.toolbar.style.position = (this.ie7 ? "fixed" : "absolute"); + this.toolbar.style.zIndex = "200"; + this.toolbar.style.width = "99.9%"; + this.toolbar.style.height = "1.2em"; + this.toolbar.style.top = "auto"; + this.toolbar.style.bottom = "0"; + this.toolbar.style.left = "0"; + this.toolbar.style.right = "0"; + this.toolbar.style.textAlign = "left"; + this.toolbar.style.fontSize = "60%"; + this.toolbar.style.color = "red"; + this.toolbar.borderWidth = 0; + this.toolbar.className = "toolbar"; + this.toolbar.style.background = "rgb(240,240,240)"; + + // would like to have help text left aligned + // and page counter right aligned, floating + // div's don't work, so instead use nested + // absolutely positioned div's. + + var sp = this.create_element("span"); + sp.innerHTML = " * "; + this.toolbar.appendChild(sp); + this.eos = sp; // end of slide indicator + + var help = this.create_element("a"); + help.setAttribute("href", this.help_page); + help.setAttribute("title", this.help_text.localize()); + help.innerHTML = "help?".localize(); + this.toolbar.appendChild(help); + this.help_anchor = help; // save for focus hack + + var gap1 = document.createTextNode(" "); + this.toolbar.appendChild(gap1); + + var contents = this.create_element("a"); + contents.setAttribute("href", "javascript:toggleTableOfContents()"); + contents.setAttribute("title", "table of contents".localize()); + contents.innerHTML = "contents?".localize(); + this.toolbar.appendChild(contents); + + var gap2 = document.createTextNode(" "); + this.toolbar.appendChild(gap2); + + var copyright = this.find_copyright(); + + if (copyright) + { + var span = this.create_element("span"); + span.innerHTML = copyright; + span.style.color = "black"; + span.style.marginLeft = "0.5em"; + this.toolbar.appendChild(span); + } + + counter = this.create_element("div") + counter.style.position = "absolute"; + counter.style.width = "auto"; //"20%"; + counter.style.height = "1.2em"; + counter.style.top = "auto"; + counter.style.bottom = 0; + counter.style.right = "0"; + counter.style.textAlign = "right"; + counter.style.color = "red"; + counter.style.background = "rgb(240,240,240)"; + + counter.innerHTML = "slide".localize() + " n/m"; + this.toolbar.appendChild(counter); + } + + // ensure that click isn't passed through to the page + this.toolbar.onclick = + function (e) { + if (!e) + e = window.event; + + var target = e.target; + + if (!target && e.srcElement) + target = e.srcElement; + + // work around Safari bug + if (target && target.nodeType == 3) + target = target.parentNode; + + w3c_slidy.stop_propagation(e); + + if (target && target.nodeName.toLowerCase() != "a") + w3c_slidy.mouse_button_click(e); + }; + + this.slide_number_element = counter; + this.set_eos_status(false); + document.body.appendChild(this.toolbar); + }, + + // wysiwyg editors make it hard to use div elements + // e.g. amaya loses the div when you copy and paste + // this function wraps div elements around implicit + // slides which start with an h1 element and continue + // up to the next heading or div element + wrap_implicit_slides: function () { + var i, heading, node, next, div; + var headings = document.getElementsByTagName("h1"); + + if (!headings) + return; + + for (i = 0; i < headings.length; ++i) + { + heading = headings[i]; + + if (heading.parentNode != document.body) + continue; + + node = heading.nextSibling; + + div = document.createElement("div"); + this.add_class(div, "slide"); + document.body.replaceChild(div, heading); + div.appendChild(heading); + + while (node) + { + if (node.nodeType == 1 && // an element + (node.nodeName == "H1" || + node.nodeName == "h1" || + node.nodeName == "DIV" || + node.nodeName == "div")) + break; + + next = node.nextSibling; + node = document.body.removeChild(node); + div.appendChild(node); + node = next; + } + } + }, + +// return new array of all slides + collect_slides: function () { + var slides = new Array(); + var divs = document.body.getElementsByTagName("div"); + + for (var i = 0; i < divs.length; ++i) + { + div = divs.item(i); + + if (this.has_class(div, "slide")) + { + // add slide to collection + slides[slides.length] = div; + + // hide each slide as it is found + this.add_class(div, "hidden"); + + // add dummy <br/> at end for scrolling hack + var node1 = document.createElement("br"); + div.appendChild(node1); + var node2 = document.createElement("br"); + div.appendChild(node2); + } + else if (this.has_class(div, "background")) + { // work around for Firefox SVG reload bug + // which otherwise replaces 1st SVG graphic with 2nd + div.style.display = "block"; + } + } + + this.slides = slides; + }, + + // return new array of all <div class="handout"> + collect_notes: function () { + var notes = new Array(); + var divs = document.body.getElementsByTagName("div"); + + for (var i = 0; i < divs.length; ++i) + { + div = divs.item(i); + + if (this.has_class(div, "handout")) + { + // add note to collection + notes[notes.length] = div; + + // and hide it + this.add_class(div, "hidden"); + } + } + + this.notes = notes; + }, + + // return new array of all <div class="background"> + // including named backgrounds e.g. class="background titlepage" + collect_backgrounds: function () { + var backgrounds = new Array(); + var divs = document.body.getElementsByTagName("div"); + + for (var i = 0; i < divs.length; ++i) + { + div = divs.item(i); + + if (this.has_class(div, "background")) + { + // add background to collection + backgrounds[backgrounds.length] = div; + + // and hide it + this.add_class(div, "hidden"); + } + } + + this.backgrounds = backgrounds; + }, + + // set click handlers on all anchors + patch_anchors: function () { + var self = w3c_slidy; + var handler = function (event) { + // compare this.href with location.href + // for link to another slide in this doc + + if (self.page_address(this.href) == self.page_address(location.href)) + { + // yes, so find new slide number + var newslidenum = self.find_slide_number(this.href); + + if (newslidenum != self.slide_number) + { + var slide = self.slides[self.slide_number]; + self.hide_slide(slide); + self.slide_number = newslidenum; + slide = self.slides[self.slide_number]; + self.show_slide(slide); + self.set_location(); + } + } + else if (this.target == null) + location.href = this.href; + + this.blur(); + self.disable_slide_click = true; + }; + + var anchors = document.body.getElementsByTagName("a"); + + for (var i = 0; i < anchors.length; ++i) + { + if (window.addEventListener) + anchors[i].addEventListener("click", handler, false); + else + anchors[i].attachEvent("onclick", handler); + } + }, + + // ### CHECK ME ### see which functions are invoked via setTimeout + // either directly or indirectly for use of w3c_slidy vs this + show_slide_number: function () { + var timer = w3c_slidy.get_timer(); + w3c_slidy.slide_number_element.innerHTML = timer + "slide".localize() + " " + + (w3c_slidy.slide_number + 1) + "/" + w3c_slidy.slides.length; + }, + + // every 200mS check if the location has been changed as a + // result of the user activating the Back button/menu item + // doesn't work for Opera < 9.5 + check_location: function () { + var hash = location.hash; + + if (w3c_slidy.slide_number > 0 && (hash == "" || hash == "#")) + w3c_slidy.goto_slide(0); + else if (hash.length > 2 && hash != "#("+(w3c_slidy.slide_number+1)+")") + { + var num = parseInt(location.hash.substr(2)); + + if (!isNaN(num)) + w3c_slidy.goto_slide(num-1); + } + + if (w3c_slidy.time_left && w3c_slidy.slide_number > 0) + { + w3c_slidy.show_slide_number(); + + if (w3c_slidy.time_left > 0) + w3c_slidy.time_left -= 200; + } + }, + + get_timer: function () { + var timer = ""; + if (w3c_slidy.time_left) + { + var mins, secs; + secs = Math.floor(w3c_slidy.time_left/1000); + mins = Math.floor(secs / 60); + secs = secs % 60; + timer = (mins ? mins+"m" : "") + secs + "s "; + } + + return timer; + }, + + // this doesn't push location onto history stack for IE + // for which a hidden iframe hack is needed: load page into + // the iframe with script that set's parent's location.hash + // but that won't work for standalone use unless we can + // create the page dynamically via a javascript: URL + set_location: function () { + var uri = w3c_slidy.page_address(location.href); + var hash = "#(" + (w3c_slidy.slide_number+1) + ")"; + + if (w3c_slidy.slide_number >= 0) + uri = uri + hash; + + if (w3c_slidy.ie && !w3c_slidy.ie8) + w3c_slidy.push_hash(hash); + + if (uri != location.href) // && !khtml + location.href = uri; + + if (this.khtml) + hash = "(" + (w3c_slidy.slide_number+1) + ")"; + + if (!this.ie && location.hash != hash && location.hash != "") + location.hash = hash; + + document.title = w3c_slidy.title + " (" + (w3c_slidy.slide_number+1) + ")"; + w3c_slidy.show_slide_number(); + }, + + page_address: function (uri) { + var i = uri.indexOf("#"); + + if (i < 0) + i = uri.indexOf("%23"); + + // check if anchor is entire page + + if (i < 0) + return uri; // yes + + return uri.substr(0, i); + }, + + // only used for IE6 and IE7 + on_frame_loaded: function (hash) { + location.hash = hash; + var uri = w3c_slidy.page_address(location.href); + location.href = uri + hash; + }, + + // history hack with thanks to Bertrand Le Roy + push_hash: function (hash) { + if (hash == "") hash = "#(1)"; + window.location.hash = hash; + + var doc = document.getElementById("historyFrame").contentWindow.document; + doc.open("javascript:'<html></html>'"); + // PWL modified this string literal to break the close script tag + // which otherwise gets parsed when incorporated + doc.write("<html><head><script type=\"text/javascript\">window.parent.w3c_slidy.on_frame_loaded('"+ + (hash) + "');</" + "script></head><body>hello mum</body></html>"); + doc.close(); + }, + + // find current slide based upon location + // first find target anchor and then look + // for associated div element enclosing it + // finally map that to slide number + find_slide_number: function (uri) { + // first get anchor from page location + + var i = uri.indexOf("#"); + + // check if anchor is entire page + if (i < 0) + return 0; // yes + + var anchor = unescape(uri.substr(i+1)); + + // now use anchor as XML ID to find target + var target = document.getElementById(anchor); + + if (!target) + { + // does anchor look like "(2)" for slide 2 ?? + // where first slide is (1) + var re = /\((\d)+\)/; + + if (anchor.match(re)) + { + var num = parseInt(anchor.substring(1, anchor.length-1)); + + if (num > this.slides.length) + num = 1; + + if (--num < 0) + num = 0; + + return num; + } + + // accept [2] for backwards compatibility + re = /\[(\d)+\]/; + + if (anchor.match(re)) + { + var num = parseInt(anchor.substring(1, anchor.length-1)); + + if (num > this.slides.length) + num = 1; + + if (--num < 0) + num = 0; + + return num; + } + + // oh dear unknown anchor + return 0; + } + + // search for enclosing slide + + while (true) + { + // browser coerces html elements to uppercase! + if (target.nodeName.toLowerCase() == "div" && + this.has_class(target, "slide")) + { + // found the slide element + break; + } + + // otherwise try parent element if any + + target = target.parentNode; + + if (!target) + { + return 0; // no luck! + } + }; + + for (i = 0; i < slides.length; ++i) + { + if (slides[i] == target) + return i; // success + } + + // oh dear still no luck + return 0; + }, + + previous_slide: function (incremental) { + if (!w3c_slidy.view_all) + { + var slide; + + if ((incremental || w3c_slidy.slide_number == 0) && w3c_slidy.last_shown != null) + { + w3c_slidy.last_shown = w3c_slidy.hide_previous_item(w3c_slidy.last_shown); + w3c_slidy.set_eos_status(false); + } + else if (w3c_slidy.slide_number > 0) + { + slide = w3c_slidy.slides[w3c_slidy.slide_number]; + w3c_slidy.hide_slide(slide); + + w3c_slidy.slide_number = w3c_slidy.slide_number - 1; + slide = w3c_slidy.slides[w3c_slidy.slide_number]; + w3c_slidy.set_visibility_all_incremental("visible"); + w3c_slidy.last_shown = w3c_slidy.previous_incremental_item(null); + w3c_slidy.set_eos_status(true); + w3c_slidy.show_slide(slide); + } + + w3c_slidy.set_location(); + + if (!w3c_slidy.ns_pos) + w3c_slidy.refresh_toolbar(200); + } + }, + + next_slide: function (incremental) { + if (!w3c_slidy.view_all) + { + var slide, last = w3c_slidy.last_shown; + + if (incremental || w3c_slidy.slide_number == w3c_slidy.slides.length - 1) + w3c_slidy.last_shown = w3c_slidy.reveal_next_item(w3c_slidy.last_shown); + + if ((!incremental || w3c_slidy.last_shown == null) && + w3c_slidy.slide_number < w3c_slidy.slides.length - 1) + { + slide = w3c_slidy.slides[w3c_slidy.slide_number]; + w3c_slidy.hide_slide(slide); + + w3c_slidy.slide_number = w3c_slidy.slide_number + 1; + slide = w3c_slidy.slides[w3c_slidy.slide_number]; + w3c_slidy.last_shown = null; + w3c_slidy.set_visibility_all_incremental("hidden"); + w3c_slidy.show_slide(slide); + } + else if (!w3c_slidy.last_shown) + { + if (last && incremental) + w3c_slidy.last_shown = last; + } + + w3c_slidy.set_location(); + + w3c_slidy.set_eos_status(!w3c_slidy.next_incremental_item(w3c_slidy.last_shown)); + + if (!w3c_slidy.ns_pos) + w3c_slidy.refresh_toolbar(200); + } + }, + + // to first slide with nothing revealed + // i.e. state at start of presentation + first_slide: function () { + if (!w3c_slidy.view_all) + { + var slide; + + if (w3c_slidy.slide_number != 0) + { + slide = w3c_slidy.slides[w3c_slidy.slide_number]; + w3c_slidy.hide_slide(slide); + + w3c_slidy.slide_number = 0; + slide = w3c_slidy.slides[w3c_slidy.slide_number]; + w3c_slidy.last_shown = null; + w3c_slidy.set_visibility_all_incremental("hidden"); + w3c_slidy.show_slide(slide); + } + + w3c_slidy.set_eos_status( + !w3c_slidy.next_incremental_item(w3c_slidy.last_shown)); + w3c_slidy.set_location(); + } + }, + + // goto last slide with everything revealed + // i.e. state at end of presentation + last_slide: function () { + if (!w3c_slidy.view_all) + { + var slide; + + w3c_slidy.last_shown = null; //revealNextItem(lastShown); + + if (w3c_slidy.last_shown == null && + w3c_slidy.slide_number < w3c_slidy.slides.length - 1) + { + slide = w3c_slidy.slides[w3c_slidy.slide_number]; + w3c_slidy.hide_slide(slide); + w3c_slidy.slide_number = w3c_slidy.slides.length - 1; + slide = w3c_slidy.slides[w3c_slidy.slide_number]; + w3c_slidy.set_visibility_all_incremental("visible"); + w3c_slidy.last_shown = w3c_slidy.previous_incremental_item(null); + + w3c_slidy.show_slide(slide); + } + else + { + w3c_slidy.set_visibility_all_incremental("visible"); + w3c_slidy.last_shown = w3c_slidy.previous_incremental_item(null); + } + + w3c_slidy.set_eos_status(true); + w3c_slidy.set_location(); + } + }, + + + // ### check this and consider add/remove class + set_eos_status: function (state) { + if (this.eos) + this.eos.style.color = (state ? "rgb(240,240,240)" : "red"); + }, + + // first slide is 0 + goto_slide: function (num) { + //alert("going to slide " + (num+1)); + var slide = w3c_slidy.slides[w3c_slidy.slide_number]; + w3c_slidy.hide_slide(slide); + w3c_slidy.slide_number = num; + slide = w3c_slidy.slides[w3c_slidy.slide_number]; + w3c_slidy.last_shown = null; + w3c_slidy.set_visibility_all_incremental("hidden"); + w3c_slidy.set_eos_status(!w3c_slidy.next_incremental_item(w3c_slidy.last_shown)); + document.title = w3c_slidy.title + " (" + (w3c_slidy.slide_number+1) + ")"; + w3c_slidy.show_slide(slide); + w3c_slidy.show_slide_number(); + }, + + + show_slide: function (slide) { + this.sync_background(slide); + window.scrollTo(0,0); + this.remove_class(slide, "hidden"); + }, + + hide_slide: function (slide) { + this.add_class(slide, "hidden"); + }, + + // show just the backgrounds pertinent to this slide + // when slide background-color is transparent + // this should now work with rgba color values + sync_background: function (slide) { + var background; + var bgColor; + + if (slide.currentStyle) + bgColor = slide.currentStyle["backgroundColor"]; + else if (document.defaultView) + { + var styles = document.defaultView.getComputedStyle(slide,null); + + if (styles) + bgColor = styles.getPropertyValue("background-color"); + else // broken implementation probably due Safari or Konqueror + { + //alert("defective implementation of getComputedStyle()"); + bgColor = "transparent"; + } + } + else + bgColor == "transparent"; + + if (bgColor == "transparent" || + bgColor.indexOf("rgba") >= 0 || + bgColor.indexOf("opacity") >= 0) + { + var slideClass = this.get_class_list(slide); + + for (var i = 0; i < this.backgrounds.length; i++) + { + background = this.backgrounds[i]; + + var bgClass = this.get_class_list(background); + + if (this.matching_background(slideClass, bgClass)) + this.remove_class(background, "hidden"); + else + this.add_class(background, "hidden"); + } + } + else // forcibly hide all backgrounds + this.hide_backgrounds(); + }, + + hide_backgrounds: function () { + for (var i = 0; i < this.backgrounds.length; i++) + { + background = this.backgrounds[i]; + this.add_class(background, "hidden"); + } + }, + + // compare classes for slide and background + matching_background: function (slideClass, bgClass) { + var i, count, pattern, result; + + // define pattern as regular expression + pattern = /\w+/g; + + // check background class names + result = bgClass.match(pattern); + + for (i = count = 0; i < result.length; i++) + { + if (result[i] == "hidden") + continue; + + if (result[i] == "background") + continue; + + ++count; + } + + if (count == 0) // default match + return true; + + // check for matches and place result in array + result = slideClass.match(pattern); + + // now check if desired name is present for background + for (i = count = 0; i < result.length; i++) + { + if (result[i] == "hidden") + continue; + + if (this.has_token(bgClass, result[i])) + return true; + } + + return false; + }, + + resized: function () { + var width = 0; + + if ( typeof( window.innerWidth ) == 'number' ) + width = window.innerWidth; // Non IE browser + else if (document.documentElement && document.documentElement.clientWidth) + width = document.documentElement.clientWidth; // IE6 + else if (document.body && document.body.clientWidth) + width = document.body.clientWidth; // IE4 + + var height = 0; + + if ( typeof( window.innerHeight ) == 'number' ) + height = window.innerHeight; // Non IE browser + else if (document.documentElement && document.documentElement.clientHeight) + height = document.documentElement.clientHeight; // IE6 + else if (document.body && document.body.clientHeight) + height = document.body.clientHeight; // IE4 + + if (height && (width/height > 1.05*1024/768)) + { + width = height * 1024.0/768; + } + + // IE fires onresize even when only font size is changed! + // so we do a check to avoid blocking < and > actions + if (width != w3c_slidy.last_width || height != w3c_slidy.last_height) + { + if (width >= 1100) + w3c_slidy.size_index = 5; // 4 + else if (width >= 1000) + w3c_slidy.size_index = 4; // 3 + else if (width >= 800) + w3c_slidy.size_index = 3; // 2 + else if (width >= 600) + w3c_slidy.size_index = 2; // 1 + else if (width) + w3c_slidy.size_index = 0; + + // add in font size adjustment from meta element e.g. + // <meta name="font-size-adjustment" content="-2" /> + // useful when slides have too much content ;-) + + if (0 <= w3c_slidy.size_index + w3c_slidy.size_adjustment && + w3c_slidy.size_index + w3c_slidy.size_adjustment < w3c_slidy.sizes.length) + w3c_slidy.size_index = w3c_slidy.size_index + w3c_slidy.size_adjustment; + + // enables cross browser use of relative width/height + // on object elements for use with SVG and Flash media + w3c_slidy.adjust_object_dimensions(width, height); + + if (document.body.style.fontSize != w3c_slidy.sizes[w3c_slidy.size_index]) + { + document.body.style.fontSize = w3c_slidy.sizes[w3c_slidy.size_index]; + } + + w3c_slidy.last_width = width; + w3c_slidy.last_height = height; + + // force reflow to work around Mozilla bug + if (w3c_slidy.ns_pos) + { + var slide = w3c_slidy.slides[w3c_slidy.slide_number]; + w3c_slidy.hide_slide(slide); + w3c_slidy.show_slide(slide); + } + + // force correct positioning of toolbar + w3c_slidy.refresh_toolbar(200); + } + }, + + scrolled: function () { + if (w3c_slidy.toolbar && !w3c_slidy.ns_pos && !w3c_slidy.ie7) + { + w3c_slidy.hack_offset = w3c_slidy.scroll_x_offset(); + // hide toolbar + w3c_slidy.toolbar.style.display = "none"; + + // make it reappear later + if (w3c_slidy.scrollhack == 0 && !w3c_slidy.view_all) + { + setTimeout(function () {w3c_slidy.show_toolbar(); }, 1000); + w3c_slidy.scrollhack = 1; + } + } + }, + + hide_toolbar: function () { + w3c_slidy.add_class(w3c_slidy.toolbar, "hidden"); + window.focus(); + }, + + // used to ensure IE refreshes toolbar in correct position + refresh_toolbar: function (interval) { + if (!w3c_slidy.ns_pos && !w3c_slidy.ie7) + { + w3c_slidy.hide_toolbar(); + setTimeout(function () {w3c_slidy.show_toolbar(); }, interval); + } + }, + + // restores toolbar after short delay + show_toolbar: function () { + if (w3c_slidy.want_toolbar) + { + w3c_slidy.toolbar.style.display = "block"; + + if (!w3c_slidy.ns_pos) + { + // adjust position to allow for scrolling + var xoffset = w3c_slidy.scroll_x_offset(); + w3c_slidy.toolbar.style.left = xoffset; + w3c_slidy.toolbar.style.right = xoffset; + + // determine vertical scroll offset + //var yoffset = scrollYOffset(); + + // bottom is doc height - window height - scroll offset + //var bottom = documentHeight() - lastHeight - yoffset + + //if (yoffset > 0 || documentHeight() > lastHeight) + // bottom += 16; // allow for height of scrollbar + + w3c_slidy.toolbar.style.bottom = 0; //bottom; + } + + w3c_slidy.remove_class(w3c_slidy.toolbar, "hidden"); + } + + w3c_slidy.scrollhack = 0; + + + // set the keyboard focus to the help link on the + // toolbar to ensure that document has the focus + // IE doesn't always work with window.focus() + // and this hack has benefit of Enter for help + + try + { + if (!w3c_slidy.opera) + w3c_slidy.help_anchor.focus(); + } + catch (e) + { + } + }, + +// invoked via F key + toggle_toolbar: function () { + if (!w3c_slidy.view_all) + { + if (w3c_slidy.has_class(w3c_slidy.toolbar, "hidden")) + { + w3c_slidy.remove_class(w3c_slidy.toolbar, "hidden") + w3c_slidy.want_toolbar = 1; + } + else + { + w3c_slidy.add_class(w3c_slidy.toolbar, "hidden") + w3c_slidy.want_toolbar = 0; + } + } + }, + + scroll_x_offset: function () { + if (window.pageXOffset) + return self.pageXOffset; + + if (document.documentElement && + document.documentElement.scrollLeft) + return document.documentElement.scrollLeft; + + if (document.body) + return document.body.scrollLeft; + + return 0; + }, + + scroll_y_offset: function () { + if (window.pageYOffset) + return self.pageYOffset; + + if (document.documentElement && + document.documentElement.scrollTop) + return document.documentElement.scrollTop; + + if (document.body) + return document.body.scrollTop; + + return 0; + }, + + // looking for a way to determine height of slide content + // the slide itself is set to the height of the window + optimize_font_size: function () { + var slide = w3c_slidy.slides[w3c_slidy.slide_number]; + + //var dh = documentHeight(); //getDocHeight(document); + var dh = slide.scrollHeight; + var wh = getWindowHeight(); + var u = 100 * dh / wh; + + alert("window utilization = " + u + "% (doc " + + dh + " win " + wh + ")"); + }, + + // from document object + get_doc_height: function (doc) { + if (!doc) + doc = document; + + if (doc && doc.body && doc.body.offsetHeight) + return doc.body.offsetHeight; // ns/gecko syntax + + if (doc && doc.body && doc.body.scrollHeight) + return doc.body.scrollHeight; + + alert("couldn't determine document height"); + }, + + get_window_height: function () { + if ( typeof( window.innerHeight ) == 'number' ) + return window.innerHeight; // Non IE browser + + if (document.documentElement && document.documentElement.clientHeight) + return document.documentElement.clientHeight; // IE6 + + if (document.body && document.body.clientHeight) + return document.body.clientHeight; // IE4 + }, + + document_height: function () { + var sh, oh; + + sh = document.body.scrollHeight; + oh = document.body.offsetHeight; + + if (sh && oh) + { + return (sh > oh ? sh : oh); + } + + // no idea! + return 0; + }, + + smaller: function () { + if (w3c_slidy.size_index > 0) + { + --w3c_slidy.size_index; + } + + w3c_slidy.toolbar.style.display = "none"; + document.body.style.fontSize = w3c_slidy.sizes[w3c_slidy.size_index]; + var slide = w3c_slidy.slides[w3c_slidy.slide_number]; + w3c_slidy.hide_slide(slide); + w3c_slidy.show_slide(slide); + setTimeout(function () {w3c_slidy.show_toolbar(); }, 50); + }, + + bigger: function () { + if (w3c_slidy.size_index < w3c_slidy.sizes.length - 1) + { + ++w3c_slidy.size_index; + } + + w3c_slidy.toolbar.style.display = "none"; + document.body.style.fontSize = w3c_slidy.sizes[w3c_slidy.size_index]; + var slide = w3c_slidy.slides[w3c_slidy.slide_number]; + w3c_slidy.hide_slide(slide); + w3c_slidy.show_slide(slide); + setTimeout(function () {w3c_slidy.show_toolbar(); }, 50); + }, + + // enables cross browser use of relative width/height + // on object elements for use with SVG and Flash media + // with thanks to Ivan Herman for the suggestion + adjust_object_dimensions: function (width, height) { + for( var i = 0; i < w3c_slidy.objects.length; i++ ) + { + var obj = this.objects[i]; + var mimeType = obj.getAttribute("type"); + + if (mimeType == "image/svg+xml" || mimeType == "application/x-shockwave-flash") + { + if ( !obj.initialWidth ) + obj.initialWidth = obj.getAttribute("width"); + + if ( !obj.initialHeight ) + obj.initialHeight = obj.getAttribute("height"); + + if ( obj.initialWidth && obj.initialWidth.charAt(obj.initialWidth.length-1) == "%" ) + { + var w = parseInt(obj.initialWidth.slice(0, obj.initialWidth.length-1)); + var newW = width * (w/100.0); + obj.setAttribute("width",newW); + } + + if ( obj.initialHeight && + obj.initialHeight.charAt(obj.initialHeight.length-1) == "%" ) + { + var h = parseInt(obj.initialHeight.slice(0, obj.initialHeight.length-1)); + var newH = height * (h/100.0); + obj.setAttribute("height", newH); + } + } + } + }, + + // needed for Opera to inhibit default behavior + // since Opera delivers keyPress even if keyDown + // was cancelled + key_press: function (event) { + if (!event) + event = window.event; + + if (!w3c_slidy.key_wanted) + return w3c_slidy.cancel(event); + + return true; + }, + + // See e.g. http://www.quirksmode.org/js/events/keys.html for keycodes + key_down: function (event) { + var key; + + w3c_slidy.key_wanted = true; + + if (!event) + event = window.event; + + // kludge around NS/IE differences + if (window.event) + key = window.event.keyCode; + else if (event.which) + key = event.which; + else + return true; // Yikes! unknown browser + + // ignore event if key value is zero + // as for alt on Opera and Konqueror + if (!key) + return true; + + // check for concurrent control/command/alt key + // but are these only present on mouse events? + + if (event.ctrlKey || event.altKey || event.metaKey) + return true; + + // dismiss table of contents if visible + if (w3c_slidy.is_shown_toc() && key != 9 && key != 16 && key != 38 && key != 40) + { + w3c_slidy.hide_table_of_contents(); + + if (key == 27 || key == 84 || key == 67) + return w3c_slidy.cancel(event); + } + + if (key == 34) // Page Down + { + if (w3c_slidy.view_all) + return true; + + w3c_slidy.next_slide(false); + return w3c_slidy.cancel(event); + } + else if (key == 33) // Page Up + { + if (w3c_slidy.view_all) + return true; + + w3c_slidy.previous_slide(false); + return w3c_slidy.cancel(event); + } + else if (key == 32) // space bar + { + w3c_slidy.next_slide(true); + return w3c_slidy.cancel(event); + } + else if (key == 37) // Left arrow + { + w3c_slidy.previous_slide(!event.shiftKey); + return w3c_slidy.cancel(event); + } + else if (key == 36) // Home + { + w3c_slidy.first_slide(); + return w3c_slidy.cancel(event); + } + else if (key == 35) // End + { + w3c_slidy.last_slide(); + return w3c_slidy.cancel(event); + } + else if (key == 39) // Right arrow + { + w3c_slidy.next_slide(!event.shiftKey); + return w3c_slidy.cancel(event); + } + else if (key == 13) // Enter + { + if (w3c_slidy.outline) + { + if (w3c_slidy.outline.visible) + w3c_slidy.fold(w3c_slidy.outline); + else + w3c_slidy.unfold(w3c_slidy.outline); + + return w3c_slidy.cancel(event); + } + } + else if (key == 188) // < for smaller fonts + { + w3c_slidy.smaller(); + return w3c_slidy.cancel(event); + } + else if (key == 190) // > for larger fonts + { + w3c_slidy.bigger(); + return w3c_slidy.cancel(event); + } + else if (key == 189 || key == 109) // - for smaller fonts + { + w3c_slidy.smaller(); + return w3c_slidy.cancel(event); + } + else if (key == 187 || key == 191 || key == 107) // = + for larger fonts + { + w3c_slidy.bigger(); + return w3c_slidy.cancel(event); + } + else if (key == 83) // S for smaller fonts + { + w3c_slidy.smaller(); + return w3c_slidy.cancel(event); + } + else if (key == 66) // B for larger fonts + { + w3c_slidy.bigger(); + return w3c_slidy.cancel(event); + } + else if (key == 90) // Z for last slide + { + w3c_slidy.last_slide(); + return w3c_slidy.cancel(event); + } + else if (key == 70) // F for toggle toolbar + { + w3c_slidy.toggle_toolbar(); + return w3c_slidy.cancel(event); + } + else if (key == 65) // A for toggle view single/all slides + { + w3c_slidy.toggle_view(); + return w3c_slidy.cancel(event); + } + else if (key == 75) // toggle action of left click for next page + { + w3c_slidy.mouse_click_enabled = !w3c_slidy.mouse_click_enabled; + var alert_msg = (w3c_slidy.mouse_click_enabled ? + "enabled" : "disabled") + " mouse click advance"; + + alert(alert_msg.localize()); + return w3c_slidy.cancel(event); + } + else if (key == 84 || key == 67) // T or C for table of contents + { + if (w3c_slidy.toc) + w3c_slidy.toggle_table_of_contents(); + + return w3c_slidy.cancel(event); + } + else if (key == 72) // H for help + { + window.location = w3c_slidy.help_page; + return w3c_slidy.cancel(event); + } + //else alert("key code is "+ key); + + return true; + }, + + // safe for both text/html and application/xhtml+xml + create_element: function (name) { + if (this.xhtml && (typeof document.createElementNS != 'undefined')) + return document.createElementNS("http://www.w3.org/1999/xhtml", name) + + return document.createElement(name); + }, + + get_element_style: function (elem, IEStyleProp, CSSStyleProp) { + if (elem.currentStyle) + { + return elem.currentStyle[IEStyleProp]; + } + else if (window.getComputedStyle) + { + var compStyle = window.getComputedStyle(elem, ""); + return compStyle.getPropertyValue(CSSStyleProp); + } + return ""; + }, + + // the string str is a whitespace separated list of tokens + // test if str contains a particular token, e.g. "slide" + has_token: function (str, token) { + if (str) + { + // define pattern as regular expression + var pattern = /\w+/g; + + // check for matches + // place result in array + var result = str.match(pattern); + + // now check if desired token is present + for (var i = 0; i < result.length; i++) + { + if (result[i] == token) + return true; + } + } + + return false; + }, + + get_class_list: function (element) { + if (typeof element.className != 'undefined') + return element.className; + + return element.getAttribute("class"); + }, + + has_class: function (element, name) { + if (element.nodeType != 1) + return false; + + var regexp = new RegExp("(^| )" + name + "\W*"); + + if (typeof element.className != 'undefined') + return regexp.test(element.className); + + return regexp.test(element.getAttribute("class")); + }, + + remove_class: function (element, name) { + var regexp = new RegExp("(^| )" + name + "\W*"); + var clsval = ""; + + if (typeof element.className != 'undefined') + { + clsval = element.className; + + if (clsval) + { + clsval = clsval.replace(regexp, ""); + element.className = clsval; + } + } + else + { + clsval = element.getAttribute("class"); + + if (clsval) + { + clsval = clsval.replace(regexp, ""); + element.setAttribute("class", clsval); + } + } + }, + + add_class: function (element, name) { + if (!this.has_class(element, name)) + { + if (typeof element.className != 'undefined') + element.className += " " + name; + else + { + var clsval = element.getAttribute("class"); + clsval = clsval ? clsval + " " + name : name; + element.setAttribute("class", clsval); + } + } + }, + + // HTML elements that can be used with class="incremental" + // note that you can also put the class on containers like + // up, ol, dl, and div to make their contents appear + // incrementally. Upper case is used since this is what + // browsers report for HTML node names (text/html). + incremental_elements: null, + okay_for_incremental: function (name) { + if (!this.incremental_elements) + { + var inclist = new Array(); + inclist["p"] = true; + inclist["pre"] = true; + inclist["li"] = true; + inclist["blockquote"] = true; + inclist["dt"] = true; + inclist["dd"] = true; + inclist["h2"] = true; + inclist["h3"] = true; + inclist["h4"] = true; + inclist["h5"] = true; + inclist["h6"] = true; + inclist["span"] = true; + inclist["address"] = true; + inclist["table"] = true; + inclist["tr"] = true; + inclist["th"] = true; + inclist["td"] = true; + inclist["img"] = true; + inclist["object"] = true; + this.incremental_elements = inclist; + } + return this.incremental_elements[name.toLowerCase()]; + }, + + next_incremental_item: function (node) { + var br = this.is_xhtml ? "br" : "BR"; + var slide = w3c_slidy.slides[w3c_slidy.slide_number]; + + for (;;) + { + node = w3c_slidy.next_node(slide, node); + + if (node == null || node.parentNode == null) + break; + + if (node.nodeType == 1) // ELEMENT + { + if (node.nodeName == br) + continue; + + if (w3c_slidy.has_class(node, "incremental") + && w3c_slidy.okay_for_incremental(node.nodeName)) + return node; + + if (w3c_slidy.has_class(node.parentNode, "incremental") + && !w3c_slidy.has_class(node, "non-incremental")) + return node; + } + } + + return node; + }, + + previous_incremental_item: function (node) { + var br = this.is_xhtml ? "br" : "BR"; + var slide = w3c_slidy.slides[w3c_slidy.slide_number]; + + for (;;) + { + node = w3c_slidy.previous_node(slide, node); + + if (node == null || node.parentNode == null) + break; + + if (node.nodeType == 1) + { + if (node.nodeName == br) + continue; + + if (w3c_slidy.has_class(node, "incremental") + && w3c_slidy.okay_for_incremental(node.nodeName)) + return node; + + if (w3c_slidy.has_class(node.parentNode, "incremental") + && !w3c_slidy.has_class(node, "non-incremental")) + return node; + } + } + + return node; + }, + + // set visibility for all elements on current slide with + // a parent element with attribute class="incremental" + set_visibility_all_incremental: function (value) { + var node = this.next_incremental_item(null); + + if (value == "hidden") + { + while (node) + { + w3c_slidy.add_class(node, "invisible"); + node = w3c_slidy.next_incremental_item(node); + } + } + else // value == "visible" + { + while (node) + { + w3c_slidy.remove_class(node, "invisible"); + node = w3c_slidy.next_incremental_item(node); + } + } + }, + + // reveal the next hidden item on the slide + // node is null or the node that was last revealed + reveal_next_item: function (node) { + node = w3c_slidy.next_incremental_item(node); + + if (node && node.nodeType == 1) // an element + w3c_slidy.remove_class(node, "invisible"); + + return node; + }, + + // exact inverse of revealNextItem(node) + hide_previous_item: function (node) { + if (node && node.nodeType == 1) // an element + w3c_slidy.add_class(node, "invisible"); + + return this.previous_incremental_item(node); + }, + + // left to right traversal of root's content + next_node: function (root, node) { + if (node == null) + return root.firstChild; + + if (node.firstChild) + return node.firstChild; + + if (node.nextSibling) + return node.nextSibling; + + for (;;) + { + node = node.parentNode; + + if (!node || node == root) + break; + + if (node && node.nextSibling) + return node.nextSibling; + } + + return null; + }, + + // right to left traversal of root's content + previous_node: function (root, node) { + if (node == null) + { + node = root.lastChild; + + if (node) + { + while (node.lastChild) + node = node.lastChild; + } + + return node; + } + + if (node.previousSibling) + { + node = node.previousSibling; + + while (node.lastChild) + node = node.lastChild; + + return node; + } + + if (node.parentNode != root) + return node.parentNode; + + return null; + }, + + previous_sibling_element: function (el) { + el = el.previousSibling; + + while (el && el.nodeType != 1) + el = el.previousSibling; + + return el; + }, + + next_sibling_element: function (el) { + el = el.nextSibling; + + while (el && el.nodeType != 1) + el = el.nextSibling; + + return el; + }, + + first_child_element: function (el) { + var node; + + for (node = el.firstChild; node; node = node.nextSibling) + { + if (node.nodeType == 1) + break; + } + + return node; + }, + + first_tag: function (element, tag) { + var node; + + if (!this.is_xhtml) + tag = tag.toUpperCase(); + + for (node = element.firstChild; node; node = node.nextSibling) + { + if (node.nodeType == 1 && node.nodeName == tag) + break; + } + + return node; + }, + + hide_selection: function () { + if (window.getSelection) // Firefox, Chromium, Safari, Opera + { + var selection = window.getSelection(); + + if (selection.rangeCount > 0) + { + var range = selection.getRangeAt(0); + range.collapse (false); + } + } + else // Internet Explorer + { + var textRange = document.selection.createRange (); + textRange.collapse (false); + } + }, + + get_selected_text: function () { + try + { + if (window.getSelection) + return window.getSelection().toString(); + + if (document.getSelection) + return document.getSelection().toString(); + + if (document.selection) + return document.selection.createRange().text; + } + catch (e) + { + } + + return ""; + }, + + // make note of length of selected text + // as this evaluates to zero in click event + mouse_button_up: function (e) { + w3c_slidy.selected_text_len = w3c_slidy.get_selected_text().length; + }, + + // right mouse button click is reserved for context menus + // it is more reliable to detect rightclick than leftclick + mouse_button_click: function (e) { + var rightclick = false; + var leftclick = false; + var middleclick = false; + var target; + + if (!e) + var e = window.event; + + if (e.target) + target = e.target; + else if (e.srcElement) + target = e.srcElement; + + // work around Safari bug + if (target.nodeType == 3) + target = target.parentNode; + + if (e.which) // all browsers except IE + { + leftclick = (e.which == 1); + middleclick = (e.which == 2); + rightclick = (e.which == 3); + } + else if (e.button) + { + // Konqueror gives 1 for left, 4 for middle + // IE6 gives 0 for left and not 1 as I expected + + if (e.button == 4) + middleclick = true; + + // all browsers agree on 2 for right button + rightclick = (e.button == 2); + } + else leftclick = true; +/* + alert("you clicked over a " + target.nodeName + " element\n" + + "w3c_slidy.mouse_click_enabled = " + w3c_slidy.mouse_click_enabled + "\n" + + "leftclick = " + leftclick + "\n" + + "selected text length = " + w3c_slidy.selected_text_len); + //alert("selected text length = " + w3c_slidy.selected_text_len); +*/ + if (w3c_slidy.selected_text_len > 0) + { + w3c_slidy.stop_propagation(e); + e.cancel = true; + e.returnValue = false; + return false; + } + + // dismiss table of contents + w3c_slidy.hide_table_of_contents(); + + // check if target is something that probably want's clicks + // e.g. a, embed, object, input, textarea, select, option + var tag = target.nodeName.toLowerCase(); + + if (w3c_slidy.mouse_click_enabled && leftclick && + tag != "a" && + tag != "embed" && + tag != "object" && + tag != "video" && + tag != "input" && + tag != "textarea" && + tag != "select" && + tag != "option" && + !target.onclick) + { + w3c_slidy.next_slide(true); + w3c_slidy.stop_propagation(e); + e.cancel = true; + e.returnValue = false; + return false; + } + }, + + get_key: function (e) + { + var key; + + // kludge around NS/IE differences + if (typeof window.event != "undefined") + key = window.event.keyCode; + else if (e.which) + key = e.which; + + return key; + }, + + get_target: function (e) { + var target; + + if (!e) + e = window.event; + + if (e.target) + target = e.target; + else if (e.srcElement) + target = e.srcElement; + + if (target.nodeType != 1) + target = target.parentNode; + + return target; + }, + + // does display property provide correct defaults? + is_block: function (elem) { + var tag = elem.nodeName.toLowerCase(); + + return tag == "ol" || tag == "ul" || tag == "p" || + tag == "li" || tag == "table" || tag == "pre" || + tag == "h1" || tag == "h2" || tag == "h3" || + tag == "h4" || tag == "h5" || tag == "h6" || + tag == "blockquote" || tag == "address"; + }, + + add_listener: function (element, event, handler) { + if (window.addEventListener) + element.addEventListener(event, handler, false); + else + element.attachEvent("on"+event, handler); + }, + + // used to prevent event propagation from field controls + stop_propagation: function (event) { + event = event ? event : window.event; + event.cancelBubble = true; // for IE + + if (event.stopPropagation) + event.stopPropagation(); + + return true; + }, + + cancel: function (event) { + if (event) + { + event.cancel = true; + event.returnValue = false; + + if (event.preventDefault) + event.preventDefault(); + } + + w3c_slidy.key_wanted = false; + return false; + } +}; + +// for each language define an associative array +// and also the help text which is longer + +var w3c_slidy_i18n = { + strings_es: { + "slide":"pág.", + "help?":"Ayuda", + "contents?":"Índice", + "table of contents":"tabla de contenidos", + "Table of Contents":"Tabla de Contenidos", + "restart presentation":"Reiniciar presentación", + "restart?":"Inicio" + }, + help_es: + "Utilice el ratón, barra espaciadora, teclas Izda/Dcha, " + + "o Re pág y Av pág. Use S y B para cambiar el tamaño de fuente.", + + strings_ca: { + "slide":"pàg..", + "help?":"Ajuda", + "contents?":"Índex", + "table of contents":"taula de continguts", + "Table of Contents":"Taula de Continguts", + "restart presentation":"Reiniciar presentació", + "restart?":"Inici" + }, + help_ca: + "Utilitzi el ratolí, barra espaiadora, tecles Esq./Dta. " + + "o Re pàg y Av pàg. Usi S i B per canviar grandària de font.", + + strings_cs: { + "slide":"snímek", + "help?":"nápověda", + "contents?":"obsah", + "table of contents":"obsah prezentace", + "Table of Contents":"Obsah prezentace", + "restart presentation":"znovu spustit prezentaci", + "restart?":"restart" + }, + help_cs: + "Prezentaci můžete procházet pomocí kliknutí myši, mezerníku, " + + "šipek vlevo a vpravo nebo kláves PageUp a PageDown. Písmo se " + + "dá zvětšit a zmenšit pomocí kláves B a S.", + + strings_nl: { + "slide":"pagina", + "help?":"Help?", + "contents?":"Inhoud?", + "table of contents":"inhoudsopgave", + "Table of Contents":"Inhoudsopgave", + "restart presentation":"herstart presentatie", + "restart?":"Herstart?" + }, + help_nl: + "Navigeer d.m.v. het muis, spatiebar, Links/Rechts toetsen, " + + "of PgUp en PgDn. Gebruik S en B om de karaktergrootte te veranderen.", + + strings_de: { + "slide":"Seite", + "help?":"Hilfe", + "contents?":"Übersicht", + "table of contents":"Inhaltsverzeichnis", + "Table of Contents":"Inhaltsverzeichnis", + "restart presentation":"Präsentation neu starten", + "restart?":"Neustart" + }, + help_de: + "Benutzen Sie die Maus, Leerschlag, die Cursortasten links/rechts oder " + + "Page up/Page Down zum Wechseln der Seiten und S und B für die Schriftgrösse.", + + strings_pl: { + "slide":"slajd", + "help?":"pomoc?", + "contents?":"spis treści?", + "table of contents":"spis treści", + "Table of Contents":"Spis Treści", + "restart presentation":"Restartuj prezentację", + "restart?":"restart?" + }, + help_pl: + "Zmieniaj slajdy klikając myszą, naciskając spację, strzałki lewo/prawo" + + "lub PgUp / PgDn. Użyj klawiszy S i B, aby zmienić rozmiar czczionki.", + + strings_fr: { + "slide":"page", + "help?":"Aide", + "contents?":"Index", + "table of contents":"table des matières", + "Table of Contents":"Table des matières", + "restart presentation":"Recommencer l'exposé", + "restart?":"Début" + }, + help_fr: + "Naviguez avec la souris, la barre d'espace, les flèches " + + "gauche/droite ou les touches Pg Up, Pg Dn. Utilisez " + + "les touches S et B pour modifier la taille de la police.", + + strings_hu: { + "slide":"oldal", + "help?":"segítség", + "contents?":"tartalom", + "table of contents":"tartalomjegyzék", + "Table of Contents":"Tartalomjegyzék", + "restart presentation":"bemutató újraindítása", + "restart?":"újraindítás" + }, + help_hu: + "Az oldalak közti lépkedéshez kattintson az egérrel, vagy " + + "használja a szóköz, a bal, vagy a jobb nyíl, illetve a Page Down, " + + "Page Up billentyűket. Az S és a B billentyűkkel változtathatja " + + "a szöveg méretét.", + + strings_it: { + "slide":"pag.", + "help?":"Aiuto", + "contents?":"Indice", + "table of contents":"indice", + "Table of Contents":"Indice", + "restart presentation":"Ricominciare la presentazione", + "restart?":"Inizio" + }, + help_it: + "Navigare con mouse, barra spazio, frecce sinistra/destra o " + + "PgUp e PgDn. Usare S e B per cambiare la dimensione dei caratteri.", + + strings_el: { + "slide":"σελίδα", + "help?":"βοήθεια;", + "contents?":"περιεχόμενα;", + "table of contents":"πίνακας περιεχομένων", + "Table of Contents":"Πίνακας Περιεχομένων", + "restart presentation":"επανεκκίνηση παρουσίασης", + "restart?":"επανεκκίνηση;" + }, + help_el: + "Πλοηγηθείτε με το κλίκ του ποντικιού, το space, τα βέλη αριστερά/δεξιά, " + + "ή Page Up και Page Down. Χρησιμοποιήστε τα πλήκτρα S και B για να αλλάξετε " + + "το μέγεθος της γραμματοσειράς.", + + strings_ja: { + "slide":"スライド", + "help?":"ヘルプ", + "contents?":"目次", + "table of contents":"目次を表示", + "Table of Contents":"目次", + "restart presentation":"最初から再生", + "restart?":"最初から" + }, + help_ja: + "マウス左クリック ・ スペース ・ 左右キー " + + "または Page Up ・ Page Downで操作, S ・ Bでフォントサイズ変更", + + strings_zh: { + "slide":"幻灯片", + "help?":"帮助?", + "contents?":"内容?", + "table of contents":"目录", + "Table of Contents":"目录", + "restart presentation":"重新启动展示", + "restart?":"重新启动?" + }, + help_zh: + "用鼠标点击, 空格条, 左右箭头, Pg Up 和 Pg Dn 导航. " + + "用 S, B 改变字体大小.", + + strings_ru: { + "slide":"слайд", + "help?":"помощь?", + "contents?":"содержание?", + "table of contents":"оглавление", + "Table of Contents":"Оглавление", + "restart presentation":"перезапустить презентацию", + "restart?":"перезапуск?" + }, + help_ru: + "Перемещайтесь кликая мышкой, используя клавишу пробел, стрелки" + + "влево/вправо или Pg Up и Pg Dn. Клавиши S и B меняют размер шрифта.", + + strings_sv: { + "slide":"sida", + "help?":"hjälp", + "contents?":"innehåll", + "table of contents":"innehållsförteckning", + "Table of Contents":"Innehållsförteckning", + "restart presentation":"visa presentationen från början", + "restart?":"börja om" + }, + help_sv: + "Bläddra med ett klick med vänstra musknappen, mellanslagstangenten, " + + "vänster- och högerpiltangenterna eller tangenterna Pg Up, Pg Dn. " + + "Använd tangenterna S och B för att ändra textens storlek.", + +// each such language array is declared in the localize array +// which is set on string prototype and used as in "foo".localize(); + localize: { + "es":this.strings_es, + "ca":this.strings_ca, + "cs":this.strings_cs, + "nl":this.strings_nl, + "de":this.strings_de, + "pl":this.strings_pl, + "fr":this.strings_fr, + "hu":this.strings_hu, + "it":this.strings_it, + "el":this.strings_el, + "jp":this.strings_ja, + "zh":this.strings_zh, + "ru":this.strings_ru, + "sv":this.strings_sv + }, + + init: function () { + var i18n = w3c_slidy_i18n; + var help_text = w3c_slidy.help_text; + i18n.strings_es[help_text] = i18n.help_es; + i18n.strings_ca[help_text] = i18n.help_ca; + i18n.strings_cs[help_text] = i18n.help_cs; + i18n.strings_nl[help_text] = i18n.help_nl; + i18n.strings_de[help_text] = i18n.help_de; + i18n.strings_pl[help_text] = i18n.help_pl; + i18n.strings_fr[help_text] = i18n.help_fr; + i18n.strings_hu[help_text] = i18n.help_hu; + i18n.strings_it[help_text] = i18n.help_it; + i18n.strings_el[help_text] = i18n.help_el; + i18n.strings_ja[help_text] = i18n.help_ja; + i18n.strings_zh[help_text] = i18n.help_zh; + i18n.strings_ru[help_text] = i18n.help_ru; + i18n.strings_sv[help_text] = i18n.help_sv; + + w3c_slidy.lang = document.body.parentNode.getAttribute("lang"); + + if (!w3c_slidy.lang) + w3c_slidy.lang = document.body.parentNode.getAttribute("xml:lang"); + + if (!w3c_slidy.lang) + w3c_slidy.lang = "en"; + + // add localize method to all strings + // for use as in "contents".localize() + String.prototype.localize = function() { + if (this == "") + return this; + + // try full language code, e.g. en-US + var s, lookup = w3c_slidy_i18n.localize[w3c_slidy.lang]; + + if (lookup) + { + s = lookup[this]; + + if (s) + return s; + } + + // strip country code suffix, e.g. + // try en if undefined for en-US + var lg = w3c_slidy.lang.split("-"); + + if (lg.length > 1) + { + lookup = w3c_slidy_i18n.localize[lg[0]]; + + if (lookup) + { + s = lookup[this]; + + if (s) + return s; + } + } + + // otherwise string as is + return this; + }; + } +}; + +// hack for back button behavior +if (w3c_slidy.ie6 || w3c_slidy.ie7) +{ + document.write("<iframe id='historyFrame' " + + "src='javascript:\"<html"+"></"+"html>\"' " + + "height='1' width='1' " + + "style='position:absolute;left:-800px'></iframe>"); +} + +// attach event listeners for initialization +w3c_slidy.set_up(); + +// hide the slides as soon as body element is available +// to reduce annoying screen mess before the onload event +setTimeout(w3c_slidy.hide_slides, 50); + diff --git a/source-builder/sb/asciidoc/javascripts/toc.js b/source-builder/sb/asciidoc/javascripts/toc.js new file mode 100644 index 0000000..06127bf --- /dev/null +++ b/source-builder/sb/asciidoc/javascripts/toc.js @@ -0,0 +1,77 @@ +/* + * IMPORTANT: + * This file (toc.js is) deprecated (superceded by asciidoc-xhtml11.js in + * AsciiDoc 8.5.1. toc.js is retained for compatibility with user customised + * (pre 8.5.1) xhtml11 [header] and [footer] sections. + * + */ + +/* Author: Mihai Bazon, September 2002 + * http://students.infoiasi.ro/~mishoo + * + * Table Of Content generator + * Version: 0.4 + * + * Feel free to use this script under the terms of the GNU General Public + * License, as long as you do not remove or alter this notice. + */ + + /* modified by Troy D. Hanson, September 2006. License: GPL */ + /* modified by Stuart Rackham, October 2006. License: GPL */ + +function getText(el) { + var text = ""; + for (var i = el.firstChild; i != null; i = i.nextSibling) { + if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants. + text += i.data; + else if (i.firstChild != null) + text += getText(i); + } + return text; +} + +function TocEntry(el, text, toclevel) { + this.element = el; + this.text = text; + this.toclevel = toclevel; +} + +function tocEntries(el, toclevels) { + var result = new Array; + var re = new RegExp('[hH]([2-'+(toclevels+1)+'])'); + // Function that scans the DOM tree for header elements (the DOM2 + // nodeIterator API would be a better technique but not supported by all + // browsers). + var iterate = function (el) { + for (var i = el.firstChild; i != null; i = i.nextSibling) { + if (i.nodeType == 1 /* Node.ELEMENT_NODE */) { + var mo = re.exec(i.tagName) + if (mo) + result[result.length] = new TocEntry(i, getText(i), mo[1]-1); + iterate(i); + } + } + } + iterate(el); + return result; +} + +// This function does the work. toclevels = 1..4. +function generateToc(toclevels) { + var toc = document.getElementById("toc"); + var entries = tocEntries(document.getElementsByTagName("body")[0], toclevels); + for (var i = 0; i < entries.length; ++i) { + var entry = entries[i]; + if (entry.element.id == "") + entry.element.id = "toc" + i; + var a = document.createElement("a"); + a.href = "#" + entry.element.id; + a.appendChild(document.createTextNode(entry.text)); + var div = document.createElement("div"); + div.appendChild(a); + div.className = "toclevel" + entry.toclevel; + toc.appendChild(div); + } + if (entries.length == 0) + document.getElementById("header").removeChild(toc); +} diff --git a/source-builder/sb/asciidoc/stylesheets/asciidoc.css b/source-builder/sb/asciidoc/stylesheets/asciidoc.css new file mode 100644 index 0000000..be88313 --- /dev/null +++ b/source-builder/sb/asciidoc/stylesheets/asciidoc.css @@ -0,0 +1,527 @@ +/* Shared CSS for AsciiDoc xhtml11 and html5 backends */ + +/* Default font. */ +body { + font-family: Georgia,serif; +} + +/* Title font. */ +h1, h2, h3, h4, h5, h6, +div.title, caption.title, +thead, p.table.header, +#toctitle, +#author, #revnumber, #revdate, #revremark, +#footer { + font-family: Arial,Helvetica,sans-serif; +} + +body { + margin: 1em 5% 1em 5%; +} + +a { + color: blue; + text-decoration: underline; +} +a:visited { + color: fuchsia; +} + +em { + font-style: italic; + color: navy; +} + +strong { + font-weight: bold; + color: #083194; +} + +h1, h2, h3, h4, h5, h6 { + color: #527bbd; + margin-top: 1.2em; + margin-bottom: 0.5em; + line-height: 1.3; +} + +h1, h2, h3 { + border-bottom: 2px solid silver; +} +h2 { + padding-top: 0.5em; +} +h3 { + float: left; +} +h3 + * { + clear: left; +} +h5 { + font-size: 1.0em; +} + +div.sectionbody { + margin-left: 0; +} + +hr { + border: 1px solid silver; +} + +p { + margin-top: 0.5em; + margin-bottom: 0.5em; +} + +ul, ol, li > p { + margin-top: 0; +} +ul > li { color: #aaa; } +ul > li > * { color: black; } + +.monospaced, code, pre { + font-family: "Courier New", Courier, monospace; + font-size: inherit; + color: navy; + padding: 0; + margin: 0; +} +pre { + white-space: pre-wrap; +} + +#author { + color: #527bbd; + font-weight: bold; + font-size: 1.1em; +} +#email { +} +#revnumber, #revdate, #revremark { +} + +#footer { + font-size: small; + border-top: 2px solid silver; + padding-top: 0.5em; + margin-top: 4.0em; +} +#footer-text { + float: left; + padding-bottom: 0.5em; +} +#footer-badges { + float: right; + padding-bottom: 0.5em; +} + +#preamble { + margin-top: 1.5em; + margin-bottom: 1.5em; +} +div.imageblock, div.exampleblock, div.verseblock, +div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock, +div.admonitionblock { + margin-top: 1.0em; + margin-bottom: 1.5em; +} +div.admonitionblock { + margin-top: 2.0em; + margin-bottom: 2.0em; + margin-right: 10%; + color: #606060; +} + +div.content { /* Block element content. */ + padding: 0; +} + +/* Block element titles. */ +div.title, caption.title { + color: #527bbd; + font-weight: bold; + text-align: left; + margin-top: 1.0em; + margin-bottom: 0.5em; +} +div.title + * { + margin-top: 0; +} + +td div.title:first-child { + margin-top: 0.0em; +} +div.content div.title:first-child { + margin-top: 0.0em; +} +div.content + div.title { + margin-top: 0.0em; +} + +div.sidebarblock > div.content { + background: #ffffee; + border: 1px solid #dddddd; + border-left: 4px solid #f0f0f0; + padding: 0.5em; +} + +div.listingblock > div.content { + border: 1px solid #dddddd; + border-left: 5px solid #f0f0f0; + background: #f8f8f8; + padding: 0.5em; +} + +div.quoteblock, div.verseblock { + padding-left: 1.0em; + margin-left: 1.0em; + margin-right: 10%; + border-left: 5px solid #f0f0f0; + color: #888; +} + +div.quoteblock > div.attribution { + padding-top: 0.5em; + text-align: right; +} + +div.verseblock > pre.content { + font-family: inherit; + font-size: inherit; +} +div.verseblock > div.attribution { + padding-top: 0.75em; + text-align: left; +} +/* DEPRECATED: Pre version 8.2.7 verse style literal block. */ +div.verseblock + div.attribution { + text-align: left; +} + +div.admonitionblock .icon { + vertical-align: top; + font-size: 1.1em; + font-weight: bold; + text-decoration: underline; + color: #527bbd; + padding-right: 0.5em; +} +div.admonitionblock td.content { + padding-left: 0.5em; + border-left: 3px solid #dddddd; +} + +div.exampleblock > div.content { + border-left: 3px solid #dddddd; + padding-left: 0.5em; +} + +div.imageblock div.content { padding-left: 0; } +span.image img { border-style: none; vertical-align: text-bottom; } +a.image:visited { color: white; } + +dl { + margin-top: 0.8em; + margin-bottom: 0.8em; +} +dt { + margin-top: 0.5em; + margin-bottom: 0; + font-style: normal; + color: navy; +} +dd > *:first-child { + margin-top: 0.1em; +} + +ul, ol { + list-style-position: outside; +} +ol.arabic { + list-style-type: decimal; +} +ol.loweralpha { + list-style-type: lower-alpha; +} +ol.upperalpha { + list-style-type: upper-alpha; +} +ol.lowerroman { + list-style-type: lower-roman; +} +ol.upperroman { + list-style-type: upper-roman; +} + +div.compact ul, div.compact ol, +div.compact p, div.compact p, +div.compact div, div.compact div { + margin-top: 0.1em; + margin-bottom: 0.1em; +} + +tfoot { + font-weight: bold; +} +td > div.verse { + white-space: pre; +} + +div.hdlist { + margin-top: 0.8em; + margin-bottom: 0.8em; +} +div.hdlist tr { + padding-bottom: 15px; +} +dt.hdlist1.strong, td.hdlist1.strong { + font-weight: bold; +} +td.hdlist1 { + vertical-align: top; + font-style: normal; + padding-right: 0.8em; + color: navy; +} +td.hdlist2 { + vertical-align: top; +} +div.hdlist.compact tr { + margin: 0; + padding-bottom: 0; +} + +.comment { + background: yellow; +} + +.footnote, .footnoteref { + font-size: 0.8em; +} + +span.footnote, span.footnoteref { + vertical-align: super; +} + +#footnotes { + margin: 20px 0 20px 0; + padding: 7px 0 0 0; +} + +#footnotes div.footnote { + margin: 0 0 5px 0; +} + +#footnotes hr { + border: none; + border-top: 1px solid silver; + height: 1px; + text-align: left; + margin-left: 0; + width: 20%; + min-width: 100px; +} + +div.colist td { + padding-right: 0.5em; + padding-bottom: 0.3em; + vertical-align: top; +} +div.colist td img { + margin-top: 0.3em; +} + +@media print { + #footer-badges { display: none; } +} + +#toc { + margin-bottom: 2.5em; +} + +#toctitle { + color: #527bbd; + font-size: 1.1em; + font-weight: bold; + margin-top: 1.0em; + margin-bottom: 0.1em; +} + +div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 { + margin-top: 0; + margin-bottom: 0; +} +div.toclevel2 { + margin-left: 2em; + font-size: 0.9em; +} +div.toclevel3 { + margin-left: 4em; + font-size: 0.9em; +} +div.toclevel4 { + margin-left: 6em; + font-size: 0.9em; +} + +span.aqua { color: aqua; } +span.black { color: black; } +span.blue { color: blue; } +span.fuchsia { color: fuchsia; } +span.gray { color: gray; } +span.green { color: green; } +span.lime { color: lime; } +span.maroon { color: maroon; } +span.navy { color: navy; } +span.olive { color: olive; } +span.purple { color: purple; } +span.red { color: red; } +span.silver { color: silver; } +span.teal { color: teal; } +span.white { color: white; } +span.yellow { color: yellow; } + +span.aqua-background { background: aqua; } +span.black-background { background: black; } +span.blue-background { background: blue; } +span.fuchsia-background { background: fuchsia; } +span.gray-background { background: gray; } +span.green-background { background: green; } +span.lime-background { background: lime; } +span.maroon-background { background: maroon; } +span.navy-background { background: navy; } +span.olive-background { background: olive; } +span.purple-background { background: purple; } +span.red-background { background: red; } +span.silver-background { background: silver; } +span.teal-background { background: teal; } +span.white-background { background: white; } +span.yellow-background { background: yellow; } + +span.big { font-size: 2em; } +span.small { font-size: 0.6em; } + +span.underline { text-decoration: underline; } +span.overline { text-decoration: overline; } +span.line-through { text-decoration: line-through; } + +div.unbreakable { page-break-inside: avoid; } + + +/* + * xhtml11 specific + * + * */ + +div.tableblock { + margin-top: 1.0em; + margin-bottom: 1.5em; +} +div.tableblock > table { + border: 3px solid #527bbd; +} +thead, p.table.header { + font-weight: bold; + color: #527bbd; +} +p.table { + margin-top: 0; +} +/* Because the table frame attribute is overriden by CSS in most browsers. */ +div.tableblock > table[frame="void"] { + border-style: none; +} +div.tableblock > table[frame="hsides"] { + border-left-style: none; + border-right-style: none; +} +div.tableblock > table[frame="vsides"] { + border-top-style: none; + border-bottom-style: none; +} + + +/* + * html5 specific + * + * */ + +table.tableblock { + margin-top: 1.0em; + margin-bottom: 1.5em; +} +thead, p.tableblock.header { + font-weight: bold; + color: #527bbd; +} +p.tableblock { + margin-top: 0; +} +table.tableblock { + border-width: 3px; + border-spacing: 0px; + border-style: solid; + border-color: #527bbd; + border-collapse: collapse; +} +th.tableblock, td.tableblock { + border-width: 1px; + padding: 4px; + border-style: solid; + border-color: #527bbd; +} + +table.tableblock.frame-topbot { + border-left-style: hidden; + border-right-style: hidden; +} +table.tableblock.frame-sides { + border-top-style: hidden; + border-bottom-style: hidden; +} +table.tableblock.frame-none { + border-style: hidden; +} + +th.tableblock.halign-left, td.tableblock.halign-left { + text-align: left; +} +th.tableblock.halign-center, td.tableblock.halign-center { + text-align: center; +} +th.tableblock.halign-right, td.tableblock.halign-right { + text-align: right; +} + +th.tableblock.valign-top, td.tableblock.valign-top { + vertical-align: top; +} +th.tableblock.valign-middle, td.tableblock.valign-middle { + vertical-align: middle; +} +th.tableblock.valign-bottom, td.tableblock.valign-bottom { + vertical-align: bottom; +} + + +/* + * manpage specific + * + * */ + +body.manpage h1 { + padding-top: 0.5em; + padding-bottom: 0.5em; + border-top: 2px solid silver; + border-bottom: 2px solid silver; +} +body.manpage h2 { + border-style: none; +} +body.manpage div.sectionbody { + margin-left: 3em; +} + +@media print { + body.manpage div#toc { display: none; } +} diff --git a/source-builder/sb/asciidoc/stylesheets/docbook-xsl.css b/source-builder/sb/asciidoc/stylesheets/docbook-xsl.css new file mode 100644 index 0000000..ee9ca46 --- /dev/null +++ b/source-builder/sb/asciidoc/stylesheets/docbook-xsl.css @@ -0,0 +1,329 @@ +/* + CSS stylesheet for XHTML produced by DocBook XSL stylesheets. +*/ + +body { + font-family: Georgia,serif; +} + +code, pre { + font-family: "Courier New", Courier, monospace; +} + +span.strong { + font-weight: bold; +} + +body blockquote { + margin-top: .75em; + line-height: 1.5; + margin-bottom: .75em; +} + +html body { + margin: 1em 5% 1em 5%; + line-height: 1.2; +} + +body div { + margin: 0; +} + +h1, h2, h3, h4, h5, h6 +{ + color: #527bbd; + font-family: Arial,Helvetica,sans-serif; +} + +div.toc p:first-child, +div.list-of-figures p:first-child, +div.list-of-tables p:first-child, +div.list-of-examples p:first-child, +div.example p.title, +div.sidebar p.title +{ + font-weight: bold; + color: #527bbd; + font-family: Arial,Helvetica,sans-serif; + margin-bottom: 0.2em; +} + +body h1 { + margin: .0em 0 0 -4%; + line-height: 1.3; + border-bottom: 2px solid silver; +} + +body h2 { + margin: 0.5em 0 0 -4%; + line-height: 1.3; + border-bottom: 2px solid silver; +} + +body h3 { + margin: .8em 0 0 -3%; + line-height: 1.3; +} + +body h4 { + margin: .8em 0 0 -3%; + line-height: 1.3; +} + +body h5 { + margin: .8em 0 0 -2%; + line-height: 1.3; +} + +body h6 { + margin: .8em 0 0 -1%; + line-height: 1.3; +} + +body hr { + border: none; /* Broken on IE6 */ +} +div.footnotes hr { + border: 1px solid silver; +} + +div.navheader th, div.navheader td, div.navfooter td { + font-family: Arial,Helvetica,sans-serif; + font-size: 0.9em; + font-weight: bold; + color: #527bbd; +} +div.navheader img, div.navfooter img { + border-style: none; +} +div.navheader a, div.navfooter a { + font-weight: normal; +} +div.navfooter hr { + border: 1px solid silver; +} + +body td { + line-height: 1.2 +} + +body th { + line-height: 1.2; +} + +ol { + line-height: 1.2; +} + +ul, body dir, body menu { + line-height: 1.2; +} + +html { + margin: 0; + padding: 0; +} + +body h1, body h2, body h3, body h4, body h5, body h6 { + margin-left: 0 +} + +body pre { + margin: 0.5em 10% 0.5em 1em; + line-height: 1.0; + color: navy; +} + +tt.literal, code.literal { + color: navy; +} + +.programlisting, .screen { + border: 1px solid silver; + background: #f4f4f4; + margin: 0.5em 10% 0.5em 0; + padding: 0.5em 1em; +} + +div.sidebar { + background: #ffffee; + margin: 1.0em 10% 0.5em 0; + padding: 0.5em 1em; + border: 1px solid silver; +} +div.sidebar * { padding: 0; } +div.sidebar div { margin: 0; } +div.sidebar p.title { + margin-top: 0.5em; + margin-bottom: 0.2em; +} + +div.bibliomixed { + margin: 0.5em 5% 0.5em 1em; +} + +div.glossary dt { + font-weight: bold; +} +div.glossary dd p { + margin-top: 0.2em; +} + +dl { + margin: .8em 0; + line-height: 1.2; +} + +dt { + margin-top: 0.5em; +} + +dt span.term { + font-style: normal; + color: navy; +} + +div.variablelist dd p { + margin-top: 0; +} + +div.itemizedlist li, div.orderedlist li { + margin-left: -0.8em; + margin-top: 0.5em; +} + +ul, ol { + list-style-position: outside; +} + +div.sidebar ul, div.sidebar ol { + margin-left: 2.8em; +} + +div.itemizedlist p.title, +div.orderedlist p.title, +div.variablelist p.title +{ + margin-bottom: -0.8em; +} + +div.revhistory table { + border-collapse: collapse; + border: none; +} +div.revhistory th { + border: none; + color: #527bbd; + font-family: Arial,Helvetica,sans-serif; +} +div.revhistory td { + border: 1px solid silver; +} + +/* Keep TOC and index lines close together. */ +div.toc dl, div.toc dt, +div.list-of-figures dl, div.list-of-figures dt, +div.list-of-tables dl, div.list-of-tables dt, +div.indexdiv dl, div.indexdiv dt +{ + line-height: normal; + margin-top: 0; + margin-bottom: 0; +} + +/* + Table styling does not work because of overriding attributes in + generated HTML. +*/ +div.table table, +div.informaltable table +{ + margin-left: 0; + margin-right: 5%; + margin-bottom: 0.8em; +} +div.informaltable table +{ + margin-top: 0.4em +} +div.table thead, +div.table tfoot, +div.table tbody, +div.informaltable thead, +div.informaltable tfoot, +div.informaltable tbody +{ + /* No effect in IE6. */ + border-top: 3px solid #527bbd; + border-bottom: 3px solid #527bbd; +} +div.table thead, div.table tfoot, +div.informaltable thead, div.informaltable tfoot +{ + font-weight: bold; +} + +div.mediaobject img { + margin-bottom: 0.8em; +} +div.figure p.title, +div.table p.title +{ + margin-top: 1em; + margin-bottom: 0.4em; +} + +div.calloutlist p +{ + margin-top: 0em; + margin-bottom: 0.4em; +} + +a img { + border-style: none; +} + +@media print { + div.navheader, div.navfooter { display: none; } +} + +span.aqua { color: aqua; } +span.black { color: black; } +span.blue { color: blue; } +span.fuchsia { color: fuchsia; } +span.gray { color: gray; } +span.green { color: green; } +span.lime { color: lime; } +span.maroon { color: maroon; } +span.navy { color: navy; } +span.olive { color: olive; } +span.purple { color: purple; } +span.red { color: red; } +span.silver { color: silver; } +span.teal { color: teal; } +span.white { color: white; } +span.yellow { color: yellow; } + +span.aqua-background { background: aqua; } +span.black-background { background: black; } +span.blue-background { background: blue; } +span.fuchsia-background { background: fuchsia; } +span.gray-background { background: gray; } +span.green-background { background: green; } +span.lime-background { background: lime; } +span.maroon-background { background: maroon; } +span.navy-background { background: navy; } +span.olive-background { background: olive; } +span.purple-background { background: purple; } +span.red-background { background: red; } +span.silver-background { background: silver; } +span.teal-background { background: teal; } +span.white-background { background: white; } +span.yellow-background { background: yellow; } + +span.big { font-size: 2em; } +span.small { font-size: 0.6em; } + +span.underline { text-decoration: underline; } +span.overline { text-decoration: overline; } +span.line-through { text-decoration: line-through; } diff --git a/source-builder/sb/asciidoc/stylesheets/pygments.css b/source-builder/sb/asciidoc/stylesheets/pygments.css new file mode 100644 index 0000000..2c5a906 --- /dev/null +++ b/source-builder/sb/asciidoc/stylesheets/pygments.css @@ -0,0 +1,62 @@ +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #408080; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .cm { color: #408080; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #BC7A00 } /* Comment.Preproc */ +.highlight .c1 { color: #408080; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #408080; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .gr { color: #FF0000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #00A000 } /* Generic.Inserted */ +.highlight .go { color: #808080 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0040D0 } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #7D9029 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #999999; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #D2413A; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #A0A000 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #BB6688 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ diff --git a/source-builder/sb/asciidoc/stylesheets/slidy.css b/source-builder/sb/asciidoc/stylesheets/slidy.css new file mode 100644 index 0000000..bbb790e --- /dev/null +++ b/source-builder/sb/asciidoc/stylesheets/slidy.css @@ -0,0 +1,445 @@ +/* slidy.css + + Copyright (c) 2005-2010 W3C (MIT, ERCIM, Keio), All Rights Reserved. + W3C liability, trademark, document use and software licensing + rules apply, see: + + http://www.w3.org/Consortium/Legal/copyright-documents + http://www.w3.org/Consortium/Legal/copyright-software +*/ + +/* + SJR: 2010-09-29: Modified for AsciiDoc slidy backend. + Mostly just commented out stuff that is handled by AsciiDoc's CSS files. +*/ + +body +{ + margin: 0 0 0 0; + padding: 0 0 0 0; + width: 100%; + height: 100%; + color: black; + background-color: white; +/* + font-family: "Gill Sans MT", "Gill Sans", GillSans, sans-serif; +*/ + font-size: 14pt; +} + +div.toolbar { + position: fixed; z-index: 200; + top: auto; bottom: 0; left: 0; right: 0; + height: 1.2em; text-align: right; + padding-left: 1em; + padding-right: 1em; + font-size: 60%; + color: red; + background-color: rgb(240,240,240); + border-top: solid 1px rgb(180,180,180); +} + +div.toolbar span.copyright { + color: black; + margin-left: 0.5em; +} + +div.initial_prompt { + position: absolute; + z-index: 1000; + bottom: 1.2em; + width: 90%; + background-color: rgb(200,200,200); + opacity: 0.35; + background-color: rgb(200,200,200, 0.35); + cursor: pointer; +} + +div.initial_prompt p.help { + text-align: center; +} + +div.initial_prompt p.close { + text-align: right; + font-style: italic; +} + +div.slidy_toc { + position: absolute; + z-index: 300; + width: 60%; + max-width: 30em; + height: 30em; + overflow: auto; + top: auto; + right: auto; + left: 4em; + bottom: 4em; + padding: 1em; + background: rgb(240,240,240); + border-style: solid; + border-width: 2px; + font-size: 60%; +} + +div.slidy_toc .toc_heading { + text-align: center; + width: 100%; + margin: 0; + margin-bottom: 1em; + border-bottom-style: solid; + border-bottom-color: rgb(180,180,180); + border-bottom-width: 1px; +} + +div.slide { + z-index: 20; + margin: 0 0 0 0; + padding-top: 0; + padding-bottom: 0; + padding-left: 20px; + padding-right: 20px; + border-width: 0; + clear: both; + top: 0; + bottom: 0; + left: 0; + right: 0; + line-height: 120%; + background-color: transparent; +} + +div.background { + display: none; +} + +div.handout { + margin-left: 20px; + margin-right: 20px; +} + +div.slide.titlepage { + text-align: center; +} + +div.slide.titlepage.h1 { + padding-top: 10%; +} + +div.slide h1 { + padding-left: 0; + padding-right: 20pt; + padding-top: 4pt; + padding-bottom: 4pt; + margin-top: 0; + margin-left: 0; + margin-right: 60pt; + margin-bottom: 0.5em; + display: block; + font-size: 160%; + line-height: 1.2em; + background: transparent; +} + +div.toc { + position: absolute; + top: auto; + bottom: 4em; + left: 4em; + right: auto; + width: 60%; + max-width: 30em; + height: 30em; + border: solid thin black; + padding: 1em; + background: rgb(240,240,240); + color: black; + z-index: 300; + overflow: auto; + display: block; + visibility: visible; +} + +div.toc-heading { + width: 100%; + border-bottom: solid 1px rgb(180,180,180); + margin-bottom: 1em; + text-align: center; +} + +/* +pre { + font-size: 80%; + font-weight: bold; + line-height: 120%; + padding-top: 0.2em; + padding-bottom: 0.2em; + padding-left: 1em; + padding-right: 1em; + border-style: solid; + border-left-width: 1em; + border-top-width: thin; + border-right-width: thin; + border-bottom-width: thin; + border-color: #95ABD0; + color: #00428C; + background-color: #E4E5E7; +} +*/ + +/* +li pre { margin-left: 0; } + +blockquote { font-style: italic } + +img { background-color: transparent } + +p.copyright { font-size: smaller } +*/ + +.center { text-align: center } +.footnote { font-size: smaller; margin-left: 2em; } + +/* +a img { border-width: 0; border-style: none } +*/ + +a:visited { color: navy } +a:link { color: navy } +a:hover { color: red; text-decoration: underline } +a:active { color: red; text-decoration: underline } + +a {text-decoration: none} +.navbar a:link {color: white} +.navbar a:visited {color: yellow} +.navbar a:active {color: red} +.navbar a:hover {color: red} + +/* +ul { list-style-type: square; } +ul ul { list-style-type: disc; } +ul ul ul { list-style-type: circle; } +ul ul ul ul { list-style-type: disc; } +li { margin-left: 0.5em; margin-top: 0.5em; } +li li { font-size: 85%; font-style: italic } +li li li { font-size: 85%; font-style: normal } +*/ + +div dt +{ + margin-left: 0; + margin-top: 1em; + margin-bottom: 0.5em; + font-weight: bold; +} +div dd +{ + margin-left: 2em; + margin-bottom: 0.5em; +} + + +/* +p,pre,ul,ol,blockquote,h2,h3,h4,h5,h6,dl,table { + margin-left: 1em; + margin-right: 1em; +} +*/ + +p.subhead { font-weight: bold; margin-top: 2em; } + +.smaller { font-size: smaller } +.bigger { font-size: 130% } + +/* +td,th { padding: 0.2em } +*/ + +ul { + margin: 0.5em 1.5em 0.5em 1.5em; + padding: 0; +} + +ol { + margin: 0.5em 1.5em 0.5em 1.5em; + padding: 0; +} + +ul { list-style-type: square; } +ul ul { list-style-type: disc; } +ul ul ul { list-style-type: circle; } +ul ul ul ul { list-style-type: disc; } + +/* +ul li { + list-style: square; + margin: 0.1em 0em 0.6em 0; + padding: 0 0 0 0; + line-height: 140%; +} + +ol li { + margin: 0.1em 0em 0.6em 1.5em; + padding: 0 0 0 0px; + line-height: 140%; + list-style-type: decimal; +} + +li ul li { + font-size: 85%; + font-style: italic; + list-style-type: disc; + background: transparent; + padding: 0 0 0 0; +} +li li ul li { + font-size: 85%; + font-style: normal; + list-style-type: circle; + background: transparent; + padding: 0 0 0 0; +} +li li li ul li { + list-style-type: disc; + background: transparent; + padding: 0 0 0 0; +} + +li ol li { + list-style-type: decimal; +} + + +li li ol li { + list-style-type: decimal; +} +*/ + +/* + setting class="outline" on ol or ul makes it behave as an + ouline list where blocklevel content in li elements is + hidden by default and can be expanded or collapsed with + mouse click. Set class="expand" on li to override default +*/ + +ol.outline li:hover { cursor: pointer } +ol.outline li.nofold:hover { cursor: default } + +ul.outline li:hover { cursor: pointer } +ul.outline li.nofold:hover { cursor: default } + +ol.outline { list-style:decimal; } +ol.outline ol { list-style-type:lower-alpha } + +ol.outline li.nofold { + padding: 0 0 0 20px; + background: transparent url(../graphics/nofold-dim.gif) no-repeat 0px 0.5em; +} +ol.outline li.unfolded { + padding: 0 0 0 20px; + background: transparent url(../graphics/fold-dim.gif) no-repeat 0px 0.5em; +} +ol.outline li.folded { + padding: 0 0 0 20px; + background: transparent url(../graphics/unfold-dim.gif) no-repeat 0px 0.5em; +} +ol.outline li.unfolded:hover { + padding: 0 0 0 20px; + background: transparent url(../graphics/fold.gif) no-repeat 0px 0.5em; +} +ol.outline li.folded:hover { + padding: 0 0 0 20px; + background: transparent url(../graphics/unfold.gif) no-repeat 0px 0.5em; +} + +ul.outline li.nofold { + padding: 0 0 0 20px; + background: transparent url(../graphics/nofold-dim.gif) no-repeat 0px 0.5em; +} +ul.outline li.unfolded { + padding: 0 0 0 20px; + background: transparent url(../graphics/fold-dim.gif) no-repeat 0px 0.5em; +} +ul.outline li.folded { + padding: 0 0 0 20px; + background: transparent url(../graphics/unfold-dim.gif) no-repeat 0px 0.5em; +} +ul.outline li.unfolded:hover { + padding: 0 0 0 20px; + background: transparent url(../graphics/fold.gif) no-repeat 0px 0.5em; +} +ul.outline li.folded:hover { + padding: 0 0 0 20px; + background: transparent url(../graphics/unfold.gif) no-repeat 0px 0.5em; +} + +/* for slides with class "title" in table of contents */ +a.titleslide { font-weight: bold; font-style: italic } + +/* + hide images for work around for save as bug + where browsers fail to save images used by CSS +*/ +img.hidden { display: none; visibility: hidden } +div.initial_prompt { display: none; visibility: hidden } + + div.slide { + visibility: visible; + position: inherit; + } + div.handout { + border-top-style: solid; + border-top-width: thin; + border-top-color: black; + } + +@media screen { + .hidden { display: none; visibility: visible } + + div.slide.hidden { display: block; visibility: visible } + div.handout.hidden { display: block; visibility: visible } + div.background { display: none; visibility: hidden } + body.single_slide div.initial_prompt { display: block; visibility: visible } + body.single_slide div.background { display: block; visibility: visible } + body.single_slide div.background.hidden { display: none; visibility: hidden } + body.single_slide .invisible { visibility: hidden } + body.single_slide .hidden { display: none; visibility: hidden } + body.single_slide div.slide { position: absolute } + body.single_slide div.handout { display: none; visibility: hidden } +} + +@media print { + .hidden { display: block; visibility: visible } + +/* + div.slide pre { font-size: 60%; padding-left: 0.5em; } +*/ + div.toolbar { display: none; visibility: hidden; } + div.slidy_toc { display: none; visibility: hidden; } + div.background { display: none; visibility: hidden; } + div.slide { page-break-before: always } + /* :first-child isn't reliable for print media */ + div.slide.first-slide { page-break-before: avoid } +} + + +/* SJR: AsciiDoc slidy backend tweaks */ + +ol, ul { + margin: 0.8em 1.5em 0.8em 1.8em; +} +li > ul, li > ol { + margin-top: 0.5em; +} + +.outline > li.folded, +.outline > li.unfolded { + color: #527bbd; +} +ul > li{ color: #aaa; } +ul > li > *, ol > li > * { color: black; } + +li { + margin-top: 0.5em; + margin-bottom: 0.5em; +} diff --git a/source-builder/sb/asciidoc/stylesheets/toc2.css b/source-builder/sb/asciidoc/stylesheets/toc2.css new file mode 100644 index 0000000..c6e63f5 --- /dev/null +++ b/source-builder/sb/asciidoc/stylesheets/toc2.css @@ -0,0 +1,34 @@ +@media screen { + body { + max-width: 50em; /* approximately 80 characters wide */ + margin-left: 16em; + } + + #toc { + position: fixed; + top: 0; + left: 0; + bottom: 0; + width: 13em; + padding: 0.5em; + padding-bottom: 1.5em; + margin: 0; + overflow: auto; + border-right: 3px solid #f8f8f8; + background-color: white; + } + + #toc .toclevel1 { + margin-top: 0.5em; + } + + #toc .toclevel2 { + margin-top: 0.25em; + display: list-item; + color: #aaaaaa; + } + + #toctitle { + margin-top: 0.5em; + } +} diff --git a/source-builder/sb/asciidoc/stylesheets/xhtml11-quirks.css b/source-builder/sb/asciidoc/stylesheets/xhtml11-quirks.css new file mode 100644 index 0000000..b793527 --- /dev/null +++ b/source-builder/sb/asciidoc/stylesheets/xhtml11-quirks.css @@ -0,0 +1,43 @@ +/* Workarounds for IE6's broken and incomplete CSS2. */ + +div.sidebar-content { + background: #ffffee; + border: 1px solid silver; + padding: 0.5em; +} +div.sidebar-title, div.image-title { + color: #527bbd; + font-family: Arial,Helvetica,sans-serif; + font-weight: bold; + margin-top: 0.0em; + margin-bottom: 0.5em; +} + +div.listingblock div.content { + border: 1px solid silver; + background: #f4f4f4; + padding: 0.5em; +} + +div.quoteblock-attribution { + padding-top: 0.5em; + text-align: right; +} + +pre.verseblock-content { + font-family: inherit; +} +div.verseblock-attribution { + padding-top: 0.75em; + text-align: left; +} + +div.exampleblock-content { + border-left: 3px solid #dddddd; + padding-left: 0.5em; +} + +div.imageblock.latex div.image-title { margin-top: 0.5em; } + +/* IE6 sets dynamically generated links as visited. */ +div#toc a:visited { color: blue; } diff --git a/source-builder/sb/asciidoc/xhtml11-quirks.conf b/source-builder/sb/asciidoc/xhtml11-quirks.conf new file mode 100644 index 0000000..7c13366 --- /dev/null +++ b/source-builder/sb/asciidoc/xhtml11-quirks.conf @@ -0,0 +1,61 @@ +# +# xhtml11-quirks.conf +# +# Workarounds for IE6's broken # and incomplete CSS2. +# + +[image-blockmacro] +<div class="imageblock{style? {style}}{role? {role}}"{id? id="{id}"}{align? style="text-align:{align};"}{float? style="float:{float};"}> +<div class="content"> +<a class="image" href="{link}"> +{data-uri%}<img src="{imagesdir=}{imagesdir?/}{target}" alt="{alt={target}}"{width? width="{width}"}{height? height="{height}"} /> +{data-uri#}<img alt="{alt={target}}"{width? width="{width}"}{height? height="{height}"} src="data:image/{eval:os.path.splitext(r'{target}')[1][1:]};base64, +{data-uri#}{sys:"{python}" -u -c "import base64,sys; base64.encode(sys.stdin,sys.stdout)" < "{eval:os.path.join(r"{indir={outdir}}",r"{imagesdir=}",r"{target}")}"}" /> +{link#}</a> +</div> +<div class="image-title">{caption={figure-caption} {counter:figure-number}: }{title}</div> +</div> + +[sidebarblock] +<div class="sidebarblock{role? {role}}"{id? id="{id}"}> +<div class="sidebar-content"> +<div class="sidebar-title">{title}</div> +| +</div></div> + +[quoteblock] +<div class="quoteblock{role? {role}}"{id? id="{id}"}> +<div class="title">{title}</div> +<div class="quoteblock-content"> +| +</div> +<div class="quoteblock-attribution"> +<em>{citetitle}</em><br /> +— {attribution} +</div></div> + +[verseblock] +<div class="verseblock{role? {role}}"{id? id="{id}"}> +<div class="title">{title}</div> +<pre class="verseblock-content"> +| +</pre> +<div class="verseblock-attribution"> +<em>{citetitle}</em><br /> +— {attribution} +</div></div> + +[exampleblock] +<div class="exampleblock{role? {role}}"{id? id="{id}"}> +<div class="title">{caption={example-caption} {counter:example-number}: }{title}</div> +<div class="exampleblock-content"> +| +</div></div> + +[sect2] +<div class="sect2{style? {style}}{role? {role}}"> +# The <div> is because the IE6 adjacent-sibling CSS selector is broken. +<h3{id? id="{id}"}>{numbered?{sectnum} }{title}</h3><div style="clear:left"></div> +| +</div> + |