141 lines
3.7 KiB
Plaintext
141 lines
3.7 KiB
Plaintext
{
|
|
This file is part of logfilter.
|
|
|
|
Copyright (C) 2015 Andreas Schneider
|
|
|
|
logfilter is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
logfilter is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with logfilter. If not, see <http://www.gnu.org/licenses/>.
|
|
}
|
|
unit UFilter;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
{.$define debugmatches}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, fgl, RegExpr;
|
|
|
|
type
|
|
{ THighlightFilter }
|
|
|
|
THighlightFilter = class
|
|
Expression: TRegExpr;
|
|
FGColor: Byte;
|
|
BGColor: Byte;
|
|
Group: Byte;
|
|
constructor Create(AString: String);
|
|
destructor Destroy; override;
|
|
class var
|
|
FilterExpression: TRegExpr;
|
|
ParamExpression: TRegExpr;
|
|
end;
|
|
TFilterList = specialize TFPGObjectList<THighlightFilter>;
|
|
|
|
{ TGroupRange }
|
|
|
|
TGroupRange = record
|
|
StartIdx: Integer;
|
|
EndIdx: Integer;
|
|
end;
|
|
TGroupRanges = array of TGroupRange;
|
|
|
|
{ TLineFilter }
|
|
|
|
TLineFilter = class
|
|
constructor Create(AExpression: String);
|
|
destructor Destroy; override;
|
|
protected
|
|
FExpression: TRegExpr;
|
|
FFilters: TFilterList;
|
|
public
|
|
function Matches(ALine: String; var GroupRanges: TGroupRanges): Boolean;
|
|
property Filters: TFilterList read FFilters;
|
|
end;
|
|
TLineFilters = specialize TFPGObjectList<TLineFilter>;
|
|
|
|
implementation
|
|
|
|
{ THighlightFilter }
|
|
|
|
constructor THighlightFilter.Create(AString: String);
|
|
begin
|
|
FGColor := $FF;
|
|
BGColor := $FF;
|
|
Group := $FF;
|
|
if FilterExpression.Exec(AString) then
|
|
begin
|
|
Expression := TRegExpr.Create(Copy(AString, 1, FilterExpression.MatchPos[0] - 1));
|
|
if ParamExpression.Exec(FilterExpression.Match[0]) then
|
|
repeat
|
|
if ParamExpression.Match[1] = 'FG' then
|
|
FGColor := StrToInt(ParamExpression.Match[2])
|
|
else if ParamExpression.Match[1] = 'BG' then
|
|
BGColor := StrToInt(ParamExpression.Match[2])
|
|
else if ParamExpression.Match[1] = 'Grp' then
|
|
Group := StrToInt(ParamExpression.Match[2]);
|
|
until not ParamExpression.ExecNext;
|
|
end else
|
|
Expression := TRegExpr.Create(AString);
|
|
end;
|
|
|
|
destructor THighlightFilter.Destroy;
|
|
begin
|
|
Expression.Free;
|
|
inherited Destroy;
|
|
end;
|
|
|
|
{ TLineFilter }
|
|
|
|
constructor TLineFilter.Create(AExpression: String);
|
|
begin
|
|
FExpression := TRegExpr.Create(AExpression);
|
|
FFilters := TFilterList.Create;
|
|
end;
|
|
|
|
destructor TLineFilter.Destroy;
|
|
begin
|
|
FExpression.Free;
|
|
FFilters.Free;
|
|
inherited Destroy;
|
|
end;
|
|
|
|
function TLineFilter.Matches(ALine: String; var GroupRanges: TGroupRanges
|
|
): Boolean;
|
|
var
|
|
i: Integer;
|
|
begin
|
|
Result := FExpression.Exec(ALine);
|
|
if Result then
|
|
begin
|
|
{$ifdef debugmatches}writeln(' Match: ', FExpression.Match[0]);{$endif}
|
|
SetLength(GroupRanges, FExpression.SubExprMatchCount + 1);
|
|
for i := 0 to FExpression.SubExprMatchCount do
|
|
begin
|
|
{$ifdef debugmatches}writeln(' [', i, ']: ', FExpression.Match[i]);{$endif}
|
|
GroupRanges[i].StartIdx := FExpression.MatchPos[i];
|
|
GroupRanges[i].EndIdx := GroupRanges[i].StartIdx + FExpression.MatchLen[i];
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
initialization
|
|
THighlightFilter.FilterExpression := TRegExpr.Create('( (FG|BG|Grp)(\d+))*$');
|
|
THighlightFilter.ParamExpression := TRegExpr.Create('(FG|BG|Grp)(\d+)');
|
|
finalization
|
|
THighlightFilter.FilterExpression.Free;
|
|
THighlightFilter.ParamExpression.Free;
|
|
end.
|
|
|