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']include_attribs = ['title', 'alt', 'longdesc']exclude_dirs = ('.AppleDouble', '.svn', 'CVS', '_darcs')gettext_re = re.compile(r"_\(((?:'[^']*')|(?:\"[^\"]*\"))\)")def lang_extract(potfile, dirname, fileglob='*.html', template_class=None): fd = open(potfile, 'at+') known_keys = set() try: for fname, tag, key in extract_keys(_matching_files(dirname, fileglob), ['.'], template_class): if key in known_keys: continue known_keys.add(key) 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) 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 for tagname, key in extract_from_template(template, keys): yield fname, tagname, keydef extract_from_template(template, search_text=True): return extract_from_stream(template.stream, search_text)def extract_from_stream(stream, search_text=True): stream = iter(stream) tagname = None for kind, data, pos in stream: if kind is START: tag, attrs = data tagname = tag.localname if tagname in ignore_tags: stream.next() # skip the substream continue for name, value in attrs: if isinstance(value, basestring): if search_text and name in include_attribs: yield tagname, value else: for _, key in extract_from_stream(value, name in include_attribs): yield tagname, key elif kind is EXPR: for key in gettext_re.findall(data.source): key = key[1:-1] if key: yield tagname, key elif kind is TEXT and search_text: key = data.strip() if key: yield tagname, keyif __name__ == '__main__': pass