_django.py
4.81 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
###############################################################################
# Name: django.py #
# Purpose: Define Django syntax for highlighting and other features #
# Author: Cody Precord <cprecord@editra.org> #
# Copyright: (c) 2008 Cody Precord <staff@editra.org> #
# License: wxWindows License #
###############################################################################
"""
FILE: django.py
AUTHOR: Cody Precord
@summary: Lexer configuration module for Django Templates.
"""
__author__ = "Cody Precord <cprecord@editra.org>"
__svnid__ = "$Id: _django.py 68798 2011-08-20 17:17:05Z CJP $"
__revision__ = "$Revision: 68798 $"
#-----------------------------------------------------------------------------#
# Imports
import wx.stc as stc
from pygments.token import Token
from pygments.lexers import get_lexer_by_name
#Local Imports
import synglob
import syndata
#-----------------------------------------------------------------------------#
# Style Id's
STC_DJANGO_DEFAULT, \
STC_DJANGO_COMMENT, \
STC_DJANGO_NUMBER, \
STC_DJANGO_STRING, \
STC_DJANGO_STRINGEOL, \
STC_DJANGO_SCALAR, \
STC_DJANGO_OPERATOR, \
STC_DJANGO_PREPROCESSOR, \
STC_DJANGO_ATTRIBUTE, \
STC_DJANGO_TAG, \
STC_DJANGO_BUILTIN, \
STC_DJANGO_KEYWORD = range(12)
#-----------------------------------------------------------------------------#
# Python Keywords
KEYWORDS = ("true false undefined null in as reversed recursive not and or is "
"if else import with loop block forloop")
#---- Syntax Style Specs ----#
SYNTAX_ITEMS = [ (STC_DJANGO_DEFAULT, 'default_style'),
(STC_DJANGO_COMMENT, 'comment_style'),
(STC_DJANGO_NUMBER, 'number_style'),
(STC_DJANGO_STRING, 'string_style'),
(STC_DJANGO_STRINGEOL, 'stringeol_style'),
(STC_DJANGO_SCALAR, 'scalar_style'),
(STC_DJANGO_OPERATOR, 'operator_style'),
(STC_DJANGO_PREPROCESSOR, 'pre_style'),
(STC_DJANGO_ATTRIBUTE, 'keyword2_style'),
(STC_DJANGO_TAG, 'keyword_style'), # Need new tag
(STC_DJANGO_BUILTIN, 'keyword4_style'),
(STC_DJANGO_KEYWORD, 'keyword_style'), ]
#-----------------------------------------------------------------------------#
class SyntaxData(syndata.SyntaxDataBase):
"""SyntaxData object for Django"""
def __init__(self, langid):
super(SyntaxData, self).__init__(langid)
# Setup
self.SetLexer(stc.STC_LEX_CONTAINER)
self.RegisterFeature(synglob.FEATURE_STYLETEXT, StyleText)
def GetKeywords(self):
"""Returns Specified Keywords List """
return [(1, KEYWORDS)]
def GetSyntaxSpec(self):
"""Syntax Specifications """
return SYNTAX_ITEMS
def GetCommentPattern(self):
"""Returns a list of characters used to comment a block of code """
return [u"#",]
#-----------------------------------------------------------------------------#
def StyleText(stc, start, end):
"""Style the text
@param stc: Styled text control instance
@param start: Start position
@param end: end position
"""
cpos = 0
stc.StartStyling(cpos, 0x1f)
lexer = get_lexer_by_name("html+django")
doctxt = stc.GetTextRange(0, end)
wineol = stc.GetEOLChar() == "\r\n"
# Need to convert to UTF-8 in order to calculate
# correct positions in STC.
try:
doctxt = doctxt.encode('utf-8')
except:
pass
for token, txt in lexer.get_tokens(doctxt):
# print token, txt
style = TOKEN_MAP.get(token, STC_DJANGO_DEFAULT)
if style == STC_DJANGO_PREPROCESSOR and txt.startswith(u'#'):
style = STC_DJANGO_COMMENT
# elif style == STC_DJANGO_STRING and txt[-1] not in '"\'':
# style = STC_DJANGO_STRINGEOL
tlen = len(txt)
if wineol and "\n" in txt:
tlen += txt.count("\n")
if tlen:
stc.SetStyling(tlen, style)
cpos += tlen
stc.StartStyling(cpos, 0x1f)
#-----------------------------------------------------------------------------#
TOKEN_MAP = { Token.Literal.String : STC_DJANGO_STRING,
Token.Comment.Preproc : STC_DJANGO_PREPROCESSOR,
Token.Comment : STC_DJANGO_COMMENT,
Token.Name.Builtin : STC_DJANGO_BUILTIN,
Token.Operator : STC_DJANGO_OPERATOR,
Token.Punctuation : STC_DJANGO_OPERATOR,
Token.Number : STC_DJANGO_NUMBER,
Token.Keyword : STC_DJANGO_KEYWORD,
Token.Name.Attribute : STC_DJANGO_ATTRIBUTE,
Token.String.Interpol : STC_DJANGO_SCALAR,
Token.Name.Tag : STC_DJANGO_TAG }