<s> """<STR_LIT>""" <EOL> import re <EOL> _declname_match = re . compile ( r'<STR_LIT>' ) . match <EOL> _declstringlit_match = re . compile ( r'<STR_LIT>' ) . match <EOL> _commentclose = re . compile ( r'<STR_LIT>' ) <EOL> _markedsectionclose = re . compile ( r'<STR_LIT>' ) <EOL> _msmarkedsectionclose = re . compile ( r'<STR_LIT>' ) <EOL> del re <EOL> class ParserBase : <EOL> """<STR_LIT>""" <EOL> def __init__ ( self ) : <EOL> if self . __class__ is ParserBase : <EOL> raise RuntimeError ( <EOL> "<STR_LIT>" ) <EOL> def error ( self , message ) : <EOL> raise NotImplementedError ( <EOL> "<STR_LIT>" ) <EOL> def reset ( self ) : <EOL> self . lineno = <NUM_LIT:1> <EOL> self . offset = <NUM_LIT:0> <EOL> def getpos ( self ) : <EOL> """<STR_LIT>""" <EOL> return self . lineno , self . offset <EOL> def updatepos ( self , i , j ) : <EOL> if i >= j : <EOL> return j <EOL> rawdata = self . rawdata <EOL> nlines = rawdata . count ( "<STR_LIT:\n>" , i , j ) <EOL> if nlines : <EOL> self . lineno = self . lineno + nlines <EOL> pos = rawdata . rindex ( "<STR_LIT:\n>" , i , j ) <EOL> self . offset = j - ( pos + <NUM_LIT:1> ) <EOL> else : <EOL> self . offset = self . offset + j - i <EOL> return j <EOL> _decl_otherchars = '<STR_LIT>' <EOL> def parse_declaration ( self , i ) : <EOL> rawdata = self . rawdata <EOL> j = i + <NUM_LIT:2> <EOL> assert rawdata [ i : j ] == "<STR_LIT>" , "<STR_LIT>" <EOL> if rawdata [ j : j + <NUM_LIT:1> ] == "<STR_LIT:>>" : <EOL> return j + <NUM_LIT:1> <EOL> if rawdata [ j : j + <NUM_LIT:1> ] in ( "<STR_LIT:->" , "<STR_LIT>" ) : <EOL> return - <NUM_LIT:1> <EOL> n = len ( rawdata ) <EOL> if rawdata [ j : j + <NUM_LIT:2> ] == '<STR_LIT>' : <EOL> return self . parse_comment ( i ) <EOL> elif rawdata [ j ] == '<STR_LIT:[>' : <EOL> return self . parse_marked_section ( i ) <EOL> else : <EOL> decltype , j = self . _scan_name ( j , i ) <EOL> if j < <NUM_LIT:0> : <EOL> return j <EOL> if decltype == "<STR_LIT>" : <EOL> self . _decl_otherchars = '<STR_LIT>' <EOL> while j < n : <EOL> c = rawdata [ j ] <EOL> if c == "<STR_LIT:>>" : <EOL> data = rawdata [ i + <NUM_LIT:2> : j ] <EOL> if decltype == "<STR_LIT>" : <EOL> self . handle_decl ( data ) <EOL> else : <EOL> self . unknown_decl ( data ) <EOL> return j + <NUM_LIT:1> <EOL> if c in "<STR_LIT>" : <EOL> m = _declstringlit_match ( rawdata , j ) <EOL> if not m : <EOL> return - <NUM_LIT:1> <EOL> j = m . end ( ) <EOL> elif c in "<STR_LIT>" : <EOL> name , j = self . _scan_name ( j , i ) <EOL> elif c in self . _decl_otherchars : <EOL> j = j + <NUM_LIT:1> <EOL> elif c == "<STR_LIT:[>" : <EOL> if decltype == "<STR_LIT>" : <EOL> j = self . _parse_doctype_subset ( j + <NUM_LIT:1> , i ) <EOL> elif decltype in ( "<STR_LIT>" , "<STR_LIT>" , "<STR_LIT>" , "<STR_LIT>" ) : <EOL> self . error ( "<STR_LIT>" % decltype ) <EOL> else : <EOL> self . error ( "<STR_LIT>" ) <EOL> else : <EOL> self . error ( <EOL> "<STR_LIT>" % rawdata [ j ] ) <EOL> if j < <NUM_LIT:0> : <EOL> return j <EOL> return - <NUM_LIT:1> <EOL> def parse_marked_section ( self , i , report = <NUM_LIT:1> ) : <EOL> rawdata = self . rawdata <EOL> assert rawdata [ i : i + <NUM_LIT:3> ] == '<STR_LIT>' , "<STR_LIT>" <EOL> sectName , j = self . _scan_name ( i + <NUM_LIT:3> , i ) <EOL> if j < <NUM_LIT:0> : <EOL> return j <EOL> if sectName in ( "<STR_LIT>" , "<STR_LIT>" , "<STR_LIT:ignore>" , "<STR_LIT>" , "<STR_LIT>" ) : <EOL> match = _markedsectionclose . search ( rawdata , i + <NUM_LIT:3> ) <EOL> elif sectName in ( "<STR_LIT>" , "<STR_LIT>" , "<STR_LIT>" ) : <EOL> match = _msmarkedsectionclose . search ( rawdata , i + <NUM_LIT:3> ) <EOL> else : <EOL> self . error ( '<STR_LIT>' % rawdata [ i + <NUM_LIT:3> : j ] ) <EOL> if not match : <EOL> return - <NUM_LIT:1> <EOL> if report : <EOL> j = match . start ( <NUM_LIT:0> ) <EOL> self . unknown_decl ( rawdata [ i + <NUM_LIT:3> : j ] ) <EOL> return match . end ( <NUM_LIT:0> ) <EOL> def parse_comment ( self , i , report = <NUM_LIT:1> ) : <EOL> rawdata = self . rawdata <EOL> if rawdata [ i : i + <NUM_LIT:4> ] != '<STR_LIT>' : <EOL> self . error ( '<STR_LIT>' ) <EOL> match = _commentclose . search ( rawdata , i + <NUM_LIT:4> ) <EOL> if not match : <EOL> return - <NUM_LIT:1> <EOL> if report : <EOL> j = match . start ( <NUM_LIT:0> ) <EOL> self . handle_comment ( rawdata [ i + <NUM_LIT:4> : j ] ) <EOL> return match . end ( <NUM_LIT:0> ) <EOL> def _parse_doctype_subset ( self , i , declstartpos ) : <EOL> rawdata = self . rawdata <EOL> n = len ( rawdata ) <EOL> j = i <EOL> while j < n : <EOL> c = rawdata [ j ] <EOL> if c == "<STR_LIT:<>" : <EOL> s = rawdata [ j : j + <NUM_LIT:2> ] <EOL> if s == "<STR_LIT:<>" : <EOL> return - <NUM_LIT:1> <EOL> if s != "<STR_LIT>" : <EOL> self . updatepos ( declstartpos , j + <NUM_LIT:1> ) <EOL> self . error ( "<STR_LIT>" % s ) <EOL> if ( j + <NUM_LIT:2> ) == n : <EOL> return - <NUM_LIT:1> <EOL> if ( j + <NUM_LIT:4> ) > n : <EOL> return - <NUM_LIT:1> <EOL> if rawdata [ j : j + <NUM_LIT:4> ] == "<STR_LIT>" : <EOL> j = self . parse_comment ( j , report = <NUM_LIT:0> ) <EOL> if j < <NUM_LIT:0> : <EOL> return j <EOL> continue <EOL> name , j = self . _scan_name ( j + <NUM_LIT:2> , declstartpos ) <EOL> if j == - <NUM_LIT:1> : <EOL> return - <NUM_LIT:1> <EOL> if name not in ( "<STR_LIT>" , "<STR_LIT>" , "<STR_LIT>" , "<STR_LIT>" ) : <EOL> self . updatepos ( declstartpos , j + <NUM_LIT:2> ) <EOL> self . error ( <EOL> "<STR_LIT>" % name ) <EOL> meth = getattr ( self , "<STR_LIT>" + name ) <EOL> j = meth ( j , declstartpos ) <EOL> if j < <NUM_LIT:0> : <EOL> return j <EOL> elif c == "<STR_LIT:%>" : <EOL> if ( j + <NUM_LIT:1> ) == n : <EOL> return - <NUM_LIT:1> <EOL> s , j = self . _scan_name ( j + <NUM_LIT:1> , declstartpos ) <EOL> if j < <NUM_LIT:0> : <EOL> return j <EOL> if rawdata [ j ] == "<STR_LIT:;>" : <EOL> j = j + <NUM_LIT:1> <EOL> elif c == "<STR_LIT:]>" : <EOL> j = j + <NUM_LIT:1> <EOL> while j < n and rawdata [ j ] . isspace ( ) : <EOL> j = j + <NUM_LIT:1> <EOL> if j < n : <EOL> if rawdata [ j ] == "<STR_LIT:>>" : <EOL> return j <EOL> self . updatepos ( declstartpos , j ) <EOL> self . error ( "<STR_LIT>" ) <EOL> else : <EOL> return - <NUM_LIT:1> <EOL> elif c . isspace ( ) : <EOL> j = j + <NUM_LIT:1> <EOL> else : <EOL> self . updatepos ( declstartpos , j ) <EOL> self . error ( "<STR_LIT>" % c ) <EOL> return - <NUM_LIT:1> <EOL> def _parse_doctype_element ( self , i , declstartpos ) : <EOL> name , j = self . _scan_name ( i , declstartpos ) <EOL> if j == - <NUM_LIT:1> : <EOL> return - <NUM_LIT:1> <EOL> rawdata = self . rawdata <EOL> if '<STR_LIT:>>' in rawdata [ j : ] : <EOL> return rawdata . find ( "<STR_LIT:>>" , j ) + <NUM_LIT:1> <EOL> return - <NUM_LIT:1> <EOL> def _parse_doctype_attlist ( self , i , declstartpos ) : <EOL> rawdata = self . rawdata <EOL> name , j = self . _scan_name ( i , declstartpos ) <EOL> c = rawdata [ j : j + <NUM_LIT:1> ] <EOL> if c == "<STR_LIT>" : <EOL> return - <NUM_LIT:1> <EOL> if c == "<STR_LIT:>>" : <EOL> return j + <NUM_LIT:1> <EOL> while <NUM_LIT:1> : <EOL> name , j = self . _scan_name ( j , declstartpos ) <EOL> if j < <NUM_LIT:0> : <EOL> return j <EOL> c = rawdata [ j : j + <NUM_LIT:1> ] <EOL> if c == "<STR_LIT>" : <EOL> return - <NUM_LIT:1> <EOL> if c == "<STR_LIT:(>" : <EOL> if "<STR_LIT:)>" in rawdata [ j : ] : <EOL> j = rawdata . find ( "<STR_LIT:)>" , j ) + <NUM_LIT:1> <EOL> else : <EOL> return - <NUM_LIT:1> <EOL> while rawdata [ j : j + <NUM_LIT:1> ] . isspace ( ) : <EOL> j = j + <NUM_LIT:1> <EOL> if not rawdata [ j : ] : <EOL> return - <NUM_LIT:1> <EOL> else : <EOL> name , j = self . _scan_name ( j , declstartpos ) <EOL> c = rawdata [ j : j + <NUM_LIT:1> ] <EOL> if not c : <EOL> return - <NUM_LIT:1> <EOL> if c in "<STR_LIT>" : <EOL> m = _declstringlit_match ( rawdata , j ) <EOL> if m : <EOL> j = m . end ( ) <EOL> else : <EOL> return - <NUM_LIT:1> <EOL> c = rawdata [ j : j + <NUM_LIT:1> ] <EOL> if not c : <EOL> return - <NUM_LIT:1> <EOL> if c == "<STR_LIT:#>" : <EOL> if rawdata [ j : ] == "<STR_LIT:#>" : <EOL> return - <NUM_LIT:1> <EOL> name , j = self . _scan_name ( j + <NUM_LIT:1> , declstartpos ) <EOL> if j < <NUM_LIT:0> : <EOL> return j <EOL> c = rawdata [ j : j + <NUM_LIT:1> ] <EOL> if not c : <EOL> return - <NUM_LIT:1> <EOL> if c == '<STR_LIT:>>' : <EOL> return j + <NUM_LIT:1> <EOL> def _parse_doctype_notation ( self , i , declstartpos ) : <EOL> name , j = self . _scan_name ( i , declstartpos ) <EOL> if j < <NUM_LIT:0> : <EOL> return j <EOL> rawdata = self . rawdata <EOL> while <NUM_LIT:1> : <EOL> c = rawdata [ j : j + <NUM_LIT:1> ] <EOL> if not c : <EOL> return - <NUM_LIT:1> <EOL> if c == '<STR_LIT:>>' : <EOL> return j + <NUM_LIT:1> <EOL> if c in "<STR_LIT>" : <EOL> m = _declstringlit_match ( rawdata , j ) <EOL> if not m : <EOL> return - <NUM_LIT:1> <EOL> j = m . end ( ) <EOL> else : <EOL> name , j = self . _scan_name ( j , declstartpos ) <EOL> if j < <NUM_LIT:0> : <EOL> return j <EOL> def _parse_doctype_entity ( self , i , declstartpos ) : <EOL> rawdata = self . rawdata <EOL> if rawdata [ i : i + <NUM_LIT:1> ] == "<STR_LIT:%>" : <EOL> j = i + <NUM_LIT:1> <EOL> while <NUM_LIT:1> : <EOL> c = rawdata [ j : j + <NUM_LIT:1> ] <EOL> if not c : <EOL> return - <NUM_LIT:1> <EOL> if c . isspace ( ) : <EOL> j = j + <NUM_LIT:1> <EOL> else : <EOL> break <EOL> else : <EOL> j = i <EOL> name , j = self . _scan_name ( j , declstartpos ) <EOL> if j < <NUM_LIT:0> : <EOL> return j <EOL> while <NUM_LIT:1> : <EOL> c = self . rawdata [ j : j + <NUM_LIT:1> ] <EOL> if not c : <EOL> return - <NUM_LIT:1> <EOL> if c in "<STR_LIT>" : <EOL> m = _declstringlit_match ( rawdata , j ) <EOL> if m : <EOL> j = m . end ( ) <EOL> else : <EOL> return - <NUM_LIT:1> <EOL> elif c == "<STR_LIT:>>" : <EOL> return j + <NUM_LIT:1> <EOL> else : <EOL> name , j = self . _scan_name ( j , declstartpos ) <EOL> if j < <NUM_LIT:0> : <EOL> return j <EOL> def _scan_name ( self , i , declstartpos ) : <EOL> rawdata = self . rawdata <EOL> n = len ( rawdata ) <EOL> if i == n : <EOL> return None , - <NUM_LIT:1> <EOL> m = _declname_match ( rawdata , i ) <EOL> if m : <EOL> s = m . group ( ) <EOL> name = s . strip ( ) <EOL> if ( i + len ( s ) ) == n : <EOL> return None , - <NUM_LIT:1> <EOL> return name . lower ( ) , m . end ( ) <EOL> else : <EOL> self . updatepos ( declstartpos , i ) <EOL> self . error ( "<STR_LIT>" <EOL> % rawdata [ declstartpos : declstartpos + <NUM_LIT:20> ] ) <EOL> def unknown_decl ( self , data ) : <EOL> pass </s>
