Как конвертировать простой RichText в HTML теги в Delphi?

вы можете сказать, что в stackOverflow есть много дискуссий об этом, но большинство из них сложнее, чем то, что мне нужно, и в основном для других языков.

У меня есть удаленная база данных MySQL, в которой у меня есть таблица "справка" с кодом для заполнения страниц справки динамического веб-сайта, который использует эту базу данных.

Я решил сделать приложение Delphi для управления этим сайтом вместо того, чтобы делать сам веб-сайт для большей скорости и безопасность.

Я хочу поставить TRichEdit чтобы сделать этот текст справки и использовать простые вещи, такие как выравнивание, жирный, курсив и подчеркнутые стили. Я не хочу использовать картинки и шрифты.

Как выбрать этот богатый текст в стиле и преобразовать его в HTML поместить в мое поле BLOB в удаленной базе данных а затем снова преобразовать в форматированный текст, если я хочу отредактировать его снова?

2 ответов


попробовав много разных решений, которые не дали точных результатов, я был вдохновлен этим решением:преобразование RTF в HTML и HTML в RTF.

идея в том, что TWebBrowser control (в режиме design / edit) может обрабатывать и преобразовывать формат Rich text, когда он был вставлен из буфера обмена.

uses SHDocVw, MSHTML;

function ClipboardToHTML(AParent: TWinControl): WideString;
var
  wb: TWebBrowser;

  function WaitDocumentReady: Boolean;
  var
    StartTime: DWORD;
  begin
    StartTime := GetTickCount;
    while wb.ReadyState <> READYSTATE_COMPLETE do
    begin
      Application.HandleMessage;
      if GetTickCount >= StartTime + 2000 then // time-out of max 2 sec
      begin
        Result := False; // time-out
        Exit;
      end;
    end;
    Result := True;
  end;
begin
  Result := '';
  wb := TWebBrowser.Create(nil);
  try
    wb.Silent := True;
    wb.Width := 0;
    wb.Height := 0;
    wb.Visible := False;
    TWinControl(wb).Parent := AParent;
    wb.HandleNeeded;
    if wb.HandleAllocated then
    begin
      wb.Navigate('about:blank');
      (wb.Document as IHTMLDocument2).designMode := 'on';
      if WaitDocumentReady then
      begin
        (wb.Document as IHTMLDocument2).execCommand('Paste', False, 0);
        Result := (wb.Document as IHTMLDocument2).body.innerHTML;
      end;
    end;
  finally
    wb.Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  RichEdit1.SelectAll;
  RichEdit1.CopyToClipboard;

  ShowMessage(ClipboardToHTML(Self));
end;

если вы действительно хотите создать RTF-контент с помощью TRichEdit, затем вы должны сохранить собственный RTF, который он генерирует вместе с преобразованным HTML. Если единственная причина, по которой вы используете TRichEdit Так что вы можете иметь простые возможности форматирования, то вам, вероятно, лучше использовать элемент управления редактирования HTML, который генерирует собственное содержимое HTML.

независимо от того, в какую сторону вы идете, лучше хранить собственный формат для пользователей, чтобы редактировать контент и конвертировать его по мере необходимости другие форматы (вместо преобразования в обоих направлениях).

если вы используете TRichEdit, тогда вы можете легко передавать содержимое RTF В и из-под контроля, хотя я рекомендую TJvRichEdit над TRichEdit:

procedure GetRTFData(MS: TMemoryStream; RTF: TRichEdit);
begin
  MS.Clear;
  RTF.Lines.SaveToStream(MS);
  MS.Position := 0;
end;

procedure SetRTFData(MS: TMemoryStream; RTF: TRichEdit);
begin
  MS.Position := 0;
  RTF.StreamFormat := sfRichText;
  RTF.Lines.LoadFromStream(MS);
end;

ручное преобразование RTF в HTML-это непростая задача. Есть соображения символов Юникода, стили шрифтов, коды шрифтов, форматирование абзацев, нумерованные списки, специальные символы HTML и многое другое. Даже если вам нужно только поддержать простой форматирование, пользователи часто используют другие функции, которые вызывают головные боли преобразования - например, копирование содержимого из MSWord и вставка его в приложение со всеми видами форматирования и стилей шрифта.

JvRichEditToHtml делает достойную работу по преобразованию RTF в HTML, но мы в конечном итоге написали нашу собственную единицу преобразования, потому что мы делаем гораздо больше с RTF, чем простое форматирование. JvRichEditToHtml должно легко обрабатывать то, что вы описали, пока пользователи не вводят сложный контент с помощью копирования/вставки или не используют сочетания клавиш для форматирования содержимого (например, маркеры = ctrl+shft+L, отступ = ctrl+M и т. д.).

есть также несколько хороших элементов управления редактированием HTML для Delphi, если вы хотите обойти сложности создания в RTF и преобразования в HTML:

результаты Google:: Delphi, HTML, редактор, компонент

переполнение стека:: Delphi, HTML, редактор, компонент

мы используем:TRichView из-за его обширных возможностей. Он может загружать / создавать RTF и экспортировать HTML. Однако это не бесплатно. Если вы ищете что-то бесплатно, TJvRichView и JvRichEditToHtml хорошие варианты.