#! /usr/bin/env python
# encoding: utf-8
# Thomas Nagy, 2006-2010 (ita)

VERSION='0.0.1'
APPNAME='wafdocs'

import os, re, shutil
import Utils, Options

srcdir = '.'
blddir = 'build'

re_xi = re.compile('''<xi:include[^>]+href=['"]([^'">]+)['"][^>]+>''', re.M)
def xmlscan(self):
	p = self.inputs[0].parent
	node_lst = [self.inputs[0]]
	seen = []
	depnodes = []
	while node_lst:
		nd = node_lst.pop(0)
		if nd.id in seen: continue
		seen.append(nd.id)

		code = nd.read(self.env)
		for m in re_xi.finditer(code):
			name = m.group(1)
			k = p.find_resource(name)
			if k: depnodes.append(k)
	return [depnodes, ()]

def set_options(opt):
	opt.add_option('--exe', action='store_true', default=False, help='Execute the program after it is compiled')

def configure(conf):
	conf.find_program('java', var='JAVA', mandatory=True)

def jars(ctx):
	try:
		os.makedirs('book_root')
	except:
		pass

	try:
		for x in "snap.tar.bz2 docbook-xml-4.3.zip resolver.jar saxon.jar xercesImpl.jar xslthl-2.0.1.zip".split():
			Utils.cmd_output('cd book_root && wget http://freehackers.org/~tnagy/book/%s' % x)

		Utils.cmd_output('cd book_root && unzip xslthl-2.0.1.zip && unzip docbook-xml-4.3.zip && tar xjvf snap.tar.bz2')
	except:
		shutil.rmtree('book_root')

def build(bld):

	book_root = os.environ.get('BOOK_ROOT', 'book_root')
	cp = os.path.abspath('book_root')

	try:
		os.listdir(cp)
	except:
		raise Utils.WafError('execute "waf jars" once to download the required libraries')

	dct = {'doc_root': cp}

	cat = """catalogs=catalog.xml;%(doc_root)s/docbook.cat
relative-catalogs=false
static-catalog=yes
catalog-class-name=org.apache.xml.resolver.Resolver
#verbosity=2
""" % dct

	defaultcp = """%(doc_root)s/saxon.jar
%(doc_root)s/docbook-xsl-snapshot/extensions/saxon65.jar
%(doc_root)s/xercesImpl.jar
%(doc_root)s/xslthl-2.0.1.jar
default/
%(doc_root)s/
%(doc_root)s/resolver.jar
.
""" % dct

	defaultcp = defaultcp.replace("\n", ":")

	bld(
		rule   = 'echo -e %r > ${TGT}' % cat,
		target = 'CatalogManager.properties',
		name   = 'catalog'
	)

	for k in ['pics', 'callouts']:
		files = os.listdir(k)
		for x in files:
			if x == '.svn':
				continue
			bld.new_task_gen(name='copy', rule='cp ${SRC} ${TGT}', source=k+'/'+x, target=x)


	# docbook processing is horribly complicated

	r0 = """
${JAVA} -cp %(cp)s
-Djavax.xml.parsers.DocumentBuilderFactory=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl
-Djavax.xml.parsers.SAXParserFactory=org.apache.xerces.jaxp.SAXParserFactoryImpl
-Dorg.apache.xerces.xni.parser.XMLParserConfiguration=org.apache.xerces.parsers.XIncludeParserConfiguration
-Dxslthl.config=file://%(book_root)s/highlighters/xslthl-config.xml
com.icl.saxon.StyleSheet

-x org.apache.xml.resolver.tools.ResolvingXMLReader
-y org.apache.xml.resolver.tools.ResolvingXMLReader
-r org.apache.xml.resolver.tools.CatalogResolver
-u

-o ${TGT}
${SRC} %(book_root)s/docbook-xsl-snapshot/html/%(type)s

html.stylesheet=waf.css
base.dir=default/
highlight.source=true
admon.graphics=1
admon.graphics.path="./"
callout.graphics.path="./"
"""

	r1 = r0 % {'book_root' : cp, 'cp': defaultcp, 'type': 'docbook.xsl'}
	bld(
		source = 'waf.xml',
		scan   = xmlscan,
		target = 'single.html',
		rule   = r1.replace('\n', ' '),
		after  = 'catalog',
		name   = 'main',
	)


	r2 = r0 % {'book_root' : cp, 'cp': defaultcp, 'type': 'chunk.xsl'}
	bld(
		source = 'waf.xml',
		scan   = xmlscan,
		target = 'index.html',
		rule   = r2.replace('\n', ' '),
		after  = 'catalog',
		name   = 'chunk',
	)


	reg = re.compile("^\\$(.+?)$", re.M)
	def replace_fun(task):
		path = task.inputs[0].parent.abspath(task.env)
		lst   = os.listdir(path)
		for x in lst:
			if x.endswith('html'):
				pp = path + os.sep + x
				txt = Utils.readf(pp)
				txt = txt.replace('color:red', '').replace('color: silver', '')
				txt = reg.sub('<span class="hl-string">$ \\1</span>', txt)
				f = open(pp, 'w')
				f.write(txt)
				f.close()

	bld(
		name   = 'postproc',
		rule   = replace_fun,
		source = 'single.html',
		after  = 'main chunk',
		#always = True
	)

	if Options.options.exe:
		def exe(ctx):
			p = Utils.pproc.Popen('konqueror build/default/single.html', shell=True)
			p.wait()
		bld.add_post_fun(exe)

