1   
  2  r""" 
  3  :Copyright: 
  4   
  5   Copyright 2006 - 2015 
  6   Andr\xe9 Malo or his licensors, as applicable 
  7   
  8  :License: 
  9   
 10   Licensed under the Apache License, Version 2.0 (the "License"); 
 11   you may not use this file except in compliance with the License. 
 12   You may obtain a copy of the License at 
 13   
 14       http://www.apache.org/licenses/LICENSE-2.0 
 15   
 16   Unless required by applicable law or agreed to in writing, software 
 17   distributed under the License is distributed on an "AS IS" BASIS, 
 18   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
 19   See the License for the specific language governing permissions and 
 20   limitations under the License. 
 21   
 22  ================ 
 23   DTD Collection 
 24  ================ 
 25   
 26  This module provides a collection of DTD query classes to be used with 
 27  the soup parser. 
 28  """ 
 29  if __doc__: 
 30       
 31      __doc__ = __doc__.encode('ascii').decode('unicode_escape') 
 32  __author__ = r"Andr\xe9 Malo".encode('ascii').decode('unicode_escape') 
 33  __docformat__ = "restructuredtext en" 
 34   
 35  from ... import interfaces as _interfaces 
 36   
 37   
 39      """ 
 40      Query class for the HTML DTD 
 41   
 42      :IVariables: 
 43        `_cdata` : ``dict`` 
 44          Dict of CDATA elements (for speed lookup) 
 45   
 46        `_optional` : ``dict`` 
 47          Dict of optional elements (for speed lookup) 
 48   
 49        `_empty` : ``dict`` 
 50          Dict of empty elements (for speed lookup) 
 51      """ 
 52      __implements__ = [_interfaces.DTDInterface] 
 53   
 54       
 55       
 56       
 57      _EMPTY = ('app', 'area', 'base', 'basefont', 'bgsound', 'br', 'col', 
 58                'command', 'embed', 'frame', 'hr', 'img', 'input', 'isindex', 
 59                'keygen', 'link', 'meta', 'nextid', 'param', 'sound', 'source', 
 60                'spacer', 'track', 'wbr') 
 61   
 62       
 63       
 64       
 65       
 66       
 67       
 68       
 69      _CDATA = ('listing', 'plaintext', 'script', 'style', 'textarea', 'xmp') 
 70   
 71       
 72      _intable = ('caption', 'col', 'colgroup', 'tbody', 'thead', 'tfoot') 
 73   
 74       
 75       
 76       
 77       
 78      _OPTIONAL = tuple({ 
 79           
 80   
 81          'html':     ('html',), 
 82          'head':     ('html', 'body', 'head',), 
 83          'body':     ('html', 'body', 'head',), 
 84          'li':       ('li',), 
 85          'dt':       ('dt', 'dd',), 
 86          'dd':       ('dt', 'dd',), 
 87          'p':        ('address', 'article', 'aside', 'blockquote', 'body', 
 88                       'dd', 'dir', 'div', 'dl', 'dt', 'fieldset', 'footer', 
 89                       'form', 'frame', 'frameset', 'h1', 'h2', 'h3', 'h4', 
 90                       'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 
 91                       'isindex', 'layer', 'li', 'listing', 'map', 'marquee', 
 92                       'menu', 'multicol', 'nav', 'noframes', 'ol', 'p', 
 93                       'plaintext', 'pre', 'section', 'table', 'td', 'th', 
 94                       'tr', 'ul', 'xmp') + _intable, 
 95          'rt':       ('rt', 'rp',), 
 96          'rp':       ('rt', 'rp',), 
 97          'optgroup': ('optgroup',), 
 98          'option':   ('option', 'optgroup',), 
 99          'colgroup': _intable + ('td', 'th', 'tr',), 
100          'caption':  _intable + ('td', 'th', 'tr',), 
101          'thead':    _intable, 
102          'tbody':    _intable, 
103          'tfoot':    _intable, 
104          'tr':       _intable + ('tr',), 
105          'td':       _intable + ('td', 'th', 'tr',), 
106          'th':       _intable + ('td', 'th', 'tr',), 
107      }.items()) 
108      del _intable 
109   
111          """ Initialization """ 
112          dict_ = dict 
113          optional = dict_([ 
114              (name, dict_([ 
115                  (item, None) for item in forbidden 
116              ]).__contains__) 
117              for name, forbidden in self._OPTIONAL 
118          ]).get 
119          if self.__class__ == HTMLDTD: 
120              self.cdata = dict_([ 
121                  (item, None) for item in self._CDATA 
122              ]).__contains__ 
123              self.empty = empty = dict_([ 
124                  (item, None) for item in self._EMPTY 
125              ]).__contains__ 
126   
127              def nestable(outer, inner): 
128                  """ :See: `tdi.interfaces.DTDInterface.nestable` """ 
129                  opt = optional(outer) 
130                  if opt is not None: 
131                      return not opt(inner) 
132                  elif empty(outer): 
133                      return False 
134                  return True 
 135              self.nestable = nestable 
136          else: 
137              self._empty = dict_([ 
138                  (item, None) for item in self._EMPTY 
139              ]).__contains__ 
140              self._cdata = dict_([ 
141                  (item, None) for item in self._CDATA 
142              ]).__contains__ 
143              self._optional = optional 
 144   
146          """ :See: `tdi.interfaces.DTDInterface.cdata` """ 
147           
148   
149          return self._cdata(name) 
 150   
152          """ :See: `tdi.interfaces.DTDInterface.nestable` """ 
153           
154   
155          opt = self._optional(outer) 
156          if opt is not None: 
157              return not opt(inner) 
158          elif self._empty(outer): 
159              return False 
160   
161          return True 
 162   
164          """ :See: `tdi.interfaces.DTDInterface.empty` """ 
165           
166   
167          return self._empty(name) 
 168   
169   
171      """ 
172      XML DTD query class 
173   
174      This class effectively defines every wellformed XML valid. 
175      """ 
176      __implements__ = [_interfaces.DTDInterface] 
177   
178       
179   
181          """ :See: `DTDInterface` """ 
182          return False 
 183   
185          """ :See: `DTDInterface` """ 
186          return True 
 187   
189          """ :See: `DTDInterface` """ 
190          return False 
  191