program DelphiHereDoc; uses SysUtils, Windows, Classes, SystemUnit, StringListObjectUnit, FileList, ShellFileCtrl, StringUnit, ConstUnit, StringListUnit, FileNameUnit, MECSUtils, uses_end; function GetHereDocBackupFilePath(FilePath: string): String; begin Result := ExtractFilePath(FilePath)+'_here_doc_backup\'+ ExtractFileName(FilePath) end; var FileList: TFileList; I, J: Integer; TargetFilePath: String; HereDocStartIndex, HereDocEndIndex: Integer; HereDocLable: String; StartHereDocTag, EndHereDocTag: String; EndHereDocIndent: Integer; BackupFilePath: String; label LoopEnd1; begin try //バックアップファイルがあるのならリストアして終了 FileList := TFileList.Create(nil); try FileList.Directory := IncludeLastPathDelim(GetCurrentDir)+'_here_doc_backup'; FileList.FileListType := flNormal; FileList.DestStrings := StrList('FileList'); FileList.List; finally FileList.Free; end; if 1 <= StrList('FileList').Count then begin for I := 0 to StrList('FileList').Count - 1 do begin TargetFilePath := StrList('FileList')[I]; //リストア ShellMoveFile(0, TargetFilePath, GetUpFolderPath(TargetFilePath)); end; Exit; end; FileList := TFileList.Create(nil); try FileList.Directory := GetCurrentDir; FileList.FileListType := flNormal; FileList.DestStrings := StrList('FileList'); FileList.List; finally FileList.Free; end; for I := 0 to StrList('FileList').Count - 1 do begin TargetFilePath := StrList('FileList')[I]; if not SameText( ExtractFileExt(TargetFilePath) , '.pas') then Continue; //ファイル読込 StrList('FileText').LoadFromFile(TargetFilePath); StrList('OriginalFileText').Text := StrList('FileText').Text; while True do begin StartHereDocTag := '(*<<<'; HereDocStartIndex := Strings_IndexOfSubStr(StrList('FileText'), StartHereDocTag); if HereDocStartIndex = -1 then begin //ヒアドキュメントがないので終了 Break; end; HereDocLable := DelimiterRightLong(StartHereDocTag, StrList('FileText')[HereDocStartIndex]); if HereDocLable = EmptyStr then begin //ラベルがないのでエラー goto LoopEnd1; end; EndHereDocTag := HereDocLable+'*)'; HereDocEndIndex := Strings_IndexOfSubStr(StrList('FileText'), EndHereDocTag); if HereDocEndIndex = -1 then begin //ヒアドキュメント終了マークがないのでエラー goto LoopEnd1; end; StrList('FileText')[HereDocStartIndex] := DelimiterLeft(StartHereDocTag, StrList('FileText')[HereDocStartIndex]); for J := HereDocStartIndex+1 to HereDocEndIndex - 1 do begin StrList('FileText')[J] := IncludeBothEndsStr(StrList('FileText')[J], SingleQuote) + '+ #13#10 +'; end; StrList('FileText')[HereDocEndIndex] := IncludeBothEndsStr( DelimiterLeft(EndHereDocTag, StrList('FileText')[HereDocEndIndex]), SingleQuote) + DelimiterRightLong(EndHereDocTag, StrList('FileText')[HereDocEndIndex]); end; while True do begin StartHereDocTag := '(*<<-'; HereDocStartIndex := Strings_IndexOfSubStr(StrList('FileText'), StartHereDocTag); if HereDocStartIndex = -1 then begin Break; end; HereDocLable := DelimiterRightLong(StartHereDocTag, StrList('FileText')[HereDocStartIndex]); if HereDocLable = EmptyStr then begin goto LoopEnd1; end; EndHereDocTag := HereDocLable+'*)'; HereDocEndIndex := Strings_IndexOfSubStr(StrList('FileText'), EndHereDocTag); if HereDocEndIndex = -1 then begin goto LoopEnd1; end; EndHereDocIndent := MecsLength( DelimiterLeft(EndHereDocTag, StrList('FileText')[HereDocEndIndex]) ); StrList('FileText')[HereDocStartIndex] := DelimiterLeft(StartHereDocTag, StrList('FileText')[HereDocStartIndex]); for J := HereDocStartIndex+1 to HereDocEndIndex - 1 do begin StrList('FileText')[J] := IncludeBothEndsStr( MecsCopy(StrList('FileText')[J], EndHereDocIndent + 1, MaxInt), SingleQuote) + '+ #13#10 +'; end; StrList('FileText')[HereDocEndIndex] := SingleQuote + SingleQuote + DelimiterRightLong(EndHereDocTag, StrList('FileText')[HereDocEndIndex]); end; BackupFilePath := GetHereDocBackupFilePath(TargetFilePath); ShellCopyFile(0, TargetFilePath, BackupFilePath); StrList('FileText').SaveToFile(TargetFilePath); LoopEnd1: end; except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end.