diff --git a/lazproj/coedit.lpi b/lazproj/coedit.lpi
index 9b4ffd24..e5745d9a 100644
--- a/lazproj/coedit.lpi
+++ b/lazproj/coedit.lpi
@@ -135,7 +135,7 @@
-
+
@@ -307,19 +307,24 @@
-
+
+
+
+
+
+
-
-
+
+
-
+
diff --git a/src/ce_synmemo.pas b/src/ce_synmemo.pas
index 125adfad..7aff35c8 100644
--- a/src/ce_synmemo.pas
+++ b/src/ce_synmemo.pas
@@ -5,8 +5,8 @@ unit ce_synmemo;
interface
uses
- Classes, SysUtils, SynEdit, SynMemo, ce_d2syn, SynEditHighlighter, controls,
- lcltype, LazSynEditText, SynEditKeyCmds, SynHighlighterLFM, SynEditMouseCmds,
+ Classes, SysUtils, SynEdit, SynMemo, ce_d2syn, ce_txtsyn ,SynEditHighlighter,
+ controls, lcltype, LazSynEditText, SynEditKeyCmds, SynHighlighterLFM, SynEditMouseCmds,
ce_common, ce_observer;
type
@@ -16,6 +16,7 @@ type
fModified: boolean;
fFileDate: double;
fIsDSource: boolean;
+ fIsTxtFile: boolean;
fIsConfig: boolean;
fIdentifier: string;
fTempFileName: string;
@@ -53,6 +54,7 @@ type
var
D2Syn: TSynD2Syn;
LfmSyn: TSynLfmSyn;
+ TxtSyn: TSynTxtSyn;
implementation
@@ -133,12 +135,16 @@ begin
inherited;
fIsDSource := Highlighter = D2Syn;
fIsConfig := Highlighter = LfmSyn;
+ fIsTxtFile := Highlighter = TxtSyn;
end;
procedure TCESynMemo.identifierToD2Syn;
begin
fIdentifier := GetWordAtRowCol(LogicalCaretXY);
- if fIsDSource then D2Syn.CurrentIdentifier := fIdentifier;
+ if fIsDSource then
+ D2Syn.CurrentIdentifier := fIdentifier
+ else if fIsTxtFile then
+ TxtSyn.CurrIdent := fIdentifier;
end;
procedure TCESynMemo.changeNotify(Sender: TObject);
@@ -154,7 +160,7 @@ var
begin
ext := extractFileExt(aFilename);
if dExtList.IndexOf(ext) = -1 then
- Highlighter := nil;
+ Highlighter := TxtSyn;
Lines.LoadFromFile(aFilename);
fFilename := aFilename;
FileAge(fFilename, fFileDate);
@@ -163,9 +169,16 @@ begin
end;
procedure TCESynMemo.saveToFile(const aFilename: string);
+var
+ ext: string;
begin
Lines.SaveToFile(aFilename);
fFilename := aFilename;
+ ext := extractFileExt(aFilename);
+ if dExtList.IndexOf(ext) = -1 then
+ Highlighter := TxtSyn
+ else
+ Highlighter := D2Syn;
FileAge(fFilename, fFileDate);
fModified := false;
if fFilename <> fTempFileName then
@@ -235,11 +248,14 @@ end;
initialization
D2Syn := TSynD2Syn.create(nil);
LfmSyn := TSynLFMSyn.Create(nil);
+ TxtSyn := TSynTxtSyn.create(nil);
+ //
LfmSyn.KeyAttri.Foreground := clNavy;
LfmSyn.KeyAttri.Style := [fsBold];
LfmSyn.NumberAttri.Foreground := clMaroon;
LfmSyn.StringAttri.Foreground := clBlue;
finalization
- D2Syn.free;
+ D2Syn.Free;
LfmSyn.Free;
+ TxtSyn.Free;
end.
diff --git a/src/ce_txtsyn.pas b/src/ce_txtsyn.pas
new file mode 100644
index 00000000..de65197a
--- /dev/null
+++ b/src/ce_txtsyn.pas
@@ -0,0 +1,217 @@
+unit ce_txtsyn;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils, SynEditHighlighter, SynEditTypes, ce_dlangutils;
+
+type
+
+ TTokenKind = (tkSym, tkTxt, tkWhi);
+
+ TSynTxtSyn = class(TSynCustomHighlighter)
+ private
+ fSymAttribs: TSynHighlighterAttributes;
+ fTxtAttribs: TSynHighlighterAttributes;
+ fWhiAttribs: TSynHighlighterAttributes;
+ fTokToAttri: array[TTokenKind] of TSynHighlighterAttributes;
+ fToken: TTokenKind;
+ fTokStart, fTokStop: Integer;
+ fLineBuf: string;
+ fCurrIdent: string;
+ procedure setSymAttribs(aValue: TSynHighlighterAttributes);
+ procedure setTxtAttribs(aValue: TSynHighlighterAttributes);
+ procedure setWhiAttribs(aValue: TSynHighlighterAttributes);
+ procedure setCurrIdent(const aValue: string);
+ published
+ property symbAttributes: TSynHighlighterAttributes read fSymAttribs write setSymAttribs;
+ property textAttributes: TSynHighlighterAttributes read fTxtAttribs write setTxtAttribs;
+ property whitAttributes: TSynHighlighterAttributes read fWhiAttribs write setWhiAttribs;
+ public
+ constructor create(aOwner: TComponent); override;
+ //
+ procedure setLine(const NewValue: String; LineNumber: Integer); override;
+ procedure next; override;
+ procedure GetTokenEx(out TokenStart: PChar; out TokenLength: integer); override;
+ function GetTokenAttribute: TSynHighlighterAttributes; override;
+ function GetDefaultAttribute(Index: integer): TSynHighlighterAttributes; override;
+ function GetToken: string; override;
+ function GetTokenKind: integer; override;
+ function GetTokenPos: Integer; override;
+ function GetEol: Boolean; override;
+ //
+ property CurrIdent: string read fCurrIdent write setCurrIdent;
+ end;
+
+ const txtSym : TCharSet = [
+ '&', '~', '#', '"', #39, '(', '-', ')', '=',
+ '{', '[', '|', '`', '\', '^', '@', ']', '}',
+ '+', '$', '*', '%',
+ '<', '>', ',', '?', ';', '.', ':', '/', '!'];
+
+implementation
+
+uses
+ Graphics;
+
+constructor TSynTxtSyn.create(aOwner: TComponent);
+begin
+ inherited;
+ //
+ fSymAttribs := TSynHighlighterAttributes.Create('Symbols', 'Symbols');
+ fTxtAttribs := TSynHighlighterAttributes.Create('Text', 'Text');
+ fWhiAttribs := TSynHighlighterAttributes.Create('White', 'White');
+ //
+ fSymAttribs.Foreground := clBlack;
+ fSymAttribs.Style := [fsBold];
+ fTxtAttribs.Foreground := clNavy;
+ fWhiAttribs.Foreground := clNone;
+ //
+ AddAttribute(fSymAttribs);
+ AddAttribute(fTxtAttribs);
+ AddAttribute(fWhiAttribs);
+ //
+ fTokToAttri[tkSym] := fSymAttribs;
+ fTokToAttri[tkTxt] := fTxtAttribs;
+ fTokToAttri[tkWhi] := fWhiAttribs;
+ //
+ fTokStop := 1;
+ Next;
+end;
+
+procedure TSynTxtSyn.setSymAttribs(aValue: TSynHighlighterAttributes);
+begin
+ fSymAttribs.Assign(aValue);
+end;
+
+procedure TSynTxtSyn.setTxtAttribs(aValue: TSynHighlighterAttributes);
+begin
+ fTxtAttribs.Assign(aValue);
+end;
+
+procedure TSynTxtSyn.setWhiAttribs(aValue: TSynHighlighterAttributes);
+begin
+ fWhiAttribs.Assign(aValue);
+end;
+
+procedure TSynTxtSyn.setCurrIdent(const aValue: string);
+begin
+ if aValue = '' then exit;
+ if fCurrIdent = aValue then Exit;
+ fCurrIdent := aValue;
+ BeginUpdate;
+ fUpdateChange := true;
+ EndUpdate;
+end;
+
+procedure TSynTxtSyn.setLine(const NewValue: String; LineNumber: Integer);
+begin
+ inherited;
+ fLineBuf := NewValue + #10;
+ fTokStop := 1;
+ next;
+end;
+
+procedure TSynTxtSyn.next;
+begin
+ fTokStart := fTokStop;
+ fTokStop := fTokStart;
+
+ // EOL
+ if fTokStop > length(fLineBuf) then exit;
+
+ // spaces
+ if (isWhite(fLineBuf[fTokStop])) then
+ begin
+ fToken := tkWhi;
+ while isWhite(fLineBuf[fTokStop]) do
+ begin
+ Inc(fTokStop);
+ if fTokStop > length(fLineBuf) then exit;
+ end;
+ exit;
+ end;
+
+ // symbs
+ if (fLineBuf[fTokStop] in txtSym) then
+ begin
+ fToken := tkSym;
+ while(fLineBuf[fTokStop] in txtSym) do
+ begin
+ Inc(fTokStop);
+ if fLineBuf[fTokStop] = #10 then exit;
+ end;
+ exit;
+ end;
+
+ // text
+ fToken := tkTxt;
+ while not (isSymbol(fLineBuf[fTokStop]) or isWhite(fLineBuf[fTokStop])) do
+ begin
+ Inc(fTokStop);
+ if fLineBuf[fTokStop] = #10 then exit;
+ end;
+
+ if fLineBuf[fTokStop] = #10 then exit;
+end;
+
+function TSynTxtSyn.GetEol: Boolean;
+begin
+ result := fTokStop > length(fLineBuf);
+end;
+
+function TSynTxtSyn.GetTokenAttribute: TSynHighlighterAttributes;
+begin
+ result := fTokToAttri[fToken];
+ result.FrameEdges := sfeNone;
+ if fCurrIdent <> '' then
+ if GetToken = fCurrIdent then begin
+ result.FrameColor := result.Foreground;
+ result.FrameStyle := slsSolid;
+ result.FrameEdges := sfeAround;
+ end;
+end;
+
+function TSynTxtSyn.GetTokenPos: Integer;
+begin
+ result := fTokStart - 1;
+end;
+
+function TSynTxtSyn.GetToken: string;
+begin
+ result := copy(fLineBuf, FTokStart, fTokStop - FTokStart);
+end;
+
+procedure TSynTxtSyn.GetTokenEx(out TokenStart: PChar; out TokenLength: integer);
+begin
+ TokenStart := @fLineBuf[FTokStart];
+ TokenLength := fTokStop - FTokStart;
+end;
+
+function TSynTxtSyn.GetTokenKind: integer;
+var
+ a: TSynHighlighterAttributes;
+begin
+ Result := SYN_ATTR_IDENTIFIER;
+ a := GetTokenAttribute;
+ if a = fTxtAttribs then Result := SYN_ATTR_IDENTIFIER else
+ if a = fWhiAttribs then Result := SYN_ATTR_WHITESPACE else
+ if a = fSymAttribs then Result := SYN_ATTR_SYMBOL;
+end;
+
+function TSynTxtSyn.GetDefaultAttribute(Index: integer): TSynHighlighterAttributes;
+begin
+ case Index of
+ SYN_ATTR_COMMENT: Result := fTxtAttribs;
+ SYN_ATTR_IDENTIFIER: Result := fTxtAttribs;
+ SYN_ATTR_KEYWORD: Result := fTxtAttribs;
+ SYN_ATTR_STRING: Result := fTxtAttribs;
+ SYN_ATTR_WHITESPACE: Result := fWhiAttribs;
+ SYN_ATTR_SYMBOL: Result := fSymAttribs;
+ else Result := fTxtAttribs;
+ end;
+end;
+
+end.