Skip to content

Commit 304cd26

Browse files
committed
feat: support European umlauts/accents as \w (word char) in some regular expression areas
1 parent 2e31c5e commit 304cd26

File tree

3 files changed

+32
-18
lines changed

3 files changed

+32
-18
lines changed

source/extra_controls.pas

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ {TExtHintWindow = class(THintWindow)
7474

7575
implementation
7676

77+
uses generic_types;
7778

7879
{ TExtForm }
7980

@@ -261,15 +262,15 @@ class procedure TExtForm.RestoreListSetup( List: TLazVirtualStringTree );
261262

262263
procedure TExtForm.FilterNodesByEdit(Edit: TEditButton; Tree: TLazVirtualStringTree);
263264
var
264-
rx: TRegExpr;
265+
rx: TRegExprUmlauts;
265266
Node: PVirtualNode;
266267
i: Integer;
267268
match: Boolean;
268269
CellText: String;
269270
begin
270271
// Loop through all tree nodes and hide non matching
271272
Node := Tree.GetFirst;
272-
rx := TRegExpr.Create;
273+
rx := TRegExprUmlauts.Create;
273274
rx.ModifierI := True;
274275
rx.Expression := Edit.Text;
275276
try

source/generic_types.pas

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
interface
66

7-
uses fpjson, jsonparser, SysUtils;
7+
uses fpjson, jsonparser, SysUtils, RegExpr;
88

99
type
1010
TThreeStateBoolean = (nbUnset, nbFalse, nbTrue);
@@ -14,6 +14,12 @@ TJSONFloatNumberUntouched = class(TJSONFloatNumber)
1414
function GetAsString: TJSONStringType; override;
1515
end;
1616

17+
// Regular expression with support for European umlauts/accents as \w (word character)
18+
TRegExprUmlauts = class(TRegExpr)
19+
public
20+
constructor Create;
21+
end;
22+
1723
TFileExtImageIndex = record
1824
Ext: String;
1925
ImageIndex: Integer;
@@ -77,6 +83,14 @@ function TJSONFloatNumberUntouched.GetAsString: TJSONStringType;
7783
Delete(Result, High(Result), 1);
7884
end;
7985

86+
{ TRegExprUmlauts }
87+
88+
constructor TRegExprUmlauts.Create;
89+
begin
90+
inherited Create;
91+
WordChars := WordChars + 'äÄöÖüÜÿŸáÁéÉíÍóÓúÚýÝćĆńŃŕŔśŚźŹĺĹàÀèÈìÌòÒùÙâÂêÊîÎôÔûÛãÃõÕñÑçÇşŞţŢåÅæÆœŒøØß';
92+
end;
93+
8094
initialization
8195

8296
SetJSONInstanceType(jitNumberFloat, TJSONFloatNumberUntouched);

source/main.pas

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7269,10 +7269,7 @@ procedure TMainForm.GlobalSynEditStatusChange(Sender: TObject; Changes: TSynStat
72697269
Edit := Sender as TSynEdit;
72707270
MarkupWordSelection := Edit.MarkupByClass[TMarkupWordSelection] as TMarkupWordSelection;
72717271
if Assigned(MarkupWordSelection) then begin
7272-
if ExecRegExprI('^\w+$', Edit.SelText) then
7273-
MarkupWordSelection.SetWordToHighlight(Edit.SelText)
7274-
else
7275-
MarkupWordSelection.SetWordToHighlight('');
7272+
MarkupWordSelection.SetWordToHighlight(Edit.SelText)
72767273
end;
72777274
end;
72787275

@@ -8982,7 +8979,7 @@ procedure TMainForm.ApplyVTFilter(FromTimer: Boolean);
89828979
tab: TTabSheet;
89838980
VisibleCount: Cardinal;
89848981
CellText: String;
8985-
rx: TRegExpr;
8982+
rx: TRegExprUmlauts;
89868983
OldDataLocalNumberFormat: Boolean;
89878984
OldImageIndex: Integer;
89888985
begin
@@ -9025,7 +9022,7 @@ procedure TMainForm.ApplyVTFilter(FromTimer: Boolean);
90259022
TreeIsInsideUpdate := tsUpdating in VT.TreeStates;
90269023
// Loop through all nodes and hide non matching
90279024
Node := VT.GetFirst;
9028-
rx := TRegExpr.Create;
9025+
rx := TRegExprUmlauts.Create;
90299026
rx.ModifierI := True;
90309027
rx.Expression := editFilterVT.Text;
90319028
if rx.Expression <> '' then try
@@ -9052,10 +9049,12 @@ procedure TMainForm.ApplyVTFilter(FromTimer: Boolean);
90529049
match := rx.Expression = '';
90539050
// Search for given text in node's captions
90549051
if not match then for i := 0 to VT.Header.Columns.Count - 1 do begin
9055-
CellText := VT.Text[Node, i];
9056-
match := rx.Exec(CellText);
9057-
if match then
9058-
break;
9052+
if coVisible in VT.Header.Columns[i].Options then begin
9053+
CellText := VT.Text[Node, i];
9054+
match := rx.Exec(CellText);
9055+
if match then
9056+
break;
9057+
end;
90599058
end;
90609059
VT.IsVisible[Node] := match;
90619060
if match then
@@ -12534,17 +12533,17 @@ procedure TMainForm.editDatabaseTableFilterChange(Sender: TObject);
1253412533
var
1253512534
Node: PVirtualNode;
1253612535
Obj: PDBObject;
12537-
rxdb, rxtable: TRegExpr;
12536+
rxdb, rxtable: TRegExprUmlauts;
1253812537
NodeMatches: Boolean;
1253912538
Errors: TStringList;
1254012539
begin
1254112540
// Immediately apply database filter
1254212541
LogSQL('editDatabaseTableFilterChange', lcDebug);
1254312542

12544-
rxdb := TRegExpr.Create;
12543+
rxdb := TRegExprUmlauts.Create;
1254512544
rxdb.ModifierI := True;
1254612545
rxdb.Expression := '('+StringReplace(editDatabaseFilter.Text, ';', '|', [rfReplaceAll])+')';
12547-
rxtable := TRegExpr.Create;
12546+
rxtable := TRegExprUmlauts.Create;
1254812547
rxtable.ModifierI := True;
1254912548
rxtable.Expression := '('+StringReplace(editTableFilter.Text, ';', '|', [rfReplaceAll])+')';
1255012549

@@ -15530,7 +15529,7 @@ procedure TMarkupWordSelection.BeginMarkup;
1553015529
LineText: String;
1553115530
Ranges: TWordRanges;
1553215531
Count: Integer;
15533-
rx: TRegExpr;
15532+
rx: TRegExprUmlauts;
1553415533

1553515534
procedure AddRange(AStartCol, AEndCol: Integer);
1553615535
begin
@@ -15549,7 +15548,7 @@ procedure TMarkupWordSelection.BeginMarkup;
1554915548
L := SynEdit.Lines.Count;
1555015549
SetLength(FLineRanges, L);
1555115550

15552-
rx := TRegExpr.Create;
15551+
rx := TRegExprUmlauts.Create;
1555315552
rx.Expression := '\b(' + QuoteRegExprMetaChars(FWord) + ')\b';
1555415553
rx.ModifierI := True;
1555515554

0 commit comments

Comments
 (0)