IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API, COM et SDKs Delphi Discussion :

Générer source HTML


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 494
    Points : 3 129
    Points
    3 129
    Par défaut Générer source HTML
    Bonjour

    Est-ce que vous connaissez une bibli de code qui permettrait de générer du html simple ?
    Un truc genre créer le fichier, créer une table, la remplir, formater des textes .

    Je ne cherche pas quelque chose de super complexe, juste le minimum requis pour générer des contenus HTML pour faire des mails.

  2. #2
    Membre actif
    Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 319
    Points : 295
    Points
    295
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    Bonjour

    Est-ce que vous connaissez une bibli de code qui permettrait de générer du html simple ?
    Un truc genre créer le fichier, créer une table, la remplir, formater des textes .

    Je ne cherche pas quelque chose de super complexe, juste le minimum requis pour générer des contenus HTML pour faire des mails.
    J'ai acheté cette bibliothèque (ScroogeXHTML for Object Pascal) il y a pas longtemps : cela permet de convertir du RTF (TRichEdit) en HTML.
    Cela pourrait être une bonne solution : écrire le mail en RTF, puis le convertir pour l'envoi.
    https://www.scroogexhtml.com/object_pascal.html
    ScroogeXHTMLGettingStarted.pdf
    ScroogeXHTML for Object Pascal API Doc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    { LoadBytesFromStream }
    function LoadBytesFromStream(const AStream: TStream): RawByteString;
    var
      Size: Int64;
    begin
      Result := '';
     
      Size := AStream.Size;
     
      if (Size < 0) or (Size > MaxInt) then
        raise Exception.Create('Stream size error');
     
      SetLength(Result, Size);
      AStream.ReadBuffer(Pointer(Result)^, Size);
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    { GetPicRTF }
    procedure GetPicRTF(SX: TBTScroogeXHTML; const FileName: String);
    var
      Pics: TObjectDictionary<String, TEmbeddedPicture>;
      E: TEmbeddedPicture;
      Path, Picture: String;
    begin
      Pics := SX.PictureAdapter.getPictures;
      Path := ExtractFilePath(FileName);
     
      for Picture in Pics.Keys do
      begin
        E := Pics[Picture];
     
        if E.IsDataURI then
        begin
          Continue;
        end;
     
        with TMemorystream.Create do
        begin
          try
            LoadFromStream(E.Stream);
            SaveToFile(Path + Picture);
          finally
            Free;
          end;
        end;
      end;
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    { GetRTFToHtml }
    function GetRTFToHtml(const RE: TLMDRichEdit; const FileName: String): String;
    var
      MS: TMemorystream;
      RTFContent: RawByteString;
      SX: TBTScroogeXHTML;
    begin
      SX := TBTScroogeXHTML.Create;
      with SX do
      begin
        ConvertIndent := True;
        ConvertSpaces := True;
        ConvertHyperlinks := True;
        ConvertFields := True;
        ConvertEmptyParagraphs := True;
        PictureAdapter := TMemoryPictureAdapterDataURI.Create;
        SX.ConvertPictures := True;
        OptionsHead.DocumentTitle := TPath.GetFileNameWithoutExtension(FileName);
      end;
     
      MS := TMemorystream.Create;
     
      try
        MS.Seek(0, soBeginning);
        RE.Lines.SaveToStream(MS);
        MS.Seek(0, soBeginning);
     
        RTFContent := LoadBytesFromStream(MS);
        Result := GetEncodeHtml(UTF8ToString(RawByteString(SX.Convert(RTFContent))));
        GetPicRTF(SX, FileName);
      except
        Result := EmptyStr;
      end;
     
      FreeAndNil(MS);
      FreeAndNil(SX);
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    { GetEncodeHtml }
    function GetEncodeHtml(Html: String): String;
    const
      ChrMin = 123;
      ChrMax = 38000;
    var
      I: Integer;
    begin
      if StringReplace(Html, #32, EmptyStr, [rfReplaceAll]) <> EmptyStr then
      begin
        for I := ChrMin to ChrMax do
          Html := StringReplace(Html, Chr(I), '&#' + Inttostr(I) + ';', [rfReplaceAll]);
     
        Result := Html;
      end;
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    { RTFToHtml }
    procedure RTFToHtml(const FileName: String; RE: TLMDRichEdit);
    var
      Stream: TStringStream;
      HtmlContent: String;
    begin
      HtmlContent := EmptyStr;
      Stream := TStringStream.Create;
     
      HtmlContent := GetRTFToHtml(RE, FileName);
      if Length(HtmlContent) > 0 then
      begin
        Stream.WriteString(HtmlContent);
        Stream.Position := 0;
        Stream.SaveToFile(FileName);
      end
      else
        ShowMessage('Une erreur est survenue lors de l''exportation du document.');
     
      FreeAndNil(Stream);
    end;

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 222
    Points : 41 508
    Points
    41 508
    Billets dans le blog
    63
    Par défaut
    Perso, j'ai utilisé le composant de TMS, à l'époque un TMS FMX Rich Editor, je n'ai pas suivi l'évolution FNC du même composant, j'espère qu'il est identique
    Toutefois, ma tendance actuelle est plutôt de me débarasser de tout ce qui est abonnement pour les composants (budget oblige) donc, même si les sources sont fournis avec TMS, j'ai fait divers essais vers des dépôts github et libre sans vraiment trouver chaussure à mon pied.

    @XEGregory ce Scrooge... ne me parait pas mal mais il me semble être VCL only, car nécessitant le composant RTF

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 676
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 676
    Points : 25 491
    Points
    25 491
    Par défaut
    Pour générer un mail, tu n'as pas besoin d'un lib, ajouter des <body>, <B> ... ce n'est pas difficile

    c'est plutôt le composant WYSIWYG qui sera plus délicat, soit comme mentionné plus haut, un editeur RTF converti en HTML peut être une approche.

    Mais extraire les Attributes du TRichEdit pour générer du HTML, cela ne mérite pas une lib

    https://github.com/DeveloppeurPascal/HTML-Writer de Patrick connu sur le forum, c'est payant.

    Le plus délicat, c'est les injections, un éditeur HTML ne doit pas autoriser qu'on lui colle du JS et il ne faut pas qu'il l'exécute, une faille que l'on voyait sur des éditeurs WYSIWYG en JavaScript ou alors ceux en Delphi qui utilise un mode d'aperçu avec un WebBrowser.

  5. #5
    Membre actif
    Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 319
    Points : 295
    Points
    295
    Par défaut
    HTML Writer
    https://olfsoftware.lemonsqueezy.com
    Citation Envoyé par ShaiLeTroll Voir le message
    https://github.com/DeveloppeurPascal/HTML-Writer de Patrick connu sur le forum, c'est payant.

  6. #6
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 494
    Points : 3 129
    Points
    3 129
    Par défaut
    Convertir du RTF c'est bien mais je ne cherche pas un éditeur.
    Juste un moyen de générer du HTML par code.

    Alors oui je peux le faire avec un TStringBuilder et ajouter chaque élément un par un mais je me disais que quelqu'un a bien dû avoir le même besoin que moi et que peut-être ce code existait déjà

    @XeGregory : Le lien ne fonctionne pas

    404: Page Not Found
    Sorry, the page you are looking for could not be found.

    Request ID: da4a478b-829f-447b-9421-6c00da6efc6c

    Voilà un bout de code que j'ai commencé, c'est ce genre de chose que je cherche pour éviter de réinventer la roue

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
      THTMLtable = class
      private
        St: TStringBuilder;
      public
     
        Titre: string;
        Bordure: Byte;
     
     
     
        constructor Create(Titre: string = ''; Bordure: Byte = 1);
        destructor Destroy; override;
        procedure CommenceLigne;
        procedure AjouteTitre(Texte: string);
        procedure AjouteColonne(Texte: string; Titre: Boolean = False);
        procedure TermineLigne;
        procedure Termine;
        function AsString: string;
     
     
      end;
     
    implementation
     
    { THTMLtable }
     
    procedure THTMLtable.AjouteColonne(Texte: string; Titre: Boolean);
    begin
      St.AppendLine(Format('<%1:s>%0:s</%1:s>', [Texte, IfThen(Titre, 'th', 'td')]));
    end;
     
    procedure THTMLtable.AjouteTitre(Texte: string);
    begin
      St.AppendLine(Format('<caption>%s</caption>', [Texte]));
    end;
     
    function THTMLtable.AsString: string;
    begin
      Result := St.ToString;
    end;
     
    procedure THTMLtable.CommenceLigne;
    begin
      St.AppendLine('<tr>');
    end;
     
    constructor THTMLtable.Create(Titre: string; Bordure: Byte);
    begin
      St := TStringBuilder.Create;
      St.AppendLine(Format('<table border="%dpx">', [Bordure]));
      if not Titre.IsEmpty then
        AjouteTitre(Titre);
    end;
     
    destructor THTMLtable.Destroy;
    begin
      St.Free;
      inherited;
    end;
     
    procedure THTMLtable.Termine;
    begin
      St.AppendLine('</table>');
    end;
     
    procedure THTMLtable.TermineLigne;
    begin
      St.AppendLine('</tr>');
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
     
      Tbl := THTMLtable.Create('toto', 1);
     
      Tbl.CommenceLigne;
      Tbl.AjouteColonne('Titre col 1', True);
      Tbl.AjouteColonne('Titre col 2', True);
      Tbl.TermineLigne;
     
      Tbl.CommenceLigne;
      Tbl.AjouteColonne('Titre col 1', False);
      Tbl.AjouteColonne('Titre col 2', False);
      Tbl.TermineLigne;
     
      Tbl.TermineLigne;
     
      Tbl.Termine;

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 676
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 676
    Points : 25 491
    Points
    25 491
    Par défaut
    Si tu n'as pas besoin d'éditeur avec un contenu html préformaté, tu peux combiner deux approches, la construction dynamique et un template où tu injecte des valeurs, ces valeurs pouvant être elles-mêmes du HTML (un tableau comme le montre ton THTMLtable)

    Tu es a mon avis sur la bonne piste, simple et efficace, au moins ça fera juste ce dont tu as besoin au lieu d'intégrer le code d'un autre qui sera probablement bien plus lourd pour n'en exploiter qu'une partie mineure.

  8. #8
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 222
    Points : 41 508
    Points
    41 508
    Billets dans le blog
    63
    Par défaut
    Dans ce cas si tu te sens un peu farfouilleur DZHTMLText pourrait peut-être te convenir.
    Toutefois attention, toutes les balises ne sont pas prises en charge et certaines ne sont pas totalement HTML correctes.
    Comme les sources sont fournies il est possible "d'améliorer" le produit perso j'avais ajouté les H1 à H4 sans trop de difficultés.

    Je m'étais fait un éditeur adapté, si tu poursuis cette voie, je ferais une recherche dans mes sources

  9. #9
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 494
    Points : 3 129
    Points
    3 129
    Par défaut
    @ShaiLeTroll Oui c'est vrai que je peux au moins choisir ce que je veux comme ça.
    Après , j'hésitais entre 2 approches.
    Celle que j'ai donné en exemple qui est un peu linéaire.
    Une autre qui serait plutôt de fournir tous les éléments pour créer un élément de façon à le créer à la fin.
    Par exemple, un THTMLtable avec une propriété Titre, une collection de THTMLrow , une collection de header de colonnes, etc.
    Comme c'est un début, je peux encore changer de cap.


    @SergioMaster Je vais regarder ça. Si les sources sont fournies, je pourrai toujours ajuster au besoin. Merci

  10. #10
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 676
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 676
    Points : 25 491
    Points
    25 491
    Par défaut
    Tu peux aussi utiliser une TStringList comme THTMLrow pour définir un ligne d'un coup, et cela dépend ta volonté de réutilisation,
    tu peux faire une classe très simple à utiliser mais dirigiste pour uniquement le html de ton corps de mail
    mais tu peux aussi aller à une encapsulation plus poussée comme la gestion de token du DZHTMLText cité ci-dessus pour plusieurs cas d'utilisation

    J'ai déjà généré du HMTL pour un mail, je n'ai pas fait de classe pour ça, j'ai juste fait du Format façon champ de fusion avec un template genre coup de StringReplace

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <HTML><BODY>Bonjour [TO_Civilite] [TO_Nom]</BR>,
    </BR>
    Voici votre liste de trucs:</BR>
    </BR>
    [TABLE_DATA]</BR>
    </BR>
    Autre champ [CHAMP_FUSION] qu'il faut joindre.</BR>
    </BR>
    </BR>
    </BR>
    Cordialement,</BR>
    [FROM_Nom] [FROM_Prenom]</BR></BODY></HTML>

  11. #11
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 494
    Points : 3 129
    Points
    3 129
    Par défaut
    Avec un peu de retard, désolé ...

    Le template, je l'utilise déjà en fait pour la signature de l'email avec une image, le nom de l'expéditeur, etc.
    Le HTML à gérer est seulement le contenu du BODY.
    Mais le principe reste identique.

    Je vais partir là-dessus dans un premier temps en attendant de développer quelque chose de moins figé.

    Merci à tous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [JSP]sources html + adresse physique des fichiers
    Par hinanui dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 29/03/2006, 19h03
  2. [RegEx] Problème pour enlever les tags javascript d'une source HTML
    Par Easyweb dans le forum Langage
    Réponses: 4
    Dernier message: 25/02/2006, 02h10
  3. [Tableaux] Récupérer source html
    Par philippef dans le forum Langage
    Réponses: 16
    Dernier message: 10/10/2005, 15h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo