home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2011 February / maximum-cd-2011-02.iso / DiscContents / digsby_setup85.exe / lib / gui / infobox / providers.pyo (.txt) < prev   
Encoding:
Python Compiled Bytecode  |  2010-11-24  |  8.7 KB  |  266 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.6)
  3.  
  4. import protocols
  5. import gui.skin as gui
  6. import path
  7. import hooks
  8. import time
  9. import stdpaths
  10. import gui.infobox.interfaces as gui_interfaces
  11. from traceback import print_exc
  12. from util.introspect import memoize
  13. import logging
  14. log = logging.getLogger('infobox.providers')
  15.  
  16. class FileContext(object):
  17.     resdirs = { }
  18.     
  19.     def __init__(self, basepath, name):
  20.         self._context_dirs = { }
  21.         self.name = name
  22.         self.base = path.path(basepath).abspath()
  23.  
  24.     
  25.     def resource(self, resname, context = 'base'):
  26.         for path in hooks.each('infobox.content.resource', resname):
  27.             if path is not None:
  28.                 return path
  29.         
  30.         dir = self.get_res_dir(context)
  31.         file = dir / resname
  32.         return file.abspath()
  33.  
  34.     
  35.     def resourceurl(self, resname, context = 'base'):
  36.         return self.resource(resname, context).url()
  37.  
  38.     
  39.     def get_res_dir(self, context):
  40.         return self.get_dir(context)
  41.  
  42.     
  43.     def get_dir(self, context):
  44.         if context == 'base':
  45.             pth = self.base
  46.         elif context == 'local':
  47.             pth = stdpaths.config
  48.         elif context == 'user':
  49.             pth = stdpaths.userdata
  50.         else:
  51.             pth = self._context_dirs[context]
  52.         return pth / self.name
  53.  
  54.     
  55.     def add_file_context(self, context, dir):
  56.         path_dir = path.path(dir)
  57.         self._context_dirs[context] = path_dir
  58.  
  59.  
  60.  
  61. class AppFileContext(FileContext):
  62.     
  63.     def get_res_dir(self, context):
  64.         return FileContext.get_res_dir(self, context) / self.resdirs.get(context, 'res')
  65.  
  66.  
  67. template_engine = 'tenjin'
  68. if template_engine == 'mako':
  69.     
  70.     class MakoTemplate(object):
  71.         
  72.         def __init__(self, dir, fname):
  73.             self.dir = dir
  74.             self.fname = fname
  75.  
  76.         
  77.         def generate(self, **context):
  78.             self.context = context
  79.             return self
  80.  
  81.         
  82.         def get_template(self, fname):
  83.             import mako.lookup as L
  84.             import mako.template as T
  85.             dirs = [
  86.                 str(self.dir)]
  87.             lookup = L.TemplateLookup(directories = dirs)
  88.             if not fname:
  89.                 pass
  90.             return lookup.get_template(self.fname)
  91.  
  92.         
  93.         def render(self, **kwds):
  94.             return self.get_template(self.fname).render_unicode(**self.context)
  95.  
  96.  
  97. elif template_engine == 'tenjin':
  98.     import tenjin
  99.     
  100.     class SafeIncludeEngine(tenjin.Engine):
  101.         
  102.         def include(self, template_name, *a, **k):
  103.             import sys
  104.             if isinstance(template_name, bytes):
  105.                 
  106.                 try:
  107.                     template_name = template_name.decode('utf8')
  108.                 except UnicodeDecodeError:
  109.                     template_name = template_name.decode('filesys')
  110.  
  111.                 template_name = template_name.encode('filesys')
  112.             
  113.             frame = sys._getframe(1)
  114.             locals = frame.f_locals
  115.             globals = frame.f_globals
  116.             _context = locals['_context']
  117.             _buf = locals.get('_buf', None)
  118.             
  119.             try:
  120.                 return tenjin.Engine.include(self, template_name, *a, **k)
  121.             except IOError:
  122.                 e = None
  123.                 log.error('error performing tenjin include: template_name = %r, a = %r, k = %r, e = %r', template_name, a, k, e)
  124.                 return ''
  125.  
  126.  
  127.  
  128.     
  129.     class TenjinTemplate(object):
  130.         e = None
  131.         
  132.         def __init__(self, dir, fname):
  133.             self.dir = dir
  134.             self.fname = fname
  135.  
  136.         
  137.         def generate(self, **context):
  138.             self.context = context
  139.             return self
  140.  
  141.         
  142.         def render(self, **kwds):
  143.             import tenjin
  144.             import tenjin.helpers as tenjin
  145.             if not self.e:
  146.                 self.e = SafeIncludeEngine(preprocess = True, cache = None)
  147.             
  148.             self.context.update(vars(tenjin.helpers))
  149.             p = self.dir / self.fname
  150.             
  151.             try:
  152.                 return self.e.render(p.encode('filesys'), self.context)
  153.             except IOError:
  154.                 print 'Error loading: %r' % unicode(p)
  155.                 return ''
  156.  
  157.  
  158.  
  159.     
  160.     def get_tenjin_template(dir, file):
  161.         return TenjinTemplate(dir, file)
  162.  
  163.  
  164.  
  165. class InfoboxProviderBase(object):
  166.     javascript_libs = [
  167.         'jquery',
  168.         'jquery.hotkeys',
  169.         'jquery.fullsize',
  170.         'jquery.lightbox',
  171.         'jquery.jgrow-singleline',
  172.         'json',
  173.         'dateformat',
  174.         'utils']
  175.     protocols.advise(instancesProvide = [
  176.         gui_interfaces.ICacheableInfoboxHTMLProvider])
  177.     
  178.     def get_html(self, *a, **k):
  179.         
  180.         try:
  181.             context = self.get_context()
  182.             context.update(k.get('context', { }))
  183.             self.load_files(context)
  184.             a = time.clock()
  185.             stream = self.get_template(file = k.get('file'), loader = k.get('loader'), dir = k.get('dir')).generate(**context)
  186.             ret = stream.render(method = 'xhtml', strip_whitespace = context.get('strip_whitespace', True))
  187.             if hasattr(self, 'acct'):
  188.                 b = time.clock()
  189.                 self.acct.last_gen_time = b - a
  190.             
  191.             return ret
  192.         except Exception:
  193.             print_exc()
  194.             raise 
  195.  
  196.  
  197.     
  198.     def load_files(self, context):
  199.         self.platform = context.get('platform')
  200.         self.lib = context.get('lib')
  201.         self.app = context.get('app')
  202.  
  203.     if template_engine == 'mako':
  204.         
  205.         def get_template(self, file = None, loader = None, dir = None):
  206.             if not dir:
  207.                 pass
  208.             if not file:
  209.                 pass
  210.             return MakoTemplate(self.get_dir(), 'infobox.mako')
  211.  
  212.     elif template_engine == 'tenjin':
  213.         
  214.         def get_template(self, file = None, loader = None, dir = None):
  215.             if not dir:
  216.                 pass
  217.             dir = self.get_dir()
  218.             if not file:
  219.                 pass
  220.             file = 'infobox.tenjin'
  221.             return get_tenjin_template(dir, file)
  222.  
  223.     elif template_engine == 'genshi':
  224.         
  225.         def get_template(self, file = None, loader = None, dir = None):
  226.             if not dir:
  227.                 pass
  228.             dir = self.get_dir()
  229.             if not loader:
  230.                 pass
  231.             loader = self.get_loader(dir)
  232.             if not file:
  233.                 pass
  234.             return loader.load('infobox.xml')
  235.  
  236.     
  237.     
  238.     def get_dir(self):
  239.         if self.platform is None:
  240.             dir = path.path('.').abspath()
  241.         else:
  242.             dir = self.platform.get_res_dir('base')
  243.         return dir
  244.  
  245.     
  246.     def get_loader(self, dir = None):
  247.         if dir is None:
  248.             dir = self.get_dir()
  249.         
  250.         TemplateLoader = TemplateLoader
  251.         import genshi.template
  252.         loader = TemplateLoader(dir)
  253.         return loader
  254.  
  255.     
  256.     def get_context(self):
  257.         import util
  258.         platform = FileContext(gui.skin.resourcedir() / 'html', 'infobox')
  259.         lib = FileContext(gui.skin.resourcedir(), 'html')
  260.         app = self.get_app_context(AppFileContext)
  261.         ctx = dict(app = app, lib = lib, platform = platform, gui = gui, util = util, javascript_libs = self.javascript_libs)
  262.         hooks.notify('infobox.content.context', ctx, getattr(self, 'acct', None))
  263.         return ctx
  264.  
  265.  
  266.