#! /usr/bin/env python import sys; import os; class Reader(): def __init__(self, suffix, stp): self.suffix = suffix; self._stop = stp; # def checkOk(self, pathname): for suffix in self.suffix: if pathname.endswith(suffix): return True; return False; def read(self, pathname): f = open(pathname, 'r'); input_string = f.read(); f.close(); return self.getOutputString(input_string); def getOutputString(self, input_string): return '' def stop(self): return self._stop; # class AsciidocReader(Reader): def __init__(self): Reader.__init__(self, ['.asciidoc', '.adoc', '.ascii', ], True); def getOutputString(self, input_string): return input_string; # class InReader(Reader): def __init__(self, suffix, start_string, end_string): Reader.__init__(self, suffix, False); self.start_string = start_string; self. end_string = end_string; def getOutputString(self, input_string): start_index = 0; ret = '' while True: start = input_string.find(self.start_string, start_index); if start == -1: break; end = input_string.find(self.end_string, start + len(self.start_string)); if end == -1: break; start_index = end + len(self.end_string); ret += input_string[start + len(self.start_string) : end]; index = 0; while index < len(ret): if index == 0 or ret[index - 1] == "\n": if ret[index] == ' ' or ret == "\t": ret = ret[:index] + ret[index + 1:]; else: index += 1; else: index += 1; return ret; # class InLineReader(Reader): def __init__(self, suffix, prefix): Reader.__init__(self, suffix, False); self.prefix = prefix; def getOutputString(self, input_string): ret = ''; line_begin = 0; while line_begin < len(input_string): line_end = line_begin; for line_end in range(line_begin, len(input_string) + 1): if input_string[line_end] == "\n": break; ok = False; for i in range(line_begin, line_end - len(self.prefix) + 1): if input_string[i : i + len(self.prefix)] == self.prefix: ok = True; break; if ok: start = i + len(self.prefix); while start < line_end: if input_string[start]!=' ' and input_string[start]!="\t": break; start += 1; ret += input_string[start: line_end].replace('\\', " +\n")+"\n"; line_begin = line_end + 1; return ret; # class CppReader(InReader): def __init__(self): InReader.__init__(self, ['.c', '.cpp', '.h', '.hpp'], '@asciidoc', '@asciidoc-'); class CppLineReader(InLineReader): def __init__(self): InLineReader.__init__(self, ['.c', '.cpp', '.h', '.hpp'], '//#'); # readers = [AsciidocReader(), CppReader(), CppLineReader(), ]; if len(sys.argv) <= 1: readme = 'README.asciidoc'; else : readme = sys.argv[1]; readme_f = open(readme, 'w'); footer_n = 'footer'; footer_lst = []; for (root, sub_folders, files) in os.walk('./'): for reader in readers: deleted = [] tmp1 = []; tmp2 = []; for filename in files: if filename.find(footer_n) == -1: tmp1.append(filename); else: if not os.path.join(root, filename) in footer_lst: footer_lst.append(os.path.join(root, filename)); files = tmp1; for filename in files: path = os.path.join(root, filename); if path == './' + readme: continue; if reader.checkOk(filename): s = reader.read(path); if len(s) > 0: print 'Get asciidoc from ' + path; readme_f.write(s); if reader.stop(): deleted.append(filename); for filename in deleted: files.remove(filename); for reader in readers: deleted = []; for path in footer_lst: if path == './' + readme: continue; if reader.checkOk(path): s = reader.read(path); if len(s) > 0: print 'Get asciidoc from ' + path; readme_f.write(s); if reader.stop(): deleted.append(path); for filename in deleted: footer_lst.remove(filename); readme_f.close();