You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
97 lines
3.8 KiB
97 lines
3.8 KiB
from __future__ import unicode_literals
|
|
_F=', line: '
|
|
_E='pre_done'
|
|
_D=False
|
|
_C='value'
|
|
_B='_comment'
|
|
_A=None
|
|
if _D:from typing import Text,Any,Dict,Optional,List;from.error import StreamMark
|
|
SHOWLINES=True
|
|
class Token:
|
|
__slots__='start_mark','end_mark',_B
|
|
def __init__(A,start_mark,end_mark):A.start_mark=start_mark;A.end_mark=end_mark
|
|
def __repr__(A):
|
|
C=[A for A in A.__slots__ if not A.endswith('_mark')];C.sort();B=', '.join(['%s=%r'%(B,getattr(A,B))for B in C])
|
|
if SHOWLINES:
|
|
try:B+=_F+str(A.start_mark.line)
|
|
except:pass
|
|
try:B+=', comment: '+str(A._comment)
|
|
except:pass
|
|
return'{}({})'.format(A.__class__.__name__,B)
|
|
def add_post_comment(A,comment):
|
|
if not hasattr(A,_B):A._comment=[_A,_A]
|
|
A._comment[0]=comment
|
|
def add_pre_comments(A,comments):
|
|
if not hasattr(A,_B):A._comment=[_A,_A]
|
|
assert A._comment[1]is _A;A._comment[1]=comments
|
|
def get_comment(A):return getattr(A,_B,_A)
|
|
@property
|
|
def comment(self):return getattr(self,_B,_A)
|
|
def move_comment(C,target,empty=_D):
|
|
D=target;A=C.comment
|
|
if A is _A:return
|
|
if isinstance(D,(StreamEndToken,DocumentStartToken)):return
|
|
delattr(C,_B);B=D.comment
|
|
if not B:
|
|
if empty:A=[A[0],A[1],_A,_A,A[0]]
|
|
D._comment=A;return C
|
|
if A[0]and B[0]or A[1]and B[1]:raise NotImplementedError('overlap in comment %r %r'%(A,B))
|
|
if A[0]:B[0]=A[0]
|
|
if A[1]:B[1]=A[1]
|
|
return C
|
|
def split_comment(B):
|
|
A=B.comment
|
|
if A is _A or A[0]is _A:return
|
|
C=[A[0],_A]
|
|
if A[1]is _A:delattr(B,_B)
|
|
return C
|
|
class DirectiveToken(Token):
|
|
__slots__='name',_C;id='<directive>'
|
|
def __init__(A,name,value,start_mark,end_mark):Token.__init__(A,start_mark,end_mark);A.name=name;A.value=value
|
|
class DocumentStartToken(Token):__slots__=();id='<document start>'
|
|
class DocumentEndToken(Token):__slots__=();id='<document end>'
|
|
class StreamStartToken(Token):
|
|
__slots__='encoding',;id='<stream start>'
|
|
def __init__(A,start_mark=_A,end_mark=_A,encoding=_A):Token.__init__(A,start_mark,end_mark);A.encoding=encoding
|
|
class StreamEndToken(Token):__slots__=();id='<stream end>'
|
|
class BlockSequenceStartToken(Token):__slots__=();id='<block sequence start>'
|
|
class BlockMappingStartToken(Token):__slots__=();id='<block mapping start>'
|
|
class BlockEndToken(Token):__slots__=();id='<block end>'
|
|
class FlowSequenceStartToken(Token):__slots__=();id='['
|
|
class FlowMappingStartToken(Token):__slots__=();id='{'
|
|
class FlowSequenceEndToken(Token):__slots__=();id=']'
|
|
class FlowMappingEndToken(Token):__slots__=();id='}'
|
|
class KeyToken(Token):__slots__=();id='?'
|
|
class ValueToken(Token):__slots__=();id=':'
|
|
class BlockEntryToken(Token):__slots__=();id='-'
|
|
class FlowEntryToken(Token):__slots__=();id=','
|
|
class AliasToken(Token):
|
|
__slots__=_C,;id='<alias>'
|
|
def __init__(A,value,start_mark,end_mark):Token.__init__(A,start_mark,end_mark);A.value=value
|
|
class AnchorToken(Token):
|
|
__slots__=_C,;id='<anchor>'
|
|
def __init__(A,value,start_mark,end_mark):Token.__init__(A,start_mark,end_mark);A.value=value
|
|
class TagToken(Token):
|
|
__slots__=_C,;id='<tag>'
|
|
def __init__(A,value,start_mark,end_mark):Token.__init__(A,start_mark,end_mark);A.value=value
|
|
class ScalarToken(Token):
|
|
__slots__=_C,'plain','style';id='<scalar>'
|
|
def __init__(A,value,plain,start_mark,end_mark,style=_A):Token.__init__(A,start_mark,end_mark);A.value=value;A.plain=plain;A.style=style
|
|
class CommentToken(Token):
|
|
__slots__=_C,_E;id='<comment>'
|
|
def __init__(A,value,start_mark,end_mark):Token.__init__(A,start_mark,end_mark);A.value=value
|
|
def reset(A):
|
|
if hasattr(A,_E):delattr(A,_E)
|
|
def __repr__(A):
|
|
B='{!r}'.format(A.value)
|
|
if SHOWLINES:
|
|
try:B+=_F+str(A.start_mark.line);B+=', col: '+str(A.start_mark.column)
|
|
except:pass
|
|
return'CommentToken({})'.format(B)
|
|
def __eq__(A,other):
|
|
B=other
|
|
if A.start_mark!=B.start_mark:return _D
|
|
if A.end_mark!=B.end_mark:return _D
|
|
if A.value!=B.value:return _D
|
|
return True
|
|
def __ne__(A,other):return not A.__eq__(other) |