diff options
Diffstat (limited to 'scripts/ScintillaData.py')
-rw-r--r-- | scripts/ScintillaData.py | 188 |
1 files changed, 3 insertions, 185 deletions
diff --git a/scripts/ScintillaData.py b/scripts/ScintillaData.py index a8cbb9872..355b5d471 100644 --- a/scripts/ScintillaData.py +++ b/scripts/ScintillaData.py @@ -15,143 +15,11 @@ # mdyModified # dmyModified # myModified -# -# Information about lexers and properties defined in lexers -# lexFiles -# sorted list of lexer files -# lexerModules -# sorted list of module names -# lexerProperties -# sorted list of lexer properties -# propertyDocuments -# dictionary of property documentation { name: document string } -# sclexFromName -# dictionary of SCLEX_* IDs { name: SCLEX_ID } -# fileFromSclex -# dictionary of file names { SCLEX_ID: file name } # This file can be run to see the data it provides. # Requires Python 3.6 or later -import datetime, pathlib, sys, textwrap - -import FileGenerator - -def FindModules(lexFile): - modules = [] - partLine = "" - with lexFile.open() as f: - for l in f.readlines(): - l = l.rstrip() - if partLine or l.startswith("LexerModule"): - if ")" in l: - l = partLine + l - l = l.replace("(", " ") - l = l.replace(")", " ") - l = l.replace(",", " ") - parts = l.split() - modules.append([parts[1], parts[2], parts[4][1:-1]]) - partLine = "" - else: - partLine = partLine + l - return modules - -def FindLexersInXcode(xCodeProject): - lines = FileGenerator.ReadFileAsList(xCodeProject) - - uidsOfBuild = {} - markersPBXBuildFile = ["Begin PBXBuildFile section", "", "End PBXBuildFile section"] - for buildLine in lines[FileGenerator.FindSectionInList(lines, markersPBXBuildFile)]: - # Occurs for each file in the build. Find the UIDs used for the file. - #\t\t[0-9A-F]+ /* [a-zA-Z]+.cxx in sources */ = {isa = PBXBuildFile; fileRef = [0-9A-F]+ /* [a-zA-Z]+ */; }; - pieces = buildLine.split() - uid1 = pieces[0] - filename = pieces[2].split(".")[0] - uid2 = pieces[12] - uidsOfBuild[filename] = [uid1, uid2] - - lexers = {} - markersLexers = ["/* Lexers */ =", "children", ");"] - for lexerLine in lines[FileGenerator.FindSectionInList(lines, markersLexers)]: - #\t\t\t\t[0-9A-F]+ /* [a-zA-Z]+.cxx */, - uid, _, rest = lexerLine.partition("/* ") - uid = uid.strip() - lexer, _, _ = rest.partition(".") - lexers[lexer] = uidsOfBuild[lexer] - - return lexers - -# Properties that start with lexer. or fold. are automatically found but there are some -# older properties that don't follow this pattern so must be explicitly listed. -knownIrregularProperties = [ - "fold", - "styling.within.preprocessor", - "tab.timmy.whinge.level", - "asp.default.language", - "html.tags.case.sensitive", - "ps.level", - "ps.tokenize", - "sql.backslash.escapes", - "nsis.uservars", - "nsis.ignorecase" -] - -def FindProperties(lexFile): - properties = {} - with open(lexFile) as f: - for l in f.readlines(): - if ("GetProperty" in l or "DefineProperty" in l) and "\"" in l: - l = l.strip() - if not l.startswith("//"): # Drop comments - propertyName = l.split("\"")[1] - if propertyName.lower() == propertyName: - # Only allow lower case property names - if propertyName in knownIrregularProperties or \ - propertyName.startswith("fold.") or \ - propertyName.startswith("lexer."): - properties[propertyName] = 1 - return properties - -def FindPropertyDocumentation(lexFile): - documents = {} - with lexFile.open() as f: - name = "" - for l in f.readlines(): - l = l.strip() - if "// property " in l: - propertyName = l.split()[2] - if propertyName.lower() == propertyName: - # Only allow lower case property names - name = propertyName - documents[name] = "" - elif "DefineProperty" in l and "\"" in l: - propertyName = l.split("\"")[1] - if propertyName.lower() == propertyName: - # Only allow lower case property names - name = propertyName - documents[name] = "" - elif name: - if l.startswith("//"): - if documents[name]: - documents[name] += " " - documents[name] += l[2:].strip() - elif l.startswith("\""): - l = l[1:].strip() - if l.endswith(";"): - l = l[:-1].strip() - if l.endswith(")"): - l = l[:-1].strip() - if l.endswith("\""): - l = l[:-1] - # Fix escaped double quotes - l = l.replace("\\\"", "\"") - documents[name] += l - else: - name = "" - for name in list(documents.keys()): - if documents[name] == "": - del documents[name] - return documents +import datetime, pathlib, sys def FindCredits(historyFile, removeLinks=True): credits = [] @@ -166,8 +34,8 @@ def FindCredits(historyFile, removeLinks=True): if stage == 1 and l.startswith("<td>"): credit = l[4:-5] if removeLinks and "<a" in l: - title, a, rest = credit.partition("<a href=") - urlplus, bracket, end = rest.partition(">") + title, _a, rest = credit.partition("<a href=") + urlplus, _bracket, end = rest.partition(">") name = end.split("<")[0] url = urlplus[1:-1] credit = title.strip() @@ -177,12 +45,6 @@ def FindCredits(historyFile, removeLinks=True): credits.append(credit) return credits -def ciKey(a): - return str(a).lower() - -def SortListInsensitive(l): - l.sort(key=ciKey) - class ScintillaData: def __init__(self, scintillaRoot): # Discover version information @@ -208,57 +70,13 @@ class ScintillaData: # ScintillaHistory.html -- only first should change self.myModified = monthModified + " " + self.yearModified - # Find all the lexer source code files - lexFilePaths = list((scintillaRoot / "lexers").glob("Lex*.cxx")) - SortListInsensitive(lexFilePaths) - self.lexFiles = [f.stem for f in lexFilePaths] - self.lexerModules = [] - lexerProperties = set() - self.propertyDocuments = {} - self.sclexFromName = {} - self.fileFromSclex = {} - for lexFile in lexFilePaths: - modules = FindModules(lexFile) - for module in modules: - self.sclexFromName[module[2]] = module[1] - self.fileFromSclex[module[1]] = lexFile - self.lexerModules.append(module[0]) - for k in FindProperties(lexFile).keys(): - lexerProperties.add(k) - documents = FindPropertyDocumentation(lexFile) - for k in documents.keys(): - if k not in self.propertyDocuments: - self.propertyDocuments[k] = documents[k] - SortListInsensitive(self.lexerModules) - self.lexerProperties = list(lexerProperties) - SortListInsensitive(self.lexerProperties) - self.credits = FindCredits(scintillaRoot / "doc" / "ScintillaHistory.html") -def printWrapped(text): - print(textwrap.fill(text, subsequent_indent=" ")) - if __name__=="__main__": sci = ScintillaData(pathlib.Path(__file__).resolve().parent.parent) print("Version %s %s %s" % (sci.version, sci.versionDotted, sci.versionCommad)) print("Date last modified %s %s %s %s %s" % ( sci.dateModified, sci.yearModified, sci.mdyModified, sci.dmyModified, sci.myModified)) - printWrapped(str(len(sci.lexFiles)) + " lexer files: " + ", ".join(sci.lexFiles)) - printWrapped(str(len(sci.lexerModules)) + " lexer modules: " + ", ".join(sci.lexerModules)) - print("Lexer name to ID:") - lexNames = sorted(sci.sclexFromName.keys()) - for lexName in lexNames: - sclex = sci.sclexFromName[lexName] - fileName = sci.fileFromSclex[sclex].name - print(" " + lexName + " -> " + sclex + " in " + fileName) - printWrapped("Lexer properties: " + ", ".join(sci.lexerProperties)) - print("Lexer property documentation:") - documentProperties = list(sci.propertyDocuments.keys()) - SortListInsensitive(documentProperties) - for k in documentProperties: - print(" " + k) - print(textwrap.fill(sci.propertyDocuments[k], initial_indent=" ", - subsequent_indent=" ")) print("Credits:") for c in sci.credits: sys.stdout.buffer.write(b" " + c.encode("utf-8") + b"\n") |