summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xql-ikiwiki-preprocess77
1 files changed, 48 insertions, 29 deletions
diff --git a/ql-ikiwiki-preprocess b/ql-ikiwiki-preprocess
index 35174e2..03f3019 100755
--- a/ql-ikiwiki-preprocess
+++ b/ql-ikiwiki-preprocess
@@ -26,9 +26,7 @@ import tempfile
import cliapp
-def write_temp(content, suffix, tgtdir):
- fd, filename = tempfile.mkstemp(dir=tgtdir, suffix=suffix)
- os.close(fd)
+def write_file(content, filename):
with open(filename, 'w') as f:
f.write(content)
return filename
@@ -57,15 +55,17 @@ def remove_prefixes(lines):
return ''.join(result)
-def process_uml(lines, tgtdir):
+def process_uml(lines, tgtdir, relative, mtime):
title = get_uml_title(lines)
uml_text = remove_prefixes(lines)
- filename = write_temp(uml_text, '.uml', tgtdir)
- format_uml(filename)
- prefix, _ = os.path.splitext(filename)
- image = prefix + '.png'
- relative = make_relative(os.path.abspath(tgtdir), image)
- include = '[[!img {}]]\n'.format(relative)
+ uml_filename = os.path.join(tgtdir, relative + '.uml')
+ png_basename = os.path.join(relative + '.png')
+ png_filename = os.path.join(tgtdir, png_basename)
+
+ write_file(uml_text, uml_filename)
+ format_uml(uml_filename)
+
+ include = '[[!img {}]]\n'.format(png_basename)
return [include]
@@ -77,7 +77,7 @@ def format_roadmap(text):
return '\n'.join(output_lines[1:-1])
-def process_roadmap(lines, tgtdir):
+def process_roadmap(lines, tgtdir, relative, mtime):
roadmap_text = remove_prefixes(lines[1:-1])
include = format_roadmap(roadmap_text)
return ['[[!graph src="""\n', include, '"""]]\n']
@@ -123,19 +123,22 @@ def find_section(lines, sections):
return 0, len(lines), None
-def preprocess_lines(lines, tgtdir):
+def preprocess_lines(lines, tgtdir, relative, mtime):
sections = [
('@startuml\n', '@enduml\n', process_uml),
('@startroadmap\n', '@endroadmap\n', process_roadmap),
]
result = []
+ counter = 0
while lines:
start, after, func = find_section(lines, sections)
result.extend(lines[:start])
section = lines[start:after]
if func:
- include = func(section, tgtdir)
+ counter += 1
+ output = '{}-{}'.format(relative, counter)
+ include = func(section, tgtdir, output, mtime)
result.extend(include)
else:
result.extend(section)
@@ -143,28 +146,45 @@ def preprocess_lines(lines, tgtdir):
return result
-def preprocess_mdwn(src, tgt):
- lines = read_lines(src)
- tgtdir = os.path.dirname(tgt)
- lines = preprocess_lines(lines, tgtdir)
- write_lines(tgt, lines)
- shutil.copystat(src, tgt)
+def needs_preprocessing(src, tgt):
+ if not os.path.exists(tgt):
+ return True
+ src_mtime = os.path.getmtime(src)
+ tgt_mtime = os.path.getmtime(tgt)
+ return src_mtime != tgt_mtime
+
+
+def preprocess_mdwn(srcdir, tgtdir, relative):
+ src = make_absolute(srcdir, relative)
+ tgt = make_absolute(tgtdir, relative)
+
+ if needs_preprocessing(src, tgt):
+ src_mtime = os.path.getmtime(src)
+ lines = read_lines(src)
+ lines = preprocess_lines(lines, tgtdir, relative, src_mtime)
+ write_lines(tgt, lines)
+ shutil.copystat(src, tgt)
-def copy_file(src, tgt):
+def copy_file(srcdir, tgtdir, relative):
+ src = make_absolute(srcdir, relative)
+ tgt = make_absolute(tgtdir, relative)
shutil.copy(src, tgt)
shutil.copystat(src, tgt)
-def preprocess_file(src, tgt):
- if src.endswith('.mdwn'):
- preprocess_mdwn(src, tgt)
+def preprocess_file(srcdir, tgtdir, relative):
+ if relative.endswith('.mdwn'):
+ preprocess_mdwn(srcdir, tgtdir, relative)
else:
- copy_file(src, tgt)
+ copy_file(srcdir, tgtdir, relative)
-def copy_dir(src, tgt):
- os.makedirs(tgt)
+def copy_dir(srcdir, tgtdir, relative):
+ src = make_absolute(srcdir, relative)
+ tgt = make_absolute(tgtdir, relative)
+ if not os.path.exists(tgt):
+ os.makedirs(tgt)
return lambda: shutil.copystat(src, tgt)
@@ -210,15 +230,14 @@ def preprocess(srcdir, tgtdir):
]
assert os.path.isdir(srcdir)
- assert not os.path.exists(tgtdir)
+# assert not os.path.exists(tgtdir)
todo = []
for pathname in find_relative(srcdir):
src = make_absolute(srcdir, pathname)
tgt = make_absolute(tgtdir, pathname)
-
for func, callback in preprocessors:
if func(src):
- do = callback(src, tgt)
+ do = callback(srcdir, tgtdir, pathname)
if do is not None:
todo.append(do)