src/ztfy/baseskin/metas.py
changeset 0 747fc65e13e2
child 4 7561b24c28c1
equal deleted inserted replaced
-1:000000000000 0:747fc65e13e2
       
     1 ### -*- coding: utf-8 -*- ####################################################
       
     2 ##############################################################################
       
     3 #
       
     4 # Copyright (c) 2012 Thierry Florac <tflorac AT ulthar.net>
       
     5 # All Rights Reserved.
       
     6 #
       
     7 # This software is subject to the provisions of the Zope Public License,
       
     8 # Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
       
     9 # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
       
    10 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
       
    11 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
       
    12 # FOR A PARTICULAR PURPOSE.
       
    13 #
       
    14 ##############################################################################
       
    15 
       
    16 
       
    17 # import standard packages
       
    18 
       
    19 # import Zope3 interfaces
       
    20 
       
    21 # import local interfaces
       
    22 from ztfy.baseskin.interfaces.metas import IContentMetasHeaders, IContentMetaHeader, \
       
    23     IHTTPEquivMetaHeader, IPropertyMetaHeader, \
       
    24     ILinkMetaHeader, IPageMetasHeaders
       
    25 
       
    26 # import Zope3 packages
       
    27 from zope.component import adapts, getAdapters
       
    28 from zope.interface import implements, Interface
       
    29 
       
    30 # import local packages
       
    31 from ztfy.base.interfaces import IBaseContent
       
    32 
       
    33 
       
    34 class ContentMeta(object):
       
    35     """Base content meta header"""
       
    36 
       
    37     implements(IContentMetaHeader)
       
    38 
       
    39     def __init__(self, name, value):
       
    40         self.name = name
       
    41         self.value = value
       
    42 
       
    43     def render(self):
       
    44         return """<meta name="%(name)s" content="%(content)s" />""" % {'name': self.name,
       
    45                                                                        'content': self.value}
       
    46 
       
    47 
       
    48 class HTTPEquivMeta(object):
       
    49     """HTTP-Equiv meta header, mainly used for content-type"""
       
    50 
       
    51     implements(IHTTPEquivMetaHeader)
       
    52 
       
    53     def __init__(self, http_equiv, value):
       
    54         self.http_equiv = http_equiv
       
    55         self.value = value
       
    56 
       
    57     def render(self):
       
    58         return """<meta http-equiv="%(http_equiv)s" content="%(content)s" />""" % {'http_equiv': self.http_equiv,
       
    59                                                                                    'content': self.value}
       
    60 
       
    61 
       
    62 class PropertyMeta(object):
       
    63     """Property meta header, mainly used for Facebook app_id"""
       
    64 
       
    65     implements(IPropertyMetaHeader)
       
    66 
       
    67     def __init__(self, property, value):
       
    68         self.property = property
       
    69         self.value = value
       
    70 
       
    71     def render(self):
       
    72         return """<meta property="%(property)s" content="%(content)s" />""" % {'property': self.property,
       
    73                                                                                'content': self.value}
       
    74 
       
    75 
       
    76 class LinkMeta(object):
       
    77     """Link meta header, mainly used for CSS or RSS links"""
       
    78 
       
    79     implements(ILinkMetaHeader)
       
    80 
       
    81     def __init__(self, rel, type, href):
       
    82         self.rel = rel
       
    83         self.type = type
       
    84         self.href = href
       
    85 
       
    86     def render(self):
       
    87         return """<link rel="%(rel)s" type="%(type)s" href="%(href)s" />""" % {'rel': self.rel,
       
    88                                                                                'type': self.type,
       
    89                                                                                'href': self.href}
       
    90 
       
    91 
       
    92 class ContentMetasAdapter(object):
       
    93     """Generic content metas adapter"""
       
    94 
       
    95     adapts(Interface, Interface)
       
    96     implements(IPageMetasHeaders)
       
    97 
       
    98     def __init__(self, context, request):
       
    99         self.context = context
       
   100         self.request = request
       
   101 
       
   102     @property
       
   103     def metas(self):
       
   104         """Extract headers from all available metas adapters"""
       
   105         result = []
       
   106         for _name, adapter in getAdapters((self.context, self.request), IContentMetasHeaders):
       
   107             result.extend(adapter.metas)
       
   108         return result
       
   109 
       
   110 
       
   111 class BaseContentMetasHeadersAdapter(object):
       
   112     """Base content metas adapter"""
       
   113 
       
   114     adapts(IBaseContent, Interface)
       
   115     implements(IContentMetasHeaders)
       
   116 
       
   117     def __init__(self, context, request):
       
   118         self.context = context
       
   119         self.request = request
       
   120 
       
   121     @property
       
   122     def metas(self):
       
   123         result = []
       
   124         result.append(HTTPEquivMeta('Content-Type', 'text/html; charset=UTF-8'))
       
   125         description = self.context.description
       
   126         if description:
       
   127             result.append(ContentMeta('description', description.replace('\n', ' ')))
       
   128         keywords = self.context.keywords
       
   129         if keywords:
       
   130             result.append(ContentMeta('keywords', keywords))
       
   131         return result