asciidoc-8.2.7/a2x0000755000175100017510000004201011032553012014061 0ustar srackhamsrackham#!/usr/bin/env bash # # a2x - convert Asciidoc text file to PDF, XHTML, HTML Help, manpage # or plain text # # Copyright (C) 2007 Stuart Rackham. Free use of this software is granted # under the terms of the GNU General Public License (GPL). # VERSION=1.0.0 BASENAME=$(basename "$0") REALNAME="$0" if [ ! -e "$REALNAME" ]; then REALNAME=$(which "$REALNAME") fi REALNAME="$(readlink -f "$REALNAME")" CONF_DIR=/etc/asciidoc FOP_COMMAND="fop.sh" # FOP executable. #-------------------------------------------------------------------- # Constants. #-------------------------------------------------------------------- # These are mostly related to command options and are set by parse_options(). ASCIIDOC_OPTS= COPY=no DESTINATION_DIR= DOCTYPE= DRY_RUN=no FORMAT=xhtml ICONS=no ICONS_DIR=./images/icons SKIP_ASCIIDOC=no SRC_DIR= SRC_FILE= SRC_NAME= # Source file name sans path and file name extension. STYLESHEET=./docbook-xsl.css VERBOSE_2=no VERBOSE=no XSLTPROC_OPTS= DBLATEX_OPTS= FOP_OPTS= FOP=no #-------------------------------------------------------------------- # General purpose functions #-------------------------------------------------------------------- # Write $1 to stderr with backslash-escaped characters and no trailing newline. function write_console() { echo -ne "$1" >&2 } # Write newline to stderr. function newline() { echo >&2 } # Write $1 message to stderr. function console_msg() { echo "$BASENAME: $1" >&2 } # Write $1 to stderr if verbose or dry-run options set. function verbose_msg() { if isyes "$VERBOSE" || isyes "$DRY_RUN"; then console_msg "$1" fi } # Return 0 if $1 is interpreted as an affirmative string. function isyes() { case "$1" in y|Y|yes|YES|Yes|true|TRUE|True) return 0;; esac return 1 } # Log message $1 and exit with status $2 (default 1). function quit() { local err tmp err=${2:-1} if [ $err -ne 0 ]; then tmp="$VERBOSE" VERBOSE=yes # Force console error exit message. console_msg "failed: $1" VERBOSE="$tmp" else console_msg "$1" fi cleanup exit $err } # Execute the $1 command in the current shell subject to VERBOSE, DRY_RUN shell # variables. function execute_command() { if isyes "$VERBOSE" || isyes "$DRY_RUN"; then console_msg "eval: $1" fi if isyes "$DRY_RUN"; then return 0 else eval $1 return $? fi } # Same as execute_command() but if error occurs prints optional $2 message and # exits program. function execute_command_2() { local msg execute_command "$1" if [ $? -ne 0 ]; then if [ -n "$2" ]; then msg="$2" else msg="$1" fi quit "$msg" fi } # Return 0 if $1 command can be executed. function is_executable() { if which "$1" >/dev/null 2>&1; then return 0 else return 1 fi } # Return 127 if $1 is not in search path else return 0. function require() { if ! is_executable "$1"; then quit "cannot find required program: $1" 127 fi } # Join path $1 to path $2. function join() { if [ -n "$1" ]; then echo "$1/$2" else echo "$2" fi } # Echo the total size in bytes of file name arguments. function file_size() { echo $(du -cb "$@" | tail -1 | awk '{print $1}') } #-------------------------------------------------------------------- # Application specific functions #-------------------------------------------------------------------- # Trap interrupts. function set_trap() { # By convention exit code is 128 + signal number. trap "newline; quit 'exiting: SIGINT' 130" SIGINT trap "newline; quit 'exiting: SIGQUIT' 131" SIGQUIT trap "quit 'exiting: SIGHUP' 129" SIGHUP trap "quit 'exiting: SIGTERM' 143" SIGTERM } # Called at program exit. function cleanup() { if [ "$(pwd)" != "$PWD" ]; then execute_command "cd \"$PWD\"" fi } # Print help summary. function help() { cat </dev/null if [ $? -ne 4 ]; then quit "enhanced getopt(1) required" fi short_opts="a:d:D:f:hnsv" long_opts="attribute:,asciidoc-opts:,destination-dir:,doctype:,help,icons-dir:,dry-run,format:,copy,icons,skip-asciidoc,stylesheet:,version,verbose,xsltproc-opts:,dblatex-opts:,fop-opts:" args=$(getopt -o $short_opts -l $long_opts -n $BASENAME -- "$@" 2>/dev/null) if [ $? -ne 0 ]; then quit "invalid command options, run: a2x --help" fi eval set -- "$args" # Set positional variables. while true ; do case "$1" in -a|--attribute) ASCIIDOC_OPTS="$ASCIIDOC_OPTS -a \"$2\"" shift 2 ;; --asciidoc-opts) ASCIIDOC_OPTS="$ASCIIDOC_OPTS $2" shift 2 ;; --copy) COPY=yes; shift ;; -d|--doctype) DOCTYPE=$2 shift 2 ;; -D|--destination-dir) DESTINATION_DIR=$2 shift 2 ;; -f|--format) FORMAT=$2 shift 2 ;; -h|--help) help; exit 0 ;; --icons) ICONS=yes shift ;; --icons-dir) ICONS_DIR=$2 shift 2 ;; -n|--dry-run) DRY_RUN=yes; shift ;; -s|--skip-asciidoc) SKIP_ASCIIDOC=yes; shift ;; --stylesheet) STYLESHEET=$2 shift 2 ;; --version) echo "$BASENAME $VERSION" ; exit 0 ;; -v|--verbose) if isyes "$VERBOSE"; then VERBOSE_2=yes else VERBOSE=yes fi shift ;; --xsltproc-opts) XSLTPROC_OPTS="$XSLTPROC_OPTS $2" shift 2 ;; --fop-opts) FOP_OPTS="$FOP_OPTS $2" FOP=yes shift 2 ;; --dblatex-opts) DBLATEX_OPTS="$DBLATEX_OPTS $2" shift 2 ;; --) shift; break ;; *) quit "unrecognized option: $1" ;; esac done if isyes "$DRY_RUN"; then VERBOSE=yes fi if [ $# -eq 0 ]; then quit "source file not specified" fi if [ $# -ne 1 ]; then quit "only one source file allowed" fi if [ ! -r "$1" ]; then quit "source file not found: $1" fi SRC_FILE=$1 SRC_DIR=$(dirname "$1") SRC_NAME=$1 SRC_NAME=${SRC_NAME##*/} # Strip path. SRC_NAME=${SRC_NAME%.*} # Strip extension. # Use FOP if there is no dblatex. if ! is_executable dblatex && is_executable "$FOP_COMMAND"; then FOP=yes fi } #-------------------------------------------------------------------- # Validate program options. #-------------------------------------------------------------------- function validate_options() { case "$FORMAT" in chunked|dvi|htmlhelp|manpage|odt|pdf|ps|tex|text|xhtml) ;; *) quit "illegal format: $FORMAT" ;; esac if [ -z "$DOCTYPE" ]; then if [ "$FORMAT" = "manpage" ]; then DOCTYPE=manpage else DOCTYPE=article fi fi case "$DOCTYPE" in article|book|manpage) ;; *) quit "illegal doctype: $DOCTYPE" ;; esac if [ -z "$ICONS_DIR" ]; then quit "icons directory not specified" fi if [[ "$ICONS_DIR" == /* ]]; then quit "icons directory must be relative: $ICONS_DIR" fi ICONS_DIR=${ICONS_DIR%*/} # Strip trailing backslash. if [ ! -z "$DESTINATION_DIR" ]; then if [ ! -d "$DESTINATION_DIR" ]; then quit "destination directory not found: $DESTINATION_DIR" fi else DESTINATION_DIR="$SRC_DIR" fi if [ -z "$STYLESHEET" ]; then quit "stylesheet cannot be blank" fi if [[ "$STYLESHEET" == /* ]]; then quit "stylesheet path must be relative: $STYLESHEET" fi } # Conditionally copy distribution stylesheet and admonition and navigation # icons to destination directory $1. function copy_stylesheet_and_icons() { if isyes $COPY; then copy_stylesheet "$1" if isyes $ICONS; then copy_icons "$1/$ICONS_DIR" fi fi } # Copy distribution stylesheet to destination directory $1. function copy_stylesheet() { local src dst src=$(conf_file stylesheets/docbook-xsl.css) if [ ! -r "$src" ]; then quit "file not found: $src" fi dst="$1/$STYLESHEET" # Check we're not trying to copy the file onto itself. if [[ "$src" -ef "$dst" ]]; then return fi execute_command_2 "cp -u \"$src\" \"$dst\"" } # Copy distribution admonition and navigation icons to destination directory # $1. function copy_icons() { local src dst dst="$1" # Set source icons directory. src=$(conf_file images/icons/home.png) if [ ! -r "$src" ]; then quit "file not found: $src" fi src=$(dirname "$src") # Check we're not trying to copy the file onto itself. if [[ "$src" -ef "$dst" ]]; then return fi if [ -e "$dst" ]; then if [ ! -d "$dst" ]; then quit "icon destination must be a directory: $dst" fi else execute_command_2 "mkdir -p \"$dst\"" fi execute_command_2 "cp -rfu \"$src/\"* \"$dst\"" } #-------------------------------------------------------------------- # Format conversion functions. #-------------------------------------------------------------------- # Convert AsciiDoc $SRC_FILE to DocBook XML if it is newer than the # XML output file. $1 has additional asciidoc(1) options. function to_docbook() { local xml xml="$SRC_DIR/$SRC_NAME.xml" if isyes $SKIP_ASCIIDOC; then if [ ! -r "$xml" ]; then quit "file not found: $xml" fi return fi require "asciidoc" execute_command_2 "asciidoc $ASCIIDOC_OPTS $1 -b docbook \"$SRC_FILE\"" } function to_xhtml() { require "xsltproc" local xsl xml html xsl=$(conf_file docbook-xsl/xhtml.xsl) if [ ! -r "$xsl" ]; then quit "file not found: $xsl" fi to_docbook xml=$(readlink -f "$SRC_DIR/$SRC_NAME.xml") html="$SRC_NAME.html" copy_stylesheet_and_icons "$DESTINATION_DIR" execute_command_2 "cd \"$DESTINATION_DIR\"" execute_command_2 "xsltproc $XSLTPROC_OPTS --nonet \ \"$xsl\" \"$xml\" >\"$html\"" execute_command_2 "cd - >/dev/null" } function to_chunked() { require "xsltproc" local chunkdir xsl xml hhp chm case "$FORMAT" in chunked) chunkdir="$DESTINATION_DIR/$SRC_NAME.chunked" xsl=chunked.xsl ;; htmlhelp) chunkdir="$DESTINATION_DIR/$SRC_NAME.htmlhelp" hhp="$SRC_NAME.hhp" chm="$SRC_NAME.chm" XSLTPROC_OPTS="$XSLTPROC_OPTS \ --stringparam htmlhelp.hhp \"$hhp\" --stringparam htmlhelp.chm \"$chm\"" xsl=htmlhelp.xsl ;; esac xsl=$(conf_file docbook-xsl/$xsl) if [ ! -r "$xsl" ]; then quit "file not found: $xsl" fi to_docbook xml=$(readlink -f "$SRC_DIR/$SRC_NAME.xml") if [ ! -d "$chunkdir" ]; then execute_command_2 "mkdir \"$chunkdir\"" fi execute_command_2 "rm -f \"$chunkdir/*.html\"" copy_stylesheet_and_icons "$chunkdir" execute_command_2 "cd \"$DESTINATION_DIR\"" execute_command_2 "xsltproc $XSLTPROC_OPTS --nonet \ --stringparam base.dir \"$(basename "$chunkdir")/\" \ \"$xsl\" \"$xml\"" execute_command_2 "cd - >/dev/null" } function to_manpage() { require "xsltproc" local xsl xml xsl=$(conf_file docbook-xsl/manpage.xsl) if [ ! -r "$xsl" ]; then quit "file not found: $xsl" fi to_docbook "-d manpage" xml=$(readlink -f "$SRC_DIR/$SRC_NAME.xml") execute_command_2 "cd \"$DESTINATION_DIR\"" execute_command_2 "xsltproc $XSLTPROC_OPTS --nonet \ \"$xsl\" \"$xml\"" execute_command_2 "cd - >/dev/null" } function run_dblatex() { require "dblatex" local xsl xml sty to_docbook xml="$SRC_DIR/$SRC_NAME.xml" xsl=$(conf_file dblatex/asciidoc-dblatex.xsl) sty=$(conf_file dblatex/asciidoc-dblatex.sty) execute_command_2 "dblatex $DBLATEX_OPTS -t $FORMAT -p \"$xsl\" -s \"$sty\" \"$xml\"" } function run_fop() { local xsl xml fo pdf xml="$SRC_DIR/$SRC_NAME.xml" pdf="$DESTINATION_DIR/$SRC_NAME.pdf" require "xsltproc" require "$FOP_COMMAND" xsl=$(conf_file docbook-xsl/fo.xsl) if [ ! -r "$xsl" ]; then quit "file not found: $xsl" fi fo="$SRC_DIR/$SRC_NAME.fo" to_docbook execute_command_2 "xsltproc $XSLTPROC_OPTS --nonet \ \"$xsl\" \"$xml\" >\"$fo\"" execute_command_2 "\"$FOP_COMMAND\" $FOP_OPTS -fo \"$fo\" -pdf \"$pdf\"" } function to_pdf() { if isyes $FOP; then run_fop else run_dblatex fi } function to_odt() { require "docbook2odf" local xml odt opts xml="$SRC_DIR/$SRC_NAME.xml" odt="$DESTINATION_DIR/$SRC_NAME.odt" opts="--force" if ! isyes $VERBOSE; then opts="$opts --quiet" fi to_docbook execute_command_2 "docbook2odf $opts \"$xml\" --output-file \"$odt\"" } function to_text() { require "asciidoc" require "lynx" local html text conf html="$SRC_DIR/$SRC_NAME.html" text="$DESTINATION_DIR/$SRC_NAME.text" conf=$(conf_file text.conf) execute_command_2 "asciidoc $ASCIIDOC_OPTS -f "$conf" -b html4 \ -o - \"$SRC_FILE\" | lynx -dump -stdin >\"$text\"" } #-------------------------------------------------------------------- # Main #-------------------------------------------------------------------- PWD=`pwd` set_trap parse_options "$@" validate_options ASCIIDOC_OPTS="--doctype=$DOCTYPE $ASCIIDOC_OPTS" if isyes $VERBOSE_2; then ASCIIDOC_OPTS="$ASCIIDOC_OPTS --verbose" XSLTPROC_OPTS="$XSLTPROC_OPTS --verbose" fi case "$FORMAT" in xhtml|chunked|htmlhelp) XSLTPROC_OPTS="$XSLTPROC_OPTS \ --stringparam html.stylesheet \"$STYLESHEET\"" ;; esac if isyes $ICONS; then XSLTPROC_OPTS="$XSLTPROC_OPTS --stringparam callout.graphics 1 \ --stringparam navig.graphics 0 \ --stringparam admon.textlabel 0 \ --stringparam admon.graphics 1 \ --stringparam admon.graphics.path \"$ICONS_DIR/\" \ --stringparam callout.graphics.path \"$ICONS_DIR/callouts/\" \ --stringparam navig.graphics.path \"$ICONS_DIR/\"" else XSLTPROC_OPTS="$XSLTPROC_OPTS --stringparam callout.graphics 0 \ --stringparam navig.graphics 0 \ --stringparam admon.textlabel 1 \ --stringparam admon.graphics 0" fi case "$FORMAT" in chunked|htmlhelp) to_chunked;; manpage) to_manpage;; odt) to_odt;; pdf) to_pdf;; text) to_text;; xhtml) to_xhtml;; dvi) run_dblatex;; ps) run_dblatex;; tex) run_dblatex;; esac cleanup #-------------------------------------------------------------------- # vim: set et ts=4 sw=4 sts=4: #-------------------------------------------------------------------- asciidoc-8.2.7/asciidoc.py0000755000175100017510000051732611033005777015630 0ustar srackhamsrackham#!/usr/bin/env python """ asciidoc - converts an AsciiDoc text file to DocBook, HTML or LinuxDoc Copyright (C) 2002-2008 Stuart Rackham. Free use of this software is granted under the terms of the GNU General Public License (GPL). """ import sys, os, re, time, traceback, tempfile, popen2, codecs, locale from types import * VERSION = '8.2.7' # See CHANGLOG file for version history. #--------------------------------------------------------------------------- # Program onstants. #--------------------------------------------------------------------------- DEFAULT_BACKEND = 'xhtml11' DEFAULT_DOCTYPE = 'article' # Allowed substitution options for List, Paragraph and DelimitedBlock # definition subs entry. SUBS_OPTIONS = ('specialcharacters','quotes','specialwords', 'replacements', 'attributes','macros','callouts','normal','verbatim', 'none','passthroughs','replacements2') # Default value for unspecified subs and presubs configuration file entries. SUBS_NORMAL = ('specialcharacters','quotes','attributes', 'specialwords','replacements','macros','passthroughs') SUBS_VERBATIM = ('specialcharacters','callouts') NAME_RE = r'(?u)[^\W\d][-\w]*' # Valid section or attrbibute name. #--------------------------------------------------------------------------- # Utility functions and classes. #--------------------------------------------------------------------------- class EAsciiDoc(Exception): pass from UserDict import UserDict class OrderedDict(UserDict): """ Dictionary ordered by insertion order. Python Cookbook: Ordered Dictionary, Submitter: David Benjamin. http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/107747 """ def __init__(self, d=None): self._keys = [] UserDict.__init__(self, d) def __delitem__(self, key): UserDict.__delitem__(self, key) self._keys.remove(key) def __setitem__(self, key, item): UserDict.__setitem__(self, key, item) if key not in self._keys: self._keys.append(key) def clear(self): UserDict.clear(self) self._keys = [] def copy(self): d = UserDict.copy(self) d._keys = self._keys[:] return d def items(self): return zip(self._keys, self.values()) def keys(self): return self._keys def popitem(self): try: key = self._keys[-1] except IndexError: raise KeyError('dictionary is empty') val = self[key] del self[key] return (key, val) def setdefault(self, key, failobj = None): UserDict.setdefault(self, key, failobj) if key not in self._keys: self._keys.append(key) def update(self, d=None, **kwargs): if d is None: d = kwargs UserDict.update(self, d) for key in d.keys(): if key not in self._keys: self._keys.append(key) def values(self): return map(self.get, self._keys) def print_stderr(line): sys.stderr.write(line+os.linesep) def verbose(msg,linenos=True): if config.verbose: console(msg,linenos=linenos) def warning(msg,linenos=True): console(msg,'WARNING: ',linenos) document.has_warnings = True def deprecated(old, new, linenos=True): console('%s: %s' % (old,new), 'DEPRECATED: ', linenos) def error(msg, cursor=None): """Report fatal error but don't exit application, continue in the hope of reporting all fatal errors finishing with a non-zero exit code.""" console(msg,'ERROR: ', cursor=cursor) document.has_errors = True def console(msg, prefix='', linenos=True, cursor=None): """Print message to stderr. 'offset' is added to reported line number for warnings emitted when reading ahead.""" s = prefix if linenos and reader.cursor: if not cursor: cursor = reader.cursor s = s + '%s: line %d: ' % (os.path.basename(cursor[0]),cursor[1]) s = s + msg print_stderr(s) def file_in(fname, directory): """Return True if file fname resides inside directory.""" assert os.path.isfile(fname) # Empty directory (not to be confused with None) is the current directory. if directory == '': directory = os.getcwd() else: assert os.path.isdir(directory) directory = os.path.abspath(directory) fname = os.path.realpath(fname) return os.path.commonprefix((directory, fname)) == directory def safe(): return document.safe def is_safe_file(fname, directory=None): # A safe file must reside in directory directory (defaults to the source # file directory). if directory is None: if document.infile == '': return not safe() directory = os.path.dirname(document.infile) elif directory == '': directory = '.' return not safe() or file_in(fname, directory) # Return file name which must reside in the parent file directory. # Return None if file is not found or not safe. def safe_filename(fname, parentdir): if not os.path.isabs(fname): # Include files are relative to parent document # directory. fname = os.path.join(parentdir,fname) if not os.path.isfile(fname): warning('include file not found: %s' % fname) return None if not is_safe_file(fname, parentdir): unsafe_error('include file: %s' % fname) return None return fname def unsafe_error(msg): error('unsafe: '+msg) def syseval(cmd): # Run shell command and return stdout. child = os.popen(cmd) data = child.read() err = child.close() if not err: return data else: return '' def assign(dst,src): """Assign all attributes from 'src' object to 'dst' object.""" for a,v in src.__dict__.items(): setattr(dst,a,v) def strip_quotes(s): """Trim white space and, if necessary, quote characters from s.""" s = s.strip() # Strip quotation mark characters from quoted strings. if len(s) >= 3 and s[0] == '"' and s[-1] == '"': s = s[1:-1] return s def is_regexp(s): """Return True if s is a valid regular expression else return False.""" try: re.compile(s) except: return False else: return True def join_regexp(relist): """Join list of regular expressions re1,re2,... to single regular expression (re1)|(re2)|...""" if len(relist) == 0: return None result = [] # Delete named groups to avoid ambiguity. for s in relist: result.append(re.sub(r'\?P<\S+?>','',s)) result = ')|('.join(result) result = '('+result+')' return result def validate(value,rule,errmsg): """Validate value against rule expression. Throw EAsciiDoc exception with errmsg if validation fails.""" try: if not eval(rule.replace('$',str(value))): raise EAsciiDoc,errmsg except: raise EAsciiDoc,errmsg return value def join_lines(lines): """Return a list in which lines terminated with the backslash line continuation character are joined.""" result = [] s = '' continuation = False for line in lines: if line and line[-1] == '\\': s = s + line[:-1] continuation = True continue if continuation: result.append(s+line) s = '' continuation = False else: result.append(line) if continuation: result.append(s) return result def dovetail(lines1, lines2): """Append list or tuple of strings 'lines2' to list 'lines1'. Join the last string in 'lines1' with the first string in 'lines2' into a single string.""" assert isinstance(lines1,list) or isinstance(lines1,tuple) assert isinstance(lines2,list) or isinstance(lines2,tuple) if not lines1 or not lines2: return list(lines1) + list(lines2) result = list(lines1[:-1]) result.append(lines1[-1] + lines2[0]) result += list(lines2[1:]) return result def dovetail_tags(stag,content,etag): """Merge the end tag with the first content line and the last content line with the end tag. This ensures verbatim elements don't include extraneous opening and closing line breaks.""" return dovetail(dovetail(stag,content), etag) def parse_attributes(attrs,dict): """Update a dictionary with name/value attributes from the attrs string. The attrs string is a comma separated list of values and keyword name=value pairs. Values must preceed keywords and are named '1','2'... The entire attributes list is named '0'. If keywords are specified string values must be quoted. Examples: attrs: '' dict: {} attrs: 'hello,world' dict: {'2': 'world', '0': 'hello,world', '1': 'hello'} attrs: '"hello", planet="earth"' dict: {'planet': 'earth', '0': '"hello",planet="earth"', '1': 'hello'} """ def f(*args,**keywords): # Name and add aguments '1','2'... to keywords. for i in range(len(args)): if not keywords.has_key(str(i+1)): keywords[str(i+1)] = args[i] return keywords if not attrs: return dict['0'] = attrs # Replace line separators with spaces so line spanning works. s = re.sub(r'\s', ' ', attrs) try: d = eval('f('+s+')') # Attributes must evaluate to strings, numbers or None. for v in d.values(): if not (isinstance(v,str) or isinstance(v,int) or isinstance(v,float) or v is None): raise dict.update(d) except: # Try quoting the attrs. s = s.replace('"',r'\"') # Escape double-quotes. s = s.split(',') s = map(lambda x: '"' + x.strip() + '"', s) s = ','.join(s) try: d = eval('f('+s+')') except: return # If there's a syntax error leave with {0}=attrs. for k in d.keys(): # Drop any empty positional arguments. if d[k] == '': del d[k] dict.update(d) assert len(d) > 0 def parse_named_attributes(s,attrs): """Update a attrs dictionary with name="value" attributes from the s string. Returns False if invalid syntax. Example: attrs: 'star="sun",planet="earth"' dict: {'planet':'earth', 'star':'sun'} """ def f(**keywords): return keywords try: d = eval('f('+s+')') attrs.update(d) return True except: return False def parse_list(s): """Parse comma separated string of Python literals. Return a tuple of of parsed values.""" try: result = eval('tuple(['+s+'])') except: raise EAsciiDoc,'malformed list: '+s return result def parse_options(options,allowed,errmsg): """Parse comma separated string of unquoted option names and return as a tuple of valid options. 'allowed' is a list of allowed option values. If allowed=() then all legitimate names are allowed. 'errmsg' is an error message prefix if an illegal option error is thrown.""" result = [] if options: for s in re.split(r'\s*,\s*',options): if (allowed and s not in allowed) or (s == '' or not is_name(s)): raise EAsciiDoc,'%s: %s' % (errmsg,s) result.append(s) return tuple(result) def symbolize(s): """Drop non-symbol characters and convert to lowercase.""" return re.sub(r'(?u)[^\w\-_]', '', s).lower() def is_name(s): """Return True if s is valid attribute, macro or tag name (starts with alpha containing alphanumeric and dashes only).""" return re.match(NAME_RE,s) is not None def subs_quotes(text): """Quoted text is marked up and the resulting text is returned.""" # The quote patterns are iterated in reverse sort order to avoid ambiguity. # So, for example, __ is processed before _. keys = config.quotes.keys() keys.sort() keys.reverse() for q in keys: i = q.find('|') if i != -1 and q != '|' and q != '||': lq = q[:i] # Left quote. rq = q[i+1:] # Right quote. else: lq = rq = q tag = config.quotes[q] # Unconstrained quotes prefix the tag name with a hash. if tag[0] == '#': tag = tag[1:] # Unconstrained quotes can appear anywhere. reo = re.compile(r'(?msu)(^|.)(\[(?P[^[]+?)\])?' \ + r'(?:' + re.escape(lq) + r')' \ + r'(?P.+?)(?:'+re.escape(rq)+r')') else: # The text within constrained quotes must be bounded by white space. # Non-word (\W) characters are allowed at boundaries to accomodate # enveloping quotes. reo = re.compile(r'(?msu)(^|\W)(\[(?P[^[]+?)\])?' \ + r'(?:' + re.escape(lq) + r')' \ + r'(?P.+?)(?:'+re.escape(rq)+r')(?=\W|$)') pos = 0 while True: mo = reo.search(text,pos) if not mo: break if text[mo.start()] == '\\': pos = mo.end() else: attrs = {} parse_attributes(mo.group('attrs'), attrs) stag,etag = config.tag(tag, attrs) s = mo.group(1) + stag + mo.group('content') + etag text = text[:mo.start()] + s + text[mo.end():] pos = mo.start() + len(s) # Unescape escaped quotes. text = text.replace('\\'+lq, lq) if lq != rq: text = text.replace('\\'+rq, rq) return text def subs_tag(tag,dict={}): """Perform attribute substitution and split tag string returning start, end tag tuple (c.f. Config.tag()).""" s = subs_attrs(tag,dict) if not s: warning('tag "%s" dropped: contains undefined attribute' % tag) return [None,None] result = s.split('|') if len(result) == 1: return result+[None] elif len(result) == 2: return result else: raise EAsciiDoc,'malformed tag: %s' % tag def parse_entry(entry, dict=None, unquote=False, unique_values=False, allow_name_only=False, escape_delimiter=True): """Parse name=value entry to dictionary 'dict'. Return tuple (name,value) or None if illegal entry. If name= then value is set to ''. If name and allow_name_only=True then value is set to ''. If name! and allow_name_only=True then value is set to None. Leading and trailing white space is striped from 'name' and 'value'. 'name' can contain any printable characters. If the '=' delimiter character is allowed in the 'name' then it must be escaped with a backslash and escape_delimiter must be True. If 'unquote' is True leading and trailing double-quotes are stripped from 'name' and 'value'. If unique_values' is True then dictionary entries with the same value are removed before the parsed entry is added.""" if escape_delimiter: mo = re.search(r'(?:[^\\](=))',entry) else: mo = re.search(r'(=)',entry) if mo: # name=value entry. if mo.group(1): name = entry[:mo.start(1)] if escape_delimiter: name = name.replace(r'\=','=') # Unescape \= in name. value = entry[mo.end(1):] elif allow_name_only and entry: # name or name! entry. name = entry if name[-1] == '!': name = name[:-1] value = None else: value = '' else: return None if unquote: name = strip_quotes(name) if value is not None: value = strip_quotes(value) else: name = name.strip() if value is not None: value = value.strip() if not name: return None if dict is not None: if unique_values: for k,v in dict.items(): if v == value: del dict[k] dict[name] = value return name,value def parse_entries(entries, dict, unquote=False, unique_values=False, allow_name_only=False,escape_delimiter=True): """Parse name=value entries from from lines of text in 'entries' into dictionary 'dict'. Blank lines are skipped.""" for entry in entries: if entry and not parse_entry(entry, dict, unquote, unique_values, allow_name_only, escape_delimiter): raise EAsciiDoc,'malformed section entry: %s' % entry def load_sections(sections, fname, dir=None, namepat=NAME_RE): """Loads sections dictionary with sections from file fname. Existing sections are overlaid. Silently skips missing configuration files.""" if dir: fname = os.path.join(dir, fname) # Sliently skip missing configuration file. if not os.path.isfile(fname): return reo = re.compile(r'^\[(?P
'+namepat+')\]\s*$') section,contents = '',[] for line in open(fname): if line and line[0] == '#': # Skip comment lines. continue line = line.rstrip() found = reo.findall(line) if found: if section: # Store previous section. sections[section] = contents section = found[0].lower() contents = [] else: contents.append(line) if section and contents: # Store last section. sections[section] = contents def dump_section(name,dict,f=sys.stdout): """Write parameters in 'dict' as in configuration file section format with section 'name'.""" f.write('[%s]%s' % (name,writer.newline)) for k,v in dict.items(): k = str(k) k = k.replace('=',r'\=') # Escape = in name. # Quote if necessary. if len(k) != len(k.strip()): k = '"'+k+'"' if v and len(v) != len(v.strip()): v = '"'+v+'"' if v is None: # Don't dump undefined attributes. continue else: s = k+'='+v if s[0] == '#': s = '\\' + s # Escape so not treated as comment lines. f.write('%s%s' % (s,writer.newline)) f.write(writer.newline) def update_attrs(attrs,dict): """Update 'attrs' dictionary with parsed attributes in dictionary 'dict'.""" for k,v in dict.items(): if not is_name(k): raise EAsciiDoc,'illegal attribute name: %s' % k attrs[k] = v def filter_lines(filter_cmd, lines, dict={}): """ Run 'lines' through the 'filter_cmd' shell command and return the result. The 'dict' dictionary contains additional filter attributes. """ # BUG: Has problems finding filters with spaces in command name. if not filter_cmd: return lines # Perform attributes substitution on the filter command. s = subs_attrs(filter_cmd, dict) if not s: raise EAsciiDoc,'missing filter attribute: %s' % filter_cmd filter_cmd = s # Search for the filter command in both user and application 'filters' # sub-directories. mo = re.match(r'^(?P\S+)(?P.*)$', filter_cmd) cmd = mo.group('cmd') found = False if not os.path.dirname(cmd): # Check in asciidoc user and application directories for unqualified # file name. if USER_DIR: cmd2 = os.path.join(USER_DIR,'filters',cmd) if os.path.isfile(cmd2): found = True if not found: cmd2 = os.path.join(CONF_DIR,'filters',cmd) if os.path.isfile(cmd2): found = True if not found: cmd2 = os.path.join(APP_DIR,'filters',cmd) if os.path.isfile(cmd2): found = True if found: cmd = cmd2 else: if os.__dict__.has_key('uname') and os.uname()[0][:6] == 'CYGWIN': # popen2() does not like non-drive letter path names under # Cygwin. s = syseval('cygpath -m ' + cmd).strip() if s: cmd = s if os.path.isfile(cmd): found = True else: warning('filter not found: %s' % cmd) if found: filter_cmd = '"' + cmd + '"' + mo.group('tail') verbose('filtering: ' + filter_cmd) if sys.platform == 'win32': # Paul Melis's patch for filters on Win32 # This workaround is necessary because Windows select() doesn't # work with regular files. fd,tmp = tempfile.mkstemp() os.close(fd) try: try: # Windows doesn't like running scripts directly so explicitly # specify interpreter. if found: if cmd[-3:] == '.py': filter_cmd = 'python ' + filter_cmd elif cmd[-3:] == '.rb': filter_cmd = 'ruby ' + filter_cmd w = os.popen(filter_cmd + ' > "%s"' % tmp, 'w') i = 0 while i < len(lines): line = lines[i] w.write(line + os.linesep) i = i + 1 w.close() result = [] for s in open(tmp, 'rt'): result.append(s.rstrip()) except: raise EAsciiDoc,'filter error: %s' % filter_cmd finally: os.unlink(tmp) else: try: import select result = [] r,w = popen2.popen2(filter_cmd) # Polled I/O loop to alleviate full buffer deadlocks. i = 0 while i < len(lines): line = lines[i] if select.select([],[w.fileno()],[],0)[1]: w.write(line+os.linesep) # Use platform line terminator. i = i+1 if select.select([r.fileno()],[],[],0)[0]: s = r.readline() if not s: break # Exit if filter output closes. result.append(s.rstrip()) w.close() for s in r: result.append(s.rstrip()) r.close() except: raise EAsciiDoc,'filter error: %s' % filter_cmd # There's no easy way to guage whether popen2() found and executed the # filter, so guess that if it produced no output there is probably a # problem. if lines and not result: warning('no output from filter: %s' % filter_cmd) return result def system(name, args, is_macro=False): """Evaluate a system attribute ({name:args}) or system block macro (name::[args]). If is_macro is True then we are processing a system block macro otherwise it's a system attribute. NOTE: The include1 attribute is used internally by the include1::[] macro and is not for public use.""" if is_macro: syntax = '%s::[%s]' separator = '\n' else: syntax = '{%s:%s}' separator = writer.newline if name not in ('eval','sys','sys2','include','include1'): msg = 'illegal '+syntax % (name,args) if is_macro: msg += ': macro name' else: msg += ': executable attribute name' warning(msg) return None if name != 'include1': verbose(('evaluating: '+syntax) % (name,args)) if safe() and name not in ('include','include1'): unsafe_error(syntax % (name,args)) return None result = None if name == 'eval': try: result = eval(args) if result is True: result = '' elif result is False: result = None elif result is not None: result = str(result) except: warning((syntax+': expression evaluation error') % (name,args)) elif name in ('sys','sys2'): result = '' fd,tmp = tempfile.mkstemp() os.close(fd) try: cmd = args cmd = cmd + (' > %s' % tmp) if name == 'sys2': cmd = cmd + ' 2>&1' if os.system(cmd): warning((syntax+': non-zero exit status') % (name,args)) try: if os.path.isfile(tmp): lines = [s.rstrip() for s in open(tmp)] else: lines = [] except: raise EAsciiDoc,(syntax+': temp file read error') % (name,args) result = separator.join(lines) finally: if os.path.isfile(tmp): os.remove(tmp) elif name == 'include': if not os.path.exists(args): warning((syntax+': file does not exist') % (name,args)) elif not is_safe_file(args): unsafe_error(syntax % (name,args)) else: result = [s.rstrip() for s in open(args)] if result: result = subs_attrs(result) result = separator.join(result) result = result.expandtabs(reader.tabsize) else: result = '' elif name == 'include1': result = separator.join(config.include1[args]) else: assert False return result def subs_attrs(lines, dictionary=None): """Substitute 'lines' of text with attributes from the global document.attributes dictionary and from t'dictionary' ('dictionary' entries take precedence). Return a tuple of the substituted lines. 'lines' containing undefined attributes are deleted. If 'lines' is a string then return a string. - Attribute references are substituted in the following order: simple, conditional, system. - Attribute references inside 'dictionary' entry values are substituted. """ def end_brace(text,start): """Return index following end brace that matches brace at start in text.""" assert text[start] == '{' n = 0 result = start for c in text[start:]: # Skip braces that are followed by a backslash. if result == len(text)-1 or text[result+1] != '\\': if c == '{': n = n + 1 elif c == '}': n = n - 1 result = result + 1 if n == 0: break return result if isinstance(lines,StringType): string_result = True lines = [lines] else: string_result = False lines = list(lines) if dictionary is None: attrs = document.attributes else: # Remove numbered document attributes so they don't clash with # attribute list positional attributes. attrs = {} for k,v in document.attributes.items(): if not re.match(r'^\d+$', k): attrs[k] = v # Substitute attribute references inside dictionary values. dictionary = dictionary.copy() for k,v in dictionary.items(): if v is None: del dictionary[k] else: v = subs_attrs(str(v)) if v is None: del dictionary[k] else: dictionary[k] = v attrs.update(dictionary) # Substitute all attributes in all lines. for i in range(len(lines)-1,-1,-1): # Reverse iterate lines. text = lines[i] # Make it easier for regular expressions. text = text.replace('\\{','{\\') text = text.replace('\\}','}\\') # Expand simple attributes ({name}). # Nested attributes not allowed. reo = re.compile(r'(?su)\{(?P[^\\\W][-\w]*?)\}(?!\\)') pos = 0 while True: mo = reo.search(text,pos) if not mo: break s = attrs.get(mo.group('name')) if s is None: pos = mo.end() else: s = str(s) text = text[:mo.start()] + s + text[mo.end():] pos = mo.start() + len(s) # Expand conditional attributes. reo = re.compile(r'(?su)\{(?P[^\\\W][-\w]*?)' \ r'(?P\=|\?|!|#|%|@|\$)' \ r'(?P.*?)\}(?!\\)') pos = 0 while True: mo = reo.search(text,pos) if not mo: break attr = mo.group() name = mo.group('name') lval = attrs.get(name) op = mo.group('op') # mo.end() is not good enough because '{x={y}}' matches '{x={y}'. end = end_brace(text,mo.start()) rval = text[mo.start('value'):end-1] if lval is None: if op == '=': s = rval elif op == '?': s = '' elif op == '!': s = rval elif op == '#': s = '{'+name+'}' # So the line is dropped. elif op == '%': s = rval elif op in ('@','$'): s = '{'+name+'}' # So the line is dropped. else: assert False, 'illegal attribute: %s' % attr else: if op == '=': s = lval elif op == '?': s = rval elif op == '!': s = '' elif op == '#': s = rval elif op == '%': s = '{zzzzz}' # So the line is dropped. elif op in ('@','$'): v = re.split(r'(?@:[:]} else: if len(v) == 3: # {@::} s = v[2] else: # {@:} s = '' else: if re_mo: if len(v) == 2: # {$:} s = v[1] elif v[1] == '': # {$::} s = '{zzzzz}' # So the line is dropped. else: # {$::} s = v[1] else: if len(v) == 2: # {$:} s = '{zzzzz}' # So the line is dropped. else: # {$::} s = v[2] else: assert False, 'illegal attribute: %s' % attr s = str(s) text = text[:mo.start()] + s + text[end:] pos = mo.start() + len(s) # Drop line if it contains unsubstituted {name} references. skipped = re.search(r'(?su)\{[^\\\W][-\w]*?\}(?!\\)', text) if skipped: del lines[i] continue; # Expand system attributes. reo = re.compile(r'(?su)\{(?P[^\\\W][-\w]*?):(?P.*?)\}(?!\\)') skipped = False pos = 0 while True: mo = reo.search(text,pos) if not mo: break expr = mo.group('expr') expr = expr.replace('{\\','{') expr = expr.replace('}\\','}') s = system(mo.group('action'),expr) if s is None: skipped = True break text = text[:mo.start()] + s + text[mo.end():] pos = mo.start() + len(s) # Drop line if the action returns None. if skipped: del lines[i] continue; # Remove backslash from escaped entries. text = text.replace('{\\','{') text = text.replace('}\\','}') lines[i] = text if string_result: if lines: return '\n'.join(lines) else: return None else: return tuple(lines) def char_encoding(): encoding = document.attributes.get('encoding') if encoding: try: codecs.lookup(encoding) except LookupError,e: raise EAsciiDoc,str(e) return encoding def char_len(s): return len(char_decode(s)) def char_decode(s): if char_encoding(): try: return s.decode(char_encoding()) except Exception: raise EAsciiDoc, \ "'%s' codec can't decode \"%s\"" % (char_encoding(), s) else: return s def char_encode(s): if char_encoding(): return s.encode(char_encoding()) else: return s class Lex: """Lexical analysis routines. Static methods and attributes only.""" prev_element = None prev_cursor = None def __init__(self): raise AssertionError,'no class instances allowed' def next(): """Returns class of next element on the input (None if EOF). The reader is assumed to be at the first line following a previous element, end of file or line one. Exits with the reader pointing to the first line of the next element or EOF (leading blank lines are skipped).""" reader.skip_blank_lines() if reader.eof(): return None # Optimization: If we've already checked for an element at this # position return the element. if Lex.prev_element and Lex.prev_cursor == reader.cursor: return Lex.prev_element result = None # Check for Title. if not result and Title.isnext(): result = Title # Check for Block Macro. if not result and macros.isnext(): result = macros.current # Check for List. if not result and lists.isnext(): result = lists.current # Check for DelimitedBlock. if not result and blocks.isnext(): # Skip comment blocks. if 'skip' in blocks.current.options: blocks.current.translate() return Lex.next() else: result = blocks.current # Check for Table. if not result and tables.isnext(): result = tables.current # Check for AttributeEntry. if not result and AttributeEntry.isnext(): result = AttributeEntry # Check for AttributeList. if not result and AttributeList.isnext(): result = AttributeList # Check for BlockTitle. if not result and BlockTitle.isnext(): result = BlockTitle # If it's none of the above then it must be an Paragraph. if not result: if not paragraphs.isnext(): raise EAsciiDoc,'paragraph expected' result = paragraphs.current # Cache answer. Lex.prev_cursor = reader.cursor Lex.prev_element = result return result next = staticmethod(next) # Extract the passthrough text and replace with temporary placeholders. def extract_passthroughs(text, passthroughs): # +++ passthrough. lq1 = r'(?P\+{3})' rq1 = r'\+{3}' reo1 = re.compile(r'(?msu)(^|[^\w+])(' + lq1 + r')' \ + r'(?P.+?)(' + rq1 + r')(?=[^\w+]|$)') # $$ passthrough. lq2 = r'(\[(?P[^[]+?)\])?(?P\${2})' rq2 = r'\${2}' reo2 = re.compile(r'(?msu)(^|[^\w$\]])(' + lq2 + r')' \ + r'(?P.+?)(' + rq2 + r')(?=[^\w$]|$)') reo = reo1 pos = 0 while True: mo = reo.search(text,pos) if not mo: if reo == reo1: reo = reo2 pos = 0 continue else: break if text[mo.start()] == '\\': pos = mo.end() else: content = mo.group('content') if mo.group('lq') == '$$': content = config.subs_specialchars(content) attrs = {} parse_attributes(mo.group('attrs'), attrs) stag,etag = config.tag('$$passthrough', attrs) if not stag: etag = '' # Drop end tag if start tag has been. content = stag + content + etag passthroughs.append(content) # Tabs are expanded when the source is read so using them here # guarantees the placeholders are unambiguous. s = mo.group(1) + '\t' + str(len(passthroughs)-1) + '\t' text = text[:mo.start()] + s + text[mo.end():] pos = mo.start() + len(s) # Unescape escaped passthroughs. text = text.replace('\\+++', '+++') text = text.replace('\\$$', '$$') return text extract_passthroughs = staticmethod(extract_passthroughs) # Replace passthough placeholders with the original passthrough text. def restore_passthroughs(text, passthroughs): for i,v in enumerate(passthroughs): text = text.replace('\t'+str(i)+'\t', passthroughs[i], 1) return text restore_passthroughs = staticmethod(restore_passthroughs) def subs_1(s,options): """Perform substitution specified in 'options' (in 'options' order) on a single line 's' of text. Returns the substituted string. Does not process 'attributes' or 'passthroughs' substitutions.""" if not s: return s result = s for o in options: if o == 'specialcharacters': result = config.subs_specialchars(result) # Quoted text. elif o == 'quotes': result = subs_quotes(result) # Special words. elif o == 'specialwords': result = config.subs_specialwords(result) # Replacements. elif o in ('replacements','replacements2'): result = config.subs_replacements(result,o) # Inline macros. elif o == 'macros': result = macros.subs(result) elif o == 'callouts': result = macros.subs(result,callouts=True) else: raise EAsciiDoc,'illegal substitution option: %s' % o return result subs_1 = staticmethod(subs_1) def subs(lines,options): """Perform inline processing specified by 'options' (in 'options' order) on sequence of 'lines'.""" if len(options) == 1: if options[0] == 'none': options = () elif options[0] == 'normal': options = config.subsnormal elif options[0] == 'verbatim': options = config.subsverbatim if not lines or not options: return lines # Join lines so quoting can span multiple lines. para = '\n'.join(lines) if 'passthroughs' in options: passthroughs = [] para = Lex.extract_passthroughs(para,passthroughs) for o in options: if o == 'attributes': # If we don't substitute attributes line-by-line then a single # undefined attribute will drop the entire paragraph. lines = subs_attrs(para.split('\n')) para = '\n'.join(lines) elif o != 'passthroughs': para = Lex.subs_1(para,(o,)) if 'passthroughs' in options: para = Lex.restore_passthroughs(para,passthroughs) return para.splitlines() subs = staticmethod(subs) def set_margin(lines, margin=0): """Utility routine that sets the left margin to 'margin' space in a block of non-blank lines.""" # Calculate width of block margin. lines = list(lines) width = len(lines[0]) for s in lines: i = re.search(r'\S',s).start() if i < width: width = i # Strip margin width from all lines. for i in range(len(lines)): lines[i] = ' '*margin + lines[i][width:] return lines set_margin = staticmethod(set_margin) #--------------------------------------------------------------------------- # Document element classes parse AsciiDoc reader input and write DocBook writer # output. #--------------------------------------------------------------------------- class Document: def __init__(self): self.doctype = None # 'article','manpage' or 'book'. self.backend = None # -b option argument. self.infile = None # Source file name. self.outfile = None # Output file name. self.attributes = {} self.level = 0 # 0 => front matter. 1,2,3 => sect1,2,3. self.has_errors = False # Set true if processing errors were flagged. self.has_warnings = False # Set true if warnings were flagged. self.safe = True # Default safe mode. def init_attrs(self): # Set implicit attributes. d = time.localtime(time.time()) self.attributes['localdate'] = time.strftime('%Y-%m-%d',d) s = time.strftime('%H:%M:%S',d) if time.daylight: self.attributes['localtime'] = s + ' ' + time.tzname[1] else: self.attributes['localtime'] = s + ' ' + time.tzname[0] # Attempt to convert the localtime to the output encoding. try: self.attributes['localtime'] = char_encode( self.attributes['localtime'].decode( locale.getdefaultlocale()[1] ) ) except: pass self.attributes['asciidoc-version'] = VERSION self.attributes['backend'] = document.backend self.attributes['doctype'] = document.doctype self.attributes['backend-'+document.backend] = '' self.attributes['doctype-'+document.doctype] = '' self.attributes[document.backend+'-'+document.doctype] = '' self.attributes['asciidoc-dir'] = APP_DIR self.attributes['user-dir'] = USER_DIR if self.infile != '': self.attributes['infile'] = self.infile self.attributes['indir'] = os.path.dirname(self.infile) self.attributes['docdir'] = os.path.dirname(self.infile) #DEPRECATED self.attributes['docname'] = os.path.splitext( os.path.basename(self.infile))[0] if config.verbose: self.attributes['verbose'] = '' # Update with configuration file attributes. self.attributes.update(config.conf_attrs) # Update with command-line attributes. self.attributes.update(config.cmd_attrs) # Extract miscellaneous configuration section entries from attributes. config.load_miscellaneous(config.conf_attrs) config.load_miscellaneous(config.cmd_attrs) self.attributes['newline'] = config.newline # Use raw (unescaped) value. if self.outfile: if self.outfile != '': self.attributes['outfile'] = self.outfile self.attributes['outdir'] = os.path.dirname(self.outfile) self.attributes['docname'] = os.path.splitext( os.path.basename(self.outfile))[0] ext = os.path.splitext(self.outfile)[1][1:] elif config.outfilesuffix: ext = config.outfilesuffix[1:] else: ext = '' if ext: self.attributes['filetype'] = ext self.attributes['filetype-'+ext] = '' def translate(self): assert self.doctype in ('article','manpage','book'), \ 'illegal document type' assert self.level == 0 config.expand_all_templates() # Skip leading comment block. if blocks.isnext() and 'skip' in blocks.current.options: blocks.current.translate() # Skip leading comment lines. while macros.isnext() and macros.current.name == 'comment': macros.current.translate() # Skip leading attribute entries. AttributeEntry.translate_all() # Process document header. has_header = Lex.next() is Title and Title.level == 0 if self.doctype == 'manpage' and not has_header: error('manpage document title is mandatory') if has_header: Header.translate() # Command-line entries override header derived entries. self.attributes.update(config.cmd_attrs) if config.header_footer: hdr = config.subs_section('header',{}) writer.write(hdr) if self.doctype in ('article','book'): # Translate 'preamble' (untitled elements between header # and first section title). if Lex.next() is not Title: stag,etag = config.section2tags('preamble') writer.write(stag) Section.translate_body() writer.write(etag) else: # Translate manpage SYNOPSIS. if Lex.next() is not Title: error('SYNOPSIS section expected') else: Title.translate() if Title.dict['title'].upper() <> 'SYNOPSIS': error('second section must be named SYNOPSIS') if Title.level != 1: error('SYNOPSIS section title must be at level 1') d = {} d.update(Title.dict) AttributeList.consume(d) stag,etag = config.section2tags('sect-synopsis',d) writer.write(stag) Section.translate_body() writer.write(etag) else: if config.header_footer: hdr = config.subs_section('header',{}) writer.write(hdr) if Lex.next() is not Title: Section.translate_body() # Process remaining sections. while not reader.eof(): if Lex.next() is not Title: raise EAsciiDoc,'section title expected' Section.translate() Section.setlevel(0) # Write remaining unwritten section close tags. # Substitute document parameters and write document footer. if config.header_footer: ftr = config.subs_section('footer',{}) writer.write(ftr) def parse_author(self,s): """ Return False if the author is malformed.""" attrs = self.attributes # Alias for readability. s = s.strip() mo = re.match(r'^(?P[^<>\s]+)' '(\s+(?P[^<>\s]+))?' '(\s+(?P[^<>\s]+))?' '(\s+<(?P\S+)>)?$',s) if not mo: error('malformed author: %s' % s) return False firstname = mo.group('name1') if mo.group('name3'): middlename = mo.group('name2') lastname = mo.group('name3') else: middlename = None lastname = mo.group('name2') firstname = firstname.replace('_',' ') if middlename: middlename = middlename.replace('_',' ') if lastname: lastname = lastname.replace('_',' ') email = mo.group('email') if firstname: attrs['firstname'] = firstname if middlename: attrs['middlename'] = middlename if lastname: attrs['lastname'] = lastname if email: attrs['email'] = email return True def process_author_names(self): """ Calculate any missing author related attributes.""" attrs = self.attributes # Alias for readability. firstname = attrs.get('firstname','') middlename = attrs.get('middlename','') lastname = attrs.get('lastname','') author = attrs.get('author') initials = attrs.get('authorinitials') if author and not (firstname or middlename or lastname): if not self.parse_author(author): return attrs['author'] = author.replace('_',' ') self.process_author_names() return if not author: author = '%s %s %s' % (firstname, middlename, lastname) author = author.strip() author = re.sub(r'\s+',' ', author) if not initials: initials = firstname[:1] + middlename[:1] + lastname[:1] initials = initials.upper() names = [firstname,middlename,lastname,author,initials] for i,v in enumerate(names): v = config.subs_specialchars(v) v = subs_attrs(v) names[i] = v firstname,middlename,lastname,author,initials = names if firstname: attrs['firstname'] = firstname if middlename: attrs['middlename'] = middlename if lastname: attrs['lastname'] = lastname if author: attrs['author'] = author if initials: attrs['authorinitials'] = initials if author: attrs['authored'] = '' class Header: """Static methods and attributes only.""" def __init__(self): raise AssertionError,'no class instances allowed' def translate(): assert Lex.next() is Title and Title.level == 0 Title.translate() attrs = document.attributes # Alias for readability. attrs['doctitle'] = Title.dict['title'] if document.doctype == 'manpage': # manpage title formatted like mantitle(manvolnum). mo = re.match(r'^(?P.*)\((?P.*)\)$', attrs['doctitle']) if not mo: error('malformed manpage title') else: mantitle = mo.group('mantitle').strip() # mantitle is lowered only if in ALL CAPS if mantitle == mantitle.upper(): mantitle = mantitle.lower() attrs['mantitle'] = mantitle; attrs['manvolnum'] = mo.group('manvolnum').strip() AttributeEntry.translate_all() s = reader.read_next() if s: s = reader.read() document.parse_author(s) AttributeEntry.translate_all() if reader.read_next(): # Parse revision line. s = reader.read() s = subs_attrs(s) if s: # Match RCS/CVS/SVN $Id$ marker format. mo = re.match(r'^\$Id: \S+ (?P\S+)' ' (?P\S+) \S+ \S+ (\S+ )?\$$',s) if not mo: # Match AsciiDoc revision,date format. mo = re.match(r'^\D*(?P.*?),(?P.+)$',s) if mo: revision = mo.group('revision').strip() date = mo.group('date').strip() else: revision = None date = s.strip() if revision: attrs['revision'] = config.subs_specialchars(revision) if date: attrs['date'] = config.subs_specialchars(date) AttributeEntry.translate_all() if document.doctype == 'manpage': # Translate mandatory NAME section. if Lex.next() is not Title: error('NAME section expected') else: Title.translate() if Title.dict['title'].upper() <> 'NAME': error('first section must be named NAME') if Title.level != 1: error('NAME section title must be at level 1') if not isinstance(Lex.next(),Paragraph): error('malformed NAME section body') lines = reader.read_until(r'^$') s = ' '.join(lines) mo = re.match(r'^(?P.*?)\s+-\s+(?P.*)$',s) if not mo: error('malformed NAME section body') attrs['manname'] = mo.group('manname').strip() attrs['manpurpose'] = mo.group('manpurpose').strip() document.process_author_names() if document.backend == 'linuxdoc' and not attrs.has_key('author'): warning('linuxdoc requires author name') translate = staticmethod(translate) class AttributeEntry: """Static methods and attributes only.""" pattern = None subs = None name = None value = None def __init__(self): raise AssertionError,'no class instances allowed' def isnext(): result = False # Assume not next. if not AttributeEntry.pattern: pat = document.attributes.get('attributeentry-pattern') if not pat: error("[attributes] missing 'attributeentry-pattern' entry") AttributeEntry.pattern = pat if not AttributeEntry.subs: subs = document.attributes.get('attributeentry-subs') if subs: subs = parse_options(subs,SUBS_OPTIONS, 'illegal [%s] %s: %s' % ('attributes','attributeentry-subs',subs)) else: subs = ('specialcharacters','attributes') AttributeEntry.subs = subs line = reader.read_next() if line: mo = re.match(AttributeEntry.pattern,line) if mo: name = mo.group('attrname').strip() if name[-1] == '!': # Names like name! are None. name = name[:-1] value = None else: value = mo.group('attrvalue').strip() # Strip white space and illegal name chars. name = re.sub(r'(?u)[^\w\-_]', '', name).lower() AttributeEntry.name = name AttributeEntry.value = value result = True return result isnext = staticmethod(isnext) def translate(): assert Lex.next() is AttributeEntry attr = AttributeEntry # Alias for brevity. reader.read() # Discard attribute from reader. # Don't override command-line attributes. if config.cmd_attrs.has_key(attr.name): return # Update document.attributes from previously parsed attribute. if attr.value: attr.value = Lex.subs((attr.value,), attr.subs) attr.value = writer.newline.join(attr.value) if attr.value is not None: document.attributes[attr.name] = attr.value elif document.attributes.has_key(attr.name): del document.attributes[attr.name] translate = staticmethod(translate) def translate_all(): """ Process all contiguous attribute lines on reader.""" while AttributeEntry.isnext(): AttributeEntry.translate() translate_all = staticmethod(translate_all) class AttributeList: """Static methods and attributes only.""" pattern = None match = None attrs = {} def __init__(self): raise AssertionError,'no class instances allowed' def isnext(): result = False # Assume not next. if not AttributeList.pattern: if not document.attributes.has_key('attributelist-pattern'): error("[attributes] missing 'attributelist-pattern' entry") AttributeList.pattern = document.attributes['attributelist-pattern'] line = reader.read_next() if line: mo = re.match(AttributeList.pattern, line) if mo: AttributeList.match = mo result = True return result isnext = staticmethod(isnext) def translate(): assert Lex.next() is AttributeList reader.read() # Discard attribute list from reader. d = AttributeList.match.groupdict() for k,v in d.items(): if v is not None: if k == 'attrlist': v = subs_attrs(v) if v: parse_attributes(v, AttributeList.attrs) else: AttributeList.attrs[k] = v translate = staticmethod(translate) def consume(d): """Add attribute list to the dictionary 'd' and reset the list.""" if AttributeList.attrs: d.update(AttributeList.attrs) AttributeList.attrs = {} consume = staticmethod(consume) class BlockTitle: """Static methods and attributes only.""" title = None pattern = None def __init__(self): raise AssertionError,'no class instances allowed' def isnext(): result = False # Assume not next. line = reader.read_next() if line: mo = re.match(BlockTitle.pattern,line) if mo: BlockTitle.title = mo.group('title') result = True return result isnext = staticmethod(isnext) def translate(): assert Lex.next() is BlockTitle reader.read() # Discard title from reader. # Perform title substitutions. if not Title.subs: Title.subs = config.subsnormal s = Lex.subs((BlockTitle.title,), Title.subs) s = writer.newline.join(s) if not s: warning('blank block title') BlockTitle.title = s translate = staticmethod(translate) def consume(d): """If there is a title add it to dictionary 'd' then reset title.""" if BlockTitle.title: d['title'] = BlockTitle.title BlockTitle.title = None consume = staticmethod(consume) class Title: """Processes Header and Section titles. Static methods and attributes only.""" # Class variables underlines = ('==','--','~~','^^','++') # Levels 0,1,2,3,4. subs = () pattern = None level = 0 dict = {} sectname = None section_numbers = [0]*len(underlines) dump_dict = {} linecount = None # Number of lines in title (1 or 2). def __init__(self): raise AssertionError,'no class instances allowed' def translate(): """Parse the Title.dict and Title.level from the reader. The real work has already been done by parse().""" assert Lex.next() is Title # Discard title from reader. for i in range(Title.linecount): reader.read() Title.setsectname() # Perform title substitutions. if not Title.subs: Title.subs = config.subsnormal s = Lex.subs((Title.dict['title'],), Title.subs) s = writer.newline.join(s) if not s: warning('blank section title') Title.dict['title'] = s translate = staticmethod(translate) def isnext(): lines = reader.read_ahead(2) return Title.parse(lines) isnext = staticmethod(isnext) def parse(lines): """Parse title at start of lines tuple.""" if len(lines) == 0: return False if len(lines[0]) == 0: return False # Title can't be blank. # Check for single-line titles. result = False for level in range(len(Title.underlines)): k = 'sect%s' % level if Title.dump_dict.has_key(k): mo = re.match(Title.dump_dict[k], lines[0]) if mo: Title.dict = mo.groupdict() Title.level = level Title.linecount = 1 result = True break if not result: # Check for double-line titles. if not Title.pattern: return False # Single-line titles only. if len(lines) < 2: return False title,ul = lines[:2] title_len = char_len(title) ul_len = char_len(ul) if ul_len < 2: return False # Fast elimination check. if ul[:2] not in Title.underlines: return False # Length of underline must be within +-3 of title. if not (ul_len-3 < title_len < ul_len+3): return False # Check for valid repetition of underline character pairs. s = ul[:2]*((ul_len+1)/2) if ul != s[:ul_len]: return False # Don't be fooled by back-to-back delimited blocks, require at # least one alphanumeric character in title. if not re.search(r'(?u)\w',title): return False mo = re.match(Title.pattern, title) if mo: Title.dict = mo.groupdict() Title.level = list(Title.underlines).index(ul[:2]) Title.linecount = 2 result = True # Check for expected pattern match groups. if result: if not Title.dict.has_key('title'): warning('[titles] entry has no group') Title.dict['title'] = lines[0] for k,v in Title.dict.items(): if v is None: del Title.dict[k] return result parse = staticmethod(parse) def load(dict): """Load and validate [titles] section entries from dict.""" if dict.has_key('underlines'): errmsg = 'malformed [titles] underlines entry' try: underlines = parse_list(dict['underlines']) except: raise EAsciiDoc,errmsg if len(underlines) != len(Title.underlines): raise EAsciiDoc,errmsg for s in underlines: if len(s) !=2: raise EAsciiDoc,errmsg Title.underlines = tuple(underlines) Title.dump_dict['underlines'] = dict['underlines'] if dict.has_key('subs'): Title.subs = parse_options(dict['subs'], SUBS_OPTIONS, 'illegal [titles] subs entry') Title.dump_dict['subs'] = dict['subs'] if dict.has_key('sectiontitle'): pat = dict['sectiontitle'] if not pat or not is_regexp(pat): raise EAsciiDoc,'malformed [titles] sectiontitle entry' Title.pattern = pat Title.dump_dict['sectiontitle'] = pat if dict.has_key('blocktitle'): pat = dict['blocktitle'] if not pat or not is_regexp(pat): raise EAsciiDoc,'malformed [titles] blocktitle entry' BlockTitle.pattern = pat Title.dump_dict['blocktitle'] = pat # Load single-line title patterns. for k in ('sect0','sect1','sect2','sect3','sect4'): if dict.has_key(k): pat = dict[k] if not pat or not is_regexp(pat): raise EAsciiDoc,'malformed [titles] %s entry' % k Title.dump_dict[k] = pat # TODO: Check we have either a Title.pattern or at least one # single-line title pattern -- can this be done here or do we need # check routine like the other block checkers? load = staticmethod(load) def dump(): dump_section('titles',Title.dump_dict) dump = staticmethod(dump) def setsectname(): """Set Title section name. First search for section title in [specialsections], if not found use default 'sect<level>' name.""" for pat,sect in config.specialsections.items(): mo = re.match(pat,Title.dict['title']) if mo: title = mo.groupdict().get('title') if title is not None: Title.dict['title'] = title.strip() else: Title.dict['title'] = mo.group().strip() Title.sectname = sect break else: Title.sectname = 'sect%d' % Title.level setsectname = staticmethod(setsectname) def getnumber(level): """Return next section number at section 'level' formatted like 1.2.3.4.""" number = '' for l in range(len(Title.section_numbers)): n = Title.section_numbers[l] if l == 0: continue elif l < level: number = '%s%d.' % (number, n) elif l == level: number = '%s%d.' % (number, n + 1) Title.section_numbers[l] = n + 1 elif l > level: # Reset unprocessed section levels. Title.section_numbers[l] = 0 return number getnumber = staticmethod(getnumber) class Section: """Static methods and attributes only.""" endtags = [] # Stack of currently open section (level,endtag) tuples. ids = [] # List of already used ids. def __init__(self): raise AssertionError,'no class instances allowed' def savetag(level,etag): """Save section end.""" Section.endtags.append((level,etag)) savetag = staticmethod(savetag) def setlevel(level): """Set document level and write open section close tags up to level.""" while Section.endtags and Section.endtags[-1][0] >= level: writer.write(Section.endtags.pop()[1]) document.level = level setlevel = staticmethod(setlevel) def gen_id(title): """ The normalized value of the id attribute is an NCName according to the 'Namespaces in XML' Recommendation: NCName ::= NCNameStartChar NCNameChar* NCNameChar ::= NameChar - ':' NCNameStartChar ::= Letter | '_' NameChar ::= Letter | Digit | '.' | '-' | '_' | ':' """ base_ident = re.sub(r'[^a-zA-Z0-9]+', '_', title).strip('_').lower() # Prefix with underscore to ensure a valid id start character and to # ensure the id does not clash with existing document id's. base_ident = '_' + base_ident i = 1 while True: if i == 1: ident = base_ident else: ident = '%s_%d' % (base_ident, i) if ident not in Section.ids: Section.ids.append(ident) return ident else: ident = base_ident i += 1 gen_id = staticmethod(gen_id) def translate(): assert Lex.next() is Title prev_sectname = Title.sectname Title.translate() if Title.level == 0 and document.doctype != 'book': error('only book doctypes can contain level 0 sections') if Title.level > document.level \ and document.backend == 'docbook' \ and prev_sectname in ('sect-colophon','sect-abstract', \ 'sect-dedication','sect-glossary','sect-bibliography'): error('%s section cannot contain sub-sections' % prev_sectname) if Title.level > document.level+1: # Sub-sections of multi-part book level zero Preface and Appendices # are meant to be out of sequence. if document.doctype == 'book' \ and document.level == 0 \ and Title.level == 2 \ and prev_sectname in ('sect-preface','sect-appendix'): pass else: warning('section title out of sequence: ' 'expected level %d, got level %d' % (document.level+1, Title.level)) if not document.attributes.get('sectids') is None \ and 'id' not in AttributeList.attrs: # Generate ids for sections. AttributeList.attrs['id'] = Section.gen_id(Title.dict['title']) Section.setlevel(Title.level) Title.dict['sectnum'] = Title.getnumber(document.level) AttributeList.consume(Title.dict) stag,etag = config.section2tags(Title.sectname,Title.dict) Section.savetag(Title.level,etag) writer.write(stag) Section.translate_body() translate = staticmethod(translate) def translate_body(terminator=Title): isempty = True next = Lex.next() while next and next is not terminator: if next is Title and isinstance(terminator,DelimitedBlock): error('title not permitted in sidebar body') if document.backend == 'linuxdoc' \ and document.level == 0 \ and not isinstance(next,Paragraph): warning('only paragraphs are permitted in linuxdoc synopsis') next.translate() next = Lex.next() isempty = False # The section is not empty if contains a subsection. if next and isempty and Title.level > document.level: isempty = False # Report empty sections if invalid markup will result. if isempty: if document.backend == 'docbook' and Title.sectname != 'sect-index': error('empty section is not valid') translate_body = staticmethod(translate_body) class AbstractBlock: def __init__(self): self.OPTIONS = () # The set of allowed options values # Configuration parameter names common to all blocks. self.CONF_ENTRIES = ('options','subs','presubs','postsubs', 'posattrs','style','.*-style') # Configuration parameters. self.name=None # Configuration file section name. self.delimiter=None # Regular expression matching block delimiter. self.template=None # template section entry. self.options=() # options entry list. self.presubs=None # presubs/subs entry list. self.postsubs=() # postsubs entry list. self.filter=None # filter entry. self.posattrs=() # posattrs entry list. self.style=None # Default style. self.styles=OrderedDict() # Styles dictionary. # Before a block is processed it's attributes (from it's # attributes list) are merged with the block configuration parameters # (by self.process_attributes()) resulting in the template substitution # dictionary (self.attributes) and the block's procssing parameters # (self.parameters). self.attributes={} # The names of block parameters. self.PARAM_NAMES=('template','options','presubs','postsubs','filter') self.parameters={} # Leading delimiter match object. self.mo=None def is_conf_entry(self,param): """Return True if param matches an allowed configuration file entry name.""" for s in self.CONF_ENTRIES: if re.match('^'+s+'$',param): return True return False def load(self,name,entries): """Update block definition from section 'entries' dictionary.""" for k in entries.keys(): if not self.is_conf_entry(k): raise EAsciiDoc,'illegal [%s] entry name: %s' % (name,k) self.name = name for k,v in entries.items(): if not is_name(k): raise EAsciiDoc, \ 'malformed [%s] entry name: %s' % (name,k) if k == 'delimiter': if v and is_regexp(v): self.delimiter = v else: raise EAsciiDoc,'malformed [%s] regexp: %s' % (name,v) elif k == 'template': if not is_name(v): raise EAsciiDoc, \ 'malformed [%s] template name: %s' % (name,v) self.template = v elif k == 'style': if not is_name(v): raise EAsciiDoc, \ 'malformed [%s] style name: %s' % (name,v) self.style = v elif k == 'posattrs': self.posattrs = parse_options(v, (), 'illegal [%s] %s: %s' % (name,k,v)) elif k == 'options': self.options = parse_options(v,self.OPTIONS, 'illegal [%s] %s: %s' % (name,k,v)) elif k == 'presubs' or k == 'subs': self.presubs = parse_options(v,SUBS_OPTIONS, 'illegal [%s] %s: %s' % (name,k,v)) elif k == 'postsubs': self.postsubs = parse_options(v,SUBS_OPTIONS, 'illegal [%s] %s: %s' % (name,k,v)) elif k == 'filter': self.filter = v else: mo = re.match(r'^(?P<style>.*)-style$',k) if mo: if not v: raise EAsciiDoc, 'empty [%s] style: %s' % (name,k) style = mo.group('style') d = {} if not parse_named_attributes(v,d): raise EAsciiDoc,'malformed [%s] style: %s' % (name,v) self.styles[style] = d def dump(self): """Write block definition to stdout.""" write = lambda s: sys.stdout.write('%s%s' % (s,writer.newline)) write('['+self.name+']') if self.is_conf_entry('delimiter'): write('delimiter='+self.delimiter) if self.template: write('template='+self.template) if self.options: write('options='+','.join(self.options)) if self.presubs: if self.postsubs: write('presubs='+','.join(self.presubs)) else: write('subs='+','.join(self.presubs)) if self.postsubs: write('postsubs='+','.join(self.postsubs)) if self.filter: write('filter='+self.filter) if self.posattrs: write('posattrs='+','.join(self.posattrs)) if self.style: write('style='+self.style) if self.styles: for style,d in self.styles.items(): s = '' for k,v in d.items(): s += '%s=%r,' % (k,v) write('%s-style=%s' % (style,s[:-1])) def validate(self): """Validate block after the complete configuration has been loaded.""" if self.is_conf_entry('delimiter') and not self.delimiter: raise EAsciiDoc,'[%s] missing delimiter' % self.name if self.style: if not self.styles.has_key(self.style): warning(' missing [%s] %s-style entry' % (self.name,self.style)) # Check all styles for missing templates. all_styles_have_template = True for k,v in self.styles.items(): t = v.get('template') if t and not config.sections.has_key(t): warning('[%s] missing template section' % t) if not t: all_styles_have_template = False # Check we have a valid template entry or alternatively that all the # styles have templates. if self.is_conf_entry('template') and not 'skip' in self.options: if self.template: if not config.sections.has_key(self.template): warning('[%s] missing template section' % self.template) elif not all_styles_have_template: warning('[%s] styles missing templates' % self.name) def isnext(self): """Check if this block is next in document reader.""" result = False reader.skip_blank_lines() if reader.read_next(): mo = re.match(self.delimiter,reader.read_next()) if mo: self.mo = mo result = True return result def translate(self): """Translate block from document reader.""" if not self.presubs: self.presubs = config.subsnormal def update_params(self,src,dst): """Copy block processing parameters from src to dst dictionaries.""" for k,v in src.items(): if k in ('template','filter'): dst[k] = v elif k == 'options': dst[k] = parse_options(v,self.OPTIONS, 'illegal [%s] %s: %s' % (self.name,k,v)) elif k in ('subs','presubs','postsubs'): subs = parse_options(v,SUBS_OPTIONS, 'illegal [%s] %s: %s' % (self.name,k,v)) if k == 'subs': dst['presubs'] = subs else: dst[k] = subs def merge_attributes(self,attrs): """Merge block attributes 'attrs' dictionary with the block configuration parameters setting self.attributes (template substitution attributes) and self.parameters (block processing parameters).""" self.attributes = {} self.attributes.update(attrs) # Calculate dynamic block parameters. # Start with configuration file defaults. self.parameters['template'] = self.template self.parameters['options'] = self.options self.parameters['presubs'] = self.presubs self.parameters['postsubs'] = self.postsubs self.parameters['filter'] = self.filter # Load the selected style attributes. posattrs = self.posattrs if posattrs and posattrs[0] == 'style': style = self.attributes.get('1') else: style = None if not style: style = self.attributes.get('style',self.style) if style is not None: if not self.styles.has_key(style): warning('missing [%s] %s-style entry' % (self.name,style)) else: self.attributes['style'] = style for k,v in self.styles[style].items(): if k == 'posattrs': posattrs = v elif k in self.PARAM_NAMES: self.parameters[k] = v elif not self.attributes.has_key(k): # Style attributes don't take precedence over explicit. self.attributes[k] = v # Set named positional attributes. for i,v in enumerate(posattrs): if self.attributes.has_key(str(i+1)): self.attributes[v] = self.attributes[str(i+1)] # Override config and style attributes with document attributes. self.update_params(self.attributes,self.parameters) assert isinstance(self.parameters['options'],tuple) assert isinstance(self.parameters['presubs'],tuple) assert isinstance(self.parameters['postsubs'],tuple) def get_options(self): return self.parameters['options'] def get_subs(self): return (self.parameters['presubs'], self.parameters['postsubs']) def get_template(self): return self.parameters['template'] def get_filter(self): return self.parameters['filter'] class AbstractBlocks: """List of block definitions.""" PREFIX = '' # Conf file section name prefix set in derived classes. BLOCK_TYPE = None # Block type set in derived classes. def __init__(self): self.current=None self.blocks = [] # List of Block objects. self.default = None # Default Block. self.delimiter = None # Combined tables delimiter regular expression. def load(self,sections): """Load block definition from 'sections' dictionary.""" for k in sections.keys(): if re.match(r'^'+ self.PREFIX + r'.+$',k): d = {} parse_entries(sections.get(k,()),d) for b in self.blocks: if b.name == k: break else: b = self.BLOCK_TYPE() self.blocks.append(b) try: b.load(k,d) except EAsciiDoc,e: raise EAsciiDoc,'[%s] %s' % (k,str(e)) def dump(self): for b in self.blocks: b.dump() def isnext(self): for b in self.blocks: if b.isnext(): self.current = b return True; return False def validate(self): """Validate the block definitions.""" # Validate delimiters and build combined lists delimiter pattern. delimiters = [] for b in self.blocks: assert b.__class__ is self.BLOCK_TYPE b.validate() if b.delimiter: delimiters.append(b.delimiter) self.delimiter = join_regexp(delimiters) class Paragraph(AbstractBlock): def __init__(self): AbstractBlock.__init__(self) self.CONF_ENTRIES += ('delimiter','template','filter') self.OPTIONS = ('listelement',) self.text=None # Text in first line of paragraph. def load(self,name,entries): AbstractBlock.load(self,name,entries) def dump(self): AbstractBlock.dump(self) write = lambda s: sys.stdout.write('%s%s' % (s,writer.newline)) write('') def isnext(self): result = AbstractBlock.isnext(self) if result: self.text = self.mo.groupdict().get('text') return result def translate(self): AbstractBlock.translate(self) attrs = {} attrs.update(self.mo.groupdict()) BlockTitle.consume(attrs) AttributeList.consume(attrs) self.merge_attributes(attrs) reader.read() # Discard (already parsed item first line). body = reader.read_until(r'^\+$|^$|'+blocks.delimiter+r'|'+tables.delimiter) body = [self.text] + list(body) presubs,postsubs = self.get_subs() # Don't join verbatim paragraphs. if 'verbatim' not in (presubs + postsubs): body = join_lines(body) body = Lex.set_margin(body) # Move body to left margin. body = Lex.subs(body,presubs) if self.get_filter(): body = filter_lines(self.get_filter(),body,self.attributes) body = Lex.subs(body,postsubs) template = self.get_template() stag,etag = config.section2tags(template, self.attributes) # Write start tag, content, end tag. writer.write(dovetail_tags(stag,body,etag)) class Paragraphs(AbstractBlocks): """List of paragraph definitions.""" BLOCK_TYPE = Paragraph PREFIX = 'paradef-' def __init__(self): AbstractBlocks.__init__(self) def load(self,sections): AbstractBlocks.load(self,sections) def validate(self): AbstractBlocks.validate(self) # Check we have a default paragraph definition, put it last in list. for b in self.blocks: if b.name == 'paradef-default': self.blocks.append(b) self.default = b self.blocks.remove(b) break else: raise EAsciiDoc,'missing [paradef-default] section' class List(AbstractBlock): TAGS = ('listtag','itemtag','texttag','entrytag','labeltag') TYPES = ('bulleted','numbered','labeled','callout') def __init__(self): AbstractBlock.__init__(self) self.CONF_ENTRIES += ('delimiter','type') + self.TAGS self.listtag=None self.itemtag=None self.texttag=None # Tag for list item text. self.labeltag=None # Variable lists only. self.entrytag=None # Variable lists only. self.label=None # List item label (labeled lists). self.text=None # Text in first line of list item. self.index=None # Matched delimiter 'index' group (numbered lists). self.type=None # List type. self.listindex=None # Current list index (1..) def load(self,name,entries): AbstractBlock.load(self,name,entries) for k,v in entries.items(): if k == 'type': if v in self.TYPES: self.type = v else: raise EAsciiDoc,'illegal list type: %s' % v elif k in self.TAGS: if is_name(v): setattr(self,k,v) else: raise EAsciiDoc,'illegal list %s name: %s' % (k,v) def dump(self): AbstractBlock.dump(self) write = lambda s: sys.stdout.write('%s%s' % (s,writer.newline)) write('type='+self.type) write('listtag='+self.listtag) write('itemtag='+self.itemtag) write('texttag='+self.texttag) if self.type == 'labeled': write('entrytag='+self.entrytag) write('labeltag='+self.labeltag) write('') def isnext(self): result = AbstractBlock.isnext(self) if result: self.label = self.mo.groupdict().get('label') self.text = self.mo.groupdict().get('text') self.index = self.mo.groupdict().get('index') return result def translate_entry(self): assert self.type == 'labeled' stag,etag = config.tag(self.entrytag, self.attributes) if stag: writer.write(stag) if self.listtag == 'hlist': # Horizontal label list. reader.read() # Discard (already parsed item first line). writer.write_tag(self.labeltag, [self.label], self.presubs, self.attributes) else: # Write multiple labels (vertical label list). while Lex.next() is self: reader.read() # Discard (already parsed item first line). writer.write_tag(self.labeltag, [self.label], self.presubs, self.attributes) # Write item text. self.translate_item() if etag: writer.write(etag) def iscontinued(self): if reader.read_next() == '+': reader.read() # Discard. # Allow attribute list to precede continued list item element. while Lex.next() is AttributeList: Lex.next().translate() return True else: return False def translate_item(self): if lists.listblock: self.translate_item_2() else: self.translate_item_1() def translate_item_1(self): """Translation for '+' style list continuation.""" if self.type == 'callout': self.attributes['coids'] = calloutmap.calloutids(self.listindex) stag,etag = config.tag(self.itemtag, self.attributes) if stag: writer.write(stag) if self.text and self.text == '+': # Pathalogical case: continued Horizontal Labeled List with no # item text. continued = True elif not self.text and self.iscontinued(): # Pathalogical case: continued Vertical Labeled List with no # item text. continued = True else: # Write ItemText. text = reader.read_until(lists.delimiter + r'|^\+$|^$|' + blocks.delimiter + r'|' + tables.delimiter) if self.text is not None: text = [self.text] + list(text) text = join_lines(text) if text: writer.write_tag(self.texttag, text, self.presubs, self.attributes) continued = self.iscontinued() while True: next = Lex.next() if next in lists.open: break elif isinstance(next,List): next.translate() elif isinstance(next,Paragraph) and 'listelement' in next.options: next.translate() elif continued: if next is Title or next is BlockTitle: error('title not allowed in list item continuation') next.translate() else: break continued = self.iscontinued() if etag: writer.write(etag) def translate_item_2(self): """Translation for List block style lists.""" if self.type == 'callout': self.attributes['coids'] = calloutmap.calloutids(self.listindex) stag,etag = config.tag(self.itemtag, self.attributes) if stag: writer.write(stag) if self.text or reader.read_next(): # Write ItemText. text = reader.read_until(lists.delimiter + r'|^$|' + blocks.delimiter + r'|' + tables.delimiter) if self.text is not None: text = [self.text] + list(text) text = join_lines(text) writer.write_tag(self.texttag, text, self.presubs, self.attributes) while True: next = Lex.next() if next in lists.open: break elif next is lists.listblock: break elif isinstance(next,List): next.translate() elif isinstance(next,Paragraph) and 'listelement' in next.options: next.translate() elif lists.listblock: if next is Title or next is BlockTitle: error('title not allowed in list item continuation') next.translate() else: break if etag: writer.write(etag) def check_index(self): """ Check calculated listindex (1,2,...) against the item index in the document (self.index).""" assert self.type in ('numbered','callout') if self.index: matched = False if re.match(r'\d+', self.index): i = int(self.index) matched = True elif re.match(r'[a-z]', self.index): i = ord(self.index) - ord('a') + 1 matched = True if matched and i != self.listindex: print 'type: ',self.type,': expected ',self.listindex,' got ',i warning('list item %s out of sequence' % self.index) def translate(self): AbstractBlock.translate(self) lists.open.append(self) attrs = {} attrs.update(self.mo.groupdict()) BlockTitle.consume(attrs) AttributeList.consume(attrs) self.merge_attributes(attrs) stag,etag = config.tag(self.listtag, self.attributes) if stag: writer.write(stag) self.listindex = 0 while Lex.next() is self: self.listindex += 1 document.attributes['listindex'] = str(self.listindex) if self.type in ('numbered','callout'): self.check_index() if self.type in ('bulleted','numbered','callout'): reader.read() # Discard (already parsed item first line). self.translate_item() elif self.type == 'labeled': self.translate_entry() else: raise AssertionError,'illegal [%s] list type' % self.name if etag: writer.write(etag) if self.type == 'callout': calloutmap.validate(self.listindex) calloutmap.listclose() lists.open.pop() if len(lists.open): document.attributes['listindex'] = str(lists.open[-1].listindex) class Lists(AbstractBlocks): """List of List objects.""" BLOCK_TYPE = List PREFIX = 'listdef-' def __init__(self): AbstractBlocks.__init__(self) self.open = [] # A stack of the current and parent lists. self.listblock = None # Current list is in list block. def load(self,sections): AbstractBlocks.load(self,sections) def validate(self): AbstractBlocks.validate(self) for b in self.blocks: # Check list has valid type. if not b.type in b.TYPES: raise EAsciiDoc,'[%s] illegal type' % b.name # Check all list tags. if not b.listtag or not config.tags.has_key(b.listtag): warning('[%s] missing listtag' % b.name) if not b.itemtag or not config.tags.has_key(b.itemtag): warning('[%s] missing tag itemtag' % b.name) if not b.texttag or not config.tags.has_key(b.texttag): warning('[%s] missing tag texttag' % b.name) if b.type == 'labeled': if not b.entrytag or not config.tags.has_key(b.entrytag): warning('[%s] missing entrytag' % b.name) if not b.labeltag or not config.tags.has_key(b.labeltag): warning('[%s] missing labeltag' % b.name) class DelimitedBlock(AbstractBlock): def __init__(self): AbstractBlock.__init__(self) self.CONF_ENTRIES += ('delimiter','template','filter') self.OPTIONS = ('skip','sectionbody','list') self.start = None # File reader cursor at start delimiter. def load(self,name,entries): AbstractBlock.load(self,name,entries) def dump(self): AbstractBlock.dump(self) write = lambda s: sys.stdout.write('%s%s' % (s,writer.newline)) write('') def isnext(self): return AbstractBlock.isnext(self) def translate(self): AbstractBlock.translate(self) if 'list' in self.options: lists.listblock = self reader.read() # Discard delimiter. self.start = reader.cursor[:] attrs = {} # Leave list block attributes for the list element. if lists.listblock is not self: BlockTitle.consume(attrs) AttributeList.consume(attrs) self.merge_attributes(attrs) options = self.get_options() if safe() and self.name == 'blockdef-backend': unsafe_error('Backend Block') # Discard block body. reader.read_until(self.delimiter,same_file=True) elif 'skip' in options: # Discard block body. reader.read_until(self.delimiter,same_file=True) else: template = self.get_template() stag,etag = config.section2tags(template,self.attributes) if 'sectionbody' in options or 'list' in options: # The body is treated like a SimpleSection. writer.write(stag) Section.translate_body(self) writer.write(etag) else: body = reader.read_until(self.delimiter,same_file=True) presubs,postsubs = self.get_subs() body = Lex.subs(body,presubs) if self.get_filter(): body = filter_lines(self.get_filter(),body,self.attributes) body = Lex.subs(body,postsubs) # Write start tag, content, end tag. writer.write(dovetail_tags(stag,body,etag)) if 'list' in options: lists.listblock = None if reader.eof(): error('missing %s block closing delimiter' % self.name.split('-')[-1], cursor=self.start) else: delimiter = reader.read() # Discard delimiter line. assert re.match(self.delimiter,delimiter) class DelimitedBlocks(AbstractBlocks): """List of delimited blocks.""" BLOCK_TYPE = DelimitedBlock PREFIX = 'blockdef-' def __init__(self): AbstractBlocks.__init__(self) def load(self,sections): """Update blocks defined in 'sections' dictionary.""" AbstractBlocks.load(self,sections) def validate(self): AbstractBlocks.validate(self) class Column: """Table column.""" def __init__(self): self.colalign = None # 'left','right','center' self.rulerwidth = None self.colwidth = None # Output width in page units. class Table(AbstractBlock): COL_STOP = r"(`|'|\.)" # RE. ALIGNMENTS = {'`':'left', "'":'right', '.':'center'} FORMATS = ('fixed','csv','dsv') def __init__(self): AbstractBlock.__init__(self) self.CONF_ENTRIES += ('template','fillchar','format','colspec', 'headrow','footrow','bodyrow','headdata', 'footdata', 'bodydata') # Configuration parameters. self.fillchar=None self.format=None # 'fixed','csv','dsv' self.colspec=None self.headrow=None self.footrow=None self.bodyrow=None self.headdata=None self.footdata=None self.bodydata=None # Calculated parameters. self.underline=None # RE matching current table underline. self.isnumeric=False # True if numeric ruler. self.tablewidth=None # Optional table width scale factor. self.columns=[] # List of Columns. # Other. self.check_msg='' # Message set by previous self.validate() call. def load(self,name,entries): AbstractBlock.load(self,name,entries) """Update table definition from section entries in 'entries'.""" for k,v in entries.items(): if k == 'fillchar': if v and len(v) == 1: self.fillchar = v else: raise EAsciiDoc,'malformed table fillchar: %s' % v elif k == 'format': if v in Table.FORMATS: self.format = v else: raise EAsciiDoc,'illegal table format: %s' % v elif k == 'colspec': self.colspec = v elif k == 'headrow': self.headrow = v elif k == 'footrow': self.footrow = v elif k == 'bodyrow': self.bodyrow = v elif k == 'headdata': self.headdata = v elif k == 'footdata': self.footdata = v elif k == 'bodydata': self.bodydata = v def dump(self): AbstractBlock.dump(self) write = lambda s: sys.stdout.write('%s%s' % (s,writer.newline)) write('fillchar='+self.fillchar) write('format='+self.format) if self.colspec: write('colspec='+self.colspec) if self.headrow: write('headrow='+self.headrow) if self.footrow: write('footrow='+self.footrow) write('bodyrow='+self.bodyrow) if self.headdata: write('headdata='+self.headdata) if self.footdata: write('footdata='+self.footdata) write('bodydata='+self.bodydata) write('') def validate(self): AbstractBlock.validate(self) """Check table definition and set self.check_msg if invalid else set self.check_msg to blank string.""" # Check global table parameters. if config.textwidth is None: self.check_msg = 'missing [miscellaneous] textwidth entry' elif config.pagewidth is None: self.check_msg = 'missing [miscellaneous] pagewidth entry' elif config.pageunits is None: self.check_msg = 'missing [miscellaneous] pageunits entry' elif self.headrow is None: self.check_msg = 'missing headrow entry' elif self.footrow is None: self.check_msg = 'missing footrow entry' elif self.bodyrow is None: self.check_msg = 'missing bodyrow entry' elif self.headdata is None: self.check_msg = 'missing headdata entry' elif self.footdata is None: self.check_msg = 'missing footdata entry' elif self.bodydata is None: self.check_msg = 'missing bodydata entry' else: # No errors. self.check_msg = '' def isnext(self): return AbstractBlock.isnext(self) def parse_ruler(self,ruler): """Parse ruler calculating underline and ruler column widths.""" fc = re.escape(self.fillchar) # Strip and save optional tablewidth from end of ruler. mo = re.match(r'^(.*'+fc+r'+)([\d\.]+)$',ruler) if mo: ruler = mo.group(1) self.tablewidth = float(mo.group(2)) self.attributes['tablewidth'] = str(float(self.tablewidth)) else: self.tablewidth = None self.attributes['tablewidth'] = '100.0' # Guess whether column widths are specified numerically or not. if ruler[1] != self.fillchar: # If the first column does not start with a fillchar then numeric. self.isnumeric = True elif ruler[1:] == self.fillchar*len(ruler[1:]): # The case of one column followed by fillchars is numeric. self.isnumeric = True else: self.isnumeric = False # Underlines must be 3 or more fillchars. self.underline = r'^' + fc + r'{3,}$' splits = re.split(self.COL_STOP,ruler)[1:] # Build self.columns. for i in range(0,len(splits),2): c = Column() c.colalign = self.ALIGNMENTS[splits[i]] s = splits[i+1] if self.isnumeric: # Strip trailing fillchars. s = re.sub(fc+r'+$','',s) if s == '': c.rulerwidth = None else: c.rulerwidth = int(validate(s,'int($)>0', 'malformed ruler: bad width')) else: # Calculate column width from inter-fillchar intervals. if not re.match(r'^'+fc+r'+$',s): raise EAsciiDoc,'malformed ruler: illegal fillchars' c.rulerwidth = len(s)+1 self.columns.append(c) # Fill in unspecified ruler widths. if self.isnumeric: if self.columns[0].rulerwidth is None: prevwidth = 1 for c in self.columns: if c.rulerwidth is None: c.rulerwidth = prevwidth prevwidth = c.rulerwidth def build_colspecs(self): """Generate colwidths and colspecs. This can only be done after the table arguments have been parsed since we use the table format.""" self.attributes['cols'] = len(self.columns) # Calculate total ruler width. totalwidth = 0 for c in self.columns: totalwidth = totalwidth + c.rulerwidth if totalwidth <= 0: raise EAsciiDoc,'zero width table' # Calculate marked up colwidths from rulerwidths. for c in self.columns: # Convert ruler width to output page width. width = float(c.rulerwidth) if self.format == 'fixed': if self.tablewidth is None: # Size proportional to ruler width. colfraction = width/config.textwidth else: # Size proportional to page width. colfraction = width/totalwidth else: # Size proportional to page width. colfraction = width/totalwidth c.colwidth = colfraction * config.pagewidth # To page units. if self.tablewidth is not None: c.colwidth = c.colwidth * self.tablewidth # Scale factor. if self.tablewidth > 1: c.colwidth = c.colwidth/100 # tablewidth is in percent. # Build colspecs. if self.colspec: cols = [] i = 0 for c in self.columns: i += 1 self.attributes['colalign'] = c.colalign self.attributes['colwidth'] = str(int(c.colwidth)) self.attributes['colnumber'] = str(i + 1) s = subs_attrs(self.colspec,self.attributes) if not s: warning('colspec dropped: contains undefined attribute') else: cols.append(s) self.attributes['colspecs'] = writer.newline.join(cols) def split_rows(self,rows): """Return a two item tuple containing a list of lines up to but not including the next underline (continued lines are joined ) and the tuple of all lines after the underline.""" reo = re.compile(self.underline) i = 0 while not reo.match(rows[i]): i = i+1 if i == 0: raise EAsciiDoc,'missing table rows' if i >= len(rows): raise EAsciiDoc,'closing [%s] underline expected' % self.name return (join_lines(rows[:i]), rows[i+1:]) def parse_rows(self, rows, rtag, dtag): """Parse rows list using the row and data tags. Returns a substituted list of output lines.""" result = [] # Source rows are parsed as single block, rather than line by line, to # allow the CSV reader to handle multi-line rows. if self.format == 'fixed': rows = self.parse_fixed(rows) elif self.format == 'csv': rows = self.parse_csv(rows) elif self.format == 'dsv': rows = self.parse_dsv(rows) else: assert True,'illegal table format' # Substitute and indent all data in all rows. stag,etag = subs_tag(rtag,self.attributes) for row in rows: result.append(' '+stag) for data in self.subs_row(row,dtag): result.append(' '+data) result.append(' '+etag) return result def subs_row(self, data, dtag): """Substitute the list of source row data elements using the data tag. Returns a substituted list of output table data items.""" result = [] if len(data) < len(self.columns): warning('fewer row data items then table columns') if len(data) > len(self.columns): warning('more row data items than table columns') for i in range(len(self.columns)): if i > len(data) - 1: d = '' # Fill missing column data with blanks. else: d = data[i] c = self.columns[i] self.attributes['colalign'] = c.colalign self.attributes['colwidth'] = str(int(c.colwidth)) self.attributes['colnumber'] = str(i + 1) stag,etag = subs_tag(dtag,self.attributes) # Insert AsciiDoc line break (' +') where row data has newlines # ('\n'). This is really only useful when the table format is csv # and the output markup is HTML. It's also a bit dubious in that it # assumes the user has not modified the shipped line break pattern. subs = self.get_subs()[0] if 'replacements' in subs: # Insert line breaks in cell data. d = re.sub(r'(?m)\n',r' +\n',d) d = d.split('\n') # So writer.newline is written. else: d = [d] result = result + [stag] + Lex.subs(d,subs) + [etag] return result def parse_fixed(self,rows): """Parse the list of source table rows. Each row item in the returned list contains a list of cell data elements.""" result = [] for row in rows: data = [] start = 0 # build an encoded representation row = char_decode(row) for c in self.columns: end = start + c.rulerwidth if c is self.columns[-1]: # Text in last column can continue forever. # Use the encoded string to slice, but convert back # to plain string before further processing data.append(char_encode(row[start:]).strip()) else: data.append(char_encode(row[start:end]).strip()) start = end result.append(data) return result def parse_csv(self,rows): """Parse the list of source table rows. Each row item in the returned list contains a list of cell data elements.""" import StringIO import csv result = [] rdr = csv.reader(StringIO.StringIO('\r\n'.join(rows)), skipinitialspace=True) try: for row in rdr: result.append(row) except: raise EAsciiDoc,'csv parse error: %s' % row return result def parse_dsv(self,rows): """Parse the list of source table rows. Each row item in the returned list contains a list of cell data elements.""" separator = self.attributes.get('separator',':') separator = eval('"'+separator+'"') if len(separator) != 1: raise EAsciiDoc,'malformed dsv separator: %s' % separator # TODO If separator is preceeded by an odd number of backslashes then # it is escaped and should not delimit. result = [] for row in rows: # Skip blank lines if row == '': continue # Unescape escaped characters. row = eval('"'+row.replace('"','\\"')+'"') data = row.split(separator) data = [s.strip() for s in data] result.append(data) return result def translate(self): AbstractBlock.translate(self) # Reset instance specific properties. self.underline = None self.columns = [] attrs = {} BlockTitle.consume(attrs) # Add relevant globals to table substitutions. attrs['pagewidth'] = str(config.pagewidth) attrs['pageunits'] = config.pageunits # Mix in document attribute list. AttributeList.consume(attrs) # Validate overridable attributes. for k,v in attrs.items(): if k == 'format': if v not in self.FORMATS: raise EAsciiDoc, 'illegal [%s] %s: %s' % (self.name,k,v) self.format = v elif k == 'tablewidth': try: self.tablewidth = float(attrs['tablewidth']) except: raise EAsciiDoc, 'illegal [%s] %s: %s' % (self.name,k,v) self.merge_attributes(attrs) # Parse table ruler. ruler = reader.read() assert re.match(self.delimiter,ruler) self.parse_ruler(ruler) # Read the entire table. table = [] while True: line = reader.read_next() # Table terminated by underline followed by a blank line or EOF. if len(table) > 0 and re.match(self.underline,table[-1]): if line in ('',None): break; if line is None: raise EAsciiDoc,'closing [%s] underline expected' % self.name table.append(reader.read()) # EXPERIMENTAL: The number of lines in the table, requested by Benjamin Klum. self.attributes['rows'] = str(len(table)) #TODO: Inherited validate() doesn't set check_msg, needs checking. if self.check_msg: # Skip if table definition was marked invalid. warning('skipping %s table: %s' % (self.name,self.check_msg)) return # Generate colwidths and colspecs. self.build_colspecs() # Generate headrows, footrows, bodyrows. # Headrow, footrow and bodyrow data replaces same named attributes in # the table markup template. In order to ensure this data does not get # a second attribute substitution (which would interfere with any # already substituted inline passthroughs) unique placeholders are used # (the tab character does not appear elsewhere since it is expanded on # input) which are replaced after template attribute substitution. headrows = footrows = [] bodyrows,table = self.split_rows(table) if table: headrows = bodyrows bodyrows,table = self.split_rows(table) if table: footrows,table = self.split_rows(table) if headrows: headrows = self.parse_rows(headrows, self.headrow, self.headdata) headrows = writer.newline.join(headrows) self.attributes['headrows'] = '\theadrows\t' if footrows: footrows = self.parse_rows(footrows, self.footrow, self.footdata) footrows = writer.newline.join(footrows) self.attributes['footrows'] = '\tfootrows\t' bodyrows = self.parse_rows(bodyrows, self.bodyrow, self.bodydata) bodyrows = writer.newline.join(bodyrows) self.attributes['bodyrows'] = '\tbodyrows\t' table = subs_attrs(config.sections[self.template],self.attributes) table = writer.newline.join(table) # Before we finish replace the table head, foot and body place holders # with the real data. if headrows: table = table.replace('\theadrows\t', headrows, 1) if footrows: table = table.replace('\tfootrows\t', footrows, 1) table = table.replace('\tbodyrows\t', bodyrows, 1) writer.write(table) class Tables(AbstractBlocks): """List of tables.""" BLOCK_TYPE = Table PREFIX = 'tabledef-' def __init__(self): AbstractBlocks.__init__(self) def load(self,sections): AbstractBlocks.load(self,sections) """Update tables defined in 'sections' dictionary.""" def validate(self): # Does not call AbstractBlocks.validate(). # Check we have a default table definition, for i in range(len(self.blocks)): if self.blocks[i].name == 'tabledef-default': default = self.blocks[i] break else: raise EAsciiDoc,'missing [table-default] section' # Set default table defaults. if default.format is None: default.subs = 'fixed' # Propagate defaults to unspecified table parameters. for b in self.blocks: if b is not default: if b.fillchar is None: b.fillchar = default.fillchar if b.format is None: b.format = default.format if b.template is None: b.template = default.template if b.colspec is None: b.colspec = default.colspec if b.headrow is None: b.headrow = default.headrow if b.footrow is None: b.footrow = default.footrow if b.bodyrow is None: b.bodyrow = default.bodyrow if b.headdata is None: b.headdata = default.headdata if b.footdata is None: b.footdata = default.footdata if b.bodydata is None: b.bodydata = default.bodydata # Check all tables have valid fill character. for b in self.blocks: if not b.fillchar or len(b.fillchar) != 1: raise EAsciiDoc,'[%s] missing or illegal fillchar' % b.name # Build combined tables delimiter patterns and assign defaults. delimiters = [] for b in self.blocks: # Ruler is: # (ColStop,(ColWidth,FillChar+)?)+, FillChar+, TableWidth? b.delimiter = r'^(' + Table.COL_STOP \ + r'(\d*|' + re.escape(b.fillchar) + r'*)' \ + r')+' \ + re.escape(b.fillchar) + r'+' \ + '([\d\.]*)$' delimiters.append(b.delimiter) if not b.headrow: b.headrow = b.bodyrow if not b.footrow: b.footrow = b.bodyrow if not b.headdata: b.headdata = b.bodydata if not b.footdata: b.footdata = b.bodydata self.delimiter = join_regexp(delimiters) # Check table definitions are valid. for b in self.blocks: b.validate() if config.verbose: if b.check_msg: warning('[%s] table definition: %s' % (b.name,b.check_msg)) class Macros: # Default system macro syntax. SYS_DEFAULT = r'(?u)^(?P<name>\w(\w|-)*?)::(?P<target>\S*?)' + \ r'(\[(?P<attrlist>.*?)\])$' def __init__(self): self.macros = [] # List of Macros. self.current = None # The last matched block macro. # Initialize default system macro. m = Macro() m.pattern = self.SYS_DEFAULT m.prefix = '+' m.reo = re.compile(m.pattern) self.macros.append(m) def load(self,entries): for entry in entries: m = Macro() m.load(entry) if m.name is None: # Delete undefined macro. for i in range(len(self.macros)-1,-1,-1): if self.macros[i].pattern == m.pattern: del self.macros[i] else: # Check for duplicates. for m2 in self.macros: if m.equals(m2): verbose('macro redefinition: %s%s' % (m.prefix,m.name)) break else: self.macros.append(m) def dump(self): write = lambda s: sys.stdout.write('%s%s' % (s,writer.newline)) write('[macros]') # Dump all macros except the first (built-in system) macro. for m in self.macros[1:]: write('%s=%s%s' % (m.pattern,m.prefix,m.name)) write('') def validate(self): # Check all named sections exist. if config.verbose: for m in self.macros: if m.name and m.prefix != '+': m.section_name() def subs(self,text,prefix='',callouts=False): # If callouts is True then only callout macros are processed, if False # then all non-callout macros are processed. result = text for m in self.macros: if m.prefix == prefix: if callouts ^ (m.name != 'callout'): result = m.subs(result) return result def isnext(self): """Return matching macro if block macro is next on reader.""" reader.skip_blank_lines() line = reader.read_next() if line: for m in self.macros: if m.prefix == '#': if m.reo.match(line): self.current = m return m return False def match(self,prefix,name,text): """Return re match object matching 'text' with macro type 'prefix', macro name 'name'.""" for m in self.macros: if m.prefix == prefix: mo = m.reo.match(text) if mo: if m.name == name: return mo if re.match(name,mo.group('name')): return mo return None # Macro set just prior to calling _subs_macro(). Ugly but there's no way # to pass optional arguments with _subs_macro(). _macro = None def _subs_macro(mo): """Function called to perform inline macro substitution. Uses matched macro regular expression object and returns string containing the substituted macro body. Called by Macros().subs().""" # Check if macro reference is escaped. if mo.group()[0] == '\\': return mo.group()[1:] # Strip leading backslash. d = mo.groupdict() # Delete groups that didn't participate in match. for k,v in d.items(): if v is None: del d[k] if _macro.name: name = _macro.name else: if not d.has_key('name'): warning('missing macro name group: %s' % mo.re.pattern) return '' name = d['name'] section_name = _macro.section_name(name) if not section_name: return '' # If we're dealing with a block macro get optional block ID and block title. if _macro.prefix == '#': AttributeList.consume(d) BlockTitle.consume(d) # Parse macro attributes. if d.has_key('attrlist'): if d['attrlist'] in (None,''): del d['attrlist'] else: parse_attributes(d['attrlist'],d) if name == 'callout': listindex =int(d['index']) d['coid'] = calloutmap.add(listindex) # Unescape special characters in LaTeX target file names. if document.backend == 'latex' and d.has_key('target') and d['target']: if not d.has_key('0'): d['0'] = d['target'] d['target']= config.subs_specialchars_reverse(d['target']) # BUG: We've already done attribute substitution on the macro which means # that any escaped attribute references are now unescaped and will be # substituted by config.subs_section() below. As a partial fix have withheld # {0} from substitution but this kludge doesn't fix it for other attributes # containing unescaped references. a0 = d.get('0') if a0: d['0'] = chr(0) # Replace temporarily with unused character. body = config.subs_section(section_name,d) if len(body) == 0: result = '' elif len(body) == 1: result = body[0] else: if _macro.prefix == '#': result = writer.newline.join(body) else: # Internally processed inline macros use UNIX line separator. result = '\n'.join(body) if a0: result = result.replace(chr(0), a0) return result class Macro: def __init__(self): self.pattern = None # Matching regular expression. self.name = '' # Conf file macro name (None if implicit). self.prefix = '' # '' if inline, '+' if system, '#' if block. self.reo = None # Compiled pattern re object. def section_name(self,name=None): """Return macro markup template section name based on macro name and prefix. Return None section not found.""" assert self.prefix != '+' if not name: assert self.name name = self.name if self.prefix == '#': suffix = '-blockmacro' else: suffix = '-inlinemacro' if config.sections.has_key(name+suffix): return name+suffix else: warning('missing macro section: [%s]' % name+suffix) return None def equals(self,m): if self.pattern != m.pattern: return False if self.name != m.name: return False if self.prefix != m.prefix: return False return True def load(self,entry): e = parse_entry(entry) if not e: raise EAsciiDoc,'malformed macro entry: %s' % entry if not is_regexp(e[0]): raise EAsciiDoc,'illegal %s macro regular expression: %s' \ % (e[1],e[0]) self.pattern, self.name = e self.reo = re.compile(self.pattern) if self.name: if self.name[0] in ('+','#'): self.prefix, self.name = self.name[0], self.name[1:] if self.name and not is_name(self.name): raise EAsciiDoc,'illegal section name in macro entry: %s' % entry def subs(self,text): global _macro _macro = self # Pass the macro to _subs_macro(). return self.reo.sub(_subs_macro,text) def translate(self): """ Block macro translation.""" assert self.prefix == '#' s = reader.read() s = subs_attrs(s) # Substitute global attributes. if s: s = self.subs(s) if s: writer.write(s) class CalloutMap: def __init__(self): self.comap = {} # key = list index, value = callouts list. self.calloutindex = 0 # Current callout index number. self.listnumber = 1 # Current callout list number. def listclose(self): # Called when callout list is closed. self.listnumber += 1 self.calloutindex = 0 self.comap = {} def add(self,listindex): # Add next callout index to listindex map entry. Return the callout id. self.calloutindex += 1 # Append the coindex to a list in the comap dictionary. if not self.comap.has_key(listindex): self.comap[listindex] = [self.calloutindex] else: self.comap[listindex].append(self.calloutindex) return self.calloutid(self.listnumber, self.calloutindex) def calloutid(listnumber,calloutindex): return 'CO%d-%d' % (listnumber,calloutindex) calloutid = staticmethod(calloutid) def calloutids(self,listindex): # Retieve list of callout indexes that refer to listindex. if self.comap.has_key(listindex): result = '' for coindex in self.comap[listindex]: result += ' ' + self.calloutid(self.listnumber,coindex) return result.strip() else: error('no callouts refer to list item '+str(listindex)) return '' def validate(self,maxlistindex): # Check that all list indexes referenced by callouts exist. for listindex in self.comap.keys(): if listindex > maxlistindex: warning('callout refers to non-existent list item ' + str(listindex)) #--------------------------------------------------------------------------- # Input stream Reader and output stream writer classes. #--------------------------------------------------------------------------- class Reader1: """Line oriented AsciiDoc input file reader. Processes include and conditional inclusion system macros. Tabs are expanded and lines are right trimmed.""" # This class is not used directly, use Reader class instead. READ_BUFFER_MIN = 10 # Read buffer low level. def __init__(self): self.f = None # Input file object. self.fname = None # Input file name. self.next = [] # Read ahead buffer containing # [filename,linenumber,linetext] lists. self.cursor = None # Last read() [filename,linenumber,linetext]. self.tabsize = 8 # Tab expansion number of spaces. self.parent = None # Included reader's parent reader. self._lineno = 0 # The last line read from file object f. self.include_depth = 0 # Current include depth. self.include_max = 5 # Maxiumum allowed include depth. def open(self,fname): self.fname = fname verbose('reading: '+fname) if fname == '<stdin>': self.f = sys.stdin else: self.f = open(fname,'rb') self._lineno = 0 # The last line read from file object f. self.next = [] # Prefill buffer by reading the first line and then pushing it back. if Reader1.read(self): self.unread(self.cursor) self.cursor = None def closefile(self): """Used by class methods to close nested include files.""" self.f.close() self.next = [] def close(self): self.closefile() self.__init__() def read(self, skip=False): """Read next line. Return None if EOF. Expand tabs. Strip trailing white space. Maintain self.next read ahead buffer. If skip=True then conditional exclusion is active (ifdef and ifndef macros).""" # Top up buffer. if len(self.next) <= self.READ_BUFFER_MIN: s = self.f.readline() if s: self._lineno = self._lineno + 1 while s: if self.tabsize != 0: s = s.expandtabs(self.tabsize) s = s.rstrip() self.next.append([self.fname,self._lineno,s]) if len(self.next) > self.READ_BUFFER_MIN: break s = self.f.readline() if s: self._lineno = self._lineno + 1 # Return first (oldest) buffer entry. if len(self.next) > 0: self.cursor = self.next[0] del self.next[0] result = self.cursor[2] # Check for include macro. mo = macros.match('+',r'include[1]?',result) if mo and not skip: # Perform attribute substitution on inlcude macro file name. fname = subs_attrs(mo.group('target')) if not fname: return Reader1.read(self) # Return next input line. if self.include_depth >= self.include_max: raise EAsciiDoc,'maxiumum inlcude depth exceeded' if self.fname != '<stdin>': fname = os.path.expandvars(os.path.expanduser(fname)) fname = safe_filename(fname, os.path.dirname(self.fname)) if not fname: return Reader1.read(self) # Return next input line. if mo.group('name') == 'include1': if not config.dumping: # Store the include file in memory for later # retrieval by the {include1:} system attribute. config.include1[fname] = \ [s.rstrip() for s in open(fname)] return '{include1:%s}' % fname else: # This is a configuration dump, just pass the macro # call through. return result # Parse include macro attributes. attrs = {} parse_attributes(mo.group('attrlist'),attrs) # Clone self and set as parent (self assumes the role of child). parent = Reader1() assign(parent,self) self.parent = parent if attrs.has_key('tabsize'): self.tabsize = int(validate(attrs['tabsize'],'int($)>=0', \ 'illegal include macro tabsize argument')) self.open(fname) self.include_depth = self.include_depth + 1 result = Reader1.read(self) else: if not Reader1.eof(self): result = Reader1.read(self) else: result = None return result def eof(self): """Returns True if all lines have been read.""" if len(self.next) == 0: # End of current file. if self.parent: self.closefile() assign(self,self.parent) # Restore parent reader. return Reader1.eof(self) else: return True else: return False def read_next(self): """Like read() but does not advance file pointer.""" if Reader1.eof(self): return None else: return self.next[0][2] def unread(self,cursor): """Push the line (filename,linenumber,linetext) tuple back into the read buffer. Note that it's up to the caller to restore the previous cursor.""" assert cursor self.next.insert(0,cursor) class Reader(Reader1): """ Wraps (well, sought of) Reader1 class and implements conditional text inclusion.""" def __init__(self): Reader1.__init__(self) self.depth = 0 # if nesting depth. self.skip = False # true if we're skipping ifdef...endif. self.skipname = '' # Name of current endif macro target. self.skipto = -1 # The depth at which skipping is reenabled. def read_super(self): result = Reader1.read(self,self.skip) if result is None and self.skip: raise EAsciiDoc,'missing endif::%s[]' % self.skipname return result def read(self): result = self.read_super() if result is None: return None while self.skip: mo = macros.match('+',r'ifdef|ifndef|endif',result) if mo: name = mo.group('name') target = mo.group('target') if name == 'endif': self.depth = self.depth-1 if self.depth < 0: raise EAsciiDoc,'mismatched macro: %s' % result if self.depth == self.skipto: self.skip = False if target and self.skipname != target: raise EAsciiDoc,'mismatched macro: %s' % result else: # ifdef or ifndef. if not target: raise EAsciiDoc,'missing macro target: %s' % result self.depth = self.depth+1 result = self.read_super() if result is None: return None mo = macros.match('+',r'ifdef|ifndef|endif',result) if mo: name = mo.group('name') target = mo.group('target') if name == 'endif': self.depth = self.depth-1 else: # ifdef or ifndef. if not target: raise EAsciiDoc,'missing macro target: %s' % result defined = document.attributes.get(target) is not None if name == 'ifdef': self.skip = not defined else: # ifndef. self.skip = defined if self.skip: self.skipto = self.depth self.skipname = target self.depth = self.depth+1 result = self.read() if result: # Expand executable block macros. mo = macros.match('+',r'eval|sys|sys2',result) if mo: action = mo.group('name') cmd = mo.group('attrlist') s = system(action, cmd, is_macro=True) if s is not None: self.cursor[2] = s # So we don't re-evaluate. result = s return result def eof(self): return self.read_next() is None def read_next(self): save_cursor = self.cursor result = self.read() if result is not None: self.unread(self.cursor) self.cursor = save_cursor return result def read_all(self,fname): """Read all lines from file fname and return as list. Use like class method: Reader().read_all(fname)""" result = [] self.open(fname) try: while not self.eof(): result.append(self.read()) finally: self.close() return result def read_lines(self,count=1): """Return tuple containing count lines.""" result = [] i = 0 while i < count and not self.eof(): result.append(self.read()) return tuple(result) def read_ahead(self,count=1): """Same as read_lines() but does not advance the file pointer.""" result = [] putback = [] save_cursor = self.cursor try: i = 0 while i < count and not self.eof(): result.append(self.read()) putback.append(self.cursor) i = i+1 while putback: self.unread(putback.pop()) finally: self.cursor = save_cursor return tuple(result) def skip_blank_lines(self): reader.read_until(r'\s*\S+') def read_until(self,pattern,same_file=False): """Like read() but reads lines up to (but not including) the first line that matches the pattern regular expression. If same_file is True then the terminating pattern must occur in the file the was being read when the routine was called.""" if same_file: fname = self.cursor[0] result = [] reo = re.compile(pattern) while not self.eof(): save_cursor = self.cursor s = self.read() if (not same_file or fname == self.cursor[0]) and reo.match(s): self.unread(self.cursor) self.cursor = save_cursor break result.append(s) return tuple(result) # NOT USED -- part of unimplemented attempt a generalised line continuation. def read_continuation(self): """Like read() but treats trailing backslash as line continuation character.""" s = self.read() if s is None: return None result = '' while s is not None and len(s) > 0 and s[-1] == '\\': result = result + s[:-1] s = self.read() if s is not None: result = result + s return result # NOT USED -- part of unimplemented attempt a generalised line continuation. def read_next_continuation(self): """Like read_next() but treats trailing backslash as line continuation character.""" save_cursor = self.cursor result = self.read_continuation() if result is not None: self.unread(self.cursor) self.cursor = save_cursor return result class Writer: """Writes lines to output file.""" newline = '\r\n' # End of line terminator. f = None # Output file object. fname= None # Output file name. lines_out = 0 # Number of lines written. skip_blank_lines = False # If True don't output blank lines. def open(self,fname): self.fname = os.path.abspath(fname) verbose('writing: '+fname) if fname == '<stdout>': self.f = sys.stdout else: self.f = open(fname,'wb+') self.lines_out = 0 def close(self): if self.fname != '<stdout>': self.f.close() def write_line(self, line=None): if not (self.skip_blank_lines and (not line or not line.strip())): if line is not None: self.f.write(line + self.newline) else: self.f.write(self.newline) self.lines_out = self.lines_out + 1 def write(self,*args): """Iterates arguments, writes tuple and list arguments one line per element, else writes argument as single line. If no arguments writes blank line. If argument is None nothing is written. self.newline is appended to each line.""" if len(args) == 0: self.write_line() self.lines_out = self.lines_out + 1 else: for arg in args: if isinstance(arg,list) or isinstance(arg,tuple): for s in arg: self.write_line(s) elif arg is not None: self.write_line(arg) def write_tag(self,tagname,content,subs=None,d=None): """Write content enveloped by configuration file tag tagname. Substitutions specified in the 'subs' list are perform on the 'content'.""" if subs is None: subs = config.subsnormal stag,etag = config.tag(tagname,d) if stag: self.write(stag) if content: self.write(Lex.subs(content,subs)) if etag: self.write(etag) #--------------------------------------------------------------------------- # Configuration file processing. #--------------------------------------------------------------------------- def _subs_specialwords(mo): """Special word substitution function called by Config.subs_specialwords().""" word = mo.re.pattern # The special word. template = config.specialwords[word] # The corresponding markup template. if not config.sections.has_key(template): raise EAsciiDoc,'missing special word template [%s]' % template if mo.group()[0] == '\\': return mo.group()[1:] # Return escaped word. args = {} args['words'] = mo.group() # The full match string is argument 'words'. args.update(mo.groupdict()) # Add other named match groups to the arguments. # Delete groups that didn't participate in match. for k,v in args.items(): if v is None: del args[k] lines = subs_attrs(config.sections[template],args) if len(lines) == 0: result = '' elif len(lines) == 1: result = lines[0] else: result = writer.newline.join(lines) return result class Config: """Methods to process configuration files.""" # Predefined section name regexp's. SPECIAL_SECTIONS= ('tags','miscellaneous','attributes','specialcharacters', 'specialwords','macros','replacements','quotes','titles', r'paradef.+',r'listdef.+',r'blockdef.+',r'tabledef.*', 'replacements2') def __init__(self): self.sections = OrderedDict() # Keyed by section name containing # lists of section lines. # Command-line options. self.verbose = False self.header_footer = True # -s, --no-header-footer option. # [miscellaneous] section. self.tabsize = 8 self.textwidth = 70 self.newline = '\r\n' self.pagewidth = None self.pageunits = None self.outfilesuffix = '' self.subsnormal = SUBS_NORMAL self.subsverbatim = SUBS_VERBATIM self.tags = {} # Values contain (stag,etag) tuples. self.specialchars = {} # Values of special character substitutions. self.specialwords = {} # Name is special word pattern, value is macro. self.replacements = OrderedDict() # Key is find pattern, value is #replace pattern. self.replacements2 = OrderedDict() self.specialsections = {} # Name is special section name pattern, value # is corresponding section name. self.quotes = {} # Values contain corresponding tag name. self.fname = '' # Most recently loaded configuration file name. self.conf_attrs = {} # Glossary entries from conf files. self.cmd_attrs = {} # Attributes from command-line -a options. self.loaded = [] # Loaded conf files. self.include1 = {} # Holds include1::[] files for {include1:}. self.dumping = False # True if asciidoc -c option specified. def load(self,fname,dir=None): """Loads sections dictionary with sections from file fname. Existing sections are overlaid. Silently skips missing configuration files.""" if dir: fname = os.path.join(dir, fname) # Sliently skip missing configuration file. if not os.path.isfile(fname): return # Don't load conf files twice (local and application conf files are the # same if the source file is in the application directory). if os.path.realpath(fname) in self.loaded: return rdr = Reader() # Reader processes system macros. rdr.open(fname) self.fname = fname reo = re.compile(r'(?u)^\[(?P<section>[^\W\d][\w-]*)\]\s*$') sections = OrderedDict() section,contents = '',[] while not rdr.eof(): s = rdr.read() if s and s[0] == '#': # Skip comment lines. continue if s[:2] == '\\#': # Unescape lines starting with '#'. s = s[1:] s = s.rstrip() found = reo.findall(s) if found: if section: # Store previous section. if sections.has_key(section) \ and self.is_special_section(section): if ''.join(contents): # Merge special sections. sections[section] = sections[section] + contents else: print 'blank section' del sections[section] else: sections[section] = contents section = found[0].lower() contents = [] else: contents.append(s) if section and contents: # Store last section. if sections.has_key(section) \ and self.is_special_section(section): if ''.join(contents): # Merge special sections. sections[section] = sections[section] + contents else: del sections[section] else: sections[section] = contents rdr.close() # Delete blank lines from sections. for k in sections.keys(): for i in range(len(sections[k])-1,-1,-1): if not sections[k][i]: del sections[k][i] elif not self.is_special_section(k): break # Only trailing blanks from non-special sections. # Add/overwrite new sections. self.sections.update(sections) self.parse_tags() # Internally [miscellaneous] section entries are just attributes. d = {} parse_entries(sections.get('miscellaneous',()), d, unquote=True, allow_name_only=True) update_attrs(self.conf_attrs,d) d = {} parse_entries(sections.get('attributes',()), d, unquote=True, allow_name_only=True) update_attrs(self.conf_attrs,d) # Update document attributes so they are available immediately. document.init_attrs() d = {} parse_entries(sections.get('titles',()),d) Title.load(d) parse_entries(sections.get('specialcharacters',()),self.specialchars,escape_delimiter=False) parse_entries(sections.get('quotes',()),self.quotes) self.parse_specialwords() self.parse_replacements() self.parse_replacements('replacements2') self.parse_specialsections() paragraphs.load(sections) lists.load(sections) blocks.load(sections) tables.load(sections) macros.load(sections.get('macros',())) self.loaded.append(os.path.realpath(fname)) def load_all(self,dir): """Load the standard configuration files from directory 'dir'.""" self.load('asciidoc.conf',dir) conf = document.backend + '.conf' self.load(conf,dir) conf = document.backend + '-' + document.doctype + '.conf' self.load(conf,dir) lang = document.attributes.get('lang') if lang: conf = 'lang-' + lang + '.conf' self.load(conf,dir) # Load ./filters/*.conf files if they exist. filters = os.path.join(dir,'filters') if os.path.isdir(filters): for f in os.listdir(filters): if re.match(r'^.+\.conf$',f): self.load(f,filters) def load_miscellaneous(self,d): """Set miscellaneous configuration entries from dictionary 'd'.""" def set_misc(name,rule='True',intval=False): if d.has_key(name): errmsg = 'illegal [miscellaneous] %s entry' % name if intval: setattr(self, name, int(validate(d[name],rule,errmsg))) else: setattr(self, name, validate(d[name],rule,errmsg)) set_misc('tabsize','int($)>0',intval=True) set_misc('textwidth','int($)>0',intval=True) set_misc('pagewidth','int($)>0',intval=True) set_misc('pageunits') set_misc('outfilesuffix') if d.has_key('newline'): # Convert escape sequences to their character values. self.newline = eval('"'+d['newline']+'"') if d.has_key('subsnormal'): self.subsnormal = parse_options(d['subsnormal'],SUBS_OPTIONS, 'illegal [%s] %s: %s' % ('miscellaneous','subsnormal',d['subsnormal'])) if d.has_key('subsverbatim'): self.subsverbatim = parse_options(d['subsverbatim'],SUBS_OPTIONS, 'illegal [%s] %s: %s' % ('miscellaneous','subsverbatim',d['subsverbatim'])) def validate(self): """Check the configuration for internal consistancy. Called after all configuration files have been loaded.""" # Heuristic validate that at least one configuration file was loaded. if not self.specialchars or not self.tags or not lists: raise EAsciiDoc,'incomplete configuration files' # Check special characters are only one character long. for k in self.specialchars.keys(): if len(k) != 1: raise EAsciiDoc,'[specialcharacters] ' \ 'must be a single character: %s' % k # Check all special words have a corresponding inline macro body. for macro in self.specialwords.values(): if not is_name(macro): raise EAsciiDoc,'illegal special word name: %s' % macro if not self.sections.has_key(macro): warning('missing special word macro: [%s]' % macro) # Check all text quotes have a corresponding tag. for q in self.quotes.keys(): tag = self.quotes[q] if not tag: del self.quotes[q] # Undefine quote. else: if tag[0] == '#': tag = tag[1:] if not self.tags.has_key(tag): warning('[quotes] %s missing tag definition: %s' % (q,tag)) # Check all specialsections section names exist. for k,v in self.specialsections.items(): if not self.sections.has_key(v): warning('[%s] missing specialsections section' % v) paragraphs.validate() lists.validate() blocks.validate() tables.validate() macros.validate() def is_special_section(self,section_name): for name in self.SPECIAL_SECTIONS: if re.match(name,section_name): return True return False def dump(self): """Dump configuration to stdout.""" # Header. hdr = '' hdr = hdr + '#' + writer.newline hdr = hdr + '# Generated by AsciiDoc %s for %s %s.%s' % \ (VERSION,document.backend,document.doctype,writer.newline) t = time.asctime(time.localtime(time.time())) hdr = hdr + '# %s%s' % (t,writer.newline) hdr = hdr + '#' + writer.newline sys.stdout.write(hdr) # Dump special sections. # Dump only the configuration file and command-line attributes. # [miscellanous] entries are dumped as part of the [attributes]. d = {} d.update(self.conf_attrs) d.update(self.cmd_attrs) dump_section('attributes',d) Title.dump() dump_section('quotes',self.quotes) dump_section('specialcharacters',self.specialchars) d = {} for k,v in self.specialwords.items(): if d.has_key(v): d[v] = '%s "%s"' % (d[v],k) # Append word list. else: d[v] = '"%s"' % k dump_section('specialwords',d) dump_section('replacements',self.replacements) dump_section('replacements2',self.replacements2) dump_section('specialsections',self.specialsections) d = {} for k,v in self.tags.items(): d[k] = '%s|%s' % v dump_section('tags',d) paragraphs.dump() lists.dump() blocks.dump() tables.dump() macros.dump() # Dump remaining sections. for k in self.sections.keys(): if not self.is_special_section(k): sys.stdout.write('[%s]%s' % (k,writer.newline)) for line in self.sections[k]: sys.stdout.write('%s%s' % (line,writer.newline)) sys.stdout.write(writer.newline) def subs_section(self,section,d): """Section attribute substitution using attributes from document.attributes and 'd'. Lines containing undefinded attributes are deleted.""" if self.sections.has_key(section): return subs_attrs(self.sections[section],d) else: warning('missing [%s] section' % section) return () def parse_tags(self): """Parse [tags] section entries into self.tags dictionary.""" d = {} parse_entries(self.sections.get('tags',()),d) for k,v in d.items(): if v is None: if self.tags.has_key(k): del self.tags[k] elif v == 'none': self.tags[k] = (None,None) else: mo = re.match(r'(?P<stag>.*)\|(?P<etag>.*)',v) if mo: self.tags[k] = (mo.group('stag'), mo.group('etag')) else: raise EAsciiDoc,'[tag] %s value malformed' % k def tag(self, name, d=None): """Returns (starttag,endtag) tuple named name from configuration file [tags] section. Raise error if not found. If a dictionary 'd' is passed then merge with document attributes and perform attribute substitution on tags.""" # TODO: Tags should be stored a single string, not split into start # and end tags since most are going to be substituted anyway (see # subs_tag() for how we should process them. parse_tags() (above) # should only validate i.e. parse_check(). This routine should be renamed # split_tag() and would call subs_tag(). self.tags dictionary values # would be strings not tuples. if not self.tags.has_key(name): raise EAsciiDoc, 'missing tag: %s' % name stag,etag = self.tags[name] if d is not None: # TODO: Should we warn if substitution drops a tag? if stag: stag = subs_attrs(stag,d) if etag: etag = subs_attrs(etag,d) if stag is None: stag = '' if etag is None: etag = '' return (stag,etag) def parse_specialsections(self): """Parse specialsections section to self.specialsections dictionary.""" # TODO: This is virtually the same as parse_replacements() and should # be factored to single routine. d = {} parse_entries(self.sections.get('specialsections',()),d,unquote=True) for pat,sectname in d.items(): pat = strip_quotes(pat) if not is_regexp(pat): raise EAsciiDoc,'[specialsections] entry ' \ 'is not a valid regular expression: %s' % pat if sectname is None: if self.specialsections.has_key(pat): del self.specialsections[pat] else: self.specialsections[pat] = sectname def parse_replacements(self,sect='replacements'): """Parse replacements section into self.replacements dictionary.""" replacements = getattr(self,sect) d = OrderedDict() parse_entries(self.sections.get(sect,()), d, unquote=True) for pat,rep in d.items(): pat = strip_quotes(pat) if not is_regexp(pat): raise EAsciiDoc,'[%s] entry in %s is not a valid' \ ' regular expression: %s' % (sect,self.fname,pat) if rep is None: if replacements.has_key(pat): del replacements[pat] else: replacements[pat] = strip_quotes(rep) def subs_replacements(self,s,sect='replacements'): """Substitute patterns from self.replacements in 's'.""" result = s for pat,rep in getattr(self,sect).items(): result = re.sub(pat, rep, result) return result def parse_specialwords(self): """Parse special words section into self.specialwords dictionary.""" reo = re.compile(r'(?:\s|^)(".+?"|[^"\s]+)(?=\s|$)') for line in self.sections.get('specialwords',()): e = parse_entry(line) if not e: raise EAsciiDoc,'[specialwords] entry in %s is malformed: %s' \ % (self.fname,line) name,wordlist = e if not is_name(name): raise EAsciiDoc,'[specialwords] name in %s is illegal: %s' \ % (self.fname,name) if wordlist is None: # Undefine all words associated with 'name'. for k,v in self.specialwords.items(): if v == name: del self.specialwords[k] else: words = reo.findall(wordlist) for word in words: word = strip_quotes(word) if not is_regexp(word): raise EAsciiDoc,'[specialwords] entry in %s ' \ 'is not a valid regular expression: %s' \ % (self.fname,word) self.specialwords[word] = name def subs_specialchars(self,s): """Perform special character substitution on string 's'.""" """It may seem like a good idea to escape special characters with a '\' character, the reason we don't is because the escape character itself then has to be escaped and this makes including code listings problematic. Use the predefined {amp},{lt},{gt} attributes instead.""" result = '' for ch in s: result = result + self.specialchars.get(ch,ch) return result def subs_specialchars_reverse(self,s): """Perform reverse special character substitution on string 's'.""" result = s for k,v in self.specialchars.items(): result = result.replace(v, k) return result def subs_specialwords(self,s): """Search for word patterns from self.specialwords in 's' and substitute using corresponding macro.""" result = s for word in self.specialwords.keys(): result = re.sub(word, _subs_specialwords, result) return result def expand_templates(self,section): result = [] for line in self.sections[section]: mo = macros.match('+',r'template',line) if mo: s = mo.group('attrlist') if self.sections.has_key(s): result += self.sections[s] else: warning('missing [%s] section' % s) else: result.append(line) return result def expand_all_templates(self): for k in self.sections.keys(): self.sections[k] = self.expand_templates(k) def section2tags(self, section, d={}): """Perform attribute substitution on 'section' using document attributes plus 'd' attributes. Return tuple (stag,etag) containing pre and post | placeholder tags.""" assert section is not None if self.sections.has_key(section): body = self.sections[section] else: warning('missing [%s] section' % section) body = () # Split macro body into start and end tag lists. stag = [] etag = [] in_stag = True for s in body: if in_stag: mo = re.match(r'(?P<stag>.*)\|(?P<etag>.*)',s) if mo: if mo.group('stag'): stag.append(mo.group('stag')) if mo.group('etag'): etag.append(mo.group('etag')) in_stag = False else: stag.append(s) else: etag.append(s) # Do attribute substitution last so {brkbar} can be used to escape |. # But don't do attribute substitution on title -- we've already done it. title = d.get('title') if title: d['title'] = chr(0) # Replace with unused character. stag = subs_attrs(stag, d) etag = subs_attrs(etag, d) # Put the {title} back. if title: stag = map(lambda x: x.replace(chr(0), title), stag) etag = map(lambda x: x.replace(chr(0), title), etag) d['title'] = title return (stag,etag) #--------------------------------------------------------------------------- # Application code. #--------------------------------------------------------------------------- # Constants # --------- APP_DIR = None # This file's directory. USER_DIR = None # ~/.asciidoc CONF_DIR = '/etc/asciidoc' # Global configuration files directory. HELP_FILE = 'help.conf' # Default (English) help file. # Globals # ------- document = Document() # The document being processed. config = Config() # Configuration file reader. reader = Reader() # Input stream line reader. writer = Writer() # Output stream line writer. paragraphs = Paragraphs() # Paragraph definitions. lists = Lists() # List definitions. blocks = DelimitedBlocks() # DelimitedBlock definitions. tables = Tables() # Table definitions. macros = Macros() # Macro definitions. calloutmap = CalloutMap() # Coordinates callouts and callout list. def asciidoc(backend, doctype, confiles, infile, outfile, options): """Convert AsciiDoc document to DocBook document of type doctype The AsciiDoc document is read from file object src the translated DocBook file written to file object dst.""" try: if doctype not in ('article','manpage','book'): raise EAsciiDoc,'illegal document type' if backend == 'linuxdoc' and doctype != 'article': raise EAsciiDoc,'%s %s documents are not supported' \ % (backend,doctype) document.backend = backend if not os.path.exists(os.path.join(APP_DIR, backend+'.conf')) and not \ os.path.exists(os.path.join(CONF_DIR, backend+'.conf')): warning('non-standard %s backend' % backend, linenos=False) document.doctype = doctype document.infile = infile document.init_attrs() # Set processing options. for o in options: if o == '-c': config.dumping = True if o == '-s': config.header_footer = False if o == '-v': config.verbose = True # Check the infile exists. if infile != '<stdin>' and not os.path.isfile(infile): raise EAsciiDoc,'input file %s missing' % infile if '-e' not in options: # Load global configuration from system configuration directory. config.load_all(CONF_DIR) # Load global configuration files from asciidoc directory. config.load_all(APP_DIR) # Load configuration files from ~/.asciidoc if it exists. if USER_DIR is not None: config.load_all(USER_DIR) # Load configuration files from document directory. if infile != '<stdin>': config.load_all(os.path.dirname(infile)) if infile != '<stdin>': # Load implicit document specific configuration files if they exist. config.load(os.path.splitext(infile)[0] + '.conf') config.load(os.path.splitext(infile)[0] + '-' + backend + '.conf') # If user specified configuration file(s) overlay the defaults. if confiles: for conf in confiles: if os.path.isfile(conf): config.load(conf) else: raise EAsciiDoc,'configuration file %s missing' % conf document.init_attrs() # Add conf files. # Check configuration for consistency. config.validate() # Build outfile name now all conf files have been read. if outfile is None: outfile = os.path.splitext(infile)[0] + '.' + backend if config.outfilesuffix: # Change file extension. outfile = os.path.splitext(outfile)[0] + config.outfilesuffix document.outfile = outfile if config.dumping: config.dump() else: reader.tabsize = config.tabsize reader.open(infile) try: writer.newline = config.newline writer.open(outfile) try: document.init_attrs() # Add file name related entries. document.translate() finally: writer.close() finally: reader.closefile() # Keep reader state for postmortem. except (KeyboardInterrupt, SystemExit): print except Exception,e: # Cleanup. if outfile and outfile != '<stdout>' and os.path.isfile(outfile): os.unlink(outfile) # Build and print error description. msg = 'FAILED: ' if reader.cursor: msg = msg + '%s: line %d: ' % (reader.cursor[0],reader.cursor[1]) if isinstance(e,EAsciiDoc): print_stderr(msg+str(e)) else: print_stderr(msg+'unexpected error:') print_stderr('-'*60) traceback.print_exc(file=sys.stderr) print_stderr('-'*60) sys.exit(1) def usage(msg=''): if msg: print_stderr(msg) show_help('default', sys.stderr) def show_help(topic, stream=sys.stdout): """Print help topic to stdout.""" # Select help file. lang = config.cmd_attrs.get('lang') if lang and lang != 'en': help_file = 'help-' + lang + '.conf' else: help_file = HELP_FILE # Print [topic] section from help file. topics = OrderedDict() load_sections(topics, help_file, CONF_DIR) load_sections(topics, help_file, APP_DIR) if USER_DIR is not None: load_sections(topics, help_file, USER_DIR) if len(topics) == 0: # Default to English if specified language help files not found. help_file = HELP_FILE load_sections(topics, help_file, CONF_DIR) load_sections(topics, help_file, APP_DIR) if len(topics) == 0: print_stderr('no help topics found') sys.exit(1) n = 0 for k in topics.keys(): if re.match(re.escape(topic), k): n += 1 lines = topics[k] if n == 0: print_stderr('help topic not found: [%s] in %s' % (topic, help_file)) print_stderr('available help topics: %s' % ', '.join(topics.keys())) sys.exit(1) elif n > 1: print_stderr('ambiguous help topic: %s' % topic) else: for line in lines: print >>stream, line def main(): if float(sys.version[:3]) < 2.3: print_stderr('FAILED: Python 2.3 or better required.') sys.exit(1) # Locate the executable and configuration files directory. global APP_DIR,USER_DIR APP_DIR = os.path.dirname(os.path.realpath(sys.argv[0])) USER_DIR = os.environ.get('HOME') if USER_DIR is not None: USER_DIR = os.path.join(USER_DIR,'.asciidoc') if not os.path.isdir(USER_DIR): USER_DIR = None # Process command line options. import getopt try: #DEPRECATED: --safe option. opts,args = getopt.getopt(sys.argv[1:], 'a:b:cd:ef:hno:svw:', ['attribute=','backend=','conf-file=','doctype=','dump-conf', 'help','no-conf','no-header-footer','out-file=','profile', 'section-numbers','verbose','version','safe','unsafe']) except getopt.GetoptError: usage() sys.exit(1) if len(args) > 1: usage() sys.exit(1) backend = DEFAULT_BACKEND doctype = DEFAULT_DOCTYPE confiles = [] outfile = None options = [] prof = False help_option = False for o,v in opts: if o in ('--help','-h'): help_option = True if o == '--profile': prof = True if o == '--unsafe': document.safe = False if o == '--version': print('asciidoc %s' % VERSION) sys.exit(0) if o in ('-b','--backend'): backend = v if o in ('-c','--dump-conf'): options.append('-c') if o in ('-d','--doctype'): doctype = v if o in ('-e','--no-conf'): options.append('-e') if o in ('-f','--conf-file'): confiles.append(v) if o in ('-n','--section-numbers'): o = '-a' v = 'numbered' if o in ('-a','--attribute'): e = parse_entry(v, allow_name_only=True) if not e: usage('Illegal -a option: %s' % v) sys.exit(1) k,v = e # A @ suffix denotes don't override existing document attributes. if v and v[-1] == '@': document.attributes[k] = v[:-1] else: config.cmd_attrs[k] = v if o in ('-o','--out-file'): if v == '-': outfile = '<stdout>' else: outfile = v if o in ('-s','--no-header-footer'): options.append('-s') if o in ('-v','--verbose'): options.append('-v') if help_option: if len(args) == 0: show_help('default') else: show_help(args[-1]) sys.exit(0) if len(args) == 0 and len(opts) == 0: usage() sys.exit(1) if len(args) == 0: usage('No source file specified') sys.exit(1) if not backend: usage('No --backend option specified') sys.exit(1) if args[0] == '-': infile = '<stdin>' else: infile = args[0] if infile == '<stdin>' and not outfile: outfile = '<stdout>' # Convert in and out files to absolute paths. if infile != '<stdin>': infile = os.path.abspath(infile) if outfile and outfile != '<stdout>': outfile = os.path.abspath(outfile) # Do the work. if prof: import profile profile.run("asciidoc('%s','%s',(),'%s',None,())" % (backend,doctype,infile)) else: asciidoc(backend, doctype, confiles, infile, outfile, options) if document.has_errors: sys.exit(1) if __name__ == '__main__': try: main() except KeyboardInterrupt: pass except SystemExit: raise except: print_stderr('%s: unexpected error: %s' % (os.path.basename(sys.argv[0]), sys.exc_info()[1])) print_stderr('-'*60) traceback.print_exc(file=sys.stderr) print_stderr('-'*60) sys.exit(1) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������asciidoc-8.2.7/BUGS���������������������������������������������������������������������������������0000644�0001751�0001751�00000003223�11033404334�014132� 0����������������������������������������������������������������������������������������������������ustar �srackham������������������������srackham��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� Bugs and Known Problems version 8.2.7, 4 July 2008 __________________________________________________________________ 1. AsciiDoc * A benign warning with will become a reserved keyword in Python 2.6 sometimes occurs when using Python 2.5-- it's harmless and will disappear with Python 3. * The toc attribute will be ignored if it's set in a custom user or document configuration file. This is because the default configuration file containing the document [header] is sourced before custom configuration files and the toc attribute is processed using conditional inclusion macros. * The include1::[] block macro does not work inside ListingBlocks or FilterBlocks. Use include::[] instead. * Reported line numbers in diagnostic messages are sometimes wrong. * Embedding open brace characters { in argument values can cause incorrect argument substitution. * Attribute references in macro attribute lists can't be unescaped (with the exception of attribute list entry {0}). * Section numbering is incorrect when outputting HTML from a multi-part book type document. This is not a biggy since multi-part books are generally processed to DocBook. * A row of apostrophes in an inline context throws AsciiDoc into an endless loop. * Multiple comma separated command names in the manpage NAME section translate to a single DocBook refname instead of multiple refname elements. __________________________________________________________________ Version 8.2.7 Last updated 2008-07-04 23:26:21 NZDT �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������asciidoc-8.2.7/BUGS.txt�����������������������������������������������������������������������������0000644�0001751�0001751�00000002516�10774336736�015001� 0����������������������������������������������������������������������������������������������������ustar �srackham������������������������srackham���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Bugs and Known Problems ======================= AsciiDoc -------- - A benign warning 'with will become a reserved keyword in Python 2.6' sometimes occurs when using Python 2.5-- it's harmless and will disappear with Python 3. - The `toc` attribute will be ignored if it's set in a custom user or document configuration file. This is because the default configuration file containing the document `[header]` is sourced before custom configuration files and the `toc` attribute is processed using conditional inclusion macros. - The `\include1::[]` block macro does not work inside ListingBlocks or FilterBlocks. Use `\include::[]` instead. - Reported line numbers in diagnostic messages are sometimes wrong. - Embedding open brace characters `{` in argument values can cause incorrect argument substitution. - Attribute references in macro attribute lists can't be unescaped (with the exception of attribute list entry `\{0}`). - Section numbering is incorrect when outputting HTML from a multi-part book type document. This is not a biggy since multi-part books are generally processed to DocBook. - A row of apostrophes in an inline context throws AsciiDoc into an endless loop. - Multiple comma separated command names in the manpage NAME section translate to a single DocBook `refname` instead of multiple `refname` elements. ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������asciidoc-8.2.7/common.aap���������������������������������������������������������������������������0000644�0001751�0001751�00000000170�11032352251�015417� 0����������������������������������������������������������������������������������������������������ustar �srackham������������������������srackham���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Executed by all main.aap's before anything else. # _parent.VERS = 8.2.7 _parent.DATE = 4 July 2008 all: :pass ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������asciidoc-8.2.7/CHANGELOG����������������������������������������������������������������������������0000644�0001751�0001751�00000240042�11033404341�014661� 0����������������������������������������������������������������������������������������������������ustar �srackham������������������������srackham��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� AsciiDoc ChangeLog version 8.2.7, 4 July 2008 __________________________________________________________________ 1. Version 8.2.7 (2008-07-04) See the [1]AsciiDoc Mercurial repository for a full list of changes. Additions and changes * Added dvi, ps and tex output format options to a2x(1). * Added --dblatex option to a2x(1) so dblatex(1) can be used to generate PDFs. * Added custom dblatex(1) configuration files (in distribution ./dblatex directory) which are used by a2x(1). * dblatex(1) is now used to generate the distributed PDF version of the AsciiDoc User Guide. * If you don't need a customized the link caption you can enter the http, https, ftp, file URLs and email addresses without any special macro syntax -- you get the links by just cutting and pasting URLs and emails addresses. This also makes it easier to open links directly form AsciiDoc source ( most editors allow you to open URLs directly). The Vim syntax highlighter has been updated to reflect these changes. * Highlighted source code paragraphs have been implemented -- it's a much more convenient way to enter short code examples (see [2]the online docs). * The source highlighter and music filter syntax has changed -- they now used the ListingBlock syntax customized with source and music style attribute values. This follows the Paragraph styling convention introduced by the source paragraph (previous item) and is easier to read. The old syntax still works but has been deprecated. * QuoteBlocks now have a verse style -- you no longer have to nest a verse LiteralBlock inside a QuoteBlock for verses. The verse style on the LiteralBlock has been deprecated (still works though) and the style attribute is positional attribute 1, pushing attribution and citetitle attributes to the right (you'll need to insert a quote attribute into your existing QuoteBlocks). * It is no up to the DocBook processor to highlight source code syntax in <programlisting> elements rather than GNU Highlighter -- this is the correct way to handle it, plus dblatex(1) makes a much better job. * scaledwidth and align attributes have been added to the image macro. They apply to DocBook outputs (specifically for PDF documents). scaledwidth sets the image size as a percent of the available page width; align applies left, center or right horizontal image justification. * Added a2x(1) --fop-opts=FOP_OPTS option (patch submitted by Miklos Vajna). * Added a2x(1) --dblatex-opts=DBLATEX_OPTS option. * Added Mikhail Yakshin's FOP 0.95 patch which fixes a long-standing fo.xsl problem and allows PDF's to be generated with FOP 0.95 (previously had to use FOP 0.20.5). * The User Guide has been updated and outdated FOP configuration and installation sections removed. Bug fixes * Fixed stylesheets/xhtml11-manpage.css not being included when linkcss attribute was used. * Configuration file *-style attributes are now dumped correctly. * Fixed FAILED: malformed section entry LaTeX backend error. See the also the [3]AsciiDoc repository changelog. __________________________________________________________________ 2. Version 8.2.6 (2008-04-29) See the [4]AsciiDoc Mercurial repository for a full list of changes. Additions and changes * Enhancements to the Vim AsciiDoc syntax highlighter, for example, quoted text is now highlighted in titles and macro captions. * If you define the data-uri intrinsic attribute images referenced by image macros will be embedded in XHTML using the [5]data: URI scheme. NOTE: Microsoft browser support for the data: URI scheme is currently limited to MSIE 8 beta 1. * Added toc-title attribute to allow custom table of contents titles. * Added references to Alex Efros's AsciiDoc Cheatsheet to AsciiDoc website. * asciidoc(1) and a2x(1) man pages formatted to conform to man-pages(7) recommendations. * Old code-filter syntax (pre-8.1.0) is no longer recognized so that malformed two-line level 2 titles are no longer confused with code-filter block delimiters. * Added -> <- => <= arrow replacements from the Arrows block of Unicode. * Added DocBook refentry lang attribute -- patch contributed by VMiklos. * AttributeEntry names can now be numeric ("named macro targets"). * Hide Table of Contents title if Table of Contents empty -- patch contributed by Alex Efros. * Various XHTML CSS tweaks. * Code cleanup: + Replaced realpath() with Python 2.2 os.path.realpath() library function. + Replaced old string library functions with string methods. + Use file generators instead of readlines(). + Renamed entities that shadowed builtins. + Standardized string quoting. + Dropped readlines() function. Bug fixes * Fixed broken CSS for decimal ordered lists nested in alpha ordered list, thanks to Alex Efros. * A missing closing block delimiter now reports the opening delimiter line number instead of the end of file line number. * Fixed an error generated by the asciidoc -e option when there are no block definitions -- patch contributed by Alejandro Mery. * Handle both \r\n (as well as \n) line separators that may be returned by {sys} attribute evaluation. * Numbered attribute names no longer interfere with positional attribute list values. __________________________________________________________________ 3. Version 8.2.5 (2007-11-18) Bug fixes * Fixed exception thrown by illegal command-line arguments. * Rolled back the with warning bug fix introduced in 8.2.4 -- it was incompatible with Python <2.5. __________________________________________________________________ 4. Version 8.2.4 (2007-11-10) Additions and changes * You can now use the lang attribute to set the DocBook language attribute. * Attribute values can now contain attribute references. * If the lang attribute is defined then configuration files named like lang-<lang>.conf will be loaded automatically. * The help file name help-<lang>.conf is based on the AsciiDoc lang attribute, defaults to help.conf (English). * Admonition, figure and table captions have been factored into a predefined set of caption_* attributes. They only apply to directly generated (X)HTML outputs (DocBook stylesheets generate their own language specific captions based on the lang attribute). * Dropped platform dependent doc/asciidoc.chm file from distribution documentation formats. Bug fixes * The spurious warning with will become a reserved keyword in Python 2.6 has been suppressed. __________________________________________________________________ 5. Version 8.2.3 (2007-09-12) Additions and changes * Added VMiklos's permalink patch for auto-generated section IDs (enabled by default by the sectids attribute). * Added [6]FAQ to website. * Changed format of {localdate} attribute to ISO 8601 (%Y-%m-%d). * Added abc2ly --beams=None option to make music2png.py conform to ABC's notion of beams. * XHTML level 2 section headings are now styled with an underlining border. * XHTML links to AsciiDoc title elements are now implemented with title ID attributes (previously separate <a> element targets were generated. * Multi-word first, middle and last names can be entered in the header author line using the underscore as a word separator. * The nested inline macros restriction has now been lifted, for example you can now include links and inline images inside footnotes. * Help topic names can be shortened (so long as they are not ambiguous). For example asciidoc -hm will print the AsciiDoc man page. * Added {two_colons} and {two_semicolons} attributes for escaping labeled list ambiguity. * If quirks mode is disabled the XHTML Mime Type is set to the recommended application/xhtml+xml (rather than text/html). Bug fixes * Author information is now correctly set when using attribute entries in the header instead of an author line (previously the author attribute was not being calculated correctly and there were attribute substitution problems). __________________________________________________________________ 6. Version 8.2.2 (2007-07-22) Additions and changes * [7]LaTeXMathML capability has been added for users who are more familiar with or prefer LaTeX math formulas to the [8]ASCIIMathML notation (thanks to Arthur Sakellariou for the patch). * The source highlight and code filters now process embedded callouts. * Added an --attribute=ATTRIBUTE option to a2x(1) for passing attribute values to asciidoc(1) (a shortcut for --asciidoc-opts="-a ATTRIBUTE"). * Image block and inline macros prepend optional {imagesdir} attribute to image link targets. Bug fixes * Fixed an assertion error that occurred when a configuration file containing an include::[] macro was loaded using the --conf-file option and the configuration file name did not include an explicit directory path -- patch submitted by Dmitry Potapov. * Asciidoc titles are only converted to lower case if all characters are upper case otherwise case is left unchanged -- patch submitted by Dmitry Potapov. * Added a missing check that input is not stdin before loading configuration files from the document directory -- patch submitted by Dmitry Potapov. * Attribute list items must evaluate to strings, numbers or None (previously it was possible to evaluate to other object types which resulted in surprising attribute values). * If an AsciiDoc document has no title an empty XHTML 1.1 title element is created -- previously the title element was dropped which resulted in invalid XHTML 1.1. * The Vim syntax file no longer highlights escaped callouts. * The Vim syntax highlighter now correctly highlights Double-dollar passthroughs when they enclose dollar delimited ASCIIMathML and LaTeXMathML formulas. __________________________________________________________________ 7. Version 8.2.1 (2007-04-06) Additions and changes * A number of improvements have been made to the Vim syntax highlighter, for example the word C++ is no longer mistaken for the start of an unconstrained monospace quote. * Labeled list definitions have been tightened -- a list label can no longer containing trailing spaces. The following example is no longer recognized as a valid list label: Lorum ipsum :: This change implements the originally intended behavior (as per the AsciiDoc documentation and examples) so there should be very few compatibility issues. __________________________________________________________________ 8. Version 8.2.0 (2007-04-04) Additions and changes * A Vim syntax file is now included in the AsciiDoc distribution (inspired by Felix Obenhuber's asciidoc.vim script). You can find it (along with a Vim filetype detection script in the distribution ./vim/ directory (the scripts are installed automatically by the AsciiDoc installer ./install.sh). See Appendix J of the AsciiDoc User Guide for details. * Added toclevel attribute (1..4) which sets the number of title levels reported in the table of contents. Defaults to 2 and must be used with the toc attribute. Example usage: $ asciidoc -a toc -a toclevels=3 doc/asciidoc.txt * Added a listindex attribute which is the current list item index (1..). If this attribute appears outside a list its value is the number of items in the most recently closed list. * The single line titles syntax now accepts trailing suffixes -- this syntax matches the title line syntax of a number of popular Wiki markups. * If a QuoteBlock has no attribution or citetitle then the DocBook <attribution> element is not generated (previously generated empty <attribution> element). * If the text of a labeled list item is blank then no texttag is written. * An end of line backslash performs line continuation for horizontal labeled list items. * The Revision line now accommodates Subversion $Id markers (in addition to CVS and RCS markers). Thanks to Tiago Sturmer Daitx for this patch. * Implemented a2x(1) option --skip-asciidoc which allows a2x(1) to convert DocBook XML files not derived from AsciiDoc sources. * If a2x(1) --doctype option is not specified it defaults to manpage if --format=manpage else defaults to article (previously --doctype always defaulted to article). * Added an External Resources section to the [9]AsciiDoc home page. __________________________________________________________________ 9. Version 8.1.0 (2006-10-22) Additions and changes * AsciiDoc generated XHTML documents now display a table of contents if the toc attribute is defined (JavaScript needs to be enabled for this to work). Thanks to Troy Hanson who contributed this feature based on a JavaScript by Mihai Bazon. I've simplified things somewhat to match Docbook XSL Stylesheets style, see Troy's [10]tpl User Guide for a fancier layout. Use the -a toc -a numbered command-line options to produce a number table of contents. * A [11]music filter is included in the distribution ./filters/ directory. It translates music in [12]LilyPond or [13]ABC notation to standard classical notation in the form of a trimmed PNG image which is inserted into the AsciiDoc output document. * Incorporated Paul Melis's Win32 filter patch. This workaround allows AsciiDoc to run filters under Windows. * Added uninstall.sh script. * Rather than proliferate a confusing number of filter block delimiters the following convention has been adopted: delimiters belonging to DelimitedBlock filters distributed with AsciiDoc will consist of a word (normally a noun identifying the block content) followed by four or more tilde characters. This has necessitated changing existing filter delimiters (the old delimiters still work but may be deprecated in future versions): + The example code filter block delimiter is now the word code followed by four or more tilde characters. + The source highlight filter block delimiter is now the word source followed by four or more tilde characters. * Conditionally redefined subscript and superscripting so they use the old replacements mechanism when asciidoc7compatible is defined rather than the asciidoc 8 default unconstrained quoting (patch for affected files attached). * Moved the source highlight filter from ./examples/ to ./filter/. * Added {verbose} intrinsic attribute (useful for passing verbose flag to filters). * Added {outdir} intrinsic attribute. * Renamed {docdir} intrinsic attribute to unambiguous`{indir} ({docdir}` still works but may be removed in future release). * If asciidoc(1) outputs to stdout then intrinsic attribute {docname} is extracted from the input file name. __________________________________________________________________ 10. Version 8.0.0 (2006-08-27) This is a major release because changes to quoting and index entry handling may break existing documents (see Additions and changes below and Appendix A: Migration Notes in the AsciiDoc User Guide). Please report any problems you encounter. [14]Stuart Rackham Additions and changes * Quoting can can occur within words (based on patch submitted by Benjamin Klum). See the Unconstrained Quotes sub-section in the User Guide. * The underline and plus characters can be used as alternatives to the existing apostrophe and backtick quote characters. They are arguably better choices than the apostrophe and backtick as they are not confused with punctuation. * The syntax for index entry macros have have been deprecated from +...+ and +...+ to ((...)) and (((...))) respectively. Rationale: + Bracketing is consistent other with [[...]] and <<...>> reference macros. + To easily confused with triple plus passthroughs. + To make way for the new monospace quoting. * Superscripts and subscripts are implemented as constrained quotes so they can now be escaped with a leading backslash and prefixed with with an attribute list. * An experimental LaTeX backend has been written by Benjamin Klum (a number additions in this release are to accommodate the LaTeX backend). * include macro file names now expand environment variables and tilde expansions. * A configuration file [quotes] entry can be undefined by setting to a blank value. * Added callto inline macro for Skype callto links. * Added colnumber attribute for table data markup. * A leading comment block or comment lines are now skipped (previously a document had to start with either attribute entries or a document Title). * Experimental rows attribute (number of source lines in table) available in table markup templates (used by experimental LaTeX backend). * Included install shell script written by [15]Jacob Mandelson for installing the tarball distribution. * Added INSTALL documentation file. * Added replacements2 substitution options -- a second replacements section. * Added the ability to redefine normal and verbatim substitutions with subsnormal and subsverbatim entries in configuration file [miscellaneous] section. * By default AttributeEntry values are substituted for specialcharacters and attributes, if you want a different AttributeEntry substitution set the attributeentry-subs attribute. * The name in name=value configuration file entries can now end with a backslash, just escape the trailing backslash with a backslash. For example: abc\\=xyz Results in name=abc\ and value=xyz -- previously this would have escaped the = character. * A blank configuration file section deletes any preceding section with the same name (applies to non-markup template sections). * A command-line attribute value with a @ suffix does not override existing document and configuration file attributes (normally command-line attributes have precedence over document and configuration file attributes). * localtime attribute is now encoded from the native system encoding to the output encoding. Patch submitted by [16]FKtPp -- here's his description of the problem: "I am a Chinese user of AsciiDoc and I find that when I use UTF-8 (the default encoding) to write asciidoc documents in Windows platform the resulting html footer line will get screwed. It was caused by a localized tzname that was always encoded in the windows native encoding, which in my case is cp936." * a2x(1) can generate Open Document Text files using [17]docbook2odf. Currently docbook2odf(1) only processes a subset of DocBook, unimplemented elements are skipped. * The a2x(1) format option defaults to xhtml (previously a format had to be specified explicitly). * The -d, --doctype=DOCTYPE option has been added to a2x(1) which is a shortcut for --asciidoc-options="--doctype=DOCTYPE". * Replaced a2x(1) --no-icons and --no-copy options with their negated equivalents: --icons and --copy respectively. The default behavior has also changed: copying and use of icons is disabled by default. Rationale: + To make the default behavior more consistent since use of icons and CSS stylesheets does not apply to all formats. + To make the default behavior less surprising (the creation of icon and stylesheet output files must now be explicit). * a2x(1) has been bumped from version 0.1.1 to version 1.0.0. Bug fixes * Removed duplicate ./doc/a2x.1.txt from distribution tarball. * Documentation errata. * Attribute replacement is no longer performed twice in Titles and AttributeEntrys. * a2x(1) skipped asciidoc(1) execution when rerun with different --asciidoc-options options, it now always executes asciidoc(1). The problem was that previously asciidoc(1) was executed only if the output file was missing or older than the source file. __________________________________________________________________ 11. Version 7.1.2 (2006-03-07) Additions and changes * Support for [18]ASCIIMathML has been added. See Appendix I: ASCIIMathML Support in the User Guide and the examples at [19]http://www.methods.co.nz/asciidoc/asciimath.html. * You can now prefix quoted text with inline attributes lists. You can use this to set font size and color (XHTML and HTML outputs). * Added #...# quoting -- it does nothing -- it's purpose is to allow inline attributes to be applied to normal text. * An [20]inline passthrough mechanism has been implemented. * Configuration file comment lines can be escaped with a backslash -- this is to allows the inclusion of configuration lines that start with a hash character. * The scriptsdir attribute can be used to specify the name of the directory containing linked JavaScripts (see the [21]User Guide for details. * The BackendBlock has been renamed PassthroughBlock for consistency with the new inline passthrough naming. * a2x(1) now works with the older bash(1) version 2.05b. Patch submitted by [22]Francis Daly. * Content included by the include1::[] system macro is no longer subject to attribute substitution so that ambiguities no longer arise when used to include CSS or JavaScript files. __________________________________________________________________ 12. Version 7.1.1 (2006-02-24) Additions and changes * The caption attribute can be used to customize admonition captions as well as image, table and example block element title prefixes (xhtml11 and html4 backends). * You can now override the default icon image using the icon attribute to specify the path of the linked image (xhtml11 and html4 backends only). * The deprecated imagesdir attribute is no longer recognized (use iconsdir instead). * Added Appendix H: Using AsciiDoc with non-English Languages to the AsciiDoc User Guide. * Added Admonition Icons and Captions subsection to the User Guide explaining how to customize Admonition elements. Bug fixes * a2x(1) failed when configuration files were installed in the global /etc/asciidoc/ directory -- it was only searching the directory containing the asciidoc executable (thanks to Christian Wiese for finding and submitting a patch this bug). * The html4 backend admonition caption now correctly displays the admonition caption attribute (previously displayed the style attribute). __________________________________________________________________ 13. Version 7.1.0 (2006-01-13) Additions and changes * a2x(1) toolchain wrapper utility. This overcomes the biggest hurdle for new users which seems to be assembling and using a working DocBook XML toolchain. With a2x(1) you can generate XHTML (chunked and unchunked), PDF, man page, HTML Help and text file outputs from an AsciiDoc input file with a single command. All you need to install (in addition to AsciiDoc) is xsltproc(1), DocBook XSL Stylesheets and optionally FOP (if you want PDF) or lynx(1) (if you want text). * Block titles can now start with any non-space character (previously where not allowed to start with .~-_ characters). * ./stylesheets/docbook.css renamed to ./stylesheets/docbook-xsl.css to clarify its function. * Renamed ./docbook-xsl/manpages.xsl to ./docbook-xsl/manpage.xsl for consistency. * Admonition and navigation icons moved to ./images/icons/ to clarify usage and conform with a2x(1) usage. * Renamed xhtml11 intrinsic attribute imagesdir to iconsdir to keep vocab consistent and changed default value to ./images/icons (previously ./images). imagesdir attribute still accepted but deprecated. * Unused image files have been weeded out of the distribution. * Packager notes (appendix B) have been updated to reflect the needs of a2x(1). Important: The renaming of the xhtml11 backend imagesdir intrinsic attribute and it's new default value introduces a backward compatibility issue: if you use the icons attribute you will need to either move your icons to the new default ./images/icons location or include an --attribute iconsdir="your_icons_path" option in your asciidoc commands. Bug fixes * Backslash line continuation is now observed in verbatim paragraphs. * Fixed errors generated by example ./examples/website/build-website.sh script. __________________________________________________________________ 14. Version 7.0.4 (2005-12-08) Additions and changes * Added ternary conditional attributes {<name>@<regexp>:<value1>[:<value2>]} and {<name>$<regexp>:<value1>[:<value2>]}. * Safety violations now generate errors (they previously generated warnings). * asciidoc(1) now defaults to safe mode, consequently the [miscellaneous] safe mode entry and --safe command-line option are no longer necessary (though for backward compatibility asciidoc(1) still accepts the --safe option). * Backend Blocks are now flagged unsafe (they could be used to include arbitrary and hence potentially unsafe output content). * Filters are no longer considered unsafe. There's not much point in insisting on filter safety since the installation of an unsafe filter would require the introduction of new or modified configuration files -- if your application configurations can be compromised you're in all sorts of trouble (safe mode protects against unsafe input files not unsafe configuration). As with all filters, before installing, you should verify that they can't be coerced into generating malicious output or exposing sensitive information. Bug fixes * Fixed a lot of glaring grammatical and factual errors in the User Guide. __________________________________________________________________ 15. Version 7.0.3 (2005-12-01) Additions and changes * Added --safe and --unsafe command-line options -- AsciiDoc can now be executed in a safe mode which disallows the execution of arbitrary code or the inclusion of arbitrary files (see [23]Appendix C in the AsciiDoc User Guide). * Included [24]source-highlight filter in the distribution ./examples/source-highlight-filter/ directory (based on filter submitted by [25]Ryan Phillips). * Included the DocBook XSL Stylesheets 1.69.1 customizations used to generate the distributed AsciiDoc documentation (read the asciidoc-docbook-xsl.txt file in the distribution ./docbook-xsl/ directory). * AsciiDoc DocBook XSL Stylesheet drivers moved from ./doc/ to ./docbook-xsl/. * Modified ./doc/manpages.xsl so only URL content is displayed in manpages. Bug fixes * Explicitly set table CSS border style (xhtml11 backend) to solid because default border styles vary from browser to browser. __________________________________________________________________ 16. Version 7.0.2 (2005-08-28) Additions and changes * There are now long versions of all AsciiDoc options. * If the --backend is not specified it defaults to xhtml11. * Added CSS simulated frames layout to the examples website (see ./examples/website/layout2/README-website.txt). This layout does not work with IE6 and the original tables based layout is still the default. * Support page added to AsciiDoc website. Bug fixes * Invalid options are now trapped gracefully. * Documentation errata. __________________________________________________________________ 17. Version 7.0.1 (2005-06-24) Additions and changes * Reverted to use of strong, em, tt XHTML tags -- they're more obvious and no less correct than span tags, besides, the generated file sizes are smaller (the User Guide was 11% smaller). * Table title rendered with caption tag rather than a separate div. * The AsciiDoc stylesdir attribute (if specified) is now recognized when searching for embedded stylesheets (previously only searched default ./stylesheets directory). * Default charset encoding changed from ISO-8859-1 to UTF-8 -- it's less language specific and displays most common languages. * template::[] macros now expand in all configuration file sections previously only in markup template sections. * Cleaned up example website layout CSS and configuration (presentation has not been changed). * Refactored xhtml11.conf configuration file. * Set consistent and sensible permissions on distributed files. * White space is now stripped from DSV formatted table cell data. * class="tableblock" attribute added to tables generated by xhtml-deprecated-css.conf to assist CSS. Bug fixes * Illegal character set encoder (specified by the AsciiDoc encoding attribute) and character data are trapped gracefully. * AsciiDoc table format attribute in table attribute lists were not recognized. * The nested horizontal labeled list example in the AsciiDoc User Guide has been dropped -- it generated invalid DocBook markup. __________________________________________________________________ 18. Version 7.0.0 (2005-06-06) This is a major release with many code and documentation changes. Please report any problems you encounter. [26]Stuart Rackham Additions and changes * A new xhtml11 backend generates XHTML 1.1 with integrated CSS2 replacing the previous xhtml, css, and css-embedded backends. * The CSS stylesheets have finally been rewritten. * The asciidoc(1) command help now includes user [27]customizable help topics. When asciidoc is invoked with the --help option the command argument is interpreted as a help topic. * The previous example website has been replaced by the actual AsciiDoc website (see ./examples/website/. * XHTML generation options now controlled by the following attributes: badges, linkcss, icons, numbered, quirks, theme, stylesdir, imagesdir (see the [28]User Guide for details. * By default HTML and XHTML are output as stand-alone documents (no embedded CSS and no linked admonition icon images). * Documents encoded with the UTF-8 Unicode character set are now processed thanks to a patch supplied by [29]Viktor Vasilev. * The -a ^name command-line syntax to undefine an attribute has been deprecated in favor of the -a name! syntax. * AttributeEntry syntax addition: :name!: to undefine name attribute. * Added template system block macro to allow the inclusion of one configuration file template section within another. * A verse style attribute can now be applied to literal paragraphs and blocks to reproduce line breaks and white space from the source document. * Replacements and Special Words can now be escaped with leading backslashes. * Replacements are now processed in configuration file order (previous ordering was indeterminate). * System macros can now be used in the base asciidoc.conf configuration file. * Deprecated features that emitted warnings in prior versions are no longer tolerated. * The eval system attribute expression evaluates to False the attribute is undefined, if it evaluates to True the result is an empty string. * The Paragraph and DelimitedBlock presubs parameter can be aliased as subs. * Added verbatim substitutions option. * Renamed List Continuation Block to List Block and renamed the listcontinuation option to list. * Deprecated default substitutions option (use normal instead). * The section-numbers section numbering attribute has be renamed numbered. * Dropped the #UNDER CONSTRUCTION# block macro. * Rewrote Paragraph and DelimitedBlock handlers adding a [30]styles configuration entry. Bug fixes * Included files are no longer read inside conditionally excluded content. * Manpage command names containing dashes (in the manpage NAME section) were misinterpreted as the spaced dash command name/purpose separator. Bug report and patch supplied by [31]David Greaves. * Unexpected error following malformed author line error. __________________________________________________________________ 19. Version 6.0.3 (2005-04-20) Additions and changes * Special characters are now substituted in AttributeEntry element values. * Spaced and unspaced em dashes are now recognized (previously only spaced em dashes were recognized). * Replaced the table noborders option with richer frame and grid attributes. * The duplicate macro warning message now only occurs when the verbose (-v) option is enabled. * Single lines starting with two forward slashes hard up against the left margin are treated as comments and are not processed. * Renamed section delimited block option to sectionbody to more accurately reflect it's role. * Added a List Continuation block -- a specialized delimited block that is functionally equivalent to the List Item Continuation feature except that the list contained within the block does not require explicit + list item continuation lines. * Dropped deprecated <u> tags from generated HTML. * Literal Block delimiters must now consist of at least four points (previously three) to avoid lone ellipsis ambiguity. Bug fixes * Some system attribute evaluation failures caused unexpected exceptions to occur. __________________________________________________________________ 20. Version 6.0.2 (2005-03-30) Additions and changes * Three new system block macros have been added -- eval, sys and sys2 which are the block macro equivalents to the same named system attributes. * Intrinsic macros have been renamed system macros along with action attributes which have been renamed system attributes: + To reflect their common (though contextually different) behavior. + To avoid confusion with intrinsic attributes. Bug fixes * Asciidoc now searches in /etc/asciidoc/filters for filters. __________________________________________________________________ 21. Version 6.0.1 (2005-03-06) Additions and changes * A global configuration file location /etc/asciidoc has been added and is now processed before all other locations (patch supplied by [32]Fredrik Steen). * Recoded tempfile.mktemp() and other artifacts that are no longer necessary or desirable (patches supplied by [33]Fredrik Steen). * Added BUGS file to the distribution. Bug fixes * Illegal comment syntax in css-embedded-stylesheet.conf resulted in illegal CSS in files generated by the css-embedded backend. __________________________________________________________________ 22. Version 6.0.0 (2005-01-28) This release has had some fairly major code and documentation changes. Please report any problems you encounter. [34]Stuart Rackham A lot of new stuff. A new major version number -- some regression incompatibility (hopefully mitigated by deprecated warnings). Went mad trying to rein in the current feature anarchy -- established a unified notion of document attributes. Attempted to introduce a consistent vocabulary -- renamed many poorly or inconsistently named entities. Actually, deprecated syntax is still processed correctly in almost all cases. One source of incompatibility that may arise if you have customized CSS stylesheets is the change of AsciiDoc CSS class names (see below). I guess the moral is if you've done a lot of configuration file customization and are happy with version 5 then you may want to stay put. Note: This version requires Python 2.3 or better to run. Additions and changes * Glossary entries have been renamed attributes. This eliminates confusion with the accepted meaning of glossary. * An AttributeEntry block element has been added so that document attributes can be assigned from within an AsciiDoc document. * The AttributeList block element has been added which is a more general solution than the (now deprecated) DelimitedBlock arguments. * An BlockId element has been added for setting block element anchor (link target) IDs. * Quoted text can now span multiple lines (thanks to James Bowlin for this patch). * Inline macros can now span multiple lines. * ``double backtick / apostrophe'' quotes generate "curly quotes". * A warning is now emitted for out of order list item (applies to explicitly enumerated numbered list items). * Added include action attribute. * A line of three or more apostrophes generates an HTML horizontal ruler (<hr/> tag). You will get a warning if processed with non-HTML backend. * An {imagesdir} attribute specifies image file location for images referenced in configuration files when generating HTML (the default location is images). * An {stylesdir} attribute specifies the location of CSS stylesheets when generating styled HTML (the default location for configured markup is .). * list entry has been deprecated, use {0} instead. * New ExampleBlock delimited block along with associated variants Note, Tip, Warning, Caution and Important. * The docbook.conf file now facilitates the optional inclusion of a DocBook revision history file. * To better reflect their purpose the following block elements have been renamed: VerbatimBlock to ListingBlock; IndentedBlock to LiteralBlock; IndentedParagraph to LiteralParagraph; CustomBlock to BackendBlock; SimpleSection to SectionBody. Any corresponding CSS class names have also been changed which could result in backward incompatibility in customized stylesheets. * Swapped plain DocBook admonition icons for Jimmac's DocBook icons ([35]http://jimmac.musichall.cz/ikony.php3). The original plain icons have been moved to ./images/plain. * Renamed html backend to xhtml to better reflect it's function (former html-4 backend renamed to html). * A new inline anchor macro syntax [[[<id>]]] is available, it displays [<id>] at the anchor location and is for anchoring bibliography list entries. * An optional single-line titles syntax can be used. * Tweaks to distributed CSS stylesheets and FOP fo.xsl customization file. * List Item Continuation has been implemented which allows additional block elements to be included in list items by separating them from the preceding list item element with a line containing a single plus character. * A new Horizontal Labeled List list type has been added. Generates two column list -- the first column contains the list element labels, the second contains the element text. Same syntax as Vertical Labeled Lists except the double colon label suffix is followed by the start of the list item text. Bug fixes * Fixed broken backslash line continuation. * Labeled list end tags were not undergoing attribute substitution. * Documents without any author information now generate legitimate DocBook (previously if the author line was not included in the document header then an empty (illegal) DocBook author element was generated). * Multiple spaces in filter command arguments were replaced by a single space. The ./examples/asciidoc2text/asciidoc2text.sh script now indents text correctly. __________________________________________________________________ 23. Version 5.1.1 (2004-10-10) 15-December-2004: Interim update: Updated asciidoc.py to fix broken join_lines function -- no other changes. * PDF documentation is now produced from DocBook XML using XSLTLib and FOP. Previously we processed DocBook SGML with jw(1) (which used Dvips to convert DVI files to PDF). FOP has come a long way in the last 12 months and produces very acceptable PDF under both Linux and Windows. * Sections detailing how to install and use the DocBook XSL Stylesheets, xsltproc, FOP toolchain and the AsciiDoc XSLT drivers have been added to the User Guide. * The PDF output from the he example article template has been included in the distribution (./doc/article.pdf). * Special characters are emitted using decimal Unicode character codes (previously used named character entities which cannot be assumed included in non-HTML documents). * Added registered trademark ® to [replacements]. * CSS stylesheet tweaks. * Admonitions (Note, Tip, Important, Warning, Caution) include icons when generating css output. __________________________________________________________________ 24. Version 5.1.0 (2004-09-18) * Callouts have been implemented (see the Callouts section of the AsciiDoc User Guide for details). * Added XSL drivers for generating XHTML, chunked XHTML and HTML Help from DocBook XML using XSL stylesheets and xsltproc(1). * Added CSS stylesheet for HTML generated from DocBook XML using XSL stylesheets. * Distribution contains HTML Help formatted User Guide (./doc/asciidoc.chm), the User Guide tells you how it's generated. * Images referred to by distributed stylesheets are now located in the ./images subdirectory (previously located in .). * Filters path names are now handled properly under Cygwin. * The usual documentation and examples additions, updates and polishing. __________________________________________________________________ 25. Version 5.0.9 (2004-09-09) * The convention of using a .asc file extension for AsciiDoc files has been dropped in favor of the familiar .txt extension. It makes more sense in that AsciiDoc is a text presentation format and because .asc clashed with the same extension used by other applications. It's only a naming convention -- you don't have to switch if you don't want to. * Changed the subscript formatting character from underline to tilde since underscores in file names are reasonably common (especially in link and image macros). * An alternative syntax for the index term inline macro has been added: <primary>,<secondary>,<tertiary>. * Index terms that have secondary and tertiary entries now additionally generate separate index terms for the secondary and tertiary entries. * A <primary> index term inline macro has been added which displays the term in the primary text flow. * Added alternative variable list definition using double semi-colon terminator as opposed to the standard double colon terminator so variable lists can be nested to two levels. * Footnotes now appear on a separate line in HTML and Linuxdoc outputs. * Python version compatibility is checked at startup. * Preface and appendix section titles in multi-part Book documents are meant to be out of sequence -- warnings are no longer emitted when outputting HTML. * Empty section warnings have been replaced by error messages and are emitted only if invalid markup would result. * Missing macro sections or invalid macro name warnings are only generated at startup if the -v (verbose) option is set. Otherwise they are deferred until a matching macro is encountered in the input file. * Missing or invalid table definition warnings are only generated at startup if the -v (verbose) option is set. Otherwise they are deferred until a matching table is encountered in the input file. * AsciiDoc now makes more of an effort to continue in the face of errors. * Fixed broken ./examples/website/main.aap script. * Converted distribution text files DOS text format as a sop to Windows users with challenged text editors. * Documentation additions and corrections. __________________________________________________________________ 26. Version 5.0.8 (2004-05-15) * Spurious out of sequence level 2 warnings no longer appear when processing book document multi-part book top level Preface and Appendix sub-sections since they are (correctly) out of sequence. * A warning is no longer emitted for empty Index sections since this is normal when generating DocBook outputs. * Fixed: [quotes] configuration file entries where not being overridden by downstream configuration file entries. * Footnote text is now output enclosed in square brackets in HTML documents. * Added superscripts and subscripts to the standard PRS configuration files. * Adjusted CSS stylesheets so list titles don't have so much space between title and first list item (broken in IE6 due to poor CSS compliance). Lessened sidebar title top margin. __________________________________________________________________ 27. Version 5.0.7 (2004-04-22) * The version 5.0.6 README incorrectly stated that AsciiDoc would run under Python 2.0, in fact it requires Python 2.1 or better. The README has been corrected. * Documented techniques for combining and splitting AsciiDoc documents and processing the combined and split parts (see the Tips and Tricks section of the User Guide). * An example of marking up superscripts and subscripts is documented in the Tips and Tricks section of the User Guide (the example configuration file is in the AsciiDoc examples directory). * Added ellipsis to shipped [replacements]; three periods output an ellipsis entity. * Removed unused SectionClose class. * The AsciiDoc Preamble element is output as a DocBook Preface when processed as a book document type (in older AsciiDoc versions a warning was issued and processing stopped). * Fixed a quoting anomaly: quoted text can no longer begin or end with with white space. __________________________________________________________________ 28. Version 5.0.6 (2004-03-07) * New image macro implements optional image scaling and linking and works in both inline and block contexts. The image macro obsolesces the existing graphic block macro and icon inline macro. * Macro substitution section names now have -inlinemacro and -blockmacro suffixes to resolve context ambiguity, make their purpose clearer and relieve section namespace congestion. * Header derived glossary entries can now be overridden from the command-line. * Special character substitution is now performed on AuthorLine derived author names. * A macro or block argument called options can be used as a shortcut for a list named arguments with zero length string values. * Tables can be output without borders using the options="noborders" argument. * Table data lines that do not immediately follow a table section underline can now be blank. This allows CSV data with embedded blank lines to be processed correctly. * Blank DSV format table data lines are silently skipped. * Tightened up on enforcement of configuration file section names to reduce the possibility of section content being seen as a section header line. * Section titles can be optionally suffixed with title arguments enclosed in double square brackets. * A replacement has been added to asciidoc.conf to replace inline double dashes with the — entity. * Changed the .UNDER-CONSTRUCTION. macro syntax to #UNDER-CONSTRUCTION# so it is not mistaken for a BlockTitle. Similarly changed the .NEW. replacement with #NEW#. * #NEW# and #UNDER-CONSTRUCTION# macros are now included in the DocBook backend. * Replaced shipped smallnew.gif with smallnew.png. * Documentation tidy ups. __________________________________________________________________ 29. Version 5.0.5 (2004-02-25) * Fixed the disappearing paragraph titles problem that was caused by Inline macros (incorrectly) processing BlockTitles. * Tightened AuthorLine validation. Previously invalid email addresses and embedded special characters in the AuthorLine resulted in invalid output markup. __________________________________________________________________ 30. Version 5.0.4 (2004-02-09) * Reinstated missing infile, outfile, filetype and filetype-<filetype> glossary entries. * As of version 5.0.3 asciidoc(1) now requires Python 2.0 or greater, this has now been documented. __________________________________________________________________ 31. Version 5.0.3 (2004-01-23) * Fixed problem that caused any filters directory file containing .conf (not just those with the .conf extension) from being loaded. * All [miscellaneous] configuration file entries can now be referenced like glossary entries (they are now processed internally as glossary entries). * The output file line terminator (previously hardwired to \r\n is now set using the newline entry in the configuration file [miscellaneous] section. * The misspelt blocktitles configuration file entry name has been corrected (to blocktitle). * An {empty} glossary entry has been added to the default configuration which is useful for outputting trailing blank lines from configuration file substitution sections. __________________________________________________________________ 32. Version 5.0.2 (2003-12-18) * New (alternative) anchor and xref macro syntax (old syntax still valid). * DocBook mediaobject and inlinemediaobject tags are generated in place of graphic and inlinegraphic tags by the AsciiDoc graphic and icon macros. If a macro argument is specified it is the alternative text output if the target document format does not support the specified graphic file format. * Dropped the LinuxDoc left and right square bracket special character substitutions as they interfered with macro substitution. * Documentation updates and corrections. __________________________________________________________________ 33. Version 5.0.1 (2003-12-09) * Fixed problem with anchor tag when generating CSS styled HTML. __________________________________________________________________ 34. Version 5.0 (2003-12-08) This release has had some fairly major code and documentation changes. Please report any problems you encounter. [36]Stuart Rackham * AsciiDoc can now produce a full-blown multi-part DocBook book including dedication, abstract, preface, colophon, glossary, appendix, bibliography and book part elements using the new specialsections configuration file section. * All Section element children (Paragraph, DelimitedBlock, List, Table, BlockMacro) can now be titled using the BlockTitle element. A BlockTitle element is a single line containing a title and beginning with a period. * The index and backmatter macros have been dropped, superseded by specialsections. * The AsciiDoc Preface element has been renamed Preamble (to avoid confusion with the DocBook book preface element). * Out of sequence titles are now tolerated with a warning. This allows book document level 0 sections to be processed. * An anchor inline macro has been added for document link target creation. * Note, Tip, Important and Warning paragraph types have been added to support the corresponding DocBook elements. * Title substitution is now performed in SidebarBlock titles. * DocBook graphics now output as figure and informalfigure elements rather than mediaobjects. This ensures numbered figures and a lists of figures are produced by the DocBook toolchain. * You can now escape block argument lines by appending a backslash. Alternatively, if you embed arguments in the delimiter line AsciiDoc does not check for an arguments line. * The default DocBook backend file extension has been changed from .docbook to .xml (.sgml for the docbook-sgml backend). * Warnings are output by default (previously they only printed when verbose option enabled). * A Question and Answer variable list definition has been added to the shipped configuration files, primarily to create DocBook qanda DocBook elements. * Fixed broken code-filter -b linuxdoc option. The asciidoc.asc User Guide can now be processed by linuxdoc(1) (although tables are dropped because LinuxDoc does not implement tables). Compatibility issues: 1. Table titles are no longer in the arguments line, use the new BlockTitles. 2. Graphic titles are no longer in the graphic block macro caption, use the new BlockTitles. 3. The code-filter title must be placed in a preceding BlockTitle. 4. SidebarBlock titles must be placed in a preceding BlockTitle. 5. The DelimitedBlock option sidebar has been renamed to section. 6. The default DocBook backend file extension has been changed from .docbook to .xml (.sgml for the docbook-sgml backend). __________________________________________________________________ 35. Version 4.2 (2003-11-26) * The default HTML output is now XHTML 1.0 markup. To output the former HTML 4 markup specify the html-4 backend. * The default DocBook output is now DocBook XML. To output the former DocBook SGML specify the docbook-sgml backend. The associated docbook-sgml.conf file illustrates how to support minor DTD variations. Examples of using the xmlto(1) command for DocBook conversion have been added to the User Guide. * Glossary entries set using the command-line -g option can now be referenced in configuration files. * Configuration dumps (-c command-line option) no longer output redundant undefined glossary entries. * DelimitedBlock arguments can now be specified in a separate arguments line immediately following the leading delimiter line, This is in preference to the existing delimiter embedded arguments. Reasons: + The syntax is in keeping with the Tables arguments syntax. + It's easier to enter and implements line continuation. * A new QuoteBlock DelimitedBlock definition has been added to the distribution configuration files. * The table arguments lines can be continued using the backslash line continuation character. * Added new calculated glossary reference type {<name>%<value>}. * Double-quote characters can now appear in unquoted positional arguments. __________________________________________________________________ 36. Version 4.1 (2003-11-13) * Added DSV (Delimiter Separated Values) tables format. * {eval:<expr>} glossary references drop the containing line if <expr> evaluates to None. * Block, Table and Macro arguments can now be positional (quoted or unquoted). * Vocabulary change: DelimitedBlock, Table and Macro attributes are now referred to as arguments. This makes more sense in light of the extended syntax and avoids confusion with backend markup tag attributes. * tablewidth table ruler parameter can now be expressed in percent units (0..100). If between 0 and 1 then the original fractional unit measure is applied. * The use of quoting for generating footnotes and index entries has been dropped in favor of footnote and indexterm inline macros. * backmatter inline macro included in distribution. * Fixed: CSS styled HTML tables are now fully XHTML 1.0 conformant. * Fixed: tablewidth was processed incorrectly when passed as table argument. * Fixed: Glossary references like {x={y}} were one character off if {x] was defined and {y} was not. __________________________________________________________________ 37. Version 4.0 (2003-11-08) This release has had some fairly major code and documentation changes. Please report any problems you encounter. Stuart Rackham * Added tables to AsciiDoc. * Added two special subs options: default specifies the default substitution options and none specifies no substitution. These options can only appear singly. * Line continuation using a trailing backslash character is available in Paragraphs, ListItems, Tables. * The left and right quotes for quoted text can now be specified separately. * Shipped configuration files implement footnotes (only useful for DocBook output) using \[[]] quoting. * Shipped configuration files implement index terms (only useful for DocBook and LinuxDoc output) using \(()) quoting. * The shipped html backend configuration now emits valid HTML 4.01 Transitional. * Added new calculated glossary reference types {<name>!<value>} and {<name>#<value>}. * The DelimitedBlock params option has been dropped in favor of the new block attributes mechanism. If you have customized block params options you may need to adjust source files to use the block attributes syntax. The example code filter has been updated to reflect these changes. * The code filter now has a -t tabsize option. * Replaced -w option with -v (verbose) option. The warnings option was just to confusing. * Named attributes can now be specified in macro calls. * The tabsize attribute is recognized in the built-in include macros. A tabsize of zero suppresses tab expansion. * The configuration file [options] section has been split into [miscellaneous] and [titles]. If you have customized any of these settings you will need to adjust the affected configuration files. * Configuration file [miscellaneous] entries can now also be set using the command-line -g option. * Fixed: error that occurred when attempting to use zero length configuration and source files. * Fixed: blocking filter halt problem. * Fixed: inline macro escape prefix problem. * Fixed: missing macros from configuration dump problem. * Fixed: named macros were dumped incorrectly. * Many documentation changes/additions/corrections. __________________________________________________________________ 38. Version 3.2.2 (2003-10-26) * Added -n option (synonym for -g section-numbers). * Dropped the processing commentary (hey, this is Unix). * Added new calculated glossary reference type {<name>?<value>}. <name> is the glossary entry name and <value> is the text substituted if the glossary entry is defined. <value> can only contain literal text (no glossary references allowed). * Added asciidoc2text to distribution examples/asciidoc2text directory (converts AsciiDoc source to text file with section numbering). * Fixed incorrect nesting of Simple lists inside Variable lists. * List definitions have been modified so that list items can be indented. This allows a more intuitive indentation of nested lists in AsciiDoc source. * Lists must be separated from preceding paragraphs by a blank line. This is to avoid paragraph lines being mistaken for list items. * Corrected asciidoc man page documentation error: the`-f` option does not search relative to source document directory for the configuration file. * Minor updates to various distribution .conf files. * Included badges.conf in examples directory. * css-embedded-stylesheet.conf now supports footer badges. * The default in-line element processing order has been changed: Glossary References are now processed before Inline Macros. This allows glossary expansions to occur inside macro references. * Glossary entries are now allowed in Author and Revision lines. * Default List subs options and Paragraph presubs options are assigned the following default value if not specified: specialcharacters,quotes,specialwords,replacements,glossary,macros * Documentation changes/additions/corrections. __________________________________________________________________ 39. Version 3.2 (2003-05-26) * Added a -s command-line option to suppress the output of [header] and [footer] sections. * Article document headers are no longer mandatory: this allows AsciiDoc to process arbitrary chunks of text. When used in conjunction with the new -s command-line option corresponding chunks of backend markup can be generated. * AsciiDoc now emits a warning message and continues when an out of sequence section title is detected (previously it failed and halted). This allows document sections to be processed separately. * Optional presubs and postsubs entries have been added to DelimitedBlock and Paragraph definitions. As a consequence substitution options are no longer legal in options entries. * presubs and postsubs substitutions are processed in the order the options are specified (rather than the fixed options order of previous versions). * ./filters subdirectories are automatically searched for filter commands. * A title-subs configuration option specifies the substitutions performed on document Header and Section titles. * A subs entry in now included in List configuration file definitions that specified substitutions performed on list entry text. * Configuration files are auto-loaded from ./filters subdirectories. * Added example code filter (see ./examples/filters). * Bug fix: if section was empty you may have got erroneous missing tag "paragraph" error. * Internal code tidy up. __________________________________________________________________ 40. Version 3.1 (2003-05-18) * In version 3.0 a [macros] section entry of the form name was equivalent to name=. An entry of the form name now undefines the entry (to bring it in line with the behavior of other special sections). * Paragraphs have now been generalized (in the same way as Lists and DelimitedBlocks). * The indentsize option has been dropped as as consequence of paragraph generalization. * Pipe | characters can be included in substituted tag and substitution section text using the {brvbar} (broken vertical bar) glossary reference. * Removed the restriction requiring substitution section text placeholders | to be on a separate line. * Added an -e asciidoc(1) command option that excludes implicit configuration files (used in conjunction with -c generated configuration files). * Version 3.0 documentation has undergone a considerable cleanup. * The dumping of quoted section entries (see -c option) now works correctly. * The format of special section entries has been made consistent: name undefines the entry; name= sets the entry value to a blank string; name=value sets the entry value to value. * As a consequence of the previous change the caret prefix is no longer used in glossary configuration file entries (although it is still used when undefining an entry using the -g command-line option). __________________________________________________________________ 41. Version 3.0 (2003-05-13) This version is the culmination of work begun in the 2.x releases whereby fixed policy has been replaced by extensible mechanisms. * Added -c command-line option to dump a composite asciidoc(1) configuration file to stdout. * Lists and Delimited Blocks are now defined by a set of configuration file parameter sections. The user can modify the default definitions or add new ones. * Block content can now be processed through external filters. * The default behavior for Custom Blocks is to perform glossary substitution (previously there was no substitution inside Custom Blocks). * The old 2.x style macros have been reimplemented; as with Lists and Delimited Blocks there syntax and behavior can be configured by the user. The default macro syntax remains the same but the semantics are now (hopefully) a bit more intelligible. * Block and Builtin macros use :: delimiter instead of the 2.x single colon delimit (to distinguish them from inline macros). The 2.x syntax is still supported for backward compatibility. * Nested lists are now supported and IndentedParagraphs can be included in list items. * Conditional source inclusion can be specified using built in ifdef, ifndef and endif macros. * The new conditional source inclusion feature has been used to reduce the number of default configuration files down to one per backend. * A change of name: 2.x Substitutions are now called Replacements and the 2.x [substitutions] configuration file section is now called [replacements] (the old name is still recognized for backward compatibility). * The line break is now implemented as a Replacements substitution. * Inline icon macro for inline images has been added to default configuration files. __________________________________________________________________ 42. Version 2.2 (2003-04-07) * The master.conf configuration file name has been deprecated in favor of asciidoc.conf. * The standard configuration files set is now loaded from the .asciidoc folder in the users home directory (if it exists) and then from the source document directory. Configuration files that don't exist are silently skipped. * Configuration files named like the source file will be automatically loaded if they are found in the source file directory. For example if the source file is mydoc.asc and the -b html option is used then asciidoc(1) will look for mydoc.conf and mydoc-html.conf in that order. * The characters used to quote formatted text can be configured and extended by the user (see the master.conf [quotes] section). * Quoted text can now be escaped by prefixing a backslash character to the leading quote. * The double single-quote '' strong text quote has been deprecated in favor of an asterisk * character. * Added {eval:expression}, {sys:command} and {sys2:command} glossary reference actions. * Trailing brace characters } are now allowed inside glossary references provided they are escaped with a backslash character. * Glossary entries can now be escaped by prefixing a backslash character to the leading brace character (use this in preference to placing the backslash inside the brace). * The output macro has been deprecated (use the new include1 macro inside a CustomBlock). * The default document type is article (asciidoc no longer attempts to guess). * Files included within DelimitedBlocks are not searched for block termination underlines. This ensures the entire file is part of the DelimitedBlock. * include macros can now be used in configuration files. * Corrected {infile} and {outfile} glossary entry documentation. * File inclusion is now limited to a depth of 5 to catch recursion loops. * Inline tags have been deprecated, they're not necessary and they immediately make the source document backend specific. Use CustomBlocks or Substitutions instead. __________________________________________________________________ 43. Version 2.1 (2003-03-17) * Added section auto numbering {sectnum} glossary entry (auto-numbering function contributed by Ludovico Magnocavallo). * asciidoc(1) now correctly returns non-zero exit status if an error occurs. * An AsciiDoc example website has been included in the AsciiDoc distribution examples/website directory (also online at [37]http://www.methods.co.nz/asciidoc/examples/website/). * NOTE: The asciidoc wrapper script included in the 2.0 distribution has been dropped, if you've symlinked or aliased to asciidoc you'll need to change them to point directly to asciidoc.py instead. * An RCS $Id$ marker can be used as the document header revision line (based on a patch submitted by Ludovico Magnocavallo). * In addition to the name=value glossary entry format two new ones have been introduced: name (the default value is set to an empty string) and ^name (the glossary entry is undefined). * The -q command-line option has been deprecated and the -w level command-line option added. NOTE: By default skipped substitution warnings are now suppressed. * If a configuration file specified with the -f command-line option is not found relative to the current working directory then the search is repeated relative to the asciidoc(1) directory. This allows global configuration files to be used. * Added {infile}, {outfile} predefined glossary entries. * Added under-construction macro to HTML article configuration files. * Deprecated {asciidoc_version} glossary entry in favor of {asciidoc-version} (to it consistent with other entries). __________________________________________________________________ 44. Version 2.0 (2003-02-24) * The emphasized, strong and monospaced words options have been generalized with the introduction of macro based special words lists. * Glossary references can now appear in both the document and macro bodies. * All output files use crlf line termination (previously used UNIX lf (newline) termination). * Added [substitutions] section which implements arbitrary regular expression based substitutions. * An optional master.conf configuration file can be used for entries that are not backend or document type specific. * Special character definitions moved from the code to the new [special_characters] configuration file section. * Configuration file glossary added. * Command-line -g glossary entry added. * A new book document type has been implemented for the docbook backend. It outputs DocBook book documents. * A major internal change has been the implementation of parametrized user definable macros. Internally most document elements are now processed as macros. * Configuration file macro variables can be specified with default values (literals or other macro variables). * An attempt has been made to tighten up the vocabulary used to describe the AsciiDoc document syntax. * The term abstract has been replaced by the more general term preface and a new preface section introduced into article configuration files (replacing the synopsis sections). * Any section elements can now be put in the document preface (previous versions only allowed paragraphs). * AsciiDoc Blocks have been unified and their behavior can be user defined and parametrized. * An output inclusion allows an external file to be written directly to the backend output file. * A new CustomBlock has been added. Default behavior is to insert the enveloped AsciiDoc source lines directly into the output file. * A line break tag can be inserted by terminating a line with a + character (only really useful for HTML backends). * An fourth section level has been introduced. * The SidebarBlock delimiter line characters have been changed. The deprecated underline is still accepted. * Levels 2 and 3 title underline characters have been changed. The deprecated underlines are still accepted. * Lines with backend specific inline tags can be inserted into AsciiDoc source files. * Single words enveloped by underscores are no longer emphasized. This feature was deprecated as it is redundant (use single quotes instead) and was being applied to file names with underscores. * A -q quiet option has been added to suppress warning messages. * Badge images sourced locally. * Added author and author-mail meta tags to HTML configuration files. __________________________________________________________________ 45. Version 1.5 (2003-01-08) * Implemented sidebar document elements. * Explicit checks for user specified configuration files and input file (rather than throwing exception). __________________________________________________________________ 46. Version 1.4 (2003-01-04) * New configuration file options emphasizedwords and strongwords. These allow the definition of words that will always be emphasized or rendered in a strong font without inline formatting. * Document and section titles are no long subject to inline formatting. * Multiple configuration files can be overlaid in a single command. * Configuration file tags and options entries can now be overridden on an entry by entry basis (previously the entire section was overloaded). * Configuration file tags and options entries are now cached this has resulted in around 37% performance improvement over version 1.3. * Variable lists can now contain multiple terms per list item. * Placeholder paragraph eliminated from empty sections that contain subsections. * Added {asciidoc_version} substitution variable. * More documentation additions and tidy ups. __________________________________________________________________ 47. Version 1.3 (2003-01-01) * A new strong text formatting convention has been implemented: Word phrases enclosed in pairs of single quote characters (acute accents) are rendered in a strong font (usually bold). * Paragraphs can now be followed immediately by Simple lists and Ordered lists without an intervening blank line. * A user specified configuration file (asciidoc(1) -f option) overlays the default configuration file rather than replacing it. Custom configuration files need only contain those sections that have been customized. * Comment Block delimiters have been relaxed slightly. They must start with three forward slashes /// but the remainder can contain any characters, this allows comments to be embedded in the delimiter line. * Leading non-digit characters preceding revision number are now ignored. * Set default indentsize [option] from 2 to documented default value of zero in HTML backend html-article.conf and html-manpage.conf files. * Fixed error that occurred when taking input from stdin without explicitly specifying a document type. * Restored file name and line number error message information. * Changed deprecated -t option to -d in asciidoc --help and usage command output. * CSS styles tweaking. * Code, configuration file and documentation tidy ups. __________________________________________________________________ 48. Version 1.2 (2002-12-28) * Implemented include URL to allow file inclusion. * fileextension configuration file [option] renamed to more sensible outfilesuffix (fileextension still accepted by this version but will be dropped in future). * Improved error reporting. * CSS backends generate valid XHTML. * New css-embedded backend generates HTML with embedded stylesheets (use the css backend for linked stylesheets). The css-embedded backend output contains no linked images so the generated html files are completely self contained. * Bug fixes. __________________________________________________________________ 49. Version 1.1 (2002-12-03) * Added css (cascading style sheets) backend * Implemented IndentedBlock document element. * Tabsize command-line option has been deprecated in favor of configuration file. * Default indent width changed to zero. * Added {localdate} and {localtime} substitution variables. * Added optional [options] configuration file section with fileextension, tabsize and indentsize options. * Implemented {authorinitials} substitution variable. * Added https link type. * Corrected [graphic] substitution from {title} to {caption} in linuxdoc-article.conf configuration file. * Fixed error that occurred when == title underline was used. __________________________________________________________________ 50. Version 1.0 (2002-11-25) First AsciiDoc public release along with AsciiDoc web site ([38]http://www.methods.co.nz/asciidoc/) and SourceForge.net project registration ([39]https://sourceforge.net/projects/asciidoc/). __________________________________________________________________ Version 8.2.7 Last updated 2008-07-04 23:26:22 NZDT References 1. http://hg.sharesource.org/asciidoc/shortlog 2. http://www.methods.co.nz/asciidoc/source-highlight-filter.html 3. https://sharesource.org/hg/asciidoc/ 4. http://hg.sharesource.org/asciidoc/shortlog 5. http://en.wikipedia.org/wiki/Data:_URI_scheme 6. http://www.methods.co.nz/asciidoc/faq.html 7. http://www.maths.nottingham.ac.uk/personal/drw/lm.html 8. http://www.methods.co.nz/asciidoc/asciimath.html 9. http://www.methods.co.nz/asciidoc/index.html 10. http://tpl.sourceforge.net/userguide.html 11. http://www.methods.co.nz/asciidoc/music-filter.html 12. http://lilypond.org/ 13. http://abcnotation.org.uk/ 14. mailto:srackham@gmail.com 15. mailto:jlm@ofb.net 16. mailto:m_pupil@yahoo.com.cn 17. http://open.comsultia.com/docbook2odf/ 18. http://www1.chapman.edu/~jipsen/mathml/asciimath.html 19. http://www.methods.co.nz/asciidoc/asciimath.html 20. file://localhost/tmp/lynxXXXXPMZJe0/userguide.html#X50 21. file://localhost/tmp/lynxXXXXPMZJe0/userguide.html#X33 22. mailto:francis@daoine.org 23. file://localhost/tmp/lynxXXXXPMZJe0/userguide.html#X39 24. file://localhost/tmp/lynxXXXXPMZJe0/source-highlight-filter.html 25. mailto:trolocsis@gmail.com 26. mailto:srackham@gmail.com 27. file://localhost/tmp/lynxXXXXPMZJe0/userguide.html#X36 28. file://localhost/tmp/lynxXXXXPMZJe0/userguide.html#X33 29. mailto:viktor@rbg.informatik.tu-darmstadt.de 30. file://localhost/tmp/lynxXXXXPMZJe0/userguide.html#X23 31. mailto:david@dgreaves.com 32. mailto:stone@debian.org 33. mailto:stone@debian.org 34. mailto:srackham@gmail.com 35. http://jimmac.musichall.cz/ikony.php3 36. mailto:srackham@gmail.com 37. http://www.methods.co.nz/asciidoc/examples/website/ 38. http://www.methods.co.nz/asciidoc/ 39. https://sourceforge.net/projects/asciidoc/ ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������asciidoc-8.2.7/CHANGELOG.txt������������������������������������������������������������������������0000644�0001751�0001751�00000224067�11033066047�015517� 0����������������������������������������������������������������������������������������������������ustar �srackham������������������������srackham���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������AsciiDoc ChangeLog ================== Version 8.2.7 (2008-07-04) -------------------------- See the http://hg.sharesource.org/asciidoc/shortlog[AsciiDoc Mercurial repository] for a full list of changes. .Additions and changes - Added `dvi`, `ps` and `tex` output format options to a2x(1). - Added `--dblatex` option to a2x(1) so `dblatex(1)` can be used to generate PDFs. - Added custom `dblatex(1)` configuration files (in distribution `./dblatex` directory) which are used by a2x(1). - `dblatex(1)` is now used to generate the distributed PDF version of the AsciiDoc User Guide. - If you don't need a customized the link caption you can enter the 'http', 'https', 'ftp', 'file' URLs and email addresses without any special macro syntax -- you get the links by just cutting and pasting URLs and emails addresses. This also makes it easier to open links directly form AsciiDoc source ( most editors allow you to open URLs directly). The Vim syntax highlighter has been updated to reflect these changes. - Highlighted source code paragraphs have been implemented -- it's a much more convenient way to enter short code examples (see http://www.methods.co.nz/asciidoc/source-highlight-filter.html[the online docs]). - The source highlighter and music filter syntax has changed -- they now used the ListingBlock syntax customized with 'source' and 'music' style attribute values. This follows the Paragraph styling convention introduced by the source paragraph (previous item) and is easier to read. The old syntax still works but has been deprecated. - QuoteBlocks now have a 'verse' style -- you no longer have to nest a 'verse' LiteralBlock inside a QuoteBlock for verses. The 'verse' style on the LiteralBlock has been deprecated (still works though) and the 'style' attribute is positional attribute 1, pushing 'attribution' and 'citetitle' attributes to the right (you'll need to insert a 'quote' attribute into your existing QuoteBlocks). - It is no up to the DocBook processor to highlight source code syntax in `<programlisting>` elements rather than GNU Highlighter -- this is the correct way to handle it, plus `dblatex(1)` makes a much better job. - 'scaledwidth' and 'align' attributes have been added to the 'image' macro. They apply to DocBook outputs (specifically for PDF documents). 'scaledwidth' sets the image size as a percent of the available page width; 'align' applies 'left', 'center' or 'right' horizontal image justification. - Added a2x(1) `--fop-opts=FOP_OPTS` option (patch submitted by Miklos Vajna). - Added a2x(1) `--dblatex-opts=DBLATEX_OPTS` option. - Added Mikhail Yakshin's FOP 0.95 patch which fixes a long-standing `fo.xsl` problem and allows PDF's to be generated with FOP 0.95 (previously had to use FOP 0.20.5). - The User Guide has been updated and outdated FOP configuration and installation sections removed. .Bug fixes - Fixed `stylesheets/xhtml11-manpage.css` not being included when 'linkcss' attribute was used. - Configuration file `*-style` attributes are now dumped correctly. - Fixed 'FAILED: malformed section entry' LaTeX backend error. See the also the https://sharesource.org/hg/asciidoc/[AsciiDoc repository changelog]. Version 8.2.6 (2008-04-29) -------------------------- See the http://hg.sharesource.org/asciidoc/shortlog[AsciiDoc Mercurial repository] for a full list of changes. .Additions and changes - Enhancements to the Vim AsciiDoc syntax highlighter, for example, quoted text is now highlighted in titles and macro captions. - If you define the `data-uri` intrinsic attribute images referenced by 'image' macros will be embedded in XHTML using the http://en.wikipedia.org/wiki/Data:_URI_scheme[data: URI scheme]. *NOTE*: Microsoft browser support for the 'data: URI scheme' is currently limited to MSIE 8 beta 1. - Added `toc-title` attribute to allow custom table of contents titles. - Added references to Alex Efros's AsciiDoc Cheatsheet to AsciiDoc website. - `asciidoc(1)` and `a2x(1)` man pages formatted to conform to `man-pages(7)` recommendations. - Old code-filter syntax (pre-8.1.0) is no longer recognized so that malformed two-line level 2 titles are no longer confused with 'code-filter' block delimiters. - Added -> <- => <= arrow replacements from the Arrows block of Unicode. - Added DocBook refentry lang attribute -- patch contributed by VMiklos. - AttributeEntry names can now be numeric (``named macro targets''). - Hide Table of Contents title if Table of Contents empty -- patch contributed by Alex Efros. - Various XHTML CSS tweaks. - Code cleanup: * Replaced `realpath()` with Python 2.2 `os.path.realpath()` library function. * Replaced old string library functions with string methods. * Use file generators instead of `readlines()`. * Renamed entities that shadowed builtins. * Standardized string quoting. * Dropped `readlines()` function. .Bug fixes - Fixed broken CSS for decimal ordered lists nested in alpha ordered list, thanks to Alex Efros. - A missing closing block delimiter now reports the opening delimiter line number instead of the end of file line number. - Fixed an error generated by the asciidoc `-e` option when there are no block definitions -- patch contributed by Alejandro Mery. - Handle both `\r\n` (as well as `\n`) line separators that may be returned by `\{sys}` attribute evaluation. - Numbered attribute names no longer interfere with positional attribute list values. Version 8.2.5 (2007-11-18) -------------------------- .Additions and changes .Bug fixes - Fixed exception thrown by illegal command-line arguments. - Rolled back the 'with' warning bug fix introduced in 8.2.4 -- it was incompatible with Python <2.5. Version 8.2.4 (2007-11-10) -------------------------- .Additions and changes - You can now use the `lang` attribute to set the DocBook language attribute. - Attribute values can now contain attribute references. - If the `lang` attribute is defined then configuration files named like `lang-<lang>.conf` will be loaded automatically. - The help file name `help-<lang>.conf` is based on the AsciiDoc `lang` attribute, defaults to `help.conf` (English). - Admonition, figure and table captions have been factored into a predefined set of `caption_*` attributes. They only apply to directly generated (X)HTML outputs (DocBook stylesheets generate their own language specific captions based on the `lang` attribute). - Dropped platform dependent `doc/asciidoc.chm` file from distribution documentation formats. .Bug fixes - The spurious warning 'with will become a reserved keyword in Python 2.6' has been suppressed. Version 8.2.3 (2007-09-12) -------------------------- .Additions and changes - Added VMiklos's 'permalink' patch for auto-generated section IDs (enabled by default by the `sectids` attribute). - Added http://www.methods.co.nz/asciidoc/faq.html[FAQ] to website. - Changed format of \{localdate} attribute to ISO 8601 (`%Y-%m-%d`). - Added `abc2ly --beams=None` option to make `music2png.py` conform to ABC's notion of beams. - XHTML level 2 section headings are now styled with an underlining border. - XHTML links to AsciiDoc title elements are now implemented with title ID attributes (previously separate `<a>` element targets were generated. - Multi-word first, middle and last names can be entered in the header author line using the underscore as a word separator. - The nested inline macros restriction has now been lifted, for example you can now include links and inline images inside footnotes. - Help topic names can be shortened (so long as they are not ambiguous). For example `asciidoc -hm` will print the AsciiDoc man page. - Added `\{two_colons}` and `\{two_semicolons}` attributes for escaping labeled list ambiguity. - If quirks mode is disabled the XHTML Mime Type is set to the recommended `application/xhtml+xml` (rather than `text/html`). .Bug fixes - Author information is now correctly set when using attribute entries in the header instead of an author line (previously the 'author' attribute was not being calculated correctly and there were attribute substitution problems). Version 8.2.2 (2007-07-22) -------------------------- .Additions and changes - http://www.maths.nottingham.ac.uk/personal/drw/lm.html[LaTeXMathML] capability has been added for users who are more familiar with or prefer LaTeX math formulas to the http://www.methods.co.nz/asciidoc/asciimath.html[ASCIIMathML] notation (thanks to Arthur Sakellariou for the patch). - The 'source highlight' and 'code' filters now process embedded callouts. - Added an `--attribute=ATTRIBUTE` option to `a2x(1)` for passing attribute values to asciidoc(1) (a shortcut for `--asciidoc-opts="-a ATTRIBUTE"`). - Image block and inline macros prepend optional `\{imagesdir}` attribute to image link targets. .Bug fixes - Fixed an assertion error that occurred when a configuration file containing an `\include::[]` macro was loaded using the `\--conf-file` option and the configuration file name did not include an explicit directory path -- patch submitted by Dmitry Potapov. - Asciidoc titles are only converted to lower case if all characters are upper case otherwise case is left unchanged -- patch submitted by Dmitry Potapov. - Added a missing check that input is not stdin before loading configuration files from the document directory -- patch submitted by Dmitry Potapov. - Attribute list items must evaluate to strings, numbers or None (previously it was possible to evaluate to other object types which resulted in surprising attribute values). - If an AsciiDoc document has no title an empty XHTML 1.1 'title' element is created -- previously the 'title' element was dropped which resulted in invalid XHTML 1.1. - The Vim syntax file no longer highlights escaped callouts. - The Vim syntax highlighter now correctly highlights Double-dollar passthroughs when they enclose dollar delimited ASCIIMathML and LaTeXMathML formulas. Version 8.2.1 (2007-04-06) -------------------------- .Additions and changes - A number of improvements have been made to the Vim syntax highlighter, for example the word C++ is no longer mistaken for the start of an unconstrained monospace quote. - Labeled list definitions have been tightened -- a list label can no longer containing trailing spaces. The following example is no longer recognized as a valid list label: Lorum ipsum :: + This change implements the originally intended behavior (as per the AsciiDoc documentation and examples) so there should be very few compatibility issues. .Bug fixes Version 8.2.0 (2007-04-04) -------------------------- .Additions and changes - A Vim syntax file is now included in the AsciiDoc distribution (inspired by Felix Obenhuber's `asciidoc.vim` script). You can find it (along with a Vim filetype detection script in the distribution `./vim/` directory (the scripts are installed automatically by the AsciiDoc installer `./install.sh`). See 'Appendix J' of the 'AsciiDoc User Guide' for details. - Added 'toclevel' attribute (1..4) which sets the number of title levels reported in the table of contents. Defaults to 2 and must be used with the 'toc' attribute. Example usage: $ asciidoc -a toc -a toclevels=3 doc/asciidoc.txt - Added a `listindex` attribute which is the current list item index (1..). If this attribute appears outside a list its value is the number of items in the most recently closed list. - The single line titles syntax now accepts trailing suffixes -- this syntax matches the title line syntax of a number of popular Wiki markups. - If a QuoteBlock has no attribution or citetitle then the DocBook `<attribution>` element is not generated (previously generated empty `<attribution>` element). - If the text of a labeled list item is blank then no `texttag` is written. - An end of line backslash performs line continuation for horizontal labeled list items. - The Revision line now accommodates Subversion `$Id` markers (in addition to CVS and RCS markers). Thanks to Tiago Sturmer Daitx for this patch. - Implemented `a2x(1)` option `--skip-asciidoc` which allows `a2x(1)` to convert DocBook XML files not derived from AsciiDoc sources. - If `a2x(1) --doctype` option is not specified it defaults to `manpage` if `--format=manpage` else defaults to `article` (previously `--doctype` always defaulted to `article`). - Added an 'External Resources' section to the http://www.methods.co.nz/asciidoc/index.html[AsciiDoc home page]. .Bug fixes Version 8.1.0 (2006-10-22) -------------------------- .Additions and changes - AsciiDoc generated XHTML documents now display a table of contents if the 'toc' attribute is defined (JavaScript needs to be enabled for this to work). Thanks to Troy Hanson who contributed this feature based on a JavaScript by Mihai Bazon. I've simplified things somewhat to match Docbook XSL Stylesheets style, see Troy's http://tpl.sourceforge.net/userguide.html[tpl User Guide] for a fancier layout. Use the `-a toc -a numbered` command-line options to produce a number table of contents. - A http://www.methods.co.nz/asciidoc/music-filter.html[music filter] is included in the distribution `./filters/` directory. It translates music in http://lilypond.org/[LilyPond] or http://abcnotation.org.uk/[ABC] notation to standard classical notation in the form of a trimmed PNG image which is inserted into the AsciiDoc output document. - Incorporated Paul Melis's Win32 filter patch. This workaround allows AsciiDoc to run filters under Windows. - Added `uninstall.sh` script. - Rather than proliferate a confusing number of filter block delimiters the following convention has been adopted: delimiters belonging to DelimitedBlock filters distributed with AsciiDoc will consist of a word (normally a noun identifying the block content) followed by four or more tilde characters. This has necessitated changing existing filter delimiters (the old delimiters still work but may be deprecated in future versions): * The example code filter block delimiter is now the word `code` followed by four or more tilde characters. * The source highlight filter block delimiter is now the word `source` followed by four or more tilde characters. - Conditionally redefined subscript and superscripting so they use the old replacements mechanism when asciidoc7compatible is defined rather than the asciidoc 8 default unconstrained quoting (patch for affected files attached). - Moved the source highlight filter from `./examples/` to `./filter/`. - Added `\{verbose}` intrinsic attribute (useful for passing verbose flag to filters). - Added `\{outdir}` intrinsic attribute. - Renamed `\{docdir}` intrinsic attribute to unambiguous`\{indir}` (`\{docdir}` still works but may be removed in future release). - If `asciidoc(1)` outputs to stdout then intrinsic attribute `\{docname}` is extracted from the input file name. Version 8.0.0 (2006-08-27) -------------------------- ********************************************************************* This is a major release because changes to quoting and index entry handling may break existing documents (see 'Additions and changes' below and 'Appendix A: Migration Notes' in the AsciiDoc User Guide). Please report any problems you encounter. mailto:srackham@gmail.com['Stuart Rackham'] ********************************************************************* .Additions and changes - Quoting can can occur within words (based on patch submitted by Benjamin Klum). See the 'Unconstrained Quotes' sub-section in the User Guide. - The underline and plus characters can be used as alternatives to the existing apostrophe and backtick quote characters. They are arguably better choices than the apostrophe and backtick as they are not confused with punctuation. - The syntax for index entry macros have have been deprecated from `\+...\+` and `\++...++` to `\((...))` and `\(((...)))` respectively. Rationale: * Bracketing is consistent other with `[[...]]` and `<<...>>` reference macros. * To easily confused with triple plus passthroughs. * To make way for the new monospace quoting. - Superscripts and subscripts are implemented as constrained quotes so they can now be escaped with a leading backslash and prefixed with with an attribute list. - An experimental LaTeX backend has been written by Benjamin Klum (a number additions in this release are to accommodate the LaTeX backend). - `include` macro file names now expand environment variables and tilde expansions. - A configuration file `[quotes]` entry can be undefined by setting to a blank value. - Added `callto` inline macro for Skype 'callto' links. - Added `colnumber` attribute for table data markup. - A leading comment block or comment lines are now skipped (previously a document had to start with either attribute entries or a document Title). - Experimental `rows` attribute (number of source lines in table) available in table markup templates (used by experimental LaTeX backend). - Included install shell script written by mailto:jlm@ofb.net[Jacob Mandelson] for installing the tarball distribution. - Added INSTALL documentation file. - Added 'replacements2' substitution options -- a second replacements section. - Added the ability to redefine 'normal' and 'verbatim' substitutions with `subsnormal` and `subsverbatim` entries in configuration file `[miscellaneous]` section. - By default `AttributeEntry` values are substituted for `specialcharacters` and `attributes`, if you want a different AttributeEntry substitution set the `attributeentry-subs` attribute. - The `name` in `name=value` configuration file entries can now end with a backslash, just escape the trailing backslash with a backslash. For example: abc\\=xyz + Results in `name=abc\` and `value=xyz` -- previously this would have escaped the `=` character. - A blank configuration file section deletes any preceding section with the same name (applies to non-markup template sections). - A command-line attribute value with a `@` suffix does not override existing document and configuration file attributes (normally command-line attributes have precedence over document and configuration file attributes). - `localtime` attribute is now encoded from the native system encoding to the output encoding. Patch submitted by mailto:m_pupil@yahoo.com.cn[FKtPp] -- here's his description of the problem: + ``I am a Chinese user of AsciiDoc and I find that when I use UTF-8 (the default encoding) to write asciidoc documents in Windows platform the resulting html footer line will get screwed. It was caused by a localized tzname that was always encoded in the windows native encoding, which in my case is 'cp936'.'' - a2x(1) can generate Open Document Text files using http://open.comsultia.com/docbook2odf/[docbook2odf]. Currently `docbook2odf(1)` only processes a subset of DocBook, unimplemented elements are skipped. - The a2x(1) format option defaults to `xhtml` (previously a format had to be specified explicitly). - The `-d, \--doctype=DOCTYPE` option has been added to a2x(1) which is a shortcut for `\--asciidoc-options="\--doctype=DOCTYPE"`. - Replaced a2x(1) `\--no-icons` and `\--no-copy` options with their negated equivalents: `\--icons` and `\--copy` respectively. The default behavior has also changed: copying and use of icons is disabled by default. Rationale: * To make the default behavior more consistent since use of icons and CSS stylesheets does not apply to all formats. * To make the default behavior less surprising (the creation of icon and stylesheet output files must now be explicit). - a2x(1) has been bumped from version 0.1.1 to version 1.0.0. .Bug fixes - Removed duplicate `./doc/a2x.1.txt` from distribution tarball. - Documentation errata. - Attribute replacement is no longer performed twice in Titles and AttributeEntrys. - a2x(1) skipped asciidoc(1) execution when rerun with different `\--asciidoc-options` options, it now always executes asciidoc(1). The problem was that previously asciidoc(1) was executed only if the output file was missing or older than the source file. Version 7.1.2 (2006-03-07) -------------------------- .Additions and changes - Support for http://www1.chapman.edu/~jipsen/mathml/asciimath.html[ASCIIMathML] has been added. See 'Appendix I: ASCIIMathML Support' in the User Guide and the examples at http://www.methods.co.nz/asciidoc/asciimath.html. - You can now prefix quoted text with inline attributes lists. You can use this to set font size and color (XHTML and HTML outputs). - Added `\##...\##` quoting -- it does nothing -- it's purpose is to allow inline attributes to be applied to normal text. - An link:userguide.html#X50[inline passthrough] mechanism has been implemented. - Configuration file comment lines can be escaped with a backslash -- this is to allows the inclusion of configuration lines that start with a hash character. - The `scriptsdir` attribute can be used to specify the name of the directory containing linked JavaScripts (see the link:userguide.html#X33[User Guide] for details. - The BackendBlock has been renamed PassthroughBlock for consistency with the new inline passthrough naming. - `a2x(1)` now works with the older `bash(1)` version 2.05b. Patch submitted by mailto:francis@daoine.org[Francis Daly]. - Content included by the `\include1::[]` system macro is no longer subject to attribute substitution so that ambiguities no longer arise when used to include CSS or JavaScript files. Version 7.1.1 (2006-02-24) -------------------------- .Additions and changes - The `caption` attribute can be used to customize admonition captions as well as image, table and example block element title prefixes (`xhtml11` and `html4` backends). - You can now override the default icon image using the `icon` attribute to specify the path of the linked image (xhtml11 and html4 backends only). - The deprecated `imagesdir` attribute is no longer recognized (use `iconsdir` instead). - Added 'Appendix H: Using AsciiDoc with non-English Languages' to the AsciiDoc User Guide. - Added 'Admonition Icons and Captions' subsection to the User Guide explaining how to customize Admonition elements. .Bug fixes - `a2x(1)` failed when configuration files were installed in the global `/etc/asciidoc/` directory -- it was only searching the directory containing the asciidoc executable (thanks to Christian Wiese for finding and submitting a patch this bug). - The html4 backend admonition caption now correctly displays the admonition `caption` attribute (previously displayed the `style` attribute). Version 7.1.0 (2006-01-13) -------------------------- .Additions and changes - `a2x(1)` toolchain wrapper utility. This overcomes the biggest hurdle for new users which seems to be assembling and using a working DocBook XML toolchain. With `a2x(1)` you can generate XHTML (chunked and unchunked), PDF, man page, HTML Help and text file outputs from an AsciiDoc input file with a single command. All you need to install (in addition to AsciiDoc) is xsltproc(1), DocBook XSL Stylesheets and optionally FOP (if you want PDF) or lynx(1) (if you want text). - Block titles can now start with any non-space character (previously where not allowed to start with `.~-_` characters). - `./stylesheets/docbook.css` renamed to `./stylesheets/docbook-xsl.css` to clarify its function. - Renamed `./docbook-xsl/manpages.xsl` to `./docbook-xsl/manpage.xsl` for consistency. - Admonition and navigation icons moved to `./images/icons/` to clarify usage and conform with a2x(1) usage. - Renamed xhtml11 intrinsic attribute `imagesdir` to `iconsdir` to keep vocab consistent and changed default value to `./images/icons` (previously `./images`). `imagesdir` attribute still accepted but deprecated. - Unused image files have been weeded out of the distribution. - Packager notes (appendix B) have been updated to reflect the needs of `a2x(1)`. IMPORTANT: The renaming of the xhtml11 backend `imagesdir` intrinsic attribute and it's new default value introduces a backward compatibility issue: if you use the `icons` attribute you will need to either move your icons to the new default `./images/icons` location or include an `--attribute{nbsp}iconsdir="your_icons_path"` option in your asciidoc commands. .Bug fixes - Backslash line continuation is now observed in verbatim paragraphs. - Fixed errors generated by example `./examples/website/build-website.sh` script. Version 7.0.4 (2005-12-08) -------------------------- .Additions and changes - Added ternary conditional attributes `\{<name>@<regexp>:<value1>[:<value2>]}` and `\{<name>$<regexp>:<value1>[:<value2>]}`. - Safety violations now generate errors (they previously generated warnings). - asciidoc(1) now defaults to safe mode, consequently the `[miscellaneous]` safe mode entry and `--safe` command-line option are no longer necessary (though for backward compatibility asciidoc(1) still accepts the `--safe` option). - Backend Blocks are now flagged unsafe (they could be used to include arbitrary and hence potentially unsafe output content). - Filters are no longer considered unsafe. There's not much point in insisting on filter safety since the installation of an unsafe filter would require the introduction of new or modified configuration files -- if your application configurations can be compromised you're in all sorts of trouble (safe mode protects against unsafe input files not unsafe configuration). As with all filters, before installing, you should verify that they can't be coerced into generating malicious output or exposing sensitive information. .Bug fixes - Fixed a lot of glaring grammatical and factual errors in the User Guide. Version 7.0.3 (2005-12-01) -------------------------- .Additions and changes - Added `--safe` and `--unsafe` command-line options -- AsciiDoc can now be executed in a 'safe mode' which disallows the execution of arbitrary code or the inclusion of arbitrary files (see link:userguide.html#X39[Appendix C in the AsciiDoc User Guide]). - Included link:source-highlight-filter.html[source-highlight filter] in the distribution `./examples/source-highlight-filter/` directory (based on filter submitted by mailto:trolocsis@gmail.com[Ryan Phillips]). - Included the DocBook XSL Stylesheets 1.69.1 customizations used to generate the distributed AsciiDoc documentation (read the `asciidoc-docbook-xsl.txt` file in the distribution `./docbook-xsl/` directory). - AsciiDoc DocBook XSL Stylesheet drivers moved from `./doc/` to `./docbook-xsl/`. - Modified `./doc/manpages.xsl` so only URL content is displayed in manpages. .Bug fixes - Explicitly set table CSS border style (`xhtml11` backend) to `solid` because default border styles vary from browser to browser. Version 7.0.2 (2005-08-28) -------------------------- .Additions and changes - There are now long versions of all AsciiDoc options. - If the `--backend` is not specified it defaults to `xhtml11`. - Added CSS simulated frames layout to the examples website (see `./examples/website/layout2/README-website.txt`). This layout does not work with IE6 and the original tables based layout is still the default. - Support page added to AsciiDoc website. .Bug fixes - Invalid options are now trapped gracefully. - Documentation errata. Version 7.0.1 (2005-06-24) -------------------------- .Additions and changes - Reverted to use of `strong`, `em`, `tt` XHTML tags -- they're more obvious and no less correct than `span` tags, besides, the generated file sizes are smaller (the 'User Guide' was 11% smaller). - Table title rendered with `caption` tag rather than a separate `div`. - The AsciiDoc 'stylesdir' attribute (if specified) is now recognized when searching for embedded stylesheets (previously only searched default `./stylesheets` directory). - Default charset encoding changed from ISO-8859-1 to UTF-8 -- it's less language specific and displays most common languages. - `\template::[]` macros now expand in all configuration file sections previously only in markup template sections. - Cleaned up example website layout CSS and configuration (presentation has not been changed). - Refactored `xhtml11.conf` configuration file. - Set consistent and sensible permissions on distributed files. - White space is now stripped from DSV formatted table cell data. - `class="tableblock"` attribute added to tables generated by `xhtml-deprecated-css.conf` to assist CSS. .Bug fixes - Illegal character set encoder (specified by the AsciiDoc `encoding` attribute) and character data are trapped gracefully. - AsciiDoc table 'format' attribute in table attribute lists were not recognized. - The nested horizontal labeled list example in the 'AsciiDoc User Guide' has been dropped -- it generated invalid DocBook markup. Version 7.0.0 (2005-06-06) -------------------------- *************************************************** This is a major release with many code and documentation changes. Please report any problems you encounter. mailto:srackham@gmail.com['Stuart Rackham'] *************************************************** .Additions and changes - A new 'xhtml11' backend generates XHTML 1.1 with integrated CSS2 replacing the previous 'xhtml', 'css', and 'css-embedded' backends. - The CSS stylesheets have finally been rewritten. - The asciidoc(1) command help now includes user link:userguide.html#X36[customizable help] topics. When asciidoc is invoked with the `\--help` option the command argument is interpreted as a help topic. - The previous example website has been replaced by the actual AsciiDoc website (see `./examples/website/`. - XHTML generation options now controlled by the following attributes: 'badges', 'linkcss', 'icons', 'numbered', 'quirks', 'theme', 'stylesdir', 'imagesdir' (see the link:userguide.html#X33[User Guide] for details. - By default HTML and XHTML are output as stand-alone documents (no embedded CSS and no linked admonition icon images). - Documents encoded with the UTF-8 Unicode character set are now processed thanks to a patch supplied by mailto:viktor@rbg.informatik.tu-darmstadt.de[Viktor Vasilev]. - The `-a ^name` command-line syntax to undefine an attribute has been deprecated in favor of the `-a name!` syntax. - AttributeEntry syntax addition: `:name!:` to undefine `name` attribute. - Added `template` system block macro to allow the inclusion of one configuration file template section within another. - A 'verse' style attribute can now be applied to literal paragraphs and blocks to reproduce line breaks and white space from the source document. - Replacements and Special Words can now be escaped with leading backslashes. - Replacements are now processed in configuration file order (previous ordering was indeterminate). - System macros can now be used in the base `asciidoc.conf` configuration file. - Deprecated features that emitted warnings in prior versions are no longer tolerated. - The `eval` system attribute expression evaluates to `False` the attribute is undefined, if it evaluates to `True` the result is an empty string. - The Paragraph and DelimitedBlock 'presubs' parameter can be aliased as 'subs'. - Added 'verbatim' substitutions option. - Renamed 'List Continuation Block' to 'List Block' and renamed the 'listcontinuation' option to 'list'. - Deprecated 'default' substitutions option (use 'normal' instead). - The 'section-numbers' section numbering attribute has be renamed 'numbered'. - Dropped the '\#UNDER CONSTRUCTION#' block macro. - Rewrote Paragraph and DelimitedBlock handlers adding a link:userguide.html#X23[styles] configuration entry. .Bug fixes - Included files are no longer read inside conditionally excluded content. - Manpage command names containing dashes (in the manpage NAME section) were misinterpreted as the spaced dash command name/purpose separator. Bug report and patch supplied by mailto:david@dgreaves.com[David Greaves]. - Unexpected error following malformed author line error. Version 6.0.3 (2005-04-20) -------------------------- .Additions and changes - Special characters are now substituted in AttributeEntry element values. - Spaced and unspaced em dashes are now recognized (previously only spaced em dashes were recognized). - Replaced the table 'noborders' option with richer 'frame' and 'grid' attributes. - The `duplicate macro` warning message now only occurs when the verbose (`-v`) option is enabled. - Single lines starting with two forward slashes hard up against the left margin are treated as comments and are not processed. - Renamed 'section' delimited block option to 'sectionbody' to more accurately reflect it's role. - Added a List Continuation block -- a specialized delimited block that is functionally equivalent to the List Item Continuation feature except that the list contained within the block does not require explicit '+' list item continuation lines. - Dropped deprecated `<u>` tags from generated HTML. - Literal Block delimiters must now consist of at least four points (previously three) to avoid lone ellipsis ambiguity. .Bug fixes - Some system attribute evaluation failures caused unexpected exceptions to occur. Version 6.0.2 (2005-03-30) -------------------------- .Additions and changes - Three new 'system' block macros have been added -- `eval`, `sys` and `sys2` which are the block macro equivalents to the same named system attributes. - 'Intrinsic' macros have been renamed 'system' macros along with 'action' attributes which have been renamed 'system' attributes: * To reflect their common (though contextually different) behavior. * To avoid confusion with 'intrinsic attributes'. .Bug fixes - Asciidoc now searches in `/etc/asciidoc/filters` for filters. Version 6.0.1 (2005-03-06) -------------------------- .Additions and changes - A global configuration file location `/etc/asciidoc` has been added and is now processed before all other locations (patch supplied by mailto:stone@debian.org[Fredrik Steen]). - Recoded `tempfile.mktemp()` and other artifacts that are no longer necessary or desirable (patches supplied by mailto:stone@debian.org[Fredrik Steen]). - Added BUGS file to the distribution. .Bug fixes - Illegal comment syntax in `css-embedded-stylesheet.conf` resulted in illegal CSS in files generated by the `css-embedded` backend. Version 6.0.0 (2005-01-28) -------------------------- *************************************************** This release has had some fairly major code and documentation changes. Please report any problems you encounter. mailto:srackham@gmail.com['Stuart Rackham'] *************************************************** A lot of new stuff. A new major version number -- some regression incompatibility (hopefully mitigated by 'deprecated' warnings). Went mad trying to rein in the current feature anarchy -- established a unified notion of document attributes. Attempted to introduce a consistent vocabulary -- renamed many poorly or inconsistently named entities. Actually, deprecated syntax is still processed correctly in almost all cases. One source of incompatibility that may arise if you have customized CSS stylesheets is the change of AsciiDoc CSS class names (see below). I guess the moral is if you've done a lot of configuration file customization and are happy with version 5 then you may want to stay put. NOTE: This version requires Python 2.3 or better to run. .Additions and changes - 'Glossary entries' have been renamed 'attributes'. This eliminates confusion with the accepted meaning of glossary. - An `AttributeEntry` block element has been added so that document attributes can be assigned from within an AsciiDoc document. - The `AttributeList` block element has been added which is a more general solution than the (now deprecated) DelimitedBlock arguments. - An BlockId element has been added for setting block element anchor (link target) IDs. - Quoted text can now span multiple lines (thanks to James Bowlin for this patch). - Inline macros can now span multiple lines. - \``double backtick / apostrophe'' quotes generate ``curly quotes''. - A warning is now emitted for out of order list item (applies to explicitly enumerated numbered list items). - Added `include` action attribute. - A line of three or more apostrophes generates an HTML horizontal ruler (`<hr/>` tag). You will get a warning if processed with non-HTML backend. - An `\{imagesdir}` attribute specifies image file location for images referenced in configuration files when generating HTML (the default location is `images`). - An `\{stylesdir}` attribute specifies the location of CSS stylesheets when generating styled HTML (the default location for configured markup is `.`). - The use of the (often inappropriately named) `{caption}` attribute list entry has been deprecated, use `\{0}` instead. - New 'ExampleBlock' delimited block along with associated variants Note, Tip, Warning, Caution and Important. - The `docbook.conf` file now facilitates the optional inclusion of a DocBook revision history file. - To better reflect their purpose the following block elements have been renamed: `VerbatimBlock` to `ListingBlock`; `IndentedBlock` to `LiteralBlock`; `IndentedParagraph` to `LiteralParagraph`; `CustomBlock` to `BackendBlock`; `SimpleSection` to `SectionBody`. Any corresponding CSS class names have also been changed which could result in backward incompatibility in customized stylesheets. - Swapped plain DocBook admonition icons for Jimmac's DocBook icons (http://jimmac.musichall.cz/ikony.php3). The original plain icons have been moved to `./images/plain`. - Renamed `html` backend to `xhtml` to better reflect it's function (former `html-4` backend renamed to `html`). - A new inline anchor macro syntax `[[[<id>]]]` is available, it displays `[<id>]` at the anchor location and is for anchoring bibliography list entries. - An optional 'single-line titles' syntax can be used. - Tweaks to distributed CSS stylesheets and FOP `fo.xsl` customization file. - 'List Item Continuation' has been implemented which allows additional block elements to be included in list items by separating them from the preceding list item element with a line containing a single plus character. - A new 'Horizontal Labeled List' list type has been added. Generates two column list -- the first column contains the list element labels, the second contains the element text. Same syntax as `Vertical Labeled Lists` except the double colon label suffix is followed by the start of the list item text. .Bug fixes - Fixed broken backslash line continuation. - Labeled list end tags were not undergoing attribute substitution. - Documents without any author information now generate legitimate DocBook (previously if the author line was not included in the document header then an empty (illegal) DocBook `author` element was generated). - Multiple spaces in filter command arguments were replaced by a single space. The `./examples/asciidoc2text/asciidoc2text.sh` script now indents text correctly. Version 5.1.1 (2004-10-10) -------------------------- *15-December-2004: Interim update:* Updated `asciidoc.py` to fix broken `join_lines` function -- no other changes. - PDF documentation is now produced from DocBook XML using XSLTLib and FOP. Previously we processed DocBook SGML with `jw(1)` (which used Dvips to convert DVI files to PDF). FOP has come a long way in the last 12 months and produces very acceptable PDF under both Linux and Windows. - Sections detailing how to install and use the DocBook XSL Stylesheets, xsltproc, FOP toolchain and the AsciiDoc XSLT drivers have been added to the User Guide. - The PDF output from the he example article template has been included in the distribution (`./doc/article.pdf`). - Special characters are emitted using decimal Unicode character codes (previously used named character entities which cannot be assumed included in non-HTML documents). - Added registered trademark (R) to `[replacements]`. - CSS stylesheet tweaks. - Admonitions (Note, Tip, Important, Warning, Caution) include icons when generating css output. Version 5.1.0 (2004-09-18) -------------------------- - Callouts have been implemented (see the 'Callouts' section of the AsciiDoc User Guide for details). - Added XSL drivers for generating XHTML, chunked XHTML and HTML Help from DocBook XML using XSL stylesheets and xsltproc(1). - Added CSS stylesheet for HTML generated from DocBook XML using XSL stylesheets. - Distribution contains HTML Help formatted User Guide (`./doc/asciidoc.chm`), the User Guide tells you how it's generated. - Images referred to by distributed stylesheets are now located in the `./images` subdirectory (previously located in `.`). - Filters path names are now handled properly under Cygwin. - The usual documentation and examples additions, updates and polishing. Version 5.0.9 (2004-09-09) -------------------------- - The convention of using a `.asc` file extension for AsciiDoc files has been dropped in favor of the familiar `.txt` extension. It makes more sense in that AsciiDoc is a text presentation format and because `.asc` clashed with the same extension used by other applications. It's only a naming convention -- you don't have to switch if you don't want to. - Changed the subscript formatting character from underline to tilde since underscores in file names are reasonably common (especially in link and image macros). - An alternative syntax for the index term inline macro has been added: `++<primary>,<secondary>,<tertiary>++`. - Index terms that have secondary and tertiary entries now additionally generate separate index terms for the secondary and tertiary entries. - A `+<primary>+` index term inline macro has been added which displays the term in the primary text flow. - Added alternative variable list definition using double semi-colon terminator as opposed to the standard double colon terminator so variable lists can be nested to two levels. - Footnotes now appear on a separate line in HTML and Linuxdoc outputs. - Python version compatibility is checked at startup. - Preface and appendix section titles in multi-part Book documents are meant to be out of sequence -- warnings are no longer emitted when outputting HTML. - Empty section warnings have been replaced by error messages and are emitted only if invalid markup would result. - Missing macro sections or invalid macro name warnings are only generated at startup if the `-v` (verbose) option is set. Otherwise they are deferred until a matching macro is encountered in the input file. - Missing or invalid table definition warnings are only generated at startup if the `-v` (verbose) option is set. Otherwise they are deferred until a matching table is encountered in the input file. - AsciiDoc now makes more of an effort to continue in the face of errors. - Fixed broken `./examples/website/main.aap` script. - Converted distribution text files DOS text format as a sop to Windows users with challenged text editors. - Documentation additions and corrections. Version 5.0.8 (2004-05-15) -------------------------- - Spurious 'out of sequence' level 2 warnings no longer appear when processing 'book' document multi-part book top level Preface and Appendix sub-sections since they are (correctly) out of sequence. - A warning is no longer emitted for empty Index sections since this is normal when generating DocBook outputs. - Fixed: `[quotes]` configuration file entries where not being overridden by downstream configuration file entries. - Footnote text is now output enclosed in square brackets in HTML documents. - Added superscripts and subscripts to the standard PRS configuration files. - Adjusted CSS stylesheets so list titles don't have so much space between title and first list item (broken in IE6 due to poor CSS compliance). Lessened sidebar title top margin. Version 5.0.7 (2004-04-22) -------------------------- - The version 5.0.6 README incorrectly stated that AsciiDoc would run under Python 2.0, in fact it requires Python 2.1 or better. The README has been corrected. - Documented techniques for combining and splitting AsciiDoc documents and processing the combined and split parts (see the 'Tips and Tricks' section of the User Guide). - An example of marking up superscripts and subscripts is documented in the 'Tips and Tricks' section of the User Guide (the example configuration file is in the AsciiDoc `examples` directory). - Added ellipsis to shipped `[replacements]`; three periods output an ellipsis entity. - Removed unused 'SectionClose' class. - The AsciiDoc 'Preamble' element is output as a DocBook 'Preface' when processed as a 'book' document type (in older AsciiDoc versions a warning was issued and processing stopped). - Fixed a quoting anomaly: quoted text can no longer begin or end with with white space. Version 5.0.6 (2004-03-07) -------------------------- - New 'image' macro implements optional image scaling and linking and works in both inline and block contexts. The 'image' macro obsolesces the existing 'graphic' block macro and 'icon' inline macro. - Macro substitution section names now have `-inlinemacro` and `-blockmacro` suffixes to resolve context ambiguity, make their purpose clearer and relieve section namespace congestion. - Header derived glossary entries can now be overridden from the command-line. - Special character substitution is now performed on AuthorLine derived author names. - A macro or block argument called 'options' can be used as a shortcut for a list named arguments with zero length string values. - Tables can be output without borders using the `options="noborders"` argument. - Table data lines that do not immediately follow a table section underline can now be blank. This allows CSV data with embedded blank lines to be processed correctly. - Blank DSV format table data lines are silently skipped. - Tightened up on enforcement of configuration file section names to reduce the possibility of section content being seen as a section header line. - Section titles can be optionally suffixed with title arguments enclosed in double square brackets. - A replacement has been added to `asciidoc.conf` to replace inline double dashes with the `—` entity. - Changed the `.UNDER-CONSTRUCTION.` macro syntax to `\#UNDER-CONSTRUCTION#` so it is not mistaken for a BlockTitle. Similarly changed the `.NEW.` replacement with `{amp}\#35;NEW{amp}#35;`. - `{amp}\#35;NEW{amp}#35;` and `\#UNDER-CONSTRUCTION#` macros are now included in the DocBook backend. - Replaced shipped `smallnew.gif` with `smallnew.png`. - Documentation tidy ups. Version 5.0.5 (2004-02-25) -------------------------- - Fixed the disappearing paragraph titles problem that was caused by Inline macros (incorrectly) processing BlockTitles. - Tightened AuthorLine validation. Previously invalid email addresses and embedded special characters in the AuthorLine resulted in invalid output markup. Version 5.0.4 (2004-02-09) -------------------------- - Reinstated missing `infile`, `outfile`, `filetype` and `filetype-<filetype>` glossary entries. - As of version 5.0.3 asciidoc(1) now requires Python 2.0 or greater, this has now been documented. Version 5.0.3 (2004-01-23) -------------------------- - Fixed problem that caused any filters directory file containing `.conf` (not just those with the `.conf` extension) from being loaded. - All `[miscellaneous]` configuration file entries can now be referenced like glossary entries (they are now processed internally as glossary entries). - The output file line terminator (previously hardwired to `\r\n` is now set using the `newline` entry in the configuration file `[miscellaneous]` section. - The misspelt `blocktitles` configuration file entry name has been corrected (to `blocktitle`). - An `\{empty}` glossary entry has been added to the default configuration which is useful for outputting trailing blank lines from configuration file substitution sections. Version 5.0.2 (2003-12-18) -------------------------- - New (alternative) 'anchor' and 'xref' macro syntax (old syntax still valid). - DocBook `mediaobject` and `inlinemediaobject` tags are generated in place of `graphic` and `inlinegraphic` tags by the AsciiDoc `graphic` and `icon` macros. If a macro argument is specified it is the alternative text output if the target document format does not support the specified graphic file format. - Dropped the LinuxDoc left and right square bracket special character substitutions as they interfered with macro substitution. - Documentation updates and corrections. Version 5.0.1 (2003-12-09) -------------------------- - Fixed problem with anchor tag when generating CSS styled HTML. Version 5.0 (2003-12-08) ------------------------ *************************************************** This release has had some fairly major code and documentation changes. Please report any problems you encounter. mailto:srackham@gmail.com['Stuart Rackham'] *************************************************** - AsciiDoc can now produce a full-blown multi-part DocBook book including dedication, abstract, preface, colophon, glossary, appendix, bibliography and book part elements using the new `specialsections` configuration file section. - All Section element children (Paragraph, DelimitedBlock, List, Table, BlockMacro) can now be titled using the BlockTitle element. A BlockTitle element is a single line containing a title and beginning with a period. - The `index` and `backmatter` macros have been dropped, superseded by `specialsections`. - The AsciiDoc 'Preface' element has been renamed 'Preamble' (to avoid confusion with the DocBook book preface element). - Out of sequence titles are now tolerated with a warning. This allows book document level 0 sections to be processed. - An 'anchor' inline macro has been added for document link target creation. - 'Note', 'Tip', 'Important' and 'Warning' paragraph types have been added to support the corresponding DocBook elements. - Title substitution is now performed in SidebarBlock titles. - DocBook graphics now output as `figure` and `informalfigure` elements rather than `mediaobjects`. This ensures numbered figures and a lists of figures are produced by the DocBook toolchain. - You can now escape block argument lines by appending a backslash. Alternatively, if you embed arguments in the delimiter line AsciiDoc does not check for an arguments line. - The default DocBook backend file extension has been changed from `.docbook` to `.xml` (`.sgml` for the 'docbook-sgml' backend). - Warnings are output by default (previously they only printed when verbose option enabled). - A Question and Answer variable list definition has been added to the shipped configuration files, primarily to create DocBook `qanda` DocBook elements. - Fixed broken code-filter `-b linuxdoc` option. The asciidoc.asc User Guide can now be processed by linuxdoc(1) (although tables are dropped because LinuxDoc does not implement tables). .Compatibility issues: 1. Table titles are no longer in the arguments line, use the new BlockTitles. 2. Graphic titles are no longer in the 'graphic' block macro caption, use the new BlockTitles. 3. The code-filter title must be placed in a preceding BlockTitle. 4. SidebarBlock titles must be placed in a preceding BlockTitle. 5. The DelimitedBlock option 'sidebar' has been renamed to 'section'. 6. The default DocBook backend file extension has been changed from `.docbook` to `.xml` (`.sgml` for the 'docbook-sgml' backend). Version 4.2 (2003-11-26) ------------------------ - The default HTML output is now XHTML 1.0 markup. To output the former HTML 4 markup specify the `html-4` backend. - The default DocBook output is now DocBook XML. To output the former DocBook SGML specify the `docbook-sgml` backend. The associated `docbook-sgml.conf` file illustrates how to support minor DTD variations. Examples of using the `xmlto(1)` command for DocBook conversion have been added to the User Guide. - Glossary entries set using the command-line -g option can now be referenced in configuration files. - Configuration dumps (`-c` command-line option) no longer output redundant undefined glossary entries. - DelimitedBlock arguments can now be specified in a separate arguments line immediately following the leading delimiter line, This is in preference to the existing delimiter embedded arguments. Reasons: * The syntax is in keeping with the Tables arguments syntax. * It's easier to enter and implements line continuation. - A new QuoteBlock DelimitedBlock definition has been added to the distribution configuration files. - The table arguments lines can be continued using the backslash line continuation character. - Added new calculated glossary reference type `\{<name>%<value>}`. - Double-quote characters can now appear in unquoted positional arguments. Version 4.1 (2003-11-13) ------------------------ - Added DSV (Delimiter Separated Values) tables format. - `\{eval:<expr>}` glossary references drop the containing line if `<expr>` evaluates to `None`. - Block, Table and Macro arguments can now be positional (quoted or unquoted). - Vocabulary change: DelimitedBlock, Table and Macro 'attributes' are now referred to as 'arguments'. This makes more sense in light of the extended syntax and avoids confusion with backend markup tag attributes. - 'tablewidth' table ruler parameter can now be expressed in percent units (0..100). If between 0 and 1 then the original fractional unit measure is applied. - The use of quoting for generating footnotes and index entries has been dropped in favor of 'footnote' and 'indexterm' inline macros. - 'backmatter' inline macro included in distribution. - Fixed: CSS styled HTML tables are now fully XHTML 1.0 conformant. - Fixed: 'tablewidth' was processed incorrectly when passed as table argument. - Fixed: Glossary references like `\{x=\{y}}` were one character off if \{x] was defined and `\{y}` was not. Version 4.0 (2003-11-08) ------------------------ *************************************************** This release has had some fairly major code and documentation changes. Please report any problems you encounter. 'Stuart Rackham' *************************************************** - Added tables to AsciiDoc. - Added two special 'subs' options: 'default' specifies the default substitution options and 'none' specifies no substitution. These options can only appear singly. - Line continuation using a trailing backslash character is available in Paragraphs, ListItems, Tables. - The left and right quotes for quoted text can now be specified separately. - Shipped configuration files implement footnotes (only useful for DocBook output) using \[[]] quoting. - Shipped configuration files implement index terms (only useful for DocBook and LinuxDoc output) using \(()) quoting. - The shipped 'html' backend configuration now emits valid 'HTML 4.01 Transitional'. - Added new calculated glossary reference types `\{<name>!<value>}` and `\{<name>#<value>}`. - The DelimitedBlock 'params' option has been dropped in favor of the new 'block attributes' mechanism. If you have customized block params options you may need to adjust source files to use the 'block attributes' syntax. The example code filter has been updated to reflect these changes. - The code filter now has a `-t tabsize` option. - Replaced `-w` option with `-v` (verbose) option. The warnings option was just to confusing. - Named attributes can now be specified in macro calls. - The 'tabsize' attribute is recognized in the built-in `include` macros. A tabsize of zero suppresses tab expansion. - The configuration file `[options]` section has been split into `[miscellaneous]` and `[titles]`. If you have customized any of these settings you will need to adjust the affected configuration files. - Configuration file `[miscellaneous]` entries can now also be set using the command-line `-g` option. - Fixed: error that occurred when attempting to use zero length configuration and source files. - Fixed: blocking filter halt problem. - Fixed: inline macro escape prefix problem. - Fixed: missing macros from configuration dump problem. - Fixed: named macros were dumped incorrectly. - Many documentation changes/additions/corrections. Version 3.2.2 (2003-10-26) -------------------------- - Added `-n` option (synonym for `-g section-numbers`). - Dropped the processing commentary (hey, this is Unix). - Added new calculated glossary reference type `\{<name>?<value>}`. `<name>` is the glossary entry name and `<value>` is the text substituted if the glossary entry is defined. `<value>` can only contain literal text (no glossary references allowed). - Added `asciidoc2text` to distribution `examples/asciidoc2text` directory (converts AsciiDoc source to text file with section numbering). - Fixed incorrect nesting of Simple lists inside Variable lists. - List definitions have been modified so that list items can be indented. This allows a more intuitive indentation of nested lists in AsciiDoc source. - Lists must be separated from preceding paragraphs by a blank line. This is to avoid paragraph lines being mistaken for list items. - Corrected asciidoc man page documentation error: the`-f` option does *not* search relative to source document directory for the configuration file. - Minor updates to various distribution `.conf` files. - Included `badges.conf` in `examples` directory. - `css-embedded-stylesheet.conf` now supports footer badges. - The default in-line element processing order has been changed: Glossary References are now processed before Inline Macros. This allows glossary expansions to occur inside macro references. - Glossary entries are now allowed in Author and Revision lines. - Default List `subs` options and Paragraph `presubs` options are assigned the following default value if not specified: specialcharacters,quotes,specialwords,replacements,glossary,macros - Documentation changes/additions/corrections. Version 3.2 (2003-05-26) ------------------------ - Added a `-s` command-line option to suppress the output of `[header]` and `[footer]` sections. - Article document headers are no longer mandatory: this allows AsciiDoc to process arbitrary chunks of text. When used in conjunction with the new `-s` command-line option corresponding chunks of backend markup can be generated. - AsciiDoc now emits a warning message and continues when an out of sequence section title is detected (previously it failed and halted). This allows document sections to be processed separately. - Optional 'presubs' and 'postsubs' entries have been added to 'DelimitedBlock' and 'Paragraph' definitions. As a consequence substitution options are no longer legal in 'options' entries. - 'presubs' and 'postsubs' substitutions are processed in the order the options are specified (rather than the fixed 'options' order of previous versions). - ./filters subdirectories are automatically searched for filter commands. - A 'title-subs' configuration option specifies the substitutions performed on document Header and Section titles. - A 'subs' entry in now included in List configuration file definitions that specified substitutions performed on list entry text. - Configuration files are auto-loaded from ./filters subdirectories. - Added example code filter (see ./examples/filters). - Bug fix: if section was empty you may have got erroneous 'missing tag "paragraph"' error. - Internal code tidy up. Version 3.1 (2003-05-18) ------------------------ - In version 3.0 a `[macros]` section entry of the form 'name' was equivalent to 'name='. An entry of the form 'name' now undefines the entry (to bring it in line with the behavior of other special sections). - Paragraphs have now been generalized (in the same way as Lists and DelimitedBlocks). - The 'indentsize' option has been dropped as as consequence of paragraph generalization. - Pipe | characters can be included in substituted tag and substitution section text using the \{brvbar} (broken vertical bar) glossary reference. - Removed the restriction requiring substitution section text placeholders | to be on a separate line. - Added an `-e` asciidoc(1) command option that excludes implicit configuration files (used in conjunction with `-c` generated configuration files). - Version 3.0 documentation has undergone a considerable cleanup. - The dumping of quoted section entries (see `-c` option) now works correctly. - The format of special section entries has been made consistent: `name` undefines the entry; `name=` sets the entry value to a blank string; `name=value` sets the entry value to `value`. - As a consequence of the previous change the caret prefix is no longer used in glossary configuration file entries (although it is still used when undefining an entry using the `-g` command-line option). Version 3.0 (2003-05-13) ------------------------ This version is the culmination of work begun in the 2.x releases whereby fixed policy has been replaced by extensible mechanisms. - Added `-c` command-line option to dump a composite asciidoc(1) configuration file to stdout. - Lists and Delimited Blocks are now defined by a set of configuration file parameter sections. The user can modify the default definitions or add new ones. - Block content can now be processed through external filters. - The default behavior for Custom Blocks is to perform glossary substitution (previously there was no substitution inside Custom Blocks). - The old 2.x style macros have been reimplemented; as with Lists and Delimited Blocks there syntax and behavior can be configured by the user. The default macro syntax remains the same but the semantics are now (hopefully) a bit more intelligible. - Block and Builtin macros use :: delimiter instead of the 2.x single colon delimit (to distinguish them from inline macros). The 2.x syntax is still supported for backward compatibility. - Nested lists are now supported and IndentedParagraphs can be included in list items. - Conditional source inclusion can be specified using built in `ifdef`, `ifndef` and `endif` macros. - The new conditional source inclusion feature has been used to reduce the number of default configuration files down to one per backend. - A change of name: 2.x 'Substitutions' are now called 'Replacements' and the 2.x `[substitutions]` configuration file section is now called `[replacements]` (the old name is still recognized for backward compatibility). - The line break is now implemented as a 'Replacements' substitution. - Inline 'icon' macro for inline images has been added to default configuration files. Version 2.2 (2003-04-07) ------------------------ - The `master.conf` configuration file name has been deprecated in favor of `asciidoc.conf`. - The standard configuration files set is now loaded from the `.asciidoc` folder in the users home directory (if it exists) and then from the source document directory. Configuration files that don't exist are silently skipped. - Configuration files named like the source file will be automatically loaded if they are found in the source file directory. For example if the source file is `mydoc.asc` and the `-b html` option is used then asciidoc(1) will look for `mydoc.conf` and `mydoc-html.conf` in that order. - The characters used to quote formatted text can be configured and extended by the user (see the master.conf [quotes] section). - Quoted text can now be escaped by prefixing a backslash character to the leading quote. - The double single-quote '' strong text quote has been deprecated in favor of an asterisk * character. - Added \{eval:expression}, \{sys:command} and \{sys2:command} glossary reference actions. - Trailing brace characters `}` are now allowed inside glossary references provided they are escaped with a backslash character. - Glossary entries can now be escaped by prefixing a backslash character to the leading brace character (use this in preference to placing the backslash inside the brace). - The output macro has been deprecated (use the new include1 macro inside a CustomBlock). - The default document type is `article` (asciidoc no longer attempts to guess). - Files included within DelimitedBlocks are not searched for block termination underlines. This ensures the entire file is part of the DelimitedBlock. - `include` macros can now be used in configuration files. - Corrected \{infile} and \{outfile} glossary entry documentation. - File inclusion is now limited to a depth of 5 to catch recursion loops. - Inline tags have been deprecated, they're not necessary and they immediately make the source document backend specific. Use CustomBlocks or Substitutions instead. Version 2.1 (2003-03-17) ------------------------ - Added section auto numbering `\{sectnum}` glossary entry (auto-numbering function contributed by Ludovico Magnocavallo). - asciidoc(1) now correctly returns non-zero exit status if an error occurs. - An AsciiDoc example website has been included in the AsciiDoc distribution `examples/website` directory (also online at http://www.methods.co.nz/asciidoc/examples/website/). - NOTE: The `asciidoc` wrapper script included in the 2.0 distribution has been dropped, if you've symlinked or aliased to `asciidoc` you'll need to change them to point directly to `asciidoc.py` instead. - An RCS $Id$ marker can be used as the document header revision line (based on a patch submitted by Ludovico Magnocavallo). - In addition to the `name=value` glossary entry format two new ones have been introduced: `name` (the default value is set to an empty string) and `^name` (the glossary entry is undefined). - The `-q` command-line option has been deprecated and the `-w level` command-line option added. + NOTE: By default skipped substitution warnings are now suppressed. - If a configuration file specified with the `-f` command-line option is not found relative to the current working directory then the search is repeated relative to the asciidoc(1) directory. This allows global configuration files to be used. - Added `\{infile}`, `\{outfile}` predefined glossary entries. - Added `under-construction` macro to HTML article configuration files. - Deprecated `\{asciidoc_version}` glossary entry in favor of `\{asciidoc-version}` (to it consistent with other entries). Version 2.0 (2003-02-24) ------------------------ - The emphasized, strong and monospaced words options have been generalized with the introduction of macro based 'special words' lists. - Glossary references can now appear in both the document and macro bodies. - All output files use `crlf` line termination (previously used UNIX `lf` (newline) termination). - Added [substitutions] section which implements arbitrary regular expression based substitutions. - An optional `master.conf` configuration file can be used for entries that are not backend or document type specific. - Special character definitions moved from the code to the new [special_characters] configuration file section. - Configuration file glossary added. - Command-line -g glossary entry added. - A new 'book' document type has been implemented for the 'docbook' backend. It outputs DocBook 'book' documents. - A major internal change has been the implementation of parametrized user definable 'macros'. Internally most document elements are now processed as macros. - Configuration file macro variables can be specified with default values (literals or other macro variables). - An attempt has been made to tighten up the vocabulary used to describe the AsciiDoc document syntax. - The term abstract has been replaced by the more general term 'preface' and a new preface section introduced into article configuration files (replacing the synopsis sections). - Any section elements can now be put in the document preface (previous versions only allowed paragraphs). - AsciiDoc Blocks have been unified and their behavior can be user defined and parametrized. - An 'output' inclusion allows an external file to be written directly to the backend output file. - A new CustomBlock has been added. Default behavior is to insert the enveloped AsciiDoc source lines directly into the output file. - A 'line break' tag can be inserted by terminating a line with a '+' character (only really useful for HTML backends). - An fourth section level has been introduced. - The SidebarBlock delimiter line characters have been changed. The deprecated underline is still accepted. - Levels 2 and 3 title underline characters have been changed. The deprecated underlines are still accepted. - Lines with backend specific inline tags can be inserted into AsciiDoc source files. - Single words enveloped by underscores are no longer emphasized. This feature was deprecated as it is redundant (use single quotes instead) and was being applied to file names with underscores. - A `-q` quiet option has been added to suppress warning messages. - Badge images sourced locally. - Added 'author' and 'author-mail' meta tags to HTML configuration files. Version 1.5 (2003-01-08) ------------------------ - Implemented sidebar document elements. - Explicit checks for user specified configuration files and input file (rather than throwing exception). Version 1.4 (2003-01-04) ------------------------ - New configuration file options 'emphasizedwords' and 'strongwords'. These allow the definition of words that will always be emphasized or rendered in a strong font without inline formatting. - Document and section titles are no long subject to inline formatting. - Multiple configuration files can be overlaid in a single command. - Configuration file tags and options entries can now be overridden on an entry by entry basis (previously the entire section was overloaded). - Configuration file tags and options entries are now cached this has resulted in around 37% performance improvement over version 1.3. - Variable lists can now contain multiple terms per list item. - Placeholder paragraph eliminated from empty sections that contain subsections. - Added \{asciidoc_version} substitution variable. - More documentation additions and tidy ups. Version 1.3 (2003-01-01) ------------------------ - A new 'strong' text formatting convention has been implemented: Word phrases enclosed in pairs of single quote characters (acute accents) are rendered in a strong font (usually bold). - Paragraphs can now be followed immediately by Simple lists and Ordered lists without an intervening blank line. - A user specified configuration file (`asciidoc(1)` -f option) overlays the default configuration file rather than replacing it. Custom configuration files need only contain those sections that have been customized. - Comment Block delimiters have been relaxed slightly. They must start with three forward slashes /// but the remainder can contain any characters, this allows comments to be embedded in the delimiter line. - Leading non-digit characters preceding revision number are now ignored. - Set default indentsize [option] from 2 to documented default value of zero in HTML backend html-article.conf and html-manpage.conf files. - Fixed error that occurred when taking input from stdin without explicitly specifying a document type. - Restored file name and line number error message information. - Changed deprecated -t option to -d in asciidoc --help and usage command output. - CSS styles tweaking. - Code, configuration file and documentation tidy ups. Version 1.2 (2002-12-28) ------------------------ - Implemented 'include' URL to allow file inclusion. - `fileextension` configuration file [option] renamed to more sensible `outfilesuffix` (`fileextension` still accepted by this version but will be dropped in future). - Improved error reporting. - CSS backends generate valid XHTML. - New `css-embedded` backend generates HTML with embedded stylesheets (use the `css` backend for linked stylesheets). The css-embedded backend output contains no linked images so the generated html files are completely self contained. - Bug fixes. Version 1.1 (2002-12-03) ------------------------ - Added css (cascading style sheets) backend - Implemented IndentedBlock document element. - Tabsize command-line option has been deprecated in favor of configuration file. - Default indent width changed to zero. - Added \{localdate} and \{localtime} substitution variables. - Added optional [options] configuration file section with fileextension, tabsize and indentsize options. - Implemented \{authorinitials} substitution variable. - Added https link type. - Corrected [graphic] substitution from \{title} to \{caption} in linuxdoc-article.conf configuration file. - Fixed error that occurred when '==' title underline was used. Version 1.0 (2002-11-25) ------------------------ First AsciiDoc public release along with AsciiDoc web site (http://www.methods.co.nz/asciidoc/) and SourceForge.net project registration (https://sourceforge.net/projects/asciidoc/[]). // vim: set syntax=asciidoc: �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������asciidoc-8.2.7/asciidoc.conf������������������������������������������������������������������������0000644�0001751�0001751�00000024127�11033020637�016102� 0����������������������������������������������������������������������������������������������������ustar �srackham������������������������srackham���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # asciidoc.conf # # Asciidoc global configuration file. # Contains backend independent configuration settings that are applied to all # AsciiDoc documents. # [miscellaneous] tabsize=8 textwidth=70 newline=\r\n [attributes] sectids= iconsdir=./images/icons encoding=UTF-8 quirks= empty= # Attribute and AttributeList element patterns. attributeentry-pattern=^:(?P<attrname>[a-zA-Z0-9].*?):(?P<attrvalue>.*)$ attributelist-pattern=(?u)(^\[\[(?P<id>[\w\-_]+)\]\]$)|(^\[(?P<attrlist>.*)\]$) # Substitution attributes for escaping AsciiDoc processing. amp=& lt=< gt=> brvbar=| nbsp=  backslash=\ two_colons=:: two_semicolons=;; # Captions, used by XHTML backends. # The reason these language specific attributes are not in a lang-en.conf # file is so that the output will fall back to English if the specified # language file is missing. caution_caption=Caution important_caption=Important note_caption=Note tip_caption=Tip warning_caption=Warning figure_caption="Figure: " table_caption="Table: " toc_title=Table of Contents [titles] subs=specialcharacters,quotes,replacements,macros,attributes # Double-line title pattern and underlines. sectiontitle=^(?P<title>.*?)$ underlines="==","--","~~","^^","++" # Single-line title patterns. sect0=^= +(?P<title>[\S].*?)( +=)?$ sect1=^== +(?P<title>[\S].*?)( +==)?$ sect2=^=== +(?P<title>[\S].*?)( +===)?$ sect3=^==== +(?P<title>[\S].*?)( +====)?$ sect4=^===== +(?P<title>[\S].*?)( +=====)?$ blocktitle=^\.(?P<title>([^.\s].*)|(\.[^.\s].*))$ [specialcharacters] &=& <=< >=> [quotes] # Constrained quotes. *=strong '=emphasis `=monospaced ``|''=quoted ifdef::asciidoc7compatible[] \##=unquoted endif::asciidoc7compatible[] ifndef::asciidoc7compatible[] \#=unquoted _=emphasis +=monospaced # Unconstrained quotes. **=#strong __=#emphasis ++=#monospaced \##=#unquoted ^=#superscript ~=#subscript endif::asciidoc7compatible[] [specialwords] emphasizedwords= strongwords= monospacedwords= [tags] # $$ inline passthrough. passthrough=| [replacements] # Replacements performed in order of configuration file entry. The first entry # of each replacement pair performs the (non-escaped) replacement, the second # strips the backslash from the esaped replacement. # (C) Copyright (entity reference ©) (?<!\\)\(C\)=© \\\(C\)=(C) # (R) registered trade mark (entity reference ® (?<!\\)\(R\)=® \\\(R\)=(R) # (TM) Trademark (entity reference ™) (?<!\\)\(TM\)=™ \\\(TM\)=(TM) # -- Spaced and unspaced em dashes (entity reference —) # But disallow unspaced in man pages because double-dash option name prefixes # are pervasive. ifndef::doctype-manpage[] (^|[^-\\])--($|[^-])=\1—\2 endif::doctype-manpage[] ifdef::doctype-manpage[] (^|\s*[^\S\\])--($|\s+)=\1—\2 endif::doctype-manpage[] \\--(?!-)=-- # ... Ellipsis (entity reference …) (?<!\\)\.\.\.=… \\\.\.\.=... # Arrows from the Arrows block of Unicode. # -> right arrow (?<!\\)->=→ \\->=-> # => right double arrow (?<!\\)\=>=⇒ \\\=>==> # <- left arrow (?<!\\)<-=← \\<-=<- # <= left double arrow (?<!\\)<\==⇐ \\<\==<= # Paragraphs. [paradef-default] delimiter=(?s)(?P<text>\S.*) template=paragraph posattrs=style verse-style=template="verseparagraph" NOTE-style=template="admonitionparagraph",name="note",caption="{note_caption}" TIP-style=template="admonitionparagraph",name="tip",caption="{tip_caption}" IMPORTANT-style=template="admonitionparagraph",name="important",caption="{important_caption}" WARNING-style=template="admonitionparagraph",name="warning",caption="{warning_caption}" CAUTION-style=template="admonitionparagraph",name="caution",caption="{caution_caption}" [paradef-literal] delimiter=(?s)(?P<text>\s+.*) options=listelement template=literalparagraph subs=verbatim [paradef-admonition] delimiter=(?s)^\s*(?P<style>NOTE|TIP|IMPORTANT|WARNING|CAUTION):\s+(?P<text>.+) NOTE-style=template="admonitionparagraph",name="note",caption="{note_caption}" TIP-style=template="admonitionparagraph",name="tip",caption="{tip_caption}" IMPORTANT-style=template="admonitionparagraph",name="important",caption="{important_caption}" WARNING-style=template="admonitionparagraph",name="warning",caption="{warning_caption}" CAUTION-style=template="admonitionparagraph",name="caution",caption="{caution_caption}" [macros] # Inline macros. # Backslash prefix required for escape processing. # (?s) re flag for line spanning. # URLs, images and links with attribute list. Explicit so they can be nested. (?su)[\\]?(?P<name>http|https|ftp|file|mailto|callto|image|link):(?P<target>\S*?)(\[(?P<attrlist>.*?)\])= # These URL types don't require any special attribute list formatting. (?su)(?<!\S)[\\]?(?P<name>http|https|ftp|file):(?P<target>//\S*[\w/])= # Allow a leading parenthesis. (?su)(?<\=\()[\\]?(?P<name>http|https|ftp|file):(?P<target>//\S*[\w/])= # Allow <> brackets. (?su)[\\]?<(?P<name>http|https|ftp|file):(?P<target>//\S*[\w/])>= # Email addresses don't require special attribute list formatting. # The before ">: and after "< character exclusions stop multiple substitution. (?su)(?<![">:\w])[\\]?(?P<target>\w[\w._-]*@[\w._-]*\w)(?!["<\w.])=mailto # Anchor: [[[id]]]. Bibliographic anchor. (?su)[\\]?\[\[\[(?P<attrlist>[\w][\w-]*?)\]\]\]=anchor3 # Anchor: [[id,xreflabel]] (?su)[\\]?\[\[(?P<attrlist>[\w"].*?)\]\]=anchor2 # Link: <<id,text>> (?su)[\\]?<<(?P<attrlist>[\w"].*?)>>=xref2 ifdef::asciidoc7compatible[] # Index term: ++primary,secondary,tertiary++ (?su)(?<!\S)[\\]?\+\+(?P<attrlist>[^+].*?)\+\+(?!\+)=indexterm # Index term: +primary+ # Follows ++...++ macro otherwise it will match them. (?<!\S)[\\]?\+(?P<attrlist>[^\s\+][^+].*?)\+(?!\+)=indexterm2 endif::asciidoc7compatible[] ifndef::asciidoc7compatible[] # Index term: (((primary,secondary,tertiary))) (?su)(?<!\()[\\]?\(\(\((?P<attrlist>[^(].*?)\)\)\)(?!\))=indexterm # Index term: ((primary)) # Follows (((...))) macro otherwise it will match them. (?<!\()[\\]?\(\((?P<attrlist>[^\s\(][^(].*?)\)\)(?!\))=indexterm2 endif::asciidoc7compatible[] # Callout [\\]?<(?P<index>\d+)>=callout # Default inline macro (listed last as a catchall)). (?su)[\\]?(?P<name>\w(\w|-)*?):(?P<target>\S*?)(\[(?P<attrlist>.*?)\])= # Block macros. (?u)^(?P<name>\w(\w|-)*?)::(?P<target>\S*?)(\[(?P<attrlist>.*?)\])$=# ^'{4,}$=#ruler ^//([^/].*|)$=#comment # System macros. # This default system macro is hardwired into asciidoc. #(?u)^(?P<name>\w(\w|-)*?)::(?P<target>\S*?)(\[(?P<attrlist>.*?)\])$=+ # Delimited blocks. [blockdef-comment] delimiter=^/{4,} options=skip [comment-blockmacro] # Outputs nothing. [blockdef-sidebar] delimiter=^\*{4,}$ template=sidebarblock options=sectionbody [blockdef-list] delimiter=^--$ template=listblock options=list [listblock] | [blockdef-passthrough] delimiter=^\+{4,}$ template=passthroughblock subs=attributes,macros [blockdef-listing] delimiter=^-{4,}$ template=listingblock subs=verbatim posattrs=style [blockdef-literal] delimiter=^\.{4,}$ template=literalblock subs=verbatim posattrs=style # DEPRECATED: Use verse style on quote blocks instead. verse-style=template="verseblock",subs="normal" [blockdef-quote] delimiter=^_{4,}$ subs=normal style=quote posattrs=style,attribution,citetitle quote-style=template="quoteblock",options=("sectionbody",) verse-style=template="verseblock" [blockdef-example] delimiter=^={4,}$ template=exampleblock options=sectionbody posattrs=style NOTE-style=template="admonitionblock",name="note",caption="{note_caption}" TIP-style=template="admonitionblock",name="tip",caption="{tip_caption}" IMPORTANT-style=template="admonitionblock",name="important",caption="{important_caption}" WARNING-style=template="admonitionblock",name="warning",caption="{warning_caption}" CAUTION-style=template="admonitionblock",name="caution",caption="{caution_caption}" # For use by custom filters. [blockdef-filter] delimiter=^~{4,}$ template=listingblock subs=none posattrs=style # Lists. [listdef-bulleted] type=bulleted delimiter=^\s*- +(?P<text>.+)$ listtag=ilist itemtag=ilistitem texttag=ilisttext [listdef-bulleted2] type=bulleted delimiter=^\s*\* +(?P<text>.+)$ listtag=ilist itemtag=ilistitem texttag=ilisttext [listdef-numbered] type=numbered delimiter=^\s*(?P<index>\d*)\. +(?P<text>.+)$ listtag=olist itemtag=olistitem texttag=olisttext [listdef-numbered2] type=numbered delimiter=^\s*(?P<index>[.a-z])\. +(?P<text>.+)$ listtag=olist2 itemtag=olistitem texttag=olisttext [listdef-vlabeled] type=labeled delimiter=^\s*(?P<label>.*\S)::$ listtag=vlist itemtag=vlistitem texttag=vlisttext entrytag=vlistentry labeltag=vlistterm [listdef-vlabeled2] type=labeled delimiter=^\s*(?P<label>.*\S);;$ listtag=vlist itemtag=vlistitem texttag=vlisttext entrytag=vlistentry labeltag=vlistterm [listdef-hlabeled] type=labeled delimiter=^\s*(?P<label>.*\S)((::\s*\\)|(::\s+(?P<text>.+)))$ listtag=hlist itemtag=hlistitem texttag=hlisttext entrytag=hlistentry labeltag=hlistterm [listdef-hlabeled2] type=labeled delimiter=^\s*(?P<label>.*\S)((;;\s*\\)|(;;\s+(?P<text>.+)))$ listtag=hlist itemtag=hlistitem texttag=hlisttext entrytag=hlistentry labeltag=hlistterm # Question and Answer list. [listdef-qanda] type=labeled delimiter=^\s*(?P<label>.*\S)\?\?$ listtag=qlist itemtag=qlistitem texttag=qlisttext entrytag=qlistentry labeltag=qlistterm # Bibliography list. [listdef-bibliography] type=bulleted delimiter=^\+ +(?P<text>.+)$ listtag=blist itemtag=blistitem texttag=blisttext # Glossary list. [listdef-glossary] type=labeled delimiter=^(?P<label>.*\S):-$ listtag=glist itemtag=glistitem texttag=glisttext entrytag=glistentry labeltag=glistterm # Callout list. [listdef-callout] type=callout delimiter=^<?(?P<index>\d*)> +(?P<text>.+)$ listtag=colist itemtag=colistitem texttag=colisttext # Tables. [tabledef-default] fillchar=- format=fixed [tabledef-csv] fillchar=~ format=csv [tabledef-dsv] fillchar=_ format=dsv �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������asciidoc-8.2.7/docbook.conf�������������������������������������������������������������������������0000644�0001751�0001751�00000035552�11033026163�015750� 0����������������������������������������������������������������������������������������������������ustar �srackham������������������������srackham���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # docbook.conf # # Asciidoc configuration file. # Default docbook backend. # [miscellaneous] outfilesuffix=.xml # Printable page width in pts. pagewidth=380 pageunits=pt [attributes] basebackend=docbook basebackend-docbook= [replacements] # Line break markup is dropped (there is no DocBook line break tag). (?m)^(.*)\s\+$=\1 ifdef::asciidoc7compatible[] # Superscripts. \^(.+?)\^=<superscript>\1</superscript> # Subscripts. ~(.+?)~=<subscript>\1</subscript> endif::asciidoc7compatible[] [ruler-blockmacro] # Only applies to HTML so don't output anything. [image-inlinemacro] <inlinemediaobject> <imageobject> <imagedata fileref="{imagesdir=}{target}"{width? contentwidth="{width}"}{height? contentdepth="{height}"}/> </imageobject> <textobject><phrase>{1={target}}</phrase></textobject> </inlinemediaobject> [image-blockmacro] <figure{id? id="{id}"}><title>{title} {title%} {1={target}} {title#} {title%} [indexterm-inlinemacro] # Inline index term. # Generate separate index entries for primary, secondary and tertiary # descriptions. # Primary only. {2%} {2%} {1} {2%} # Primary and secondary. {2#}{3%} {2#}{3%} {1}{2} {2#}{3%} {2#}{3%} {2#}{3%} {2} {2#}{3%} # Primary, secondary and tertiary. {3#} {1}{2}{3} {3#} {3#} {2}{3} {3#} {3#} {3} {3#} [indexterm2-inlinemacro] # Inline index term. # Single entry index term that is visible in the primary text flow. {1} {1} [footnote-inlinemacro] # Inline footnote. {0} [callout-inlinemacro] # Inline callout. [tags] # Bulleted, numbered and labeled list tags. ilist={title?{title}}| ilistitem=| ilisttext=| olist={title?{title}}| olist2=| olistitem=| olisttext=| vlist={title?{title}}| vlistentry=| vlistterm=| vlisttext=| vlistitem=| # Horizontal labeled list (implemented with two column table). # Hardwired column widths to 30%,70% because the current crop of PDF # generators do not auto calculate column widths. hlist=<{title?table}{title!informaltable}{id? id="{id}"} tabstyle="{style=hlabeledlist}" pgwide="0" frame="none" colsep="0" rowsep="0">{title?{title}}|<{title?/table}{title!/informaltable}> hlistentry=| hlisttext=| hlistterm=| hlistitem=| # Question and Answer list. qlist={title?{title}}| qlistentry=| qlistterm=| qlistitem=| qlisttext=| # Bibliography list. blist=| blistitem=| blisttext=| # Glossary list. glist=| glistentry=| glistterm=| glistitem=| glisttext=| # Callout list. colist={title?{title}}| colistitem=| colisttext=| # Quoted text emphasis=| strong=| monospaced=| quoted={amp}#8220;|{amp}#8221; unquoted=| subscript=| superscript=| # $$ inline passthrough. $$passthrough=| # Inline macros [http-inlinemacro] {0={name}:{target}} [https-inlinemacro] {0={name}:{target}} [ftp-inlinemacro] {0={name}:{target}} [file-inlinemacro] {0={name}:{target}} [mailto-inlinemacro] {0={target}} [callto-inlinemacro] {0={target}} [link-inlinemacro] {0={target}} # anchor:id[text] [anchor-inlinemacro] # [[id,text]] [anchor2-inlinemacro] # [[[id]]] [anchor3-inlinemacro] [{1}] # xref:id[text] [xref-inlinemacro] {0} {2%} # <> [xref2-inlinemacro] {2} {2%} # Special word macros [emphasizedwords] {words} [monospacedwords] {words} [strongwords] {words} # Paragraph substitution. [paragraph] {title} {title%} | {title%} {title#} {empty} [admonitionparagraph] <{name}{id? id="{id}"}>| [literalparagraph] # The literal block employs the same markup. template::[literalblock] [verseparagraph] template::[verseblock] # Delimited blocks. [literalblock] {title} | {title#} [listingblock] {title} | {title#} [sidebarblock] {title} | [passthroughblock] | [quoteblock] {title} # Include attribution only if either {attribution} or {citetitle} are defined. {attribution#} {attribution%}{citetitle#} {attribution} {citetitle} {attribution#} {attribution%}{citetitle#} | [verseblock] {title} # Include attribution only if either {attribution} or {citetitle} are defined. {attribution#} {attribution%}{citetitle#} {attribution} {citetitle} {attribution#} {attribution%}{citetitle#} | [exampleblock] <{title?example}{title!informalexample}{id? id="{id}"}> {title} | [admonitionblock] <{name}{id? id="{id}"}> {title} | # Tables. [tabledef-default] template=table colspec= bodyrow=| bodydata=| [table] <{title?table}{title!informaltable}{id? id="{id}"} pgwide="0" frame="{frame=topbot}" {grid%rowsep="0" colsep="0"} rowsep="{grid@none|cols:0:1}" colsep="{grid@none|rows:0:1}" > {title} {colspecs} {headrows#} {headrows} {headrows#} {footrows#} {footrows} {footrows#} {bodyrows} [specialsections] ifdef::doctype-article[] ^Abstract$=sect-abstract endif::doctype-article[] ifdef::doctype-book[] ^Colophon$=sect-colophon ^Dedication$=sect-dedication ^Preface$=sect-preface endif::doctype-book[] ^Index$=sect-index ^(Bibliography|References)$=sect-bibliography ^Glossary$=sect-glossary ^Appendix [A-Z][:.](?P.*)$=sect-appendix # Special sections. [sect-preface] <preface{id? id="{id}"}> <title>{title} | [sect-index] {title} | [sect-bibliography] {title} | [sect-glossary] {title} | [sect-appendix] {title} | [header-declarations] #------------------------- # article document type #------------------------- ifdef::doctype-article[] [header] template::[header-declarations]
{doctitle#} {doctitle} {date} {authored#} {firstname} {middlename} {lastname}
{email}
{authored#}
{authorinitials} # If file named like source document with -revhistory.xml suffix exists # include it as the document history, otherwise use current revision. {revisionhistory#}{include:{docdir}/{docname}-revhistory.xml} {revisionhistory%}{revision}{date}{authorinitials?{authorinitials}}{revremark?{revremark}} {companyname} {doctitle#}
[footer]
[preamble] # Untitled elements between header and first section title. | [sect-abstract] | [sect1] {title} |
[sect2] {title} | [sect3] {title} | [sect4] {title} | endif::doctype-article[] #------------------------- # manpage document type #------------------------- ifdef::doctype-manpage[] [replacements] # The roff format does not substitute special characters so just print them as # text. \(C\)=(C) \(TM\)=(TM) [header] template::[header-declarations] {mantitle} {manvolnum} {mansource} {manversion} {manmanual} {manname} {manpurpose} [footer] # Section macros [sect-synopsis] | [sect1] {title} | [sect2] {title} | [sect3] {title} | endif::doctype-manpage[] #------------------------- # book document type #------------------------- ifdef::doctype-book[] [header] template::[header-declarations] {doctitle#} {doctitle} {date} {authored#} {firstname} {middlename} {lastname}
{email}
{authored#}
{authorinitials} # If file named like source document with -revhistory.xml suffix exists # include it as the document history, otherwise use current revision. {revisionhistory#}{include:{docdir}/{docname}-revhistory.xml} {revisionhistory%}{revision}{date}{authorinitials?{authorinitials}}{revremark?{revremark}} {companyname} {doctitle#}
[footer]
[preamble] # Preamble is not allowed in DocBook book so wrap it in a preface. Preface | [sect-dedication] | [sect-colophon] | [sect0] {title} | [sect1] {title} | [sect2] {title} | [sect3] {title} | [sect4] {title} | endif::doctype-book[] ifdef::sgml[] # # Optional DocBook SGML. # # Most of the differences between DocBook XML and DocBook SGML boils # down to the empty element syntax: SGML does not like the XML empty # element <.../> syntax, use <...> instead. # [miscellaneous] outfilesuffix=.sgml [header-declarations] [tabledef-default] colspec= [image-inlinemacro] {1={target}} [image-blockmacro]
{title} {title%} {1={target}} {title#}
{title%} # Inline macros [xref-inlinemacro] {0} {2%} [xref2-inlinemacro] # <> {2} {2%} [anchor-inlinemacro] [anchor2-inlinemacro] # [[id,text]] endif::sgml[] asciidoc-8.2.7/help.conf0000644000175100017510000001263311033235571015260 0ustar srackhamsrackham# 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 DocBook, HTML or LinuxDoc SYNOPSIS asciidoc [OPTIONS] FILE DESCRIPTION The asciidoc(1) command translates the AsciiDoc text file FILE to a DocBook, HTML or LinuxDoc file. 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@ (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. -b, --backend=BACKEND Backend output file format: docbook, xhtml11 or html4. Defaults to xhtml11. -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. -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. -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 -a numbered. --unsafe Disable safe mode. Safe mode is enabled by default, disabling it is potentially dangerous. -v, --verbose Verbosely print processing information and configuration file checks to stderr. --version Print program version number. 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 Written by Stuart Rackham, RESOURCES SourceForge: http://sourceforge.net/projects/asciidoc/ Main web site: http://www.methods.co.nz/asciidoc/ COPYING Copyright (C) 2002-2008 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 often 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` Document links -------------- [[id]] (define link target) <> (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 (optional) revision, date (optional) Section title underlines ------------------------ Level 0 (document title): ====================== Level 1: ---------------------- Level 2: ~~~~~~~~~~~~~~~~~~~~~~ Level 3: ^^^^^^^^^^^^^^^^^^^^^^ Level 4 (bottom level): ++++++++++++++++++++++ Delimited blocks ---------------- Delimiters must begin at left margin. ------------------- listing block ------------------- ................... literal block ................... ******************* sidebar block ******************* [style, author, cite] (optional) ___________________ quote block ___________________ =================== example block =================== /////////////////// comment block /////////////////// More block elements ------------------- [attributes list] (Note 1) .Block title (Note 1) // Comment line (Note 1) include::filename[] (Note 1) Note 1: Begin at the left margin. More inline elements -------------------- footnote:[footnote text] (document footnote) asciidoc-8.2.7/html4.conf0000644000175100017510000002066511033051625015360 0ustar srackhamsrackham# # html4.conf # # Asciidoc HTML 4.01 configuration file. # [miscellaneous] outfilesuffix=.html # Screen width in pixels. pagewidth=800 pageunits= [attributes] basebackend=html basebackend-html= [replacements] # Line break. (?m)^(.*)\s\+$=\1
ifdef::asciidoc7compatible[] # Superscripts. \^(.+?)\^=\1 # Subscripts. ~(.+?)~=\1 endif::asciidoc7compatible[] [ruler-blockmacro]
[image-inlinemacro] {1={target}} {link#} [image-blockmacro] {1={target}} {link#}

{caption={figure_caption}}{title}

[indexterm-inlinemacro] # Inline index term. {empty} [indexterm2-inlinemacro] # Inline index term. # Single entry index term that is visible in the primary text flow. {1} [footnote-inlinemacro] # Inline footnote.
[{0}]
[callout-inlinemacro] # Inline callout. ({index}) [tags] # Bulleted, numbered and labeled list tags. ilist={id?}{title?

{title}

}
    |
ilistitem=
  • |
  • ilisttext=

    |

    olist={id?}{title?

    {title}

    }
      |
    olist2={id?}
      |
    olistitem=
  • |
  • olisttext=

    |

    vlist={id?}{title?

    {title}

    }
    |
    vlistentry=| vlistterm=
    |
    vlistitem=
    |
    vlisttext=

    |

    # Horizontal labeled list. hlist={id?}{title?

    {title}

    }|
    hlistentry=| hlisttext=| hlistterm=| hlistitem=| # Question and Answer list. qlist={id?}{title?

    {title}

    }
      |
    qlistentry=
  • |
  • qlistterm=

    |

    qlistitem=| qlisttext=

    |

    # Callout list. colist={id?}{title?

    {title}

    }
      |
    colistitem=
  • |
  • colisttext=

    |

    # Quoted text. emphasis=| strong=| monospaced=| quoted={0?}{amp}#8220;|{amp}#8221;{0?} unquoted={0?}|{0?} superscript=| subscript=| # $$ inline passthrough. passthrough=| # Inline macros [http-inlinemacro] {0={name}:{target}} [https-inlinemacro] {0={name}:{target}} [ftp-inlinemacro] {0={name}:{target}} [file-inlinemacro] {0={name}:{target}} [mailto-inlinemacro] {0={target}} [callto-inlinemacro] {0={target}} [link-inlinemacro] {0={target}} # anchor:id[text] [anchor-inlinemacro] # [[id,text]] [anchor2-inlinemacro] # [[[id]]] [anchor3-inlinemacro] [{1}] # xref:id[text] [xref-inlinemacro] {0=[{target}]} # <> [xref2-inlinemacro] {2=[{1}]} # Special word substitution. [emphasizedwords] {words} [monospacedwords] {words} [strongwords] {words} # Paragraph substitution. [paragraph]

    {id?}{title?{title}
    } |

    [literalparagraph] # The literal block employs the same markup. template::[literalblock] [verseparagraph] # The verse block employs the same markup. template::[verseblock] [admonitionparagraph]

    {caption}: |

    # Delimited blocks. [passthroughblock] | [listingblock]

    {title}

    |
    
    [literalblock]

    {title}

    |
    
    [sidebarblock]

    {title}

    |
    [quoteblock]

    {title}

    |

    {citetitle}
    — {attribution}

    [verseblock]

    {title}

    # Font inheritance broken in IE6.
    |
    

    {citetitle}
    — {attribution}

    [exampleblock]

    {caption=Example: }{title}

    |
    [admonitionblock]

    {caption}

    {title}

    |
    # Bibliography list. # Same as numbered list. [listdef-bibliography] listtag=olist itemtag=olistitem texttag=olisttext # Glossary list. # Same as labeled list. [listdef-glossary] listtag=vlist itemtag=vlistitem texttag=vlisttext entrytag=vlistentry labeltag=vlistterm # Tables. [tabledef-default] template=table bodyrow=| headdata=| footdata=| bodydata=| [table]

    {caption={table_caption}}{title}

    {headrows#} {headrows} {headrows#} {footrows#} {footrows} {footrows#} {bodyrows}
    [preamble] # Untitled elements between header and first section title. | [sect0] {doctype-manpage%}

    {id?}{title}

    | [sect1] {doctype-manpage%}

    {id?}{numbered?{sectnum} }{title}

    | [sect2]

    {id?}{numbered?{sectnum} }{title}

    | [sect3]

    {id?}{numbered?{sectnum} }{title}

    | [sect4]
    {id?}{title}
    | [footer]


    Version {revision}
    Last updated {localdate} {localtime}

    #------------------------- # article document type #------------------------- ifndef::doctype-manpage[] [header] {doctitle}

    {doctitle}

    {author}
    <{email}>
    version {revision}{date?,} {date}

    endif::doctype-manpage[] #------------------------- # manpage document type #------------------------- ifdef::doctype-manpage[] [tags] # This is more inline with man page convention. emphasis=| vlistterm=
    |
    [header] {mantitle}

    {doctitle} Manual Page


    NAME

    {manname} - {manpurpose}

    [sect-synopsis] template::[sect1] endif::doctype-manpage[] asciidoc-8.2.7/lang-es.conf0000644000175100017510000000042010711423032015636 0ustar srackhamsrackham[attributes] ifdef::basebackend-html[] # Captions, used by HTML backends. caution_caption=Atención important_caption=Importante note_caption=Nota tip_caption=Sugerencia warning_caption=Aviso figure_caption="Figura: " table_caption="Tabla: " endif::basebackend-html[] asciidoc-8.2.7/latex.conf0000644000175100017510000005026611032525401015442 0ustar srackhamsrackham# # latex.conf # # Asciidoc configuration file. # latex backend, generates LaTeX conformant markup. # [titles] subs=quotes,replacements,attributes,macros,specialcharacters,replacements2 # The listing block uses a LaTeX verbatim environment where special characters don't need to be escaped. # Hence only "callouts" substitution should be applied. [blockdef-listing] subs=callouts [attributes] basebackend=latex basebackend-latex= latex-table-rowlimit=20 latex-use-bibliography-environment! latex-indent-paragraphs! latex-recognize-escaped-unicode! latex-use-custom-list-items! latex-use-colored-tables! latex-use-running-title-headings! latex-use-colored-sidebar-blocks! [miscellaneous] subsnormal=quotes,specialwords,replacements,attributes,macros,passthroughs,specialcharacters,replacements2 subsverbatim=callouts,specialcharacters outfilesuffix=.tex # Screen width in pixels. pagewidth=418 pageunits=pt [specialcharacters] {=\{{} }=\}{} \=\textbackslash{} $=\${} <=\textless{} >=\textgreater{} &=\&{} _=\_{} %=\%{} \#=\#{} ^=\textasciicircum{} ~=\textasciitilde{} |=\textbar{} "=\textquotedbl{} [macros] # I needed to rewrite some regular expressions because '<' and '>' have not been escaped to '<' and '>' # Callout [\\]?<(?P\d+)>=callout # Link: <> (?su)[\\]?<<(?P[\w"].*?)>>=xref2 [replacements] # Line break. (?m)^(.*)\s\+$=\1 !..backslash..!newline!..braceleft..!!..braceright..! # -- Spaced em dashes (entity reference —) (^|[^-\\])--($|[^-])=\1--\2 # (C) Copyright (entity reference ©) (? right arrow ->=!..backslash..!textrightarrow!..braceleft..!!..braceright..! # => right double arrow (have to enter math mode) =>=!..dollar..!!..backslash..!Rightarrow!..braceleft..!!..braceright..!!..dollar..! # <- left arrow <-=!..backslash..!textleftarrow!..braceleft..!!..braceright..! # <= left double arrow (have to enter math mode) <\==!..dollar..!!..backslash..!Leftarrow!..braceleft..!!..braceright..!!..dollar..! # --> long right arrow (have to enter math mode) -->=!..backslash..!textrightarrow!..braceleft..!!..braceright..! # ==> long right double arrow (have to enter math mode) =\=>=!..dollar..!!..backslash..!Rightarrow!..braceleft..!!..braceright..!!..dollar..! # <-- long left arrow (have to enter math mode) <--=!..backslash..!textleftarrow!..braceleft..!!..braceright..! # <== long left double arrow (have to enter math mode) <\=\==!..dollar..!!..backslash..!Leftarrow!..braceleft..!!..braceright..!!..dollar..! [replacements2] !..braceleft..!={ !..braceright..!=} !..backslash..!=\\ !..dollar..!=$ !..lessthan..!=< !..greaterthan..!=> !..amp..!=& !..underline..!=_ !..percent..!=% !..sharp..!=# !..circum..!=^ !..tilde..!=~ !..bar..!=| !..doublequote..!=" # Ruler is interpreted as a page break. [ruler-blockmacro] \clearpage [image-inlinemacro] !..backslash..!href!..braceleft..!{link}!..braceright..!!..braceleft..!!..percent..! !..backslash..!includegraphics[{scale?scale={scale},}{width?width={width}pt,}{height? height={height}pt}]!..braceleft..!{target}!..braceright..! {link#}!..braceright..! [image-blockmacro] \begin\{figure\} \hypertarget\{{id}\}\{\} \caption\{{title}\} \href\{{link}\}\{% \includegraphics[{scale?scale={scale},}{width?width={width}pt,}{height? height={height}pt}]\{{target}\}% \label\{{id}\} {link#}\} \end\{figure\} [indexterm-inlinemacro] # Inline index term. !..backslash..!index!..braceleft..!{1}{2?!{2}}{3?!{3}}!..braceright..! [indexterm2-inlinemacro] # Inline index term. # Single entry index term that is visible in the primary text flow. !..backslash..!index!..braceleft..!{1}!..braceright..!{1} [footnote-inlinemacro] # Inline footnote. !..backslash..!footnote!..braceleft..!{0}!..braceright..! [callout-inlinemacro] # Inline callout. <{index}> [listdef-numbered2] listtag=olist2 itemtag=olist2item texttag=olist2text [listdef-bulleted2] listtag=ilist2 itemtag=ilist2item texttag=ilist2text [tags] # Bulleted, numbered and labeled list tags. ifdef::latex-use-custom-list-items[] ilistitem=\item[\textendash] | ilist2item=\item[\textbullet] | olist={title?\minisec\{{title}\}} {id?\label\{{id}\}\hypertarget\{{id}\}\{\}} \begin\{enumerate\}[1)]|\end\{enumerate\} olist2={title?\minisec\{{title}\}} {id?\label\{{id}\}\hypertarget\{{id}\}\{\}} \begin\{enumerate\}[a)]|\end\{enumerate\} endif::latex-use-custom-list-items[] ifndef::latex-use-custom-list-items[] ilistitem=\item%| ilist2item=\item%| olist={title?\minisec\{{title}\}} {id?\label\{{id}\}\hypertarget\{{id}\}\{\}} \begin\{enumerate\}|\end\{enumerate\} olist2={title?\minisec\{{title}\}} {id?\label\{{id}\}\hypertarget\{{id}\}\{\}} \begin\{enumerate\}|\end\{enumerate\} endif::latex-use-custom-list-items[] ilist={title?\minisec\{{title}\}} {id?\label\{{id}\}\hypertarget\{{id}\}\{\}} \begin\{itemize\}|\end\{itemize\} ilisttext=| ilist2={title?\minisec\{{title}\}} {id?\label\{{id}\}\hypertarget\{{id}\}\{\}} \begin\{itemize\}|\end\{itemize\} ilist2text=| olistitem=\item%| olisttext=| olist2item=\item%| olist2text=| vlist={title?\minisec\{{title}\}} \par{id?\label\{{id}\}\hypertarget\{{id}\}\{\}} | vlistentry=| vlistterm=\noindent\textbf\{%|\} vlistitem=\begin\{quote\}|\end\{quote\} vlisttext=| # Horizontal labeled list. hlist={title?\minisec\{{title}\}} {id?\label\{{id}\}\hypertarget\{{id}\}\{\}} \begin\{description\}|\end\{description\} hlistentry=| hlistterm=\item[%|] hlistitem=| hlisttext=| # Question and Answer list. qlist={title?\minisec\{{title}\}} {id?\label\{{id}\}\hypertarget\{{id}\}\{\}} \begin\{enumerate\}|\end\{enumerate\} qlistentry=\item%| qlistterm=| qlistitem=\begin\{quotation\}|\end\{quotation\} qlisttext=| # Callout list. colist={title?\minisec\{{title}\}} {id?\label\{{id}\}\hypertarget\{{id}\}\{\}} \begin\{enumerate\}|\end\{enumerate\} colistitem=\item%| colisttext=| # Bibliography list. ifdef::latex-use-bibliography-environment[] biblist=| endif::latex-use-bibliography-environment[] ifndef::latex-use-bibliography-environment[] biblist={title?\minisec\{{title}\}} {id?\label\{{id}\}\hypertarget\{{id}\}\{\}} \begin\{description\} | \end\{description\} endif::latex-use-bibliography-environment[] biblistitem=| biblisttext=| superscript=!..backslash..!textsuperscript!..braceleft..!|!..braceright..! subscript=!..backslash..!textsubscript!..braceleft..!|!..braceright..! # Quoted text. emphasis=!..backslash..!emph!..braceleft..!|!..braceright..! strong=!..backslash..!textbf!..braceleft..!|!..braceright..! monospaced=!..backslash..!texttt!..braceleft..!|!..braceright..! quoted=!..backslash..!{language!textquotedblleft}{language?{language@.german:glqq}}{language?{language@english:textquotedblleft}}!..braceleft..!!..braceright..!|!..backslash..!{language?{language@.german:grqq}}{language?{language@english:textquotedblright}}{language!textquotedblright}!..braceleft..!!..braceright..! unquoted=| # $$ inline passthrough. $$passthrough=| # Inline macros [http-inlinemacro] !..backslash..!href!..braceleft..!{name}:{target}!..braceright..!!..braceleft..!{0={name}:{target}}!..braceright..! [https-inlinemacro] !..backslash..!href!..braceleft..!{name}:{target}!..braceright..!!..braceleft..!{0={name}:{target}}!..braceright..! [ftp-inlinemacro] !..backslash..!href!..braceleft..!{name}:{target}!..braceright..!!..braceleft..!{0={name}:{target}}!..braceright..! [file-inlinemacro] !..backslash..!href!..braceleft..!{name}:{target}!..braceright..!!..braceleft..!{0={name}:{target}}!..braceright..! [mailto-inlinemacro] !..backslash..!href!..braceleft..!{name}:{target}!..braceright..!!..braceleft..!{0={target}}!..braceright..! [callto-inlinemacro] !..backslash..!href!..braceleft..!{name}:{target}!..braceright..!!..braceleft..!{0={target}}!..braceright..! [link-inlinemacro] !..backslash..!href!..braceleft..!{target}!..braceright..!!..braceleft..!{0={target}}!..braceright..! # anchor:id[text] [anchor-inlinemacro] !..backslash..!label!..braceleft..!{target}!..braceright..!!..backslash..!hypertarget!..braceleft..!{target}!..braceright..!!..braceleft..!{0={target}}!..braceright..! # [[id,text]] [anchor2-inlinemacro] !..backslash..!label!..braceleft..!{1}!..braceright..!!..backslash..!hypertarget!..braceleft..!{1}!..braceright..!!..braceleft..!{2={1}}!..braceright..! # [[[id]]] [anchor3-inlinemacro] {latex-use-bibliography-environment?!..backslash..!bibitem!..braceleft..!{1}!..braceright..!} {latex-use-bibliography-environment!!..backslash..!item[{1}]} !..backslash..!label!..braceleft..!{1}!..braceright..!!..backslash..!hypertarget!..braceleft..!{1}!..braceright..!!..braceleft..!!..braceright..! # xref:id[text] [xref-inlinemacro] {style#}{style$page:!..backslash..!pageref!..braceleft..!{target}!..braceright..!} {style#}{style$autoref:!..backslash..!autoref!..braceleft..!{target}!..braceright..!} {style#}{style$ref:!..backslash..!ref!..braceleft..!{target}!..braceright..!} {style#}{latex-use-bibliography-environment#}{style$cite:!..backslash..!cite!..braceleft..!{target}!..braceright..!} {style#}{latex-use-bibliography-environment%}{style$cite:!..backslash..!hyperlink!..braceleft..!{target}!..braceright..!!..braceleft..!{0=[{target}]}!..braceright..!} {style%}!..backslash..!hyperlink!..braceleft..!{target}!..braceright..!!..braceleft..!{0=[{target}]}!..braceright..! # <> [xref2-inlinemacro] {3#}{3$page:!..backslash..!pageref!..braceleft..!{1}!..braceright..!} {3#}{3$autoref:!..backslash..!autoref!..braceleft..!{1}!..braceright..!} {3#}{3$ref:!..backslash..!ref!..braceleft..!{1}!..braceright..!} {3#}{latex-use-bibliography-environment#}{3$cite:!..backslash..!cite!..braceleft..!{1}!..braceright..!} {3#}{latex-use-bibliography-environment%}{3$cite:!..backslash..!hyperlink!..braceleft..!{1}!..braceright..!!..braceleft..!{2=[{1}]}!..braceright..!} {3%}!..backslash..!hyperlink!..braceleft..!{1}!..braceright..!!..braceleft..!{2=[{1}]}!..braceright..! # Special word substitution. [emphasizedwords] !..backslash..!emph!..braceleft..!{words}!..braceright..! [monospacedwords] !..backslash..!texttt!..braceleft..!{words}!..braceright..! [strongwords] !..backslash..!textbf!..braceleft..!{words}!..braceright..! # Paragraph substitution. [paragraph] {title%} \par{latex-indent-paragraphs!\noindent} {title#} \paragraph\{{title}\} \label\{{id}\}\hypertarget\{{id}\}\{\} | [literalparagraph] # The literal block employs the same markup. template::[literalblock] [verseparagraph] # The verse block employs the same markup. template::[verseblock] [admonitionparagraph] # The admonition block employs the same markup. template::[admonitionblock] # Delimited blocks. [passthroughblock] | [listingblock] \minisec\{{caption=Listing: }{title}\} \label\{{id}\}\hypertarget\{{id}\}\{\} \begin\{lstlisting\}[{title?name={title}}] | \end\{lstlisting\} [literalblock] \minisec\{{title}\} \label\{{id}\}\hypertarget\{{id}\}\{\} \begin\{alltt\} | \end\{alltt\} [verseblock] \minisec\{{title}\} \label\{{id}\}\hypertarget\{{id}\}\{\} \begin\{alltt\} \normalfont\{\} | \end\{alltt\} [sidebarblock] \label\{{id}\}\hypertarget\{{id}\}\{\} \par\noindent ifndef::latex-use-colored-sidebar-blocks[] \setlength\{\tabcolsep\}\{0pt\} \rowcolors\{1\}\{\}\{\} \begin\{tabular\}\{l>\{\columncolor[gray]\{.75\}\}rcl\} \hspace*\{0pt\} & \hspace*\{8pt\} & \hspace*\{16pt\} & \begin\{minipage\}\{4in\} endif::latex-use-colored-sidebar-blocks[] ifdef::latex-use-colored-sidebar-blocks[] \fcolorbox\{SidebarBorderColor\}\{SidebarBackgroundColor\}\{\parbox\{\textwidth\}\{ endif::latex-use-colored-sidebar-blocks[] \minisec\{{title}\} | ifdef::latex-use-colored-sidebar-blocks[] \} \} endif::latex-use-colored-sidebar-blocks[] ifndef::latex-use-colored-sidebar-blocks[] \end\{minipage\} \end\{tabular\} endif::latex-use-colored-sidebar-blocks[] \bigskip [quoteblock] \minisec\{{title}\} \label\{{id}\}\hypertarget\{{id}\}\{\} \begin\{quote\} | \end\{quote\} \begin\{flushright\} {citetitle} \\ -- {attribution} \end\{flushright\} [exampleblock] \minisec\{{caption=Example: }{title}\} \label\{{id}\}\hypertarget\{{id}\}\{\} \begin\{quotation\} | \end\{quotation\} [admonitionblock] \begin\{addmargin*\}[0em]\{0em\} \label\{{id}\}\hypertarget\{{id}\}\{\} \begin\{minipage\}\{\linewidth\} {icons#} \includegraphics\{{icon={iconsdir}/{name}.png}\} {icons%} \minisec\{{caption}\} \\ \rule\{\linewidth\}\{2pt\} \par\{\}\noindent\{\}|\par\{\}\noindent\{\}% \rule[.25\baselineskip]\{\linewidth\}\{2pt\} \end\{minipage\} \end\{addmargin*\} # Bibliography list. # Same as numbered list. [listdef-bibliography] listtag=biblist itemtag=biblistitem texttag=biblisttext # Glossary list. # Same as labeled list. [listdef-glossary] listtag=vlist itemtag=vlistitem texttag=vlisttext entrytag=vlistentry labeltag=vlistterm # Tables. [tabledef-default] template=table colspec=>\{{colalign@left:\\raggedright}{colalign@center:\\centering}{colalign@right:\\raggedleft}\}p\{ {colwidth}pt \} bodyrow=%| \tabularnewline headdata=\{\bfseries\{\}%|\} {colnumber@{cols}::&} footdata=\{\bfseries\{\}%|\} {colnumber@{cols}::&} bodydata=%| {colnumber@{cols}:%:&} [table] ifdef::latex-use-colored-tables[] \rowcolors\{1\}\{TableEvenColor\}\{TableOddColor\} \setlength\arrayrulewidth\{1.5pt\} \arrayrulecolor\{TableBorderColor\} endif::latex-use-colored-tables[] {eval:{rows}{gt}{latex-table-rowlimit}} \begin\{longtable\}\{ {eval:{rows}{gt}{latex-table-rowlimit}} {frame$all|sides:|} {eval:{rows}{gt}{latex-table-rowlimit}} {colspecs} {eval:{rows}{gt}{latex-table-rowlimit}} {frame$all|sides:|} {eval:{rows}{gt}{latex-table-rowlimit}} \} {eval:{rows}{gt}{latex-table-rowlimit}} \hypertarget\{{id}\}\{\} {eval:{rows}{gt}{latex-table-rowlimit}} \caption\{{title}\} {eval:{rows}{gt}{latex-table-rowlimit}} {frame$all|topbot:\hline} {eval:{rows}{gt}{latex-table-rowlimit}} {headrows} {eval:{rows}{gt}{latex-table-rowlimit}} {headrows#} \endhead {eval:{rows}{gt}{latex-table-rowlimit}} {footrows} {eval:{rows}{gt}{latex-table-rowlimit}} {footrows#} \endlastfoot {eval:{rows}{gt}{latex-table-rowlimit}} {eval:{rows}{gt}{latex-table-rowlimit}} {bodyrows} {eval:{rows}{gt}{latex-table-rowlimit}} {frame$all|topbot:\hline} {eval:{rows}{gt}{latex-table-rowlimit}} \label\{{id}\} {eval:{rows}{gt}{latex-table-rowlimit}} \end\{longtable\} {eval:{rows}{lt}={latex-table-rowlimit}} {title%} \par{latex-indent-paragraphs!\noindent} {eval:{rows}{lt}={latex-table-rowlimit}} {title#} \begin\{table\} {eval:{rows}{lt}={latex-table-rowlimit}} {title#} \begin\{center\} {eval:{rows}{lt}={latex-table-rowlimit}} \hypertarget\{{id}\}\{\} {eval:{rows}{lt}={latex-table-rowlimit}} \caption\{{title}\} {eval:{rows}{lt}={latex-table-rowlimit}} \begin\{tabular\}\{ {eval:{rows}{lt}={latex-table-rowlimit}} {frame$all|sides:|} {eval:{rows}{lt}={latex-table-rowlimit}} {colspecs} {eval:{rows}{lt}={latex-table-rowlimit}} {frame$all|sides:|} {eval:{rows}{lt}={latex-table-rowlimit}} \} {eval:{rows}{lt}={latex-table-rowlimit}} {frame$all|topbot:\hline} {eval:{rows}{lt}={latex-table-rowlimit}} {headrows} {eval:{rows}{lt}={latex-table-rowlimit}} {bodyrows} {eval:{rows}{lt}={latex-table-rowlimit}} {footrows} {eval:{rows}{lt}={latex-table-rowlimit}} {frame$all|topbot:\hline} {eval:{rows}{lt}={latex-table-rowlimit}} \end\{tabular\} {eval:{rows}{lt}={latex-table-rowlimit}} {title#} \end\{center\} {eval:{rows}{lt}={latex-table-rowlimit}} \label\{{id}\} {eval:{rows}{lt}={latex-table-rowlimit}} {title#} \end\{table\} [specialsections] ifdef::doctype-article[] ^Abstract$=sect-abstract endif::doctype-article[] ifdef::doctype-book[] ^Dedication$=sect-dedication endif::doctype-book[] ^Index$=sect-index ifdef::latex-use-bibliography-environment[] ^(Bibliography|References)$=sect-bibliography endif::latex-use-bibliography-environment[] ^Appendix.*$=sect-appendix ^(TOC|Contents)$=sect-toc ^Figures$=sect-list-of-figures # Special sections. [sect-list-of-figures] \listoffigures [sect-toc] \label\{{id}\}\hypertarget\{{id}\}\{\} \tableofcontents [sect-index] \setindexpreamble\{ | \} \label\{{id}\}\hypertarget\{{id}\}\{\} \printindex ifdef::latex-use-bibliography-environment[] [sect-bibliography] \label\{{id}\}\hypertarget\{{id}\}\{\} \begin\{thebibliography\}\{99\} | \end\{thebibliography\} endif::latex-use-bibliography-environment[] [sect-appendix] \appendix \label\{{id}\}\hypertarget\{{id}\}\{\} | [sect-abstract] \label\{{id}\}\hypertarget\{{id}\}\{\} \begin\{abstract\} | \end\{abstract\} [sect-dedication] \label\{{id}\}\hypertarget\{{id}\}\{\} \dedication\{ | \} [preamble] # Untitled elements between header and first section title. ifdef::doctype-book[] \frontmatter \chapter*\{Preface\} \label\{preamble\}\hypertarget\{preamble\}\{\} endif::doctype-book[] | ifdef::doctype-book[] \mainmatter endif::doctype-book[] # Document sections. [sect0] \hypertarget\{{id}\}\{\} \chapter\{{title}\} \label\{{id}\} | [sect1] \hypertarget\{{id}\}\{\} \section\{{title}\} \label\{{id}\} [sect2] \hypertarget\{{id}\}\{\} \subsection\{{title}\} \label\{{id}\} | [sect3] \hypertarget\{{id}\}\{\} \subsubsection\{{title}\} \label\{{id}\} | [sect4] \hypertarget\{{id}\}\{\} \minisec\{{title}\} \label\{{id}\} | [header] {encoding$UTF-8:}% coding: utf-8 \documentclass [a4paper,abstracton,titlepage]\{{doctype@article:scrartcl:scrbook}\} \pagestyle\{{latex-use-running-title-headings?headings}{latex-use-running-title-headings!plain}\} \usepackage\{makeidx\} \usepackage[table]\{xcolor\} \definecolor\{LinkColor\}\{RGB\}\{85,107,47\} \definecolor\{TableEvenColor\}\{RGB\}\{238,255,204\} \definecolor\{TableOddColor\}\{RGB\}\{238,255,255\} \definecolor\{TableBorderColor\}\{RGB\}\{140,172,187\} \definecolor\{ListingBorderColor\}\{gray\}\{0.55\} \definecolor\{ListingBackgroundColor\}\{gray\}\{0.95\} \definecolor\{SidebarBorderColor\}\{gray\}\{0.95\} \definecolor\{SidebarBackgroundColor\}\{RGB\}\{255,255,238\} \usepackage\{type1ec\} \usepackage[{language=english}]\{babel\} \usepackage[ pdftex, pdftitle=\{{doctitle}\}, pdfauthor=\{{author}\}, backref, pagebackref, breaklinks=true, unicode ] \{hyperref\} \usepackage\{enumerate\} \usepackage\{graphicx\} \usepackage\{longtable\} \usepackage[T1]\{fontenc\} \usepackage\{ucs\} \usepackage[{encoding@ISO-8859-1:latin1}{encoding@UTF-8:utf8x}{encoding!utf8x}]\{inputenc\} \usepackage\{textcomp\} \usepackage\{alltt\} \usepackage\{listings\} \lstset\{basicstyle=\footnotesize\ttfamily,showstringspaces=false,breaklines,frame=single, rulecolor=\color\{ListingBorderColor\}, backgroundcolor=\color\{ListingBackgroundColor\}, xleftmargin=0cm, linewidth=0.95\textwidth\} {latex-indent-paragraphs%} \setlength\{\parskip\}\{1ex plus 0.5ex minus 0.2ex\} \makeatletter \DeclareRobustCommand*\textsubscript[1]\{% \@textsubscript\{\selectfont#1\}\} \def\@textsubscript#1\{% \{\m@th\ensuremath\{_\{\mbox\{\fontsize\sf@size\z@#1\}\}\}\}\} \makeatother \subject\{{subject}\} \title\{{doctitle}\} \author\{{author}{email?, \href\{mailto:{email}\}\{{email}\}}\} \date\{{date}\} \publishers\{\begin\{tabular\}\{ll\} {revision?\textbf\{Revision:\} & {revision} \\ } {keywords?\textbf\{Keywords:\} & {keywords} \\ } \end\{tabular\}\} \makeindex \begin\{document\} \label\{header\}\hypertarget\{header\}\{\} {doctitle#\maketitle} [footer] \label\{footer\}\hypertarget\{footer\}\{\} \end\{document\} asciidoc-8.2.7/linuxdoc.conf0000644000175100017510000001205510711254236016154 0ustar srackhamsrackham# linuxdoc.conf # # Asciidoc configuration file. # linuxdoc backend, article document type. # # NOTE: # - The Linuxdoc format only supports article documents. # - Linuxdoc does not support a number of AsciiDoc elements, for # example table. # - The AsciiDoc linuxdoc backend is no longer being actively # developed or tested with new AsciiDoc releases. # [attributes] basebackend=linuxdoc basebackend-linuxdoc= [miscellaneous] outfilesuffix=.sgml [replacements] (?m)^(.*)\s\+$=\1 # To allow the AsciiDoc User Guide to be processed. {amp}\#960;=pi # Small 'NEW' image. (?
    {doctitle} by {author} <> {date#} {date#} v{revision}{date?,} {date#} {date} {date#} [footer]
    [indexterm-inlinemacro] # Inline index term. {2%}{1} {2#}{3%}{2} {3} [indexterm2-inlinemacro] # Inline index term. # Single entry index term that is visible in the primary text flow. {1} {1} [footnote-inlinemacro] # Inline footnote. [{0}] [tags] # Bulleted, numbered and labeled list tags. ilist={title?

    {title}}| ilistitem=| ilisttext=| olist={title?

    {title}}| olist2=| olistitem=| olisttext=| vlist={title?

    {title}}| vlistitem=| vlisttext=| vlistentry=| vlistterm=| # Same as vertical labeled list. hlist={title?

    {title}}| hlistitem=| hlisttext=| hlistentry=| hlistterm=| # Question and Answer list. qlist=| qlistentry=| qlistterm=| qlistitem=| qlisttext=

    | # Callout list (same as numbered list). colist={title?

    {title}}| colistitem=| colisttext=| # Quoted text emphasis=| strong=| monospaced=| quoted=``|'' [specialsections] ^Abstract$=sect-abstract [sect-abstract] | [preamble] | [sect1] {title}

    | [sect2] {title}

    | [sect3] {title}

    | [sect4]

    {title}

    | # Inline macros [http-inlinemacro] [https-inlinemacro] [ftp-inlinemacro] [file-inlinemacro] [mailto-inlinemacro] [link-inlinemacro] # LinuxDoc does not have anchors or anchor reference elements but we include # the macros so the anchor is hidden and the reference text displayed. # Anchor: [[id,xreflabel]] [anchor-inlinemacro] #[{target}] [anchor2-inlinemacro] # [[id,text]] #[{1}] [xref-inlinemacro] #{1} [{target}] {1={target}} [xref2-inlinemacro] # <> #{2} [{1}] {2=1} # Special word macros [emphasizedwords] {words} [monospacedwords] {words} [strongwords] {words} # Paragraph substitution. [paragraph]

    {title} | {empty} {empty} [literalparagraph]

    Example: {title} | {empty} [admonitionparagraph]

    {style}: | {empty} {empty} [verseparagraph] template::[paragraph] [image-inlinemacro] {1={target}} [ruler-blockmacro] # Only applies to HTML so don't output anything. [image-blockmacro]

    Figure: {title}

    {1} {1%}

    Image file: {target} [literalblock]

    Example: {title} | {empty} [listingblock]

    Example: {title} | {empty} [sidebarblock]

    {title} | {empty} {empty} [exampleblock]

    {title} | {empty} {empty} [admonitionblock]

    {style} | {empty} {empty} [passthroughblock] | [quoteblock]

    {title} |

    — {1={attribution}} {2={citetitle}} {empty} [verseblock] | {empty} {empty} # Bibliography list. # Same as numbered list. [listdef-bibliography] listtag=olist itemtag=olistitem texttag=olisttext # Glossary list. # Same as variable list. [listdef-glossary] listtag=vlist itemtag=vlistitem texttag=vlisttext entrytag=vlistentry labeltag=vlistterm asciidoc-8.2.7/math.conf0000644000175100017510000000260011033373471015254 0ustar srackhamsrackham# # AsciiDoc configuration for math inline macro and math style listing block. # # Used to embed LaTeX math formulas in DocBook output that is intended # for processing using dblatex. # # See DBTeXMath (http://ricardo.ecn.wfu.edu/~cottrell/dbtexmath/) # The 'Short Math Guide for LaTeX' (http://www.ams.org/tex/amslatex.html) # [math-inlinemacro] ifdef::backend-xhtml11[] [math-inlinemacro] {0} endif::backend-xhtml11[] # Using the tag is an undocumented way to embed arbitrary LaTeX. [tex-inlinemacro] template::[math-inlinemacro] # math style listing block for formal and informal equation blocks. # There is one oddity though: dblatex displays elements # inline instead of as block, a workaround is to use a stand-alone inline # macro. [blockdef-listing] math-style=template="mathblock",subs="none" tex-style=template="mathblock",subs="none" ifdef::backend-docbook[] [mathblock] {title} {title%} {title#} {title%} endif::backend-docbook[] ifdef::backend-xhtml11[] [mathblock] | endif::backend-xhtml11[] asciidoc-8.2.7/t.conf0000644000175100017510000000070111033264073014563 0ustar srackhamsrackham[math-inlinemacro] {0} equation # math style for listing block. [blockdef-listing] style=template="mathblock",subs=() ifdef::backend-docbook[] [mathblock] {title} {title%} | equation {title#} {title%} endif::backend-docbook[] asciidoc-8.2.7/text.conf0000644000175100017510000000072010711254236015307 0ustar srackhamsrackham# text.conf # Used by the AsciiDoc a2x(1) toolchain wrapper utility. # Filters to add leading blank line and margin indent to verbatim # block elements so lynx(1) generated text output looks nicer. [paradef-default] verse-style=template="verseparagraph",filter="echo; echo; sed 's/^/ /'" [paradef-literal] filter=echo; echo; sed 's/^/ /' [blockdef-listing] filter=echo; sed 's/^/ /' [blockdef-literal] filter=echo; sed 's/^/ /' asciidoc-8.2.7/xhtml-deprecated-css.conf0000644000175100017510000001433511033052043020340 0ustar srackhamsrackham# # xhtml-deprecated-css.conf # # DEPRECATED: Asciidoc 6 xhtml backend. # Included in xhtml-deprecated.conf # [tags] # Add title class. ilist={id?}{title?

    {title}

    }
      |
    olist={id?}{title?

    {title}

    }
      |
    vlist={id?}{title?

    {title}

    }
    |
    hlist={id?}{title?

    {title}

    }|
    qlist={id?}{title?

    {title}

    }
      |
    colist={id?}{title?

    {title}

    }
      |
    [image-inlinemacro] # border="0" so broken IE6 does not put border round linked image. {1={target}} {link#} [image-blockmacro] # Paragraph substitution. [literalparagraph]

    Example: {title}

    |
    # Admonition paragraphs. [admonitionparagraph]
    # For backward compatibility still accept deprecated imagesdir attribute. {icons#}
    {caption}

    {style}: |

    # Delimited block substitution. [literalblock]

    Example: {title}

    |
    
    [listingblock]

    Example: {title}

    |
    
    [sidebarblock]

    {title}

    |
    [passthroughblock] | [exampleblock]

    Example: {title}

    |
    # Admonition blocks. [admonitionblock]
    # For backward compatibility still accept deprecated imagesdir attribute. {icons#}
    {caption}

    {title={style}}

    |
    [verseblock]

    {id?}{title?{title}
    } |

    [table] # Table captions not used because IE6 is broken.

    Table: {title}

    # If you want styled table borders in IE use the following table tag: # 1. Border style specified here rather than in CSS because IE6 is broken. # 2. bordercolor attribute is IE specific and not valid XHTML 1.0. # # # Use this in preference to be strictly XHTML 1.0 conformant.
    {headrows#} {headrows} {headrows#} {footrows#} {footrows} {footrows#} {bodyrows}
    [preamble] # Untitled elements between header and first section title.
    |
    [sect0]

    {id?}{title}

    | [sect1]

    {id?}{numbered?{sectnum} }{title}

    | [sect2]

    {id?}{numbered?{sectnum} }{title}

    | [sect3]

    {id?}{numbered?{sectnum} }{title}

    | [sect4]
    {id?}{title}
    | [footer] #------------------------- # article and book document types # Both use the article.css stylesheet #------------------------- ifndef::doctype-manpage[] [header] ifdef::linkcss[] endif::linkcss[] ifndef::linkcss[] endif::linkcss[] {doctitle}

    {doctitle}

    by {author}
    <{email}>
    v{revision}{date?,} {date}

    endif::doctype-manpage[] #------------------------- # manpage document type #------------------------- ifdef::doctype-manpage[] [header] ifdef::linkcss[] endif::linkcss[] ifndef::linkcss[] endif::linkcss[] {mantitle}

    {doctitle} Manual Page

    NAME

    {manname} - {manpurpose}

    # Section macros [sect-synopsis]

    SYNOPSIS

    |
    endif::doctype-manpage[] asciidoc-8.2.7/xhtml-deprecated.conf0000644000175100017510000001676211033052043017560 0ustar srackhamsrackham# # xhtml-deprecated.conf # # DEPRECATED: Asciidoc 6 xhtml backend. # [miscellaneous] outfilesuffix=.html # Screen width in pixels. pagewidth=800 pageunits= [attributes] basebackend=html basebackend-html= dtddecl=PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" [replacements] # Line break. (?m)^(.*)\s\+$=\1
    # Superscripts. \^(.+?)\^=\1 # Subscripts. ~(.+?)~=\1 [ruler-blockmacro]
    [image-inlinemacro] {1={target}} {link#} [image-blockmacro] {1={target}} {link#}

    Figure: {title}

    [indexterm-inlinemacro] # Inline index term. {empty} [indexterm2-inlinemacro] # Inline index term. # Single entry index term that is visible in the primary text flow. {1} [footnote-inlinemacro] # Inline footnote.
    [{0}]
    [callout-inlinemacro] # Inline callout. ({index}) [tags] # Bulleted, numbered and labeled list tags. ilist={id?}{title?

    {title}

    }
      |
    ilistitem=
  • |
  • ilisttext=

    |

    olist={id?}{title?

    {title}

    }
      |
    olist2={id?}
      |
    olistitem=
  • |
  • olisttext=

    |

    vlist={id?}{title?

    {title}

    }
    |
    vlistentry=| vlistterm=
    |
    vlistitem=
    |
    vlisttext=

    |

    # Horizontal labeled list. hlist={id?}{title?

    {title}

    }|
    hlistentry=| hlisttext=| hlistterm=| hlistitem=| # Question and Answer list. qlist={id?}{title?

    {title}

    }
      |
    qlistentry=
  • |
  • qlistterm=

    |

    qlistitem=| qlisttext=

    |

    # Callout list. colist={id?}{title?

    {title}

    }
      |
    colistitem=
  • |
  • colisttext=

    |

    # Quoted text. emphasis=| strong=| monospaced=| quoted={amp}#8220;|{amp}#8221; # Inline macros [http-inlinemacro] {0={name}:{target}} [https-inlinemacro] {0={name}:{target}} [ftp-inlinemacro] {0={name}:{target}} [file-inlinemacro] {0={name}:{target}} [mailto-inlinemacro] {0={target}} [link-inlinemacro] {0={target}} # anchor:id[text] [anchor-inlinemacro] # [[id,text]] [anchor2-inlinemacro] # [[[id]]] [anchor3-inlinemacro] [{1}] # xref:id[text] [xref-inlinemacro] {0=[{target}]} # <> [xref2-inlinemacro] {2=[{1}]} # Special word substitution. [emphasizedwords] {words} [monospacedwords] {words} [strongwords] {words} # Paragraph substitution. [paragraph]

    {id?}{title?{title}
    } |

    [literalparagraph] # The literal block employs the same markup. template::[literalblock] [verseparagraph] # The verse block employs the same markup. template::[verseblock] [admonitionparagraph]

    {style}: |

    # Delimited blocks. [passthroughblock] | [listingblock]

    {title}

    |
    
    [literalblock]

    {title}

    |
    
    [verseblock]

    {title}

    # Font inheritance broken in IE6.
    |
    
    [sidebarblock]

    {title}

    |
    [quoteblock]

    {title}

    |

    {citetitle}
    — {attribution}

    [exampleblock]

    Example: {title}

    |
    [admonitionblock]

    {style}

    {title}

    |
    # Bibliography list. # Same as numbered list. [listdef-bibliography] listtag=olist itemtag=olistitem texttag=olisttext # Glossary list. # Same as labeled list. [listdef-glossary] listtag=vlist itemtag=vlistitem texttag=vlisttext entrytag=vlistentry labeltag=vlistterm # Tables. [tabledef-default] template=table bodyrow=| headdata=| footdata=| bodydata=| [table]

    Table: {title}

    {headrows#} {headrows} {headrows#} {footrows#} {footrows} {footrows#} {bodyrows}
    [footer]


    Version {revision}
    Last updated {localdate} {localtime}

    [preamble] # Untitled elements between header and first section title. | [sect0] {doctype-manpage%}

    {id?}{title}

    | [sect1] {doctype-manpage%}

    {id?}{numbered?{sectnum} }{title}

    | [sect2]

    {id?}{numbered?{sectnum} }{title}

    | [sect3]

    {id?}{numbered?{sectnum} }{title}

    | [sect4]
    {id?}{title}
    | #------------------------- # article and book document types #------------------------- ifndef::doctype-manpage[] [header] {doctitle}

    {doctitle}

    by {author}
    <{email}>
    v{revision}{date?,} {date}

    endif::doctype-manpage[] #------------------------- # manpage document type #------------------------- ifdef::doctype-manpage[] [tags] # This is more inline with man page convention. emphasis=| vlistterm=
    |
    [header] {mantitle}

    {doctitle} Manual Page


    NAME

    {manname} - {manpurpose}

    [sect-synopsis] template::[sect1] endif::doctype-manpage[] ifdef::css[] include::xhtml-deprecated-css.conf[] endif::css[] asciidoc-8.2.7/xhtml11-quirks.conf0000644000175100017510000000255711033024045017136 0ustar srackhamsrackham# # xhtml11-quirks.conf # # Workarounds for IE6's broken # and incomplete CSS2. # [image-blockmacro]
    {caption={figure_caption}}{title}
    [sidebarblock]
    [quoteblock]
    {title}
    |
    {citetitle}
    — {attribution}
    [verseblock]
    {title}
    |
    {citetitle}
    — {attribution}
    [exampleblock]
    {caption=Example: }{title}
    |
    [sect2] # The
    is because the IE6 adjacent-sibling CSS selector is broken. {numbered?{sectnum} }{title}
    | asciidoc-8.2.7/xhtml11.conf0000644000175100017510000003341611033017146015624 0ustar srackhamsrackham# # xhtml11.conf # # Asciidoc configuration file. # xhtml11 backend, generates XHTML 1.1 conformant markup. # [miscellaneous] outfilesuffix=.html # Screen width in pixels. pagewidth=800 pageunits= [attributes] basebackend=html basebackend-html= [replacements] # Line break. (?m)^(.*)\s\+$=\1
    # Escape ASCIIMathML delimiters. ifdef::asciimath[] \$=\$ `=\` endif::asciimath[] ifdef::asciidoc7compatible[] # Superscripts. \^(.+?)\^=\1 # Subscripts. ~(.+?)~=\1 endif::asciidoc7compatible[] [ruler-blockmacro]
    [image-inlinemacro] {1={target}} {link#} [image-blockmacro]
    {caption={figure_caption}}{title}
    [indexterm-inlinemacro] # Inline index term. {empty} [indexterm2-inlinemacro] # Inline index term. # Single entry index term that is visible in the primary text flow. {1} [footnote-inlinemacro] # Inline footnote.
    [{0}]
    [callout-inlinemacro] # Inline callout. ({index}) [tags] # Bulleted, numbered and labeled list tags. ilist=
    {title?
    {title}
    }
      |
    ilistitem=
  • |
  • ilisttext=

    |

    olist=
    {title?
    {title}
    }
      |
    olist2=
    {title?
    {title}
    }
      |
    olistitem=
  • |
  • olisttext=

    |

    vlist=
    {title?
    {title}
    }
    |
    vlistentry=| vlistterm=
    |
    vlistitem=
    |
    vlisttext=

    |

    # Horizontal labeled list. hlist=
    {title?
    {title}
    }{1?}{2?}|
    hlistentry=| hlistterm=| hlistitem=| hlisttext=| # Question and Answer list. qlist=
    {title?
    {title}
    }
      |
    qlistentry=
  • |
  • qlistterm=

    |

    qlistitem=| qlisttext=

    |

    # Callout list. colist=
    {title?
    {title}
    }
      |
    colistitem=
  • |
  • colisttext=

    |

    # Quoted text. emphasis=| strong=| monospaced=| quoted={0?}{amp}#8220;|{amp}#8221;{0?} unquoted={0?}|{0?} superscript=| subscript=| # $$ inline passthrough. $$passthrough=| # Inline macros [http-inlinemacro] {0={name}:{target}} [https-inlinemacro] {0={name}:{target}} [ftp-inlinemacro] {0={name}:{target}} [file-inlinemacro] {0={name}:{target}} [mailto-inlinemacro] {0={target}} [link-inlinemacro] {0={target}} [callto-inlinemacro] {0={target}} # anchor:id[text] [anchor-inlinemacro] # [[id,text]] [anchor2-inlinemacro] # [[[id]]] [anchor3-inlinemacro] [{1}] # xref:id[text] [xref-inlinemacro] {0=[{target}]} # <> [xref2-inlinemacro] {2=[{1}]} # Special word substitution. [emphasizedwords] {words} [monospacedwords] {words} [strongwords] {words} # Paragraph substitution. [paragraph]
    {title?
    {title}
    }

    |

    [literalparagraph] # The literal block employs the same markup. template::[literalblock] [verseparagraph] # The verse block employs the same markup. template::[verseblock] [admonitionparagraph] # The admonition block employs the same markup. template::[admonitionblock] # Delimited blocks. [passthroughblock] | [listingblock]
    {caption=Example: }{title}
    
    |
    
    [literalblock]
    {title}
    {style#}
    
    {style%}
    
    |
    
    [sidebarblock]
    {title}
    |
    [quoteblock]
    {title}
    |
    {citetitle}
    — {attribution}
    [verseblock]
    {title}
    |
    {citetitle}
    — {attribution}
    [exampleblock]
    {caption=Example: }{title}
    |
    [admonitionblock]
    {icons#}{caption} {icons%}
    {caption}
    {title}
    |
    # Bibliography list. # Same as numbered list. [listdef-bibliography] listtag=olist itemtag=olistitem texttag=olisttext # Glossary list. # Same as labeled list. [listdef-glossary] listtag=vlist itemtag=vlistitem texttag=vlisttext entrytag=vlistentry labeltag=vlistterm # Tables. [tabledef-default] template=table colspec= bodyrow=| headdata=| footdata=| bodydata=| [table]
    {colspecs} {headrows#} {headrows} {headrows#} {footrows#} {footrows} {footrows#} {bodyrows}
    {caption={table_caption}}{title}
    [preamble] # Untitled elements between header and first section title.
    |
    # Document sections. [sect0] {title} | [sect1] {numbered?{sectnum} }{title}
    |
    [sect2] {numbered?{sectnum} }{title} | [sect3] {numbered?{sectnum} }{title} | [sect4] {title} | [header] # IE6 enters quirks mode if the following XML directive is present. # ifdef::linkcss[] {doctype-manpage} ifdef::quirks[] endif::quirks[] endif::linkcss[] ifndef::linkcss[] endif::linkcss[] ifdef::toc[] ifdef::linkcss[] endif::linkcss[] ifndef::linkcss[] endif::linkcss[] endif::toc[] ifdef::asciimath[] ifdef::linkcss[] endif::linkcss[] ifndef::linkcss[] endif::linkcss[] endif::asciimath[] ifdef::latexmath[] ifdef::linkcss[] endif::linkcss[] ifndef::linkcss[] endif::linkcss[] endif::latexmath[] {doctitle=} # Article, book header. ifndef::doctype-manpage[] endif::doctype-manpage[] # Man page header. ifdef::doctype-manpage[] endif::doctype-manpage[] [footer] ifdef::doctype-manpage[] [sect-synopsis] template::[sect1] endif::doctype-manpage[] ifdef::quirks[] include::{backend}-quirks.conf[] endif::quirks[] # If data-uri attribute is defined then embed images in HTML pages using the # data: URI scheme (http://en.wikipedia.org/wiki/Data:_URI_scheme). ifdef::data-uri[] [image-inlinemacro] {1={target}} {link#} [image-blockmacro]
    {caption={figure_caption}}{title}
    [admonitionblock]
    {icons%}
    {caption}
    {icons#}{caption}
    {title}
    |
    endif::data-uri[] asciidoc-8.2.7/COPYING0000644000175100017510000004362110711254235014515 0ustar srackhamsrackham GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, Cambridge, MA 02139, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS Appendix: How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 19yy 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., 675 Mass Ave, Cambridge, MA 02139, USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. asciidoc-8.2.7/COPYRIGHT0000644000175100017510000000137311032373106014747 0ustar srackhamsrackhamCopyright (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. asciidoc-8.2.7/dblatex/asciidoc-dblatex.sty0000644000175100017510000000102511021605502021025 0ustar srackhamsrackham%% %% This style is derived from the docbook one. %% \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{asciidoc}[2008/06/05 AsciiDoc DocBook Style] %% Just use the original package and pass the options. \RequirePackageWithOptions{docbook} % Sidebar is a boxed minipage that can contain verbatim. % Changed shadow box to double box. \renewenvironment{sidebar}[1][0.95\textwidth]{ \hspace{0mm}\newline% \noindent\begin{Sbox}\begin{minipage}{#1}% \setlength\parskip{\medskipamount}% }{ \end{minipage}\end{Sbox}\doublebox{\TheSbox}% } asciidoc-8.2.7/dblatex/asciidoc-dblatex.xsl0000644000175100017510000000132111021603365021020 0ustar srackhamsrackham colorlinks,linkcolor=blue,pdfstartview=FitH 1 1 0 3 0 0 asciidoc-8.2.7/dblatex/dblatex-readme.txt0000644000175100017510000000113211032346527020516 0ustar srackhamsrackhamAsciiDoc dblatex README ======================= Customization ------------- The `./dblatex` directory contains: `./dblatex/asciidoc-dblatex.xsl`:: Optional dblatex XSL parameter customization. `./dblatex/asciidoc-dblatex.sty`:: Optional customized LaTeX styles. Use these files with dblatex(1) `-p` and `-s` options, for example: dblatex -p ../dblatex/asciidoc-dblatex.xsl \ -s ../dblatex/asciidoc-dblatex.sty article.xml Limitations ----------- - As of 'dblatex' version 0.2.8 callouts are limited to images and program listings and therefore aren't useful in AsciiDoc documents. asciidoc-8.2.7/doc/a2x.10000644000175100017510000001561611033406725015007 0ustar srackhamsrackham.\" Title: a2x .\" Author: .\" Generator: DocBook XSL Stylesheets v1.72.0 .\" Date: 07/04/2008 .\" Manual: .\" Source: .\" .TH "A2X" "1" "07/04/2008" "" "" .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .SH "NAME" a2x \- convert Asciidoc text file to PDF, XHTML, HTML Help, manpage or plain text .SH "SYNOPSIS" \fBa2x\fR [\fIOPTIONS\fR] \fIFILE\fR .sp .SH "DESCRIPTION" A DocBook toolchain wrapper script that translates an AsciiDoc text file \fIFILE\fR to PDF, DVI, PS, LaTeX, XHTML (single page or chunked), man page, HTML Help or plain text formats. PDF, XHTML, man page and HTML Help formats are are generated using the asciidoc(1), xsltproc(1), DocBook XSL Stylesheets, dblatex (or FOP) toolchain. Plain text is produced by passing asciidoc(1) generated HTML through lynx(1). The htmlhelp format option generates .hhp, .hhc and .html files suitable for compilation to an HTML Help .chm file. .sp .SH "OPTIONS" .PP \fB\-a, \-\-attribute\fR=\fIATTRIBUTE\fR .RS 4 Set asciidoc(1) attribute value (shortcut for \fB\-\-asciidoc\-opts\fR=\fI"\-a ATTRIBUTE"\fR option). This option may be specified more than once. .RE .PP \fB\-\-asciidoc\-opts\fR=\fIASCIIDOC_OPTS\fR .RS 4 Additional asciidoc(1) options. This option may be specified more than once. .RE .PP \fB\-\-copy\fR .RS 4 Copy distributed docbook\-xsl CSS stylesheet admonition and navigation icons to their respective destinations. Applies to \fIxhtml\fR, \fIchunked\fR, \fIhtmlhelp\fR formats. The default behavior is to suppress copying. .RE .PP \fB\-D, \-\-destination\-dir\fR=\fIPATH\fR .RS 4 Output directory. Defaults to source \fIFILE\fR directory. .RE .PP \fB\-d, \-\-doctype\fR=\fIDOCTYPE\fR .RS 4 DocBook document type: \fIarticle\fR, \fImanpage\fR or \fIbook\fR. Default document type is \fIarticle\fR unless the format is \fImanpage\fR (in which case it defaults to \fImanpage\fR). .RE .PP \fB\-f, \-\-format\fR=\fIFORMAT\fR .RS 4 Output format: \fIchunked\fR, \fIdvi\fR, \fIhtmlhelp\fR, \fImanpage\fR, \fIpdf\fR, \fIps\fR, \fItex\fR, \fItext\fR or \fIxhtml\fR. .RE .PP \fB\-h, \-\-help\fR .RS 4 Print command\-line syntax and program options to stdout. .RE .PP \fB\-\-icons\fR .RS 4 Use admonition or navigation icon images in output documents. The default behavior is to use text in place of icons. .RE .PP \fB\-\-icons\-dir\fR=\fIPATH\fR .RS 4 A path (relative to destination HTML files) containing admonition and navigation icons. Defaults to \fI./images/icons/\fR. Applies to \fIxhtml\fR, \fIchunked\fR, \fIhtmlhelp\fR formats. .RE .PP \fB\-n, \-\-dry\-run\fR .RS 4 Don't do anything just print what would have been done. .RE .PP \fB\-s, \-\-skip\-asciidoc\fR .RS 4 Skip asciidoc execution. This is useful for converting DocBook XML files not derived from AsciiDoc sources. Ignored if \-\-format*=\fItext\fR. .RE .PP \fB\-\-stylesheet\fR=\fIPATH\fR .RS 4 A path (relative to destination HTML files) specifying the docbook\-xsl CSS stylesheet file. Defaults to \fI./docbook\-xsl.css\fR. Applies to \fIxhtml\fR, \fIchunked\fR, \fIhtmlhelp\fR formats. .RE .PP \fB\-v, \-\-verbose\fR .RS 4 Print operational details to stderr. A second \fB\-v\fR option applies the verbose option to toolchain commands. .RE .PP \fB\-\-version\fR .RS 4 Print program version to stdout. .RE .PP \fB\-\-xsltproc\-opts\fR=\fIXSLTPROC_OPTS\fR .RS 4 Additional xsltproc(1) options. This option may be specified more than once. .RE .PP \fB\-\-fop\-opts\fR=\fIFOP_OPTS\fR .RS 4 Additional fop options. This option may be specified more than once. If this option is specified fop is used to generate PDFs. .RE .PP \fB\-\-dblatex\-opts\fR=\fIDBLATEX_OPTS\fR .RS 4 Additional dblatex options. This option may be specified more than once. .RE .SH "OUTPUT FILES" Output files are written to the directory specified by the \fB\-\-destination\-dir\fR option. If no \fB\-\-destination\-dir\fR option is set output files are written to the source FILE directory. .sp Output files have the same name as the source \fIFILE\fR but with an appropriate file name extension: .html for \fIxhtml\fR; .hhp for \fIhtmlhelp\fR; .pdf for \fIpdf\fR; .text for \fItext\fR. By convention manpages have no .man extension (man page section number only). Chunked HTML directory names have a .chunked extension; chunked HTML Help directory names have a .htmlhelp extension. .sp Same named existing files are overwritten. .sp Intermediate output files are written to the source \fIFILE\fR directory and are not automatically deleted. .sp Intermediate DocBook XML files generated by AsciiDoc are only regenerated if out of date with respect to the AsciiDoc source \fIFILE\fR. .sp In addition to generating HTML files the \fIxhtml\fR, \fIchunked\fR and \fIhtmlhelp\fR formats copy the DocBook XSL stylesheet plus admonition and navigation icons distributed with AsciiDoc to their respective destination locations. Existing stylesheets and icons are only copied if they are newer than the destination files or if the destination files are missing. .sp The \fIxhtml\fR format generates a single XHTML output page. The \fIchunked\fR format writes multiple per\-section HTML pages to a chunked directory in the destination directory. The chunked directory has the same name as the source \fIFILE\fR name plus a .chunked extension. .sp .SH "EXAMPLES" .PP a2x \-f pdf doc/source\-highlight\-filter.txt .RS 4 Generates doc/source\-highlight\-filter.pdf file. .RE .PP a2x \-f chunked \-D ../webpages guide.txt .RS 4 Creates chunked directory \&../webpages/guide.chunked containing chunked HTML files. Also copies docbook\-xsl.css stylesheet to the \&../webpages/guide.chunked directory plus admonition and navigation icons to the \&../webpages/guide.chunked/images/icons directory. .RE .SH "REQUISITES" This script runs under the bash(1) shell and requires the following programs (which may or may not be prepackaged with your Linux distribution): .sp .PP Asciidoc .RS 4 http://www.methods.co.nz/asciidoc/ .RE .PP xsltproc .RS 4 http://xmlsoft.org/XSLT/ .RE .PP DocBook XSL Stylesheets .RS 4 http://docbook.sourceforge.net/projects/xsl/ .RE .PP dblatex (for PDF, DVI, PostScript and LaTeX file generation) .RS 4 http://dblatex.sourceforge.net/ .RE .PP FOP (alternative PDF file generation) .RS 4 http://xmlgraphics.apache.org/fop/ .RE .PP Lynx (for text file generation) .RS 4 http://lynx.isc.org/ .RE See also the latest README file. .sp .SH "BUGS" .sp .RS 4 \h'-04'\(bu\h'+03'The odt output format is undocumented and experimental. .RE .sp .RS 4 \h'-04'\(bu\h'+03'See also the AsciiDoc distribution BUGS file. .RE .SH "AUTHOR" Written by Stuart Rackham, .sp .SH "RESOURCES" SourceForge: http://sourceforge.net/projects/asciidoc/ .sp Main web site: http://www.methods.co.nz/asciidoc/ .sp .SH "COPYING" Copyright (C) 2002\-2008 Stuart Rackham. Free use of this software is granted under the terms of the GNU General Public License (GPL). .sp .SH "REFERENCES" .IP " 1." 4 srackham@gmail.com .RS 4 \%mailto:srackham@gmail.com .RE asciidoc-8.2.7/doc/article.pdf0000644000175100017510000010016411033404410016327 0ustar srackhamsrackham%PDF-1.4 %ª«¬­ 4 0 obj << /Producer (Apache FOP Version 0.95beta) /CreationDate (D:20080704112704Z) >> endobj 5 0 obj << /N 3 /Length 12 0 R /Filter /FlateDecode >> stream xœ–wTSهϽ7½P’Š”ÐkhRH ½H‘.*1 JÀ"6DTpDQ‘¦2(à€£C‘±"Š…Q±ëDÔqp–Id­ß¼yïÍ›ß÷~kŸ½ÏÝgï}ÖºüƒÂLX € ¡Xáçň‹g` ðlàp³³BøF™|ØŒl™ø½º ùû*Ó?ŒÁÿŸ”¹Y"1P˜ŒçòøÙ\É8=Wœ%·Oɘ¶4MÎ0JÎ"Y‚2V“sò,[|ö™e9ó2„<ËsÎâeðäÜ'ã9¾Œ‘`çø¹2¾&cƒtI†@Æoä±|N6(’Ü.æsSdl-c’(2‚-ãyàHÉ_ðÒ/XÌÏËÅÎÌZ.$§ˆ&\S†“‹áÏÏMç‹ÅÌ07#â1Ø™YárfÏüYym²";Ø8980m-m¾(Ô]ü›’÷v–^„îDøÃöW~™ °¦eµÙú‡mi]ëP»ý‡Í`/в¾u}qº|^RÄâ,g+«ÜÜ\KŸk)/èïúŸC_|ÏR¾Ýïåaxó“8’t1C^7nfz¦DÄÈÎâpù 柇øþuü$¾ˆ/”ED˦L L–µ[Ȉ™B†@øŸšøÃþ¤Ù¹–‰ÚøЖX¥!@~(* {d+Ðï} ÆGù͋љ˜ûÏ‚þ}W¸LþÈ$ŽcGD2¸QÎìšüZ4 E@ê@èÀ¶À¸àA(ˆq`1à‚D €µ ”‚­`'¨u 4ƒ6ptcà48.Ë`ÜR0ž€)ð Ì@„…ÈR‡t CȲ…XäCP”%CBH@ë R¨ª†ê¡fè[è(tº C· Qhúz#0 ¦ÁZ°l³`O8Ž„ÁÉð28.‚·À•p|î„O×àX ?§€:¢‹0ÂFB‘x$ !«¤i@Ú¤¹ŠH‘§È[EE1PL” Ê…⢖¡V¡6£ªQP¨>ÔUÔ(j õMFk¢ÍÑÎèt,:‹.FW ›Ðè³èô8úƒ¡cŒ1ŽL&³³³ÓŽ9…ÆŒa¦±X¬:ÖëŠ År°bl1¶ {{{;Ž}ƒ#âtp¶8_\¡8áú"ãEy‹.,ÖXœ¾øøÅ%œ%Gщ1‰-‰ï9¡œÎôÒ€¥µK§¸lî.îžoo’ïÊ/çO$¹&•'=JvMÞž<™âžR‘òTÀT ž§ú§Ö¥¾N MÛŸö)=&½=—‘˜qTH¦ û2µ3ó2‡³Ì³Š³¤Ëœ—í\6% 5eCÙ‹²»Å4ÙÏÔ€ÄD²^2šã–S“ó&7:÷Hžrž0o`¹ÙòMË'ò}ó¿^ZÁ]Ñ[ [°¶`t¥çÊúUЪ¥«zWë¯.Z=¾Æo͵„µik(´.,/|¹.f]O‘VÑš¢±õ~ë[‹ŠEÅ76¸l¨ÛˆÚ(Ø8¸iMKx%K­K+Jßoæn¾ø•ÍW•_}Ú’´e°Ì¡lÏVÌVáÖëÛÜ·(W.Ï/Û²½scGÉŽ—;—ì¼PaWQ·‹°K²KZ\Ù]ePµµê}uJõHWM{­fí¦Ú×»y»¯ìñØÓV§UWZ÷n¯`ïÍz¿úΣ†Š}˜}9û6F7öÍúº¹I£©´éÃ~á~éˆ}ÍŽÍÍ-š-e­p«¤uò`ÂÁËßxÓÝÆl«o§·—‡$‡›øíõÃA‡{°Ž´}gø]mµ£¤ê\Þ9Õ•Ò%íŽë>x´·Ç¥§ã{Ëï÷Ó=Vs\åx٠‰¢ŸN柜>•uêééäÓc½Kz=s­/¼oðlÐÙóç|Ïé÷ì?yÞõü± ÎŽ^d]ìºäp©sÀ~ ãû:;‡‡º/;]îž7|âŠû•ÓW½¯ž»píÒÈü‘áëQ×oÞH¸!½É»ùèVú­ç·snÏÜYs}·äžÒ½Šûš÷~4ý±]ê =>ê=:ð`Áƒ;cܱ'?eÿô~¼è!ùaÅ„ÎDó#ÛGÇ&}'/?^øxüIÖ“™§Å?+ÿ\ûÌäÙw¿xü20;5þ\ôüÓ¯›_¨¿ØÿÒîeïtØôýW¯f^—¼Qsà-ëmÿ»˜w3¹ï±ï+?˜~èùôñî§ŒOŸ~÷„óû endstream endobj 6 0 obj [/ICCBased 5 0 R] endobj 7 0 obj << /Type /Metadata /Subtype /XML /Length 13 0 R >> stream en 2008-07-04T11:27:04Z 1.4 Apache FOP Version 0.95beta 2008-07-04T11:27:04Z endstream endobj 11 0 obj << /Name /Im1 /Type /XObject /Length 14 0 R /Filter /FlateDecode /Subtype /Image /Width 254 /Height 259 /BitsPerComponent 8 /ColorSpace [/Indexed /DeviceRGB 255 <00000030303048000060646060980098240098989898CC30A01820A02448B03058B06460B0B0B0C83C48C87020C8CCC8E06488E09898E0E4B0E87C38E88C48E88C50E89458E89860E8A470E8A878F0B088F0B890F0BC98F0C4A8F0CCB0F87078F8D8C0F8DCC8F8E0D0F8E4D0F8F0E8F8FCC8F8FCF8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000>] >> stream xœí Ú8ÒÀuÝæ¹öî î.´!„Pn!úþñ¬·Ñ¼J†hsÌoÙ–æ¯F²Éz—»Üå.w¹Ë]îr—»Üå.w¹Ë]îr—w‰ËbŸqö%¿±4èÄ©Õ6Züƒð÷ ¹,„_c›‚ä7Ç7¹0>#/üMù;v%¨‹…Ú)¸èÖ8§È¿ÐÝS¦4x%¼¶´á šý2™¿\}=DS4T…¿Ù7¼§ÚüãUÿ÷‹Ðs4=Æž ÷M›?b¿½Egv€> °2s¦(ÐýZìNÎ*þbú=„<ȯ@OT× "èOà¯-ÿô Cl™q±`=ÐÃGMßœ¾"´›bØß©é1iüÖô ìÙìj¤O­RÒúméœÚfðø­Ëdk›ÌÕ‰ZSƒº%¿=N´¦u@/öáoEOÍ.}¿ÍF¼~™QNµøã6ôÜßç·ó;¬ÆMè1ü¹c¸Ã ýuá½CìBí3{A”öéoãøÞ‚y/¿UÕãô^škZ0—}&ï2jøÖãv¦'¾I‡ð”Í[ U©ßIô¸>½s¾¹ z})¸ •öèoaú’O[§”Rî<}z¥èÊð=_7}BߨGø]ú[™Tësë 2Ä%¾M?TMnCïˆÓ·Øth…^âçßšø7õjr?“éíú?nïyºÒ*ý‚^×¢ÿÇ€áoðONî~¶(Ä—9yÆÿc”[Àç˜×bŸ°¦— ÃÅoÓ¹6}[­V¿P|t%í­ÛÁ'n 0LBù¿£fÖ{¢UøEœí˜Ç  Fàólœ…mzÉÉqZôN^.éíMüÀS†…(“öÖE ÓÎkà_žìçHVôüü5ü¥KÏ“(4囸W…‡¹>Ùº ÿü<^ÿZõ€¸V ÷6ün /4Tàÿ¦·¦Я¦*ôÆiq‹ÅÝøï>½• =ð]Ãã5*ÖWÈó‰kÒë*úïÿM®/÷ÿñÙí¢N¥{äjæÏÁGº&û½°£Þªøè5|‡š¾ ¿{›yyyQ‡-‡;½ÿû¹EÏ7B´6´“× GLX+F£X[G_º´ä#"ù¯`þA½Q“.€ßÁøŽ³´ßÆ¿¸ù] à®Òçö©õk¼ó™9À«6½›ø:ÿõñ_£OUÅ÷W˜é¿’Ä_GãcÕ{ôÚÔ¯Ž‹âƒé }Õ©ûŠÆ¼AÓk.aþŠø®üVø®æ¹,0Ãå\¿Eßú7 w‹“院ßê Îg^_£¾Nßù×ÇwÈp‹B9NŸð=†§sž„—sÁíñÁ’„>ᣕޣ£5&ÐOÁ_°•KỼ`Áo¨áü³4ÿªÑ“ƒL¯™‘›Ò:açC—ÀwÃ×XïÒÆýˆ¾B»|p"akÚ³ðç§OÉLY¬"Ótä@ïJ§}%‰#_(¿O ¿8¾ûOÐ| ô»Ðþ+¾zDÂém³ÚôþÜôn‘èðy_‚ÞÑÁ^á=Áo9µ ovÌÌø£é#À-ˆá±×s|/V{a©WË­Sóâ/"ÂøoðÐ@‹9è ©Ë.ƒá½¢=f"N£Ó‹^™Ÿ>Žá¡Ú~ª]N¶.E ¾…?ý=H¶Êé›ï¼O¥Az…’¬.ƒŸj»ZŸ?z½AJOáqàºÆ*»Ãšï•\iVüBïýç@¿(ó¼I$ÓIŠ<ëô¶34ð/Iï*ý?ƒüx0±zÂŽœÿ™’ÙðvÔs ú_¬îÇËôMqÑ’GÇU1m|wyã—êü'áÿèÁWú˜~þÂE5;Ã%Ó»ià›bFü²ý´Hô/]x ®þ9Šÿ'¡E´‹Åo µmϦ™þÜùÎø0ã¥ëø•>Û=˜êöx{dÓ Ûz¬kÆY.×ç\3º©'rÁlÆ×TÙ)ðç—¯ž/áý&ЯW†‰ ¾Boæ^'_Á'#íáa²í]1z±D@¬Ûs›õzéù&þ9ë†ÀífägWü®MZÍ{è+43~Œw„H#ÏøŸ=ÖN¾hlˆ\Í…¸ü£‡ z·ÝnwAÚø§Ñ;~Pá'å÷‹8¾ó$F-,ÞAmËÈ/ô#ÿèþ'%£ïƒÈÊfÀ'ô ýЧ¹R”¢PáÜN×0ÈÓf»Ç¦¯/:(›êû$cŽpDsäR«ûz/é´X_Ù?I—>@($†÷*|îãw³eƯ"Ì%kkñRò·éEVëø§íò‘•Ù/ããG~:|šû—«§u¡zûý–Óƒ¶TžXŽÐ¡'Í`ìôñƒ½A/سûGwƒ?×Wá{€/ôŒø)%לdó„ðcóMÛ—:ê±w@ŸÖò=fç ƒHÕRá3û"ÌÝë@ïò¤'ð±{“SÜø»Í§Hü1ªÝô(›üÈ Ç8åÁýàÒˬh¶ÒÙ<"“ôߤ?»ÍðÏÉôr¸õ)Ú™–¯.ðiŽëoÎÇE]¬c±Ë¥V‘ý)ŸØ“\Ÿë§ÀÓzGKGþ-˜ÿœL/¿ƒÝ4ý'_½ÄH@d8cö?*z¸b»g0›^CIù÷›õêdzô¥ Û.<Ø_ˆÖåÞ­ŸªŽ«UúIÐÇôe¿?â oÒ[sD0ÿúdzˆ÷éK›¹z9×ü§±º1!-›VÉÍ¡3‚ö›˜ºÅäe ½|%‚ŸÍ¿íã‹ÛÐt—< ðõÒŒÕöˆŸ¸*2ß÷µ•ø¥l4ÿ~Ý¡‡Ë“œíQ/àmö4ç#¿ÄoˆÉ>>š¿g{Ü $Ëq@oó5%%)׊ýpŒü3Ñ«qϳ¿C_îˆüˆ>/h§mbê¦Gð)öÑŒåDx‹ž”Ñ»Lßꜯ5dú3àã4¶Šuex$ÇÙðކ½S<Û”áÎ àÉu®|ÙjÌï;ôySMcûM±ºÕ*gyÉBÝÇhÿ NÐ2¼…/ùxw´º¢¼KW·/ zHÑTöõzºÑ­Ó?^YfýÎOÆ÷æÙyè+‡>²?%Ì'Zž 7q‡.í¸…kžVuGÇ<•¾õZ^>•?˜í¡EŸÙ#å¦â/—i±2–Žk5ïÒŠîÜÇU’BŸ-œÐÃÎâCb3Vç=Ùñµñìú€ó*«çU|óT~*>Ô‘mŸ#úìÞ‰=n+›døl÷°ÍZv'â×XÒËzðێw”i©h/æ¦âO¡'£'ÅüuxŠðG wëÂ~8¸q]rȆìa©’C'Ww[Ð×ÐIÒ÷×3Px<) ã>n…°dì~—Ìîâšì˜‚]Z§ÉÔ¥¦ÜDØtØãMúk˜½·-*ñõŽ:Þóžô~³Z><Äç(IV+Ø~ÛEöñ¬§‹áw‡CIæ|èÒÈñ}eHåŠVŠé[/x=nÎ…°·¤«‡0þ‘¤×]‚?ÖšÉð±C¢ N3qØ€ÿK£„/Cºª—­«MÛîáã;sM#ý~ćÿú ±ø]‚?’z³á‡üNî`{w|{3W-ܵ¿(×®B tWy²3ýˆÿ0Îç!W˲ŽðûîKa`È.ßòD/˜)%wy¥ÚÞümzí¬sOë1JívÛÈ¿.»2þùgf'ãC€HW;Q«Ùyô†>e¡¤. žáÓ†ÒwF»ôJ¥#ÅÓ6lŽà²?‘ÈæŽÇ }N.Ô”¶0 ®•w…®¨IŸf²)øp3À»ðÝÃãž 3®oµG|<j®Ä> ‚ "Ð%&}ý×d7J zÞ;oÁ»’ó¥ªÓw4ÐØÄ½ˆÔЍáÛôi¹Ñ„W[ˆ'ZÞ€ê|ð×rìsé‹·´àÅÙìû¾‰ÏægwqñtZ ßMÊE®K/f‡™¦¨[ôÒòzS pÀþ$9…¾‹Ö—Z£7𕦽ç; ·^–ªó»x4òþÛ´ymÜbоu8]0:&S‚Ù¿'â£i/Ñ{böÖ]*|ÊP8 òÀXH<žªr=ÓëH®»üZ‚ûf*:¡ËÜ]‡8´0VJ”S…^N8g |>O`|ÓÇD%š1 »N¢÷\§Ç¹=œéªÊ*7ºƒLÃwøË¶âjšò!Ý1‡q'ö"q§y”Þ2•;UƒwpôZÀ—u³c•=dEYÓÚEÄê-ÿfõQzÁÚTCêƒ2†oWV®ºÍ‘Òõ’|„¾•ݰ½ ç¹^Ñá\|CǺMèˆï[ä客 ú•{üǪ½({‡žêKZš¼µ¡Â§O´IŠñÅm(–³¼§¢ªó>ô6W5m¾„ ž˜ÿÌ„‡ÒW|>+b}ªªÍœwUø´ŽÔ¼BÉv¦îìØð¼õL¯ßäÊ‹NâFpq´ž<_R€ùBF…×r½:˜NƒGôì„ ï¢øXmÙÚñ§6¯^ij<’âÒ3ŸdmÓèÑ!}:¢µ!éaQ]x $”Ž7D;Mq-‹ož/ú­U—óÄø>?‚hWÕ|äPÍàÓš·O…e÷‰Ò¥·Œï«ñ…‘KÑã(œ¿ŒO®Ur«qûÜpÎ*‡Ô,².ÌÖ+º¤ížùt„OüHô’Ý'ÑŸ1ßµøÍV`[Àƒÿ»<”Ûuþa@¦·,~3z‚<‰ÿDøZÁÏO¿jü? »Ž¡Öû¥­hñ39ÂãøùˆøqeqfžÆßTM?÷nð"ýeª!Ó”2d"RàMøÕ *}½'Cl 4» ýˆ?ÊÛ›Òè/?0^uö|0þûÆÇµÐd°ãr¤uýÔ,àQþÊòfº&Ðÿ5>"c?Róëô¾º>d‹•¼Áßè›ùð]Á­Ñ>xcôýÅ=rü‘ÿ_ŸæØôžVBÖ.º4=à»ÑýÉú-þËøoAbÑ#Lo*>b—üŽá“³ž],¯¹ ~¥U.Ü?*üñci¡ÿâ>ñ|©Á#.UéÏ\á6ÛzKRr™l»ÜÑÛ]¦Äô eæÃžŸ!Ôdz¾0HrÖ ·ÓX¦¯Mç2Éc6>±=ÁO!?µ°âý“‚ÁcàÏIŸñåúdü·7þçÏŸÎýÔè)ÿ‰ôúåÖ‹qÒ?æ+ìH?ŽúŸX,zÄ?}Üwñg¦w„ž)è3ë—€KÅYôx›DïˆÈóÃ{¹¢Áh}Ð’)òøù‹BOlß@š Lnú€O5zó0z;6þ—4Òý· &b—ž{\ㆋпå^Š,;X‰è¿üTè|Ÿ¾•Ø{n\?;}6~‚…è¢ÑsןLßÊë¥á¯Ÿ}þ-½™˜ÊÐcúŸ€ï¾E¯£uð–ã› Ï%u##îÝ•bâùœþ¤aßwfcûÈï³&{õ=³ƒ'òß¿ÿzÞyñ¶ÓøýRëBOߪçúéúô}6|J}*‚èµ7w&&M“éÊa¾Uü3¿9‹ ò|æQO’ñÁ×µ£ÿiÑOøÊC“þâøµ¶´=WøFèÏöúÖû^Á¿|œò£ï™ÞO×½-Ëëø¡GoâB_اF|NßÐìÒôU›^ÂýÖ¦7ˆ&Âç ˆà_"×ÊqÝNðMüþk ÞêÒ7¼~Îs‰B©Å>=‚ïÒ{6®Úðp¹‚?7=_Ôׯtè9¼M+ŸHSò ؼôhÊO¹ðÕºöÕćˆWèY|bðž%j x±ÓtÖ {àÎwÂJwÈß{z†‹{ò(½d÷8¬œJ üĉ~/p¼EÿU˜ž O…=¶5ð Lz<$ßó¾¢MϪƒ'X˜žà»²ÅõUš^±«l’¼Äªp£»ðílh^(Û‹é^Æ÷5 ¾Ÿ Õ+Þ¡Àsz½=ùâ¯EÏosÜUgX_v÷CôÉþ8|†Óá Oo5H¿á‘®GßllÐû3ÞWl Ì©Ù$oÀÿU‘´Ãá …§ôf‹ùÕêõMDÓg úüôõ%à·*Õý7, }Å_®È…"0ôéejö~ÉémvFOñ)¦'øž ·|_Cð£¯pÔ²X‹ošvÞ!ïó"3ÿ݈<UúþD¡Sé ä ãk_÷Xè0”WСƒ‰¦€sø‘Õ¢Ç(AÕøq”'š8ÍM˜²óJz ŸÎ$E¾°ÆÿÌoN8„Óès=àà;,Dc”PmçôÈgãoå•…*oùu‚OáËDNi*>!8½ïÒ·&’3ááqj£»·ò>Ó[~‡Òkð˜ÞiRO2eô¡é:“°µmG žÒäa³ƒ‡¹åO45ðç6»!ð8lÑ7žÓóšësz" ÓþÓÅâñÿcQØ xb%í9{­ñIÅ b ÿ:–ÏVkÓšð”Þ¨¦Õ¡,ÚPèqÏüCóŠøN†ÏôÆH¼‰†ßÁ!ó¿kö—utÝP{2`gD“ÐOx¿ÄQ¨x[Îåã®ËÓ³­ÏÓ•® o™žµÇ  ;½|oáâô>`: J>™ÇNzµH{;ÁéÅ#¯‹ ½p0pº¡MüɆë4eµXæªã;réEE…÷Ù¶<•׺êçyôÚ¤x3z}°RR\hæäSuÕ®CãÁ]äµtK ¦”1úŒßªílMê4X›¸0½cïq‹szt« ~œ­ ®«¤Pï¨pJ‹Nº6ÍmTü8_\ÙÐÞ!CR¢á‘£Ç2Ð1QOvJÎSÂ>öE%ÒxB¬ {«&7_Zž{òòô®Ò÷‡¸5òÄløïõ£Éí Í-þÑ«Õ èÊŸÚÖ§òóÔºÒʾ6£9¹¶ðRª€A?þõé‰X£@Ò“ôü7£‡­ V:qš‡ûýìø×‘”ï±À§&9ÆÖEó×wiuI;­é¸åL¿Î&ìl¹>šø›+µó×_\ ha6cÔofE¿><Ób)žᛕ'-¿½«cö-d4n¾âätq(ìz¯Ìæ—^‹]Z ìŸH_:îCÑãuî ÐÃጫºJö¬{ìžLö•þ7 ðº8ØÂõ˜Ñ“©ñKðËK|å²é½ƒü| ‡3Àîü`$Žæ¿ýÇÀwõ=ÙB?€ø¡Ò»ä&>} ‘<À ú0×%©KtJŸ³  Ç»wå燑 ”Ì^L›_ \¡0ýÂÇô…mH¯ö…) B—×(z—dòqøIŸèŠ\ÿ¼°ÇÇŽÞKzç)= “NœBïÈéôù!V9B*=D@u=ó1éëŽ2³~Ýuô¹¶L¤¿Ž2·Ç>Ó[,ÿ¡¿µw¹Ë]îò?-ÿ‡ÚC› endstream endobj 12 0 obj 2596 endobj 13 0 obj 777 endobj 14 0 obj 6133 endobj 15 0 obj << /Length 16 0 R /Filter /FlateDecode >> stream xœ¥WKsÛ6¾ëWà˜ŒàýèÍ'™öÐÔ¶2N&™¢-NEQ•¨:ý÷] Dm·“I¬¸»ß.¾Ý("ðçŠÂ?FPlŒ±Z‰Šzñׂv?R$âÊ‹”Á‚IB8¢+‰j‹,Ú:Ñ>ò+‹øk'Ù ß»AŸ_¿ÁwkD°DÏ rÁAgî~q `8WØ€œ¨ðm,²™Ã\ÒÙËQņfpNd$ÃÕþi¹xÿQ"ÊÐòÑçÏ(ÜRI·ØZ…–5úún¹)@ïü½>´U±v˪uëohùËâÃr ‰ÄLKÂDp‹lL.é ædžfr0q®>·1­´•˜Ûs«;qê”aų£Ê%Ý×S‡G^Ã-šs‹ž¹•ýPO€ÇK¼½<¯¯® f¸%,V\YËa‰ù@.6&Pf°žk|š¹ÄãÈéòê"š1á`Š@Ìq§‹^÷>ÆñC: º§}Ü«§Óa¨$ŠCI=•¿~Ø6ÅŸ~]Õ«§¨Ôøë 3iif¶P¹”: ï®)ºi.žl9äNhˆrÀÓl·Ís¹œÿã«_”ßWõ>Ô~»zØ–?zD—âå„VÂ|#qJiÈ×3Æ;{Ò`©¥…"­;ûR{ 2±S“ ìHÀâ½'æŒJeÂ0.9,´ T+t¨Â\E¤ˆR‡¡tv0Å4ÅŠPkûÜ|Þ·U³‹ŽÍÕy„LÊ)Iv&o9•¹œ È™D}S‹C5}Š­,óHSkd¯wµêiâUTÖlÄ-¸I5¿Ü¸óût÷ùËo3nÜDûz½žwL9 %\YM{¾èMA/³Œ<Ø®šüj ×SõÂd>7«Ü1Né(¨ÄZ+]OGAÕ èÊ)ßËd/FûÎÀHðöú›4rxy¥1˜kH¸§âÕÝ ”²™Ê8³¾+ËR/PiÌ™@Îd¥·ñ?Ò”\‚r6OPiÔ7ÕÑõæã0 Š¢<›—hÊuLwµœKæäõb«Œ›%©&Zpµ€$Àû`¬I+-Üpì(Óçþôpu,‹¾u’çªÝ„ÑTlšÃLÍ wXÍ r{Ó¹½UëÛòïrë×lŒ™jì*×Mâ¶$ÐŨ=c>ÏLÿÿ¯å± #;r=YB‹L‡©üJÈ<‚œN{@ ŒKÿ(£«]ÓnÂ-g÷ŸB°@z¸Pó¦ÄÂØ–‚j´F6-7ÕÀæ°hà ¨^}¯êSíwÇÌïºÜúOû}shó;ÕÙܺ:¶‡êá>ºT8èïû{ øúXTÕMS\Î7”a:Sv Šf÷èn£+ŽpÀ;0²$`Ò[hÔÁ XÂÜ0"¾ÈwU(àõÎÜø9¢$üÀG:áÞ2r_œõyó"'±ÚیߨþtB³ WîI‚Ð@ÑAî¿«]UÃntòƒíˆÉ§}Òß=6§óë²ÜG³uô¡Ý“žIX(xphè×ð®í£v #I±†æH”OŽéãÎÈa¯Ý“_‰áBv}ÎÛùâ›ùcÓ´PÂå(‚ÛÅ¿­ÌÄ endstream endobj 10 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595 842] /BleedBox [0 0 595 842] /TrimBox [0 0 595 842] /Parent 1 0 R /Contents 15 0 R >> endobj 16 0 obj 1204 endobj 19 0 obj << /Type /Annot /Subtype /Link /Rect [ 262.96802 757.289 339.96 768.089 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 18 0 R /H /I >> endobj 22 0 obj << /Type /Annot /Subtype /Link /Rect [ 261.648 731.172 296.304 741.972 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 21 0 R /H /I >> endobj 24 0 obj << /Type /Annot /Subtype /Link /Rect [ 122.988 214.583 128.988 225.383 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 23 0 R /H /I >> endobj 26 0 obj << /Type /Annot /Subtype /Link /Rect [ 99.336 185.78294 105.336 196.58295 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 25 0 R /H /I >> endobj 28 0 obj << /Type /Annot /Subtype /Link /Rect [ 146.988 156.98296 152.988 167.78296 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 27 0 R /H /I >> endobj 30 0 obj << /Type /Annot /Subtype /Link /Rect [ 152.988 142.583 158.988 153.383 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 29 0 R /H /I >> endobj 32 0 obj << /Type /Annot /Subtype /Link /Rect [ 159.98401 99.18596 165.98401 109.98596 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 31 0 R /H /I >> endobj 34 0 obj << /Type /Annot /Subtype /Link /Rect [ 87.336 55.78899 93.336 66.58899 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 33 0 R /H /I >> endobj 35 0 obj << /Length 36 0 R /Filter /FlateDecode >> stream xœ­WMsÛ6½ëWprhi„à“$z‹&N&7mbµ9$9Pm£¥H•¤âøßwAA@’ÝédAvñv÷í@" ÿæþK9AišÊ$Á"Ê7³f¤ÿ‘D‚G,6SqŠ8³ˆp‹h¹S2*µÍh‹ÌˆÃÀ]­gî¢O³j†£·³Ï_aÝ:ÂHD÷3|dƒÞÝõì€a,F)ÌãxXëNIoC¦÷ç£rÀȈ‡kx±œ½|#"B£åÉ-$žŠ!’.‘”q´ÜDŸ/–wÅóè"‚¿WM§òÒ~[ªN¿FË_f—KÈÀÑD`ʇíÝ)éãÏôýˆ]G'r(„‡kŸƒ.­)Nåž[}ʼn6†óJåÏô«CÅÃáñ¹EÜò~ØÀŒãögŒ??¯îˆÀ'¸Å%ŠY,%ƒ!b–\lL Ïá&Ö¸šþŒÁáÓåÑMØ D ª¹Ž¾Ž:êUeZ¨øžm¶CC•ªúÛ »Ú ²*¿«û¥3ƒ¶Ë;®o¬íÓ>¡‡ÄãÉ8ÅØp£švð¶[ÍÛ"ïT]yÆ©@RH)ÉØ…ö!s„PXýô0ÍçJ­JUß6ÙöîÁW]ó,A1O¤Ó?wY½Û~õ 8Èæ“©2K_¾éÙ™¦ûŸÜ¦1Â2=Dg²pqéD÷j»-ªµú>xŒ\ $F,庙ö¾Ú\©×u>yPI5ô©mŸ>G˜³=„¼híDcúk7T}4tÍ ¬ñ½êîFéÄ =b,I  F”ÒŠòÊÒ½ö(nZ’Hç¡”©ñèºq:ÇmѲøV”fLÏó G”R8¨È~«…Ó '0R´Ž“Àyè¦R UW=Â}:‹ýýXý)!HÂþ`Šå<±©fvâGÑWIi8WùEPãB\d®01&ÿ ƒb3 !áA4m½kò"Ç®Ø8æé"c”h {o«]Y]±ö:Ìê A(#‚„ AŒ¦šßS—?KÒcFzÇü.k²¼+4”ÓÎB2‘Õ½ì5*·ÝÔÙ-‰>f›ºZ£Óu"<8ãîâ\7§Tü£zï÷F3{³QÕí vI¸kŠuÜmaX¯U[WóOE[vöÝõâ½â9as©Äd.IbD"Ð-Íš}–îAïîæ›]Q–UÑØt½¯›ÍÐhŸô3þÁ|^u•5–¿ó3iÔ• x ›S@õE]Û“vn>Ù}]ܨJuê›x»Sëâx*9èåL¦©·•ÍÚo?~,TY>"s“‚ÍCL±Ô¶­á„èzuï­"P2±t.RBã ïD Ç á™+S}0yˆ¯ý’G0±O‚…²yʳ® N¤‰‘p^é{v‡k =Œ‰Cû•ÐC€#1ׇç€çkL0\q¨>/ž’8:MR¦<4z(þ8q×jU€¬Tç·r?uAÎ0# ˆëM%.O1#†_rîNí‰xЛ Tô•iÿ–œº;‹UÆH09èîÕ)¬ Ü­9¼ÀzŽ1p°ÆLm, ËåìÃì_¦pÂŽ endstream endobj 20 0 obj [ 19 0 R 22 0 R 24 0 R 26 0 R 28 0 R 30 0 R 32 0 R 34 0 R ] endobj 17 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595 842] /BleedBox [0 0 595 842] /TrimBox [0 0 595 842] /Parent 1 0 R /Annots 20 0 R /Contents 35 0 R >> endobj 36 0 obj 1496 endobj 38 0 obj << /Type /Annot /Subtype /Link /Rect [ 66.0 604.214 164.043 615.014 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 37 0 R /H /I >> endobj 40 0 obj << /Type /Annot /Subtype /Link /Rect [ 553.02 604.214 559.02 615.014 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 37 0 R /H /I >> endobj 41 0 obj << /Type /Annot /Subtype /Link /Rect [ 90.0 589.81396 233.829 600.614 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 18 0 R /H /I >> endobj 42 0 obj << /Type /Annot /Subtype /Link /Rect [ 553.00696 589.81396 559.00696 600.614 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 18 0 R /H /I >> endobj 44 0 obj << /Type /Annot /Subtype /Link /Rect [ 66.0 575.414 177.23401 586.214 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 43 0 R /H /I >> endobj 45 0 obj << /Type /Annot /Subtype /Link /Rect [ 553.02 575.414 559.02 586.214 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 43 0 R /H /I >> endobj 47 0 obj << /Type /Annot /Subtype /Link /Rect [ 66.0 561.014 175.825 571.81396 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 46 0 R /H /I >> endobj 48 0 obj << /Type /Annot /Subtype /Link /Rect [ 553.104 561.014 559.104 571.81396 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 46 0 R /H /I >> endobj 50 0 obj << /Type /Annot /Subtype /Link /Rect [ 90.0 546.61395 222.627 557.41394 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 49 0 R /H /I >> endobj 51 0 obj << /Type /Annot /Subtype /Link /Rect [ 553.093 546.61395 559.093 557.41394 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 49 0 R /H /I >> endobj 53 0 obj << /Type /Annot /Subtype /Link /Rect [ 66.0 532.214 129.336 543.014 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 52 0 R /H /I >> endobj 54 0 obj << /Type /Annot /Subtype /Link /Rect [ 553.272 532.214 559.272 543.014 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 52 0 R /H /I >> endobj 56 0 obj << /Type /Annot /Subtype /Link /Rect [ 66.0 517.81396 108.66 528.614 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 55 0 R /H /I >> endobj 57 0 obj << /Type /Annot /Subtype /Link /Rect [ 553.271 517.81396 559.271 528.614 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 55 0 R /H /I >> endobj 59 0 obj << /Type /Annot /Subtype /Link /Rect [ 66.0 503.41397 93.324 514.214 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 58 0 R /H /I >> endobj 60 0 obj << /Type /Annot /Subtype /Link /Rect [ 553.271 503.41397 559.271 514.214 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 58 0 R /H /I >> endobj 61 0 obj << /Name /Im2 /Type /XObject /Length 62 0 R /Filter /FlateDecode /Subtype /Image /Width 27 /Height 17 /BitsPerComponent 8 /ColorSpace [/ICCBased 5 0 R] >> stream xœí’Á À0C/ûÿ/ºÁ@ä5q¥0Øa¡‡*iŒÚ1~‡Lʼc&!2È;í#½]HÂ}¯¡ì7VA§PC7À*‡³í^›Æž›!†·ÍFV–âßþ6aþ­¬8‡pcY¡}'z¿.û endstream endobj 62 0 obj 113 endobj 63 0 obj << /Length 64 0 R /Filter /FlateDecode >> stream xœ•ÝKsãF–à½~w#GŒá̼7_މ‰)ݽp„§41 Û J‚J S¤š¤\]ÿ~2A$TùwØMB €/@Ò.Lùß×¶ü'©mRJ9Fã/7ÿ¼±ÝíÂëBÂiPH:oŒ,¬6Î/^׃üb]ǹxáúWåÿ®²åýóâÿn67fñÓͯ¿—Ìã”ñ>Þ˜ÏL¼›Ôû›_ÊŒˆ„&•á& ÙëA~üq3CÜdPy5™ÏÏãÌš˜ÌS?³ÞøÆEoœÙëA~ü¹3CÜdPy5™ÏÏìÌÚšÌÓqf¹vÙ7&å#~ÇbëÈå•4y´ò¦Cºôxö 㯀6{^§“?¼ÌÌÌårO‡œ¦w=hÒL¿4Ÿ331óu†¿»»ùæG¿°nq÷tZÁe«sš› !g)/Éaq÷²øõÖ~µø}q÷›î&-}òÇźԜ9ÍÇõ I[ÿÒ‚ÎÌÄÌÌ5 WÛN·ôÝ2¦ärÎW+ÁúÜH™°³KÑ{\ wÏíW‹ÛEù÷Ýî°zX÷ïîV‡úº[Aßüh3~5=)íYSPY½cÎé8Éwo‡çíîßö§)ý¼|9Mô4±¼°æÚG¤1®óMê?–Ý´öÿÕ¾,Wëfùø¸k÷ûÿ¼œ¯µÉË)ãhš`ºFÓMêÚ?WûÕvsš«¿­ö‡íîÓiJÃø¾¬²þËB¥²IÍ9ÎŽn3Õ¹ÐdgÆý¾}8V¦-ãñÔº&ºXÓ£ñÞý<,hiù±¸usv¥à DÙ:’ÍÙŸD—÷ƒâöéôâ¿·›C»9ì‡ N6’:¥P¢éZN·4DZ¿¶¦¬Ëú.Î æjè«Ýþ03ü}ûpèÖÚõ2[k£]èh ãñêNÔÌ×L?#âYgˆ¬Ù@dKÓõeÑ#Gd=‘Mx¶ÉàY%²ÏzCd…È"K¸Â-np‹„[$Ü"á–·D¸%Â-n™pË„[ÆÝœÁÝœÁÝœÁÝœÅÝœÅÝœÅÝœÅÝœÃÝœÃÝœ#Ü„pÂM7%Ü”pSÂM 7O¸yÂÍnp „[ Ü"á ·H¸EÂ-n‰pK„[&Ü2á–q71¸›Ü­œÀYÜM,î&w‹»‰ÃÝÄánâ7!Ü„pÂM7%Ü”pSÂÍnžpó„[ Üá·@¸EÂ-n‘pK„["Üá– ·L¸eÂ-ãnjp75¸›ÜM-î¦wS‹»©ÃÝÔánêp7%ê%JÔK”¨—(Q/Q¢^¢D½D‰z‰õ%ê%JÔK”¨—(Q/Q¢^¢D½D‰z‰õ%ê%JÔK”¨—(Q/Q¢^¢å¸:YgfŠÊ_¬ïjÙ›sšÖKíd¿º’“ÖÌ©Æo›¡dÝ-ØâöýÛý×û¾}ù‡«Ãóõw›‡çínZÕÊMr©V×ÇŸvwZ°JAêEŒñ(³+<›ñlvDÖÙgkÁ Ï*‘xÖ"‹»Õ‚žÅÝjÁ Ïânµ`g…pÂM7%Ü”pSÂM 7O¸yÂÍW75Vl°DV‰lijÑY!²Èf<›‘õD–pË„[&Ü2îV Vxw«+<‹»Õ‚žÅÝjÁ Î:Ü­¬ð,á&„›nB¸ ᦄ›nJ¸yÂÍnžp „[ Üá·H¸EÂ-n‰pK„["Ü2á– ·L¸eÜ­¬ð,îV VpÖânµ`…gq·Z°Â³¸[-XáYÂM7!Ü„pSÂM 7%Ü<áæ 7O¸yÂ-np „[$Ü"á ·D¸%Â-n‰p+ÇÕ9Úœð2OW«2¡«UFq“²‰[Øz”­1î”é+Uå(ݤrl.ï­¼ø¾}Øng‡ÏÞZYËí¢õFÑñG^O`·S ħ®'Þ]ýâö‡-_^×íÕ°w¯¯íæqõ¯éÔÊǹ®“€ñT‡‘Çcø&ç®'„ñÓ2O9ÍYëíŽ-‡ xV‰lijåÏ ‘ D6ãÙrŠg=‘%Üá·@¸EÂ-n‘p‹„["Üá–·L¸eÂ-ãnÎànÎàn5€gq7gq7gq7gq7çp7çp7ç7!Ü„pÂM7%Ü”pSÂÍnžpó„[ Üá·@¸EÂ-n‘pK„["Üá– ·L¸eÂ-ãnbp71¸›ÜM,î&w‹»‰ÃÝÄánâp7q„›nB¸ ᦄ›nJ¸yÂÍnžpó„[ Üá·H¸EÂ-n‰pK„["Üá– ·L¸eÜM î¦wSƒ»©ÅÝÔânjq7µ¸›:ÜMî¦D½D‰z‰õ%ê%JÔK”¨—(Q/Q¢^¢D½D‰z‰õ%ê%JÔK”¨—(Q/Q¢^¢D½D‰z‰õ%ê%JÔKº{zErF ¥µ¨k£“1&½¶Jènï µðëû¢îùéóÜ”=Y×깎;þËÕ³éãRZjBí7O>åz"㊖kêHµ6<m¦úå‰l³åì Ï*‘x¶œ}áY!²Èf8[o˜Ä³¸[½aÎZÜ­Þ0‰gq·.gq·zÃ$ž%Ü„pÂM7%Ü”pSÂÍnžp+g_±öyílƳåì Ïz"›ðl9û³Jd#ž-g_xVˆ,á–·L¸eÂ-ãnõ†I<‹»Õ&á¬ÅÝê “xw«7LÂY‡»Õ&ñ,á&„›nB¸)ᦄ›nJ¸yÂÍnžp „[ Üá ·H¸EÂ-n‰pK„["Ü2á– ·Œ»Õ&ñ,îVo˜Ä³¸[÷S pw«7LÂY‡»Õ&ñ,á&„›nB¸ ᦄ›nJ¸yÂÍnžp „[ Üá·H¸EÂ-n‰pK„["Ü2áV«ìxç#Sšên˜Ì®Þ“9mR[«³QΖ/{ünu¿^m?얯ϓßlªw²Šïje£±º¾&˱²ëk²|ŸßýìÒx´É2—¯S8êñh‚£å»Ž*pÔÖ;á¬Ù@dq1kq2kq3kq´z§.žÅÙjW pVª[ªÛ"ˆlƳꈬ'² ÏzKd•ÈF<·@¸Â-n‘p‹„[$Üá–·D¸eÂ-n™p˸[wåÎânÝ•4kq·îÊœÅݺc8‹»uWà,á&„›nB¸)ᦄ›nžpó„›?— Ñ GƒÃ£&8-U<áh2xTð(®•p­Œke\+ÃZõR…µê…4ja­z™ŽÂZõ"u°V½ÄGq-Áµ×\Kq-ŵ×R\ËãZ×ò¸VÀµ®p­ˆkE\+âZ×J¸Vµ®•q­ŒkeXK ¬¥ÖRk©µÔÂZja-µ°–:XK¬¥×\Kp-Áµ×R\Kq-ŵ<®åq-k\+àZ× ¸Vĵ"®q­„k%\+áZת7àúãe…Qö‹•ùz­ÀE×uX0oöZA9ì¸ì}÷§õv¿_î&× jã “ôqN|Çw—Ó:£y’Ÿ,e9§Ãr¾æº›‹ÿ2šàh9¡ƒ£ŠG#-'tpTðhÀ£Žf‡Gq­ŒkYƒsYƒ{YƒƒÕÍÏâdÖâfÖâhÖájµ«<[ÝR½Åÿ¯³b‰¬ÙˆgÕY!²Èf<ë‘õD–p „[ Üá ·H¸EÂ-n‰pK„["Ü2á– ·Œ»Õ®Nð,îV-³¸[íêÏânµ«8ëp·ÚÕ ž%Ü„pÂM7!Ü”pSÂM 7O¸yÂÍK¬²ÁY!²Èf<‘õD6áÙd‰¬YÂ-n™pË„[ÆÝjW'xw«]ÀY‹»Õ®Nð,îV»:Á³¸[íêÏnB¸ á&„›nJ¸)áæ 7O¸yÂÍnp „[ Ü"á ·H¸%Â-n‰pK„[&Ü2á–q75¸›ÜM î¦wS‹»©ÅÝÔânêp7u¸›:ÂM7!Ü„pSÂM 7%Ü”pó„›'Ü<á·@¸Â-n‘p‹„[$Üá–·D¸e­öxl÷Ç(ûÙk!Ç+2fîœoöŠLýÅâ‹.±ÿ¾yl'Y×é]÷;…ãøq6r“g$‘&™Œ3ÓäÀ\ÆrõQX(çÁ\ÂrõñW(§`.b¹úÈ+”="èAz$Ð#ôÈ G=ê8`©ÏÞ€AФ>uA•ú¼ t K}Ò ¢2‚Ê*#¨Œ 2ŠÊ(*£¨ŒGe<*ãQ™€ÊT& 2•‰¨LDe"*“P™„Ê$T&£2•ɨLeê³1`”©OÅ`A ÊÔçaÀ (SŸ„ƒ L} ¢2‚Ê*#¨Œ¢2ŠÊ(*ãQÊxTÆ£2• ¨L@e"*Q™ˆÊ$T&¡2 •I¨LFe2*“A™®Ë,,ÊteAA ÊtÝdaAP¦ë :P¦ë ¢2‚Ê*#¨Œ¢2è¿ §ü‚žó zÒ/èY¿ §ý‚ž÷ zâ/虿 §þ‚žû zò/èÙ¿ §ÿ‚žÿ Z´ h @Ѐ¢5EkŠÖ­(ZP´ h @Ñ€¢5EkŠÖ­(ZP´ h @Ñ€¢5EkŠÖ­(ZP´ h @Ñ€¢5EkŠÖ­(ZP´ h  »b!Ž¿TpqÕb4ÞìU‹ú¼w#wÏ«ý±ÓöÛáÅáùô#·Û×Úoûr}zûºk—/÷ýOxÞþv»Üœ^¾m«Ãº}<½:|ïÞÝo?ýöUsz÷¿ûöé­ŸâÓvwzõq·:¬6ú ¬Î?ÚOmÝî÷3 T’MYh«Ç%zÜ>¼½´›C¿4ÛÍ~µ¿˜v™Ò§þåÓéÅr´„ÓÝms¹rï>·––÷ûÃnùpÖÒv3$û¥}Ùîúa¯ËݲëòkÿÛW§A¶m?÷ÏínvfêÓº³ŠýâQ{ªnJßüꪻ{:O³û­P—n4íwû‡ÕêûíÃ0ªÚýähJÆÄñ¸Ý難³åíº= M£à–«Íç~·jŸŸåf³=,C»*ã^,ÛëzùÐ>o×ín? zxf­Õ žMåaûvneC[h/§övu¼ªwüËæPfï¼FûÙzÚneFÛ}߯Ïm£4¨§2—ÿÞsú„þýýEoý°Ó]£YÍ]`,K•¥ÑÚ0Óq©®7¾n»fyhuûÕ‡Íêiõ°ÜœÛé燭¦h¬?H1ù´×öaµ\Ÿ>tÿùVR«}e[­¹§ÑíNã•=e½r뺇áž.—³TøàêƒvÝXvº¶\íöýò¼¿úщ¹fëº/9_?ªoë×muX¦ãÛCiÊýŠì_¬Û?Û~÷±‡ayßOtÓîÏíùíµWÚMémw9éa³nÛ׿j ö‹ëTOº|Ý‚Swƒƒ3ô=h?¿¤|e˜~¬ë•±˜ÙÙÖ~¥dR<­°aQ7ÛÃ"ôK°ß¾´‡çóÆý°­Ö¡¶ïÇÕÓSÙÁmß^,ÚE¹RJ‹é.ž?÷¸ÝüÑ~Ú÷›Íú‚ê,pX}8ï~»ý®Ý|8輻ÔûÕ}»[-7ÃømßÍõdù}=A(kÖÚã|œ¿*—ëC»Û,«?‡æó©ìÛú]ÇÌn¤™[æú¬Éi™ÇŸ5“Mx6["«D6ÂÙú¬ ž"¾½ý¹ì™ûÖð|á;az¦4–z¿UJõ”nfþÖ»ßóޏ?ò˜ÿ.Z½,?ôOßKûo‡æ{Ñ€~¸»ùç3óÝö8åxÛû²ã5MÙÀ —sôðróÍß_ÜâûíÍ/7ßÝÍî±Ëé^ª]IMeî{r½Žs.gûi»^o?»¼ûO£ÙMç~½}øcne–S!Myøîî>âÛË¥7‹Ÿn~ý½Œð¸°‹åm(Ç4¼qqñ²ˆîòýzñþ¼Ø±q£¯šØÝå®9Étš›p½-ïcYÕåÐgø™_´þ0¡9Ïõ/7ÿT»ªV endstream endobj 39 0 obj [ 38 0 R 40 0 R 41 0 R 42 0 R 44 0 R 45 0 R 47 0 R 48 0 R 50 0 R 51 0 R 53 0 R 54 0 R 56 0 R 57 0 R 59 0 R 60 0 R ] endobj 8 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595 842] /BleedBox [0 0 595 842] /TrimBox [0 0 595 842] /Parent 1 0 R /Annots 39 0 R /Contents 63 0 R >> endobj 64 0 obj 4903 endobj 67 0 obj << /Type /Annot /Subtype /Link /Rect [ 103.332 740.009 109.332 750.80896 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 66 0 R /H /I >> endobj 70 0 obj << /Type /Annot /Subtype /Link /Rect [ 196.308 696.329 202.308 707.12897 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 69 0 R /H /I >> endobj 72 0 obj << /Type /Annot /Subtype /Link /Rect [ 128.988 681.92896 134.988 692.729 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 71 0 R /H /I >> endobj 74 0 obj << /Type /Annot /Subtype /Link /Rect [ 134.988 623.849 140.988 634.649 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 73 0 R /H /I >> endobj 76 0 obj << /Type /Annot /Subtype /Link /Rect [ 140.988 609.449 146.988 620.24896 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 75 0 R /H /I >> endobj 77 0 obj << /Length 78 0 R /Filter /FlateDecode >> stream xœUMoÛ0 ½ëWðØ›F}Z:®À6`ÀA ìPô&^k,v·4ÀÚ?JQÛÒÜ HÀÐOäãI @ú|ôã´àÎ9_Uh`Ó±?LćŒe“Ë:®¥AT 4·:˜º<왑A di2¦èày„¬g_Ùíá¶€ÜÀ_†ÿIÃݰ‘QÊrG~´vêòYÂÜã嬦xÉx _×ìãBBý3iKÂK!¹ItϽ·Pwp{U?6ïà èûih7»Ó¿º=ûêoìsM4\V¥ÒO]>+&÷DŠyÅÓ@ ."ãuÔ`5m«ÊŽÎ{+Þ¸‡ÉRÙU垈.]^Ò["ï-qî­ìAW 3®;÷¤x¹®Ï@D!ÁBoiÏ­²Þ+2¹:5—7P°+”5¾ÍÜ“xäírñH”H†Þ‰Õ'1Çõ“qºü±îï©î‚R² é¼OØî©ÿÕ¼>¿?Î]<6€IU¥$¢˜C‚2chÂ}8á7K|*äÞØ3¶Ù<õÛ´š—u÷{Ø m¿m^NOúÃþµHZhR«ÀuZÍ¡ô.0\„JÉÛûfß®ûa =4ûb’ж‹‹9fÞRF“È!Ê´ÿ–¤ÒsT$»IàÀç9+˜¢jŵ²a·FàuÓ?¬woVáðTÅ<€(%1wêÜ‹åìfBœtÅþ=“ð endstream endobj 68 0 obj [ 67 0 R 70 0 R 72 0 R 74 0 R 76 0 R ] endobj 65 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595 842] /BleedBox [0 0 595 842] /TrimBox [0 0 595 842] /Parent 1 0 R /Annots 68 0 R /Contents 77 0 R >> endobj 78 0 obj 538 endobj 81 0 obj << /Title (The Article Title) /Parent 80 0 R /Next 83 0 R /A 79 0 R >> endobj 83 0 obj << /Title (Table of Contents) /Parent 80 0 R /Prev 81 0 R /Next 84 0 R /A 82 0 R >> endobj 84 0 obj << /Title /Parent 80 0 R /Prev 83 0 R /Next 90 0 R /First 85 0 R /Last 85 0 R /Count 3 /A 37 0 R >> endobj 85 0 obj << /Title /Parent 84 0 R /First 87 0 R /Last 87 0 R /Count 2 /A 18 0 R >> endobj 87 0 obj << /Title /Parent 85 0 R /First 89 0 R /Last 89 0 R /Count 1 /A 86 0 R >> endobj 89 0 obj << /Title /Parent 87 0 R /A 88 0 R >> endobj 90 0 obj << /Title /Parent 80 0 R /Prev 84 0 R /Next 91 0 R /A 43 0 R >> endobj 91 0 obj << /Title /Parent 80 0 R /Prev 90 0 R /Next 93 0 R /First 92 0 R /Last 92 0 R /Count 1 /A 46 0 R >> endobj 92 0 obj << /Title /Parent 91 0 R /A 49 0 R >> endobj 93 0 obj << /Title (Bibliography) /Parent 80 0 R /Prev 91 0 R /Next 94 0 R /A 52 0 R >> endobj 94 0 obj << /Title (Glossary) /Parent 80 0 R /Prev 93 0 R /Next 95 0 R /A 55 0 R >> endobj 95 0 obj << /Title (Index) /Parent 80 0 R /Prev 94 0 R /A 58 0 R >> endobj 96 0 obj << /Type /Font /Subtype /Type1 /BaseFont /Helvetica /Encoding /WinAnsiEncoding >> endobj 97 0 obj << /Type /Font /Subtype /Type1 /BaseFont /Times-Roman /Encoding /WinAnsiEncoding >> endobj 98 0 obj << /Type /Font /Subtype /Type1 /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding >> endobj 99 0 obj << /Type /Font /Subtype /Type1 /BaseFont /Courier /Encoding /WinAnsiEncoding >> endobj 100 0 obj << /Type /Font /Subtype /Type1 /BaseFont /Times-Italic /Encoding /WinAnsiEncoding >> endobj 101 0 obj << /Type /Font /Subtype /Type1 /BaseFont /Times-Bold /Encoding /WinAnsiEncoding >> endobj 1 0 obj << /Type /Pages /Count 4 /Kids [8 0 R 10 0 R 17 0 R 65 0 R ] >> endobj 2 0 obj << /Type /Catalog /Pages 1 0 R /Lang (en) /Metadata 7 0 R /PageLabels 9 0 R /Outlines 80 0 R /PageMode /UseOutlines >> endobj 3 0 obj << /Font << /F1 96 0 R /F5 97 0 R /F3 98 0 R /F9 99 0 R /F6 100 0 R /F7 101 0 R >> /ProcSet [ /PDF /ImageB /ImageC /Text ] /XObject << /Im2 61 0 R /Im1 11 0 R >> /ColorSpace << /DefaultRGB 6 0 R >> >> endobj 9 0 obj << /Nums [0 << /P (1) >> 1 << /P (2) >> 2 << /P (3) >> 3 << /P (4) >> ] >> endobj 18 0 obj << /Type /Action /S /GoTo /D [10 0 R /XYZ 54.0 354.11298 null] >> endobj 21 0 obj << /Type /Action /S /GoTo /D [17 0 R /XYZ 54.0 490.19998 null] >> endobj 43 0 obj << /Type /Action /S /GoTo /D [10 0 R /XYZ 54.0 148.50098 null] >> endobj 46 0 obj << /Type /Action /S /GoTo /D [17 0 R /XYZ 54.0 729.37195 null] >> endobj 49 0 obj << /Type /Action /S /GoTo /D [17 0 R /XYZ 54.0 649.10095 null] >> endobj 52 0 obj << /Type /Action /S /GoTo /D [17 0 R /XYZ 54.0 569.09296 null] >> endobj 55 0 obj << /Type /Action /S /GoTo /D [17 0 R /XYZ 54.0 432.08298 null] >> endobj 58 0 obj << /Type /Action /S /GoTo /D [17 0 R /XYZ 54.0 297.75598 null] >> endobj 37 0 obj << /Type /Action /S /GoTo /D [8 0 R /XYZ 54.0 372.01398 null] >> endobj 31 0 obj << /Type /Action /S /GoTo /D [8 0 R /XYZ 420.096 316.55496 null] >> endobj 25 0 obj << /Type /Action /S /GoTo /D [8 0 R /XYZ 239.304 273.35498 null] >> endobj 33 0 obj << /Type /Action /S /GoTo /D [8 0 R /XYZ 242.304 273.35498 null] >> endobj 27 0 obj << /Type /Action /S /GoTo /D [8 0 R /XYZ 245.304 273.35498 null] >> endobj 23 0 obj << /Type /Action /S /GoTo /D [8 0 R /XYZ 251.304 273.35498 null] >> endobj 29 0 obj << /Type /Action /S /GoTo /D [8 0 R /XYZ 254.304 273.35498 null] >> endobj 66 0 obj << /Type /Action /S /GoTo /D [8 0 R /XYZ 287.30402 287.75497 null] >> endobj 69 0 obj << /Type /Action /S /GoTo /D [17 0 R /XYZ 345.96 773.089 null] >> endobj 71 0 obj << /Type /Action /S /GoTo /D [8 0 R /XYZ 260.30402 273.35498 null] >> endobj 73 0 obj << /Type /Action /S /GoTo /D [8 0 R /XYZ 248.304 273.35498 null] >> endobj 75 0 obj << /Type /Action /S /GoTo /D [8 0 R /XYZ 257.30402 273.35498 null] >> endobj 79 0 obj << /Type /Action /S /GoTo /D [8 0 R /XYZ 54.0 769.889 null] >> endobj 80 0 obj << /First 81 0 R /Last 95 0 R >> endobj 82 0 obj << /Type /Action /S /GoTo /D [8 0 R /XYZ 54.0 680.75 null] >> endobj 86 0 obj << /Type /Action /S /GoTo /D [10 0 R /XYZ 54.0 290.51196 null] >> endobj 88 0 obj << /Type /Action /S /GoTo /D [10 0 R /XYZ 54.0 231.05798 null] >> endobj xref 0 102 0000000000 65535 f 0000028095 00000 n 0000028174 00000 n 0000028323 00000 n 0000000015 00000 n 0000000110 00000 n 0000002792 00000 n 0000002825 00000 n 0000023792 00000 n 0000028557 00000 n 0000012923 00000 n 0000003692 00000 n 0000011581 00000 n 0000011602 00000 n 0000011622 00000 n 0000011643 00000 n 0000013091 00000 n 0000015895 00000 n 0000028651 00000 n 0000013112 00000 n 0000015819 00000 n 0000028733 00000 n 0000013253 00000 n 0000029724 00000 n 0000013393 00000 n 0000029472 00000 n 0000013533 00000 n 0000029640 00000 n 0000013676 00000 n 0000029808 00000 n 0000013820 00000 n 0000029388 00000 n 0000013960 00000 n 0000029556 00000 n 0000014107 00000 n 0000014247 00000 n 0000016080 00000 n 0000029307 00000 n 0000016101 00000 n 0000023660 00000 n 0000016238 00000 n 0000016376 00000 n 0000016515 00000 n 0000028815 00000 n 0000016661 00000 n 0000016800 00000 n 0000028897 00000 n 0000016938 00000 n 0000017077 00000 n 0000028979 00000 n 0000017219 00000 n 0000017360 00000 n 0000029061 00000 n 0000017504 00000 n 0000017641 00000 n 0000029143 00000 n 0000017781 00000 n 0000017919 00000 n 0000029225 00000 n 0000018061 00000 n 0000018199 00000 n 0000018341 00000 n 0000018661 00000 n 0000018681 00000 n 0000023976 00000 n 0000025374 00000 n 0000029892 00000 n 0000023997 00000 n 0000025319 00000 n 0000029978 00000 n 0000024139 00000 n 0000030060 00000 n 0000024281 00000 n 0000030146 00000 n 0000024423 00000 n 0000030230 00000 n 0000024563 00000 n 0000024705 00000 n 0000025559 00000 n 0000030316 00000 n 0000030395 00000 n 0000025579 00000 n 0000030445 00000 n 0000025669 00000 n 0000025773 00000 n 0000025983 00000 n 0000030523 00000 n 0000026197 00000 n 0000030605 00000 n 0000026407 00000 n 0000026626 00000 n 0000026801 00000 n 0000027007 00000 n 0000027170 00000 n 0000027269 00000 n 0000027364 00000 n 0000027442 00000 n 0000027549 00000 n 0000027658 00000 n 0000027770 00000 n 0000027875 00000 n 0000027986 00000 n trailer << /Size 102 /Root 2 0 R /Info 4 0 R /ID [<3E1783DA9A3553B7BF1A6A3A82B7841A> <3E1783DA9A3553B7BF1A6A3A82B7841A>] >> startxref 30687 %%EOF asciidoc-8.2.7/doc/asciidoc.10000644000175100017510000000727111033404317016064 0ustar srackhamsrackham.\" Title: asciidoc .\" Author: .\" Generator: DocBook XSL Stylesheets v1.72.0 .\" Date: 07/04/2008 .\" Manual: .\" Source: .\" .TH "ASCIIDOC" "1" "07/04/2008" "" "" .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .SH "NAME" asciidoc \- converts an AsciiDoc text file to DocBook, HTML or LinuxDoc .SH "SYNOPSIS" \fBasciidoc\fR [\fIOPTIONS\fR] \fIFILE\fR .sp .SH "DESCRIPTION" The asciidoc(1) command translates the AsciiDoc text file \fIFILE\fR to a DocBook, HTML or LinuxDoc file. If \fIFILE\fR is \fI\-\fR then the standard input is used. .sp .SH "OPTIONS" .PP \fB\-a, \-\-attribute\fR=\fIATTRIBUTE\fR .RS 4 Define or delete document attribute. \fIATTRIBUTE\fR is formatted like \fINAME=VALUE\fR. Command\-line attributes take precedence over document and configuration file attributes. Alternate acceptable forms are \fINAME\fR (the \fIVALUE\fR defaults to an empty string); \fINAME!\fR (delete the \fINAME\fR attribute); \fINAME@\fR (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. .RE .PP \fB\-b, \-\-backend\fR=\fIBACKEND\fR .RS 4 Backend output file format: \fIdocbook\fR, \fIxhtml11\fR or \fIhtml4\fR. Defaults to \fIxhtml11\fR. .RE .PP \fB\-f, \-\-conf\-file\fR=\fICONF_FILE\fR .RS 4 Use configuration file \fICONF_FILE\fR.Configuration files processed in command\-line order (after implicit configuration files). This option may be specified more than once. .RE .PP \fB\-d, \-\-doctype\fR=\fIDOCTYPE\fR .RS 4 Document type: \fIarticle\fR, \fImanpage\fR or \fIbook\fR. The \fIbook\fR document type is only supported by the \fIdocbook\fR backend. Default document type is \fIarticle\fR. .RE .PP \fB\-c, \-\-dump\-conf\fR .RS 4 Dump configuration to stdout. .RE .PP \fB\-h, \-\-help\fR[=\fITOPIC\fR] .RS 4 Print help TOPIC. \fB\-\-help\fR=\fItopics\fR will print a list of help topics, \fB\-\-help\fR=\fIsyntax\fR summarizes AsciiDoc syntax, \fB\-\-help\fR=\fImanpage\fR prints the AsciiDoc manpage. .RE .PP \fB\-e, \-\-no\-conf\fR .RS 4 Exclude implicitly loaded configuration files except for those named like the input file (\fIinfile.conf\fR and \fIinfile\-backend.conf\fR). .RE .PP \fB\-s, \-\-no\-header\-footer\fR .RS 4 Suppress document header and footer output. .RE .PP \fB\-o, \-\-out\-file\fR=\fIOUT_FILE\fR .RS 4 Write output to file \fIOUT_FILE\fR. Defaults to the base name of input file with \fIbackend\fR extension. If the input is stdin then the outfile defaults to stdout. If \fIOUT_FILE\fR is \fI\-\fR then the standard output is used. .RE .PP \fB\-n, \-\-section\-numbers\fR .RS 4 Auto\-number HTML article section titles. Synonym for \fB\-a numbered\fR. .RE .PP \fB\-\-unsafe\fR .RS 4 Disable safe mode. Safe mode is enabled by default, disabling it is potentially dangerous. .RE .PP \fB\-v, \-\-verbose\fR .RS 4 Verbosely print processing information and configuration file checks to stderr. .RE .PP \fB\-\-version\fR .RS 4 Print program version number. .RE .SH "EXIT STATUS" .PP \fB0\fR .RS 4 Success .RE .PP \fB1\fR .RS 4 Failure (syntax or usage error; configuration error; document processing failure; unexpected error). .RE .SH "BUGS" See the AsciiDoc distribution BUGS file. .sp .SH "AUTHOR" Written by Stuart Rackham, .sp .SH "RESOURCES" SourceForge: http://sourceforge.net/projects/asciidoc/ .sp Main web site: http://www.methods.co.nz/asciidoc/ .sp .SH "COPYING" Copyright (C) 2002\-2008 Stuart Rackham. Free use of this software is granted under the terms of the GNU General Public License (GPL). .sp .SH "REFERENCES" .IP " 1." 4 srackham@gmail.com .RS 4 \%mailto:srackham@gmail.com .RE asciidoc-8.2.7/doc/asciidoc.conf0000644000175100017510000000032710775002604016651 0ustar srackhamsrackham# # Customization for AsciiDoc documentation. # [specialwords] ifndef::doctype-manpage[] emphasizedwords=(?u)\\?\bAsciiDoc\b monospacedwords=(?u)\\?\basciidoc\(1\) (?u)\\?\ba2x\(1\) endif::doctype-manpage[] asciidoc-8.2.7/doc/asciidoc-revhistory.xml0000644000175100017510000000133610711254235020740 0ustar srackhamsrackham 6.0.0 January 2005 SJR AsciiDoc 6.0.0 additions and changes (see the AsciiDoc CHANGELOG for a full list of changes). 5.1.1 2004-10-10 SJR AsciiDoc 5.1.1 additions and changes (see the AsciiDoc CHANGELOG for a full list of changes). asciidoc-8.2.7/docbook-xsl/shaded-literallayout.patch0000644000175100017510000000236110711254235023043 0ustar srackhamsrackhamdiff -u fo.ORIG/param.xsl fo/param.xsl --- fo.ORIG/param.xsl 2005-11-30 19:22:15.992409173 +1300 +++ fo/param.xsl 2005-11-30 11:25:40.000000000 +1300 @@ -669,6 +669,7 @@ + #E0E0E0 diff -u fo.ORIG/verbatim.xsl fo/verbatim.xsl --- fo.ORIG/verbatim.xsl 2005-11-30 19:22:15.944415115 +1300 +++ fo/verbatim.xsl 2005-11-30 11:26:12.000000000 +1300 @@ -105,7 +105,7 @@ - + - + elements on a machine by machine basis. --> ../images/icons/ ../images/icons/ asciidoc-8.2.7/docbook-xsl/common.xsl0000644000175100017510000000545611021657701017732 0ustar srackhamsrackham ./images/icons/ 0 0 #E0E0E0 ./images/icons/ margin-left: 0; margin-right: 10%; asciidoc-8.2.7/docbook-xsl/fo.xsl0000644000175100017510000001047111021661552017036 0ustar srackhamsrackham false left 12 pt 0pt 0pt 1pc -1pc 0pt 0pt 0.75in 0.75in 0.5in 0.5in 10pt 14pt bold false always solid 1pt silver #ffffee 12pt 12pt 6pt 6pt 0pt 12pt 6pt 6pt #F0F0F0 asciidoc-8.2.7/docbook-xsl/htmlhelp.xsl0000644000175100017510000000150710711254235020250 0ustar srackhamsrackham asciidoc-8.2.7/docbook-xsl/manpage.xsl0000644000175100017510000000174710711254235020051 0ustar srackhamsrackham asciidoc-8.2.7/docbook-xsl/xhtml.xsl0000644000175100017510000000122510711254235017564 0ustar srackhamsrackham asciidoc-8.2.7/doc/docbook-xsl.css0000777000175100017510000000000010727322023024677 2../stylesheets/docbook-xsl.cssustar srackhamsrackhamasciidoc-8.2.7/doc/customers.csv0000644000175100017510000000150510711254235016763 0ustar srackhamsrackham"AROUT","Around the Horn","Thomas Hardy","120 Hanover Sq. London","(171) 555-7788" "BERGS","Berglunds snabbkop","Christina Berglund","Berguvsvagen 8 Lulea","0921-12 34 65" "BLAUS","Blauer See Delikatessen","Hanna Moos","Forsterstr. 57 Mannheim","0621-08460" "BLONP","Blondel pere et fils","Frederique Citeaux","24, place Kleber Strasbourg","88.60.15.31" "BOLID","Bolido Comidas preparadas","Martin Sommer","C/ Araquil, 67 Madrid","(91) 555 22 82" "BONAP","Bon app'","Laurence Lebihan","12, rue des Bouchers Marseille","91.24.45.40" "BOTTM","Bottom-Dollar Markets","Elizabeth Lincoln","23 Tsawassen Blvd. Tsawassen","(604) 555-4729" "BSBEV","B's Beverages","Victoria Ashworth","Fauntleroy Circus London","(171) 555-1212" "CACTU","Cactus Comidas para llevar","Patricio Simpson","Cerrito 333 Buenos Aires","(1) 135-5555" asciidoc-8.2.7/doc/article.css-embedded.html0000644000175100017510000003272111033026631021050 0ustar srackhamsrackham The Article Title

    This is the optional preamble (an untitled section body). Useful for writing simple sectionless documents consisting only of a preamble.

    1. Abstract

    The optional abstract (one or more paragraphs) goes here.

    This document is an AsciiDoc article skeleton containing briefly annotated element placeholders plus a couple of example index entries and footnotes. The preface, appendix, bibliography, glossary and index section titles are significant (specialsections).

    2. The First Section

    Article sections start at level 1 and can be nested up to four levels deep.
    [An example footnote.]

    And now for something completely different: monkeys, lions and tigers (Bengal and Siberian) using the alternative syntax index entries. Note that multi-entry terms generate separate index entries.

    Here are a couple of image examples: an images/smallnew.png example inline image followed by an example block image:

    Tiger image
    Figure: Tiger block image

    Followed by an example table:

    Table: An example table
    Option Description
    -a USER GROUP Add USER to GROUP.
    -R GROUP Disables access to GROUP.

    2.1. Sub-section with Anchor

    Sub-section at level 2.

    2.1.1. A Nested Sub-section

    Sub-section at level 3.

    Yet another nested Sub-section

    Sub-section at level 4.

    This is the maximum sub-section depth supported by the distributed AsciiDoc configuration.
    [A second example footnote.]

    3. The Second Section

    Article sections are at level 1 and can contain sub-sections nested up to four deep.

    An example link to anchor at start of the first sub-section.

    An example link to a bibliography entry [taoup].

    4. Appendix A: Example Appendix

    AsciiDoc article appendices are just just article sections with specialsection titles.

    4.1. Appendix Sub-section

    Appendix sub-section at level 2.

    5. Bibliography

    The bibliography list is an example of an AsciiDoc SimpleList, the AsciiDoc source list items are bulleted with a + character.

    1. [taoup] Eric Steven Raymond. The Art of Unix Programming. Addison-Wesley. ISBN 0-13-142901-9.

    2. [walsh-muellner] Norman Walsh & Leonard Muellner. DocBook - The Definitive Guide. O'Reilly & Associates. 1999. ISBN 1-56592-580-7.

    6. Glossary

    Glossaries are optional. Glossaries entries are an example of AsciiDoc VariableList entries, the AsciiDoc source entry terms are terminated by the ":-" characters.

    A glossary term

    The corresponding (indented) definition.

    A second glossary term

    The corresponding (indented) definition.

    asciidoc-8.2.7/doc/article.html0000644000175100017510000002366611033404325016542 0ustar srackhamsrackham The Article Title

    The Article Title

    Author's Name

    Revision History
    Revision 1.0Dec 2003AN

    This is the optional preamble (an untitled section body). Useful for writing simple sectionless documents consisting only of a preamble.

    Abstract

    The optional abstract (one or more paragraphs) goes here.

    This document is an AsciiDoc article skeleton containing briefly annotated element placeholders plus a couple of example index entries and footnotes. The preface, appendix, bibliography, glossary and index section titles are significant (specialsections).

    1. The First Section

    Article sections start at level 1 and can be nested up to four levels deep. [1]

    And now for something completely different: monkeys, lions and tigers (Bengal and Siberian) using the alternative syntax index entries. Note that multi-entry terms generate separate index entries.

    Here are a couple of image examples: an images/smallnew.png example inline image followed by an example block image:

    Figure 1. Tiger block image

    Tiger image

    Followed by an example table:

    Table 1. An example table

    Option Description
    -a USER GROUP Add USER to GROUP.
    -R GROUP Disables access to GROUP.

    1.1. Sub-section with Anchor

    Sub-section at level 2.

    1.1.1. A Nested Sub-section

    Sub-section at level 3.

    1.1.1.1. Yet another nested Sub-section

    Sub-section at level 4.

    This is the maximum sub-section depth supported by the distributed AsciiDoc configuration. [2]

    2. The Second Section

    Article sections are at level 1 and can contain sub-sections nested up to four deep.

    An example link to anchor at start of the first sub-section.

    An example link to a bibliography entry [taoup].

    A. Example Appendix

    AsciiDoc article appendices are just just article sections with specialsection titles.

    A.1. Appendix Sub-section

    Appendix sub-section at level 2.

    Bibliography

    The bibliography list is an example of an AsciiDoc SimpleList, the AsciiDoc source list items are bulleted with a + character.

    [taoup] Eric Steven Raymond. The Art of Unix Programming. Addison-Wesley. ISBN 0-13-142901-9.

    [walsh-muellner] Norman Walsh & Leonard Muellner. DocBook - The Definitive Guide. O'Reilly & Associates. 1999. ISBN 1-56592-580-7.

    Glossary

    Glossaries are optional. Glossaries entries are an example of AsciiDoc VariableList entries, the AsciiDoc source entry terms are terminated by the ":-" characters.

    A glossary term

    The corresponding (indented) definition.

    A second glossary term

    The corresponding (indented) definition.

    Index

    B

    Bengal Tiger, The First Section
    Big cats
    Lions, The First Section
    Tigers
    Bengal Tiger, The First Section
    Siberian Tiger, The First Section

    E

    Example index entry, The First Section

    S

    Second example index entry, The Second Section
    Siberian Tiger, The First Section

    T

    Tigers
    Bengal Tiger, The First Section
    Siberian Tiger, The First Section


    [1] An example footnote.

    [2] A second example footnote.

    asciidoc-8.2.7/doc/asciidoc.1.css-embedded.html0000644000175100017510000002643611033404303021344 0ustar srackhamsrackham ASCIIDOC(1)

    SYNOPSIS

    asciidoc [OPTIONS] FILE

    DESCRIPTION

    The asciidoc(1) command translates the AsciiDoc text file FILE to a DocBook, HTML or LinuxDoc file. 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@ (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.

    -b, --backend=BACKEND

    Backend output file format: docbook, xhtml11 or html4. Defaults to xhtml11.

    -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.

    -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.

    -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 -a numbered.

    --unsafe

    Disable safe mode. Safe mode is enabled by default, disabling it is potentially dangerous.

    -v, --verbose

    Verbosely print processing information and configuration file checks to stderr.

    --version

    Print program version number.

    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

    Written by Stuart Rackham, <srackham@gmail.com>

    RESOURCES

    COPYING

    Copyright (C) 2002-2008 Stuart Rackham. Free use of this software is granted under the terms of the GNU General Public License (GPL).

    asciidoc-8.2.7/doc/asciidoc.1.css.html0000644000175100017510000001340111033404265017610 0ustar srackhamsrackham ASCIIDOC(1)

    SYNOPSIS

    asciidoc [OPTIONS] FILE

    DESCRIPTION

    The asciidoc(1) command translates the AsciiDoc text file FILE to a DocBook, HTML or LinuxDoc file. 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@ (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.

    -b, --backend=BACKEND

    Backend output file format: docbook, xhtml11 or html4. Defaults to xhtml11.

    -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.

    -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.

    -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 -a numbered.

    --unsafe

    Disable safe mode. Safe mode is enabled by default, disabling it is potentially dangerous.

    -v, --verbose

    Verbosely print processing information and configuration file checks to stderr.

    --version

    Print program version number.

    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

    Written by Stuart Rackham, <srackham@gmail.com>

    RESOURCES

    COPYING

    Copyright (C) 2002-2008 Stuart Rackham. Free use of this software is granted under the terms of the GNU General Public License (GPL).

    asciidoc-8.2.7/doc/asciidoc.1.html0000644000175100017510000001174111033404245017024 0ustar srackhamsrackham asciidoc

    ASCIIDOC(1) Manual Page


    NAME

    asciidoc - converts an AsciiDoc text file to DocBook, HTML or LinuxDoc

    SYNOPSIS

    asciidoc [OPTIONS] FILE

    DESCRIPTION

    The asciidoc(1) command translates the AsciiDoc text file FILE to a DocBook, HTML or LinuxDoc file. 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@ (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.

    -b, --backend=BACKEND

    Backend output file format: docbook, xhtml11 or html4. Defaults to xhtml11.

    -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.

    -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.

    -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 -a numbered.

    --unsafe

    Disable safe mode. Safe mode is enabled by default, disabling it is potentially dangerous.

    -v, --verbose

    Verbosely print processing information and configuration file checks to stderr.

    --version

    Print program version number.

    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

    Written by Stuart Rackham, <srackham@gmail.com>

    RESOURCES

    SourceForge: http://sourceforge.net/projects/asciidoc/

    Main web site: http://www.methods.co.nz/asciidoc/

    COPYING

    Copyright (C) 2002-2008 Stuart Rackham. Free use of this software is granted under the terms of the GNU General Public License (GPL).


    Version 8.2.7
    Last updated 2008-07-04 23:25:26 NZDT

    asciidoc-8.2.7/doc/asciidoc.css-embedded.html0000644000175100017510000076317111033405277021224 0ustar srackhamsrackham AsciiDoc User Guide

    AsciiDoc is a text document format for writing short documents, articles, books and UNIX man pages. AsciiDoc files can be translated to HTML and DocBook markups using the asciidoc(1) command. AsciiDoc is highly configurable: both the AsciiDoc source file syntax and the backend output markups (which can be almost any type of SGML/XML markup) can be customized and extended by the user.

    1. Introduction

    Plain text is the most universal electronic document format, no matter what computing environment you use, you can always read and write plain text documentation. But for many applications plain text is not a viable presentation format. HTML, PDF and roff (roff is used for man pages) are the most widely used UNIX presentation formats. DocBook is a popular UNIX documentation markup format which can be translated to HTML, PDF and other presentation formats.

    AsciiDoc is a plain text human readable/writable document format that can be translated to DocBook or HTML using the asciidoc(1) command. You can then either use asciidoc(1) generated HTML directly or run asciidoc(1) DocBook output through your favorite DocBook toolchain or use the AsciiDoc a2x(1) toolchain wrapper to produce PDF, DVI, LaTeX, PostScript, man page, HTML and text formats.

    The AsciiDoc format is a useful presentation format in its own right: AsciiDoc files are unencumbered by markup and are easily viewed, proofed and edited.

    AsciiDoc is light weight: it consists of a single Python script and a bunch of configuration files. Apart from asciidoc(1) and a Python interpreter, no other programs are required to convert AsciiDoc text files to DocBook or HTML. See Example AsciiDoc Documents below.

    You write an AsciiDoc document the same way you would write a normal text document, there are no markup tags or arcane notations. Built-in AsciiDoc formatting rules have been kept to a minimum and are reasonably obvious.

    Text markup conventions tend to be a matter of (often strong) personal preference: if the default syntax is not to your liking you can define your own by editing the text based asciidoc(1) configuration files. You can create your own configuration files to translate AsciiDoc documents to almost any SGML/XML markup.

    asciidoc(1) comes with a set of configuration files to translate AsciiDoc articles, books or man pages to HTML or DocBook backend formats.

    2. Getting Started

    2.1. Installing AsciiDoc

    See the README and INSTALL files for install prerequisites and procedures. Packagers take a look at Appendix B: Packager Notes.

    2.2. Example AsciiDoc Documents

    The best way to quickly get a feel for AsciiDoc is to view the AsciiDoc web site and/or distributed examples:

    • Take a look at the linked examples on the AsciiDoc web site home page http://www.methods.co.nz/asciidoc/. Press the Page Source sidebar menu item to view corresponding AsciiDoc source.

    • Read the .txt source files in the distribution ./doc directory in conjunction with the corresponding HTML and DocBook XML files.

    3. AsciiDoc Document Types

    There are three types of AsciiDoc documents: article, book and manpage. All document types share the same AsciiDoc format with some minor variations.

    Use the asciidoc(1) -d (—doctype) option to specify the AsciiDoc document type — the default document type is article.

    By convention the .txt file extension is used for AsciiDoc document source files.

    3.1. article

    Used for short documents, articles and general documentation. See the AsciiDoc distribution ./doc/article.txt example.

    3.2. book

    Books share the same format as articles; in addition there is the option to add level 0 book part sections.

    Book documents will normally be used to produce DocBook output since DocBook processors can automatically generate footnotes, table of contents, list of tables, list of figures, list of examples and indexes.

    AsciiDoc markup supports standard DocBook frontmatter and backmatter special sections (dedication, preface, bibliography, glossary, index, colophon) plus footnotes and index entries.

    Example book documents
    Book

    The ./doc/book.txt file in the AsciiDoc distribution.

    Multi-part book

    The ./doc/book-multi.txt file in the AsciiDoc distribution.

    3.3. manpage

    Used to generate UNIX manual pages. AsciiDoc manpage documents observe special header title and section naming conventions — see the Manpage Documents section for details.

    See also the asciidoc(1) man page source (./doc/asciidoc.1.txt) from the AsciiDoc distribution.

    4. AsciiDoc Backends

    The asciidoc(1) command translates an AsciiDoc formatted file to the backend format specified by the -b (—backend) command-line option. asciidoc(1) itself has little intrinsic knowledge of backend formats, all translation rules are contained in customizable cascading configuration files.

    AsciiDoc ships with the following predefined backend output formats:

    4.1. docbook

    AsciiDoc generates the following DocBook document types: article, book and refentry (corresponding to the AsciiDoc article, book and manpage document types).

    DocBook documents are not designed to be viewed directly. Most Linux distributions come with conversion tools (collectively called a toolchain) for converting DocBook files to presentation formats such as Postscript, HTML, PDF, DVI, PostScript, LaTeX, roff (the native man page format), HTMLHelp, JavaHelp and text.

    • The —backend=docbook command-line option produces DocBook XML. You can produce the older DocBook SGML format using the —attribute sgml command-line option.

    • Use the optional encoding attribute to set the character set encoding.

    • Use the optional imagesdir attribute to prepend to the target file name paths in image inline and block macros. Defaults to a blank string.

    • The AsciiDoc Preamble element generates a DocBook book preface element although it's more usual to use an explicit Preface special section (see the ./doc/book.txt example book).

    4.2. xhtml11

    The default asciidoc(1) backend is xhtml11 which generates XHTML 1.1 markup styled with CSS2. Default output file have a .html extension. xhtml11 document generation is influenced by the following optional attributes (the default behavior is to generate XHTML with no section numbers, embedded CSS and no linked admonition icon images):

    numbered

    Adds section numbers to section titles.

    toc

    Adds a table of contents to the start of the document.

    • JavaScript needs to be enabled in your browser for this to work.

    • By default AsciiDoc automatically embeds the required toc.js JavaScript in the output document — use the linkcss attribute to link the script.

    • The following example generates a numbered table of contents by embedding the toc.js script in the mydoc.html output document (to link the script to the output document use the linkcss and scriptsdir attributes):

      $ asciidoc -a toc -a numbered mydoc.txt
    toclevels

    Sets the number of title levels (1..4) reported in the table of contents (see the toc attribute above). Defaults to 2 and must be used with the toc attribute. Example usage:

    $ asciidoc -a toc -a toclevels=3 doc/asciidoc.txt
    toc_title

    Sets the table of contents title (defaults to Table of Contents).

    linkcss

    Link CSS stylesheets and JavaScripts (see the stylesdir and scriptsdir attributes below). By default linkcss is undefined in which case stylesheets and scripts are automatically embedded in the output document.

    stylesdir

    The name of the directory containing linked stylesheets. Defaults to . (the same directory as the linking document).

    scriptsdir

    The name of the directory containing linked JavaScripts. Defaults to . (the same directory as the linking document).

    icons

    Link admonition paragraph and admonition block icon images and badge images. By default icons is undefined and text is used in place of icon images.

    iconsdir

    The name of the directory containing linked admonition and navigation icons. Defaults to ./images/icons.

    imagesdir

    This attribute is prepended to the target image file name paths in image inline and block macros. Defaults to a blank string.

    theme

    Use alternative stylesheets (see Stylesheets).

    badges

    Link badges (XHTML 1.1, CSS and Get Firefox!) in document footers. By default badges are omitted (badges is undefined).

    Note
    The path names of images, icons and scripts are relative to the output document not the source document.
    encoding

    Set the input and output document character set encoding. For example the —attribute encoding=ISO-8859-1 command-line option will set the character set encoding to ISO-8859-1.

    • The default encoding is UTF-8.

    • This attribute specifies the character set in the output document.

    • The encoding name must correspond to a Python codec name or alias.

    • The encoding attribute can be set using an AttributeEntry inside the document header but it must come at the start of the document before the document title. For example:

      :encoding: ISO-8859-1
    quirks

    Use the xhtml11-quirks.css stylesheet to work around IE6 browser incompatibilities (this is the default behavior).

    data-uri

    Embed images referenced by image macros using the data: uri scheme.

    4.2.1. Stylesheets

    AsciiDoc XHTML output is styled using CSS2 stylesheets from the distribution ./stylesheets/ directory.

    Important

    All browsers have CSS quirks, but Microsoft's IE6 has so many omissions and errors that the xhtml11-quirks.css stylesheet and xhtml11-quirks.conf configuration files are included during XHTML backend processing to to implement workarounds for IE6. If you don't use IE6 then the quirks stylesheet and configuration files can be omitted using the —attribute quirks! command-line option.

    Default xhtml11 stylesheets:

    ./stylesheets/xhtml11.css

    The main stylesheet.

    ./stylesheets/xhtml11-manpage.css

    Tweaks for manpage document type generation.

    ./stylesheets/xhtml11-quirks.css

    Stylesheet modifications to work around IE6 browser incompatibilities.

    Use the theme attribute to select and alternative set of stylesheets. For example, the command-line option -a theme=foo will use stylesheets foo.css, foo-manpage.css and foo-quirks.css.

    4.3. html4

    This backend generates plain (unstyled) HTML 4.01 Transitional markup.

    4.4. linuxdoc

    Warning
    The AsciiDoc linuxdoc backend is still distributed but is no longer being actively developed or tested with new AsciiDoc releases (the last supported release was AsciiDoc 6.0.3).
    • Tables are not supported.

    • Images are not supported.

    • Callouts are not supported.

    • Horizontal labeled lists are not supported.

    • Only article document types are allowed.

    • The Abstract section can consist only of a single paragraph.

    • An AsciiDoc Preamble is not allowed.

    • The LinuxDoc output format does not support multiple labels per labeled list item although LinuxDoc conversion programs generally output all the labels with a warning.

    • Don't apply character formatting to the link macro attributes, LinuxDoc does not allow displayed link text to be formatted.

    The default output file name extension is .sgml.

    4.5. latex

    An experimental LaTeX backend has been written for AsciiDoc by Benjamin Klum. A tutorial ./doc/latex-backend.html is included in the AsciiDoc distribution which can also be viewed at http://www.methods.co.nz/asciidoc/latex-backend.html.

    5. Document Structure

    An AsciiDoc document consists of a series of block elements starting with an optional document Header, followed by an optional Preamble, followed by zero or more document Sections.

    Almost any combination of zero or more elements constitutes a valid AsciiDoc document: documents can range from a single sentence to a multi-part book.

    5.1. Block Elements

    Block elements consist of one or more lines of text and may contain other block elements.

    The AsciiDoc block structure can be informally summarized
    [This is a rough structural guide, not a rigorous syntax definition]
    as follows:

    Document      ::= (Header?,Preamble?,Section*)
    Header        ::= (Title,(AuthorLine,RevisionLine?)?)
    AuthorLine    ::= (FirstName,(MiddleName?,LastName)?,EmailAddress?)
    RevisionLine  ::= (Revision?,Date)
    Preamble      ::= (SectionBody)
    Section       ::= (Title,SectionBody?,(Section)*)
    SectionBody   ::= ((BlockTitle?,Block)|BlockMacro)+
    Block         ::= (Paragraph|DelimitedBlock|List|Table)
    List          ::= (BulletedList|NumberedList|LabeledList|CalloutList)
    BulletedList  ::= (ListItem)+
    NumberedList  ::= (ListItem)+
    CalloutList   ::= (ListItem)+
    LabeledList   ::= (ItemLabel+,ListItem)+
    ListItem      ::= (ItemText,(List|ListParagraph|ListContinuation)*)
    Table         ::= (Ruler,TableHeader?,TableBody,TableFooter?)
    TableHeader   ::= (TableRow+,TableUnderline)
    TableFooter   ::= (TableRow+,TableUnderline)
    TableBody     ::= (TableRow+,TableUnderline)
    TableRow      ::= (TableData+)

    Where:

    • ? implies zero or one occurrence, + implies one or more occurrences, * implies zero or more occurrences.

    • All block elements are separated by line boundaries.

    • BlockId, AttributeEntry and AttributeList block elements (not shown) can occur almost anywhere.

    • There are a number of document type and backend specific restrictions imposed on the block syntax.

    • The following elements cannot contain blank lines: Header, Title, Paragraph, ItemText.

    • A ListParagraph is a Paragraph with its listelement option set.

    • A ListContinuation is a list continuation element.

    5.2. Header

    The Header is optional but must start on the first line of the document and must begin with a document title. Optional Author and Revision lines immediately follow the title. The header can be preceded by a CommentBlock or comment lines.

    The author line contains the author's name optionally followed by the author's email address. The author's name consists of a first name followed by optional middle and last names separated by white space. Multi-word first, middle and last names can be entered in the header author line using the underscore as a word separator. The email address comes last and must be enclosed in angle <> brackets. Author names cannot contain angle <> bracket characters.

    The optional document header revision line should immediately follow the author line. The revision line can be one of two formats:

    1. An alphanumeric document revision number followed by a date:

      • The revision number and date must be separated by a comma.

      • The revision number is optional but must contain at least one numeric character.

      • Any non-numeric characters preceding the first numeric character will be dropped.

    2. An RCS/CSV/SVN $Id$ marker.

    The document heading is separated from the remainder of the document by one or more blank lines.

    Here's an example AsciiDoc document header:

    Writing Documentation using AsciiDoc
    ====================================
    Stuart Rackham <srackham@gmail.com>
    v2.0, February 2003

    You can override or set header parameters by passing revision, data, email, author, authorinitials, firstname and lastname attributes using the asciidoc(1) -a (—attribute) command-line option. For example:

    $ asciidoc -a date=2004/07/27 article.txt

    Attributes can also be added to the header for substitution in the header template with Attribute Entry elements.

    5.3. Preamble

    The Preamble is an optional untitled section body between the document Header and the first Section title.

    5.4. Sections

    AsciiDoc supports five section levels 0 to 4 (although only book documents are allowed to contain level 0 sections). Section levels are delineated by the section titles.

    Sections are translated using configuration file markup templates. To determine which configuration file template to use AsciiDoc first searches for special section titles in the [specialsections] configuration entries, if not found it uses the [sect<level>] template.

    The -n (—section-numbers) command-line option auto-numbers HTML outputs (DocBook line numbering is handled automatically by the DocBook toolchain commands).

    Section IDs are auto-generated from section titles if the sectids attribute is defined (the default behavior). The primary purpose of this feature is to ensure persistence of table of contents links: missing section IDs are generated dynamically by the JavaScript TOC generator after the page is loaded. This means, for example, that if you go to a bookmarked dynamically generated TOC address the page will load but the browser will ignore the (as yet ungenerated) section ID.

    The IDs are generated by the following algorithm:

    • Replace all non-alphanumeric title characters with an underscore.

    • Strip leading or trailing underscores.

    • Convert to lowercase.

    • Prepend an underscore (so there's no possibility of name clashes with existing document IDs).

    • A numbered suffix (_2, _3 …) is added if a same named auto-generated section ID exists.

    For example the title Jim's House would generate the ID _jim_s_house.

    5.4.1. Special Sections

    In addition to normal sections, documents can contain optional frontmatter and backmatter sections — for example: preface, bibliography, table of contents, index.

    The AsciiDoc configuration file [specialsections] section specifies special section titles and the corresponding backend markup templates.

    [specialsections] entries are formatted like:

    <pattern>=<name>

    <pattern> is a Python regular expression and <name> is the name of a configuration file markup template section. If the <pattern> matches an AsciiDoc document section title then the backend output is marked up using the <name> markup template (instead of the default sect<level> section template). The {title} attribute value is set to the value of the matched regular expression group named title, if there is no title group {title} defaults to the whole of the AsciiDoc section title.

    AsciiDoc comes preconfigured with the following special section titles:

    Preface                    (book documents only)
    Abstract                   (article documents only)
    Dedication                 (book documents only)
    Glossary
    Bibliography|References
    Colophon                   (book documents only)
    Index
    Appendix [A-Z][:.] <title>

    5.5. Inline Elements

    Inline document elements are used to markup character formatting and various types of text substitution. Inline elements and inline element syntax is defined in the asciidoc(1) configuration files.

    Here is a list of AsciiDoc inline elements in the (default) order in which they are processed:

    Special characters

    These character sequences escape special characters used by the backend markup (typically "<", ">", and "&"). See [specialcharacters] configuration file sections.

    Quotes

    Characters that markup words and phrases; usually for character formatting. See [quotes] configuration file sections.

    Special Words

    Word or word phrase patterns singled out for markup without the need for further annotation. See [specialwords] configuration file sections.

    Replacements

    Each Replacement defines a word or word phrase pattern to search for along with corresponding replacement text. See [replacements] configuration file sections.

    Attributes

    Document attribute names enclosed in braces (attribute references) are replaced by the corresponding attribute value.

    Inline Macros

    Inline macros are replaced by the contents of parametrized configuration file sections.

    6. Document Processing

    The AsciiDoc source document is read and processed as follows:

    1. The document Header is parsed, header parameter values are substituted into the configuration file [header] template section which is then written to the output file.

    2. Each document Section is processed and its constituent elements translated to the output file.

    3. The configuration file [footer] template section is substituted and written to the output file.

    When a block element is encountered asciidoc(1) determines the type of block by checking in the following order (first to last): (section) Titles, BlockMacros, Lists, DelimitedBlocks, Tables, AttributeEntrys, AttributeLists, BlockTitles, Paragraphs.

    The default paragraph definition [paradef-default] is last element to be checked.

    Knowing the parsing order will help you devise unambiguous macro, list and block syntax rules.

    Inline substitutions within block elements are performed in the following default order:

    1. Special characters

    2. Quotes

    3. Special words

    4. Replacements

    5. Attributes

    6. Inline Macros

    7. Passthroughs

    8. Replacements2

    The substitutions and substitution order performed on Title, Paragraph and DelimitedBlock elements is determined by configuration file parameters.

    7. Text Formatting

    7.1. Quoted Text

    Words and phrases can be formatted by enclosing inline text with quote characters:

    Emphasized text

    Word phrases 'enclosed in single quote characters' (acute accents) or _underline characters_ are emphasized.

    Strong text

    Word phrases *enclosed in asterisk characters* are rendered in a strong font (usually bold).

    Monospaced text

    Word phrases `enclosed in backtick characters` (grave accents) or +plus characters+ are rendered in a monospaced font.

    “Quoted text”

    Phrases ``enclosed with two grave accents to the left and two acute accents to the right'' are rendered in quotation marks.

    Unquoted text

    Placing #hashes around text# does nothing, it is a mechanism to allow inline attributes to be applied to otherwise unformatted text (see example below).

    The alternative underline and plus characters, while marginally less readable, are arguably a better choice than the backtick and apostrophe characters as they are not normally used for, and so not confused with, punctuation.

    Quoted text can be prefixed with an attribute list. Currently the only use made of this feature is to allow the font color, background color and size to be specified (XHTML/HTML only, not DocBook) using the first three positional attribute arguments. The first argument is the text color; the second the background color; the third is the font size. Colors are valid CSS colors and the font size is a number which treated as em units. Here are some examples:

    [red]#Red text#.
    [,yellow]*bold text on a yellow background*.
    [blue,#b0e0e6]+Monospaced blue text on a light blue background+
    [,,2]#Double sized text#.

    New quotes can be defined by editing asciidoc(1) configuration files. See the Configuration Files section for details.

    Quoted text properties
    • Quoting cannot be overlapped.

    • Different quoting types can be nested.

    • To suppress quoted text formatting place a backslash character immediately in front of the leading quote character(s). In the case of ambiguity between escaped and non-escaped text you will need to escape both leading and trailing quotes, in the case of multi-character quotes you may even need to escape individual characters.

    • A configuration file [quotes] entry can be subsequently undefined by setting it to a blank value.

    7.1.1. Constrained and Unconstrained Quotes

    There are actually two types of quotes:

    Constrained quotes

    Quote text that must be bounded by white space, for example a phrase or a word. These are the most common type of quote and are the ones discussed previously.

    Unconstrained quotes

    Unconstrained quotes have no boundary constraints and can be placed anywhere within inline text. For consistency and to make them easier to remember unconstrained quotes are double-ups of the _, *, + and # constrained quotes:

    __unconstrained emphasized text__
    **unconstrained strong text**
    ++unconstrained monospaced text++
    ##unconstrained unquoted text##

    The following example emboldens the letter F:

    **F**ile Open...
    Tip

    The __, **, ++ and ## unconstrained quotes have to be double-escaped (because of their similarity to the single character constrained quotes) — here's how to escape the previous example:

    \*\*F**ile Open...

    7.2. Inline Passthroughs

    This special text quoting mechanism passes inline text to the output document without the usual substitutions. There are two flavors:

    +++Triple-plus passthrough+++

    No change is made to the quoted text, it is passed verbatim to the output document.

    $$Double-dollar passthrough$$

    Special characters are escaped but no other changes are made. This passthrough can be prefixed with inline attributes.

    7.3. Superscripts and Subscripts

    Put ^carets on either^ side of the text to be superscripted, put ~tildes on either side~ of text to be subscripted. For example, the following line:

    e^{amp}#960;i^+1 = 0. H~2~O and x^10^. Some ^super text^
    and ~some sub text~

    Is rendered like:

    eπi+1 = 0. H2O and x10. Some super text and some sub text

    Superscripts and subscripts are implemented as unconstrained quotes so they can be escaped with a leading backslash and prefixed with with an attribute list.

    7.4. Line Breaks (HTML/XHTML)

    A plus character preceded by at least one space character at the end of a line forces a line break. It generates an HTML line break (<br />) tag. Line breaks are ignored when outputting to DocBook since it has no line break element.

    7.5. Rulers (HTML/XHTML)

    A line of four or more apostrophe characters will generate an HTML ruler (<hr />) tag. Ignored when generating non-HTML output formats.

    7.6. Tabs

    By default tab characters input files will translated to 8 spaces. Tab expansion is set with the tabsize entry in the configuration file [miscellaneous] section and can be overridden in the include block macro by setting a tabsize attribute in the macro's attribute list. For example:

    include::addendum.txt[tabsize=2]

    The tab size can also be set using the attribute command-line option, for example --attribute tabsize=4

    7.7. Replacements

    The following replacements are defined in the default AsciiDoc configuration:

    (C) copyright, (TM) trademark, (R) registered trademark,
    -- em dash, ... ellipsis, -> right arrow, <- left arrow, => right
    double arrow, <= left double arrow.

    Which are rendered as:

    © copyright, ™ trademark, ® registered trademark, — em dash, … ellipsis, → right arrow, ← left arrow, ⇒ right double arrow, ⇐ left double arrow.

    The Configuration Files section explains how to configure your own replacements.

    7.8. Special Words

    Words defined in [specialwords] configuration file sections are automatically marked up without having to be explicitly notated.

    The Configuration Files section explains how to add and replace special words.

    8. Titles

    Document and section titles can be in either of two formats:

    8.1. Two line titles

    A two line title consists of a title line, starting hard against the left margin, and an underline. Section underlines consist a repeated character pairs spanning the width of the preceding title (give or take up to three characters):

    The default title underlines for each of the document levels are:

    Level 0 (top level):     ======================
    Level 1:                 ----------------------
    Level 2:                 ~~~~~~~~~~~~~~~~~~~~~~
    Level 3:                 ^^^^^^^^^^^^^^^^^^^^^^
    Level 4 (bottom level):  ++++++++++++++++++++++

    Examples:

    Level One Section Title
    -----------------------
    Level 2 Subsection Title
    ~~~~~~~~~~~~~~~~~~~~~~~~

    8.2. One line titles

    One line titles consist of a single line delimited on either side by one or more equals characters (the number of equals characters corresponds to the section level minus one). Here are some examples (levels 2 and 3 illustrate the optional trailing equals characters syntax):

    = Document Title (level 0) =
    == Section title (level 1) ==
    === Section title (level 2) ===
    ==== Section title (level 3) ====
    ===== Section title (level 4) =====
    Note
    • One or more spaces must fall between the title and the delimiters.

    • The trailing title delimiter is optional.

    • The one-line title syntax can be changed by editing the configuration file [titles] section sect0sect4 entries.

    9. BlockTitles

    A BlockTitle element is a single line beginning with a period followed by a title. The title is applied to the next Paragraph, DelimitedBlock, List, Table or BlockMacro. For example:

    .Notes
    - Note 1.
    - Note 2.

    is rendered as:

    Notes
    • Note 1.

    • Note 2.

    10. BlockId Element

    A BlockId is a single line block element containing a unique identifier enclosed in double square brackets. It is used to assign an identifier to the ensuing block element for use by referring links. For example:

    [[chapter-titles]]
    Chapter titles can be ...

    The preceding example identifies the following paragraph so it can be linked from other location, for example with <<chapter-titles,chapter titles>>.

    BlockId elements can be applied to Title, Paragraph, List, DelimitedBlock, Table and BlockMacro elements. The BlockId element is really just an AttributeList with a special syntax which sets the {id} attribute for substitution in the subsequent block's markup template.

    The BlockId element has the same syntax and serves a similar function to the anchor inline macro.

    11. Paragraphs

    Paragraphs are terminated by a blank line, the end of file, or the start of a DelimitedBlock.

    Paragraph markup is specified by configuration file [paradef*] sections. AsciiDoc ships with the following predefined paragraph types:

    11.1. Default Paragraph

    A Default paragraph ([paradef-default]) consists of one or more non-blank lines of text. The first line must start hard against the left margin (no intervening white space). The processing expectation of the default paragraph type is that of a normal paragraph of text.

    The verse paragraph style preserves line boundaries and is useful for lyrics and poems. For example:

    [verse]
    Consul *necessitatibus* per id,
    consetetur, eu pro everti postulant
    homero verear ea mea, qui.

    Renders:

    Consul necessitatibus per id, consetetur, eu pro everti postulant homero verear ea mea, qui.

    11.2. Literal Paragraph

    A Literal paragraph ([paradef-literal]) consists of one or more lines of text, where the first line is indented by one or more space or tab characters. Literal paragraphs are rendered verbatim in a monospaced font usually without any distinguishing background or border. There is no text formatting or substitutions within Literal paragraphs apart from Special Characters and Callouts. For example:

      Consul *necessitatibus* per id,
      consetetur, eu pro everti postulant
      homero verear ea mea, qui.

    Renders:

    Consul *necessitatibus* per id,
    consetetur, eu pro everti postulant
    homero verear ea mea, qui.
    Note
    Because lists can be indented it's possible for your Literal paragraph to be misinterpreted as a list — in situations like this use a LiteralBlock in place of a LiteralParagraph.

    11.3. Admonition Paragraphs

    Tip, Note, Important, Warning and Caution paragraph definitions support the corresponding DocBook admonishment elements — just write a normal paragraph but place NOTE:, TIP:, IMPORTANT:, WARNING: or CAUTION: as the first word of the paragraph. For example:

    NOTE: This is an example note.

    or the alternative syntax:

    [NOTE]
    This is an example note.

    Renders:

    Note
    This is an example note.
    Tip
    If your admonition is more than a single paragraph use an admonition block instead.

    11.3.1. Admonition Icons and Captions

    Note
    Admonition customization with icons, iconsdir, icon and caption attributes does not apply when generating DocBook output. If you are going the DocBook route then the a2x(1) —no-icons and —icons-dir options can be used to set the appropriate XSL Stylesheets parameters.

    By default the asciidoc(1) xhtml11 and html4 backends generate text captions instead of icon image links. To generate links to icon images define the icons attribute, for example using the -a icons command-line option.

    The iconsdir attribute sets the location of linked icon images.

    You can override the default icon image using the icon attribute to specify the path of the linked image. For example:

    [icon="./images/icons/wink.png"]
    NOTE: What lovely war.

    Use the caption attribute to customize the admonition captions (not applicable to docbook backend). The following example suppresses the icon image and customizes the caption of a NOTE admonition (undefining the icons attribute with icons=None is only necessary if admonition icons have been enabled):

    [icons=None, caption="My Special Note"]
    NOTE: This is my special note.

    This subsection also applies to Admonition Blocks.

    12. Delimited Blocks

    Delimited blocks are blocks of text enveloped by leading and trailing delimiter lines (normally a series of four or more repeated characters). The behavior of Delimited Blocks is specified by entries in configuration file [blockdef*] sections.

    12.1. Predefined Delimited Blocks

    AsciiDoc ships with a number of predefined DelimitedBlocks (see the asciidoc.conf configuration file in the asciidoc(1) program directory):

    Predefined delimited block underlines:

    CommentBlock:     //////////////////////////
    PassthroughBlock: ++++++++++++++++++++++++++
    ListingBlock:     --------------------------
    LiteralBlock:     ..........................
    SidebarBlock:     **************************
    QuoteBlock:       __________________________
    ExampleBlock:     ==========================
    Filter blocks:    ~~~~~~~~~~~~~~~~~~~~~~~~~~

    The code, source and music filter blocks are detailed in the Filters section.

    Table: Default DelimitedBlock substitutions
    Passthrough Listing Literal Sidebar Quote
    Callouts No Yes Yes No No
    Attributes Yes No No Yes Yes
    Inline Macros Yes No No Yes Yes
    Quotes No No No Yes Yes
    Replacements No No No Yes Yes
    Special chars No Yes Yes Yes Yes
    Special words No No No Yes Yes

    12.2. Listing Blocks

    ListingBlocks are rendered verbatim in a monospaced font, they retain line and whitespace formatting and often distinguished by a background or border. There is no text formatting or substitutions within Listing blocks apart from Special Characters and Callouts. Listing blocks are often used for code and file listings.

    Here's an example:

    --------------------------------------
    #include <stdio.h>
    int main() {
        printf("Hello World!\n");
        exit(0);
    }
    --------------------------------------

    Which will be rendered like:

    #include <stdio.h>
    
    int main() {
        printf("Hello World!\n");
        exit(0);
    }

    12.3. Literal Blocks

    LiteralBlocks behave just like LiteralParagraphs except you don't have to indent the contents.

    LiteralBlocks can be used to resolve list ambiguity. If the following list was just indented it would be processed as an ordered list (not an indented paragraph):

    ....................
    1. Item 1
    2. Item 2
    ....................

    Renders:

    1. Item 1
    2. Item 2

    12.4. SidebarBlocks

    A sidebar is a short piece of text presented outside the narrative flow of the main text. The sidebar is normally presented inside a bordered box to set it apart from the main text.

    The sidebar body is treated like a normal section body.

    Here's an example:

    .An Example Sidebar
    ************************************************
    Any AsciiDoc SectionBody element (apart from
    SidebarBlocks) can be placed inside a sidebar.
    ************************************************

    Which will be rendered like:

    12.5. Comment Blocks

    The contents of CommentBlocks are not processed; they are useful for annotations and for excluding new or outdated content that you don't want displayed. Here's and example:

    //////////////////////////////////////////
    CommentBlock contents are not processed by
    asciidoc(1).
    //////////////////////////////////////////

    See also Comment Lines.

    12.6. Passthrough Blocks

    PassthroughBlocks are for backend specific markup, text is only subject to attribute and macro substitution. PassthroughBlock content will generally be backend specific. Here's an example:

    ++++++++++++++++++++++++++++++++++++++
    <table border="1"><tr>
      <td>Cell 1</td>
      <td>Cell 2</td>
    </tr></table>
    ++++++++++++++++++++++++++++++++++++++

    12.7. Quote Blocks

    QuoteBlocks are used for quoted passages of text. There are two styles: quote and verse (the first positional attribute). The attribution and citetitle attributes (positional attributes 2 and 3) specify the content author and source. If no attributes are specified the quote style is used.

    The quote style treats the content like a SectionBody, for example:

    [quote, Bertrand Russell, The World of Mathematics (1956)]
    ____________________________________________________________________
    A good notation has subtlety and suggestiveness which at times makes
    it almost seem like a live teacher.
    ____________________________________________________________________

    Which is rendered as:

    A good notation has subtlety and suggestiveness which at times makes it almost seem like a live teacher.

    The World of Mathematics (1956)
    — Bertrand Russell

    The verse style retains the content's line breaks, for example:

    [verse, William Blake, from Auguries of Innocence]
    __________________________________________________
    To see a world in a grain of sand,
    And a heaven in a wild flower,
    Hold infinity in the palm of your hand,
    And eternity in an hour.
    __________________________________________________

    Which is rendered as:

    To see a world in a grain of sand, And a heaven in a wild flower, Hold infinity in the palm of your hand, And eternity in an hour.
    from Auguries of Innocence
    — William Blake

    12.8. Example Blocks

    ExampleBlocks encapsulate the DocBook Example element and are used for, well, examples. Example blocks can be titled by preceding them with a BlockTitle. DocBook toolchains normally number examples and generate a List of Examples backmatter section.

    Example blocks are delimited by lines of equals characters and you can put any block elements apart from Titles, BlockTitles and Sidebars) inside an example block. For example:

    .An example
    =====================================================================
    Qui in magna commodo, est labitur dolorum an. Est ne magna primis
    adolescens.
    =====================================================================

    Renders:

    Example: An example

    Qui in magna commodo, est labitur dolorum an. Est ne magna primis adolescens.

    The title prefix that is automatically inserted by asciidoc(1) can be customized with the caption attribute (xhtml11 and html4 backends). For example

    [caption="Example 1: "]
    .An example with a custom caption
    =====================================================================
    Qui in magna commodo, est labitur dolorum an. Est ne magna primis
    adolescens.
    =====================================================================

    12.9. Admonition Blocks

    The ExampleBlock definition includes a set of admonition styles (NOTE, TIP, IMPORTANT, WARNING, CAUTION) for generating admonition blocks (admonitions containing more than just a simple paragraph). Just precede the ExampleBlock with an attribute list containing the admonition style name. For example:

    [NOTE]
    .A NOTE block
    =====================================================================
    Qui in magna commodo, est labitur dolorum an. Est ne magna primis
    adolescens.
    
    . Fusce euismod commodo velit.
    . Vivamus fringilla mi eu lacus.
      .. Fusce euismod commodo velit.
      .. Vivamus fringilla mi eu lacus.
    . Donec eget arcu bibendum
      nunc consequat lobortis.
    =====================================================================

    Renders:

    Note
    A NOTE block

    Qui in magna commodo, est labitur dolorum an. Est ne magna primis adolescens.

    1. Fusce euismod commodo velit.

    2. Vivamus fringilla mi eu lacus.

      1. Fusce euismod commodo velit.

      2. Vivamus fringilla mi eu lacus.

    3. Donec eget arcu bibendum nunc consequat lobortis.

    13. Lists

    List types
    • Bulleted lists. Also known as itemized or unordered lists.

    • Numbered lists. Also called ordered lists.

    • Labeled lists. Sometimes called variable or definition lists.

    • Callout lists (a list of callout annotations).

    List behavior
    • Indentation is optional and does not determine nesting, indentation does however make the source more readable.

    • A nested list must use a different syntax from its parent so that asciidoc(1) can distinguish the start of a nested list.

    • By default lists of the same type can only be nested two deep; this could be increased by defining new list definitions.

    • In addition to nested lists a list item will include immediately following Literal paragraphs.

    • Use List Item Continuation to include other block elements in a list item.

    • The listindex intrinsic attribute is the current list item index (1..). If this attribute is not inside a list then it's value is the number of items in the most recently closed list. Useful for displaying the number of items in a list.

    13.1. Bulleted and Numbered Lists

    Bulleted list items start with a dash or an asterisk followed by a space or tab character. Bulleted list syntaxes are:

    - List item.
    * List item.

    Numbered list items start with an optional number or letter followed by a period followed by a space or tab character. List numbering is optional. Numbered list syntaxes are:

    .  Integer numbered list item.
    1. Integer numbered list item with optional numbering.
    .. Lowercase letter numbered list item.
    a. Lowercase letter numbered list item with optional numbering.

    Here are some examples:

    - Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
      * Fusce euismod commodo velit.
      * Qui in magna commodo, est labitur dolorum an. Est ne magna primis
        adolescens. Sit munere ponderum dignissim et. Minim luptatum et
        vel.
      * Vivamus fringilla mi eu lacus.
      * Donec eget arcu bibendum nunc consequat lobortis.
    - Nulla porttitor vulputate libero.
      . Fusce euismod commodo velit.
      . Vivamus fringilla mi eu lacus.
        .. Fusce euismod commodo velit.
        .. Vivamus fringilla mi eu lacus.
      . Donec eget arcu bibendum nunc consequat lobortis.
    - Praesent eget purus quis magna eleifend eleifend.
      1. Fusce euismod commodo velit.
        a. Fusce euismod commodo velit.
        b. Vivamus fringilla mi eu lacus.
        c. Donec eget arcu bibendum nunc consequat lobortis.
      2. Vivamus fringilla mi eu lacus.
      3. Donec eget arcu bibendum nunc consequat lobortis.
      4. Nam fermentum mattis ante.

    Which render as:

    • Lorem ipsum dolor sit amet, consectetuer adipiscing elit.

      • Fusce euismod commodo velit.

      • Qui in magna commodo, est labitur dolorum an. Est ne magna primis adolescens. Sit munere ponderum dignissim et. Minim luptatum et vel.

      • Vivamus fringilla mi eu lacus.

      • Donec eget arcu bibendum nunc consequat lobortis.

    • Nulla porttitor vulputate libero.

      1. Fusce euismod commodo velit.

      2. Vivamus fringilla mi eu lacus.

        1. Fusce euismod commodo velit.

        2. Vivamus fringilla mi eu lacus.

      3. Donec eget arcu bibendum nunc consequat lobortis.

    • Praesent eget purus quis magna eleifend eleifend.

      1. Fusce euismod commodo velit.

        1. Fusce euismod commodo velit.

        2. Vivamus fringilla mi eu lacus.

        3. Donec eget arcu bibendum nunc consequat lobortis.

      2. Vivamus fringilla mi eu lacus.

      3. Donec eget arcu bibendum nunc consequat lobortis.

      4. Nam fermentum mattis ante.

    13.2. Vertical Labeled Lists

    Labeled list items consist of one or more text labels followed the text of the list item.

    An item label begins a line with an alphanumeric character hard against the left margin and ends with a double colon :: or semi-colon ;;.

    The list item text consists of one or more lines of text starting on the line immediately following the label and can be followed by nested List or ListParagraph elements. Item text can be optionally indented.

    Here are some examples:

    Lorem::
      Fusce euismod commodo velit.
    
      Fusce euismod commodo velit.
    
    Ipsum::
      Vivamus fringilla mi eu lacus.
      * Vivamus fringilla mi eu lacus.
      * Donec eget arcu bibendum nunc consequat lobortis.
    Dolor::
      Donec eget arcu bibendum nunc consequat lobortis.
      Suspendisse;;
        A massa id sem aliquam auctor.
      Morbi;;
        Pretium nulla vel lorem.
      In;;
        Dictum mauris in urna.

    Which render as:

    Lorem

    Fusce euismod commodo velit.

    Fusce euismod commodo velit.
    Ipsum

    Vivamus fringilla mi eu lacus.

    • Vivamus fringilla mi eu lacus.

    • Donec eget arcu bibendum nunc consequat lobortis.

    Dolor

    Donec eget arcu bibendum nunc consequat lobortis.

    Suspendisse

    A massa id sem aliquam auctor.

    Morbi

    Pretium nulla vel lorem.

    In

    Dictum mauris in urna.

    13.3. Horizontal Labeled Lists

    Horizontal labeled lists differ from vertical labeled lists in that the label and the list item sit side-by-side as opposed to the item under the label. Item text must begin on the same line as the label although you can begin item text on the next line if you follow the label with a backslash.

    The following horizontal list example also illustrates the omission of optional indentation:

    *Lorem*:: Fusce euismod commodo velit.  Qui in magna commodo, est
    labitur dolorum an. Est ne magna primis adolescens.
    
      Fusce euismod commodo velit.
    
    *Ipsum*:: Vivamus fringilla mi eu lacus.
    - Vivamus fringilla mi eu lacus.
    - Donec eget arcu bibendum nunc consequat lobortis.
    
    *Dolor*:: \
      - Vivamus fringilla mi eu lacus.
      - Donec eget arcu bibendum nunc consequat lobortis.

    Which render as:

    Lorem Fusce euismod commodo velit. Qui in magna commodo, est labitur dolorum an. Est ne magna primis adolescens.
    Fusce euismod commodo velit.
    Ipsum Vivamus fringilla mi eu lacus.
    • Vivamus fringilla mi eu lacus.

    • Donec eget arcu bibendum nunc consequat lobortis.

    Dolor
    • Vivamus fringilla mi eu lacus.

    • Donec eget arcu bibendum nunc consequat lobortis.

    Warning
    • Use vertical labeled lists in preference to horizontal labeled lists — current PDF toolchains do not make a good job of determining the relative column widths.

    • If you are generating DocBook markup the horizontal labeled lists should not be nested because the DocBook XML V4.2 DTD does not permit nested informal tables (although DocBook XSL Stylesheets process them correctly).

    13.4. Question and Answer Lists

    AsciiDoc comes pre-configured with a labeled list for generating DocBook question and answer (Q&A) lists (?? label delimiter). Example:

    Question one??
            Answer one.
    Question two??
            Answer two.

    Renders:

    1. Question one

      Answer one.

    2. Question two

      Answer two.

    13.5. Glossary Lists

    AsciiDoc comes pre-configured with a labeled list (:- label delimiter) for generating DocBook glossary lists. Example:

    A glossary term:-
        The corresponding definition.
    A second glossary term:-
        The corresponding definition.

    For working examples see the article.txt and book.txt documents in the AsciiDoc ./doc distribution directory.

    Note
    To generate valid DocBook output glossary lists must be located in a glossary section.

    13.6. Bibliography Lists

    AsciiDoc comes with a predefined itemized list (+ item bullet) for generating bibliography entries. Example:

    + [[[taoup]]] Eric Steven Raymond. 'The Art of UNIX
      Programming'. Addison-Wesley. ISBN 0-13-142901-9.
    + [[[walsh-muellner]]] Norman Walsh & Leonard Muellner.
      'DocBook - The Definitive Guide'. O'Reilly & Associates.
      1999. ISBN 1-56592-580-7.

    The [[[<reference>]]] syntax is a bibliography entry anchor, it generates an anchor named <reference> and additionally displays [<reference>] at the anchor position. For example [[[taoup]]] generates an anchor named taoup that displays [taoup] at the anchor position. Cite the reference from elsewhere your document using <<taoup>>, this displays a hyperlink ([taoup]) to the corresponding bibliography entry anchor.

    For working examples see the article.txt and book.txt documents in the AsciiDoc ./doc distribution directory.

    Note
    To generate valid DocBook output bibliography lists must be located in a bibliography section.

    13.7. List Item Continuation

    To include subsequent block elements in list items (in addition to implicitly included nested lists and Literal paragraphs) place a separator line containing a single plus character between the list item and the ensuing list continuation element. Multiple block elements (excluding section Titles and BlockTitles) may be included in a list item using this technique. For example:

    Here's an example of list item continuation:

    1. List item one.
    +
    List item one continued with a second paragraph followed by an
    Indented block.
    +
    .................
    $ ls *.sh
    $ mv *.sh ~/tmp
    .................
    +
    List item one continued with a third paragraph.
    
    2. List item two.
    
       List item two literal paragraph (no continuation required).
    
    -  Nested list (item one).
    
       Nested list literal paragraph (no continuation required).
    +
    Nested list appended list item one paragraph
    
    -  Nested list item two.

    Renders:

    1. List item one.

      List item one continued with a second paragraph followed by a Listing block.

      $ ls *.sh
      $ mv *.sh ~/tmp

      List item one continued with a third paragraph.

    2. List item two.

      List item two literal paragraph (no continuation required).
      • Nested list (item one).

        Nested list literal paragraph (no continuation required).

        Nested list appended list item one paragraph

      • Nested list item two.

    13.8. List Block

    A List block is a special delimited block containing a list element.

    • All elements between in the List Block are part of the preceding list item. In this respect the List block behaves like List Item Continuation except that list items contained within the block do not require explicit + list item continuation lines:

    • The block delimiter is a single line containing two dashes.

    • Any block title or attributes are passed to the first element inside the block.

    The List Block is useful for:

    1. Lists with long multi-element list items.

    2. Nesting a list within a parent list item (by default nested lists follow the preceding list item).

    Here's an example of a nested list block:

    .Nested List Block
    1. List item one.
    +
    This paragraph is part of the preceding list item
    +
    --
    a. This list is nested and does not require explicit item continuation.
    
    This paragraph is part of the preceding list item
    
    b. List item b.
    
    This paragraph belongs to list item b.
    --
    +
    This paragraph belongs to item 1.
    
    2. Item 2 of the outer list.

    Renders:

    Nested List Block
    1. List item one.

      This paragraph is part of the preceding list item

      1. This list is nested and does not require explicit item continuation.

        This paragraph is part of the preceding list item

      2. List item b.

        This paragraph belongs to list item b.

      This paragraph belongs to item 1.

    2. Item 2 of the outer list.

    14. Footnotes

    The shipped AsciiDoc configuration includes the footnote:[<text>] inline macro for generating footnotes. The footnote text can span multiple lines. Example footnote:

    A footnote footnote:[An example footnote.]

    Which renders:

    A footnote
    [An example footnote.]

    Footnotes are primarily useful when generating DocBook output — DocBook conversion programs render footnote outside the primary text flow.

    15. Indexes

    The shipped AsciiDoc configuration includes the inline macros for generating document index entries.

    indexterm:[<primary>,<secondary>,<tertiary>]
    (((<primary>,<secondary>,<tertiary>)))

    This inline macro generates an index term (the <secondary> and <tertiary> attributes are optional). For example indexterm:[Tigers,Big cats] (or, using the alternative syntax (((Tigers,Big cats))). Index terms that have secondary and tertiary entries also generate separate index terms for the secondary and tertiary entries. The index terms appear in the index, not the primary text flow.

    indexterm2:[<primary>]
    ((<primary>))

    This inline macro generates an index term that appears in both the index and the primary text flow. The <primary> should not be padded to the left or right with white space characters.

    For working examples see the article.txt and book.txt documents in the AsciiDoc ./doc distribution directory.

    Note
    Index entries only really make sense if you are generating DocBook markup — DocBook conversion programs automatically generate an index at the point an Index section appears in source document.

    16. Callouts

    Callouts are a mechanism for annotating verbatim text (source code, computer output and user input for example). Callout markers are placed inside the annotated text while the actual annotations are presented in a callout list after the annotated text. Here's an example:

    .MS-DOS directory listing
    .....................................................
    10/17/97   9:04         <DIR>    bin
    10/16/97  14:11         <DIR>    DOS            <1>
    10/16/97  14:40         <DIR>    Program Files
    10/16/97  14:46         <DIR>    TEMP
    10/17/97   9:04         <DIR>    tmp
    10/16/97  14:37         <DIR>    WINNT
    10/16/97  14:25             119  AUTOEXEC.BAT   <2>
     2/13/94   6:21          54,619  COMMAND.COM    <2>
    10/16/97  14:25             115  CONFIG.SYS     <2>
    11/16/97  17:17      61,865,984  pagefile.sys
     2/13/94   6:21           9,349  WINA20.386     <3>
    .....................................................
    
    <1> This directory holds MS-DOS.
    <2> System startup code for DOS.
    <3> Some sort of Windows 3.1 hack.

    Which renders:

    MS-DOS directory listing
    10/17/97   9:04         <DIR>    bin
    10/16/97  14:11         <DIR>    DOS            (1)
    10/16/97  14:40         <DIR>    Program Files
    10/16/97  14:46         <DIR>    TEMP
    10/17/97   9:04         <DIR>    tmp
    10/16/97  14:37         <DIR>    WINNT
    10/16/97  14:25             119  AUTOEXEC.BAT   (2)
     2/13/94   6:21          54,619  COMMAND.COM    (2)
    10/16/97  14:25             115  CONFIG.SYS     (2)
    11/16/97  17:17      61,865,984  pagefile.sys
     2/13/94   6:21           9,349  WINA20.386     (3)
    1. This directory holds MS-DOS.

    2. System startup code for DOS.

    3. Some sort of Windows 3.1 hack.

    Explanation
    • The callout marks are whole numbers enclosed in angle brackets that refer to an item index in the following callout list.

    • By default callout marks are confined to LiteralParagraphs, LiteralBlocks and ListingBlocks (although this is a configuration file option and can be changed).

    • Callout list item numbering is fairly relaxed — list items can start with <n>, n> or > where n is the optional list item number (in the latter case list items starting with a single > character are implicitly numbered starting at one).

    • Callout lists should not be nested — start list items hard against the left margin.

    • If you want to present a number inside angle brackets you'll need to escape it with a backslash to prevent it being interpreted as a callout mark.

    Note
    To include callout icons in PDF files generated by a2x(1) you need to use the —icons command-line option.

    16.1. Implementation Notes

    Callout marks are generated by the callout inline macro while callout lists are generated using the callout list definition. The callout macro and callout list are special in that they work together. The callout inline macro is not enabled by the normal macros substitutions option, instead it has its own callouts substitution option.

    The following attributes are available during inline callout macro substitution:

    {index}

    The callout list item index inside the angle brackets.

    {coid}

    An identifier formatted like CO<listnumber>-<index> that uniquely identifies the callout mark. For example CO2-4 identifies the fourth callout mark in the second set of callout marks.

    The {coids} attribute can be used during callout list item substitution — it is a space delimited list of callout IDs that refer to the explanatory list item.

    16.2. Including callouts in included code

    You can annotate working code examples with callouts — just remember to put the callouts inside source code comments. This example displays the test.py source file (containing a single callout) using the Source Code Highlighter Filter:

    Example: AsciiDoc source
     [source,python]
     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     include::test.py[]
     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
     <1> Print statement.
    Example: Included test.py source
    print 'Hello World!'   # <1>

    17. Macros

    Macros are a mechanism for substituting parametrized text into output documents.

    Macros have a name, a single target argument and an attribute list. The default syntax is <name>:<target>[<attributelist>] (for inline macros) and <name>::<target>[<attributelist>] (for block macros). Here are some examples:

    http://www.methods.co.nz/asciidoc/index.html[Asciidoc home page]
    include::chapt1.txt[tabsize=2]
    mailto:srackham@gmail.com[]
    Macro behavior
    • <name> is the macro name. It can only contain letters, digits or dash characters and cannot start with a dash.

    • The optional <target> cannot contain white space characters.

    • <attributelist> is a list of attributes enclosed in square brackets.

    • The attribute list is mandatory except for URLs and email addresses.

    • Expansion of non-system macro references can be escaped by prefixing a backslash character.

    • Block macro attribute reference substitution is performed prior to macro expansion.

    • The substitutions performed prior to Inline macro macro expansion are determined by the inline context.

    • Macros are processed in the order they appear in the configuration file(s).

    • Calls to inline macros can be nested inside different inline macros (an inline macro call cannot contain a nested call to itself).

    17.1. Inline Macros

    Inline Macros occur in an inline element context. Predefined Inline macros include URLs, image and link macros.

    17.1.1. URLs

    http, https, ftp, file, mailto and callto URLs are rendered using predefined inline macros.

    • If you don't need a customized the link caption you can enter the http, https, ftp, file URLs and email addresses without any special macro syntax.

    • If no caption text is specified the URL is displayed.

    Here are some examples:

    http://www.methods.co.nz/asciidoc/[The AsciiDoc home page]
    http://www.methods.co.nz/asciidoc/
    mailto:joe.bloggs@foobar.com[email Joe Bloggs]
    joe.bloggs@foobar.com
    callto:joe.bloggs[]

    Which are rendered:

    • If the <target> necessitates space characters they should be replaced by %20. For example large%20image.png.

    • Define an attribute entry if you refer to the same URL more than once, this will make your document easier to maintain and easier to read.

    17.1.2. Internal Cross References

    Two AsciiDoc inline macros are provided for creating hypertext links within an AsciiDoc document. You can use either the standard macro syntax or the (preferred) alternative.

    anchor

    Used to specify hypertext link targets:

    [[<id>,<xreflabel>]]
    anchor:<id>[<xreflabel>]

    The <id> is a unique identifier that must begin with a letter. The optional <xreflabel> is the text to be displayed by captionless xref macros that refer to this anchor. The optional <xreflabel> is only really useful when generating DocBook output. Example anchor:

    [[X1]]

    You may have noticed that the syntax of this inline element is the same as that of the BlockId block element, this is no coincidence since they are functionally equivalent.

    xref

    Creates a hypertext link to a document anchor.

    <<<id>,<caption>>>
    xref:<id>[<caption>]

    The <id> refers to an existing anchor <id>. The optional <caption> is the link's displayed text. Example:

    <<X21,attribute lists>>

    If <caption> is not specified then the displayed text is auto-generated:

    • The AsciiDoc xhtml11 backend displays the <id> enclosed in square brackets.

    • If DocBook is produced the DocBook toolchain is responsible for the displayed text which will normally be the referenced figure, table or section title number followed by the element's title text.

    Here is an example:

    [[tiger_image]]
    .Tyger tyger
    image::tiger.png[]
    
    This can be seen in <<tiger_image>>.

    17.1.3. Linking to Local Documents

    Hypertext links to files on the local file system are specified using the link inline macro.

    link:<target>[<caption>]

    The link macro generates relative URLs. The link macro <target> is the target file name (relative to the file system location of the referring document). The optional <caption> is the link's displayed text. If <caption> is not specified then <target> is displayed. Example:

    link:downloads/foo.zip[download foo.zip]

    You can use the <filename>#<id> syntax to refer to an anchor within a target document but this usually only makes sense when targeting HTML documents.

    Images can serve as hyperlinks using the image macro.

    17.1.4. Images

    Inline images are inserted into the output document using the image macro. The inline syntax is:

    image:<target>[<attributes>]

    The contents of the image file <target> is displayed. To display the image its file format must be supported by the target backend application. HTML and DocBook applications normally support PNG or JPG files.

    <target> file name paths are relative to the location of the referring document.

    Image macro attributes
    • The optional first positional attribute list entry specifies the alternative text which is displayed if the output application is unable to process the image file. For example:

      image:images/logo.png[Company Logo]
    • The optional width and height attributes scale the image size and can be used in any combination. The units are pixels. The following example scales the previous example to a height of 32 pixels:

      image:images/logo.png["Company Logo",height=32]
    • The optional link attribute is used to link the image to an external document. The following example links a screenshot thumbnail to a full size version:

      image:screen-thumbnail.png[height=32,link="screen.png"]
    • The optional scaledwidth attribute is only used in DocBook block images (specifically for PDF documents). The following example scales the images to 75% of the available print width:

      image::images/logo.png["Company Logo",scaledwidth="75%"]
    • The optional align attribute is used for horizontal image alignment in DocBook block images (specifically for PDF documents). Allowed values are center, left and right. For example:

      image::images/tiger.png["Tiger image",align="left"]

    17.2. Block Macros

    A Block macro reference must be contained in a single line separated either side by a blank line or a block delimiter.

    Block macros behave just like Inline macros, with the following differences:

    • They occur in a block context.

    • The default syntax is <name>::<target>[<attributelist>] (two colons, not one).

    • Markup template section names end in -blockmacro instead of -inlinemacro.

    17.2.1. Block Identifier

    The Block Identifier macro sets the id attribute and has the same syntax as the anchor inline macro since it performs essentially the same function — block templates employ the id attribute as a block link target. For example:

    [[X30]]

    This is equivalent to the [id="X30"] block attribute list.

    17.2.2. Images

    Formal titled images are inserted into the output document using the image macro. The syntax is:

    image::<target>[<attributes>]

    The block image macro has the same macro attributes as its inline counterpart.

    Images can be titled by preceding the image macro with a BlockTitle. DocBook toolchains normally number examples and generate a List of Figures backmatter section.

    For example:

    .Main circuit board
    image::images/layout.png[J14P main circuit board]

    xhtml11 and html4 backends precede the title with a Figure : prefix. You can customize this prefix with the caption attribute. For example:

    .Main circuit board
    [caption="Figure 2:"]
    image::images/layout.png[J14P main circuit board]

    17.2.3. Comment Lines

    Single lines starting with two forward slashes hard up against the left margin are treated as comments and are stripped from the output. Comment lines have been implemented as a block macro and are only valid in a block context — they are not treated as comments inside paragraphs or delimited blocks. Example comment line:

    // This is a comment.

    See also Comment Blocks.

    17.3. System Macros

    System macros are block macros that perform a predefined task which is hardwired into the asciidoc(1) program.

    • You can't escape system macros with a leading backslash character (as you can with other macros).

    • The syntax and tasks performed by system macros is built into asciidoc(1) so they don't appear in configuration files. You can however customize the syntax by adding entries to a configuration file [macros] section.

    17.3.1. Include Macros

    The include and include1 system macros to include the contents of a named file into the source document.

    The include macro includes a file as if it were part of the parent document — tabs are expanded and system macros processed. The contents of include1 files are not subject to tab expansion or system macro processing nor are attribute or lower priority substitutions performed. The include1 macro's main use is to include verbatim embedded CSS or scripts into configuration file headers. Example:

     include::chapter1.txt[tabsize=4]
    Include macro behavior
    • If the included file name is specified with a relative path then the path is relative to the location of the referring document.

    • Include macros can appear inside configuration files.

    • Files included from within DelimitedBlocks are read to completion to avoid false end-of-block underline termination.

    • File inclusion is limited to a depth of 5 to catch recursive loops.

    • Attribute references are expanded inside the include target; if an attribute is undefined then the included file is silently skipped.

    • The tabsize macro attribute sets the number of space characters to be used for tab expansion in the included file.

    • Internally the include1 macro is translated to the include1 system attribute which means it must be evaluated in a region where attribute substitution is enabled — use the include macro instead.

    17.3.2. Conditional Inclusion Macros

    Lines of text in the source document can be selectively included or excluded from processing based on the existence (or not) of a document attribute. There are two forms of conditional inclusion macro usage, the first includes document text between the ifdef and endif macros if a document attribute is defined:

    ifdef::<attribute>[]
    :
    endif::<attribute>[]

    The second for includes document text between the ifndef and endif macros if the attribute is not defined:

    ifndef::<attribute>[]
    :
    endif::<attribute>[]

    <attribute> is an attribute name which is optional in the trailing endif macro.

    Take a look at the *.conf configuration files in the AsciiDoc distribution for examples of conditional inclusion macro usage.

    17.3.3. eval, sys and sys2 System Macros

    These block macros exhibit the same behavior as their same named system attribute references. The difference is that system macros occur in a block macro context whereas system attributes are confined to an inline context where attribute substitution is enabled.

    The following example displays a long directory listing inside a literal block:

    ------------------
    sys::[ls -l *.txt]
    ------------------

    17.3.4. Template System Macro

    The template block macro allows the inclusion of one configuration file template section within another. The following example includes the [admonitionblock] section in the [admonitionparagraph] section:

    [admonitionparagraph]
    template::[admonitionblock]
    Template macro behavior
    • The template::[] macro is useful for factoring configuration file markup.

    • template::[] macros cannot be nested.

    • template::[] macro expansion is applied to all sections after all configuration files have been read.

    17.4. Macro Definitions

    Each entry in the configuration [macros] section is a macro definition which can take one of the following forms:

    <pattern>=<name>

    Inline macro definition.

    <pattern>=#<name>

    Block macro definition.

    <pattern>=+<name>

    System macro definition.

    <pattern>

    Delete the existing macro with this <pattern>.

    <pattern> is a Python regular expression and <name> is the name of a markup template. If <name> is omitted then it is the value of the regular expression match group named name.

    Here's what happens during macro substitution
    • Each contextually relevant macro pattern from the [macros] section is matched against the input source line.

    • If a match is found the text to be substituted is loaded from a configuration markup template section named like <name>-inlinemacro or <name>-blockmacro (depending on the macro type).

    • Global and macro attribute list attributes are substituted in the macro's markup template.

    • The substituted template replaces the macro reference in the output document.

    18. Tables

    Tables are the most complex AsciiDoc elements and this section is quite long.
    [The current table syntax is overly complicated and unwieldy to edit, hopefully a more usable syntax will appear in future versions of AsciiDoc.]

    Note
    AsciiDoc generates nice HTML tables, but the current crop of DocBook toolchains render tables with varying degrees of success. Use tables only when really necessary.

    18.1. Example Tables

    The following annotated examples are all you'll need to start creating your own tables.

    The only non-obvious thing you'll need to remember are the column stop characters:

    • Backtick (`) — align left.

    • Single quote (') — align right.

    • Period (.) — align center.

    Simple table:

     `---`---
     1   2
     3   4
     5   6
     --------

    Output:

    1 2
    3 4
    5 6

    Table with title, header and footer:

     .An example table
     [grid="all"]
     '---------.--------------
     Column 1   Column 2
     -------------------------
     1          Item 1
     2          Item 2
     3          Item 3
     -------------------------
     6          Three items
     -------------------------

    Output:

    Table: An example table
    Column 1 Column 2
    6 Three items
    1 Item 1
    2 Item 2
    3 Item 3

    Four columns totaling 15% of the pagewidth, CSV data:

    [frame="all"]
    ````~15
    1,2,3,4
    a,b,c,d
    A,B,C,D
    ~~~~~~~~

    Output:

    1 2 3 4
    a b c d
    A B C D

    A table with a numeric ruler and externally sourced CSV data:

     [frame="all", grid="all"]
     .15`20`25`20`~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     ID,Customer Name,Contact Name,Customer Address,Phone
     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     include::customers.csv[]
     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Renders:

    ID Customer Name Contact Name Customer Address Phone
    AROUT Around the Horn Thomas Hardy 120 Hanover Sq.
    London
    (171) 555-7788
    BERGS Berglunds snabbkop Christina Berglund Berguvsvagen 8
    Lulea
    0921-12 34 65
    BLAUS Blauer See Delikatessen Hanna Moos Forsterstr. 57
    Mannheim
    0621-08460
    BLONP Blondel pere et fils Frederique Citeaux 24, place Kleber
    Strasbourg
    88.60.15.31
    BOLID Bolido Comidas preparadas Martin Sommer C/ Araquil, 67
    Madrid
    (91) 555 22 82
    BONAP Bon app' Laurence Lebihan 12, rue des Bouchers
    Marseille
    91.24.45.40
    BOTTM Bottom-Dollar Markets Elizabeth Lincoln 23 Tsawassen Blvd.
    Tsawassen
    (604) 555-4729
    BSBEV B's Beverages Victoria Ashworth Fauntleroy Circus
    London
    (171) 555-1212
    CACTU Cactus Comidas para llevar Patricio Simpson Cerrito 333
    Buenos Aires
    (1) 135-5555

    18.2. AsciiDoc Table Block Elements

    This sub-section details the AsciiDoc table format.

    Table  ::= (Ruler,Header?,Body,Footer?)
    Header ::= (Row+,Underline)
    Footer ::= (Row+,Underline)
    Body   ::= (Row+,Underline)
    Row    ::= (Data+)

    A table is terminated when the table underline is followed by a blank line or an end of file. Table underlines which separate table headers, bodies and footers should not be followed by a blank line.

    18.2.1. Ruler

    The first line of the table is called the Ruler. The Ruler specifies which configuration file table definition to use, column widths, column alignments and the overall table width.

    There are two ruler formats:

    Character ruler

    The column widths are determined by the number of table fill characters between column stop characters.

    Numeric ruler

    The column widths are specified numerically. If a column width is omitted the previous width is used. In the degenerate case of no widths being specified columns are allocated equal widths.

    The ruler format can be summarized as:

    ruler ::= ((colstop,colwidth?,fillchar*)+, fillchar+, tablewidth?
    • The ruler starts with a column stop character (designating the start of the first column).

    • Column stop characters specify the start and alignment of each column:

      • Backtick (`) — align left.

      • Single quote (') — align right.

      • Period (.) — align center.

    • In the case of fixed format tables the ruler column widths specify source row data column boundaries.

    • The optional tablewidth is a number representing the size of the output table relative to the pagewidth. If tablewidth is less than one then it is interpreted as a fraction of the page width; if it is greater than one then it is interpreted as a percentage of the page width. If tablewidth is not specified then the table occupies the full pagewidth (numeric rulers) or the relative width of the ruler compared to the textwidth (character rulers).

    18.2.2. Row and Data Elements

    Each table row consists of a line of text containing the same number of Data items as there are columns in the table,

    Lines ending in a backslash character are continued on the next line.

    Each Data item is an AsciiDoc substitutable string. The substitutions performed are specified by the subs table definition entry. Data cannot contain AsciiDoc block elements.

    The format of the row is determined by the table definition format value:

    fixed

    Row data items are assigned by chopping the row up at ruler column width boundaries.

    csv

    Data items are assigned the parsed CSV (Comma Separated Values) data.

    dsv

    The DSV (Delimiter Separated Values) format is a common UNIX tabular text file format.

    • The separator character is a colon (although this can be set to any letter using the separator table attribute).

    • Common C-style backslash escapes are supported.

    • Blank lines are skipped.

    18.2.3. Underline

    A table Underline consists of a line of three or more fillchar characters which are end delimiters for table header, footer and body sections.

    18.2.4. Attribute List

    The following optional table attributes can be specified in an AttributeList preceding the table:

    separator

    The default DSV format colon separator can be changed using the separator attribute. For example: [separator="|"].

    frame

    Defines the table border and can take the following values: topbot (top and bottom), all (all sides), none and sides (left and right sides). The default value is topbot.

    grid

    Defines which ruler lines are drawn between table rows and columns. The grid attribute value can be any of the following values: none, cols, rows and all. The default value is none. For example [frame="all", grid="none"].

    format, tablewidth

    See Markup Attributes below.

    You can also use an AttributeList to override the following table definition and ruler parameters: format, subs, tablewidth.

    18.2.5. Markup Attributes

    The following attributes are automatically available inside table tag and markup templates.

    cols

    The number of columns in the table.

    colalign

    Column alignment assumes one of three values (left, right or center). The value is determined by the corresponding ruler column stop character (only valid inside colspec, headdata, bodydata and footdata tags).

    colwidth

    The output column widths are calculated integers (only valid inside colspec, headdata, bodydata and footdata tags).

    colnumber

    The table column number starting at 1 (only valid inside colspec, 'headdata`, bodydata and footdata tags).

    format

    The table definition format value (can be overridden with attribute list entry).

    tablewidth

    The ruler tablewidth value (can be overridden with attribute list entry).

    pagewidth

    The pagewidth miscellaneous configuration option.

    pageunits

    The pageunits miscellaneous configuration option.

    The colwidth value is calculated as (N is the ruler column width number and M is the sum of the ruler column widths):

    ( N / M ) * pagewidth

    If the ruler tablewidth was specified the column width is multiplied again by this value.

    There is one exception: character rulers that have no pagewidth specified. In this case the colwidth value is calculated as (where N is the column character width measured on the table ruler):

    ( N / textwidth ) * pagewidth

    The following attributes are available to the table markup template:

    comspecs

    Expands to N substituted comspec tags where N is the number of columns.

    headrows, footrows, bodyrows

    These references expand to sets of substituted header, footer and body rows as defined by the corresponding row and data configuration parameters.

    rows

    Experimental attribute (number of source lines in table) available in table markup templates (used by experimental LaTeX backend).

    19. Manpage Documents

    Sooner or later, if you program for a UNIX environment, you're going to have to write a man page.

    By observing a couple of additional conventions you can compose AsciiDoc files that will translate to a DocBook refentry (man page) document. The resulting DocBook file can then be translated to the native roff man page format (or other formats).

    For example, the asciidoc.1.txt file in the AsciiDoc distribution ./doc directory was used to generate both the asciidoc.1.css-embedded.html HTML file the asciidoc.1 roff formatted asciidoc(1) man page.

    To find out more about man pages view the man(7) manpage (man 7 man and man man-pages commands).

    19.1. Document Header

    A document Header is mandatory. The title line contains the man page name followed immediately by the manual section number in brackets, for example ASCIIDOC(1). The title name should not contain white space and the manual section number is a single digit optionally followed by a single character.

    19.2. The NAME Section

    The first manpage section is mandatory, must be titled NAME and must contain a single paragraph (usually a single line) consisting of a list of one or more comma separated command name(s) separated from the command purpose by a dash character. The dash must have at least one white space character on either side. For example:

    printf, fprintf, sprintf - print formatted output

    19.3. The SYNOPSIS Section

    The second manpage section is mandatory and must be titled SYNOPSIS.

    19.4. refmiscinfo attributes

    In addition to the automatically created man page intrinsic attributes you can assign DocBook refmiscinfo element source, version and manual values using AsciiDoc {mansource}, {manversion} and {manmanual} attributes respectively. This example is from the AsciiDoc header of a man page source file:

    :man source:   AsciiDoc
    :man version:  {revision}
    :man manual:   AsciiDoc Manual

    20. Configuration Files

    AsciiDoc source file syntax and output file markup is largely controlled by a set of cascading, text based, configuration files. At runtime The AsciiDoc default configuration files are combined with optional user and document specific configuration files.

    20.1. Configuration File Format

    Configuration files contain named sections. Each section begins with a section name in square brackets []. The section body consists of the lines of text between adjacent section headings.

    • Section names consist of one or more alphanumeric, underscore or dash characters and cannot begin or end with a dash.

    • Lines starting with a hash character "#" are treated as comments and ignored.

    • Same named sections and section entries override previously loaded sections and section entries (this is sometimes referred to as cascading). Consequently, downstream configuration files need only contain those sections and section entries that need to be overridden.

    Tip
    When creating custom configuration files you only need to include the sections and entries that differ from the default configuration.
    Tip
    The best way to learn about configuration files is to read the default configuration files in the AsciiDoc distribution in conjunction with asciidoc(1) output files. You can view configuration file load sequence by turning on the asciidoc(1) -v (—verbose) command-line option.

    20.2. Markup Template Sections

    Markup template sections supply backend markup for translating AsciiDoc elements. Since the text is normally backend dependent you'll find these sections in the backend specific configuration files. A markup template section body can contain:

    • Backend markup

    • Attribute references

    • System macro calls.

    • A document content placeholder

    The document content placeholder is a single | character and is replaced by text from the source element. Use the {brvbar} attribute reference if you need a literal | character in the template.

    20.3. Special Sections

    AsciiDoc reserves the following predefined special section names for specific purposes:

    miscellaneous

    Configuration options that don't belong anywhere else.

    attributes

    Attribute name/value entries.

    specialcharacters

    Special characters reserved by the backend markup.

    tags

    Backend markup tags.

    quotes

    Definitions for quoted inline character formatting.

    specialwords

    Lists of words and phrases singled out for special markup.

    replacements, replacements2

    Find and replace substitution definitions.

    specialsections

    Used to single out special section names for specific markup.

    macros

    Macro syntax definitions.

    titles

    Heading, section and block title definitions.

    paradef*

    Paragraph element definitions.

    blockdef*

    DelimitedBlock element definitions.

    listdef*

    List element definitions.

    tabledef*

    Table element definitions.

    Each line of text in a special section is a section entry. Section entries share the following syntax:

    name=value

    The entry value is set to value.

    name=

    The entry value is set to a zero length string.

    name

    The entry is undefined (deleted from the configuration).

    Section entry behavior
    • All equals characters inside the name must be escaped with a backslash character.

    • name and value are stripped of leading and trailing white space.

    • Attribute names, tag entry names and markup template section names consist of one or more alphanumeric, underscore or dash characters. Names should not begin or end with a dash.

    • A blank configuration file section (one without any entries) deletes any preceding section with the same name (applies to non-markup template sections).

    20.3.1. Miscellaneous

    The optional [miscellaneous] section specifies the following name=value options:

    newline

    Output file line termination characters. Can include any valid Python string escape sequences. The default value is \r\n (carriage return, line feed). Should not be quoted or contain explicit spaces (use \x20 instead). For example:

    $ asciidoc -a 'newline=\n' -b docbook mydoc.txt
    outfilesuffix

    The default extension for the output file, for example outfilesuffix=.html. Defaults to backend name.

    tabsize

    The number of spaces to expand tab characters, for example tabsize=4. Defaults to 8. A tabsize of zero suppresses tab expansion (useful when piping included files through block filters). Included files can override this option using the tabsize attribute.

    textwidth, pagewidth, pageunits

    These global table related options are documented in the Table Configuration File Definitions sub-section.

    Note
    [miscellaneous] configuration file entries can be set using the asciidoc(1) -a (—attribute) command-line option.

    20.3.2. Titles

    sectiontitle

    Two line section title pattern. The entry value is a Python regular expression containing the named group title.

    underlines

    A comma separated list of document and section title underline character pairs starting with the section level 0 and ending with section level 4 underline. The default setting is:

    underlines="==","--","~~","^^","++"
    sect0…sect4

    One line section title patterns. The entry value is a Python regular expression containing the named group title.

    blocktitle

    BlockTitle element pattern. The entry value is a Python regular expression containing the named group title.

    subs

    A comma separated list of substitutions that are performed on the document header and section titles. Defaults to normal substitution.

    20.3.3. Tags

    The [tags] section contains backend tag definitions (one per line). Tags are used to translate AsciiDoc elements to backend markup.

    An AsciiDoc tag definition is formatted like <tagname>=<starttag>|<endtag>. For example:

    emphasis=<em>|</em>

    In this example asciidoc(1) replaces the | character with the emphasized text from the AsciiDoc input file and writes the result to the output file.

    Use the {brvbar} attribute reference if you need to include a | pipe character inside tag text.

    20.3.4. Attributes Section

    The optional [attributes] section contains predefined attributes.

    If the attribute value requires leading or trailing spaces then the text text should be enclosed in double-quote (") characters.

    To delete a attribute insert a name only entry in a downstream configuration file or use the asciidoc(1) —attribute name! command-line option (the attribute name is suffixed with a ! character to delete it).

    20.3.5. Special Characters

    The [specialcharacters] section specifies how to escape characters reserved by the backend markup. Each translation is specified on a single line formatted like:

    special_character=translated_characters

    Special characters are normally confined to those that resolve markup ambiguity (in the case of SGML/XML markups the ampersand, less than and greater than characters). The following example causes all occurrences of the < character to be replaced by &lt;.

    <=&lt;

    20.3.6. Quoted Text

    Quoting is used primarily for text formatting. The [quotes] section defines AsciiDoc quoting characters and their corresponding backend markup tags. Each section entry value is the name of a of a [tags] section entry. The entry name is the character (or characters) that quote the text. The following examples are taken from AsciiDoc configuration files:

    [quotes]
    _=emphasis
    [tags]
    emphasis=<em>|</em>

    You can specify the left and right quote strings separately by separating them with a | character, for example:

    ``|''=quoted

    Omitting the tag will disable quoting, for example, if you don't want superscripts or subscripts put the following in a custom configuration file or edit the global asciidoc.conf configuration file:

    [quotes]
    ^=
    ~=

    Unconstrained quotes are differentiated by prefixing the tag name with a hash character, for example:

    __=#emphasis
    Quoted text behavior
    • Quote characters must be non-alphanumeric.

    • To minimize quoting ambiguity try not to use the same quote characters in different quote types.

    20.3.7. Special Words

    The [specialwords] section is used to single out words and phrases that you want to consistently format in some way throughout your document without having to repeatedly specify the markup. The name of each entry corresponds to a markup template section and the entry value consists of a list of words and phrases to be marked up. For example:

    [specialwords]
    strongwords=NOTE: IMPORTANT:
    [strongwords]
    <strong>{words}</strong>

    The examples specifies that any occurrence of NOTE: or IMPORTANT: should appear in a bold font.

    Words and word phrases are treated as Python regular expressions: for example, the word ^NOTE: would only match NOTE: if appeared at the start of a line.

    AsciiDoc comes with three built-in Special Word types: emphasizedwords, monospacedwords and strongwords, each has a corresponding (backend specific) markup template section. Edit the configuration files to customize existing Special Words and to add new ones.

    Special word behavior
    • Word list entries must be separated by space characters.

    • Word list entries with embedded spaces should be enclosed in quotation (") characters.

    • A [specialwords] section entry of the form name=word1 [word2…] adds words to existing name entries.

    • A [specialwords] section entry of the form name undefines (deletes) all existing name words.

    • Since word list entries are processed as Python regular expressions you need to be careful to escape regular expression special characters.

    • By default Special Words are substituted before Inline Macros, this may lead to undesirable consequences. For example the special word foobar would be expanded inside the macro call http://www.foobar.com. A possible solution is to emphasize whole words only by defining the word using regular expression characters, for example \bfoobar\b.

    • If the first matched character of a special word is a backslash then the remaining characters are output without markup i.e. the backslash can be used to escape special word markup. For example the special word \\?\b[Tt]en\b will mark up the words Ten and ten only if they are not preceded by a backslash.

    20.3.8. Replacements

    [replacements] and [replacements2] configuration file entries specify find and replace text and are formatted like:

    find_pattern=replacement_text

    The find text can be a Python regular expression; the replace text can contain Python regular expression group references.

    Use Replacement shortcuts for often used macro references, for example (the second replacement allows us to backslash escape the macro name):

    NEW!=image:./images/smallnew.png[New!]
    \\NEW!=NEW!
    Replacement behavior
    • The built-in replacements can be escaped with a backslash.

    • If the find or replace text has leading or trailing spaces then the text should be enclosed in quotation (") characters.

    • Since the find text is processed as a regular expression you need to be careful to escape regular expression special characters.

    • Replacements are performed in the same order they appear in the configuration file replacements section.

    20.4. Configuration File Names and Locations

    Configuration files have a .conf file name extension; they are loaded implicitly (using predefined file names and locations) or explicitly (using the asciidoc(1) -f (—conf-file) command-line option).

    Implicit configuration files are loaded from the following directories in the following order:

    1. The /etc/asciidoc directory (if it exists).

    2. The directory containing the asciidoc executable.

    3. The user's $HOME/.asciidoc directory (if it exists).

    4. The directory containing the AsciiDoc source file.

    The following implicit configuration files from each of the above locations are loaded in the following order:

    1. asciidoc.conf

    2. <backend>.conf

    3. <backend>-<doctype>.conf

    4. lang-<lang>.conf

    Where <backend> and <doctype> are values specified by the asciidoc(1) -b (—backend) and -d (—doctype) command-line options. <lang> is the value of the AsciiDoc lang attribute (defaults to en (English)).

    Finally, configuration files named like the source file will be automatically loaded if they are found in the source file directory. For example if the source file is mydoc.txt and the —backend=html4 option is used then asciidoc(1) will look for mydoc.conf and mydoc-html4.conf in that order.

    Implicit configuration files that don't exist will be silently skipped.

    The user can explicitly specify additional configuration files using the asciidoc(1) -f (—conf-file) command-line option. The -f option can be specified multiple times, in which case configuration files will be processed in the order they appear on the command-line.

    For example, when we translate our AsciiDoc document mydoc.txt with:

    $ asciidoc -f extra.conf mydoc.txt

    Configuration files (if they exist) will be processed in the following order:

    1. First default global configuration files from the asciidoc program directory are loaded:

      asciidoc.conf
      xhtml11.conf
    2. Then, from the users home ~/.asciidoc directory. This is were you put customization specific to your own asciidoc documents:

      asciidoc.conf
      xhtml11.conf
      xhtml11-article.conf
    3. Next from the source document project directory (the first three apply to all documents in the directory, the last two are specific to the mydoc.txt document):

      asciidoc.conf
      xhtml11.conf
      xhtml11-article.conf
      mydoc.conf
      mydoc-xhtml11.conf
    4. Finally the file specified by the -f command-line option is loaded:

      extra.conf
    Tip
    Use the asciidoc(1) -v (—verbose) command-line option to see which configuration files are loaded and the order in which they are loaded.

    21. Document Attributes

    A document attribute is comprised of a name and a textual value and is used for textual substitution in AsciiDoc documents and configuration files. An attribute reference (an attribute name enclosed in braces) is replaced by its corresponding attribute value.

    There are four sources of document attributes (from highest to lowest precedence):

    • Command-line attributes.

    • AttributeEntry, AttributeList, Macro and BlockId elements.

    • Configuration file [attributes] sections.

    • Intrinsic attributes.

    Within each of these divisions the last processed entry takes precedence.

    Important
    If an attribute is not defined then the line containing the attribute reference is dropped. This property is used extensively in AsciiDoc configuration files to facilitate conditional markup generation.

    22. Attribute Entries

    The AttributeEntry block element allows document attributes to be assigned within an AsciiDoc document. Attribute entries are added to the global document attributes dictionary. The attribute name/value syntax is a single line like:

    :<name>: <value>

    For example:

    :Author Initials: JB

    This will set an attribute reference {authorinitials} to the value JB in the current document.

    To delete (undefine) an attribute use the following syntax:

    :<name>!:
    AttributeEntry properties
    • The attribute entry line begins with colon — no white space allowed in left margin.

    • AsciiDoc converts the <name> to a legal attribute name (lower case, alphanumeric and dash characters only — all other characters deleted). This allows more reader friendly text to be used.

    • Leading and trailing white space is stripped from the <value>.

    • If the <value> is blank then the corresponding attribute value is set to an empty string.

    • Special characters in the entry <value> are substituted. To include special characters use the predefined {gt}, {lt}, {amp} attribute references.

    • Attribute references contained in the entry <value> will be expanded.

    • By default AttributeEntry values are substituted for specialcharacters and attributes (see above), if you want a different AttributeEntry substitution set the attributeentry-subs attribute.

    • Attribute entries in the document Header are available for header markup template substitution.

    • Attribute elements override configuration file and intrinsic attributes but do not override command-line attributes.

    Here's another example:

    AsciiDoc User Manual
    ====================
    :Author:    Stuart Rackham
    :Email:     srackham@gmail.com
    :Date:      April 23, 2004
    :Revision:  5.1.1
    :Key words: linux, ralink, debian, wireless
    :Revision history:

    Which creates these attributes:

    {author}, {firstname}, {lastname}, {authorinitials}, {email},
    {date}, {revision}, {keywords}, {revisionhistory}

    The preceding example is equivalent to the standard AsciiDoc two line document header. Actually it's a little bit different with the addition of the {keywords} and {revisionhistory} attributes
    [The existence of a {revisionhistory} attribute causes a revision history file (if it exists) to be included in DocBook outputs. If a file named like {docname}-revhistory.xml exists in the document's directory then it will be added verbatim to the DocBook header (see the ./doc/asciidoc-revhistory.xml example that comes with the AsciiDoc distribution).]
    .

    23. Attribute Lists

    An attribute list is a comma separated list of attribute values. The entire list is enclosed in square brackets. Attribute lists are used to pass parameters to macros, blocks and inline quotes.

    The list consists of zero or more positional attribute values followed by zero or more named attribute values. Here are three examples:

    [Hello]
    [quote, Bertrand Russell, The World of Mathematics (1956)]
    ["22 times", backcolor="#0e0e0e", options="noborders,wide"]
    Attribute list properties
    • If one or more attribute values contains a comma the all values must be quoted (enclosed in quotation characters).

    • If the list contains any named attributes the all string attribute values must be quoted.

    • List attributes take precedence over existing attributes.

    • List attributes can only be referenced in configuration file markup templates and tags, they are not available inside the document.

    • Attribute references are allowed inside attribute lists.

    • Setting a named attribute to None undefines the attribute.

    • Positional attributes are referred to as {1},{2},{3},…

    • Attribute {0} refers to the entire list (excluding the enclosing square brackets).

    • If an attribute named options is present it is processed as a comma separated list of attributes with zero length string values. For example [options="opt1,opt2,opt3"] is equivalent to [opt1="",opt2="",opt2=""].

    • Attribute lists are evaluated as a list of Python function arguments. If this fails or any of the items do not evaluate to a string, a number or None then all list items are treated as string literals.

    23.1. Macro Attribute lists

    Macros calls are suffixed with an attribute list. The list may be empty but it cannot be omitted. List entries are used to pass attribute values to macro markup templates.

    23.2. AttributeList Element

    An attribute list on a line by itself constitutes an AttributeList block element, its function is to parametrize the following block element. The list attributes are passed to the next block element for markup template substitution.

    24. Attribute References

    An attribute references is an attribute name (possibly followed by an additional parameters) enclosed in braces. When an attribute reference is encountered it is evaluated and replaced by its corresponding text value. If the attribute is undefined the line containing the attribute is dropped.

    There are three types of attribute reference: Simple, Conditional and System.

    Attribute reference behavior
    • You can suppress attribute reference expansion by placing a backslash character immediately in front of the opening brace character.

    • By default attribute references are not expanded in LiteralParagraphs, ListingBlocks or LiteralBlocks.

    24.1. Simple Attributes References

    Simple attribute references take the form {<name>}. If the attribute name is defined its text value is substituted otherwise the line containing the reference is dropped from the output.

    24.2. Conditional Attribute References

    Additional parameters are used in conjunction with the attribute name to calculate a substitution value. Conditional attribute references take the following forms:

    {<name>=<value>}

    <value> is substituted if the attribute <name> is undefined otherwise its value is substituted. <value> can contain simple attribute references.

    {<name>?<value>}

    <value> is substituted if the attribute <name> is defined otherwise an empty string is substituted. <value> can contain simple attribute references.

    {<name>!<value>}

    <value> is substituted if the attribute <name> is undefined otherwise an empty string is substituted. <value> can contain simple attribute references.

    {<name>#<value>}

    <value> is substituted if the attribute <name> is defined otherwise the undefined attribute entry causes the containing line to be dropped. <value> can contain simple attribute references.

    {<name>%<value>}

    <value> is substituted if the attribute <name> is not defined otherwise the containing line is dropped. <value> can contain simple attribute references.

    {<name>@<regexp>:<value1>[:<value2>]}

    <value1> is substituted if the value of attribute <name> matches the regular expression <regexp> otherwise <value2> is substituted. If attribute <name> is not defined the containing line is dropped. If <value2> is omitted an empty string is assumed. The values and the regular expression can contain simple attribute references. To embed colons in the values or the regular expression escape them with backslashes.

    {<name>$<regexp>:<value1>[:<value2>]}

    Same behavior as the previous ternary attribute except for the following cases:

    {<name>$<regexp>:<value>}

    Substitutes <value> if <name> matches <regexp> otherwise the result is undefined and the containing line is dropped.

    {<name>$<regexp>::<value>}

    Substitutes <value> if <name> does not match <regexp> otherwise the result is undefined and the containing line is dropped.

    24.2.1. Conditional attribute examples

    Conditional attributes are mainly used in AsciiDoc configuration files — see the distribution .conf files for examples.

    Attribute equality test

    If {backend} is docbook or xhtml11 the example evaluates to “DocBook or XHTML backend” otherwise it evaluates to “some other backend”:

    {backend@docbook|xhtml11:DocBook or XHTML backend:some other backend}
    Attribute value map

    This example maps the frame attribute values [topbot, all, none, sides] to [hsides, border, void, vsides]:

    {frame@topbot:hsides}{frame@all:border}{frame@none:void}{frame@sides:vsides}

    24.3. System Attribute References

    System attribute references generate the attribute text value by executing a predefined action that is parametrized by a single argument. The syntax is {<action>:<argument>}.

    {eval:<expression>}

    Substitutes the result of the Python <expression>. If <expression> evaluates to None or False the reference is deemed undefined and the line containing the reference is dropped from the output. If the expression evaluates to True the attribute evaluates to an empty string. In all remaining cases the attribute evaluates to a string representation of the <expression> result.

    {include:<filename>}

    Substitutes contents of the file named <filename>.

    • The included file is read at the time of attribute substitution.

    • If the file does not exist a warning is emitted and the line containing the reference is dropped from the output file.

    • Tabs are expanded based on the current tabsize attribute value.

    {sys:<command>}

    Substitutes the stdout generated by the execution of the shell <command>.

    {sys2:<command>}

    Substitutes the stdout and stderr generated by the execution of the shell <command>.

    System reference behavior
    • System attribute arguments can contain non-system attribute references.

    • Closing brace characters inside system attribute arguments must be escaped them with a backslash.

    25. Intrinsic Attributes

    Intrinsic attributes are simple attributes that are created automatically from AsciiDoc document header parameters, asciidoc(1) command-line arguments, execution parameters along with attributes defined in the default configuration files. Here's the list of predefined intrinsic attributes:

    {asciidoc-dir}        the asciidoc(1) application directory
    {asciidoc-version}    the version of asciidoc(1)
    {author}              author's full name
    {authored}            empty string '' if {author} or {email} defined,
    {authorinitials}      author initials (from document header)
    {backend-<backend>}   empty string ''
    {<backend>-<doctype>} empty string ''
    {backend}             document backend specified by `-b` option
    {basebackend-<base>}  empty string ''
    {basebackend}         html or docbook
    {brvbar}              broken vertical bar (|) character
    {date}                document date (from document header)
    {docname}             document file name without extension
    {doctitle}            document title (from document header)
    {doctype-<doctype>}   empty string ''
    {doctype}             document type specified by `-d` option
    {email}               author's email address (from document header)
    {empty}               empty string ''
    {filetype-<fileext>}  empty string ''
    {filetype}            output file name file extension
    {firstname}           author first name (from document header)
    {gt}                  greater than (>) character
    {id}                  running block id generated by BlockId elements
    {indir}               document input directory name (note 1)
    {infile}              input file name (note 1)
    {lastname}            author last name (from document header)
    {listindex}           the list index (1..) of the most recent list item
    {localdate}           the current date
    {localtime}           the current time
    {lt}                  less than (<) character
    {manname}             manpage name (defined in NAME section)
    {manpurpose}          manpage (defined in NAME section)
    {mantitle}            document title minus the manpage volume number
    {manvolnum}           manpage volume number (1..8) (from document header)
    {middlename}          author middle name (from document header)
    {outdir}              document output directory name (note 1)
    {outfile}             output file name (note 1)
    {revision}            document revision number (from document header)
    {sectnum}             section number (in section titles)
    {title}               section title (in titled elements)
    {user-dir}            the ~/.asciidoc directory (if it exists)
    {verbose}             defined as '' if --verbose command option specified
    NOTES
    1. Intrinsic attributes are global so avoid defining custom attributes with the same names.

    2. {infile}, {outdir}, {infile}, {indir} attributes are effectively read-only (you can set them but it won't affect the input or output file paths).

    3. See also the xhtml11 subsection for attributes that relate to AsciiDoc XHTML file generation.

    4. The entries that translate to blank strings are designed to be used for conditional text inclusion. You can also use the ifdef, ifndef and endif System macros for conditional inclusion.
      [Conditional inclusion using ifdef and ifndef macros differs from attribute conditional inclusion in that the former occurs when the file is read while the latter occurs when the contents are written.]

    26. Block Element Definitions

    The syntax and behavior of Paragraph, DelimitedBlock, List and Table block elements is determined by block definitions contained in AsciiDoc configuration file sections.

    Each definition consists of a section title followed by one or more section entries. Each entry defines a block parameter controlling some aspect of the block's behavior. Here's an example:

    [blockdef-listing]
    delimiter=^-{4,}$
    template=listingblock
    presubs=specialcharacters,callouts

    AsciiDoc Paragraph, DelimitedBlock, List and Table block elements share a common subset of configuration file parameters:

    delimiter

    A Python regular expression that matches the first line of a block element — in the case of DelimitedBlocks it also matches the last line. Table elements don't have an explicit delimiter — they synthesize their delimiters at runtime.

    template

    The name of the configuration file markup template section that will envelope the block contents. The pipe | character is substituted for the block contents. List elements use a set of (list specific) tag parameters instead of a single template.

    options

    A comma delimited list of element specific option names.

    subs, presubs, postsubs
    • presubs and postsubs are lists of comma separated substitutions that are performed on the block contents. presubs is applied first, postsubs (if specified) second.

    • subs is an alias for presubs.

    • If a filter is allowed (Paragraphs and DelimitedBlocks) and has been specified then presubs and postsubs substitutions are performed before and after the filter is run respectively.

    • Allowed values: specialcharacters, quotes, specialwords, replacements, macros, attributes, callouts.

    • The following composite values are also allowed:

      none

      No substitutions.

      normal

      The following substitutions: specialcharacters,quotes,attributes,specialwords, replacements,macros,passthroughs.

      verbatim

      specialcharacters and callouts substitutions.

    • normal and verbatim substitutions can be redefined by with subsnormal and subsverbatim entries in a configuration file [miscellaneous] section.

    • The substitutions are processed in the order in which they are listed and can appear more than once.

    filter

    This optional entry specifies an executable shell command for processing block content (Paragraphs and DelimitedBlocks). The filter command can contain attribute references.

    posattrs

    Optional comma separated list of positional attribute names. This list maps positional attributes (in the block's attribute list) to named block attributes. The following example, from the QuoteBlock definition, maps the first and section positional attributes:

    posattrs=attribution,citetitle
    style

    This optional parameter specifies the default style name.

    <stylename>-style

    Optional style definition (see Styles below).

    The following block parameters behave like document attributes and can be set in block attribute lists and style definitions: template, options, subs, presubs, postsubs, filter.

    26.1. Styles

    A style is a set of block attributes bundled as a single named attribute. The following example defines a style named verbatim:

    verbatim-style=template="literalblock",subs="verbatim",font="monospaced"
    • All style parameter names must be suffixed with -style and the style parameter value is in the form of a list of named attributes.

    • Multi-item style attributes (subs,presubs,postsubs,posattrs) must be specified using Python tuple syntax rather than a simple list of values as they in separate entries e.g. postsubs=("callouts",) not postsubs="callouts".

    26.2. Paragraphs

    Paragraph translation is controlled by [paradef*] configuration file section entries. Users can define new types of paragraphs and modify the behavior of existing types by editing AsciiDoc configuration files.

    Here is the shipped Default paragraph definition:

    [paradef-default]
    delimiter=(?P<text>\S.*)
    template=paragraph

    The Default paragraph definition has a couple of special properties:

    1. It must exist and be defined in a configuration file section named [paradef-default].

    2. Irrespective of its position in the configuration files default paragraph document matches are attempted only after trying all other paragraph types.

    Paragraph specific block parameter notes:

    delimiter

    This regular expression must contain the named group text which matches the text on the first line. Paragraphs are terminated by a blank line, the end of file, or the start of a DelimitedBlock.

    options

    The only allowable option is listelement. The listelement option specifies that paragraphs of this type will automatically be considered part of immediately preceding list items.

    Paragraph processing proceeds as follows:
    1. The paragraph text is aligned to the left margin.

    2. Optional presubs inline substitutions are performed on the paragraph text.

    3. If a filter command is specified it is executed and the paragraph text piped to its standard input; the filter output replaces the paragraph text.

    4. Optional postsubs inline substitutions are performed on the paragraph text.

    5. The paragraph text is enveloped by the paragraph's markup template and written to the output file.

    26.3. Delimited Blocks

    DelimitedBlock specific block definition notes:

    options

    Allowed values are:

    sectionbody

    The block contents are processed as a SectionBody.

    skip

    The block is treated as a comment (see CommentBlocks).

    list

    The block is a list block.

    presubs, postsubs and filter entries are meaningless when sectionbody, skip or list options are set.

    DelimitedBlock processing proceeds as follows:

    1. Optional presubs substitutions are performed on the block contents.

    2. If a filter is specified it is executed and the block's contents piped to its standard input. The filter output replaces the block contents.

    3. Optional postsubs substitutions are performed on the block contents.

    4. The block contents is enveloped by the block's markup template and written to the output file.

    Tip
    Attribute expansion is performed on the block filter command before it is executed, this is useful for passing arguments to the filter.

    26.4. Lists

    List behavior and syntax is determined by [listdef*] configuration file sections. The user can change existing list behavior and add new list types by editing configuration files.

    List specific block definition notes:

    type

    This is either bulleted,numbered,labeled or callout.

    delimiter

    A Python regular expression that matches the first line of a list element entry. This expression must contain the named group text which matches text in the first line.

    subs

    Substitutions that are performed on list item text and terms.

    listtag

    The name of the tag that envelopes the List.

    itemtag

    The name of the tag that envelopes the ListItem.

    texttag

    The name of the tag that envelopes the list item text.

    labeltag

    The name of the tag that envelopes a variable list label.

    entrytag

    The name of the tag that envelopes a labeled list entry.

    The tag entries map the AsciiDoc list structure to backend markup; see the AsciiDoc distribution .conf configuration files for examples.

    26.5. Tables

    Table behavior and syntax is determined by [tabledef*] configuration file sections. The user can change existing list behavior and add new list types by editing configuration files.

    Table specific block definition notes:

    fillchar

    A single character that fills table ruler and underline lines.

    subs

    Substitutions performed on table data items.

    format

    The source row data format (fixed, csv or dsv).

    comspec

    The table comspec tag definition.

    headrow, footrow, bodyrow

    Table header, footer and body row tag definitions. headrow and footrow table definition entries default to bodyrow if they are undefined.

    headdata, footdata, bodydata

    Table header, footer and body data tag definitions. headdata and footdata table definition entries default to bodydata if they are undefined.

    Table behavior is also influenced by the following [miscellaneous] configuration file entries:

    textwidth

    The page width (in characters) of the source text. This setting is compared to the table ruler width when calculating the relative size of character ruler tables on the output page.

    pagewidth

    This integer value is the printable width of the output media. Used to calculate colwidth and tablewidth substitution values.

    pageunits

    The units of width in output markup width attribute values.

    Table definition behavior
    • The output markup generation is specifically designed to work with the HTML and CALS (DocBook) table models, but should be adaptable to most XML table schema.

    • Table definitions can be “mixed in” from multiple cascading configuration files.

    • New table definitions inherit the default table definition ([tabledef-default]) so you only need to override those conf file entries that require modification when defining a new table type.

    27. Filters

    Filters are external shell commands used to process Paragraph and DelimitedBlock content; they are specified in configuration file Paragraph and DelimitedBlock definitions.

    There's nothing special about the filters, they're just standard UNIX filters: they read text from the standard input, process it, and write to the standard output.

    Attribute substitution is performed on the filter command prior to execution — attributes can be used to pass parameters from the AsciiDoc source document to the filter.

    Warning
    Filters can potentially generate unsafe output. Before installing a filter you should verify that it can't be coerced into generating malicious output or exposing sensitive information.
    Note
    Filter functionality is currently only available on POSIX platforms (this includes Cygwin).

    27.1. Filter Search Paths

    If the filter command does not specify a directory path then asciidoc(1) searches for the command:

    • First it looks in the user's $HOME/.asciidoc/filters directory.

    • Next the /etc/asciidoc/filters directory is searched.

    • Then it looks in the asciidoc(1) ./filters directory.

    • Finally it relies on the executing shell to search the environment search path ($PATH).

    27.2. Filter Configuration Files

    Filters are normally accompanied by a configuration file containing a Paragraph or DelimitedBlock definition along with corresponding markup templates.

    There are two ways to implement filters:

    • As a new Paragraph or DelimitedBlock definition.

    • By styling an existing Paragraph or DelimitedBlock using a style configuration entry — the source highlight and music filters use this technique to customize the ListingBlock. By convention the style is given the same name as the filter.

    asciidoc(1) auto-loads all .conf files found in the filter search paths (see previous section).

    27.3. Code Filter

    AsciiDoc comes with a simple minded for highlighting source code keywords and comments. See also the ./filters/code-filter-readme.txt file.

    Note
    This filter primarily 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 multi-language highlighter use the Source Code Highlighter Filter.
    .Code filter example
    [code,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
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Outputs:

    Example: Code filter example
    ''' 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

    27.4. Source Code Highlighter Filter

    A source code highlighter filter can be found in the AsciiDoc distribution ./filters directory.

    27.5. Music Filter

    A music filter is included in the distribution ./filters directory. It translates music in LilyPond or ABC notation to standard Western classical notation in the form of a trimmed PNG image which is automatically inserted into the output document.

    28. Converting DocBook to other file formats

    DocBook files are validated, parsed and translated by a combination of applications collectively called a DocBook tool chain. The function of a tool chain is to read the DocBook markup (produced by AsciiDoc) and transform it to a presentation format (for example HTML, PDF, HTML Help, DVI, PostScript, LaTeX).

    A wide range of user output format requirements coupled with a choice of available tools and stylesheets results in many valid tool chain combinations.

    28.1. a2x Toolchain Wrapper

    One of the biggest hurdles for new users is installing, configuring and using a DocBook XML toolchain. a2x(1) can help — it's a toolchain wrapper command that will generate XHTML (chunked and unchunked), PDF, DVI, PS, LaTeX, man page, HTML Help and text file outputs from an AsciiDoc text file. a2x(1) does all the grunt work associated with generating and sequencing the toolchain commands and managing intermediate and output files. a2x(1) also optionally deploys admonition and navigation icons and a CSS stylesheet. See the a2x(1) man page for more details. All you need is xsltproc(1), DocBook XSL Stylesheets and, optionally dblatex or FOP (if you want PDF), or lynx(1) (if you want text).

    The following examples generate doc/source-highlight-filter.pdf from the AsciiDoc doc/source-highlight-filter.txt source file. The first example uses dblatex(1) (the default PDF generator) the second example forces FOP to be used:

    $ a2x -f pdf doc/source-highlight-filter.txt
    $ a2x -f pdf --fop-options="" doc/source-highlight-filter.txt

    See the a2x(1) man page for details.

    Tip
    Use the —verbose command-line option to view executed toolchain commands.

    28.2. HTML generation

    AsciiDoc produces nicely styled HTML directly without requiring a DocBook toolchain but there are also advantages in going the DocBook route:

    • HTML from DocBook includes automatically generated indexes, tables of contents, footnotes, lists of figures and tables.

    • DocBook toolchains can also (optionally) generate separate (chunked) linked HTML pages for each document section.

    • Toolchain processing performs link and document validity checks.

    • If the DocBook lang attribute is set then things like table of contents, revision history, figure and table captions and admonition captions will be output in the specified language (setting the AsciiDoc lang attribute sets the DocBook lang attribute).

    On the other hand, HTML output directly from AsciiDoc is much faster, is easily customized and can be used in situations where there is no suitable DocBook toolchain (see the AsciiDoc website for example).

    28.3. PDF generation

    There are two commonly used tools to generate PDFs from DocBook, dblatex and FOP.

    dblatex or FOP?
    • dblatex is easier to install, there's zero configuration required and no Java VM to install — it just works out of the box.

    • dblatex source code highlighting and numbering is superb.

    • dblatex is easier to use as it converts DocBook directly to PDF whereas before using FOP you have to convert DocBook to XML-FO using DocBook XSL Stylesheets.

    • FOP is more feature complete (for example, callouts are processed inside literal layouts) and arguably produces nicer looking output.

    28.4. HTML Help generation

    1. Convert DocBook XML documents to HTML Help compiler source files using DocBook XSL Stylesheets and xsltproc(1).

    2. Convert the HTML Help source (.hhp and .html) files to HTML Help (.chm) files using the Microsoft HTML Help Compiler.

    28.5. Toolchain components summary

    AsciiDoc

    Converts AsciiDoc (.txt) files to DocBook XML (.xml) files.

    DocBook XSL Stylesheets

    These are a set of XSL stylesheets containing rules for converting DocBook XML documents to HTML, XSL-FO, manpage and HTML Help files. The stylesheets are used in conjunction with an XML parser such as xsltproc(1).

    xsltproc

    An XML parser for applying XSLT stylesheets (in our case the DocBook XSL Stylesheets) to XML documents.

    dblatex

    Generates PDF, DVI, PostScript and LaTeX formats directly from DocBook source via the intermediate LaTeX typesetting language — uses DocBook XSL Stylesheets, xsltproc(1) and latex(1).

    FOP

    The Apache Formatting Objects Processor converts XSL-FO (.fo) files to PDF files. The XSL-FO files are generated from DocBook source files using DocBook XSL Stylesheets and xsltproc(1).

    Microsoft Help Compiler

    The Microsoft HTML Help Compiler (hhc.exe) is a command-line tool that converts HTML Help source files to a single HTML Help (.chm) file. It runs on MS Windows platforms and can be downloaded from http://www.microsoft.com.

    28.6. AsciiDoc dblatex configuration files

    The AsciiDoc distribution ./dblatex directory contains asciidoc-dblatex.xsl (customized XSL parameter settings) and asciidoc-dblatex.sty (customized LaTeX settings). These are examples of optional dblatex output customization and are used by a2x(1).

    28.7. AsciiDoc DocBook XSL Stylesheets drivers

    You will have noticed that the distributed HTML and HTML Help documentation files (for example ./doc/asciidoc.html) are not the plain outputs produced using the default DocBook XSL Stylesheets configuration. This is because they have been processed using customized DocBook XSL Stylesheets along with (in the case of HTML outputs) the custom ./stylesheets/docbook.css CSS stylesheet.

    You'll find the customized DocBook XSL drivers along with additional documentation in the distribution ./docbook-xsl directory. The examples that follow are executed from the distribution documentation (./doc) directory.

    common.xsl

    Shared driver parameters. This file is not used directly but is included in all the following drivers.

    chunked.xsl

    Generate chunked XHTML (separate HTML pages for each document section) in the ./doc/chunked directory. For example:

    $ python ../asciidoc.py -b docbook asciidoc.txt
    $ xsltproc --nonet ../docbook-xsl/chunked.xsl asciidoc.xml
    fo.xsl

    Generate XSL Formatting Object (.fo) files for subsequent PDF file generation using FOP. For example:

    $ python ../asciidoc.py -b docbook article.txt
    $ xsltproc --nonet ../docbook-xsl/fo.xsl article.xml > article.fo
    $ fop.sh article.fo article.pdf
    htmlhelp.xsl

    Generate Microsoft HTML Help source files for the MS HTML Help Compiler in the ./doc/htmlhelp directory. This example is run on MS Windows from a Cygwin shell prompt:

    $ python ../asciidoc.py -b docbook asciidoc.txt
    $ xsltproc --nonet ../docbook-xsl/htmlhelp.xsl asciidoc.xml
    $ c:/Program\ Files/HTML\ Help\ Workshop/hhc.exe htmlhelp.hhp
    manpage.xsl

    Generate a roff(1) format UNIX man page from a DocBook XML refentry document. This example generates an asciidoc.1 man page file:

    $ python ../asciidoc.py -d manpage -b docbook asciidoc.1.txt
    $ xsltproc --nonet ../docbook-xsl/manpage.xsl asciidoc.1.xml
    xhtml.xsl

    Convert a DocBook XML file to a single XHTML file. For example:

    $ python ../asciidoc.py -b docbook asciidoc.txt
    $ xsltproc --nonet ../docbook-xsl/xhtml.xsl asciidoc.xml > asciidoc.html

    If you want to see how the complete documentation set is processed take a look at the A-A-P script ./doc/main.aap.

    29. Generating Plain Text Files

    AsciiDoc does not have a text backend (for most purposes AsciiDoc source text is fine), however you can convert AsciiDoc text files to formatted text using the AsciiDoc a2x(1) toolchain wrapper utility.

    30. XML and Character Sets

    The default XML character set UTF-8 is used when AsciiDoc generates DocBook files but this can be changed by setting the xmldecl entry in the [attributes] section of the docbook.conf file or by composing your own configuration file [header] section).

    Tip
    If you get an undefined entity error when processing DocBook files you'll may find that you've used an undefined HTML character entity. An easy (although inelegant) fix is to use the character's character code instead of its symbolic name (for example use &#160; instead of &nbsp;).

    If your system has been configured with an XML catalog you may find a number of entity sets are already automatically included.

    30.1. PDF Fonts

    The Adobe PDF Specification states that the following 14 fonts should be available to every PDF reader: Helvetica (normal, bold, italic, bold italic), Times (normal, bold, italic, bold italic), Courier (normal, bold, italic, bold italic), Symbol and ZapfDingbats. Non-standard fonts should be embedded in the distributed document.

    31. Help Commands

    The asciidoc(1) command has a --help option which prints help topics to stdout. The default topic summarizes asciidoc(1) usage:

    $ asciidoc --help

    To print a list of help topics:

    $ asciidoc --help=topics

    To print a help topic specify the topic name as a command argument. Help topic names can be shortened so long as they are not ambiguous. Examples:

    $ asciidoc --help=manpage
    $ asciidoc -hm              # Short version of previous example.
    $ asciidoc --help=syntax
    $ asciidoc -hs              # Short version of previous example.

    31.1. Customizing Help

    To change, delete or add your own help topics edit a help configuration file. The help file name help-<lang>.conf is based on the setting of the lang attribute, it defaults to help.conf (English). The help file location will depend on whether you want the topics to apply to all users or just the current user.

    The help topic files have the same named section format as other configuration files. The help.conf files are stored in the same locations and loaded in the same order as other configuration files.

    When the --help command-line option is specified AsciiDoc loads the appropriate help files and then prints the contents of the section whose name matches the help topic name. If a topic name is not specified default is used. You don't need to specify the whole help topic name on the command-line, just enough letters to ensure it's not ambiguous. If a matching help file section is not found a list of available topics is printed.

    32. Tips and Tricks

    32.1. Know Your Editor

    Writing AsciiDoc documents will be a whole lot more pleasant if you know your favorite text editor. Learn how to indent and reformat text blocks, paragraphs, lists and sentences. Tips for vim users follow.

    32.2. Vim Commands for Formatting AsciiDoc

    32.2.1. Text Wrap Paragraphs

    Use the vim :gq command to reformat paragraphs. Setting the textwidth sets the right text wrap margin; for example:

    :set textwidth=70

    To reformat a paragraph:

    1. Position the cursor at the start of the paragraph.

    2. Type gq}.

    Execute :help gq command to read about the vim gq command.

    Tip
    • Assign the gq} command to the Q key with the nnoremap Q gq} command or put it in your ~/.vimrc file to so it's always available (see the Example ~/.vimrc file).

    • Put set commands in your ~/.vimrc file so you don't have to enter them manually Example ~/.vimrc file).

    • The Vim website (http://www.vim.org) has a wealth of resources, including scripts for automated spell checking and ASCII Art drawing.

    32.2.2. Format Lists

    The gq command can also be used to format bulleted and numbered lists. First you need to set the comments and formatoptions (see the Example ~/.vimrc file).

    Now you can format simple lists that use dash, asterisk, period and plus bullets along with numbered ordered lists:

    1. Position the cursor at the start of the list.

    2. Type gq}.

    32.2.3. Indent Paragraphs

    Indent whole paragraphs by indenting the fist line with the desired indent and then executing the gq} command.

    32.2.4. Example ~/.vimrc File

    " Show tabs and trailing characters.
    set listchars=tab:»·,trail:·
    set list
    
    " Don't highlight searched text.
    highlight clear Search
    
    " Don't move to matched text while search pattern is being entered.
    set noincsearch
    
    " Q command to reformat paragraphs and list.
    nnoremap Q gq}
    
    " W command to delete trailing white space and Dos-returns and to expand tabs
    " to spaces.
    nnoremap W :%s/[\r \t]\+$//<CR>:set et<CR>:retab!<CR>
    
    autocmd BufRead,BufNewFile *.txt,README,TODO,CHANGELOG,NOTES
            \ setlocal autoindent expandtab tabstop=8 softtabstop=2 shiftwidth=2
            \ textwidth=70 wrap formatoptions=tcqn
            \ comments=s1:/*,ex:*/,://,b:#,:%,:XCOMM,fb:-,fb:*,fb:+,fb:.,fb:>

    32.3. Troubleshooting

    • The asciidoc(1) -v (—verbose) command-line option displays the order of configuration file loading and warns of potential configuration file problems.

    • Not all valid AsciiDoc documents produce valid backend markup. Read the AsciiDoc Backends section if AsciiDoc output is rejected as non-conformant by a backend processor.

    32.4. Gotchas

    Incorrect character encoding

    If you get an error message like 'UTF-8' codec can't decode … then you source file contains invalid UTF-8 characters — set the AsciiDoc encoding attribute for the correct character set (typically ISO-8859-1 (Latin-1) for European languages).

    Misinterpreted text formatting

    If text in your document is incorrectly interpreted as formatting instructions you can suppress formatting by placing a backslash character immediately in front of the leading quote character(s). For example in the following line the backslash prevents text between the two asterisks from being output in a strong (bold) font:

    Add `\*.cs` files and `*.resx` files.
    Overlapping text formatting

    Overlapping text formatting will generate illegal overlapping markup tags which will result in downstream XML parsing errors. Here's an example:

    Some *strong markup _that overlaps* emphasized markup_.
    Ambiguous underlines

    A DelimitedBlock can immediately follow paragraph without an intervening blank line, but be careful, a single line paragraph underline may be misinterpreted as a section title underline resulting in a “closing block delimiter expected” error.

    Ambiguous ordered list items

    Lines beginning with numbers at the end of sentences will be interpreted as ordered list items. The following example (incorrectly) begins a new list with item number 1999:

    He was last sighted in
    1999. Since then things have moved on.

    The list item out of sequence warning makes it unlikely that this problem will go unnoticed.

    Escaping inside DSV table data

    Delimiter separated text uses C style backslash escape sequences. If you want to enter a backslash (for example, to escape AsciiDoc text formatting or an inline macro) you need to escape it by entering two backslashes.

    Special characters in attribute values

    Special character substitution precedes attribute substitution so if attribute values contain special characters you may, depending on the substitution context, need to escape the special characters yourself. For example:

    $ asciidoc -a 'companyname=Bill &amp; Ben' mydoc.txt
    Macro attribute lists

    If named attribute list entries are present then all string attribute values must be quoted. For example:

    ["Desktop screenshot",width=32]

    32.5. Combining Separate Documents

    You have a number of stand-alone AsciiDoc documents that you want to process as a single document. Simply processing them with a series of include macros won't work, because instead of starting at level 1 the section levels of the combined document start at level 0 (the document title level).

    The solution is to redefine the title underlines so that document and section titles are pushed down one level.

    1. Push the standard title underlines down one level by defining a new level 0 underline in a custom configuration file. For example combined.conf:

      [titles]
      underlines="__","==","--","~~","^^"
    2. If you use single line titles you'll need to make corresponding adjustments to the [titles] section sect0sect4 entries.

    3. Create a top level wrapper document. For example combined.txt:

       Combined Document Title
       _______________________
      
       include::document1.txt[]
      
       include::document2.txt[]
      
       include::document3.txt[]
    4. Process the wrapper document. For example:

      $ asciidoc --conf-file=combined.conf combined.txt

    Actually the —conf-file option is unnecessary as asciidoc(1) automatically looks for a same-named .conf file.

    • The combined document title uses the newly defined level 0 underline (underscore characters).

    • Put a blank line between the include macro lines to ensure the title of the included document is not seen as part of the last paragraph of the previous document.

    • You won't want document Headers (Author and Revision lines) in the included files — conditionally exclude them if they are necessary for stand-alone processing.

    32.6. Processing Document Sections Separately

    You have divided your AsciiDoc document into separate files (one per top level section) which are combined and processed with the following top level document:

     Combined Document Title
     =======================
     Joe Bloggs
     v1.0, 12-Aug-03
    
     include::section1.txt[]
    
     include::section2.txt[]
    
     include::section3.txt[]

    You also want to process the section files as separate documents. This is easy because asciidoc(1) will quite happily process section1.txt, section2.txt and section3.txt separately.

    If you want to promote the section levels up one level, so the document is processed just like a stand-alone document, then pop the section underline definition up one level:

    [titles]
    underlines="--","~~","^^","++","__"

    The last "__" underline is a dummy that won't actually be used but is necessary to legitimize the underline definition.

    This is just the reverse of the technique used for combining separate documents explained in the previous section.

    32.7. Processing Document Chunks

    asciidoc(1) can be used as a filter, so you can pipe chunks of text through it. For example:

    $ echo 'Hello *World!*' | asciidoc -s -
    <div class="para"><p>Hello <strong>World!</strong></p></div>

    The -s (—no-header-footer) command-line option suppresses header and footer output and is useful if the processed output is to be included in another file.

    32.8. Badges in HTML Page Footers

    See the [footer] section in the AsciiDoc distribution xhtml11.conf configuration file.

    32.9. Pretty Printing AsciiDoc Output

    If the indentation and layout of the asciidoc(1) output is not to your liking you can:

    1. Change the indentation and layout of configuration file markup template sections. The {empty} glossary entry is useful for outputting trailing blank lines in markup templates.

    2. Or use Dave Raggett's excellent HTML Tidy program to tidy asciidoc(1) output. Example:

      $ asciidoc -b docbook -o - mydoc.txt | tidy -indent -xml >mydoc.xml

    HTML Tidy can be downloaded from http://tidy.sourceforge.net/

    32.10. Supporting Minor DocBook DTD Variations

    The conditional inclusion of DocBook SGML markup at the end of the distribution docbook.conf file illustrates how to support minor DTD variations. The included sections override corresponding entries from preceding sections.

    32.11. Shipping Stand-alone AsciiDoc Source

    Reproducing presentation documents from someone else's source has one major problem: unless your configuration files are the same as the creator's you won't get the same output.

    The solution is to create a single backend specific configuration file using the asciidoc(1) -c (—dump-conf) command-line option. You then ship this file along with the AsciiDoc source document plus the asciidoc.py script. The only end user requirement is that they have Python installed (and of course that they consider you a trusted source). This example creates a composite HTML configuration file for mydoc.txt:

    $ asciidoc -cb xhtml11 mydoc.txt > mydoc-xhtml11.conf

    Ship mydoc.txt, mydoc-html.conf, and asciidoc.py. With these three files (and a Python interpreter) the recipient can regenerate the HMTL output:

    $ ./asciidoc.py -eb xhtml11 mydoc.txt

    The -e (—no-conf) option excludes the use of implicit configuration files, ensuring that only entries from the mydoc-html.conf configuration are used.

    32.12. Inserting Blank Space

    Adjust your style sheets to add the correct separation between block elements. Inserting blank paragraphs containing a single non-breaking space character {nbsp} works but is an ad hoc solution compared to using style sheets.

    32.13. Closing Open Sections

    You can close off section tags up to level N by calling the eval::[Section.setlevel(N)] system macro. This is useful if you want to include a section composed of raw markup. The following example includes a DocBook glossary division at the top section level (level 0):

      ifdef::backend-docbook[]
    
      eval::[Section.setlevel(0)]
    
      +++++++++++++++++++++++++++++++
      <glossary>
        <title>Glossary</title>
        <glossdiv>
        ...
        </glossdiv>
      </glossary>
      +++++++++++++++++++++++++++++++
      endif::backend-docbook[]

    32.14. Validating Output Files

    Use xmllint(1) to check the AsciiDoc generated markup is both well formed and valid. Here are some examples:

    $ xmllint --nonet --noout --valid docbook-file.xml
    $ xmllint --nonet --noout --valid xhtml11-file.html
    $ xmllint --nonet --noout --valid --html html4-file.html

    The —valid option checks the file is valid against the document type's DTD, if the DTD is not installed in your system's catalog then it will be fetched from its Internet location. If you omit the —valid option the document will only be checked that it is well formed.

    33. Glossary

    Block element

    An AsciiDoc block element is a document entity composed of one or more whole lines of text.

    Inline element

    AsciiDoc inline elements occur within block element textual content, they perform formatting and substitution tasks.

    Formal element

    An AsciiDoc block element that has a BlockTitle. Formal elements are normally listed in front or back matter, for example lists of tables, examples and figures.

    Verbatim element

    The word verbatim indicates that white space and line breaks in the source document are to be preserved in the output document.

    34. Appendix A: Migration Notes

    34.1. Version 7 to version 8

    • A new set of quotes has been introduced which may match inline text in existing documents — if they do you'll need to escape the matched text with backslashes.

    • The index entry inline macro syntax has changed — if your documents include indexes you may need to edit them.

    • Replaced a2x(1) --no-icons and --no-copy options with their negated equivalents: --icons and --copy respectively. The default behavior has also changed — the use of icons and copying of icon and CSS files must be specified explicitly with the --icons and --copy options.

    The rationale for the changes can be found in the AsciiDoc CHANGELOG.

    Note
    If you want to disable unconstrained quotes, the new alternative constrained quotes syntax and the new index entry syntax then you can define the attribute asciidoc7compatible (for example by using the -a asciidoc7compatible command-line option).

    34.2. Version 6 to version 7

    The changes that affect the most users relate to renamed and deprecated backends and command-line syntax:

    1. The html backend has been renamed html4.

    2. The xhtml backend has been deprecated to xhtml-deprecated (use the new xhtml11 backend in preference).

    3. The use of CSS specific css and css-embedded backends has been dropped in favor of using attributes (see the table below and xhtml backend attributes).

    4. Deprecated features that emitted warnings in prior versions are no longer tolerated.

    5. The command-line syntax for deleting (undefining) an attribute has changed from -a ^name to -a name!.

    Table: Equivalent command-line syntax
    Version 6 (old) Version 7 (new) Version 7 (backward compatible)
    -b html -b html4 -b html4
    -b css -b xhtml11 -a linkcss -a icons -b xhtml-deprecated -a css -a linkcss -a icons
    -b css-embedded -b xhtml11 -a icons -b xhtml-deprecated -a css -a icons
    -b xhtml -b xhtml11 -b xhtml-deprecated
    -b docbook-sgml -b docbook -a sgml -b docbook -a sgml

    If you've customized version 6 distribution stylesheets then you'll need to either bring them in line with the new ./stylesheets/xhtml11*.css class and id names or stick with the backward compatible xhtml-deprecated backend.

    Changes to configuration file syntax:

    1. To undefine an attribute in the [attributes] section use name! instead of name (name now sets that attribute to a blank string).

    35. Appendix B: Packager Notes

    Read the README and INSTALL files (in the distribution root directory) for install prerequisites and procedures.

    The distribution install.sh shell script is the canonical installation procedure and is the definitive installation description. Here's a summary of the installation procedure:

    • Unpack entire distribution tarball to /usr/share/asciidoc/.

    • Move asciidoc.py to /usr/bin/; rename to asciidoc; if necessary modify shebang line; ensure executable permissions are set.

    • Move a2x to /usr/bin/; if necessary modify shebang line; ensure executable permissions are set.

    • Move the ./*.conf files to /etc/asciidoc/.

    • Move ./filters/{*.conf,*.py} to /etc/asciidoc/filters/.

    • Move ./docbook-xsl/*.xsl to /etc/asciidoc/docbook-xsl/.

    • Move ./dblatex/*.{xsl,sty} to /etc/asciidoc/dblatex/.

    • Copy ./stylesheets/*.css to /etc/asciidoc/stylesheets/.

    • Copy ./javascripts/*.js to /etc/asciidoc/javascripts/.

    • Copy ./images/icons/* to /etc/asciidoc/images/icons/ (recursively including the icons subdirectory and its contents).

    • Compress the asciidoc(1) and ax2(1) man pages (./doc/*.1) with gzip(1) and move them to /usr/share/man/man1/.

    • If Vim is installed then install Vim syntax and filetype detection files.

    Leaving stylesheets and images in /usr/share/asciidoc/ ensures the docs and example website are not broken.

    36. Appendix C: AsciiDoc Safe Mode

    AsciiDoc safe mode skips potentially dangerous sections in AsciiDoc source files by inhibiting the execution of arbitrary code or the inclusion of arbitrary files.

    The safe mode is enabled by default and can only be disabled using the asciidoc(1) —unsafe command-line option.

    Safe mode constraints
    • eval, sys and sys2 executable attributes and block macros are not executed.

    • include::<filename>[] and include1::<filename>[] block macro files must reside inside the parent file's directory.

    • {include:<filename>} executable attribute files must reside inside the source document directory.

    • Passthrough Blocks are dropped.

    Warning

    The safe mode is not designed to protect against unsafe AsciiDoc configuration files. Be especially careful when:

    1. Implementing filters.

    2. Implementing elements that don't escape special characters.

    3. Accepting configuration files from untrusted sources.

    37. Appendix D: Using AsciiDoc with non-English Languages

    AsciiDoc can process UTF-8 character sets but there are some things you need to be aware of:

    • If you are generating output documents using a DocBook toolchain then you should set the AsciiDoc lang attribute to the appropriate language (it defaults to en (English)). This will ensure things like table of contents, revision history, figure and table captions and admonition captions are output in the specified language. For example:

      $ a2x -a lang=es doc/article.txt
    • If you are outputting html or xhtml directly from asciidoc(1) you'll need to set the various *_caption attributes to match your target language (see the list of captions and titles in the [attributes] section of the default asciidoc.conf file). The easiest way is to create a language .conf file (see the example lang-es.conf file that comes with the AsciiDoc distribution).

    • asciidoc(1) automatically loads configuration files named like lang-<lang>.conf where <lang> is a two letter language code that matches the current AsciiDoc lang attribute. See also Configuration File Names and Locations.

    • Some character sets display double-width characters (for example Japanese). As far as title underlines are concerned they should be treated as single character. If you think this looks untidy so you may prefer to use the single line title format.

    38. Appendix E: ASCIIMathML Support

    ASCIIMathML is a clever JavaScript written by Peter Jipsen that transforms mathematical formulae written in plain text to standard mathematical notation on an HTML page.

    To enable ASCIIMathML support on the xhtml11 backend include the -a asciimath command-line option. Here's what the asciimath attribute does:

    • Embeds the ASCIIMathML.js script in the output document (links it if -a linkcss has been specified).

    • Escapes ASCIIMathML delimiters.

    When entering ASCIIMathML formulas you must enclose them inside double-dollar passthroughs (this is necessary because ASCIIMathML characters clash with AsciiDoc formatting characters). The double-dollar passthrough has the bonus of also escaping special characters so the output document is valid XHTML. You can see an ASCIIMathML example at http://www.methods.co.nz/asciidoc/asciimath.html, the same example can be found in the AsciiDoc distribution ./doc directory.

    Note
    • See the ASCIIMathML website for ASCIIMathML documentation and the latest version.

    • If you use Mozilla you need to install the required math fonts.

    • If you use Microsoft Internet Explorer 6 you need to install MathPlayer.

    39. Appendix F: Vim Syntax Highlighter

    The AsciiDoc ./vim/ distribution directory contains Vim syntax highlighter and filetype detection scripts for AsciiDoc. Syntax highlighting makes it much easier to spot AsciiDoc syntax errors.

    If Vim is installed on your system the AsciiDoc installer (install.sh) will automatically install the vim scripts in the Vim global configuration directory (/etc/vim).

    You can also turn on syntax highlighting by adding the following line to the end of you AsciiDoc source files:

    // vim: set syntax=asciidoc:
    Note
    Dag Wieers has implemented an alternative Vim syntax file for AsciiDoc which can be found here http://svn.rpmforge.net/svn/trunk/tools/asciidoc-vim/.
    Note
    Emacs users: The *Nix Power Tools project has released an AsciiDoc syntax highlighter for emacs.

    39.1. Limitations

    The current implementation does a reasonable job but on occasions gets things wrong. This list of limitations also discusses how to work around the problems:

    • Indented lists with preceding blank lines are sometimes mistaken for literal (indented) paragraphs. You can work around this by deleting the preceding blank line, or inserting a space in the preceding blank lines, or putting a list continuation character (+) in the preceding blank line.

    • Nested text formatting is highlighted according to the outer format.

    • Most escaped inline elements will be highlighted.

    • Unterminated quotes are highlighted, for example 'tis would be seen as the start of emphasized text. As a damage control measure quoted text and macro attribute list containing quoted text always terminate at a blank line. This problem is usually ameliorated by the fact that characters such as ~, +, ^ and _ will normally occur inside monospaced quotes (unless they are used for quoting), for example ~/projects.

    • If a closing block delimiter is not preceded by a blank line it is sometimes mistaken for a title underline. A workaround is to insert a blank line before the closing delimiter.

    • If a list block delimiter is mistaken for a title underline precede it with a blank line.

    • Tables are terminated by a blank line — use a space character on blank lines within your table.

    • Lines within a paragraph beginning with a period will be highlighted as block titles. For example:

      .chm file.

      To work around this restriction move the last word of the previous line to the start of the current (although words starting with a period should probably be quoted monospace which would also get around the problem).

    Tip
    Sometimes incorrect highlighting is caused by preceding lines that appear blank but contain white space characters — setting your editor options so that white space characters are visible is a good idea.
    asciidoc-8.2.7/doc/asciidoc.css.html0000644000175100017510000074555111033405256017474 0ustar srackhamsrackham AsciiDoc User Guide

    AsciiDoc is a text document format for writing short documents, articles, books and UNIX man pages. AsciiDoc files can be translated to HTML and DocBook markups using the asciidoc(1) command. AsciiDoc is highly configurable: both the AsciiDoc source file syntax and the backend output markups (which can be almost any type of SGML/XML markup) can be customized and extended by the user.

    1. Introduction

    Plain text is the most universal electronic document format, no matter what computing environment you use, you can always read and write plain text documentation. But for many applications plain text is not a viable presentation format. HTML, PDF and roff (roff is used for man pages) are the most widely used UNIX presentation formats. DocBook is a popular UNIX documentation markup format which can be translated to HTML, PDF and other presentation formats.

    AsciiDoc is a plain text human readable/writable document format that can be translated to DocBook or HTML using the asciidoc(1) command. You can then either use asciidoc(1) generated HTML directly or run asciidoc(1) DocBook output through your favorite DocBook toolchain or use the AsciiDoc a2x(1) toolchain wrapper to produce PDF, DVI, LaTeX, PostScript, man page, HTML and text formats.

    The AsciiDoc format is a useful presentation format in its own right: AsciiDoc files are unencumbered by markup and are easily viewed, proofed and edited.

    AsciiDoc is light weight: it consists of a single Python script and a bunch of configuration files. Apart from asciidoc(1) and a Python interpreter, no other programs are required to convert AsciiDoc text files to DocBook or HTML. See Example AsciiDoc Documents below.

    You write an AsciiDoc document the same way you would write a normal text document, there are no markup tags or arcane notations. Built-in AsciiDoc formatting rules have been kept to a minimum and are reasonably obvious.

    Text markup conventions tend to be a matter of (often strong) personal preference: if the default syntax is not to your liking you can define your own by editing the text based asciidoc(1) configuration files. You can create your own configuration files to translate AsciiDoc documents to almost any SGML/XML markup.

    asciidoc(1) comes with a set of configuration files to translate AsciiDoc articles, books or man pages to HTML or DocBook backend formats.

    2. Getting Started

    2.1. Installing AsciiDoc

    See the README and INSTALL files for install prerequisites and procedures. Packagers take a look at Appendix B: Packager Notes.

    2.2. Example AsciiDoc Documents

    The best way to quickly get a feel for AsciiDoc is to view the AsciiDoc web site and/or distributed examples:

    • Take a look at the linked examples on the AsciiDoc web site home page http://www.methods.co.nz/asciidoc/. Press the Page Source sidebar menu item to view corresponding AsciiDoc source.

    • Read the .txt source files in the distribution ./doc directory in conjunction with the corresponding HTML and DocBook XML files.

    3. AsciiDoc Document Types

    There are three types of AsciiDoc documents: article, book and manpage. All document types share the same AsciiDoc format with some minor variations.

    Use the asciidoc(1) -d (—doctype) option to specify the AsciiDoc document type — the default document type is article.

    By convention the .txt file extension is used for AsciiDoc document source files.

    3.1. article

    Used for short documents, articles and general documentation. See the AsciiDoc distribution ./doc/article.txt example.

    3.2. book

    Books share the same format as articles; in addition there is the option to add level 0 book part sections.

    Book documents will normally be used to produce DocBook output since DocBook processors can automatically generate footnotes, table of contents, list of tables, list of figures, list of examples and indexes.

    AsciiDoc markup supports standard DocBook frontmatter and backmatter special sections (dedication, preface, bibliography, glossary, index, colophon) plus footnotes and index entries.

    Example book documents
    Book

    The ./doc/book.txt file in the AsciiDoc distribution.

    Multi-part book

    The ./doc/book-multi.txt file in the AsciiDoc distribution.

    3.3. manpage

    Used to generate UNIX manual pages. AsciiDoc manpage documents observe special header title and section naming conventions — see the Manpage Documents section for details.

    See also the asciidoc(1) man page source (./doc/asciidoc.1.txt) from the AsciiDoc distribution.

    4. AsciiDoc Backends

    The asciidoc(1) command translates an AsciiDoc formatted file to the backend format specified by the -b (—backend) command-line option. asciidoc(1) itself has little intrinsic knowledge of backend formats, all translation rules are contained in customizable cascading configuration files.

    AsciiDoc ships with the following predefined backend output formats:

    4.1. docbook

    AsciiDoc generates the following DocBook document types: article, book and refentry (corresponding to the AsciiDoc article, book and manpage document types).

    DocBook documents are not designed to be viewed directly. Most Linux distributions come with conversion tools (collectively called a toolchain) for converting DocBook files to presentation formats such as Postscript, HTML, PDF, DVI, PostScript, LaTeX, roff (the native man page format), HTMLHelp, JavaHelp and text.

    • The —backend=docbook command-line option produces DocBook XML. You can produce the older DocBook SGML format using the —attribute sgml command-line option.

    • Use the optional encoding attribute to set the character set encoding.

    • Use the optional imagesdir attribute to prepend to the target file name paths in image inline and block macros. Defaults to a blank string.

    • The AsciiDoc Preamble element generates a DocBook book preface element although it's more usual to use an explicit Preface special section (see the ./doc/book.txt example book).

    4.2. xhtml11

    The default asciidoc(1) backend is xhtml11 which generates XHTML 1.1 markup styled with CSS2. Default output file have a .html extension. xhtml11 document generation is influenced by the following optional attributes (the default behavior is to generate XHTML with no section numbers, embedded CSS and no linked admonition icon images):

    numbered

    Adds section numbers to section titles.

    toc

    Adds a table of contents to the start of the document.

    • JavaScript needs to be enabled in your browser for this to work.

    • By default AsciiDoc automatically embeds the required toc.js JavaScript in the output document — use the linkcss attribute to link the script.

    • The following example generates a numbered table of contents by embedding the toc.js script in the mydoc.html output document (to link the script to the output document use the linkcss and scriptsdir attributes):

      $ asciidoc -a toc -a numbered mydoc.txt
    toclevels

    Sets the number of title levels (1..4) reported in the table of contents (see the toc attribute above). Defaults to 2 and must be used with the toc attribute. Example usage:

    $ asciidoc -a toc -a toclevels=3 doc/asciidoc.txt
    toc_title

    Sets the table of contents title (defaults to Table of Contents).

    linkcss

    Link CSS stylesheets and JavaScripts (see the stylesdir and scriptsdir attributes below). By default linkcss is undefined in which case stylesheets and scripts are automatically embedded in the output document.

    stylesdir

    The name of the directory containing linked stylesheets. Defaults to . (the same directory as the linking document).

    scriptsdir

    The name of the directory containing linked JavaScripts. Defaults to . (the same directory as the linking document).

    icons

    Link admonition paragraph and admonition block icon images and badge images. By default icons is undefined and text is used in place of icon images.

    iconsdir

    The name of the directory containing linked admonition and navigation icons. Defaults to ./images/icons.

    imagesdir

    This attribute is prepended to the target image file name paths in image inline and block macros. Defaults to a blank string.

    theme

    Use alternative stylesheets (see Stylesheets).

    badges

    Link badges (XHTML 1.1, CSS and Get Firefox!) in document footers. By default badges are omitted (badges is undefined).

    Note The path names of images, icons and scripts are relative to the output document not the source document.
    encoding

    Set the input and output document character set encoding. For example the —attribute encoding=ISO-8859-1 command-line option will set the character set encoding to ISO-8859-1.

    • The default encoding is UTF-8.

    • This attribute specifies the character set in the output document.

    • The encoding name must correspond to a Python codec name or alias.

    • The encoding attribute can be set using an AttributeEntry inside the document header but it must come at the start of the document before the document title. For example:

      :encoding: ISO-8859-1
    quirks

    Use the xhtml11-quirks.css stylesheet to work around IE6 browser incompatibilities (this is the default behavior).

    data-uri

    Embed images referenced by image macros using the data: uri scheme.

    4.2.1. Stylesheets

    AsciiDoc XHTML output is styled using CSS2 stylesheets from the distribution ./stylesheets/ directory.

    Important

    All browsers have CSS quirks, but Microsoft's IE6 has so many omissions and errors that the xhtml11-quirks.css stylesheet and xhtml11-quirks.conf configuration files are included during XHTML backend processing to to implement workarounds for IE6. If you don't use IE6 then the quirks stylesheet and configuration files can be omitted using the —attribute quirks! command-line option.

    Default xhtml11 stylesheets:

    ./stylesheets/xhtml11.css

    The main stylesheet.

    ./stylesheets/xhtml11-manpage.css

    Tweaks for manpage document type generation.

    ./stylesheets/xhtml11-quirks.css

    Stylesheet modifications to work around IE6 browser incompatibilities.

    Use the theme attribute to select and alternative set of stylesheets. For example, the command-line option -a theme=foo will use stylesheets foo.css, foo-manpage.css and foo-quirks.css.

    4.3. html4

    This backend generates plain (unstyled) HTML 4.01 Transitional markup.

    4.4. linuxdoc

    Warning The AsciiDoc linuxdoc backend is still distributed but is no longer being actively developed or tested with new AsciiDoc releases (the last supported release was AsciiDoc 6.0.3).
    • Tables are not supported.

    • Images are not supported.

    • Callouts are not supported.

    • Horizontal labeled lists are not supported.

    • Only article document types are allowed.

    • The Abstract section can consist only of a single paragraph.

    • An AsciiDoc Preamble is not allowed.

    • The LinuxDoc output format does not support multiple labels per labeled list item although LinuxDoc conversion programs generally output all the labels with a warning.

    • Don't apply character formatting to the link macro attributes, LinuxDoc does not allow displayed link text to be formatted.

    The default output file name extension is .sgml.

    4.5. latex

    An experimental LaTeX backend has been written for AsciiDoc by Benjamin Klum. A tutorial ./doc/latex-backend.html is included in the AsciiDoc distribution which can also be viewed at http://www.methods.co.nz/asciidoc/latex-backend.html.

    5. Document Structure

    An AsciiDoc document consists of a series of block elements starting with an optional document Header, followed by an optional Preamble, followed by zero or more document Sections.

    Almost any combination of zero or more elements constitutes a valid AsciiDoc document: documents can range from a single sentence to a multi-part book.

    5.1. Block Elements

    Block elements consist of one or more lines of text and may contain other block elements.

    The AsciiDoc block structure can be informally summarized
    [This is a rough structural guide, not a rigorous syntax definition]
    as follows:

    Document      ::= (Header?,Preamble?,Section*)
    Header        ::= (Title,(AuthorLine,RevisionLine?)?)
    AuthorLine    ::= (FirstName,(MiddleName?,LastName)?,EmailAddress?)
    RevisionLine  ::= (Revision?,Date)
    Preamble      ::= (SectionBody)
    Section       ::= (Title,SectionBody?,(Section)*)
    SectionBody   ::= ((BlockTitle?,Block)|BlockMacro)+
    Block         ::= (Paragraph|DelimitedBlock|List|Table)
    List          ::= (BulletedList|NumberedList|LabeledList|CalloutList)
    BulletedList  ::= (ListItem)+
    NumberedList  ::= (ListItem)+
    CalloutList   ::= (ListItem)+
    LabeledList   ::= (ItemLabel+,ListItem)+
    ListItem      ::= (ItemText,(List|ListParagraph|ListContinuation)*)
    Table         ::= (Ruler,TableHeader?,TableBody,TableFooter?)
    TableHeader   ::= (TableRow+,TableUnderline)
    TableFooter   ::= (TableRow+,TableUnderline)
    TableBody     ::= (TableRow+,TableUnderline)
    TableRow      ::= (TableData+)

    Where:

    • ? implies zero or one occurrence, + implies one or more occurrences, * implies zero or more occurrences.

    • All block elements are separated by line boundaries.

    • BlockId, AttributeEntry and AttributeList block elements (not shown) can occur almost anywhere.

    • There are a number of document type and backend specific restrictions imposed on the block syntax.

    • The following elements cannot contain blank lines: Header, Title, Paragraph, ItemText.

    • A ListParagraph is a Paragraph with its listelement option set.

    • A ListContinuation is a list continuation element.

    5.2. Header

    The Header is optional but must start on the first line of the document and must begin with a document title. Optional Author and Revision lines immediately follow the title. The header can be preceded by a CommentBlock or comment lines.

    The author line contains the author's name optionally followed by the author's email address. The author's name consists of a first name followed by optional middle and last names separated by white space. Multi-word first, middle and last names can be entered in the header author line using the underscore as a word separator. The email address comes last and must be enclosed in angle <> brackets. Author names cannot contain angle <> bracket characters.

    The optional document header revision line should immediately follow the author line. The revision line can be one of two formats:

    1. An alphanumeric document revision number followed by a date:

      • The revision number and date must be separated by a comma.

      • The revision number is optional but must contain at least one numeric character.

      • Any non-numeric characters preceding the first numeric character will be dropped.

    2. An RCS/CSV/SVN $Id$ marker.

    The document heading is separated from the remainder of the document by one or more blank lines.

    Here's an example AsciiDoc document header:

    Writing Documentation using AsciiDoc
    ====================================
    Stuart Rackham <srackham@gmail.com>
    v2.0, February 2003

    You can override or set header parameters by passing revision, data, email, author, authorinitials, firstname and lastname attributes using the asciidoc(1) -a (—attribute) command-line option. For example:

    $ asciidoc -a date=2004/07/27 article.txt

    Attributes can also be added to the header for substitution in the header template with Attribute Entry elements.

    5.3. Preamble

    The Preamble is an optional untitled section body between the document Header and the first Section title.

    5.4. Sections

    AsciiDoc supports five section levels 0 to 4 (although only book documents are allowed to contain level 0 sections). Section levels are delineated by the section titles.

    Sections are translated using configuration file markup templates. To determine which configuration file template to use AsciiDoc first searches for special section titles in the [specialsections] configuration entries, if not found it uses the [sect<level>] template.

    The -n (—section-numbers) command-line option auto-numbers HTML outputs (DocBook line numbering is handled automatically by the DocBook toolchain commands).

    Section IDs are auto-generated from section titles if the sectids attribute is defined (the default behavior). The primary purpose of this feature is to ensure persistence of table of contents links: missing section IDs are generated dynamically by the JavaScript TOC generator after the page is loaded. This means, for example, that if you go to a bookmarked dynamically generated TOC address the page will load but the browser will ignore the (as yet ungenerated) section ID.

    The IDs are generated by the following algorithm:

    • Replace all non-alphanumeric title characters with an underscore.

    • Strip leading or trailing underscores.

    • Convert to lowercase.

    • Prepend an underscore (so there's no possibility of name clashes with existing document IDs).

    • A numbered suffix (_2, _3 …) is added if a same named auto-generated section ID exists.

    For example the title Jim's House would generate the ID _jim_s_house.

    5.4.1. Special Sections

    In addition to normal sections, documents can contain optional frontmatter and backmatter sections — for example: preface, bibliography, table of contents, index.

    The AsciiDoc configuration file [specialsections] section specifies special section titles and the corresponding backend markup templates.

    [specialsections] entries are formatted like:

    <pattern>=<name>

    <pattern> is a Python regular expression and <name> is the name of a configuration file markup template section. If the <pattern> matches an AsciiDoc document section title then the backend output is marked up using the <name> markup template (instead of the default sect<level> section template). The {title} attribute value is set to the value of the matched regular expression group named title, if there is no title group {title} defaults to the whole of the AsciiDoc section title.

    AsciiDoc comes preconfigured with the following special section titles:

    Preface                    (book documents only)
    Abstract                   (article documents only)
    Dedication                 (book documents only)
    Glossary
    Bibliography|References
    Colophon                   (book documents only)
    Index
    Appendix [A-Z][:.] <title>

    5.5. Inline Elements

    Inline document elements are used to markup character formatting and various types of text substitution. Inline elements and inline element syntax is defined in the asciidoc(1) configuration files.

    Here is a list of AsciiDoc inline elements in the (default) order in which they are processed:

    Special characters

    These character sequences escape special characters used by the backend markup (typically "<", ">", and "&"). See [specialcharacters] configuration file sections.

    Quotes

    Characters that markup words and phrases; usually for character formatting. See [quotes] configuration file sections.

    Special Words

    Word or word phrase patterns singled out for markup without the need for further annotation. See [specialwords] configuration file sections.

    Replacements

    Each Replacement defines a word or word phrase pattern to search for along with corresponding replacement text. See [replacements] configuration file sections.

    Attributes

    Document attribute names enclosed in braces (attribute references) are replaced by the corresponding attribute value.

    Inline Macros

    Inline macros are replaced by the contents of parametrized configuration file sections.

    6. Document Processing

    The AsciiDoc source document is read and processed as follows:

    1. The document Header is parsed, header parameter values are substituted into the configuration file [header] template section which is then written to the output file.

    2. Each document Section is processed and its constituent elements translated to the output file.

    3. The configuration file [footer] template section is substituted and written to the output file.

    When a block element is encountered asciidoc(1) determines the type of block by checking in the following order (first to last): (section) Titles, BlockMacros, Lists, DelimitedBlocks, Tables, AttributeEntrys, AttributeLists, BlockTitles, Paragraphs.

    The default paragraph definition [paradef-default] is last element to be checked.

    Knowing the parsing order will help you devise unambiguous macro, list and block syntax rules.

    Inline substitutions within block elements are performed in the following default order:

    1. Special characters

    2. Quotes

    3. Special words

    4. Replacements

    5. Attributes

    6. Inline Macros

    7. Passthroughs

    8. Replacements2

    The substitutions and substitution order performed on Title, Paragraph and DelimitedBlock elements is determined by configuration file parameters.

    7. Text Formatting

    7.1. Quoted Text

    Words and phrases can be formatted by enclosing inline text with quote characters:

    Emphasized text

    Word phrases 'enclosed in single quote characters' (acute accents) or _underline characters_ are emphasized.

    Strong text

    Word phrases *enclosed in asterisk characters* are rendered in a strong font (usually bold).

    Monospaced text

    Word phrases `enclosed in backtick characters` (grave accents) or +plus characters+ are rendered in a monospaced font.

    “Quoted text”

    Phrases ``enclosed with two grave accents to the left and two acute accents to the right'' are rendered in quotation marks.

    Unquoted text

    Placing #hashes around text# does nothing, it is a mechanism to allow inline attributes to be applied to otherwise unformatted text (see example below).

    The alternative underline and plus characters, while marginally less readable, are arguably a better choice than the backtick and apostrophe characters as they are not normally used for, and so not confused with, punctuation.

    Quoted text can be prefixed with an attribute list. Currently the only use made of this feature is to allow the font color, background color and size to be specified (XHTML/HTML only, not DocBook) using the first three positional attribute arguments. The first argument is the text color; the second the background color; the third is the font size. Colors are valid CSS colors and the font size is a number which treated as em units. Here are some examples:

    [red]#Red text#.
    [,yellow]*bold text on a yellow background*.
    [blue,#b0e0e6]+Monospaced blue text on a light blue background+
    [,,2]#Double sized text#.

    New quotes can be defined by editing asciidoc(1) configuration files. See the Configuration Files section for details.

    Quoted text properties
    • Quoting cannot be overlapped.

    • Different quoting types can be nested.

    • To suppress quoted text formatting place a backslash character immediately in front of the leading quote character(s). In the case of ambiguity between escaped and non-escaped text you will need to escape both leading and trailing quotes, in the case of multi-character quotes you may even need to escape individual characters.

    • A configuration file [quotes] entry can be subsequently undefined by setting it to a blank value.

    7.1.1. Constrained and Unconstrained Quotes

    There are actually two types of quotes:

    Constrained quotes

    Quote text that must be bounded by white space, for example a phrase or a word. These are the most common type of quote and are the ones discussed previously.

    Unconstrained quotes

    Unconstrained quotes have no boundary constraints and can be placed anywhere within inline text. For consistency and to make them easier to remember unconstrained quotes are double-ups of the _, *, + and # constrained quotes:

    __unconstrained emphasized text__
    **unconstrained strong text**
    ++unconstrained monospaced text++
    ##unconstrained unquoted text##

    The following example emboldens the letter F:

    **F**ile Open...
    Tip

    The __, **, ++ and ## unconstrained quotes have to be double-escaped (because of their similarity to the single character constrained quotes) — here's how to escape the previous example:

    \*\*F**ile Open...

    7.2. Inline Passthroughs

    This special text quoting mechanism passes inline text to the output document without the usual substitutions. There are two flavors:

    +++Triple-plus passthrough+++

    No change is made to the quoted text, it is passed verbatim to the output document.

    $$Double-dollar passthrough$$

    Special characters are escaped but no other changes are made. This passthrough can be prefixed with inline attributes.

    7.3. Superscripts and Subscripts

    Put ^carets on either^ side of the text to be superscripted, put ~tildes on either side~ of text to be subscripted. For example, the following line:

    e^{amp}#960;i^+1 = 0. H~2~O and x^10^. Some ^super text^
    and ~some sub text~

    Is rendered like:

    eπi+1 = 0. H2O and x10. Some super text and some sub text

    Superscripts and subscripts are implemented as unconstrained quotes so they can be escaped with a leading backslash and prefixed with with an attribute list.

    7.4. Line Breaks (HTML/XHTML)

    A plus character preceded by at least one space character at the end of a line forces a line break. It generates an HTML line break (<br />) tag. Line breaks are ignored when outputting to DocBook since it has no line break element.

    7.5. Rulers (HTML/XHTML)

    A line of four or more apostrophe characters will generate an HTML ruler (<hr />) tag. Ignored when generating non-HTML output formats.

    7.6. Tabs

    By default tab characters input files will translated to 8 spaces. Tab expansion is set with the tabsize entry in the configuration file [miscellaneous] section and can be overridden in the include block macro by setting a tabsize attribute in the macro's attribute list. For example:

    include::addendum.txt[tabsize=2]

    The tab size can also be set using the attribute command-line option, for example --attribute tabsize=4

    7.7. Replacements

    The following replacements are defined in the default AsciiDoc configuration:

    (C) copyright, (TM) trademark, (R) registered trademark,
    -- em dash, ... ellipsis, -> right arrow, <- left arrow, => right
    double arrow, <= left double arrow.

    Which are rendered as:

    © copyright, ™ trademark, ® registered trademark, — em dash, … ellipsis, → right arrow, ← left arrow, ⇒ right double arrow, ⇐ left double arrow.

    The Configuration Files section explains how to configure your own replacements.

    7.8. Special Words

    Words defined in [specialwords] configuration file sections are automatically marked up without having to be explicitly notated.

    The Configuration Files section explains how to add and replace special words.

    8. Titles

    Document and section titles can be in either of two formats:

    8.1. Two line titles

    A two line title consists of a title line, starting hard against the left margin, and an underline. Section underlines consist a repeated character pairs spanning the width of the preceding title (give or take up to three characters):

    The default title underlines for each of the document levels are:

    Level 0 (top level):     ======================
    Level 1:                 ----------------------
    Level 2:                 ~~~~~~~~~~~~~~~~~~~~~~
    Level 3:                 ^^^^^^^^^^^^^^^^^^^^^^
    Level 4 (bottom level):  ++++++++++++++++++++++

    Examples:

    Level One Section Title
    -----------------------
    Level 2 Subsection Title
    ~~~~~~~~~~~~~~~~~~~~~~~~

    8.2. One line titles

    One line titles consist of a single line delimited on either side by one or more equals characters (the number of equals characters corresponds to the section level minus one). Here are some examples (levels 2 and 3 illustrate the optional trailing equals characters syntax):

    = Document Title (level 0) =
    == Section title (level 1) ==
    === Section title (level 2) ===
    ==== Section title (level 3) ====
    ===== Section title (level 4) =====
    Note
    • One or more spaces must fall between the title and the delimiters.

    • The trailing title delimiter is optional.

    • The one-line title syntax can be changed by editing the configuration file [titles] section sect0sect4 entries.

    9. BlockTitles

    A BlockTitle element is a single line beginning with a period followed by a title. The title is applied to the next Paragraph, DelimitedBlock, List, Table or BlockMacro. For example:

    .Notes
    - Note 1.
    - Note 2.

    is rendered as:

    Notes
    • Note 1.

    • Note 2.

    10. BlockId Element

    A BlockId is a single line block element containing a unique identifier enclosed in double square brackets. It is used to assign an identifier to the ensuing block element for use by referring links. For example:

    [[chapter-titles]]
    Chapter titles can be ...

    The preceding example identifies the following paragraph so it can be linked from other location, for example with <<chapter-titles,chapter titles>>.

    BlockId elements can be applied to Title, Paragraph, List, DelimitedBlock, Table and BlockMacro elements. The BlockId element is really just an AttributeList with a special syntax which sets the {id} attribute for substitution in the subsequent block's markup template.

    The BlockId element has the same syntax and serves a similar function to the anchor inline macro.

    11. Paragraphs

    Paragraphs are terminated by a blank line, the end of file, or the start of a DelimitedBlock.

    Paragraph markup is specified by configuration file [paradef*] sections. AsciiDoc ships with the following predefined paragraph types:

    11.1. Default Paragraph

    A Default paragraph ([paradef-default]) consists of one or more non-blank lines of text. The first line must start hard against the left margin (no intervening white space). The processing expectation of the default paragraph type is that of a normal paragraph of text.

    The verse paragraph style preserves line boundaries and is useful for lyrics and poems. For example:

    [verse]
    Consul *necessitatibus* per id,
    consetetur, eu pro everti postulant
    homero verear ea mea, qui.

    Renders:

    Consul necessitatibus per id, consetetur, eu pro everti postulant homero verear ea mea, qui.

    11.2. Literal Paragraph

    A Literal paragraph ([paradef-literal]) consists of one or more lines of text, where the first line is indented by one or more space or tab characters. Literal paragraphs are rendered verbatim in a monospaced font usually without any distinguishing background or border. There is no text formatting or substitutions within Literal paragraphs apart from Special Characters and Callouts. For example:

      Consul *necessitatibus* per id,
      consetetur, eu pro everti postulant
      homero verear ea mea, qui.

    Renders:

    Consul *necessitatibus* per id,
    consetetur, eu pro everti postulant
    homero verear ea mea, qui.
    Note Because lists can be indented it's possible for your Literal paragraph to be misinterpreted as a list — in situations like this use a LiteralBlock in place of a LiteralParagraph.

    11.3. Admonition Paragraphs

    Tip, Note, Important, Warning and Caution paragraph definitions support the corresponding DocBook admonishment elements — just write a normal paragraph but place NOTE:, TIP:, IMPORTANT:, WARNING: or CAUTION: as the first word of the paragraph. For example:

    NOTE: This is an example note.

    or the alternative syntax:

    [NOTE]
    This is an example note.

    Renders:

    Note This is an example note.
    Tip If your admonition is more than a single paragraph use an admonition block instead.

    11.3.1. Admonition Icons and Captions

    Note Admonition customization with icons, iconsdir, icon and caption attributes does not apply when generating DocBook output. If you are going the DocBook route then the a2x(1) —no-icons and —icons-dir options can be used to set the appropriate XSL Stylesheets parameters.

    By default the asciidoc(1) xhtml11 and html4 backends generate text captions instead of icon image links. To generate links to icon images define the icons attribute, for example using the -a icons command-line option.

    The iconsdir attribute sets the location of linked icon images.

    You can override the default icon image using the icon attribute to specify the path of the linked image. For example:

    [icon="./images/icons/wink.png"]
    NOTE: What lovely war.

    Use the caption attribute to customize the admonition captions (not applicable to docbook backend). The following example suppresses the icon image and customizes the caption of a NOTE admonition (undefining the icons attribute with icons=None is only necessary if admonition icons have been enabled):

    [icons=None, caption="My Special Note"]
    NOTE: This is my special note.

    This subsection also applies to Admonition Blocks.

    12. Delimited Blocks

    Delimited blocks are blocks of text enveloped by leading and trailing delimiter lines (normally a series of four or more repeated characters). The behavior of Delimited Blocks is specified by entries in configuration file [blockdef*] sections.

    12.1. Predefined Delimited Blocks

    AsciiDoc ships with a number of predefined DelimitedBlocks (see the asciidoc.conf configuration file in the asciidoc(1) program directory):

    Predefined delimited block underlines:

    CommentBlock:     //////////////////////////
    PassthroughBlock: ++++++++++++++++++++++++++
    ListingBlock:     --------------------------
    LiteralBlock:     ..........................
    SidebarBlock:     **************************
    QuoteBlock:       __________________________
    ExampleBlock:     ==========================
    Filter blocks:    ~~~~~~~~~~~~~~~~~~~~~~~~~~

    The code, source and music filter blocks are detailed in the Filters section.

    Table: Default DelimitedBlock substitutions
    Passthrough Listing Literal Sidebar Quote
    Callouts No Yes Yes No No
    Attributes Yes No No Yes Yes
    Inline Macros Yes No No Yes Yes
    Quotes No No No Yes Yes
    Replacements No No No Yes Yes
    Special chars No Yes Yes Yes Yes
    Special words No No No Yes Yes

    12.2. Listing Blocks

    ListingBlocks are rendered verbatim in a monospaced font, they retain line and whitespace formatting and often distinguished by a background or border. There is no text formatting or substitutions within Listing blocks apart from Special Characters and Callouts. Listing blocks are often used for code and file listings.

    Here's an example:

    --------------------------------------
    #include <stdio.h>
    int main() {
        printf("Hello World!\n");
        exit(0);
    }
    --------------------------------------

    Which will be rendered like:

    #include <stdio.h>
    
    int main() {
        printf("Hello World!\n");
        exit(0);
    }

    12.3. Literal Blocks

    LiteralBlocks behave just like LiteralParagraphs except you don't have to indent the contents.

    LiteralBlocks can be used to resolve list ambiguity. If the following list was just indented it would be processed as an ordered list (not an indented paragraph):

    ....................
    1. Item 1
    2. Item 2
    ....................

    Renders:

    1. Item 1
    2. Item 2

    12.4. SidebarBlocks

    A sidebar is a short piece of text presented outside the narrative flow of the main text. The sidebar is normally presented inside a bordered box to set it apart from the main text.

    The sidebar body is treated like a normal section body.

    Here's an example:

    .An Example Sidebar
    ************************************************
    Any AsciiDoc SectionBody element (apart from
    SidebarBlocks) can be placed inside a sidebar.
    ************************************************

    Which will be rendered like:

    12.5. Comment Blocks

    The contents of CommentBlocks are not processed; they are useful for annotations and for excluding new or outdated content that you don't want displayed. Here's and example:

    //////////////////////////////////////////
    CommentBlock contents are not processed by
    asciidoc(1).
    //////////////////////////////////////////

    See also Comment Lines.

    12.6. Passthrough Blocks

    PassthroughBlocks are for backend specific markup, text is only subject to attribute and macro substitution. PassthroughBlock content will generally be backend specific. Here's an example:

    ++++++++++++++++++++++++++++++++++++++
    <table border="1"><tr>
      <td>Cell 1</td>
      <td>Cell 2</td>
    </tr></table>
    ++++++++++++++++++++++++++++++++++++++

    12.7. Quote Blocks

    QuoteBlocks are used for quoted passages of text. There are two styles: quote and verse (the first positional attribute). The attribution and citetitle attributes (positional attributes 2 and 3) specify the content author and source. If no attributes are specified the quote style is used.

    The quote style treats the content like a SectionBody, for example:

    [quote, Bertrand Russell, The World of Mathematics (1956)]
    ____________________________________________________________________
    A good notation has subtlety and suggestiveness which at times makes
    it almost seem like a live teacher.
    ____________________________________________________________________

    Which is rendered as:

    A good notation has subtlety and suggestiveness which at times makes it almost seem like a live teacher.

    The World of Mathematics (1956)
    — Bertrand Russell

    The verse style retains the content's line breaks, for example:

    [verse, William Blake, from Auguries of Innocence]
    __________________________________________________
    To see a world in a grain of sand,
    And a heaven in a wild flower,
    Hold infinity in the palm of your hand,
    And eternity in an hour.
    __________________________________________________

    Which is rendered as:

    To see a world in a grain of sand, And a heaven in a wild flower, Hold infinity in the palm of your hand, And eternity in an hour.
    from Auguries of Innocence
    — William Blake

    12.8. Example Blocks

    ExampleBlocks encapsulate the DocBook Example element and are used for, well, examples. Example blocks can be titled by preceding them with a BlockTitle. DocBook toolchains normally number examples and generate a List of Examples backmatter section.

    Example blocks are delimited by lines of equals characters and you can put any block elements apart from Titles, BlockTitles and Sidebars) inside an example block. For example:

    .An example
    =====================================================================
    Qui in magna commodo, est labitur dolorum an. Est ne magna primis
    adolescens.
    =====================================================================

    Renders:

    Example: An example

    Qui in magna commodo, est labitur dolorum an. Est ne magna primis adolescens.

    The title prefix that is automatically inserted by asciidoc(1) can be customized with the caption attribute (xhtml11 and html4 backends). For example

    [caption="Example 1: "]
    .An example with a custom caption
    =====================================================================
    Qui in magna commodo, est labitur dolorum an. Est ne magna primis
    adolescens.
    =====================================================================

    12.9. Admonition Blocks

    The ExampleBlock definition includes a set of admonition styles (NOTE, TIP, IMPORTANT, WARNING, CAUTION) for generating admonition blocks (admonitions containing more than just a simple paragraph). Just precede the ExampleBlock with an attribute list containing the admonition style name. For example:

    [NOTE]
    .A NOTE block
    =====================================================================
    Qui in magna commodo, est labitur dolorum an. Est ne magna primis
    adolescens.
    
    . Fusce euismod commodo velit.
    . Vivamus fringilla mi eu lacus.
      .. Fusce euismod commodo velit.
      .. Vivamus fringilla mi eu lacus.
    . Donec eget arcu bibendum
      nunc consequat lobortis.
    =====================================================================

    Renders:

    Note
    A NOTE block

    Qui in magna commodo, est labitur dolorum an. Est ne magna primis adolescens.

    1. Fusce euismod commodo velit.

    2. Vivamus fringilla mi eu lacus.

      1. Fusce euismod commodo velit.

      2. Vivamus fringilla mi eu lacus.

    3. Donec eget arcu bibendum nunc consequat lobortis.

    13. Lists

    List types
    • Bulleted lists. Also known as itemized or unordered lists.

    • Numbered lists. Also called ordered lists.

    • Labeled lists. Sometimes called variable or definition lists.

    • Callout lists (a list of callout annotations).

    List behavior
    • Indentation is optional and does not determine nesting, indentation does however make the source more readable.

    • A nested list must use a different syntax from its parent so that asciidoc(1) can distinguish the start of a nested list.

    • By default lists of the same type can only be nested two deep; this could be increased by defining new list definitions.

    • In addition to nested lists a list item will include immediately following Literal paragraphs.

    • Use List Item Continuation to include other block elements in a list item.

    • The listindex intrinsic attribute is the current list item index (1..). If this attribute is not inside a list then it's value is the number of items in the most recently closed list. Useful for displaying the number of items in a list.

    13.1. Bulleted and Numbered Lists

    Bulleted list items start with a dash or an asterisk followed by a space or tab character. Bulleted list syntaxes are:

    - List item.
    * List item.

    Numbered list items start with an optional number or letter followed by a period followed by a space or tab character. List numbering is optional. Numbered list syntaxes are:

    .  Integer numbered list item.
    1. Integer numbered list item with optional numbering.
    .. Lowercase letter numbered list item.
    a. Lowercase letter numbered list item with optional numbering.

    Here are some examples:

    - Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
      * Fusce euismod commodo velit.
      * Qui in magna commodo, est labitur dolorum an. Est ne magna primis
        adolescens. Sit munere ponderum dignissim et. Minim luptatum et
        vel.
      * Vivamus fringilla mi eu lacus.
      * Donec eget arcu bibendum nunc consequat lobortis.
    - Nulla porttitor vulputate libero.
      . Fusce euismod commodo velit.
      . Vivamus fringilla mi eu lacus.
        .. Fusce euismod commodo velit.
        .. Vivamus fringilla mi eu lacus.
      . Donec eget arcu bibendum nunc consequat lobortis.
    - Praesent eget purus quis magna eleifend eleifend.
      1. Fusce euismod commodo velit.
        a. Fusce euismod commodo velit.
        b. Vivamus fringilla mi eu lacus.
        c. Donec eget arcu bibendum nunc consequat lobortis.
      2. Vivamus fringilla mi eu lacus.
      3. Donec eget arcu bibendum nunc consequat lobortis.
      4. Nam fermentum mattis ante.

    Which render as:

    • Lorem ipsum dolor sit amet, consectetuer adipiscing elit.

      • Fusce euismod commodo velit.

      • Qui in magna commodo, est labitur dolorum an. Est ne magna primis adolescens. Sit munere ponderum dignissim et. Minim luptatum et vel.

      • Vivamus fringilla mi eu lacus.

      • Donec eget arcu bibendum nunc consequat lobortis.

    • Nulla porttitor vulputate libero.

      1. Fusce euismod commodo velit.

      2. Vivamus fringilla mi eu lacus.

        1. Fusce euismod commodo velit.

        2. Vivamus fringilla mi eu lacus.

      3. Donec eget arcu bibendum nunc consequat lobortis.

    • Praesent eget purus quis magna eleifend eleifend.

      1. Fusce euismod commodo velit.

        1. Fusce euismod commodo velit.

        2. Vivamus fringilla mi eu lacus.

        3. Donec eget arcu bibendum nunc consequat lobortis.

      2. Vivamus fringilla mi eu lacus.

      3. Donec eget arcu bibendum nunc consequat lobortis.

      4. Nam fermentum mattis ante.

    13.2. Vertical Labeled Lists

    Labeled list items consist of one or more text labels followed the text of the list item.

    An item label begins a line with an alphanumeric character hard against the left margin and ends with a double colon :: or semi-colon ;;.

    The list item text consists of one or more lines of text starting on the line immediately following the label and can be followed by nested List or ListParagraph elements. Item text can be optionally indented.

    Here are some examples:

    Lorem::
      Fusce euismod commodo velit.
    
      Fusce euismod commodo velit.
    
    Ipsum::
      Vivamus fringilla mi eu lacus.
      * Vivamus fringilla mi eu lacus.
      * Donec eget arcu bibendum nunc consequat lobortis.
    Dolor::
      Donec eget arcu bibendum nunc consequat lobortis.
      Suspendisse;;
        A massa id sem aliquam auctor.
      Morbi;;
        Pretium nulla vel lorem.
      In;;
        Dictum mauris in urna.

    Which render as:

    Lorem

    Fusce euismod commodo velit.

    Fusce euismod commodo velit.
    Ipsum

    Vivamus fringilla mi eu lacus.

    • Vivamus fringilla mi eu lacus.

    • Donec eget arcu bibendum nunc consequat lobortis.

    Dolor

    Donec eget arcu bibendum nunc consequat lobortis.

    Suspendisse

    A massa id sem aliquam auctor.

    Morbi

    Pretium nulla vel lorem.

    In

    Dictum mauris in urna.

    13.3. Horizontal Labeled Lists

    Horizontal labeled lists differ from vertical labeled lists in that the label and the list item sit side-by-side as opposed to the item under the label. Item text must begin on the same line as the label although you can begin item text on the next line if you follow the label with a backslash.

    The following horizontal list example also illustrates the omission of optional indentation:

    *Lorem*:: Fusce euismod commodo velit.  Qui in magna commodo, est
    labitur dolorum an. Est ne magna primis adolescens.
    
      Fusce euismod commodo velit.
    
    *Ipsum*:: Vivamus fringilla mi eu lacus.
    - Vivamus fringilla mi eu lacus.
    - Donec eget arcu bibendum nunc consequat lobortis.
    
    *Dolor*:: \
      - Vivamus fringilla mi eu lacus.
      - Donec eget arcu bibendum nunc consequat lobortis.

    Which render as:

    Lorem Fusce euismod commodo velit. Qui in magna commodo, est labitur dolorum an. Est ne magna primis adolescens.
    Fusce euismod commodo velit.
    Ipsum Vivamus fringilla mi eu lacus.
    • Vivamus fringilla mi eu lacus.

    • Donec eget arcu bibendum nunc consequat lobortis.

    Dolor
    • Vivamus fringilla mi eu lacus.

    • Donec eget arcu bibendum nunc consequat lobortis.

    Warning
    • Use vertical labeled lists in preference to horizontal labeled lists — current PDF toolchains do not make a good job of determining the relative column widths.

    • If you are generating DocBook markup the horizontal labeled lists should not be nested because the DocBook XML V4.2 DTD does not permit nested informal tables (although DocBook XSL Stylesheets process them correctly).

    13.4. Question and Answer Lists

    AsciiDoc comes pre-configured with a labeled list for generating DocBook question and answer (Q&A) lists (?? label delimiter). Example:

    Question one??
            Answer one.
    Question two??
            Answer two.

    Renders:

    1. Question one

      Answer one.

    2. Question two

      Answer two.

    13.5. Glossary Lists

    AsciiDoc comes pre-configured with a labeled list (:- label delimiter) for generating DocBook glossary lists. Example:

    A glossary term:-
        The corresponding definition.
    A second glossary term:-
        The corresponding definition.

    For working examples see the article.txt and book.txt documents in the AsciiDoc ./doc distribution directory.

    Note To generate valid DocBook output glossary lists must be located in a glossary section.

    13.6. Bibliography Lists

    AsciiDoc comes with a predefined itemized list (+ item bullet) for generating bibliography entries. Example:

    + [[[taoup]]] Eric Steven Raymond. 'The Art of UNIX
      Programming'. Addison-Wesley. ISBN 0-13-142901-9.
    + [[[walsh-muellner]]] Norman Walsh & Leonard Muellner.
      'DocBook - The Definitive Guide'. O'Reilly & Associates.
      1999. ISBN 1-56592-580-7.

    The [[[<reference>]]] syntax is a bibliography entry anchor, it generates an anchor named <reference> and additionally displays [<reference>] at the anchor position. For example [[[taoup]]] generates an anchor named taoup that displays [taoup] at the anchor position. Cite the reference from elsewhere your document using <<taoup>>, this displays a hyperlink ([taoup]) to the corresponding bibliography entry anchor.

    For working examples see the article.txt and book.txt documents in the AsciiDoc ./doc distribution directory.

    Note To generate valid DocBook output bibliography lists must be located in a bibliography section.

    13.7. List Item Continuation

    To include subsequent block elements in list items (in addition to implicitly included nested lists and Literal paragraphs) place a separator line containing a single plus character between the list item and the ensuing list continuation element. Multiple block elements (excluding section Titles and BlockTitles) may be included in a list item using this technique. For example:

    Here's an example of list item continuation:

    1. List item one.
    +
    List item one continued with a second paragraph followed by an
    Indented block.
    +
    .................
    $ ls *.sh
    $ mv *.sh ~/tmp
    .................
    +
    List item one continued with a third paragraph.
    
    2. List item two.
    
       List item two literal paragraph (no continuation required).
    
    -  Nested list (item one).
    
       Nested list literal paragraph (no continuation required).
    +
    Nested list appended list item one paragraph
    
    -  Nested list item two.

    Renders:

    1. List item one.

      List item one continued with a second paragraph followed by a Listing block.

      $ ls *.sh
      $ mv *.sh ~/tmp

      List item one continued with a third paragraph.

    2. List item two.

      List item two literal paragraph (no continuation required).
      • Nested list (item one).

        Nested list literal paragraph (no continuation required).

        Nested list appended list item one paragraph

      • Nested list item two.

    13.8. List Block

    A List block is a special delimited block containing a list element.

    • All elements between in the List Block are part of the preceding list item. In this respect the List block behaves like List Item Continuation except that list items contained within the block do not require explicit + list item continuation lines:

    • The block delimiter is a single line containing two dashes.

    • Any block title or attributes are passed to the first element inside the block.

    The List Block is useful for:

    1. Lists with long multi-element list items.

    2. Nesting a list within a parent list item (by default nested lists follow the preceding list item).

    Here's an example of a nested list block:

    .Nested List Block
    1. List item one.
    +
    This paragraph is part of the preceding list item
    +
    --
    a. This list is nested and does not require explicit item continuation.
    
    This paragraph is part of the preceding list item
    
    b. List item b.
    
    This paragraph belongs to list item b.
    --
    +
    This paragraph belongs to item 1.
    
    2. Item 2 of the outer list.

    Renders:

    Nested List Block
    1. List item one.

      This paragraph is part of the preceding list item

      1. This list is nested and does not require explicit item continuation.

        This paragraph is part of the preceding list item

      2. List item b.

        This paragraph belongs to list item b.

      This paragraph belongs to item 1.

    2. Item 2 of the outer list.

    14. Footnotes

    The shipped AsciiDoc configuration includes the footnote:[<text>] inline macro for generating footnotes. The footnote text can span multiple lines. Example footnote:

    A footnote footnote:[An example footnote.]

    Which renders:

    A footnote
    [An example footnote.]

    Footnotes are primarily useful when generating DocBook output — DocBook conversion programs render footnote outside the primary text flow.

    15. Indexes

    The shipped AsciiDoc configuration includes the inline macros for generating document index entries.

    indexterm:[<primary>,<secondary>,<tertiary>]
    (((<primary>,<secondary>,<tertiary>)))

    This inline macro generates an index term (the <secondary> and <tertiary> attributes are optional). For example indexterm:[Tigers,Big cats] (or, using the alternative syntax (((Tigers,Big cats))). Index terms that have secondary and tertiary entries also generate separate index terms for the secondary and tertiary entries. The index terms appear in the index, not the primary text flow.

    indexterm2:[<primary>]
    ((<primary>))

    This inline macro generates an index term that appears in both the index and the primary text flow. The <primary> should not be padded to the left or right with white space characters.

    For working examples see the article.txt and book.txt documents in the AsciiDoc ./doc distribution directory.

    Note Index entries only really make sense if you are generating DocBook markup — DocBook conversion programs automatically generate an index at the point an Index section appears in source document.

    16. Callouts

    Callouts are a mechanism for annotating verbatim text (source code, computer output and user input for example). Callout markers are placed inside the annotated text while the actual annotations are presented in a callout list after the annotated text. Here's an example:

    .MS-DOS directory listing
    .....................................................
    10/17/97   9:04         <DIR>    bin
    10/16/97  14:11         <DIR>    DOS            <1>
    10/16/97  14:40         <DIR>    Program Files
    10/16/97  14:46         <DIR>    TEMP
    10/17/97   9:04         <DIR>    tmp
    10/16/97  14:37         <DIR>    WINNT
    10/16/97  14:25             119  AUTOEXEC.BAT   <2>
     2/13/94   6:21          54,619  COMMAND.COM    <2>
    10/16/97  14:25             115  CONFIG.SYS     <2>
    11/16/97  17:17      61,865,984  pagefile.sys
     2/13/94   6:21           9,349  WINA20.386     <3>
    .....................................................
    
    <1> This directory holds MS-DOS.
    <2> System startup code for DOS.
    <3> Some sort of Windows 3.1 hack.

    Which renders:

    MS-DOS directory listing
    10/17/97   9:04         <DIR>    bin
    10/16/97  14:11         <DIR>    DOS            (1)
    10/16/97  14:40         <DIR>    Program Files
    10/16/97  14:46         <DIR>    TEMP
    10/17/97   9:04         <DIR>    tmp
    10/16/97  14:37         <DIR>    WINNT
    10/16/97  14:25             119  AUTOEXEC.BAT   (2)
     2/13/94   6:21          54,619  COMMAND.COM    (2)
    10/16/97  14:25             115  CONFIG.SYS     (2)
    11/16/97  17:17      61,865,984  pagefile.sys
     2/13/94   6:21           9,349  WINA20.386     (3)
    1. This directory holds MS-DOS.

    2. System startup code for DOS.

    3. Some sort of Windows 3.1 hack.

    Explanation
    • The callout marks are whole numbers enclosed in angle brackets that refer to an item index in the following callout list.

    • By default callout marks are confined to LiteralParagraphs, LiteralBlocks and ListingBlocks (although this is a configuration file option and can be changed).

    • Callout list item numbering is fairly relaxed — list items can start with <n>, n> or > where n is the optional list item number (in the latter case list items starting with a single > character are implicitly numbered starting at one).

    • Callout lists should not be nested — start list items hard against the left margin.

    • If you want to present a number inside angle brackets you'll need to escape it with a backslash to prevent it being interpreted as a callout mark.

    Note To include callout icons in PDF files generated by a2x(1) you need to use the —icons command-line option.

    16.1. Implementation Notes

    Callout marks are generated by the callout inline macro while callout lists are generated using the callout list definition. The callout macro and callout list are special in that they work together. The callout inline macro is not enabled by the normal macros substitutions option, instead it has its own callouts substitution option.

    The following attributes are available during inline callout macro substitution:

    {index}

    The callout list item index inside the angle brackets.

    {coid}

    An identifier formatted like CO<listnumber>-<index> that uniquely identifies the callout mark. For example CO2-4 identifies the fourth callout mark in the second set of callout marks.

    The {coids} attribute can be used during callout list item substitution — it is a space delimited list of callout IDs that refer to the explanatory list item.

    16.2. Including callouts in included code

    You can annotate working code examples with callouts — just remember to put the callouts inside source code comments. This example displays the test.py source file (containing a single callout) using the Source Code Highlighter Filter:

    Example: AsciiDoc source
     [source,python]
     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     include::test.py[]
     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
     <1> Print statement.
    Example: Included test.py source
    print 'Hello World!'   # <1>

    17. Macros

    Macros are a mechanism for substituting parametrized text into output documents.

    Macros have a name, a single target argument and an attribute list. The default syntax is <name>:<target>[<attributelist>] (for inline macros) and <name>::<target>[<attributelist>] (for block macros). Here are some examples:

    http://www.methods.co.nz/asciidoc/index.html[Asciidoc home page]
    include::chapt1.txt[tabsize=2]
    mailto:srackham@gmail.com[]
    Macro behavior
    • <name> is the macro name. It can only contain letters, digits or dash characters and cannot start with a dash.

    • The optional <target> cannot contain white space characters.

    • <attributelist> is a list of attributes enclosed in square brackets.

    • The attribute list is mandatory except for URLs and email addresses.

    • Expansion of non-system macro references can be escaped by prefixing a backslash character.

    • Block macro attribute reference substitution is performed prior to macro expansion.

    • The substitutions performed prior to Inline macro macro expansion are determined by the inline context.

    • Macros are processed in the order they appear in the configuration file(s).

    • Calls to inline macros can be nested inside different inline macros (an inline macro call cannot contain a nested call to itself).

    17.1. Inline Macros

    Inline Macros occur in an inline element context. Predefined Inline macros include URLs, image and link macros.

    17.1.1. URLs

    http, https, ftp, file, mailto and callto URLs are rendered using predefined inline macros.

    • If you don't need a customized the link caption you can enter the http, https, ftp, file URLs and email addresses without any special macro syntax.

    • If no caption text is specified the URL is displayed.

    Here are some examples:

    http://www.methods.co.nz/asciidoc/[The AsciiDoc home page]
    http://www.methods.co.nz/asciidoc/
    mailto:joe.bloggs@foobar.com[email Joe Bloggs]
    joe.bloggs@foobar.com
    callto:joe.bloggs[]

    Which are rendered:

    • If the <target> necessitates space characters they should be replaced by %20. For example large%20image.png.

    • Define an attribute entry if you refer to the same URL more than once, this will make your document easier to maintain and easier to read.

    17.1.2. Internal Cross References

    Two AsciiDoc inline macros are provided for creating hypertext links within an AsciiDoc document. You can use either the standard macro syntax or the (preferred) alternative.

    anchor

    Used to specify hypertext link targets:

    [[<id>,<xreflabel>]]
    anchor:<id>[<xreflabel>]

    The <id> is a unique identifier that must begin with a letter. The optional <xreflabel> is the text to be displayed by captionless xref macros that refer to this anchor. The optional <xreflabel> is only really useful when generating DocBook output. Example anchor:

    [[X1]]

    You may have noticed that the syntax of this inline element is the same as that of the BlockId block element, this is no coincidence since they are functionally equivalent.

    xref

    Creates a hypertext link to a document anchor.

    <<<id>,<caption>>>
    xref:<id>[<caption>]

    The <id> refers to an existing anchor <id>. The optional <caption> is the link's displayed text. Example:

    <<X21,attribute lists>>

    If <caption> is not specified then the displayed text is auto-generated:

    • The AsciiDoc xhtml11 backend displays the <id> enclosed in square brackets.

    • If DocBook is produced the DocBook toolchain is responsible for the displayed text which will normally be the referenced figure, table or section title number followed by the element's title text.

    Here is an example:

    [[tiger_image]]
    .Tyger tyger
    image::tiger.png[]
    
    This can be seen in <<tiger_image>>.

    17.1.3. Linking to Local Documents

    Hypertext links to files on the local file system are specified using the link inline macro.

    link:<target>[<caption>]

    The link macro generates relative URLs. The link macro <target> is the target file name (relative to the file system location of the referring document). The optional <caption> is the link's displayed text. If <caption> is not specified then <target> is displayed. Example:

    link:downloads/foo.zip[download foo.zip]

    You can use the <filename>#<id> syntax to refer to an anchor within a target document but this usually only makes sense when targeting HTML documents.

    Images can serve as hyperlinks using the image macro.

    17.1.4. Images

    Inline images are inserted into the output document using the image macro. The inline syntax is:

    image:<target>[<attributes>]

    The contents of the image file <target> is displayed. To display the image its file format must be supported by the target backend application. HTML and DocBook applications normally support PNG or JPG files.

    <target> file name paths are relative to the location of the referring document.

    Image macro attributes
    • The optional first positional attribute list entry specifies the alternative text which is displayed if the output application is unable to process the image file. For example:

      image:images/logo.png[Company Logo]
    • The optional width and height attributes scale the image size and can be used in any combination. The units are pixels. The following example scales the previous example to a height of 32 pixels:

      image:images/logo.png["Company Logo",height=32]
    • The optional link attribute is used to link the image to an external document. The following example links a screenshot thumbnail to a full size version:

      image:screen-thumbnail.png[height=32,link="screen.png"]
    • The optional scaledwidth attribute is only used in DocBook block images (specifically for PDF documents). The following example scales the images to 75% of the available print width:

      image::images/logo.png["Company Logo",scaledwidth="75%"]
    • The optional align attribute is used for horizontal image alignment in DocBook block images (specifically for PDF documents). Allowed values are center, left and right. For example:

      image::images/tiger.png["Tiger image",align="left"]

    17.2. Block Macros

    A Block macro reference must be contained in a single line separated either side by a blank line or a block delimiter.

    Block macros behave just like Inline macros, with the following differences:

    • They occur in a block context.

    • The default syntax is <name>::<target>[<attributelist>] (two colons, not one).

    • Markup template section names end in -blockmacro instead of -inlinemacro.

    17.2.1. Block Identifier

    The Block Identifier macro sets the id attribute and has the same syntax as the anchor inline macro since it performs essentially the same function — block templates employ the id attribute as a block link target. For example:

    [[X30]]

    This is equivalent to the [id="X30"] block attribute list.

    17.2.2. Images

    Formal titled images are inserted into the output document using the image macro. The syntax is:

    image::<target>[<attributes>]

    The block image macro has the same macro attributes as its inline counterpart.

    Images can be titled by preceding the image macro with a BlockTitle. DocBook toolchains normally number examples and generate a List of Figures backmatter section.

    For example:

    .Main circuit board
    image::images/layout.png[J14P main circuit board]

    xhtml11 and html4 backends precede the title with a Figure : prefix. You can customize this prefix with the caption attribute. For example:

    .Main circuit board
    [caption="Figure 2:"]
    image::images/layout.png[J14P main circuit board]

    17.2.3. Comment Lines

    Single lines starting with two forward slashes hard up against the left margin are treated as comments and are stripped from the output. Comment lines have been implemented as a block macro and are only valid in a block context — they are not treated as comments inside paragraphs or delimited blocks. Example comment line:

    // This is a comment.

    See also Comment Blocks.

    17.3. System Macros

    System macros are block macros that perform a predefined task which is hardwired into the asciidoc(1) program.

    • You can't escape system macros with a leading backslash character (as you can with other macros).

    • The syntax and tasks performed by system macros is built into asciidoc(1) so they don't appear in configuration files. You can however customize the syntax by adding entries to a configuration file [macros] section.

    17.3.1. Include Macros

    The include and include1 system macros to include the contents of a named file into the source document.

    The include macro includes a file as if it were part of the parent document — tabs are expanded and system macros processed. The contents of include1 files are not subject to tab expansion or system macro processing nor are attribute or lower priority substitutions performed. The include1 macro's main use is to include verbatim embedded CSS or scripts into configuration file headers. Example:

     include::chapter1.txt[tabsize=4]
    Include macro behavior
    • If the included file name is specified with a relative path then the path is relative to the location of the referring document.

    • Include macros can appear inside configuration files.

    • Files included from within DelimitedBlocks are read to completion to avoid false end-of-block underline termination.

    • File inclusion is limited to a depth of 5 to catch recursive loops.

    • Attribute references are expanded inside the include target; if an attribute is undefined then the included file is silently skipped.

    • The tabsize macro attribute sets the number of space characters to be used for tab expansion in the included file.

    • Internally the include1 macro is translated to the include1 system attribute which means it must be evaluated in a region where attribute substitution is enabled — use the include macro instead.

    17.3.2. Conditional Inclusion Macros

    Lines of text in the source document can be selectively included or excluded from processing based on the existence (or not) of a document attribute. There are two forms of conditional inclusion macro usage, the first includes document text between the ifdef and endif macros if a document attribute is defined:

    ifdef::<attribute>[]
    :
    endif::<attribute>[]

    The second for includes document text between the ifndef and endif macros if the attribute is not defined:

    ifndef::<attribute>[]
    :
    endif::<attribute>[]

    <attribute> is an attribute name which is optional in the trailing endif macro.

    Take a look at the *.conf configuration files in the AsciiDoc distribution for examples of conditional inclusion macro usage.

    17.3.3. eval, sys and sys2 System Macros

    These block macros exhibit the same behavior as their same named system attribute references. The difference is that system macros occur in a block macro context whereas system attributes are confined to an inline context where attribute substitution is enabled.

    The following example displays a long directory listing inside a literal block:

    ------------------
    sys::[ls -l *.txt]
    ------------------

    17.3.4. Template System Macro

    The template block macro allows the inclusion of one configuration file template section within another. The following example includes the [admonitionblock] section in the [admonitionparagraph] section:

    [admonitionparagraph]
    template::[admonitionblock]
    Template macro behavior
    • The template::[] macro is useful for factoring configuration file markup.

    • template::[] macros cannot be nested.

    • template::[] macro expansion is applied to all sections after all configuration files have been read.

    17.4. Macro Definitions

    Each entry in the configuration [macros] section is a macro definition which can take one of the following forms:

    <pattern>=<name>

    Inline macro definition.

    <pattern>=#<name>

    Block macro definition.

    <pattern>=+<name>

    System macro definition.

    <pattern>

    Delete the existing macro with this <pattern>.

    <pattern> is a Python regular expression and <name> is the name of a markup template. If <name> is omitted then it is the value of the regular expression match group named name.

    Here's what happens during macro substitution
    • Each contextually relevant macro pattern from the [macros] section is matched against the input source line.

    • If a match is found the text to be substituted is loaded from a configuration markup template section named like <name>-inlinemacro or <name>-blockmacro (depending on the macro type).

    • Global and macro attribute list attributes are substituted in the macro's markup template.

    • The substituted template replaces the macro reference in the output document.

    18. Tables

    Tables are the most complex AsciiDoc elements and this section is quite long.
    [The current table syntax is overly complicated and unwieldy to edit, hopefully a more usable syntax will appear in future versions of AsciiDoc.]

    Note AsciiDoc generates nice HTML tables, but the current crop of DocBook toolchains render tables with varying degrees of success. Use tables only when really necessary.

    18.1. Example Tables

    The following annotated examples are all you'll need to start creating your own tables.

    The only non-obvious thing you'll need to remember are the column stop characters:

    • Backtick (`) — align left.

    • Single quote (') — align right.

    • Period (.) — align center.

    Simple table:

     `---`---
     1   2
     3   4
     5   6
     --------

    Output:

    1 2
    3 4
    5 6

    Table with title, header and footer:

     .An example table
     [grid="all"]
     '---------.--------------
     Column 1   Column 2
     -------------------------
     1          Item 1
     2          Item 2
     3          Item 3
     -------------------------
     6          Three items
     -------------------------

    Output:

    Table: An example table
    Column 1 Column 2
    6 Three items
    1 Item 1
    2 Item 2
    3 Item 3

    Four columns totaling 15% of the pagewidth, CSV data:

    [frame="all"]
    ````~15
    1,2,3,4
    a,b,c,d
    A,B,C,D
    ~~~~~~~~

    Output:

    1 2 3 4
    a b c d
    A B C D

    A table with a numeric ruler and externally sourced CSV data:

     [frame="all", grid="all"]
     .15`20`25`20`~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     ID,Customer Name,Contact Name,Customer Address,Phone
     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     include::customers.csv[]
     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Renders:

    ID Customer Name Contact Name Customer Address Phone
    AROUT Around the Horn Thomas Hardy 120 Hanover Sq.
    London
    (171) 555-7788
    BERGS Berglunds snabbkop Christina Berglund Berguvsvagen 8
    Lulea
    0921-12 34 65
    BLAUS Blauer See Delikatessen Hanna Moos Forsterstr. 57
    Mannheim
    0621-08460
    BLONP Blondel pere et fils Frederique Citeaux 24, place Kleber
    Strasbourg
    88.60.15.31
    BOLID Bolido Comidas preparadas Martin Sommer C/ Araquil, 67
    Madrid
    (91) 555 22 82
    BONAP Bon app' Laurence Lebihan 12, rue des Bouchers
    Marseille
    91.24.45.40
    BOTTM Bottom-Dollar Markets Elizabeth Lincoln 23 Tsawassen Blvd.
    Tsawassen
    (604) 555-4729
    BSBEV B's Beverages Victoria Ashworth Fauntleroy Circus
    London
    (171) 555-1212
    CACTU Cactus Comidas para llevar Patricio Simpson Cerrito 333
    Buenos Aires
    (1) 135-5555

    18.2. AsciiDoc Table Block Elements

    This sub-section details the AsciiDoc table format.

    Table  ::= (Ruler,Header?,Body,Footer?)
    Header ::= (Row+,Underline)
    Footer ::= (Row+,Underline)
    Body   ::= (Row+,Underline)
    Row    ::= (Data+)

    A table is terminated when the table underline is followed by a blank line or an end of file. Table underlines which separate table headers, bodies and footers should not be followed by a blank line.

    18.2.1. Ruler

    The first line of the table is called the Ruler. The Ruler specifies which configuration file table definition to use, column widths, column alignments and the overall table width.

    There are two ruler formats:

    Character ruler

    The column widths are determined by the number of table fill characters between column stop characters.

    Numeric ruler

    The column widths are specified numerically. If a column width is omitted the previous width is used. In the degenerate case of no widths being specified columns are allocated equal widths.

    The ruler format can be summarized as:

    ruler ::= ((colstop,colwidth?,fillchar*)+, fillchar+, tablewidth?
    • The ruler starts with a column stop character (designating the start of the first column).

    • Column stop characters specify the start and alignment of each column:

      • Backtick (`) — align left.

      • Single quote (') — align right.

      • Period (.) — align center.

    • In the case of fixed format tables the ruler column widths specify source row data column boundaries.

    • The optional tablewidth is a number representing the size of the output table relative to the pagewidth. If tablewidth is less than one then it is interpreted as a fraction of the page width; if it is greater than one then it is interpreted as a percentage of the page width. If tablewidth is not specified then the table occupies the full pagewidth (numeric rulers) or the relative width of the ruler compared to the textwidth (character rulers).

    18.2.2. Row and Data Elements

    Each table row consists of a line of text containing the same number of Data items as there are columns in the table,

    Lines ending in a backslash character are continued on the next line.

    Each Data item is an AsciiDoc substitutable string. The substitutions performed are specified by the subs table definition entry. Data cannot contain AsciiDoc block elements.

    The format of the row is determined by the table definition format value:

    fixed

    Row data items are assigned by chopping the row up at ruler column width boundaries.

    csv

    Data items are assigned the parsed CSV (Comma Separated Values) data.

    dsv

    The DSV (Delimiter Separated Values) format is a common UNIX tabular text file format.

    • The separator character is a colon (although this can be set to any letter using the separator table attribute).

    • Common C-style backslash escapes are supported.

    • Blank lines are skipped.

    18.2.3. Underline

    A table Underline consists of a line of three or more fillchar characters which are end delimiters for table header, footer and body sections.

    18.2.4. Attribute List

    The following optional table attributes can be specified in an AttributeList preceding the table:

    separator

    The default DSV format colon separator can be changed using the separator attribute. For example: [separator="|"].

    frame

    Defines the table border and can take the following values: topbot (top and bottom), all (all sides), none and sides (left and right sides). The default value is topbot.

    grid

    Defines which ruler lines are drawn between table rows and columns. The grid attribute value can be any of the following values: none, cols, rows and all. The default value is none. For example [frame="all", grid="none"].

    format, tablewidth

    See Markup Attributes below.

    You can also use an AttributeList to override the following table definition and ruler parameters: format, subs, tablewidth.

    18.2.5. Markup Attributes

    The following attributes are automatically available inside table tag and markup templates.

    cols

    The number of columns in the table.

    colalign

    Column alignment assumes one of three values (left, right or center). The value is determined by the corresponding ruler column stop character (only valid inside colspec, headdata, bodydata and footdata tags).

    colwidth

    The output column widths are calculated integers (only valid inside colspec, headdata, bodydata and footdata tags).

    colnumber

    The table column number starting at 1 (only valid inside colspec, 'headdata`, bodydata and footdata tags).

    format

    The table definition format value (can be overridden with attribute list entry).

    tablewidth

    The ruler tablewidth value (can be overridden with attribute list entry).

    pagewidth

    The pagewidth miscellaneous configuration option.

    pageunits

    The pageunits miscellaneous configuration option.

    The colwidth value is calculated as (N is the ruler column width number and M is the sum of the ruler column widths):

    ( N / M ) * pagewidth

    If the ruler tablewidth was specified the column width is multiplied again by this value.

    There is one exception: character rulers that have no pagewidth specified. In this case the colwidth value is calculated as (where N is the column character width measured on the table ruler):

    ( N / textwidth ) * pagewidth

    The following attributes are available to the table markup template:

    comspecs

    Expands to N substituted comspec tags where N is the number of columns.

    headrows, footrows, bodyrows

    These references expand to sets of substituted header, footer and body rows as defined by the corresponding row and data configuration parameters.

    rows

    Experimental attribute (number of source lines in table) available in table markup templates (used by experimental LaTeX backend).

    19. Manpage Documents

    Sooner or later, if you program for a UNIX environment, you're going to have to write a man page.

    By observing a couple of additional conventions you can compose AsciiDoc files that will translate to a DocBook refentry (man page) document. The resulting DocBook file can then be translated to the native roff man page format (or other formats).

    For example, the asciidoc.1.txt file in the AsciiDoc distribution ./doc directory was used to generate both the asciidoc.1.css-embedded.html HTML file the asciidoc.1 roff formatted asciidoc(1) man page.

    To find out more about man pages view the man(7) manpage (man 7 man and man man-pages commands).

    19.1. Document Header

    A document Header is mandatory. The title line contains the man page name followed immediately by the manual section number in brackets, for example ASCIIDOC(1). The title name should not contain white space and the manual section number is a single digit optionally followed by a single character.

    19.2. The NAME Section

    The first manpage section is mandatory, must be titled NAME and must contain a single paragraph (usually a single line) consisting of a list of one or more comma separated command name(s) separated from the command purpose by a dash character. The dash must have at least one white space character on either side. For example:

    printf, fprintf, sprintf - print formatted output

    19.3. The SYNOPSIS Section

    The second manpage section is mandatory and must be titled SYNOPSIS.

    19.4. refmiscinfo attributes

    In addition to the automatically created man page intrinsic attributes you can assign DocBook refmiscinfo element source, version and manual values using AsciiDoc {mansource}, {manversion} and {manmanual} attributes respectively. This example is from the AsciiDoc header of a man page source file:

    :man source:   AsciiDoc
    :man version:  {revision}
    :man manual:   AsciiDoc Manual

    20. Configuration Files

    AsciiDoc source file syntax and output file markup is largely controlled by a set of cascading, text based, configuration files. At runtime The AsciiDoc default configuration files are combined with optional user and document specific configuration files.

    20.1. Configuration File Format

    Configuration files contain named sections. Each section begins with a section name in square brackets []. The section body consists of the lines of text between adjacent section headings.

    • Section names consist of one or more alphanumeric, underscore or dash characters and cannot begin or end with a dash.

    • Lines starting with a hash character "#" are treated as comments and ignored.

    • Same named sections and section entries override previously loaded sections and section entries (this is sometimes referred to as cascading). Consequently, downstream configuration files need only contain those sections and section entries that need to be overridden.

    Tip When creating custom configuration files you only need to include the sections and entries that differ from the default configuration.
    Tip The best way to learn about configuration files is to read the default configuration files in the AsciiDoc distribution in conjunction with asciidoc(1) output files. You can view configuration file load sequence by turning on the asciidoc(1) -v (—verbose) command-line option.

    20.2. Markup Template Sections

    Markup template sections supply backend markup for translating AsciiDoc elements. Since the text is normally backend dependent you'll find these sections in the backend specific configuration files. A markup template section body can contain:

    • Backend markup

    • Attribute references

    • System macro calls.

    • A document content placeholder

    The document content placeholder is a single | character and is replaced by text from the source element. Use the {brvbar} attribute reference if you need a literal | character in the template.

    20.3. Special Sections

    AsciiDoc reserves the following predefined special section names for specific purposes:

    miscellaneous

    Configuration options that don't belong anywhere else.

    attributes

    Attribute name/value entries.

    specialcharacters

    Special characters reserved by the backend markup.

    tags

    Backend markup tags.

    quotes

    Definitions for quoted inline character formatting.

    specialwords

    Lists of words and phrases singled out for special markup.

    replacements, replacements2

    Find and replace substitution definitions.

    specialsections

    Used to single out special section names for specific markup.

    macros

    Macro syntax definitions.

    titles

    Heading, section and block title definitions.

    paradef*

    Paragraph element definitions.

    blockdef*

    DelimitedBlock element definitions.

    listdef*

    List element definitions.

    tabledef*

    Table element definitions.

    Each line of text in a special section is a section entry. Section entries share the following syntax:

    name=value

    The entry value is set to value.

    name=

    The entry value is set to a zero length string.

    name

    The entry is undefined (deleted from the configuration).

    Section entry behavior
    • All equals characters inside the name must be escaped with a backslash character.

    • name and value are stripped of leading and trailing white space.

    • Attribute names, tag entry names and markup template section names consist of one or more alphanumeric, underscore or dash characters. Names should not begin or end with a dash.

    • A blank configuration file section (one without any entries) deletes any preceding section with the same name (applies to non-markup template sections).

    20.3.1. Miscellaneous

    The optional [miscellaneous] section specifies the following name=value options:

    newline

    Output file line termination characters. Can include any valid Python string escape sequences. The default value is \r\n (carriage return, line feed). Should not be quoted or contain explicit spaces (use \x20 instead). For example:

    $ asciidoc -a 'newline=\n' -b docbook mydoc.txt
    outfilesuffix

    The default extension for the output file, for example outfilesuffix=.html. Defaults to backend name.

    tabsize

    The number of spaces to expand tab characters, for example tabsize=4. Defaults to 8. A tabsize of zero suppresses tab expansion (useful when piping included files through block filters). Included files can override this option using the tabsize attribute.

    textwidth, pagewidth, pageunits

    These global table related options are documented in the Table Configuration File Definitions sub-section.

    Note [miscellaneous] configuration file entries can be set using the asciidoc(1) -a (—attribute) command-line option.

    20.3.2. Titles

    sectiontitle

    Two line section title pattern. The entry value is a Python regular expression containing the named group title.

    underlines

    A comma separated list of document and section title underline character pairs starting with the section level 0 and ending with section level 4 underline. The default setting is:

    underlines="==","--","~~","^^","++"
    sect0…sect4

    One line section title patterns. The entry value is a Python regular expression containing the named group title.

    blocktitle

    BlockTitle element pattern. The entry value is a Python regular expression containing the named group title.

    subs

    A comma separated list of substitutions that are performed on the document header and section titles. Defaults to normal substitution.

    20.3.3. Tags

    The [tags] section contains backend tag definitions (one per line). Tags are used to translate AsciiDoc elements to backend markup.

    An AsciiDoc tag definition is formatted like <tagname>=<starttag>|<endtag>. For example:

    emphasis=<em>|</em>

    In this example asciidoc(1) replaces the | character with the emphasized text from the AsciiDoc input file and writes the result to the output file.

    Use the {brvbar} attribute reference if you need to include a | pipe character inside tag text.

    20.3.4. Attributes Section

    The optional [attributes] section contains predefined attributes.

    If the attribute value requires leading or trailing spaces then the text text should be enclosed in double-quote (") characters.

    To delete a attribute insert a name only entry in a downstream configuration file or use the asciidoc(1) —attribute name! command-line option (the attribute name is suffixed with a ! character to delete it).

    20.3.5. Special Characters

    The [specialcharacters] section specifies how to escape characters reserved by the backend markup. Each translation is specified on a single line formatted like:

    special_character=translated_characters

    Special characters are normally confined to those that resolve markup ambiguity (in the case of SGML/XML markups the ampersand, less than and greater than characters). The following example causes all occurrences of the < character to be replaced by &lt;.

    <=&lt;

    20.3.6. Quoted Text

    Quoting is used primarily for text formatting. The [quotes] section defines AsciiDoc quoting characters and their corresponding backend markup tags. Each section entry value is the name of a of a [tags] section entry. The entry name is the character (or characters) that quote the text. The following examples are taken from AsciiDoc configuration files:

    [quotes]
    _=emphasis
    [tags]
    emphasis=<em>|</em>

    You can specify the left and right quote strings separately by separating them with a | character, for example:

    ``|''=quoted

    Omitting the tag will disable quoting, for example, if you don't want superscripts or subscripts put the following in a custom configuration file or edit the global asciidoc.conf configuration file:

    [quotes]
    ^=
    ~=

    Unconstrained quotes are differentiated by prefixing the tag name with a hash character, for example:

    __=#emphasis
    Quoted text behavior
    • Quote characters must be non-alphanumeric.

    • To minimize quoting ambiguity try not to use the same quote characters in different quote types.

    20.3.7. Special Words

    The [specialwords] section is used to single out words and phrases that you want to consistently format in some way throughout your document without having to repeatedly specify the markup. The name of each entry corresponds to a markup template section and the entry value consists of a list of words and phrases to be marked up. For example:

    [specialwords]
    strongwords=NOTE: IMPORTANT:
    [strongwords]
    <strong>{words}</strong>

    The examples specifies that any occurrence of NOTE: or IMPORTANT: should appear in a bold font.

    Words and word phrases are treated as Python regular expressions: for example, the word ^NOTE: would only match NOTE: if appeared at the start of a line.

    AsciiDoc comes with three built-in Special Word types: emphasizedwords, monospacedwords and strongwords, each has a corresponding (backend specific) markup template section. Edit the configuration files to customize existing Special Words and to add new ones.

    Special word behavior
    • Word list entries must be separated by space characters.

    • Word list entries with embedded spaces should be enclosed in quotation (") characters.

    • A [specialwords] section entry of the form name=word1 [word2…] adds words to existing name entries.

    • A [specialwords] section entry of the form name undefines (deletes) all existing name words.

    • Since word list entries are processed as Python regular expressions you need to be careful to escape regular expression special characters.

    • By default Special Words are substituted before Inline Macros, this may lead to undesirable consequences. For example the special word foobar would be expanded inside the macro call http://www.foobar.com. A possible solution is to emphasize whole words only by defining the word using regular expression characters, for example \bfoobar\b.

    • If the first matched character of a special word is a backslash then the remaining characters are output without markup i.e. the backslash can be used to escape special word markup. For example the special word \\?\b[Tt]en\b will mark up the words Ten and ten only if they are not preceded by a backslash.

    20.3.8. Replacements

    [replacements] and [replacements2] configuration file entries specify find and replace text and are formatted like:

    find_pattern=replacement_text

    The find text can be a Python regular expression; the replace text can contain Python regular expression group references.

    Use Replacement shortcuts for often used macro references, for example (the second replacement allows us to backslash escape the macro name):

    NEW!=image:./images/smallnew.png[New!]
    \\NEW!=NEW!
    Replacement behavior
    • The built-in replacements can be escaped with a backslash.

    • If the find or replace text has leading or trailing spaces then the text should be enclosed in quotation (") characters.

    • Since the find text is processed as a regular expression you need to be careful to escape regular expression special characters.

    • Replacements are performed in the same order they appear in the configuration file replacements section.

    20.4. Configuration File Names and Locations

    Configuration files have a .conf file name extension; they are loaded implicitly (using predefined file names and locations) or explicitly (using the asciidoc(1) -f (—conf-file) command-line option).

    Implicit configuration files are loaded from the following directories in the following order:

    1. The /etc/asciidoc directory (if it exists).

    2. The directory containing the asciidoc executable.

    3. The user's $HOME/.asciidoc directory (if it exists).

    4. The directory containing the AsciiDoc source file.

    The following implicit configuration files from each of the above locations are loaded in the following order:

    1. asciidoc.conf

    2. <backend>.conf

    3. <backend>-<doctype>.conf

    4. lang-<lang>.conf

    Where <backend> and <doctype> are values specified by the asciidoc(1) -b (—backend) and -d (—doctype) command-line options. <lang> is the value of the AsciiDoc lang attribute (defaults to en (English)).

    Finally, configuration files named like the source file will be automatically loaded if they are found in the source file directory. For example if the source file is mydoc.txt and the —backend=html4 option is used then asciidoc(1) will look for mydoc.conf and mydoc-html4.conf in that order.

    Implicit configuration files that don't exist will be silently skipped.

    The user can explicitly specify additional configuration files using the asciidoc(1) -f (—conf-file) command-line option. The -f option can be specified multiple times, in which case configuration files will be processed in the order they appear on the command-line.

    For example, when we translate our AsciiDoc document mydoc.txt with:

    $ asciidoc -f extra.conf mydoc.txt

    Configuration files (if they exist) will be processed in the following order:

    1. First default global configuration files from the asciidoc program directory are loaded:

      asciidoc.conf
      xhtml11.conf
    2. Then, from the users home ~/.asciidoc directory. This is were you put customization specific to your own asciidoc documents:

      asciidoc.conf
      xhtml11.conf
      xhtml11-article.conf
    3. Next from the source document project directory (the first three apply to all documents in the directory, the last two are specific to the mydoc.txt document):

      asciidoc.conf
      xhtml11.conf
      xhtml11-article.conf
      mydoc.conf
      mydoc-xhtml11.conf
    4. Finally the file specified by the -f command-line option is loaded:

      extra.conf
    Tip Use the asciidoc(1) -v (—verbose) command-line option to see which configuration files are loaded and the order in which they are loaded.

    21. Document Attributes

    A document attribute is comprised of a name and a textual value and is used for textual substitution in AsciiDoc documents and configuration files. An attribute reference (an attribute name enclosed in braces) is replaced by its corresponding attribute value.

    There are four sources of document attributes (from highest to lowest precedence):

    • Command-line attributes.

    • AttributeEntry, AttributeList, Macro and BlockId elements.

    • Configuration file [attributes] sections.

    • Intrinsic attributes.

    Within each of these divisions the last processed entry takes precedence.

    Important If an attribute is not defined then the line containing the attribute reference is dropped. This property is used extensively in AsciiDoc configuration files to facilitate conditional markup generation.

    22. Attribute Entries

    The AttributeEntry block element allows document attributes to be assigned within an AsciiDoc document. Attribute entries are added to the global document attributes dictionary. The attribute name/value syntax is a single line like:

    :<name>: <value>

    For example:

    :Author Initials: JB

    This will set an attribute reference {authorinitials} to the value JB in the current document.

    To delete (undefine) an attribute use the following syntax:

    :<name>!:
    AttributeEntry properties
    • The attribute entry line begins with colon — no white space allowed in left margin.

    • AsciiDoc converts the <name> to a legal attribute name (lower case, alphanumeric and dash characters only — all other characters deleted). This allows more reader friendly text to be used.

    • Leading and trailing white space is stripped from the <value>.

    • If the <value> is blank then the corresponding attribute value is set to an empty string.

    • Special characters in the entry <value> are substituted. To include special characters use the predefined {gt}, {lt}, {amp} attribute references.

    • Attribute references contained in the entry <value> will be expanded.

    • By default AttributeEntry values are substituted for specialcharacters and attributes (see above), if you want a different AttributeEntry substitution set the attributeentry-subs attribute.

    • Attribute entries in the document Header are available for header markup template substitution.

    • Attribute elements override configuration file and intrinsic attributes but do not override command-line attributes.

    Here's another example:

    AsciiDoc User Manual
    ====================
    :Author:    Stuart Rackham
    :Email:     srackham@gmail.com
    :Date:      April 23, 2004
    :Revision:  5.1.1
    :Key words: linux, ralink, debian, wireless
    :Revision history:

    Which creates these attributes:

    {author}, {firstname}, {lastname}, {authorinitials}, {email},
    {date}, {revision}, {keywords}, {revisionhistory}

    The preceding example is equivalent to the standard AsciiDoc two line document header. Actually it's a little bit different with the addition of the {keywords} and {revisionhistory} attributes
    [The existence of a {revisionhistory} attribute causes a revision history file (if it exists) to be included in DocBook outputs. If a file named like {docname}-revhistory.xml exists in the document's directory then it will be added verbatim to the DocBook header (see the ./doc/asciidoc-revhistory.xml example that comes with the AsciiDoc distribution).]
    .

    23. Attribute Lists

    An attribute list is a comma separated list of attribute values. The entire list is enclosed in square brackets. Attribute lists are used to pass parameters to macros, blocks and inline quotes.

    The list consists of zero or more positional attribute values followed by zero or more named attribute values. Here are three examples:

    [Hello]
    [quote, Bertrand Russell, The World of Mathematics (1956)]
    ["22 times", backcolor="#0e0e0e", options="noborders,wide"]
    Attribute list properties
    • If one or more attribute values contains a comma the all values must be quoted (enclosed in quotation characters).

    • If the list contains any named attributes the all string attribute values must be quoted.

    • List attributes take precedence over existing attributes.

    • List attributes can only be referenced in configuration file markup templates and tags, they are not available inside the document.

    • Attribute references are allowed inside attribute lists.

    • Setting a named attribute to None undefines the attribute.

    • Positional attributes are referred to as {1},{2},{3},…

    • Attribute {0} refers to the entire list (excluding the enclosing square brackets).

    • If an attribute named options is present it is processed as a comma separated list of attributes with zero length string values. For example [options="opt1,opt2,opt3"] is equivalent to [opt1="",opt2="",opt2=""].

    • Attribute lists are evaluated as a list of Python function arguments. If this fails or any of the items do not evaluate to a string, a number or None then all list items are treated as string literals.

    23.1. Macro Attribute lists

    Macros calls are suffixed with an attribute list. The list may be empty but it cannot be omitted. List entries are used to pass attribute values to macro markup templates.

    23.2. AttributeList Element

    An attribute list on a line by itself constitutes an AttributeList block element, its function is to parametrize the following block element. The list attributes are passed to the next block element for markup template substitution.

    24. Attribute References

    An attribute references is an attribute name (possibly followed by an additional parameters) enclosed in braces. When an attribute reference is encountered it is evaluated and replaced by its corresponding text value. If the attribute is undefined the line containing the attribute is dropped.

    There are three types of attribute reference: Simple, Conditional and System.

    Attribute reference behavior
    • You can suppress attribute reference expansion by placing a backslash character immediately in front of the opening brace character.

    • By default attribute references are not expanded in LiteralParagraphs, ListingBlocks or LiteralBlocks.

    24.1. Simple Attributes References

    Simple attribute references take the form {<name>}. If the attribute name is defined its text value is substituted otherwise the line containing the reference is dropped from the output.

    24.2. Conditional Attribute References

    Additional parameters are used in conjunction with the attribute name to calculate a substitution value. Conditional attribute references take the following forms:

    {<name>=<value>}

    <value> is substituted if the attribute <name> is undefined otherwise its value is substituted. <value> can contain simple attribute references.

    {<name>?<value>}

    <value> is substituted if the attribute <name> is defined otherwise an empty string is substituted. <value> can contain simple attribute references.

    {<name>!<value>}

    <value> is substituted if the attribute <name> is undefined otherwise an empty string is substituted. <value> can contain simple attribute references.

    {<name>#<value>}

    <value> is substituted if the attribute <name> is defined otherwise the undefined attribute entry causes the containing line to be dropped. <value> can contain simple attribute references.

    {<name>%<value>}

    <value> is substituted if the attribute <name> is not defined otherwise the containing line is dropped. <value> can contain simple attribute references.

    {<name>@<regexp>:<value1>[:<value2>]}

    <value1> is substituted if the value of attribute <name> matches the regular expression <regexp> otherwise <value2> is substituted. If attribute <name> is not defined the containing line is dropped. If <value2> is omitted an empty string is assumed. The values and the regular expression can contain simple attribute references. To embed colons in the values or the regular expression escape them with backslashes.

    {<name>$<regexp>:<value1>[:<value2>]}

    Same behavior as the previous ternary attribute except for the following cases:

    {<name>$<regexp>:<value>}

    Substitutes <value> if <name> matches <regexp> otherwise the result is undefined and the containing line is dropped.

    {<name>$<regexp>::<value>}

    Substitutes <value> if <name> does not match <regexp> otherwise the result is undefined and the containing line is dropped.

    24.2.1. Conditional attribute examples

    Conditional attributes are mainly used in AsciiDoc configuration files — see the distribution .conf files for examples.

    Attribute equality test

    If {backend} is docbook or xhtml11 the example evaluates to “DocBook or XHTML backend” otherwise it evaluates to “some other backend”:

    {backend@docbook|xhtml11:DocBook or XHTML backend:some other backend}
    Attribute value map

    This example maps the frame attribute values [topbot, all, none, sides] to [hsides, border, void, vsides]:

    {frame@topbot:hsides}{frame@all:border}{frame@none:void}{frame@sides:vsides}

    24.3. System Attribute References

    System attribute references generate the attribute text value by executing a predefined action that is parametrized by a single argument. The syntax is {<action>:<argument>}.

    {eval:<expression>}

    Substitutes the result of the Python <expression>. If <expression> evaluates to None or False the reference is deemed undefined and the line containing the reference is dropped from the output. If the expression evaluates to True the attribute evaluates to an empty string. In all remaining cases the attribute evaluates to a string representation of the <expression> result.

    {include:<filename>}

    Substitutes contents of the file named <filename>.

    • The included file is read at the time of attribute substitution.

    • If the file does not exist a warning is emitted and the line containing the reference is dropped from the output file.

    • Tabs are expanded based on the current tabsize attribute value.

    {sys:<command>}

    Substitutes the stdout generated by the execution of the shell <command>.

    {sys2:<command>}

    Substitutes the stdout and stderr generated by the execution of the shell <command>.

    System reference behavior
    • System attribute arguments can contain non-system attribute references.

    • Closing brace characters inside system attribute arguments must be escaped them with a backslash.

    25. Intrinsic Attributes

    Intrinsic attributes are simple attributes that are created automatically from AsciiDoc document header parameters, asciidoc(1) command-line arguments, execution parameters along with attributes defined in the default configuration files. Here's the list of predefined intrinsic attributes:

    {asciidoc-dir}        the asciidoc(1) application directory
    {asciidoc-version}    the version of asciidoc(1)
    {author}              author's full name
    {authored}            empty string '' if {author} or {email} defined,
    {authorinitials}      author initials (from document header)
    {backend-<backend>}   empty string ''
    {<backend>-<doctype>} empty string ''
    {backend}             document backend specified by `-b` option
    {basebackend-<base>}  empty string ''
    {basebackend}         html or docbook
    {brvbar}              broken vertical bar (|) character
    {date}                document date (from document header)
    {docname}             document file name without extension
    {doctitle}            document title (from document header)
    {doctype-<doctype>}   empty string ''
    {doctype}             document type specified by `-d` option
    {email}               author's email address (from document header)
    {empty}               empty string ''
    {filetype-<fileext>}  empty string ''
    {filetype}            output file name file extension
    {firstname}           author first name (from document header)
    {gt}                  greater than (>) character
    {id}                  running block id generated by BlockId elements
    {indir}               document input directory name (note 1)
    {infile}              input file name (note 1)
    {lastname}            author last name (from document header)
    {listindex}           the list index (1..) of the most recent list item
    {localdate}           the current date
    {localtime}           the current time
    {lt}                  less than (<) character
    {manname}             manpage name (defined in NAME section)
    {manpurpose}          manpage (defined in NAME section)
    {mantitle}            document title minus the manpage volume number
    {manvolnum}           manpage volume number (1..8) (from document header)
    {middlename}          author middle name (from document header)
    {outdir}              document output directory name (note 1)
    {outfile}             output file name (note 1)
    {revision}            document revision number (from document header)
    {sectnum}             section number (in section titles)
    {title}               section title (in titled elements)
    {user-dir}            the ~/.asciidoc directory (if it exists)
    {verbose}             defined as '' if --verbose command option specified
    NOTES
    1. Intrinsic attributes are global so avoid defining custom attributes with the same names.

    2. {infile}, {outdir}, {infile}, {indir} attributes are effectively read-only (you can set them but it won't affect the input or output file paths).

    3. See also the xhtml11 subsection for attributes that relate to AsciiDoc XHTML file generation.

    4. The entries that translate to blank strings are designed to be used for conditional text inclusion. You can also use the ifdef, ifndef and endif System macros for conditional inclusion.
      [Conditional inclusion using ifdef and ifndef macros differs from attribute conditional inclusion in that the former occurs when the file is read while the latter occurs when the contents are written.]

    26. Block Element Definitions

    The syntax and behavior of Paragraph, DelimitedBlock, List and Table block elements is determined by block definitions contained in AsciiDoc configuration file sections.

    Each definition consists of a section title followed by one or more section entries. Each entry defines a block parameter controlling some aspect of the block's behavior. Here's an example:

    [blockdef-listing]
    delimiter=^-{4,}$
    template=listingblock
    presubs=specialcharacters,callouts

    AsciiDoc Paragraph, DelimitedBlock, List and Table block elements share a common subset of configuration file parameters:

    delimiter

    A Python regular expression that matches the first line of a block element — in the case of DelimitedBlocks it also matches the last line. Table elements don't have an explicit delimiter — they synthesize their delimiters at runtime.

    template

    The name of the configuration file markup template section that will envelope the block contents. The pipe | character is substituted for the block contents. List elements use a set of (list specific) tag parameters instead of a single template.

    options

    A comma delimited list of element specific option names.

    subs, presubs, postsubs
    • presubs and postsubs are lists of comma separated substitutions that are performed on the block contents. presubs is applied first, postsubs (if specified) second.

    • subs is an alias for presubs.

    • If a filter is allowed (Paragraphs and DelimitedBlocks) and has been specified then presubs and postsubs substitutions are performed before and after the filter is run respectively.

    • Allowed values: specialcharacters, quotes, specialwords, replacements, macros, attributes, callouts.

    • The following composite values are also allowed:

      none

      No substitutions.

      normal

      The following substitutions: specialcharacters,quotes,attributes,specialwords, replacements,macros,passthroughs.

      verbatim

      specialcharacters and callouts substitutions.

    • normal and verbatim substitutions can be redefined by with subsnormal and subsverbatim entries in a configuration file [miscellaneous] section.

    • The substitutions are processed in the order in which they are listed and can appear more than once.

    filter

    This optional entry specifies an executable shell command for processing block content (Paragraphs and DelimitedBlocks). The filter command can contain attribute references.

    posattrs

    Optional comma separated list of positional attribute names. This list maps positional attributes (in the block's attribute list) to named block attributes. The following example, from the QuoteBlock definition, maps the first and section positional attributes:

    posattrs=attribution,citetitle
    style

    This optional parameter specifies the default style name.

    <stylename>-style

    Optional style definition (see Styles below).

    The following block parameters behave like document attributes and can be set in block attribute lists and style definitions: template, options, subs, presubs, postsubs, filter.

    26.1. Styles

    A style is a set of block attributes bundled as a single named attribute. The following example defines a style named verbatim:

    verbatim-style=template="literalblock",subs="verbatim",font="monospaced"
    • All style parameter names must be suffixed with -style and the style parameter value is in the form of a list of named attributes.

    • Multi-item style attributes (subs,presubs,postsubs,posattrs) must be specified using Python tuple syntax rather than a simple list of values as they in separate entries e.g. postsubs=("callouts",) not postsubs="callouts".

    26.2. Paragraphs

    Paragraph translation is controlled by [paradef*] configuration file section entries. Users can define new types of paragraphs and modify the behavior of existing types by editing AsciiDoc configuration files.

    Here is the shipped Default paragraph definition:

    [paradef-default]
    delimiter=(?P<text>\S.*)
    template=paragraph

    The Default paragraph definition has a couple of special properties:

    1. It must exist and be defined in a configuration file section named [paradef-default].

    2. Irrespective of its position in the configuration files default paragraph document matches are attempted only after trying all other paragraph types.

    Paragraph specific block parameter notes:

    delimiter

    This regular expression must contain the named group text which matches the text on the first line. Paragraphs are terminated by a blank line, the end of file, or the start of a DelimitedBlock.

    options

    The only allowable option is listelement. The listelement option specifies that paragraphs of this type will automatically be considered part of immediately preceding list items.

    Paragraph processing proceeds as follows:
    1. The paragraph text is aligned to the left margin.

    2. Optional presubs inline substitutions are performed on the paragraph text.

    3. If a filter command is specified it is executed and the paragraph text piped to its standard input; the filter output replaces the paragraph text.

    4. Optional postsubs inline substitutions are performed on the paragraph text.

    5. The paragraph text is enveloped by the paragraph's markup template and written to the output file.

    26.3. Delimited Blocks

    DelimitedBlock specific block definition notes:

    options

    Allowed values are:

    sectionbody

    The block contents are processed as a SectionBody.

    skip

    The block is treated as a comment (see CommentBlocks).

    list

    The block is a list block.

    presubs, postsubs and filter entries are meaningless when sectionbody, skip or list options are set.

    DelimitedBlock processing proceeds as follows:

    1. Optional presubs substitutions are performed on the block contents.

    2. If a filter is specified it is executed and the block's contents piped to its standard input. The filter output replaces the block contents.

    3. Optional postsubs substitutions are performed on the block contents.

    4. The block contents is enveloped by the block's markup template and written to the output file.

    Tip Attribute expansion is performed on the block filter command before it is executed, this is useful for passing arguments to the filter.

    26.4. Lists

    List behavior and syntax is determined by [listdef*] configuration file sections. The user can change existing list behavior and add new list types by editing configuration files.

    List specific block definition notes:

    type

    This is either bulleted,numbered,labeled or callout.

    delimiter

    A Python regular expression that matches the first line of a list element entry. This expression must contain the named group text which matches text in the first line.

    subs

    Substitutions that are performed on list item text and terms.

    listtag

    The name of the tag that envelopes the List.

    itemtag

    The name of the tag that envelopes the ListItem.

    texttag

    The name of the tag that envelopes the list item text.

    labeltag

    The name of the tag that envelopes a variable list label.

    entrytag

    The name of the tag that envelopes a labeled list entry.

    The tag entries map the AsciiDoc list structure to backend markup; see the AsciiDoc distribution .conf configuration files for examples.

    26.5. Tables

    Table behavior and syntax is determined by [tabledef*] configuration file sections. The user can change existing list behavior and add new list types by editing configuration files.

    Table specific block definition notes:

    fillchar

    A single character that fills table ruler and underline lines.

    subs

    Substitutions performed on table data items.

    format

    The source row data format (fixed, csv or dsv).

    comspec

    The table comspec tag definition.

    headrow, footrow, bodyrow

    Table header, footer and body row tag definitions. headrow and footrow table definition entries default to bodyrow if they are undefined.

    headdata, footdata, bodydata

    Table header, footer and body data tag definitions. headdata and footdata table definition entries default to bodydata if they are undefined.

    Table behavior is also influenced by the following [miscellaneous] configuration file entries:

    textwidth

    The page width (in characters) of the source text. This setting is compared to the table ruler width when calculating the relative size of character ruler tables on the output page.

    pagewidth

    This integer value is the printable width of the output media. Used to calculate colwidth and tablewidth substitution values.

    pageunits

    The units of width in output markup width attribute values.

    Table definition behavior
    • The output markup generation is specifically designed to work with the HTML and CALS (DocBook) table models, but should be adaptable to most XML table schema.

    • Table definitions can be “mixed in” from multiple cascading configuration files.

    • New table definitions inherit the default table definition ([tabledef-default]) so you only need to override those conf file entries that require modification when defining a new table type.

    27. Filters

    Filters are external shell commands used to process Paragraph and DelimitedBlock content; they are specified in configuration file Paragraph and DelimitedBlock definitions.

    There's nothing special about the filters, they're just standard UNIX filters: they read text from the standard input, process it, and write to the standard output.

    Attribute substitution is performed on the filter command prior to execution — attributes can be used to pass parameters from the AsciiDoc source document to the filter.

    Warning Filters can potentially generate unsafe output. Before installing a filter you should verify that it can't be coerced into generating malicious output or exposing sensitive information.
    Note Filter functionality is currently only available on POSIX platforms (this includes Cygwin).

    27.1. Filter Search Paths

    If the filter command does not specify a directory path then asciidoc(1) searches for the command:

    • First it looks in the user's $HOME/.asciidoc/filters directory.

    • Next the /etc/asciidoc/filters directory is searched.

    • Then it looks in the asciidoc(1) ./filters directory.

    • Finally it relies on the executing shell to search the environment search path ($PATH).

    27.2. Filter Configuration Files

    Filters are normally accompanied by a configuration file containing a Paragraph or DelimitedBlock definition along with corresponding markup templates.

    There are two ways to implement filters:

    • As a new Paragraph or DelimitedBlock definition.

    • By styling an existing Paragraph or DelimitedBlock using a style configuration entry — the source highlight and music filters use this technique to customize the ListingBlock. By convention the style is given the same name as the filter.

    asciidoc(1) auto-loads all .conf files found in the filter search paths (see previous section).

    27.3. Code Filter

    AsciiDoc comes with a simple minded for highlighting source code keywords and comments. See also the ./filters/code-filter-readme.txt file.

    Note This filter primarily 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 multi-language highlighter use the Source Code Highlighter Filter.
    .Code filter example
    [code,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
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Outputs:

    Example: Code filter example
    ''' 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

    27.4. Source Code Highlighter Filter

    A source code highlighter filter can be found in the AsciiDoc distribution ./filters directory.

    27.5. Music Filter

    A music filter is included in the distribution ./filters directory. It translates music in LilyPond or ABC notation to standard Western classical notation in the form of a trimmed PNG image which is automatically inserted into the output document.

    28. Converting DocBook to other file formats

    DocBook files are validated, parsed and translated by a combination of applications collectively called a DocBook tool chain. The function of a tool chain is to read the DocBook markup (produced by AsciiDoc) and transform it to a presentation format (for example HTML, PDF, HTML Help, DVI, PostScript, LaTeX).

    A wide range of user output format requirements coupled with a choice of available tools and stylesheets results in many valid tool chain combinations.

    28.1. a2x Toolchain Wrapper

    One of the biggest hurdles for new users is installing, configuring and using a DocBook XML toolchain. a2x(1) can help — it's a toolchain wrapper command that will generate XHTML (chunked and unchunked), PDF, DVI, PS, LaTeX, man page, HTML Help and text file outputs from an AsciiDoc text file. a2x(1) does all the grunt work associated with generating and sequencing the toolchain commands and managing intermediate and output files. a2x(1) also optionally deploys admonition and navigation icons and a CSS stylesheet. See the a2x(1) man page for more details. All you need is xsltproc(1), DocBook XSL Stylesheets and, optionally dblatex or FOP (if you want PDF), or lynx(1) (if you want text).

    The following examples generate doc/source-highlight-filter.pdf from the AsciiDoc doc/source-highlight-filter.txt source file. The first example uses dblatex(1) (the default PDF generator) the second example forces FOP to be used:

    $ a2x -f pdf doc/source-highlight-filter.txt
    $ a2x -f pdf --fop-options="" doc/source-highlight-filter.txt

    See the a2x(1) man page for details.

    Tip Use the —verbose command-line option to view executed toolchain commands.

    28.2. HTML generation

    AsciiDoc produces nicely styled HTML directly without requiring a DocBook toolchain but there are also advantages in going the DocBook route:

    • HTML from DocBook includes automatically generated indexes, tables of contents, footnotes, lists of figures and tables.

    • DocBook toolchains can also (optionally) generate separate (chunked) linked HTML pages for each document section.

    • Toolchain processing performs link and document validity checks.

    • If the DocBook lang attribute is set then things like table of contents, revision history, figure and table captions and admonition captions will be output in the specified language (setting the AsciiDoc lang attribute sets the DocBook lang attribute).

    On the other hand, HTML output directly from AsciiDoc is much faster, is easily customized and can be used in situations where there is no suitable DocBook toolchain (see the AsciiDoc website for example).

    28.3. PDF generation

    There are two commonly used tools to generate PDFs from DocBook, dblatex and FOP.

    dblatex or FOP?
    • dblatex is easier to install, there's zero configuration required and no Java VM to install — it just works out of the box.

    • dblatex source code highlighting and numbering is superb.

    • dblatex is easier to use as it converts DocBook directly to PDF whereas before using FOP you have to convert DocBook to XML-FO using DocBook XSL Stylesheets.

    • FOP is more feature complete (for example, callouts are processed inside literal layouts) and arguably produces nicer looking output.

    28.4. HTML Help generation

    1. Convert DocBook XML documents to HTML Help compiler source files using DocBook XSL Stylesheets and xsltproc(1).

    2. Convert the HTML Help source (.hhp and .html) files to HTML Help (.chm) files using the Microsoft HTML Help Compiler.

    28.5. Toolchain components summary

    AsciiDoc

    Converts AsciiDoc (.txt) files to DocBook XML (.xml) files.

    DocBook XSL Stylesheets

    These are a set of XSL stylesheets containing rules for converting DocBook XML documents to HTML, XSL-FO, manpage and HTML Help files. The stylesheets are used in conjunction with an XML parser such as xsltproc(1).

    xsltproc

    An XML parser for applying XSLT stylesheets (in our case the DocBook XSL Stylesheets) to XML documents.

    dblatex

    Generates PDF, DVI, PostScript and LaTeX formats directly from DocBook source via the intermediate LaTeX typesetting language — uses DocBook XSL Stylesheets, xsltproc(1) and latex(1).

    FOP

    The Apache Formatting Objects Processor converts XSL-FO (.fo) files to PDF files. The XSL-FO files are generated from DocBook source files using DocBook XSL Stylesheets and xsltproc(1).

    Microsoft Help Compiler

    The Microsoft HTML Help Compiler (hhc.exe) is a command-line tool that converts HTML Help source files to a single HTML Help (.chm) file. It runs on MS Windows platforms and can be downloaded from http://www.microsoft.com.

    28.6. AsciiDoc dblatex configuration files

    The AsciiDoc distribution ./dblatex directory contains asciidoc-dblatex.xsl (customized XSL parameter settings) and asciidoc-dblatex.sty (customized LaTeX settings). These are examples of optional dblatex output customization and are used by a2x(1).

    28.7. AsciiDoc DocBook XSL Stylesheets drivers

    You will have noticed that the distributed HTML and HTML Help documentation files (for example ./doc/asciidoc.html) are not the plain outputs produced using the default DocBook XSL Stylesheets configuration. This is because they have been processed using customized DocBook XSL Stylesheets along with (in the case of HTML outputs) the custom ./stylesheets/docbook.css CSS stylesheet.

    You'll find the customized DocBook XSL drivers along with additional documentation in the distribution ./docbook-xsl directory. The examples that follow are executed from the distribution documentation (./doc) directory.

    common.xsl

    Shared driver parameters. This file is not used directly but is included in all the following drivers.

    chunked.xsl

    Generate chunked XHTML (separate HTML pages for each document section) in the ./doc/chunked directory. For example:

    $ python ../asciidoc.py -b docbook asciidoc.txt
    $ xsltproc --nonet ../docbook-xsl/chunked.xsl asciidoc.xml
    fo.xsl

    Generate XSL Formatting Object (.fo) files for subsequent PDF file generation using FOP. For example:

    $ python ../asciidoc.py -b docbook article.txt
    $ xsltproc --nonet ../docbook-xsl/fo.xsl article.xml > article.fo
    $ fop.sh article.fo article.pdf
    htmlhelp.xsl

    Generate Microsoft HTML Help source files for the MS HTML Help Compiler in the ./doc/htmlhelp directory. This example is run on MS Windows from a Cygwin shell prompt:

    $ python ../asciidoc.py -b docbook asciidoc.txt
    $ xsltproc --nonet ../docbook-xsl/htmlhelp.xsl asciidoc.xml
    $ c:/Program\ Files/HTML\ Help\ Workshop/hhc.exe htmlhelp.hhp
    manpage.xsl

    Generate a roff(1) format UNIX man page from a DocBook XML refentry document. This example generates an asciidoc.1 man page file:

    $ python ../asciidoc.py -d manpage -b docbook asciidoc.1.txt
    $ xsltproc --nonet ../docbook-xsl/manpage.xsl asciidoc.1.xml
    xhtml.xsl

    Convert a DocBook XML file to a single XHTML file. For example:

    $ python ../asciidoc.py -b docbook asciidoc.txt
    $ xsltproc --nonet ../docbook-xsl/xhtml.xsl asciidoc.xml > asciidoc.html

    If you want to see how the complete documentation set is processed take a look at the A-A-P script ./doc/main.aap.

    29. Generating Plain Text Files

    AsciiDoc does not have a text backend (for most purposes AsciiDoc source text is fine), however you can convert AsciiDoc text files to formatted text using the AsciiDoc a2x(1) toolchain wrapper utility.

    30. XML and Character Sets

    The default XML character set UTF-8 is used when AsciiDoc generates DocBook files but this can be changed by setting the xmldecl entry in the [attributes] section of the docbook.conf file or by composing your own configuration file [header] section).

    Tip If you get an undefined entity error when processing DocBook files you'll may find that you've used an undefined HTML character entity. An easy (although inelegant) fix is to use the character's character code instead of its symbolic name (for example use &#160; instead of &nbsp;).

    If your system has been configured with an XML catalog you may find a number of entity sets are already automatically included.

    30.1. PDF Fonts

    The Adobe PDF Specification states that the following 14 fonts should be available to every PDF reader: Helvetica (normal, bold, italic, bold italic), Times (normal, bold, italic, bold italic), Courier (normal, bold, italic, bold italic), Symbol and ZapfDingbats. Non-standard fonts should be embedded in the distributed document.

    31. Help Commands

    The asciidoc(1) command has a --help option which prints help topics to stdout. The default topic summarizes asciidoc(1) usage:

    $ asciidoc --help

    To print a list of help topics:

    $ asciidoc --help=topics

    To print a help topic specify the topic name as a command argument. Help topic names can be shortened so long as they are not ambiguous. Examples:

    $ asciidoc --help=manpage
    $ asciidoc -hm              # Short version of previous example.
    $ asciidoc --help=syntax
    $ asciidoc -hs              # Short version of previous example.

    31.1. Customizing Help

    To change, delete or add your own help topics edit a help configuration file. The help file name help-<lang>.conf is based on the setting of the lang attribute, it defaults to help.conf (English). The help file location will depend on whether you want the topics to apply to all users or just the current user.

    The help topic files have the same named section format as other configuration files. The help.conf files are stored in the same locations and loaded in the same order as other configuration files.

    When the --help command-line option is specified AsciiDoc loads the appropriate help files and then prints the contents of the section whose name matches the help topic name. If a topic name is not specified default is used. You don't need to specify the whole help topic name on the command-line, just enough letters to ensure it's not ambiguous. If a matching help file section is not found a list of available topics is printed.

    32. Tips and Tricks

    32.1. Know Your Editor

    Writing AsciiDoc documents will be a whole lot more pleasant if you know your favorite text editor. Learn how to indent and reformat text blocks, paragraphs, lists and sentences. Tips for vim users follow.

    32.2. Vim Commands for Formatting AsciiDoc

    32.2.1. Text Wrap Paragraphs

    Use the vim :gq command to reformat paragraphs. Setting the textwidth sets the right text wrap margin; for example:

    :set textwidth=70

    To reformat a paragraph:

    1. Position the cursor at the start of the paragraph.

    2. Type gq}.

    Execute :help gq command to read about the vim gq command.

    Tip
    • Assign the gq} command to the Q key with the nnoremap Q gq} command or put it in your ~/.vimrc file to so it's always available (see the Example ~/.vimrc file).

    • Put set commands in your ~/.vimrc file so you don't have to enter them manually Example ~/.vimrc file).

    • The Vim website (http://www.vim.org) has a wealth of resources, including scripts for automated spell checking and ASCII Art drawing.

    32.2.2. Format Lists

    The gq command can also be used to format bulleted and numbered lists. First you need to set the comments and formatoptions (see the Example ~/.vimrc file).

    Now you can format simple lists that use dash, asterisk, period and plus bullets along with numbered ordered lists:

    1. Position the cursor at the start of the list.

    2. Type gq}.

    32.2.3. Indent Paragraphs

    Indent whole paragraphs by indenting the fist line with the desired indent and then executing the gq} command.

    32.2.4. Example ~/.vimrc File

    " Show tabs and trailing characters.
    set listchars=tab:»·,trail:·
    set list
    
    " Don't highlight searched text.
    highlight clear Search
    
    " Don't move to matched text while search pattern is being entered.
    set noincsearch
    
    " Q command to reformat paragraphs and list.
    nnoremap Q gq}
    
    " W command to delete trailing white space and Dos-returns and to expand tabs
    " to spaces.
    nnoremap W :%s/[\r \t]\+$//<CR>:set et<CR>:retab!<CR>
    
    autocmd BufRead,BufNewFile *.txt,README,TODO,CHANGELOG,NOTES
            \ setlocal autoindent expandtab tabstop=8 softtabstop=2 shiftwidth=2
            \ textwidth=70 wrap formatoptions=tcqn
            \ comments=s1:/*,ex:*/,://,b:#,:%,:XCOMM,fb:-,fb:*,fb:+,fb:.,fb:>

    32.3. Troubleshooting

    • The asciidoc(1) -v (—verbose) command-line option displays the order of configuration file loading and warns of potential configuration file problems.

    • Not all valid AsciiDoc documents produce valid backend markup. Read the AsciiDoc Backends section if AsciiDoc output is rejected as non-conformant by a backend processor.

    32.4. Gotchas

    Incorrect character encoding

    If you get an error message like 'UTF-8' codec can't decode … then you source file contains invalid UTF-8 characters — set the AsciiDoc encoding attribute for the correct character set (typically ISO-8859-1 (Latin-1) for European languages).

    Misinterpreted text formatting

    If text in your document is incorrectly interpreted as formatting instructions you can suppress formatting by placing a backslash character immediately in front of the leading quote character(s). For example in the following line the backslash prevents text between the two asterisks from being output in a strong (bold) font:

    Add `\*.cs` files and `*.resx` files.
    Overlapping text formatting

    Overlapping text formatting will generate illegal overlapping markup tags which will result in downstream XML parsing errors. Here's an example:

    Some *strong markup _that overlaps* emphasized markup_.
    Ambiguous underlines

    A DelimitedBlock can immediately follow paragraph without an intervening blank line, but be careful, a single line paragraph underline may be misinterpreted as a section title underline resulting in a “closing block delimiter expected” error.

    Ambiguous ordered list items

    Lines beginning with numbers at the end of sentences will be interpreted as ordered list items. The following example (incorrectly) begins a new list with item number 1999:

    He was last sighted in
    1999. Since then things have moved on.

    The list item out of sequence warning makes it unlikely that this problem will go unnoticed.

    Escaping inside DSV table data

    Delimiter separated text uses C style backslash escape sequences. If you want to enter a backslash (for example, to escape AsciiDoc text formatting or an inline macro) you need to escape it by entering two backslashes.

    Special characters in attribute values

    Special character substitution precedes attribute substitution so if attribute values contain special characters you may, depending on the substitution context, need to escape the special characters yourself. For example:

    $ asciidoc -a 'companyname=Bill &amp; Ben' mydoc.txt
    Macro attribute lists

    If named attribute list entries are present then all string attribute values must be quoted. For example:

    ["Desktop screenshot",width=32]

    32.5. Combining Separate Documents

    You have a number of stand-alone AsciiDoc documents that you want to process as a single document. Simply processing them with a series of include macros won't work, because instead of starting at level 1 the section levels of the combined document start at level 0 (the document title level).

    The solution is to redefine the title underlines so that document and section titles are pushed down one level.

    1. Push the standard title underlines down one level by defining a new level 0 underline in a custom configuration file. For example combined.conf:

      [titles]
      underlines="__","==","--","~~","^^"
    2. If you use single line titles you'll need to make corresponding adjustments to the [titles] section sect0sect4 entries.

    3. Create a top level wrapper document. For example combined.txt:

       Combined Document Title
       _______________________
      
       include::document1.txt[]
      
       include::document2.txt[]
      
       include::document3.txt[]
    4. Process the wrapper document. For example:

      $ asciidoc --conf-file=combined.conf combined.txt

    Actually the —conf-file option is unnecessary as asciidoc(1) automatically looks for a same-named .conf file.

    • The combined document title uses the newly defined level 0 underline (underscore characters).

    • Put a blank line between the include macro lines to ensure the title of the included document is not seen as part of the last paragraph of the previous document.

    • You won't want document Headers (Author and Revision lines) in the included files — conditionally exclude them if they are necessary for stand-alone processing.

    32.6. Processing Document Sections Separately

    You have divided your AsciiDoc document into separate files (one per top level section) which are combined and processed with the following top level document:

     Combined Document Title
     =======================
     Joe Bloggs
     v1.0, 12-Aug-03
    
     include::section1.txt[]
    
     include::section2.txt[]
    
     include::section3.txt[]

    You also want to process the section files as separate documents. This is easy because asciidoc(1) will quite happily process section1.txt, section2.txt and section3.txt separately.

    If you want to promote the section levels up one level, so the document is processed just like a stand-alone document, then pop the section underline definition up one level:

    [titles]
    underlines="--","~~","^^","++","__"

    The last "__" underline is a dummy that won't actually be used but is necessary to legitimize the underline definition.

    This is just the reverse of the technique used for combining separate documents explained in the previous section.

    32.7. Processing Document Chunks

    asciidoc(1) can be used as a filter, so you can pipe chunks of text through it. For example:

    $ echo 'Hello *World!*' | asciidoc -s -
    <div class="para"><p>Hello <strong>World!</strong></p></div>

    The -s (—no-header-footer) command-line option suppresses header and footer output and is useful if the processed output is to be included in another file.

    32.8. Badges in HTML Page Footers

    See the [footer] section in the AsciiDoc distribution xhtml11.conf configuration file.

    32.9. Pretty Printing AsciiDoc Output

    If the indentation and layout of the asciidoc(1) output is not to your liking you can:

    1. Change the indentation and layout of configuration file markup template sections. The {empty} glossary entry is useful for outputting trailing blank lines in markup templates.

    2. Or use Dave Raggett's excellent HTML Tidy program to tidy asciidoc(1) output. Example:

      $ asciidoc -b docbook -o - mydoc.txt | tidy -indent -xml >mydoc.xml

    HTML Tidy can be downloaded from http://tidy.sourceforge.net/

    32.10. Supporting Minor DocBook DTD Variations

    The conditional inclusion of DocBook SGML markup at the end of the distribution docbook.conf file illustrates how to support minor DTD variations. The included sections override corresponding entries from preceding sections.

    32.11. Shipping Stand-alone AsciiDoc Source

    Reproducing presentation documents from someone else's source has one major problem: unless your configuration files are the same as the creator's you won't get the same output.

    The solution is to create a single backend specific configuration file using the asciidoc(1) -c (—dump-conf) command-line option. You then ship this file along with the AsciiDoc source document plus the asciidoc.py script. The only end user requirement is that they have Python installed (and of course that they consider you a trusted source). This example creates a composite HTML configuration file for mydoc.txt:

    $ asciidoc -cb xhtml11 mydoc.txt > mydoc-xhtml11.conf

    Ship mydoc.txt, mydoc-html.conf, and asciidoc.py. With these three files (and a Python interpreter) the recipient can regenerate the HMTL output:

    $ ./asciidoc.py -eb xhtml11 mydoc.txt

    The -e (—no-conf) option excludes the use of implicit configuration files, ensuring that only entries from the mydoc-html.conf configuration are used.

    32.12. Inserting Blank Space

    Adjust your style sheets to add the correct separation between block elements. Inserting blank paragraphs containing a single non-breaking space character {nbsp} works but is an ad hoc solution compared to using style sheets.

    32.13. Closing Open Sections

    You can close off section tags up to level N by calling the eval::[Section.setlevel(N)] system macro. This is useful if you want to include a section composed of raw markup. The following example includes a DocBook glossary division at the top section level (level 0):

      ifdef::backend-docbook[]
    
      eval::[Section.setlevel(0)]
    
      +++++++++++++++++++++++++++++++
      <glossary>
        <title>Glossary</title>
        <glossdiv>
        ...
        </glossdiv>
      </glossary>
      +++++++++++++++++++++++++++++++
      endif::backend-docbook[]

    32.14. Validating Output Files

    Use xmllint(1) to check the AsciiDoc generated markup is both well formed and valid. Here are some examples:

    $ xmllint --nonet --noout --valid docbook-file.xml
    $ xmllint --nonet --noout --valid xhtml11-file.html
    $ xmllint --nonet --noout --valid --html html4-file.html

    The —valid option checks the file is valid against the document type's DTD, if the DTD is not installed in your system's catalog then it will be fetched from its Internet location. If you omit the —valid option the document will only be checked that it is well formed.

    33. Glossary

    Block element

    An AsciiDoc block element is a document entity composed of one or more whole lines of text.

    Inline element

    AsciiDoc inline elements occur within block element textual content, they perform formatting and substitution tasks.

    Formal element

    An AsciiDoc block element that has a BlockTitle. Formal elements are normally listed in front or back matter, for example lists of tables, examples and figures.

    Verbatim element

    The word verbatim indicates that white space and line breaks in the source document are to be preserved in the output document.

    34. Appendix A: Migration Notes

    34.1. Version 7 to version 8

    • A new set of quotes has been introduced which may match inline text in existing documents — if they do you'll need to escape the matched text with backslashes.

    • The index entry inline macro syntax has changed — if your documents include indexes you may need to edit them.

    • Replaced a2x(1) --no-icons and --no-copy options with their negated equivalents: --icons and --copy respectively. The default behavior has also changed — the use of icons and copying of icon and CSS files must be specified explicitly with the --icons and --copy options.

    The rationale for the changes can be found in the AsciiDoc CHANGELOG.

    Note If you want to disable unconstrained quotes, the new alternative constrained quotes syntax and the new index entry syntax then you can define the attribute asciidoc7compatible (for example by using the -a asciidoc7compatible command-line option).

    34.2. Version 6 to version 7

    The changes that affect the most users relate to renamed and deprecated backends and command-line syntax:

    1. The html backend has been renamed html4.

    2. The xhtml backend has been deprecated to xhtml-deprecated (use the new xhtml11 backend in preference).

    3. The use of CSS specific css and css-embedded backends has been dropped in favor of using attributes (see the table below and xhtml backend attributes).

    4. Deprecated features that emitted warnings in prior versions are no longer tolerated.

    5. The command-line syntax for deleting (undefining) an attribute has changed from -a ^name to -a name!.

    Table: Equivalent command-line syntax
    Version 6 (old) Version 7 (new) Version 7 (backward compatible)
    -b html -b html4 -b html4
    -b css -b xhtml11 -a linkcss -a icons -b xhtml-deprecated -a css -a linkcss -a icons
    -b css-embedded -b xhtml11 -a icons -b xhtml-deprecated -a css -a icons
    -b xhtml -b xhtml11 -b xhtml-deprecated
    -b docbook-sgml -b docbook -a sgml -b docbook -a sgml

    If you've customized version 6 distribution stylesheets then you'll need to either bring them in line with the new ./stylesheets/xhtml11*.css class and id names or stick with the backward compatible xhtml-deprecated backend.

    Changes to configuration file syntax:

    1. To undefine an attribute in the [attributes] section use name! instead of name (name now sets that attribute to a blank string).

    35. Appendix B: Packager Notes

    Read the README and INSTALL files (in the distribution root directory) for install prerequisites and procedures.

    The distribution install.sh shell script is the canonical installation procedure and is the definitive installation description. Here's a summary of the installation procedure:

    • Unpack entire distribution tarball to /usr/share/asciidoc/.

    • Move asciidoc.py to /usr/bin/; rename to asciidoc; if necessary modify shebang line; ensure executable permissions are set.

    • Move a2x to /usr/bin/; if necessary modify shebang line; ensure executable permissions are set.

    • Move the ./*.conf files to /etc/asciidoc/.

    • Move ./filters/{*.conf,*.py} to /etc/asciidoc/filters/.

    • Move ./docbook-xsl/*.xsl to /etc/asciidoc/docbook-xsl/.

    • Move ./dblatex/*.{xsl,sty} to /etc/asciidoc/dblatex/.

    • Copy ./stylesheets/*.css to /etc/asciidoc/stylesheets/.

    • Copy ./javascripts/*.js to /etc/asciidoc/javascripts/.

    • Copy ./images/icons/* to /etc/asciidoc/images/icons/ (recursively including the icons subdirectory and its contents).

    • Compress the asciidoc(1) and ax2(1) man pages (./doc/*.1) with gzip(1) and move them to /usr/share/man/man1/.

    • If Vim is installed then install Vim syntax and filetype detection files.

    Leaving stylesheets and images in /usr/share/asciidoc/ ensures the docs and example website are not broken.

    36. Appendix C: AsciiDoc Safe Mode

    AsciiDoc safe mode skips potentially dangerous sections in AsciiDoc source files by inhibiting the execution of arbitrary code or the inclusion of arbitrary files.

    The safe mode is enabled by default and can only be disabled using the asciidoc(1) —unsafe command-line option.

    Safe mode constraints
    • eval, sys and sys2 executable attributes and block macros are not executed.

    • include::<filename>[] and include1::<filename>[] block macro files must reside inside the parent file's directory.

    • {include:<filename>} executable attribute files must reside inside the source document directory.

    • Passthrough Blocks are dropped.

    Warning

    The safe mode is not designed to protect against unsafe AsciiDoc configuration files. Be especially careful when:

    1. Implementing filters.

    2. Implementing elements that don't escape special characters.

    3. Accepting configuration files from untrusted sources.

    37. Appendix D: Using AsciiDoc with non-English Languages

    AsciiDoc can process UTF-8 character sets but there are some things you need to be aware of:

    • If you are generating output documents using a DocBook toolchain then you should set the AsciiDoc lang attribute to the appropriate language (it defaults to en (English)). This will ensure things like table of contents, revision history, figure and table captions and admonition captions are output in the specified language. For example:

      $ a2x -a lang=es doc/article.txt
    • If you are outputting html or xhtml directly from asciidoc(1) you'll need to set the various *_caption attributes to match your target language (see the list of captions and titles in the [attributes] section of the default asciidoc.conf file). The easiest way is to create a language .conf file (see the example lang-es.conf file that comes with the AsciiDoc distribution).

    • asciidoc(1) automatically loads configuration files named like lang-<lang>.conf where <lang> is a two letter language code that matches the current AsciiDoc lang attribute. See also Configuration File Names and Locations.

    • Some character sets display double-width characters (for example Japanese). As far as title underlines are concerned they should be treated as single character. If you think this looks untidy so you may prefer to use the single line title format.

    38. Appendix E: ASCIIMathML Support

    ASCIIMathML is a clever JavaScript written by Peter Jipsen that transforms mathematical formulae written in plain text to standard mathematical notation on an HTML page.

    To enable ASCIIMathML support on the xhtml11 backend include the -a asciimath command-line option. Here's what the asciimath attribute does:

    • Embeds the ASCIIMathML.js script in the output document (links it if -a linkcss has been specified).

    • Escapes ASCIIMathML delimiters.

    When entering ASCIIMathML formulas you must enclose them inside double-dollar passthroughs (this is necessary because ASCIIMathML characters clash with AsciiDoc formatting characters). The double-dollar passthrough has the bonus of also escaping special characters so the output document is valid XHTML. You can see an ASCIIMathML example at http://www.methods.co.nz/asciidoc/asciimath.html, the same example can be found in the AsciiDoc distribution ./doc directory.

    Note
    • See the ASCIIMathML website for ASCIIMathML documentation and the latest version.

    • If you use Mozilla you need to install the required math fonts.

    • If you use Microsoft Internet Explorer 6 you need to install MathPlayer.

    39. Appendix F: Vim Syntax Highlighter

    The AsciiDoc ./vim/ distribution directory contains Vim syntax highlighter and filetype detection scripts for AsciiDoc. Syntax highlighting makes it much easier to spot AsciiDoc syntax errors.

    If Vim is installed on your system the AsciiDoc installer (install.sh) will automatically install the vim scripts in the Vim global configuration directory (/etc/vim).

    You can also turn on syntax highlighting by adding the following line to the end of you AsciiDoc source files:

    // vim: set syntax=asciidoc:
    Note Dag Wieers has implemented an alternative Vim syntax file for AsciiDoc which can be found here http://svn.rpmforge.net/svn/trunk/tools/asciidoc-vim/.

    39.1. Limitations

    The current implementation does a reasonable job but on occasions gets things wrong. This list of limitations also discusses how to work around the problems:

    • Indented lists with preceding blank lines are sometimes mistaken for literal (indented) paragraphs. You can work around this by deleting the preceding blank line, or inserting a space in the preceding blank lines, or putting a list continuation character (+) in the preceding blank line.

    • Nested text formatting is highlighted according to the outer format.

    • Most escaped inline elements will be highlighted.

    • Unterminated quotes are highlighted, for example 'tis would be seen as the start of emphasized text. As a damage control measure quoted text and macro attribute list containing quoted text always terminate at a blank line. This problem is usually ameliorated by the fact that characters such as ~, +, ^ and _ will normally occur inside monospaced quotes (unless they are used for quoting), for example ~/projects.

    • If a closing block delimiter is not preceded by a blank line it is sometimes mistaken for a title underline. A workaround is to insert a blank line before the closing delimiter.

    • If a list block delimiter is mistaken for a title underline precede it with a blank line.

    • Tables are terminated by a blank line — use a space character on blank lines within your table.

    • Lines within a paragraph beginning with a period will be highlighted as block titles. For example:

      .chm file.

      To work around this restriction move the last word of the previous line to the start of the current (although words starting with a period should probably be quoted monospace which would also get around the problem).

    Tip Sometimes incorrect highlighting is caused by preceding lines that appear blank but contain white space characters — setting your editor options so that white space characters are visible is a good idea.
    asciidoc-8.2.7/doc/asciidoc.html0000644000175100017510000110635411033405233016671 0ustar srackhamsrackham AsciiDoc User Guide

    AsciiDoc User Guide

    Stuart Rackham

    Revision History
    Revision 8.2.74 July 2008SJR

    Table of Contents

    1. Introduction
    2. Getting Started
    2.1. Installing AsciiDoc
    2.2. Example AsciiDoc Documents
    3. AsciiDoc Document Types
    3.1. article
    3.2. book
    3.3. manpage
    4. AsciiDoc Backends
    4.1. docbook
    4.2. xhtml11
    4.3. html4
    4.4. linuxdoc
    4.5. latex
    5. Document Structure
    5.1. Block Elements
    5.2. Header
    5.3. Preamble
    5.4. Sections
    5.5. Inline Elements
    6. Document Processing
    7. Text Formatting
    7.1. Quoted Text
    7.2. Inline Passthroughs
    7.3. Superscripts and Subscripts
    7.4. Line Breaks (HTML/XHTML)
    7.5. Rulers (HTML/XHTML)
    7.6. Tabs
    7.7. Replacements
    7.8. Special Words
    8. Titles
    8.1. Two line titles
    8.2. One line titles
    9. BlockTitles
    10. BlockId Element
    11. Paragraphs
    11.1. Default Paragraph
    11.2. Literal Paragraph
    11.3. Admonition Paragraphs
    12. Delimited Blocks
    12.1. Predefined Delimited Blocks
    12.2. Listing Blocks
    12.3. Literal Blocks
    12.4. SidebarBlocks
    12.5. Comment Blocks
    12.6. Passthrough Blocks
    12.7. Quote Blocks
    12.8. Example Blocks
    12.9. Admonition Blocks
    13. Lists
    13.1. Bulleted and Numbered Lists
    13.2. Vertical Labeled Lists
    13.3. Horizontal Labeled Lists
    13.4. Question and Answer Lists
    13.5. Glossary Lists
    13.6. Bibliography Lists
    13.7. List Item Continuation
    13.8. List Block
    14. Footnotes
    15. Indexes
    16. Callouts
    16.1. Implementation Notes
    16.2. Including callouts in included code
    17. Macros
    17.1. Inline Macros
    17.2. Block Macros
    17.3. System Macros
    17.4. Macro Definitions
    18. Tables
    18.1. Example Tables
    18.2. AsciiDoc Table Block Elements
    19. Manpage Documents
    19.1. Document Header
    19.2. The NAME Section
    19.3. The SYNOPSIS Section
    19.4. refmiscinfo attributes
    20. Configuration Files
    20.1. Configuration File Format
    20.2. Markup Template Sections
    20.3. Special Sections
    20.4. Configuration File Names and Locations
    21. Document Attributes
    22. Attribute Entries
    23. Attribute Lists
    23.1. Macro Attribute lists
    23.2. AttributeList Element
    24. Attribute References
    24.1. Simple Attributes References
    24.2. Conditional Attribute References
    24.3. System Attribute References
    25. Intrinsic Attributes
    26. Block Element Definitions
    26.1. Styles
    26.2. Paragraphs
    26.3. Delimited Blocks
    26.4. Lists
    26.5. Tables
    27. Filters
    27.1. Filter Search Paths
    27.2. Filter Configuration Files
    27.3. Code Filter
    27.4. Source Code Highlighter Filter
    27.5. Music Filter
    28. Converting DocBook to other file formats
    28.1. a2x Toolchain Wrapper
    28.2. HTML generation
    28.3. PDF generation
    28.4. HTML Help generation
    28.5. Toolchain components summary
    28.6. AsciiDoc dblatex configuration files
    28.7. AsciiDoc DocBook XSL Stylesheets drivers
    29. Generating Plain Text Files
    30. XML and Character Sets
    30.1. PDF Fonts
    31. Help Commands
    31.1. Customizing Help
    32. Tips and Tricks
    32.1. Know Your Editor
    32.2. Vim Commands for Formatting AsciiDoc
    32.3. Troubleshooting
    32.4. Gotchas
    32.5. Combining Separate Documents
    32.6. Processing Document Sections Separately
    32.7. Processing Document Chunks
    32.8. Badges in HTML Page Footers
    32.9. Pretty Printing AsciiDoc Output
    32.10. Supporting Minor DocBook DTD Variations
    32.11. Shipping Stand-alone AsciiDoc Source
    32.12. Inserting Blank Space
    32.13. Closing Open Sections
    32.14. Validating Output Files
    Glossary
    A. Migration Notes
    A.1. Version 7 to version 8
    A.2. Version 6 to version 7
    B. Packager Notes
    C. AsciiDoc Safe Mode
    D. Using AsciiDoc with non-English Languages
    E. ASCIIMathML Support
    F. Vim Syntax Highlighter
    F.1. Limitations

    AsciiDoc is a text document format for writing short documents, articles, books and UNIX man pages. AsciiDoc files can be translated to HTML and DocBook markups using the asciidoc(1) command. AsciiDoc is highly configurable: both the AsciiDoc source file syntax and the backend output markups (which can be almost any type of SGML/XML markup) can be customized and extended by the user.

    1. Introduction

    Plain text is the most universal electronic document format, no matter what computing environment you use, you can always read and write plain text documentation. But for many applications plain text is not a viable presentation format. HTML, PDF and roff (roff is used for man pages) are the most widely used UNIX presentation formats. DocBook is a popular UNIX documentation markup format which can be translated to HTML, PDF and other presentation formats.

    AsciiDoc is a plain text human readable/writable document format that can be translated to DocBook or HTML using the asciidoc(1) command. You can then either use asciidoc(1) generated HTML directly or run asciidoc(1) DocBook output through your favorite DocBook toolchain or use the AsciiDoc a2x(1) toolchain wrapper to produce PDF, DVI, LaTeX, PostScript, man page, HTML and text formats.

    The AsciiDoc format is a useful presentation format in its own right: AsciiDoc files are unencumbered by markup and are easily viewed, proofed and edited.

    AsciiDoc is light weight: it consists of a single Python script and a bunch of configuration files. Apart from asciidoc(1) and a Python interpreter, no other programs are required to convert AsciiDoc text files to DocBook or HTML. See Example AsciiDoc Documents below.

    You write an AsciiDoc document the same way you would write a normal text document, there are no markup tags or arcane notations. Built-in AsciiDoc formatting rules have been kept to a minimum and are reasonably obvious.

    Text markup conventions tend to be a matter of (often strong) personal preference: if the default syntax is not to your liking you can define your own by editing the text based asciidoc(1) configuration files. You can create your own configuration files to translate AsciiDoc documents to almost any SGML/XML markup.

    asciidoc(1) comes with a set of configuration files to translate AsciiDoc articles, books or man pages to HTML or DocBook backend formats.

    2. Getting Started

    2.1. Installing AsciiDoc

    See the README and INSTALL files for install prerequisites and procedures. Packagers take a look at Appendix B: Packager Notes.

    2.2. Example AsciiDoc Documents

    The best way to quickly get a feel for AsciiDoc is to view the AsciiDoc web site and/or distributed examples:

    • Take a look at the linked examples on the AsciiDoc web site home page http://www.methods.co.nz/asciidoc/. Press the Page Source sidebar menu item to view corresponding AsciiDoc source.
    • Read the .txt source files in the distribution ./doc directory in conjunction with the corresponding HTML and DocBook XML files.

    3. AsciiDoc Document Types

    There are three types of AsciiDoc documents: article, book and manpage. All document types share the same AsciiDoc format with some minor variations.

    Use the asciidoc(1) -d (—doctype) option to specify the AsciiDoc document type — the default document type is article.

    By convention the .txt file extension is used for AsciiDoc document source files.

    3.1. article

    Used for short documents, articles and general documentation. See the AsciiDoc distribution ./doc/article.txt example.

    3.2. book

    Books share the same format as articles; in addition there is the option to add level 0 book part sections.

    Book documents will normally be used to produce DocBook output since DocBook processors can automatically generate footnotes, table of contents, list of tables, list of figures, list of examples and indexes.

    AsciiDoc markup supports standard DocBook frontmatter and backmatter special sections (dedication, preface, bibliography, glossary, index, colophon) plus footnotes and index entries.

    Example book documents

    Book
    The ./doc/book.txt file in the AsciiDoc distribution.
    Multi-part book
    The ./doc/book-multi.txt file in the AsciiDoc distribution.

    3.3. manpage

    Used to generate UNIX manual pages. AsciiDoc manpage documents observe special header title and section naming conventions — see the Manpage Documents section for details.

    See also the asciidoc(1) man page source (./doc/asciidoc.1.txt) from the AsciiDoc distribution.

    4. AsciiDoc Backends

    The asciidoc(1) command translates an AsciiDoc formatted file to the backend format specified by the -b (—backend) command-line option. asciidoc(1) itself has little intrinsic knowledge of backend formats, all translation rules are contained in customizable cascading configuration files.

    AsciiDoc ships with the following predefined backend output formats:

    4.1. docbook

    AsciiDoc generates the following DocBook document types: article, book and refentry (corresponding to the AsciiDoc article, book and manpage document types).

    DocBook documents are not designed to be viewed directly. Most Linux distributions come with conversion tools (collectively called a toolchain) for converting DocBook files to presentation formats such as Postscript, HTML, PDF, DVI, PostScript, LaTeX, roff (the native man page format), HTMLHelp, JavaHelp and text.

    • The —backend=docbook command-line option produces DocBook XML. You can produce the older DocBook SGML format using the —attribute sgml command-line option.
    • Use the optional encoding attribute to set the character set encoding.
    • Use the optional imagesdir attribute to prepend to the target file name paths in image inline and block macros. Defaults to a blank string.
    • The AsciiDoc Preamble element generates a DocBook book preface element although it's more usual to use an explicit Preface special section (see the ./doc/book.txt example book).

    4.2. xhtml11

    The default asciidoc(1) backend is xhtml11 which generates XHTML 1.1 markup styled with CSS2. Default output file have a .html extension. xhtml11 document generation is influenced by the following optional attributes (the default behavior is to generate XHTML with no section numbers, embedded CSS and no linked admonition icon images):

    numbered
    Adds section numbers to section titles.
    toc

    Adds a table of contents to the start of the document.

    • JavaScript needs to be enabled in your browser for this to work.
    • By default AsciiDoc automatically embeds the required toc.js JavaScript in the output document — use the linkcss attribute to link the script.
    • The following example generates a numbered table of contents by embedding the toc.js script in the mydoc.html output document (to link the script to the output document use the linkcss and scriptsdir attributes):

      $ asciidoc -a toc -a numbered mydoc.txt
    toclevels

    Sets the number of title levels (1..4) reported in the table of contents (see the toc attribute above). Defaults to 2 and must be used with the toc attribute. Example usage:

    $ asciidoc -a toc -a toclevels=3 doc/asciidoc.txt
    toc_title
    Sets the table of contents title (defaults to Table of Contents).
    linkcss
    Link CSS stylesheets and JavaScripts (see the stylesdir and scriptsdir attributes below). By default linkcss is undefined in which case stylesheets and scripts are automatically embedded in the output document.
    stylesdir
    The name of the directory containing linked stylesheets. Defaults to . (the same directory as the linking document).
    scriptsdir
    The name of the directory containing linked JavaScripts. Defaults to . (the same directory as the linking document).
    icons
    Link admonition paragraph and admonition block icon images and badge images. By default icons is undefined and text is used in place of icon images.
    iconsdir
    The name of the directory containing linked admonition and navigation icons. Defaults to ./images/icons.
    imagesdir
    This attribute is prepended to the target image file name paths in image inline and block macros. Defaults to a blank string.
    theme
    Use alternative stylesheets (see Stylesheets).
    badges
    Link badges (XHTML 1.1, CSS and Get Firefox!) in document footers. By default badges are omitted (badges is undefined).
    [Note]

    The path names of images, icons and scripts are relative to the output document not the source document.

    encoding

    Set the input and output document character set encoding. For example the —attribute encoding=ISO-8859-1 command-line option will set the character set encoding to ISO-8859-1.

    • The default encoding is UTF-8.
    • This attribute specifies the character set in the output document.
    • The encoding name must correspond to a Python codec name or alias.
    • The encoding attribute can be set using an AttributeEntry inside the document header but it must come at the start of the document before the document title. For example:

      :encoding: ISO-8859-1
    quirks
    Use the xhtml11-quirks.css stylesheet to work around IE6 browser incompatibilities (this is the default behavior).
    data-uri
    Embed images referenced by image macros using the data: uri scheme.

    4.2.1. Stylesheets

    AsciiDoc XHTML output is styled using CSS2 stylesheets from the distribution ./stylesheets/ directory.

    [Important]

    All browsers have CSS quirks, but Microsoft's IE6 has so many omissions and errors that the xhtml11-quirks.css stylesheet and xhtml11-quirks.conf configuration files are included during XHTML backend processing to to implement workarounds for IE6. If you don't use IE6 then the quirks stylesheet and configuration files can be omitted using the —attribute quirks! command-line option.

    Default xhtml11 stylesheets:

    ./stylesheets/xhtml11.css
    The main stylesheet.
    ./stylesheets/xhtml11-manpage.css
    Tweaks for manpage document type generation.
    ./stylesheets/xhtml11-quirks.css
    Stylesheet modifications to work around IE6 browser incompatibilities.

    Use the theme attribute to select and alternative set of stylesheets. For example, the command-line option -a theme=foo will use stylesheets foo.css, foo-manpage.css and foo-quirks.css.

    4.3. html4

    This backend generates plain (unstyled) HTML 4.01 Transitional markup.

    4.4. linuxdoc

    [Warning]

    The AsciiDoc linuxdoc backend is still distributed but is no longer being actively developed or tested with new AsciiDoc releases (the last supported release was AsciiDoc 6.0.3).

    • Tables are not supported.
    • Images are not supported.
    • Callouts are not supported.
    • Horizontal labeled lists are not supported.
    • Only article document types are allowed.
    • The Abstract section can consist only of a single paragraph.
    • An AsciiDoc Preamble is not allowed.
    • The LinuxDoc output format does not support multiple labels per labeled list item although LinuxDoc conversion programs generally output all the labels with a warning.
    • Don't apply character formatting to the link macro attributes, LinuxDoc does not allow displayed link text to be formatted.

    The default output file name extension is .sgml.

    4.5. latex

    An experimental LaTeX backend has been written for AsciiDoc by Benjamin Klum. A tutorial ./doc/latex-backend.html is included in the AsciiDoc distribution which can also be viewed at http://www.methods.co.nz/asciidoc/latex-backend.html.

    5. Document Structure

    An AsciiDoc document consists of a series of block elements starting with an optional document Header, followed by an optional Preamble, followed by zero or more document Sections.

    Almost any combination of zero or more elements constitutes a valid AsciiDoc document: documents can range from a single sentence to a multi-part book.

    5.1. Block Elements

    Block elements consist of one or more lines of text and may contain other block elements.

    The AsciiDoc block structure can be informally summarized [1] as follows:

    Document      ::= (Header?,Preamble?,Section*)
    Header        ::= (Title,(AuthorLine,RevisionLine?)?)
    AuthorLine    ::= (FirstName,(MiddleName?,LastName)?,EmailAddress?)
    RevisionLine  ::= (Revision?,Date)
    Preamble      ::= (SectionBody)
    Section       ::= (Title,SectionBody?,(Section)*)
    SectionBody   ::= ((BlockTitle?,Block)|BlockMacro)+
    Block         ::= (Paragraph|DelimitedBlock|List|Table)
    List          ::= (BulletedList|NumberedList|LabeledList|CalloutList)
    BulletedList  ::= (ListItem)+
    NumberedList  ::= (ListItem)+
    CalloutList   ::= (ListItem)+
    LabeledList   ::= (ItemLabel+,ListItem)+
    ListItem      ::= (ItemText,(List|ListParagraph|ListContinuation)*)
    Table         ::= (Ruler,TableHeader?,TableBody,TableFooter?)
    TableHeader   ::= (TableRow+,TableUnderline)
    TableFooter   ::= (TableRow+,TableUnderline)
    TableBody     ::= (TableRow+,TableUnderline)
    TableRow      ::= (TableData+)

    Where:

    • ? implies zero or one occurrence, + implies one or more occurrences, * implies zero or more occurrences.
    • All block elements are separated by line boundaries.
    • BlockId, AttributeEntry and AttributeList block elements (not shown) can occur almost anywhere.
    • There are a number of document type and backend specific restrictions imposed on the block syntax.
    • The following elements cannot contain blank lines: Header, Title, Paragraph, ItemText.
    • A ListParagraph is a Paragraph with its listelement option set.
    • A ListContinuation is a list continuation element.

    5.2. Header

    The Header is optional but must start on the first line of the document and must begin with a document title. Optional Author and Revision lines immediately follow the title. The header can be preceded by a CommentBlock or comment lines.

    The author line contains the author's name optionally followed by the author's email address. The author's name consists of a first name followed by optional middle and last names separated by white space. Multi-word first, middle and last names can be entered in the header author line using the underscore as a word separator. The email address comes last and must be enclosed in angle <> brackets. Author names cannot contain angle <> bracket characters.

    The optional document header revision line should immediately follow the author line. The revision line can be one of two formats:

    1. An alphanumeric document revision number followed by a date:

      • The revision number and date must be separated by a comma.
      • The revision number is optional but must contain at least one numeric character.
      • Any non-numeric characters preceding the first numeric character will be dropped.
    2. An RCS/CSV/SVN $Id$ marker.

    The document heading is separated from the remainder of the document by one or more blank lines.

    Here's an example AsciiDoc document header:

    Writing Documentation using AsciiDoc
    ====================================
    Stuart Rackham <srackham@gmail.com>
    v2.0, February 2003

    You can override or set header parameters by passing revision, data, email, author, authorinitials, firstname and lastname attributes using the asciidoc(1) -a (—attribute) command-line option. For example:

    $ asciidoc -a date=2004/07/27 article.txt

    Attributes can also be added to the header for substitution in the header template with Attribute Entry elements.

    5.3. Preamble

    The Preamble is an optional untitled section body between the document Header and the first Section title.

    5.4. Sections

    AsciiDoc supports five section levels 0 to 4 (although only book documents are allowed to contain level 0 sections). Section levels are delineated by the section titles.

    Sections are translated using configuration file markup templates. To determine which configuration file template to use AsciiDoc first searches for special section titles in the [specialsections] configuration entries, if not found it uses the [sect<level>] template.

    The -n (—section-numbers) command-line option auto-numbers HTML outputs (DocBook line numbering is handled automatically by the DocBook toolchain commands).

    Section IDs are auto-generated from section titles if the sectids attribute is defined (the default behavior). The primary purpose of this feature is to ensure persistence of table of contents links: missing section IDs are generated dynamically by the JavaScript TOC generator after the page is loaded. This means, for example, that if you go to a bookmarked dynamically generated TOC address the page will load but the browser will ignore the (as yet ungenerated) section ID.

    The IDs are generated by the following algorithm:

    • Replace all non-alphanumeric title characters with an underscore.
    • Strip leading or trailing underscores.
    • Convert to lowercase.
    • Prepend an underscore (so there's no possibility of name clashes with existing document IDs).
    • A numbered suffix (_2, _3 …) is added if a same named auto-generated section ID exists.

    For example the title Jim's House would generate the ID _jim_s_house.

    5.4.1. Special Sections

    In addition to normal sections, documents can contain optional frontmatter and backmatter sections — for example: preface, bibliography, table of contents, index.

    The AsciiDoc configuration file [specialsections] section specifies special section titles and the corresponding backend markup templates.

    [specialsections] entries are formatted like:

    <pattern>=<name>

    <pattern> is a Python regular expression and <name> is the name of a configuration file markup template section. If the <pattern> matches an AsciiDoc document section title then the backend output is marked up using the <name> markup template (instead of the default sect<level> section template). The {title} attribute value is set to the value of the matched regular expression group named title, if there is no title group {title} defaults to the whole of the AsciiDoc section title.

    AsciiDoc comes preconfigured with the following special section titles:

    Preface                    (book documents only)
    Abstract                   (article documents only)
    Dedication                 (book documents only)
    Glossary
    Bibliography|References
    Colophon                   (book documents only)
    Index
    Appendix [A-Z][:.] <title>

    5.5. Inline Elements

    Inline document elements are used to markup character formatting and various types of text substitution. Inline elements and inline element syntax is defined in the asciidoc(1) configuration files.

    Here is a list of AsciiDoc inline elements in the (default) order in which they are processed:

    Special characters
    These character sequences escape special characters used by the backend markup (typically "<", ">", and "&"). See [specialcharacters] configuration file sections.
    Quotes
    Characters that markup words and phrases; usually for character formatting. See [quotes] configuration file sections.
    Special Words
    Word or word phrase patterns singled out for markup without the need for further annotation. See [specialwords] configuration file sections.
    Replacements
    Each Replacement defines a word or word phrase pattern to search for along with corresponding replacement text. See [replacements] configuration file sections.
    Attributes
    Document attribute names enclosed in braces (attribute references) are replaced by the corresponding attribute value.
    Inline Macros
    Inline macros are replaced by the contents of parametrized configuration file sections.

    6. Document Processing

    The AsciiDoc source document is read and processed as follows:

    1. The document Header is parsed, header parameter values are substituted into the configuration file [header] template section which is then written to the output file.
    2. Each document Section is processed and its constituent elements translated to the output file.
    3. The configuration file [footer] template section is substituted and written to the output file.

    When a block element is encountered asciidoc(1) determines the type of block by checking in the following order (first to last): (section) Titles, BlockMacros, Lists, DelimitedBlocks, Tables, AttributeEntrys, AttributeLists, BlockTitles, Paragraphs.

    The default paragraph definition [paradef-default] is last element to be checked.

    Knowing the parsing order will help you devise unambiguous macro, list and block syntax rules.

    Inline substitutions within block elements are performed in the following default order:

    1. Special characters
    2. Quotes
    3. Special words
    4. Replacements
    5. Attributes
    6. Inline Macros
    7. Passthroughs
    8. Replacements2

    The substitutions and substitution order performed on Title, Paragraph and DelimitedBlock elements is determined by configuration file parameters.

    7. Text Formatting

    7.1. Quoted Text

    Words and phrases can be formatted by enclosing inline text with quote characters:

    Emphasized text
    Word phrases 'enclosed in single quote characters' (acute accents) or _underline characters_ are emphasized.
    Strong text
    Word phrases *enclosed in asterisk characters* are rendered in a strong font (usually bold).
    Monospaced text
    Word phrases `enclosed in backtick characters` (grave accents) or +plus characters+ are rendered in a monospaced font.
    “Quoted textâ€
    Phrases ``enclosed with two grave accents to the left and two acute accents to the right'' are rendered in quotation marks.
    Unquoted text
    Placing #hashes around text# does nothing, it is a mechanism to allow inline attributes to be applied to otherwise unformatted text (see example below).

    The alternative underline and plus characters, while marginally less readable, are arguably a better choice than the backtick and apostrophe characters as they are not normally used for, and so not confused with, punctuation.

    Quoted text can be prefixed with an attribute list. Currently the only use made of this feature is to allow the font color, background color and size to be specified (XHTML/HTML only, not DocBook) using the first three positional attribute arguments. The first argument is the text color; the second the background color; the third is the font size. Colors are valid CSS colors and the font size is a number which treated as em units. Here are some examples:

    [red]#Red text#.
    [,yellow]*bold text on a yellow background*.
    [blue,#b0e0e6]+Monospaced blue text on a light blue background+
    [,,2]#Double sized text#.

    New quotes can be defined by editing asciidoc(1) configuration files. See the Configuration Files section for details.

    Quoted text properties

    • Quoting cannot be overlapped.
    • Different quoting types can be nested.
    • To suppress quoted text formatting place a backslash character immediately in front of the leading quote character(s). In the case of ambiguity between escaped and non-escaped text you will need to escape both leading and trailing quotes, in the case of multi-character quotes you may even need to escape individual characters.
    • A configuration file [quotes] entry can be subsequently undefined by setting it to a blank value.

    7.1.1. Constrained and Unconstrained Quotes

    There are actually two types of quotes:

    7.1.1.1. Constrained quotes

    Quote text that must be bounded by white space, for example a phrase or a word. These are the most common type of quote and are the ones discussed previously.

    7.1.1.2. Unconstrained quotes

    Unconstrained quotes have no boundary constraints and can be placed anywhere within inline text. For consistency and to make them easier to remember unconstrained quotes are double-ups of the _, *, + and # constrained quotes:

    __unconstrained emphasized text__
    **unconstrained strong text**
    ++unconstrained monospaced text++
    ##unconstrained unquoted text##

    The following example emboldens the letter F:

    **F**ile Open...
    [Tip]

    The __, **, ++ and ## unconstrained quotes have to be double-escaped (because of their similarity to the single character constrained quotes) — here's how to escape the previous example:

    \*\*F**ile Open...

    7.2. Inline Passthroughs

    This special text quoting mechanism passes inline text to the output document without the usual substitutions. There are two flavors:

    +++Triple-plus passthrough+++
    No change is made to the quoted text, it is passed verbatim to the output document.
    $$Double-dollar passthrough$$
    Special characters are escaped but no other changes are made. This passthrough can be prefixed with inline attributes.

    7.3. Superscripts and Subscripts

    Put ^carets on either^ side of the text to be superscripted, put ~tildes on either side~ of text to be subscripted. For example, the following line:

    e^{amp}#960;i^+1 = 0. H~2~O and x^10^. Some ^super text^
    and ~some sub text~

    Is rendered like:

    eπi+1 = 0. H2O and x10. Some super text and some sub text

    Superscripts and subscripts are implemented as unconstrained quotes so they can be escaped with a leading backslash and prefixed with with an attribute list.

    7.4. Line Breaks (HTML/XHTML)

    A plus character preceded by at least one space character at the end of a line forces a line break. It generates an HTML line break (<br />) tag. Line breaks are ignored when outputting to DocBook since it has no line break element.

    7.5. Rulers (HTML/XHTML)

    A line of four or more apostrophe characters will generate an HTML ruler (<hr />) tag. Ignored when generating non-HTML output formats.

    7.6. Tabs

    By default tab characters input files will translated to 8 spaces. Tab expansion is set with the tabsize entry in the configuration file [miscellaneous] section and can be overridden in the include block macro by setting a tabsize attribute in the macro's attribute list. For example:

    include::addendum.txt[tabsize=2]

    The tab size can also be set using the attribute command-line option, for example --attribute tabsize=4

    7.7. Replacements

    The following replacements are defined in the default AsciiDoc configuration:

    (C) copyright, (TM) trademark, (R) registered trademark,
    -- em dash, ... ellipsis, -> right arrow, <- left arrow, => right
    double arrow, <= left double arrow.

    Which are rendered as:

    © copyright, ™ trademark, ® registered trademark, — em dash, … ellipsis, → right arrow, ↠left arrow, ⇒ right double arrow, ⇠left double arrow.

    The Configuration Files section explains how to configure your own replacements.

    7.8. Special Words

    Words defined in [specialwords] configuration file sections are automatically marked up without having to be explicitly notated.

    The Configuration Files section explains how to add and replace special words.

    8. Titles

    Document and section titles can be in either of two formats:

    8.1. Two line titles

    A two line title consists of a title line, starting hard against the left margin, and an underline. Section underlines consist a repeated character pairs spanning the width of the preceding title (give or take up to three characters):

    The default title underlines for each of the document levels are:

    Level 0 (top level):     ======================
    Level 1:                 ----------------------
    Level 2:                 ~~~~~~~~~~~~~~~~~~~~~~
    Level 3:                 ^^^^^^^^^^^^^^^^^^^^^^
    Level 4 (bottom level):  ++++++++++++++++++++++

    Examples:

    Level One Section Title
    -----------------------
    Level 2 Subsection Title
    ~~~~~~~~~~~~~~~~~~~~~~~~

    8.2. One line titles

    One line titles consist of a single line delimited on either side by one or more equals characters (the number of equals characters corresponds to the section level minus one). Here are some examples (levels 2 and 3 illustrate the optional trailing equals characters syntax):

    = Document Title (level 0) =
    == Section title (level 1) ==
    === Section title (level 2) ===
    ==== Section title (level 3) ====
    ===== Section title (level 4) =====

    Note

    • One or more spaces must fall between the title and the delimiters.
    • The trailing title delimiter is optional.
    • The one-line title syntax can be changed by editing the configuration file [titles] section sect0…sect4 entries.

    9. BlockTitles

    A BlockTitle element is a single line beginning with a period followed by a title. The title is applied to the next Paragraph, DelimitedBlock, List, Table or BlockMacro. For example:

    .Notes
    - Note 1.
    - Note 2.

    is rendered as:

    Notes

    • Note 1.
    • Note 2.

    10. BlockId Element

    A BlockId is a single line block element containing a unique identifier enclosed in double square brackets. It is used to assign an identifier to the ensuing block element for use by referring links. For example:

    [[chapter-titles]]
    Chapter titles can be ...

    The preceding example identifies the following paragraph so it can be linked from other location, for example with <<chapter-titles,chapter titles>>.

    BlockId elements can be applied to Title, Paragraph, List, DelimitedBlock, Table and BlockMacro elements. The BlockId element is really just an AttributeList with a special syntax which sets the {id} attribute for substitution in the subsequent block's markup template.

    The BlockId element has the same syntax and serves a similar function to the anchor inline macro.

    11. Paragraphs

    Paragraphs are terminated by a blank line, the end of file, or the start of a DelimitedBlock.

    Paragraph markup is specified by configuration file [paradef*] sections. AsciiDoc ships with the following predefined paragraph types:

    11.1. Default Paragraph

    A Default paragraph ([paradef-default]) consists of one or more non-blank lines of text. The first line must start hard against the left margin (no intervening white space). The processing expectation of the default paragraph type is that of a normal paragraph of text.

    The verse paragraph style preserves line boundaries and is useful for lyrics and poems. For example:

    [verse]
    Consul *necessitatibus* per id,
    consetetur, eu pro everti postulant
    homero verear ea mea, qui.

    Renders:

    Consul necessitatibus per id,
    consetetur, eu pro everti postulant
    homero verear ea mea, qui.

    11.2. Literal Paragraph

    A Literal paragraph ([paradef-literal]) consists of one or more lines of text, where the first line is indented by one or more space or tab characters. Literal paragraphs are rendered verbatim in a monospaced font usually without any distinguishing background or border. There is no text formatting or substitutions within Literal paragraphs apart from Special Characters and Callouts. For example:

      Consul *necessitatibus* per id,
      consetetur, eu pro everti postulant
      homero verear ea mea, qui.

    Renders:

    Consul *necessitatibus* per id,
    consetetur, eu pro everti postulant
    homero verear ea mea, qui.
    [Note]

    Because lists can be indented it's possible for your Literal paragraph to be misinterpreted as a list — in situations like this use a LiteralBlock in place of a LiteralParagraph.

    11.3. Admonition Paragraphs

    Tip, Note, Important, Warning and Caution paragraph definitions support the corresponding DocBook admonishment elements — just write a normal paragraph but place NOTE:, TIP:, IMPORTANT:, WARNING: or CAUTION: as the first word of the paragraph. For example:

    NOTE: This is an example note.

    or the alternative syntax:

    [NOTE]
    This is an example note.

    Renders:

    [Note]

    This is an example note.

    [Tip]

    If your admonition is more than a single paragraph use an admonition block instead.

    11.3.1. Admonition Icons and Captions

    [Note]

    Admonition customization with icons, iconsdir, icon and caption attributes does not apply when generating DocBook output. If you are going the DocBook route then the a2x(1) —no-icons and —icons-dir options can be used to set the appropriate XSL Stylesheets parameters.

    By default the asciidoc(1) xhtml11 and html4 backends generate text captions instead of icon image links. To generate links to icon images define the icons attribute, for example using the -a icons command-line option.

    The iconsdir attribute sets the location of linked icon images.

    You can override the default icon image using the icon attribute to specify the path of the linked image. For example:

    [icon="./images/icons/wink.png"]
    NOTE: What lovely war.

    Use the caption attribute to customize the admonition captions (not applicable to docbook backend). The following example suppresses the icon image and customizes the caption of a NOTE admonition (undefining the icons attribute with icons=None is only necessary if admonition icons have been enabled):

    [icons=None, caption="My Special Note"]
    NOTE: This is my special note.

    This subsection also applies to Admonition Blocks.

    12. Delimited Blocks

    Delimited blocks are blocks of text enveloped by leading and trailing delimiter lines (normally a series of four or more repeated characters). The behavior of Delimited Blocks is specified by entries in configuration file [blockdef*] sections.

    12.1. Predefined Delimited Blocks

    AsciiDoc ships with a number of predefined DelimitedBlocks (see the asciidoc.conf configuration file in the asciidoc(1) program directory):

    Predefined delimited block underlines:

    CommentBlock:     //////////////////////////
    PassthroughBlock: ++++++++++++++++++++++++++
    ListingBlock:     --------------------------
    LiteralBlock:     ..........................
    SidebarBlock:     **************************
    QuoteBlock:       __________________________
    ExampleBlock:     ==========================
    Filter blocks:    ~~~~~~~~~~~~~~~~~~~~~~~~~~

    The code, source and music filter blocks are detailed in the Filters section.

    Table 1. Default DelimitedBlock substitutions

    Passthrough Listing Literal Sidebar Quote
    Callouts No Yes Yes No No
    Attributes Yes No No Yes Yes
    Inline Macros Yes No No Yes Yes
    Quotes No No No Yes Yes
    Replacements No No No Yes Yes
    Special chars No Yes Yes Yes Yes
    Special words No No No Yes Yes

    12.2. Listing Blocks

    ListingBlocks are rendered verbatim in a monospaced font, they retain line and whitespace formatting and often distinguished by a background or border. There is no text formatting or substitutions within Listing blocks apart from Special Characters and Callouts. Listing blocks are often used for code and file listings.

    Here's an example:

    --------------------------------------
    #include <stdio.h>
    int main() {
        printf("Hello World!\n");
        exit(0);
    }
    --------------------------------------

    Which will be rendered like:

    #include <stdio.h>
    
    int main() {
        printf("Hello World!\n");
        exit(0);
    }

    12.3. Literal Blocks

    LiteralBlocks behave just like LiteralParagraphs except you don't have to indent the contents.

    LiteralBlocks can be used to resolve list ambiguity. If the following list was just indented it would be processed as an ordered list (not an indented paragraph):

    ....................
    1. Item 1
    2. Item 2
    ....................

    Renders:

    1. Item 1
    2. Item 2

    12.4. SidebarBlocks

    A sidebar is a short piece of text presented outside the narrative flow of the main text. The sidebar is normally presented inside a bordered box to set it apart from the main text.

    The sidebar body is treated like a normal section body.

    Here's an example:

    .An Example Sidebar
    ************************************************
    Any AsciiDoc SectionBody element (apart from
    SidebarBlocks) can be placed inside a sidebar.
    ************************************************

    Which will be rendered like:

    12.5. Comment Blocks

    The contents of CommentBlocks are not processed; they are useful for annotations and for excluding new or outdated content that you don't want displayed. Here's and example:

    //////////////////////////////////////////
    CommentBlock contents are not processed by
    asciidoc(1).
    //////////////////////////////////////////

    See also Comment Lines.

    12.6. Passthrough Blocks

    PassthroughBlocks are for backend specific markup, text is only subject to attribute and macro substitution. PassthroughBlock content will generally be backend specific. Here's an example:

    ++++++++++++++++++++++++++++++++++++++
    <table border="1"><tr>
      <td>Cell 1</td>
      <td>Cell 2</td>
    </tr></table>
    ++++++++++++++++++++++++++++++++++++++

    12.7. Quote Blocks

    QuoteBlocks are used for quoted passages of text. There are two styles: quote and verse (the first positional attribute). The attribution and citetitle attributes (positional attributes 2 and 3) specify the content author and source. If no attributes are specified the quote style is used.

    The quote style treats the content like a SectionBody, for example:

    [quote, Bertrand Russell, The World of Mathematics (1956)]
    ____________________________________________________________________
    A good notation has subtlety and suggestiveness which at times makes
    it almost seem like a live teacher.
    ____________________________________________________________________

    Which is rendered as:

     

    A good notation has subtlety and suggestiveness which at times makes it almost seem like a live teacher.

     
     -- Bertrand Russell The World of Mathematics (1956)

    The verse style retains the content's line breaks, for example:

    [verse, William Blake, from Auguries of Innocence]
    __________________________________________________
    To see a world in a grain of sand,
    And a heaven in a wild flower,
    Hold infinity in the palm of your hand,
    And eternity in an hour.
    __________________________________________________

    Which is rendered as:

     

    To see a world in a grain of sand,
    And a heaven in a wild flower,
    Hold infinity in the palm of your hand,
    And eternity in an hour.

     
     -- William Blake from Auguries of Innocence

    12.8. Example Blocks

    ExampleBlocks encapsulate the DocBook Example element and are used for, well, examples. Example blocks can be titled by preceding them with a BlockTitle. DocBook toolchains normally number examples and generate a List of Examples backmatter section.

    Example blocks are delimited by lines of equals characters and you can put any block elements apart from Titles, BlockTitles and Sidebars) inside an example block. For example:

    .An example
    =====================================================================
    Qui in magna commodo, est labitur dolorum an. Est ne magna primis
    adolescens.
    =====================================================================

    Renders:

    Example 1. An example

    Qui in magna commodo, est labitur dolorum an. Est ne magna primis adolescens.


    The title prefix that is automatically inserted by asciidoc(1) can be customized with the caption attribute (xhtml11 and html4 backends). For example

    [caption="Example 1: "]
    .An example with a custom caption
    =====================================================================
    Qui in magna commodo, est labitur dolorum an. Est ne magna primis
    adolescens.
    =====================================================================

    12.9. Admonition Blocks

    The ExampleBlock definition includes a set of admonition styles (NOTE, TIP, IMPORTANT, WARNING, CAUTION) for generating admonition blocks (admonitions containing more than just a simple paragraph). Just precede the ExampleBlock with an attribute list containing the admonition style name. For example:

    [NOTE]
    .A NOTE block
    =====================================================================
    Qui in magna commodo, est labitur dolorum an. Est ne magna primis
    adolescens.
    
    . Fusce euismod commodo velit.
    . Vivamus fringilla mi eu lacus.
      .. Fusce euismod commodo velit.
      .. Vivamus fringilla mi eu lacus.
    . Donec eget arcu bibendum
      nunc consequat lobortis.
    =====================================================================

    Renders:

    [Note]A NOTE block

    Qui in magna commodo, est labitur dolorum an. Est ne magna primis adolescens.

    1. Fusce euismod commodo velit.
    2. Vivamus fringilla mi eu lacus.

      1. Fusce euismod commodo velit.
      2. Vivamus fringilla mi eu lacus.
    3. Donec eget arcu bibendum nunc consequat lobortis.

    See also Admonition Icons and Captions.

    13. Lists

    List types

    • Bulleted lists. Also known as itemized or unordered lists.
    • Numbered lists. Also called ordered lists.
    • Labeled lists. Sometimes called variable or definition lists.
    • Callout lists (a list of callout annotations).

    List behavior

    • Indentation is optional and does not determine nesting, indentation does however make the source more readable.
    • A nested list must use a different syntax from its parent so that asciidoc(1) can distinguish the start of a nested list.
    • By default lists of the same type can only be nested two deep; this could be increased by defining new list definitions.
    • In addition to nested lists a list item will include immediately following Literal paragraphs.
    • Use List Item Continuation to include other block elements in a list item.
    • The listindex intrinsic attribute is the current list item index (1..). If this attribute is not inside a list then it's value is the number of items in the most recently closed list. Useful for displaying the number of items in a list.

    13.1. Bulleted and Numbered Lists

    Bulleted list items start with a dash or an asterisk followed by a space or tab character. Bulleted list syntaxes are:

    - List item.
    * List item.

    Numbered list items start with an optional number or letter followed by a period followed by a space or tab character. List numbering is optional. Numbered list syntaxes are:

    .  Integer numbered list item.
    1. Integer numbered list item with optional numbering.
    .. Lowercase letter numbered list item.
    a. Lowercase letter numbered list item with optional numbering.

    Here are some examples:

    - Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
      * Fusce euismod commodo velit.
      * Qui in magna commodo, est labitur dolorum an. Est ne magna primis
        adolescens. Sit munere ponderum dignissim et. Minim luptatum et
        vel.
      * Vivamus fringilla mi eu lacus.
      * Donec eget arcu bibendum nunc consequat lobortis.
    - Nulla porttitor vulputate libero.
      . Fusce euismod commodo velit.
      . Vivamus fringilla mi eu lacus.
        .. Fusce euismod commodo velit.
        .. Vivamus fringilla mi eu lacus.
      . Donec eget arcu bibendum nunc consequat lobortis.
    - Praesent eget purus quis magna eleifend eleifend.
      1. Fusce euismod commodo velit.
        a. Fusce euismod commodo velit.
        b. Vivamus fringilla mi eu lacus.
        c. Donec eget arcu bibendum nunc consequat lobortis.
      2. Vivamus fringilla mi eu lacus.
      3. Donec eget arcu bibendum nunc consequat lobortis.
      4. Nam fermentum mattis ante.

    Which render as:

    • Lorem ipsum dolor sit amet, consectetuer adipiscing elit.

      • Fusce euismod commodo velit.
      • Qui in magna commodo, est labitur dolorum an. Est ne magna primis adolescens. Sit munere ponderum dignissim et. Minim luptatum et vel.
      • Vivamus fringilla mi eu lacus.
      • Donec eget arcu bibendum nunc consequat lobortis.
    • Nulla porttitor vulputate libero.

      1. Fusce euismod commodo velit.
      2. Vivamus fringilla mi eu lacus.

        1. Fusce euismod commodo velit.
        2. Vivamus fringilla mi eu lacus.
      3. Donec eget arcu bibendum nunc consequat lobortis.
    • Praesent eget purus quis magna eleifend eleifend.

      1. Fusce euismod commodo velit.

        1. Fusce euismod commodo velit.
        2. Vivamus fringilla mi eu lacus.
        3. Donec eget arcu bibendum nunc consequat lobortis.
      2. Vivamus fringilla mi eu lacus.
      3. Donec eget arcu bibendum nunc consequat lobortis.
      4. Nam fermentum mattis ante.

    13.2. Vertical Labeled Lists

    Labeled list items consist of one or more text labels followed the text of the list item.

    An item label begins a line with an alphanumeric character hard against the left margin and ends with a double colon :: or semi-colon ;;.

    The list item text consists of one or more lines of text starting on the line immediately following the label and can be followed by nested List or ListParagraph elements. Item text can be optionally indented.

    Here are some examples:

    Lorem::
      Fusce euismod commodo velit.
    
      Fusce euismod commodo velit.
    
    Ipsum::
      Vivamus fringilla mi eu lacus.
      * Vivamus fringilla mi eu lacus.
      * Donec eget arcu bibendum nunc consequat lobortis.
    Dolor::
      Donec eget arcu bibendum nunc consequat lobortis.
      Suspendisse;;
        A massa id sem aliquam auctor.
      Morbi;;
        Pretium nulla vel lorem.
      In;;
        Dictum mauris in urna.

    Which render as:

    Lorem

    Fusce euismod commodo velit.

    Fusce euismod commodo velit.
    Ipsum

    Vivamus fringilla mi eu lacus.

    • Vivamus fringilla mi eu lacus.
    • Donec eget arcu bibendum nunc consequat lobortis.
    Dolor

    Donec eget arcu bibendum nunc consequat lobortis.

    Suspendisse
    A massa id sem aliquam auctor.
    Morbi
    Pretium nulla vel lorem.
    In
    Dictum mauris in urna.

    13.3. Horizontal Labeled Lists

    Horizontal labeled lists differ from vertical labeled lists in that the label and the list item sit side-by-side as opposed to the item under the label. Item text must begin on the same line as the label although you can begin item text on the next line if you follow the label with a backslash.

    The following horizontal list example also illustrates the omission of optional indentation:

    *Lorem*:: Fusce euismod commodo velit.  Qui in magna commodo, est
    labitur dolorum an. Est ne magna primis adolescens.
    
      Fusce euismod commodo velit.
    
    *Ipsum*:: Vivamus fringilla mi eu lacus.
    - Vivamus fringilla mi eu lacus.
    - Donec eget arcu bibendum nunc consequat lobortis.
    
    *Dolor*:: \
      - Vivamus fringilla mi eu lacus.
      - Donec eget arcu bibendum nunc consequat lobortis.

    Which render as:

    Lorem

    Fusce euismod commodo velit. Qui in magna commodo, est labitur dolorum an. Est ne magna primis adolescens.

    Fusce euismod commodo velit.

    Ipsum

    Vivamus fringilla mi eu lacus.

    • Vivamus fringilla mi eu lacus.
    • Donec eget arcu bibendum nunc consequat lobortis.

    Dolor

    • Vivamus fringilla mi eu lacus.
    • Donec eget arcu bibendum nunc consequat lobortis.
    [Warning]
    • Use vertical labeled lists in preference to horizontal labeled lists — current PDF toolchains do not make a good job of determining the relative column widths.
    • If you are generating DocBook markup the horizontal labeled lists should not be nested because the DocBook XML V4.2 DTD does not permit nested informal tables (although DocBook XSL Stylesheets process them correctly).

    13.4. Question and Answer Lists

    AsciiDoc comes pre-configured with a labeled list for generating DocBook question and answer (Q&A) lists (?? label delimiter). Example:

    Question one??
            Answer one.
    Question two??
            Answer two.

    Renders:

    13.4.1. Question one
    13.4.2. Question two

    13.4.1.

    Question one

    Answer one.

    13.4.2.

    Question two

    Answer two.

    13.5. Glossary Lists

    AsciiDoc comes pre-configured with a labeled list (:- label delimiter) for generating DocBook glossary lists. Example:

    A glossary term:-
        The corresponding definition.
    A second glossary term:-
        The corresponding definition.

    For working examples see the article.txt and book.txt documents in the AsciiDoc ./doc distribution directory.

    [Note]

    To generate valid DocBook output glossary lists must be located in a glossary section.

    13.6. Bibliography Lists

    AsciiDoc comes with a predefined itemized list (+ item bullet) for generating bibliography entries. Example:

    + [[[taoup]]] Eric Steven Raymond. 'The Art of UNIX
      Programming'. Addison-Wesley. ISBN 0-13-142901-9.
    + [[[walsh-muellner]]] Norman Walsh & Leonard Muellner.
      'DocBook - The Definitive Guide'. O'Reilly & Associates.
      1999. ISBN 1-56592-580-7.

    The [[[<reference>]]] syntax is a bibliography entry anchor, it generates an anchor named <reference> and additionally displays [<reference>] at the anchor position. For example [[[taoup]]] generates an anchor named taoup that displays [taoup] at the anchor position. Cite the reference from elsewhere your document using <<taoup>>, this displays a hyperlink ([taoup]) to the corresponding bibliography entry anchor.

    For working examples see the article.txt and book.txt documents in the AsciiDoc ./doc distribution directory.

    [Note]

    To generate valid DocBook output bibliography lists must be located in a bibliography section.

    13.7. List Item Continuation

    To include subsequent block elements in list items (in addition to implicitly included nested lists and Literal paragraphs) place a separator line containing a single plus character between the list item and the ensuing list continuation element. Multiple block elements (excluding section Titles and BlockTitles) may be included in a list item using this technique. For example:

    Here's an example of list item continuation:

    1. List item one.
    +
    List item one continued with a second paragraph followed by an
    Indented block.
    +
    .................
    $ ls *.sh
    $ mv *.sh ~/tmp
    .................
    +
    List item one continued with a third paragraph.
    
    2. List item two.
    
       List item two literal paragraph (no continuation required).
    
    -  Nested list (item one).
    
       Nested list literal paragraph (no continuation required).
    +
    Nested list appended list item one paragraph
    
    -  Nested list item two.

    Renders:

    1. List item one.

      List item one continued with a second paragraph followed by a Listing block.

      $ ls *.sh
      $ mv *.sh ~/tmp

      List item one continued with a third paragraph.

    2. List item two.

      List item two literal paragraph (no continuation required).
      • Nested list (item one).

        Nested list literal paragraph (no continuation required).

        Nested list appended list item one paragraph

      • Nested list item two.

    13.8. List Block

    A List block is a special delimited block containing a list element.

    • All elements between in the List Block are part of the preceding list item. In this respect the List block behaves like List Item Continuation except that list items contained within the block do not require explicit + list item continuation lines:
    • The block delimiter is a single line containing two dashes.
    • Any block title or attributes are passed to the first element inside the block.

    The List Block is useful for:

    1. Lists with long multi-element list items.
    2. Nesting a list within a parent list item (by default nested lists follow the preceding list item).

    Here's an example of a nested list block:

    .Nested List Block
    1. List item one.
    +
    This paragraph is part of the preceding list item
    +
    --
    a. This list is nested and does not require explicit item continuation.
    
    This paragraph is part of the preceding list item
    
    b. List item b.
    
    This paragraph belongs to list item b.
    --
    +
    This paragraph belongs to item 1.
    
    2. Item 2 of the outer list.

    Renders:

    Nested List Block

    1. List item one.

      This paragraph is part of the preceding list item

      1. This list is nested and does not require explicit item continuation.

        This paragraph is part of the preceding list item

      2. List item b.

        This paragraph belongs to list item b.

      This paragraph belongs to item 1.

    2. Item 2 of the outer list.

    14. Footnotes

    The shipped AsciiDoc configuration includes the footnote:[<text>] inline macro for generating footnotes. The footnote text can span multiple lines. Example footnote:

    A footnote footnote:[An example footnote.]

    Which renders:

    A footnote [2]

    Footnotes are primarily useful when generating DocBook output — DocBook conversion programs render footnote outside the primary text flow.

    15. Indexes

    The shipped AsciiDoc configuration includes the inline macros for generating document index entries.

    indexterm:[<primary>,<secondary>,<tertiary>] , (((<primary>,<secondary>,<tertiary>)))
    This inline macro generates an index term (the <secondary> and <tertiary> attributes are optional). For example indexterm:[Tigers,Big cats] (or, using the alternative syntax (((Tigers,Big cats))). Index terms that have secondary and tertiary entries also generate separate index terms for the secondary and tertiary entries. The index terms appear in the index, not the primary text flow.
    indexterm2:[<primary>] , ((<primary>))
    This inline macro generates an index term that appears in both the index and the primary text flow. The <primary> should not be padded to the left or right with white space characters.

    For working examples see the article.txt and book.txt documents in the AsciiDoc ./doc distribution directory.

    [Note]

    Index entries only really make sense if you are generating DocBook markup — DocBook conversion programs automatically generate an index at the point an Index section appears in source document.

    16. Callouts

    Callouts are a mechanism for annotating verbatim text (source code, computer output and user input for example). Callout markers are placed inside the annotated text while the actual annotations are presented in a callout list after the annotated text. Here's an example:

    .MS-DOS directory listing
    .....................................................
    10/17/97   9:04         <DIR>    bin
    10/16/97  14:11         <DIR>    DOS            <1>
    10/16/97  14:40         <DIR>    Program Files
    10/16/97  14:46         <DIR>    TEMP
    10/17/97   9:04         <DIR>    tmp
    10/16/97  14:37         <DIR>    WINNT
    10/16/97  14:25             119  AUTOEXEC.BAT   <2>
     2/13/94   6:21          54,619  COMMAND.COM    <2>
    10/16/97  14:25             115  CONFIG.SYS     <2>
    11/16/97  17:17      61,865,984  pagefile.sys
     2/13/94   6:21           9,349  WINA20.386     <3>
    .....................................................
    
    <1> This directory holds MS-DOS.
    <2> System startup code for DOS.
    <3> Some sort of Windows 3.1 hack.

    Which renders:

    Example 2. MS-DOS directory listing

    10/17/97   9:04         <DIR>    bin
    10/16/97  14:11         <DIR>    DOS            1
    10/16/97  14:40         <DIR>    Program Files
    10/16/97  14:46         <DIR>    TEMP
    10/17/97   9:04         <DIR>    tmp
    10/16/97  14:37         <DIR>    WINNT
    10/16/97  14:25             119  AUTOEXEC.BAT   2
     2/13/94   6:21          54,619  COMMAND.COM    3
    10/16/97  14:25             115  CONFIG.SYS     4
    11/16/97  17:17      61,865,984  pagefile.sys
     2/13/94   6:21           9,349  WINA20.386     5

    1

    This directory holds MS-DOS.

    2 3 4

    System startup code for DOS.

    5

    Some sort of Windows 3.1 hack.

    Explanation

    • The callout marks are whole numbers enclosed in angle brackets that refer to an item index in the following callout list.
    • By default callout marks are confined to LiteralParagraphs, LiteralBlocks and ListingBlocks (although this is a configuration file option and can be changed).
    • Callout list item numbering is fairly relaxed — list items can start with <n>, n> or > where n is the optional list item number (in the latter case list items starting with a single > character are implicitly numbered starting at one).
    • Callout lists should not be nested — start list items hard against the left margin.
    • If you want to present a number inside angle brackets you'll need to escape it with a backslash to prevent it being interpreted as a callout mark.
    [Note]

    To include callout icons in PDF files generated by a2x(1) you need to use the —icons command-line option.

    16.1. Implementation Notes

    Callout marks are generated by the callout inline macro while callout lists are generated using the callout list definition. The callout macro and callout list are special in that they work together. The callout inline macro is not enabled by the normal macros substitutions option, instead it has its own callouts substitution option.

    The following attributes are available during inline callout macro substitution:

    {index}
    The callout list item index inside the angle brackets.
    {coid}
    An identifier formatted like CO<listnumber>-<index> that uniquely identifies the callout mark. For example CO2-4 identifies the fourth callout mark in the second set of callout marks.

    The {coids} attribute can be used during callout list item substitution — it is a space delimited list of callout IDs that refer to the explanatory list item.

    16.2. Including callouts in included code

    You can annotate working code examples with callouts — just remember to put the callouts inside source code comments. This example displays the test.py source file (containing a single callout) using the Source Code Highlighter Filter:

    Example 3. AsciiDoc source

     [source,python]
     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     include::test.py[]
     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
     <1> Print statement.

    Example 4. Included test.py source

    print 'Hello World!'   # <1>

    17. Macros

    Macros are a mechanism for substituting parametrized text into output documents.

    Macros have a name, a single target argument and an attribute list. The default syntax is <name>:<target>[<attributelist>] (for inline macros) and <name>::<target>[<attributelist>] (for block macros). Here are some examples:

    http://www.methods.co.nz/asciidoc/index.html[Asciidoc home page]
    include::chapt1.txt[tabsize=2]
    mailto:srackham@gmail.com[]

    Macro behavior

    • <name> is the macro name. It can only contain letters, digits or dash characters and cannot start with a dash.
    • The optional <target> cannot contain white space characters.
    • <attributelist> is a list of attributes enclosed in square brackets.
    • The attribute list is mandatory except for URLs and email addresses.
    • Expansion of non-system macro references can be escaped by prefixing a backslash character.
    • Block macro attribute reference substitution is performed prior to macro expansion.
    • The substitutions performed prior to Inline macro macro expansion are determined by the inline context.
    • Macros are processed in the order they appear in the configuration file(s).
    • Calls to inline macros can be nested inside different inline macros (an inline macro call cannot contain a nested call to itself).

    17.1. Inline Macros

    Inline Macros occur in an inline element context. Predefined Inline macros include URLs, image and link macros.

    17.1.1. URLs

    http, https, ftp, file, mailto and callto URLs are rendered using predefined inline macros.

    • If you don't need a customized the link caption you can enter the http, https, ftp, file URLs and email addresses without any special macro syntax.
    • If no caption text is specified the URL is displayed.

    Here are some examples:

    http://www.methods.co.nz/asciidoc/[The AsciiDoc home page]
    http://www.methods.co.nz/asciidoc/
    mailto:joe.bloggs@foobar.com[email Joe Bloggs]
    joe.bloggs@foobar.com
    callto:joe.bloggs[]

    Which are rendered:

    The AsciiDoc home page

    http://www.methods.co.nz/asciidoc/

    email Joe Bloggs

    joe.bloggs@foobar.com

    joe.bloggs

    • If the <target> necessitates space characters they should be replaced by %20. For example large%20image.png.
    • Define an attribute entry if you refer to the same URL more than once, this will make your document easier to maintain and easier to read.

    17.1.2. Internal Cross References

    Two AsciiDoc inline macros are provided for creating hypertext links within an AsciiDoc document. You can use either the standard macro syntax or the (preferred) alternative.

    17.1.2.1. anchor

    Used to specify hypertext link targets:

    [[<id>,<xreflabel>]]
    anchor:<id>[<xreflabel>]

    The <id> is a unique identifier that must begin with a letter. The optional <xreflabel> is the text to be displayed by captionless xref macros that refer to this anchor. The optional <xreflabel> is only really useful when generating DocBook output. Example anchor:

    [[X1]]

    You may have noticed that the syntax of this inline element is the same as that of the BlockId block element, this is no coincidence since they are functionally equivalent.

    17.1.2.2. xref

    Creates a hypertext link to a document anchor.

    <<<id>,<caption>>>
    xref:<id>[<caption>]

    The <id> refers to an existing anchor <id>. The optional <caption> is the link's displayed text. Example:

    <<X21,attribute lists>>

    If <caption> is not specified then the displayed text is auto-generated:

    • The AsciiDoc xhtml11 backend displays the <id> enclosed in square brackets.
    • If DocBook is produced the DocBook toolchain is responsible for the displayed text which will normally be the referenced figure, table or section title number followed by the element's title text.

    Here is an example:

    [[tiger_image]]
    .Tyger tyger
    image::tiger.png[]
    
    This can be seen in <<tiger_image>>.

    17.1.3. Linking to Local Documents

    Hypertext links to files on the local file system are specified using the link inline macro.

    link:<target>[<caption>]

    The link macro generates relative URLs. The link macro <target> is the target file name (relative to the file system location of the referring document). The optional <caption> is the link's displayed text. If <caption> is not specified then <target> is displayed. Example:

    link:downloads/foo.zip[download foo.zip]

    You can use the <filename>#<id> syntax to refer to an anchor within a target document but this usually only makes sense when targeting HTML documents.

    Images can serve as hyperlinks using the image macro.

    17.1.4. Images

    Inline images are inserted into the output document using the image macro. The inline syntax is:

    image:<target>[<attributes>]

    The contents of the image file <target> is displayed. To display the image its file format must be supported by the target backend application. HTML and DocBook applications normally support PNG or JPG files.

    <target> file name paths are relative to the location of the referring document.

    Image macro attributes

    • The optional first positional attribute list entry specifies the alternative text which is displayed if the output application is unable to process the image file. For example:

      image:images/logo.png[Company Logo]
    • The optional width and height attributes scale the image size and can be used in any combination. The units are pixels. The following example scales the previous example to a height of 32 pixels:

      image:images/logo.png["Company Logo",height=32]
    • The optional link attribute is used to link the image to an external document. The following example links a screenshot thumbnail to a full size version:

      image:screen-thumbnail.png[height=32,link="screen.png"]
    • The optional scaledwidth attribute is only used in DocBook block images (specifically for PDF documents). The following example scales the images to 75% of the available print width:

      image::images/logo.png["Company Logo",scaledwidth="75%"]
    • The optional align attribute is used for horizontal image alignment in DocBook block images (specifically for PDF documents). Allowed values are center, left and right. For example:

      image::images/tiger.png["Tiger image",align="left"]

    17.2. Block Macros

    A Block macro reference must be contained in a single line separated either side by a blank line or a block delimiter.

    Block macros behave just like Inline macros, with the following differences:

    • They occur in a block context.
    • The default syntax is <name>::<target>[<attributelist>] (two colons, not one).
    • Markup template section names end in -blockmacro instead of -inlinemacro.

    17.2.1. Block Identifier

    The Block Identifier macro sets the id attribute and has the same syntax as the anchor inline macro since it performs essentially the same function — block templates employ the id attribute as a block link target. For example:

    [[X30]]

    This is equivalent to the [id="X30"] block attribute list.

    17.2.2. Images

    Formal titled images are inserted into the output document using the image macro. The syntax is:

    image::<target>[<attributes>]

    The block image macro has the same macro attributes as its inline counterpart.

    Images can be titled by preceding the image macro with a BlockTitle. DocBook toolchains normally number examples and generate a List of Figures backmatter section.

    For example:

    .Main circuit board
    image::images/layout.png[J14P main circuit board]

    xhtml11 and html4 backends precede the title with a Figure : prefix. You can customize this prefix with the caption attribute. For example:

    .Main circuit board
    [caption="Figure 2:"]
    image::images/layout.png[J14P main circuit board]

    17.2.3. Comment Lines

    Single lines starting with two forward slashes hard up against the left margin are treated as comments and are stripped from the output. Comment lines have been implemented as a block macro and are only valid in a block context — they are not treated as comments inside paragraphs or delimited blocks. Example comment line:

    // This is a comment.

    See also Comment Blocks.

    17.3. System Macros

    System macros are block macros that perform a predefined task which is hardwired into the asciidoc(1) program.

    • You can't escape system macros with a leading backslash character (as you can with other macros).
    • The syntax and tasks performed by system macros is built into asciidoc(1) so they don't appear in configuration files. You can however customize the syntax by adding entries to a configuration file [macros] section.

    17.3.1. Include Macros

    The include and include1 system macros to include the contents of a named file into the source document.

    The include macro includes a file as if it were part of the parent document — tabs are expanded and system macros processed. The contents of include1 files are not subject to tab expansion or system macro processing nor are attribute or lower priority substitutions performed. The include1 macro's main use is to include verbatim embedded CSS or scripts into configuration file headers. Example:

     include::chapter1.txt[tabsize=4]

    Include macro behavior

    • If the included file name is specified with a relative path then the path is relative to the location of the referring document.
    • Include macros can appear inside configuration files.
    • Files included from within DelimitedBlocks are read to completion to avoid false end-of-block underline termination.
    • File inclusion is limited to a depth of 5 to catch recursive loops.
    • Attribute references are expanded inside the include target; if an attribute is undefined then the included file is silently skipped.
    • The tabsize macro attribute sets the number of space characters to be used for tab expansion in the included file.
    • Internally the include1 macro is translated to the include1 system attribute which means it must be evaluated in a region where attribute substitution is enabled — use the include macro instead.

    17.3.2. Conditional Inclusion Macros

    Lines of text in the source document can be selectively included or excluded from processing based on the existence (or not) of a document attribute. There are two forms of conditional inclusion macro usage, the first includes document text between the ifdef and endif macros if a document attribute is defined:

    ifdef::<attribute>[]
    :
    endif::<attribute>[]

    The second for includes document text between the ifndef and endif macros if the attribute is not defined:

    ifndef::<attribute>[]
    :
    endif::<attribute>[]

    <attribute> is an attribute name which is optional in the trailing endif macro.

    Take a look at the *.conf configuration files in the AsciiDoc distribution for examples of conditional inclusion macro usage.

    17.3.3. eval, sys and sys2 System Macros

    These block macros exhibit the same behavior as their same named system attribute references. The difference is that system macros occur in a block macro context whereas system attributes are confined to an inline context where attribute substitution is enabled.

    The following example displays a long directory listing inside a literal block:

    ------------------
    sys::[ls -l *.txt]
    ------------------

    17.3.4. Template System Macro

    The template block macro allows the inclusion of one configuration file template section within another. The following example includes the [admonitionblock] section in the [admonitionparagraph] section:

    [admonitionparagraph]
    template::[admonitionblock]

    Template macro behavior

    • The template::[] macro is useful for factoring configuration file markup.
    • template::[] macros cannot be nested.
    • template::[] macro expansion is applied to all sections after all configuration files have been read.

    17.4. Macro Definitions

    Each entry in the configuration [macros] section is a macro definition which can take one of the following forms:

    <pattern>=<name>
    Inline macro definition.
    <pattern>=#<name>
    Block macro definition.
    <pattern>=+<name>
    System macro definition.
    <pattern>
    Delete the existing macro with this <pattern>.

    <pattern> is a Python regular expression and <name> is the name of a markup template. If <name> is omitted then it is the value of the regular expression match group named name.

    Here's what happens during macro substitution

    • Each contextually relevant macro pattern from the [macros] section is matched against the input source line.
    • If a match is found the text to be substituted is loaded from a configuration markup template section named like <name>-inlinemacro or <name>-blockmacro (depending on the macro type).
    • Global and macro attribute list attributes are substituted in the macro's markup template.
    • The substituted template replaces the macro reference in the output document.

    18. Tables

    Tables are the most complex AsciiDoc elements and this section is quite long. [3]

    [Note]

    AsciiDoc generates nice HTML tables, but the current crop of DocBook toolchains render tables with varying degrees of success. Use tables only when really necessary.

    18.1. Example Tables

    The following annotated examples are all you'll need to start creating your own tables.

    The only non-obvious thing you'll need to remember are the column stop characters:

    • Backtick (`) — align left.
    • Single quote (') — align right.
    • Period (.) — align center.

    Simple table:

     `---`---
     1   2
     3   4
     5   6
     --------

    Output:

    1 2
    3 4
    5 6

    Table with title, header and footer:

     .An example table
     [grid="all"]
     '---------.--------------
     Column 1   Column 2
     -------------------------
     1          Item 1
     2          Item 2
     3          Item 3
     -------------------------
     6          Three items
     -------------------------

    Output:

    Table 2. An example table

    Column 1 Column 2
    6 Three items
    1 Item 1
    2 Item 2
    3 Item 3

    Four columns totaling 15% of the pagewidth, CSV data:

    [frame="all"]
    ````~15
    1,2,3,4
    a,b,c,d
    A,B,C,D
    ~~~~~~~~

    Output:

    1 2 3 4
    a b c d
    A B C D

    A table with a numeric ruler and externally sourced CSV data:

     [frame="all", grid="all"]
     .15`20`25`20`~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     ID,Customer Name,Contact Name,Customer Address,Phone
     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     include::customers.csv[]
     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Renders:

    ID Customer Name Contact Name Customer Address Phone
    AROUT Around the Horn Thomas Hardy 120 Hanover Sq. London (171) 555-7788
    BERGS Berglunds snabbkop Christina Berglund Berguvsvagen 8 Lulea 0921-12 34 65
    BLAUS Blauer See Delikatessen Hanna Moos Forsterstr. 57 Mannheim 0621-08460
    BLONP Blondel pere et fils Frederique Citeaux 24, place Kleber Strasbourg 88.60.15.31
    BOLID Bolido Comidas preparadas Martin Sommer C/ Araquil, 67 Madrid (91) 555 22 82
    BONAP Bon app' Laurence Lebihan 12, rue des Bouchers Marseille 91.24.45.40
    BOTTM Bottom-Dollar Markets Elizabeth Lincoln 23 Tsawassen Blvd. Tsawassen (604) 555-4729
    BSBEV B's Beverages Victoria Ashworth Fauntleroy Circus London (171) 555-1212
    CACTU Cactus Comidas para llevar Patricio Simpson Cerrito 333 Buenos Aires (1) 135-5555

    18.2. AsciiDoc Table Block Elements

    This sub-section details the AsciiDoc table format.

    Table  ::= (Ruler,Header?,Body,Footer?)
    Header ::= (Row+,Underline)
    Footer ::= (Row+,Underline)
    Body   ::= (Row+,Underline)
    Row    ::= (Data+)

    A table is terminated when the table underline is followed by a blank line or an end of file. Table underlines which separate table headers, bodies and footers should not be followed by a blank line.

    18.2.1. Ruler

    The first line of the table is called the Ruler. The Ruler specifies which configuration file table definition to use, column widths, column alignments and the overall table width.

    There are two ruler formats:

    Character ruler
    The column widths are determined by the number of table fill characters between column stop characters.
    Numeric ruler
    The column widths are specified numerically. If a column width is omitted the previous width is used. In the degenerate case of no widths being specified columns are allocated equal widths.

    The ruler format can be summarized as:

    ruler ::= ((colstop,colwidth?,fillchar*)+, fillchar+, tablewidth?
    • The ruler starts with a column stop character (designating the start of the first column).
    • Column stop characters specify the start and alignment of each column:

      • Backtick (`) — align left.
      • Single quote (') — align right.
      • Period (.) — align center.
    • In the case of fixed format tables the ruler column widths specify source row data column boundaries.
    • The optional tablewidth is a number representing the size of the output table relative to the pagewidth. If tablewidth is less than one then it is interpreted as a fraction of the page width; if it is greater than one then it is interpreted as a percentage of the page width. If tablewidth is not specified then the table occupies the full pagewidth (numeric rulers) or the relative width of the ruler compared to the textwidth (character rulers).

    18.2.2. Row and Data Elements

    Each table row consists of a line of text containing the same number of Data items as there are columns in the table,

    Lines ending in a backslash character are continued on the next line.

    Each Data item is an AsciiDoc substitutable string. The substitutions performed are specified by the subs table definition entry. Data cannot contain AsciiDoc block elements.

    The format of the row is determined by the table definition format value:

    fixed
    Row data items are assigned by chopping the row up at ruler column width boundaries.
    csv
    Data items are assigned the parsed CSV (Comma Separated Values) data.
    dsv

    The DSV (Delimiter Separated Values) format is a common UNIX tabular text file format.

    • The separator character is a colon (although this can be set to any letter using the separator table attribute).
    • Common C-style backslash escapes are supported.
    • Blank lines are skipped.

    18.2.3. Underline

    A table Underline consists of a line of three or more fillchar characters which are end delimiters for table header, footer and body sections.

    18.2.4. Attribute List

    The following optional table attributes can be specified in an AttributeList preceding the table:

    separator
    The default DSV format colon separator can be changed using the separator attribute. For example: [separator="|"].
    frame
    Defines the table border and can take the following values: topbot (top and bottom), all (all sides), none and sides (left and right sides). The default value is topbot.
    grid
    Defines which ruler lines are drawn between table rows and columns. The grid attribute value can be any of the following values: none, cols, rows and all. The default value is none. For example [frame="all", grid="none"].
    format, tablewidth
    See Markup Attributes below.

    You can also use an AttributeList to override the following table definition and ruler parameters: format, subs, tablewidth.

    18.2.5. Markup Attributes

    The following attributes are automatically available inside table tag and markup templates.

    cols
    The number of columns in the table.
    colalign
    Column alignment assumes one of three values (left, right or center). The value is determined by the corresponding ruler column stop character (only valid inside colspec, headdata, bodydata and footdata tags).
    colwidth
    The output column widths are calculated integers (only valid inside colspec, headdata, bodydata and footdata tags).
    colnumber
    The table column number starting at 1 (only valid inside colspec, 'headdata`, bodydata and footdata tags).
    format
    The table definition format value (can be overridden with attribute list entry).
    tablewidth
    The ruler tablewidth value (can be overridden with attribute list entry).
    pagewidth
    The pagewidth miscellaneous configuration option.
    pageunits
    The pageunits miscellaneous configuration option.

    The colwidth value is calculated as (N is the ruler column width number and M is the sum of the ruler column widths):

    ( N / M ) * pagewidth

    If the ruler tablewidth was specified the column width is multiplied again by this value.

    There is one exception: character rulers that have no pagewidth specified. In this case the colwidth value is calculated as (where N is the column character width measured on the table ruler):

    ( N / textwidth ) * pagewidth

    The following attributes are available to the table markup template:

    comspecs
    Expands to N substituted comspec tags where N is the number of columns.
    headrows, footrows, bodyrows
    These references expand to sets of substituted header, footer and body rows as defined by the corresponding row and data configuration parameters.
    rows
    Experimental attribute (number of source lines in table) available in table markup templates (used by experimental LaTeX backend).

    19. Manpage Documents

    Sooner or later, if you program for a UNIX environment, you're going to have to write a man page.

    By observing a couple of additional conventions you can compose AsciiDoc files that will translate to a DocBook refentry (man page) document. The resulting DocBook file can then be translated to the native roff man page format (or other formats).

    For example, the asciidoc.1.txt file in the AsciiDoc distribution ./doc directory was used to generate both the asciidoc.1.css-embedded.html HTML file the asciidoc.1 roff formatted asciidoc(1) man page.

    To find out more about man pages view the man(7) manpage (man 7 man and man man-pages commands).

    19.1. Document Header

    A document Header is mandatory. The title line contains the man page name followed immediately by the manual section number in brackets, for example ASCIIDOC(1). The title name should not contain white space and the manual section number is a single digit optionally followed by a single character.

    19.2. The NAME Section

    The first manpage section is mandatory, must be titled NAME and must contain a single paragraph (usually a single line) consisting of a list of one or more comma separated command name(s) separated from the command purpose by a dash character. The dash must have at least one white space character on either side. For example:

    printf, fprintf, sprintf - print formatted output

    19.3. The SYNOPSIS Section

    The second manpage section is mandatory and must be titled SYNOPSIS.

    19.4. refmiscinfo attributes

    In addition to the automatically created man page intrinsic attributes you can assign DocBook refmiscinfo element source, version and manual values using AsciiDoc {mansource}, {manversion} and {manmanual} attributes respectively. This example is from the AsciiDoc header of a man page source file:

    :man source:   AsciiDoc
    :man version:  {revision}
    :man manual:   AsciiDoc Manual

    20. Configuration Files

    AsciiDoc source file syntax and output file markup is largely controlled by a set of cascading, text based, configuration files. At runtime The AsciiDoc default configuration files are combined with optional user and document specific configuration files.

    20.1. Configuration File Format

    Configuration files contain named sections. Each section begins with a section name in square brackets []. The section body consists of the lines of text between adjacent section headings.

    • Section names consist of one or more alphanumeric, underscore or dash characters and cannot begin or end with a dash.
    • Lines starting with a hash character "#" are treated as comments and ignored.
    • Same named sections and section entries override previously loaded sections and section entries (this is sometimes referred to as cascading). Consequently, downstream configuration files need only contain those sections and section entries that need to be overridden.
    [Tip]

    When creating custom configuration files you only need to include the sections and entries that differ from the default configuration.

    [Tip]

    The best way to learn about configuration files is to read the default configuration files in the AsciiDoc distribution in conjunction with asciidoc(1) output files. You can view configuration file load sequence by turning on the asciidoc(1) -v (—verbose) command-line option.

    20.2. Markup Template Sections

    Markup template sections supply backend markup for translating AsciiDoc elements. Since the text is normally backend dependent you'll find these sections in the backend specific configuration files. A markup template section body can contain:

    • Backend markup
    • Attribute references
    • System macro calls.
    • A document content placeholder

    The document content placeholder is a single | character and is replaced by text from the source element. Use the {brvbar} attribute reference if you need a literal | character in the template.

    20.3. Special Sections

    AsciiDoc reserves the following predefined special section names for specific purposes:

    miscellaneous
    Configuration options that don't belong anywhere else.
    attributes
    Attribute name/value entries.
    specialcharacters
    Special characters reserved by the backend markup.
    tags
    Backend markup tags.
    quotes
    Definitions for quoted inline character formatting.
    specialwords
    Lists of words and phrases singled out for special markup.
    replacements, replacements2
    Find and replace substitution definitions.
    specialsections
    Used to single out special section names for specific markup.
    macros
    Macro syntax definitions.
    titles
    Heading, section and block title definitions.
    paradef*
    Paragraph element definitions.
    blockdef*
    DelimitedBlock element definitions.
    listdef*
    List element definitions.
    tabledef*
    Table element definitions.

    Each line of text in a special section is a section entry. Section entries share the following syntax:

    name=value
    The entry value is set to value.
    name=
    The entry value is set to a zero length string.
    name
    The entry is undefined (deleted from the configuration).

    Section entry behavior

    • All equals characters inside the name must be escaped with a backslash character.
    • name and value are stripped of leading and trailing white space.
    • Attribute names, tag entry names and markup template section names consist of one or more alphanumeric, underscore or dash characters. Names should not begin or end with a dash.
    • A blank configuration file section (one without any entries) deletes any preceding section with the same name (applies to non-markup template sections).

    20.3.1. Miscellaneous

    The optional [miscellaneous] section specifies the following name=value options:

    newline

    Output file line termination characters. Can include any valid Python string escape sequences. The default value is \r\n (carriage return, line feed). Should not be quoted or contain explicit spaces (use \x20 instead). For example:

    $ asciidoc -a 'newline=\n' -b docbook mydoc.txt
    outfilesuffix
    The default extension for the output file, for example outfilesuffix=.html. Defaults to backend name.
    tabsize
    The number of spaces to expand tab characters, for example tabsize=4. Defaults to 8. A tabsize of zero suppresses tab expansion (useful when piping included files through block filters). Included files can override this option using the tabsize attribute.
    textwidth, pagewidth, pageunits
    These global table related options are documented in the Table Configuration File Definitions sub-section.
    [Note]

    [miscellaneous] configuration file entries can be set using the asciidoc(1) -a (—attribute) command-line option.

    20.3.2. Titles

    sectiontitle
    Two line section title pattern. The entry value is a Python regular expression containing the named group title.
    underlines

    A comma separated list of document and section title underline character pairs starting with the section level 0 and ending with section level 4 underline. The default setting is:

    underlines="==","--","~~","^^","++"
    sect0…sect4
    One line section title patterns. The entry value is a Python regular expression containing the named group title.
    blocktitle
    BlockTitle element pattern. The entry value is a Python regular expression containing the named group title.
    subs
    A comma separated list of substitutions that are performed on the document header and section titles. Defaults to normal substitution.

    20.3.3. Tags

    The [tags] section contains backend tag definitions (one per line). Tags are used to translate AsciiDoc elements to backend markup.

    An AsciiDoc tag definition is formatted like <tagname>=<starttag>|<endtag>. For example:

    emphasis=<em>|</em>

    In this example asciidoc(1) replaces the | character with the emphasized text from the AsciiDoc input file and writes the result to the output file.

    Use the {brvbar} attribute reference if you need to include a | pipe character inside tag text.

    20.3.4. Attributes Section

    The optional [attributes] section contains predefined attributes.

    If the attribute value requires leading or trailing spaces then the text text should be enclosed in double-quote (") characters.

    To delete a attribute insert a name only entry in a downstream configuration file or use the asciidoc(1) —attribute name! command-line option (the attribute name is suffixed with a ! character to delete it).

    20.3.5. Special Characters

    The [specialcharacters] section specifies how to escape characters reserved by the backend markup. Each translation is specified on a single line formatted like:

    special_character=translated_characters

    Special characters are normally confined to those that resolve markup ambiguity (in the case of SGML/XML markups the ampersand, less than and greater than characters). The following example causes all occurrences of the < character to be replaced by &lt;.

    <=&lt;

    20.3.6. Quoted Text

    Quoting is used primarily for text formatting. The [quotes] section defines AsciiDoc quoting characters and their corresponding backend markup tags. Each section entry value is the name of a of a [tags] section entry. The entry name is the character (or characters) that quote the text. The following examples are taken from AsciiDoc configuration files:

    [quotes]
    _=emphasis
    [tags]
    emphasis=<em>|</em>

    You can specify the left and right quote strings separately by separating them with a | character, for example:

    ``|''=quoted

    Omitting the tag will disable quoting, for example, if you don't want superscripts or subscripts put the following in a custom configuration file or edit the global asciidoc.conf configuration file:

    [quotes]
    ^=
    ~=

    Unconstrained quotes are differentiated by prefixing the tag name with a hash character, for example:

    __=#emphasis

    Quoted text behavior

    • Quote characters must be non-alphanumeric.
    • To minimize quoting ambiguity try not to use the same quote characters in different quote types.

    20.3.7. Special Words

    The [specialwords] section is used to single out words and phrases that you want to consistently format in some way throughout your document without having to repeatedly specify the markup. The name of each entry corresponds to a markup template section and the entry value consists of a list of words and phrases to be marked up. For example:

    [specialwords]
    strongwords=NOTE: IMPORTANT:
    [strongwords]
    <strong>{words}</strong>

    The examples specifies that any occurrence of NOTE: or IMPORTANT: should appear in a bold font.

    Words and word phrases are treated as Python regular expressions: for example, the word ^NOTE: would only match NOTE: if appeared at the start of a line.

    AsciiDoc comes with three built-in Special Word types: emphasizedwords, monospacedwords and strongwords, each has a corresponding (backend specific) markup template section. Edit the configuration files to customize existing Special Words and to add new ones.

    Special word behavior

    • Word list entries must be separated by space characters.
    • Word list entries with embedded spaces should be enclosed in quotation (") characters.
    • A [specialwords] section entry of the form name=word1 [word2…] adds words to existing name entries.
    • A [specialwords] section entry of the form name undefines (deletes) all existing name words.
    • Since word list entries are processed as Python regular expressions you need to be careful to escape regular expression special characters.
    • By default Special Words are substituted before Inline Macros, this may lead to undesirable consequences. For example the special word foobar would be expanded inside the macro call http://www.foobar.com. A possible solution is to emphasize whole words only by defining the word using regular expression characters, for example \bfoobar\b.
    • If the first matched character of a special word is a backslash then the remaining characters are output without markup i.e. the backslash can be used to escape special word markup. For example the special word \\?\b[Tt]en\b will mark up the words Ten and ten only if they are not preceded by a backslash.

    20.3.8. Replacements

    [replacements] and [replacements2] configuration file entries specify find and replace text and are formatted like:

    find_pattern=replacement_text

    The find text can be a Python regular expression; the replace text can contain Python regular expression group references.

    Use Replacement shortcuts for often used macro references, for example (the second replacement allows us to backslash escape the macro name):

    NEW!=image:./images/smallnew.png[New!]
    \\NEW!=NEW!

    Replacement behavior

    • The built-in replacements can be escaped with a backslash.
    • If the find or replace text has leading or trailing spaces then the text should be enclosed in quotation (") characters.
    • Since the find text is processed as a regular expression you need to be careful to escape regular expression special characters.
    • Replacements are performed in the same order they appear in the configuration file replacements section.

    20.4. Configuration File Names and Locations

    Configuration files have a .conf file name extension; they are loaded implicitly (using predefined file names and locations) or explicitly (using the asciidoc(1) -f (—conf-file) command-line option).

    Implicit configuration files are loaded from the following directories in the following order:

    1. The /etc/asciidoc directory (if it exists).
    2. The directory containing the asciidoc executable.
    3. The user's $HOME/.asciidoc directory (if it exists).
    4. The directory containing the AsciiDoc source file.

    The following implicit configuration files from each of the above locations are loaded in the following order:

    1. asciidoc.conf
    2. <backend>.conf
    3. <backend>-<doctype>.conf
    4. lang-<lang>.conf

    Where <backend> and <doctype> are values specified by the asciidoc(1) -b (—backend) and -d (—doctype) command-line options. <lang> is the value of the AsciiDoc lang attribute (defaults to en (English)).

    Finally, configuration files named like the source file will be automatically loaded if they are found in the source file directory. For example if the source file is mydoc.txt and the —backend=html4 option is used then asciidoc(1) will look for mydoc.conf and mydoc-html4.conf in that order.

    Implicit configuration files that don't exist will be silently skipped.

    The user can explicitly specify additional configuration files using the asciidoc(1) -f (—conf-file) command-line option. The -f option can be specified multiple times, in which case configuration files will be processed in the order they appear on the command-line.

    For example, when we translate our AsciiDoc document mydoc.txt with:

    $ asciidoc -f extra.conf mydoc.txt

    Configuration files (if they exist) will be processed in the following order:

    1. First default global configuration files from the asciidoc program directory are loaded:

      asciidoc.conf
      xhtml11.conf
    2. Then, from the users home ~/.asciidoc directory. This is were you put customization specific to your own asciidoc documents:

      asciidoc.conf
      xhtml11.conf
      xhtml11-article.conf
    3. Next from the source document project directory (the first three apply to all documents in the directory, the last two are specific to the mydoc.txt document):

      asciidoc.conf
      xhtml11.conf
      xhtml11-article.conf
      mydoc.conf
      mydoc-xhtml11.conf
    4. Finally the file specified by the -f command-line option is loaded:

      extra.conf
    [Tip]

    Use the asciidoc(1) -v (—verbose) command-line option to see which configuration files are loaded and the order in which they are loaded.

    21. Document Attributes

    A document attribute is comprised of a name and a textual value and is used for textual substitution in AsciiDoc documents and configuration files. An attribute reference (an attribute name enclosed in braces) is replaced by its corresponding attribute value.

    There are four sources of document attributes (from highest to lowest precedence):

    • Command-line attributes.
    • AttributeEntry, AttributeList, Macro and BlockId elements.
    • Configuration file [attributes] sections.
    • Intrinsic attributes.

    Within each of these divisions the last processed entry takes precedence.

    [Important]

    If an attribute is not defined then the line containing the attribute reference is dropped. This property is used extensively in AsciiDoc configuration files to facilitate conditional markup generation.

    22. Attribute Entries

    The AttributeEntry block element allows document attributes to be assigned within an AsciiDoc document. Attribute entries are added to the global document attributes dictionary. The attribute name/value syntax is a single line like:

    :<name>: <value>

    For example:

    :Author Initials: JB

    This will set an attribute reference {authorinitials} to the value JB in the current document.

    To delete (undefine) an attribute use the following syntax:

    :<name>!:

    AttributeEntry properties

    • The attribute entry line begins with colon — no white space allowed in left margin.
    • AsciiDoc converts the <name> to a legal attribute name (lower case, alphanumeric and dash characters only — all other characters deleted). This allows more reader friendly text to be used.
    • Leading and trailing white space is stripped from the <value>.
    • If the <value> is blank then the corresponding attribute value is set to an empty string.
    • Special characters in the entry <value> are substituted. To include special characters use the predefined {gt}, {lt}, {amp} attribute references.
    • Attribute references contained in the entry <value> will be expanded.
    • By default AttributeEntry values are substituted for specialcharacters and attributes (see above), if you want a different AttributeEntry substitution set the attributeentry-subs attribute.
    • Attribute entries in the document Header are available for header markup template substitution.
    • Attribute elements override configuration file and intrinsic attributes but do not override command-line attributes.

    Here's another example:

    AsciiDoc User Manual
    ====================
    :Author:    Stuart Rackham
    :Email:     srackham@gmail.com
    :Date:      April 23, 2004
    :Revision:  5.1.1
    :Key words: linux, ralink, debian, wireless
    :Revision history:

    Which creates these attributes:

    {author}, {firstname}, {lastname}, {authorinitials}, {email},
    {date}, {revision}, {keywords}, {revisionhistory}

    The preceding example is equivalent to the standard AsciiDoc two line document header. Actually it's a little bit different with the addition of the {keywords} and {revisionhistory} attributes [4].

    23. Attribute Lists

    An attribute list is a comma separated list of attribute values. The entire list is enclosed in square brackets. Attribute lists are used to pass parameters to macros, blocks and inline quotes.

    The list consists of zero or more positional attribute values followed by zero or more named attribute values. Here are three examples:

    [Hello]
    [quote, Bertrand Russell, The World of Mathematics (1956)]
    ["22 times", backcolor="#0e0e0e", options="noborders,wide"]

    Attribute list properties

    • If one or more attribute values contains a comma the all values must be quoted (enclosed in quotation characters).
    • If the list contains any named attributes the all string attribute values must be quoted.
    • List attributes take precedence over existing attributes.
    • List attributes can only be referenced in configuration file markup templates and tags, they are not available inside the document.
    • Attribute references are allowed inside attribute lists.
    • Setting a named attribute to None undefines the attribute.
    • Positional attributes are referred to as {1},{2},{3},…
    • Attribute {0} refers to the entire list (excluding the enclosing square brackets).
    • If an attribute named options is present it is processed as a comma separated list of attributes with zero length string values. For example [options="opt1,opt2,opt3"] is equivalent to [opt1="",opt2="",opt2=""].
    • Attribute lists are evaluated as a list of Python function arguments. If this fails or any of the items do not evaluate to a string, a number or None then all list items are treated as string literals.

    23.1. Macro Attribute lists

    Macros calls are suffixed with an attribute list. The list may be empty but it cannot be omitted. List entries are used to pass attribute values to macro markup templates.

    23.2. AttributeList Element

    An attribute list on a line by itself constitutes an AttributeList block element, its function is to parametrize the following block element. The list attributes are passed to the next block element for markup template substitution.

    24. Attribute References

    An attribute references is an attribute name (possibly followed by an additional parameters) enclosed in braces. When an attribute reference is encountered it is evaluated and replaced by its corresponding text value. If the attribute is undefined the line containing the attribute is dropped.

    There are three types of attribute reference: Simple, Conditional and System.

    Attribute reference behavior

    • You can suppress attribute reference expansion by placing a backslash character immediately in front of the opening brace character.
    • By default attribute references are not expanded in LiteralParagraphs, ListingBlocks or LiteralBlocks.

    24.1. Simple Attributes References

    Simple attribute references take the form {<name>}. If the attribute name is defined its text value is substituted otherwise the line containing the reference is dropped from the output.

    24.2. Conditional Attribute References

    Additional parameters are used in conjunction with the attribute name to calculate a substitution value. Conditional attribute references take the following forms:

    {<name>=<value>}
    <value> is substituted if the attribute <name> is undefined otherwise its value is substituted. <value> can contain simple attribute references.
    {<name>?<value>}
    <value> is substituted if the attribute <name> is defined otherwise an empty string is substituted. <value> can contain simple attribute references.
    {<name>!<value>}
    <value> is substituted if the attribute <name> is undefined otherwise an empty string is substituted. <value> can contain simple attribute references.
    {<name>#<value>}
    <value> is substituted if the attribute <name> is defined otherwise the undefined attribute entry causes the containing line to be dropped. <value> can contain simple attribute references.
    {<name>%<value>}
    <value> is substituted if the attribute <name> is not defined otherwise the containing line is dropped. <value> can contain simple attribute references.
    {<name>@<regexp>:<value1>[:<value2>]}
    <value1> is substituted if the value of attribute <name> matches the regular expression <regexp> otherwise <value2> is substituted. If attribute <name> is not defined the containing line is dropped. If <value2> is omitted an empty string is assumed. The values and the regular expression can contain simple attribute references. To embed colons in the values or the regular expression escape them with backslashes.
    {<name>$<regexp>:<value1>[:<value2>]}

    Same behavior as the previous ternary attribute except for the following cases:

    {<name>$<regexp>:<value>}
    Substitutes <value> if <name> matches <regexp> otherwise the result is undefined and the containing line is dropped.
    {<name>$<regexp>::<value>}
    Substitutes <value> if <name> does not match <regexp> otherwise the result is undefined and the containing line is dropped.

    24.2.1. Conditional attribute examples

    Conditional attributes are mainly used in AsciiDoc configuration files — see the distribution .conf files for examples.

    Attribute equality test

    If {backend} is docbook or xhtml11 the example evaluates to “DocBook or XHTML backend†otherwise it evaluates to “some other backendâ€:

    {backend@docbook|xhtml11:DocBook or XHTML backend:some other backend}
    Attribute value map

    This example maps the frame attribute values [topbot, all, none, sides] to [hsides, border, void, vsides]:

    {frame@topbot:hsides}{frame@all:border}{frame@none:void}{frame@sides:vsides}

    24.3. System Attribute References

    System attribute references generate the attribute text value by executing a predefined action that is parametrized by a single argument. The syntax is {<action>:<argument>}.

    {eval:<expression>}
    Substitutes the result of the Python <expression>. If <expression> evaluates to None or False the reference is deemed undefined and the line containing the reference is dropped from the output. If the expression evaluates to True the attribute evaluates to an empty string. In all remaining cases the attribute evaluates to a string representation of the <expression> result.
    {include:<filename>}

    Substitutes contents of the file named <filename>.

    • The included file is read at the time of attribute substitution.
    • If the file does not exist a warning is emitted and the line containing the reference is dropped from the output file.
    • Tabs are expanded based on the current tabsize attribute value.
    {sys:<command>}
    Substitutes the stdout generated by the execution of the shell <command>.
    {sys2:<command>}
    Substitutes the stdout and stderr generated by the execution of the shell <command>.

    System reference behavior

    • System attribute arguments can contain non-system attribute references.
    • Closing brace characters inside system attribute arguments must be escaped them with a backslash.

    25. Intrinsic Attributes

    Intrinsic attributes are simple attributes that are created automatically from AsciiDoc document header parameters, asciidoc(1) command-line arguments, execution parameters along with attributes defined in the default configuration files. Here's the list of predefined intrinsic attributes:

    {asciidoc-dir}        the asciidoc(1) application directory
    {asciidoc-version}    the version of asciidoc(1)
    {author}              author's full name
    {authored}            empty string '' if {author} or {email} defined,
    {authorinitials}      author initials (from document header)
    {backend-<backend>}   empty string ''
    {<backend>-<doctype>} empty string ''
    {backend}             document backend specified by `-b` option
    {basebackend-<base>}  empty string ''
    {basebackend}         html or docbook
    {brvbar}              broken vertical bar (|) character
    {date}                document date (from document header)
    {docname}             document file name without extension
    {doctitle}            document title (from document header)
    {doctype-<doctype>}   empty string ''
    {doctype}             document type specified by `-d` option
    {email}               author's email address (from document header)
    {empty}               empty string ''
    {filetype-<fileext>}  empty string ''
    {filetype}            output file name file extension
    {firstname}           author first name (from document header)
    {gt}                  greater than (>) character
    {id}                  running block id generated by BlockId elements
    {indir}               document input directory name (note 1)
    {infile}              input file name (note 1)
    {lastname}            author last name (from document header)
    {listindex}           the list index (1..) of the most recent list item
    {localdate}           the current date
    {localtime}           the current time
    {lt}                  less than (<) character
    {manname}             manpage name (defined in NAME section)
    {manpurpose}          manpage (defined in NAME section)
    {mantitle}            document title minus the manpage volume number
    {manvolnum}           manpage volume number (1..8) (from document header)
    {middlename}          author middle name (from document header)
    {outdir}              document output directory name (note 1)
    {outfile}             output file name (note 1)
    {revision}            document revision number (from document header)
    {sectnum}             section number (in section titles)
    {title}               section title (in titled elements)
    {user-dir}            the ~/.asciidoc directory (if it exists)
    {verbose}             defined as '' if --verbose command option specified

    NOTES

    1. Intrinsic attributes are global so avoid defining custom attributes with the same names.
    2. {infile}, {outdir}, {infile}, {indir} attributes are effectively read-only (you can set them but it won't affect the input or output file paths).
    3. See also the xhtml11 subsection for attributes that relate to AsciiDoc XHTML file generation.
    4. The entries that translate to blank strings are designed to be used for conditional text inclusion. You can also use the ifdef, ifndef and endif System macros for conditional inclusion. [5]

    26. Block Element Definitions

    The syntax and behavior of Paragraph, DelimitedBlock, List and Table block elements is determined by block definitions contained in AsciiDoc configuration file sections.

    Each definition consists of a section title followed by one or more section entries. Each entry defines a block parameter controlling some aspect of the block's behavior. Here's an example:

    [blockdef-listing]
    delimiter=^-{4,}$
    template=listingblock
    presubs=specialcharacters,callouts

    AsciiDoc Paragraph, DelimitedBlock, List and Table block elements share a common subset of configuration file parameters:

    delimiter
    A Python regular expression that matches the first line of a block element — in the case of DelimitedBlocks it also matches the last line. Table elements don't have an explicit delimiter — they synthesize their delimiters at runtime.
    template
    The name of the configuration file markup template section that will envelope the block contents. The pipe | character is substituted for the block contents. List elements use a set of (list specific) tag parameters instead of a single template.
    options
    A comma delimited list of element specific option names.
    subs, presubs, postsubs
    • presubs and postsubs are lists of comma separated substitutions that are performed on the block contents. presubs is applied first, postsubs (if specified) second.
    • subs is an alias for presubs.
    • If a filter is allowed (Paragraphs and DelimitedBlocks) and has been specified then presubs and postsubs substitutions are performed before and after the filter is run respectively.
    • Allowed values: specialcharacters, quotes, specialwords, replacements, macros, attributes, callouts.
    • The following composite values are also allowed:

      none
      No substitutions.
      normal
      The following substitutions: specialcharacters,quotes,attributes,specialwords, replacements,macros,passthroughs.
      verbatim
      specialcharacters and callouts substitutions.
    • normal and verbatim substitutions can be redefined by with subsnormal and subsverbatim entries in a configuration file [miscellaneous] section.
    • The substitutions are processed in the order in which they are listed and can appear more than once.
    filter
    This optional entry specifies an executable shell command for processing block content (Paragraphs and DelimitedBlocks). The filter command can contain attribute references.
    posattrs

    Optional comma separated list of positional attribute names. This list maps positional attributes (in the block's attribute list) to named block attributes. The following example, from the QuoteBlock definition, maps the first and section positional attributes:

    posattrs=attribution,citetitle
    style
    This optional parameter specifies the default style name.
    <stylename>-style
    Optional style definition (see Styles below).

    The following block parameters behave like document attributes and can be set in block attribute lists and style definitions: template, options, subs, presubs, postsubs, filter.

    26.1. Styles

    A style is a set of block attributes bundled as a single named attribute. The following example defines a style named verbatim:

    verbatim-style=template="literalblock",subs="verbatim",font="monospaced"
    • All style parameter names must be suffixed with -style and the style parameter value is in the form of a list of named attributes.
    • Multi-item style attributes (subs,presubs,postsubs,posattrs) must be specified using Python tuple syntax rather than a simple list of values as they in separate entries e.g. postsubs=("callouts",) not postsubs="callouts".

    26.2. Paragraphs

    Paragraph translation is controlled by [paradef*] configuration file section entries. Users can define new types of paragraphs and modify the behavior of existing types by editing AsciiDoc configuration files.

    Here is the shipped Default paragraph definition:

    [paradef-default]
    delimiter=(?P<text>\S.*)
    template=paragraph

    The Default paragraph definition has a couple of special properties:

    1. It must exist and be defined in a configuration file section named [paradef-default].
    2. Irrespective of its position in the configuration files default paragraph document matches are attempted only after trying all other paragraph types.

    Paragraph specific block parameter notes:

    delimiter
    This regular expression must contain the named group text which matches the text on the first line. Paragraphs are terminated by a blank line, the end of file, or the start of a DelimitedBlock.
    options
    The only allowable option is listelement. The listelement option specifies that paragraphs of this type will automatically be considered part of immediately preceding list items.

    Paragraph processing proceeds as follows:

    1. The paragraph text is aligned to the left margin.
    2. Optional presubs inline substitutions are performed on the paragraph text.
    3. If a filter command is specified it is executed and the paragraph text piped to its standard input; the filter output replaces the paragraph text.
    4. Optional postsubs inline substitutions are performed on the paragraph text.
    5. The paragraph text is enveloped by the paragraph's markup template and written to the output file.

    26.3. Delimited Blocks

    DelimitedBlock specific block definition notes:

    options

    Allowed values are:

    sectionbody
    The block contents are processed as a SectionBody.
    skip
    The block is treated as a comment (see CommentBlocks).
    list
    The block is a list block.

    presubs, postsubs and filter entries are meaningless when sectionbody, skip or list options are set.

    DelimitedBlock processing proceeds as follows:

    1. Optional presubs substitutions are performed on the block contents.
    2. If a filter is specified it is executed and the block's contents piped to its standard input. The filter output replaces the block contents.
    3. Optional postsubs substitutions are performed on the block contents.
    4. The block contents is enveloped by the block's markup template and written to the output file.
    [Tip]

    Attribute expansion is performed on the block filter command before it is executed, this is useful for passing arguments to the filter.

    26.4. Lists

    List behavior and syntax is determined by [listdef*] configuration file sections. The user can change existing list behavior and add new list types by editing configuration files.

    List specific block definition notes:

    type
    This is either bulleted,numbered,labeled or callout.
    delimiter
    A Python regular expression that matches the first line of a list element entry. This expression must contain the named group text which matches text in the first line.
    subs
    Substitutions that are performed on list item text and terms.
    listtag
    The name of the tag that envelopes the List.
    itemtag
    The name of the tag that envelopes the ListItem.
    texttag
    The name of the tag that envelopes the list item text.
    labeltag
    The name of the tag that envelopes a variable list label.
    entrytag
    The name of the tag that envelopes a labeled list entry.

    The tag entries map the AsciiDoc list structure to backend markup; see the AsciiDoc distribution .conf configuration files for examples.

    26.5. Tables

    Table behavior and syntax is determined by [tabledef*] configuration file sections. The user can change existing list behavior and add new list types by editing configuration files.

    Table specific block definition notes:

    fillchar
    A single character that fills table ruler and underline lines.
    subs
    Substitutions performed on table data items.
    format
    The source row data format (fixed, csv or dsv).
    comspec
    The table comspec tag definition.
    headrow, footrow, bodyrow
    Table header, footer and body row tag definitions. headrow and footrow table definition entries default to bodyrow if they are undefined.
    headdata, footdata, bodydata
    Table header, footer and body data tag definitions. headdata and footdata table definition entries default to bodydata if they are undefined.

    Table behavior is also influenced by the following [miscellaneous] configuration file entries:

    textwidth
    The page width (in characters) of the source text. This setting is compared to the table ruler width when calculating the relative size of character ruler tables on the output page.
    pagewidth
    This integer value is the printable width of the output media. Used to calculate colwidth and tablewidth substitution values.
    pageunits
    The units of width in output markup width attribute values.

    Table definition behavior

    • The output markup generation is specifically designed to work with the HTML and CALS (DocBook) table models, but should be adaptable to most XML table schema.
    • Table definitions can be “mixed in†from multiple cascading configuration files.
    • New table definitions inherit the default table definition ([tabledef-default]) so you only need to override those conf file entries that require modification when defining a new table type.

    27. Filters

    Filters are external shell commands used to process Paragraph and DelimitedBlock content; they are specified in configuration file Paragraph and DelimitedBlock definitions.

    There's nothing special about the filters, they're just standard UNIX filters: they read text from the standard input, process it, and write to the standard output.

    Attribute substitution is performed on the filter command prior to execution — attributes can be used to pass parameters from the AsciiDoc source document to the filter.

    [Warning]

    Filters can potentially generate unsafe output. Before installing a filter you should verify that it can't be coerced into generating malicious output or exposing sensitive information.

    [Note]

    Filter functionality is currently only available on POSIX platforms (this includes Cygwin).

    27.1. Filter Search Paths

    If the filter command does not specify a directory path then asciidoc(1) searches for the command:

    • First it looks in the user's $HOME/.asciidoc/filters directory.
    • Next the /etc/asciidoc/filters directory is searched.
    • Then it looks in the asciidoc(1) ./filters directory.
    • Finally it relies on the executing shell to search the environment search path ($PATH).

    27.2. Filter Configuration Files

    Filters are normally accompanied by a configuration file containing a Paragraph or DelimitedBlock definition along with corresponding markup templates.

    There are two ways to implement filters:

    • As a new Paragraph or DelimitedBlock definition.
    • By styling an existing Paragraph or DelimitedBlock using a style configuration entry — the source highlight and music filters use this technique to customize the ListingBlock. By convention the style is given the same name as the filter.

    asciidoc(1) auto-loads all .conf files found in the filter search paths (see previous section).

    27.3. Code Filter

    AsciiDoc comes with a simple minded for highlighting source code keywords and comments. See also the ./filters/code-filter-readme.txt file.

    [Note]

    This filter primarily 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 multi-language highlighter use the Source Code Highlighter Filter.

    .Code filter example
    [code,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
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Outputs:

    Example 5. Code filter example

    ''' 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

    27.4. Source Code Highlighter Filter

    A source code highlighter filter can be found in the AsciiDoc distribution ./filters directory.

    27.5. Music Filter

    A music filter is included in the distribution ./filters directory. It translates music in LilyPond or ABC notation to standard Western classical notation in the form of a trimmed PNG image which is automatically inserted into the output document.

    28. Converting DocBook to other file formats

    DocBook files are validated, parsed and translated by a combination of applications collectively called a DocBook tool chain. The function of a tool chain is to read the DocBook markup (produced by AsciiDoc) and transform it to a presentation format (for example HTML, PDF, HTML Help, DVI, PostScript, LaTeX).

    A wide range of user output format requirements coupled with a choice of available tools and stylesheets results in many valid tool chain combinations.

    28.1. a2x Toolchain Wrapper

    One of the biggest hurdles for new users is installing, configuring and using a DocBook XML toolchain. a2x(1) can help — it's a toolchain wrapper command that will generate XHTML (chunked and unchunked), PDF, DVI, PS, LaTeX, man page, HTML Help and text file outputs from an AsciiDoc text file. a2x(1) does all the grunt work associated with generating and sequencing the toolchain commands and managing intermediate and output files. a2x(1) also optionally deploys admonition and navigation icons and a CSS stylesheet. See the a2x(1) man page for more details. All you need is xsltproc(1), DocBook XSL Stylesheets and, optionally dblatex or FOP (if you want PDF), or lynx(1) (if you want text).

    The following examples generate doc/source-highlight-filter.pdf from the AsciiDoc doc/source-highlight-filter.txt source file. The first example uses dblatex(1) (the default PDF generator) the second example forces FOP to be used:

    $ a2x -f pdf doc/source-highlight-filter.txt
    $ a2x -f pdf --fop-options="" doc/source-highlight-filter.txt

    See the a2x(1) man page for details.

    [Tip]

    Use the —verbose command-line option to view executed toolchain commands.

    28.2. HTML generation

    AsciiDoc produces nicely styled HTML directly without requiring a DocBook toolchain but there are also advantages in going the DocBook route:

    • HTML from DocBook includes automatically generated indexes, tables of contents, footnotes, lists of figures and tables.
    • DocBook toolchains can also (optionally) generate separate (chunked) linked HTML pages for each document section.
    • Toolchain processing performs link and document validity checks.
    • If the DocBook lang attribute is set then things like table of contents, revision history, figure and table captions and admonition captions will be output in the specified language (setting the AsciiDoc lang attribute sets the DocBook lang attribute).

    On the other hand, HTML output directly from AsciiDoc is much faster, is easily customized and can be used in situations where there is no suitable DocBook toolchain (see the AsciiDoc website for example).

    28.3. PDF generation

    There are two commonly used tools to generate PDFs from DocBook, dblatex and FOP.

    dblatex or FOP?

    • dblatex is easier to install, there's zero configuration required and no Java VM to install — it just works out of the box.
    • dblatex source code highlighting and numbering is superb.
    • dblatex is easier to use as it converts DocBook directly to PDF whereas before using FOP you have to convert DocBook to XML-FO using DocBook XSL Stylesheets.
    • FOP is more feature complete (for example, callouts are processed inside literal layouts) and arguably produces nicer looking output.

    28.4. HTML Help generation

    1. Convert DocBook XML documents to HTML Help compiler source files using DocBook XSL Stylesheets and xsltproc(1).
    2. Convert the HTML Help source (.hhp and .html) files to HTML Help (.chm) files using the Microsoft HTML Help Compiler.

    28.5. Toolchain components summary

    AsciiDoc
    Converts AsciiDoc (.txt) files to DocBook XML (.xml) files.
    DocBook XSL Stylesheets
    These are a set of XSL stylesheets containing rules for converting DocBook XML documents to HTML, XSL-FO, manpage and HTML Help files. The stylesheets are used in conjunction with an XML parser such as xsltproc(1).
    xsltproc
    An XML parser for applying XSLT stylesheets (in our case the DocBook XSL Stylesheets) to XML documents.
    dblatex
    Generates PDF, DVI, PostScript and LaTeX formats directly from DocBook source via the intermediate LaTeX typesetting language — uses DocBook XSL Stylesheets, xsltproc(1) and latex(1).
    FOP
    The Apache Formatting Objects Processor converts XSL-FO (.fo) files to PDF files. The XSL-FO files are generated from DocBook source files using DocBook XSL Stylesheets and xsltproc(1).
    Microsoft Help Compiler
    The Microsoft HTML Help Compiler (hhc.exe) is a command-line tool that converts HTML Help source files to a single HTML Help (.chm) file. It runs on MS Windows platforms and can be downloaded from http://www.microsoft.com.

    28.6. AsciiDoc dblatex configuration files

    The AsciiDoc distribution ./dblatex directory contains asciidoc-dblatex.xsl (customized XSL parameter settings) and asciidoc-dblatex.sty (customized LaTeX settings). These are examples of optional dblatex output customization and are used by a2x(1).

    28.7. AsciiDoc DocBook XSL Stylesheets drivers

    You will have noticed that the distributed HTML and HTML Help documentation files (for example ./doc/asciidoc.html) are not the plain outputs produced using the default DocBook XSL Stylesheets configuration. This is because they have been processed using customized DocBook XSL Stylesheets along with (in the case of HTML outputs) the custom ./stylesheets/docbook.css CSS stylesheet.

    You'll find the customized DocBook XSL drivers along with additional documentation in the distribution ./docbook-xsl directory. The examples that follow are executed from the distribution documentation (./doc) directory.

    common.xsl
    Shared driver parameters. This file is not used directly but is included in all the following drivers.
    chunked.xsl

    Generate chunked XHTML (separate HTML pages for each document section) in the ./doc/chunked directory. For example:

    $ python ../asciidoc.py -b docbook asciidoc.txt
    $ xsltproc --nonet ../docbook-xsl/chunked.xsl asciidoc.xml
    fo.xsl

    Generate XSL Formatting Object (.fo) files for subsequent PDF file generation using FOP. For example:

    $ python ../asciidoc.py -b docbook article.txt
    $ xsltproc --nonet ../docbook-xsl/fo.xsl article.xml > article.fo
    $ fop.sh article.fo article.pdf
    htmlhelp.xsl

    Generate Microsoft HTML Help source files for the MS HTML Help Compiler in the ./doc/htmlhelp directory. This example is run on MS Windows from a Cygwin shell prompt:

    $ python ../asciidoc.py -b docbook asciidoc.txt
    $ xsltproc --nonet ../docbook-xsl/htmlhelp.xsl asciidoc.xml
    $ c:/Program\ Files/HTML\ Help\ Workshop/hhc.exe htmlhelp.hhp
    manpage.xsl

    Generate a roff(1) format UNIX man page from a DocBook XML refentry document. This example generates an asciidoc.1 man page file:

    $ python ../asciidoc.py -d manpage -b docbook asciidoc.1.txt
    $ xsltproc --nonet ../docbook-xsl/manpage.xsl asciidoc.1.xml
    xhtml.xsl

    Convert a DocBook XML file to a single XHTML file. For example:

    $ python ../asciidoc.py -b docbook asciidoc.txt
    $ xsltproc --nonet ../docbook-xsl/xhtml.xsl asciidoc.xml > asciidoc.html

    If you want to see how the complete documentation set is processed take a look at the A-A-P script ./doc/main.aap.

    29. Generating Plain Text Files

    AsciiDoc does not have a text backend (for most purposes AsciiDoc source text is fine), however you can convert AsciiDoc text files to formatted text using the AsciiDoc a2x(1) toolchain wrapper utility.

    30. XML and Character Sets

    The default XML character set UTF-8 is used when AsciiDoc generates DocBook files but this can be changed by setting the xmldecl entry in the [attributes] section of the docbook.conf file or by composing your own configuration file [header] section).

    [Tip]

    If you get an undefined entity error when processing DocBook files you'll may find that you've used an undefined HTML character entity. An easy (although inelegant) fix is to use the character's character code instead of its symbolic name (for example use &#160; instead of &nbsp;).

    If your system has been configured with an XML catalog you may find a number of entity sets are already automatically included.

    30.1. PDF Fonts

    The Adobe PDF Specification states that the following 14 fonts should be available to every PDF reader: Helvetica (normal, bold, italic, bold italic), Times (normal, bold, italic, bold italic), Courier (normal, bold, italic, bold italic), Symbol and ZapfDingbats. Non-standard fonts should be embedded in the distributed document.

    31. Help Commands

    The asciidoc(1) command has a --help option which prints help topics to stdout. The default topic summarizes asciidoc(1) usage:

    $ asciidoc --help

    To print a list of help topics:

    $ asciidoc --help=topics

    To print a help topic specify the topic name as a command argument. Help topic names can be shortened so long as they are not ambiguous. Examples:

    $ asciidoc --help=manpage
    $ asciidoc -hm              # Short version of previous example.
    $ asciidoc --help=syntax
    $ asciidoc -hs              # Short version of previous example.

    31.1. Customizing Help

    To change, delete or add your own help topics edit a help configuration file. The help file name help-<lang>.conf is based on the setting of the lang attribute, it defaults to help.conf (English). The help file location will depend on whether you want the topics to apply to all users or just the current user.

    The help topic files have the same named section format as other configuration files. The help.conf files are stored in the same locations and loaded in the same order as other configuration files.

    When the --help command-line option is specified AsciiDoc loads the appropriate help files and then prints the contents of the section whose name matches the help topic name. If a topic name is not specified default is used. You don't need to specify the whole help topic name on the command-line, just enough letters to ensure it's not ambiguous. If a matching help file section is not found a list of available topics is printed.

    32. Tips and Tricks

    32.1. Know Your Editor

    Writing AsciiDoc documents will be a whole lot more pleasant if you know your favorite text editor. Learn how to indent and reformat text blocks, paragraphs, lists and sentences. Tips for vim users follow.

    32.2. Vim Commands for Formatting AsciiDoc

    32.2.1. Text Wrap Paragraphs

    Use the vim :gq command to reformat paragraphs. Setting the textwidth sets the right text wrap margin; for example:

    :set textwidth=70

    To reformat a paragraph:

    1. Position the cursor at the start of the paragraph.
    2. Type gq}.

    Execute :help gq command to read about the vim gq command.

    [Tip]
    • Assign the gq} command to the Q key with the nnoremap Q gq} command or put it in your ~/.vimrc file to so it's always available (see the Example ~/.vimrc file).
    • Put set commands in your ~/.vimrc file so you don't have to enter them manually Example ~/.vimrc file).
    • The Vim website (http://www.vim.org) has a wealth of resources, including scripts for automated spell checking and ASCII Art drawing.

    32.2.2. Format Lists

    The gq command can also be used to format bulleted and numbered lists. First you need to set the comments and formatoptions (see the Example ~/.vimrc file).

    Now you can format simple lists that use dash, asterisk, period and plus bullets along with numbered ordered lists:

    1. Position the cursor at the start of the list.
    2. Type gq}.

    32.2.3. Indent Paragraphs

    Indent whole paragraphs by indenting the fist line with the desired indent and then executing the gq} command.

    32.2.4. Example ~/.vimrc File

    " Show tabs and trailing characters.
    set listchars=tab:»·,trail:·
    set list
    
    " Don't highlight searched text.
    highlight clear Search
    
    " Don't move to matched text while search pattern is being entered.
    set noincsearch
    
    " Q command to reformat paragraphs and list.
    nnoremap Q gq}
    
    " W command to delete trailing white space and Dos-returns and to expand tabs
    " to spaces.
    nnoremap W :%s/[\r \t]\+$//<CR>:set et<CR>:retab!<CR>
    
    autocmd BufRead,BufNewFile *.txt,README,TODO,CHANGELOG,NOTES
            \ setlocal autoindent expandtab tabstop=8 softtabstop=2 shiftwidth=2
            \ textwidth=70 wrap formatoptions=tcqn
            \ comments=s1:/*,ex:*/,://,b:#,:%,:XCOMM,fb:-,fb:*,fb:+,fb:.,fb:>

    32.3. Troubleshooting

    • The asciidoc(1) -v (—verbose) command-line option displays the order of configuration file loading and warns of potential configuration file problems.
    • Not all valid AsciiDoc documents produce valid backend markup. Read the AsciiDoc Backends section if AsciiDoc output is rejected as non-conformant by a backend processor.

    32.4. Gotchas

    Incorrect character encoding
    If you get an error message like 'UTF-8' codec can't decode … then you source file contains invalid UTF-8 characters — set the AsciiDoc encoding attribute for the correct character set (typically ISO-8859-1 (Latin-1) for European languages).
    Misinterpreted text formatting

    If text in your document is incorrectly interpreted as formatting instructions you can suppress formatting by placing a backslash character immediately in front of the leading quote character(s). For example in the following line the backslash prevents text between the two asterisks from being output in a strong (bold) font:

    Add `\*.cs` files and `*.resx` files.
    Overlapping text formatting

    Overlapping text formatting will generate illegal overlapping markup tags which will result in downstream XML parsing errors. Here's an example:

    Some *strong markup _that overlaps* emphasized markup_.
    Ambiguous underlines
    A DelimitedBlock can immediately follow paragraph without an intervening blank line, but be careful, a single line paragraph underline may be misinterpreted as a section title underline resulting in a “closing block delimiter expected†error.
    Ambiguous ordered list items

    Lines beginning with numbers at the end of sentences will be interpreted as ordered list items. The following example (incorrectly) begins a new list with item number 1999:

    He was last sighted in
    1999. Since then things have moved on.

    The list item out of sequence warning makes it unlikely that this problem will go unnoticed.

    Escaping inside DSV table data
    Delimiter separated text uses C style backslash escape sequences. If you want to enter a backslash (for example, to escape AsciiDoc text formatting or an inline macro) you need to escape it by entering two backslashes.
    Special characters in attribute values

    Special character substitution precedes attribute substitution so if attribute values contain special characters you may, depending on the substitution context, need to escape the special characters yourself. For example:

    $ asciidoc -a 'companyname=Bill &amp; Ben' mydoc.txt
    Macro attribute lists

    If named attribute list entries are present then all string attribute values must be quoted. For example:

    ["Desktop screenshot",width=32]

    32.5. Combining Separate Documents

    You have a number of stand-alone AsciiDoc documents that you want to process as a single document. Simply processing them with a series of include macros won't work, because instead of starting at level 1 the section levels of the combined document start at level 0 (the document title level).

    The solution is to redefine the title underlines so that document and section titles are pushed down one level.

    1. Push the standard title underlines down one level by defining a new level 0 underline in a custom configuration file. For example combined.conf:

      [titles]
      underlines="__","==","--","~~","^^"
    2. If you use single line titles you'll need to make corresponding adjustments to the [titles] section sect0…sect4 entries.
    3. Create a top level wrapper document. For example combined.txt:

       Combined Document Title
       _______________________
      
       include::document1.txt[]
      
       include::document2.txt[]
      
       include::document3.txt[]
    4. Process the wrapper document. For example:

      $ asciidoc --conf-file=combined.conf combined.txt

    Actually the —conf-file option is unnecessary as asciidoc(1) automatically looks for a same-named .conf file.

    • The combined document title uses the newly defined level 0 underline (underscore characters).
    • Put a blank line between the include macro lines to ensure the title of the included document is not seen as part of the last paragraph of the previous document.
    • You won't want document Headers (Author and Revision lines) in the included files — conditionally exclude them if they are necessary for stand-alone processing.

    32.6. Processing Document Sections Separately

    You have divided your AsciiDoc document into separate files (one per top level section) which are combined and processed with the following top level document:

     Combined Document Title
     =======================
     Joe Bloggs
     v1.0, 12-Aug-03
    
     include::section1.txt[]
    
     include::section2.txt[]
    
     include::section3.txt[]

    You also want to process the section files as separate documents. This is easy because asciidoc(1) will quite happily process section1.txt, section2.txt and section3.txt separately.

    If you want to promote the section levels up one level, so the document is processed just like a stand-alone document, then pop the section underline definition up one level:

    [titles]
    underlines="--","~~","^^","++","__"

    The last "__" underline is a dummy that won't actually be used but is necessary to legitimize the underline definition.

    This is just the reverse of the technique used for combining separate documents explained in the previous section.

    32.7. Processing Document Chunks

    asciidoc(1) can be used as a filter, so you can pipe chunks of text through it. For example:

    $ echo 'Hello *World!*' | asciidoc -s -
    <div class="para"><p>Hello <strong>World!</strong></p></div>

    The -s (—no-header-footer) command-line option suppresses header and footer output and is useful if the processed output is to be included in another file.

    32.8. Badges in HTML Page Footers

    See the [footer] section in the AsciiDoc distribution xhtml11.conf configuration file.

    32.9. Pretty Printing AsciiDoc Output

    If the indentation and layout of the asciidoc(1) output is not to your liking you can:

    1. Change the indentation and layout of configuration file markup template sections. The {empty} glossary entry is useful for outputting trailing blank lines in markup templates.
    2. Or use Dave Raggett's excellent HTML Tidy program to tidy asciidoc(1) output. Example:

      $ asciidoc -b docbook -o - mydoc.txt | tidy -indent -xml >mydoc.xml

    HTML Tidy can be downloaded from http://tidy.sourceforge.net/

    32.10. Supporting Minor DocBook DTD Variations

    The conditional inclusion of DocBook SGML markup at the end of the distribution docbook.conf file illustrates how to support minor DTD variations. The included sections override corresponding entries from preceding sections.

    32.11. Shipping Stand-alone AsciiDoc Source

    Reproducing presentation documents from someone else's source has one major problem: unless your configuration files are the same as the creator's you won't get the same output.

    The solution is to create a single backend specific configuration file using the asciidoc(1) -c (—dump-conf) command-line option. You then ship this file along with the AsciiDoc source document plus the asciidoc.py script. The only end user requirement is that they have Python installed (and of course that they consider you a trusted source). This example creates a composite HTML configuration file for mydoc.txt:

    $ asciidoc -cb xhtml11 mydoc.txt > mydoc-xhtml11.conf

    Ship mydoc.txt, mydoc-html.conf, and asciidoc.py. With these three files (and a Python interpreter) the recipient can regenerate the HMTL output:

    $ ./asciidoc.py -eb xhtml11 mydoc.txt

    The -e (—no-conf) option excludes the use of implicit configuration files, ensuring that only entries from the mydoc-html.conf configuration are used.

    32.12. Inserting Blank Space

    Adjust your style sheets to add the correct separation between block elements. Inserting blank paragraphs containing a single non-breaking space character {nbsp} works but is an ad hoc solution compared to using style sheets.

    32.13. Closing Open Sections

    You can close off section tags up to level N by calling the eval::[Section.setlevel(N)] system macro. This is useful if you want to include a section composed of raw markup. The following example includes a DocBook glossary division at the top section level (level 0):

      ifdef::backend-docbook[]
    
      eval::[Section.setlevel(0)]
    
      +++++++++++++++++++++++++++++++
      <glossary>
        <title>Glossary</title>
        <glossdiv>
        ...
        </glossdiv>
      </glossary>
      +++++++++++++++++++++++++++++++
      endif::backend-docbook[]

    32.14. Validating Output Files

    Use xmllint(1) to check the AsciiDoc generated markup is both well formed and valid. Here are some examples:

    $ xmllint --nonet --noout --valid docbook-file.xml
    $ xmllint --nonet --noout --valid xhtml11-file.html
    $ xmllint --nonet --noout --valid --html html4-file.html

    The —valid option checks the file is valid against the document type's DTD, if the DTD is not installed in your system's catalog then it will be fetched from its Internet location. If you omit the —valid option the document will only be checked that it is well formed.

    Glossary

    Block element

    An AsciiDoc block element is a document entity composed of one or more whole lines of text.

    Inline element

    AsciiDoc inline elements occur within block element textual content, they perform formatting and substitution tasks.

    Formal element

    An AsciiDoc block element that has a BlockTitle. Formal elements are normally listed in front or back matter, for example lists of tables, examples and figures.

    Verbatim element

    The word verbatim indicates that white space and line breaks in the source document are to be preserved in the output document.

    A. Migration Notes

    A.1. Version 7 to version 8

    • A new set of quotes has been introduced which may match inline text in existing documents — if they do you'll need to escape the matched text with backslashes.
    • The index entry inline macro syntax has changed — if your documents include indexes you may need to edit them.
    • Replaced a2x(1) --no-icons and --no-copy options with their negated equivalents: --icons and --copy respectively. The default behavior has also changed — the use of icons and copying of icon and CSS files must be specified explicitly with the --icons and --copy options.

    The rationale for the changes can be found in the AsciiDoc CHANGELOG.

    [Note]

    If you want to disable unconstrained quotes, the new alternative constrained quotes syntax and the new index entry syntax then you can define the attribute asciidoc7compatible (for example by using the -a asciidoc7compatible command-line option).

    A.2. Version 6 to version 7

    The changes that affect the most users relate to renamed and deprecated backends and command-line syntax:

    1. The html backend has been renamed html4.
    2. The xhtml backend has been deprecated to xhtml-deprecated (use the new xhtml11 backend in preference).
    3. The use of CSS specific css and css-embedded backends has been dropped in favor of using attributes (see the table below and xhtml backend attributes).
    4. Deprecated features that emitted warnings in prior versions are no longer tolerated.
    5. The command-line syntax for deleting (undefining) an attribute has changed from -a ^name to -a name!.

    Table A.1. Equivalent command-line syntax

    Version 6 (old) Version 7 (new) Version 7 (backward compatible)
    -b html -b html4 -b html4
    -b css -b xhtml11 -a linkcss -a icons -b xhtml-deprecated -a css -a linkcss -a icons
    -b css-embedded -b xhtml11 -a icons -b xhtml-deprecated -a css -a icons
    -b xhtml -b xhtml11 -b xhtml-deprecated
    -b docbook-sgml -b docbook -a sgml -b docbook -a sgml

    If you've customized version 6 distribution stylesheets then you'll need to either bring them in line with the new ./stylesheets/xhtml11*.css class and id names or stick with the backward compatible xhtml-deprecated backend.

    Changes to configuration file syntax:

    1. To undefine an attribute in the [attributes] section use name! instead of name (name now sets that attribute to a blank string).

    B. Packager Notes

    Read the README and INSTALL files (in the distribution root directory) for install prerequisites and procedures.

    The distribution install.sh shell script is the canonical installation procedure and is the definitive installation description. Here's a summary of the installation procedure:

    • Unpack entire distribution tarball to /usr/share/asciidoc/.
    • Move asciidoc.py to /usr/bin/; rename to asciidoc; if necessary modify shebang line; ensure executable permissions are set.
    • Move a2x to /usr/bin/; if necessary modify shebang line; ensure executable permissions are set.
    • Move the ./*.conf files to /etc/asciidoc/.
    • Move ./filters/{*.conf,*.py} to /etc/asciidoc/filters/.
    • Move ./docbook-xsl/*.xsl to /etc/asciidoc/docbook-xsl/.
    • Move ./dblatex/*.{xsl,sty} to /etc/asciidoc/dblatex/.
    • Copy ./stylesheets/*.css to /etc/asciidoc/stylesheets/.
    • Copy ./javascripts/*.js to /etc/asciidoc/javascripts/.
    • Copy ./images/icons/* to /etc/asciidoc/images/icons/ (recursively including the icons subdirectory and its contents).
    • Compress the asciidoc(1) and ax2(1) man pages (./doc/*.1) with gzip(1) and move them to /usr/share/man/man1/.
    • If Vim is installed then install Vim syntax and filetype detection files.

    Leaving stylesheets and images in /usr/share/asciidoc/ ensures the docs and example website are not broken.

    C. AsciiDoc Safe Mode

    AsciiDoc safe mode skips potentially dangerous sections in AsciiDoc source files by inhibiting the execution of arbitrary code or the inclusion of arbitrary files.

    The safe mode is enabled by default and can only be disabled using the asciidoc(1) —unsafe command-line option.

    Safe mode constraints

    • eval, sys and sys2 executable attributes and block macros are not executed.
    • include::<filename>[] and include1::<filename>[] block macro files must reside inside the parent file's directory.
    • {include:<filename>} executable attribute files must reside inside the source document directory.
    • Passthrough Blocks are dropped.
    [Warning]

    The safe mode is not designed to protect against unsafe AsciiDoc configuration files. Be especially careful when:

    1. Implementing filters.
    2. Implementing elements that don't escape special characters.
    3. Accepting configuration files from untrusted sources.

    D. Using AsciiDoc with non-English Languages

    AsciiDoc can process UTF-8 character sets but there are some things you need to be aware of:

    • If you are generating output documents using a DocBook toolchain then you should set the AsciiDoc lang attribute to the appropriate language (it defaults to en (English)). This will ensure things like table of contents, revision history, figure and table captions and admonition captions are output in the specified language. For example:

      $ a2x -a lang=es doc/article.txt
    • If you are outputting html or xhtml directly from asciidoc(1) you'll need to set the various *_caption attributes to match your target language (see the list of captions and titles in the [attributes] section of the default asciidoc.conf file). The easiest way is to create a language .conf file (see the example lang-es.conf file that comes with the AsciiDoc distribution).
    • asciidoc(1) automatically loads configuration files named like lang-<lang>.conf where <lang> is a two letter language code that matches the current AsciiDoc lang attribute. See also Configuration File Names and Locations.
    • Some character sets display double-width characters (for example Japanese). As far as title underlines are concerned they should be treated as single character. If you think this looks untidy so you may prefer to use the single line title format.

    E. ASCIIMathML Support

    ASCIIMathML is a clever JavaScript written by Peter Jipsen that transforms mathematical formulae written in plain text to standard mathematical notation on an HTML page.

    To enable ASCIIMathML support on the xhtml11 backend include the -a asciimath command-line option. Here's what the asciimath attribute does:

    • Embeds the ASCIIMathML.js script in the output document (links it if -a linkcss has been specified).
    • Escapes ASCIIMathML delimiters.

    When entering ASCIIMathML formulas you must enclose them inside double-dollar passthroughs (this is necessary because ASCIIMathML characters clash with AsciiDoc formatting characters). The double-dollar passthrough has the bonus of also escaping special characters so the output document is valid XHTML. You can see an ASCIIMathML example at http://www.methods.co.nz/asciidoc/asciimath.html, the same example can be found in the AsciiDoc distribution ./doc directory.

    [Note]
    • See the ASCIIMathML website for ASCIIMathML documentation and the latest version.
    • If you use Mozilla you need to install the required math fonts.
    • If you use Microsoft Internet Explorer 6 you need to install MathPlayer.

    F. Vim Syntax Highlighter

    The AsciiDoc ./vim/ distribution directory contains Vim syntax highlighter and filetype detection scripts for AsciiDoc. Syntax highlighting makes it much easier to spot AsciiDoc syntax errors.

    If Vim is installed on your system the AsciiDoc installer (install.sh) will automatically install the vim scripts in the Vim global configuration directory (/etc/vim).

    You can also turn on syntax highlighting by adding the following line to the end of you AsciiDoc source files:

    // vim: set syntax=asciidoc:
    [Note]

    Dag Wieers has implemented an alternative Vim syntax file for AsciiDoc which can be found here http://svn.rpmforge.net/svn/trunk/tools/asciidoc-vim/.

    F.1. Limitations

    The current implementation does a reasonable job but on occasions gets things wrong. This list of limitations also discusses how to work around the problems:

    • Indented lists with preceding blank lines are sometimes mistaken for literal (indented) paragraphs. You can work around this by deleting the preceding blank line, or inserting a space in the preceding blank lines, or putting a list continuation character (+) in the preceding blank line.
    • Nested text formatting is highlighted according to the outer format.
    • Most escaped inline elements will be highlighted.
    • Unterminated quotes are highlighted, for example 'tis would be seen as the start of emphasized text. As a damage control measure quoted text and macro attribute list containing quoted text always terminate at a blank line. This problem is usually ameliorated by the fact that characters such as ~, +, ^ and _ will normally occur inside monospaced quotes (unless they are used for quoting), for example ~/projects.
    • If a closing block delimiter is not preceded by a blank line it is sometimes mistaken for a title underline. A workaround is to insert a blank line before the closing delimiter.
    • If a list block delimiter is mistaken for a title underline precede it with a blank line.
    • Tables are terminated by a blank line — use a space character on blank lines within your table.
    • Lines within a paragraph beginning with a period will be highlighted as block titles. For example:

      .chm file.

      To work around this restriction move the last word of the previous line to the start of the current (although words starting with a period should probably be quoted monospace which would also get around the problem).

    [Tip]

    Sometimes incorrect highlighting is caused by preceding lines that appear blank but contain white space characters — setting your editor options so that white space characters are visible is a good idea.



    [1] This is a rough structural guide, not a rigorous syntax definition

    [2] An example footnote.

    [3] The current table syntax is overly complicated and unwieldy to edit, hopefully a more usable syntax will appear in future versions of AsciiDoc.

    [4] The existence of a {revisionhistory} attribute causes a revision history file (if it exists) to be included in DocBook outputs. If a file named like {docname}-revhistory.xml exists in the document's directory then it will be added verbatim to the DocBook header (see the ./doc/asciidoc-revhistory.xml example that comes with the AsciiDoc distribution).

    [5] Conditional inclusion using ifdef and ifndef macros differs from attribute conditional inclusion in that the former occurs when the file is read while the latter occurs when the contents are written.

    asciidoc-8.2.7/doc/book-multi.css-embedded.html0000644000175100017510000003377310775517324021537 0ustar srackhamsrackham Multi-Part Book Title Goes Here

    Dedication

    The optional dedication goes here.

    This document is an AsciiDoc multi-part book skeleton containing briefly annotated element placeholders plus a couple of example index entries and footnotes. Books are normally used to generate DocBook markup and the preface, appendix, bibliography, glossary and index section titles are significant (specialsections).

    Note
    Multi-part books differ from all other AsciiDoc document formats in that top level sections (dedication, preface, book parts, appendices, bibliography, glossary, index) must be level zero headings (not level one).

    Preface

    The optional book preface goes here at section level zero.

    0.1. Preface Sub-section

    Note
    Preface and appendix subsections start out of sequence at level 2 (level 1 is skipped). This only applies to multi-part book documents.

    The First Part of the Book

    1. The First Chapter

    Chapters can be grouped by preceeding them with a level 0 Book Part title.

    Book chapters are at level 1 and can contain sub-sections nested up to three deep.
    [An example footnote.]

    It's also worth noting that a book part can have it's own preface, bibliography, glossary and index. Chapters can have their own bibliography, glossary and index.

    And now for something completely different: monkeys, lions and tigers (Bengal and Siberian) using the alternative syntax index entries. Note that multi-entry terms generate separate index entries.

    Here are a couple of image examples: an images/smallnew.png example inline image followed by an example block image:

    Tiger image
    Figure: Tiger block image

    Followed by an example table:

    Table: An example table
    Option Description
    -a USER GROUP Add USER to GROUP.
    -R GROUP Disables access to GROUP.

    1.1. Sub-section with Anchor

    Sub-section at level 2.

    1.1.1. Chapter Sub-section

    Sub-section at level 3.

    Chapter Sub-section

    Sub-section at level 4.

    This is the maximum sub-section depth supported by the distributed AsciiDoc configuration.
    [A second example footnote.]

    2. The Second Chapter

    An example link to anchor at start of the first sub-section.

    An example link to a bibliography entry [taoup].

    The Second Part of the Book

    1. The First Chapter of the Second Part

    Chapters grouped into book parts are at level 1 and can contain sub-sections.

    Appendix A: Example Appendix

    One or more optional appendixes go here at section level zero.

    0.1. Appendix Sub-section

    Note
    Preface and appendix subsections start out of sequence at level 2 (level 1 is skipped). This only applies to multi-part book documents.

    Bibliography

    The bibliography list is an example of an AsciiDoc SimpleList, the AsciiDoc source list items are bulleted with a + character. The first entry in this example has an anchor.

    1. [taoup] Eric Steven Raymond. The Art of Unix Programming. Addison-Wesley. ISBN 0-13-142901-9.

    2. [walsh-muellner] Norman Walsh & Leonard Muellner. DocBook - The Definative Guide. O'Reilly & Associates. 199. ISBN 1-56592-580-7.

    Glossary

    Glossaries are optional. Glossaries are an example of an AsciiDoc VariableList, the AsciiDoc glossary entry terms are terminated by the :- characters.

    A glossary term

    The corresponding (indented) definition.

    A second glossary term

    The corresponding (indented) definition.

    Index

    asciidoc-8.2.7/doc/book-multi.html0000644000175100017510000003503611033404333017172 0ustar srackhamsrackham Multi-Part Book Title Goes Here

    Multi-Part Book Title Goes Here

    Author's Name

    Revision History
    Revision 1.0Dec 2003AN

    Dedication

    The optional dedication goes here.

    This document is an AsciiDoc multi-part book skeleton containing briefly annotated element placeholders plus a couple of example index entries and footnotes. Books are normally used to generate DocBook markup and the preface, appendix, bibliography, glossary and index section titles are significant (specialsections).

    [Note]

    Multi-part books differ from all other AsciiDoc document formats in that top level sections (dedication, preface, book parts, appendices, bibliography, glossary, index) must be level zero headings (not level one).

    List of Figures

    1.1. Tiger block image

    List of Tables

    1.1. An example table

    Preface

    Table of Contents

    1. Preface Sub-section

    The optional book preface goes here at section level zero.

    1. Preface Sub-section

    [Note]

    Preface and appendix subsections start out of sequence at level 2 (level 1 is skipped). This only applies to multi-part book documents.

    Part I. The First Part of the Book

    Chapter 1. The First Chapter

    Chapters can be grouped by preceeding them with a level 0 Book Part title.

    Book chapters are at level 1 and can contain sub-sections nested up to three deep. [1]

    It's also worth noting that a book part can have it's own preface, bibliography, glossary and index. Chapters can have their own bibliography, glossary and index.

    And now for something completely different: monkeys, lions and tigers (Bengal and Siberian) using the alternative syntax index entries. Note that multi-entry terms generate separate index entries.

    Here are a couple of image examples: an images/smallnew.png example inline image followed by an example block image:

    Figure 1.1. Tiger block image

    Tiger image

    Followed by an example table:

    Table 1.1. An example table

    Option Description
    -a USER GROUP Add USER to GROUP.
    -R GROUP Disables access to GROUP.

    1.1. Sub-section with Anchor

    Sub-section at level 2.

    1.1.1. Chapter Sub-section

    Sub-section at level 3.

    1.1.1.1. Chapter Sub-section

    Sub-section at level 4.

    This is the maximum sub-section depth supported by the distributed AsciiDoc configuration. [2]



    [1] An example footnote.

    [2] A second example footnote.

    Chapter 2. The Second Chapter

    An example link to anchor at start of the first sub-section.

    An example link to a bibliography entry [taoup].

    Part II. The Second Part of the Book

    Chapter 3. The First Chapter of the Second Part

    Chapters grouped into book parts are at level 1 and can contain sub-sections.

    Appendix A. Example Appendix

    Table of Contents

    A.1. Appendix Sub-section

    One or more optional appendixes go here at section level zero.

    A.1. Appendix Sub-section

    [Note]

    Preface and appendix subsections start out of sequence at level 2 (level 1 is skipped). This only applies to multi-part book documents.

    Bibliography

    The bibliography list is an example of an AsciiDoc SimpleList, the AsciiDoc source list items are bulleted with a + character. The first entry in this example has an anchor.

    [taoup] Eric Steven Raymond. The Art of Unix Programming. Addison-Wesley. ISBN 0-13-142901-9.

    [walsh-muellner] Norman Walsh & Leonard Muellner. DocBook - The Definative Guide. O'Reilly & Associates. 199. ISBN 1-56592-580-7.

    Glossary

    Glossaries are optional. Glossaries are an example of an AsciiDoc VariableList, the AsciiDoc glossary entry terms are terminated by the :- characters.

    A glossary term

    The corresponding (indented) definition.

    A second glossary term

    The corresponding (indented) definition.

    Index

    B

    Bengal Tiger, The First Chapter
    Big cats
    Lions, The First Chapter
    Tigers
    Bengal Tiger, The First Chapter
    Siberian Tiger, The First Chapter

    E

    Example index entry, The First Chapter

    S

    Second example index entry, The Second Chapter
    Siberian Tiger, The First Chapter

    T

    Tigers
    Bengal Tiger, The First Chapter
    Siberian Tiger, The First Chapter
    asciidoc-8.2.7/doc/book.css-embedded.html0000644000175100017510000003316311033026632020361 0ustar srackhamsrackham Book Title Goes Here

    1. Dedication

    Optional dedication.

    This document is an AsciiDoc book skeleton containing briefly annotated example elements plus a couple of example index entries and footnotes.

    Books are normally used to generate DocBook markup and the titles of the preface, appendix, bibliography, glossary and index sections are significant (specialsections).

    2. Preface

    Optional preface.

    2.1. Preface Sub-section

    Preface sub-section body.

    3. The First Chapter

    Chapters can contain sub-sections nested up to three deep.
    [An example footnote.]

    Chapters can have their own bibliography, glossary and index.

    And now for something completely different: monkeys, lions and tigers (Bengal and Siberian) using the alternative syntax index entries. Note that multi-entry terms generate separate index entries.

    Here are a couple of image examples: an images/smallnew.png example inline image followed by an example block image:

    Tiger image
    Figure: Tiger block image

    Followed by an example table:

    Table: An example table
    Option Description
    -a USER GROUP Add USER to GROUP.
    -R GROUP Disables access to GROUP.

    3.1. Sub-section with Anchor

    Sub-section at level 2.

    3.1.1. Chapter Sub-section

    Sub-section at level 3.

    Chapter Sub-section

    Sub-section at level 4.

    This is the maximum sub-section depth supported by the distributed AsciiDoc configuration.
    [A second example footnote.]

    4. The Second Chapter

    An example link to anchor at start of the first sub-section.

    An example link to a bibliography entry [taoup].

    5. The Third Chapter

    Book chapters are at level 1 and can contain sub-sections.

    6. Appendix A: Example Appendix

    One or more optional appendixes go here at section level 1.

    6.1. Appendix Sub-section

    Sub-section body.

    7. Bibliography

    The bibliography list is an example of an AsciiDoc SimpleList, the AsciiDoc source list items are bulleted with a + character. The first entry in this example has an anchor.

    1. [taoup] Eric Steven Raymond. The Art of Unix Programming. Addison-Wesley. ISBN 0-13-142901-9.

    2. [walsh-muellner] Norman Walsh & Leonard Muellner. DocBook - The Definative Guide. O'Reilly & Associates. 199. ISBN 1-56592-580-7.

    8. Glossary

    Glossaries are optional. Glossaries are an example of an AsciiDoc VariableList, the AsciiDoc glossary entry terms are terminated by the :- characters.

    A glossary term

    The corresponding (indented) definition.

    A second glossary term

    The corresponding (indented) definition.

    9. Index

    asciidoc-8.2.7/doc/book.html0000644000175100017510000002704711033404330016042 0ustar srackhamsrackham Book Title Goes Here

    Book Title Goes Here

    Author's Name

    Revision History
    Revision 1.0Dec 2003AN

    Dedication

    Optional dedication.

    This document is an AsciiDoc book skeleton containing briefly annotated example elements plus a couple of example index entries and footnotes.

    Books are normally used to generate DocBook markup and the titles of the preface, appendix, bibliography, glossary and index sections are significant (specialsections).

    List of Figures

    1.1. Tiger block image

    List of Tables

    1.1. An example table

    Preface

    Table of Contents

    1. Preface Sub-section

    Optional preface.

    1. Preface Sub-section

    Preface sub-section body.

    Chapter 1. The First Chapter

    Chapters can contain sub-sections nested up to three deep. [1]

    Chapters can have their own bibliography, glossary and index.

    And now for something completely different: monkeys, lions and tigers (Bengal and Siberian) using the alternative syntax index entries. Note that multi-entry terms generate separate index entries.

    Here are a couple of image examples: an images/smallnew.png example inline image followed by an example block image:

    Figure 1.1. Tiger block image

    Tiger image

    Followed by an example table:

    Table 1.1. An example table

    Option Description
    -a USER GROUP Add USER to GROUP.
    -R GROUP Disables access to GROUP.

    1.1. Sub-section with Anchor

    Sub-section at level 2.

    1.1.1. Chapter Sub-section

    Sub-section at level 3.

    1.1.1.1. Chapter Sub-section

    Sub-section at level 4.

    This is the maximum sub-section depth supported by the distributed AsciiDoc configuration. [2]



    [1] An example footnote.

    [2] A second example footnote.

    Chapter 2. The Second Chapter

    An example link to anchor at start of the first sub-section.

    An example link to a bibliography entry [taoup].

    Chapter 3. The Third Chapter

    Book chapters are at level 1 and can contain sub-sections.

    Appendix A. Example Appendix

    Table of Contents

    A.1. Appendix Sub-section

    One or more optional appendixes go here at section level 1.

    A.1. Appendix Sub-section

    Sub-section body.

    Bibliography

    The bibliography list is an example of an AsciiDoc SimpleList, the AsciiDoc source list items are bulleted with a + character. The first entry in this example has an anchor.

    [taoup] Eric Steven Raymond. The Art of Unix Programming. Addison-Wesley. ISBN 0-13-142901-9.

    [walsh-muellner] Norman Walsh & Leonard Muellner. DocBook - The Definative Guide. O'Reilly & Associates. 199. ISBN 1-56592-580-7.

    Glossary

    Glossaries are optional. Glossaries are an example of an AsciiDoc VariableList, the AsciiDoc glossary entry terms are terminated by the :- characters.

    A glossary term

    The corresponding (indented) definition.

    A second glossary term

    The corresponding (indented) definition.

    Index

    B

    Bengal Tiger, The First Chapter
    Big cats
    Lions, The First Chapter
    Tigers
    Bengal Tiger, The First Chapter
    Siberian Tiger, The First Chapter

    E

    Example index entry, The First Chapter

    S

    Second example index entry, The Second Chapter
    Siberian Tiger, The First Chapter

    T

    Tigers
    Bengal Tiger, The First Chapter
    Siberian Tiger, The First Chapter
    asciidoc-8.2.7/doc/latex-backend.html0000644000175100017510000006656411033404346017630 0ustar srackhamsrackham LaTeX backend for Asciidoc

    LaTeX backend for Asciidoc

    Revision History
    Revision 1.0June 2006BK

    1. Introduction

    LaTeX backend is a configuration file for Stuart Rackham's Asciidoc. It generates high-level LaTeX markup from Asciidoc documents. LaTeX is a document preparation system for TeX which in turn is a popular typesetting system. It is well known for producing excellently typesetted high quality printouts, especially suited for scientific text.

    2. Tutorial

    Getting a ready-to-print document from an Asciidoc document using the LaTeX backend involves at least two steps:

    1. Conversion of the Asciidoc document into a LaTeX document (this is done by Asciidoc using the LaTeX backend)
    2. Conversion of the LaTeX document into a PDF document (this is done by the TeX system)

    Try to create a PDF document from the Asciidoc document article.txt which resides in the doc directory of Asciidoc:

    1. Make a copy of article.txt in a directory of your choice, let's call it latex-test.
    2. Make sure that all images referenced in article.txt exist in latex-test. Brute force approach: Copy the whole images directory from Asciidoc directory into latex-test.
    3. Change directory to latex-test and type following commands:

      asciidoc --unsafe --backend=latex article.txt
      pdflatex article.tex
    4. Now there should be a file article.pdf in the latex-test directory.
    [Important]
    • Asciidoc has to be started in unsafe mode when using LaTeX backend.
    • Note that some special LaTeX packages are necessary, see here.

    3. General notes

    3.1. Quality of LaTeX output

    High-level LaTeX is not very straightforward to generate. Therefore there's no guarantee that the generated output is valid and compiles successfully. At all, this backend should be considered as rather experimental. You should have been already in touch with LaTeX in order to use the backend effectively because LaTeX compilation errors can be really nasty.

    Nevertheless good results can be achieved by using LaTeX backend. Try for example to compile Stuart Rackham's Asciidoc documentation, a rather large document. It should compile without problems. However, the code filter might have to be reconfigured for the code filter example to work.

    3.2. Configuration file customization

    Like every other Asciidoc backend the LaTeX backend can be customized easily to fit the user's needs. Actually it is very important to have this option since LaTeX doesn't have a companion language like CSS which allows to put styling information in a separate file. Read more about the LaTeX backend configuration file here.

    3.3. Output optimization

    The LaTeX output is optimized for creating PDF documents using pdflatex.

    3.4. Unicode support

    Unfortunately TeX/LaTeX does not have native unicode support. The package ucs adds elementary unicode support by introducing UTF-8 input encoding recognition and by defining lookup tables which contain the corresponding LaTeX commands for unicode characters. But these lookup tables are far from being complete. When a unicode character is found which is not defined in the lookup tables an error is raised by the TeX/LaTeX compiler. Note that TeX/LaTeX compilation errors caused by missing unicode character definitions are not fatal, that means the result is probably readable but undefined unicode characters are replaced with [U+…]. You may (de)activate the recognition of escaped unicode characters. See the [latex-recognize-escaped-unicode] backend option.

    4. Backend specific features

    4.1. Special sections

    LaTeX backend supports the following special sections and replaces them with corresponding LaTeX commands or environments:

    • Abstract (only for document type article)
    • Dedication (only for document type book)
    • Index
    • Bibliography (only when the attribute latex-use-bibliography-environment is set)
    • Appendix
    • Contents

    4.2. Internal cross references

    Macros for internal cross references have been extended by the attribute style.

    xref:<id>[<caption>, style=<style>]

    or

    <<<id>,<caption>,<style>>>

    The additional attribute style can have following values:

    page
    Let's LaTeX print the page number of the referenced anchor.
    ref
    Let's LaTeX print the number of the section, subsection, figure, table or theorem the referenced anchor resides.
    autoref
    Let's LaTeX print the number of the section, subsection, figure, table or theorem the referenced anchor resides preceded with a contextual label.
    cite
    Let's LaTeX interprete this reference as a reference to a bibliography entry. If the attribute latex-use-bibliography-environment is set, references with cite style as well as their corresponding bibliography anchors are presented as automatically generated numbers.

    If the style attribute is not set the reference is printed the common way.

    4.3. Options

    LaTeX document generation is influenced by the following attributes:

    latex-table-rowlimit
    The maximum number of rows for typesetting tables using the tabular environment. If a table has more rows than latex-table-rowlimit, longtable environment is used instead of tabular environment. longtable environment supports tables spanning over several pages.
    latex-use-bibliography-environment
    If latex-use-bibliography-environment is defined, thebibliography environment is used for the bibliography section. As a result bibliography entries are automatically numbered. Note that this works only if the bibliography section contains exclusively bibliography list items which start with a bibliography entry ([[[…]]]). Otherwise a TeX/LaTeX compilation error will occur. In order to display bibliography references correctly their style attribute must be set to cite. For more information see Internal cross references.
    latex-indent-paragraphs
    If latex-indent-paragraphs is defined, the first line of paragraphs will be indented. By default LaTeX backend prevents paragraph indentation and prints paragraphs with preceding vertical space.
    latex-recognize-escaped-unicode
    If latex-recognize-escaped-unicode is defined, escaped unicode characters (e.g. {amp}#960; or {amp}#x3C0;) will be recognized. This can lead to LaTeX compilation errors since LaTeX unicode support is only rudimentary. For more information see Unicode support.
    latex-use-custom-list-items
    If latex-use-custom-list-items is defined, lists will be bulleted or enumerated the way you have typed them in the original Asciidoc document. That means, * turns into a circle bullet, - turns into a dash, . turns into a number and .. turns into a letter. Otherwise LaTeX will use different bullets and enumeration characters depending on the level of nesting.
    latex-use-colored-tables
    If latex-use-colored-tables is defined, tables will be printed colored.
    latex-use-running-title-headings
    If latex-use-running-title-headings is defined, pagestyle will be set to headings which results in running titles in the head.
    latex-use-colored-sidebar-blocks
    If latex-use-colored-sidebar-blocks is defined, sidebar block content will be put in a color box instead of being indented by a vertical bar.
    icons
    Link admonition paragraph and admonition block icon images and badge images. By default icons is undefined and text is used in place of icon images.
    encoding
    Set the input and output document character set encoding. Currently ISO-8859-1 and UTF-8 are supported.

    5. Requirements

    5.1. General

    The following software is necessary for using the LaTeX backend:

    • An up-to-date version of Asciidoc
    • An up-to-date TeX distribution, e.g.:

    5.2. TeX/LaTeX Package requirements

    LaTeX backend makes use of some LaTeX specialities which don't belong to a minimal TeX/LaTeX distribution. However, I took special care not to employ exotic packages. Hence the following packages should be available in most package repositories. The table is not complete yet because I don't know the package names for all TeX distributions.

    Speciality MiKTeX package name teTeX package name TeX Live package name Description
    KOMA-Script koma-script LaTeX backend uses the document classes scrartcl and scrbook as well as some other specialities defined in the KOMA-Script package, e.g. the commands \addmargin{} and \minisec{}.
    xcolor.sty xcolor Used to produce colored boxes and tables.
    colortbl.sty colortbl Used to produce colored tables.
    type1ec.sty cm-super Enables high quality fonts for PDF output.
    hyperref.sty hyperref Extensive support for hypertext in PDF documents.
    enumerate.sty tools When latex-use-custom-list-items is defined this package is used for determining the enumeration character.
    graphicx.sty graphics Used for including images.
    longtable.sty tools Enables page spanning tables.
    ucs.sty unicode Enables support for unicode characters.
    textcomp ltxbase Used for printing various symbols like arrows. Should be already installed.
    alltt ltxbase Used in literal-like blocks for retaining line and whitespace formatting. Should be already installed.
    listings.sty listings Used for listing blocks.

    6. About the LaTeX backend configuration file

    An important note for people who want to adapt the LaTeX backend configuration file to their own needs:

    LaTeX markup has a lot of special characters, most importantly \, {, }. In order to make things less complicated, I changed the default substitution order (see entry subsnormal in the [miscellaneous] section). In contrast to the backends docbook and xhtml11, the specialcharacters substitution is applied very late. As a result all special characters produced by quotes, specialwords, replacements, attributes and macros become escaped at the end. If you don't want special characters in the corresponding sections to get escaped, you've to use following symbols instead of the special characters.

    • !..backslash..! instead of \
    • !..braceleft..! instead of {
    • !..braceright..! instead of }

    For more special characters take a look in the [replacements2] sections. [replacements2] section is responsible for replacing the symbols with their corresponding special characters.

    7. Ideas

    7.1. Code listing block

    For creating highlighted code listings I suggest the use of Highlight or GNU Source Highlight. Both are suited for use as Asciidoc filters.

    8. Known Bugs

    • Sometimes LaTeX backend handles things differently from the default backends
    • A lot of little bugs

    9. Todo List

    • Remove bugs
    • Support for grid attribute in tables
    • Better looking tables
    • Option for squeezing output (smaller lists)
    • Support for different languages (That would be a nice feature for Asciidoc in general)
    • Option for switching titlepage on and off
    asciidoc-8.2.7/doc/music-filter.html0000644000175100017510000002743411032646063017525 0ustar srackhamsrackham Music Filter

    The AsciiDoc distribution includes a Music Block filter that translates music in LilyPond or ABC notation to standard classical notation in the form of a trimmed PNG image which is automatically inserted into the AsciiDoc output document (see the examples below).

    Actually the filter (./filters/music2png.py) can be used outside AsciiDoc to convert LilyPond or ABC music files to PNG images. Execute the following command to see how to use it:

    $ ./filters/music2png.py --help

    The Music Filter can be used as a model for filters that convert a block of text into a file that is linked or embedded into the AsciiDoc output document.

    Example 1: Music Block containing ABC notation

    This Music Block:

     [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.
     H:This version by Peter Cooper.
     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):|
     ---------------------------------------------------------------------

    Renders:

    music1.png
    Example 2: Music Block containing LilyPond notation

    This example contains LilyPond musical markup, it uses the link attribute so you can click on the music image to display the source notation. The music2.ly source file is automatically created and retained by the music2png.py filter when the -m option is used.

     ["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
     }
     ---------------------------------------------------------------------

    Renders:

    Note
    If you get an error processing the above example it may be that it is not compatible with your version of LilyPond. Use the LilyPond convert-ly(1) utility to update the source to the version that you are using.

    Using the Filter

    Insert a delimited Music Block containing valid ABC notation into your AsciiDoc document:

    • The Music Block delimiter is the word music followed by four or more tilde characters.

    • The Music Block attribute list must contain a file name for the PNG output image file followed by the input format (either abc for ABC or ly for LilyPond). If the format is omitted ABC notation is assumed.

    • The filter invokes music2png with the -m option so that music images will only be regenerated if the block content has changed.

    • The optional named block attributes link, width and height are also available (see Image macro attributes in the AsciiDoc User Guide).

    Limitations

    • The asciidoc(1) output file cannot be - (stdout), you must output to a named file.

    • If the music image file is linked to the output document then the image file name in the Music Block attribute list should be a relative path name relative to the AsciiDoc output file.

    Installation

    In addition to AsciiDoc you will need to have installed:

    • LilyPond (most Linux distributions include this package).

    • ImageMagick (most Linux distributions include this package).

    Test the music filter it by converting the test file to HTML with AsciiDoc:

    $ asciidoc -v ./filters/music-filter-test.txt
    $ firefox ./filters/music-filter-test.html &

    The filter was developed and tested on Xubuntu Linux using LilyPond 2.10.5 and ImageMagick 6.2.4.

    Note
    The filter does not work with LilyPond 2.2.6 because it did not generate the requested output file name correctly (2.6.3 does not have a problem).
    asciidoc-8.2.7/doc/source-highlight-filter.html0000644000175100017510000002564211032660075021650 0ustar srackhamsrackham Source Code Highlight Filter

    Source Code Highlight Filter

    The AsciiDoc distribution includes a source code syntax highlight filter (source-highlight-filter.conf). It uses GNU source-highlight to highlight HTML outputs; DocBook outputs are highlighted by toolchains that have programlisting element highlight support, for example dblatex.

    Tip: If the source language attribute has been set (using an AttributeEntry or from the command-line) you don't have to specify it in each source code block.


    Examples

    Source code paragraphs

    The source paragraph style will highlight a paragraph of source code. These three code paragraphs:

    [source,python]
    if n < 0: print 'Hello World!'
    
    :language: python
    
    [source]
    if n < 0: print 'Hello World!'
    
    [source,ruby,numbered]
    [true, false].cycle([0, 1, 2, 3, 4]) do |a, b|
        puts "#{a.inspect} => #{b.inspect}"

    Render this highlighted source code:

    if n < 0: print 'Hello World!'
    
    if n < 0: print 'Hello World!'
    
    00001: [true, false].cycle([0, 1, 2, 3, 4]) do |a, b|
    00002:     puts "#{a.inspect} => #{b.inspect}"
    

    Unnumbered source code listing

    This source-highlight filtered block:

     [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
     ---------------------------------------------------------------------

    Renders this highlighted source 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
    

    Numbered source code listing

    This source-highlight filtered block:

     [source,ruby,numbered]
     ---------------------------------------------------------------------
     #
     # Useful Ruby base class extensions.
     #
    
     class Array
    
       # Execute a block passing it corresponding items in
       # +self+ and +other_array+.
       # If self has less items than other_array it is repeated.
    
       def cycle(other_array)  # :yields: item, other_item
         other_array.each_with_index do |item, index|
           yield(self[index % self.length], item)
         end
       end
    
     end
    
     if $0 == __FILE__
       # Array#cycle test
       # true => 0
       # false => 1
       # true => 2
       # false => 3
       # true => 4
       puts 'Array#cycle test'
       [true, false].cycle([0, 1, 2, 3, 4]) do |a, b|
         puts "#{a.inspect} => #{b.inspect}"
       end
     end
     ---------------------------------------------------------------------

    Renders this highlighted source code:

    
    
    00001: #
    00002: # Useful Ruby base class extensions.
    00003: #
    00004:
    00005: class Array
    00006:
    00007:   # Execute a block passing it corresponding items in
    00008:   # +self+ and +other_array+.
    00009:   # If self has less items than other_array it is repeated.
    00010:
    00011:   def cycle(other_array)  # :yields: item, other_item
    00012:     other_array.each_with_index do |item, index|
    00013:       yield(self[index % self.length], item)
    00014:     end
    00015:   end
    00016:
    00017: end
    00018:
    00019: if $0 == __FILE__
    00020:   # Array#cycle test
    00021:   # true => 0
    00022:   # false => 1
    00023:   # true => 2
    00024:   # false => 3
    00025:   # true => 4
    00026:   puts 'Array#cycle test'
    00027:   [true, false].cycle([0, 1, 2, 3, 4]) do |a, b|
    00028:     puts "#{a.inspect} => #{b.inspect}"
    00029:   end
    00030: end
    

    Installation

    If you want to syntax highlight AsciiDoc HTML outputs you need to install GNU source-highlight (most distributions have this package). It's not required if you are generating DocBook output (DocBook syntax highlighting is handled by the DocBook toolchain).

    Test the filter by converting the test file to HTML with AsciiDoc:

    $ asciidoc -v ./filters/source-highlight-filter-test.txt
    $ firefox ./filters/source-highlight-filter-test.html &


    Last updated 2008-07-02 23:02:19 NZDT

    asciidoc-8.2.7/doc/images0000777000175100017510000000000010727322023017007 2../imagesustar srackhamsrackhamasciidoc-8.2.7/doc/main.aap0000644000175100017510000002470611033244122015631 0ustar srackhamsrackham##################################################################### # # A-A-P file for making AsciiDoc distribution documents. # (you can obtain A-A-P from http://www.a-a-p.org) # # Stuart Rackham ##################################################################### :execute ../common.aap # Uncomment next line to use dblatex instead of FOP, or alternatively # include PDF_PROCESSOR=dblatex on the command-line. #PDF_PROCESSOR = dblatex ##################################################################### # Programs used by this script. ##################################################################### # If python is not in your executable search path you may have to # tweak these locations. Note also that this script is in the distribution # ./doc directory and a number of paths are relative. ## Older or alternative rules and actions have been commented out but not # deleted. @if OSTYPE == 'mswin': ASCIIDOC = python ..\asciidoc.py -a revision=$(VERS)@ -a date="$(DATE)@" HHC = "C:\Program Files\HTML Help Workshop\hhc.exe" FOP = fop.bat @else: ASCIIDOC = python ../asciidoc.py -a revision=$(VERS)@ -a date="$(DATE)@" @if os.uname()[0][:6] == 'CYGWIN': HHC = "c:/Program\ Files/HTML\ Help\ Workshop/hhc.exe" :syseval which fop.bat | :assign FOP @else: HHC = :syseval which fop.sh | :assign FOP :syseval which jw | :assign JW # Converts DocBook SGML to PDF. :syseval which lynx | :assign LYNX # Converts HTML to text. :syseval which xmllint | :assign XMLLINT # Validates XML. :syseval which dblatex | :assign DBLATEX # Converts DocBook XML to PDF. ## xsltproc(1) is used instead of xmlto(1). #XMLTO = xmlto ASPELL = aspell XSLTPROC = xsltproc ROOT = asciidoc asciidoc.1 INFILES = $*(ROOT).txt CHUNK_DIR = ./asciidoc.chunked HTMLHELP_DIR = ./asciidoc.htmlhelp HTMLHELP_FILE = asciidoc OUTFILES = $*(ROOT).html $*(ROOT).css.html $*(ROOT).css-embedded.html \ asciidoc.pdf asciidoc.1.man a2x.1.man \ article.html book.html book-multi.html asciidoc.xml asciidoc.1.xml \ ../BUGS ../CHANGELOG ../README ../INSTALL \ latex-backend.html \ ${HTMLHELP_FILE}.chm \ $CHUNK_DIR/index.html \ article.pdf \ source-highlight-filter.pdf \ music-filter.pdf TEST_FILES = $*(ROOT).css-embedded.html article.css-embedded.html book.css-embedded.html \ article.xml book.xml book-multi.xml asciidoc.xml asciidoc.1.xml \ asciidoc.1.html a2x.1.xml music-filter.xml ##################################################################### # Filetype build rules. ##################################################################### :rule %.text : %.txt # Convert AsciiDoc to HTML then use lynx(1) to convert HTML to text. @if _no.OSTYPE != 'posix': :print WARNING: non-POSIX environment: skipping $target file generation @elif not _no.LYNX: :print WARNING: lynx(1) unavailable: skipping $target file generation @else: opt = -f ../text.conf @if source_list[0] == 'asciidoc.1.txt': opt += -d manpage @else: opt += -n :sys $ASCIIDOC $opt -b html4 -o - $source | \ lynx -dump -stdin > $target ## The preceding rule makes a better job of producing plain text. #:rule %.text : %.xml # :sys $XMLTO txt $source :rule %.css.html : %.txt opt = @if source_list[0] == 'asciidoc.1.txt': opt += -d manpage @else: opt += -n opt += -a toc -a toclevels=2 -a scriptsdir=../javascripts :sys $ASCIIDOC $opt -b xhtml11 -a linkcss -a icons -a stylesdir=../stylesheets -o $target $(source[0]) @if _no.XMLLINT: :sys $XMLLINT --nonet --noout --valid $target @else: :print WARNING: xmllint(1) unavailable: skipping validation :rule %.css-embedded.html : %.txt opt = @if source_list[0] == 'asciidoc.1.txt': opt += -d manpage @else: opt += -n opt += -a toc -a toclevels=2 :sys $ASCIIDOC -b xhtml11 $opt -o $target $(source[0]) @if _no.XMLLINT: :sys $XMLLINT --nonet --noout --valid $target @else: :print WARNING: xmllint(1) unavailable: skipping validation :rule %.xml : %.txt opt = @if source_list[0] in ('asciidoc.1.txt','a2x.1.txt'): opt += -d manpage @else: opt += -n ## # @if source_list[0] == 'asciidoc.txt': # # User Guide is a book. # opt += -d book :sys $ASCIIDOC $opt -b docbook $(source[0]) @if _no.XMLLINT: # Don't validate against DTD (using --valid option) because of # non-standard dblatex 'linenumbering' attribute. #:sys $XMLLINT --nonet --noout --valid $target :sys $XMLLINT --nonet --noout $target @else: :print WARNING: xmllint(1) unavailable: skipping validation :rule %.sgml : %.txt opt = @if source_list[0] in ('asciidoc.1.txt','a2x.1.txt'): opt += -d manpage :sys $ASCIIDOC $opt -b docbook-sgml $(source[0]) :rule %.html: %.xml # :sys $XMLTO xhtml-nochunks $source :sys $XSLTPROC --nonet --stringparam admon.textlabel 0 --stringparam html.stylesheet ./docbook-xsl.css ../docbook-xsl/xhtml.xsl $source >$target ## Generate plain HTML from DocBook XML using the preceeding rule. #:rule %.html : %.txt # opt = # @if source_list[0] == 'asciidoc.1.txt': # opt += -d manpage # @else: # opt += -n # :sys $ASCIIDOC $opt -b xhtml $(source[0]) :rule %.man : %.xml :sys $XSLTPROC --nonet ../docbook-xsl/manpage.xsl $source :sys touch $target # Dummy target. ## Generate manpage from XML using preceeding rule. #:rule %.man : %.sgml # :sys $JW -b man $(match).sgml # :sys touch $target # Dummy target. :rule %.fo: %.xml :sys $XSLTPROC --nonet --stringparam admon.textlabel 0 ../docbook-xsl/fo.xsl $source >$target # This kludge forces the User Guide PDF to be generated using dblatex # so we include a dblatex example in the distribution. @if _no.DBLATEX: asciidoc.pdf: asciidoc.xml :sys $DBLATEX -p ../dblatex/asciidoc-dblatex.xsl -s ../dblatex/asciidoc-dblatex.sty -o $target $source # Force the Source Highlighter PDF to be generated using dblatex # because dblatex has builtin source code highlighting. @if _no.DBLATEX: source-highlight-filter.pdf: source-highlight-filter.xml :sys $DBLATEX -p ../dblatex/asciidoc-dblatex.xsl -s ../dblatex/asciidoc-dblatex.sty -o $target $source # Try PDF generators in order of preference. @if _no.DBLATEX and _no.get('PDF_PROCESSOR') and _no.PDF_PROCESSOR == 'dblatex': :rule %.pdf: %.xml :sys $DBLATEX -p ../dblatex/asciidoc-dblatex.xsl -s ../dblatex/asciidoc-dblatex.sty -o $target $source @elif _no.FOP: :rule %.pdf: %.fo :sys $FOP $source $target @elif _no.JW: :rule %.pdf: %.sgml :sys $JW -b pdf $source @else: :rule %.pdf: :print WARNING: PDF processor unavailable: skipping $target file generation ## jw(1) renders better PDF than xmlto(1) (see preceeding rule). #:rule %.pdf : %.xml # :sys $XMLTO pdf $source ##################################################################### # Explicit file generation (cases that don't fit the rules). ##################################################################### asciidoc.1.html: asciidoc.1.txt :sys $ASCIIDOC -d manpage -b html4 $source @if _no.XMLLINT: :sys $XMLLINT --nonet --noout --valid --html $target @else: :print WARNING: xmllint(1) unavailable: skipping validation # User Guide 'chunked' into linked HTML pages. $CHUNK_DIR/index.html: asciidoc.xml :mkdir {f} $CHUNK_DIR :del {f} {q} $CHUNK_DIR/*.html :sys $XSLTPROC --nonet --stringparam base.dir $CHUNK_DIR/ --stringparam html.stylesheet ../docbook-xsl.css ../docbook-xsl/chunked.xsl $source # HTML Help formatted User Guide. $HTMLHELP_DIR/index.html: asciidoc.xml :mkdir {f} $HTMLHELP_DIR :del {f} {q} $HTMLHELP_DIR/*.html :sys $XSLTPROC --nonet --stringparam admon.textlabel 0 --stringparam base.dir $HTMLHELP_DIR/ --stringparam html.stylesheet ../docbook-xsl.css --stringparam htmlhelp.hhp ${HTMLHELP_FILE}.hhp --stringparam htmlhelp.chm ${HTMLHELP_FILE}.chm ../docbook-xsl/htmlhelp.xsl $source ${HTMLHELP_FILE}.chm: $HTMLHELP_DIR/index.html @if _no.HHC: :sys {f} "$HHC" ${HTMLHELP_FILE}.hhp @else: :print WARNING: HTMLHelp compiler unavailable: skipping asciidoc.chm file generation # Book template. book.xml: book.txt :sys $ASCIIDOC -d book -b docbook $source @if _no.XMLLINT: :sys $XMLLINT --nonet --noout --valid $target @else: :print WARNING: xmllint(1) unavailable: skipping validation # Multi-part book template. book-multi.xml: book-multi.txt :sys $ASCIIDOC -d book -b docbook $source @if _no.XMLLINT: :sys $XMLLINT --nonet --noout --valid $target @else: :print WARNING: xmllint(1) unavailable: skipping validation ../BUGS: ../BUGS.text # Make BUGS.text and copy to BUGS. :copy ../BUGS.text ../BUGS ../CHANGELOG: ../CHANGELOG.text # Make CHANGELOG.text and copy to CHANGELOG. :copy ../CHANGELOG.text ../CHANGELOG ../README: ../README.text # Make README.text and copy to README. :copy ../README.text ../README ../INSTALL: ../INSTALL.text # Make INSTALL.text and copy to INSTALL. :copy ../INSTALL.text ../INSTALL asciimath.html: asciimath.txt :sys $ASCIIDOC -a asciimath $source # No xmllint(1) checking -- fails on embedded JavaScript. latexmath.html: latexmath.txt :sys $ASCIIDOC -a latexmath $source # No xmllint(1) checking -- fails on embedded JavaScript. ##################################################################### # Build commands. ##################################################################### all: $OUTFILES clean: :del {f} $OUTFILES $TEST_FILES :del {f} *.bak # Remove aspell backups. spell: $INFILES ../CHANGELOG.txt ../README.txt ../BUGS.txt ../INSTALL.txt \ a2x.1.txt # Interactively spell check all files. @for s in source_list: :sys {i} $ASPELL check -p ./asciidoc.dict $s clean_testfiles: :del {f} $TEST_FILES :del {f} music*.png # Force Lilypond to run. test: clean_testfiles $TEST_FILES # Force generation and validation of .html and Docbook (.xml) files. asciidoc-8.2.7/doc/music-filter.pdf0000644000175100017510000012357211033404422017322 0ustar srackhamsrackham%PDF-1.4 %ª«¬­ 4 0 obj << /Producer (Apache FOP Version 0.95beta) /CreationDate (D:20080704112714Z) >> endobj 5 0 obj << /N 3 /Length 12 0 R /Filter /FlateDecode >> stream xœ–wTSهϽ7½P’Š”ÐkhRH ½H‘.*1 JÀ"6DTpDQ‘¦2(à€£C‘±"Š…Q±ëDÔqp–Id­ß¼yïÍ›ß÷~kŸ½ÏÝgï}ÖºüƒÂLX € ¡Xáçň‹g` ðlàp³³BøF™|ØŒl™ø½º ùû*Ó?ŒÁÿŸ”¹Y"1P˜ŒçòøÙ\É8=Wœ%·Oɘ¶4MÎ0JÎ"Y‚2V“sò,[|ö™e9ó2„<ËsÎâeðäÜ'ã9¾Œ‘`çø¹2¾&cƒtI†@Æoä±|N6(’Ü.æsSdl-c’(2‚-ãyàHÉ_ðÒ/XÌÏËÅÎÌZ.$§ˆ&\S†“‹áÏÏMç‹ÅÌ07#â1Ø™YárfÏüYym²";Ø8980m-m¾(Ô]ü›’÷v–^„îDøÃöW~™ °¦eµÙú‡mi]ëP»ý‡Í`/в¾u}qº|^RÄâ,g+«ÜÜ\KŸk)/èïúŸC_|ÏR¾Ýïåaxó“8’t1C^7nfz¦DÄÈÎâpù 柇øþuü$¾ˆ/”ED˦L L–µ[Ȉ™B†@øŸšøÃþ¤Ù¹–‰ÚøЖX¥!@~(* {d+Ðï} ÆGù͋љ˜ûÏ‚þ}W¸LþÈ$ŽcGD2¸QÎìšüZ4 E@ê@èÀ¶À¸àA(ˆq`1à‚D €µ ”‚­`'¨u 4ƒ6ptcà48.Ë`ÜR0ž€)ð Ì@„…ÈR‡t CȲ…XäCP”%CBH@ë R¨ª†ê¡fè[è(tº C· Qhúz#0 ¦ÁZ°l³`O8Ž„ÁÉð28.‚·À•p|î„O×àX ?§€:¢‹0ÂFB‘x$ !«¤i@Ú¤¹ŠH‘§È[EE1PL” Ê…⢖¡V¡6£ªQP¨>ÔUÔ(j õMFk¢ÍÑÎèt,:‹.FW ›Ðè³èô8úƒ¡cŒ1ŽL&³³³ÓŽ9…ÆŒa¦±X¬:ÖëŠ År°bl1¶ {{{;Ž}ƒ#âtp¶8_\¡8áú"ãEy‹.,ÖXœ¾øøÅ%œ%Gщ1‰-‰ï9¡œÎôÒ€¥µK§¸lî.îžoo’ïÊ/çO$¹&•'=JvMÞž<™âžR‘òTÀT ž§ú§Ö¥¾N MÛŸö)=&½=—‘˜qTH¦ û2µ3ó2‡³Ì³Š³¤Ëœ—í\6% 5eCÙ‹²»Å4ÙÏÔ€ÄD²^2šã–S“ó&7:÷Hžrž0o`¹ÙòMË'ò}ó¿^ZÁ]Ñ[ [°¶`t¥çÊúUЪ¥«zWë¯.Z=¾Æo͵„µik(´.,/|¹.f]O‘VÑš¢±õ~ë[‹ŠEÅ76¸l¨ÛˆÚ(Ø8¸iMKx%K­K+Jßoæn¾ø•ÍW•_}Ú’´e°Ì¡lÏVÌVáÖëÛÜ·(W.Ï/Û²½scGÉŽ—;—ì¼PaWQ·‹°K²KZ\Ù]ePµµê}uJõHWM{­fí¦Ú×»y»¯ìñØÓV§UWZ÷n¯`ïÍz¿úΣ†Š}˜}9û6F7öÍúº¹I£©´éÃ~á~éˆ}ÍŽÍÍ-š-e­p«¤uò`ÂÁËßxÓÝÆl«o§·—‡$‡›øíõÃA‡{°Ž´}gø]mµ£¤ê\Þ9Õ•Ò%íŽë>x´·Ç¥§ã{Ëï÷Ó=Vs\åx٠‰¢ŸN柜>•uêééäÓc½Kz=s­/¼oðlÐÙóç|Ïé÷ì?yÞõü± ÎŽ^d]ìºäp©sÀ~ ãû:;‡‡º/;]îž7|âŠû•ÓW½¯ž»píÒÈü‘áëQ×oÞH¸!½É»ùèVú­ç·snÏÜYs}·äžÒ½Šûš÷~4ý±]ê =>ê=:ð`Áƒ;cܱ'?eÿô~¼è!ùaÅ„ÎDó#ÛGÇ&}'/?^øxüIÖ“™§Å?+ÿ\ûÌäÙw¿xü20;5þ\ôüÓ¯›_¨¿ØÿÒîeïtØôýW¯f^—¼Qsà-ëmÿ»˜w3¹ï±ï+?˜~èùôñî§ŒOŸ~÷„óû endstream endobj 6 0 obj [/ICCBased 5 0 R] endobj 7 0 obj << /Type /Metadata /Subtype /XML /Length 13 0 R >> stream en 2008-07-04T11:27:14Z 1.4 Apache FOP Version 0.95beta 2008-07-04T11:27:14Z endstream endobj 11 0 obj << /Name /Im1 /Type /XObject /Length 14 0 R /Filter /FlateDecode /Subtype /Image /Width 757 /Height 309 /BitsPerComponent 8 /ColorSpace [/ICCBased 5 0 R] >> stream xœíMO]I~ÿoÚ6ÆcÚ{hã&†î@38Ä`K7iƤ%âŠ[ö‚……ÐHžàYÀD²&²’°±Zaå½òyÍ‚QÖH~ÈpÿßÜõ/Ÿ§[§ÎýßÏÁáœ:¿S¿úžªúÕ©Õ!ÙQIÉáááææfà o#«ÕjCƆ†–——ažocräôôtggGæFOO~Gqà'ž=oë!„¢ åºÈ÷uTÍ ƒªgðçÉÉ NCßš™¼9>>Æ}§¦¦TÛ`ÕaôøÐ6ªÍï âþ‹|ÈRMÉ<ÇOñìxRµø2³„B)2è"E縺º*$„8¸··'å8¢Ž¨dcm`ÔHý×éé©*·¤Ù–$Ë¡.œÜ¨!PYòé sÄAõ‘)o!„7è%!äÁHyS;Ó3Å”7ÿ ÙßN d%È¡.ìo¤ƒ¨Q ¢”ò†B äM`¬#NÞˆî~ooOüYdyãÄ$ñ€q²agg'Ëg—5{(o!„BÞÄÉ›ÓÓSõHÑä:”a9zƒ'•£%‘²Aj›Ìž=NÆPÞB!Ä€Là`œ¼SSSqòIÉ¥¿øE® prr‚ä™Ð!%8¨cm‚¼A êByw±.ZÄá¦RC¢ˆãâAdRqQZâÚ½½=u³J@%âO<šŒ ©Å!-Ò~a[à «J„BHñÑìÕnT.T„*«3DèÊÕóe”VEQ>b«RW8 {Ûä¡ ¤°³³¾J9RgppkU¥ÄeBä¤OòÄœj§®‘÷j¶¨aøråvdâqöÄ=š:–ÈØ¸‡"„BšU3hÊõ´8Í £çL§á\I@Þž±··'Á]äâçðºõ•b,o %ä¿;ðÈãêÜ™úD"<_JDU¥’7¼R£þ#W[B!M¼QÇ"»þ¸!”Z}=O¸7$yi±z_µC¯e+oÔUÇá…Ùãy#¶Ä™bâ)2Z_SÞÄ à@q9‰š'„BÊ…¼ix\s‰l²aÉòFUP%€½–­¼Ñù~„L3 ož=Ξ;Õìå(F–£[„BHÓ£v¸>äM`q¬J²a w¶Qÿ«N ÅißòF|*Œª¼I^c oÔ±s#n˜$„BZòF]CÛp*ŽTòFíîã4€ú«¸¤ä%¸»üþTøŧ¯jQc& x•7acÄǪ’M"„Bšò¦öù’ÂAR¸QÃOa&Ë›ÀÇ@UËåAuÙIòÄPX6T”%ÁágܬoæSû|Ž,r• N“^¾åM`Nàë„BHëàIÞ¨knÕí_jgº%2¬[Eiq Ì\¥Y]]#-j¿NMþ’@¯.ЕŠO¨ã|¹žYý/JE!7C–£@¾åM->„ŠBiÐçŠMäÔNÂ@_«g¢7ÿþ½*ÐûãœÀ{êqqa q±c°H'yÒDئª™x 0¼r¶g zy``GÞ]MPl3(/ ¯…Þ }~KETxÞ€=rodÕ¶@n‹ Y¤„SOY8Ž”qyxXLÀá>~„BZäõ̸0¨Àtz\^‹VýTzÞååå†Û°è„# ?²WÕ~#aïb¹·r¶: úu<‚Qïˆãê(Pàó:Y¥‘Ç#U¢(/ÝB!¤¼@D©ƒfâ“ÜÊB!%ENœÉ…ÄCCCü !„BÊ‹:ã&¿9ž;#„B) ¯šV¸M1!„BJÎéé)ŽXÒ y#÷ê!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!G|ξ§§G~djjjhhHüž·uŸ±··'vöÕ:Su677“/<===99I>B!„¦òÚFôõBáˆãâóg¹šÐ6òÏããcIV8xÆÀ á#„BiÞ¿/;zUÞÔê¯_±/yS ™f³NòB!„4 èåÅï°ºº*ÿU"åMOOOÜùÇÇÇø¯*fÂG!„ÒLœœœÈ!š€¼‘ÿ‹^ÄZhƒZ]‰õ9ø—ø ìòò2´Hÿ§á§8‚óå¿p þW EjâOq;)®&§ð»´‰ˆ¤ä}ñË^Àq𸳧ޝ¼&„BHæDÎò¼ÿ…\ÙÙÙ‘ uÄâœÕÕÕZ]ˆõÉ8 ŠH,N–)þ¸J ±Â÷—@,Å-ý• ¡…ŒÁ„¶Áù8 kgšG¦^œ8‚ …;æ9H!„‚)o  "ÄïÐRœy#G~TÁX–þWäUbà¥V*7qF†'§°JMY•X:òFNÒIQD!„& RÞä„ü³¡†Iû/1˜m£. 'oÆ«6”742ä\Œ&B!¤90½‘§ÙËq/$©^ÔKŒGoä½Ô#ÇÇÇBÒàÚb†ÃB!Ä ƒµ7ò4'òF¨ ±~&Ž8y“¼öâêE^¨ ›….ÂO®½!„Bšâ$v-è‡pä$˜Í8ÓIâBœiö/q#¨‹„Ív»‡g‘‘Sq#±¼9|V-×0žB!åšGÌ|B!„”± N­^À}’ !„BÒ"–ÜT«U9yD!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!ÄŒ÷ïß§:N!„Rd a*•Jäñåååìí!„B±'RÞ@Ûpô¦¤,×ÉÛ B!$O"{ÃHÍCŠвR‡ê”BH+ž‡âÌTIS’¼ÍiÀr"y[G‰†-—”ˆ@WÈZZR*ŸcVˆïë8·-|—J"}"¤€°å’rXiSü&àvÄ,•A:Ùˆ[:IBÊ[.)Ù(Ê›2"WÝÈ⫤À‘~‰ò†[.)²OäÌTI h›Ú™àÑ¿|ØÞÞÎÛ b“'OJáKAéZ.ŠþåË—y[Qb aàúnß¾Ý×××ÛÛ{áÂ…@ÑÝÝ=99¹ººztt”·½Ñ‡899¡3Éž°&¯¡¼QC®²YxS+¡“|óæ zɼ­ &ÌÌÌà3o+š„Òµ\=*@ÞV”’?þñ-è.^¼8<< ¸¾¾¾¹¹‰">¬#ÏD¿³³ƒÒ¿råÊÔÔÔóçÏ!r´<Œ«™)d´dÞÄÄÄ‹/(u²Á^Þd9U:(oÊ åM+Cy“–?"Ç iÐ)T«Õ½½½ÓÓSýË!lpÉâââ»wï¼Ù˜÷ïßW‡­ÚÛÛ!u ýVVVèdŒöØLY½´´$ÿù¯Ô¹|´ŽÎ%-ÅÇ¿ù曼­ˆÍÊm‚xÒ¡¡!·iæË¯ýkHÓ¼­òã?~Síæ­­­åmÑÿ×s”>ê@Þ†8y‹ ·8¯“?üðª“C˜ŸŸ¿|ù2ú‚_ýêW<c5DåêիᵂóçÏwttà”‚o‡£ziüòÍÿýßÿ·T1’ø0‘ù:òO™çÉW©çomm…Ó‰ãåË—wïÞ½qãÆÝ:o޼ѼQIY]]EÊÛŠðâà6A<¦~µ)hõ¬Ÿ¨QªoD‡ÒÕÕuóæÍþþþ[·n¡¾ÿþû7u²4 Ƴª› DÈÛŠœ·2Q£Ìª:êØ_ÿõ_CÛüë¿þëþþ¾[Ú‰û÷ïCøÍÎ΢öôôÄI€ÿâ4%t¬Î›°ê¥Õ›þùÏÎ[ªxAT’óMúÓLêä”:W‰hGâÏÍúàOÑæÜÝRØÉ)hK· â1+͵;D1'§–––|£ÊíÛ·{{{'''ñËÔÔ HŒ„ƒT³šàŽÅ¬êfurÊy+ƒ]^Ú ?~üˆŽoµ>ªS“¦|¿#»ÐëáˆXtЄñ_œƒ&ÿîÝ;'™¬ziõFÒ¶æC<¯ •êZuq‚\‘rªF=±ÚÄ­ƒò¦¼SÞ@¢\¼x~¯»»[Sçd£|(o²¡ òæÕ«W¨BÒ™“dTy£"bäñßÑÑQäg{{{\›½víZkµZÝÝÝ5^€Ýšò&¥ya@Ø$_+ÆjÂòìíí9x ¬­­Y¦àCÞlooÛ/¼onyƒæoŸí>ä ^u-S5 uæÁ×=©×¹ÒWÇFù ÀÍÂÙ"Á{÷î!å ܨ¡G-”¼±ê÷!o¶ëX&Ry³¿¿jæIü«“©ÆöÕÝe=Ź---Ý®3Sgaa•­aVÄÉ›H/ÃÃÃÈÞ†RgnnÕ)•ÔiAyP)fW5¬Q ò¦°!W===–)ø7³³³[[[–‰4·¼–)ø7öVéÔ(Uù,..Šwà .$øÌdöõ…’7ׯ_·l#>ä òçÖ­[–‰ä.oÐ¥ŽûˆàŽÜKMóÚ´ýQ* jPvhDhPâ…¿À‹BŠô÷÷ãv?þôéSd šòF%ÒÕÕ511ñÕW_%¼°à_x%™ššÂkHCIßâòÆà*Q‹†#çÅù«««âˆ”7ö*”7úPÞ載….f à ‘HµZc>pÚðÉÊçÎ;ɉSÞ4¤ äÍéé©ý˜v$a}¢¯Râ*­Ã döööþ…lþÁMçææÂ2Ã@Þ4Oñ D›…†A;m(uDN“É›†áêJÅT‘ÝKu*iÃÅ^O(9ï!o­ß,Ã× ÃG`8*0œ¤e"xãpbŒY¨rlkk³LÁG`8¬Ê±F%ºx'E«Dúð«W¯^íëë»téÒ•+WÎ;wñâÅäÄQúÅÙ2Ò²ø wÒFœ·2M“ï æ¶¹™I˜lŒWSW¸õßÿýß«ÇQôÛ&  †®¬¬ ‘Š!±ËP€ü1.Aµª—üéOÊ[ª˜Ð00\> NXwäå©á¡„q&Z~Ê»Ü:àØÍ²Eâ#0üÛo¿µÏ±¦ ‡4µ,;áöVÙÔ(ãBÇMïܹ“|N¥Háâ ×&ᢇiŒóVfî µ/ÐðÚ¸ -óÙd&„Ç?ÿó?Ë#(zäsÚtð>’|Âþþþïÿû»wïâL¹µNÂZ*0¬qæç(ofTšHÞD†Ë‡ Ä܉ànËÀÕdà1úûûÅ®“““fß–«xÎ?Y.iEì¡A >Ãå‡e…Ufå•K`x–!œ2¦Ò8}áÒª\j”q¡ëDIW4Ã3k¹ÈgË6â)0\d‘ˆƒ6{jçE'0Ü&p[Y^f×ÚÀ‰§’‰à—Wá /IÈɦ —c¶j€j8.G|ÖA%"eñÅpKž6 QÚƹµj mÅ(vÞG`8”™& Î ‘\Ãã Î2V:S)*ŒAeö®Fzf_£Œ ]'JºÒ(0<Ë–‹|¶l#žÃe·\çÙ¥n¸­ƒZ^×:±A%îa5ÝHdU÷yIBN6}`xxê?®(+®§ Äb›¡¡!ùÙ>¨¯©©©Tßœ‚‹Ž4ÕÇ Uu0ßlm’¿É)ù§Y1å29WÍÜZ"PÇuEO›‚¿É)Aö5*ßÉ©±±±ÌZn`ˆÞ è9•`[ÃüñjUB¶ÇU*ãllÙÉ©„6âu3Þi#§²i¹œœ 79åÉ'Ôâ§G»ººÒ&ÕR“S‘¶ ,° Ë'}4ÒÜü<$\lz#²Wÿ£áùÊ›¸3³ù’Ž Õ¾7:+ùÃG̬j˜B^ò&Ù5…³(Ëpõ¸3ÝF˜ ZVÞ$gZ–-Wͳõ`Î[.åM›¥ÅfÄ´Á)oj¡1uÝ”ZŽËFû¡ER­Vò¦¦øðð¿âð*o¡Ájwаz{ œT­š•9`ü¨ZèÄ«ç.oÔ¨^®‚ÍÕ¨RÖæ—E^¶!Nj”q„©«ïËUtÊÅ g˵'ÇÀpÜtqqµâüùóßÿ½Y"þÃe9:ßÜ#@ ößæÚ ckkK„©úŽ€³ÄG`xœ/ò¬O–Áæöü×ý×êêêÁÁAÂ9ÎC8³ŒêMEœU.wxwÍú™«ÉW¡ôQNðΖkÏÿüÏÿdÓrÿó?ÿ`||üÖ­[×®]ûòË/Õœ1ø ¶CÛTD`¸,Ä|ëR2‘5-¡T½ôªÂÿþïÿæ-U2Âkœ=>&§â|‘Yj”wïÞ!ð6s¾ÌçÃÈΣzwwwá1,­Ò_8á ›úg<ú#K«|LN¹m¹§§§ÓÓÓl¹aœ´ÜÈoªJŒ½º×OjfÖf ˆ«fx=ÉÛ´âÒ‚òÆahðññq__ßÑÑ‘½UY›gƒ|‡Y$V¿«kÃZ•¥Ÿ´©Ïq½½ý>äÖ‹rùùçŸí­bË$RÞtww÷ööŽŽŽ¦ú4sÛTTyã6e‡8‰¬lVÔÌ ü«åMÍQh0ZhggçÿøGWV¹ 6_[[sb•1ž–;‰ê…¶éïïÿôé“+ÃÆŸœœ¬¯¯ß]¿æ¸Q à{i±MÚ&UŒC2Î[®ý˜’ NZîÊÊŠP2H 5“«‰} ¤¼q›¬[âÚi‘‡›²!àÄ"#§ò²­!Ynë— ´²ööv‡Ò!ðÞãããÛÛÛùš‘å¶~©ØÝÝEÙ}øð!oC"@m¿víš“ñÀ†xÝÂ7ËmýR–{ùòågÏžåmHb¾ J _3 Ûr} äMÁGÛü½†”°Sÿkðã,) ¼Á‹üO[[Û«W¯ò¶%dWGGÇË—/ó6¤ˆN™366váÂ…lôCZvvvúûû³´-ì0]ùùʈ‡µµµ‹/...æmKÐ]7nÜ(ÂSîoFY"äMÞV4 ˽ÖËE²¼ñºû´=hhÎG#¦R+988ÈÛœ^¿~ÝÞÞþË/¿ämÈÿQ¨Þ ÂæîÝ»(;'«Iƒžw~~þÚµkçËtð·…ïv‡ Ú [ngggq¬RÙÝÝíîî.Â[I«ysëÖ­¼­hŒ¿½ÖKM`r*3Å—óNg‡,ªV«È«ÞÞÞlöDJµä ¯¥px3-渄'–N@ÇÙ€²ûøñcV¥*;T­ÅÅEˆÒááa'ëœ[사Eö¢ô/_¾œxHUˆbZn[[[KµÜâPyCâˆ{;+øÐM6@ŒŒŒ =zôhssÝ \âÎÎŽã}^QäÞíÛ·÷÷÷3³ /›°ê§Ÿ~‚=q¾ñõë׃ƒƒ•z$ï«W¯ZªÄÃ>~ü¸¯¯Å´ººŠ²»=àŸ˜˜’~nn.aS«Êüü<ª“°'î4(R)j×äää»wï²1¯™@åGÑ#«ggg‘Û{{{Èpü-o"¢ô!²±þ-–$·\X^©'úùóç-Õr ÅûH^‘¨{ÓÓÓ -÷Â… °¹ óÈ„”À"ŽÛ”ˆ+¼~еšKKK pžpÝE[tM {}ñâ…(;ÞÓÑC0gEñÊ»wïžœÁ–KˆW *E!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„bÌû÷ïS'„B)8ËËË‘J¦R©PáB!¤Œ@Ã@á„CÞdo !„BˆÂJf¹N.ÆB!„ØžŸŠ›±"„B)á±ÎLB!¤ì¨z&n5!„BH‰På g¦!„Ò¨óSœ™"„BH '¤83E!„¦A ÚØ„„Ÿœœnll<©³´´433sûsúûûÕ?GGGqΓ3p-R8==uúd„BiQÄ’}m²½½ ‰Ò××W9£»»[H—ááá»užÄ#Nj§½½]¦300099‰sÞ¾}‹{y}vB!„4%BÛ$/¼9::‚žéïï ¿LLL¬¬¬lnnB;±é 5¤ m366½$o÷üùsWw!„BH+ ½9==}ûöíôôt{jµº»»{rr’±mP5¯_¿¾wïl€àyðà¬ÊØB!„”Ž@HøÁÁÁÄÄ4ÏØØ¤Eq†M×ÖÖ;::¦¦¦²×Z„&&ng î˜AHÙùøñãÜÜܵk×vwwó¶%‰ÓÓSX;>}ú”·9$‰½½=ô‡uØM"7GÏM3)/ KKK7nÜ@g”·-)€µ}}}Ož<ÉÛËòòrOO:ˆjµZœ‘@BÂDnmÊM3)/ûûû###±‰Âl}}öäm ‰ªFç4v"$w"+!·s'¤¼ø~§–ÁY‘k˜‘Ã¥8Å%¾³³³¹¹™PÍPC¼VB4 ÏC•qf o¬Ïž=•{nôôôôÖ™œœ|ðàÁ“'O¶··¹Õ!6Ha£’·Q €RÚÚÚš™™éêêÃKç044„ãKKK+++œjiˆP¶B|NMMÅM}ªu£°oÊˉämqC`¬¦\ƒŠP5 ƒƒƒ7nÜ€ƒBs;®#–½mÖ©V«r—¨Ÿþ9oà )‘Ú¦°]ºà§OŸ¢¾råÊôô´ØÕGìÉ ÄÄÚÚšØðâÅ‹xk×®­®®rysÈ=ù†ˆBÇ+døœp%1»—×JW“Ë¢Ø@AÌ£[]^ïçˆ=Æñß/^´ÂË~@Ï”hfê§Ÿ~‚w‚µšÅ„Ó DìåË—33#V}Wê»@À}mF!v®Ô_öqaÞæûE-ÍÒ•¬è³PÊxSÃÃBÊrc‹€ šFxÈ4óõõõ°XYYÁ¿ðâ/jÞèKñ¦ãuæ(®#pÛ Ée*¿pA=zô¨R×½-ò’« zO´ñ;~A»œ Ÿ8Òpm91Dy£ÉÛ·oÅ(M{{»¢Ô¼ý ´Íøø8]…Þ¤éW)Ø#JJ=b&o<­SoTRyƒ ¯lx/T _ä¸kÞFý„1…2) àf¨pš€Ç£( ¥Õ½®*‰“Nܾ}Ûaja D#!U_ã/“Ñ› F½|ùÒ>©&Æ^ÞØ”¾>%•7CCCE“ÙqÓâA¼sµ,ñþ¾ ±±±ÒÅË ÊnbbÂù°­%¾W•øKYâ[Þ¼yóƲ]ûÎdÔ¨ñññíím'©5%áÜ–…¢s­ï:,)©¼ùé§Ÿ¼öMÞq.ÐxåAo¶76Rß™>yòdnnN¯³³3òéúûû§§§Ÿ?n¹ìA’°ÜÝIú¼¦yZau¨P¨Î·™ð½?›ÙÄh\½u(o|O|g ofggmf%|g²ÎÁGã•ò€BÍ;¤"œÛ²»L¾Pí%3x×.©¼ñ‡ñ°§N§Ž§Ëž†·F£{ñâ…\ÄØÝÝ ‘#ÖmF"lqÚåË——––,•g6îËxXH»±±1ÕÔî:êˆÀááaä’+Hüa6xžð‚ãʰpRÎ=IòÆæcšd²[vvvðzØÑÑ!íloo—» ºººíðœÛÛÛ¥RËÍføŽCcx?~ü(ö¾;ŠTÎvÌ㣋}#ó¶456Þr'ðiTÀ• q‰v‡gA“ÜÝÝM[ˆxßA""ðÄØŒ²¸¯×¯_ŒŒÌÏÏã—¸1dˆP€x¬V«Ró ŸáÍÞ½{—­ÉnÀC¡£¥K/-vÌëëëƒ*†g€888(éË©qõ›šy}ÛGœ¿ÿ\ÞdÉN8::zôè|p¾½Ø.êEvâwïÞ¯ó{{{2@Çå†ZÓÓÓÐBn-ñJœgÓ)µëׯ‡/ô½è%Žr·LëÂ… mmmè‚ôJ6â¶ø¾K`–QhJ¨Èp¡ àÊü)éìÙß߇t‘­®Oñ¾ŽŒFýç 3*×®°6£È ß l†þ~#Ÿ>}Beh¸¢¾àò&ƒLvÂiƒ Ñ¥BØLMM‰}èO«€Ô¾CUè²ay5X…wù§,ˆä«$}uÂé„QKGð"DóF ùío+¾Óqîܹ/¿ü îKçÂÙÙÙ7nફW¯~÷Ýw®ì©žå‰xääÌI›lœgÓ¹üÒ¥KpøÒ*¤æÊ°Di“­[·¾øâ ñ;w N]fƒÈ@ß9™Á-‚6200 üŠà믿v^Ò-“äK˜©„бç vÁàòÑÑQÂx*¾8 s ä3òLJkRÍ‹<¨cžÀÏäÓàÇ ÓØTH\‹nÅk&WÏúß|šÏo~óÑôà¢{zzà.¦¯öjUÿÃþÐP©¢Ú`Å…:z#.Œ{U ª?á4o”ÌãÇ‘¬Ívyx‹_]]½råʳgÏœ˜ä/^Ø2bn?ûeâ]ÆìZ l†C.Ú‰«£€Áûh_(Ê‹uÜ¥J·`Þæ`’Í’!¼ nnnâÇÕÇ¿üßÛ·om<€øÈ‹Kâˆ|RÍù)²Ôp°·ø£7öãÕ ákЂÐ 5277çjÕ‡Úw¨«™½2[ rI.*nØÄTÃÊ›££#¼pŒŒ¸šª€È¶©ö/l9ìY.y³½½ a³²²RÀé]¯bC'x?/Pkkk®F¤+¦òÆÌÌÌÀ'Kˆx€/^Ø¤ãµøÄ×S¦¼Ñ¡Èò¦P_‹ƒú)BªÕª½È±”7‰¢ŸE‘M8Îɨ縒7¿üòËÐÐü¨–+„÷6ÖK¾ã…‘oÏž=3ŽX,‘¼yõêÞ¼®ý¶ÙpØUFZW…Òî¼aÙšŒ9(#û—‹Š‘¼ùôé)Í­úEjëëë»»»f—»*¾8Ä6Æ%Ky£C‘åM\íJ[ öѵtxx¸­­ÍòMÁRÞ£æMÃM89oÕ3Èô}ããã _uU÷â°l8e‘7(_hW¯ƒ6fqµ’´OdcXÚæ—ˆsSQ@+++9(/›t*éåx»ÙÛÛ³¹¯|¿àyc|y^ò¦¢§î(o’qržÙÜÖÁÁA{{ûÄÄ„±'w(oô0m`¸j˜½¼Y©SÀ ‹šÿxáV7ïÞ½›ŸŸ÷Z¾öÅä°LȨcÿãuz4 jœØÜÜœq‘URÊÔxbîê ¹÷‚1e”7ËÚ>¦¼IÆ>ä<ã¹-ø8óîî#ƒËí×Þ˜=º›_Æò¦˜ÂFþâ›ÛjÓ òÆ7NÞ¯ý=‘ m3ë}D"œX¿YÛ¬¤”7Eö¾÷^(¼R3(o¦lY»âœƒ×¥;»»»x2˜ðM7 ÃÕó ‚¶Šî›˜n<”×`^±¯¬ñå—.]Ò ™wˆ}`¸[âxªÂò÷D¨B2üß  Å=§èT•;wîÀ‰„W¬ÃÝbãÐÄlН!h¿–1˾³Zm2rYóÚ¦ ·ñÒÉ)ÛÄõ[î+bÃôôô¹sç~ûÛߦºÊ80<ð–gð~‘×èW,—dø~(ŽÞXbW+ñ÷D–U(Î}¹2/™õõu8¢´WUìÃÝbé|,”hôFæ¤þµ½i˜²aN¾„nÌññqoooªMtÍ&§KnÌ6ÍÖ¿*YÞа©£}×@y¦PòÆ2®Vâ˛Œ#F?~¼²²’ê’âÈ{@y#úƒ¬«QÞh¤\ê픡pàß’'—U]a&o®OÓlýlQ Ë›´ aÙÏçh,Z ¼ “VÞxhÆã#ìÓ7h/šØËËb1º¾¾žêü´ò¦È€òƦ뤼i˜²¥a[[[6ÞÏÞ9%, D-ȵ˃þÜuM[Þ4l ^·ról©Z(åM˜TòÆrj !BÞØ§ã¯½ØËãkóÚ µ¢-oŠï(oljåMÔ- ³ñÿ¾sÍ…¼‰t fóSš¨†E®½Ñy óºèóçÏ$NyF_ÞÄõ/¡¼‰#ÇÝP+zòÆ«pµ(‹òƦP(o¦œ—¼ÉÀ9 Ô¥¼Éòæ0Äüü¼8¿„ºB5ìáÇ8‚ŸÃÃÃú)lmmÅe/þeoáêêj8eƒÜHõP ß`ªñåýýý¨íÑ6#3ž&kf‡Æàñ‘ ö鸵JŲ —ùž|BàÖÂ-$àÛFå€Á³;©]  7Ì«ÖqhO›6+üpCç$“žñÃ? ÉR/..Þ¿ß8eK/œ²eé›ùÿlœsµïPoúç?ÿY|B%€2Á>W/Œe23 ™ìª}©H³ì¤[ÐIÖ“ج·{à¤v%€ Ü0¯ø¦ŽC{ÂØäžèκ¸••³ôÄÕ(`SŽ–^:9eËÒ7óÿ®œ3ÎOÕÄÔ¾C½ïŸþô§Èañ_9”°šÎá ´š¬Y`øøøx¤‘®XŽFJ89FgrÊÕÔ@C99…“ˆQã…1É)ß æhʃ“S6MCsrÊÑ=_û÷ï'Ûd“S®œ³ÁÒTkoÜ‘¿…Cjšfá¾÷¥¼ñ‡Ž¼9t¯ÝÊ›Hì#FmÆT4äÍÈȈWP£¼q„MÓÈXÞ\¾|¹·Îí:ííí~ÊŒ&“75ÛMD:‡Èªb.ã=ç’5Þµ@çÑÌÃQ÷Ô5ÕΣ9(oü¡)oœÄk7„ò&’'v_¢·üL¶No233#—ßxÚ&‹òÆ 68cy£rrr¢®ú°ù¢YóÉK笿å‚MäT¤¼ ¤,ÿtØÑhÊ›—Uð¥òÊ›0úò&c(o"±¬W–;ÆhÊßU—ò&wr”7iJyc|ÓZš-ìåHS¤P/êålž+l˜Y`x«É›Àò½½½••X888˜vÏ4ÊÊ›H,²åg²)oÂ<rRx€‡Z. ¡¼ñ åJ\ÌcÜȉq`¸ï’q”•¨ðp5ÊR$Õ vKÕ0³Àpßá–«««Nâ%†£ì.\¸§x§§§S.l`¸«xí†00<ËPÖîîîpEÕ×®h†óÍ7¾«®“Šáª_¼x1Îôõõ'›A`¸ šá§ùÃmjµ¬4·\H.Â?e0—ÑRO­£þYqw©fî;ÜR†Û§ã$0BÆm·ÖÞÞ®ïÓÔùzƒýý}¯»’7 ³–öéRv„æÙÞÞ6V'¾gggïܹ“åay£þ7ðQ†â¼áäiqàÓäØ5Z¼“¾æñ½WIò¦8 )bXN|ONNê_¹r%3;Õûöî )®f._¾ŒBcÑbI†`~~ÞÓGÐ)5RóÌÍÍ%Œ]ûn>ð®N¾»$^Eñ011áêk˜„´Aฉï¿ýÛ¿Í̤¸ýŠ]}œÒÄ„çë{zz|¯½!„”©yä ðÂÂB–M¥Ê›„¯PB!„”‚†kŒ !„BÊ$M1ÛB!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„BHayÿþ}ªã„B!§R©¤:N!„Rp–——Ã58‚ã¹ØC!„bI¤’‰Ô<„B!e!<Å™)B!„”šÀX g¦!„Rvz†3S„BiÔÙ(ÎLB!¤ #6œ™"„8NOO7ò6‡Ò€å:ê/„BÀ=JUS­V©p)8rІ o!$ŽJ¥rxx(~‡¶Š;“#á„±ä† oi2NOOwvvææænß¾=sÆÓ§Oß¼ysppprr’·ezF½‰s˜Ð6•:T8„äÎòyBqÀ/¿üò»ßýnll ìÄÄÄ“3îÖéìì¬(ô÷÷¿zõ B(o«‹ÎñññTÕÕU蜞žžÈÓÔ¼åx8!ù"^7Ø )5(?yôèÑÎÎŽœI‰' ÕW«ÕöööóçÏC½yó&SËNäû V>Ç,}zcB\Á™)Bš³ù&袽½½ÙÙYøÎÎΧOŸr0' ¤ ¤`­ž]===ÇÇÇásTa#¤ŽPáÒB!Ä!PG¯_¿îííE¿üäÉ“¼Í)P€"` Ú#rdL®º‘o‹Báh¦/WPÞfeeeåvÞä„~üøäs&&&ĸtggçÏ?ÿìä.%B-Öã:9#JÄ&Ëzr÷î]›Ë› µnÀä;'âPÞ¼xñBõóóóÂô÷÷à 8¹…?Ä ZŽ Þ¾}‹|;æ úúúz{{!e÷ÔÕՅ㣣£<ÀÉÎ;‘pŸè\ÞÔê^qzzš‚É„‰\l¬sm–Ú¦€d°æm°h“ShS‡Ÿ“ãësPÞ8Ê›8¾eýY[[seLBÞd³7ÔÈ»wïä;à… d„?§¦¦DƒÅSonnÂ5œŒÄñõõu™BGGGµZÝÙÙqb^œ¶qž9nU™ÈÒ……)+õ Åï8Žÿnlläû¦™–°&ⳡPQC®Zv“Õ–’7+++bÑ#hoo÷÷bR4Š/oàèÄ«+xùòåþþ>_벡ò&y,ä¿.õùÕ«Wèd¯]»&zÞ±±1Tx±]že_îì§Ÿ~ÎAGoœša¤¶)fçˆLÛÞÞ¾wï^__Â/ qDŽ%vuuI¹´´„Œ*¸Ÿ ËÍâ|Ç¡5#§ZJÞÀ’¸Ê›dÊZL ErçÎ+W®ˆÔpz ß™ìºÂTݨ¢Ãõ}—dй|ûí·R|¢-àOçwAUx¿«*âßÿýßêŸÀ¨KÚ—qý}oÔQ¼ ‹ŠiÞ¨˜ôÆþÕOrpp f´QÖLÍ[ˆïÇ91&KŠ6zƒw–……´#”EÓlÕ^)禬½¼yóFŽîê àˆ“áa ÔñºtñâEôe%ýÊOBÆ= ÚÝÝ{¶@xloo;L\­*ê#ë«›ø…w0nˆ*o’ó™òÆŒâÈ›(o’qÛ=áe¶»»» S–® ¼‰£Dò¦Š‰ÚgœœàO1pïÞ=±‘_s}âÛßF¡ëwÙ^AÁ­¬¬@:96òF\"t²¼P_6ËEÅ e$å”7¹S(y³´´488Xjÿ åMå’7šûŠˆ> Õxnn¿ ãõ¿9jµW›MÔ¹%(ǵµ5ˆ¼…Ù¬ÓXÊ›€DÑæŠÌê8iDycåMîGÞ|üøñÚµkšëï ïÊ›8Ê%ojz_-üñÇqzÀ±±±¢CZ6¯þ6NÛ¤ÈËÀ9‘ÓÖÖ†72›t,å:'¥/W5Ì%Ê3(or§8ò¿hV†¢ÍÎ7„ò&ŽÒÉ›ZÔ~#*/^¼8wî\¥Ÿ›‰|gO•‚?ë*êÜþõ9>>ìïï7Fs(oôE`ÚÀpÊ3(or§8òFs¤7Òúó`N ¼‰£Œò&î»ÌGGG½½½ccc>,`…Œ›úI56âÏߢ&xÒ6iŸ1-b®Êl¢*AÞ4 òü´ñe}gT5ÃUÃD˜-~f±è•â†ÛG•ê y ÐçÛç30<.ÆÆßH·P.._¥¾#Šzä믿nkkûî»ïªg»Lø¶*®Ž?+j‚MÌL 0ÛßÇ=ÃkÎ!†}ÜH¥eåMÃÐfOodËRÞØ„m†{™TD>{6 G?“uŒôT7"‹†ò¦¦9%I%o² dv•fÁåÍå™E”«¸¼‰´Í몕pga°´8.¨-ƒ¶Èûz*\•Ö”7yåv\ûÇüG›dõ‹À2lÓFÞDʆlWM[Þähd\ÑØïËšLåMîD_ÞdÈìʽ4«¼É%¢¼–>0<.²L÷ôùQÕ0³Àpù5ó0DçdO§PwwwÃß«užWô¢Ã &6L™ƒk5óÇþÁÃñ¹úÄÝ:­C0û–qE/0Ü•‘iÉÞÈú344TÌÀpµ”oܸ¡_Ã&£že¶»JÓw`¸M Æ—;,µÚèøÕ´áò„daæV•©)›ÞĩNJÿ—ú¸û:®‘/§E½1¢Ô½É,·8©`‘%xýúukãî®?4azc?«9z“Y¶×8z“ˆ“‚h¸°$’T“Sò²³HðêkQ¸!¤ Ÿ” ã»×Ël<<®  ZÓt.ol†(uäÍÖÖV6¹Æ~ô5®ªàDçòÈk+i¼®±¼A%±Ïvû+ý£#Ͱ/,ëOnåM\3ÓOÄRÞX˜Ÿt/'é´”¼ÑO!ÕÂãÀpyñg A¿|5DMÓ,0¯0áÌÉlÝ£§l‘$¼™Ú<£[yc9¾¡#oœl´Ù› ædêÄ2lÓFÞ<{öÌ&Ûãž]ó)*zòfvv6¯ºá$j8‡SoÆ 4Ä•›Ò—7¾³]½—“tšRÞ  ÙDªjã\ÞR–:t#ªafáD刓ué>&îU,=›¾¼±¶4r ë“ØÈÍ/ðFbÿ-㊞¼)iÝÐÁUýñ½ë*|F_Þ˜ZšW÷jVycsßñññTÕÆ80\ÔO‘¬è ÍG½©ì.m-l˜ÙÒâæ–7ö3#qoÿðÿàÊHË!úæ–7µ(ù—ñc^òÆ~J±Òòò¦æ¢þøŽÞuµ3åå•76 KR†‹°,U‰ WõDRiƒ¿Â¨†™†gðåë|‘Éšs"ÝZ¸|-IÖ§¢ŽvTÆ/G Ìb¢bŽ«p­ñ}í¿e\Ñ ·ÿt{Á±¬?Ù„Q[º)f`¸[˳¹WS†[î-€ûW›TáB~¦Ô;2…O0C5¬¼£7‹ ?– 9ÆÌêÓô£7¹“ãèýÇþÊ2zSLPËû{ЩhâÑ›Td©(ïèÙiw-TøÀŸ”7 À³Áæðâr§ ?ByãÊ› X[[{ôè‘úýë‚PüIËPÞèÈ›ÀúáÀ œðêâl–7¤ò¦VÀyP§h/qa·–ñ†PÞø†ò&ö÷÷ûúúŠÖ¾²‰^wåM÷îÝCþlll Y©*šòFGÞÔbæ¤ÔõÆâ``&ˆ¦‘7‚§OŸ ììì8Oyww¯‡fð-WK(o|Cy“GGGccchh·q™ÕjÕìí)³0jK(oP·¯D/!=:::55õðáCün™²Ù…å’7µÏC¨¨©e³­Ÿ…’7µz0l¿«aj$²··722²²²RÀqo'PÞø†ò&K @fff:::\ dãƒ&&&>~üè$ÁÂBy“@ÜîÜàâÅ‹–)›]X:ySSöÀ 4ÏÊÙfJ™}”A‡¢É›Z]“À¿µ··oll'²¹¹yõêUx¶ævk”7¾¡¼Éä<Àüü|`*!BØŒmmm¹5¯˜PÞ$055Õ××'"†ŒÛ¤Üdò&ò‹á*j(¢ŠMÐ_$jâM>:: Qç:wî\OOŠRóßph·nÝÂUÈ$âÛÎÜiúÀðܹyóæùóç{{{‘‡h¿úßšwn|yµäáhȨØ_|ñžâòåËð*³³³:×"ë®\¹ráÂ…ëׯk^Ò!0|zz™&c:::¼ÞËT˜÷õ×_ óPÁÚÚÚпؤ‰*Ф ’EâúõÍ>0ÜøÚ´_ CÄL9\o£r¨ ¦•S} »€£7*P’;;;b°Zäÿàà ”'nžQ=«´²ŒðPûûûyÛž(î†c\½±á_þå_TÐÞÞŽ÷”¡¡!T3Ô=d,Úud£Ë}ôFº…Š9z£òáÇßýîwÈsÈä?tæüüüÆÆ†tp°Õº¤¹víšœnxúôiÞ†g ÊZÇù;QAýÁ‹$Zʨ»»;ðRïö^)0΀*Š Á«rf{{;n2ÇÑQU„Uaa€ycOÁåʧOŸÐYàN̢Ⅾ·þ„þÄm†²›ÊP¯Â#±"5ÏÇó•7:_Þ¨üòË/Ð-è;Ч@í000€#pÈm¼×Ïh·Î%r>®]”¨1&aUO@óLNNªšç»ï¾³¼¯«G°‡ò†äå >|3#01 ]™äܹsW®\Ñ牄ò†øÀ·¼A¡Ièͧ¦¦ÜÞ«€,,,@]‹Ék}ç„>hý×óŒûnu“Û°’¡¼!yAyã 1ù‹Ì\ZZ2Ó<ús[”7ÄÎå ê*ª¨H©|“!f|666ÃÃÃfš'0γ»»§y2î»v†ÿKyCròÆ+ž4Ï›7o(oˆsœË’€Í? Gäæ¹uëVfOÞÜ2ž™1úPÞ´”7Ùc¯yÚÚÚp¾o;)oZ–])N4Ϲsç238,oÔÿ>ÊPèÙZtµoß¾ÍÛ ’ZóXÃöövë„RX 4O–ß0RïØ»/|„Bj‰šgff&oë!¹‘¬y²´$n¿bWß'„´BópÌ@jžŒwAšJ•7 _¡"„B) ×B!„”H.¶!„BHYøçýEñ endstream endobj 12 0 obj 2596 endobj 13 0 obj 777 endobj 14 0 obj 19381 endobj 15 0 obj << /Length 16 0 R /Filter /FlateDecode >> stream xœ­VKoÛ8¾ëW½¬ ´ ¢$êf%v²»(Цöå J²­­^[i6€°¿}I‰’¥’qs¨ÃáÌ7ß`ñãÙzžÇ]1”Ö?î61`6 ŽR9´ CˆlC‡ÌUÒg"#%ÙB˜[KÍüeU·Öã°K‚ <[è•Üë³ C©=¡GÎh;Wq- ®éðtVs  < Ñxõ„ƒÐºÚ0€ ·ª¶¢ð„Pˆ©Í9r‹O§?½Ñ?wAncì:`g æ‰ó!ê"Ð8õ—ƒ¨‡‡À1Û>o0’¡‘ô˜„whÛk^Æz(eà÷Ý/†‡j÷¨âNý\Oóûð+>†Pi¡B?Ü žqÛm‹ƒ+FDó½÷OE~PÎç;“›œ‘Ü®ý°.Ëå÷©nš“É“èõ¼ó7yšŽu(ây;÷‰è˜\Æé`ßœ'¢yªíöX—ƒö¹VR]¤#ò<ÉÓ{Yª7ñίÇõV Ïû<Ù+y$“ÄE‘¥jñîË·¼ Ÿ²¬Èާwƒë`q_'ûì·¨@‰<(ÐD’éí¿ó'Ç仈вnõu¬fÖŒµ¸®ëCv4¢;ú€ÜøAÝìœ ®R¸ ¸ËŒ(®>/}~å™l=}Bþôץɔëýùh±V|nI´<¯64Z¶¶£åú¦ý™´H-•*ÆOÁp±EËÍ߈¬÷¨õ#I6±¢EF¶ãjG[ =‰-v$›¬Ò`¥ø¼Š!ÙÅíW_1s&zç[ÿ¿€Ž¾YH·dÕž÷è¹,"ƒ`ºù£c´Xµ?ÍÓL‘êcõ+/YóƒDä‘p„iõ>«Ä­rògÿOR=Šä3Ó9‚ e‚ª-˜xý¥œ»òÙ½ú½Äà¦î^åÿƒîši endstream endobj 10 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595 842] /BleedBox [0 0 595 842] /TrimBox [0 0 595 842] /Parent 1 0 R /Contents 15 0 R >> endobj 16 0 obj 914 endobj 18 0 obj << /Name /Im2 /Type /XObject /Length 19 0 R /Filter /FlateDecode /Subtype /Image /Width 292 /Height 43 /BitsPerComponent 8 /ColorSpace [/ICCBased 5 0 R] >> stream xœí1N+=€iˆ á!þ‘@‘RD‚¤AJCñWT4Hœ WH•)â©(èh~Qs$Nqƒ\!ÿ(ÖY^Ç;ö8±“ÌWDÍÚx½þ<ÞÙ]Þb±S|~~ÎçóÔ­2å÷÷÷çç'u+v„«««¯¯¯Ô­2åõõõùù9u+vqMp ®ED\ˆk×âZDÄ5Á¸qMpÖµÉdò¯“^¯÷Ï÷n™P­Vooo6 ÕjwV{°$n___×jµn·±Î|€N>;; (ØétšÍfôö¸¹¼¼¬×ën Ÿžž` <ýE øGíù|>¡hC£Ñ€ÏétʩРy\ƒiz©t7ìOàããCmaö­LàP3|ƪ0+ “aF (˜$®• «VLã@´~¿ßn·ñGUÛh4 ¨ÍÊV¸†–éÝÆ9~ôE\³’¡kÊ)ëWÆlŒ[(¿B˜!Ä5zq ù»ýft ÂPû9¬âš•Ü\Sƒλ1ôoqxE:°ÀØy]+®±K‹[6ãš~­'=7ÒºæÛKŽ!¡_JX÷1B›×€"“ÉYÜC׌oWMV›YCêR3íÞ$ÉãZqYâÀ1$Œž/žqÇW^€qFã`Ï®×ðÛbz$"׌I5ÖiÝÉ][æL8$Š9ÿbç;0ÓԠß%‡‡‡Á•¬"nÎsòðÙëõ(EšÍf±Çt*• Ö¹¾›)N~|®ÚÇ*@â…œ][¬íeŠâ‚Ê+®sþ*Gº¦¶áÕjµûû{è+ì„€zôœ|ÜÖ6—pŠ»hgrþœâõzS¼4ç™ùèÃãÀÿ=ˆU9ÿ%LýW¡b™zQßÑŽ²ð‹ˆÄ5 ™Çµõðoð3ZÀqÌð‹kkE\[ù»6ZòõX»¢kjK&ÿ—“¸FaŸ]óeó®Aði¨l¤Bm »©q‚¸F'ÉRÿ~IDSˆkÄ5:i]Ã;k×Rµ¤ˆ¸FA\£öœ:ÎÑÑÑÚ’Á`°á–XaæüÕË&ŽZ­Vpåtv;ç~~C(¸ø†QC"«Å[&0ãÚ¶°ÕqMØ Äµ ׄÅÞ¸ÖívÅ5!-{âqMà#®Q×>âqMàóß’Ô­È———Ùl\üýýS|Kù+äd endstream endobj 19 0 obj 1554 endobj 20 0 obj << /Name /Im3 /Type /XObject /Length 21 0 R /Filter /FlateDecode /Subtype /Image /Width 48 /Height 48 /BitsPerComponent 8 /ColorSpace [/ICCBased 5 0 R] >> stream xœí—{PSWÇÕZݪãŒÕª‹Uq}¡2êîl;Ó‡mµei·-ÝÕÚ‘¶j­²]A…Š"ÈKžAy( *¯ÂCÂ3 „„‡^&$! IîMnnž÷ÝmµÝ_ˆvöŸš¾fvýÎwÎüî=gîýäw~çžœï¾{¢'ú?›Íö÷÷Ö-àòW„‰ŒŒÜ¹tÞðÁª_S¼åÛùŠ7\ÂÍ_RoÛë¯|÷Ò G6<«Ø´@ýÒb¸Éb±~y˜éÛ5»Þñ}VñûçT/,R¿ô[í¯þ·Ö@×·ný’ÐÏM2eÊ”©S§Îš5K·ëÕ±W¼t¯?l[fô÷6½»ÒòÁj[ônèšò}ÁøiÓ¦=ýˆfÏž Ø Ý‚`Μ9óÀÃvÙ[^¼¹}s9æ¿ÏM²Ã‡Øÿ’.zÿÂ…ó‡ºÊ—0nÛ:ï8ºï=.“}|ÝÕRýÿ¢Áw©Áùóç{œIøumÅ™„PºoË_×Úv®#×3á&SEø¿ö›™O‹k¾µ…$'ì²S¤"†RÆRÊø‡M¤Ô_Ñc9Œ6Lkó¼¼¼`Š=ãyæ™gZ¶¦'n_à«€${ßײN=ˆÄýÁ'xåü3ž°Üà‡ê{#lÒhà!q¤2‘T¥MšÒdÓÚF‰AŠ¡]±bÅ×_íÏܹsmZŽV’ÒÏ‹ñYíõÂssçÍ™ ~gÕ’Ü‹Z^\¼yƒW]ÑIÓ!íõæa€I §ÉÑ”ISêLÈ `8‘'ZÆ %>>>wïÞõŒgÑ¢E}-:”)'dì1c:0è·.C0}ú´Ð -e¹ŸˆkBTâHÓp¡L&”)¤*ƒRçLšÖ2c`9 l'Êòõõ÷ŒgÙ²e$ÂÅdg=]Ü茸›6,yzú´éOMƒ¥´õåUQ¡~EY®,Òže´×ž¬»\šûYN⎓¡ŠñËNú¨<ÿs;tˆ­ê9­ïO1§ã#ÿÍÃqbuN¬6nÜxëÖ-ÏxÖ­[ÇàíVu)"½$ïÎîkMàs¹%!5Eg_*ËÛ_žT{%DT1È‘‹ÇzÓL²3¸üÜC})VÓFc¬g°«‡úñ˜gíÚµŒIhU—™%š<©8­·å”øZD[uŸÖÆùRX{¼»!ª·é”¼3YÑ•ªëÏ4ÞÈ±È &H&ìæipÃ4ÒXÃúõë=æYºtéM³È®)·¨JÑÕ}g¤¢äá¶ø^Ì/vP?(H‰’U×Ó‘¡ldè¬Aš ÅfW“º2©0…p€‡Æ ÖJ›a½{̳dÉ’›1¡c[T¸²ÊÕJ25½é£=iêÞt­äŸšÞL$K7˜ƒÞÈÅåçåÝY¼êB_;áë‚sœT«–Kù´©6ñi¬jòÇäç–­‡Ðsìº*«ª¬üÂQM_VÍå°V<>ZjV•W\Š<¼½¶$“JéçÏ ?´S", ÑÆôÓÁUWºyy)qi¼6òW¯^í1φõko;$”‘KêìöÙ´/Òãö”œ?Vvá8«(rP”›“Œ«X™I‡$‹í 9ÅùQU%IÚŽ8ò±i ÍW ¢)\@›D4ÞTð ùIxlj»(âóOü­ê ðé¨=ù™ÿç›Õld¤ìtÔ>‡®¦Ox±¦<`hkrìÁ°ÃŸæeE"#\ þ< Éa!;&xÎ¥‡|yøCiWðèe¥q'öºxÚóYűÀs¥ ª¹:æ«5çj†9? ì2ò8tõªþˇÿöÁOÕå((ž¸È=e…‘ÑÇ>íï¸<ƒâ Åù'€ç\ÆQqK®+QH£\Âróˆi\ücxÌfó;o¿>N ;ñVÊØD¢um¥~¸Ð®å;íȽïïßýÅžØwµàä¸h¸³“@Üõcà“F!¬ëI»\+½S&©b§Î›7a˜Çâ¹ÿþòåËoŠÂ¼¸ gOmØv(8èäñ£II I‰ñ—.ž?wöLrr|âé¸wý%àí—wmßvà³÷ãOU%Èû*\%ôÀ²ÞJ7?ïLäñ°Ï?|{ëë/>î|ÁùN:p°]°`A@@@^^^MM ÇãóùB¡°µµ‚ŽŽ¨ù¦¦¦––è ‰‰ œ9s&œ"×­ó™0T¯ŸŸßádz³³T*U«ÕwîÜùá< o¾ùŽlEÁ–¢¨^¯GÜÒétcccZ·&nbcìv;I’0&‚¦i‹Åâx è‚&“ib$Ax¾<ðp«ÕŠ»> /H /I >> endobj 24 0 obj << /Type /Annot /Subtype /Link /Rect [ 78.0 167.95995 122.664 178.75995 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (userguide.html#X55) /S /URI >> /H /I >> endobj 25 0 obj << /Type /Annot /Subtype /Link /Rect [ 129.66 167.95995 227.988 178.75995 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (userguide.html#X55) /S /URI >> /H /I >> endobj 26 0 obj << /Length 27 0 R /Filter /FlateDecode >> stream xœµXYoÜ6~ß_!8/6P3¼t°@šAŠ´hZ-̓¼+ïѱ•´v¢ÿ½CI¤$’Òú¡MàD’9œƒßÌ|C`ø{KàŸ„”$‰ˆc»bóç†t¿$AÈ Ÿ¢qbÌÂQE0ÿ$‚\ÉL`ÑðÄáa¾Z}9¿oÊ Þn>~‚uû£0xÚàÝv¿n>€1ŒE(ï82k矄£ÐýÒíçZ5ßhÅNOD»zƒßÜm^„wCl!ð”2D" " îŠàãõçFîn‚ë~¾—y›Õ7Á§àî‡ÍwwàxˆCDãSntÎ? Ç÷Kg—ëæ|£Ç=Ñwìêÿ0ÇR,B„Ѫ;f¢„á‰9çã~éVûN ¿PÄåü¢ð3õÛý2ìçÆõÅÀ÷áQ°(.PÄ"!<"¦Ŧr6,zL[{™©‡Ð65ªâéÞìù$Û£}ÜÊC#  ÙyŽiÓ絡Үkê£ñø[“9®ÍéÑbŸˆ»1JAÍ6è¨ooóçí5ÙÞ¬ž0^Ú£k­Ìekú©æ çÓ>m]³gý^-vÃ⽎Qv­É)PIk½ø¬ŒWýOÚm;q‰'ˆaqdŒºR³ùsð2c#¤Ë­-Ô%%Ëe!Gób þ˜æR }ýæ›–é´}—í„xÖ3¸Lrv8`Ûô¯›”ßV»e94X‘$bG¸s³Ú‹¬l¿ôÔA 5Û©a¿[¿¥4´—Áìc/3Du1f:¶:ͤ3\?Uõ¥Ôj®³,ø2ÍZ”ìºK•çÕ“KEƺ`j[Q@CšíͨtLët6È×D’@îÄz\­e—ãj7¹lL=7c]ìká}ÂíËÔôýãéx4?ÿôV‡áܞΦO&Éfžh:ž†˜ ª2æJÕ±½Ç4S&çøqSV1þnÀÖ¹~EI²$øÅ•êÔ/ù$÷†¾út†Š$t§bKöÌ|AsÌ æ,ùcÖ¨‹/ŠÎ9_š¸¦©ÌÓ‘›o¯›lšK##¸ëÔ»I»)Ò]íPU…!À0¨›Ã 7=x‹×&jR%¶ŒÚÿ£½<†¢¥»*Î@%g¹Ïб-òW„‚IÌ4û°…Ý ’¨}Â:8xì’K÷Qžîƒ—6ºL!iÈM7ôXÓ.Ëo•ç]ºHë#h͘ CFÍpÿ^Qîï4+šÂ(" ó`uû¾V-ìe¯Q¹:[G,UQ²|a#„hdØ;8„iB’vi9έ÷{J¤I­c冪kq¿ÔíÌÛÞèÛ»qh›pÇ™f„ÑrZp•w¾"‰á(Íz‘·—yÈÌÒ5»ï–ZÕkcZ[9{ÍüÒ3ѸÊɳ%…êì&§æí޳1 †C’ÄC.¼Ó7ÇꜛgЬéæ9d‘¹^9¥†µLŒ´¹‘YœI: ¼D8Ö_.(,†rK™ºê²…½Y2¹ßþ°ùþåX endstream endobj 23 0 obj [ 22 0 R 24 0 R 25 0 R ] endobj 17 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595 842] /BleedBox [0 0 595 842] /TrimBox [0 0 595 842] /Parent 1 0 R /Annots 23 0 R /Contents 26 0 R >> endobj 27 0 obj 2095 endobj 29 0 obj << /Type /Annot /Subtype /Link /Rect [ 78.0 689.02997 122.675995 699.82996 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://lilypond.org/web/) /S /URI >> /H /I >> endobj 31 0 obj << /Type /Annot /Subtype /Link /Rect [ 129.672 689.02997 244.01999 699.82996 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://lilypond.org/web/) /S /URI >> /H /I >> endobj 32 0 obj << /Type /Annot /Subtype /Link /Rect [ 78.0 662.63 144.64801 673.43 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://www.imagemagick.org) /S /URI >> /H /I >> endobj 33 0 obj << /Type /Annot /Subtype /Link /Rect [ 151.644 662.63 292.96802 673.43 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://www.imagemagick.org) /S /URI >> /H /I >> endobj 34 0 obj << /Length 35 0 R /Filter /FlateDecode >> stream xœ½VKoã6¾ûWðPÉ!4ßsk±Ý6E4¨Hr%ÅV¬,ÅɿߡDÊ’¨¸9ƒÑhžß|Š"Wþ…‚â0 u‰âbõ}E»—I¸²*bÁ$!Q•Dšª4ÊÏH#+ ¦ÖF³Gÿ¬ÊA¿¯žÀ.AKt\‘táþ^ÝC1œ+‚ž¨ÁvªÒ^B_ÓÅó«š:Sç"^]}Á¿nVë¯Q†6Ï[ž1Ž)ZK¤±Ö m ôpqײø] ø}Íò&­/ÑÚü¹úmK"1 $abÈ9Ui¯_ÓÕå·9 t¦ñô½ºúÆï§\ ´Ä$Ô=¡º1Sã ÷æãk:륉‘ÏŠú„¢'By/Š…bÆ}ûÏÇõÓÄ_(b!ÁB WZs1wŒcy‹…¶ÆÓô5¶Ÿ.Ÿ>9 E,$X"3Üéºïz C¦µž€@£˜…!´oŸc{šnÊCåyÔdUi!Y%¬C){ï›ÒzGI’õžÝcSõ‚ £æa… Lqãh¿â,ûRÅçÒsphÄÄѤ|¯Z›ü˜å¹Ë4Mf%]ì£×ÔŠYßsš\Û”ã>ƒ3 û'ès<2&çV0Ž™Õm–¿ÿU•Éܸ«e¸;s0e<Ì­ ÖÔØÌ¬÷Mór½^çå²àªÞ­év핯 &¬ÃiáÉ7˜PeضPÚãEQ ×mV¶oVN²CSgÛÖ ý0ÀçmâÀmö™{ñÅߢ]úx‰p¦Ä¬DÑ1õ Ðs³›"ÞE»,þ6·†æ•»E1sZD[`ÎMÛss ÷ñxÄ™IWté ê^<ÄZAN¿q&Ø ŸKõýsЉIËû´›tHØì]°btÕ>Û«¶Ïél·ïVˆ«ò5­›¬ÜyQšSh2hÝaücsw;Ûf~kpF0ªR¯ÿÞ\ÁÎ'!¡Âs¾¼4 d¾î¨ä8¤v>?¹ugò%•ƒçêÕ xÝ#uXwè]õOWܼ5K£PÒÿœÕésõö‰ û¦p»îç³[›jŠ…”† ýȇ Mf{Œ’ô5Í«—aFe2é Vþ¿í¶-·ƒÇ¼…¢bœöc÷È0…;ÏË09ÛFa†ž\ÕªïŽw4aV¦ Í!†+p}Spô¥úðS@)¸¸?ÄðaùI•:@ÊÊùXÕ®®iýÖVî ¤qÔ†[ÇÅI²Ä‹½KË´ŽšÓ‰vR~o-𳫚áÍ ×Þ‡UÛ¼´ Ç®Œ 'ÆU]§q“»#ü+Ìϵ=º8#·eêj›§ÅiËÀhîW?é ö, endstream endobj 30 0 obj [ 29 0 R 31 0 R 32 0 R 33 0 R ] endobj 28 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595 842] /BleedBox [0 0 595 842] /TrimBox [0 0 595 842] /Parent 1 0 R /Annots 30 0 R /Contents 34 0 R >> endobj 35 0 obj 1010 endobj 37 0 obj << /Type /Annot /Subtype /Link /Rect [ 66.0 628.694 156.782 639.49396 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 36 0 R /H /I >> endobj 39 0 obj << /Type /Annot /Subtype /Link /Rect [ 553.01904 628.694 559.01904 639.49396 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 36 0 R /H /I >> endobj 41 0 obj << /Type /Annot /Subtype /Link /Rect [ 66.0 614.294 134.565 625.094 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 40 0 R /H /I >> endobj 42 0 obj << /Type /Annot /Subtype /Link /Rect [ 553.188 614.294 559.188 625.094 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 40 0 R /H /I >> endobj 44 0 obj << /Type /Annot /Subtype /Link /Rect [ 66.0 599.894 133.225 610.694 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 43 0 R /H /I >> endobj 45 0 obj << /Type /Annot /Subtype /Link /Rect [ 553.187 599.894 559.187 610.694 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 43 0 R /H /I >> endobj 46 0 obj << /Type /Annot /Subtype /Link /Rect [ 448.644 571.094 493.32 581.894 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://lilypond.org/) /S /URI >> /H /I >> endobj 47 0 obj << /Type /Annot /Subtype /Link /Rect [ 500.316 571.094 528.99603 581.894 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://lilypond.org/) /S /URI >> /H /I >> endobj 48 0 obj << /Type /Annot /Subtype /Link /Rect [ 66.0 556.694 128.34 567.49396 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://lilypond.org/) /S /URI >> /H /I >> endobj 49 0 obj << /Type /Annot /Subtype /Link /Rect [ 148.332 556.694 173.004 567.49396 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://abcnotation.org.uk/) /S /URI >> /H /I >> endobj 50 0 obj << /Type /Annot /Subtype /Link /Rect [ 180.0 556.694 302.004 567.49396 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://abcnotation.org.uk/) /S /URI >> /H /I >> endobj 52 0 obj << /Type /Annot /Subtype /Link /Rect [ 66.0 527.894 143.65201 538.694 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 51 0 R /H /I >> endobj 53 0 obj << /Length 54 0 R /Filter /FlateDecode >> stream xœœËwܶÅ÷ú+¸èB^˜ÂãÃ+»8Óæ¤9q«ž.b/Æ£±5'óP5Tlÿ÷(5CPö½=>¶IèâÁï‚äݨüç¥ÎÿDÑmŒ1… \³Ü^ü÷B÷?Ô“Æú!ÉÇVŒSÊ6ZZãšmsžäšMÉsr`ŽGù¿3m>¿mþs±»PÍO¿¿Ëš›Få|Ÿ.Ô3…÷EýëâMnˆµ¾9]ùQ{žä¦Õͤ˜*)ŸŸó|g"QµéØX§\k‚SFFíy’›Ö;“bª¤|~VÌó‰VÕ¦ÇÆ¾9ç’kULð{,ºdÎG¶M“àÕ)½zš$ÇŽñ­ ë ŸbZý`;Ó˜Óë®S†òΓªnúµvÎ4b¦‚ÒàW×W¯]£Msýap¾ëŒ¤Ö[Ÿ’͇­M¾¹Þ6¿_êÍ»æú狯«ž^ÕñxY§4딡çIU_ÿÚ…Î4b¦‚¹dJß鯾¿ÆMJé,:ÚÖ)[Ê6º51(¥ãð‡Ãzù¢¹lòß×ëM·ºsõZW¡T©5)¦Cñ­Îº/⟫?ׇõ~7”ò·õ¡Ûߊ3—É•†ù|½¨™Í[Ó†if“[œ-`’[†l??l¾ ‡F©8^Dî5!_°ê/ø4"¦Ñ9¦9¹U)êzñ~³ÊØ~ØïºÕ®;ŒV¬”dcë’.Í{ì\ícî—Z™ÖE›Ñ6—ÿ>¬wgÒ»ÛÕLê‹§º²"ÄÜäXÕ9)`š/´JÛ*S[U *´¨Ð£Â A…FPh5*Tˆ’”Œ d%#(‡’q(‡’ñ(’ñ(™€’ (™€’ (™ˆ’‰(™ˆ’I(™„’I ™ü$@… £@2åY‰ 5HÆhŒÑ ™òT… cP2%cQ2%cQ2‚’”Œ dJÆ¡dJÆ£d®%¸Y‚›%¸Y‚›%¸ ÁMnBps7Gps7Opó7Opó·@p ·@p‹·Hp‹·DpK·DpK8·² ×âÜʲ~X«qneq?®Å¹•%þ¸çVúãZ‚›%¸Y‚›%¸ ÁMnBps7Gps7Gpó7Opó·@p ·@p‹7Â*±„Wb ³Än‰%ìKø%Bø%Bø%Bø%Bø%Bø%Bø%Bø%Bø%Bø%Bø%Bø%Bø%Bø%Bø%Bø%Bø%Bø%Bø%Bø%Bø%Bø%Bø%Bø%Bø%Bø%Bø%Bø%Bø%Bø%Bø%Bø%ýC)éJûU÷~˜dP3R{«Ne{U~ï¡×\7…é•W¯ýt×™ü)î}•íûÃr½þë~9æ«v«É`ïêúÊV77ëCw¿~ÿÐ=mƳÞ-77«Ãpºþ?Ý4èÕf¿üc8þ0lZÓŸt·‹îxx¿Ø6‹n,h{RÀzwr¥'Ï=i}”fbóËzóå·ýî¦îR›_Ó• ³—÷ûÜÐdµWº’ßvÝÝwWW3œÊºÔÓ_.Ùä¶Üå¶´ûû•>¿•^–|•í]%YÚïŽ4•ö»ÝÏ…(•âMÙØhšçûW?Tm/¿Y§l™…š«¡ Ž6u«‡°,Þ/wû®Ÿê*—Ý>üQ]y¿ÑÁ|mÕ¥W‡µ4éXDZ퇃C·ØÝ,îo†ÓåfqÈi±Î'ÙÖcþãuùa¿Ckäl.pÜj1öâõv»:ÖûÛ¯?«Ø.>Ëþt»^ÞÓÇÛæ¡Ûos£r#ÇMªÖ»Ãê¾K[ïÆëë¾yëçW‹üù¬´Tmþöý_•íÁb¬2÷=í¡»{8Þ¶7ûåÃvµ;ž¾½<¬V§¬CXîÀ“‘nõy±½ÛŒwýûÕfÿiš-¿c—išõí‹™)¨Æä¯UÃæeß/»‡“˜ž >ˆÞ^ŽáHVç›wå×à2¨ªìöê±ÃU?X™»ÝÇöîËó-†§Õ®Œ!“’Þ¾8vÕÅnŒÄpðp»@ýa}óÍa?µý.jºŠÅ·ÑçϤät?ç=»¿–ûÝŸ¹kgOƒí8ÕTÊ3}:üTã|çØÆÊ&wÑ¡Î~ü¼Z>tg½m¸w7¹©åÆn·‹±uOcÄØQoK;ÿaŽù±Ît ÓØüácSzˆÓ_†|Ïõþ‡/_Þ®6wÏc(åZ—;»*ÏŸö³Ûñ}g1}Bo÷7«ãˆøáøøn‹ÂÓúœù±÷'öq4ìVŸº“AkñTê.~ 7ëÝ«êÁ]"’_ýCŽHö›¼Ú¾_ÝÜü_ãd™b/CË´ìoß)y@È/ý â4ó³ƒäq¸úñúâÍÅÿ¿ÞqJ endstream endobj 38 0 obj [ 37 0 R 39 0 R 41 0 R 42 0 R 44 0 R 45 0 R 46 0 R 47 0 R 48 0 R 49 0 R 50 0 R 52 0 R ] endobj 8 0 obj << /Resources 3 0 R /Type /Page /MediaBox [0 0 595 842] /BleedBox [0 0 595 842] /TrimBox [0 0 595 842] /Parent 1 0 R /Annots 38 0 R /Contents 53 0 R >> endobj 54 0 obj 2624 endobj 57 0 obj << /Title (Music Filter) /Parent 56 0 R /Next 59 0 R /A 55 0 R >> endobj 59 0 obj << /Title (Table of Contents) /Parent 56 0 R /Prev 57 0 R /Next 60 0 R /A 58 0 R >> endobj 60 0 obj << /Title /Parent 56 0 R /Prev 59 0 R /Next 61 0 R /A 36 0 R >> endobj 61 0 obj << /Title /Parent 56 0 R /Prev 60 0 R /Next 62 0 R /A 40 0 R >> endobj 62 0 obj << /Title /Parent 56 0 R /Prev 61 0 R /A 43 0 R >> endobj 63 0 obj << /Type /Font /Subtype /Type1 /BaseFont /Helvetica /Encoding /WinAnsiEncoding >> endobj 64 0 obj << /Type /Font /Subtype /Type1 /BaseFont /Times-Roman /Encoding /WinAnsiEncoding >> endobj 65 0 obj << /Type /Font /Subtype /Type1 /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding >> endobj 66 0 obj << /Type /Font /Subtype /Type1 /BaseFont /Courier /Encoding /WinAnsiEncoding >> endobj 67 0 obj << /Type /Font /Subtype /Type1 /BaseFont /Times-Italic /Encoding /WinAnsiEncoding >> endobj 68 0 obj << /Type /Font /Subtype /Type1 /BaseFont /Times-Bold /Encoding /WinAnsiEncoding >> endobj 1 0 obj << /Type /Pages /Count 4 /Kids [8 0 R 10 0 R 17 0 R 28 0 R ] >> endobj 2 0 obj << /Type /Catalog /Pages 1 0 R /Lang (en) /Metadata 7 0 R /PageLabels 9 0 R /Outlines 56 0 R /PageMode /UseOutlines >> endobj 3 0 obj << /Font << /F1 63 0 R /F5 64 0 R /F3 65 0 R /F9 66 0 R /F6 67 0 R /F7 68 0 R >> /ProcSet [ /PDF /ImageB /ImageC /Text ] /XObject << /Im3 20 0 R /Im2 18 0 R /Im1 11 0 R >> /ColorSpace << /DefaultRGB 6 0 R >> >> endobj 9 0 obj << /Nums [0 << /P (1) >> 1 << /P (2) >> 2 << /P (3) >> 3 << /P (4) >> ] >> endobj 36 0 obj << /Type /Action /S /GoTo /D [17 0 R /XYZ 54.0 403.817 null] >> endobj 40 0 obj << /Type /Action /S /GoTo /D [17 0 R /XYZ 54.0 166.15997 null] >> endobj 43 0 obj << /Type /Action /S /GoTo /D [28 0 R /XYZ 54.0 769.889 null] >> endobj 51 0 obj << /Type /Action /S /GoTo /D [10 0 R /XYZ 54.0 769.889 null] >> endobj 55 0 obj << /Type /Action /S /GoTo /D [8 0 R /XYZ 54.0 769.889 null] >> endobj 56 0 obj << /First 57 0 R /Last 62 0 R >> endobj 58 0 obj << /Type /Action /S /GoTo /D [8 0 R /XYZ 54.0 705.23 null] >> endobj xref 0 69 0000000000 65535 f 0000040242 00000 n 0000040321 00000 n 0000040470 00000 n 0000000015 00000 n 0000000110 00000 n 0000002792 00000 n 0000002825 00000 n 0000038746 00000 n 0000040716 00000 n 0000024335 00000 n 0000003692 00000 n 0000023282 00000 n 0000023303 00000 n 0000023323 00000 n 0000023345 00000 n 0000024503 00000 n 0000031803 00000 n 0000024523 00000 n 0000026285 00000 n 0000026306 00000 n 0000029044 00000 n 0000029065 00000 n 0000031762 00000 n 0000029241 00000 n 0000029415 00000 n 0000029591 00000 n 0000031988 00000 n 0000033870 00000 n 0000032009 00000 n 0000033822 00000 n 0000032192 00000 n 0000032377 00000 n 0000032555 00000 n 0000032736 00000 n 0000034055 00000 n 0000040810 00000 n 0000034076 00000 n 0000038642 00000 n 0000034215 00000 n 0000040890 00000 n 0000034361 00000 n 0000034498 00000 n 0000040972 00000 n 0000034638 00000 n 0000034775 00000 n 0000034915 00000 n 0000035089 00000 n 0000035266 00000 n 0000035439 00000 n 0000035622 00000 n 0000041052 00000 n 0000035803 00000 n 0000035942 00000 n 0000038930 00000 n 0000041132 00000 n 0000041211 00000 n 0000038951 00000 n 0000041261 00000 n 0000039036 00000 n 0000039140 00000 n 0000039307 00000 n 0000039454 00000 n 0000039591 00000 n 0000039698 00000 n 0000039807 00000 n 0000039919 00000 n 0000040024 00000 n 0000040134 00000 n trailer << /Size 69 /Root 2 0 R /Info 4 0 R /ID [<14B1F3BA29C90B5CC0C528BE65D076AD> <14B1F3BA29C90B5CC0C528BE65D076AD>] >> startxref 41339 %%EOF asciidoc-8.2.7/doc/source-highlight-filter.pdf0000644000175100017510000031662511033404415021454 0ustar srackhamsrackham%PDF-1.4 %ÐÔÅØ 5 0 obj << /S /GoTo /D (section.1) >> endobj 8 0 obj (Examples) endobj 9 0 obj << /S /GoTo /D (subsection.1.1) >> endobj 12 0 obj (Source code paragraphs) endobj 13 0 obj << /S /GoTo /D (subsection.1.2) >> endobj 16 0 obj (Unnumbered source code listing) endobj 17 0 obj << /S /GoTo /D (subsection.1.3) >> endobj 20 0 obj (Numbered source code listing) endobj 21 0 obj << /S /GoTo /D (section.2) >> endobj 24 0 obj (Installation) endobj 25 0 obj << /S /GoTo /D [26 0 R /FitH ] >> endobj 29 0 obj << /Length 250 /Filter /FlateDecode >> stream xÚ•MoÂ0 @ïù>¶ŒÆnrÝÛ¸Mô†8QÆ*µª†˜ö÷ç¶ Nh;ìÄq¬g¿àÉÝUn¹‚„I½BõêQKˆTb‘ ¨jØf›þó´?ä /”Ý÷õ%znŽï­­ót]5íùpÊwÕÚ€ Ñ€Z À"r`X0c™ÍPè+÷áØ!`EµŽebTò°ïÜvGPÛÛ_ce„¾P‹[ظWG™Ûs’óÀ%)ÃpT ¢(`,Ãì—{ÊFÇ2^-úéh×ÙñÏž¿)‰ iúÑ  P{ `fû˜ˆ4eäšZ¾t ½aæ¯ùÞEm„ endstream endobj 26 0 obj << /Type /Page /Contents 29 0 R /Resources 28 0 R /MediaBox [0 0 595.276 841.89] /Parent 35 0 R >> endobj 27 0 obj << /Type /XObject /Subtype /Image /Width 80 /Height 15 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 211 /Filter /FlateDecode /DecodeParms << /Colors 3 /Columns 80 /BitsPerComponent 8 /Predictor 10 >> >> stream HÇíW;Ã0}T>«™³dÈ2dÉÌiÛ¡*òÇR†H”!ñ±Ÿy2ÅáIq‚–™ÃO¥êÉû8·Ç¢]—À ÎÄàÐ#gFuÛìóÀ—äë²+ÛS½ÙKToYè½µÌ3)ÃV›¦ç¦[Q¥ÞAY›)Ú¢¦~5k¸V0n «‡¶7o]óì¯'N¹RÌ͵‚Õaë‚ßêñ®‹‘8t¥\˜ìð|K#ŸŠ´ÍaÅÙÄL1Fq2‡™ù?‡½Ìa7w<ßž,äíoé/§Í endstream endobj 30 0 obj << /D [26 0 R /XYZ 56.693 815.761 null] >> endobj 33 0 obj << /D [26 0 R /XYZ 56.693 759.068 null] >> endobj 28 0 obj << /Font << /F50 31 0 R /F51 32 0 R /F52 34 0 R >> /XObject << /Im1 27 0 R >> /ProcSet [ /PDF /Text /ImageC ] >> endobj 38 0 obj << /Length 489 /Filter /FlateDecode >> stream xÚÅ•QOÛ0Çßó)ü˜mñîÈ£I„Å´_0H0ØdM;5es÷xu]í±ÇòðnºèÏn¾ÍõyÈãÙüáú¾ºlÇ $(¶º$@úf’÷9›u3‹º-¾¤+ACÆ ˆJ†D Èæê¶¸¸D3ÕocƒàR4?žfÞOlEûsÓŸ \ìæKT*øQÒ*Ê.£Á3ÿF .™àùM £“9-¼E–B¢ëÑ‘r'õù¨jB,GM[9,Ï&•æãËßLƒ}ÃzzQQ‚ßLøg`@X$ü?Oéeİuz—‰z™åÁ'—³{úùä žôÓH>9D—ôpÊKÙ÷‡ö+b,Ûº¯ÎzL½•AÔ-'5äŠ|ÝNFÛÎÖ=q'\D»K+³[ ùþI½áÜl-Û³+ ãNŽÝÑ9V¢×ÖnÞˆõzñÉz稈 ê$ุÖ#0„õŽDW¨åá…®Ë7à¸RÓ>Îæ#ÆõþÝ~-=î‚xöÔ.ŒlˆŽàÛÅSo@<—ÜÕ¶WÎöëçkªù/˜ØËŽ endstream endobj 37 0 obj << /Type /Page /Contents 38 0 R /Resources 36 0 R /MediaBox [0 0 595.276 841.89] /Parent 35 0 R >> endobj 39 0 obj << /D [37 0 R /XYZ 56.693 815.761 null] >> endobj 36 0 obj << /Font << /F50 31 0 R /F51 32 0 R /F52 34 0 R >> /ProcSet [ /PDF /Text ] >> endobj 47 0 obj << /Length 410 /Filter /FlateDecode >> stream xÚí•MOƒ@†ïüŠ9¶Æ™ý‚¹jü<˜¨xjzÀ‘„ÒJ1úó] 5mýJŒÑÄx ,ìî¼ïÎ39ûI°wd Å)É-8….‚˜"Ô¢!™Âhp5¨'Ù0T–ói?:)ò»Ò_M÷xT”MVÇÉ™Èû€N·d!3е]Ä¢(Ú•ÁaÜì0X‡ÎKFÂèHÁdŒÆS?w„Fbx\­œeB¥—p\´u¬P˜m«¾jZïb¥~0¯š¬j–+ v÷&.ÛñFBB-HÆt›y2 ŸÒÙ¢ÌÖA:`É¢ò§¤õâw%6s!ÔÌ>IŠîÓθÒò¹Ý0y°Hë4¯ÓÅÝŽ‡‘÷pZoóÜŒÈï©ïd—s/d»·¯ ·ŸÍ6LÕü®ª‡ÙMVgÓãòM¸e±lŠ*ßÕŽô?½ŸÅ¦{lç_‡&ñÿŸ÷ ìÔ'ìvê¶ß„â«v¨"Œ¥o<ª¯Þ§Õ²IË2mŠyõa×[³oõ+CHN¾Ò®žϲŠt endstream endobj 46 0 obj << /Type /Page /Contents 47 0 R /Resources 45 0 R /MediaBox [0 0 595.276 841.89] /Parent 35 0 R /Annots [ 40 0 R 41 0 R 42 0 R 43 0 R 44 0 R ] >> endobj 40 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [55.697 704.453 114.147 715.332] /Subtype /Link /A << /S /GoTo /D (section.1) >> >> endobj 41 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [70.641 686.386 190.71 697.29] /Subtype /Link /A << /S /GoTo /D (subsection.1.1) >> >> endobj 42 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [70.641 668.453 224.761 679.357] /Subtype /Link /A << /S /GoTo /D (subsection.1.2) >> >> endobj 43 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [70.641 650.52 214.799 661.424] /Subtype /Link /A << /S /GoTo /D (subsection.1.3) >> >> endobj 44 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [55.697 624.662 121.35 633.638] /Subtype /Link /A << /S /GoTo /D (section.2) >> >> endobj 48 0 obj << /D [46 0 R /XYZ 56.693 815.761 null] >> endobj 45 0 obj << /Font << /F50 31 0 R /F51 32 0 R /F52 34 0 R /F58 49 0 R >> /ProcSet [ /PDF /Text ] >> endobj 53 0 obj << /Length 2369 /Filter /FlateDecode >> stream xÚíkÛ6òûþ 5ý°^\Ìò)йÐÞ¥MÚ»M¶è‡íâ ÛòZXYr%ù£í¿¡(9ÖËJÙ¶@Ôc8Λ£q°óà`ç««/n¯>ûR`G!åR×¹]:.E®t<,S̹]8w“·É67S*ðäŸÉ¢¼z>¬"ø—›Û/Ã(Ò›ûÛ¯!q<@è2{€ÑãΔ¤„0( L’Þä330=íêåíÕOWÈÂq„‹\X_*‚\Lùúêî; x÷µƒWžó®€\;‚`D™ בóöê»+Ü»µ 'Wˆ`×r» ÍŠ@‰„Ô¤0Ÿgó0üW2/7wˆ’y@ÞpfyÎn(žló0‰awXMÂxmA¦ï¼‰ofOáznx /³]œûïÍÓÕáöGŒiÁáðG,pI7; ‡Rà»`=f‘éÓtY Í“xÙ±â‚Ð%­fÃÁrʼ.‰Øf° -+-"ÍþG§ºúæÊ¹+`¾úö{ âL¹  (Y|“¤›``.ŸäÉ Œâúñ«ÛÿüÛ¼H¶ùf›g½™rJ& ™/’ä±öÊÌðÓ )X˜7³y‘'I4_ùa\ÎÈW~^NñµÿwCÄ$èà4§.‚=•¬Ú¤ÉCê¯#?t°vZÂ^”ºDÁ:ˆKûYÕÍ)Ûn6Iš?7wË$5¦ç½¿ÞDj+´Þʽ:Î"?ô6ÞwDÁ Ø^uQMÕX3IW .¸#Á5xJ4M’˜$˜'€x{“4¦HœB‰ËU0z•)†›÷ëúóz©]†”6)*C2ÌàAy%¯¶ùñÃÖ:` ¾çƒŸçÀj`reÆYoågf½YÄæQäæ‘6Æm¦_Üú7dwD(0N¨½Wi­ô2ÖOžì:ÈÑ*¼ßO¡°Ö2MÖ †Ì“õÚ@Ä4 ã@[±y±ÓË$[s³Hâë¼ÚšÑtª5½x© °Øá&˜‡Ëy–àalÌ›J‰0oøõÀŸ¯ŒOß;8¸.\[À•ÂðˆÚn¿Ò ˆBÒU—èXÝíSà6R„ˆ¿ïRD€¼ @ ÇC0Æ“—Æ´²ÚKƒ#)”[j$ƒ-{%"ÔJM½Ë66~ *‚'à16«¬Ã2aÊs[!ŠÕC”òhÝÓw(&öA/],[:™|•Ñü]EŽÈ7Ccf²,1¤z‡/l HÎʧù* ز†y AšzhxÁ½ DÆ]­ú¹ .¢„; dO9ià,T Ží’§íe¹@̓ղf9¢¡O¬ÚÊd˜ª¬åR\.RTÙ“U³ ªð/üÀH‡ŒF–FrWj¶þ›>8æâÖñ…;ÐüÉóþ ›]¾Jâæ„ûñwSÞ©Œ#N½1¤SÇ4P:¶d}¿MöË‹I$Ié}Ãe#Š·å0uÁ75ÅP<üÛM1à½2,ÞoÒ0λæ_÷ËþUEÉy¤ý¤Ñ¢©%Ÿ\SÊ7Ñd¨šÔ1 T[²†y4ŒXŒÀ‹¢¬°$ê´;#É*T÷kv-?<Ô¼SÆÐvjÖJŠ FLÓ@ÉØ’5HI¹ÂH(:3˜†1Ú¬“zÊCžgu‡Q.rƒ×uLymK–EÕ%*EÉŸAô˜š¸&1AMꘪ‰-YÃü“0Y×̨cÈ [²Nû'— ŒÙøÇ‚t;Û]o׳ #»@îÂé~ŒS^Ó@qÚ’uZœµ›SâÌÓíÂ,|ÏÒ²v„BýkÌwó¨5A—ÔîðsãMI9ÒrdåÈï‹âÖQrI—›ý¥ŸÿÂýΚð¿ SEfÖT±Ži *Ú’uI4–¢„ÂZ a¯<ÒÅü >ûôç dxDýÂXW9›Áxò«Q±¿ÿÃŒÇV›°Ú³3Ë`œQäa5¤ Ö{?“qB %•F o‚x¤UE/Ì¥BýY¥«xnuÃ)CQñÔÕ=ù<(߯ÖÀ4ÌØ¬É:46R©9šú2Å죤¾uzS_€@b¿Pqù¦•íNŽ;@ÏZ³>÷®ûÉy`×GJ]öÀ<‰””#šù)Kaúäåuær„Ý1¯¦hK–êîÕW©? ð÷b€ú¼#½'4@î!ò “ˆŒc€uL Ж¬fVÃa&1mHç4›1⚪Ϫ¬’Px¿o ¹ë5¥G£NËûíŽFäüÑŽFŒ‚Mà1>ã40 ÔU[²Nê*Uˆ«² €ö°º¡¾ŒAÞ°ï hžŽzÝgç¹ÒýQèœ:¬ëàÔ üëXŽ#a:—k³ß7×ìÙ¥¡”2D阑´Ùéó¡5§´o깈¹ûÚÙ ó}ë.œª ¸oZênÚéoí«ºuDÕ­SŽ[­ŽÅÓª³:2Ï¢dþxî9™ Š0ê$rH†¼1>M60 s¼Ödõ—G]`¯Ôdjª?F e2Ç1¾ß50 ”Ž-Y§¥AŽ—ë¦cüÆ~¢ Uã»XÓ@öÛ’ušýT§È%ÿ¯¯¯ç€ŸŸw ]o£W§ïu> endobj 50 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [544.354 745.953 567.925 756.857] /Subtype/Link/A<> >> endobj 57 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [55.697 733.997 122.994 744.901] /Subtype/Link/A<> >> endobj 54 0 obj << /D [52 0 R /XYZ 56.693 815.761 null] >> endobj 6 0 obj << /D [52 0 R /XYZ 56.693 646.564 null] >> endobj 59 0 obj << /D [52 0 R /XYZ 56.693 607.411 null] >> endobj 10 0 obj << /D [52 0 R /XYZ 56.693 607.411 null] >> endobj 60 0 obj << /D [52 0 R /XYZ 56.693 580.057 null] >> endobj 61 0 obj << /D [52 0 R /XYZ 56.693 558.174 null] >> endobj 62 0 obj << /D [52 0 R /XYZ 56.693 559.633 null] >> endobj 63 0 obj << /D [52 0 R /XYZ 56.693 548.674 null] >> endobj 64 0 obj << /D [52 0 R /XYZ 56.693 537.715 null] >> endobj 65 0 obj << /D [52 0 R /XYZ 56.693 526.757 null] >> endobj 66 0 obj << /D [52 0 R /XYZ 56.693 515.798 null] >> endobj 67 0 obj << /D [52 0 R /XYZ 56.693 504.839 null] >> endobj 68 0 obj << /D [52 0 R /XYZ 56.693 493.88 null] >> endobj 69 0 obj << /D [52 0 R /XYZ 56.693 482.921 null] >> endobj 70 0 obj << /D [52 0 R /XYZ 56.693 471.962 null] >> endobj 71 0 obj << /D [52 0 R /XYZ 56.693 461.003 null] >> endobj 72 0 obj << /D [52 0 R /XYZ 56.693 450.044 null] >> endobj 73 0 obj << /D [52 0 R /XYZ 56.693 403.753 null] >> endobj 74 0 obj << /D [52 0 R /XYZ 56.693 405.212 null] >> endobj 75 0 obj << /D [52 0 R /XYZ 56.693 376.022 null] >> endobj 76 0 obj << /D [52 0 R /XYZ 56.693 378.313 null] >> endobj 77 0 obj << /D [52 0 R /XYZ 56.693 349.123 null] >> endobj 78 0 obj << /D [52 0 R /XYZ 56.693 351.414 null] >> endobj 79 0 obj << /D [52 0 R /XYZ 56.693 340.455 null] >> endobj 14 0 obj << /D [52 0 R /XYZ 56.693 303.305 null] >> endobj 80 0 obj << /D [52 0 R /XYZ 56.693 275.751 null] >> endobj 81 0 obj << /D [52 0 R /XYZ 56.693 253.869 null] >> endobj 82 0 obj << /D [52 0 R /XYZ 56.693 255.328 null] >> endobj 83 0 obj << /D [52 0 R /XYZ 56.693 244.369 null] >> endobj 84 0 obj << /D [52 0 R /XYZ 56.693 233.41 null] >> endobj 85 0 obj << /D [52 0 R /XYZ 56.693 222.451 null] >> endobj 86 0 obj << /D [52 0 R /XYZ 56.693 211.492 null] >> endobj 87 0 obj << /D [52 0 R /XYZ 56.693 200.534 null] >> endobj 88 0 obj << /D [52 0 R /XYZ 56.693 189.575 null] >> endobj 89 0 obj << /D [52 0 R /XYZ 56.693 178.616 null] >> endobj 90 0 obj << /D [52 0 R /XYZ 56.693 167.657 null] >> endobj 91 0 obj << /D [52 0 R /XYZ 56.693 156.698 null] >> endobj 92 0 obj << /D [52 0 R /XYZ 56.693 145.739 null] >> endobj 93 0 obj << /D [52 0 R /XYZ 56.693 134.78 null] >> endobj 51 0 obj << /Font << /F50 31 0 R /F51 32 0 R /F92 55 0 R /F93 56 0 R /F52 34 0 R /F94 58 0 R >> /ProcSet [ /PDF /Text ] >> endobj 96 0 obj << /Length 2582 /Filter /FlateDecode >> stream xÚå]moÛÈþî_A\ZœƒÄ{û¾ÜW -’kE&î§œaÈm 'K>QBbôúß»ÔR>ï’É™ Êòòápæ™ÙÙáM³›Œf?üõü䇷Šf–XÍuv~iN´Érjˆ°";ŸeO?¬w›iñüŒ+zú·õ¬þô÷ÅÍ|éþoýoËm±y~qþ³dYeîs™1F¬R’»“L~úƒ?ˆê´“7ç'¿0'ÍX¦4ÑîúÆ2¢)Ϧ·'/h6s¿û9£DÚ<û´y›)F Ú}^fNþuBë[£îjÕÇêðÓcdA •™‘–0ª+äê{Å4áLfœØÜf›"»î„ómó²"'LšÃeýåX5ºçªMÕ„H5ŒÅÒÄr ëá[÷…rŸ6Õþãûš^NÖ=dņƒð’)j2|¿7ÿq¤´Ãú@Î4¥§¯SÝî–ÛÅ0áφ [.VE8rCÿªéÈ ayž‚Ž!’ŽP±0Öj’Õä.&pç.âíÉ:]ßÞ«í0;‘'gvs”U@t¦HÀŒ É ¨XÔæà¼Ò܇£AŠY¢˜ñvŸ×±ú”x{¹»ºü´ÞÌ‚Ñàªhý]óÌÓÛuËxöÊ 5!U„'™j ¤B}Ϧ9Q*ÿ¦§¡‹ÕͲH…Öœ9àXÿ/¡P[Ic )BÂyX¬îÖé(Ú¢¬õŽÒÝö|ø±3¼ù4¨âHw<¼Ù¬wwÇB(Š;X‡åýwì 6;ˆ}ÕüÓ€ NÏ´‘•ß­ @iu\¨sä‚ÅS8Gˆ„t¨Xcò„ƒsäî¤÷ÅÀ,¡Ñõê‘‹Õ0Ä_‹û ´Œ û±ÛÉ–“ÕÍnrSħ\àòmø¾x€!’P±ÆPÂZb„£„QDçÌsbSlw›Vüm·ÞmÁõÅñàÚ“{Nk^ltíWô Œ"! ´$†soôbY6ü éVÊ/Ch8DBj*Ä­*Uh1Þ­šá¶_ÝÒ™L°ãè‹®¼R’QV?ZqjÆ ­o;4«rˆîn¯ŠM1ó¥Ór½Û<çnJ/üÏS_ŸuŸ–‹rë–uEöq‰—fgÜÝ£­ÃÓù|Qún¹/ôžÍÃÊî/”òª¶»¿¤ûùj¹žþÚFå6-*ç¹zê*«Ò†ä6EÆ!á\,VÀœÀ1´#ŒqbF˜©óó#3¾·p—^vŸ°Ù]ݾ:3Î(P‘O9cX‘"nj愊ÕoNíäª'’³ÿpê—ŠX“"Ÿ‹ê‡ŠÕ¯~i ×ux|†ÓP„ºˆ—@w!RwP±úu'r"(t×5+ÿ»,®wËa3øû8u޼š”Ű‘Óå¤,‡ ->o‹U¹X¯ÊŽ"”\ªR¤Í’P±úùÁ R$ñ-&µ)â ©;¨X¸”‡rÂDŠ'yRP±Æ)Ô¢ŠH^?TáÛ¯7›É}’E°´> Ã!BÂ,Š‘2ß'1 t!Uª;®NrQ )ˆ¢fм÷æs1ÝmNR“³^µ*6ôÎyF½2ì¼ØœK×›MQÞ­W³ÐÅí@‹ PÿÔ>±KÀÉ IJ¨Xý¬tG—ÍXÙS<-‹åuœßôT'«‘uÇÓõv^l.' [] —LIåsÏæ ‘æ…ŠÕo^͈²ƒbλ¡Ûb tŽœO:ï²:ˆÛùd`í¯‹oè·(ꦸ+&ÛfQIvééd‘d‡Š…Ë5„&"O±ÌŽÊ€Š5ê} „%Úð‘»•¦÷Óe1n«Ò‘ø½8~ÆøþQ÷ÿU7Îý¢X6W¾:ƪ1¼ùÈÿ'‚ýŽûUFª…HHªAÅCµ*ǵÜ]+'†Õkø#t8²¿£˜Lç—ŸÛùåb5+>#ëlÝ–jüÞ}[šâ¸s~ÇEj&‰Ô)ê’1P±Æ0¦Ú£¤c˜!FÕ{$öŽ?.æ´%¦Gs´qoÝ?7~ÛeŽxY¬n¶óÆ³Ž—ãCØÃ®"0Ǩ_~&àXˆ„äT,HT¢š[—ŠÕ,I´Ö/ ðzpz‹H,„Uî¨ë5߯\¨5Bj(*u†-RÔ$"$¤. b ·ÂbYž˜aÊçà ô"!õ  G2é3¶Ê‘Ê€Š!™rGÊÆmÓümÝèܳÓùòòí»¼¹¼LÃcáS§¦ ‘¦ƒŠÕ[Ô’*‡=A~ݶìè>§e¹Û]`*Ê4;¤÷yI†HHBÅê7  „æb·›]ëv×ÿâë• æS—ª‘ª‡ŠÕ¯zf ãrê¯'Í-ªîq+A%ÉMŠI„„Ô=T¬~ÝÓœ0­’О£Tϭϧðªpª‹Õ«zn áT§¡½Àé>w÷•"â„@HÍ…êW|® —& ç%NïÆ§w "!5 °PçFž×˨»Ý¶lÓö÷ÝÉÑS&S´ÖAí­}–˜ÀÞ!ÒÞP±ú]MK"xÿï7ë«y·…ÄÓ 2Æòu÷#}Yçõ‘×GQåÅ¥ÎdeþÉÈû½J[ßçÊç» ¨"!© P{åNÂ<ß=ûÏ’cÕýò®˜6âÉŸÓɱ«]%¸Úw8Ο¨'àLˆ„ä T,Èt%9‘Œ§­úqî“ðz ‘z…Š(tqÁˆT"±^™Ï°è5DBê*Vï>uΫ׌É/ÛƒÓ®iIÜm%ì;l¾ä­6³’HYßã{G•bSwnzší壷ÁU݆C;Y®Âþ„§idF&jˆpÄ‹Uº3™ÑžãMu¿f¿åÈ÷v¼©"¢<ãû€AÃe.`0-)Ê?RïP±zõî.ðÐ|Àñz¼Ö£¥ €Òh´`4Z° /)i4p@:Ú¶ÚÆÇo(‚ò^qÂLŠÚ[„„ä=T¬^Þ+µßE´§°øŠñF27Ÿ¤ØQ!!õ«WïîðÐo‚+1áî0É !ªWo­Xe]$S˾ðGùúU:˳D$)oFHH+AÅê5çDåuµKãèMs"’T #$¤ê bõªŽ1rxGŠýª²ˆú\¸ð•.Eië|ÀLÐ J£[ÒÖG€‰ÚM@ïsë꽉÷à@@ÒôëY“¨«#Â9.T¨^¿¥”hSoPÊ¿1Ç}ÑŸ?76O·Žzöý¨¢õen¦««¡ýžÒ,r¨±$±*TÛsKÌ¡øk¿1²¿»Æ" ð…^Œ¸¿Ñè¼üZóA£[€1Ü%Ÿ`Ê] UÒÚú F%jB oW¸¤–舑¶z%£9<aá&Þ¶¿3")¡ÚBþÌÈÿ÷x°y endstream endobj 95 0 obj << /Type /Page /Contents 96 0 R /Resources 94 0 R /MediaBox [0 0 595.276 841.89] /Parent 35 0 R >> endobj 97 0 obj << /D [95 0 R /XYZ 56.693 815.761 null] >> endobj 98 0 obj << /D [95 0 R /XYZ 56.693 759.068 null] >> endobj 99 0 obj << /D [95 0 R /XYZ 56.693 752.393 null] >> endobj 100 0 obj << /D [95 0 R /XYZ 56.693 741.435 null] >> endobj 101 0 obj << /D [95 0 R /XYZ 56.693 730.476 null] >> endobj 102 0 obj << /D [95 0 R /XYZ 56.693 719.517 null] >> endobj 103 0 obj << /D [95 0 R /XYZ 56.693 708.558 null] >> endobj 104 0 obj << /D [95 0 R /XYZ 56.693 697.599 null] >> endobj 105 0 obj << /D [95 0 R /XYZ 56.693 686.64 null] >> endobj 106 0 obj << /D [95 0 R /XYZ 56.693 675.681 null] >> endobj 107 0 obj << /D [95 0 R /XYZ 56.693 664.722 null] >> endobj 18 0 obj << /D [95 0 R /XYZ 56.693 628.393 null] >> endobj 108 0 obj << /D [95 0 R /XYZ 56.693 601.413 null] >> endobj 109 0 obj << /D [95 0 R /XYZ 56.693 580.678 null] >> endobj 110 0 obj << /D [95 0 R /XYZ 56.693 582.138 null] >> endobj 111 0 obj << /D [95 0 R /XYZ 56.693 571.179 null] >> endobj 112 0 obj << /D [95 0 R /XYZ 56.693 560.22 null] >> endobj 113 0 obj << /D [95 0 R /XYZ 56.693 549.261 null] >> endobj 114 0 obj << /D [95 0 R /XYZ 56.693 538.302 null] >> endobj 115 0 obj << /D [95 0 R /XYZ 56.693 527.343 null] >> endobj 116 0 obj << /D [95 0 R /XYZ 56.693 516.384 null] >> endobj 117 0 obj << /D [95 0 R /XYZ 56.693 505.425 null] >> endobj 118 0 obj << /D [95 0 R /XYZ 56.693 494.466 null] >> endobj 119 0 obj << /D [95 0 R /XYZ 56.693 483.507 null] >> endobj 120 0 obj << /D [95 0 R /XYZ 56.693 472.549 null] >> endobj 121 0 obj << /D [95 0 R /XYZ 56.693 461.59 null] >> endobj 122 0 obj << /D [95 0 R /XYZ 56.693 450.631 null] >> endobj 123 0 obj << /D [95 0 R /XYZ 56.693 439.672 null] >> endobj 124 0 obj << /D [95 0 R /XYZ 56.693 428.713 null] >> endobj 125 0 obj << /D [95 0 R /XYZ 56.693 417.754 null] >> endobj 126 0 obj << /D [95 0 R /XYZ 56.693 406.795 null] >> endobj 127 0 obj << /D [95 0 R /XYZ 56.693 395.836 null] >> endobj 128 0 obj << /D [95 0 R /XYZ 56.693 384.877 null] >> endobj 129 0 obj << /D [95 0 R /XYZ 56.693 373.918 null] >> endobj 130 0 obj << /D [95 0 R /XYZ 56.693 362.96 null] >> endobj 131 0 obj << /D [95 0 R /XYZ 56.693 352.001 null] >> endobj 132 0 obj << /D [95 0 R /XYZ 56.693 341.042 null] >> endobj 133 0 obj << /D [95 0 R /XYZ 56.693 330.083 null] >> endobj 134 0 obj << /D [95 0 R /XYZ 56.693 319.124 null] >> endobj 135 0 obj << /D [95 0 R /XYZ 56.693 308.165 null] >> endobj 136 0 obj << /D [95 0 R /XYZ 56.693 297.206 null] >> endobj 137 0 obj << /D [95 0 R /XYZ 56.693 286.247 null] >> endobj 138 0 obj << /D [95 0 R /XYZ 56.693 275.288 null] >> endobj 139 0 obj << /D [95 0 R /XYZ 56.693 264.329 null] >> endobj 140 0 obj << /D [95 0 R /XYZ 56.693 253.37 null] >> endobj 141 0 obj << /D [95 0 R /XYZ 56.693 242.412 null] >> endobj 142 0 obj << /D [95 0 R /XYZ 56.693 231.453 null] >> endobj 143 0 obj << /D [95 0 R /XYZ 56.693 186.883 null] >> endobj 144 0 obj << /D [95 0 R /XYZ 56.693 188.342 null] >> endobj 145 0 obj << /D [95 0 R /XYZ 56.693 177.384 null] >> endobj 146 0 obj << /D [95 0 R /XYZ 56.693 166.425 null] >> endobj 147 0 obj << /D [95 0 R /XYZ 56.693 155.466 null] >> endobj 148 0 obj << /D [95 0 R /XYZ 56.693 144.507 null] >> endobj 149 0 obj << /D [95 0 R /XYZ 56.693 133.548 null] >> endobj 150 0 obj << /D [95 0 R /XYZ 56.693 122.589 null] >> endobj 151 0 obj << /D [95 0 R /XYZ 56.693 111.63 null] >> endobj 152 0 obj << /D [95 0 R /XYZ 56.693 100.671 null] >> endobj 153 0 obj << /D [95 0 R /XYZ 56.693 89.712 null] >> endobj 94 0 obj << /Font << /F50 31 0 R /F51 32 0 R /F93 56 0 R /F52 34 0 R >> /ProcSet [ /PDF /Text ] >> endobj 157 0 obj << /Length 1750 /Filter /FlateDecode >> stream xÚí[]oÛ6}÷¯Ún•š!)’¢ t@»µiºnÀVï) Å–m¡ŽÕJr›`Û)ÒŽ)Ë–"Xúˆ–xÏ=¼<üf 7÷ w:x5œ¼¡Ð‹@Ä0óÆ3aÀBÃQà§Þ¹ÿ![ç“d8Âú?gSz›ÎKñWªŸoÒe™äËñ;ˆ<.Y  ˆœx#„@D©‚ „QÈýõ¤Ùàõxðe€-è!2À„ÿ0B€AìM®çЛŠoï<HĽoUÎk"pÀDzé}ü1€ºhPx“Iù8=ðvÇ_BH¼PÀ—þä{ "yH掼<ñfñ÷™›H–÷Åb ÂQZ°VÏDX"U-„D"GA¦j¡ª"”ï|®Iüy*lE‰ª*%ÒÓ*XPYM“™6Ó *;m¥¹w>bú“ÛÉ21² ë­׺™Ÿ•‹$¿Œó<¾m0TtÑÆm 7¹ö¿& * ´{"Ȳ¯Ë¢¾è¡JÞÕÓÓNYV‰³>î–mµØœµS)öW‡Ü>u£ËP-éèÒD²Ôe_Zíº EÁ™ÞßẒsD„ç‡ûöú'ãL·qÿi¸”qGŽîÞ 9‡Ï†j®ŸX?ý$w‡uÎŽ±ã{ža_¹=¿¦Tí 8P«‰d©Ö¾´ÚÕÊ0àp3ùã}nEܯ}Ô±kü»[¾¸[6Ð-[º*>'“Žýã¿®ºäÚ©kÔ®vÔD¶Gn¢6d4gɲ9÷¥ÕÞœ)œèóýŸ'Ò4Pbo"Yƾ/­öØ8×»Êt¨ÚeØÎæ]ªNÅ9ôTÅÄž¼·‚•\uu±Z áfMWßýÐÙª(ãå2.Ól¥ï$ï^r†Þ‹„ãl6aÆüÛl-Ôÿ6DÐW¥z]fêYÜ®ÊøFåXlo?«éÞAGX OávxzYLÒô—lÒÀ#ˆbÑ&ãÛñoï•§l]VƒZåJ³bþ*I¦»Œ¨ìød1uTÍ|ò6©_e8döÓßÿRù‹ê&÷È ¿;™YN½®³B—}šež^ 1ô×2˜šÓ"–o¾õMi‘Vƒ°7BL,¹ 6/|Ž'Ÿây"'l`8¢!öÏʧC*( GAÀýUVÊDèçÉ—ušË‚Ê×éL½­b qž¨/ód•ä¢~WsõAøU–}RUüÔYãã¦åÇm$¶8©&´ˆWÓ¥¢úW·êe¹HLo²ÀP—TŸ–Y¶œ,ât¥ÊºÉ‚(ÐkÅñ0„~Rè‹ó¦L|„Wwè«_Ò¥|N„€É&Ô¹âi˜•[¤ `ó6Ó·ô•¦DJ^m+F í"VèÝÕÁçµaT=«ÎåÎD8¦€c.!à‘ŽÐ5}¥«©pUý}UOp2«þ“ 8©‹u¤>ŒdAySÁ§ôL(h–ÝÜ qQ^/•ÁFÑšþ-È{1QŸÿJøüÇZÒ endstream endobj 156 0 obj << /Type /Page /Contents 157 0 R /Resources 155 0 R /MediaBox [0 0 595.276 841.89] /Parent 35 0 R /Annots [ 154 0 R ] >> endobj 154 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [360.643 460.577 452.165 471.481] /Subtype/Link/A<> >> endobj 158 0 obj << /D [156 0 R /XYZ 56.693 815.761 null] >> endobj 159 0 obj << /D [156 0 R /XYZ 56.693 760.065 null] >> endobj 160 0 obj << /D [156 0 R /XYZ 56.693 749.106 null] >> endobj 161 0 obj << /D [156 0 R /XYZ 56.693 738.147 null] >> endobj 162 0 obj << /D [156 0 R /XYZ 56.693 727.188 null] >> endobj 163 0 obj << /D [156 0 R /XYZ 56.693 716.229 null] >> endobj 164 0 obj << /D [156 0 R /XYZ 56.693 705.27 null] >> endobj 165 0 obj << /D [156 0 R /XYZ 56.693 694.311 null] >> endobj 166 0 obj << /D [156 0 R /XYZ 56.693 683.352 null] >> endobj 167 0 obj << /D [156 0 R /XYZ 56.693 672.393 null] >> endobj 168 0 obj << /D [156 0 R /XYZ 56.693 661.435 null] >> endobj 169 0 obj << /D [156 0 R /XYZ 56.693 650.476 null] >> endobj 170 0 obj << /D [156 0 R /XYZ 56.693 639.517 null] >> endobj 171 0 obj << /D [156 0 R /XYZ 56.693 628.558 null] >> endobj 172 0 obj << /D [156 0 R /XYZ 56.693 617.599 null] >> endobj 173 0 obj << /D [156 0 R /XYZ 56.693 606.64 null] >> endobj 174 0 obj << /D [156 0 R /XYZ 56.693 595.681 null] >> endobj 175 0 obj << /D [156 0 R /XYZ 56.693 584.722 null] >> endobj 176 0 obj << /D [156 0 R /XYZ 56.693 573.763 null] >> endobj 177 0 obj << /D [156 0 R /XYZ 56.693 562.804 null] >> endobj 178 0 obj << /D [156 0 R /XYZ 56.693 551.845 null] >> endobj 22 0 obj << /D [156 0 R /XYZ 56.693 513.623 null] >> endobj 179 0 obj << /D [156 0 R /XYZ 56.693 477.458 null] >> endobj 155 0 obj << /Font << /F50 31 0 R /F51 32 0 R /F93 56 0 R /F52 34 0 R /F92 55 0 R >> /ProcSet [ /PDF /Text ] >> endobj 181 0 obj [667 667 722 722 667 611 778 722 278 500 667 556 833 722 778 667 778 722 667 611 722 667 944 667 667 611 278 278 278 469 556 222 556 556 500 556 556 278 556 556 222 222 500 222 833 556 556 556 556 333 500 278 556 500 722 500 500] endobj 182 0 obj [600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600] endobj 183 0 obj [611 611 667 722 611 611 722 722 333 444 667 556 833 667 722 611 722 611 500 556 722 611 833 611 556 556 389 278 389 422 500 333 500 500 444 500 444 278 500 500 278 278 444 278 722 500 500 500 500 389 389 278 500 444 667 444] endobj 184 0 obj [500 500 500 500 500 500 500 500 500 333 333 570 570 570 500 930 722 667 722 722 667 611 778 778 389 500 778 667 944 722 778 611 778 722 556 667 722 722 1000 722 722 667 333 278 333 581 500 333 500 556 444 556 444 333 500 556 278 333 556 278 833 556 500 556 556 444 389 333 556 500 722 500] endobj 185 0 obj [278 278 556 556 556 556 556 556 556 556 556 556 333 333 584 584 584 611 975 722 722 722 722 667 611 778 722 278 556 722 611 833 722 778 667 778 722 667 611 722 667 944 667 667 611 333 278 333 584 556 278 556 611 556 611 556 333 611 611 278 278 556 278 889 611 611 611 611 389 556 333 611 556 778 556] endobj 186 0 obj [222 333 333 389 584 278 333 278 278 556 556 556 556 556 556 556 556 556 556 278 278 584 584 584 556 1015 667 667 722 722 667 611 778 722 278 500 667 556 833 722 778 667 778 722 667 611 722 667 944 667 667 611 278 278 278 469 556 222 556 556 500 556 556 278 556 556 222 222 500 222 833 556 556 556 556 333 500 278 556 500 722 500 500] endobj 187 0 obj [556 556 167 333 611 278 333 333 0 333 564 0 611 444 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 180 250 333 408 500 500 833 778 333 333 333 500 564 250 333 250 278 500 500 500 500 500 500 500 500 500 500 278 278 564 564 564 444 921 722 667 667 722 611 556 722 722 333 389 722 611 889 722 722 556 722 667 556 611 722 722 944 722 722 611 333 278 333 469 500 333 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500] endobj 188 0 obj << /Length1 1612 /Length2 15155 /Length3 0 /Length 15983 /Filter /FlateDecode >> stream xÚ­·ctåßÒ.ÛvVØÛIǶmkŶmÛéØIǶ­Ž;¶Ûÿ½Ï9ïûžûåÜ÷Ãã7«j>õT=5çX“‚DA™NÐÄÎÈTÌèLÇDÏÈ ³´5rq’µÊÐ)™š»þÙà((„M -í€"†Î¦ÜuS€ˆ©1€™ÀÄÅÅG¶³÷p´4·p|WUR§¢¡¡ý/Ë?!#ÿéù»ÓÉÒ üûájjcgok tþ ñ½QÙÔàla 0³´1Ë+hJʉ¾‹Ë©ÄM¦Ž†6#Kc€Œ¥±)ÐÉ” `fç°ù÷`l4±ü§4'ú¿X‚NC€“½©±åßm¦îƦöÿ¸hö¦Ž¶–NN¿–NsGC óß8Û,Æ6.&ÿøk7³û!{G»¿¶}Á윜Œ-í³*ˆˆý›§³…¡ó?¹,ÿºvf#MìŒ]þ)é_¾¿0½Î†–@'€³©»ó?¹ŒL&–Nö6†sÿ³w´ü 'K ù1 8šš:šØ˜:9ý…ù‹ýOwþ«NÀÿV½¡½½Ç¿vÛý+êq°tv2µ1£‡cbþ›ÓØùonsK Ã?ƒ" 4³01þÛnâbÿ?}®¦ŽÿjÐ÷f†ê/ C; ÀÄÔ ŽAÎÎùoJÀ÷ÿ;•éÿûDþoø¿Eàÿyÿÿ‰ûŸýo‡øÿïyþOh19CÛ¿ðï ð÷†±Èþ¹cl ÿ_ᆶ–6ÿ‡ ÿ¨núo’ÿ8’Ά›!4ÿ+#=ã¿–Nb–î¦& –ÎÆ3C›¿ú—]hbêhc 4ý«è¿š  cbdüŸŠ…¥±5ðŸÖ³ýÛe 4ùOòEúueY)Mšÿ¼Sÿ¥ðW{gû¿ÄþG)²v&ÿkñ†;À‹îï ¤cfá°ÿMÈÉÄäóÈö/¦ÿZË:;Zº´ÿ–ÌÈô¯ÂÿÇï¿Vºÿ# 4¶3ùgV” &Çëþq»8:þUõ_'þoÁÿsý¯A75u75†[[¶3æ ¶JÏÊp®ÃΞÑîïe±ÿÙ¨R\è_c×ã—¾ÃUið^Bß4ÍýÙæ±tjÿ±/E}0Ú‹eó­'Õô²€À‡Œª¯u“²ƒƒæ Aï'bÆ™z´×Õ¢Ì6„;£ÚÁ’^é;át‹#ÌÕ•?™k¡?ù£=’¯qZCf'JZ]ÑéeÒñÓã·Á±‘ᡞȾ}|šÜ8X WDÊ(‡\|~-ÕJ¯*¨Œfü›ö«Obõn/½| r<òH[™Wó‚u`»Ì{2dF;?o’¬£Dë~•Öõüt¯`Ò4×\Þ×o Q'lÞf‚© þÛYkò ™,è¢á°ëïýNá^u¶5Ô¯}Hy #3Š?Ü~AíS0ÒD¸T! ·Ú;Qxê¬I[˜¾—å„ãRÕø:zç¬kÏdLòtë²pèO[ÂN0OšÙ‹ ›nD¦d†ƒš¯µä&$ÈJÎ=:|/£\ûñÉÊÝa™¢4´á«Óïš~ªvþ’YPyJí.iCn³À_ Î%÷åJB''CÂ2ZÈÓþ:8Êtߢ¥Wžxž„º b‘ÂÍ.™ú_2PcWÛÚj1tPVܵqÔý½^ᓚ§&W ¿wo‘N•^Ò3 ÑÅ”…•ŒA^ sCÆUÐè'¾6@1 ~ ~zxyL’æ‹}ÇK˜(F‹³îÔkÖÓór2ñú²7£©íÀÐy5ÝækÕèär«ïŠ‘o-Åuhe”ºl´ýD{µÓ»Dªa<Àö¥@0z dzç Õü]N·Îp–JIEÅÊÖ#ñ‚þiO{G‘NP”ÅìçûG=¹ü8ˆr‡\5KÅoxÝðWQ›Ÿãˆy{ùH¶œ—ÛR/^o«¦ …¾“ØFôÅØÂ’ìUÄÔ‡šaæCæDvQåié°Ž­…*k$Jг5k-æ6cÂP®öËQ¦ÍJW<€¬xÒè2/ “{%¿¿Úš>ëa(ƒïY•ZÒ¾1˦\’ªœné›Ô™Éï>j _Ç w—¼›‰¤v#"ro>`—9p6aÚO…Ÿ³†eˆñ ‘ó¹0›’óh «_^$c•w‹g¥á83Bú; ¼¢•­ÁãwÄ/Û~åš8ÞGï–<ï›Néʃõ1FèdeGöÞój?‡NBvåÆXåo鵯‹ï©ú]Ù㕆1@8÷ú`5µ"A+j²õ$ÕæÍeË¿Â> 5Ÿ€à¹RɾÙíµcI2›E¢.`á4+P[F3…ç—£§ÅóoÒ¦¤4çu®ÌÀ§ºɹ`P†¢ š¯E»Q¥®8*J7•)zBÀÚÜ4 ¦»#ôúgÐçgï Ú€‹@Ýþ£ËÃ9¹žFRu¡¤œP%™ùhFn 'LÙŸ¾Ikíõi3k°Ê—Ÿ€)Õ«q~ô4ŽÑ‰aókHú+ÃójôÈ¥¦à|*uaÏ©NµÓ½‘G4Ê™!CVã-!ciå¶  ‘¢zðëxÌ8äw<#|¿o{„PÜÚnèÇ@œ3îUÛ  $m|Œ4FwÀ¹K~䤛‘‚ ËqíéC‘Št'36Í_ÏNH¶»mwüˆrL ¶Ì{¦ø´uWÙAlWo¹‘É´€ù©6øç“ONí¹Xü9Äœù\Í·Ð5ˆEó]/‡/禰ÌWL »ø-xÄ!‘´zÕT5ã\êÀ÷PkË}béá¡B ¦%Œø÷H?pÀ™ð3=Îv<ôZk Û ôk¿ ê»fïQ÷ÿ÷µU ï5÷R•©4U·æt‹?13ÕØÕaÀ‡ œ¶ú¡?xk¾}Rþ@§^ÌË]ÊGÐëaÚÁ¯iy¼ñ4í¡oALH¸µí­J­£ø2m€ËpÙï‚ÌYý.%—ôßd6å7«G5Â7 sºœí›ÚŽ˜Ê–qƒã“ÞÉÈO‚k‰†>Ye4ÿ¸ÝY9îë=Å­åü‚dÓûŒïua¸ëÒ MPˆ^™â¦ÖxÆfB‹0 ¢€­ì-Vô±©Œff`LãÈßIå$N”¨?>Ç4À·¹ƒ»Ã_tÕôfÖ—Êžœrr;Œ9H ý˜VoâôM‹â(ßS&K¡4ù)ì.…ÕO x5;äûMþí4hiÜw~¶ Œäª;¢xã¥hÒrÄЇ%[w)K„÷fm· hëèˆE¯æ¨ºÒ•èòá&tü”ÐF°_m•|ÑYþ8Dįë¯e¢­°; ó óé1O$‡]·{«ïÔÄ¥ï$VÒŒÊØÖÏ8Ræ bd ôOë ÄÎ;4Z—W$en¥éø7=ÃÆÊ‡W— ‚› ö›†3/-ä-·7†å@ßJÃ0]…&ÑÝ  <ˆÎLc'£D˜)í ºÕ³üÙø%ù÷ûc7ûoM-¹ªïbQw¬9ó{¢•dZ¾_‹IÐíÿâÿ°ý²|'Ës” ñòu\%°—™çß|­{´ªæYj1"¨‡ Ðm„B³Œ'±â çªXu £ÿrÀˆ\kë!Ôãw¬ˆÜÍÛåñŽß,·¬B¢öCAß`à÷Œó7ã¨z‹E¹ÀyÃs…lÉËE2Aæ©WŒ³ÝJŸV陕Ÿ`âé¢Ë*M×ímèŸÈg!þhµ®RŸ ¨KÝ9Qêè„Åo®ahb[r+–ÓQfÂá·RMÍZ…uf+ øo—»3i’w‰ övYèlÈüaì\ÝŇè`8½€Ù¢-ãlv§ÒÝN“0zDXYn–¿› >9ÖVÆ>‚O‰Š5Oéåv2¡¯SãR©¿âŠûAkS×cBUMÐG}µV/õ‹ƒA·-}ôBú4ÉÇà~šK®…¥Õ¿¾`šýùW€:<„¾WL÷Tpz½á^%eþ͹ï¤7œýKÖ,ÿWe¹D¾½éw%©¼¢+ÁÆXºÁ›ÕæúÚ|Ð TšXBØ„Y*é¶ßÌpô§(ìÁé’³›äåßþéµ—¿ÓòS~Îï'Òƒ \&sÔ9å¹\ßÌ+¬éÆ!oŒÔJ­±k,b%‚=(n³Qï¢cš÷ž§âHX5HïÕSÿl&wðÛ!»úF'òT¶o@~Þ ,YêÚoLZÚÍ7Ý{‰¸RhÞžÝô§vf d£ü†ÆdÁP/\[%&þ˜ÜÄ~Ý&˜eAÂJÛ—7Å Vø:t XíŸu¸Ý‘<üTÚPš¼á¡"¦o¯Ïx_BXC2n§×ôºñÄÔè¦ö[Ñp“U6³iÉÌUwÄ}ÒÄ 6tXÀ>À#É:Yì„o5ÿtzþ\ä†ÔÙÑÙ5Û„â ‡E%>F¿¨í ä§&J¼Í$„WþLj†IÈl¹â=ÔêòÉQ!³t]ÿ–Ç4v2ƒ¶j1®p/‹to§1µ”sU‘¾¡°‰N›óµB^øåÄU«^ŸN„h•UKÂ{\;NÖdwS¤ é8PX ‚J¡Ì“ Ï ÓwFþ‰‰oâ÷žDš9½øºwSåZJ÷£8šaâ§Ú×á*óoJ{0Z äÀ[‚ÙáƒÝòç¾î¼g€0’OW|•ê õˆ¸¸rQØþ—uôm8ÌF"Ã/ûa•v×)µI‘l4ˆ¯uY†‘L€Z–Ön4‘ ô*E˜ãÅXf÷×ña_„ßú4 K¿Iœk¿*†®ù¶qÕöƨƒhÛÀÀÐ42ébóV{h[Š×ÝL:”úä‚•çÙ†#ü·;j5ïãˆÓÎy¸ç/upnl¥/ä«à­5_´Ü˜SEìÆQZÔBq º—Õ@4—–®ûpú» (ÿÊ$0yÚàCœ‚©¹ýúûÏcSmÑ v÷K*x0§WìÂÍs&¯ƒÁ4.—š` ³t¾v=Cl©)v³×TØ„ºñ¼ÅÎò1]ø×[<œ†_¢Ôvˆý9u6‹iÝø ¨‚¬Û8²›c2ÕáßYÔ­¨ä™œ´öýÞ~õfÛ1 G*¼HÚ9&uŒ° f¤šÓÔXˆ-™U³µ^ôDdE wZ‚Ó+ßFãöÃb@¿³uþ0£“ ~KÃÖ@GR@ûòX nÃÒ<ýŠk©OWÃ3J»óºPXsDÃ×Âåwç  $r'/ܾëFe$[£ª^g#‘ßÚÇÀÊäJ6¡-t§ q7¢·bAŸðhq†WîîÓm}ú8Ê!Æ€¿ÇéM墖©½H™s{l~ºiré+mVTXNQ@˲+b»¢êÈÐ3Ф ¶²g•ÃYl$å^L–0zÂDã‘"òf¬jƒ…«ÉÜmG*$ðµz“÷Jdk*•>A{Æ"~шӤæÿ>º`ª¡œ‡€ËñásÚâÅÑ©t&檆šÚ©¥Âhb/ȃW¢2ÀB“í¾CHfêøþ>ú9^Q»Xñêk–ºõ]dÛ«Í©ŸÆÞÌ{j”Ú”udF"‡y)Žn|£GM”.êØæÛx=\9j  „DíâèRé÷ÓíÕ¬F-à,‹Íi ¤«ñrb2åPŒ7n ÿzÿʉ)D5±à/y àÙìõf"úQ&«u¿DÿQY&_’×@¦:2‚Iç¦ãöôR2®ÌÎç öÜ$9Æpoÿ\á ë‰üƒñ±Ç½áb| ”ï¥áJØÃˆžãa0b«’an›ØóÑôFR>æœ,¼K¥ /†=ÊÚ³vŒÕòväSö5vb¥D¢³y ãºâƘ G;4dô½¥.Z(°•©骾Ûc ³2Ÿ†€À_²=Õ„`_MƒáQ—”xc©©û«¨ýÔÐ íï@.!–VáõP< <ÔÜ,­ÛŠçÍzüPÓ‹tD°æÊÚ´¡PbO/Ûº(¬ºõS8,“ˆÜ†iòʹg™]¯°¬¿ê`ÑéÄãìgù\\ÈߤLÔíTk6úZÎ2ËÒR!ÛUKæu#Åþ4<ÅÈ>Z¬Q°Žÿ­Â­ƒHÒPõÊ©›]¥®¶û1R(ËszVPåÜ2|}¹V®Ou*þÌÙ`O]÷íÜÕÿX¶žO¬¯á¶<í^Þº*}ÇŠ|8 [è{ï–ã쌣dÿ–U[æd«êÇ·‘Z-Úäo\[­½ð+69ƒ…iûî4ñÄ‘å9¤[{¯€WfN¦-È%|÷ò„½_`8êw¼xÓ>Š©£§_%8½ ;–æI1ÌlD—¦á  èÍÍD¡Ð­¨>­½!í–¯eˆÛ/,$éŒtÆ{XÙŸÒû°H£ûâ(•EBÒÀ*‡0)~)tœ4•ï˦é‹y'¾³Â>í_ ¡:‚ÑçK2–‰yƱ’æ>^/›=×nã.e„ø”43” & ²=KW~h{„`fÚ4oâ÷‘êáŠÒð£fôŸ°»§ÜÓÎêT˜õ—XàlúXW£{19`/ü6)C蛈03è`’‰|¥Ø)„Ï›9¬;=|•ÓìÚ¥·]œ3%*wÜ2•¾lmf¹¨ÛúS–“¯‰• A » mA$?v6#?_!èkþ2>ª¾L-DI–Š˜2”Y÷ûiÇ}n=ùתuÝ™zdkÁaêÅOÅ\“Åèu©UîÙ £ ÆCjÛ5C»…m£È6£²|ä‚ÏAnâlºÔ-ñ[b^¶y/¥Ç2»?¡=¬~P|_eìä+ÎΫ#C¿¼&§õÿ0LôÕÑ—ZSÚt§g”XRü1›¡aáï$Š:OÏV¦‘jé‡]{zÅ &¥“5šØàìOOR„ËCÀüæjá=1ñò•ˆÎ‹+#ÖúàBg ŠÇ*Ž‘4 ƒÎS0÷×oPéì× .Jd)_!¢n¬*:ÆÂB]• =ÍYµ&áðI3rÔHYîiNTSŸ 3a§éØéGãÃHû÷1\!Ÿè#Š÷5¬îÃQòx$¶-ðò££Ë¡,&Ü–7³èŸ¥îÒß “º›<ê/ø ¨9j? >ÄÀ’Œ[R"FŠÍ©›ëÔ3j`&2ÛŠ¡ý}Öc‡šÙL4”ÄԲ䪬C‘ «4îך©âÙÊ|1hÈ !„ö ¥/$!/Ö?¦Sâiu_z¿×$9Œ×ÒxqÔJ·ü4ÿ¼rÄ–Ž¿Öåzp•eÉU˜©$x÷2Jây3. ¡ŠBù 2åÆ¿j§ïÆ!ß™_^|²æ#°^YZSÔŠf7_óÎÜ/sÓø=ëžëûsÎzù¦L€‹ªRÈ/ùhkžÿû…ü•ä¡8‚+Æ ¦°Êªt]ê,Œé„Ø·Æ‘­ê¨qÔe@IäÛdØÑèzføä¯é¾ø£vmuºVÛEÁË´Z*G.wÝ‹eQ_Û¦>L‹, ã)¦„ê5Rº s +R59'¶šù7Lì¢Qt¿ÂÈå.¾¢êŽñ?"ôn¥tÙâV÷x£¼Š¾¡ó¸`%ŠB)Ôe$Y…\H$ÑFéˆZÀ+¶º6z³l±¯;ŽãS•´àr#]tïüXJ£ &¶ …Û–¶ Úb¥ÛRóÅ%`‹¿µPñ.æ ”†˜qÚÈ<><Ä…N¸å4S'ròôK¼8ï–ÿQ¨ÖÒFÆgÆWV£¨ë2³¿ê½EõaQYïö+0Sž°Û×ÉROã–­ñ/«¼Ü«Ï bäçENõT>È܈%NÞ"4tþ84Þ-È¢¼Ý¾#‘„u¥–9razÎF ¡>º™{d–yB1ÃgEóbîQHßÔ4Zý±«Ns;¤s}ùJ3;šÝ?©ÁèpÙ6RLØ_©Œ3¬—7F9&¾<Ëï2Ú`È[€Äo9üv_±õmBE:Aÿûmˆ,8úAÒ]ÆZ¿S¢ ©d|iŒ¿‡ÐGs@¹ƒ+â&ËØôlGÙxi Sz›1‡@Œ5s<«šôà»r0›âJÁ ªÂ£¯FnTõ®Õôvgøs¶ó30 š_¼"Ç%ìÏÆ¬¨R=ÂS7ß:gžeÝ(|Â÷˜êò›Ýß3—sò;Õw ºº#$r‹çÖsióopjZpƒ0Ê)SêsT‰y‚3|Ì¥.ñ~HæºfâÚÄî!)Ù „¡µb_Iâb'_Sp Mæƒ4ÇxÅÝ1L[|MÚ²}ÈËóÔHýoâº$²ŸÙ5¼B¿áµd$kã:u$ m·sàÏ8òyõQ }òdLeÅ3AÅÒ­c)¤õœ Ý…Ó–ôV¢˜`I,Ÿñ¯f`9=ÕC2SVÞ¸¢té¥óÞäK#p%“Kã¿Îa¯„gö{uüÓrƒ¢`„6¸sS?¼š»K$JÁ[äæ;uÆD©ýJ¾-”oöP"¥éžÑ““ÓÂåŠôò·Ý1/äXŒo~!֟„ÆÚsÒJFAÓ ¨HåNÓ I{±4=÷H" Öj Ø6Éçd@Æ3õ©q¿à1 K³9H5èœÎÄ<}yDìaý,dgM(?̵Æ)×"T½ÓÓà9èµ¼+²›JUtø"½Ã>¡/¯ù]UhÒtÅ÷úPg,FSM–-A‚b`Ëàíú¾6¤á(Αu@Û|N¡2k96÷A54˜ÏÊSy¹öÜ(=gزä5n£Â8ÂÑ_×r¾„yÎ$3ì¾*2¢œ‚éÜoõ«Ôc-÷®Ýßí vÌõŽ×Ïá‰ôBqh—boäÀè(–¬“H_§™ ÖÖù œõf7Ά©Ì2¼#—óX’Däê¦øªÿ 'sñ)=%ó½Õ ¬êæèBJNbçpØ H“ÆçàU²Ž÷Ód,øê­*VG‹u·û†®……ú-õ•Õ¾›öû3i°‘A‡–µ$Ñ,Göö¥Ê+û™Ð‡éCåOïéºur!Fù;e(DaJp)µó87 °À?ð\úݶ>ïþ[&v1$‡ë»óG%·ÔP°Zu[dQ øÚ’¶€jnš…p=v$Ða¨qŸ‚‡s‚lßGðöh¥˜&²ŒO)7HÀ§½igq!‹Ë“™[ô ò"ªM !Ëú·AÈR¯¢ÖêH*,üÀk¹?U¡ÎIæuˆ)µ\Cñ'mî,¾£=ÆI‰ç6PÅÒr»žõÆ ‡èÑÚ½öJµ¥$ŸŠašgj’Æ4‰ŒâÑg‚€)»M_º_üß —ÐÊ:®À‘ã Åd3¢’à¦åÐrç{ö.­8óLî§5Ï·O‡êÒVžÖÏža'ÊQ'ñU| >DY‘†Íê˜jFƒ.@k¢nÓú9À‰‰­:Ú®ð¿/¦ß§©‡ºØAð •‹‚hZQá‹OõAœ {‚Öj‹3(_ȧÆnIÇÐ÷ñ» r›ËŽ„Òù6 ¼{<‰ \…y©õ[溲UÀˆÿ:!Gî÷GLQŸgY>zRèQ2EŽùÙ=ÞÒPcÁd³öy|K‚ÚÉ&:+˜<û‰ 6ÌTxØûуéÚI@y³¥YUÕSÔ;¨ÀÇOa£ê7Úw2ßn1Ïä…S®ˆšYÀßò*0]w·ÏmXÁz·Yi°ã¯'g¬ÏÏ–sÍé_þz*±b.ýM|XÏ/åZ´¥|[(“Cæö¥Ûz~åQX˜Ÿ[ž>¹Ç*¹ÑÌû y®¼Q¹ØÎôÌU ¢7—B5îÑ;0si´šhqú9acèfimÒˆ1;ÜÄ;»¼üÅ‘ŸÔœsr{ÞFY¨ÅЧ`;A=ƒžƒ©•‰JK3gÄ6¼Ÿ¢÷)íªPø™AbëîGÝ:—¿¼g·ë ù›GhrÎ7ÔhIóÄ>³ pHþ÷9VÚe¦èåÛsŽQeÊ ™¦]q®ßAÃ2ìñ€ì{D¿£~þq^ÉtPBìЩ ¨ÛV'ï/ËèéÉ„¬``†Õ!a‰EwbÅëaÝ•Q—žòæÆ× ѱÝ}=‚MYZûÔ×½=ƒ©®þ¬Ù5°Rþ»òÔ½¥†£ä—ËË1™²dù‚xgyyõéLÚÅ„½gD˜s:ŒŽ/èB+“"–F‘éÈ„?Ÿ¬›Å©ùýJ†æ‡„oøg5['}¶€þ…ïŠ48­ª1Ã}·¶Ò20‰0O=ûÏÖ@È~òÈÄüâó¤NÒEÏÉ|Þ£à …+þëçÀUÜp;ÝLçXiK+™5±+/Ysð£/1±¨Ø]öý¸v¯"Ñø”ÿ·»„|½)š>·°A´£o|›~ûB&‡Êðï·á‡5+ž„ ®„Ü7¿Eû³q òµÙ Ú}Áé+?®Ûê>S-ï´*ݸºS–1ÞÌÄ)IP¹ÉÂÏèý°’£¼] “ä]AC…óu`’ìÊðñÉçÕ¹B [ öêUÀŸÄP² À%~&°i”¿†’U–õUzE¢UÌ%:;§¤œùy<ƒR)ÚÙ×Ðåß"rü‰{„|×@/ÅåGékã6úp[áôFƳ éW¥˜ZcÚ>Ã!b*•¾oŸ¤®_´‚^chª á·€b&„©¸¹¤–‹_L+¨ßÔ,-­a4àJÃNçÁycocˇ&V•íåÖ·TùäzšH;·Ô`¼Ä¿s×—Ói´G6 êXg¯tAS6_ÔoJ-žÐ=XãDáѯÀVäut*WÌ’FüéºX«;%¦}ƒ ¢>ˆ9åãoš|š~BâØºÔ9yíqb'×µ„.¬2Hò:ýv‹5`þCÎ zF)xÞ³0, G¥áÅfN:ãQUÿˆ¨lï1±S¼r–ÐRµîy³*j7·ƒ}MN)¯Ê.öa41Õj#sjHþ»aæíŠBì–8âæë™ÿ·TÊ2^ûxìÑ=©¹¼;ÁH’_'xTt/j`øTqzÅñýw}ÇÇ+×íƒÅ¬{ôuY• Êx-+ráJ µñx;ãµ žÉ½Á)‘æ·E%þŸ~3NTO)S´ó;—£Ð¤çk¥–€|Ê'Ù=?òâÙ C©Ö߯<73µŽörª-êP\ TÆá3(¸žJjÈ'^±Í+_dxlš˜òÄýLeÒø~ô.¼ökù¶Ù—"ä4'cÏ@0¼»þ'ÉKÉkKêè{¥ä±å…Sƪ\ŠÊ. v×<Ç PÍødþ§ÇCÔÊ‘Â0ˆNÊð_ð¯ŠùbㇾöòœùoqnÈJ%ÅåÐnu´B'!O  –Ã0i-T¯ ‹¥¨Iå˜j>ütíñ¶·´éìN`æ˜Î)Žqº$EaI%bÆPÅLQÄc;ñûOäþ3¼6>X7,î^°ß ˆ­j”õÂn0ŸâS¥æM ¬·9£À{kÞªLƒÒ=T·[Ôé ñ²{äò7cemcåŸ=œŒZw båån&µÖSÇ«^ìòt¶ÛSYóÛ~“<÷éôÜbJ! ž­|{ÔîÑÇT¨4·/·}?O:ÁItYn€Š¶Èb¦¢ªäÇcÖ*«ûÊNÕñ(l~vIkU_š?z§­9‡Å°ølDïÆüû´9‘CÅU‹ÔLÂ?¤ºø…dÁMUIyIŠ&º-~žIÈi9ƒß×QÁR 4ІƒuБµ-3jþ³â„Ô 49_ÆC‰ZŒYë^¬¬úóÓEEß\ç +ÒÌPæ¦ÎlûG@>ì½Ónßã3ÛæšË•EÓ¾S(®'Øcáo¸[ »þ¡[˜H1(ÍE.Ù¬yrm±_N^ËADª¯¶}œÕ>ÂC¢šØÏC=È'â¯Å¤+®{¿Èï•çxÈaØg®¯Uð¶F®ü´·m*¸S̵n§\¢˜—>èPù©atæ†#aqfŽC„æ2:of_gZßK£[€ :»ôˆ(C:`oeªÌ*÷X §6Uë .Lô¼G)ðÓJ£jœÁX`è~µ¡Õ7ÛN÷¥Ö -}¤.ŸìÒ:ÃPT—‡©œš×Ãì™– =׈4u«evÆŸê¨pyŸgÀ‹Å—Ï;“e¶ŠTÑê"jˆŸê1©üqrWüÄpß ÙëOcM‹EZ³þq$r¼ù‹¥¦:Qß B·RNÑ…ׯ¡RdÏœ‡Ý°MæšÜÃ)ün,|(/jý‘ßC¦øÂ3JªßYw1 {×á­¼s.ÿ½ê±÷hû ô v y³i,&Qš{¿Ãÿ˜®6êDÕ¥‹^±÷ˆå|Q[¦éºÚ ̉RTÐñ&™l_8°%ÏoØ<Âýd¸VkÕãóÝ¢œ³óz«ñ¶?N꓆öÐäùü²1ÿ¦y0ÎÛN•Ô¢;ÁGí“9ò‰‰ði¬TÛêðZ!X1VÛ†ý!÷Ä÷$¯ü9íGºA ñ£BTnR)˜¨— YêEø0ìº6ûÖ¬x.õ†ò£ÒX.hëÁ:´™½@l •Ô’y¾rDÏasLð!åu—ÿŽÚ ¸kx.ËD7¬Un†BÑÝ.…£*vÁ‘®æâä–ï@«ÐgÕ¬b=6§GyGË‘ì V¢§á€Tp½ÐÓb"ƒÎË.  gíøÚ»@OG®¿­Mt À" ¦œÚ‘ád>}4¿∠’‚Ÿ8m€ÞUo$=LˆrysÚ¥È[ 5bò¥sÇc=ÑÌ^ê/Ä’×ÏȰ’3=ÉOb™@@Žæµ|øjã%t$3<©öÊ Õž¡,b[ê†7ºÌ{X¬h!”YºZ»—Y†¹¹£è€Eã‡_}ß…€¨Úø•ø“ÔPgÝ8Ù:Ò•Wt5c©ó§[ù9ìO¸gÓ ÕǪP`vÇ4x¹ãòzÙú„^Ön:Ryj$é勿ˆÝﯭvk`\’3I¼Oª*²e^ÏÝ›>UßãV+g;ïLÁÛXé-¾‰½Ü2ÚEÅÖ®Si’!]Bó#‚êž³ƒòþGy}=ðb8+ÇЇŽJˆ€ ¸êÒ3(=A|𕯛‘í½˜¹²èÜ>.ŽÞ)„c̈ãvQgçS¾Dª™ß€~› ¹Æ¾™ªM<ëì5žÝÔ3yÈËV´4ÐrÍ1ù+@›bü3cYéïP‚r<%61%ïI–7ÏLˆ’çÈS;/{¸:'í“M¦N =·*!ø>ªÛ¿ëXrîðÄùxbrF(mæ@Z´×X ›ÜK¾ÂŸ[4p4:ïøšÜä0FÁ ~˜G7=R«ÚTÛ! ‡a‚eyÇ—»Gü8"PkòÄ?Ü)0ºô}…ßš¥‚Õo¤¤ag¼{†ÍlV„+yHÒÜ®VÞÅ>¯'„¦í¿æÞovÖ±EºrÃl ÆÓp¹ñF¯OɘÂÙêg¬4»âAÎ;…¸#IúÝu(3V_Žl* [ÍHw2×ÛØ[†Çz)Ê-÷0öÅqTú^Vêv'Ãi8™õŸ^™¬l½íðáî›ã5ÕÀjÈ6ãiDi…²…z4=õ£ØXÊú Ïç# IQU.wÕÍíy¿nòçá9Or•Z9‘©ÍÙ4Yz ¦¾à™ØjšPÒÊÁ·¥ÏHÛýièO”©Ðäå %\µöÒmÍÍŽ_)~Xœ=¹+OÂð©©÷ ¬s?ðæi^çtû[$‰N8ïý=ž¡¿î pbÐîàðžÔý€Â•›Vj×Ãè~ê¹ÍÌËðÙõµ‰ð#ÕZeͽYÂ8ç( ݼ¾"Àñ}/ìÝ6 f…©°€ MC†œá¦‰Õ’cÁ¥¯´,Ô2ÉŒ²:î~‰Û ¤I±íÍ\/´À)Ó–#Û3~œkn8Å'ýýg'ïUëdq ÁS–PK¬í66ÒBѓӕçj§þê@,Ûè @*øL+Ôã–fR=HÕ—‹'tgk±MtöÊݨ—Ï¡¤œEdÍ‘mÎxk`‘Æ!dz¥ï{Aô5I[Ô„U¢ ©Í`m0 4¸b?™ üÏ_®­Íòú䙋j•Ž 0QÆîe—y=Tð_%ˆ6ïΓÙù !›mEc=?A5ÛÅ9 ¥¹áÐ X¢÷ùÖ.‹*yŒ*å·.@ç~#9šV¿‹Þ-5 øqW»†xñfZ”ú„¹­uÂÖê•Ã'Eµù·ÌÄÁ¡ó^ºW?ŸÕŒ¡ÄúðÝ%‰r?3ÊJVRœ6 ‡¬ãrÎãž›Ÿ^TeÒ±É4ˆ¬ÃAE.(/À3šíª-Þšº9WeYAÖnôuТ/i%äj[Ð (×@|h÷ÏNwQC#ý“pieÐÏKñb(ñ¹û8Gϸé?Ž$w2qÞéwÖ%J£ç+¥¨ð¯¨³sëÕ¥yÁ¸î¥Ú¶ ÎÊ´ÙÐÞülྃæ©ÁG©ã-Ýu@ú~üíWøÕñ÷Rº •c+RccÒʃZå+âöˆ—ÔÜâ=1iô6Þe/(†Cá˜ôY-’Zó#™Áíc›a÷$®ÆÂKêµêLùõ] oþŠgm×Y\«UõT±{²¸S{Ôû: œÊíPüŠhöå$·L_wÓÍë W™¬Í¹që\Æ/¦ž± Çée³Ì†A,œC_ÞWÁÅGd>;¨×XG¿îXOµÊþš0ˆá ’êfM¾ißÈú9oC R®[ZĈ h½ÅHÌÐò|?¡ô ñkQDSrÏVYeÖ³«–-OD†‚w“Y ¤…22ƒ¤Uÿ»t5c“l¯Á\üzBM¶¼Ræ%vUãH:ón냤näjKÏ€óµœÉÌ(=yw…8¼Øc¸XCÜ…£®•üà¦U-¾tf›¨’8÷¶Êý7Ÿ~üV£3ípU€q S–ªs{9ɪÂ!äë͘˜¬ë5! ꉄ)FJWõÇâs…KX¦‡ØóÊ‘È5-À¯»¼]ç$JMMr0T©v;/Å-šh$SK8té94â¸JÐÁ¿Ämwr“ràßá'0QéœO8ûD´Âu9øÄa<ˆ W5Cwè _šREIîð”üø°êc#¢ä8låfÍÿª’·ûûÿÚå–Ðà$I8-ˆhÛõåC6t¥÷ñgçëÞh§m¦•é–‹òWû4 ãÓpª >¸Yâ(Ù‡#HN+”½Nr†dÅ |kg?˜\BX¸ …ÁþûKñìë{ÃFE´ÍsüÆÊÃzÙÛ(‰z  it ÷³?æÐ÷â` ž#”ä1ØMT© «3³¬ÿ ¤ZÌ9Zä§¾›Ng`¥'Rî¤^ ÏÈù¸…Üìò©Ú”Ãëµö+ãï¨ ÉȽw g0‡nvˆŸ)Œãœ\¼r'ïyíIXf¨™£¥†K]5<ÑÖ-úÐŘð… ÑŠ¼zU°«\êD\×ä+x¶‘3hVÖ›±H¤¤‚˜ "ÆkÃWŽ9®ÍëB$±dÜæåÖ µ]H¡ë梆Öiwv¿*rR/ÖDñšWÂCœç·üг¶ì.³ü‹M¡–PpLcýj{•5· B˜nWgÁëÔ‹ã±DœMîõåE)ÑÅÂvqÁ'ãíÆÞj†•ÇÁvGßê\B†0f¯WsCRÿYµ|‘—à|Íåç}Ä¡@Aó0ØGtwð˘_‚îöʯ¤èõ™È”\Öƒ¢§z;½+%¢ù5Ê´N¨¡1árŽ¡ÏU¼ófwXyc¾±®mÄÜubÕjÕ%YÃ>©“Ûc®1n"|ŠÍˆZæÜ3µ.7™Ùèöðªa»B·— &>`‘ÁÜ_,Òæ®é.ó ê ‡Ôäûðà²[ŽV¥½Ô«- ;•o’½i ò{ÖgÿŒ—;M+ïD5|Œ©÷Û½ŸÈ ®µ_3u¢×£“-œi—Fý%´†úÂ4Ù,')7²õUh„àÀ( Þwï0Ž:‰ndz3‡P ó×kˆÐ1.e÷r½ù’(­2Uû:_Îål6œ’mD*hž²SÞ R¦«û>G9RÇÊâ«ÈýÚôU¶½Z¨X SùR{Œ<`â`o§–fÐX`8³[bâo[K Ÿ\ýNôITk@9dÏA¿Ñ0¸›on³qÙ£·y3¿ÁUTN¶]¶{ï5’Ö3âM€:ïQ¸ØH=/çç‹_^V¢ÓR¹Ç³ôvñÑüöO`ûâñë·žts¸NWË•FGÿfýÚH?4åP:OÐ̯يX3+FÀ¹6K,ϰw†áà‹¨º·j|‚ˆ-j4ËCëëÚ™ ÊÿÎ…ÇSò^ãºwfd¿²f´1¬w{P* SMº-<¾}%´zO$À2PNÌ v¼8 S’“ªüJ›‚fÈGöÇçDWh ¢Ôµ—‹i IìOò’¥†©?Ϊ‰kšz:ë¼Ú?^¡•’áÓˆI´öƦnÆèÏWcˆ:°Ñw›b¸¶Xˆ,É€žâù¾›?óVÔ‡§¨5Óš| ݧ‚\X9Ò-˶A'ÕŠh§±;ލ·Ä%z»ôY£L6N\vfºÍîçsª3-ŸM‚ûÖ”lAºÃêÀ3M—èÜ w©s+ÐinÓšòµ<ûaäÈŽÕ¶Vm‡“×m¡IÁMú3MK9>ÓUOôA#°22[Ls}ÛÅÜ6œœö}HˆƒdØQ¨¾ÂUºÒs´ãrߤaVsÝßf¼W»ÜKÔ¿ƒA ´Ð÷Ôâí²èO*ãã=>ý?ý¸ endstream endobj 189 0 obj << /Type /FontDescriptor /FontName /PLSMJY+NimbusMonL-Regu /Flags 4 /FontBBox [-12 -237 650 811] /Ascent 625 /CapHeight 557 /Descent -147 /ItalicAngle 0 /StemV 41 /XHeight 426 /CharSet (/A/E/F/H/I/L/R/S/U/W/a/ampersand/b/bar/braceleft/braceright/bracketleft/bracketright/c/colon/comma/d/dollar/e/equal/exclam/f/four/g/greater/h/hyphen/i/k/l/less/m/n/numbersign/o/one/p/parenleft/parenright/percent/period/plus/q/quotedbl/quoteright/r/s/slash/t/three/two/u/underscore/v/w/x/y/zero) /FontFile 188 0 R >> endobj 190 0 obj << /Length1 1608 /Length2 8120 /Length3 0 /Length 8945 /Filter /FlateDecode >> stream xÚ­teTœÑ’-®Á\š`Óhp 4@„Ò@Ó@ݸCpwww î4hpw— Áà‘Ü™¹³î›_3÷Ç·ÖWrvíª]ç0ÑkhqJ›ÀŒÀò0k'ˆ‹G ±2²‡kZ«pÊÀ,MN&&Y;°!³–3D€EoÁ&9°1€—ÆaÈÂlœí fæPçõ[VvvŽzþ¤Œœÿ3òx1³0?þ8€-a6V`kÄ#Äÿú  @˜ƒ¦K0@V]COIMTPÓ(€­Áv†– {#Kˆ1@b ¶†ƒY¦0;€å? €1ÌÚò§58×#–4`€Û€!ÇÀNÆ`›?!€ ØÎ ‡?þ p€™¡5âqbmlioò‡À£ßö—ì1Ãê1ö¦ƒ#àÆv౪†œü?x"Ì jÃ!aÌô1Óflÿ§¥¿±G˜Ç(Âb  ÀNˆ?µŒÀÜÆÒÐù±ö#˜ä/ {8ÄÚìŸ 8v`3C;K0þóˆýg:ÿìðߺ7´±±tþ{ö7ë¿8@p°¥)ˆ÷±¦1ⱶćûÏ¢(Y›Â žøMìmþ3æ¶û; àŸa}$ah³¶t˜€Mq¸Õ`ˆÇ’àÿNe®ŸÈÿ‰ÿ-ÿ[äý¿‰û¯ý·Kü½Ïÿ -ooi©fhõ¸ÿx`/  øóÆü¹†VKçÿ!û_ß‚ÿÁðQB>ŽAÚÚìQ .ž8!pyˆØD‚06˜Z>Îè¯_ÇÚlg ±?jùwŒN€À¿Ä´Í!ÆPë?Cþ[›ü+óGyþòæ–‘VUÖSeÿ××ôo–Æ£êmg›Gbÿч*Ì俌?220'€+'HˆÀÉÇ#ôxÙxøÂüÂîÿC½¿@ Úª†;ˆàÝcÓ< ¿­ÿÇ÷Oëý¿À¼´6†™üÙ-„¡µÉãjý—ãOØØÞÎîQÑ¿·ý±åÿ´ÿ.9ì6Æ™›†‹~¶HLIBT’eôɽëê¡öúÙ|ÑÎÍö*‡µ{&® —|ú]áÇU3"rßè<µos·©Ì¶ÕßAjÉÒþ‘EíÎÀÚ™M´ÄÜ,ľåÃý¡/éàm¨ëñ¤Ê š¾ Ï›­µ!Í×òcÐŒ4óÙa_±z18d{=e¼´Á÷0N¨ŽxÖBXƒD\™³À³{uÉÒ=Ð×ÛÓ~ŠÞ¹IÅžÍ$ꀆÇâe›N%©¯Sâf”Šé.íðïÔò-Íž’Ö®ðôw°¿Ï»Tëì¼}\}X8BÉÊëpRïqç˜Ï‹4ÍSmüJˆ3Mbä¥Þ¼0—ôïRRþᵾ䢘ïOù³ñd¨X™{½’?qÿÛ04U¸·ðl#£¹Òp”ë«W×íX}d«Ú!ñ ìh…§oâáFŽËüÞ’,%{1(×Кñ˜ÏϦžâ÷›£{ßóòìBËkŸsÿÄ+ò@T\1ýúfó,+0ˆ:Xš6›/Ó]õ¹ªùüÜ!zƒö´_@uÅKxp[2È?‰H ƒØTa4äo”KÑѱé˜S¦ð]Û’ÙQÌkD$|Ò=Eg_ÇaÂ[S0A‹JÑÚ4î;™:ßÀKã O2ô.<ºVª!&•¦&TvÑgèxÒóOÖ¾Lþ‘ ÄÖGÞ%N^+U —¥9_hp£ØVüzÂêÉÍïú+•ÄÑÇfáˆäÐðQ?:cxŸ•OBÞpÊdä¢a`Îs¦»ü½|”Ãÿh8°+Z©‹ ·»­/kÖFˆNƒ‰(T0‘Æ¥dc"¯ÏÁe}d´£.hŠÂñથvt¸¼r¼ý3™õš/%ƒ®Br\»Ã±@?$g3³£§Å~á/ãÒYKEUœòE£íFø3‰ Ù–;êê¤7bqdƒ±CGÛ{ÐåÕKïÒ\V“njϮi¸[yåruÒ˜ÍQ Y’ôoÈ©¬,«²ÑŽÑK¨Z¨%x)ï)µFñÄŽƒ°&>¿9%dZW&z}›Œú¬‡[,«¥ËŸ 3³ñW°P9wׂIUú]pÏ1¾L<ímb)LjÓ÷›dx·äœj/Þøý’ÎžÕ ¬zšžì`YsŽ]³Þ”zz=D܉NGæÉQÉœT˜;pI÷u_£)6&š&Ý´dCùÌÿ»Ä[åôd§]hm} ­d5š@vk[Eˆ€^~‹â77­hä¶UÇÅç·ƒÔ­¬[&ö ËØö“#ǂϞnÊT1ºû¿¼B·»%=yFíÚIáî7Í:¿¼kúÍÔN¯ìR(ÉßR'’rKF¿˜ûæ‚’A˜óІHõ™Só9RTIÓìb‡ef`¯ I¼•SªOìrYÓGhš4CÑ ¹È8åùú÷õ‹ah$9ð¢Õ¥ë'ÕHŸÍ„XrUcNÌA>o ~^…2´ò.›:Ü¥Ý`šún»NîgR½ôÐt2í@žµ0W域-Ê/©8)¥t”N"e‘¨o Ð\O]¨ Nè’ÑJ{MGg¯N´6·FŽLœÍ=¥ÁsµE\Ú#U+îÛÍÖúÑ?£ÞSºb¿®š¡e¾9À9Û+¥ôbj†ÙÖ?8!…µE-4ùò½à*8î…?$E4I´&¢œDÆ[ºOv¼º¦ý“¿)ƒ9R´ñÈ“Ãsçê“uo´#³A ÍÂ1ä5\¥0„@<Ç”H—“€ì9ì„+ÿ óÁ-5”À°Lâmƒ¢TY•¡÷A­6ƒŸI”:Í{Tzò›mãÕÛÃ6v‚ø~YNo„¿Ï΂õ.!é½`Þ-üô[˜ÄÆ­XàÆV¾Éw!³Ù®·eËyŒX^ÔÂTŠYáéf?ïrÜZú2——»!¦]ÁÅ(SRÛ´‡JܨEJŠ_5TicåBŸl~Jõ&’2]¤/p8I°]]Œ"èIjQ°U½¼ôÉɳý‚Ñ·ÓWð™;k75€õg(ž$®Èª/·ÂH—X‰‰TçG%~œ/ =Øä;y:•˜Ò*Þ #µ”4g@)ñ¨ˆ·LRqwf°Ý¬ ©ÁŠ­‡©Õ•·ª¸mÛh-£²úù6ÔùÛ[œ”Hȹ÷ÑúkqÛ˳ ƒT"'üÕ$¶Dã˜eºÑ¾ºr!7;¢tˆaô% ÞÌ8üQ+3»­'È=IÂ3²`yf‰‡Ïqûh#)Ï‚\Ñ5àtY$ÒúPR1IU]©èó×É÷ùÓjt=>;· ?P'`‚½JxdK¾¶Út£fèIÖ) Þ× Àç>àX»l‘ì7qØxí˜Þ€£o|À¤ÞA1¸’‡A‘5Uâ·\…gºÂ\‡4Exó«rª¼HÔrUl÷Ýç㆑´F·£ÃîÀ'Wq^Õj‘Y½±mG fRg_Òù¼ =t8Æ&‘dJqú"=W}“]ÊÂäDŒäÈóRŠÙ7o!ÄÐæÎ~3¹©{cŠm¥8Cyœ··/*—½Þ¬‡ 5dmí‹(zQ÷P­þØ 4¶8É­@u€Ê¡PSÅãÜi×7%³å¾Ãæ‚ÙùŒ9ô@aÑ4y᫆“ý6òvG ÕðŽÊ§ëuïtO;Û9¬è‘¦œTC×¢9fúŠóiÐi¯ˆæ‹oÖÛÝ"6§(ïœß6S—$êº;°ßR…“rx LÐÐ)`Fž³5cÎJðýsB?¡¹Ù Ðâñ eõžM¸TmäÐ׎D&™wQ ^ûÐe¾öÁ׿ËÃëéxIÀøømçäSÃ#È—QÑ Q-ªPÀ\;c`ÊÚÐ^uGCÉ÷T Gyæ»ç¾)ë÷p\0kGÊð±Pò å±ÈD/]污÷åЬß%ù÷—¼B­ÕÂŪÜë$ô/¾llØ$8gĺX¿!)L­ÌL ©ðÝ÷ ^Ï!]ÏØhŒU°1µY£}÷œŒôœLñŽ˜zÎ9p‰)žÝ)Þš( ½ 2Eœ!æ—m!©•Rø~ÍvI«©yêÛðЛâX‘ó¡ë‹z³KòŠ£äerů, ¥¤©¼äƒå°<*šz!!½6e£S!‚£Õ7#ë`_ÿøwD×%a­|ÁÖ§òܲƒ+2.‚&Ý”ÒåâûÞÕsr#VÙÜC’ðµÑåFsËåæ{fœxÑ8ê­g)A•ëyßdÙ!åRêiÞßÛ)ʽ%’D’Cßâû~Ù™H”DX Xtï»éIn\˜6”‡œ’ØTµ®-ñŒT6(>÷À¼BÛ%›äâíQU£›½¾ÁaPV'\+>yE_³ŒRžï;ļ­v×òtµ{¾×IÞ¶–ø>U™5ñ^ªªÄh,x“ Io[©~¿ö|‘_[Rœ€L÷<:Â|øóÛŽË…úç¡~T>è ëTQš†ZÔŸ¥ÁIGç/7ÐyhýN*vC®V˜¨’‹|ö_㙘×=a-ÁtwK¼çlWC‚ñH”®C6»ýUðýž-,^4ö2Š -RÛ¿ÀÂP»õœµÖÓÁ\7á4dÔ§hüæ3ö3w>è÷ƒ¤:¦ÿ탹†¿¼ýÉãÛXÓÀêN櫆Hlè ݺig·û€²µvþøÒR‰Ë«CBi)•ë!-ºhx_Š Q(ŸÒ”r4“€É¥TxüUË]G†šÍkn[¸ú{¦‡†èåÁµ½QO¢µ7SŒVôký'™3°Òä L¶Ÿ-Ý¡…þT¸y9.C)n^²L‡zë9Èt h’‘æ…Ê<:y9ôñu^ZqR…• {†MŸùWÄ}öäâWQåÖûñƒa?ã— “™œž×_ßXåéÛ 0Õíµ3-œÈ¶¿:[ý(×û ·*z w†>º‡37c¿…2‡'ó=ݽ1õ¸ß|ò€ì4ÏÏÕÏnɯƌ[E‚‹â9á%MµvKÄ{„0{üç.Â[ÕšÊx.+0žRľÊ8B…ø‡O>ÞÎÀÑWÃv¡À_‡]•oð1|5b¥7P´Š"3#´¦îVÕÃæAGº¶êоÄo‹lÔ]=Óe_´+×^¦iGbiTË\éý(fŽÅ#IÝ,ù|EÀäÛou¬rM|ÈU¸Ó¾s{-„çÁïM¯øŒä….-½tïœßpø§È`¾sö ¤ÅU±ŽõûH¯æ 2ÒÅÆ×Ý_^ûpÓ¹»ñÚˆ§xªøãß+„=ñE ¯¤n ¨> »nx´Qƒ?µ‹Ùõ.´7&Yâ9ù-›å$,cè,{à bžnñÎV°ß ñëÎ&á…ïR•ûBå"Gl _6–*Àf«ƒ˜?ÎŽ‘ö`OY$),Æb,žÙö‘«`5š>U 3qx•¥ñuó]~Ï«[›ÍfÍ¢4(Óp»5|§C=GŽsNú9—óàøÕdA¿zƒæ)9J¼fu®P#»9GdžÜ`-C°¬#fMتٙƑÂÀç4DÆûA•oµgW€l .î×{Å+lvF4$ÒÄÇ8zîe"º\rÑ-DŒÌRlQà”ôQw,3÷BfÒ³_­çµÜ O˜7]0%7A¬ì¿.[0ŒÉ·øBãÈö,j Pzá‹VòìÆĵÅ÷­xÜ/:¼Ö•wbz®‘×ÄhŠÖ‹ÄN=2Å,Щµù:5-úa&•Ù,Ú™°©›2+.Ó ìù Q»á^z3ÀÜ·`¸7¡S(=õÓRâP]s8ŒÓ¾j¢ª2ýDúu0©–È++g±ìý¤Q¶­åð,óÔùÉøÉÉúU”ózjv>£|óM×CÆ>õ$EøÖÛ<²H~œÏ¾o,F'CvŸKb¿T á»L€!sÙf´´$“P¼·Áf´° OäÞ…×¨ÆØê솇iññ‰ŠÐÎ||ÿ„V°ü\Û¢(ÄÄ×M9ériFwÒ4&™a¦Ày—ìêTÿcìþÓ*¾óï=(ãòlæ¼ïTØg’ÜUa«ý(-aù,G&`_­6ãdq=“ú[dCe=µ¤L¨È¸Îô‘Nñ›£/¦>zS*XÂÄÙ½öØÔw™ª3ùËYÅ„4†7?Í àÌz,Ç=:ʱ%Ô2Åî…–{” 1¢Ú¥*ØBì¶;Ï̲+-"ak*¶Qì‡AvZô&r AåéCÎô´,áeŸÐœ2=b?­<Õ¶<¬yu.a§E ùV’.i{âe+÷ÕÇ8“ ;‰äЀFÚO¼‡¡¨â²ÙœÙÇź>îgAëÔo ¥éV_ùl¦q aÍ¿¿ÈZë»§0I•ôIz ±µ¾e—åf­}~'CIH®ŸñiSð7¿k~·xíÌCîØäˆqÕIvs†ä Ëa«›ÜÙÐÉ•V°üÀîP÷o_~zÇ•;8m'û3O÷â~}7H5Ç!I˜*T˜¾ââ8õ³?Zºï^«~©%Ç{€z–okÝyõbç]ÙG%M±ë(YݹeÓ™X›³×ãÜí”Ð'ŽÝɨä²Í3„Ëïqn0ú~õa¬ôh±ŽêõÝè¿~™€ÍÁ¦¢c÷{îR• IHׂÇÿí4çןl¾,έw¿$}ž\ FˆŒ–§ z`Ü,g?på¶šç»=ê2/äÔ¡xûâ)2÷¢%<ÿ_@Ê0l­”ª ’¦!RZÕ;ÑÖÏkô–ÁG³|Ç„ð–H YéA˜(¹yÏÑ;ÑòCÍëĆ·\gâÎûhÖ™à'dm=×>—§ÂµÍŠa Vjn)ýï,ŽÌÞuý¼¹•y¹çùÊ_¨0}Ó£"%æö`!Ù¤ð.õÃeSÂŒžÒ:oÒ‡á~ °@%>³Û†æSf¢™ÿùï»÷g€›‚%\ u "â™Ë¥t4NF¶sù kþ€ÛÙ’€Ù#ÌSÝ›!‘z퓨*{нˆÍÒ¨««ÖÞ¤µ»td}"çÓM]¯Öìµ'¯…¡F#wjeÚ¢½D/Öªžz•“GŒ”¶,[Ç‘¤Ñø5†câl¿ùuÝSàúƒ*×çFî‚Û´§éÅ”¢ÖÍ7(5Þ‚ŒçÎ:-X]½ÿ’võùBŒ$˜yOò%ßÌ ð0ÂÿKJQñ†4«¡MâAz0üD-iЈäÝ)éR0C»ðrë¼ÅâÐqV8T`–ŒŽè©™{0YtµM.´ÝyïÃ1Ÿ#Ût¢¤W¸™T›68;pKÉ ÆroÖ‹L¿2Ùúä¨ãô‡³<åˆé ãÑÕ±xzpñE¤{™A{m aNˆ†ZÒ݈òÑ=è7!æCzQ¶YÙÆàõж]šùDzº/å`®íX`ß7‡à̯ÓþõGdºóÈRA6YÙÄb[;‚ø%‡x‡–ê¥àóÁw—Ë‚çö‰ºa²•î¥ZõNzM¿‡‘9´¦q-ðÈPïX¨€í§„i4~FŒ×—ñH?¤ª»Å º)/Û¥Þs9u¼„Á›™çÖìÒ‡Nš®|†›³Ù¡-¿-X®fól¹é´˜5Á»ŒZݬÖ:¤CT©»¦’÷G>©À×íl$&vÀð—š"Á¬»å2SnåHüau"}‚3|èm‹Œá´—Mßj“Çê´Oõ"%êÚGÖ\´D­tˆIö‰{¡êA¯M6ký½÷ØE1Þª™R5/þ~)~\”v Â]u„2÷•ìe¡P«5}ñÊÜ÷W.nÁ†¸D<¿ð Má :¼AçqobО´ñÈwL|Ü%—“ýŒÉ¼úsW± å]Dcü7Û÷”²ÀÜF¼˜[ú;S2:.®üvtÉÞŽí™~ŠøåÊÎL“ÅÁ’Tö'ltØ:¹ÑÜ_íºÍ± ·r»^Õ+g´·ŽŽ?«KÀ/í‚YÞé85åK =ÓÐÞãpšçÛ Ò0D>y.f¤ˆ­}ªBØÎ‹×¼VW8江,í)nÕ}ô;xPœòP§@ñúXðDXÁaò-›Ôwžê7™Õ}5„©¸X˜]ÏýâÖÙéÛü‰F+« uvHÓ>tx/òJ‹G˜»,ŽÅ³[a¤0I.G—ÊF¢} á~r aR죓!¢ŒE:ɲ-üdÇöq}c—á˜Dqâ&È_l­¶4Òˆ6Ƨd€(«ã[­¨l óeL®L¯åqv‡uÊµŽ—jL–™¼! H]Å+TäCz!õ–*iO_ÄNR ÝßS«Ù­;¶ëpÂÔ×õíí :ÔDÉyk8'›‰­sS‡“ÛvÖ˜o÷W”„³H÷­3Z·£Ó{èì€ûž[è-­8ñ°4ÍäxO†cë°ý¸¿Õ6ß›@;º¯‰óù{P—Tµ…ù×›¯ÇPGŸ/EÇméïͱæïª’ ×F|%>™ñ,ÞîôÄ^ÝyŠZ‹Ë{^¨´bŸñ6à«R;ˆMˆäƒÁì­b׺[£.7mUªR|‡f.y“þ8·¦æþ] ­u™—ØhR.³qØß2œ/}~;ÎÊJ|bZ³bwké´dfÖ`LÊøŠ±;£K»ÞB1@WIip;´¦}—¼}J+Àfa²3Y*Ÿy¼‡“WÊ»çñÚCÐS›ÃU”8¤J^Ø}ÅPÜ=â"Ñ«ZG±:“i,ýózýsÁC"ÊK!+Pm`·,ˆBÈ)ú_0êB2ŸØiÒ&}T%g[¦ö].{/aÁ÷àÁÖÞ}®…¼W4­ÕÉ(öƒ)ŸÇÅÅÒE"@83 )ŠEÝÕòñã{ž3Šš¥íºãŽD|c{~Îø¯%}ƒÞ#˜eÛÛÕ1ïêpSs~Œ&~ ð1ÓkòÓÊé懲 %3S¿¡¤ãh§LNÛ=5;X5Þ zÁTÒ6¬W»åg¾Ýľ•4‘“_•r°™5Ò³†»Ä¯œ!Ÿ?IéË2ØS š[·VÕ™‘ ¿|±5Á@•Š×†Ù¨$VŸÉ«UCíQÕË1cJ¥sÖθ”Ü1lûš€ÊP!UϤ¢=6ã“Í«¨2©ïñ7zÖŠ}X»$RFÝM|AÐý‰ñÜÏ vÏ¢i$Îk½õïj˜ò‡v9„ )) f±YyÉ#†¸íJê÷+]cCë¾.;¼‰ôÑUBxûö½Þ8ÍS?×¾xH¤Î>½–júhþ| ²¿@t¹*=Fšß7±D.ãòó­;ëiFF&þ*’QãÌ•q±8´êÉ”21v³ 'køz¢ÏðiŒzlMv|KÒtÙK=þDaTãL›„»ì¼º·ë•];¼¹Ý†Âƒ»ùRÑ1º¯«^ßkêꇵ6…¿Eô'u=¥S &D:Ý9LÞ2ÄíY‘võ$/ÄTO +MÄwxb“qúæºv“¡Gƒ¥-ÎÑtýÊ ÅŽØçýmÞDì÷‡!øÌž}@šžðíåˆ÷µ U9ªcnôÚôZy{£cçȪ£ð\B)="ª²Œ,M ÷he€ã ±åÒñ|;ÖW¦"f)Ä‘›¶ÙËzq7þ±f„?0’Âéäu^乞˜žºð›éÒ½CCÿ1÷ìé[ÎsFÔbµìŸ[NöñõÀ£—³¤·ýÜšÒàÑÿó^  endstream endobj 191 0 obj << /Type /FontDescriptor /FontName /BAMJYM+NimbusSanL-Bold /Flags 4 /FontBBox [-173 -307 1003 949] /Ascent 722 /CapHeight 722 /Descent -217 /ItalicAngle 0 /StemV 141 /XHeight 532 /CharSet (/C/E/F/H/I/N/O/R/S/T/U/V/Y/a/b/c/d/e/g/h/i/l/m/n/o/one/p/period/r/s/t/three/two/u/x) /FontFile 190 0 R >> endobj 192 0 obj << /Length1 1166 /Length2 7144 /Length3 0 /Length 7907 /Filter /FlateDecode >> stream xÚuUeXÙ¶EœàI !ÁÝÝàîÞ@# 4;ww,8‡à4¸\‚;̼¹óîÜû¾úQ笵kË:«ª(È”TDÌìL€’v`( #3/@dkâä¨j –cPZ8žAc 5Ôøô3!CAv`qcè3¯fé7†X™,̼Ìܼ,Ïkf¶¿í ¼%ÈÖΠ„!6 ð3%ngêd CUìím@@3 £ÄèÈ 0îì?«ÄììÝ K(€Z]E“†ŽŽþo„…‡‡`âö:‚,ÀÊç…3ÐÆÎþw¥çR@0òÜ´ÙïX%sc 3ô÷¸jK(Ôž—‰ÉÞÜøŒ1:š3‚P&šçF%Àfbv¶¿8¢üÖLš>åÆôOݬÁv.`ÿ€ÍA`³?F2s²gRƒœ€2âÿü ¡üY¡fVffVÐt5µdú]RÍÍøÉò6›yyØÛÙÌm^ sàó ÅÃÑØ€Bœ€^ÿ—ø÷ À d ˜-žáïìÏ0ÐüϽ¼1rè2323³˜_ÿZé?¨™ØÆíïpc[ €IVNYRJŠîŸ³ÿ+JTÔî9% ;€•›ãÙ)Ïy8Øþ™ñ_Zü¥Ã¨’1èûdþ;¥ ØÜÀóç8Ï:þ5’3âøìMõ6¦ü{~;(È þÛ:zÌÌÏ®y¾±üWKýÿ_õÏ’N66¨Bý§€g=r€ßŠØCþ#ÜØdãö_øg &ðO÷ÿ?yd Æ6 S°…Í¿d9J‚\fJ ¨©åŸvùKe³?ÞC ’#è÷› ``á`ù§f 2µŸÏâ 6ûGI °©lP…>»Òbö/à7mê<ËóÇ=?û×ÞôÜ è 4E™›±3åûhUý±åºR„Ø…ak”­‹Sýòɉ”%Òvƒî›u11{îwb¦¸Ò¥à]xyxØ b‰H.kÑVFDlœ@l8éP¢Æ~^´$ê￘»ˆb#’³wÅÜz¥ÉJ/µ)ÅF°Uƒìð|Þ^ëlï8("“”æ—#+îÌÐðàßú)JÛx+ó"L ´‰3[ù'£Ê¶×ßPÉê Ö\á”·bMÏt‹¢søLI¡@«OLˆµ‹¹xÛFÚYo-KšÍo+ìó9dÙôíè{òáõ?,·ë"æZ謽±â{>GZ¢Bb° “6ú¿ð¿Ã…ø^·Ïö¢Š¨«ØcœlÊ‘kÖZ”OO+]’tÉ:ã²Å¯ÖÈ«w„›ÕF’Žƒñ-”‰ÖÔØ®Ô[O5Eb7ºUÂAuM^ ­ü®®· òm%¬¼Ž&MÄ»BÖqÊ8¿ÉoÀR¾3\%Ig©ŠµðLg¡/›M¡ nuË#Ýv-µo®¿6†¥ôLØw'Ù$(÷˜YꢙçÑ5•Ù£<¼U§B˜êãÅZKv¼¥/wïgHËšóþÈô#Îê|/d ¡{Ql~Õ¯Œq)+tœÝðã·$ÙyÎ’ä®ÓÐJuÖ™ŒN’K‚[ñ€N3}‚ tÂx?]Øy¼ÇÅ»ÙÜá`{+/U*9<¾2Np~¿ú#]1Ë«§çNRkb_++(…û òÔ¾hÎ+3g¦pÓ,]+ä€ËG"3»«Êf½‹N±• ²º+uG%Ö§– h,’þØÉÏèV–¢HëƒçEÓ"¤ÿÌTň|†|¥ó‚S’wŽá噄 )ìØ6g“Ê•çØ‡ŠŒ…¼ã·Æåñy¢Å¡ÖH„hÚ›Âo³BûƒïM²|B.t;5g‰ [ìA)€â^ªNº„z¨åþ…g{«…Ð k¬–ÞÌ1ï™á«ë[Þ!7BZ‚ Lài ï˜F¸J&åéÙ¨¢±?ƒÏ‹ò GѲùE¥XçùUF†4žVù8¼Ô2Eá{½>»Ð29Òâ-[è³b‹ìSßøŽgåâq‹EÛ¼ÉE;”ü#@g-#ftK¬¶#}m—Kt/åëà0ò}÷„¶ÁÁ”ä€èQ!Ö­W ÖhP¦z;šwo Ô»ú }Í0CÛç€Úúª,+ç¥ZÆBróÍɼhFq¿i=R zawZÉsWŒò@üšÇˆ¦€™ô"r»ÏéxRéí—MtÚÖL”^ª­þ€s†˜™Ô~¸H‘wRLdo¢›¡òÞ½”‡ð³Ê^ µ² ëÍk¡/,Øä ~œþ^8QŠr¥ø~ïlðÕV±Yö|Ê_96¯µ•Ûò®ö]äðÕ¨XÇ`ë9IÌMg+S”'ÉÚž.y˜*2èý;°Mf $4tÞ« sp§ˆ$ 5o)Ì4ƒzµh/¼Ý(úÇŠ[_ÝÒÞËþ®™{û×^DYÅå/íÐ6ˆê8ò˜®öÙ ¾ÖÔƒjÀ‡$Bâ]§í~ªZ±FF‚)f›;–Þ$׹ńbª»€áæ-vfÀ1Í…ˆ³íÉål)l $~ö´áÊÐÕ;ÍTç,­šún2¸5A­•¾Ûä\2[GÛò;Wh¯0p|£øÔ\ÅXt[Pð%ÉCnÞ¿ª·æÔHòÉÌ>ñåÐ~ÌÃBy'ù+÷-”|£F……(>Åv‰S[=¬#Zp ŸÕ9`T‰"fŒt"„´xúŸ<ð1•iÚä÷]ä°`IC;‡Yÿº{lÚêô…‘×¹eèýðFk]êw˛ظvªx‚;Uíô?FØÙ"š~²Ðcé•G<¥#i Xæ®Ä¡kº¤{#õ™X±ÖoÈl¢3ÆÇ¯Æò>tÄuá…™WæMú1ETÕ·kêtIZš¬›Í‰uÆÅŠleÅ9ÕÌiefŸIÐJ¢?ž[’Ž÷ˆ¶O1ÀVß7©HÔ„{xú'¼¤B¼‡»—˜ý2Ò9jÒ°Æ˦•¶Ù§!Cw(ìŒL‡Ÿb¬F "Ö! ·v3€î€læ3ãü”}ÿƒR_ßÔÿc@š½XE/Ú›c8 K ¤•& Ï0#ùõ<EWž¡ r5ôËq«,§×êwus¥•Vo®Õ\ëLªÇ2÷®ò?s‘{,}–h'œ{[‚ÓAäÊ¡ÑÞ>DrM$¿$´V‰n!öE¼)*ØUã?ô»ÌÃ| À°z{Ò©\œJKGš¾ïEDB"ƒs©O=‘ý#fF˜qJóŒÕ­¢×-{X‹WîÃרºÚ·DîvÚ‹a7<’Bh˜žþP®Yð“ŠP8uƒÛײµ®^6οƒž@Ϋ`–vÊ ×‡¤…B9­2F~®:?‡ïYÎ YQI™9ðmE“²"UK­úqç çþU奎}œæéD³‰U Ô¤h=5D–`Q."Ï%-l‡Ñ‚tÄNäbrµ]Ô#T>ß{µÒÞ矮"ª`ΘðSù&*ÂüFà:î¯f‚Èù÷ÛúV‰•×—»¶9uC,ÎÞm|1´´Wü¶|1nM)Ƈ–v"¼œ‹¶šö&Ì2ãfÀƆډªF…¡`èÚ”שúEÕ;º…¬§ŸC¶Þ‡p4J¢o·÷Úe8¸ÇŽ©d’ì‹ö^­7 æ0!VØùå¥Îm„– í±û1ä§ädx.íïc_sŸQ™ÉûJŸ2 _I<|C•r9¶úy¾¤SÞÏ&BzvÓÄaGѰod #Û¼ß\Ãhp½X7ô÷jøº#_ Þc¡t(hD½|t¿dÀ´A„OûاùC—Çh¯Õãî–\`ÀÏ3”Ep^5M(5íÎ=ñ¸jtÓ8²ú‘ë«Kˆ(•‚¢wä²Õ‰ÌrÄX+)ŸÊ(+Úâ2ƒ¼ µ…†Ý¤hrß“-¹’AQ¡MON*Ñm±ÕÊEw¾ü.ݸÀ¯Ë·ì,Å"7SÔã¨|žr†u.áÉ<“)ÃU—ïFp#äבKdv_½ñ¾Úa*žÜÖêÁ÷h’6q&¯o܎ʬr³©K( ç“Õ¶ÅÀ¢Ø'`´°—t±eÛ|\’‡ež SˆV¬æ‰Aÿ$_¤Kcã»;·p8FÄòX¬Öq,›i¦>…²“óD%$žß9§ßÁÞÏZÑdliÅm­^GM‘A¸ö£~YpÉÐAMÖJ::ÆÅöO’¿âp!€ªfi=ðe(&¬ÎrÂl¥ßÆËýÉ ºäÏTrQë§«M0'^+塀gИDdìd¶î:ïû ñL‚Àr!¸ýÆ%¶Šõ ÞôÆL»Z,'{ËR ,Û´Yò¥ãß<ž#ðØ9€¸W{µ)Úl¥Þ®awó  nÊÊKñNÒ%XI¼£9ÓÍ ÃH˜4Ï9øyNÕ ï/&q\ýûʼö#n¶8oŠÿ ë°»R£KÌ‘UTJèN²³ yMXh{”I²}o`»!êÈê“9cʪnÏqÝŽ ¼}}ùò5Jêd¹¸Ïh¿dã@‚mžYÇq”žpÂ"Uiºù°c>[ù+JNÀb¤lÚKóbØ»U„P(kÈs43…løˆ…—¹Ž×Ó*Þ„¿l½â/ÃZ\ç Kll9i\Ú)(Ès¡Ý)jWîLÉ™‰né¿®ò]c0…“ãzò¼¦+Á‰üAߘmtH"êÄBc…vÓNôh‘+¦…¨oB)¿v5Æl(ŽS¾Ö0ó³9¿Õ§êgÃ/Þ6bÞ’§\S_‡61d©RØØ3N¹±Œc®¥¾ÃÓ8¯Qï2s£|\3ÎúI‹òSr^+3åð«:rLüÍÁúï Ÿ±¾ÂèÐÄ,#çÛÊ&w:ÔN/~ÙÞ×ô»BÎ}{°¨\b}?Ï\ÿ MJˆt´ˆX·v˜;2ŽYIåCm?x¦…P²Ç3#þ*Î*(o¨ûÃòÑåye@÷ ¤îz/¾ïÞÐK´Ø ¢;yüS¥‡_DÕD)MÖ>F*·Ã9ÉÆ-êý¹p‰mÁp¨ŽÒÜ›ß6d<ýi7ùQ$D¾yÌíÚJ^í V|(gpø{b×Zpe¨ŠèÃlÈ.uúóHWäpº³Í£zÓNšÎ-Ñ~ZâV„"דcQ-Þ•³î“ÑÈäá£lE¬„NV‚ê¶q‚{Vë½ÍSÐ1ýÜ^½½Ÿ¨rö?ËÄ O"•$ñ'Š2¤Ç÷iëxçtbŽ„¸:DÜ ²WH)4P³(ˆ}´’šˆÌ$S²` ¿ ¿N² m}L_NÜ7hä[3¾Ûê%Y&Žýõ)žrû¤$ëC”]ÓÕUÛø’}ff¢Ñ­±†¼å¬Ä~ XmÈx>[_Õù(Ä2PsË‚L:Ÿƒ úˆï=¿Ï¼=6þæø®zYm5éé”–ÒçÞœk&D·Îgé#4ðú·5¤î@‚„ËŠ}aß~nWùšüÒ°§0-k‹N%^-Ɇd#ÉÌOiþU!ŠgZ:QªI}L\À_\æÌßOQ:±€•¶YÅ']Õ%ÞòàçÀ­›wMw‡ÊµkÀXsòƒ“,ک梭š¿ÔF£ õæžD,'jÙܧ3SJbÌ8xœÝ¾Üš†±„¡‘Ï:—âÝêÖ³0E«§ÎžMc÷ $o*=ÑHŠêï.»£Ê8¶ÄTj1ôìÐ Ìn·ý%?+Ñh8y­L‹²X‘è÷ÇÜSz’h½|HIb2I}eÈ¿B±¡°ô> ³Äüøg8Tî2oÞ;¿Ç³Ò)JIÝ»›Ð_Õ<{Dù~[²¬´ácÁbM´Ý’â<›?Yç¡Tl;ù¡·Z^°¨=(×ç}«•,¶.˜”~WT¸ ¿…$Z8 s4á²²Àïî´ÓÝç¨EVZÝqzþZ…Ëw9%èÍ·•QÜË'Ÿ„ÚÓý´&qãÛUYl 1ÚÓ¼rqF·e.ûZüwnÖ'@ì+)—ct[\3vu †ù£¥o;æ÷u @Üu (7_åë7<Àx;¼„.»žÿûœ3‘‡ãrî/ܾ¯uíºD”x‘¯Ø.ñŠªÒõ9&œ€*÷pvb(îíâÕSm‡˜Ù)`{a:8³è™ŒüÁ){)ÄŠ`);ä+žÈ7:DFµ­s/z=Ël-°Y!Ÿ×º«hçÁ ^šæ|¾¶í¸—v¾:ÙÌnrF¸tË!}ºZ-¤Ñf°ç¹“úÙ„˜wK»u8ã.¾TJ‚ý¸•4KL¦cŸ¿’¸à¨Þ÷Øb¶ýd³,Üqýòä‚þùùšyœ~®…ÍLWWÇ(…,¿æ8 ´¤}ƒ ~X™ °Vk×O ;«âÐå¤kd™R¶[¤$âÉ2Ò$Éõ­ho\Çb €¼e¯1½uS[qêüÒðjYRŸ·÷pT5ßô”öAÑ\œÄfýpbvñš˜ûzð”õ~°È÷ûe[}Õ~>ÏÛ”ctÝîfá^ ¼hÿºÚì_ÇÚsR;t¨$ÜYî‹GB%„æýk¯Õ8Íêµ…¢{¥´ŠHfò.r‹~ö{OßV.}Iù6¯<c<î©DÓ\^>Á ?éG¢Ôšˆ# ƉäÐQ32q´D e³äÞÐèv~ú2p ´µ‘Ä>QGŒô<Ð8…‘0ñ4ÅK1ùpXÍ×_S@4½%U!=%>àµÄ_HÂïËâ½Ðk-»æ¡oÔO‰}Ê%Õ'à_¯42''HG›D¾˜¡ï+\ФøXþ67~zÌè54mŠ’u¾Æ"(Ð{$*´Øsnå]lÁæz^Cr\0"ýSÖ"’©Îä‹™Ãå~Gi96•*øÑׇê/ú¸ äê%GÍÉ¡Ú/Ê‘ ׃»Â£^y‰:røf³Ø«‰¹õDã%›R:-¥Ûf¥îöXÍ@T æö1WDç{“d‘–›((‰i„–¥%`xrH z"ç_‰%LÊ[˜¶·´“BÂŽ”ˆ{u¶'lÆk¶ó_óJœ2@8_ô”¬»ù/¾$Õ»ô@ôâÈH þ¨PB§\›üìÃ1²²¯º–äݾ£A‰ï*VýübJ•¹Ï/ËJ15‡:Þ„¬±”ze÷Eó…? oÿAaú*ú‚ZÍrcåÏ(ž “.Z¼·âÌ–ZYK}K+€ÕÔ¾Þ¿Üâ1g×g«µuã‰d·±‘f¬æŽJÌ|ߢ–ÿ{Ÿ§KPU{>h.ù[.“w(©ßÏl: š²S÷ù›‰òñæ;L[¥X 5ÑÝÞ Þ±mž‡Ð{áܹ¼-DK£¦¼åœ’Ø­@’Âì?úü1œiW^)h0CŒ”¯ A¬«cª…N ŒËþ{§:t\ÏT~<ÆWÛ” 1$‰#B¹Ûµ1Š'+ïL[²ëœ:ùÑç »þGES¦ endstream endobj 193 0 obj << /Type /FontDescriptor /FontName /JLQFGG+NimbusSanL-Regu /Flags 4 /FontBBox [-174 -285 1001 953] /Ascent 712 /CapHeight 712 /Descent -213 /ItalicAngle 0 /StemV 85 /XHeight 523 /CharSet (/A/B/C/D/E/I/J/M/N/O/P/R/S/T/U/a/b/c/d/e/eight/f/four/g/h/hyphen/i/k/l/m/n/o/one/p/parenleft/parenright/period/quoteright/r/s/seven/slash/t/three/two/u/v/y/zero) /FontFile 192 0 R >> endobj 194 0 obj << /Length1 1199 /Length2 3286 /Length3 0 /Length 4049 /Filter /FlateDecode >> stream xÚmSy<”í÷¦,[ˆìF¶ûHvc)K–ìe˜c™ÁÌÄ {öµRÈ’,É–=‘Y¢²«d/D¶D|G½½ýÞ~}ž?žû>×9×9ç:熛J¨£q‡%HÀ%aJ`CŒ‡oŠÂž“0œ‰z”;˜ È¡@ˆ†àüÕ… jz(‡ÕBÈ>f.D°Ê, ÃaJ0E%Yù “ùåˆóV{cÑK;VNœ[ä ³ )jÉ»R”·Ü\8‘ÓS# ψðï4G63²Ž46S³“ª¸¿ ¡°äÔkøªqEKNYý›Æ-IiÓ[òmó9oó¯ßʦñâWsÌ|ìLì<¯»¨óн³Ì¥Ú&ž10ùÉ’Ï€²A×dezì£^“f5PEþÔ^"æèÅÃtµ {vä¤JÇÀYþÆhU$M4#Z¨»²:­¹3Ýï gcø=Û`ô'+X)c±-½ùfØ…–«KÃ6Ê =ž$J‹S‹ ò×RƒT8Æ$htêŸæ}”,c‘r¡—)Í´º)ÕèøäÍeTDN[‹€1½‚çLÀ§»GVL˜|oK!º©½›/?¾Lgc¿t1tM%k@+V)RlsëºKùªž]œ±aaí‡ä¹ ÏÄ…š‘Œ{R’ØêÇpÛöÅ.üh_ÔÈ…Ë™õ_hUU°—VÞ³·”µ\P}x3OmÆÙÖ7\íÈxNÅ1[,éá£Î+½AØQŒ­ Óó_|‚¦„¿£Œ9ùEžòäSnÂp6gïá'òÚ[Ö ôwŸG"ïlœó@©i‘F¢=Í{7Õ“­â½&NQfco‘x¥×¸ÙSK¨pøˆ3õí¼t¥Íâþ¸×uTô©U…à¦OWÑ÷ÉÈ4u¹Ïøfµ–¤3´Q‘Ë æþ×x¥Ó–'­×Aûoà[Pùe=éf¸Tï‹­¤êJ–j6М²˺žc›ÇÊ;xïž Á¨Ž¢1@#\??ô§&Û^«»&úqt,X¯ÃaëU%~ûu­¤+ uÚcV8˜Y”8´¼æjÍDÁdñE„ÉV\žm wˆ+îóK¿8Vçèa»É5Mû@&ƒ[' øˆÊAº;Àº­¯†¥\Uz™Ú§kDŽÒõw/>†ž†ˆáÛ´Œr€O›Ãú,w¥;*H?$}’WÆWÀ6qþr¢†©ã\íZU¶ût–ÏÕÙÖi\{ÔÈS_v†=ü$AÙüèq’VÝYš—ËwðÈã!~š‘fáFfÆ/ýïGö³ úÏмµ.©ªf8õš‹zM:¬Ë¯«EãÒ£5è爸üä§Ê¯óü¡ý,Ñ“Œ2öšO”qÑ¥gÓÇ åŒSÁJìrc–ë ¯´Žž× ±´tŒ¦h}j§e¨LÏKV­;4F¢ÖÙî´oé/®™Õˆy)_'Ì~ŸË´É¾ÿز4,x}lË‹¤59ö\6ЇÂº“,kŸ Ëpb4¦²´É¤° övþ“ÂíÜt~p*®Ú¢µ$ŠRvȵ†³ÿ "³*±wUÜ05Ò¤äˆXF›~éì»§^=N™3/ê3<©¿dDSµº£_álϧydGf.÷Òži€Îu:Q1"Üš5ºÑt„h±aü0±ÄÕa¨WyIž†¾¢YL½’ 4+ƒT ËÞd9Ù/ ö;#²D/‡7ëÝ‹pÎØ¹TxìUç#ÏØL¾Ú¶çâ@†¼ZÕI-s•‚ÝsªÜcåÝ ®!êýN»m2¦Ý­M©d·öf¹ÖéëBבiµg³[¢µtÖÈÝ8ðbÇïxnälÛycÏÞ¼ìäÄŒ—[R4¡XŽ;qÖ¬Qß.ú£Å"Ï ºáRúøl í®ï¯VâlN, cv•h|/PŒ„iJ2Á¿ëT¥îÚ©¸@óx2M®´Ienè0¾¸g—dò¹£:ËdÎò°‰¾SèË‹TN+½oÛÖž®§0"(>!¾r“ECÒ$/ Œ­c }ênƒI¯ËZjDݻڂC!êêÚ¤Ã~x^Pu¡h˜î’‰än­›àzE<æ‹ÃP]Ãi;´Þ­“:,ÕÊß2¨òcC çd&Hª-­"EqÇïÈ .Z°z|w©ÆcO„Wr¨~µ™#ìwf}¶t¾j@C=pU@KA—†/›Îu  vÛSÁ˜…dTKAªJ¹3N泌ԯƒ>¼é漣@ ŒY­º~¦kÎ@ˆuê´Žè–ìÀv”þ’¢2“yGb¸0”VO=ï…÷F¥ÓÞ©V¦û‰u\‘BÏ;)À5ÅÓ7 u²WºnbâHoÕ­d7üM4ÊÏpôô’ôeºõO¥j.-OñqîGt*9Þ½±ÞræÈy ñŒ¥¬æy‘¢!ÄÖшXGɼ4½sMe­'y–aã ¦MÓÍfé<•/è‚Ðcq{Ay>ñèG‹š"5ÛÂK±áS~_ó÷ÇwŽØbÑÉ2œá>ŒÖ7+Îð©Ø=[cRÊÀ÷%"B›– ñå\óm.þO´1¥¶y•¸owÔ6>Ç `Xò£O=Õ– »vªY8æÛFq{ÙТ쵟«€ù]îªêëûsï‹§XSã˜G6¸bØL)[iQ)Üò€Ç.z—þ=Ô!‚ç£ ÍõäRàµHI–µ¶¶šk4[ÎZèÅ]ð‰ãcéb=šºO½š˜ÞÆ¥r¦x'ô6^Q{4µÍö½µ’Ãò„sCÓévϘN¥5Ù—ÀcúÙµ“•B†RØ‚&ël¸*o­D¹6Ž©­¾UÞËáÐ6)ÓÄØÃ¹Ñ¯Z—o5ñÖÆ‚ŒÔªOlhÈ3ÐÏtÎtŸEºj‰îô{dêîG5 ¥-Ï0µn3Ìžb3íJ ²²P»QñH¡¨«óþ–DÇ'øšÞfÒlc·¤H*÷Ñ„‘È­‚Ë”9Êš—3eáÁ-œ7²JñïÞo×ÙŒ¿[  Œ’9ÆÓOk¬J·íõ|)!þ¡XBY Ð»÷°†êž+ëÍpe|zQµ’|.¤mqöe{3óžhšÓm=¯±D§Ö—l?³g£&}r_b;¹×‡(,ØÐr”g=´Vêì„Îî?Ï÷Á~[À]ÌG ¬v¿«B:?à°RF‡Ë/ÆNI¿~œ…¬?”ÙJ,â6½‡ ’$a_-ígª?„ Z@»º²Ñ©žGe"³*‹œ³óó͹ߵCàbÊ¥÷¤]Äã|,âqÐF¯†53„QU,³Ç“íÖBÇÛ…ŒWOVÎ× 1î-66Þñ`÷bI ’ß²0bòÇÍ>¿S;Ý3—‰Žiz~ T+奰ÿ,#ãuLSÉ¢O¼Lÿ^è]þ3×8‡DO.ô¡†˜’xâZ=ÚE“¯2Çó,ŒÞÓ¯/Ÿl×»h’ˆ<„œxÂ2:™á,ºw÷v¼Ô]Í2ÕÇmÿä­+ŒºN'¨2¸·¾{##f´ø(x‚_7?ã…ÎñÏìli›óHYÛ½ùUi5M\°Ž$œ”ÐÐäß>MýuÍb¼;ÕTg¶^gµŸ"ýt<,§‹Vî»^˜oèâÚçŽó€s6Óñ[•WåOùRÅ—D뎌eûÜÞeï@ÙþÜÅĨVNÚ:Ž0¾¨q ÙÖe—{5É> endobj 196 0 obj << /Length1 1626 /Length2 7807 /Length3 0 /Length 8641 /Filter /FlateDecode >> stream xÚ­TeX”í¶¦¤Aé¡;†é``p†îF‘Aé–é.iAB’n$ú½÷¹¾sΟsö÷ºÞgŽîµîõÔ¶ƒÀ°y~ïŠ2ÌÖäýËrsù‡Ï ÿ3 Öß;Ãö@Â ä ƒz@`[l gׇ’Öÿ›ÊÜÿ>‘ÿ ÿ[þ·Èûÿ÷ïý—Küÿ½Ï‡VpƒB5¬œà¯7ððÈXÁï @ ðû¡qsúo)VN¨×ÿ–ô÷hCð_leœ¡ ¿û”]­F" ³{…—›÷/#¡ñƒ´ ®6ö[+èüþØõa 0 tý3R—÷o>={ˆ#ì·‚¹À0Ðßé?Hõ‡<´¼²Š¶:Çÿð¸þ ÔzXW=/—nÿÙŠº3蟇ß022Ξ. €‹_øp÷‰ ñúý%ÿÿuV·r…C<&}óÿtÿŸß¿Nfƒ‘‡Ù8ƒ~¯®« ô°iÿ4üvÛ¸Ááÿ¹ü]ÿãügçÁ`O° öügñP‡´Ìtת'9ý#r&Ý@Ôþ0—¢Z½üÜÀJ玀´W+¢e–7¸ëÆÄî>zÍì¸Ü®«°o v’AY:RÀï©üغr‰–˜[„96‚yÌ‹ðÒw c|§Õ–ÑŒ…x 6VG´uÌ oЩÇZøá˜‡—l î¹/\ðýmRkâI[ 눫òvv™ßü¸¼`éèïë8~ÔµNÉ‘Å$Çø2›RÊX¿Ì'îI_>‰…=éŽ㎻ôgR”Õ–«­ªn•ÛhH$ñìTÂÃ$Kå6†ëì<°%ˆ·}ÊSkTâ~á³ØYžÓ ?“muŽÏàQvx ’ª³ºÀ°áu”·C×-ñ$8Ãj/R#%ÅAI~£1÷æ—5vRúsÕ"®÷¤I²™f5dØÚ*#áÓód¹‘ Iã=bµ‹¾ u??mš‘Œ[e[ÌŠ%„Ñìx´:•É$iÌ22ßsJµÞ;U§zÆbIÀÇ#þIw¬kd(³s qoƒ5œ×ò|¾2*‹V)³ %âû&„Áv‹ÉÓâtS{{ŸM;›U¨jÄÄ&ê9€›Ý™\¢Ó±(PמõæMè+åˆãSÌšÞuŸ†òÇÕî‹ö¶3¨ÞÕZNtk´è÷;Œ¢3ôÀä^Ž=V½§TŸ‘Fe&ç‡K^?ý20j^\ò®_tF7‰wõéY£è+EÇww3¹3ºèêÄÕì_K—þ¼×~`ÊQ3û]×gÚóc3z¨(Ôò—¾eæþ‘´fÅPTl†%¿æA/CåÊ{od³²éw“Ô Xo fLbñÂô«öÒXmjÝ?Ë¿ñT—%é., ¿ýº˜xQ&–\$«…6TÜ&Õ„ÏñvewBˆ^l\Ç*é4˜K‚6ZÖ©ÛÇüfLJK?@GÝw8sÅä>9µâ|²—¯/®{8TÈÞDõô;¡Iä5t ¢Ñ]˜1"¥ûL^Û1ˆLô¢›ûëKåŠH>!ìW¹ #6ÑûLþh |EZÇp¯K~¢ÈúOæó 0-6ùöê=ûêÖNúÃ/n¶š˜Õ‰OHWvù"’lºQ×$ÓÔJêˆl%?e¿¹ «Po³àY¿×tã¶0DEÖ8 ¥½I:’­Þtº¸€qYˆZ{²ùX˜¶…ùÂÚ¨’ø»SÙ­÷‘.QGŸœ›kØO„Ðî÷VDE9ó±¿u`*–QËãc\Íì\;*cçKùºg+XÒddú©h!„vòï)ªêå~¬вÎ,rï¥Û£ó‰ZÓõIï±]7Õž•Ðÿ.g8ã§;mÖË×SÈ€ž`‹Þ¾^]š¢¾í\I4¦ŽW5þJ'³®wÔO/HãCúd†ûUÁMlQ<$ƒ°ÞJðr¶¶V…’5K5#u«:*¼ÝÔ˜ÉɱýƱnÊåLe tÁÖèõ,~a,Ñ7¾ ï¾òÞ2\e“FÆœáQkÂÏæöÐ+:Ç8ŒF"Ÿs cM‹x‰ò³¤¹CÐáVSÿý‡7[5ÜÀ…؉åeA¤pû9¦€…,Ù0¦kdSìoª› †xÝ'›ßâT¿ 6)|0#Êþè?r†•Üî gAÖû@C$ýáDq[f¬nÏÛñ›7a-ç:f·Ë“©˜¤æÈý"®*ë$m€ü—~N8d0š,¡Í?9GRJˆã—±ýÃðXA¹ˆM(l¥ðDÈðn¼˜­Q#Lû³ò ¤[cú»eù„“¿wU"}ˆÎ£ó;ʼ/£\w Á=ÆY©w]ž•¥Yr9,ÞЋ56Èð]á7­[)âXlÚ['qÒÍò´÷c•Ù©¶Š|Ž6˜Ó”Â6:Œûô ʪ¡Eë2¯3¾²H†ÉOÒÛ5òΡ´#¤ëÏ6&qL¬Œ8Ê´^²âßH¾ð]y¥I€Ð:†yJ-,Ø© Ñ&Skët"Ó®4káôéwûÜÄüPN?3“-Œ¸B®ž@º¬–‡ë©ãÊjö—‘È$²Ëšk ¢wú }­8‡"Z€ `ä9ÔØOìüÇê-“ð‘ÍQËä*RŸL6 F l˜åiÑ”ñ¦”ÝÇj¢Nî!{í*6Xé¨_2ö·‰/ÅRh§)c!Gz9†”3ñ@É62…Œ¦“ª‚ëX“'”QJ”>“É^3NC6w7Œyñ¼0Â,ªŸŠ‘ ßÖkšY¾*í¯:]/Hþ°uùó «/šýZez·ÇO™@®GnŸ¨2u®y ¥<“5€eÛèÃ*ÆQŒDh%Ö½©J®†zuN¹(We |À¶RÙ íç5œöN;yÓ¶[×MdÊr-´Õl0£dbJÍ•»vKWí}¶ÇúXõ û¬ð—>U{Öª®kÁg91k¢›&Ç?£};“³ KË$Pï_Q8´ïŠdséc濱?ìx‡/}¾À‹É:Íw×ÜÝ›_þ¶8ùKžBH>JVᚯôDsFïîGÌ{°íá?.εYh\nÊ|ÙÑ#P´»Eð9ÈvW¶ðA¼nÙÅ\nfß4÷ÀP‹„ø9T¾rlƺ˷©Oì|"¿óê¬0×Í'áÃÊÕ ½B™F¢½©(S#”H· ëBÍž²v“S#3 [ôÁ|að½–ªƒLã”8tQƒ¸2•ÔI½oŸŸ:Hõ©ÅS>n¿b›j›ÙŠfå{ kooä-¤a¶É•¬ÅLòÂ'ï‡ì´ùѱq£û\÷|¦¶µ0ñàÔóšäîDÕ¶Éxèë*átÑsúQa¡èF %ÌÙø"#È•Å÷ôŒØZ9³ÒÛ±f[N~Ʀ2ÝìÈYìÈ©¥?aëóâ¦I·þŠ~&"[žBtcŠÕ ð™Ádxgh§„‘õ£PpèþèVC¢s1L Š2ðäv&âû˜Üá}÷×Ê(ÓtͼìC*n}úÏíŠ)rŸVî g‚³Úüz˜Ú—q 3Zá¼éC•Ô-†nhL|Æ\{q7’ÐE¸ÍràbüÞEV÷ëLGC½(«ˆ³çÍYt°‡Áu:™59#ÿîTƒTàí AGk©[J*qÓY&HÖŽ1¾ý4±òµ¡.h‚…Oþ^¥4En”: ©`û>7q²™q…_>V˜e_5…òH­< aîùÊ#ð¹K·~Ö!¤hNxLúÅ5kVFAœ"óQ§ÿÊÞ÷ô•ÎËã‰AÉÂFû¨BÆqTGÞ~ö±RÙûÈÆ/°éšT’©ZJ†-J§u‡"3qìLJdI]±=8,4òšJ²b»É“ížjÑ i¼á¾÷ øõV©ÝZ,çu•k´ßò7_E㢩LÌi7 ¾â´óÅê‡|Épí£°¢PÑ@÷ÝP½7Ï$6o‡Xåqn§–_!©`fVŽ+_Tm•„|@¿9ÊÞža TB„-gØbÑ¥„±jnæ¯ei¬«®—m7’kJFµ EQ±)éŒgÖð¤$['}Z$ùþkí@)$lHïƒÂ]ÔQĈܥØtqë×h˜æUà{ö5ˆM~¿£_#N”• c ãÈ;g]ï1~*ß1PàtjÔhNÆ¿‘¤@VÂ5æ¥Ù¬Yâ6@®bHÅ/7ðr¹4%UW­®ÑS.ÏìhÜpÑu9WGÉY‹äE¸¬.¶ÀaDù¾”]¿X,Ÿ—þ~÷Q­ûôcMYê QíèÑ„(™n`*EÀG¨›{dÁÛ/) Þë§Á¦Y1ÆÎs÷á¾fþ¼†\ô¾E¨3Ñ®=ùïž$ˆÌqî³_ßóÞö/^¼—L¡‰R0^}I½v¡fŒW"jãQFSñd;Ú3ù‡H¸ÙŒƒ<سj½¤ß>Ía åOsm_ó7>z:%yÈnΧõC®½]£hb½ŸÖ '´ÖM;å8 oŠ<ç^aº'‹(À´C´]º–¢!MÙ™µô;‰ |®(¯ÚµsEÒö%ÂÉš;¢W×ù–¹çNy¦œò.æ-KZ¼ ¥".\&RÑs)4&äm'ÁD@ AaË©Šû€òTVvTÈÝ$~ù†îtóó 5ƒW3ŒNt«]œ¸QÃ|õ/CtÖÇäÃÅ÷(ÍcÊtÑÈöu0½mV½¸Ñ‡³ü>Ôs>­(ÌÄ*y_ªb~ÆT˜Oüuâ÷«:uɆJ©˜¼çD$[SŽ¥¦±ZÁ1Â1Ÿûª²ýäßHTXíyr7ò²ùiYÐIÒÑ€?ÿPõ¾ùºBâ ÷0nzS?â+u…ä¶½’èòÔN§ÄÂèú>¿³Î$6Ö}w,¿KÁs™R|Üã’=L£¤ÎCÈjð™ýÃçÑö™Ð]sÊ{\´Òñðâ»´‚ý'’/¾´y­¾” ÷ñTu¸KÑ@¶cSI q/Sé‹8‹´+,º‘5fü#»Ö(:7jÚ#>+4Âp³Þgiä?–"!üGÏ<¢(‚ðFÃßÚâõˆ€·º¸ôÒ®\ÓE›]}eëìy£-5ë-Y¼Ëüa"߯%±¢º{‚¿ú’|…wæ~iÚ+ÅÖú*J´óžw”âS² K.7þ}ï’PõvŸãÙ×óv¦þïðY”Ÿã¨gDïhqèR$O¸¸^ ®1š•hq)f)}ñ$;R™X[L—¨²‘E9ήóF³Ñ]SÐ`g·™•a“Þ"/ˆœŽìó·Y̫ɓt®™ª6ßÞ©ùÊDÃÄÌŒ:ˆ–Í ÐÀÛcŽÚÉ|쎩w D¯z<Y‡1^ìtnVünÉ}§KÑÏ“z9{Ò縃˜û‘ï «¡L,þÛdµ©$^1{¯KRõ‚P«•jå%%æŽñg}º?Þ\›2GéúñQ×[S~oAcO奿Ù"Ðz ¢ù\Ø™ë+QþUÿÕ$Ç•gmýühµyHähˆ(•ü€"ÿÊÔô°70¢µ2ÓÛBþ ÊDYð‡v/ —¨öÓH¤ÉÄL Pu?û •¬0;;›ìOßBµîËê3¶hƺëRôÛc_äÏ)¿Ðy+“”Eªî­°|bÒ*–ŸÚÅkô¨ê•ŠK³å'„»{¤}ã Á%kzäQV½oêV¯(½ðIdå4A£÷˜h‘mÿ¸‹j¿–ëðq¢TÆ~ Eâ@™¯bJ¥@¾®½¯ÑpXsT=ÙåØã ¢vБ:ŽGIJ[Mà4¡¼j¢ÙÆêêW¢°zN9Ëù؉D¬Úé6q(kg¿ó†£r Ó)&‹ŸÏ¦Ò.‡è©ñ¯BHÒ}œ¥¨“M.ù@¨«$t$ƒ”Ms ƒFjçµÇ›gB‰Õ1ßT†^%û#;¨Á ß“ÐRz,N5.†lZw½ýæ ƒQ¾CCªj[‚ã¹12-}8C¬ÅŒÊ ˜ Ä ÑL…œpßc{36ÙÓÑy§ÙÏø›¼Þ, ‘“„³¿W =i7m(z)Ø?Ä¥×3¼¯Ïp¦Àøœ2e~AüXzef!¤Úpi–òðëw¼+~",9K”ÎÔ̶QÍŽ2Ãåò¡ ŠûlZÎh`\,_Êø—¯”À ¿–kº)¶—ädNÝd2ÍS¾®Ìúר]¶‡JͲ¼‚e)p¥.[/ï6ì …3hQL¤RgÖ}ŽLJ&üN>WµÒ†Åº+Ôe{¿íö¦´ô‘br%Ùíã£!L—GJOËdh $!]GhtÁ$t݉&ç5ÝÑú¥?½ÜÙ8Fú†PXŸGAŠAbdúËÐÐq”N ¹óºB¯ |½/ÏliPüél’N³Zójœ·=«žYªj\Q) 8­×–Ð,°´/·£‹b8t,Œ¿ðÚu(ʲßìÞ ž!$*Á·ü约Ăý<ï¯W ^Û~¿"_ŠöH}Ök¿mÍúý“/Æ·)öá-ö·Òù8|ŠDû—1"`Ât¯….‚™+÷kaà#NŒõò”VïôœØñÐØJW?Jš•ƒ #Ïqè2AwŸ¯ùæ“(«4äE®ƒé'ç;ÁÞbϱ>ö¤Àß:.£F…ü¼Sªz>K¡$QFÆ_ï?ÿ< Y¥÷"oK4?»'ï•ÀpäK¬—í«ìî ¬ˆ ¾jß\I4{‡D!U1Šðø@KŒKz»Ç¬‡·AúKþÑg½ßÉýÎØÅ¹Ù…¨ ¥ëE&öë0/1]—½»%š`f2i´Æz×øvÞ¾ŽïÇ”t£çÀ¦óá ”¡H6=4 |ÓOÈš•Ô°Öûf§kI‚Û:P4]ÎM{êÞñIã SŸ  -¬e¾vbnKp—^ŽØb ÕïI`íáß Ïùqu.iÇ38g¨´ª~ÕÚc,1B” »Û¨s¶ eÄ£+½ã™s©@YÝHCðWÊÔmÖr2fÈÛjÂÇH¼ª Vgð–¹Ì¤×DÊR”ëKM-½ÕÈ­ë9£CÂ$Àçäzb¾Š×FtÅD¸Ûìm†‚‚ÞW<'P)ZÄrߨ¸Z‘ÅhdÉ4à4ÔHa~Ó98?IMÙq™`óú¸ë)uk¢®ó©$‰| ·m}ÿÄ/”‰âfl'EQĨ ‚ê)Ú™%+Ç·'$¬±³xsöSe Ö¼ÓŸ-e.N³AEÛÚÖ³ ±Ê‚Û|SRæi?ƒÍd‚VXhÁœ‹v+ÒW2 3*‘s-ïˆÈa'Ò`Õ ñ4£¬©DõгbJmiÅÆî·7þ%iÖDßÈ$TzX±Þ\‘~Ça“ë0MF)Ü¡‹Ûݪ¯CZŽD6Çí¼¥²Âö $}+vQÚ_ _,…î–‘z eÝô¤prK$4ýÌá”×þÌ×[9±3½­¨ÿÿº¼‡+1þM ëk?ˆ¾g›„l¿x͆›F éÞËgNH ¾Tl_bt” i Ï3?ññüÙÒF ¨<îŽËÖ¡s(óºcTqÕ¿)n=Ÿzº»ª2’,<âF‰û•¼—ËŸc»I›6Í?…%û6MO'ÝÎ#/ÀbÝÿCtŠ™ŒÍêg½dÀs˜Ee*Û‡«þqeìØ°¥b¶S<ò²\`_‡:—ѼèÍÉl*m•r"‹êhßüΡ/ˆBU—üŽòokÕ‡%çÜjmi?žPç0—ÌX0èJx°¯³ú$1Û³ëÙ }“>š—uÚÄëä×û‹€ò7Ý^n•Ƴ»ãw¯¾æ¤»IaCFÈBeŸ/ÆSAM¼½èTZuç˜wžøÇ2:ÓÀÛø>“ûÝ}v8ø†`¨_e¥‡YdCj‹ ã€mÓ£);ÅéaóüWLÍù1-‘¥$eª*d}{艊§¹çHÊ Öúéá Ì!ùI])=—ó\Db/¦ß4 <%´jG ¡R«å)9ûìÆ¶'8‰ 8›ŒŸéÇv~šÖg.×âÜ3ÀŸ7uÝZÝ ÉN6Æ[¸>^ˆ¥,êeÁÀ%>ÊþôÍæ†ˆûg:•Ý3åeŒ†gJ›µ³¦$:AóÏ÷#ì:BŽ[Ë ¿Ió`k+ÞQòŠ.‰æ,©ŒˆšpaÇÇý@Ö QH}ÄtÕÄì„¡›ÑÉñÓî“ÓfÌÆ敲3G„ô¸²Ÿ¿2stbÖÒ"`üÞý’ò©¼ZrJ™~“!ÚPH=`‰é?Z8E endstream endobj 197 0 obj << /Type /FontDescriptor /FontName /AEIJQM+NimbusRomNo9L-Medi /Flags 4 /FontBBox [-168 -341 1000 960] /Ascent 690 /CapHeight 690 /Descent -209 /ItalicAngle 0 /StemV 140 /XHeight 461 /CharSet (/E/I/a/e/i/l/m/n/o/one/p/s/t/three/two/x) /FontFile 196 0 R >> endobj 198 0 obj << /Length1 1630 /Length2 14900 /Length3 0 /Length 15743 /Filter /FlateDecode >> stream xÚ­¶ct¥í¶&ÛI¥*©`%Û¶mÛÉŠmÛ¶mÛv%©Ø¶m~õîݧOóuÿé>?ÖÏÔ5qÍ{ŽEL §HÍodc`,bcíHMOCÇZ89(ØXÉØ°KQ+›:þê™áˆ‰íõ6ÖBúŽÆUc#€±!€@ÏÎÎG ´±u³šš9È”TÉ))©þSó ÀÀí?,#€¦Ö’¿ÎÆ–6¶VÆÖŽ!þ¯ŽfÆ ¥1@PVN]\F@&*£ 5¶6¶×·È9X R@Cckcr€‰=ÀòßÀÐÆÚøOk4±øú[cCàß0cWCcÛLT[c{+ ƒÃßoÐ`j¯oíøwŽ6 µ¡¥“Ñ?üÕ›Øü« [{›¿VmÁäl í¶Ž€¿Yå„Dþ]§£™¾ã?¹€Í“¿žF6†Nÿ´ô/Û_˜¿VG} µÀÑØÕñŸ\Æ# ƒ­¥¾ÛßÜÁlíÿ*ÃÉhmúŸPìMõí,þÂüÅþg:ÿÙ'àé^ßÖÖÒí_Ñ6ÿòúŸ5Œ-Mhàèþæ4tü›Ûh GûÏ®ˆ[›Øèéþ­7r²ý›³±ý¿DöÏÎÿ-BßÈÆÚÒ `dlG+cãø7%€ìÿŽešÿ>’ÿ(þo!ø¿…Þÿ7rÿ+GÿË#þ}ÏÿZÄÉÒRFßêïüûÆþ}kÀß;üsh,õíÿ1úV@K·ÿSÔõV5þw¹ÿ0qGý¿cá·6ýK  Ý¿•@ «±‘ÐÑÐ `¢oùwfÿÒ+[Û[­ÿrû¯±¨ééèþ‹MÉ hhaý Ìÿ6[ý×þÒõ¯úiEEÅE”$)ÿ7ö_ŽrÁQÉÍöomÿ£i£ÿ)ü# `ã ð ¦gaP3°Ñÿ} bg`òúߤüýÊÒúŽö@W€æß¾éèÿÕýÿøý§¤ý_`„­ mŒþYEG}k£¿Ûö?ÿ˜ ìíÿ’ü¯ð·ëÿÿµ÷ÆÆ®Æ†p+‹6†œæ©i޵ßs†'„4û{éÁ‡ƒlK” ó}«mz|RC·Ù+ôÞk‚h§8>ÛÜNm?ö%(F{1-I{’/óp¼~‘÷å£nt°RøÓê” ¦©Fz\ÍKmAh°Ð©ìLÈ+è¿CáNu0ÚÃ\=‘ûþrÎ÷Å z´Eò6L©ùÖ‰Ò‚V[pzF’püôH:862<ÔsÙ·ÿ“2;–˜Ó‘$Â×.û'¯†r…Gô7 ¾ƒXþxñÛý}õçIE"³= qA°ˆ+vmËcÁ±üÊxaúVßí칾ܺ5–Ü#F€X‘~U )ÁÕs‘íoF8GÍxËЈÞÅþ¥˜Úñ¤u«ƒÖ!"'ª=<ï‡-(ÇkeL«²î°[ÚÓ.Iãdd›¦N†øh4º~´ƒÅÌKxFÔ<‡pTG÷]C æò‰.q½¦äpM-§[E›öª|a¢*.c¯ ÷‹"ƒì'a‚®¬UiDD\uRƒ _8Óyt%¯qs51Q°÷Él¬Ù3ž ý½(üeãb÷¥ô‹J÷B‹O`,ªaý›ÓÛœ *´“­¾""óíf.°ùžûŽE o.Þc”·wg~ tºÅÖûŠÀ;±ä%…ú‚tù¸öéʪígÜQÄëQ—Y4JÃzúˆçæ±h¹ôè¹+ž:7ɹ»P_>¿Z‘x‰å$´ë÷&P5'þòœPÒTõrݨDI¹ÃDûžIê¨-ãîhÑ&æ=ýe)ïË=K÷©RÝÔí'$’1‚[¬ùgh-=D€.¬©¦rf!Þ1"¥CfïʯYü—^¼0õ‰’~=ÔÖíæÙÌþœÒø¢£…åè—˜¬öd„dE)öL¥`Š`äüíÅ‘AIežÊoŽ :n¶ŽÒ¢ñ_oë‡o‚Æ]äÆ4Ù«+Ûg×Í€5~ÿ”‡ê€•AÕ#i’cvÕá°AVp 'P_vÑÇPxÛs>)ƒÀ,2_©ndµ@A $´õ±v~‰Ê·ê_¶ ª›E'öí0l#cgN刹Eä]_=±¨z*²3î`}¡z5ÁWó»}Äf–é:¨2I#ø£éÚ'Ca=•¾ž0™ŒguV=ßÅ@5{£ÝÅ*×â¶uE2°–8´¡ó&êöœÍà~ÂÂñ Æé§voò­C‘å€ÔˆêßO²ÝAHùyˆÊO¢ ÷ÕR«¥)ÍÇ8‰P'˜ À ß”³)Ç•ïÖ¨ ýªž–M]A€vŒª¹Nâµ84)¸?„'`\o×Rƒˆ{ôix±N³M—HL r‡ƒß‡Jü§•Å×hìoêú(E˜ûÔmE6Õt&/bñŽ›LN€½Óç¾3ö‰ðç¯8ÓúÁ±îq #8¶U¢6QÖÖÃ3¢–eY›0)m^UÕC•øRWÂÈ\/¿®ÖàEvã'mFž=¬byÁêØ7µ±P²†j‹Ð¦µ^–L…9¬­4.*³ü}¢§=y%+З‚£²ÄéXsž½d^«¼Ó;Šû–Ž>»ß:»iYî@+;@}Ô³€åÏÐóï©A-?ðÄ0-!> m6™}\Óœ¤> ÏÁæ‡-µƒ÷o_(%c_•Љ;éBþ©ñMâtÁ‚«ZÝÎQ1Y™ËŸ_9=½H8J™>.íÓ í$t‘¼¹öоånVv$-÷“@Å3$Ú3+àµ;ZcâDÿø”Yk)]•J3ù9ÊÙéb¬=²´4Ɔ3»ÉÝ¡¶¢j§MÜk#d±í ZȹØÙ¼$ò–¥Šx#Ì—†IBÜGéSÓ¶Üû+X¸_ñ}§¼kfbÑÓõ:¥¬ÒL<ݲT;=t¤i"Ћ2ꮼ 'O >ÏNp+\"¢2Úùõ¬Ïq§Þ–S#)¸—wÌrB «T9Þ”3z³?ƒåÛ7NË“á•|ó63€4Ó¢g£ œ÷÷%;Ïì–H,Ož.C f'ÌÇühLW€<_ŽL‹O¾XÞÖ2ƒr͈÷žAĈÅQj,ÔA£’}Ù¯ÔÇ×7ÞÍiÍ­<ÂP æÄ íUÃ4c°Ä2F:M¸_æ®O?£ŸD–ñLp·vÙíªâ¥1n =›õydèlËN‚dåFVh™y¡ !ôDÖ›@½„­ƒuë÷1¯Æ0—ÃßJãákZ¬7xUâ|þŽmJ+S¼¥ÀÀ‘4ÀÌÐ$ö‡›ÂÓÙ;O±ã¯ a΀álºþ ̵ÿ“Û7/þ[äR&¬ààåTߕ۾/U9E½»ƒT³„ºшÚ{“éû©õ¼ ¸87ÇȮę,WâÕŠÑBÛ´T¤Ö²ÏöÊf~~?ôjÎü§¬š(cùÔ%âj’Ý4âGY.Oš† Ezy›Œ_k:xÊ'Tþ°nõ›e1h.É™•p‹¹v¶b‘¼èŠ:ý ½y€PéCÊ>̰ø‰p÷jMp*…w^„×í1ó4Ç—ŠÓ ÂBx¦ªI£‹ò%7Ã¥ôôN.€[h•T|›êyAÍG8|.Ù €ìäéÇÔõî©Þ‹ã¬@Üê„à^'g1Rø˜eÁ€d;?èA“ÇÏ«ÞãðëÌh“â[ï]Õã¦Cc™5wÛ°~X¯D õc‡‡ïØkß™mckSÛj^yÒäâ¤j]q•Öõw™ó&æ¼´ô…¨Ý÷”xy†Äg¥êaW¹gO÷7áè6…:§5û†g’A†9Å®8s‚+XCÆÖžà†Ó§¢ñîžq0Iöv+xVÅÌôŽ2Ñ8Òd•õõ´Íõ –Y€ ,7,H ú„ظÉyÔݾ¡Ã¤q´~>*ñ>®>‚܇äAV _?L¹OÖ’²ª±„Ÿµíò¤QtƒœªÌˆQ]7ºæWÓœÚsÚ¦Im¡âæcÒæç%Ä0%i¦gÕ´‰˜Æ²°ph¡@¢QqÆw$\û)êL¨9sEwx­»™ëåƒë4yvJM³wØðP9©lS±ÎýøÎ:bûŸÏ!Ct“¢¦³Ã^ÀüN¹I^… AkJK»õÊÉ2n©ÕZ˜6‰{­%«Ó‚Ö.“>Ö´Úgé6FŸRnö &ùbô#ïÙùmÝ!·H÷᪠(+â‹kùÙ J&@„Õ°È\þG~¨Q$Ú#õUý‚ÀAÉÌÅ•ðæÌüÎòZÐên:ñØ?%z;i”•íÂÔvøNå_Tºð Ïð’3A‘8ž]ª{åBä2Œ }Ò¼^)58 üGâMVšÑºìÆ £š÷sù0«ˆø-Ö?ƒnm Ÿý†±"f EÉ"@—éWÈÀ?W‚ìÉþ¯kê¦ü„v—ý.áwY+ ÓÝQPkŠQÍMÉü]f.9œ‰SÝsi„'1¢hÏb:1îbzïyЍ®-&ôßj ©9_”ãW÷L\à2·»_æ½Ê¿p7°¦åÅ ‹Uð( BW™ú d3WÛrÄRìØÁ¨Ìrý‰ Ll'c÷ACN]´úN–ÙÂ>ðg#7·&¥ö/»SçÞ² þà¡ÎSàJ.ÊýNýX܈ô kèöÞÄ©]O³¹5EèUfÝZåCù¸7÷g×·m~< Í”?bÀ¸¯ 2À`Hsµµ¬±³Q%€ñÛµÝmbÖIimF!$[ÃŒIc‹ã‚aEµx-e,»ÿÝôƒNHÈ“ê¡vI;&XÆ ¯Ø‚Ëê$ÄÏ<ªÊ}Xì«h Îûð¢œÆþÕ/ ueg%f‚[ç…"%#¥ ’œûº-47zaÉÎYU›ÄRMXx.„›X£üpóç®Lì În–S&$û¢÷9nÈ0è½Qש´€BBær8I Ú…ê¸ …ã蕟&áÃ5^o9I ^Ÿ±O! ·Ö.¶¬fmª5ãT[L¯ã[¸ãžgþËø"Ù0ß„±&ÑG§ª™eåC‰ŠbÜœöFk]åY;¡äØâA˜G÷ÐçÃ./ð¶–  õZøøTPŸ‹dƒIïC3ŠÆâµê•üGÔ¨T*æýq1K8þg¿ä–~k(./½Ü·jTk7cy øa8ÏÔ»H.Ž7DÉÎâS/ÎQs«ÍžõÙ}6h3aj|á0ùÉÑËÃ&3é]~æglFgNÑuC°÷&$eY<+~&Uc_R’oØïÄ|õ *š$öHø“ñØ•bI­éÙͯ–î@¸õl:p".ÝbÎ'æMfWÌÖÂïQšå» UL7 8yrH:©tëï,úv™¦ Þõ›È ÁÑP>Àͽ¨°•^­çóüúÀxLaÙ#Ÿ ¸/|Æ7k$-¸!êUbã‘pðÚú”ŽsÕ XÕD>û°ŸL‹¼•KƒÈ œðúüÉžÉäm#R÷´bÕMX§t“VH,”bGg€ÉÛzhlIp¡Ë S) %Ð #ês)^Ï©°ÏÞH‘Øè¢µõpÒÜófí­™M–!4M|{A¤ 4|ÞõÌ“S2B1Cõ-°óÖI¹«áÐú d´À[ ÿÉôY<4ÕòÏS·ÏÑßJq¡ÅÆ[ež3µõ±Í•’Êg\Mˆã˘  Åòoøl.8¤ÄØrЩ¡š ä[ÊÙûOLɳM1ˆʵ~«锃éh0zJ^æŸýÇHKtñ V·ëÈÐæ‡[&XL7 ´¸<Ç–ÈŸ*øpÖºº_D%Âs˜)U„²÷ YÄÆ°/ èèEØ—ëÕ-„3FKÜ¢œ¿ûQ-ùRȘVþî°–S†+`h` ?¶†•ßøø)¤e±5kGuj®ê…ÈÚŒè#‚Ès}‚ûºLg €<pkÌ/\ žˆRb´­^ã%8‰<Á¼CØÊh–“—|D Å6U`Ù…2”Ĭ´ ºÄøz™õhó”-”vŒ—CôœÄçÂ^ïvs•Ù„­‡YëpŒš·ßÜUeoQ ‘[ØKЇS–£ª§Mws€.è:Wˆ3/K‰<ÉÐ?l†*ð’Ñ6áa´YVê÷Ú°e„eÛ¶×àEõãÛ§û”Ó.hJ>$OW æ6‚ÛR-{hc-Ÿ®²W¶È‡.Ñ䉡8›I›Åk»Ö;Â!K¦a´þ†ßú…û]Õ1þ ꙟ_—¨)™Œ…h|À5.½·”<Ì ñDò$·˜)%"°óUû7Ûv¿Ö°á):Ú‰sÆàeÃç'Z3üÓóc“pwmÈó¹®{ÆЫ*;}lfý­ËBÕ7TD$¡Õ½Ù‡[àI‹ÒÃŽý0À8ÁˆâÜ¢âÜöš²Æosn¿qo³¶ƒ){€‘yòŽpÅå'4uõwù¤MW[…K¤³dóuh?.®ŽE•àuåv©s“Jü~ײg$$¼™µ„]°;9‰ªT"[¨•EÒ¥Õ:ÉÓøŒÆÜÜcÐC[AQI£]^ס²î—¹!4<ø\%wüF&èØ²jåWQ‡Ññš½PqŸïé8‘„­%ÖÔ¸wÁb`þ]\Éþ—í¡µµY¶>³‚tÒ1)4æƒ* †Àâ&wÛï—:K‘%ž)¿W¯Õ§5Ï ÌÉÎTáÈVôµ˜ÛPŸôzë1B$Ùö÷W%=yhû=ÌA™I^ðQÓ¿Ìß&n6]TÔÍ:@0ùyê¿Ïâl7Œ”f³nvAâ­Ù·$lšYïšÓ®‚"oq 7×Ô/üþœ4uÿ“±0¶e‡º±ï±þ4Šy°FX…/¯¡að4>ô3Œ<ÚœLåim ‚µÑÎu€³}2‡Ê.n»"Fá”U>: «ZÆ9Z ü9‚€±){­à•§»¸©›¹0ƒ¿ªÄR×>)’3àfª®BS€NÓ*‚8G(Ý]w^}€7O'G(ANwÆÿ4âWO/gêãÀ´X¡±5ølô«Ç Ù†^pDYÜéNÒÇ“Í7'/cm¤á¤+‚‚¶âKÌO`zÆk+3NkÉßëœÆKeÌ&ã7|eR¤Äièᛀ\ï¼²¤?Q°$|áÝb?ÍÁí»(ŠºÙÖ½»–ãB—7ðé4•Þ¤E©&†âž#¤Ú² BÑœŠìÑb£®Á-›³ƒª;£š¢¶-¥0Yà@y5áÁw8Ôl™ê½ö ñ w1Ù̇ÇŒ³PᲙç¦n¢\Ƙ®©Ëƒ ¸‚¹hmMÖ×±¬»Š®Ÿ# y oò5™î+.À5™]àÜÚ»™Â"ëð•3ù8Y8Ù;À?ŒŽçî3øw4{C]mÕoVQƒçïvbYñÂCT7¦úFgÇ¢kr .]óuE^–uã«Ò¨.K/’ÆLÊx˜GÉÞSŒ ¤BÁ­†¸^s™ÈxèqE³N·ÁºîñwÚ&i¹ž=?§5ÍB|Àv064hßJi‹<{²oañ}¼Ô±PäoÜfÔ`üZ´ù¶áË0Ú®u~"¢¸G>4©6A!BCkTû†D4 SXÓ¿Ëã>ò&)`½òJŽyƉ–)eã#ÈÔÄ L˜\0ûb®wN‡TK™4![ExD}GÈžü³^J%EBk™Ž#1f´_`¹ ¦=y-V%¶ý2ô•{*Ê8!v}èÏøÜ¨s­½>9ma¢éóV d”XþV"Lȳ ¹reß’ÿ:Í‘›˜åŠG"›Ãü„>GR¤R³™l¢]ª_›G3¤@“ËBçÙ~f£b-‹¯¶»h¶ŸWžÁ×}Ãr¨½'–¢¬Ãdõë"îÈ=˜$?ƒp]sÉD'±ö$ðV˜3ìIæü•ÈNÑ%PÄ=QY]Ÿ_Ú÷#7tª s9Âmoc÷î§!P¼¥ñ+6;µÌkn±)^Ú¦Ô’5:ótžNaÈ=ʳÐmKÔo¼â®(ÓÇì+n-e}Sù ´˜§¹†ÈfâMJëÀ„«1”#p—*TFàé¿D”röbþj7Ð\xç骂‚ ·Z¶Ù]6S8€,-3¤·&ÉÆÇ|Š2&2OÐHðAë~ðu„ÜjP¢%ZJå$ÅT˜Fƒ­rënQÆuЏûR–|ödd˜\¸•?7NH_=ÿŽxJÃ&ð…°ó (Zê½y¨ýûinù‘|DJíz_øM”3Åâa£sàÈè6µWxnО‹ÊÐF8oSJKÍeÚk²« ÙpÈ·¾ Ei××Û|4’¶dËOÕ]߃ڀ¬°½!/î]•)U§TuGäÏ á&×÷ãHfWëû:lîÐ>Ú;›QR["c7p=ø¥Q&ÚIvEé(fÝ2!pñ&j°©ªdÖôš @Hï=±Ú¡½Û÷eŠ ê3xD]–Z–ïù{J´0€à—W¢pøR¾< $¹£Kxk¯EE¥EgÝê‹ÝžÝ ‡† ]?#H‡øë­™_78Á)W‚«@rTAtË8$ÒƒÞ| €2ïûR´{×»”ž_ uQ‰€øžiãξˆºóۖĤ۽l¹PÝ´Õ«] åʇù4ÄÜ‚<û¹“A,æ“ô{&ÉéEŸòGx2*M#Çqë1Ú2T°öËj­NkûT¿Œ/M÷RÈIsKŠ2%&ÃÑCqБºKѯܼ†rÁ•ÍÏøBd –|Ú~pçå§à՞ܓŸ¬Uâ×yÇõ½à½ —ŸO£mNWyÐüHÍ]MVAZî’;Úã¸c–e¸)êÚ ©„à¢"@ÄÇšl8›/Õ•­’ºÃu®ÙÑúÚrsàüPªdy –*é®úaHQ3âIöI% c¶§âu½_ò4B(…÷—Cn³Ík‰s  .{cpÓ­iÝe‰·öå|7^è/y!Š=°Pñ-·5AJãN â|(yN!³hdÇŠ|žžW¼\‰Ú»QWÖ}{à¶ÝŸ ¿ü>íþ ²6EŠ$ ,çès&lAÔÛî³wá-Ìö.¬#å|mC~ãŒMƒö‰ ¼V’wÍ骽0õùð€4t9š+úÅ Éùcœ„ðû2¬yß$ðñÕ+uº¨B(~Ù—oÝ]'“g©­iª„óíÏ1S´ƒ6?“ £°Ø|f] 8_Â\æb°&Oz¤ë¬éUPØPü8û¢Þ]wŸ:óè[È7X¾Ÿ>í%hàm^ú”ë: &x-óF‰² èÁ¦K»'b‘D¸»P» *¬å¹è¢1{ÕÏQi5¹?4¹Ü±‰GN™) ò}º®Ÿš™Å´” ÇFP¸™¥Ó²-ÄTñÑ9]ýÂ܎߇µšÐ¬ˆÖª†‡ûó{¸ý&µŸ£ ˜Oò3A•S¶QÚ:ê`i­ØõcôX¼Ô0Ë_nˆ‘æÅQÛP†Ä•Œ¯|(ð˜,¿°Ü÷|Þ§}"ÞxgsÞìè¬÷g¸€&gïO{ŒDÈ0(a'£hîä{H{:>žíÂä¾~9w|»S_7jcÚ¸¸Ãð•¢!eÀUÕË¥×yÈú‰5õþœ±5Ed´(¨'‰Iü3 Ó%ç+ؽåÒÊWßXöd¢ºÒɹ…쮊]í[ÄÙ‡D|L½¢0ùdB%ï7ãÛ®0š®w~H;/QišFk_ØR^é*ß‘PõÕ13mÞC‘$ìÍb8ͺÝxy±ý”>»#“èÉÑ(L=±RúIÂZ_ÜeùŒ‹Ø¥|Ýv„WŒ‰³¿ž"ÁnfÒ×Oé䢊Ó|« Ð†«¡+¥ïk¼UOÀ"Ù2Q_°ÁPÏrq‘àˆ‚ä÷v0¢¥$9Êõ,RlvŠF Øa =þL¼8•M±ò„µ~Ãç’Ä6ߣÙý9E·±6éÒóÃìùáÝ®Q–´Ê”¶¡[j_a'š[ØmÈcÈè¾Ú€­½–ðÂxQ•Ì9¿dԂц»:»[ˆ­ÆšSòô®™ˆjM_¶ðÀ˜¬ BÏŽ¸²L›‚Y^®·µÇ$ÞNšyÄC~A´bV‚ð}SŒE4+êÚ;[·¤k§ºßÖÅ猹yqé8˜…¹êBÇZwªe4sn¤Œ’ ;b¼#â’9‚Ã×í•Â*X˜'ãb¼×2Œå€»è{t¼*BÖ,-4mN)¡‹„žFië2V;á#ýòûMÐ˔˴º¢ ”++È öD Â(TJŸ„0è+cr7»•ø_Öú§ËD UéiQ©¤Š:ÙŸ¹»/{f.}ïKª½R$ùJ$Df"‰Jð_æs¼O“ÆA-†JÇ Þ]u÷ÑýH(8¹dÌùXyƒ«­ŽSçB4ì?…¿G­þÒt‡®°.1`ÑB|kñf¤R7#hGA®k6 „@¯qÜ:I§É©åãølÜW…ÿÅXkÄ´4D ×C¨áÅûsÑ»>“ñÓŒëQ^áÛ GTÔ¡¬‰•jZi›6*N[¦™Ú·„â©öÏô8–òm»ZDÑ*¯ù¤Õ‹wc\‰„Ìß_!r ;ê':$ÒŸ²Å——G¯¡íI¿kàsQHÅPâ*éz†êĘf¾WèJ! ÅFñrß‹]È7¡T¸†jÔØü˜{9“cIrpGЧÕ]fø ‡³‹øa0ߎü5ú2íp0ÉóibýVÔ³¶vÜ“u‹Ñ Ÿ<ªlvdÅT¥-M/;¡x1‚œ€Ø ÜØ† RŸ1KK2ƒéØçÇõKÒ<;K¦×“6ÃíÊ„ÎKÜaOME=À+©Ó‰!ÜÔÝkê9K…ï»ÊÙb†v·à¹pNGÏ,_¶ °9¤sé9À!øuI·Ç¹ä›'*d­ÐQù¦U`ˆI­ܱi­3m"c«‰Y@T½lÝépí©Šœ'wÖH~ÁN¤DZûŽ1ZX–ï^6Šz;gh nàÎ7Ú™ ì ±ŽÛf]mHΑ–ªf¥=,ÂÎDÇiÎ1Þ ½10´Í,‰ `µrôÔ1iOø¹­7KžÊƒC:¥`O> W‰l ‰Ù»3.ö÷¶ÞFÙ2öÅ~Åû]‚x,ÍS¨€ø“sôbõB¼%:îo‡ŒE?ööÈá_©4UG%PÊZä Ÿ­IzTA_æ—÷¿ƒÖ‚ñ„‘Xà5=5ÍEá á[xûetNÕOœÐ&³ãΤO2Nì}/XÏúCüòô‹±ÕƒžVò›|üAKãÏÞáÞ¡EÕ)qº'SóðX˜æ “Ïç`´áÐbG1Õéª îñä i‹~,˜ò¬X?þ‘ÇÚ(`d‰KY?$R‡!Pç§f0o†l<—°eóh¹CURa·¡?ëÌUB^v³—W~C«ò­ìgD&2` áQN¼(÷5Ø] iíÕïë~oÆ…&õryßò–iD6P#£—´äÒ"¬IÆTŒÞ\Ú­“M±ë¯ë½gm ³R’Ü8Ð]€#w¬üÈ´üã«31N‹  »áøÛ”–Fm¹8·Ão ÙëKéà2ŸJ$%J+ßQÜS‡çyžàBõôwøÒµ5|nrïöªÄôú–S´×3òã„“EKP†Ú°ƒ^,y~ ¦ ‚›ÉÑhÓé”Gm˜Ã‘)\˜ç+«]¾C\¬j´Žê[ ¸µÔtAãO(DµâнJñ-tr[Ú„éT5z»¡b¶JŒ•÷ÚY=ºl¤ßÍ­èd˜è³öDä˜LÚÿà×¼¿-¿¢m_Dû“q&bê†Í­“Ô˜Á&šjé¼’ŸÎ ~šÜY™ÜÌqµ'¬¯œ »]‚o­¤3MñJ÷sÞØ*«bH©ߌ€^PÑqKÆÛ²ƒaÜ:¿¦°'˨í³j{”mq]n?°ìn· ÛšöéjÐH…±då·™àÚñg&·*wg­»7•áE ú`vÜsî g0g†ôlÆT[é¨üëÊÀ<øQƒº7¼Òcú¨ðj?ªl[ê6…mLQœCR„-e쥑È>œÃôS×¼ùìQsD0†ûõ—øbà7Øcا§E'³o%¿ÐC˜K-6=Æò¡ùÉÎ4=ö3vûxÏCÄ“ùX,Ðå£Z(Ûý]m[âÊÕý#êµ"› J1 ƒÈ?Ïœ\È[i»ÞhzÎ:pÄm¯«™‚qn ¹†Î©rÀc.ûæoŠþ'Ç‹í\…©Ï„ ¶QX̧4À>÷&v sJ—׌Q~×/5 8 Ù4è°,ÆYX#5MfÜœï¨O³$è2ÊAÑÛ‘ôçˆ%èr‡ Ùs–2wÈ’4î×B=¬°L¼lˆ80ÍÁïΤ¾ž#ðQH"‹ÂƒY1‹ð’ô)G ÄV¶àâ§i‹îé4Ñ‘’'à Ö‘×tú;õ¬Ç:›ã>ë©–»$CöB&•Y,ºÏ‹3æßG¦ÃžÌcÆž”´â¼`Wƒ°Dd ¢„‘¼ò'*åPÌó:<|uÛ¦'02‹2š·¿³Â4s‡Ü1exúOºõ³3J}¤”2Z´À1dm½@§Š×:³,usÄù°cïŸÎó:Þ´j$¡q1X¦åf.îÄww?+²è‹öï‹®kPÔiëºËmƒøM¿³1¢Ö&ˬ†6²ý˜EˆÁ‹12PfÁw×}óåQXÃIô"§A¦œ3D|ÈÚ-¿õéÑ/Bõ¢lúnË쵺ÚÇãÐ{1{¢:‡ýDŠºkí%np±YãÆ‰#ìgÿ%—aë’-¯ŠAµ²_ïóÑDöøI|«‹¨Ô²ªÃŸAúF.ɦçY‹¹:åГãC•ÕÎhŸÀƒ5B¢XŽÏåþàEAðᛣœÝ*.A­GQ”3zŽV *1´thÑT, …6«1 §S¡¦#å¨êøÆ€3éQ~mG8é¶..2ÐÈ'öäZmd'í´æ°´óîNuRPÓ¨a<®£ŒHjM¼K¶i"bV¦!œ8²^øîƒ^•›™A25Õ@¨¡Rþ›AÀÉÖ$»ÿºöpèñØÙçÖS"&H å©£ú>¶õçü¹g29Îòéå_Ä£ôÎü壸Hª !KOÆ‹†¦•Ü¥‰}èc§•5õT}»{„SI‡ëù²G:k„][P³÷ÃR:Èwaþ/¤FŒDQ ¿OwÔ/ðtw²h ¶ªJÑHû— °[Á;<Š.¼º÷­¤­g:ß7=¢¹ú{!1ñW³ü™RÊÎýsJŸŒ°”í×úV.‹ÿ˜=‘HÓpT§±¡ù3¶@ÊWwfÔ[2¶èMPe‰T‚‹)q÷á-{¯¿æÅ3‘ãƒ#Ñœ üàðZ²FÚ&@½ 4bTë›~Œ(kReP «gôdÀýÓlhß7nkYnÅ…Ýf½vBRÉ¥E°'#XÔÔ 1^÷\.ÝÔÏ%öƒ'ÜîàÁáÂð%ÌŽßú>!í_bõõÍÛÜdøÐ¸¢ØBÐñxz¨2²÷tÜ1ÁÏ¢(S£Unä¡IΛ½#H‹õW(}¥¾Ô^=ø‚S ^ªt¦wÍŠu„ül¿v!i0«T Q†å$x§x‹ 2M&çíw‰2} ݯ=ÀËtu ú€fÙR³Qwɼ«åkÆü<3§›âgq”c`Š{Ñ#ñâRb‡ªWº `‘XôÔ‰#ýí¹âe©Ð1ïKQž<¦ª‡{¾MøÛ™æÇ yÝ@æ°ö5ž$|ÜRåq"ô(r*ȬQP”žºùžñ~g‰>DðÏŠÊ<ŒÒ{™vŠwaº’¥AQ®p'é>\Ew¿Ç#[sHÅÔ[ÍÊžìÒ½rÏ÷‘¯»ý{n+t›uVô5®f7žÉdµX$z9*³¶ËüºIM×ÁÖd´á¦­ÐèÅK>ˈأÄ3ž~ši‡Ù53&€ì¬ Y…F¿´y·jÃX(/Í"ã"]¶¡F¡Ä†NbiÓŒ:?ÇÌSÒ %œõ´ÿÚ“S¸Ž‘–,>Qn…„¼…¼œÓÏ ‡{(çÏwW„ó)ù|•h¾Ò´ˆu_“1ôÊ kaõo‚œ:hœ~±­MwP° Cø]øö®±ƒ>p*ãT¿Øo$@ySî`ÄkS7vFQÍ}:xx¼ vÐ;i²g³%jâkàæA@0Æü-¨+cR¯UÂ[A)6³²àþlqƒB±|£‰Œo!¿~ŒÎî¯:;ñŽåjÌ_‘ñ³ÄÃsº7éæ7êÉ]Qï/M=oW7TÓÙ'œ\G£Ò/Ý)-WV…„¥±'ÛOÛ•ñNMd¶+‡]5i:ïIIÜt…±ó!„ð Wj Xö˜Ï–Ö=•ñþ“&zÑž¿è¿]Ò¹8ñô<7ts1ZâùT;Cc4J%zN÷ë—!_Aèw(-`2Ü –bôJ›EÛ«}xÆ=IÍZ…(£|Å4Æ$[›œ'Äür‰½óÅ-BBˆt²bsƒ[¾M͂ޯËõÀ¡¸wÑ%òjÅí&ÁLÅŒx» NòEÌ•qÐzn»É¤¼„C ¿Ð‚±~QÍò~_×µS3)ðw³Ôšuzn­`MRˆ=?[în5ºÀœ׬Wˆ«½ž'¼šêhŸ†ÌÐj– ã;Ù˜¼“ìëјv‚Û„­_ûì05]rû©1åï–¶b 5n^AÃÇïhY4÷zºqTèk`,-²Ðõ³‚d •g8㑺¯FgcKÇîÎA˜¿^þd¼mWq\ÛXÔ*†ä9Õ·*)ˆä`ÿ?SN%ΚV9¢˜)OeÝ5e»ð_ýÛS,äVPíÜ-™ß>¨` Vd+ŸœÙI5æcM³àb Cq\¿ñ8`þp”/uYúãŸ/‰¤"̯iáÙ#é'Á Fmi¼%äGbœnå·íɪPìZ|nºH×È>`.`„´–åŠóêœþ5=Âöó*/°¥¸Ï˜±×UP©³eÒÜ -Ïš©*V0z@áM!ù¸»†‹IâY^&Y§6IR¾„ÿr=!OrO¾æüW¿–ÜÄÊrå”;¿Í¾÷˜U<÷Ùt1òX@œù±CÇ6}]w ù †þ8–ТwB7¢½‰Ô'qÑ]G´Ú"åÑ;"÷Û^yžkpî!Ö…¯’1 U¼û(¶E×nyÞCiok5°$ǹ±ˆ‰4º Xà J‰MÝ-‚ SØiq/ƒ™´bŸíMTDÛû4¤ŠZÕ¸¨Y]¾ #ªCƒHÿŽ- =ŒÁà·z®Z2D¸7Kw¥¢qëØ¨¯S ¢'˜Q¾5Ó›4ñ7¹«KêàJ?|ÖgI÷ªµ1»Y,°6éÑ`ÉJŒô+Âÿüt6óF z̤¼âùÄA—±©÷ç($H¿Y'YPç> I·Ie¦‡h×»jYXJÆAšæ%Ü-1VìíÈMlBUSŠö~Ízì³z¦³e\ëÔ>M CXt›c†9܈"Ï«ôÙ°F»]ÐsˆAà0ÓàozR®ï»\s¨Œ’’5¤ÎË…Þƒù0†ù@&Ù¾nÙÒ ¹h¥hÝ2²€Ý,]ÄýLÇa51,ľ ®x‘}'&ü}üs SÁÂ¥•$¨ùà„^Sâ=~XÇž ¦Óæù5»‚(‹xNßy2!4©¦`5Gê½ÈÞ%8h|í  _•—K-'Š-§Ð0aÛ´´>ûº…p½3ኊ^à2¸ëŽxëæOVèP ³ª5‹`éIçù Äi‡·wï°ýºÉw)ó||Ë+CÿôrKÉtÛØ+H öÌ’z œi+€ô‹"g4¶)iŽ¬Ç ÷‘8€ÕÂ$’X=¼³Ov5 Í®Áê°¯Ðˬ)Åê`ãE„y)š•”ÐOëñ]DHI;£P_ þ S ¸ÑöJêèuô$PökýÅÜ_éNhB‡qb§Ê.Ì<^0%ÂÒŒp̧º¯ãy·‰ö|«ÿ‘ò¡--‹`–k¢^›}g¼]¼>:8+褜woÇQd4žÒ5¹S!íì ì…ˆ_'ÿÊöí'k¡¾Ë‹¤úâ`8q«y÷ŠD/->ñ½†ý/í¤sr÷=¨&<×4vW÷]ö '½Øç…»ÚôHIT˜)/t1žaði\’нF‚xÔ¼{RëhãÇ^µ†û§æ›æ•{_TÕÛäê¡#ËÂ/LÃ)ÿ™ÈÇ…¸-¯j"HaZFæIèÖî¯ìn/ÃÁ@4l8νé=ÉfRkx“ͽúŒ²mÂXùöÅ’·o ¿³JR¾˜Ñzuÿcß§CzzŸþRßoz¬4/ÍåÚ?ðž#êÚÿÀ´ÌЧÕ-À]®Ä3ÿ${á-Õç”&¨Î›²ùþ^<òÏnüø„‰4v‘÷gbŸqtº>@ç™?Ñ/`,®ä[œ{ÌGp5+MXÝ®1ÚÏáýeDö¹%W³ýçÜ1>»ÁbÂsÏIOôFUÊDT cUÛ¼€òë¬Jgü‡ÍÒ@•lº‰ójþt;„Š\äë7‰PƒJÃ-ÅÜTÈ’ÉiG:w–êL%;"ó(ÚM£éƒÏijD2Ž«íùöœpnˆwÈ¡ ¢öJø³[Űþ¿Ç5IßkþÌ™A@(jø9zî&–€Ÿá1"@`eœ¤N>Çk±¤ ÎLyûÞ¤@zðœn3ëd|3 #UÑI[Õë'sŠé=ƒŒÎÖUlŠ­ dq°FÆóøƒ¢¤ɧ},/±nJFŸ#§œÀ\b—–f†×ËýÄè"÷5~Æ À¹™/Ò²³Þ—™ ç'äèJMñ zް["²­ ký6ãõ#zörÑ6”uÙÃМÛüåoAv¯ewsg×KWLH >L?WAžìؾ)>}¶èÝŽé^R1ˆËáÞÅî çœÌq©ï»ñKJIYH9zÆueÇKg€ÈZh!úv|S‰’Ó„ºtS²âßi õ¶;b •Z:(0q”5`îtÛÅT±êîñq£uºì>¬-ws“ Óô˜}¨Ý~~Œ™.„–`HŽH/]mEQXêQÕ›øH¡e¼÷›¸¿Å2F"Ñç?½·kæÀõ( }1©À†oõr`nÛ¢G—vå2MÛdq0Þû_tØ~Þe·³ÜÛx3W¶›“îºH|™ |™UB&î<ý Rèû އwPfý³ýågip,ë ŽÛgÊqâ×Ô;6_ d0¶~Qâ“ð >~]k ±m Gñ¥’È´vªQ%ž#·è„éÙ,…GÙÀ5™öF°„ç L“Sæ~켇oÝ_…®óuÏoÍ<¼áZUÿ<¹Ú쫟k'ç£SC¬ñE¹Ïºk(2÷H7p:¾~]î™Ñ$±6ÀE£Ï9ºMÔšüµ|ãçßîg ”•wÄa)¾†Ò¶• å˜ß5¨ÉÊ=÷Á¸xßÙÞŸþ±ÉïQÕ»6À¤:Šå"A'Ì:Ü»Uš‚ù³–^ŽÚ~|ÿ{®[Ά/ÿÆÈ‰F¹Ynã]¿VÙ‚àçYÿ™|Cm5Å“mp½oëçÉy³kæ\EåÔ`×gämʘ¡UÇÚ1ï^Ý{âÌêJI:h·Èþ*Ž~² wâKqõdÇÓ˜÷n¾$­ÞË÷q½vÁ”Z¨Ýñm¥ºáÄI»Mœ/T±•*ð˜¤XÈ)º0ˆ}½è”ºƒÕÏfÅÕFŲ?›&—(—ýóŒêÛW#²Ôß×ò·ø)çóþ[j+lI乨éϋ牒'|ÿiÌÔm Uz˲¶°%Îå.½0]_Šu.Ù™Ô’©˜;•õÌç„BÉ=zyÀyr´«‰Ð¤°&±ð2Ý]Z‹ŒÀe e'Òí+ݬ*__ævßäÕ™)ðo°tåcöóKgo~â¬;¿ý”›×uSM(»Í.ÅÛE­líÒµ>¬/"[îÌLï|û}Û<îЂgZ j w(=dc|+ˆ, ‹j¥ vlC̲•§2Y)!rúÌv¸]än”’×)×2‹Þ ÌzÑë¹v]od¡ÔŒ¨îï›ÈŒLȬ­~²œ”‰1ÄRCûÍt[b>Oj´Ü¸~8É:Ÿß%ÕuÐJ€‘¤8z¼AF-„Ë{Üv#GuÌ>tîÜÏÆhïg1ö —m4³Ô«~›‚î¿§W3úãKròÉs‰zV4]iè°ß0a·Ú¶µ=¨¬*ï'SÓñQëROöŽˆ2é -€Ý _ê5,‹QekÞ Þn%IIî/N+l÷ðÿB|fÏ endstream endobj 199 0 obj << /Type /FontDescriptor /FontName /GGIFTK+NimbusRomNo9L-Regu /Flags 4 /FontBBox [-168 -281 1000 924] /Ascent 678 /CapHeight 651 /Descent -216 /ItalicAngle 0 /StemV 85 /XHeight 450 /CharSet (/B/C/D/F/G/H/I/L/M/N/R/S/T/U/a/b/c/colon/comma/d/e/eight/f/fi/five/four/g/h/hyphen/i/k/l/m/n/nine/o/one/p/parenleft/parenright/period/q/quoteright/r/s/semicolon/seven/six/t/three/two/u/v/w/x/y/zero) /FontFile 198 0 R >> endobj 200 0 obj << /Length1 1647 /Length2 5836 /Length3 0 /Length 6677 /Filter /FlateDecode >> stream xÚ­VgXÜ’¤w‘^CoÒKhÒ¥w)‚„$@( ’€@èRAª€ ½#Eš€H/Ò¤J¯Ò¤*MØè·÷Þ}¾Ýý³{$Oμ3ïÌœwÎ<áf7z ¤AØC5p”˜°¨Àæfï‰4A¸ dõ„L ŽžÚ(+ƒIss«y@A(®BAå¡€: ˆÉÊÊsÔî>0G'€ÏÌä!¿ àÝY~»ì}þ`"‘0G8€óà êŠpwƒÂQŠÿsà(€r‚`®P€š¡‘¥¶&€OÓÀ   …C=0MyÚ»ÂÀ= GBù€ë_‡À~·†Æp©  Ò †a Þ`¨ûoè.ÀêáC"1¿0$ÀÑGaî…Àà`WOÈï0vÄŸ‚Ü=7 †!3B QH°ÌÀd5R×ø«N”õ;7†Œ'öüÝÒ CƒAQ  @A½Q¿sÙCÒÝäƒÉ!s÷€ý)à ƒ;þ«‚»¨#Èâ E"14îß·ó¯>ÿ¥{»»«ÏŸhįÖC!¡®ÂÄb☜`&·# N,ò{^´á€˜è_vˆ§û?0/¨ÇŸ âû=3ü˜"@ÜÕ:‹ P˜”¾ÿ›ÊÂÿ>‘ÿ ÿ[þ·Èûÿ÷ïý—Güÿ}ϧÖðtu5¹aà¯=À,€Ù5=Àïeã òü^80ð ¹Á\}þ·à¿{?„þUõrþþ+… Ü£˜”°Ô_fRæ …ÁP`'€ÈsyìfpÔÇbDþs¿˜ QÑ¿a¦N0° ü·RAP8äï=`tûÓˆšŽ‘šº¦àÿ²mÿ8a¦eêãüg¦‡úÈ?¿©TUÞ´˜´,@H(ŠyŒ˜ç(+.éÿ?¤ýC$ö¯³>åóX‹ ‹ŠŠ0ßÿøüëdó7šûp0ò{Ž @pfôþiø ƒ==<0ŠÿÙ˜Îÿqþó Po(˜xf–uN}†ª¢ËêT·îh»Õæ^TcšŸTh L\’-³»ª ®–»nôù²íþkMG`½¯Ö•·5ºŸÃìÏÉßž{{ž§(¸"b[D–¶ó0ý}Bo×JZÔ|}yÐØÄ¶ð Ÿe¸YƒðûOþ N¯Ü j®îäàWïâh>PÖbQUåmïð$nýüÁÛõ©·§»õ¯}IðM·¼.OtГ7LJVfeèØ;úzueÃãé=R³X¬i’í©Eç{X|ŶéK¸ì‹ÓÛyÍòºzk6€Ä[œè/ôD×ú‘DXÕûï¤Ë‹ÑY?v6“ ‰O'ýU[ÌŸò?’„×ö~e=^ò/á[l4;ˆ?æ"܃ˆ6¢èœäŽ|o=yNW‚£á†ÂÁO¦…æNÌ|FNú,*|~ßsífÏ}¦ªæ’¬¨aTç#¸e›{µã– Ã+dË‹NYnîmP‡ÑPTÕ¥%ý #t'Ô‰ð@–Ý•4_ÿŽ’"‡Ë¯‡+Fç„íX^FÔ@*ŸHàãQc|þ ¶ïdGm"&ÂÂ7R/»¿Øïe>'ÚU,ebÅáªt(ñänE™s?™ ­‰×g ªæí¹ÑÄïÅui `ÝY*K:èðѰyòÙ£Õpº•‰²Ùl.$jòX:Ý3ø9®«àˆ0‰Å§*!vÿDµÂÆxyFEkýâœjˆ[‘—DÒÇ1ÂÕ©BO…àûó±C÷x{Ê[z²:™¯˜œ.¯n‹­¶{ï¼j—}Š|;3ÕÖšdåGêŸ}7Õ²Î>ê$#¥†Th‘l·Æï³¾ÔIISï ¯½Ä¦`â¥zü¾ÝÍΜå¬Ù·hþ:Y»²”5JU•Ú.kA%š/a•ÇÓð³äpMwºn›K™ïyÜB7žå{I¯PYfO¢ˆ !S“.?V’ÇBß²÷+÷¦Rn€V¬¬{Lý]'aWËÏw-l3ƒNèŸÌç?þÎZÒ%FŸŠÞÑ#ùˆ·W%kÃVëA-pšcÕðp©…á3ë‚T*Ë­,JåÜ)Â) ‹ÒÁžé]™'ó ïˆr½¯íZ¸ ˳Oœ¹ÒñêMÖz[™ajC]àúøà`Õ½*:þnaZFéž5½]¼É€™öú GÊè¤HñF„æáº-Þ⩲‚ ûGÂfæ;ü»èöµ_D3™šcŽèÀ ƒgeUÏчÇú}ñ )ØiÓ‡þZï훜A“Z˜Ñ$K2)ÅÆ’ÂfnM î…imˆÚÄ !¶åŽ,!v¹~²ØÃIkÃá*—³zã3h7££e}…ŽL 'tO¯ åû 5'Çþx+'‹a·¯¿` ea!F%\S§ÝLôàÃúѫëœÛ(¬˜ÜèL¬©}¯Ã÷`ª…‘ÑL@Ö<ìý蟇8“YšûRgQE”™ éÖÒ:m†a )TÝÁQ;ÇjÒ!Ú~º­0ù–ÂЀ˳,·Œm¶g„BY§`ufãUºœ"õ>½äÇŒQ9÷ª‡tç ¥8åc­D‹éµ×ÌGÃŽ·›Î*K¹XZT7¯¸,>BûA؃òçfè¦W#¤Ùåô¸GÜ”©r?d[šNÐüÄØ<÷Ôøœ@!àwЙÓÅH£L u­òÏE¯8!}Ò¤j+ ‘¼Ë_hýÉ…CÆÃž‘WÊ&¬M÷›|pï§ÞÞ“Œ¸Éw1µÒ ™¶üFDç=;leÚæÎ*c¬¬îW“v+0|œ œóéMË”ÀÆXT·ä̳ûf¥oo9ÞÇò¦QÕ˘Ë1· Hw߬YŽœ8…æ¼õ *²–ÿŠ?ß ôýN¸ÜñJâÅ­-jîáßÚZ¢ïˆ/§âìŽ,½¥h¹¶ÝšËë5Û.lnUK*mÝI2[ÖSÑ“0{"Ótª¤äã'?ˆ[õÓÛ³eQÇ»½˜ÅÒ3š4‡.AgçN©g‰õf䮃±È4›°çhÔ:)÷2âF"Znß5•“µhî7^¯’vÃmu£´Dg‹I+ÌŽ3lù¿LˆÓQ|¨~­Ç?Ìœþƒ5á³ï>gÿ>VD¬zÆ»Ç»ê …91ÑqÜÝxGÛüTä†qùN¶ýº8b5r¹t4szj«„Ž”Ç6ñãzjZ‘oÊJ¨³jβ÷%¤î`o PØž[ö¥erNÔ)ô&•½%¢iléyý3õØÈ2ÚÚ"ù qV—h¾xÆ#”¼Â±¸oÕ}Ù‘æMÖ”“Õ?ê!òKœ>Ò_|Ø2ÙçcÚÎ ÖÒóìw _ïu•WÏwá°g©0=§(wŽN &ÿá9cl·ɳ¥`Õ`9?J†~è’T Z£Ÿ¢iÛŽ#''K‘Æýª)ÔG¤Õ‰ìó.¹.“·Y=B´‡`4™x±P¸$Ô¿Ú–ÿ™Œòº^rP<…£j¹rÑ€"á¦RÎÚw}¹ñÖ½L–æFüÌ ¥Ó©EȪŒ-ñH½¯…O¥%iL |hÁµ¹Ã¼:u³Ûo iWö?JÕN½â‹â²ž?‰4^>·x@–Ï,à„‹$¦–åñ‚>FÀ½\ÇX©“­oç@«·•ºnF^»Y4äñ+.‰üF:YJ1lç* Õl¼{€„K wH†¬d-UÌpk”ZНęy>IA Ž7;Ob=Aañ¶©ÜÔ£ $¢gP ”sþl’+yäî…OWšw‰ŽU‚›’ùƈ7 pXöžÏ½—†ùPâH÷­äUøPdp˜ºQ2…?´÷Z™t8YºÁñu£ÀKx.b[gÐi ¸} ¨½x<Ý_ðk‘“þǼ­ 6&¸ëîõÆný[sÛ§ $ã7ªì³¥­ê¸„ ë~›ûUí>X¡\\KüKÙÕßÄîŸ:ã7ä D¸7¼« êWÖ W¸¦H?ÍYFJfñùµ”ê6»Îë§~ P¹ôxb!“뎻xëíî. ÙöÒæ2xöµn^fëú¤ƒ•zÞþVÙÒ AHoo°Å”ÙñÇÁ-¬?ÜN<í§«|Ÿ[¿­•Ôhq°ú]*ÀJž¾÷¿:³I.aÙ· MèßšR+Ò­ë³ä¤`PD¼Jéñå5³{?„.Ü/zí.ÙNú¶áBEpÈMgE‘N,dbæ…ží!÷ŒÄÖ鋆ÚÍ»fÑÔL8íù[ƒ'H¿¢y±}H€AC#‰$ìùÎØkgtƯ~àh-\• &9Õ{D_%nzl~'Ôø'±èVÌÑ'ùïøgÎwâlªÙS7"DCl&nÓ‰dR— z¨„Vg>Sz¡›ËœÞL,é/ÜV\¬LÔK~ÑÅ›Û|áèFQjщn|ÉJ·‘õo1éE&_SJmè±^Ópó»•X«oxý™×€.·œLÑè2òâêq’Fyt¹QÖ‘ÑüeçVÀQ±Á§—Xâ̧!BDë€0ºQ¬T­Z–ñMÁÌŽEfyä°1"e+.‘E;‹§~GtFâÃûq^ô¡‡ƒt@Eg·EÌãˆÑc=£ƒ[ÁÉ•ÑX?»Î°•™î?ä<Ü&Y,~zrrCyÂÇW?¾7ûü¨s¨pwض?q5Ø!y%çËË*…¬@¯ZƒoÜ}åTž ¤ÈÙ磇‰Ù_ɉÑ$Õ$è: †t½/Ú:ÛÄÍ­í²äM“Óo.)çN!`ra³ £û,<âõJ!½8+ýá”uÔK5wE¿*’ú¾s÷i.Õ­CFáÔˆ°PO©·«PÍ<"Æ^w3½Ï5<ö=|;÷¨ÞÏ©yêåöcÔ/ovÁ²4þ[™='‚"·6•Mm÷ïTü*ýø ‹OíRÛñ¼º± ô2°ñ~©Æ“ÂôtO»4©ÒSÕ¿¼æ|¢&Œè•ï,iJž 7åLr¾j^ôæH’ütq»&r"ýxÚ³™ Å}š§´ÐNj í"\é°¥Â#31ÑÀìc-©ð„܈Sì&3úxº¨Ÿ^è 3&FQ¾®ƒn¬8P,¸ŽÔî2;¢]ï5#˜YFO…ß)E’yŲË\à©™Ûj¶Kd$X9À[€jy°Öê§#ºÌkå_²´,H½#(’4RTó¾Ý«ì —z‡÷gü»Æv­SorîvzP=Z2?™Á›äš¤„(Èö«Aå’ Í2´Ë÷ÚRAN9ˆ’穜ú…;”ŸôõOè xu)òiÛ"^õ*‚ÇP‰³õ“œé6ºLRª.OÏÌÐŒ¢‰kô.+t¹Ç‹ŠâoŠiȹ±€ ¬6W$³Ø`¿ýµƒÒ†‹­åÇҮߞ+? ±˜0ÙjëÇ›çGº-Ê g®Q%X¼ Ð#^\Xüé£Éæ{5²àÝ5cTnhE»j ÉËÝ^ýõœK6¯âêÐÏŠ 9hÞPø„GÔqÆ*å>VlÔKwKs –«¼k ‹Ú£#äœfU‘×áü iª³Nlv€óIØsì:8%žTœá‚0 ÒÅ]³Ã7’HEg¹ÕÔè”§_Æ baþÑ=–·4L,þü¤–È•ôCýù,3ƒ²uFm»<—¬·†?ýrôs‰Áõ,Šæ¨ž´oE)¤s‰l=ɬ”ÖÞì ^P…Xׄjùч®8Ÿþ8Sq˜ì´ ÿø>ئóH‹žƒ¤é[5^aØDïæÞqϵØ×n¦ÅÛoGLµ£.J¯lFÞð¼å…û¼#3ˆz#rH¹ì¾…@Ý•·I*½Í'ù>-{{bO‹É[­›u}ÙŸ]´=ž™ê•E”w®Êo#êZc €$¸¿ZVë“Ñ–]”ÖV?¢êÔ#wQÀ›ø*¥¾çʶ•_83ÕüB›Hy N$,7LâYIâ²týõiØ >X7/°r9BžH0»ŠŒ'¦Ë¤êÍõ\UæçGeªëe’55^²ú?®Z¤ª>%T|ð! Ç~ÿØ.vŒq>ýâ Ó}Sœ1îÐ t“ Þ5h))ž4µ_žÖÚÖÅ6§{*§SV¬"÷r!Ù{Ì‘4¯á:ÿ”ÑlÚdˆ†q2ËçRÂì¾.ì¾íi,pÿ˜¼ì›jøÅ¹¬ÔÒæª}}ø¤NN$ñg_3ŮІ}kbÛ ©9`[Ÿ¡¼Ïˆv´õ݆ÇÔ¥QåXä•K6’RýB”|—õ™—™ÔûjÕ  ‹*§ ¡§‹2ýb÷¹úg"'Çl—L+›9ù/B}øyÑ‹ÿ š¤¾[ŸÂˆšU2‡2³”‹,8~s÷Û¾jþÙ"¥àö¥6ئSür'»2UÇW¸ä|´þ#çfkÿØQhÁË‚b½u¹èÊkW,ØœïÜ;·%ä¡ãU[ÓMMŒõ25¿~ÉÜW}±lX<@.wtÛP~0¬»1nãáKïÄy›ÂÆë~­ÓeÑ Y+°ëÑùŽKø!óa»ÔÚ—¹iÕŽlˆH¸på»0ñZîè3Æ­é†ÞlN ð»rY¦(÷+›Ó×K~õ{Mæ e¿enùBƒÅ×q—Rß*°?nÚBø_PQ‘wºµ5tøAMgîæ»ù GíÇSËšHÖºy ÏáC·VÑ4ûü±®–OÑöÂÜ‹ƒòG!ÝÜû”23:ñ#Æ»`Ël,Ñ\™ÚñØtë»°‰Cÿ6­ö`™× ž6 “/u5Çì—J.èÀ=›¢ ø…tÚiz[ÆUbÒ›Üé„÷ׯ O‚÷Dd3žŽf:°l噜¦rºÍ[xŽ×=w_HT¨#AÞ³ß^¡;(åŽ ¯ˆ-`4’€j“’M/á´„£ !å-3³Z캸¹ÍOi?źE°^58•œú–‘Þí¯ªMôÒ&â_Ðê'!¸ rŒ«÷°szö¢¤ŒÆK½®Q‚å33[‹`}‘éüÆÅসˆßržÎm‰üÿ~ukn endstream endobj 201 0 obj << /Type /FontDescriptor /FontName /CJPCDG+NimbusRomNo9L-ReguItal /Flags 4 /FontBBox [-169 -270 1010 924] /Ascent 669 /CapHeight 669 /Descent -193 /ItalicAngle -15 /StemV 78 /XHeight 441 /CharSet (/A/D/a/b/c/d/e/i/l/o/s/t/x) /FontFile 200 0 R >> endobj 180 0 obj << /Type /Encoding /Differences [2/fi 33/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright 43/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater 65/A/B/C/D/E/F/G/H/I/J 76/L/M/N/O/P 82/R/S/T/U/V/W 89/Y 91/bracketleft 93/bracketright 95/underscore 97/a/b/c/d/e/f/g/h/i 107/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y 123/braceleft/bar/braceright] >> endobj 56 0 obj << /Type /Font /Subtype /Type1 /BaseFont /PLSMJY+NimbusMonL-Regu /FontDescriptor 189 0 R /FirstChar 33 /LastChar 125 /Widths 182 0 R /Encoding 180 0 R >> endobj 34 0 obj << /Type /Font /Subtype /Type1 /BaseFont /BAMJYM+NimbusSanL-Bold /FontDescriptor 191 0 R /FirstChar 46 /LastChar 120 /Widths 185 0 R /Encoding 180 0 R >> endobj 32 0 obj << /Type /Font /Subtype /Type1 /BaseFont /JLQFGG+NimbusSanL-Regu /FontDescriptor 193 0 R /FirstChar 39 /LastChar 121 /Widths 186 0 R /Encoding 180 0 R >> endobj 58 0 obj << /Type /Font /Subtype /Type1 /BaseFont /OOGSZS+NimbusSanL-ReguItal /FontDescriptor 195 0 R /FirstChar 65 /LastChar 121 /Widths 181 0 R /Encoding 180 0 R >> endobj 49 0 obj << /Type /Font /Subtype /Type1 /BaseFont /AEIJQM+NimbusRomNo9L-Medi /FontDescriptor 197 0 R /FirstChar 49 /LastChar 120 /Widths 184 0 R /Encoding 180 0 R >> endobj 31 0 obj << /Type /Font /Subtype /Type1 /BaseFont /GGIFTK+NimbusRomNo9L-Regu /FontDescriptor 199 0 R /FirstChar 2 /LastChar 121 /Widths 187 0 R /Encoding 180 0 R >> endobj 55 0 obj << /Type /Font /Subtype /Type1 /BaseFont /CJPCDG+NimbusRomNo9L-ReguItal /FontDescriptor 201 0 R /FirstChar 65 /LastChar 120 /Widths 183 0 R /Encoding 180 0 R >> endobj 35 0 obj << /Type /Pages /Count 6 /Kids [26 0 R 37 0 R 46 0 R 52 0 R 95 0 R 156 0 R] >> endobj 202 0 obj << /Type /Outlines /First 7 0 R /Last 23 0 R /Count 2 >> endobj 23 0 obj << /Title 24 0 R /A 21 0 R /Parent 202 0 R /Prev 7 0 R >> endobj 19 0 obj << /Title 20 0 R /A 17 0 R /Parent 7 0 R /Prev 15 0 R >> endobj 15 0 obj << /Title 16 0 R /A 13 0 R /Parent 7 0 R /Prev 11 0 R /Next 19 0 R >> endobj 11 0 obj << /Title 12 0 R /A 9 0 R /Parent 7 0 R /Next 15 0 R >> endobj 7 0 obj << /Title 8 0 R /A 5 0 R /Parent 202 0 R /Next 23 0 R /First 11 0 R /Last 19 0 R /Count -3 >> endobj 203 0 obj << /Names [(Doc-Start) 33 0 R (_examples) 59 0 R (_installation) 179 0 R (_numbered_source_code_listing) 108 0 R (_source_code_paragraphs) 60 0 R (_unnumbered_source_code_listing) 80 0 R] /Limits [(Doc-Start) (_unnumbered_source_code_listing)] >> endobj 204 0 obj << /Names [(lstlisting.-1) 61 0 R (lstlisting.-2) 73 0 R (lstlisting.-3) 75 0 R (lstlisting.-4) 77 0 R (lstlisting.-5) 81 0 R (lstlisting.-6) 98 0 R] /Limits [(lstlisting.-1) (lstlisting.-6)] >> endobj 205 0 obj << /Names [(lstlisting.-7) 109 0 R (lstlisting.-8) 143 0 R (lstnumber.-1.1) 62 0 R (lstnumber.-1.10) 71 0 R (lstnumber.-1.11) 72 0 R (lstnumber.-1.2) 63 0 R] /Limits [(lstlisting.-7) (lstnumber.-1.2)] >> endobj 206 0 obj << /Names [(lstnumber.-1.3) 64 0 R (lstnumber.-1.4) 65 0 R (lstnumber.-1.5) 66 0 R (lstnumber.-1.6) 67 0 R (lstnumber.-1.7) 68 0 R (lstnumber.-1.8) 69 0 R] /Limits [(lstnumber.-1.3) (lstnumber.-1.8)] >> endobj 207 0 obj << /Names [(lstnumber.-1.9) 70 0 R (lstnumber.-2.1) 74 0 R (lstnumber.-3.1) 76 0 R (lstnumber.-4.1) 78 0 R (lstnumber.-4.2) 79 0 R (lstnumber.-5.1) 82 0 R] /Limits [(lstnumber.-1.9) (lstnumber.-5.1)] >> endobj 208 0 obj << /Names [(lstnumber.-5.10) 91 0 R (lstnumber.-5.11) 92 0 R (lstnumber.-5.12) 93 0 R (lstnumber.-5.2) 83 0 R (lstnumber.-5.3) 84 0 R (lstnumber.-5.4) 85 0 R] /Limits [(lstnumber.-5.10) (lstnumber.-5.4)] >> endobj 209 0 obj << /Names [(lstnumber.-5.5) 86 0 R (lstnumber.-5.6) 87 0 R (lstnumber.-5.7) 88 0 R (lstnumber.-5.8) 89 0 R (lstnumber.-5.9) 90 0 R (lstnumber.-6.1) 99 0 R] /Limits [(lstnumber.-5.5) (lstnumber.-6.1)] >> endobj 210 0 obj << /Names [(lstnumber.-6.2) 100 0 R (lstnumber.-6.3) 101 0 R (lstnumber.-6.4) 102 0 R (lstnumber.-6.5) 103 0 R (lstnumber.-6.6) 104 0 R (lstnumber.-6.7) 105 0 R] /Limits [(lstnumber.-6.2) (lstnumber.-6.7)] >> endobj 211 0 obj << /Names [(lstnumber.-6.8) 106 0 R (lstnumber.-6.9) 107 0 R (lstnumber.-7.1) 110 0 R (lstnumber.-7.10) 119 0 R (lstnumber.-7.11) 120 0 R (lstnumber.-7.12) 121 0 R] /Limits [(lstnumber.-6.8) (lstnumber.-7.12)] >> endobj 212 0 obj << /Names [(lstnumber.-7.13) 122 0 R (lstnumber.-7.14) 123 0 R (lstnumber.-7.15) 124 0 R (lstnumber.-7.16) 125 0 R (lstnumber.-7.17) 126 0 R (lstnumber.-7.18) 127 0 R] /Limits [(lstnumber.-7.13) (lstnumber.-7.18)] >> endobj 213 0 obj << /Names [(lstnumber.-7.19) 128 0 R (lstnumber.-7.2) 111 0 R (lstnumber.-7.20) 129 0 R (lstnumber.-7.21) 130 0 R (lstnumber.-7.22) 131 0 R (lstnumber.-7.23) 132 0 R] /Limits [(lstnumber.-7.19) (lstnumber.-7.23)] >> endobj 214 0 obj << /Names [(lstnumber.-7.24) 133 0 R (lstnumber.-7.25) 134 0 R (lstnumber.-7.26) 135 0 R (lstnumber.-7.27) 136 0 R (lstnumber.-7.28) 137 0 R (lstnumber.-7.29) 138 0 R] /Limits [(lstnumber.-7.24) (lstnumber.-7.29)] >> endobj 215 0 obj << /Names [(lstnumber.-7.3) 112 0 R (lstnumber.-7.30) 139 0 R (lstnumber.-7.31) 140 0 R (lstnumber.-7.32) 141 0 R (lstnumber.-7.33) 142 0 R (lstnumber.-7.4) 113 0 R] /Limits [(lstnumber.-7.3) (lstnumber.-7.4)] >> endobj 216 0 obj << /Names [(lstnumber.-7.5) 114 0 R (lstnumber.-7.6) 115 0 R (lstnumber.-7.7) 116 0 R (lstnumber.-7.8) 117 0 R (lstnumber.-7.9) 118 0 R (lstnumber.-8.1) 144 0 R] /Limits [(lstnumber.-7.5) (lstnumber.-8.1)] >> endobj 217 0 obj << /Names [(lstnumber.-8.10) 153 0 R (lstnumber.-8.11) 159 0 R (lstnumber.-8.12) 160 0 R (lstnumber.-8.13) 161 0 R (lstnumber.-8.14) 162 0 R (lstnumber.-8.15) 163 0 R] /Limits [(lstnumber.-8.10) (lstnumber.-8.15)] >> endobj 218 0 obj << /Names [(lstnumber.-8.16) 164 0 R (lstnumber.-8.17) 165 0 R (lstnumber.-8.18) 166 0 R (lstnumber.-8.19) 167 0 R (lstnumber.-8.2) 145 0 R (lstnumber.-8.20) 168 0 R] /Limits [(lstnumber.-8.16) (lstnumber.-8.20)] >> endobj 219 0 obj << /Names [(lstnumber.-8.21) 169 0 R (lstnumber.-8.22) 170 0 R (lstnumber.-8.23) 171 0 R (lstnumber.-8.24) 172 0 R (lstnumber.-8.25) 173 0 R (lstnumber.-8.26) 174 0 R] /Limits [(lstnumber.-8.21) (lstnumber.-8.26)] >> endobj 220 0 obj << /Names [(lstnumber.-8.27) 175 0 R (lstnumber.-8.28) 176 0 R (lstnumber.-8.29) 177 0 R (lstnumber.-8.3) 146 0 R (lstnumber.-8.30) 178 0 R (lstnumber.-8.4) 147 0 R] /Limits [(lstnumber.-8.27) (lstnumber.-8.4)] >> endobj 221 0 obj << /Names [(lstnumber.-8.5) 148 0 R (lstnumber.-8.6) 149 0 R (lstnumber.-8.7) 150 0 R (lstnumber.-8.8) 151 0 R (lstnumber.-8.9) 152 0 R (page.1) 54 0 R] /Limits [(lstnumber.-8.5) (page.1)] >> endobj 222 0 obj << /Names [(page.2) 97 0 R (page.3) 158 0 R (page.i) 30 0 R (page.ii) 39 0 R (page.iii) 48 0 R (section.1) 6 0 R] /Limits [(page.2) (section.1)] >> endobj 223 0 obj << /Names [(section.2) 22 0 R (subsection.1.1) 10 0 R (subsection.1.2) 14 0 R (subsection.1.3) 18 0 R] /Limits [(section.2) (subsection.1.3)] >> endobj 224 0 obj << /Kids [203 0 R 204 0 R 205 0 R 206 0 R 207 0 R 208 0 R] /Limits [(Doc-Start) (lstnumber.-5.4)] >> endobj 225 0 obj << /Kids [209 0 R 210 0 R 211 0 R 212 0 R 213 0 R 214 0 R] /Limits [(lstnumber.-5.5) (lstnumber.-7.29)] >> endobj 226 0 obj << /Kids [215 0 R 216 0 R 217 0 R 218 0 R 219 0 R 220 0 R] /Limits [(lstnumber.-7.3) (lstnumber.-8.4)] >> endobj 227 0 obj << /Kids [221 0 R 222 0 R 223 0 R] /Limits [(lstnumber.-8.5) (subsection.1.3)] >> endobj 228 0 obj << /Kids [224 0 R 225 0 R 226 0 R 227 0 R] /Limits [(Doc-Start) (subsection.1.3)] >> endobj 229 0 obj << /Dests 228 0 R >> endobj 230 0 obj << /Type /Catalog /Pages 35 0 R /Outlines 202 0 R /Names 229 0 R /PageMode/UseOutlines/PageLabels << /Nums [0 << /S /r >> 3 << /S /D >> ] >> /OpenAction 25 0 R >> endobj 231 0 obj << /Author()/Title(Source Code Highlight Filter)/Subject()/Creator(DBLaTeX-0.2.8)/Producer(pdfTeX-1.40.3)/Keywords() /CreationDate (D:20080704232709+12'00') /ModDate (D:20080704232709+12'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX using libpoppler, Version 3.141592-1.40.3-2.2 (Web2C 7.5.6) kpathsea version 3.5.6) >> endobj xref 0 232 0000000001 65535 f 0000000002 00000 f 0000000003 00000 f 0000000004 00000 f 0000000000 00000 f 0000000015 00000 n 0000007088 00000 n 0000095175 00000 n 0000000060 00000 n 0000000086 00000 n 0000007205 00000 n 0000095103 00000 n 0000000136 00000 n 0000000177 00000 n 0000008443 00000 n 0000095017 00000 n 0000000228 00000 n 0000000277 00000 n 0000012889 00000 n 0000094944 00000 n 0000000328 00000 n 0000000375 00000 n 0000019245 00000 n 0000094870 00000 n 0000000421 00000 n 0000000452 00000 n 0000000833 00000 n 0000000948 00000 n 0000001520 00000 n 0000000503 00000 n 0000001402 00000 n 0000094352 00000 n 0000093835 00000 n 0000001461 00000 n 0000093665 00000 n 0000094701 00000 n 0000002392 00000 n 0000002218 00000 n 0000001649 00000 n 0000002333 00000 n 0000003138 00000 n 0000003288 00000 n 0000003441 00000 n 0000003596 00000 n 0000003750 00000 n 0000003958 00000 n 0000002976 00000 n 0000002486 00000 n 0000003899 00000 n 0000094179 00000 n 0000006654 00000 n 0000009326 00000 n 0000006513 00000 n 0000004064 00000 n 0000007029 00000 n 0000094524 00000 n 0000093495 00000 n 0000006842 00000 n 0000094005 00000 n 0000007146 00000 n 0000007264 00000 n 0000007323 00000 n 0000007382 00000 n 0000007441 00000 n 0000007500 00000 n 0000007559 00000 n 0000007618 00000 n 0000007677 00000 n 0000007736 00000 n 0000007794 00000 n 0000007853 00000 n 0000007912 00000 n 0000007971 00000 n 0000008030 00000 n 0000008089 00000 n 0000008148 00000 n 0000008207 00000 n 0000008266 00000 n 0000008325 00000 n 0000008384 00000 n 0000008502 00000 n 0000008561 00000 n 0000008620 00000 n 0000008679 00000 n 0000008738 00000 n 0000008796 00000 n 0000008855 00000 n 0000008914 00000 n 0000008973 00000 n 0000009032 00000 n 0000009091 00000 n 0000009150 00000 n 0000009209 00000 n 0000009268 00000 n 0000015702 00000 n 0000012118 00000 n 0000009456 00000 n 0000012233 00000 n 0000012292 00000 n 0000012351 00000 n 0000012410 00000 n 0000012470 00000 n 0000012530 00000 n 0000012590 00000 n 0000012650 00000 n 0000012710 00000 n 0000012769 00000 n 0000012829 00000 n 0000012948 00000 n 0000013008 00000 n 0000013068 00000 n 0000013128 00000 n 0000013188 00000 n 0000013247 00000 n 0000013307 00000 n 0000013367 00000 n 0000013427 00000 n 0000013487 00000 n 0000013547 00000 n 0000013607 00000 n 0000013667 00000 n 0000013727 00000 n 0000013786 00000 n 0000013846 00000 n 0000013906 00000 n 0000013966 00000 n 0000014026 00000 n 0000014086 00000 n 0000014146 00000 n 0000014206 00000 n 0000014266 00000 n 0000014325 00000 n 0000014385 00000 n 0000014445 00000 n 0000014505 00000 n 0000014565 00000 n 0000014625 00000 n 0000014685 00000 n 0000014745 00000 n 0000014805 00000 n 0000014865 00000 n 0000014924 00000 n 0000014984 00000 n 0000015044 00000 n 0000015104 00000 n 0000015164 00000 n 0000015224 00000 n 0000015284 00000 n 0000015344 00000 n 0000015404 00000 n 0000015464 00000 n 0000015524 00000 n 0000015583 00000 n 0000015643 00000 n 0000017777 00000 n 0000019366 00000 n 0000017639 00000 n 0000015808 00000 n 0000017966 00000 n 0000018027 00000 n 0000018088 00000 n 0000018149 00000 n 0000018210 00000 n 0000018271 00000 n 0000018332 00000 n 0000018392 00000 n 0000018453 00000 n 0000018514 00000 n 0000018575 00000 n 0000018636 00000 n 0000018697 00000 n 0000018758 00000 n 0000018819 00000 n 0000018880 00000 n 0000018940 00000 n 0000019001 00000 n 0000019062 00000 n 0000019123 00000 n 0000019184 00000 n 0000019305 00000 n 0000093045 00000 n 0000019485 00000 n 0000019732 00000 n 0000020123 00000 n 0000020366 00000 n 0000020674 00000 n 0000020993 00000 n 0000021345 00000 n 0000021816 00000 n 0000037920 00000 n 0000038439 00000 n 0000047504 00000 n 0000047816 00000 n 0000055843 00000 n 0000056231 00000 n 0000060400 00000 n 0000060660 00000 n 0000069421 00000 n 0000069693 00000 n 0000085557 00000 n 0000085985 00000 n 0000092782 00000 n 0000094796 00000 n 0000095284 00000 n 0000095548 00000 n 0000095760 00000 n 0000095981 00000 n 0000096201 00000 n 0000096421 00000 n 0000096645 00000 n 0000096865 00000 n 0000097091 00000 n 0000097321 00000 n 0000097555 00000 n 0000097788 00000 n 0000098022 00000 n 0000098252 00000 n 0000098478 00000 n 0000098712 00000 n 0000098945 00000 n 0000099179 00000 n 0000099410 00000 n 0000099619 00000 n 0000099784 00000 n 0000099946 00000 n 0000100064 00000 n 0000100188 00000 n 0000100311 00000 n 0000100410 00000 n 0000100512 00000 n 0000100550 00000 n 0000100730 00000 n trailer << /Size 232 /Root 230 0 R /Info 231 0 R /ID [<0199FC772F6DB9530B8374A7AF602469> <0199FC772F6DB9530B8374A7AF602469>] >> startxref 101075 %%EOF asciidoc-8.2.7/doc/a2x.1.txt0000644000175100017510000001372311033406712015616 0ustar srackhamsrackhamA2X(1) ====== Stuart Rackham NAME ---- a2x - convert Asciidoc text file to PDF, XHTML, HTML Help, manpage or plain text SYNOPSIS -------- *a2x* ['OPTIONS'] 'FILE' DESCRIPTION ----------- A DocBook toolchain wrapper script that translates an AsciiDoc text file 'FILE' to PDF, DVI, PS, LaTeX, XHTML (single page or chunked), man page, HTML Help or plain text formats. PDF, XHTML, man page and HTML Help formats are are generated using the asciidoc(1), xsltproc(1), DocBook XSL Stylesheets, dblatex (or FOP) toolchain. Plain text is produced by passing asciidoc(1) generated HTML through lynx(1). The htmlhelp format option generates .hhp, .hhc and .html files suitable for compilation to an HTML Help .chm file. OPTIONS ------- *-a, --attribute*='ATTRIBUTE':: Set asciidoc(1) attribute value (shortcut for *--asciidoc-opts*='"-a ATTRIBUTE"' option). This option may be specified more than once. *--asciidoc-opts*='ASCIIDOC_OPTS':: Additional asciidoc(1) options. This option may be specified more than once. *--copy*:: Copy distributed docbook-xsl CSS stylesheet admonition and navigation icons to their respective destinations. Applies to 'xhtml', 'chunked', 'htmlhelp' formats. The default behavior is to suppress copying. *-D, --destination-dir*='PATH':: Output directory. Defaults to source 'FILE' directory. *-d, --doctype*='DOCTYPE':: DocBook document type: 'article', 'manpage' or 'book'. Default document type is 'article' unless the format is 'manpage' (in which case it defaults to 'manpage'). *-f, --format*='FORMAT':: Output format: 'chunked', 'dvi', 'htmlhelp', 'manpage', 'pdf', 'ps', 'tex', 'text' or 'xhtml'. *-h, --help*:: Print command-line syntax and program options to stdout. *--icons*:: Use admonition or navigation icon images in output documents. The default behavior is to use text in place of icons. *--icons-dir*='PATH':: A path (relative to destination HTML files) containing admonition and navigation icons. Defaults to './images/icons/'. Applies to 'xhtml', 'chunked', 'htmlhelp' formats. *-n, --dry-run*:: Don't do anything just print what would have been done. *-s, --skip-asciidoc*:: Skip asciidoc execution. This is useful for converting DocBook XML files not derived from AsciiDoc sources. Ignored if --format*='text'. *--stylesheet*='PATH':: A path (relative to destination HTML files) specifying the docbook-xsl CSS stylesheet file. Defaults to './docbook-xsl.css'. Applies to 'xhtml', 'chunked', 'htmlhelp' formats. *-v, --verbose*:: Print operational details to stderr. A second *-v* option applies the verbose option to toolchain commands. *--version*:: Print program version to stdout. *--xsltproc-opts*='XSLTPROC_OPTS':: Additional xsltproc(1) options. This option may be specified more than once. *--fop-opts*='FOP_OPTS':: Additional fop options. This option may be specified more than once. If this option is specified fop is used to generate PDFs. *--dblatex-opts*='DBLATEX_OPTS':: Additional dblatex options. This option may be specified more than once. OUTPUT FILES ------------ Output files are written to the directory specified by the *--destination-dir* option. If no *--destination-dir* option is set output files are written to the source FILE directory. Output files have the same name as the source 'FILE' but with an appropriate file name extension: .html for 'xhtml'; .hhp for 'htmlhelp'; .pdf for 'pdf'; .text for 'text'. By convention manpages have no .man extension (man page section number only). Chunked HTML directory names have a .chunked extension; chunked HTML Help directory names have a .htmlhelp extension. Same named existing files are overwritten. Intermediate output files are written to the source 'FILE' directory and are not automatically deleted. Intermediate DocBook XML files generated by AsciiDoc are only regenerated if out of date with respect to the AsciiDoc source 'FILE'. In addition to generating HTML files the 'xhtml', 'chunked' and 'htmlhelp' formats copy the DocBook XSL stylesheet plus admonition and navigation icons distributed with AsciiDoc to their respective destination locations. Existing stylesheets and icons are only copied if they are newer than the destination files or if the destination files are missing. The 'xhtml' format generates a single XHTML output page. The 'chunked' format writes multiple per-section HTML pages to a chunked directory in the destination directory. The chunked directory has the same name as the source 'FILE' name plus a .chunked extension. EXAMPLES -------- `a2x -f pdf doc/source-highlight-filter.txt`:: Generates doc/source-highlight-filter.pdf file. `a2x -f chunked -D ../webpages guide.txt`:: Creates chunked directory `../webpages/guide.chunked` containing chunked HTML files. Also copies `docbook-xsl.css` stylesheet to the `../webpages/guide.chunked` directory plus admonition and navigation icons to the `../webpages/guide.chunked/images/icons` directory. REQUISITES ---------- This script runs under the bash(1) shell and requires the following programs (which may or may not be prepackaged with your Linux distribution): Asciidoc:: http://www.methods.co.nz/asciidoc/ xsltproc:: http://xmlsoft.org/XSLT/ DocBook XSL Stylesheets:: http://docbook.sourceforge.net/projects/xsl/ dblatex (for PDF, DVI, PostScript and LaTeX file generation):: http://dblatex.sourceforge.net/ FOP (alternative PDF file generation):: http://xmlgraphics.apache.org/fop/ Lynx (for text file generation):: http://lynx.isc.org/ See also the latest README file. BUGS ---- - The odt output format is undocumented and experimental. - See also the AsciiDoc distribution BUGS file. AUTHOR ------ Written by Stuart Rackham, RESOURCES --------- SourceForge: http://sourceforge.net/projects/asciidoc/ Main web site: http://www.methods.co.nz/asciidoc/ COPYING ------- Copyright \(C) 2002-2008 Stuart Rackham. Free use of this software is granted under the terms of the GNU General Public License (GPL). asciidoc-8.2.7/doc/article.txt0000644000175100017510000000674211022115421016403 0ustar srackhamsrackhamThe Article Title ================= Author's Name v1.0, Dec 2003 This is the optional preamble (an untitled section body). Useful for writing simple sectionless documents consisting only of a preamble. Abstract -------- The optional abstract (one or more paragraphs) goes here. This document is an AsciiDoc article skeleton containing briefly annotated element placeholders plus a couple of example index entries and footnotes. The preface, appendix, bibliography, glossary and index section titles are significant ('specialsections'). The First Section ----------------- Article sections start at level 1 and can be nested up to four levels deep. footnote:[An example footnote.] indexterm:[Example index entry] And now for something completely different: ((monkeys)), lions and tigers (Bengal and Siberian) using the alternative syntax index entries. (((Big cats,Lions))) (((Big cats,Tigers,Bengal Tiger))) (((Big cats,Tigers,Siberian Tiger))) Note that multi-entry terms generate separate index entries. Here are a couple of image examples: an image:images/smallnew.png[] example inline image followed by an example block image: .Tiger block image image::images/tiger.png[Tiger image] Followed by an example table: .An example table `-----------------`-------------------------- Option Description --------------------------------------------- -a 'USER GROUP' Add 'USER' to 'GROUP'. -R 'GROUP' Disables access to 'GROUP'. --------------------------------------------- [[X1]] Sub-section with Anchor ~~~~~~~~~~~~~~~~~~~~~~~ Sub-section at level 2. A Nested Sub-section ^^^^^^^^^^^^^^^^^^^^ Sub-section at level 3. Yet another nested Sub-section ++++++++++++++++++++++++++++++ Sub-section at level 4. This is the maximum sub-section depth supported by the distributed AsciiDoc configuration. footnote:[A second example footnote.] The Second Section ------------------ Article sections are at level 1 and can contain sub-sections nested up to four deep. An example link to anchor at start of the <>. indexterm:[Second example index entry] An example link to a bibliography entry <>. Appendix A: Example Appendix ---------------------------- AsciiDoc article appendices are just just article sections with 'specialsection' titles. Appendix Sub-section ~~~~~~~~~~~~~~~~~~~~ Appendix sub-section at level 2. Bibliography ------------ The bibliography list is an example of an AsciiDoc SimpleList, the AsciiDoc source list items are bulleted with a `+` character. + [[[taoup]]] Eric Steven Raymond. 'The Art of Unix Programming'. Addison-Wesley. ISBN 0-13-142901-9. + [[[walsh-muellner]]] Norman Walsh & Leonard Muellner. 'DocBook - The Definitive Guide'. O'Reilly & Associates. 1999. ISBN 1-56592-580-7. Glossary -------- Glossaries are optional. Glossaries entries are an example of AsciiDoc VariableList entries, the AsciiDoc source entry terms are terminated by the ":-" characters. A glossary term:- The corresponding (indented) definition. A second glossary term:- The corresponding (indented) definition. ifdef::backend-docbook[] Index ----- //////////////////////////////////////////////////////////////// The index is normally left completely empty, it's contents being generated automatically by the DocBook toolchain. //////////////////////////////////////////////////////////////// endif::backend-docbook[] asciidoc-8.2.7/doc/asciidoc.1.txt0000644000175100017510000000631111032373106016674 0ustar srackhamsrackhamASCIIDOC(1) =========== Stuart Rackham NAME ---- asciidoc - converts an AsciiDoc text file to DocBook, HTML or LinuxDoc SYNOPSIS -------- *asciidoc* ['OPTIONS'] 'FILE' DESCRIPTION ----------- The asciidoc(1) command translates the AsciiDoc text file 'FILE' to a DocBook, HTML or LinuxDoc file. 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@' (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. *-b, --backend*='BACKEND':: Backend output file format: 'docbook', 'xhtml11' or 'html4'. Defaults to 'xhtml11'. *-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. *-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. *-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 *-a numbered*. *--unsafe*:: Disable safe mode. Safe mode is enabled by default, disabling it is potentially dangerous. *-v, --verbose*:: Verbosely print processing information and configuration file checks to stderr. *--version*:: Print program version number. 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 ------ Written by Stuart Rackham, RESOURCES --------- SourceForge: Main web site: COPYING ------- Copyright \(C) 2002-2008 Stuart Rackham. Free use of this software is granted under the terms of the GNU General Public License (GPL). asciidoc-8.2.7/doc/asciidoc.txt0000644000175100017510000051711711033405201016541 0ustar srackhamsrackhamAsciiDoc User Guide =================== Stuart Rackham :Author Initials: SJR AsciiDoc is a text document format for writing short documents, articles, books and UNIX man pages. AsciiDoc files can be translated to HTML and DocBook markups using the asciidoc(1) command. AsciiDoc is highly configurable: both the AsciiDoc source file syntax and the backend output markups (which can be almost any type of SGML/XML markup) can be customized and extended by the user. Introduction ------------ ********************************************************************** This is an overly large document, it probably needs to be refactored into a Tutorial, FAQ, Quick Reference and Formal Reference. If you're new to AsciiDoc read this section and the <> section and take a look at the example AsciiDoc `.txt` source files in the distribution `doc` directory. ********************************************************************** Plain text is the most universal electronic document format, no matter what computing environment you use, you can always read and write plain text documentation. But for many applications plain text is not a viable presentation format. HTML, PDF and roff (roff is used for man pages) are the most widely used UNIX presentation formats. DocBook is a popular UNIX documentation markup format which can be translated to HTML, PDF and other presentation formats. AsciiDoc is a plain text human readable/writable document format that can be translated to DocBook or HTML using the asciidoc(1) command. You can then either use asciidoc(1) generated HTML directly or run asciidoc(1) DocBook output through your favorite DocBook toolchain or use the AsciiDoc a2x(1) toolchain wrapper to produce PDF, DVI, LaTeX, PostScript, man page, HTML and text formats. The AsciiDoc format is a useful presentation format in its own right: AsciiDoc files are unencumbered by markup and are easily viewed, proofed and edited. AsciiDoc is light weight: it consists of a single Python script and a bunch of configuration files. Apart from asciidoc(1) and a Python interpreter, no other programs are required to convert AsciiDoc text files to DocBook or HTML. See <> below. You write an AsciiDoc document the same way you would write a normal text document, there are no markup tags or arcane notations. Built-in AsciiDoc formatting rules have been kept to a minimum and are reasonably obvious. Text markup conventions tend to be a matter of (often strong) personal preference: if the default syntax is not to your liking you can define your own by editing the text based asciidoc(1) configuration files. You can create your own configuration files to translate AsciiDoc documents to almost any SGML/XML markup. asciidoc(1) comes with a set of configuration files to translate AsciiDoc articles, books or man pages to HTML or DocBook backend formats. .My AsciiDoc Itch ********************************************************************** DocBook has emerged as the de facto standard Open Source documentation format. But DocBook is a complex language, the marked up text is difficult to read and even more difficult to write directly -- I found I was spending more time typing markup tags, consulting reference manuals and fixing syntax errors, than I was writing the documentation. ********************************************************************** [[X6]] Getting Started --------------- Installing AsciiDoc ~~~~~~~~~~~~~~~~~~~ See the `README` and `INSTALL` files for install prerequisites and procedures. Packagers take a look at <>. [[X11]] Example AsciiDoc Documents ~~~~~~~~~~~~~~~~~~~~~~~~~~ The best way to quickly get a feel for AsciiDoc is to view the AsciiDoc web site and/or distributed examples: - Take a look at the linked examples on the AsciiDoc web site home page http://www.methods.co.nz/asciidoc/. Press the 'Page Source' sidebar menu item to view corresponding AsciiDoc source. - Read the `.txt` source files in the distribution `./doc` directory in conjunction with the corresponding HTML and DocBook XML files. AsciiDoc Document Types ----------------------- There are three types of AsciiDoc documents: article, book and manpage. All document types share the same AsciiDoc format with some minor variations. Use the asciidoc(1) `-d` (`--doctype`) option to specify the AsciiDoc document type -- the default document type is 'article'. By convention the `.txt` file extension is used for AsciiDoc document source files. article ~~~~~~~ Used for short documents, articles and general documentation. See the AsciiDoc distribution `./doc/article.txt` example. book ~~~~ Books share the same format as articles; in addition there is the option to add level 0 book part sections. Book documents will normally be used to produce DocBook output since DocBook processors can automatically generate footnotes, table of contents, list of tables, list of figures, list of examples and indexes. AsciiDoc markup supports standard DocBook frontmatter and backmatter <> (dedication, preface, bibliography, glossary, index, colophon) plus footnotes and index entries. .Example book documents Book:: The `./doc/book.txt` file in the AsciiDoc distribution. Multi-part book:: The `./doc/book-multi.txt` file in the AsciiDoc distribution. manpage ~~~~~~~ Used to generate UNIX manual pages. AsciiDoc manpage documents observe special header title and section naming conventions -- see the <> section for details. See also the asciidoc(1) man page source (`./doc/asciidoc.1.txt`) from the AsciiDoc distribution. [[X5]] AsciiDoc Backends ----------------- The asciidoc(1) command translates an AsciiDoc formatted file to the backend format specified by the `-b` (`--backend`) command-line option. asciidoc(1) itself has little intrinsic knowledge of backend formats, all translation rules are contained in customizable cascading configuration files. AsciiDoc ships with the following predefined backend output formats: docbook ~~~~~~~ AsciiDoc generates the following DocBook document types: article, book and refentry (corresponding to the AsciiDoc 'article', 'book' and 'manpage' document types). DocBook documents are not designed to be viewed directly. Most Linux distributions come with conversion tools (collectively called a toolchain) for <> to presentation formats such as Postscript, HTML, PDF, DVI, PostScript, LaTeX, roff (the native man page format), HTMLHelp, JavaHelp and text. - The `--backend=docbook` command-line option produces DocBook XML. You can produce the older DocBook SGML format using the `--attribute sgml` command-line option. - Use the optional <> attribute to set the character set encoding. - Use the optional `imagesdir` attribute to prepend to the target file name paths in image inline and block macros. Defaults to a blank string. - The AsciiDoc 'Preamble' element generates a DocBook book 'preface' element although it's more usual to use an explicit 'Preface' special section (see the `./doc/book.txt` example book). [[X33]] xhtml11 ~~~~~~~ The default asciidoc(1) backend is `xhtml11` which generates XHTML 1.1 markup styled with CSS2. Default output file have a `.html` extension. 'xhtml11' document generation is influenced by the following optional attributes (the default behavior is to generate XHTML with no section numbers, embedded CSS and no linked admonition icon images): numbered:: Adds section numbers to section titles. toc:: Adds a table of contents to the start of the document. - JavaScript needs to be enabled in your browser for this to work. - By default AsciiDoc automatically embeds the required `toc.js` JavaScript in the output document -- use the 'linkcss' attribute to link the script. - The following example generates a numbered table of contents by embedding the `toc.js` script in the `mydoc.html` output document (to link the script to the output document use the 'linkcss' and 'scriptsdir' attributes): $ asciidoc -a toc -a numbered mydoc.txt toclevels:: Sets the number of title levels (1..4) reported in the table of contents (see the 'toc' attribute above). Defaults to 2 and must be used with the 'toc' attribute. Example usage: $ asciidoc -a toc -a toclevels=3 doc/asciidoc.txt toc_title:: Sets the table of contents title (defaults to 'Table of Contents'). linkcss:: Link CSS stylesheets and JavaScripts (see the 'stylesdir' and 'scriptsdir' attributes below). By default 'linkcss' is undefined in which case stylesheets and scripts are automatically embedded in the output document. stylesdir:: The name of the directory containing linked stylesheets. Defaults to `.` (the same directory as the linking document). scriptsdir:: The name of the directory containing linked JavaScripts. Defaults to `.` (the same directory as the linking document). [[X45]] icons:: Link admonition paragraph and admonition block icon images and badge images. By default 'icons' is undefined and text is used in place of icon images. [[X44]] iconsdir:: The name of the directory containing linked admonition and navigation icons. Defaults to `./images/icons`. imagesdir:: This attribute is prepended to the target image file name paths in image inline and block macros. Defaults to a blank string. theme:: Use alternative stylesheets (see <>). badges:: Link badges ('XHTML 1.1', 'CSS' and 'Get Firefox!') in document footers. By default badges are omitted ('badges' is undefined). NOTE: The path names of images, icons and scripts are relative to the output document not the source document. [[X54]] encoding:: Set the input and output document character set encoding. For example the `--attribute encoding=ISO-8859-1` command-line option will set the character set encoding to `ISO-8859-1`. - The default encoding is UTF-8. - This attribute specifies the character set in the output document. - The encoding name must correspond to a Python codec name or alias. - The 'encoding' attribute can be set using an AttributeEntry inside the document header but it must come at the start of the document before the document title. For example: :encoding: ISO-8859-1 quirks:: Use the `xhtml11-quirks.css` stylesheet to work around IE6 browser incompatibilities (this is the default behavior). data-uri:: Embed images referenced by 'image' macros using the <>. [[X35]] Stylesheets ^^^^^^^^^^^ AsciiDoc XHTML output is styled using CSS2 stylesheets from the distribution `./stylesheets/` directory. [IMPORTANT] ===================================================================== All browsers have CSS quirks, but Microsoft's IE6 has so many omissions and errors that the `xhtml11-quirks.css` stylesheet and `xhtml11-quirks.conf` configuration files are included during XHTML backend processing to to implement workarounds for IE6. If you don't use IE6 then the quirks stylesheet and configuration files can be omitted using the `--attribute quirks!` command-line option. ===================================================================== Default 'xhtml11' stylesheets: `./stylesheets/xhtml11.css`:: The main stylesheet. `./stylesheets/xhtml11-manpage.css`:: Tweaks for manpage document type generation. `./stylesheets/xhtml11-quirks.css`:: Stylesheet modifications to work around IE6 browser incompatibilities. Use the 'theme' attribute to select and alternative set of stylesheets. For example, the command-line option `-a theme=foo` will use stylesheets `foo.css`, `foo-manpage.css` and `foo-quirks.css`. html4 ~~~~~ This backend generates plain (unstyled) HTML 4.01 Transitional markup. linuxdoc ~~~~~~~~ WARNING: The AsciiDoc linuxdoc backend is still distributed but is no longer being actively developed or tested with new AsciiDoc releases (the last supported release was AsciiDoc 6.0.3). - Tables are not supported. - Images are not supported. - Callouts are not supported. - Horizontal labeled lists are not supported. - Only article document types are allowed. - The Abstract section can consist only of a single paragraph. - An AsciiDoc Preamble is not allowed. - The LinuxDoc output format does not support multiple labels per labeled list item although LinuxDoc conversion programs generally output all the labels with a warning. - Don't apply character formatting to the `link` macro attributes, LinuxDoc does not allow displayed link text to be formatted. The default output file name extension is `.sgml`. latex ~~~~~ An experimental LaTeX backend has been written for AsciiDoc by Benjamin Klum. A tutorial `./doc/latex-backend.html` is included in the AsciiDoc distribution which can also be viewed at http://www.methods.co.nz/asciidoc/latex-backend.html. Document Structure ------------------ An AsciiDoc document consists of a series of <> starting with an optional document Header, followed by an optional Preamble, followed by zero or more document Sections. Almost any combination of zero or more elements constitutes a valid AsciiDoc document: documents can range from a single sentence to a multi-part book. Block Elements ~~~~~~~~~~~~~~ Block elements consist of one or more lines of text and may contain other block elements. The AsciiDoc block structure can be informally summarized footnote:[This is a rough structural guide, not a rigorous syntax definition] as follows: Document ::= (Header?,Preamble?,Section*) Header ::= (Title,(AuthorLine,RevisionLine?)?) AuthorLine ::= (FirstName,(MiddleName?,LastName)?,EmailAddress?) RevisionLine ::= (Revision?,Date) Preamble ::= (SectionBody) Section ::= (Title,SectionBody?,(Section)*) SectionBody ::= ((BlockTitle?,Block)|BlockMacro)+ Block ::= (Paragraph|DelimitedBlock|List|Table) List ::= (BulletedList|NumberedList|LabeledList|CalloutList) BulletedList ::= (ListItem)+ NumberedList ::= (ListItem)+ CalloutList ::= (ListItem)+ LabeledList ::= (ItemLabel+,ListItem)+ ListItem ::= (ItemText,(List|ListParagraph|ListContinuation)*) Table ::= (Ruler,TableHeader?,TableBody,TableFooter?) TableHeader ::= (TableRow+,TableUnderline) TableFooter ::= (TableRow+,TableUnderline) TableBody ::= (TableRow+,TableUnderline) TableRow ::= (TableData+) Where: - '?' implies zero or one occurrence, '+' implies one or more occurrences, '*' implies zero or more occurrences. - All block elements are separated by line boundaries. - `BlockId`, `AttributeEntry` and `AttributeList` block elements (not shown) can occur almost anywhere. - There are a number of document type and backend specific restrictions imposed on the block syntax. - The following elements cannot contain blank lines: Header, Title, Paragraph, ItemText. - A ListParagraph is a Paragraph with its 'listelement' option set. - A ListContinuation is a <>. Header ~~~~~~ The Header is optional but must start on the first line of the document and must begin with a document <>. Optional Author and Revision lines immediately follow the title. The header can be preceded by a CommentBlock or comment lines. The author line contains the author's name optionally followed by the author's email address. The author's name consists of a first name followed by optional middle and last names separated by white space. Multi-word first, middle and last names can be entered in the header author line using the underscore as a word separator. The email address comes last and must be enclosed in angle <> brackets. Author names cannot contain angle <> bracket characters. The optional document header revision line should immediately follow the author line. The revision line can be one of two formats: . An alphanumeric document revision number followed by a date: * The revision number and date must be separated by a comma. * The revision number is optional but must contain at least one numeric character. * Any non-numeric characters preceding the first numeric character will be dropped. . An RCS/CSV/SVN $Id$ marker. The document heading is separated from the remainder of the document by one or more blank lines. Here's an example AsciiDoc document header: Writing Documentation using AsciiDoc ==================================== Stuart Rackham v2.0, February 2003 You can override or set header parameters by passing 'revision', 'data', 'email', 'author', 'authorinitials', 'firstname' and 'lastname' attributes using the asciidoc(1) `-a` (`--attribute`) command-line option. For example: $ asciidoc -a date=2004/07/27 article.txt Attributes can also be added to the header for substitution in the header template with <> elements. Preamble ~~~~~~~~ The Preamble is an optional untitled section body between the document Header and the first Section title. Sections ~~~~~~~~ AsciiDoc supports five section levels 0 to 4 (although only book documents are allowed to contain level 0 sections). Section levels are delineated by the section <>. Sections are translated using configuration file markup templates. To determine which configuration file template to use AsciiDoc first searches for special section titles in the <> configuration entries, if not found it uses the `[sect]` template. The `-n` (`--section-numbers`) command-line option auto-numbers HTML outputs (DocBook line numbering is handled automatically by the DocBook toolchain commands). Section IDs are auto-generated from section titles if the `sectids` attribute is defined (the default behavior). The primary purpose of this feature is to ensure persistence of table of contents links: missing section IDs are generated dynamically by the JavaScript TOC generator *after* the page is loaded. This means, for example, that if you go to a bookmarked dynamically generated TOC address the page will load but the browser will ignore the (as yet ungenerated) section ID. The IDs are generated by the following algorithm: - Replace all non-alphanumeric title characters with an underscore. - Strip leading or trailing underscores. - Convert to lowercase. - Prepend an underscore (so there's no possibility of name clashes with existing document IDs). - A numbered suffix (`_2`, `_3` ...) is added if a same named auto-generated section ID exists. For example the title 'Jim's House' would generate the ID `_jim_s_house`. [[X16]] Special Sections ^^^^^^^^^^^^^^^^ In addition to normal sections, documents can contain optional frontmatter and backmatter sections -- for example: preface, bibliography, table of contents, index. The AsciiDoc configuration file `[specialsections]` section specifies special section titles and the corresponding backend markup templates. `[specialsections]` entries are formatted like: = `` is a Python regular expression and `` is the name of a configuration file markup template section. If the `` matches an AsciiDoc document section title then the backend output is marked up using the `` markup template (instead of the default `sect` section template). The \{title} attribute value is set to the value of the matched regular expression group named 'title', if there is no 'title' group \{title} defaults to the whole of the AsciiDoc section title. AsciiDoc comes preconfigured with the following special section titles: Preface (book documents only) Abstract (article documents only) Dedication (book documents only) Glossary Bibliography|References Colophon (book documents only) Index Appendix [A-Z][:.] Inline Elements ~~~~~~~~~~~~~~~ <<X34,Inline document elements>> are used to markup character formatting and various types of text substitution. Inline elements and inline element syntax is defined in the asciidoc(1) configuration files. Here is a list of AsciiDoc inline elements in the (default) order in which they are processed: Special characters:: These character sequences escape special characters used by the backend markup (typically "<", ">", and "&"). See `[specialcharacters]` configuration file sections. Quotes:: Characters that markup words and phrases; usually for character formatting. See `[quotes]` configuration file sections. Special Words:: Word or word phrase patterns singled out for markup without the need for further annotation. See `[specialwords]` configuration file sections. Replacements:: Each Replacement defines a word or word phrase pattern to search for along with corresponding replacement text. See `[replacements]` configuration file sections. Attributes:: Document attribute names enclosed in braces (attribute references) are replaced by the corresponding attribute value. Inline Macros:: Inline macros are replaced by the contents of parametrized configuration file sections. Document Processing ------------------- The AsciiDoc source document is read and processed as follows: 1. The document 'Header' is parsed, header parameter values are substituted into the configuration file `[header]` template section which is then written to the output file. 2. Each document 'Section' is processed and its constituent elements translated to the output file. 3. The configuration file `[footer]` template section is substituted and written to the output file. When a block element is encountered asciidoc(1) determines the type of block by checking in the following order (first to last): (section) Titles, BlockMacros, Lists, DelimitedBlocks, Tables, AttributeEntrys, AttributeLists, BlockTitles, Paragraphs. The default paragraph definition `[paradef-default]` is last element to be checked. Knowing the parsing order will help you devise unambiguous macro, list and block syntax rules. Inline substitutions within block elements are performed in the following default order: 1. Special characters 2. Quotes 3. Special words 4. Replacements 5. Attributes 6. Inline Macros 7. Passthroughs 8. Replacements2 The substitutions and substitution order performed on Title, Paragraph and DelimitedBlock elements is determined by configuration file parameters. Text Formatting --------------- [[X51]] Quoted Text ~~~~~~~~~~~ Words and phrases can be formatted by enclosing inline text with quote characters: _Emphasized text_:: Word phrases \'enclosed in single quote characters' (acute accents) or \_underline characters_ are emphasized. *Strong text*:: Word phrases \*enclosed in asterisk characters* are rendered in a strong font (usually bold). +Monospaced text+:: Word phrases \`enclosed in backtick characters` (grave accents) or \+plus characters+ are rendered in a monospaced font. ``Quoted text'':: Phrases \``enclosed with two grave accents to the left and two acute accents to the right\'' are rendered in quotation marks. #Unquoted text#:: Placing \#hashes around text# does nothing, it is a mechanism to allow inline attributes to be applied to otherwise unformatted text (see example below). The alternative underline and plus characters, while marginally less readable, are arguably a better choice than the backtick and apostrophe characters as they are not normally used for, and so not confused with, punctuation. Quoted text can be prefixed with an <<X21,attribute list>>. Currently the only use made of this feature is to allow the font color, background color and size to be specified (XHTML/HTML only, not DocBook) using the first three positional attribute arguments. The first argument is the text color; the second the background color; the third is the font size. Colors are valid CSS colors and the font size is a number which treated as em units. Here are some examples: --------------------------------------------------------------------- [red]#Red text#. [,yellow]*bold text on a yellow background*. [blue,#b0e0e6]+Monospaced blue text on a light blue background+ [,,2]#Double sized text#. --------------------------------------------------------------------- New quotes can be defined by editing asciidoc(1) configuration files. See the <<X7,Configuration Files>> section for details. .Quoted text properties - Quoting cannot be overlapped. - Different quoting types can be nested. - To suppress quoted text formatting place a backslash character immediately in front of the leading quote character(s). In the case of ambiguity between escaped and non-escaped text you will need to escape both leading and trailing quotes, in the case of multi-character quotes you may even need to escape individual characters. - A configuration file `[quotes]` entry can be subsequently undefined by setting it to a blank value. [[X52]] Constrained and Unconstrained Quotes ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ There are actually two types of quotes: Constrained quotes ++++++++++++++++++ Quote text that must be bounded by white space, for example a phrase or a word. These are the most common type of quote and are the ones discussed previously. Unconstrained quotes ++++++++++++++++++++ Unconstrained quotes have no boundary constraints and can be placed anywhere within inline text. For consistency and to make them easier to remember unconstrained quotes are double-ups of the `_`, `*`, `+` and `#` constrained quotes: __unconstrained emphasized text__ **unconstrained strong text** ++unconstrained monospaced text++ ##unconstrained unquoted text## The following example emboldens the letter F: **F**ile Open... [TIP] ===================================================================== The `__`, `**`, `++` and `##` unconstrained quotes have to be double-escaped (because of their similarity to the single character constrained quotes) -- here's how to escape the previous example: \*\*F**ile Open... ===================================================================== [[X50]] Inline Passthroughs ~~~~~~~~~~~~~~~~~~~ This special text quoting mechanism passes inline text to the output document without the usual substitutions. There are two flavors: \+\++Triple-plus passthrough\+\++:: No change is made to the quoted text, it is passed verbatim to the output document. \$$Double-dollar passthrough$$:: Special characters are escaped but no other changes are made. This passthrough can be prefixed with inline attributes. Superscripts and Subscripts ~~~~~~~~~~~~~~~~~~~~~~~~~~~ Put \^carets on either^ side of the text to be superscripted, put \~tildes on either side~ of text to be subscripted. For example, the following line: e^{amp}#960;i^+1 = 0. H~2~O and x^10^. Some ^super text^ and ~some sub text~ Is rendered like: e^{amp}#960;i^+1 = 0. H~2~O and x^10^. Some ^super text^ and ~some sub text~ Superscripts and subscripts are implemented as <<X52,unconstrained quotes>> so they can be escaped with a leading backslash and prefixed with with an attribute list. Line Breaks (HTML/XHTML) ~~~~~~~~~~~~~~~~~~~~~~~~ A plus character preceded by at least one space character at the end of a line forces a line break. It generates an HTML line break (`<br />`) tag. Line breaks are ignored when outputting to DocBook since it has no line break element. Rulers (HTML/XHTML) ~~~~~~~~~~~~~~~~~~~ A line of four or more apostrophe characters will generate an HTML ruler (`<hr />`) tag. Ignored when generating non-HTML output formats. Tabs ~~~~ By default tab characters input files will translated to 8 spaces. Tab expansion is set with the 'tabsize' entry in the configuration file `[miscellaneous]` section and can be overridden in the 'include' block macro by setting a 'tabsize' attribute in the macro's attribute list. For example: include::addendum.txt[tabsize=2] The tab size can also be set using the attribute command-line option, for example `\--attribute tabsize=4` Replacements ~~~~~~~~~~~~ The following replacements are defined in the default AsciiDoc configuration: (C) copyright, (TM) trademark, (R) registered trademark, -- em dash, ... ellipsis, -> right arrow, <- left arrow, => right double arrow, <= left double arrow. Which are rendered as: (C) copyright, (TM) trademark, (R) registered trademark, -- em dash, ... ellipsis, -> right arrow, <- left arrow, => right double arrow, <= left double arrow. The <<X7,Configuration Files>> section explains how to configure your own replacements. Special Words ~~~~~~~~~~~~~ Words defined in `[specialwords]` configuration file sections are automatically marked up without having to be explicitly notated. The <<X7,Configuration Files>> section explains how to add and replace special words. [[X17]] Titles ------ Document and section titles can be in either of two formats: Two line titles ~~~~~~~~~~~~~~~ A two line title consists of a title line, starting hard against the left margin, and an underline. Section underlines consist a repeated character pairs spanning the width of the preceding title (give or take up to three characters): The default title underlines for each of the document levels are: Level 0 (top level): ====================== Level 1: ---------------------- Level 2: ~~~~~~~~~~~~~~~~~~~~~~ Level 3: ^^^^^^^^^^^^^^^^^^^^^^ Level 4 (bottom level): ++++++++++++++++++++++ Examples: Level One Section Title ----------------------- Level 2 Subsection Title ~~~~~~~~~~~~~~~~~~~~~~~~ [[X46]] One line titles ~~~~~~~~~~~~~~~ One line titles consist of a single line delimited on either side by one or more equals characters (the number of equals characters corresponds to the section level minus one). Here are some examples (levels 2 and 3 illustrate the optional trailing equals characters syntax): = Document Title (level 0) = == Section title (level 1) == === Section title (level 2) === ==== Section title (level 3) ==== ===== Section title (level 4) ===== .Note - One or more spaces must fall between the title and the delimiters. - The trailing title delimiter is optional. - The one-line title syntax can be changed by editing the configuration file `[titles]` section `sect0`...`sect4` entries. [[X42]] BlockTitles ----------- A BlockTitle element is a single line beginning with a period followed by a title. The title is applied to the next Paragraph, DelimitedBlock, List, Table or BlockMacro. For example: ........................ .Notes - Note 1. - Note 2. ........................ is rendered as: .Notes - Note 1. - Note 2. [[X41]] BlockId Element --------------- A 'BlockId' is a single line block element containing a unique identifier enclosed in double square brackets. It is used to assign an identifier to the ensuing block element for use by referring links. For example: [[chapter-titles]] Chapter titles can be ... The preceding example identifies the following paragraph so it can be linked from other location, for example with `\<<chapter-titles,chapter titles>>`. 'BlockId' elements can be applied to Title, Paragraph, List, DelimitedBlock, Table and BlockMacro elements. The BlockId element is really just an AttributeList with a special syntax which sets the `\{id}` attribute for substitution in the subsequent block's markup template. The 'BlockId' element has the same syntax and serves a similar function to the <<X30,anchor inline macro>>. Paragraphs ---------- Paragraphs are terminated by a blank line, the end of file, or the start of a DelimitedBlock. Paragraph markup is specified by configuration file `[paradef*]` sections. AsciiDoc ships with the following predefined paragraph types: Default Paragraph ~~~~~~~~~~~~~~~~~ A Default paragraph (`[paradef-default]`) consists of one or more non-blank lines of text. The first line must start hard against the left margin (no intervening white space). The processing expectation of the default paragraph type is that of a normal paragraph of text. The 'verse' paragraph <<X23,style>> preserves line boundaries and is useful for lyrics and poems. For example: --------------------------------------------------------------------- [verse] Consul *necessitatibus* per id, consetetur, eu pro everti postulant homero verear ea mea, qui. --------------------------------------------------------------------- Renders: [verse] Consul *necessitatibus* per id, consetetur, eu pro everti postulant homero verear ea mea, qui. Literal Paragraph ~~~~~~~~~~~~~~~~~ A Literal paragraph (`[paradef-literal]`) consists of one or more lines of text, where the first line is indented by one or more space or tab characters. Literal paragraphs are rendered verbatim in a monospaced font usually without any distinguishing background or border. There is no text formatting or substitutions within Literal paragraphs apart from Special Characters and Callouts. For example: --------------------------------------------------------------------- Consul *necessitatibus* per id, consetetur, eu pro everti postulant homero verear ea mea, qui. --------------------------------------------------------------------- Renders: Consul *necessitatibus* per id, consetetur, eu pro everti postulant homero verear ea mea, qui. NOTE: Because <<X64,lists>> can be indented it's possible for your Literal paragraph to be misinterpreted as a list -- in situations like this use a <<X65,LiteralBlock>> in place of a 'LiteralParagraph'. [[X28]] Admonition Paragraphs ~~~~~~~~~~~~~~~~~~~~~ 'Tip', 'Note', 'Important', 'Warning' and 'Caution' paragraph definitions support the corresponding DocBook admonishment elements -- just write a normal paragraph but place `NOTE:`, `TIP:`, `IMPORTANT:`, `WARNING:` or `CAUTION:` as the first word of the paragraph. For example: NOTE: This is an example note. or the alternative syntax: [NOTE] This is an example note. Renders: NOTE: This is an example note. TIP: If your admonition is more than a single paragraph use an <<X22,admonition block>> instead. [[X47]] Admonition Icons and Captions ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ NOTE: Admonition customization with `icons`, `iconsdir`, `icon` and `caption` attributes does not apply when generating DocBook output. If you are going the DocBook route then the <<X43,a2x(1)>> `--no-icons` and `--icons-dir` options can be used to set the appropriate XSL Stylesheets parameters. By default the asciidoc(1) `xhtml11` and `html4` backends generate text captions instead of icon image links. To generate links to icon images define the <<X45,`icons`>> attribute, for example using the `-a icons` command-line option. The <<X44,`iconsdir`>> attribute sets the location of linked icon images. You can override the default icon image using the `icon` attribute to specify the path of the linked image. For example: [icon="./images/icons/wink.png"] NOTE: What lovely war. Use the `caption` attribute to customize the admonition captions (not applicable to `docbook` backend). The following example suppresses the icon image and customizes the caption of a NOTE admonition (undefining the `icons` attribute with `icons=None` is only necessary if <<X45,admonition icons>> have been enabled): [icons=None, caption="My Special Note"] NOTE: This is my special note. This subsection also applies to <<X22,Admonition Blocks>>. Delimited Blocks ---------------- Delimited blocks are blocks of text enveloped by leading and trailing delimiter lines (normally a series of four or more repeated characters). The behavior of Delimited Blocks is specified by entries in configuration file `[blockdef*]` sections. Predefined Delimited Blocks ~~~~~~~~~~~~~~~~~~~~~~~~~~~ AsciiDoc ships with a number of predefined DelimitedBlocks (see the `asciidoc.conf` configuration file in the asciidoc(1) program directory): Predefined delimited block underlines: CommentBlock: ////////////////////////// PassthroughBlock: ++++++++++++++++++++++++++ ListingBlock: -------------------------- LiteralBlock: .......................... SidebarBlock: ************************** QuoteBlock: __________________________ ExampleBlock: ========================== Filter blocks: ~~~~~~~~~~~~~~~~~~~~~~~~~~ The <<X56,code>>, <<X57,source>> and <<X58,music>> filter blocks are detailed in the <<X59,Filters>> section. .Default DelimitedBlock substitutions `-------------.------------.---------.---------.---------.--------- Passthrough Listing Literal Sidebar Quote ------------------------------------------------------------------- Callouts No Yes Yes No No Attributes Yes No No Yes Yes Inline Macros Yes No No Yes Yes Quotes No No No Yes Yes Replacements No No No Yes Yes Special chars No Yes Yes Yes Yes Special words No No No Yes Yes ------------------------------------------------------------------- Listing Blocks ~~~~~~~~~~~~~~ ListingBlocks are rendered verbatim in a monospaced font, they retain line and whitespace formatting and often distinguished by a background or border. There is no text formatting or substitutions within Listing blocks apart from Special Characters and Callouts. Listing blocks are often used for code and file listings. Here's an example: -------------------------------------- #include <stdio.h> int main() { printf("Hello World!\n"); exit(0); } -------------------------------------- Which will be rendered like: -------------------------------------- #include <stdio.h> int main() { printf("Hello World!\n"); exit(0); } -------------------------------------- [[X65]] Literal Blocks ~~~~~~~~~~~~~~ LiteralBlocks behave just like LiteralParagraphs except you don't have to indent the contents. LiteralBlocks can be used to resolve list ambiguity. If the following list was just indented it would be processed as an ordered list (not an indented paragraph): --------------------------------------------------------------------- .................... 1. Item 1 2. Item 2 .................... --------------------------------------------------------------------- Renders: .................... 1. Item 1 2. Item 2 .................... SidebarBlocks ~~~~~~~~~~~~~ A sidebar is a short piece of text presented outside the narrative flow of the main text. The sidebar is normally presented inside a bordered box to set it apart from the main text. The sidebar body is treated like a normal section body. Here's an example: --------------------------------------------------------------------- .An Example Sidebar ************************************************ Any AsciiDoc SectionBody element (apart from SidebarBlocks) can be placed inside a sidebar. ************************************************ --------------------------------------------------------------------- Which will be rendered like: .An Example Sidebar ************************************************ Any AsciiDoc SectionBody element (apart from SidebarBlocks) can be placed inside a sidebar. ************************************************ [[X26]] Comment Blocks ~~~~~~~~~~~~~~ The contents of CommentBlocks are not processed; they are useful for annotations and for excluding new or outdated content that you don't want displayed. Here's and example: --------------------------------------------------------------------- ////////////////////////////////////////// CommentBlock contents are not processed by asciidoc(1). ////////////////////////////////////////// --------------------------------------------------------------------- See also <<X25,Comment Lines>>. Passthrough Blocks ~~~~~~~~~~~~~~~~~~ PassthroughBlocks are for backend specific markup, text is only subject to attribute and macro substitution. PassthroughBlock content will generally be backend specific. Here's an example: --------------------------------------------------------------------- ++++++++++++++++++++++++++++++++++++++ <table border="1"><tr> <td>Cell 1</td> <td>Cell 2</td> </tr></table> ++++++++++++++++++++++++++++++++++++++ --------------------------------------------------------------------- Quote Blocks ~~~~~~~~~~~~ QuoteBlocks are used for quoted passages of text. There are two styles: 'quote' and 'verse' (the first positional attribute). The 'attribution' and 'citetitle' attributes (positional attributes 2 and 3) specify the content author and source. If no attributes are specified the 'quote' style is used. The 'quote' style treats the content like a SectionBody, for example: --------------------------------------------------------------------- [quote, Bertrand Russell, The World of Mathematics (1956)] ____________________________________________________________________ A good notation has subtlety and suggestiveness which at times makes it almost seem like a live teacher. ____________________________________________________________________ --------------------------------------------------------------------- Which is rendered as: [quote, Bertrand Russell, The World of Mathematics (1956)] ____________________________________________________________________ A good notation has subtlety and suggestiveness which at times makes it almost seem like a live teacher. ____________________________________________________________________ The 'verse' style retains the content's line breaks, for example: --------------------------------------------------------------------- [verse, William Blake, from Auguries of Innocence] __________________________________________________ To see a world in a grain of sand, And a heaven in a wild flower, Hold infinity in the palm of your hand, And eternity in an hour. __________________________________________________ --------------------------------------------------------------------- Which is rendered as: [verse, William Blake, from Auguries of Innocence] __________________________________________________ To see a world in a grain of sand, And a heaven in a wild flower, Hold infinity in the palm of your hand, And eternity in an hour. __________________________________________________ [[X48]] Example Blocks ~~~~~~~~~~~~~~ ExampleBlocks encapsulate the DocBook Example element and are used for, well, examples. Example blocks can be titled by preceding them with a 'BlockTitle'. DocBook toolchains normally number examples and generate a 'List of Examples' backmatter section. Example blocks are delimited by lines of equals characters and you can put any block elements apart from Titles, BlockTitles and Sidebars) inside an example block. For example: --------------------------------------------------------------------- .An example ===================================================================== Qui in magna commodo, est labitur dolorum an. Est ne magna primis adolescens. ===================================================================== --------------------------------------------------------------------- Renders: .An example ===================================================================== Qui in magna commodo, est labitur dolorum an. Est ne magna primis adolescens. ===================================================================== The title prefix that is automatically inserted by asciidoc(1) can be customized with the `caption` attribute (`xhtml11` and `html4` backends). For example --------------------------------------------------------------------- [caption="Example 1: "] .An example with a custom caption ===================================================================== Qui in magna commodo, est labitur dolorum an. Est ne magna primis adolescens. ===================================================================== --------------------------------------------------------------------- [[X22]] Admonition Blocks ~~~~~~~~~~~~~~~~~ The ExampleBlock definition includes a set of admonition <<X23,styles>> (NOTE, TIP, IMPORTANT, WARNING, CAUTION) for generating admonition blocks (admonitions containing more than just a <<X28,simple paragraph>>). Just precede the ExampleBlock with an attribute list containing the admonition style name. For example: --------------------------------------------------------------------- [NOTE] .A NOTE block ===================================================================== Qui in magna commodo, est labitur dolorum an. Est ne magna primis adolescens. . Fusce euismod commodo velit. . Vivamus fringilla mi eu lacus. .. Fusce euismod commodo velit. .. Vivamus fringilla mi eu lacus. . Donec eget arcu bibendum nunc consequat lobortis. ===================================================================== --------------------------------------------------------------------- Renders: [NOTE] .A NOTE block ===================================================================== Qui in magna commodo, est labitur dolorum an. Est ne magna primis adolescens. . Fusce euismod commodo velit. . Vivamus fringilla mi eu lacus. .. Fusce euismod commodo velit. .. Vivamus fringilla mi eu lacus. . Donec eget arcu bibendum nunc consequat lobortis. ===================================================================== See also <<X47,Admonition Icons and Captions>>. [[X64]] Lists ----- .List types - Bulleted lists. Also known as itemized or unordered lists. - Numbered lists. Also called ordered lists. - Labeled lists. Sometimes called variable or definition lists. - Callout lists (a list of callout annotations). .List behavior - Indentation is optional and does not determine nesting, indentation does however make the source more readable. - A nested list must use a different syntax from its parent so that asciidoc(1) can distinguish the start of a nested list. - By default lists of the same type can only be nested two deep; this could be increased by defining new list definitions. - In addition to nested lists a list item will include immediately following Literal paragraphs. - Use <<X15, List Item Continuation>> to include other block elements in a list item. - The `listindex` <<X60,intrinsic attribute>> is the current list item index (1..). If this attribute is not inside a list then it's value is the number of items in the most recently closed list. Useful for displaying the number of items in a list. Bulleted and Numbered Lists ~~~~~~~~~~~~~~~~~~~~~~~~~~~ Bulleted list items start with a dash or an asterisk followed by a space or tab character. Bulleted list syntaxes are: ................... - List item. * List item. ................... Numbered list items start with an optional number or letter followed by a period followed by a space or tab character. List numbering is optional. Numbered list syntaxes are: ..................................................................... . Integer numbered list item. 1. Integer numbered list item with optional numbering. .. Lowercase letter numbered list item. a. Lowercase letter numbered list item with optional numbering. ..................................................................... Here are some examples: --------------------------------------------------------------------- - Lorem ipsum dolor sit amet, consectetuer adipiscing elit. * Fusce euismod commodo velit. * Qui in magna commodo, est labitur dolorum an. Est ne magna primis adolescens. Sit munere ponderum dignissim et. Minim luptatum et vel. * Vivamus fringilla mi eu lacus. * Donec eget arcu bibendum nunc consequat lobortis. - Nulla porttitor vulputate libero. . Fusce euismod commodo velit. . Vivamus fringilla mi eu lacus. .. Fusce euismod commodo velit. .. Vivamus fringilla mi eu lacus. . Donec eget arcu bibendum nunc consequat lobortis. - Praesent eget purus quis magna eleifend eleifend. 1. Fusce euismod commodo velit. a. Fusce euismod commodo velit. b. Vivamus fringilla mi eu lacus. c. Donec eget arcu bibendum nunc consequat lobortis. 2. Vivamus fringilla mi eu lacus. 3. Donec eget arcu bibendum nunc consequat lobortis. 4. Nam fermentum mattis ante. --------------------------------------------------------------------- Which render as: - Lorem ipsum dolor sit amet, consectetuer adipiscing elit. * Fusce euismod commodo velit. * Qui in magna commodo, est labitur dolorum an. Est ne magna primis adolescens. Sit munere ponderum dignissim et. Minim luptatum et vel. * Vivamus fringilla mi eu lacus. * Donec eget arcu bibendum nunc consequat lobortis. - Nulla porttitor vulputate libero. . Fusce euismod commodo velit. . Vivamus fringilla mi eu lacus. .. Fusce euismod commodo velit. .. Vivamus fringilla mi eu lacus. . Donec eget arcu bibendum nunc consequat lobortis. - Praesent eget purus quis magna eleifend eleifend. 1. Fusce euismod commodo velit. a. Fusce euismod commodo velit. b. Vivamus fringilla mi eu lacus. c. Donec eget arcu bibendum nunc consequat lobortis. 2. Vivamus fringilla mi eu lacus. 3. Donec eget arcu bibendum nunc consequat lobortis. 4. Nam fermentum mattis ante. Vertical Labeled Lists ~~~~~~~~~~~~~~~~~~~~~~ Labeled list items consist of one or more text labels followed the text of the list item. An item label begins a line with an alphanumeric character hard against the left margin and ends with a double colon `::` or semi-colon `;;`. The list item text consists of one or more lines of text starting on the line immediately following the label and can be followed by nested List or ListParagraph elements. Item text can be optionally indented. Here are some examples: --------------------------------------------------------------------- Lorem:: Fusce euismod commodo velit. Fusce euismod commodo velit. Ipsum:: Vivamus fringilla mi eu lacus. * Vivamus fringilla mi eu lacus. * Donec eget arcu bibendum nunc consequat lobortis. Dolor:: Donec eget arcu bibendum nunc consequat lobortis. Suspendisse;; A massa id sem aliquam auctor. Morbi;; Pretium nulla vel lorem. In;; Dictum mauris in urna. --------------------------------------------------------------------- Which render as: Lorem:: Fusce euismod commodo velit. Fusce euismod commodo velit. Ipsum:: Vivamus fringilla mi eu lacus. * Vivamus fringilla mi eu lacus. * Donec eget arcu bibendum nunc consequat lobortis. Dolor:: Donec eget arcu bibendum nunc consequat lobortis. Suspendisse;; A massa id sem aliquam auctor. Morbi;; Pretium nulla vel lorem. In;; Dictum mauris in urna. Horizontal Labeled Lists ~~~~~~~~~~~~~~~~~~~~~~~~ Horizontal labeled lists differ from vertical labeled lists in that the label and the list item sit side-by-side as opposed to the item under the label. Item text must begin on the same line as the label although you can begin item text on the next line if you follow the label with a backslash. The following horizontal list example also illustrates the omission of optional indentation: --------------------------------------------------------------------- *Lorem*:: Fusce euismod commodo velit. Qui in magna commodo, est labitur dolorum an. Est ne magna primis adolescens. Fusce euismod commodo velit. *Ipsum*:: Vivamus fringilla mi eu lacus. - Vivamus fringilla mi eu lacus. - Donec eget arcu bibendum nunc consequat lobortis. *Dolor*:: \ - Vivamus fringilla mi eu lacus. - Donec eget arcu bibendum nunc consequat lobortis. --------------------------------------------------------------------- Which render as: *Lorem*:: Fusce euismod commodo velit. Qui in magna commodo, est labitur dolorum an. Est ne magna primis adolescens. Fusce euismod commodo velit. *Ipsum*:: Vivamus fringilla mi eu lacus. - Vivamus fringilla mi eu lacus. - Donec eget arcu bibendum nunc consequat lobortis. *Dolor*:: \ - Vivamus fringilla mi eu lacus. - Donec eget arcu bibendum nunc consequat lobortis. [WARNING] ===================================================================== - Use vertical labeled lists in preference to horizontal labeled lists -- current PDF toolchains do not make a good job of determining the relative column widths. - If you are generating DocBook markup the horizontal labeled lists should not be nested because the 'DocBook XML V4.2' DTD does not permit nested informal tables (although <<X13,DocBook XSL Stylesheets>> process them correctly). ===================================================================== Question and Answer Lists ~~~~~~~~~~~~~~~~~~~~~~~~~ AsciiDoc comes pre-configured with a labeled list for generating DocBook question and answer (Q&A) lists (`??` label delimiter). Example: --------------------------------------------------------------------- Question one?? Answer one. Question two?? Answer two. --------------------------------------------------------------------- Renders: Question one?? Answer one. Question two?? Answer two. Glossary Lists ~~~~~~~~~~~~~~ AsciiDoc comes pre-configured with a labeled list (`:-` label delimiter) for generating DocBook glossary lists. Example: --------------------------------------------------------------------- A glossary term:- The corresponding definition. A second glossary term:- The corresponding definition. --------------------------------------------------------------------- For working examples see the `article.txt` and `book.txt` documents in the AsciiDoc `./doc` distribution directory. NOTE: To generate valid DocBook output glossary lists must be located in a glossary section. Bibliography Lists ~~~~~~~~~~~~~~~~~~ AsciiDoc comes with a predefined itemized list (`+` item bullet) for generating bibliography entries. Example: --------------------------------------------------------------------- + [[[taoup]]] Eric Steven Raymond. 'The Art of UNIX Programming'. Addison-Wesley. ISBN 0-13-142901-9. + [[[walsh-muellner]]] Norman Walsh & Leonard Muellner. 'DocBook - The Definitive Guide'. O'Reilly & Associates. 1999. ISBN 1-56592-580-7. --------------------------------------------------------------------- The `[[[<reference>]]]` syntax is a bibliography entry anchor, it generates an anchor named `<reference>` and additionally displays `[<reference>]` at the anchor position. For example `[\[[taoup]]]` generates an anchor named `taoup` that displays `[taoup]` at the anchor position. Cite the reference from elsewhere your document using `\<<taoup>>`, this displays a hyperlink (`[taoup]`) to the corresponding bibliography entry anchor. For working examples see the `article.txt` and `book.txt` documents in the AsciiDoc `./doc` distribution directory. NOTE: To generate valid DocBook output bibliography lists must be located in a bibliography section. [[X15]] List Item Continuation ~~~~~~~~~~~~~~~~~~~~~~ To include subsequent block elements in list items (in addition to implicitly included nested lists and Literal paragraphs) place a separator line containing a single plus character between the list item and the ensuing list continuation element. Multiple block elements (excluding section Titles and BlockTitles) may be included in a list item using this technique. For example: Here's an example of list item continuation: --------------------------------------------------------------------- 1. List item one. + List item one continued with a second paragraph followed by an Indented block. + ................. $ ls *.sh $ mv *.sh ~/tmp ................. + List item one continued with a third paragraph. 2. List item two. List item two literal paragraph (no continuation required). - Nested list (item one). Nested list literal paragraph (no continuation required). + Nested list appended list item one paragraph - Nested list item two. --------------------------------------------------------------------- Renders: 1. List item one. + List item one continued with a second paragraph followed by a Listing block. + ................. $ ls *.sh $ mv *.sh ~/tmp ................. + List item one continued with a third paragraph. 2. List item two. List item two literal paragraph (no continuation required). - Nested list (item one). Nested list literal paragraph (no continuation required). + Nested list appended list item one paragraph - Nested list item two. [[X29]] List Block ~~~~~~~~~~ A List block is a special delimited block containing a list element. - All elements between in the List Block are part of the preceding list item. In this respect the List block behaves like <<X15,List Item Continuation>> except that list items contained within the block do not require explicit `+` list item continuation lines: - The block delimiter is a single line containing two dashes. - Any block title or attributes are passed to the first element inside the block. The List Block is useful for: 1. Lists with long multi-element list items. 2. Nesting a list within a parent list item (by default nested lists follow the preceding list item). Here's an example of a nested list block: --------------------------------------------------------------------- .Nested List Block 1. List item one. + This paragraph is part of the preceding list item + -- a. This list is nested and does not require explicit item continuation. This paragraph is part of the preceding list item b. List item b. This paragraph belongs to list item b. -- + This paragraph belongs to item 1. 2. Item 2 of the outer list. --------------------------------------------------------------------- Renders: .Nested List Block 1. List item one. + This paragraph is part of the preceding list item + -- a. This list is nested and does not require explicit item continuation. This paragraph is part of the preceding list item b. List item b. This paragraph belongs to list item b. -- + This paragraph belongs to item 1. 2. Item 2 of the outer list. Footnotes --------- The shipped AsciiDoc configuration includes the `\footnote:[<text>]` inline macro for generating footnotes. The footnote text can span multiple lines. Example footnote: A footnote footnote:[An example footnote.] Which renders: A footnote footnote:[An example footnote.] Footnotes are primarily useful when generating DocBook output -- DocBook conversion programs render footnote outside the primary text flow. Indexes ------- The shipped AsciiDoc configuration includes the inline macros for generating document index entries. `\indexterm:[<primary>,<secondary>,<tertiary>]`:: `\(((<primary>,<secondary>,<tertiary>)))`:: This inline macro generates an index term (the <secondary> and <tertiary> attributes are optional). For example `\indexterm:[Tigers,Big cats]` (or, using the alternative syntax `\(((Tigers,Big cats)))`. Index terms that have secondary and tertiary entries also generate separate index terms for the secondary and tertiary entries. The index terms appear in the index, not the primary text flow. `\indexterm2:[<primary>]`:: `\((<primary>))`:: This inline macro generates an index term that appears in both the index and the primary text flow. The `<primary>` should not be padded to the left or right with white space characters. For working examples see the `article.txt` and `book.txt` documents in the AsciiDoc `./doc` distribution directory. NOTE: Index entries only really make sense if you are generating DocBook markup -- DocBook conversion programs automatically generate an index at the point an 'Index' section appears in source document. Callouts -------- Callouts are a mechanism for annotating verbatim text (source code, computer output and user input for example). Callout markers are placed inside the annotated text while the actual annotations are presented in a callout list after the annotated text. Here's an example: --------------------------------------------------------------------- .MS-DOS directory listing ..................................................... 10/17/97 9:04 <DIR> bin 10/16/97 14:11 <DIR> DOS \<1> 10/16/97 14:40 <DIR> Program Files 10/16/97 14:46 <DIR> TEMP 10/17/97 9:04 <DIR> tmp 10/16/97 14:37 <DIR> WINNT 10/16/97 14:25 119 AUTOEXEC.BAT \<2> 2/13/94 6:21 54,619 COMMAND.COM \<2> 10/16/97 14:25 115 CONFIG.SYS \<2> 11/16/97 17:17 61,865,984 pagefile.sys 2/13/94 6:21 9,349 WINA20.386 \<3> ..................................................... \<1> This directory holds MS-DOS. \<2> System startup code for DOS. \<3> Some sort of Windows 3.1 hack. --------------------------------------------------------------------- Which renders: .MS-DOS directory listing ..................................................................... 10/17/97 9:04 <DIR> bin 10/16/97 14:11 <DIR> DOS <1> 10/16/97 14:40 <DIR> Program Files 10/16/97 14:46 <DIR> TEMP 10/17/97 9:04 <DIR> tmp 10/16/97 14:37 <DIR> WINNT 10/16/97 14:25 119 AUTOEXEC.BAT <2> 2/13/94 6:21 54,619 COMMAND.COM <2> 10/16/97 14:25 115 CONFIG.SYS <2> 11/16/97 17:17 61,865,984 pagefile.sys 2/13/94 6:21 9,349 WINA20.386 <3> ..................................................................... <1> This directory holds MS-DOS. <2> System startup code for DOS. <3> Some sort of Windows 3.1 hack. .Explanation - The callout marks are whole numbers enclosed in angle brackets that refer to an item index in the following callout list. - By default callout marks are confined to LiteralParagraphs, LiteralBlocks and ListingBlocks (although this is a configuration file option and can be changed). - Callout list item numbering is fairly relaxed -- list items can start with `<n>`, `n>` or `>` where `n` is the optional list item number (in the latter case list items starting with a single `>` character are implicitly numbered starting at one). - Callout lists should not be nested -- start list items hard against the left margin. - If you want to present a number inside angle brackets you'll need to escape it with a backslash to prevent it being interpreted as a callout mark. NOTE: To include callout icons in PDF files generated by <<X43,a2x(1)>> you need to use the `--icons` command-line option. Implementation Notes ~~~~~~~~~~~~~~~~~~~~ Callout marks are generated by the 'callout' inline macro while callout lists are generated using the 'callout' list definition. The 'callout' macro and 'callout' list are special in that they work together. The 'callout' inline macro is not enabled by the normal 'macros' substitutions option, instead it has its own 'callouts' substitution option. The following attributes are available during inline callout macro substitution: `\{index}`:: The callout list item index inside the angle brackets. `\{coid}`:: An identifier formatted like `CO<listnumber>-<index>` that uniquely identifies the callout mark. For example `CO2-4` identifies the fourth callout mark in the second set of callout marks. The `\{coids}` attribute can be used during callout list item substitution -- it is a space delimited list of callout IDs that refer to the explanatory list item. Including callouts in included code ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You can annotate working code examples with callouts -- just remember to put the callouts inside source code comments. This example displays the `test.py` source file (containing a single callout) using the <<X57,Source Code Highlighter Filter>>: .AsciiDoc source --------------------------------------------------------------------- [source,python] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ include::test.py[] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ \<1> Print statement. --------------------------------------------------------------------- .Included `test.py` source --------------------------------------------------------------------- print 'Hello World!' # \<1> --------------------------------------------------------------------- Macros ------ Macros are a mechanism for substituting parametrized text into output documents. Macros have a 'name', a single 'target' argument and an 'attribute list'. The default syntax is `<name>:<target>[<attributelist>]` (for inline macros) and `<name>::<target>[<attributelist>]` (for block macros). Here are some examples: http://www.methods.co.nz/asciidoc/index.html[Asciidoc home page] include::chapt1.txt[tabsize=2] mailto:srackham@gmail.com[] .Macro behavior - `<name>` is the macro name. It can only contain letters, digits or dash characters and cannot start with a dash. - The optional `<target>` cannot contain white space characters. - `<attributelist>` is a <<X21,list of attributes>> enclosed in square brackets. - The attribute list is mandatory except for URLs and email addresses. - Expansion of non-system macro references can be escaped by prefixing a backslash character. - Block macro attribute reference substitution is performed prior to macro expansion. - The substitutions performed prior to Inline macro macro expansion are determined by the inline context. - Macros are processed in the order they appear in the configuration file(s). - Calls to inline macros can be nested inside different inline macros (an inline macro call cannot contain a nested call to itself). Inline Macros ~~~~~~~~~~~~~ Inline Macros occur in an inline element context. Predefined Inline macros include 'URLs', 'image' and 'link' macros. URLs ^^^^ 'http', 'https', 'ftp', 'file', 'mailto' and 'callto' URLs are rendered using predefined inline macros. - If you don't need a customized the link caption you can enter the 'http', 'https', 'ftp', 'file' URLs and email addresses without any special macro syntax. - If no caption text is specified the URL is displayed. Here are some examples: http://www.methods.co.nz/asciidoc/[The AsciiDoc home page] http://www.methods.co.nz/asciidoc/ mailto:joe.bloggs@foobar.com[email Joe Bloggs] joe.bloggs@foobar.com callto:joe.bloggs[] Which are rendered: http://www.methods.co.nz/asciidoc/[The AsciiDoc home page] http://www.methods.co.nz/asciidoc/ mailto:joe.bloggs@foobar.com[email Joe Bloggs] joe.bloggs@foobar.com callto:joe.bloggs[] - If the `<target>` necessitates space characters they should be replaced by `%20`. For example `large%20image.png`. - Define an attribute entry if you refer to the same URL more than once, this will make your document <<X62,easier to maintain and easier to read>>. Internal Cross References ^^^^^^^^^^^^^^^^^^^^^^^^^ Two AsciiDoc inline macros are provided for creating hypertext links within an AsciiDoc document. You can use either the standard macro syntax or the (preferred) alternative. [[X30]] anchor ++++++ Used to specify hypertext link targets: [[<id>,<xreflabel>]] anchor:<id>[<xreflabel>] The `<id>` is a unique identifier that must begin with a letter. The optional `<xreflabel>` is the text to be displayed by captionless 'xref' macros that refer to this anchor. The optional `<xreflabel>` is only really useful when generating DocBook output. Example anchor: [[X1]] You may have noticed that the syntax of this inline element is the same as that of the <<X41,BlockId block element>>, this is no coincidence since they are functionally equivalent. xref ++++ Creates a hypertext link to a document anchor. <<<id>,<caption>>> xref:<id>[<caption>] The `<id>` refers to an existing anchor `<id>`. The optional `<caption>` is the link's displayed text. Example: <<X21,attribute lists>> If `<caption>` is not specified then the displayed text is auto-generated: - The AsciiDoc `xhtml11` backend displays the `<id>` enclosed in square brackets. - If DocBook is produced the DocBook toolchain is responsible for the displayed text which will normally be the referenced figure, table or section title number followed by the element's title text. Here is an example: --------------------------------------------------------------------- [[tiger_image]] .Tyger tyger image::tiger.png[] This can be seen in <<tiger_image>>. --------------------------------------------------------------------- Linking to Local Documents ^^^^^^^^^^^^^^^^^^^^^^^^^^ Hypertext links to files on the local file system are specified using the 'link' inline macro. link:<target>[<caption>] The 'link' macro generates relative URLs. The link macro `<target>` is the target file name (relative to the file system location of the referring document). The optional `<caption>` is the link's displayed text. If `<caption>` is not specified then `<target>` is displayed. Example: link:downloads/foo.zip[download foo.zip] You can use the `<filename>#<id>` syntax to refer to an anchor within a target document but this usually only makes sense when targeting HTML documents. Images can serve as hyperlinks using the <<X9,`image` macro>>. [[X9]] Images ^^^^^^ Inline images are inserted into the output document using the 'image' macro. The inline syntax is: image:<target>[<attributes>] The contents of the image file `<target>` is displayed. To display the image its file format must be supported by the target backend application. HTML and DocBook applications normally support PNG or JPG files. `<target>` file name paths are relative to the location of the referring document. [[X55]] .Image macro attributes - The optional first positional attribute list entry specifies the alternative text which is displayed if the output application is unable to process the image file. For example: image:images/logo.png[Company Logo] - The optional `width` and `height` attributes scale the image size and can be used in any combination. The units are pixels. The following example scales the previous example to a height of 32 pixels: image:images/logo.png["Company Logo",height=32] - The optional `link` attribute is used to link the image to an external document. The following example links a screenshot thumbnail to a full size version: image:screen-thumbnail.png[height=32,link="screen.png"] - The optional `scaledwidth` attribute is only used in DocBook block images (specifically for PDF documents). The following example scales the images to 75% of the available print width: image::images/logo.png["Company Logo",scaledwidth="75%"] - The optional `align` attribute is used for horizontal image alignment in DocBook block images (specifically for PDF documents). Allowed values are `center`, `left` and `right`. For example: image::images/tiger.png["Tiger image",align="left"] Block Macros ~~~~~~~~~~~~ A Block macro reference must be contained in a single line separated either side by a blank line or a block delimiter. Block macros behave just like Inline macros, with the following differences: - They occur in a block context. - The default syntax is `<name>::<target>[<attributelist>]` (two colons, not one). - Markup template section names end in `-blockmacro` instead of `-inlinemacro`. Block Identifier ^^^^^^^^^^^^^^^^ The Block Identifier macro sets the `id` attribute and has the same syntax as the <<X30,anchor inline macro>> since it performs essentially the same function -- block templates employ the `id` attribute as a block link target. For example: [[X30]] This is equivalent to the `[id="X30"]` block attribute list. [[X49]] Images ^^^^^^ Formal titled images are inserted into the output document using the 'image' macro. The syntax is: image::<target>[<attributes>] The block `image` macro has the same <<X55,macro attributes>> as its <<X9,inline counterpart>>. Images can be titled by preceding the `image` macro with a 'BlockTitle'. DocBook toolchains normally number examples and generate a 'List of Figures' backmatter section. For example: .Main circuit board image::images/layout.png[J14P main circuit board] `xhtml11` and `html4` backends precede the title with a `Figure :` prefix. You can customize this prefix with the `caption` attribute. For example: .Main circuit board [caption="Figure 2:"] image::images/layout.png[J14P main circuit board] [[X66]] .Embedding images in XHTML documents ********************************************************************* If you define the `data-uri` attribute then images referenced by 'image' macros will be embedded in XHTML outputs using the http://en.wikipedia.org/wiki/Data:_URI_scheme[data: URI scheme]. You can use the `data-uri` attribute to produce single-file XHTML documents with embedded images and CSS, for example: $ asciidoc --unsafe -a data-uri mydocument.txt You will need to specify the `--unsafe` option because the AsciiDoc `data-uri` is implemented using the `\{sys}` attribute. NOTE: Internet Explorer up to version 7 does not support 'data: URIs', but it is supported by Internet Explorer 8 Beta 1. ********************************************************************* [[X25]] Comment Lines ^^^^^^^^^^^^^ Single lines starting with two forward slashes hard up against the left margin are treated as comments and are stripped from the output. Comment lines have been implemented as a block macro and are only valid in a block context -- they are not treated as comments inside paragraphs or delimited blocks. Example comment line: // This is a comment. See also <<X26,Comment Blocks>>. System Macros ~~~~~~~~~~~~~ System macros are block macros that perform a predefined task which is hardwired into the asciidoc(1) program. - You can't escape system macros with a leading backslash character (as you can with other macros). - The syntax and tasks performed by system macros is built into asciidoc(1) so they don't appear in configuration files. You can however customize the syntax by adding entries to a configuration file `[macros]` section. [[X63]] Include Macros ^^^^^^^^^^^^^^ The `include` and `include1` system macros to include the contents of a named file into the source document. The `include` macro includes a file as if it were part of the parent document -- tabs are expanded and system macros processed. The contents of `include1` files are not subject to tab expansion or system macro processing nor are attribute or lower priority substitutions performed. The `include1` macro's main use is to include verbatim embedded CSS or scripts into configuration file headers. Example: ------------------------------------ include::chapter1.txt[tabsize=4] ------------------------------------ .Include macro behavior - If the included file name is specified with a relative path then the path is relative to the location of the referring document. - Include macros can appear inside configuration files. - Files included from within `DelimitedBlocks` are read to completion to avoid false end-of-block underline termination. - File inclusion is limited to a depth of 5 to catch recursive loops. - Attribute references are expanded inside the include `target`; if an attribute is undefined then the included file is silently skipped. - The 'tabsize' macro attribute sets the number of space characters to be used for tab expansion in the included file. - Internally the `include1` macro is translated to the `include1` system attribute which means it must be evaluated in a region where attribute substitution is enabled -- use the `include` macro instead. Conditional Inclusion Macros ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Lines of text in the source document can be selectively included or excluded from processing based on the existence (or not) of a document attribute. There are two forms of conditional inclusion macro usage, the first includes document text between the `ifdef` and `endif` macros if a document attribute is defined: ifdef::<attribute>[] : endif::<attribute>[] The second for includes document text between the `ifndef` and `endif` macros if the attribute is not defined: ifndef::<attribute>[] : endif::<attribute>[] `<attribute>` is an attribute name which is optional in the trailing `endif` macro. Take a look at the `*.conf` configuration files in the AsciiDoc distribution for examples of conditional inclusion macro usage. .Two types of conditional inclusion ********************************************************************* Conditional inclusion macros are evaluated when they are read, but there is another type of conditional inclusion based on attribute references, the latter being evaluated when the output file is written. These examples illustrate the two forms of conditional inclusion. The only difference between them is that the first is evaluated at program load time while the second is evaluated when the output is written: ifdef::world[] Hello World! endif::world[] {world#}Hello World! In this example when the `\{world#}` conditional attribute reference is evaluates to a zero length string if `world` is defined; if `world` is not defined the whole line is dropped. The subtle difference between the two types of conditional inclusion has implications for AsciiDoc configuration files: AsciiDoc has to read the configuration files *before* reading the source document, this is necessary because the AsciiDoc source syntax is mostly defined by the configuration files. This means that any lines of markup enveloped by conditional inclusion macros will be included or excluded *before* the attribute entries in the AsciiDoc document header are read, so setting related attributes in the AsciiDoc source document header will have no effect. If you need to control configuration file markup inclusion with attribute entries in the AsciiDoc source file header you need to use attribute references to control inclusion instead of conditional inclusion macros (attribute references are substituted at the time the output is written rather than at program startup). ********************************************************************* eval, sys and sys2 System Macros ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ These block macros exhibit the same behavior as their same named <<X24, system attribute references>>. The difference is that system macros occur in a block macro context whereas system attributes are confined to an inline context where attribute substitution is enabled. The following example displays a long directory listing inside a literal block: ------------------ sys::[ls -l *.txt] ------------------ Template System Macro ^^^^^^^^^^^^^^^^^^^^^ The `template` block macro allows the inclusion of one configuration file template section within another. The following example includes the `[admonitionblock]` section in the `[admonitionparagraph]` section: [admonitionparagraph] template::[admonitionblock] .Template macro behavior - The `\template::[]` macro is useful for factoring configuration file markup. - `\template::[]` macros cannot be nested. - `\template::[]` macro expansion is applied to all sections after all configuration files have been read. Macro Definitions ~~~~~~~~~~~~~~~~~ Each entry in the configuration `[macros]` section is a macro definition which can take one of the following forms: `<pattern>=<name>`:: Inline macro definition. `<pattern>=#<name>`:: Block macro definition. `<pattern>=+<name>`:: System macro definition. `<pattern>`:: Delete the existing macro with this `<pattern>`. `<pattern>` is a Python regular expression and `<name>` is the name of a markup template. If `<name>` is omitted then it is the value of the regular expression match group named 'name'. .Here's what happens during macro substitution - Each contextually relevant macro 'pattern' from the `[macros]` section is matched against the input source line. - If a match is found the text to be substituted is loaded from a configuration markup template section named like `<name>-inlinemacro` or `<name>-blockmacro` (depending on the macro type). - Global and macro attribute list attributes are substituted in the macro's markup template. - The substituted template replaces the macro reference in the output document. Tables ------ Tables are the most complex AsciiDoc elements and this section is quite long. footnote:[The current table syntax is overly complicated and unwieldy to edit, hopefully a more usable syntax will appear in future versions of AsciiDoc.] NOTE: AsciiDoc generates nice HTML tables, but the current crop of DocBook toolchains render tables with varying degrees of success. Use tables only when really necessary. Example Tables ~~~~~~~~~~~~~~ The following annotated examples are all you'll need to start creating your own tables. The only non-obvious thing you'll need to remember are the column stop characters: - Backtick (`) -- align left. - Single quote (') -- align right. - Period (.) -- align center. Simple table: --------------------------------------------------------------------- `---`--- 1 2 3 4 5 6 -------- --------------------------------------------------------------------- Output: `---`--- 1 2 3 4 5 6 -------- Table with title, header and footer: --------------------------------------------------------------------- .An example table [grid="all"] '---------.-------------- Column 1 Column 2 ------------------------- 1 Item 1 2 Item 2 3 Item 3 ------------------------- 6 Three items ------------------------- --------------------------------------------------------------------- Output: .An example table [grid="all"] `-----------.-------------- Column 1 Column 2 --------------------------- 1 Item 1 2 Item 2 3 Item 3 --------------------------- 6 Three items --------------------------- Four columns totaling 15% of the 'pagewidth', CSV data: --------------------------------------------------------------------- [frame="all"] ````~15 1,2,3,4 a,b,c,d A,B,C,D ~~~~~~~~ --------------------------------------------------------------------- Output: [frame="all"] ````~15 1,2,3,4 a,b,c,d A,B,C,D ~~~~~~~~ A table with a numeric ruler and externally sourced CSV data: --------------------------------------------------------------------- [frame="all", grid="all"] .15`20`25`20`~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ID,Customer Name,Contact Name,Customer Address,Phone ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ include::customers.csv[] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --------------------------------------------------------------------- Renders: [frame="all", grid="all"] .15`20`25`20`~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ID,Customer Name,Contact Name,Customer Address,Phone ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ include::customers.csv[] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ AsciiDoc Table Block Elements ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sub-section details the AsciiDoc table format. Table ::= (Ruler,Header?,Body,Footer?) Header ::= (Row+,Underline) Footer ::= (Row+,Underline) Body ::= (Row+,Underline) Row ::= (Data+) A table is terminated when the table underline is followed by a blank line or an end of file. Table underlines which separate table headers, bodies and footers should not be followed by a blank line. Ruler ^^^^^ The first line of the table is called the 'Ruler'. The Ruler specifies which configuration file table definition to use, column widths, column alignments and the overall table width. There are two ruler formats: Character ruler:: The column widths are determined by the number of table fill characters between column stop characters. Numeric ruler:: The column widths are specified numerically. If a column width is omitted the previous width is used. In the degenerate case of no widths being specified columns are allocated equal widths. The ruler format can be summarized as: ruler ::= ((colstop,colwidth?,fillchar*)+, fillchar+, tablewidth? - The 'ruler' starts with a column stop character (designating the start of the first column). - Column stop characters specify the start and alignment of each column: * Backtick (`) -- align left. * Single quote (') -- align right. * Period (.) -- align center. - In the case of 'fixed' format tables the ruler column widths specify source row data column boundaries. - The optional 'tablewidth' is a number representing the size of the output table relative to the 'pagewidth'. If 'tablewidth' is less than one then it is interpreted as a fraction of the page width; if it is greater than one then it is interpreted as a percentage of the page width. If 'tablewidth' is not specified then the table occupies the full 'pagewidth' (numeric rulers) or the relative width of the ruler compared to the 'textwidth' (character rulers). Row and Data Elements ^^^^^^^^^^^^^^^^^^^^^ Each table row consists of a line of text containing the same number of 'Data' items as there are columns in the table, Lines ending in a backslash character are continued on the next line. Each 'Data' item is an AsciiDoc substitutable string. The substitutions performed are specified by the 'subs' table definition entry. Data cannot contain AsciiDoc block elements. The format of the row is determined by the table definition 'format' value: fixed:: Row data items are assigned by chopping the row up at ruler column width boundaries. csv:: Data items are assigned the parsed CSV (Comma Separated Values) data. dsv:: The DSV (Delimiter Separated Values) format is a common UNIX tabular text file format. - The separator character is a colon (although this can be set to any letter using the 'separator' table attribute). - Common C-style backslash escapes are supported. - Blank lines are skipped. Underline ^^^^^^^^^ A table 'Underline' consists of a line of three or more 'fillchar' characters which are end delimiters for table header, footer and body sections. Attribute List ^^^^^^^^^^^^^^ The following optional table attributes can be specified in an <<X21,AttributeList>> preceding the table: separator:: The default DSV format colon separator can be changed using the 'separator' attribute. For example: `[separator="|"]`. frame:: Defines the table border and can take the following values: 'topbot' (top and bottom), 'all' (all sides), 'none' and 'sides' (left and right sides). The default value is 'topbot'. grid:: Defines which ruler lines are drawn between table rows and columns. The 'grid' attribute value can be any of the following values: 'none', 'cols', 'rows' and 'all'. The default value is 'none'. For example `[frame="all", grid="none"]`. format, tablewidth:: See <<X37,Markup Attributes>> below. You can also use an AttributeList to override the following table definition and ruler parameters: 'format', 'subs', 'tablewidth'. [[X37]] Markup Attributes ^^^^^^^^^^^^^^^^^ The following attributes are automatically available inside table tag and markup templates. cols:: The number of columns in the table. colalign:: Column alignment assumes one of three values ('left', 'right' or 'center'). The value is determined by the corresponding ruler column stop character (only valid inside 'colspec', 'headdata', 'bodydata' and 'footdata' tags). colwidth:: The output column widths are calculated integers (only valid inside 'colspec', 'headdata', 'bodydata' and 'footdata' tags). colnumber:: The table column number starting at 1 (only valid inside 'colspec', 'headdata`, `bodydata` and `footdata` tags). format:: The table definition 'format' value (can be overridden with attribute list entry). tablewidth:: The ruler 'tablewidth' value (can be overridden with attribute list entry). pagewidth:: The 'pagewidth' miscellaneous configuration option. pageunits:: The 'pageunits' miscellaneous configuration option. The 'colwidth' value is calculated as (`N` is the ruler column width number and `M` is the sum of the ruler column widths): ( N / M ) * pagewidth If the ruler 'tablewidth' was specified the column width is multiplied again by this value. There is one exception: character rulers that have no 'pagewidth' specified. In this case the 'colwidth' value is calculated as (where `N` is the column character width measured on the table ruler): ( N / textwidth ) * pagewidth The following attributes are available to the table markup template: comspecs:: Expands to N substituted 'comspec' tags where N is the number of columns. headrows, footrows, bodyrows:: These references expand to sets of substituted header, footer and body rows as defined by the corresponding row and data configuration parameters. rows:: Experimental attribute (number of source lines in table) available in table markup templates (used by experimental LaTeX backend). [[X1]] Manpage Documents ----------------- Sooner or later, if you program for a UNIX environment, you're going to have to write a man page. By observing a couple of additional conventions you can compose AsciiDoc files that will translate to a DocBook refentry (man page) document. The resulting DocBook file can then be translated to the native roff man page format (or other formats). For example, the `asciidoc.1.txt` file in the AsciiDoc distribution `./doc` directory was used to generate both the `asciidoc.1.css-embedded.html` HTML file the `asciidoc.1` roff formatted `asciidoc(1)` man page. .Viewing and printing manpage files ********************************************************************** Use the `man(1)` command to view the manpage file: $ man -l asciidoc.1 To print a high quality man page to a postscript printer: $ man -l -Tps asciidoc.1 | lpr You could also create a PDF version of the man page by converting PostScript to PDF using `ps2pdf(1)`: $ man -l -Tps asciidoc.1 | ps2pdf - asciidoc.1.pdf The `ps2pdf(1)` command is included in the Ghostscript distribution. ********************************************************************** To find out more about man pages view the `man(7)` manpage (`man 7 man` and `man man-pages` commands). Document Header ~~~~~~~~~~~~~~~ A document Header is mandatory. The title line contains the man page name followed immediately by the manual section number in brackets, for example 'ASCIIDOC(1)'. The title name should not contain white space and the manual section number is a single digit optionally followed by a single character. The NAME Section ~~~~~~~~~~~~~~~~ The first manpage section is mandatory, must be titled 'NAME' and must contain a single paragraph (usually a single line) consisting of a list of one or more comma separated command name(s) separated from the command purpose by a dash character. The dash must have at least one white space character on either side. For example: printf, fprintf, sprintf - print formatted output The SYNOPSIS Section ~~~~~~~~~~~~~~~~~~~~ The second manpage section is mandatory and must be titled 'SYNOPSIS'. refmiscinfo attributes ~~~~~~~~~~~~~~~~~~~~~~ In addition to the automatically created man page <<X60,intrinsic attributes>> you can assign DocBook http://www.docbook.org/tdg5/en/html/refmiscinfo.html[refmiscinfo] element 'source', 'version' and 'manual' values using AsciiDoc `\{mansource}`, `\{manversion}` and `\{manmanual}` attributes respectively. This example is from the AsciiDoc header of a man page source file: :man source: AsciiDoc :man version: {revision} :man manual: AsciiDoc Manual [[X7]] Configuration Files ------------------- AsciiDoc source file syntax and output file markup is largely controlled by a set of cascading, text based, configuration files. At runtime The AsciiDoc default configuration files are combined with optional user and document specific configuration files. Configuration File Format ~~~~~~~~~~~~~~~~~~~~~~~~~ Configuration files contain named sections. Each section begins with a section name in square brackets []. The section body consists of the lines of text between adjacent section headings. - Section names consist of one or more alphanumeric, underscore or dash characters and cannot begin or end with a dash. - Lines starting with a hash character "#" are treated as comments and ignored. - Same named sections and section entries override previously loaded sections and section entries (this is sometimes referred to as 'cascading'). Consequently, downstream configuration files need only contain those sections and section entries that need to be overridden. TIP: When creating custom configuration files you only need to include the sections and entries that differ from the default configuration. TIP: The best way to learn about configuration files is to read the default configuration files in the AsciiDoc distribution in conjunction with asciidoc(1) output files. You can view configuration file load sequence by turning on the asciidoc(1) `-v` (`--verbose`) command-line option. Markup Template Sections ~~~~~~~~~~~~~~~~~~~~~~~~ Markup template sections supply backend markup for translating AsciiDoc elements. Since the text is normally backend dependent you'll find these sections in the backend specific configuration files. A markup template section body can contain: - Backend markup - Attribute references - System macro calls. - A document content placeholder The document content placeholder is a single | character and is replaced by text from the source element. Use the `\{brvbar}` attribute reference if you need a literal | character in the template. Special Sections ~~~~~~~~~~~~~~~~ AsciiDoc reserves the following predefined special section names for specific purposes: miscellaneous:: Configuration options that don't belong anywhere else. attributes:: Attribute name/value entries. specialcharacters:: Special characters reserved by the backend markup. tags:: Backend markup tags. quotes:: Definitions for quoted inline character formatting. specialwords:: Lists of words and phrases singled out for special markup. replacements, replacements2:: Find and replace substitution definitions. specialsections:: Used to single out special section names for specific markup. macros:: Macro syntax definitions. titles:: Heading, section and block title definitions. paradef*:: Paragraph element definitions. blockdef*:: DelimitedBlock element definitions. listdef*:: List element definitions. tabledef*:: Table element definitions. Each line of text in a special section is a 'section entry'. Section entries share the following syntax: 'name=value':: The entry value is set to 'value'. 'name=':: The entry value is set to a zero length string. 'name':: The entry is undefined (deleted from the configuration). .Section entry behavior - All equals characters inside the `name` must be escaped with a backslash character. - `name` and `value` are stripped of leading and trailing white space. - Attribute names, tag entry names and markup template section names consist of one or more alphanumeric, underscore or dash characters. Names should not begin or end with a dash. - A blank configuration file section (one without any entries) deletes any preceding section with the same name (applies to non-markup template sections). Miscellaneous ^^^^^^^^^^^^^ The optional `[miscellaneous]` section specifies the following `name=value` options: newline:: Output file line termination characters. Can include any valid Python string escape sequences. The default value is `\r\n` (carriage return, line feed). Should not be quoted or contain explicit spaces (use `\x20` instead). For example: $ asciidoc -a 'newline=\n' -b docbook mydoc.txt outfilesuffix:: The default extension for the output file, for example `outfilesuffix=.html`. Defaults to backend name. tabsize:: The number of spaces to expand tab characters, for example `tabsize=4`. Defaults to 8. A 'tabsize' of zero suppresses tab expansion (useful when piping included files through block filters). Included files can override this option using the 'tabsize' attribute. textwidth, pagewidth, pageunits:: These global table related options are documented in the <<X4,Table Configuration File Definitions>> sub-section. NOTE: `[miscellaneous]` configuration file entries can be set using the asciidoc(1) `-a` (`--attribute`) command-line option. Titles ^^^^^^ sectiontitle:: Two line section title pattern. The entry value is a Python regular expression containing the named group 'title'. underlines:: A comma separated list of document and section title underline character pairs starting with the section level 0 and ending with section level 4 underline. The default setting is: underlines="==","--","~~","^^","++" sect0...sect4:: One line section title patterns. The entry value is a Python regular expression containing the named group 'title'. blocktitle:: <<X42,BlockTitle element>> pattern. The entry value is a Python regular expression containing the named group 'title'. subs:: A comma separated list of substitutions that are performed on the document header and section titles. Defaults to 'normal' substitution. Tags ^^^^ The `[tags]` section contains backend tag definitions (one per line). Tags are used to translate AsciiDoc elements to backend markup. An AsciiDoc tag definition is formatted like `<tagname>=<starttag>|<endtag>`. For example: emphasis=<em>|</em> In this example asciidoc(1) replaces the | character with the emphasized text from the AsciiDoc input file and writes the result to the output file. Use the `\{brvbar}` attribute reference if you need to include a | pipe character inside tag text. Attributes Section ^^^^^^^^^^^^^^^^^^ The optional `[attributes]` section contains predefined attributes. If the attribute value requires leading or trailing spaces then the text text should be enclosed in double-quote (") characters. To delete a attribute insert a name only entry in a downstream configuration file or use the asciidoc(1) `--attribute name!` command-line option (the attribute name is suffixed with a ! character to delete it). Special Characters ^^^^^^^^^^^^^^^^^^ The `[specialcharacters]` section specifies how to escape characters reserved by the backend markup. Each translation is specified on a single line formatted like: special_character=translated_characters Special characters are normally confined to those that resolve markup ambiguity (in the case of SGML/XML markups the ampersand, less than and greater than characters). The following example causes all occurrences of the `<` character to be replaced by `<`. <=< Quoted Text ^^^^^^^^^^^ Quoting is used primarily for text formatting. The `[quotes]` section defines AsciiDoc quoting characters and their corresponding backend markup tags. Each section entry value is the name of a of a `[tags]` section entry. The entry name is the character (or characters) that quote the text. The following examples are taken from AsciiDoc configuration files: [quotes] _=emphasis [tags] emphasis=<em>|</em> You can specify the left and right quote strings separately by separating them with a | character, for example: ``|''=quoted Omitting the tag will disable quoting, for example, if you don't want superscripts or subscripts put the following in a custom configuration file or edit the global `asciidoc.conf` configuration file: [quotes] ^= ~= <<X52,Unconstrained quotes>> are differentiated by prefixing the tag name with a hash character, for example: __=#emphasis .Quoted text behavior - Quote characters must be non-alphanumeric. - To minimize quoting ambiguity try not to use the same quote characters in different quote types. Special Words ^^^^^^^^^^^^^ The `[specialwords]` section is used to single out words and phrases that you want to consistently format in some way throughout your document without having to repeatedly specify the markup. The name of each entry corresponds to a markup template section and the entry value consists of a list of words and phrases to be marked up. For example: [specialwords] strongwords=NOTE: IMPORTANT: [strongwords] <strong>{words}</strong> The examples specifies that any occurrence of `NOTE:` or `IMPORTANT:` should appear in a bold font. Words and word phrases are treated as Python regular expressions: for example, the word `^NOTE:` would only match `NOTE:` if appeared at the start of a line. AsciiDoc comes with three built-in Special Word types: 'emphasizedwords', 'monospacedwords' and 'strongwords', each has a corresponding (backend specific) markup template section. Edit the configuration files to customize existing Special Words and to add new ones. .Special word behavior - Word list entries must be separated by space characters. - Word list entries with embedded spaces should be enclosed in quotation (") characters. - A `[specialwords]` section entry of the form `name=word1{nbsp}[word2...]` adds words to existing `name` entries. - A `[specialwords]` section entry of the form `name` undefines (deletes) all existing `name` words. - Since word list entries are processed as Python regular expressions you need to be careful to escape regular expression special characters. - By default Special Words are substituted before Inline Macros, this may lead to undesirable consequences. For example the special word `foobar` would be expanded inside the macro call `\http://www.foobar.com[]`. A possible solution is to emphasize whole words only by defining the word using regular expression characters, for example `\bfoobar\b`. - If the first matched character of a special word is a backslash then the remaining characters are output without markup i.e. the backslash can be used to escape special word markup. For example the special word `\\?\b[Tt]en\b` will mark up the words `Ten` and `ten` only if they are not preceded by a backslash. [[X10]] Replacements ^^^^^^^^^^^^ `[replacements]` and `[replacements2]` configuration file entries specify find and replace text and are formatted like: find_pattern=replacement_text The find text can be a Python regular expression; the replace text can contain Python regular expression group references. Use Replacement shortcuts for often used macro references, for example (the second replacement allows us to backslash escape the macro name): NEW!=image:./images/smallnew.png[New!] \\NEW!=NEW! .Replacement behavior - The built-in replacements can be escaped with a backslash. - If the find or replace text has leading or trailing spaces then the text should be enclosed in quotation (") characters. - Since the find text is processed as a regular expression you need to be careful to escape regular expression special characters. - Replacements are performed in the same order they appear in the configuration file replacements section. [[X27]] Configuration File Names and Locations ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Configuration files have a `.conf` file name extension; they are loaded implicitly (using predefined file names and locations) or explicitly (using the asciidoc(1) `-f` (`--conf-file`) command-line option). Implicit configuration files are loaded from the following directories in the following order: 1. The `/etc/asciidoc` directory (if it exists). 2. The directory containing the asciidoc executable. 3. The user's `$HOME/.asciidoc` directory (if it exists). 4. The directory containing the AsciiDoc source file. The following implicit configuration files from each of the above locations are loaded in the following order: 1. `asciidoc.conf` 2. `<backend>.conf` 3. `<backend>-<doctype>.conf` 4. `lang-<lang>.conf` Where `<backend>` and `<doctype>` are values specified by the asciidoc(1) `-b` (`--backend`) and `-d` (`--doctype`) command-line options. `<lang>` is the value of the AsciiDoc `lang` attribute (defaults to `en` (English)). Finally, configuration files named like the source file will be automatically loaded if they are found in the source file directory. For example if the source file is `mydoc.txt` and the `--backend=html4` option is used then asciidoc(1) will look for `mydoc.conf` and `mydoc-html4.conf` in that order. Implicit configuration files that don't exist will be silently skipped. The user can explicitly specify additional configuration files using the asciidoc(1) `-f` (`--conf-file`) command-line option. The `-f` option can be specified multiple times, in which case configuration files will be processed in the order they appear on the command-line. For example, when we translate our AsciiDoc document `mydoc.txt` with: $ asciidoc -f extra.conf mydoc.txt Configuration files (if they exist) will be processed in the following order: 1. First default global configuration files from the asciidoc program directory are loaded: asciidoc.conf xhtml11.conf 2. Then, from the users home `~/.asciidoc` directory. This is were you put customization specific to your own asciidoc documents: asciidoc.conf xhtml11.conf xhtml11-article.conf 3. Next from the source document project directory (the first three apply to all documents in the directory, the last two are specific to the mydoc.txt document): asciidoc.conf xhtml11.conf xhtml11-article.conf mydoc.conf mydoc-xhtml11.conf 4. Finally the file specified by the `-f` command-line option is loaded: extra.conf TIP: Use the asciidoc(1) `-v` (`--verbose`) command-line option to see which configuration files are loaded and the order in which they are loaded. Document Attributes ------------------- A document attribute is comprised of a 'name' and a textual 'value' and is used for textual substitution in AsciiDoc documents and configuration files. An attribute reference (an attribute name enclosed in braces) is replaced by its corresponding attribute value. There are four sources of document attributes (from highest to lowest precedence): - Command-line attributes. - AttributeEntry, AttributeList, Macro and BlockId elements. - Configuration file `[attributes]` sections. - Intrinsic attributes. Within each of these divisions the last processed entry takes precedence. IMPORTANT: If an attribute is not defined then the line containing the attribute reference is dropped. This property is used extensively in AsciiDoc configuration files to facilitate conditional markup generation. [[X18]] Attribute Entries ----------------- The `AttributeEntry` block element allows document attributes to be assigned within an AsciiDoc document. Attribute entries are added to the global document attributes dictionary. The attribute name/value syntax is a single line like: :<name>: <value> For example: :Author Initials: JB This will set an attribute reference `\{authorinitials}` to the value 'JB' in the current document. To delete (undefine) an attribute use the following syntax: :<name>!: .AttributeEntry properties - The attribute entry line begins with colon -- no white space allowed in left margin. - AsciiDoc converts the `<name>` to a legal attribute name (lower case, alphanumeric and dash characters only -- all other characters deleted). This allows more reader friendly text to be used. - Leading and trailing white space is stripped from the `<value>`. - If the `<value>` is blank then the corresponding attribute value is set to an empty string. - Special characters in the entry `<value>` are substituted. To include special characters use the predefined `\{gt}`, `\{lt}`, `\{amp}` attribute references. - Attribute references contained in the entry `<value>` will be expanded. - By default AttributeEntry values are substituted for `specialcharacters` and `attributes` (see above), if you want a different AttributeEntry substitution set the `attributeentry-subs` attribute. - Attribute entries in the document Header are available for header markup template substitution. - Attribute elements override configuration file and intrinsic attributes but do not override command-line attributes. Here's another example: --------------------------------------------------------------------- AsciiDoc User Manual ==================== :Author: Stuart Rackham :Email: srackham@gmail.com :Date: April 23, 2004 :Revision: 5.1.1 :Key words: linux, ralink, debian, wireless :Revision history: --------------------------------------------------------------------- Which creates these attributes: {author}, {firstname}, {lastname}, {authorinitials}, {email}, {date}, {revision}, {keywords}, {revisionhistory} The preceding example is equivalent to the standard AsciiDoc two line document header. Actually it's a little bit different with the addition of the `\{keywords}` and `\{revisionhistory}` attributes footnote:[The existence of a `\{revisionhistory}` attribute causes a revision history file (if it exists) to be included in DocBook outputs. If a file named like `\{docname}-revhistory.xml` exists in the document's directory then it will be added verbatim to the DocBook header (see the `./doc/asciidoc-revhistory.xml` example that comes with the AsciiDoc distribution).]. [[X62]] .Attribute entries promote clarity and eliminate repetition ********************************************************************* URLs and file names in AsciiDoc macros are often quite long -- they break paragraph flow and readability suffers. The problem is compounded by redundancy if the same name is used repeatedly. Attribute entries can be used to make your documents easier to read and write, here are some examples: :1: http://freshmeat.net/projects/asciidoc/ :homepage: http://hg.sharesource.org/asciidoc/[AsciiDoc home page] :new: image:./images/smallnew.png[] Using previously defined attributes: See the {1}[Freshmeat summary] or the {homepage} for something new {new}. .Note - The attribute entry definition must precede it's usage. - You are not limited to URLs or file names, entire macro calls or arbitrary lines of text can be abbreviated. - Shared attributes entries could be grouped into a separate file and <<X63,included>> in multiple documents. ********************************************************************* [[X21]] Attribute Lists --------------- An attribute list is a comma separated list of attribute values. The entire list is enclosed in square brackets. Attribute lists are used to pass parameters to macros, blocks and inline quotes. The list consists of zero or more positional attribute values followed by zero or more named attribute values. Here are three examples: [Hello] [quote, Bertrand Russell, The World of Mathematics (1956)] ["22 times", backcolor="#0e0e0e", options="noborders,wide"] .Attribute list properties - If one or more attribute values contains a comma the all values must be quoted (enclosed in quotation characters). - If the list contains any named attributes the all string attribute values must be quoted. - List attributes take precedence over existing attributes. - List attributes can only be referenced in configuration file markup templates and tags, they are not available inside the document. - Attribute references are allowed inside attribute lists. - Setting a named attribute to `None` undefines the attribute. - Positional attributes are referred to as `\{1}`,`\{2}`,`\{3}`,... - Attribute `\{0}` refers to the entire list (excluding the enclosing square brackets). - If an attribute named `options` is present it is processed as a comma separated list of attributes with zero length string values. For example `[options="opt1,opt2,opt3"]` is equivalent to `[opt1="",opt2="",opt2=""]`. - Attribute lists are evaluated as a list of Python function arguments. If this fails or any of the items do not evaluate to a string, a number or None then all list items are treated as string literals. Macro Attribute lists ~~~~~~~~~~~~~~~~~~~~~ Macros calls are suffixed with an attribute list. The list may be empty but it cannot be omitted. List entries are used to pass attribute values to macro markup templates. AttributeList Element ~~~~~~~~~~~~~~~~~~~~~ An attribute list on a line by itself constitutes an 'AttributeList' block element, its function is to parametrize the following block element. The list attributes are passed to the next block element for markup template substitution. Attribute References -------------------- An attribute references is an attribute name (possibly followed by an additional parameters) enclosed in braces. When an attribute reference is encountered it is evaluated and replaced by its corresponding text value. If the attribute is undefined the line containing the attribute is dropped. There are three types of attribute reference: 'Simple', 'Conditional' and 'System'. .Attribute reference behavior - You can suppress attribute reference expansion by placing a backslash character immediately in front of the opening brace character. - By default attribute references are not expanded in LiteralParagraphs, ListingBlocks or LiteralBlocks. Simple Attributes References ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Simple attribute references take the form `\{<name>}`. If the attribute name is defined its text value is substituted otherwise the line containing the reference is dropped from the output. Conditional Attribute References ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Additional parameters are used in conjunction with the attribute name to calculate a substitution value. Conditional attribute references take the following forms: `\{<name>=<value>}`:: `<value>` is substituted if the attribute `<name>` is undefined otherwise its value is substituted. `<value>` can contain simple attribute references. `\{<name>?<value>}`:: `<value>` is substituted if the attribute `<name>` is defined otherwise an empty string is substituted. `<value>` can contain simple attribute references. `\{<name>!<value>}`:: `<value>` is substituted if the attribute `<name>` is undefined otherwise an empty string is substituted. `<value>` can contain simple attribute references. `\{<name>#<value>}`:: `<value>` is substituted if the attribute `<name>` is defined otherwise the undefined attribute entry causes the containing line to be dropped. `<value>` can contain simple attribute references. `\{<name>%<value>}`:: `<value>` is substituted if the attribute `<name>` is not defined otherwise the containing line is dropped. `<value>` can contain simple attribute references. `\{<name>@<regexp>:<value1>[:<value2>]}`:: `<value1>` is substituted if the value of attribute `<name>` matches the regular expression `<regexp>` otherwise `<value2>` is substituted. If attribute `<name>` is not defined the containing line is dropped. If `<value2>` is omitted an empty string is assumed. The values and the regular expression can contain simple attribute references. To embed colons in the values or the regular expression escape them with backslashes. `\{<name>$<regexp>:<value1>[:<value2>]}`:: Same behavior as the previous ternary attribute except for the following cases: `\{<name>$<regexp>:<value>}`;; Substitutes `<value>` if `<name>` matches `<regexp>` otherwise the result is undefined and the containing line is dropped. `\{<name>$<regexp>::<value>}`;; Substitutes `<value>` if `<name>` does not match `<regexp>` otherwise the result is undefined and the containing line is dropped. Conditional attribute examples ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Conditional attributes are mainly used in AsciiDoc configuration files -- see the distribution `.conf` files for examples. Attribute equality test:: If `\{backend}` is `docbook` or `xhtml11` the example evaluates to ``DocBook or XHTML backend'' otherwise it evaluates to ``some other backend'': {backend@docbook|xhtml11:DocBook or XHTML backend:some other backend} Attribute value map:: This example maps the `frame` attribute values [`topbot`, `all`, `none`, `sides`] to [`hsides`, `border`, `void`, `vsides`]: {frame@topbot:hsides}{frame@all:border}{frame@none:void}{frame@sides:vsides} [[X24]] System Attribute References ~~~~~~~~~~~~~~~~~~~~~~~~~~~ System attribute references generate the attribute text value by executing a predefined action that is parametrized by a single argument. The syntax is `{<action>:<argument>}`. `\{eval:<expression>}`:: Substitutes the result of the Python `<expression>`. If `<expression>` evaluates to `None` or `False` the reference is deemed undefined and the line containing the reference is dropped from the output. If the expression evaluates to `True` the attribute evaluates to an empty string. In all remaining cases the attribute evaluates to a string representation of the `<expression>` result. `\{include:<filename>}`:: Substitutes contents of the file named `<filename>`. - The included file is read at the time of attribute substitution. - If the file does not exist a warning is emitted and the line containing the reference is dropped from the output file. - Tabs are expanded based on the current 'tabsize' attribute value. `\{sys:<command>}`:: Substitutes the stdout generated by the execution of the shell `<command>`. `\{sys2:<command>}`:: Substitutes the stdout