#####################################################################
#
# A-A-P file for making AsciiDoc distribution documents.
# (you can obtain A-A-P from http://www.a-a-p.org)
#
# Stuart Rackham <srackham@gmail.com>
#####################################################################

: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 <programlisting> '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.
