Bonsoir tous
Je dev actuellement un plugin pour l'IDE QtCreator et je me retrouve à devoir écrire un parser CSS (qss en fait).
Mon but est de notamment vérifier que tout le contenu du fichier courant est valide d'un point de vue syntaxique.
Mon problème n'est pas de me conformer à l'API (qui est assez mal documentée x) mais j'y arrive), mais de concevoir le parser.
D'après mes recherches, l'utilisation de regexp est déconseillée.
Je dois donc parser le fichier ligne par ligne.
(faut savoir qu'en prog', j'ai un défaut, si la solution me paraît bête et conne, alors elle est forcément mauvaise) avez-vous des conseils sur les grandes lignes de l'algorithme ? Par exemple, si je détecte un sélecteur Qt, je lis les caractères qui suivent jusqu'à trouver une accolade ouvrante, puis la fermante, puis vérifier la validité des propriétés contenues à l'intérieur du bloc, etc etc... ?
Merci =)
Bonne nuit !
Quand tu dis vérifier la validité des propriétés contenues, tu parles d'interdire des noms de propriétés qui n'existent pas ? Parce que dans ce cas je pense que les Regex sont mal adaptées, du moins pour faire un seul test global. Néanmoins elles peuvent être utiles pour au moins récupérer le contenu des paires clés/valeurs. Je viens de voir le QSS il faut faire attention aux ; optionnels. Ainsi si tu vois que la clé est background, tu doit t'attendre à une couleur derrière, mais il y en a plusieurs types dont tu pourrais appliquer plusieurs Regex etc...
Re
Voilà, je compte utiliser l'API de QtCreator pour souligner les noms de propriétés inexistantes, les types non acceptés ou reconnus comme étant des valeurs de propriétés...
Merci pour ta réponse, ça va bien m'aider
Je reviens à la vérification de la validité globale de la feuille de style.
Comment pourrais-je repérer par exemple une erreur de ce type :
------------
QFrame {
}
texte inutile et invalide
QWidget
{}
-----------
Car les regexp que j'ai faites ne captent évidemment que les 2 blocs QSS ci-dessus. Le problème est de repérer la phrase entre ces blocs qui invalide toute la stylesheet.
Et là, à part parser ligne par ligne, et faire un algorithme chiant, je vois pas
Je pourrais utiliser les regexp et voir s'il existe un quelconque texte entre les blocs récupérés ?
J'ai pas encore trop vu les Regexp en C++ mais peut-être tu pourrais mettre des parenthèses capturantes après l'accolade fermante détectée, qui va chercher s'il y a des caractères non blancs. Au final s'il y en a c'est un problème.
peut être que tu peux essayer de parcourir ligne par ligne
puis avoir un booleen qui est à vrai quand t'es dans un bloc, et à faux quand t'es pas dans un bloc
quand tu tombes sur accolade ouvrante, tu mets un booleen à vrai
puis ensuite agir en conséquence de certaines cas comme:
si tu tombes sur accolade ouvrante alors que ton booleen est vrai (déjà dans un bloc) -> ça va pas
si tu tombes sur accolade fermante alors que ton booleen est faux (accolade fermante alors que t'as pas dans un bloc) -> ça va pas
si tu tombes sur accolade fermante et booleen vrai -> c'est ok, ça veut dire que ton bloc se ferme, donc ensuite on met le booleen à faux
ensuite si tu tombes sur du texte alors que ton booleen est à faux, tu verifie si c'est un selecteur (QFrame/QWidget etc puisque c'est pas dans le bloc le selecteur) s'il y a une accolade ouvrante sur la ligne, ou dans la ligne suivante, ou alors voir aussi si c'est du commentaire à l'aide de regex par exemple un truc qui devrait ressembler à #\s*/\*.*\*/\s*# pour voir si c'est de la forme
[espace blanc (tab/espace/etc)]/* moncommentaire */[espace blanc (tab/espace/etc)]