# # # add_file "fdo/sharedmimeinfo.py" # content [3ad1340a4e407bd33fbdf113a8a40be5e642be88] # # set "fdo/sharedmimeinfo.py" # attr "mtn:execute" # value "true" # ============================================================ --- fdo/sharedmimeinfo.py 3ad1340a4e407bd33fbdf113a8a40be5e642be88 +++ fdo/sharedmimeinfo.py 3ad1340a4e407bd33fbdf113a8a40be5e642be88 @@ -0,0 +1,78 @@ +#!/usr/bin/env python2.4 + +import xdgbasedir +import os, re, sys, fnmatch + +def mime(): + return [os.path.join(t, 'mime') for t in xdgbasedir.xdg_data_dirs()] + +class GlobLookup(object): + def __init__(self): + self.literal = {} + self.complex = {} + self.extensions = {} + mime_dirs = mime() + for precedence, dir in enumerate(mime_dirs): + mime_file = os.path.join(dir, 'globs') + if os.access(mime_file, os.R_OK): + self.update(precedence, mime_file) + self.complex_by_size = self.complex.keys() + self.complex_by_size.sort(lambda b, a: cmp(len(a), len(b))) + + def update(self, precedence, filename): + print "** loading mime file", filename + literal = re.compile(r'^[^\[\*\?]+$') + simple_glob = re.compile(r'^\*\.([^\[\*\?]+)$') + for line in (t.rstrip('\n') for t in open(filename)): + if line.startswith('#'): + continue + mimetype, glob = line.split(':') + if literal.match(glob): + self.add_literal(precedence, glob, mimetype) + continue + m = simple_glob.match(glob) + if m: + self.add_extension(precedence, m.groups()[0], mimetype) + else: + self.add_complex(precedence, glob, mimetype) + + def add_literal(self, precedence, glob, mimetype): + self.literal.setdefault(glob, []).append((precedence, mimetype)) + + def add_extension(self, precedence, extension, mimetype): + self.extensions.setdefault(extension, []).append((precedence, mimetype)) + + def add_complex(self, precedence, glob, mimetype): + self.complex.setdefault(glob, []).append((precedence, mimetype)) + + def lookup(self, filename): + # increasing; lower is higher priority + precedence_sort = lambda a,b: cmp(a[0], b[0]) + def best_of(match_list): + match_list.sort(precedence_sort) + return match_list[0][1] + if self.literal.has_key(filename): + return best_of(self.literal[filename]) + for complex in self.complex_by_size: + if fnmatch.fnmatch(filename, complex): + return best_of(self.complex[complex]) + # find potential extensions in filename + def extensions(): + ext = filename + while ext: + idx = ext.find('.') + if idx == -1: + break + ext = ext[idx+1:] + yield ext + for extension in extensions(): + if self.extensions.has_key(extension): + return best_of(self.extensions[extension]) + return None + +if __name__ == '__main__': + a = GlobLookup() + for line in sys.stdin: + line = line.strip() + print line, a.lookup(line) +