#! /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()