{ 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 . } 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; { 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; 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.