rendered paste bodyimport fnmatchimport osimport refrom genshi.core import START, TEXTfrom genshi.input import ParseErrorfrom genshi.template import TemplateLoader, EXPRtry: setexcept NameError: from sets import Set as setignore_tags = ['script', 'style']exclude_dirs = ('.AppleDouble', '.svn', 'CVS', '_darcs')def lang_extract(potfile, dirname, fileglob='*.html', template_class=None): fd = open(potfile, 'at+') try: for fname, tag, key in extract_keys(_matching_files(dirname, fileglob), ['.'], template_class): print >>fd, '#: %s:%s' % (fname, tag) print >>fd, 'msgid %s' % key print >>fd, 'msgstr ""' print >>fd, '' finally: fd.close()def _matching_files(dirname, fileglob): for root, dirs, files in os.walk(dirname): for exclude in exclude_dirs: try: dirs.remove(exclude) except ValueError: pass for fname in fnmatch.filter(files, fileglob): yield os.path.join(root, fname)def extract_keys(files, search_path=None, template_class=None): keys = set() loader = TemplateLoader(search_path) gettext_re = re.compile(r"_\(((?:'[^']*')|(?:\"[^\"]*\"))\)") for fname in files: print 'Scanning: %s' % fname try: if template_class is None: template = loader.load(fname) else: template = loader.load(fname, cls=template_class) except ParseError, e: print 'Skipping %s: %s' % (fname, e) continue stream = iter(template.stream) tag = None for kind, data, pos in stream: if kind is START: tag, attrs = data if tag.localname in ignore_tags: stream.next() # skip the substream elif kind is EXPR: for key in gettext_re.findall(data.source): key = key[1:-1] if key and key not in keys: keys.add(key) yield fname, tag.localname, key elif kind is TEXT: key = data.strip() if key and key not in keys: keys.add(key) yield fname, tag.localname, keyif __name__ == '__main__': pass