home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyo (Python 2.6)
-
- from __future__ import with_statement
- from traceback import print_exc
- from util import Storage as S, odict
- from util.xml_tag import tag
- from util.plistutil import plisttype_to_pytype
- from collections import defaultdict
- from PIL import Image
- from os.path import getmtime
- import re
- from logging import getLogger
- log = getLogger('emoticons')
- DEFAULT_PACK = u'MSN Messenger'
-
- def _default_emoticon_pack():
- import common
- return common.pref('appearance.conversations.emoticons.pack', type = unicode, default = DEFAULT_PACK)
-
-
- class EmoticonPack(object):
- emoticon_loaders = []
-
- def __repr__(self):
- return '<%s %r from %r>' % (type(self).__name__, self.name, self.path)
-
-
- def __init__(self, path):
- self.path = path
- self.name = None
- self.emoticons = None
- self.bitmaps = None
-
-
- def register_loader(cls, loader):
- cls.emoticon_loaders.append(loader)
-
- register_loader = classmethod(register_loader)
-
- def is_emoticon_dir(cls, path):
- loader = cls.get_loader(path)
- return loader is not None
-
- is_emoticon_dir = classmethod(is_emoticon_dir)
-
- def get_loader(cls, path):
- for loader in cls.emoticon_loaders:
- if loader.is_emoticon_dir(path):
- return loader
-
-
- get_loader = classmethod(get_loader)
-
- def load(self):
- raise NotImplementedError
-
-
- def post_load(self):
- for key in list(self.emoticons.keys()):
- self.emoticons[key.encode('xml')] = self.emoticons[key]
-
- emotitems = sorted(self.emoticons.items(), key = (lambda e: len(e[0])), reverse = True)
- smiley_regex = '|'.join((lambda .0: for smiley, _EmoticonPack__emoticon in .0:
- '(?:%s)' % re.escape(smiley))(emotitems))
- patterns = [
- '(?:^|\\s)(%s)(?:\\s|$)']
- compiled_patterns = [ re.compile(r % smiley_regex, re.MULTILINE) for r in patterns ]
- self.patterns = compiled_patterns
-
-
- DigsbyEmoticonPack = EmoticonPack.register_loader(<NODE:12>)
- PidginEmoticonPack = EmoticonPack.register_loader(<NODE:12>)
- AdiumPlistEmoticonPack = EmoticonPack.register_loader(<NODE:12>)
- AdiumFilesysEmoticonPack = EmoticonPack.register_loader(<NODE:12>)
-
- def get_emoticon_dirs():
- import stdpaths
- dirs = []
- emotidir = 'emoticons'
- for dir in (stdpaths.userdata, stdpaths.config, resdir()):
- pth = dir / emotidir
-
- try:
- if not pth.isdir():
- pth.makedirs()
- except Exception:
- print_exc()
- continue
-
- dirs.append(pth)
-
- return dirs
-
-
- def load_emoticons(emoticon_pack = None):
- if emoticon_pack is None:
- emoticon_pack = _default_emoticon_pack()
-
- log.info('load_emoticons: %s', emoticon_pack)
- emoticons = None
- for emoticon_dir in get_emoticon_dirs():
- emoticon_packdir = emoticon_dir / emoticon_pack
- loader = EmoticonPack.get_loader(emoticon_packdir)
- if loader is not None:
- pack = loader(emoticon_packdir)
- pack.load()
- return pack
-
- log.info('emoticon pack %r could not be found', emoticon_pack)
-
- _emoticons = sentinel
- _emoticons_pack = sentinel
-
- def first_non_none(seq):
- for i, elem in enumerate(seq):
- if elem is not None:
- return i
-
- raise AssertionError
-
-
- def repl(emoticons):
-
- def _repl(m, e = emoticons):
- (x, y) = m.span()
- (i, j) = m.span(1)
- s = m.string
- emot = e[s[i:j]]
- size = imgsize(emot.path)
- emottext = s[i:j].encode('xml')
- replacement = '<img src="%s" width="%d" height="%d" alt="%s" title="%s" />' % (emot.path.url(), size[0], size[1], emottext, emottext)
- return ''.join([
- s[x:i],
- replacement,
- s[j:y]])
-
- return _repl
-
-
- def load_pack(emoticon_pack):
- global _emoticons, _emoticons_pack
- if emoticon_pack is None:
- emoticon_pack = _default_emoticon_pack()
-
- if not isinstance(emoticon_pack, basestring):
- raise TypeError('emoticon_pack must be a string')
- isinstance(emoticon_pack, basestring)
- if _emoticons is sentinel or emoticon_pack != _emoticons_pack:
- _emoticons = load_emoticons(emoticon_pack)
- _emoticons_pack = emoticon_pack
-
- return _emoticons
-
-
- def apply_emoticons(s, emoticon_pack = None):
- load_pack(emoticon_pack)
- if _emoticons is None:
- return s
- for p in _emoticons.patterns:
- s = p.sub(repl(_emoticons.emoticons), s)
- s = p.sub(repl(_emoticons.emoticons), s)
-
- return s
-
-
- def get_emoticon_bitmaps(emoticon_pack = None):
- if emoticon_pack is None:
- emoticon_pack = _default_emoticon_pack()
-
- load_pack(emoticon_pack)
- return list(_emoticons.bitmaps.items())
-
-
- def findsets():
- sets = []
- for d in get_emoticon_dirs():
- for subdir in d.dirs():
- if EmoticonPack.is_emoticon_dir(subdir):
- pack = EmoticonPack.get_loader(subdir)(subdir)
- pack.load()
- sets.append(pack)
- log.info('discovered emoticon directory: %r', subdir)
- continue
-
-
- log.info('all found emoticon sets: %r', sets)
- return sets
-
-
- def imgsize(p, _cache = { }):
- key = (p, getmtime(p))
-
- try:
- return _cache[key]
- except KeyError:
- size = Image.open(p).size
- return _cache.setdefault(key, size)
-
-
- if __name__ == '__main__':
- from path import path
-
- def resdir():
- return path('../../../res')
-
- else:
-
- def resdir():
- skin = skin
- import gui
- return skin.resourcedir()
-
- if __name__ == '__main__':
- print load_emoticons_pidgin(path('../../../res/emoticons/sa'))
-
-