Advertisement
Guest User

Untitled

a guest
May 29th, 2016
47
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.14 KB | None | 0 0
  1. import tokenize
  2. import sys
  3. import re
  4.  
  5. re_string = re.compile(r'^([rub]*)([\'"]{1,3})(.*)\2$', re.S)
  6.  
  7. class Converter:
  8. def __init__(self, filename):
  9. self.filename = filename
  10. self.out = []
  11. self.previous_end = None
  12. self.def_or_class = False
  13. self.docstring_expected = True
  14.  
  15. def tokeneater(self, kind, token, start, end, line):
  16. if self.previous_end and self.previous_end[0] == start[0]:
  17. offset = self.previous_end[1]
  18. else:
  19. offset = 0
  20. self.out.append(' ' * (start[1] - offset))
  21.  
  22. if kind == tokenize.STRING:
  23. prefixes, quotes, content = re_string.search(token).groups()
  24. if self.docstring_expected:
  25. token = '{}"""{}"""'.format(prefixes, content)
  26. elif start[0] != end[0]:
  27. token = "{}'''{}'''".format(prefixes, content)
  28. else:
  29. s = eval(token)
  30. if 'r' in prefixes:
  31. if "'" in s and '"' not in s:
  32. token = '{}"{}"'.format(prefixes, s)
  33. else:
  34. token = "{}'{}'".format(prefixes, s)
  35.  
  36. try:
  37. eval(token)
  38. except SyntaxError:
  39. token = repr(s)
  40. else:
  41. token = repr(s)
  42.  
  43. if kind not in {tokenize.NEWLINE, tokenize.NL,
  44. tokenize.INDENT, tokenize.COMMENT}:
  45. self.docstring_expected = False
  46.  
  47. if self.def_or_class and kind == tokenize.OP and token == ':':
  48. self.def_or_class = False
  49. self.docstring_expected = True
  50.  
  51. if kind == tokenize.NAME and token in {'def', 'class'}:
  52. self.def_or_class = True
  53.  
  54. self.out.append(token)
  55. self.previous_end = end
  56.  
  57. def convert(self):
  58. with open(self.filename, 'r+b') as file:
  59. tokenize.tokenize(file.readline, self.tokeneater)
  60. file.seek(0)
  61. for s in self.out:
  62. file.write(s)
  63. file.truncate()
  64.  
  65. if __name__ == '__main__':
  66. for filename in sys.argv[1:]:
  67. Converter(filename).convert()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement