diff options
| -rw-r--r-- | lexilla/scripts/LexillaGen.py | 90 | 
1 files changed, 88 insertions, 2 deletions
| diff --git a/lexilla/scripts/LexillaGen.py b/lexilla/scripts/LexillaGen.py index eaa48f1d9..af7789c8b 100644 --- a/lexilla/scripts/LexillaGen.py +++ b/lexilla/scripts/LexillaGen.py @@ -8,15 +8,85 @@  # Files are regenerated in place with templates stored in comments.  # The format of generation comments is documented in FileGenerator.py. -import pathlib, sys +import os, pathlib, sys, uuid -sys.path.append(str(pathlib.Path(__file__).resolve().parent.parent.parent / "scripts")) +thisPath = pathlib.Path(__file__).resolve() + +sys.path.append(str(thisPath.parent.parent.parent / "scripts"))  from FileGenerator import Regenerate, UpdateLineInFile, \      ReplaceREInFile, UpdateLineInPlistFile, ReadFileAsList, UpdateFileFromLines, \      FindSectionInList  import ScintillaData +sys.path.append(str(thisPath.parent.parent / "src")) +import DepGen + +# RegenerateXcodeProject and assiciated functions is copied from scintilla/scripts/LexGen.py + +# 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(rootDirectory):      root = pathlib.Path(rootDirectory) @@ -42,5 +112,21 @@ def RegenerateAll(rootDirectory):      UpdateLineInFile(rcPath, "#define VERSION_WORDS",          "#define VERSION_WORDS " + versionCommad) +    lexillaXcode = lexillaDir / "src" / "Lexilla" +    lexillaXcodeProject = lexillaXcode / "Lexilla.xcodeproj" / "project.pbxproj" + +    lexerReferences = ScintillaData.FindLexersInXcode(lexillaXcodeProject) + +    UpdateLineInPlistFile(lexillaXcode / "Lexilla" / "Info.plist", +        "CFBundleShortVersionString", versionDotted) + +    ReplaceREInFile(lexillaXcodeProject, "CURRENT_PROJECT_VERSION = [0-9.]+;", +        f'CURRENT_PROJECT_VERSION = {versionDotted};') + +    RegenerateXcodeProject(lexillaXcodeProject, sci.lexFiles, lexerReferences) + +    os.chdir(srcDir) +    DepGen.Generate() +  if __name__=="__main__":      RegenerateAll(pathlib.Path(__file__).resolve().parent.parent.parent) | 
