diff options
Diffstat (limited to 'scripts/LexGen.py')
-rw-r--r-- | scripts/LexGen.py | 70 |
1 files changed, 69 insertions, 1 deletions
diff --git a/scripts/LexGen.py b/scripts/LexGen.py index ba179eee0..ae7ae99d5 100644 --- a/scripts/LexGen.py +++ b/scripts/LexGen.py @@ -8,9 +8,12 @@ # Files are regenerated in place with templates stored in comments. # The format of generation comments is documented in FileGenerator.py. -from FileGenerator import Regenerate, UpdateLineInFile, ReplaceREInFile, UpdateLineInPlistFile +from FileGenerator import Regenerate, UpdateLineInFile, \ + ReplaceREInFile, UpdateLineInPlistFile, ReadFileAsList, UpdateFileFromLines, \ + FindSectionInList import ScintillaData import HFacer +import uuid def UpdateVersionNumbers(sci, root): UpdateLineInFile(root + "win32/ScintRes.rc", "#define VERSION_SCINTILLA", @@ -43,6 +46,68 @@ def UpdateVersionNumbers(sci, root): UpdateLineInPlistFile(root + "cocoa/ScintillaFramework/Info.plist", "CFBundleShortVersionString", sci.versionDotted) +# Last 24 digits of UUID, used for item IDs in Xcode +def uid24(): + return str(uuid.uuid4()).replace("-", "").upper()[-24:] + +def ciLexerKey(a): + return a.split()[2].lower() + +""" + 11F35FDB12AEFAF100F0236D /* LexA68k.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 11F35FDA12AEFAF100F0236D /* LexA68k.cxx */; }; + 11F35FDA12AEFAF100F0236D /* LexA68k.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = LexA68k.cxx; path = ../../lexers/LexA68k.cxx; sourceTree = SOURCE_ROOT; }; + 11F35FDA12AEFAF100F0236D /* LexA68k.cxx */, + 11F35FDB12AEFAF100F0236D /* LexA68k.cxx in Sources */, +""" +def RegenerateXcodeProject(path, lexers, lexerReferences): + # Build 4 blocks for insertion: + # Each markers contains a unique section start, an optional wait string, and a section end + + markersPBXBuildFile = ["Begin PBXBuildFile section", "", "End PBXBuildFile section"] + sectionPBXBuildFile = [] + + markersPBXFileReference = ["Begin PBXFileReference section", "", "End PBXFileReference section"] + sectionPBXFileReference = [] + + markersLexers = ["/* Lexers */ =", "children", ");"] + sectionLexers = [] + + markersPBXSourcesBuildPhase = ["Begin PBXSourcesBuildPhase section", "files", ");"] + sectionPBXSourcesBuildPhase = [] + + for lexer in lexers: + if lexer not in lexerReferences: + uid1 = uid24() + uid2 = uid24() + print("Lexer", lexer, "is not in Xcode project. Use IDs", uid1, uid2) + lexerReferences[lexer] = [uid1, uid2] + linePBXBuildFile = "\t\t{} /* {}.cxx in Sources */ = {{isa = PBXBuildFile; fileRef = {} /* {}.cxx */; }};".format(uid1, lexer, uid2, lexer) + linePBXFileReference = "\t\t{} /* {}.cxx */ = {{isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = {}.cxx; path = ../../lexers/{}.cxx; sourceTree = SOURCE_ROOT; }};".format(uid2, lexer, lexer, lexer) + lineLexers = "\t\t\t\t{} /* {}.cxx */,".format(uid2, lexer) + linePBXSourcesBuildPhase = "\t\t\t\t{} /* {}.cxx in Sources */,".format(uid1, lexer) + sectionPBXBuildFile.append(linePBXBuildFile) + sectionPBXFileReference.append(linePBXFileReference) + sectionLexers.append(lineLexers) + sectionPBXSourcesBuildPhase.append(linePBXSourcesBuildPhase) + + lines = ReadFileAsList(path) + + sli = FindSectionInList(lines, markersPBXBuildFile) + lines[sli.stop:sli.stop] = sectionPBXBuildFile + + sli = FindSectionInList(lines, markersPBXFileReference) + lines[sli.stop:sli.stop] = sectionPBXFileReference + + sli = FindSectionInList(lines, markersLexers) + # This section is shown in the project outline so sort it to make it easier to navigate. + allLexers = sorted(lines[sli.start:sli.stop] + sectionLexers, key=ciLexerKey) + lines[sli] = allLexers + + sli = FindSectionInList(lines, markersPBXSourcesBuildPhase) + lines[sli.stop:sli.stop] = sectionPBXSourcesBuildPhase + + UpdateFileFromLines(path, lines, "\n") + def RegenerateAll(root): sci = ScintillaData.ScintillaData(root) @@ -50,6 +115,9 @@ def RegenerateAll(root): Regenerate(root + "src/Catalogue.cxx", "//", sci.lexerModules) Regenerate(root + "win32/scintilla.mak", "#", sci.lexFiles) + RegenerateXcodeProject(root + "cocoa/ScintillaFramework/ScintillaFramework.xcodeproj/project.pbxproj", + sci.lexFiles, sci.lexersXcode) + UpdateVersionNumbers(sci, root) HFacer.RegenerateAll(root, False) |