#!/usr/bin/env python
# -*- coding: UTF-8 -*-
#
# Zusammenfassung der einzelnen Kapitel des Awk-Kurses zu einer HTML-Datei
#
# 3.7.2006
import re, sys, time, cgi
sys.stdout = file('awk.html', 'w')
try:
verbose = sys.argv[1].lower() == '-v'
except:
verbose = 0
print '''
Die Programmiersprache AWK
Die Programmiersprache AWK
Index
'''
# Liste der einzufügenden Kapitel; die Reihenfolge ist relevant
kapitel = [
'allg',
'merkmale',
'beispiele',
'links',
]
# ein File (AWK-Quelltext) einlesen und in einer -Umgebung setzen; jede
# Zeile wird eingerückt und mit cgi.escape() kodiert; Kommentare werden der
# CSS-Klasse comment zugeordnet
def read_file(file_name):
result = ['']
for line in file('CODE/' + file_name):
line = ' ' + cgi.escape(line)
if ' #' in line:
# Leerzeichen gefolgt von Doppelkreuz vorhanden
# das werten wir als Kommentar; diese primitive Implementierung ist nicht
# allgemeingültig, reicht für uns aber aus
line = re.sub(r'(?i)(#[^#]*)$', r'', line)
# lange Strings, die in """ eingeschlossen sind, färben wir wie Kommentare
result.append(line)
result.append('')
return ''.join(result)
# Include-Direktiven der Form #include(filename) auflösen
def include_files(line_list):
for i in range(len(line_list)):
line = line_list[i]
m = re.search(r'(?i)#include\s*\(([^)]+)\)', line)
if m:
line_list[i] = line[:m.start()] + read_file(m.group(1)) + line[m.end():]
return line_list
# Dictionary der Kapitel-Inhalte
inhalte = {}
# Index ausgeben
# alle Kapitel durchgehen
kap_nr = 0
for kap in kapitel:
# Kapitel-Nummer hochzählen
kap_nr += 1
# Kapitel-Datei einlesen
text = file('%s.html' % kap).readlines()
# aus Zeile 1 die Überschrift und die Referenz darauf entnehmen
m = re.search(r'(?is)^(.+?)', text[0])
ref = m.group(1)
ueberschrift = m.group(2)
# Inhalt merken; dann brauchen wir jedes File nur 1 Mal lesen;
# wir fügen in die Überschrift noch die Kapitel-Nummer ein
text[0] = re.sub(r'(?is)^', r'\g<0>%s. ' % kap_nr, text[0])
inhalte[kap] = text
# Index-Zeile ausgeben
print '- %s
' % (ref, ueberschrift)
# Ende Index
print '
'
# Kapitel-Texte zu einem Gesamt-Text zusammenfügen
text_ges = ''
for kap in kapitel:
text_ges += '
\n\n' + ''.join(include_files(inhalte[kap]))
#file('text_ges.txt', 'w').write(text_ges)
# Anker-Namen suchen und zusammen mit den zugehörigen Texten in einem Dictionary
# ablegen
all_names = re.findall(r'(?is)(.*?)', text_ges)
name_dict = {}
for name, text in all_names:
if name in name_dict:
print >>sys.stderr, 'Anker %s ist nicht eindeutig!' % name
else:
name_dict[name] = text
#file('name_dict.txt', 'w').write(`name_dict`)
# Bezugnahemen auf lokale Anker-Namen suchen und zusammen mit den zugehörigen
# Texten in einem Dictionary ablegen
all_refs = re.findall(r'(?is)(.*?)', text_ges)
ref_dict = {}
for name, text in all_refs:
if verbose and name in ref_dict and ref_dict[name] != text:
print >>sys.stderr, 'differierender Referenz-Text: %s: %s / %s' % (name, ref_dict[name], text)
else:
ref_dict[name] = text
#file('ref_dict.txt', 'w').write(`ref_dict`)
# prüfen, ob Referenzen ins Leere gehen, und Texte von Bezugnahmen ggf.
# korrigieren
for name in ref_dict:
if name not in name_dict:
print >>sys.stderr, 'ungültige Referenz: %s / %s' % (name, ref_dict[name])
continue
if ref_dict[name] != name_dict[name]:
# Abweichung der Texte melden
if verbose:
print >>sys.stderr, 'Korrektur?: %s: %s --> %s' % (name, ref_dict[name], name_dict[name])
# Korrektur ggf. vornehmen
#text_ges = re.sub(r'(?<=href=)("?#%s"?\s*?>)(.*?)(?=)' % name, r'\1' + name_dict[name], text_ges)
# Gesamt-Text ausgeben
print text_ges
print '''
Holger Trapp
letzte Modifikation: %s
''' % time.strftime('%d.%m.%Y', time.localtime(time.time()))