This repo contains code to mirror other repos. It also contains the code that is getting mirrored.
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 

62 行
1.8 KiB

  1. "Provides Indentation services for languages with indentation similar to Python"
  2. from .lexer import Token
  3. ###{standalone
  4. class Indenter:
  5. def __init__(self):
  6. self.paren_level = None
  7. self.indent_level = None
  8. assert self.tab_len > 0
  9. def handle_NL(self, token):
  10. if self.paren_level > 0:
  11. return
  12. yield token
  13. indent_str = token.rsplit('\n', 1)[1] # Tabs and spaces
  14. indent = indent_str.count(' ') + indent_str.count('\t') * self.tab_len
  15. if indent > self.indent_level[-1]:
  16. self.indent_level.append(indent)
  17. yield Token.new_borrow_pos(self.INDENT_type, indent_str, token)
  18. else:
  19. while indent < self.indent_level[-1]:
  20. self.indent_level.pop()
  21. yield Token.new_borrow_pos(self.DEDENT_type, indent_str, token)
  22. assert indent == self.indent_level[-1], '%s != %s' % (indent, self.indent_level[-1])
  23. def _process(self, stream):
  24. for token in stream:
  25. if token.type == self.NL_type:
  26. for t in self.handle_NL(token):
  27. yield t
  28. else:
  29. yield token
  30. if token.type in self.OPEN_PAREN_types:
  31. self.paren_level += 1
  32. elif token.type in self.CLOSE_PAREN_types:
  33. self.paren_level -= 1
  34. assert self.paren_level >= 0
  35. while len(self.indent_level) > 1:
  36. self.indent_level.pop()
  37. yield Token(self.DEDENT_type, '')
  38. assert self.indent_level == [0], self.indent_level
  39. def process(self, stream):
  40. self.paren_level = 0
  41. self.indent_level = [0]
  42. return self._process(stream)
  43. # XXX Hack for ContextualLexer. Maybe there's a more elegant solution?
  44. @property
  45. def always_accept(self):
  46. return (self.NL_type,)
  47. ###}