#!/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'\1', 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 '
  1. %s
  2. ' % (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()))