|
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 |