casing.py 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. """This script handles conversion between snake and camel casing.
  2. """
  3. import re
  4. _words_expr = re.compile(r"([a-zA-Z][^A-Z0-9]*|[0-9]+)")
  5. _lower_snake_case_expr = re.compile(r'^[a-z][a-z0-9_]*$')
  6. _upper_snake_case_expr = re.compile(r'^[A-Z][A-Z0-9_]*$')
  7. def _is_snake_case(str):
  8. """Checks if the supplied string is already in snake case.
  9. """
  10. match = _lower_snake_case_expr.match(str)
  11. if match:
  12. return True
  13. match = _upper_snake_case_expr.match(str)
  14. if match:
  15. return True
  16. return False
  17. def _split_snake_case(str):
  18. """Splits up a string based on underscores, if it's in snake casing.
  19. """
  20. if _is_snake_case(str):
  21. return [s.lower() for s in str.split("_")]
  22. return str
  23. def _split_camel_case(str):
  24. """Splits up a string based on capitalised camel casing.
  25. """
  26. return _words_expr.findall(str)
  27. def _split_cased_words(str):
  28. return _split_snake_case(str) if _is_snake_case(str) else _split_camel_case(str)
  29. def to_snake(str):
  30. str = "_".join([word.strip().lower() for word in _split_cased_words(str)])
  31. # Fix acronyms
  32. str = str.replace('i_d', 'id')
  33. str = str.replace('x_a_p', 'xap')
  34. str = str.replace('q_m_k', 'qmk')
  35. return str
  36. def to_upper_snake(str):
  37. return to_snake(str).upper()
  38. def to_camel(str):
  39. def _acronym(w):
  40. if w.strip().lower() == 'qmk':
  41. return 'QMK'
  42. elif w.strip().lower() == 'xap':
  43. return 'XAP'
  44. elif w.strip().lower() == 'id':
  45. return 'ID'
  46. return w.title()
  47. return "".join([_acronym(word) for word in _split_cased_words(str)])