mirror of
https://github.com/notepad-plus-plus/notepad-plus-plus.git
synced 2025-04-08 17:15:37 +02:00
Scintilla 5.4.1 https://www.scintilla.org/scintilla541.zip Released 27 December 2023. 1. Add IDocumentEditable interface to allow efficient interaction with document objects which may not be visible in a Scintilla instance. This feature is provisonal and may change before being declared stable. For better type-safety, the ScintillaCall C++ API uses IDocumentEditable* where void* was used before which may require changes to client code that uses document pointer APIs DocPointer, SetDocPointer, CreateDocument, AddRefDocument, and ReleaseDocument. 2. Ctrl-click on a selection deselects it in multiple selection mode. 3. Add SCI_SELECTIONFROMPOINT for modifying multiple selections. 4. Add SCI_SETMOVEEXTENDSSELECTION and SCI_CHANGESELECTIONMODE to simplify selection mode manipulation. 5. Improve performance of global replace by reducing cache invalidation overhead. [Feature #1502](https://sourceforge.net/p/scintilla/feature-requests/1502/). 6. Fix regular expression search for "\<" matching beginning of search when not beginning of word and for "\>" not matching line end. [Bug #2157](https://sourceforge.net/p/scintilla/bugs/2157/). 7. Fix regular expression search failure when search for "\<" followed by search for "\>". [Bug #2413](https://sourceforge.net/p/scintilla/bugs/2413/). 8. Fix regular expression assertion (^, $, \b. \B) failures when using SCFIND_CXX11REGEX. [Bug #2405](https://sourceforge.net/p/scintilla/bugs/2405/). 9. Fix regular expression bug in reverse direction where shortened match returned. [Bug #2405](https://sourceforge.net/p/scintilla/bugs/2405/). 10. Avoid character fragments in regular expression search results. [Bug #2405](https://sourceforge.net/p/scintilla/bugs/2405/). 11. With a document that does not have the SC_DOCUMENTOPTION_TEXT_LARGE option set, allocating more than 2G (calling SCI_ALLOCATE or similar) will now fail with SC_STATUS_FAILURE. 12. Protect SCI_REPLACETARGET, SCI_REPLACETARGETMINIMAL, and SCI_REPLACETARGETRE from application changing target in notification handlers. [Bug #2289](https://sourceforge.net/p/scintilla/bugs/2289/). Lexilla 5.3.0 https://www.scintilla.org/lexilla530.zip Released 27 December 2023. 1. Fix calling AddStaticLexerModule by defining as C++ instead of C which matches header. [Bug #2421](https://sourceforge.net/p/scintilla/bugs/2421/). 2. Bash: Fix shift operator << incorrectly recognized as here-doc. [Issue #215](https://github.com/ScintillaOrg/lexilla/issues/215). 3. Bash: Fix termination of '${' with first unquoted '}' instead of nesting. [Issue #216](https://github.com/ScintillaOrg/lexilla/issues/216). 4. HTML: JavaScript double-quoted strings may escape line end with '\'. [Issue #214](https://github.com/ScintillaOrg/lexilla/issues/214). 5. Lua: recognize --- doc comments. Defined by [LDoc](https://github.com/lunarmodules/ldoc). Does not recognize --[[-- doc comments which seem less common. Close #14375
148 lines
4.3 KiB
Python
148 lines
4.3 KiB
Python
#!/usr/bin/env python3
|
|
# Face.py - module for reading and parsing Scintilla.iface file
|
|
# Implemented 2000 by Neil Hodgson neilh@scintilla.org
|
|
# Released to the public domain.
|
|
# Requires Python 2.7 or later
|
|
|
|
def sanitiseLine(line):
|
|
line = line.rstrip('\n')
|
|
if "##" in line:
|
|
line = line[:line.find("##")]
|
|
line = line.strip()
|
|
return line
|
|
|
|
def decodeFunction(featureVal):
|
|
retType, rest = featureVal.split(" ", 1)
|
|
nameIdent, params = rest.split("(")
|
|
name, value = nameIdent.split("=")
|
|
params, rest = params.split(")")
|
|
param1, param2 = params.split(",")
|
|
return retType, name, value, param1, param2
|
|
|
|
def decodeEvent(featureVal):
|
|
retType, rest = featureVal.split(" ", 1)
|
|
nameIdent, params = rest.split("(")
|
|
name, value = nameIdent.split("=")
|
|
return retType, name, value
|
|
|
|
def decodeParam(p):
|
|
param = p.strip()
|
|
type = ""
|
|
name = ""
|
|
value = ""
|
|
if " " in param:
|
|
type, nv = param.split(" ")
|
|
if "=" in nv:
|
|
name, value = nv.split("=")
|
|
else:
|
|
name = nv
|
|
return type, name, value
|
|
|
|
def IsEnumeration(t):
|
|
return t[:1].isupper()
|
|
|
|
def PascalCase(s):
|
|
capitalized = s.title()
|
|
# Remove '_' except between digits
|
|
pascalCase = ""
|
|
characterPrevious = " "
|
|
# Loop until penultimate character
|
|
for i in range(len(capitalized)-1):
|
|
character = capitalized[i]
|
|
characterNext = capitalized[i+1]
|
|
if character != "_" or (
|
|
characterPrevious.isnumeric() and characterNext.isnumeric()):
|
|
pascalCase += character
|
|
characterPrevious = character
|
|
# Add last character - not between digits so no special treatment
|
|
pascalCase += capitalized[-1]
|
|
return pascalCase
|
|
|
|
class Face:
|
|
|
|
def __init__(self):
|
|
self.order = []
|
|
self.features = {}
|
|
self.values = {}
|
|
self.events = {}
|
|
self.aliases = {}
|
|
|
|
def ReadFromFile(self, name):
|
|
currentCategory = ""
|
|
currentComment = []
|
|
currentCommentFinished = 0
|
|
file = open(name)
|
|
for line in file.readlines():
|
|
line = sanitiseLine(line)
|
|
if line:
|
|
if line[0] == "#":
|
|
if line[1] == " ":
|
|
if currentCommentFinished:
|
|
currentComment = []
|
|
currentCommentFinished = 0
|
|
currentComment.append(line[2:])
|
|
else:
|
|
currentCommentFinished = 1
|
|
featureType, featureVal = line.split(" ", 1)
|
|
if featureType in ["fun", "get", "set"]:
|
|
try:
|
|
retType, name, value, param1, param2 = decodeFunction(featureVal)
|
|
except ValueError:
|
|
print("Failed to decode %s" % line)
|
|
raise
|
|
p1 = decodeParam(param1)
|
|
p2 = decodeParam(param2)
|
|
self.features[name] = {
|
|
"FeatureType": featureType,
|
|
"ReturnType": retType,
|
|
"Value": value,
|
|
"Param1Type": p1[0], "Param1Name": p1[1], "Param1Value": p1[2],
|
|
"Param2Type": p2[0], "Param2Name": p2[1], "Param2Value": p2[2],
|
|
"Category": currentCategory, "Comment": currentComment
|
|
}
|
|
if value in self.values:
|
|
raise Exception("Duplicate value " + value + " " + name)
|
|
self.values[value] = 1
|
|
self.order.append(name)
|
|
currentComment = []
|
|
elif featureType == "evt":
|
|
retType, name, value = decodeEvent(featureVal)
|
|
self.features[name] = {
|
|
"FeatureType": featureType,
|
|
"ReturnType": retType,
|
|
"Value": value,
|
|
"Category": currentCategory, "Comment": currentComment
|
|
}
|
|
if value in self.events:
|
|
raise Exception("Duplicate event " + value + " " + name)
|
|
self.events[value] = 1
|
|
self.order.append(name)
|
|
elif featureType == "cat":
|
|
currentCategory = featureVal
|
|
elif featureType == "val":
|
|
try:
|
|
name, value = featureVal.split("=", 1)
|
|
except ValueError:
|
|
print("Failure %s" % featureVal)
|
|
raise Exception()
|
|
self.features[name] = {
|
|
"FeatureType": featureType,
|
|
"Category": currentCategory,
|
|
"Value": value }
|
|
self.order.append(name)
|
|
elif featureType == "enu" or featureType == "lex":
|
|
name, value = featureVal.split("=", 1)
|
|
self.features[name] = {
|
|
"FeatureType": featureType,
|
|
"Category": currentCategory,
|
|
"Value": value,
|
|
"Comment": currentComment }
|
|
self.order.append(name)
|
|
currentComment = []
|
|
elif featureType == "ali":
|
|
# Enumeration alias
|
|
name, value = featureVal.split("=", 1)
|
|
self.aliases[name] = value
|
|
currentComment = []
|
|
file.close()
|