mirror of
				https://gitlab.com/freepascal.org/lazarus/lazarus.git
				synced 2025-11-04 05:23:12 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			435 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
			
		
		
	
	
			435 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
{-------------------------------------------------------------------------------
 | 
						|
The contents of this file are subject to the Mozilla Public License
 | 
						|
Version 1.1 (the "License"); you may not use this file except in compliance
 | 
						|
with the License. You may obtain a copy of the License at
 | 
						|
http://www.mozilla.org/MPL/
 | 
						|
 | 
						|
Software distributed under the License is distributed on an "AS IS" basis,
 | 
						|
WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
 | 
						|
the specific language governing rights and limitations under the License.
 | 
						|
 | 
						|
The Original Code is: SynHighlighterIni.pas, released 2000-04-21.
 | 
						|
The Original Code is based on the izIniSyn.pas file from the
 | 
						|
mwEdit component suite by Martin Waldenburg and other developers, the Initial
 | 
						|
Author of this file is Igor P. Zenkov.
 | 
						|
All Rights Reserved.
 | 
						|
 | 
						|
Contributors to the SynEdit and mwEdit projects are listed in the
 | 
						|
Contributors.txt file.
 | 
						|
 | 
						|
Alternatively, the contents of this file may be used under the terms of the
 | 
						|
GNU General Public License Version 2 or later (the "GPL"), in which case
 | 
						|
the provisions of the GPL are applicable instead of those above.
 | 
						|
If you wish to allow use of your version of this file only under the terms
 | 
						|
of the GPL and not to allow others to use your version of this file
 | 
						|
under the MPL, indicate your decision by deleting the provisions above and
 | 
						|
replace them with the notice and other provisions required by the GPL.
 | 
						|
If you do not delete the provisions above, a recipient may use your version
 | 
						|
of this file under either the MPL or the GPL.
 | 
						|
 | 
						|
$Id: SynHighlighterIni.pas,v 1.7 2001/11/09 07:46:17 plpolak Exp $
 | 
						|
 | 
						|
You may retrieve the latest version of this file at the SynEdit home page,
 | 
						|
located at http://SynEdit.SourceForge.net
 | 
						|
 | 
						|
Known Issues:
 | 
						|
-------------------------------------------------------------------------------}
 | 
						|
{
 | 
						|
@abstract(Provides an Ini-files highlighter for SynEdit)
 | 
						|
@author(Igor P. Zenkov, converted to SynEdit by Bruno Mikkelsen <btm@scientist.com>)
 | 
						|
@created(1999-11-02, converted to SynEdit 2000-04-21)
 | 
						|
@lastmod(2000-04-21)
 | 
						|
The SynHighlighterIni unit provides SynEdit with an Ini-files highlighter.
 | 
						|
Thanks to Primoz Gabrijelcic, Martin Waldenburg and Michael Hieke.
 | 
						|
}
 | 
						|
unit SynHighlighterIni;
 | 
						|
 | 
						|
{$I SynEdit.inc}
 | 
						|
 | 
						|
interface
 | 
						|
 | 
						|
uses
 | 
						|
  Classes,
 | 
						|
  Graphics,
 | 
						|
  SynEditTypes, SynEditHighlighter;
 | 
						|
 | 
						|
type
 | 
						|
  TtkTokenKind = (tkComment, tkText, tkSection, tkKey, tkNull, tkNumber,
 | 
						|
    tkSpace, tkString, tkSymbol, tkUnknown);
 | 
						|
 | 
						|
  TProcTableProc = procedure of object;
 | 
						|
 | 
						|
type
 | 
						|
 | 
						|
  { TSynIniSyn }
 | 
						|
 | 
						|
  TSynIniSyn = class(TSynCustomHighlighter)
 | 
						|
  private
 | 
						|
    fLine: PChar;
 | 
						|
    fLineNumber: Integer;
 | 
						|
    fProcTable: array[#0..#255] of TProcTableProc;
 | 
						|
    Run: LongInt;
 | 
						|
    fTokenPos: Integer;
 | 
						|
    FTokenID: TtkTokenKind;
 | 
						|
    fCommentAttri: TSynHighlighterAttributes;
 | 
						|
    fTextAttri: TSynHighlighterAttributes;
 | 
						|
    fSectionAttri: TSynHighlighterAttributes;
 | 
						|
    fKeyAttri: TSynHighlighterAttributes;
 | 
						|
    fNumberAttri: TSynHighlighterAttributes;
 | 
						|
    fSpaceAttri: TSynHighlighterAttributes;
 | 
						|
    fStringAttri: TSynHighlighterAttributes;
 | 
						|
    fSymbolAttri: TSynHighlighterAttributes;
 | 
						|
    procedure SectionOpenProc;
 | 
						|
    procedure KeyProc;
 | 
						|
    procedure CRProc;
 | 
						|
    procedure EqualProc;
 | 
						|
    procedure TextProc;
 | 
						|
    procedure LFProc;
 | 
						|
    procedure NullProc;
 | 
						|
    procedure NumberProc;
 | 
						|
    procedure SemiColonProc;
 | 
						|
    procedure SpaceProc;
 | 
						|
    procedure StringProc;  // ""
 | 
						|
    procedure StringProc1; // ''
 | 
						|
    procedure MakeMethodTables;
 | 
						|
  protected
 | 
						|
    {General Stuff}
 | 
						|
    function GetIdentChars: TSynIdentChars; override;
 | 
						|
    function GetSampleSource: String; override;
 | 
						|
  public
 | 
						|
    class function GetLanguageName: string; override;
 | 
						|
  public
 | 
						|
    constructor Create(AOwner: TComponent); override;
 | 
						|
    function GetDefaultAttribute(Index: integer): TSynHighlighterAttributes;   
 | 
						|
      override;
 | 
						|
    function GetEol: Boolean; override;
 | 
						|
    function GetTokenID: TtkTokenKind;
 | 
						|
    procedure SetLine(const NewValue: String; LineNumber:Integer); override;
 | 
						|
    function GetToken: String; override;
 | 
						|
    procedure GetTokenEx(out TokenStart: PChar; out TokenLength: integer); override;
 | 
						|
    function GetTokenAttribute: TSynHighlighterAttributes; override;
 | 
						|
    function GetTokenKind: integer; override;
 | 
						|
    function GetTokenPos: Integer; override;
 | 
						|
    procedure Next; override;
 | 
						|
  published
 | 
						|
    property CommentAttri: TSynHighlighterAttributes read fCommentAttri
 | 
						|
      write fCommentAttri;
 | 
						|
    property TextAttri   : TSynHighlighterAttributes read fTextAttri
 | 
						|
      write fTextAttri;
 | 
						|
    property SectionAttri: TSynHighlighterAttributes read fSectionAttri
 | 
						|
      write fSectionAttri;
 | 
						|
    property KeyAttri    : TSynHighlighterAttributes read fKeyAttri
 | 
						|
      write fKeyAttri;
 | 
						|
    property NumberAttri : TSynHighlighterAttributes read fNumberAttri
 | 
						|
      write fNumberAttri;
 | 
						|
    property SpaceAttri  : TSynHighlighterAttributes read fSpaceAttri
 | 
						|
      write fSpaceAttri;
 | 
						|
    property StringAttri : TSynHighlighterAttributes read fStringAttri
 | 
						|
      write fStringAttri;
 | 
						|
    property SymbolAttri : TSynHighlighterAttributes read fSymbolAttri
 | 
						|
      write fSymbolAttri;
 | 
						|
  end;
 | 
						|
 | 
						|
implementation
 | 
						|
 | 
						|
uses
 | 
						|
  SynEditStrConst;
 | 
						|
 | 
						|
procedure TSynIniSyn.MakeMethodTables;
 | 
						|
var
 | 
						|
  i: Char;
 | 
						|
begin
 | 
						|
  for i := #0 to #255 do
 | 
						|
    case i of
 | 
						|
      #0      : fProcTable[i] := @NullProc;
 | 
						|
      #10 {LF}: fProcTable[i] := @LFProc;
 | 
						|
      #13 {CR}: fProcTable[i] := @CRProc;
 | 
						|
      #34 {"} : fProcTable[i] := @StringProc;
 | 
						|
      #39 {'} : fProcTable[i] := @StringProc1;
 | 
						|
      '0'..'9': fProcTable[i] := @NumberProc;
 | 
						|
      #59 {;} : fProcTable[i] := @SemiColonProc;
 | 
						|
      #61 {=} : fProcTable[i] := @EqualProc;
 | 
						|
      #91 {[} : fProcTable[i] := @SectionOpenProc;
 | 
						|
      #1..#9, #11, #12, #14..#32: fProcTable[i] := @SpaceProc;
 | 
						|
    else
 | 
						|
      fProcTable[i] := @TextProc;
 | 
						|
    end;
 | 
						|
end;
 | 
						|
 | 
						|
constructor TSynIniSyn.Create(AOwner: TComponent);
 | 
						|
begin
 | 
						|
  inherited Create(AOwner);
 | 
						|
  fCommentAttri            := TSynHighlighterAttributes.Create(@SYNS_AttrComment);
 | 
						|
  fCommentAttri.Style      := [fsItalic];
 | 
						|
  fCommentAttri.Foreground := clGreen;
 | 
						|
  AddAttribute(fCommentAttri);
 | 
						|
  fTextAttri               := TSynHighlighterAttributes.Create(@SYNS_AttrText);
 | 
						|
  AddAttribute(fTextAttri);
 | 
						|
  fSectionAttri            := TSynHighlighterAttributes.Create(@SYNS_AttrSection);
 | 
						|
  fSectionAttri.Style      := [fsBold];
 | 
						|
  AddAttribute(fSectionAttri);
 | 
						|
  fKeyAttri                := TSynHighlighterAttributes.Create(@SYNS_AttrKey);
 | 
						|
  fKeyAttri.Foreground     := clBlue;
 | 
						|
  AddAttribute(fKeyAttri);
 | 
						|
  fNumberAttri             := TSynHighlighterAttributes.Create(@SYNS_AttrNumber);
 | 
						|
  AddAttribute(fNumberAttri);
 | 
						|
  fSpaceAttri              := TSynHighlighterAttributes.Create(@SYNS_AttrSpace);
 | 
						|
  AddAttribute(fSpaceAttri);
 | 
						|
  fStringAttri             := TSynHighlighterAttributes.Create(@SYNS_AttrString);
 | 
						|
  AddAttribute(fStringAttri);
 | 
						|
  fSymbolAttri             := TSynHighlighterAttributes.Create(@SYNS_AttrSymbol);
 | 
						|
  fSymbolAttri.Foreground := clRed;
 | 
						|
  AddAttribute(fSymbolAttri);
 | 
						|
  SetAttributesOnChange(@DefHighlightChange);
 | 
						|
 | 
						|
  fDefaultFilter      := SYNS_FilterINI;
 | 
						|
  MakeMethodTables;
 | 
						|
end; { Create }
 | 
						|
 | 
						|
procedure TSynIniSyn.SetLine(const NewValue: String; LineNumber:Integer);
 | 
						|
begin
 | 
						|
  inherited;
 | 
						|
  fLine := PChar(NewValue);
 | 
						|
  Run := 0;
 | 
						|
  fLineNumber := LineNumber;
 | 
						|
  Next;
 | 
						|
end; { SetLine }
 | 
						|
 | 
						|
procedure TSynIniSyn.SectionOpenProc;
 | 
						|
begin
 | 
						|
  // if it is not column 0 mark as tkText and get out of here
 | 
						|
  if Run > 0 then
 | 
						|
  begin
 | 
						|
    fTokenID := tkText;
 | 
						|
    inc(Run);
 | 
						|
    Exit;
 | 
						|
  end;
 | 
						|
 | 
						|
  // this is column 0 ok it is a Section
 | 
						|
  fTokenID := tkSection;
 | 
						|
  inc(Run);
 | 
						|
  while FLine[Run] <> #0 do
 | 
						|
    case FLine[Run] of
 | 
						|
      ']': begin inc(Run); break end;
 | 
						|
      #10: break;
 | 
						|
      #13: break;
 | 
						|
    else inc(Run);
 | 
						|
    end;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TSynIniSyn.CRProc;
 | 
						|
begin
 | 
						|
  fTokenID := tkSpace;
 | 
						|
  Case FLine[Run + 1] of
 | 
						|
    #10: inc(Run, 2);
 | 
						|
  else inc(Run);
 | 
						|
  end;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TSynIniSyn.EqualProc;
 | 
						|
begin
 | 
						|
  inc(Run);
 | 
						|
  fTokenID := tkSymbol;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TSynIniSyn.KeyProc;
 | 
						|
begin
 | 
						|
  fTokenID := tkKey;
 | 
						|
  inc(Run);
 | 
						|
  while FLine[Run] <> #0 do
 | 
						|
    case FLine[Run] of
 | 
						|
      '=': break;
 | 
						|
      #10: break;
 | 
						|
      #13: break;
 | 
						|
    else inc(Run);
 | 
						|
    end;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TSynIniSyn.TextProc;
 | 
						|
begin
 | 
						|
  if Run = 0 then
 | 
						|
    KeyProc
 | 
						|
  else begin
 | 
						|
    inc(Run);
 | 
						|
    while (fLine[Run] in [#128..#191]) OR // continued utf8 subcode
 | 
						|
     ((fLine[Run]<>#0) and (fProcTable[fLine[Run]] = @TextProc)) do inc(Run);
 | 
						|
    fTokenID := tkText;
 | 
						|
    //fTokenID := tkText;
 | 
						|
    //inc(Run);
 | 
						|
  end;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TSynIniSyn.LFProc;
 | 
						|
begin
 | 
						|
  fTokenID := tkSpace;
 | 
						|
  inc(Run);
 | 
						|
end;
 | 
						|
 | 
						|
procedure TSynIniSyn.NullProc;
 | 
						|
begin
 | 
						|
  fTokenID := tkNull;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TSynIniSyn.NumberProc;
 | 
						|
begin
 | 
						|
  if Run = 0 then
 | 
						|
    KeyProc
 | 
						|
  else begin
 | 
						|
    inc(Run);
 | 
						|
    fTokenID := tkNumber;
 | 
						|
    while FLine[Run] in ['0'..'9', '.', 'e', 'E'] do inc(Run);
 | 
						|
    if FLine[Run] in ['a'..'z','A'..'Z'] then TextProc;
 | 
						|
  end;
 | 
						|
end;
 | 
						|
 | 
						|
// ;
 | 
						|
procedure TSynIniSyn.SemiColonProc;
 | 
						|
begin
 | 
						|
  // if it is not column 0 mark as tkText and get out of here
 | 
						|
  if Run > 0 then
 | 
						|
  begin
 | 
						|
    fTokenID := tkText;
 | 
						|
    inc(Run);
 | 
						|
    Exit;
 | 
						|
  end;
 | 
						|
 | 
						|
  // this is column 0 ok it is a comment
 | 
						|
  fTokenID := tkComment;
 | 
						|
  inc(Run);
 | 
						|
  while FLine[Run] <> #0 do
 | 
						|
    case FLine[Run] of
 | 
						|
      #10: break;
 | 
						|
      #13: break;
 | 
						|
    else inc(Run);
 | 
						|
    end;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TSynIniSyn.SpaceProc;
 | 
						|
begin
 | 
						|
  inc(Run);
 | 
						|
  fTokenID := tkSpace;
 | 
						|
  while FLine[Run] in [#1..#9, #11, #12, #14..#32] do inc(Run);
 | 
						|
end;
 | 
						|
 | 
						|
// ""
 | 
						|
procedure TSynIniSyn.StringProc;
 | 
						|
begin
 | 
						|
  fTokenID := tkString;
 | 
						|
  if (FLine[Run + 1] = #34) and (FLine[Run + 2] = #34) then inc(Run, 2);
 | 
						|
  repeat
 | 
						|
    case FLine[Run] of
 | 
						|
      #0, #10, #13: break;
 | 
						|
    end;
 | 
						|
    inc(Run);
 | 
						|
  until FLine[Run] = #34;
 | 
						|
  if FLine[Run] <> #0 then inc(Run);
 | 
						|
end;
 | 
						|
 | 
						|
// ''
 | 
						|
procedure TSynIniSyn.StringProc1;
 | 
						|
begin
 | 
						|
  fTokenID := tkString;
 | 
						|
  if (FLine[Run + 1] = #39) and (FLine[Run + 2] = #39) then inc(Run, 2);
 | 
						|
  repeat
 | 
						|
    case FLine[Run] of
 | 
						|
      #0, #10, #13: break;
 | 
						|
    end;
 | 
						|
    inc(Run);
 | 
						|
  until FLine[Run] = #39;
 | 
						|
  if FLine[Run] <> #0 then inc(Run);
 | 
						|
end;
 | 
						|
 | 
						|
procedure TSynIniSyn.Next;
 | 
						|
begin
 | 
						|
  fTokenPos := Run;
 | 
						|
  fProcTable[fLine[Run]];
 | 
						|
end;
 | 
						|
 | 
						|
function TSynIniSyn.GetDefaultAttribute(Index: integer): TSynHighlighterAttributes;
 | 
						|
begin
 | 
						|
  case Index of
 | 
						|
    SYN_ATTR_COMMENT: Result := fCommentAttri;
 | 
						|
    SYN_ATTR_KEYWORD: Result := fKeyAttri;
 | 
						|
    SYN_ATTR_STRING: Result := fStringAttri;
 | 
						|
    SYN_ATTR_WHITESPACE: Result := fSpaceAttri;
 | 
						|
    SYN_ATTR_SYMBOL: Result := fSymbolAttri;
 | 
						|
    SYN_ATTR_NUMBER: Result := fNumberAttri;
 | 
						|
  else
 | 
						|
    Result := nil;
 | 
						|
  end;
 | 
						|
end;
 | 
						|
 | 
						|
function TSynIniSyn.GetEol: Boolean;
 | 
						|
begin
 | 
						|
  Result := fTokenId = tkNull;
 | 
						|
end;
 | 
						|
 | 
						|
function TSynIniSyn.GetToken: String;
 | 
						|
var
 | 
						|
  Len: LongInt;
 | 
						|
begin
 | 
						|
  Len := Run - fTokenPos;
 | 
						|
  SetString(Result, (FLine + fTokenPos), Len);
 | 
						|
end;
 | 
						|
 | 
						|
procedure TSynIniSyn.GetTokenEx(out TokenStart: PChar; out TokenLength: integer);
 | 
						|
begin
 | 
						|
  TokenLength := Run - fTokenPos;
 | 
						|
  TokenStart := FLine + fTokenPos;
 | 
						|
end;
 | 
						|
 | 
						|
function TSynIniSyn.GetTokenID: TtkTokenKind;
 | 
						|
begin
 | 
						|
  Result := fTokenId;
 | 
						|
end;
 | 
						|
 | 
						|
function TSynIniSyn.GetTokenAttribute: TSynHighlighterAttributes;
 | 
						|
begin
 | 
						|
  case fTokenID of
 | 
						|
    tkComment: Result := fCommentAttri;
 | 
						|
    tkText   : Result := fTextAttri;
 | 
						|
    tkSection: Result := fSectionAttri;
 | 
						|
    tkKey    : Result := fKeyAttri;
 | 
						|
    tkNumber : Result := fNumberAttri;
 | 
						|
    tkSpace  : Result := fSpaceAttri;
 | 
						|
    tkString : Result := fStringAttri;
 | 
						|
    tkSymbol : Result := fSymbolAttri;
 | 
						|
    tkUnknown: Result := fTextAttri;
 | 
						|
    else Result := nil;
 | 
						|
  end;
 | 
						|
end;
 | 
						|
 | 
						|
function TSynIniSyn.GetTokenKind: integer;
 | 
						|
begin
 | 
						|
  Result := Ord(fTokenId);
 | 
						|
end;
 | 
						|
 | 
						|
function TSynIniSyn.GetTokenPos: Integer;
 | 
						|
begin
 | 
						|
 Result := fTokenPos;
 | 
						|
end;
 | 
						|
 | 
						|
function TSynIniSyn.GetIdentChars: TSynIdentChars;
 | 
						|
begin
 | 
						|
  Result := TSynValidStringChars;
 | 
						|
end;
 | 
						|
 | 
						|
class function TSynIniSyn.GetLanguageName: string;
 | 
						|
begin
 | 
						|
  Result := SYNS_LangINI;
 | 
						|
end;
 | 
						|
 | 
						|
function TSynIniSyn.GetSampleSource: String;
 | 
						|
begin
 | 
						|
  Result := '; Syntax highlighting'#13#10+
 | 
						|
            '[Section]'#13#10+
 | 
						|
            'Key=value'#13#10+
 | 
						|
            'String="Arial"'#13#10+
 | 
						|
            'Number=123456';
 | 
						|
end;
 | 
						|
 | 
						|
initialization
 | 
						|
  RegisterPlaceableHighlighter(TSynIniSyn);
 | 
						|
 | 
						|
end.
 |