aboutsummaryrefslogtreecommitdiffhomepage
path: root/scripts/ScintillaData.py
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/ScintillaData.py')
-rw-r--r--scripts/ScintillaData.py188
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")