mirror of
https://gitlab.com/ita1024/waf.git
synced 2024-11-19 00:17:12 +01:00
233 lines
6.7 KiB
Python
233 lines
6.7 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 = '.eps'
|
|
if self.generator.rule.rfind('A2X') > 0:
|
|
ext = '.png'
|
|
|
|
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 == 'dia':
|
|
if m.group(1) == 'width':
|
|
h = ''
|
|
else:
|
|
w = ''
|
|
code = '--size %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('dia', var='DIA')
|
|
conf.find_program('convert', var='CONVERT')
|
|
conf.find_program('source-highlight', var='SOURCE_HIGHLIGHT')
|
|
conf.find_program('dot')
|
|
conf.find_program('semantik-d')
|
|
|
|
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)
|
|
|
|
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} -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('*.dia'):
|
|
tg = bld(rule='${DIA} -t eps ${SRC} -e ${TGT}', source=x, target=x.change_ext('.eps'))
|
|
tg = bld(rule='${DIA} -t png ${SRC} -e ${TGT}', source=x, target=x.change_ext('.png'), scan=scansize)
|
|
#bld(rule='${CONVERT} ${bld.raw_deps[tsk.uid()]} ${SRC} ${TGT}', source=tg.target, target=tg.target.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'))
|
|
bld(rule='${SEMANTIK_D} ${SIZEPARAMS} ${SRC[0].abspath()} -o ${TGT[0].abspath()}', source=x, target=x.change_ext('.png'), features="sizer")
|
|
|
|
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 -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
|
|
|
|
|
|
if 0:
|
|
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 == 'dia':
|
|
if m.group(1) == 'width':
|
|
h = ''
|
|
else:
|
|
w = ''
|
|
code = '--size %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)
|
|
|
|
|
|
"""
|
|
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
|
|
"""
|
|
|