瀏覽代碼

ADD: YAML syntax highlighter

Alexander Koblov 4 月之前
父節點
當前提交
888b239508
共有 3 個文件被更改,包括 727 次插入2 次删除
  1. 0 0
      src/dmhigh.json
  2. 2 2
      src/dmhigh.pas
  3. 725 0
      src/synhighlighteryaml.pas

文件差異過大導致無法顯示
+ 0 - 0
src/dmhigh.json


+ 2 - 2
src/dmhigh.pas

@@ -8,7 +8,7 @@ uses
   Classes, SysUtils, Forms, Controls, SynEdit, DCStringHashListUtf8, LCLVersion,
   SynEditHighlighter, SynHighlighterJava, SynHighlighterXML, SynHighlighterLFM,
   SynHighlighterPHP, SynHighlighterSQL, SynHighlighterCss, SynHighlighterPython,
-  SynHighlighterVB, SynHighlighterLua, SynUniHighlighter,
+  SynHighlighterYAML, SynHighlighterLua, SynUniHighlighter,
   uHighlighters, uColors, fpJson;
 
 const
@@ -88,7 +88,7 @@ const
     TSynBatSynEx, TSynCppSynEx, TSynCssSyn, TSynDiffSynEx,
     TSynHTMLSynEx, TSynIniSynEx, TSynJavaSyn, TSynLFMSyn,
     TSynPasSynEx, TSynPHPSyn, TSynPoSynEx, TSynSQLSyn,
-    TSynTeXSynEx, TSynVBSyn, TSynLuaSyn
+    TSynTeXSynEx, TSynYAMLSyn, TSynLuaSyn
   );
 
 function SynHighlighterSortCompare(List: TStringList; Index1, Index2: Integer): Integer;

+ 725 - 0
src/synhighlighteryaml.pas

@@ -0,0 +1,725 @@
+{-------------------------------------------------------------------------------
+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.
+
+Code template generated with SynGen.
+The original code is: SynGen\yaml.pas, released 2008-06-13.
+Description: YAML Syntax Parser/Highlighter
+The initial author of this file is Kiriakos.
+Copyright (c) 2008, 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: $
+
+You may retrieve the latest version of this file at the SynEdit home page,
+located at http://SynEdit.SourceForge.net
+
+-------------------------------------------------------------------------------}
+
+unit SynHighlighterYAML;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+  SysUtils, Classes, Graphics, SynEditHighlighter, SynEditTypes;
+
+const
+  rsUnknown = 0;
+  rsValue = 1;
+  rsLiteralStart = 2;
+  rsLiteral = 3;
+  rsString1 = 4;
+  rsString2 = 5;
+  rsDirective = 6;
+  rsDocDelimiter = 7;
+
+type
+  TtkTokenKind = (
+    tkComment,
+    tkDocDelimiter,
+    tkKey,
+    tkNull,
+    tkNumericValue,
+    tkSpace,
+    tkSymbol,
+    tkTag,
+    tkLiteral,
+    tkString,
+    tkAnchor,
+    tkDirective,
+    tkUnknown
+  );
+
+  TProcTableProc = procedure of object;
+
+  PIdentFuncTableFunc = ^TIdentFuncTableFunc;
+  TIdentFuncTableFunc = function (Index: Integer): TtkTokenKind of object;
+
+type
+
+  { TSynYAMLSyn }
+
+  TSynYAMLSyn = class(TSynCustomHighlighter)
+  private
+    Run: LongInt;
+    fLine: PChar;
+    FLineStr: String;
+    fRange: LongWord;
+    fLineLen: Integer;
+    fTokenPos: Integer;
+    fTokenID: TtkTokenKind;
+    fCommentAttri: TSynHighlighterAttributes;
+    fDocDelimiterAttri: TSynHighlighterAttributes;
+    fKeyAttri: TSynHighlighterAttributes;
+    fNumericValueAttri: TSynHighlighterAttributes;
+    fSpaceAttri: TSynHighlighterAttributes;
+    fSymbolAttri: TSynHighlighterAttributes;
+    fTagAttri: TSynHighlighterAttributes;
+    fTextValueAttri: TSynHighlighterAttributes;
+    fStringAttri: TSynHighlighterAttributes;
+    fDirectiveAttri: TSynHighlighterAttributes;
+    fAnchorAttri: TSynHighlighterAttributes;
+    fErrorAttri: TSynHighlighterAttributes;
+    fTempSpaceAttri : TSynHighlighterAttributes;
+    procedure KeyProc;
+    procedure LiteralProc;
+    procedure LiteralMarkProc;
+    procedure FoldedLiteralMarkProc;
+    procedure ValueProc;
+    procedure StringProc1;
+    procedure StringProc2;
+    procedure UnknownProc;
+    procedure NullProc;
+    procedure SpaceProc;
+    procedure CRProc;
+    procedure LFProc;
+    procedure ListItemProc;
+    procedure TagProc;
+    procedure CommentProc;
+    procedure DirectiveProc;
+    procedure AnchorProc;
+    procedure DocDelimiterProc;
+  protected
+    function IsLineEnd(ARun: Integer): Boolean;
+    function GetSampleSource: String; override;
+    function IsFilterStored: Boolean; override;
+    function GetIdentChars: TSynIdentChars; override;
+  public
+    constructor Create(AOwner: TComponent); override;
+    destructor Destroy; override;
+    class function GetLanguageName: string; override;
+    function GetRange: Pointer; override;
+    procedure ResetRange; override;
+    procedure SetRange(Value: Pointer); override;
+    procedure SetLine(const Value: String; LineNumber: Integer); override;
+    function GetDefaultAttribute(Index: Integer): TSynHighlighterAttributes; override;
+    function GetEol: Boolean; override;
+    function GetTokenID: TtkTokenKind;
+
+    function GetToken: String; override;
+    function GetTokenPos: Integer; override;
+    procedure GetTokenEx(out TokenStart :PChar; out TokenLength :integer); override;
+
+    function GetTokenAttribute: TSynHighlighterAttributes; override;
+    function GetTokenKind: Integer; override;
+    procedure Next; override;
+  published
+    property CommentAttri: TSynHighlighterAttributes read fCommentAttri write fCommentAttri;
+    property DocDelimiterAttri: TSynHighlighterAttributes read fDocDelimiterAttri write fDocDelimiterAttri;
+    property KeyAttri: TSynHighlighterAttributes read fKeyAttri write fKeyAttri;
+    property NumericValueAttri: TSynHighlighterAttributes read fNumericValueAttri write fNumericValueAttri;
+    property SpaceAttri: TSynHighlighterAttributes read fSpaceAttri write fSpaceAttri;
+    property SymbolAttri: TSynHighlighterAttributes read fSymbolAttri write fSymbolAttri;
+    property TagAttri: TSynHighlighterAttributes read fTagAttri write fTagAttri;
+    property TextValueAttri: TSynHighlighterAttributes read fTextValueAttri write fTextValueAttri;
+    property StringAttri: TSynHighlighterAttributes read fStringAttri write fStringAttri;
+    property DirectiveAttri: TSynHighlighterAttributes read fDirectiveAttri write fDirectiveAttri;
+    property AnchorAttri: TSynHighlighterAttributes read fAnchorAttri write fAnchorAttri;
+    property ErrorAttri: TSynHighlighterAttributes read fErrorAttri write fErrorAttri;
+  end;
+
+const
+  SYNS_XML_LangYAML = 'YAML';
+  SYNS_XML_AttrAnchor = 'Anchor';
+  SYNS_XML_AttrDelimiter = 'Delimiter';
+  SYNS_XML_AttrTag = 'Tag';
+
+resourcestring
+  SYNS_FilterYAML = 'YAML files (*.yaml;*.yml)|*.yaml;*.yml';
+  SYNS_AttrAnchor = 'Anchor';
+  SYNS_AttrDelimiter = 'Delimiter';
+  SYNS_AttrTag = 'Tag';
+
+implementation
+
+uses
+  Math, SynEditStrConst;
+
+function StrIsLeft(AText, ALeft: PChar): Boolean;
+begin
+  while (ALeft^ <> #0) and (AText^ <> #0) and (ALeft^ = AText^) do begin
+    Inc(ALeft);
+    Inc(AText);
+  end;
+  Result := ALeft^ = #0;
+end;
+
+function CalcIndent(S : string; TabWidth : integer = 4): integer;
+Var
+  i : integer;
+begin
+  Result := 0;
+  for i := 1 to Length(S) do
+    if S[i] = #9 then
+      Inc(Result, TabWidth)
+    else if S[i] = ' ' then
+      Inc(Result)
+    else
+      break;
+end;
+
+function TSynYAMLSyn.IsLineEnd(ARun: Integer): Boolean;
+begin
+  Result:= FLine[ARun] in [#0, #10, #13];
+end;
+
+procedure TSynYAMLSyn.SpaceProc;
+begin
+  Inc(Run);
+  fTokenID := tkSpace;
+  while (FLine[Run] <= #32) and not IsLineEnd(Run) do Inc(Run);
+end;
+
+procedure TSynYAMLSyn.StringProc1;
+begin
+  fTokenID := tkString;
+  while not IsLineEnd(Run) do begin
+    if FLine[Run] = '"' then begin
+      Inc(Run);
+      LongRec(fRange).Lo := rsUnknown;
+      Exit;
+    end else if FLine[Run] = '\' then
+      Inc(Run);
+    Inc(Run)
+  end;
+  LongRec(fRange).Lo := rsString1;
+end;
+
+procedure TSynYAMLSyn.StringProc2;
+begin
+  fTokenID := tkString;
+  while not IsLineEnd(Run) do begin
+    if FLine[Run] = '''' then begin
+      Inc(Run);
+      if FLine[Run] <> '''' then begin
+        LongRec(fRange).Lo := rsUnknown;
+        Exit;
+      end;
+    end;
+    Inc(Run)
+  end;
+  LongRec(fRange).Lo := rsString2;
+end;
+
+procedure TSynYAMLSyn.TagProc;
+begin
+  while not (IsLineEnd(Run) or (FLine[Run] <= #32)) do
+    Inc(Run);
+  fTokenID := tkTag;
+end;
+
+procedure TSynYAMLSyn.NullProc;
+begin
+  fTokenID := tkNull;
+  Inc(Run);
+end;
+
+procedure TSynYAMLSyn.CRProc;
+begin
+  fTokenID := tkSpace;
+  Inc(Run);
+  if fLine[Run] = #10 then
+    Inc(Run);
+end;
+
+destructor TSynYAMLSyn.Destroy;
+begin
+  fTempSpaceAttri.Free;
+  inherited Destroy;
+end;
+
+procedure TSynYAMLSyn.DirectiveProc;
+begin
+  fTokenID := tkDirective;
+  while not IsLineEnd(Run) do
+    Inc(Run);
+  LongRec(fRange).Lo := rsUnknown;
+end;
+
+procedure TSynYAMLSyn.DocDelimiterProc;
+begin
+  fTokenID := tkDocDelimiter;
+  while not IsLineEnd(Run) do
+    Inc(Run);
+end;
+
+procedure TSynYAMLSyn.SetLine(const Value: String; LineNumber: Integer);
+Const
+  sDocStart : String = '---';
+  sDocEnd : String = '...';
+Var
+  NewIndent : integer;
+begin
+  Run := 0;
+  FLineStr := Value;
+  UniqueString(FLineStr);
+  fLine := PChar(fLineStr);
+  fLineLen := Length(fLine);
+  NewIndent := CalcIndent(fLineStr);
+
+  if LongRec(fRange).Lo = rsDocDelimiter then
+   LongRec(fRange).Lo := rsUnknown;
+
+  if fLine^ = '%' then begin
+    LongRec(fRange).Lo := rsDirective;
+    LongRec(fRange).Hi := NewIndent;
+  end else if StrIsLeft(FLine, PChar(sDocStart)) or StrIsLeft(FLine, PChar(sDocEnd)) then begin
+    LongRec(fRange).Lo := rsDocDelimiter;
+    LongRec(fRange).Hi := NewIndent;
+  end else if (LongRec(fRange).Lo = rsLiteralStart) then begin
+    LongRec(fRange).Lo := rsLiteral;
+    LongRec(fRange).Hi := NewIndent;
+  end else if (LongRec(fRange).Lo = rsLiteral) then begin
+    if (LongRec(fRange).Hi > NewIndent) then begin
+      LongRec(fRange).Lo := rsUnknown;
+      LongRec(fRange).Hi := NewIndent;
+    end else
+      LongRec(fRange).Hi := Min(LongRec(fRange).Hi, NewIndent);
+  end else begin
+    if not (LongRec(fRange).Lo in [rsString1, rsString2]) then
+      LongRec(fRange).Lo := rsUnknown;
+    LongRec(fRange).Hi := NewIndent;
+  end;
+  Next;
+end;
+
+procedure TSynYAMLSyn.FoldedLiteralMarkProc;
+begin
+  fTokenID := tkSymbol;
+  Inc(Run);
+  LongRec(fRange).Lo := rsLiteralStart;
+end;
+
+procedure TSynYAMLSyn.LFProc;
+begin
+  fTokenID := tkSpace;
+  Inc(Run);
+end;
+
+procedure TSynYAMLSyn.ListItemProc;
+begin
+  Inc(Run);
+  if CharInSet(FLine[Run], [' ', #0, #13, #10]) then begin
+    fTokenID := tkSymbol;
+    LongRec(fRange).Lo := rsUnknown;
+  end else
+    Next;
+end;
+
+procedure TSynYAMLSyn.LiteralMarkProc;
+begin
+  fTokenID := tkSymbol;
+  Inc(Run);
+  if FLine[Run] = '+' then
+    Inc(Run)
+  else
+    while CharInSet(FLine[Run], ['0'..'9']) do
+      Inc(Run);
+  LongRec(fRange).Lo := rsLiteralStart;
+end;
+
+procedure TSynYAMLSyn.LiteralProc;
+begin
+  fTokenID := tkLiteral;
+  while (not IsLineEnd(Run)) and (FLine[Run] <> '#') do
+    Inc(Run);
+end;
+
+procedure TSynYAMLSyn.AnchorProc;
+begin
+  while not (IsLineEnd(Run) or (FLine[Run] <= #32)) do
+    Inc(Run);
+  fTokenID := tkAnchor;
+end;
+
+procedure TSynYAMLSyn.CommentProc;
+begin
+  fTokenID := tkComment;
+  while not IsLineEnd(Run) do
+    Inc(Run);
+end;
+
+constructor TSynYAMLSyn.Create(AOwner: TComponent);
+begin
+  inherited Create(AOwner);
+
+  fCommentAttri := TSynHighLighterAttributes.Create(SYNS_AttrComment, SYNS_XML_AttrComment);
+  fCommentAttri.Foreground := clGray;
+  fCommentAttri.Style := [fsItalic];
+  AddAttribute(fCommentAttri);
+
+  fDocDelimiterAttri := TSynHighLighterAttributes.Create(SYNS_AttrDelimiter, SYNS_XML_AttrDelimiter);
+  fDocDelimiterAttri.Style := [fsBold] ;
+  fDocDelimiterAttri.Foreground := clGray;
+  fDocDelimiterAttri.Background := clSilver;
+  AddAttribute(fDocDelimiterAttri);
+
+  fKeyAttri := TSynHighLighterAttributes.Create(SYNS_AttrKey, SYNS_XML_AttrKey);
+  fKeyAttri.Style := [fsBold];
+  fKeyAttri.Foreground := clGreen;
+  AddAttribute(fKeyAttri);
+
+  fNumericValueAttri := TSynHighLighterAttributes.Create(SYNS_AttrNumber, SYNS_XML_AttrNumber);
+  fNumericValueAttri.Foreground := clPurple;
+  AddAttribute(fNumericValueAttri);
+
+  fSpaceAttri := TSynHighLighterAttributes.Create(SYNS_AttrSpace, SYNS_XML_AttrSpace);
+  AddAttribute(fSpaceAttri);
+
+  fSymbolAttri := TSynHighLighterAttributes.Create(SYNS_AttrSymbol, SYNS_XML_AttrSymbol);
+  fSymbolAttri.Style := [fsBold];
+  fSymbolAttri.Foreground := clBlue;
+  AddAttribute(fSymbolAttri);
+
+  fTagAttri := TSynHighLighterAttributes.Create(SYNS_AttrTag, SYNS_XML_AttrTag);
+  fTagAttri.Foreground := clNavy;
+  fTagAttri.Style := [fsBold];
+  AddAttribute(fTagAttri);
+
+  fTextValueAttri := TSynHighLighterAttributes.Create(SYNS_AttrText, SYNS_XML_AttrText);
+  AddAttribute(fTextValueAttri);
+
+  fStringAttri := TSynHighlighterAttributes.Create(SYNS_AttrString, SYNS_XML_AttrString);
+  fStringAttri.Foreground := clBlue;
+  AddAttribute(fStringAttri);
+
+  fDirectiveAttri := TSynHighlighterAttributes.Create(SYNS_AttrDirective, SYNS_XML_AttrDirective);
+  fDirectiveAttri.Foreground := clTeal;
+  AddAttribute(fDirectiveAttri);
+
+  fAnchorAttri := TSynHighlighterAttributes.Create(SYNS_AttrAnchor, SYNS_XML_AttrAnchor);
+  fAnchorAttri.Foreground := clMaroon;
+  fAnchorAttri.Style := [fsBold];
+  AddAttribute(fAnchorAttri);
+
+  fErrorAttri := TSynHighlighterAttributes.Create(SYNS_AttrSyntaxError, SYNS_XML_AttrSyntaxError);
+  fErrorAttri.Foreground := clRed;
+  AddAttribute(fErrorAttri);
+
+  SetAttributesOnChange(@DefHighlightChange);
+  fDefaultFilter := SYNS_FilterYAML;
+  LongRec(fRange).Lo := rsUnknown;
+
+  // for coloring doc comment background
+  fTempSpaceAttri := TSynHighlighterAttributes.Create(SYNS_AttrSpace, SYNS_XML_AttrSpace);
+end;
+
+procedure TSynYAMLSyn.KeyProc;
+begin
+  fTokenID := tkLiteral;
+  LongRec(fRange).Lo := rsValue;
+  while not IsLineEnd(Run) do begin
+    if (FLine[Run] = ':') and (CharInSet(FLine[Run+1], [' ', #0, #13, #10])) then begin
+      Inc(Run);
+      if FLine[Run] = ' ' then
+        Inc(Run);
+      fTokenID := tkKey;
+      break;
+    end else
+      Inc(Run);
+  end;
+end;
+
+procedure TSynYAMLSyn.UnknownProc;
+begin
+  Inc(Run);
+  fTokenID := tkUnknown;
+end;
+
+procedure TSynYAMLSyn.ValueProc;
+var
+  Val : String;
+  Start : Integer;
+  FloatVal : Extended;
+begin
+  Start := Run;
+  fTokenID := tkLiteral;
+  while (not IsLineEnd(Run)) and (FLine[Run] <> '#') do
+    Inc(Run);
+  Val := Copy(FLineStr, Start, Run - Start + 1);
+  if TryStrToFloat(Trim(Val), FloatVal) then
+    fTokenId := tkNumericValue;
+end;
+
+procedure TSynYAMLSyn.Next;
+begin
+  fTokenPos := Run;
+
+  case LongRec(fRange).Lo of
+    rsDirective : DirectiveProc;
+    rsString1 :
+      case fLine[Run] of
+        #0: NullProc;
+        #10: LFProc;
+        #13: CRProc;
+      else
+        StringProc1;
+      end;
+    rsString2 :
+      case fLine[Run] of
+        #0: NullProc;
+        #10: LFProc;
+        #13: CRProc;
+      else
+        StringProc2;
+      end;
+    rsDocDelimiter :
+      case fLine[Run] of
+        #0: NullProc;
+        #10: LFProc;
+        #13: CRProc;
+      else
+        DocDelimiterProc;
+      end;
+    rsLiteralStart :
+      case fLine[Run] of
+        #0: NullProc;
+        #10: LFProc;
+        #13: CRProc;
+        '#': CommentProc;
+      else
+        UnknownProc;
+      end;
+    rsLiteral :
+      case fLine[Run] of
+        #0: NullProc;
+        #10: LFProc;
+        #13: CRProc;
+        '#': CommentProc;
+      else
+        LiteralProc;
+      end;
+    rsValue :
+      case fLine[Run] of
+        #0: NullProc;
+        #10: LFProc;
+        #13: CRProc;
+        '#': CommentProc;
+        '|': LiteralMarkProc;
+        '>': FoldedLiteralMarkProc;
+        '-': ListItemProc;
+        '&', '*' : AnchorProc;
+        '"':
+          begin
+            Inc(Run);
+            StringProc1;
+          end;
+        '''':
+          begin
+            Inc(Run);
+            StringProc2;
+          end;
+        #1..#9, #11, #12, #14..#32: SpaceProc;
+      else
+        ValueProc;
+      end;
+  else
+    case fLine[Run] of
+      #0: NullProc;
+      #10: LFProc;
+      #13: CRProc;
+      '#': CommentProc;
+      '-': ListItemProc;
+      '!': TagProc;
+      '"':
+        begin
+          Inc(Run);
+          StringProc1;
+        end;
+      '''':
+        begin
+          Inc(Run);
+          StringProc2;
+        end;
+      #1..#9, #11, #12, #14..#32: SpaceProc;
+    else
+      KeyProc;
+    end;
+  end;
+end;
+
+function TSynYAMLSyn.GetDefaultAttribute(Index: Integer): TSynHighlighterAttributes;
+begin
+  case Index of
+    SYN_ATTR_COMMENT: Result := fCommentAttri;
+    SYN_ATTR_WHITESPACE: 
+      begin
+        fTempSpaceAttri.Assign(fSpaceAttri);
+        if LongRec(fRange).Lo = rsDocDelimiter then
+          fTempSpaceAttri.Background := fDocDelimiterAttri.Background;
+        Result := fTempSpaceAttri;
+      end;
+    SYN_ATTR_SYMBOL: Result := fSymbolAttri;
+  else
+    Result := nil;
+  end;
+end;
+
+function TSynYAMLSyn.GetEol: Boolean;
+begin
+  Result := Run = fLineLen + 1;
+end;
+
+function TSynYAMLSyn.GetTokenID: TtkTokenKind;
+begin
+  Result := fTokenId;
+end;
+
+function TSynYAMLSyn.GetToken: String;
+var
+  Len: LongInt;
+begin
+  Len := Run - fTokenPos;
+  SetString(Result, (FLine + fTokenPos), Len);
+end;
+
+function TSynYAMLSyn.GetTokenPos: Integer;
+begin
+  Result := fTokenPos;
+end;
+
+procedure TSynYAMLSyn.GetTokenEx(out TokenStart: PChar; out TokenLength: Integer);
+begin
+  TokenLength := Run - fTokenPos;
+  TokenStart  := FLine + fTokenPos;
+end;
+
+function TSynYAMLSyn.GetTokenAttribute: TSynHighlighterAttributes;
+begin
+  case GetTokenID of
+    tkComment: Result := fCommentAttri;
+    tkDocDelimiter: Result := fDocDelimiterAttri;
+    tkKey: Result := fKeyAttri;
+    tkNumericValue: Result := fNumericValueAttri;
+    tkSpace: Result := fSpaceAttri;
+    tkSymbol: Result := fSymbolAttri;
+    tkTag: Result := fTagAttri;
+    tkLiteral: Result := fTextValueAttri;
+    tkString: Result := fStringAttri;
+    tkDirective: Result := fDirectiveAttri;
+    tkAnchor: Result := fAnchorAttri;
+    tkUnknown: Result := fErrorAttri;
+  else
+    Result := nil;
+  end;
+end;
+
+function TSynYAMLSyn.GetTokenKind: Integer;
+begin
+  Result := Ord(fTokenId);
+end;
+
+function TSynYAMLSyn.GetSampleSource: String;
+begin
+  Result :=
+    '---'#13#10 +
+    'receipt:    Oz-Ware Purchase Invoice'#13#10 +
+    'date:        2007-08-06'#13#10 +
+    'customer:'#13#10 +
+    '    given:   Dorothy'#13#10 +
+    '    family:  Gale'#13#10 +
+    #13#10 +
+    'items:'#13#10 +
+    '    - part_no:   A4786'#13#10 +
+    '      descrip:   !!str Water Bucket (Filled)'#13#10 +
+    '      price:     1.47'#13#10 +
+    '      quantity:  4'#13#10 +
+    #13#10 +
+    '    - part_no:   E1628'#13#10 +
+    '      descrip:   "High Heeled \"Ruby\" Slippers"'#13#10 +
+    '      price:     100.27'#13#10 +
+    '      quantity:  1'#13#10 +
+    #13#10 +
+    'bill-to:  &id001'#13#10 +
+    '    street: |'#13#10 +
+    '            123 Tornado Alley'#13#10 +
+    '            Suite 16'#13#10 +
+    '    city:   East Westville'#13#10 +
+    '    state:  KS'#13#10 +
+    #13#10 +
+    'ship-to:  *id001'#13#10 +
+    #13#10 +
+    'specialDelivery:  >'#13#10 +
+    '    Follow the Yellow Brick'#13#10 +
+    '    Road to the Emerald City.'#13#10 +
+    '...';
+end;
+
+function TSynYAMLSyn.IsFilterStored: Boolean;
+begin
+  Result := fDefaultFilter <> SYNS_FilterYAML;
+end;
+
+function TSynYAMLSyn.GetIdentChars: TSynIdentChars;
+begin
+  Result:= ['_', '0'..'9', 'a'..'z', 'A'..'Z'];
+end;
+
+class function TSynYAMLSyn.GetLanguageName: string;
+begin
+  Result := SYNS_XML_LangYAML;
+end;
+
+procedure TSynYAMLSyn.ResetRange;
+begin
+  LongRec(fRange).Lo := rsUnknown;
+end;
+
+procedure TSynYAMLSyn.SetRange(Value: Pointer);
+begin
+  {$PUSH}{$HINTS OFF}{$WARNINGS OFF}
+  fRange := LongWord(UIntPtr(Value));
+  {$POP}
+end;
+
+function TSynYAMLSyn.GetRange: Pointer;
+begin
+  {$PUSH}{$HINTS OFF}
+  Result := Pointer(UIntPtr(fRange));
+  {$POP}
+end;
+
+initialization
+  RegisterPlaceableHighlighter(TSynYAMLSyn);
+
+end.

部分文件因文件數量過多而無法顯示