test-kivy-app/kivy_venv/lib/python3.11/site-packages/kivy/extras/highlight.py
2024-09-15 15:12:16 +03:00

53 lines
1.9 KiB
Python

'''Pygments lexer for kv language
'''
from pygments.lexer import RegexLexer, bygroups, using
from pygments.lexers.agile import PythonLexer
from pygments import highlight
from pygments.token import Comment, Text, Name, Punctuation, Operator
from pygments.formatters import get_formatter_by_name
import sys
class KivyLexer(RegexLexer):
name = 'Kivy'
aliases = ['kivy', 'kv']
filenames = ['*.kv']
tokens = {
'root': [
(r'#:.*?$', Comment.Preproc),
(r'#.*?$', using(PythonLexer)),
(r'\s+', Text),
(r'<.+>', Name.Namespace),
(r'(\[)(\s*)(.*?)(\s*)(@)',
bygroups(Punctuation, Text, Name.Class, Text, Operator),
'classList'),
(r'[A-Za-z][A-Za-z0-9]*$', Name.Attribute),
(r'(.*?)(\s*)(:)(\s*)$',
bygroups(Name.Class, Text, Punctuation, Text)),
(r'(.*?)(\s*)(:)(\s*)(.*?)$',
bygroups(Name.Attribute, Text, Punctuation, Text,
using(PythonLexer))),
(r'[^:]+?$', using(PythonLexer))],
'classList': [
(r'(,)(\s*)([A-Z][A-Za-z0-9]*)',
bygroups(Punctuation, Text, Name.Class)),
(r'(\+)(\s*)([A-Z][A-Za-z0-9]*)',
bygroups(Operator, Text, Name.Class)),
(r'\s+', Text),
(r'[A-Z][A-Za-z0-9]*', Name.Class),
(r'\]', Punctuation, '#pop')]}
if __name__ == '__main__':
''' This lexer will highlight .kv file. The first argument is the source
file, the second argument is the format of the destination and the third
argument is the output filename
'''
if len(sys.argv) != 4:
raise Exception('Three arguments expected, found %s' %
(len(sys.argv) - 1))
k = KivyLexer()
with open(sys.argv[1], 'r') as fd:
with open(sys.argv[3], 'w') as out:
highlight(fd.read(), k, get_formatter_by_name(sys.argv[2]), out)