src/pyams_skin/metas.py
changeset 513 39d19a6997e5
parent 507 1c7bd4ccfb32
child 516 f4bd4666c8d2
equal deleted inserted replaced
512:be497ced7ca2 513:39d19a6997e5
     9 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
     9 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
    10 # FOR A PARTICULAR PURPOSE.
    10 # FOR A PARTICULAR PURPOSE.
    11 #
    11 #
    12 
    12 
    13 __docformat__ = 'restructuredtext'
    13 __docformat__ = 'restructuredtext'
       
    14 
       
    15 from html import escape
    14 
    16 
    15 from pyramid.interfaces import IRequest
    17 from pyramid.interfaces import IRequest
    16 from zope.interface import Interface, implementer
    18 from zope.interface import Interface, implementer
    17 
    19 
    18 from pyams_i18n.interfaces import II18n
    20 from pyams_i18n.interfaces import II18n
    45 
    47 
    46 #
    48 #
    47 # Custom metas headers
    49 # Custom metas headers
    48 #
    50 #
    49 
    51 
       
    52 def escape_value(value):
       
    53     return escape(value) if isinstance(value, str) else value
       
    54 
       
    55 
    50 @implementer(IMetaHeader)
    56 @implementer(IMetaHeader)
    51 class HTMLTagMeta(object):
    57 class HTMLTagMeta(object):
    52     """HTML tag meta header"""
    58     """HTML tag meta header"""
    53 
    59 
    54     def __init__(self, tag, content, **attrs):
    60     def __init__(self, tag, content, **attrs):
    55         self.tag = tag
    61         self.tag = tag
    56         self.content = content
    62         self.content = escape_value(content)
    57         self.attrs = attrs
    63         self.attrs = attrs
    58 
    64 
    59     def render(self):
    65     def render(self):
    60         return '''<{tag} {attrs}>{content}</{tag}>'''.format(tag=self.tag,
    66         return '''<{tag} {attrs}>{content}</{tag}>'''.format(tag=self.tag,
    61                                                              attrs=' '.join(('{0}="{1}"'.format(*value) for value in
    67                                                              attrs=' '.join(('{0}="{1}"'.format(*value) for value in
    67 class HTTPEquivMeta(object):
    73 class HTTPEquivMeta(object):
    68     """HTTP-Equiv meta header"""
    74     """HTTP-Equiv meta header"""
    69 
    75 
    70     def __init__(self, http_equiv, value):
    76     def __init__(self, http_equiv, value):
    71         self.http_equiv = http_equiv
    77         self.http_equiv = http_equiv
    72         self.value = value
    78         self.value = escape_value(value)
    73 
    79 
    74     def render(self):
    80     def render(self):
    75         return '''<meta http-equiv="{http_equiv}" content="{value}" />'''.format(http_equiv=self.http_equiv,
    81         return '''<meta http-equiv="{http_equiv}" content="{value}" />'''.format(http_equiv=self.http_equiv,
    76                                                                                  value=self.value)
    82                                                                                  value=self.value)
    77 
    83 
    80 class ValueMeta(object):
    86 class ValueMeta(object):
    81     """Basic value meta header"""
    87     """Basic value meta header"""
    82 
    88 
    83     def __init__(self, name, value):
    89     def __init__(self, name, value):
    84         self.name = name
    90         self.name = name
    85         self.value = value
    91         self.value = escape_value(value)
    86 
    92 
    87     def render(self):
    93     def render(self):
    88         return '''<meta {name}="{value}" />'''.format(name=self.name,
    94         return '''<meta {name}="{value}" />'''.format(name=self.name,
    89                                                       value=self.value)
    95                                                       value=self.value)
    90 
    96 
    93 class ContentMeta(object):
    99 class ContentMeta(object):
    94     """Content meta header"""
   100     """Content meta header"""
    95 
   101 
    96     def __init__(self, name, value):
   102     def __init__(self, name, value):
    97         self.name = name
   103         self.name = name
    98         self.value = value
   104         self.value = escape_value(value)
    99 
   105 
   100     def render(self):
   106     def render(self):
   101         return '''<meta name="{name}" content="{value}" />'''.format(name=self.name,
   107         return '''<meta name="{name}" content="{value}" />'''.format(name=self.name,
   102                                                                      value=self.value)
   108                                                                      value=self.value)
   103 
   109 
   106 class PropertyMeta(object):
   112 class PropertyMeta(object):
   107     """Property meta header"""
   113     """Property meta header"""
   108 
   114 
   109     def __init__(self, property, value):
   115     def __init__(self, property, value):
   110         self.property = property
   116         self.property = property
   111         self.value = value
   117         self.value = escape_value(value)
   112 
   118 
   113     def render(self):
   119     def render(self):
   114         return '''<meta property="{property}" content="{value}" />'''.format(property=self.property,
   120         return '''<meta property="{property}" content="{value}" />'''.format(property=self.property,
   115                                                                              value=self.value)
   121                                                                              value=self.value)
   116 
   122 
   119 class SchemaMeta(object):
   125 class SchemaMeta(object):
   120     """Schema.org property meta header"""
   126     """Schema.org property meta header"""
   121 
   127 
   122     def __init__(self, name, value):
   128     def __init__(self, name, value):
   123         self.name = name
   129         self.name = name
   124         self.value = value
   130         self.value = escape_value(value)
   125 
   131 
   126     def render(self):
   132     def render(self):
   127         return '''<meta itemprop="{name}" content="{value}" />'''.format(name=self.name,
   133         return '''<meta itemprop="{name}" content="{value}" />'''.format(name=self.name,
   128                                                                          value=self.value)
   134                                                                          value=self.value)
   129 
   135 
   133     """Link meta header"""
   139     """Link meta header"""
   134 
   140 
   135     def __init__(self, rel, type, href):
   141     def __init__(self, rel, type, href):
   136         self.rel = rel
   142         self.rel = rel
   137         self.type = type
   143         self.type = type
   138         self.href = href
   144         self.href = escape_value(href)
   139 
   145 
   140     def render(self):
   146     def render(self):
   141         return '''<link rel="{rel}" type="{type}" href="{href}" />'''.format(rel=self.rel,
   147         return '''<link rel="{rel}" type="{type}" href="{href}" />'''.format(rel=self.rel,
   142                                                                              type=self.type,
   148                                                                              type=self.type,
   143                                                                              href=self.href)
   149                                                                              href=self.href)