# $Source$
# $Author: xmldoc $
# $Date: 2006-04-19 15:25:42 +0900 (Wed, 19 Apr 2006) $
# $Revision: 5866 $
# vim: number
#
# -----------------------------------------------------------------
#  ** Makefile.combine -- combine source files **
# -----------------------------------------------------------------
#
#   This file is part of the DocBook Project XSL Stylesheet
#   distribution.
#
#   See http://docbook.sourceforge.net/release/xsl/current/
#   for copyright and other information.
#
# This makefile creates "wrapper" files that combine sets of
# individual DocBook source files. The purpose of combining the
# files is to speed up processing time. By default it puts 20
# files into each wrapper. Use CHUNKSIZE to configure the number
# of files per wrapper.
#
# Currently, this makefile has only a "man" target and is mainly
# intended to speed up processing of large numbers if individual
# refentry instances.

# What file extension do you use for DocBook source files?
DOCBOOK_FILE_EXTENSION = .xml
SOURCE_FILES_DBK = $(wildcard *$(DOCBOOK_FILE_EXTENSION))

MAKEFILE_DOCBOOK = Makefile.DocBook

XSLTPROC=xsltproc
XSLTPROC_FLAGS=

SED=sed
SED_FLAGS=-i

CHUNKSIZE ?= 20

WRAPPER_ELEMENT = reference
WRAPPER_TITLE=Combined contents

COMBINE_XSL = <?xml version="1.0"?> \
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" \
		xmlns:exsl="http://exslt.org/common" \
		xmlns:xi="http://www.w3.org/2001/XInclude" \
		exclude-result-prefixes="exsl xi" \
		extension-element-prefixes="exsl" \
		version="1.0"> \
  <xsl:param name="files"/> \
  <xsl:param name="chunk.size"/> \
  <xsl:template match="/"> \
    <xsl:call-template name="make.file"/> \
  </xsl:template> \
 \
  <xsl:template name="make.file"> \
    <xsl:param name="count" select="1"/> \
    <xsl:param name="current.files" select="concat(normalize-space($$files), ^^ ^^)"/> \
    <xsl:param name="more.files" \
	       select="concat(normalize-space(substring-after($$current.files, ^^ ^^)),^^ ^^)"/> \
    <xsl:param name="file.number" select="1"/> \
    <xsl:param name="filename" select="concat(^^./build/^^,$$file.number,^^.xml^^)"/> \
 \
    <xsl:choose> \
      <xsl:when test="$$more.files = ^^ ^^"/> \
      <xsl:when test="$$count mod $$chunk.size = 0"> \
	<xsl:variable name="fileset" select="concat($$current.files, ^^ ^^, \
	  substring-before($$more.files, ^^ ^^))"/> \
	<exsl:document href="{$$filename}" \
		       method="xml" \
		       encoding="UTF-8" \
		       indent="yes" \
		       omit-xml-declaration="yes" \
		       media-type="" \
		       standalone="no"> \
	  <$(WRAPPER_ELEMENT)> \
	    <title>$(WRAPPER_TITLE)</title> \
	    <xsl:call-template name="make.xinclude"> \
	      <xsl:with-param name="file"> \
		<xsl:choose> \
		  <xsl:when test="contains($$fileset, ^^ ^^)"> \
		    <xsl:value-of \
			select="normalize-space(substring-before($$fileset, ^^ ^^))"/> \
		  </xsl:when> \
		  <xsl:otherwise> \
		    <xsl:value-of select="$$fileset"/> \
		  </xsl:otherwise> \
		</xsl:choose> \
	      </xsl:with-param> \
	      <xsl:with-param \
		  name="remaining.files" \
		  select="concat(normalize-space(substring-after($$fileset, ^^ ^^)),^^ ^^)"/> \
	    </xsl:call-template> \
	  </$(WRAPPER_ELEMENT)> \
	</exsl:document> \
	<xsl:call-template name="make.file"> \
	  <xsl:with-param name="count" select="1"/> \
	  <xsl:with-param name="current.files"  \
			  select="$$more.files"/> \
	  <xsl:with-param name="file.number" select="number($$file.number) + 1"/> \
	  <xsl:with-param name="filename" select="concat(^^./build/^^,$$file.number,^^.xml^^)"/> \
	</xsl:call-template> \
      </xsl:when> \
      <xsl:otherwise> \
	<xsl:call-template name="make.file"> \
	  <xsl:with-param name="count" select="$$count + 1"/> \
	  <xsl:with-param name="current.files"> \
	    <xsl:choose> \
	      <xsl:when test="$$count = 1 and $$file.number = 1"> \
		<xsl:value-of  \
		    select="concat(substring-before($$current.files, ^^ ^^), \
			    ^^ ^^, \
			    substring-before($$more.files, ^^ ^^))"/> \
	      </xsl:when> \
	      <xsl:when test="$$count = 1"> \
		<xsl:value-of  \
		    select="substring-before($$more.files, ^^ ^^)"/> \
	      </xsl:when> \
	      <xsl:otherwise> \
		<xsl:value-of  \
		    select="concat($$current.files, ^^ ^^, \
			    substring-before($$more.files, ^^ ^^))"/> \
	      </xsl:otherwise> \
	    </xsl:choose> \
	  </xsl:with-param> \
	  <xsl:with-param name="more.files" \
			  select="substring-after($$more.files, ^^ ^^)"/> \
	  <xsl:with-param name="file.number" select="$$file.number"/> \
	</xsl:call-template> \
      </xsl:otherwise> \
    </xsl:choose> \
  </xsl:template> \
 \
  <xsl:template name="make.xinclude"> \
    <xsl:param name="file"/> \
    <xsl:param name="remaining.files"/> \
    <xsl:param name="count" select="1"/> \
    <xsl:if test="not($$file = ^^^^)"> \
      <xi:include href="../{$$file}"/> \
      <xsl:call-template name="make.xinclude"> \
	<xsl:with-param \
	    name="file" \
	    select="substring-before($$remaining.files, ^^ ^^)"/> \
	<xsl:with-param \
	    name="remaining.files" \
	    select="substring-after($$remaining.files, ^^ ^^)"/> \
	<xsl:with-param name="count" select="$$count + 1"/> \
      </xsl:call-template> \
    </xsl:if> \
  </xsl:template> \
 \
</xsl:stylesheet>

all: man

man: build/man

build/Makefile:
	if [ ! -d build ]; then mkdir build; fi
	cp $(MAKEFILE_DOCBOOK) $@

combine.xsl: Makefile
	@echo '$(COMBINE_XSL)' > $@
	$(SED) $(SED_FLAGS) "s/\^\^/'/g" $@

build/1.xml: combine.xsl
	$(XSLTPROC) $(XSLTPROC_FLAGS) \
	--stringparam files "$(SOURCE_FILES_DBK)" \
	--stringparam chunk.size $(CHUNKSIZE) \
	$< $<

build/man: build/Makefile build/1.xml
	$(MAKE) -C build man \
		MAN_PARAMS="--stringparam man.output.quietly 1 \
		   --stringparam refentry.meta.get.quietly 1 \
		   --stringparam man.charmap.enabled 0"

debug:

clean:
	$(RM) -r build
