Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

DEBUT DE PARSEUR HTML (AVEC TPARSER)


Information sur la source

Catégorie :Texte Classé sous : tparser, html, parseur, analyse, lecture Niveau : Initié Date de création : 24/10/2005 Vu / téléchargé: 6 824 / 452

Note :
9 / 10 - par 1 personne
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (6)
Ajouter un commentaire et/ou une note

Description

Cliquez pour voir la capture en taille normale
Petit parseur HTML à l'etat de projet (oui j'vient juste de le faire), mais je le poste maintenant car j'aurai aimé de l'aide à ce sujet puisque je n'arrive pas à savoir comment colorer le texte pendant la frappe.

Dans mon cas je me suis contenté uniquement de la classe TParser, sinon aller voir la source de Florenth (http://www.delphifr.com/code.aspx?ID=31741) si vous voulez aller un peu plus loin.
 

Source

  • {*******************************
  • | Parseur de fichier HTML |
  • | Début de projet |
  • | Par LEVEUGLE Damien |
  • *******************************}
  • unit UHtml;
  • interface
  • uses Windows, Forms, SysUtils, Classes, ComCtrls, Graphics;
  • type TParse = class(TParser)
  • private
  • BALISES : TStringList;
  • CHAMPS : TStringList;
  • public
  • constructor Create( Stream : TStream );
  • destructor Destroy;
  • procedure Color( Editeur : TRichEdit );
  • end;
  • const
  • FICHIER_BALISES = 'BALISES.txt';
  • FICHIER_CHAMPS = 'CHAMPS.txt';
  • implementation
  • { constructeur }
  • constructor TParse.Create( Stream : TStream );
  • begin
  • BALISES := TStringList.Create;
  • CHAMPS := TStringList.Create;
  • BALISES.LoadFromFile( ExtractFilePath(Application.ExeName) + FICHIER_BALISES );
  • CHAMPS.LoadFromFile ( ExtractFilePath(Application.ExeName) + FICHIER_CHAMPS );
  • inherited Create( Stream );
  • end;
  • { Destructeur }
  • destructor TParse.Destroy;
  • begin
  • BALISES.Free;
  • CHAMPS.Free;
  • inherited Destroy;
  • end;
  • { Procedure qui parse et colorise le texte }
  • procedure TParse.Color( Editeur : TRichEdit );
  • var
  • Memoire : Integer;
  • begin
  • Editeur.SelStart := 1;
  • Editeur.SelLength := Length( Editeur.Text );
  • Editeur.SelAttributes.Color := clBlack;
  • while ( Self.Token <> toEOF ) do
  • begin
  • Application.ProcessMessages;
  • case ( Self.Token ) of
  • toString, toWString, toInteger, toFloat :
  • begin
  • Editeur.SelStart := Self.SourcePos;
  • Editeur.SelLength := Length(Self.TokenString);
  • Editeur.SelAttributes.Color := clGray;
  • Editeur.SelLength := 0;
  • end;
  • toSymbol :
  • begin
  • { BALISES D'EN TETE ( ex : BODY ) }
  • if ( BALISES.IndexOf( UpperCase(Self.TokenString) ) > -1 ) then
  • begin
  • Editeur.SelStart := Self.SourcePos;
  • Editeur.SelLength := Length(Self.TokenString);
  • Editeur.SelAttributes.Color := clBlue;
  • Editeur.SelLength := 0;
  • end;
  • { PROPRIETES DES BALISES ( ex : "href" ) }
  • if ( CHAMPS.IndexOf( UpperCase(Self.TokenString) ) > -1 ) then
  • begin
  • Editeur.SelStart := Self.SourcePos;
  • Editeur.SelLength := Length(Self.TokenString);
  • Editeur.SelAttributes.Color := clGray;
  • Editeur.SelLength := 0;
  • end;
  • end;
  • else begin
  • { *** Valeurs *** }
  • if ( Self.TokenString = '"' ) then
  • begin
  • Memoire := Self.SourcePos;
  • Self.NextToken;
  • while ( Self.TokenString <> '"' ) do Self.NextToken;
  • Editeur.SelStart := Memoire;
  • Editeur.SelLength := ( Self.SourcePos + 1 ) - Memoire;
  • Editeur.SelAttributes.Style := [fsItalic];
  • Editeur.SelAttributes.Color := clRed;
  • Editeur.SelLength := 0;
  • Memoire := 0;
  • end;
  • { *** Feuille Style *** }
  • if ( Self.TokenString = '{' ) then
  • begin
  • Memoire := Self.SourcePos;
  • while ( Self.TokenString <> '}' ) do Self.NextToken;
  • Editeur.SelStart := Memoire;
  • Editeur.SelLength := ( Self.SourcePos + 1 ) - Memoire;
  • Editeur.SelAttributes.Style := [fsItalic];
  • Editeur.SelAttributes.Color := clGreen;
  • Editeur.SelLength := 0;
  • Memoire := 0;
  • end;
  • { *** Symboles & Balises *** }
  • if ( Self.TokenString = '>' ) or
  • ( Self.TokenString = '/' ) or
  • ( Self.TokenString = '<' ) then
  • begin
  • Editeur.SelStart := Self.SourcePos;
  • Editeur.SelLength := Length(Self.TokenString);
  • Editeur.SelAttributes.Color := clNavy;
  • Editeur.SelLength := 0;
  • end;
  • end;
  • end;
  • Self.NextToken;
  • end;
  • end;
  • end.
{*******************************
 |  Parseur de fichier HTML    |
 |  Début de projet            |
 |  Par LEVEUGLE Damien        |
 *******************************}

unit UHtml;

interface

uses Windows, Forms, SysUtils, Classes, ComCtrls, Graphics;

type TParse = class(TParser)
private
  BALISES : TStringList;
  CHAMPS  : TStringList;
public
  constructor Create( Stream : TStream );
  destructor Destroy;
  procedure Color( Editeur : TRichEdit );
end;

const
    FICHIER_BALISES = 'BALISES.txt';
    FICHIER_CHAMPS  = 'CHAMPS.txt';

implementation

{ constructeur }
constructor TParse.Create( Stream : TStream );
begin

  BALISES := TStringList.Create;
  CHAMPS := TStringList.Create;

  BALISES.LoadFromFile( ExtractFilePath(Application.ExeName) + FICHIER_BALISES );
  CHAMPS.LoadFromFile ( ExtractFilePath(Application.ExeName) + FICHIER_CHAMPS  );

  inherited Create( Stream );

end;

{ Destructeur }
destructor TParse.Destroy;
begin

    BALISES.Free;
    CHAMPS.Free;

    inherited Destroy;

end;

{ Procedure qui parse et colorise le texte }
procedure TParse.Color( Editeur : TRichEdit );
var
    Memoire : Integer;
begin

      Editeur.SelStart  := 1;
      Editeur.SelLength := Length( Editeur.Text );
      Editeur.SelAttributes.Color := clBlack;

      while ( Self.Token <> toEOF ) do
      begin

        Application.ProcessMessages;

        case ( Self.Token ) of

            toString, toWString, toInteger, toFloat :
                        begin
                            Editeur.SelStart  := Self.SourcePos;
                            Editeur.SelLength := Length(Self.TokenString);
                            Editeur.SelAttributes.Color := clGray;
                            Editeur.SelLength := 0;
                        end;

            toSymbol :
                        begin

                           { BALISES D'EN TETE ( ex : BODY ) }
                            if ( BALISES.IndexOf( UpperCase(Self.TokenString) ) > -1 ) then
                            begin
                                 Editeur.SelStart            := Self.SourcePos;
                                 Editeur.SelLength           := Length(Self.TokenString);
                                 Editeur.SelAttributes.Color := clBlue;
                                 Editeur.SelLength           := 0;
                            end;

                            { PROPRIETES DES BALISES ( ex : "href" ) }
                            if ( CHAMPS.IndexOf( UpperCase(Self.TokenString) ) > -1 ) then
                            begin
                                 Editeur.SelStart            := Self.SourcePos;
                                 Editeur.SelLength           := Length(Self.TokenString);
                                 Editeur.SelAttributes.Color := clGray;
                                 Editeur.SelLength           := 0;
                            end;

                        end;

            else begin

                    { *** Valeurs *** }
                    if ( Self.TokenString = '"' ) then
                    begin

                        Memoire := Self.SourcePos;
                        Self.NextToken;

                        while ( Self.TokenString <> '"'  ) do Self.NextToken;

                            Editeur.SelStart := Memoire;
                            Editeur.SelLength := ( Self.SourcePos + 1 ) - Memoire;
                            Editeur.SelAttributes.Style := [fsItalic];
                            Editeur.SelAttributes.Color := clRed;
                            Editeur.SelLength           := 0;
                            Memoire := 0;
                    end;

                    { *** Feuille Style *** }
                    if ( Self.TokenString = '{' ) then
                    begin

                        Memoire := Self.SourcePos;

                         while ( Self.TokenString <> '}'  ) do Self.NextToken;

                            Editeur.SelStart := Memoire;
                            Editeur.SelLength := ( Self.SourcePos + 1 ) - Memoire;
                            Editeur.SelAttributes.Style := [fsItalic];
                            Editeur.SelAttributes.Color := clGreen;
                            Editeur.SelLength := 0;
                            Memoire := 0;
                    end;

                    { *** Symboles & Balises *** }
                    if ( Self.TokenString = '>' ) or
                       ( Self.TokenString = '/' ) or
                       ( Self.TokenString = '<' ) then
                    begin
                            Editeur.SelStart := Self.SourcePos;
                            Editeur.SelLength := Length(Self.TokenString);
                            Editeur.SelAttributes.Color := clNavy;
                            Editeur.SelLength := 0;
                    end;

                 end;

            end;

        Self.NextToken;

    end;

end;

end.

Conclusion

Si vous avez des conseils sur cette pauvre source ?
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

signaler à un administrateur
Commentaire de elguevel le 24/10/2005 19:53:31

merci florenth de tes commentaires, mais c'est grace a ta source que j'ai compris le fonctionnement de TParser :-)

Sinon pour le Bug je sais ce que sais mais je ne sais pas comment le contourner : Il sagit en faite du caractère ' propre au delimiteur de chaine sous delphi (vu que le parseur est au départ celui de Delphi).

sinon tu as une idée à ma première question ... comment colorer syntaxyquement pendant la frappe ?

Merci encore, et @+

Damien

signaler à un administrateur
Commentaire de assemple le 01/11/2005 09:59:39

Je ne suis pas du tout content de l'intérêt que suscite cette publication.
Je ne critique en rien le travail de Damien LEVEUGLE, que j'ai d'ailleurs trouvé très bien.
Mais, à peine diffusé (nous sommes mardi), il y a déjà 5 commentaires.
La semaine dernière j'ai publié une boite de message améliorée, intégrant un interpréteur HTML, lui-même utilisable indépendanment de la boîte de message, comme suit :
TextHTMLOut(CanvasCible : TCanvas ;
            X,Y : Integer ;
            ChaineHTML : String ;
            Var Hauteur : String )
J'ai commencé un éditeur HTML WYSIWYG, que j'ai d'ailleurs du mal a terminer (les tags sont invisible donc hors sélection éventuelle... comment appliquer un changement de format ?)

Un éditeur HTML WYSIWYG, c'est quand même mieux qu'un éditeur avec coloration syntaxique.

J'ai pensé qu'il devrait être ensuite facile de créer un éditeur HTML/PHP WYSIWYG et SYNTAXIQUE.
Ce serait génbial non ?

Qui veux les sources de l'éditeur HTML ?

NOTA : dépuis que j'ai commencé l'éditeur, je me suis rendu compte que sur certaines balises je ne respectais pas la norme HTML. Ce n'ai pas trop grave tant que l'on conserve une parfaite compatibilité de l'Editeur vers les Explorateurs Standard, ce qui est à peu près le cas.

On pourrait développer ça en open source

SAUF s'il existe DEJA un éditeur HTML WYSIWYG (en Delphi, of course !)

Salut à tous (et à toutes ... si peu nombreuses)

Diégo DELPY

signaler à un administrateur
Commentaire de assemple le 01/11/2005 10:01:45

PS : ma boîte de message html est :
http://www.delphifr.com/code.aspx?ID=34227

signaler à un administrateur
Commentaire de assemple le 01/11/2005 18:54:55

Jaloux, oui, mais pas comme un mari !
Personne n'a commenté ma publication !
(www.delphifr.com/code.aspx?ID=34227)

Un interpréteur HTML devrait susciter autant d'intérêt qu'un parser.

C'était tout.

Je constate qu'une publication pleine d'intérêt n'interresse personne.

Continuez a utiliser Application.MessageBox qui encapsule une boite de message peu lisible, limitée, et compliquée a utiliser.

signaler à un administrateur
Commentaire de assemple le 02/11/2005 10:23:16

J'ai répondu à Damien à www.delphifr.com/code.aspx?ID=34227

signaler à un administrateur
Commentaire de tartave le 10/02/2008 13:55:41

super ton programme.c'est ce que je chercher en partie ^^ dommage que je sois débutant... j'ai du mal a comprendre certaine ligne de ton code..

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Extraire des tags HTML [ par BinOff ] Voilà, je commence avec un fichier HTML ouvert en tant que source dans un memo1.Je souhaiterais extraire les noms des images incluses dans le source H analyse de risques [ par tarik ] j'ai lu plusieurs extraits sur l'analyse des risques mais je n'ai vu d'exemples , je me demande si t'as une idée là dessus.resectueusement tarik Lecture Video [ par Moneo ] Salut !Alors , j'inogure cette séction avec un probléme un peu bizzare :J'essaie de faire un lecteur multimedia en delphi , pour lire de la video et p Couleur [ par Shadow ] Salut, je voudrai mettre une couleur comme fond sur ma form mais la couleur c un code html alors je veux savoir si je peux utiliser un code html ?moi entete HTTP [ par franck ] Bonjour à tous les DELPHISTE...Je souhaiterai pouvoir recuperer l'entete d'un fichier HTML en delphi 5. ex : HTTP/1.1 2 OKDate: Wed Nov 2001 14 76 : Lecture fichier texte ligne par ligne [ par MattXSFR ] J'utilise le code suivant pour copier le contenu d'un fichier texte dans une liste box (une ligne de list box pour chaque ligne du fichier) :procedure lecture et écriture dans un fichier .ini [ par finipe ] Bonjour à tous !Je voudrais savoir comment faire pour : - écrire dans un .ini tous les items d'une listbox, de manière à pouvoir les récupérer en lisa lecture & ecriture das un fichier txt situe sur le web [ par Kosh ] Salut a tousje voudrait savoir si il y as moyen de lire un fichier text (situe sur un http ou ftp), que son contenu sois mit dans un memo pour pouvoir Tag HTML avec edit ou richedit [ par sebrs1 ] Connaissez-vous un composant comme richedit ou edit qui execute les code html???merci d'avance@+Sebrs1 DbGrid sur une page html [ par OtellO ] Mon pb est de savoir comment je peux mettre un composent DbGrid ou autre composent orienté données sur une page (html je presume???) et l'afficher sur


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,421 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.