1. #!/usr/bin/env python3
    
  2. import importlib
    
  3. import sys
    
  4. 
    
  5. import pystache
    
  6. from pygments.style import Style
    
  7. from pygments.token import Token
    
  8. 
    
  9. 
    
  10. TEMPLATE = r'''
    
  11. package styles
    
  12. 
    
  13. import (
    
  14.     "github.com/alecthomas/chroma/v2"
    
  15. )
    
  16. 
    
  17. // {{upper_name}} style.
    
  18. var {{upper_name}} = Register(chroma.MustNewStyle("{{name}}", chroma.StyleEntries{
    
  19. {{#styles}}
    
  20.     chroma.{{type}}: "{{style}}",
    
  21. {{/styles}}
    
  22. }))
    
  23. '''
    
  24. 
    
  25. 
    
  26. def to_camel_case(snake_str):
    
  27.     components = snake_str.split('_')
    
  28.     return ''.join(x.title() for x in components)
    
  29. 
    
  30. 
    
  31. def translate_token_type(t):
    
  32.     if t == Token:
    
  33.         t = Token.Background
    
  34.     return "".join(map(str, t))
    
  35. 
    
  36. 
    
  37. def main():
    
  38.     name = sys.argv[1]
    
  39.     package_name, symbol_name = sys.argv[2].rsplit(sep=".", maxsplit=1)
    
  40. 
    
  41.     package = importlib.import_module(package_name)
    
  42. 
    
  43.     style_cls = getattr(package, symbol_name)
    
  44. 
    
  45.     assert issubclass(style_cls, Style), 'can only translate from Style subclass'
    
  46. 
    
  47.     styles = dict(style_cls.styles)
    
  48.     bg = "bg:" + style_cls.background_color
    
  49.     if Token in styles:
    
  50.         styles[Token] += " " + bg
    
  51.     else:
    
  52.         styles[Token] = bg
    
  53.     context = {
    
  54.         'upper_name': style_cls.__name__[:-5],
    
  55.         'name': name,
    
  56.         'styles': [{'type': translate_token_type(t), 'style': s}
    
  57.                    for t, s in styles.items() if s],
    
  58.     }
    
  59.     print(pystache.render(TEMPLATE, context))
    
  60. 
    
  61. 
    
  62. if __name__ == '__main__':
    
  63.     main()