ui_escape.py 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. # -*- coding: utf-8 -*-
  2. """
  3. # Simple password manager
  4. # Copyright (c) 2011-2023 Michael Büsch <m@bues.ch>
  5. # Licensed under the GNU/GPL version 2 or later.
  6. """
  7. __all__ = [
  8. "EscapeError",
  9. "escapeCmd",
  10. "unescapeCmd",
  11. ]
  12. class EscapeError(Exception):
  13. pass
  14. def escapeCmd(s):
  15. # Commandline escape
  16. if s is None:
  17. return "\\-"
  18. if not s:
  19. return "\\~"
  20. subst = {
  21. '\t' : '\\t',
  22. '\n' : '\\n',
  23. '\\' : '\\\\',
  24. ' ' : '\\ ',
  25. }
  26. ret = []
  27. for c in s:
  28. try:
  29. c = subst[c]
  30. except (KeyError) as e:
  31. if c.isspace():
  32. c = '\\x%02X' % ord(c)
  33. ret.append(c)
  34. return "".join(ret)
  35. def unescapeCmd(s):
  36. # Commandline unescape
  37. if s == '\\-':
  38. return None
  39. if s == '\\~':
  40. return ""
  41. slashSubst = {
  42. 't' : '\t',
  43. 'n' : '\n',
  44. '\\' : '\\',
  45. }
  46. ret = []
  47. i = 0
  48. while i < len(s):
  49. if s[i] == '\\':
  50. try:
  51. if s[i + 1] == 'x':
  52. ret.append(chr(int(s[i + 2 : i + 4], 16)))
  53. i += 3
  54. elif s[i + 1] == ' ':
  55. ret.append(' ')
  56. i += 1
  57. else:
  58. ret.append(slashSubst[s[i + 1]])
  59. i += 1
  60. except (IndexError, ValueError, KeyError):
  61. raise EscapeError("Invalid backslash escape sequence "
  62. "at character %d" % i)
  63. else:
  64. ret.append(s[i])
  65. i += 1
  66. return "".join(ret)