3
‡ŒðiW?  ã               @   sX   d Z ddlZejdƒjZejdƒjZejdƒZejdƒZejdƒZ[G dd	„ d	e	ƒZ
dS )
a  Shared support for scanning document type declarations in HTML and XHTML.

Backported for python-future from Python 3.3. Reason: ParserBase is an
old-style class in the Python 2.7 source of markupbase.py, which I suspect
might be the cause of sporadic unit-test failures on travis-ci.org with
test_htmlparser.py.  The test failures look like this:

    ======================================================================

ERROR: test_attr_entity_replacement (future.tests.test_htmlparser.AttributesStrictTestCase)

----------------------------------------------------------------------

Traceback (most recent call last):
  File "/home/travis/build/edschofield/python-future/future/tests/test_htmlparser.py", line 661, in test_attr_entity_replacement
    [("starttag", "a", [("b", "&><"'")])])
  File "/home/travis/build/edschofield/python-future/future/tests/test_htmlparser.py", line 93, in _run_check
    collector = self.get_collector()
  File "/home/travis/build/edschofield/python-future/future/tests/test_htmlparser.py", line 617, in get_collector
    return EventCollector(strict=True)
  File "/home/travis/build/edschofield/python-future/future/tests/test_htmlparser.py", line 27, in __init__
    html.parser.HTMLParser.__init__(self, *args, **kw)
  File "/home/travis/build/edschofield/python-future/future/backports/html/parser.py", line 135, in __init__
    self.reset()
  File "/home/travis/build/edschofield/python-future/future/backports/html/parser.py", line 143, in reset
    _markupbase.ParserBase.reset(self)

TypeError: unbound method reset() must be called with ParserBase instance as first argument (got EventCollector instance instead)

This module is used as a foundation for the html.parser module.  It has no
documented public API and should not be used directly.

é    Nz[a-zA-Z][-_.a-zA-Z0-9]*\s*z(\'[^\']*\'|"[^"]*")\s*z--\s*>z	]\s*]\s*>z]\s*>c               @   s�   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ ZdZ	dd„ Z
d#dd„Zd$dd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"S )%Ú
ParserBaseziParser base class which provides some common support methods used
    by the SGML/HTML and XHTML parsers.c             C   s   | j tkrtdƒ‚d S )Nz)_markupbase.ParserBase must be subclassed)Ú	__class__r   ÚRuntimeError)Úself© r   ú>/tmp/pip-build-6m2fasei/future/future/backports/_markupbase.pyÚ__init__6   s    
zParserBase.__init__c             C   s   t dƒ‚d S )Nz.subclasses of ParserBase must override error())ÚNotImplementedError)r   Úmessager   r   r   Úerror;   s    zParserBase.errorc             C   s   d| _ d| _d S )Né   r   )ÚlinenoÚoffset)r   r   r   r   Úreset?   s    zParserBase.resetc             C   s   | j | jfS )z&Return current line number and offset.)r   r   )r   r   r   r   ÚgetposC   s    zParserBase.getposc             C   sb   ||kr|S | j }|jd||ƒ}|rN| j| | _|jd||ƒ}||d  | _n| j| | | _|S )NÚ
r   )ÚrawdataÚcountr   Úrindexr   )r   ÚiÚjr   ÚnlinesÚposr   r   r   Ú	updateposK   s    zParserBase.updateposÚ c       
      C   sð  | j }|d }|||… dks&tdƒ‚|||d … dkrB|d S |||d … dkrZdS t|ƒ}|||d … dkr€| j|ƒS || d	kr–| j|ƒS | j||ƒ\}}|d
k r²|S |dkrÀd| _�x(||k �rê|| }|dk�r||d |… }|dk�r| j|ƒ n
| j|ƒ |d S |dk�r@t	||ƒ}|�s6dS |j
ƒ }nœ|dk�r\| j||ƒ\}	}n€|| jk�rr|d }nj|d	k�rÊ|dk�r˜| j|d |ƒ}n0|tddddgƒk�r¾| jd| ƒ n
| jdƒ n| jd||  ƒ |d
k rÄ|S qÄW dS )Né   z<!z$unexpected call to parse_declarationr   ú>ú-r   z--ú[r   Údoctypez"'Ú4abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZÚattlistÚlinktypeÚlinkÚelementz&unsupported '[' char in %s declarationz"unexpected '[' char in declarationz!unexpected %r char in declaration)r   r   éÿÿÿÿr%   r%   )r   ÚAssertionErrorÚlenÚparse_commentÚparse_marked_sectionÚ
_scan_nameÚ_decl_othercharsÚhandle_declÚunknown_declÚ_declstringlit_matchÚendÚ_parse_doctype_subsetÚsetr   )
r   r   r   r   ÚnÚdecltypeÚcÚdataÚmÚnamer   r   r   Úparse_declaration[   sZ    











zParserBase.parse_declarationr   c             C   sÞ   | j }|||d … dks"tdƒ‚| j|d |ƒ\}}|dk rB|S |tddddd	gƒkrjtj||d ƒ}n>|td
ddgƒkrŽtj||d ƒ}n| jd||d |…  ƒ |s°dS |rÔ|jdƒ}| j	||d |… ƒ |j
dƒS )Né   z<![z)unexpected call to parse_marked_section()r   ÚtempÚcdataÚignoreÚincludeÚrcdataÚifÚelseÚendifz+unknown status keyword %r in marked sectionr   r%   )r   r&   r*   r1   Ú_markedsectioncloseÚsearchÚ_msmarkedsectioncloser   Ústartr-   r/   )r   r   Úreportr   ÚsectNamer   Úmatchr   r   r   r)   ­   s     
zParserBase.parse_marked_sectionc             C   sj   | j }|||d … dkr$| jdƒ tj||d ƒ}|s<dS |r`|jdƒ}| j||d |… ƒ |jdƒS )Né   z<!--z"unexpected call to parse_comment()r   r   r%   )r   r   Ú_commentcloserC   rE   Úhandle_commentr/   )r   r   rF   r   rH   r   r   r   r   r(   Ã   s    

zParserBase.parse_commentc       
      C   s@  | j }t|ƒ}|}�x&||k �r:|| }|dk�r@|||d … }|dkrNdS |dkrt| j||d ƒ | jd| ƒ |d |kr„dS |d |kr”dS |||d … dkrÄ| j|dd	�}|dk r|S q| j|d |ƒ\}}|dkrädS |td
dddgƒk�r| j||d ƒ | jd| ƒ t| d| ƒ}	|	||ƒ}|dk �r8|S q|dk�r–|d |k�r\dS | j|d |ƒ\}}|dk �r~|S || dk�r8|d }q|dk�r
|d }x&||k �rÎ|| jƒ �rÎ|d }�qªW ||k �r|| dk�rì|S | j||ƒ | jdƒ ndS q|jƒ �r|d }q| j||ƒ | jd| ƒ qW dS )Nú<r   r   z<!z*unexpected char in internal subset (in %r)rI   z<!--r   )rF   r!   r$   ÚentityÚnotationz)unknown declaration %r in internal subsetÚ_parse_doctype_ú%ú;ú]r   z%unexpected char after internal subsetz%unexpected char %r in internal subsetr%   r%   r%   r%   r%   r%   r%   r%   )	r   r'   r   r   r(   r*   r1   ÚgetattrÚisspace)
r   r   Údeclstartposr   r2   r   r4   Úsr7   Úmethr   r   r   r0   Ñ   sn    










z ParserBase._parse_doctype_subsetc             C   sF   | j ||ƒ\}}|dkrdS | j}d||d … krB|jd|ƒd S dS )Nr   r   r%   r%   r%   )r*   r   Úfind)r   r   rU   r7   r   r   r   r   r   Ú_parse_doctype_element  s    z!ParserBase._parse_doctype_elementc             C   sÀ  | j }| j||ƒ\}}|||d … }|dkr2d	S |dkrB|d S �xv| j||ƒ\}}|dk rb|S |||d … }|dkr~d
S |dkràd||d … kr¨|jd|ƒd }ndS x |||d … jƒ rÌ|d }q®W ||d … sðdS n| j||ƒ\}}|||d … }|�s
dS |dk�rLt||ƒ}|�r.|jƒ }ndS |||d … }|�sLdS |dk�r¨||d … dk�rldS | j|d |ƒ\}}|dk �rŽ|S |||d … }|�s¨dS |dkrF|d S qFW d S )Nr   r   r   r   ú(ú)z'"ú#r%   r%   r%   r%   r%   r%   r%   r%   r%   )r   r*   rX   rT   r.   r/   )r   r   rU   r   r7   r   r4   r6   r   r   r   Ú_parse_doctype_attlist  sZ    




z!ParserBase._parse_doctype_attlistc             C   s”   | j ||ƒ\}}|dk r|S | j}xl|||d … }|s<dS |dkrL|d S |dkrpt||ƒ}|sfdS |jƒ }q$| j ||ƒ\}}|dk r$|S q$W d S )Nr   r   r   z'"r%   r%   )r*   r   r.   r/   )r   r   rU   r7   r   r   r4   r6   r   r   r   Ú_parse_doctype_notationX  s$    

z"ParserBase._parse_doctype_notationc             C   sì   | j }|||d … dkrV|d }x6|||d … }|s<dS |jƒ rN|d }q$P q$W n|}| j||ƒ\}}|dk rv|S xp| j ||d … }|s’dS |dkr¸t||ƒ}|r²|jƒ }qädS qx|dkrÈ|d S | j||ƒ\}}|dk rx|S qxW d S )	Nr   rP   r   z'"r   r%   r%   r%   )r   rT   r*   r.   r/   )r   r   rU   r   r   r4   r7   r6   r   r   r   Ú_parse_doctype_entityo  s8    


z ParserBase._parse_doctype_entityc             C   s†   | j }t|ƒ}||krdS t||ƒ}|r\|jƒ }|jƒ }|t|ƒ |krLdS |jƒ |jƒ fS | j||ƒ | jd|||d …  ƒ d S )Nr   zexpected name token at %ré   r%   )Nr%   r%   )Nr%   )	r   r'   Ú_declname_matchÚgroupÚstripÚlowerr/   r   r   )r   r   rU   r   r2   r6   rV   r7   r   r   r   r*   “  s    
zParserBase._scan_namec             C   s   d S )Nr   )r   r5   r   r   r   r-   ¥  s    zParserBase.unknown_declN)r   )r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r+   r8   r)   r(   r0   rY   r]   r^   r_   r*   r-   r   r   r   r   r   2   s"   R

C9$r   )rh   ÚreÚcompilerH   ra   r.   rJ   rB   rD   Úobjectr   r   r   r   r   Ú<module>!   s   


