2012-08-14 94 views
7

Puede decir que hay muchas discusiones sobre esto en stackOverflow, pero la mayoría son más complicadas de lo que necesito y sobre todo para otros idiomas.Cómo convertir RichText simple a etiquetas HTML en Delphi?

Tengo una base de datos remota MySQL en la que tengo una tabla de "Ayuda" con el código para llenar las páginas de ayuda del sitio web dinámico que utiliza esta base de datos.

Decidí hacer una aplicación Delphi para administrar ese sitio web en lugar de hacerlo por el sitio web en sí mismo para mayor velocidad y seguridad.

Quiero poner un TRichEdit para hacer ese texto de ayuda y usar cosas simples como estilos de alineación, negrita, cursiva y subrayado. No quiero usar imágenes y fuentes.

¿Cómo escoger ese rico texto con estilo y convertirlo a HTML poner a mi campo BLOB en la base de datos remota y luego reconvertir a texto enriquecido si quiero editar de nuevo?

+1

Hay un RTF comercial, fácil de usar a HTML/RTF a la biblioteca convertidor de XHTML para Delphi llamada ScroogeXHTML, que puede ser configurado para procesar sólo las propiedades básicas de la fuente. (descargo de responsabilidad: yo soy el autor de esta biblioteca) – mjn

+1

¿Y cuánto cuesta esta biblioteca? – PSyLoCKe

+0

Puede encontrarlo en ['this page'] (http://www.habarisoft.com/scroogexhtml_delphi.html) ;-) – TLama

Respuesta

5

Después de probar muchas soluciones diferentes que no dieron resultados precisos, me inspiré en esta solución: Convert RTF to HTML and HTML to RTF.

La idea es que el control TWebBrowser (en modo de diseño/edición) puede manejar y convertir correctamente el formato de texto enriquecido cuando se pegó desde el portapapeles.

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; 
6

Si realmente desea generar contenido RTF utilizando un TRichEdit, debe almacenar el RTF nativo que genera junto con el HTML convertido. Si la única razón por la que está utilizando TRichEdit es para que pueda tener capacidades de formateo simples, entonces probablemente sea mejor utilizar un control de edición HTML que genere contenido HTML nativo.

Independientemente de qué camino tome, es mejor almacenar el formato nativo para que los usuarios editen el contenido y convertirlo según sea necesario a otros formatos (en lugar de convertirlo en ambas direcciones).

Si utiliza TRichEdit, entonces se puede transmitir fácilmente el contenido RTF dentro y fuera de control, aunque recomiendo TJvRichEdit sobre 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; 

manualmente convertir RTF a HTML no es una tarea fácil. Hay consideraciones de carácter unicode, estilos de fuente, códigos de fuente, formato de párrafo, listas numeradas, caracteres HTML especiales y mucho más. Aunque solo es necesario admitir el formato simple, los usuarios a menudo usan otras características que causan problemas de conversión, como copiar contenido de MSWord y pegarlo en su aplicación con todo tipo de formatos y estilos de fuente.

JvRichEditToHtml hace un trabajo decente la conversión de RTF a HTML, pero terminamos escribiendo nuestra propia unidad de conversión porque hacemos mucho más con RTF que con el formato simple. JvRichEditToHtml debe manejar fácilmente lo que ha descrito siempre y cuando los usuarios no introduzcan contenido complejo mediante copiar/pegar, o usar los atajos de teclado para formatear el contenido (por ejemplo, bullets = ctrl + shft + L, indent = ctrl + M , etc.)

También hay varios buenos controles HTML de edición para Delphi si desea pasar por alto las complejidades de la autoría en formato RTF y convertir a HTML:

Google Results :: Delphi, HTML, Editor, Component

Stack Overflow :: Delphi, HTML, Editor, Component

Utilizamos TRichView debido a sus amplias capacidades. Puede cargar/crear RTF y exportar HTML. Sin embargo, no es gratis. Si buscas algo gratis, TJvRichView y JvRichEditToHtml son buenas opciones.

+0

Luché con esos editores de HTML. Ni siquiera son medio decentes/completos. Incluso las soluciones comerciales son descuidadas. – Ampere