Debut de parseur html (avec tparser)

Soyez le premier à donner votre avis sur cette source.

Vue 10 764 fois - Téléchargée 721 fois

Description

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 / Exemple :


{*******************************
 |  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 ?

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
15
Date d'inscription
vendredi 5 octobre 2007
Statut
Membre
Dernière intervention
1 mars 2009

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..
" Je ne suis pas du tout content de l'intérêt que suscite cette publication. " => Serais-tu jaloux ??

Plus sérieusement, je vais oublier les trois premières lignes que tu as post car elles ne méritent pas d'être.

L'interet du code de elguevel, c'esrt justmement la technique qui permet d'analyser le code HTML pour en extraire les différentes parties: c'est ça le rôle d'un parser.

Après, si tu veux interpréter le code pour afficher la page, il te faut un analyseur lexical, qui retourne des lexèmes (en anglais cela se dit "token" , un parser par exemple mais es expressions régulières sont plus efficaces), puis un analyseur syntaxique et enfin un analyseur sémantique.

Je ne pense pas que l'ambition de elguevel est de rivaliser avec Firefox ou Opéra.
Messages postés
65
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
16 décembre 2011

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
Pendant la frappe ... ce n'est pas si simple.
Ce qu'il faudrait, c'est faire débuter le parser un peu avant (mais de combien) le curseur et le faire arreter s'il se rend compte qu'il ne modifie plus rien.

J'essaye sur mon parser (c'est toujours plus simple si c'est le sien) et je t'avertis si je trouve.

@ ++ Flo
Messages postés
718
Date d'inscription
jeudi 19 décembre 2002
Statut
Membre
Dernière intervention
22 novembre 2016
3
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
Afficher les 7 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.