53 lines
1.9 KiB
Python
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)
|