All pastes #181309 Raw Edit

Python

public python v1 · immutable
#181309 ·published 2006-09-24 20:01 UTC
rendered paste body
import 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