Войти
ДельфинарийСтатьи

Сохранение подсвеченного кода в RTF и HTML

Автор:

Понадобилось тут сохранить код из дельфей в html, да ещё и с разметкой. Как сделать это из IDE я не догнал:)
На помощь пришёл SynEdit.
Качаем Synedit  v1.1 (830кб), пишем простенькие программки:

В RTF

{$APPTYPE CONSOLE}

program pas2rtf;

{$I SynEdit.inc}

uses
  Windows, Classes, Clipbrd, SynHighlighterPas,SynExportRTF;

var
  ALines: TStringList;
  Syn: TSynPasSyn;
  Exp: TSynExporterRTF;
begin
  if Clipboard.HasFormat(CF_TEXT) then begin
    ALines := TStringList.Create;
    try
      Syn := TSynPasSyn.Create(nil);
      try
        // get syntax highlighter settings
        Syn.EnumUserSettings(ALines);
        if ALines.Count > 0 then
          Syn.UseUserSettings(ALines.Count - 1);

        //от себя добавил:)
        Syn.CommentAttri.Foreground:= DWord($800000);//clNavy
        Syn.DirectiveAttri.Foreground:= DWord($008000);//clGreen

        // load text from clipboard
        ALines.Text := Clipboard.AsText;
        // export ALines to RTF
        Exp := TSynExporterRTF.Create(nil);
        try
          Exp.Highlighter := Syn;
          Exp.ExportAsText := TRUE;
          Exp.ExportAll(ALines);
          Exp.CopyToClipboard;
        finally
          Exp.Free;
        end;
      finally
        Syn.Free;
      end;
    finally
      ALines.Free;
    end;
  end;
end.


В HTML

{$APPTYPE CONSOLE}

program pas2html;

{$I SynEdit.inc}

uses
  Windows, Classes, Clipbrd, SynHighlighterPas, SynExportHTML;

var
  ALines: TStringList;
  Syn: TSynPasSyn;
  Exp: TSynExporterHTML;
begin
  if Clipboard.HasFormat(CF_TEXT) then begin
    ALines := TStringList.Create;
    try
      Syn := TSynPasSyn.Create(nil);
      try
        // get syntax highlighter settings
        Syn.EnumUserSettings(ALines);
        if ALines.Count > 0 then
          Syn.UseUserSettings(ALines.Count - 1);

        //от себя добавил:)
        Syn.CommentAttri.Foreground:= DWord($800000);//clNavy
        Syn.DirectiveAttri.Foreground:= DWord($008000);//clGreen

        // load text from clipboard
        ALines.Text := Clipboard.AsText;
        // export ALines to HTML, as HTML fragment in text format
        Exp := TSynExporterHTML.Create(nil);
        try
          Exp.Highlighter := Syn;
          Exp.ExportAsText := TRUE;
          Exp.CreateHTMLFragment := TRUE;
          Exp.ExportAll(ALines);
          Exp.CopyToClipboard;
        finally
          Exp.Free;
        end;
      finally
        Syn.Free;
      end;
    finally
      ALines.Free;
    end;
  end;
end.
Не забываем указать путь к папке "\SynEdit1.1\Source".
Копируем код в буффер обмена, запускаем нужную прогу и в буффере теперь хранится код в нужном формате... всё:)

Конечно, у SynEdit  возможностей гораздо больше, можно наустановить кучу кампанентов, но для этой задачи ничего такого не нужно.
Надеюсь, кому-нибудь это пригодится:)

З.Ы.
Неприятной особенностью сохраненеия кода в HTML, является тот факт, что Син вместо русских букв вставляет теги, сцуко.
Лечить это можно хирургическим вмешательством.
Открываем SynExportHTML.pas и смело правим

 ....
  fReplaceReserved['А'] := 'А';
  fReplaceReserved['Б'] := 'Б';
  fReplaceReserved['В'] := 'В';
  fReplaceReserved['Г'] := 'Г';
  fReplaceReserved['Д'] := 'Д';
  fReplaceReserved['Е'] := 'Е';
  fReplaceReserved['Ж'] := 'Ж';
  fReplaceReserved['З'] := 'З';
  fReplaceReserved['И'] := 'И';
  fReplaceReserved['Й'] := 'Й';
  fReplaceReserved['К'] := 'К';
  fReplaceReserved['Л'] := 'Л';
  fReplaceReserved['М'] := 'М';
  fReplaceReserved['Н'] := 'Н';
  fReplaceReserved['О'] := 'О';
  fReplaceReserved['П'] := 'П';
  fReplaceReserved['Р'] := 'Р';
  fReplaceReserved['С'] := 'С';
  fReplaceReserved['Т'] := 'Т';
  fReplaceReserved['У'] := 'У';
  fReplaceReserved['Ф'] := 'Ф';
  fReplaceReserved['Х'] := 'Х';
  fReplaceReserved['Ц'] := 'Ц';
  fReplaceReserved['Ш'] := 'Ш';
  fReplaceReserved['Щ'] := 'Щ';
  fReplaceReserved['Ъ'] := 'Ъ';
  fReplaceReserved['Ы'] := 'Ы';
  fReplaceReserved['Ь'] := 'Ь';
  fReplaceReserved['Э'] := 'Э';
  fReplaceReserved['Ю'] := 'Ю';
  fReplaceReserved['Я'] := 'Я';
  fReplaceReserved['а'] := 'а';
  fReplaceReserved['б'] := 'б';
  fReplaceReserved['в'] := 'в';
  fReplaceReserved['г'] := 'г';
  fReplaceReserved['д'] := 'д';
  fReplaceReserved['е'] := 'е';
  fReplaceReserved['ж'] := 'ж';
  fReplaceReserved['з'] := 'з';
  fReplaceReserved['и'] := 'и';
  fReplaceReserved['й'] := 'й';
  fReplaceReserved['к'] := 'к';
  fReplaceReserved['л'] := 'л';
  fReplaceReserved['м'] := 'м';
  fReplaceReserved['н'] := 'н';
  fReplaceReserved['о'] := 'о';
  fReplaceReserved['п'] := 'п';
  fReplaceReserved['р'] := 'р';
  fReplaceReserved['с'] := 'с';
  fReplaceReserved['т'] := 'т';
  fReplaceReserved['у'] := 'у';
  fReplaceReserved['ф'] := 'ф';
  fReplaceReserved['х'] := 'х';
  fReplaceReserved['ц'] := 'ц';
  fReplaceReserved['ш'] := 'ш';
  fReplaceReserved['щ'] := 'щ';
  fReplaceReserved['ъ'] := 'ъ';
  fReplaceReserved['ы'] := 'ы';
  fReplaceReserved['ь'] := 'ь';
  fReplaceReserved['э'] := 'э';
  fReplaceReserved['ю'] := 'ю';
  fReplaceReserved['я'] := 'я';
...
  fReplaceReserved['Ё'] := 'Ё';
...
  fReplaceReserved['ё'] := 'ё';
...
  fReplaceReserved['ј'] := 'j';
  fReplaceReserved['Ѕ'] := 'S';
  fReplaceReserved['ѕ'] := 's';
...
  fReplaceReserved['Ч'] := 'Ч';
  fReplaceReserved['ч'] := 'ч';

22 января 2006 (Обновление: 5 фев. 2006)

Комментарии [3]