waf/docs/book/wscript

198 lines
6.1 KiB
Python

#! /usr/bin/env python
# encoding: utf-8
# Thomas Nagy, 2006-2010 (ita)
"""
call 'waf --targets=waf.pdf' or use 'waf list' to see the targets available
"""
VERSION='0.0.1'
APPNAME='wafdocs'
import os, re, shutil
from waflib import TaskGen
top = '.'
out = 'build'
re_xi = re.compile('''^(include|image)::([^.]*.(txt|\\{PIC\\}))\[''', re.M)
def ascii_doc_scan(self):
p = self.inputs[0].parent
node_lst = [self.inputs[0]]
seen = []
depnodes = []
while node_lst:
nd = node_lst.pop(0)
if nd in seen: continue
seen.append(nd)
code = nd.read()
for m in re_xi.finditer(code):
name = m.group(2)
if m.group(3) == '{PIC}':
ext = '.svg'
if self.generator.rule.rfind('A2X') > 0:
ext = '.pdf'
k = p.find_resource(name.replace('{PIC}', ext))
if k:
depnodes.append(k)
else:
k = p.find_resource(name)
if k:
depnodes.append(k)
node_lst.append(k)
return [depnodes, ()]
import re
def scansize(self):
base, _, ext = self.inputs[0].name.partition('.')
name = 'image::%s\\{PIC\\}\\[.*,(width|height)=(\\d+)' % base
re_src = re.compile(name)
lst = self.inputs[0].parent.get_src().ant_glob('*.txt')
for x in lst:
m = re_src.search(x.read())
if m:
val = str(int(1.6 * int(m.group(2))))
if m.group(1) == 'width':
w = val
h = "800"
else:
w = "800"
h = val
if ext == 'eps':
code = '-geometry %sx%s' % (w, h)
elif ext == 'semd':
if m.group(1) == 'width':
code = '--width=%s' % w
else:
code = '--height=%s' % h
else:
code = '-Gsize="%s,%s"' % (w, h)
break
else:
return ([], '')
return ([], code)
def 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('a2x', var='A2X')
conf.find_program('asciidoc', var='ADOC')
conf.find_program('convert', var='CONVERT')
conf.find_program('source-highlight', var='SOURCE_HIGHLIGHT')
conf.find_program('dot')
conf.find_program('dblatex')
conf.find_program('epstopdf')
conf.find_program('pdf2svg')
try:
conf.find_program('semantik-d')
except conf.errors.ConfigurationError:
conf.env.SEMANTIK_D = conf.path.find_node('semd_wrapper.py').abspath()
def build(bld):
#bld(features='subst', is_copy=True, source='asciidoc-dblatex.sty asciidoc-dblatex.xsl', target='asciidoc-dblatex.sty asciidoc-dblatex.xsl')
for x in bld.path.ant_glob('*.eps'):
#bld(features='subst', source=x.name, target=x.name, is_copy=True)
#bld(rule='${CONVERT} ${bld.raw_deps[tsk.uid()]} -density 600 ${SRC} ${TGT}', source=x, target=x.change_ext('.png'), scan=scansize)
bld(rule='${EPSTOPDF} ${SRC} --outfile=${TGT}', source=x, target=x.change_ext('.pdf'), scan=scansize)
bld(rule='${PDF2SVG} ${SRC} ${TGT}', source=x.change_ext('.pdf'), target=x.change_ext('.svg'), scan=scansize)
for x in bld.path.ant_glob('*.dot'):
#tg = bld(rule='${DOT} -Teps -o${TGT} ${SRC}', source=x, target=x.change_ext('.eps'))
tg = bld(rule='${DOT} -Tsvg -o${TGT} ${SRC}', source=x, target=x.change_ext('.svg'))
tg = bld(rule='${DOT} -Tpdf -o${TGT} ${SRC}', source=x, target=x.change_ext('.pdf'))
#tg = bld(rule='${DOT} -Tpng -o${TGT} ${SRC}', source=x, target=x.change_ext('.png'), scan=scansize)
#tg = bld(rule='${CONVERT} ${bld.raw_deps[tsk.uid()]} ${SRC} ${TGT}', source=x.change_ext('.eps'), target=x.change_ext('.png'), scan=scansize)
for x in bld.path.ant_glob('*.semd'):
bld(rule='${SEMANTIK_D} ${SRC[0].abspath()} -o ${TGT[0].abspath()}', source=x, target=x.change_ext('.svg'))
bld(rule='${SEMANTIK_D} ${SRC[0].abspath()} -o ${TGT[0].abspath()}', source=x, target=x.change_ext('.pdf'))
for x in bld.path.ant_glob('pics/*.png'):
bld(features='subst', source=x, target=x.name, is_copy=True)
for x in bld.path.ant_glob('callouts/*.png'):
bld(features='subst', source=x.name, target=x.name, is_copy=True, path=x.parent)
#bld(rule='mkdir -p ${SRC[0].parent.get_bld().abspath()} && cp ${SRC} ${SRC[0].parent.get_bld().abspath()}',
# source=bld.path.ant_glob('callouts/*.png'))
for x in 'shishell.lang symbols.lang default.style lang.map waf.css'.split():
bld(features='subst', source=x, target=x, is_copy=True)
with open('../../waflib/Context.py', 'r') as f:
version = re.compile('WAFVERSION=[\'"]([^\'"]+)', re.M).search(f.read()).group(1)
def sfun(tsk, text):
return text.replace('{version}', version)
for x in bld.path.ant_glob('*.txt'):
bld(features='subst', source=x, target=x.change_ext('_.txt'), subst_fun=sfun)
bld.add_group() # separator, the documents may require any of the pictures from above
bld(rule='${ADOC} -a icons=true -b html5 -a stylesheet=${SRC[1].abspath()} -a iconsdir=. -a toc -d book -o ${TGT} ${SRC[0].abspath()}',
source='waf_.txt waf.css', target='index.html', scan=ascii_doc_scan)
bld(rule='${A2X} -L -a toc --icons-dir=. --icons -d book -f pdf --dblatex-opts "-s ${SRC[1].abspath()} -p ${SRC[2].abspath()} -o ${TGT}" ${SRC[0].bldpath()}',
shell=True,
source='waf_.txt asciidoc-dblatex.sty asciidoc-dblatex.xsl', target='waf.pdf', scan=ascii_doc_scan)
#bld(rule='ln -sf single.html index.html', shell=True)
if bld.options.exe:
def exe(ctx):
bld.exec_command('firefox build/index.html')
bld.add_post_fun(exe)
@TaskGen.feature('sizer')
@TaskGen.after_method('process_rule')
def process_sizes(self):
try:
tbl = self.bld.size_table
except AttributeError:
tbl = self.bld.size_table = make_size_table(self)
base, _, ext = self.tasks[0].outputs[0].name.partition('.')
if ext == 'png' and base in tbl:
self.env.SIZEPARAMS = "--%s=%s" % tbl[base]
@TaskGen.taskgen_method
def make_size_table(self):
name = 'image::(.*?)\\{PIC\\}\\[.*,(width|height)=(\\d+)'
re_src = re.compile(name)
tbl = {}
lst = self.path.ant_glob('*.txt')
for x in lst:
for m in re.finditer(re_src, x.read()):
tbl[m.group(1)] = (m.group(2), m.group(3))
return tbl
"""
For vim highlighting:
cp vim/syntax/asciidoc.vim /usr/share/vim/site/syntax/
cp vim/ftdetect/asciidoc_filetype.vim /usr/share/vim/site/ftdetect/
When adding an eps from a svg file, convert it with inscape first
convert (imagemagick) does not process svg files too well
colors:
yellow fffea6
green aef9a5
blue d2d5ff
"""