path.py 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. """Functions that help us work with files and folders.
  2. """
  3. import logging
  4. import os
  5. from qmk.errors import NoSuchKeyboardError
  6. from bs4 import UnicodeDammit
  7. def keymap(keyboard):
  8. """Locate the correct directory for storing a keymap.
  9. Args:
  10. keyboard
  11. The name of the keyboard. Example: clueboard/66/rev3
  12. """
  13. for directory in ['.', '..', '../..', '../../..', '../../../..', '../../../../..']:
  14. basepath = os.path.normpath(os.path.join('keyboards', keyboard, directory, 'keymaps'))
  15. if os.path.exists(basepath):
  16. return basepath
  17. logging.error('Could not find keymaps directory!')
  18. raise NoSuchKeyboardError('Could not find keymaps directory for: %s' % keyboard)
  19. def normpath(path):
  20. """Returns the fully resolved absolute path to a file.
  21. This function will return the absolute path to a file as seen from the
  22. directory the script was called from.
  23. """
  24. if path and path[0] == '/':
  25. return os.path.normpath(path)
  26. return os.path.normpath(os.path.join(os.environ['ORIG_CWD'], path))
  27. def unicode_text(filename):
  28. """Returns the contents of filename as a UTF-8 string. Tries to DTRT when it comes to encoding.
  29. """
  30. with open(filename, "rb") as fd:
  31. text = UnicodeDammit(fd.read())
  32. if text.contains_replacement_characters:
  33. log_warning("%s: Could not determine file encoding, some characters were replaced." % (filename,))
  34. return text.unicode_markup or ""
  35. def unicode_lines(filename):
  36. """Returns the contents of filename as a UTF-8 string. Tries to DTRT when it comes to encoding.
  37. """
  38. return unicode_text(filename).split("\n")