#! /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('./'): files.sort(); sub_folders.sort(); 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 dir_name = '' dirs_ct = 0 for i in range(0, len(root)): if root[i] == '/': dirs_ct += 1 dir_name = root[i + 1:] + '/' if dir_name != '/': readme_f.write('\n'); readme_f.write('=' * (dirs_ct + 2) + ' ' + dir_name); readme_f.write('\n'); 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()