aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/LexGen.py
blob: 8d985c931f98c2f1315da4bdc351017940ccc66f (plain)
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
# LexGen.py - implemented 2002 by Neil Hodgson neilh@scintilla.org
# Released to the public domain.

# Regenerate the Scintilla and SciTE source files that list 
# all the lexers. Should be run whenever a new lexer is added or removed.
# Requires Python 2.1 or later
# The files are copied to a temporary file apart from sections between 
# a ++Autogenerated comment and a --Autogenerated comment which is 
# generated by the CopyWithInsertion function. After the temporary 
# file is created, it is copied back to the original file name.
# Does not regenerate the Visual C++ project files.

import string
import sys
import os
import glob

# Automatically generated sections contain start and end comments, 
# a definition line and the results.
# The results are replaced by regenerating based on the definition line.
# The definition line is a comment prefix followed by "**".
# Backslash is used as an escape within the definition line.
# The part between \( and \) is repeated for each item in the list.
# \* is replaced by each list item. \t, and \n are tab and newline.
def CopyWithInsertion(input, output, commentPrefix, list):
	copying = 1
	for line in input.readlines():
		if copying:
			output.write(line)
		if line.startswith(commentPrefix + "++Autogenerated"):
			copying = 0
			definition = ""
		elif not copying and line.startswith(commentPrefix + "**"):
			output.write(line)
			definition = line[len(commentPrefix + "**"):-1]
			# Hide double slashes as a control character
			definition = definition.replace("\\\\", "\001")
			# Do some normal C style transforms
			definition = definition.replace("\\n", "\n")
			definition = definition.replace("\\t", "\t")
			# Get the doubled backslashes back as single backslashes
			definition = definition.replace("\001", "\\")
			startRepeat = definition.find("\\(")
			endRepeat = definition.find("\\)")
			intro = definition[:startRepeat]
			if intro.endswith("\n"):
				pos = 0
			else:
				pos = len(intro)
			output.write(intro)
			middle = definition[startRepeat+2:endRepeat]
			for i in list:
				item = middle.replace("\\*", i)
				if pos and (pos + len(item) >= 80):
					output.write("\\\n")
					pos = 0
				output.write(item)
				pos += len(item)
				if item.endswith("\n"):
					pos = 0
			outro = definition[endRepeat+2:]
			output.write(outro)
			output.write("\n")
		elif line.startswith(commentPrefix + "--Autogenerated"):
			copying = 1
			output.write(line)

def Regenerate(filename, commentPrefix, list, outmode="wt"):
	try:
		infile = open(filename, "rt")
	except IOError:
		print "Can not open", filename
		return
	tempname = filename + ".tmp"
	out = open(tempname, outmode)
	CopyWithInsertion(infile, out, commentPrefix, list)
	out.close()
	infile.close()
	os.unlink(filename)
	os.rename(tempname, filename)

def FindModules(lexFile):
	modules = []
	f = open(lexFile)
	for l in f.readlines():
		if l.startswith("LexerModule"):
			l = l.replace("(", " ")
			modules.append(l.split()[1])
	return modules
root="../../"
lexFilePaths = glob.glob(root + "scintilla/src/Lex*.cxx")
lexFiles = [os.path.basename(f)[:-4] for f in lexFilePaths]
print lexFiles
lexerModules = []
for lexFile in lexFilePaths:
	lexerModules.extend(FindModules(lexFile))
print lexerModules
Regenerate(root + "scintilla/src/KeyWords.cxx", "//", lexerModules)
Regenerate(root + "scintilla/win32/makefile", "#", lexFiles)
Regenerate(root + "scintilla/win32/scintilla.mak", "#", lexFiles)
Regenerate(root + "scintilla/gtk/makefile", "#", lexFiles, "wb")
Regenerate(root + "scintilla/gtk/scintilla.mak", "#", lexFiles)
Regenerate(root + "scite/win32/makefile", "#", lexFiles)
Regenerate(root + "scite/win32/scite.mak", "#", lexFiles)