[{"data":1,"prerenderedAt":3350},["ShallowReactive",2],{"tag-posts-xml":3},[4,344,1064,2350,2549,2998],{"id":5,"title":6,"author":7,"body":8,"category":24,"categorySlug":305,"date":306,"description":14,"excerpt":307,"extension":330,"location":331,"meta":332,"navigation":333,"path":334,"published":333,"seo":335,"slug":336,"stem":337,"tags":338,"timeToRead":342,"__hash__":343},"posts\u002Fposts\u002FXINX\u002F2011-05-03-xinx-0.10.1.md","XINX v0.10.1","Ulrich Vandenhekke",{"type":9,"value":10,"toc":295},"minimark",[11,15,26,44,53,58,82,86,91,98,104,115,118,121,125,128,131,149,154,157,160,164,170,173,179,182,186,192,195,198,201,209,212,216,220,229,232,236,242,245,249,255,258,262,268,271,275,278,282,285,289,292],[12,13,14],"p",{},"Bonjour à tous,",[12,16,17,18,25],{},"Je suis heureux de vous annoncer la nouvelle version de ",[19,20,24],"a",{"href":21,"rel":22},"http:\u002F\u002Fxinx.shadoware.org?piwik_campaign=20110504_0.10.1_blog",[23],"nofollow","XINX",". Cette\nversion apporte, en plus de la ré-écriture complète de la gestion du\ncontenu et de la complétion, son petit lot de nouveautés et de\ncorrections.",[12,27,28,29,33,34,37,38,43],{},"La version ",[30,31,32],"em",{},"0.10.1"," est beaucoup plus stable que sa grande soeur ",[30,35,36],{},"0.9",".\nUn soin particulier a été apporté à la recherche des sources d'anomalie\npossible, ainsi que des fuites mémoires. Ces opérations ont été faites\ngrâce à des outils tels que ",[19,39,42],{"href":40,"rel":41},"http:\u002F\u002Fvalgrind.org\u002F",[23],"valgrind",", mais aussi grâce aux\nbéta-testeurs (Merci à eux).",[12,45,46,47,52],{},"De plus l'utilisation des pointeurs intelligents de ",[19,48,51],{"href":49,"rel":50},"http:\u002F\u002Fqt.nokia.com\u002F",[23],"Qt"," ont permis de\npasser plus de temps, sur la gestion des structures et moins de temps\nsur la gestion de la mémoire, sur des parties du code assez critiques\n(comme ContentView et CodeCompletion). Ils ont également permis un\npartage plus facile des structures entre les différents threads avec\nmoins de contrôle de synchronisation.",[54,55,57],"h3",{"id":56},"liens","Liens",[59,60,61,68,75],"ul",{},[62,63,64],"li",{},[19,65,67],{"href":21,"rel":66},[23],"Site Internet de XINX",[62,69,70],{},[19,71,74],{"href":72,"rel":73},"http:\u002F\u002Fxinx.shadoware.org\u002Fwiki\u002FDownload?piwik_campaign=20110504_0.10.1_blog",[23],"Téléchargement de XINX",[62,76,77],{},[19,78,81],{"href":79,"rel":80},"http:\u002F\u002Fxinx.shadoware.org\u002Fnewticket?piwik_campaign=20110504_0.10.1_blog",[23],"Faire une demande d'évolution ou reporter un bug",[54,83,85],{"id":84},"gestion-projet-et-gestion-des-sessions","Gestion Projet et Gestion des sessions",[87,88,90],"h4",{"id":89},"multi-projet","Multi-projet",[12,92,93],{},[94,95],"img",{"alt":96,"src":97},"Project","\u002FXINX\u002Fxinx-0.10.1\u002FprojectDirectory10.png",[12,99,100,103],{},[101,102,24],"strong",{}," est maintenant capable d'ouvrir plusieurs\nprojets en même temps. Cela permet donc plusieurs choses :",[59,105,106,109,112],{},[62,107,108],{},"Rechercher un fichier pouvant se trouver dans plusieurs projets\ndifférents (par exemple un projet trunk et un projet branche).",[62,110,111],{},"Comparer des fichiers venant de plusieurs projets différents.",[62,113,114],{},"Ne pas basculer d'un projet à l'autre en continu, lorsque l'on\ntravaille sur plusieurs projets en même temps.",[12,116,117],{},"A cause de cette gestion de plusieurs projets en même temps, toute la\npartie de gestion de projet de XINX a été ré-écrite (entre autre la\npartie concernant la session, que l'on verra ensuite).",[12,119,120],{},"De plus à l'ouverture du projet, l'application recherche l'ensemble des\nfichiers présents sur le disque afin de permettre une recherche beaucoup\nplus rapide. Cela a néanmoins quelques répercussions : il n'est pas\npossible de supprimer un dossier du projet sans fermer XINX.",[87,122,124],{"id":123},"inclusion-exclusion-de-chemin","Inclusion \u002F Exclusion de chemin",[12,126,127],{},"Afin d'avoir une vue propre, XINX affiche déjà uniquement les fichiers\nqu'il est capable de gérer. Il est également possible de lui définir une\nliste de chemin qu'il doit ignorer.",[12,129,130],{},"Exemple :",[59,132,133,139,144],{},[62,134,135],{},[136,137,138],"code",{},"WEB-INF\u002Flib",[62,140,141],{},[136,142,143],{},"dico",[62,145,146],{},[136,147,148],{},"configuration",[12,150,151],{},[94,152],{"alt":96,"src":153},"\u002FXINX\u002Fxinx-0.10.1\u002FprojectpropertyIncludeExclude10.png",[12,155,156],{},"Il est possible d'utiliser des expressions régulières pour définir ces\nchemins.",[12,158,159],{},"A l'inverse il est possible d'inclure un dossier externe au projet\ndirectement dans la vue de celui-ci. L'équivalent d'un lien symbolique\nmais propre au projet sous XINX. Il est alors possible d'inclure dans le\ndossier projet, un répertoire temporaire contenant les données utilisées\npar les feuilles de styles, ou inclure un dossier contenant des fichiers\nde logs, ...",[87,161,163],{"id":162},"sessions","Sessions",[12,165,166],{},[94,167],{"alt":168,"src":169},"Welcom","\u002FXINX\u002Fxinx-0.10.1\u002FwelcomDialog10.png",[12,171,172],{},"Suite à la gestion du multi-projet, il a fallu ré-écrire\nle système de gestion des sessions. Il est maintenant plus proche des\nsystèmes de session des autres applications.",[12,174,175,176,178],{},"Alors que sur la version ",[30,177,36],{}," et précédente, la session était\ndirectement associée à un projet (et donc ouverte en même temps),\nmaintenant la session est séparée de la notion de projet.",[12,180,181],{},"Une session peut alors désormais contenir une liste de projet ouvert,\nune liste de fichier ouvert (associé ou non à un projet), des signets.\nPlusieurs sessions différentes peuvent pointer vers un même projet mais\nproposer une vue (un ensemble de fichier ouvert) différente. Une session\npar défaut est créée pour l'utilisation courante de l'application.",[54,183,185],{"id":184},"modification-du-système-de-complétion","Modification du système de complétion",[12,187,188],{},[94,189],{"alt":190,"src":191},"Code","\u002FXINX\u002Fxinx-0.10.1\u002FCompletion10.png",[12,193,194],{},"Le système de vue contenue et de code complétion a\ncomplètement été ré-écrit. La lecture des différents imports des\ndifférents fichiers est faite en mémoire (et non plus dans une base de\ndonnée SQL) et en parallèle (s'il y a plusieurs processeurs sur la\nmachine). La lecture des fichiers est ainsi plus rapide. Le système a\ncomplètement été ré-écrit pour que la complétion du code soit rapide et\nstable en même temps.",[12,196,197],{},"La complétion du code affiche désormais les différentes lignes dans des\ncatégories suivant leur emplacement (par exemple le fichier où se trouve\nchaque template), les snipets dans une catégorie différente...",[12,199,200],{},"XINX est maintenant capable également de compléter",[59,202,203,206],{},[62,204,205],{},"les paramètres des templates du type call-template",[62,207,208],{},"les imports (proposition des différents fichiers, et des alias si le\nplugin Generix est activé)",[12,210,211],{},"et plein d'autres choses :)",[54,213,215],{"id":214},"et-plein-dautres-nouveautés","Et plein d'autres nouveautés",[87,217,219],{"id":218},"utilisation-de-la-librairie-svn-directement","Utilisation de la librairie SVN directement",[12,221,222,223,228],{},"Un nouveau plugin pour SubVersion a été écrit. Ce plugin utilise\ndirectement les librairies de SubVersion au lieu d'utiliser l'exécutable\nsvn. Ce plugin est plus performant que le wrapper et ne nécessite pas\nl'installation d'un client SubVersion (tel que ",[19,224,227],{"href":225,"rel":226},"http:\u002F\u002Fwww.collab.net\u002Fdownloads\u002Fsubversion\u002F",[23],"CollabNet SubVersion","\nsous Windows ou le client svn sous linux.",[12,230,231],{},"L'ancien plugin est toujours disponible et utilisable.",[87,233,235],{"id":234},"créer-des-tickets-depuis-xinx","Créer des tickets depuis XINX",[12,237,238],{},[94,239],{"alt":240,"src":241},"Create","\u002FXINX\u002Fxinx-0.10.1\u002FTicketCreation10.png",[12,243,244],{},"Une boite de dialogue permet maintenant de créer automatiquement un\ncompte et un ticket sur le site Internet de XINX. Vous pouvez ainsi\ncréer facilement des demandes d'évolution, des demandes de correction,\n...De plus lors de la sortie d'une nouvelle version, XINX vous informera\nautomatiquement qu'une nouvelle version est disponible.",[87,246,248],{"id":247},"dock-des-logs-et-des-erreurs","Dock des logs et des erreurs",[12,250,251],{},[94,252],{"alt":253,"src":254},"Error","\u002FXINX\u002Fxinx-0.10.1\u002FErrorLog10.png",[12,256,257],{},"Le dock d'affichage des erreurs a été amélioré pour ne plus perturber\nl'utilisateur en s'ouvrant de façon intempestive. Il est maintenant\npossible de définir que le dock doit rester fermé, un compteur affiche\nalors le nombre d'erreur .",[87,259,261],{"id":260},"modification-de-la-recherche","Modification de la recherche",[12,263,264],{},[94,265],{"alt":266,"src":267},"Search","\u002FXINX\u002Fxinx-0.10.1\u002FSearchDock10.png",[12,269,270],{},"Suite à la gestion du multi-projet, XINX peut maintenant rechercher dans\nplusieurs projets en même temps. Il est aussi possible d'arrêter la\nrecherche en plein milieu.",[87,272,274],{"id":273},"validation-dun-fichier-xml","Validation d'un fichier XML",[12,276,277],{},"XINX peut également valider un fichier XML à partir d'un schéma. Il ne\npeut malheureusement pas encore valider de fichier XSL (les parseurs XSL\ntrouvés n'arrivent pas à lire les schémas des fichiers XSLT).",[87,279,281],{"id":280},"correction-de-bugs","Correction de bugs",[12,283,284],{},"Beaucoup de corrections de bug ont été faites ce qui rend cette version\ntrès stable.",[54,286,288],{"id":287},"et-pour-la-suite","Et pour la suite ?",[12,290,291],{},"Dans la même série, j'ai l'intention de sortir une version avec de\nnouveaux modèles, de la documentation, ....",[12,293,294],{},"Pour la version suivante, le moteur JavaScript sera amélioré pour ne\nplus donner d'erreur, voir proposer de la complétion plus performante.",{"title":296,"searchDepth":297,"depth":297,"links":298},"",2,[299,301,302,303,304],{"id":56,"depth":300,"text":57},3,{"id":84,"depth":300,"text":85},{"id":184,"depth":300,"text":185},{"id":214,"depth":300,"text":215},{"id":287,"depth":300,"text":288},"xinx","2011-05-03",{"type":9,"value":308},[309,311,316,325],[12,310,14],{},[12,312,17,313,25],{},[19,314,24],{"href":21,"rel":315},[23],[12,317,28,318,33,320,37,322,43],{},[30,319,32],{},[30,321,36],{},[19,323,42],{"href":40,"rel":324},[23],[12,326,46,327,52],{},[19,328,51],{"href":49,"rel":329},[23],"md","Lille, France",{},true,"\u002Fpost\u002Fxinx-0.10.1",{"title":6,"description":14},"xinx-0.10.1","posts\u002FXINX\u002F2011-05-03-xinx-0.10.1",[305,339,340,341],"generix-group","qt","xml",6,"wLQ73NHdvyayFYtxw7KT53sos1O0VxBKcuvImmDWUEQ",{"id":345,"title":346,"author":7,"body":347,"category":24,"categorySlug":305,"date":1026,"description":1027,"excerpt":1028,"extension":330,"location":331,"meta":1056,"navigation":333,"path":1057,"published":333,"seo":1058,"slug":1059,"stem":1060,"tags":1061,"timeToRead":1062,"__hash__":1063},"posts\u002Fposts\u002FXINX\u002F2010-05-02-presentation-de-xinx.md","Présentation de XINX",{"type":9,"value":348,"toc":1013},[349,370,377,386,391,395,416,419,444,447,455,462,468,477,480,493,496,500,508,520,524,530,535,555,566,569,586,590,620,636,640,657,663,667,674,677,734,738,742,745,748,754,758,764,778,815,836,841,845,855,858,864,868,871,882,886,894,899,905,909,920,926,935,938,961,969,1009],[12,350,351,352,354,355,357,358,361,362,365,366,369],{},"Ce billet fait suite à la sortie de la version 0.9.0 de ",[101,353,24],{}," et va\nvous décrire ce logiciel. ",[101,356,24],{}," est éditeur de feuille de style ",[30,359,360],{},"XSL","\n(il fait également éditeur ",[30,363,364],{},"JavaScript"," et ",[30,367,368],{},"CSS"," mais actuellement moins\nbien que ce que peuvent faire d'autres).",[12,371,372,373,376],{},"Il permet l'édition des feuilles de styles en proposant de compléter sur\nle nom des balises (normal), sur les attributs (normal), sur les valeurs\nd'attributs : les variables, les paramètres, ... Il propose également\nautomatiquement les différents paramètres lors de l'utilisation d'un\n",[136,374,375],{},"call:template",".",[12,378,379,380,382,383,376],{},"L'éditeur est fortement tourné vers l'édition de feuille de style ",[30,381,360],{},"\npour génération d*'HTML* mais peut être utilisé pour générer du ",[30,384,385],{},"XML",[12,387,388],{},[94,389],{"alt":24,"src":390},"\u002FXINX\u002Fpresentation-de-xinx\u002Fsplash.png",[54,392,394],{"id":393},"historique","Historique",[12,396,397,398,401,402,412,413,376],{},"Depuis un certain temps déjà (5 ans), je travaille pour la société\n",[30,399,400],{},"Generix Group"," éditant et intégrant un ERP",[403,404,405],"sup",{},[19,406,411],{"href":407,"ariaDescribedBy":408,"dataFootnoteRef":296,"id":410},"#user-content-fn-1",[409],"footnote-label","user-content-fnref-1","1"," du nom de ",[30,414,415],{},"GCE",[12,417,418],{},"Sur la partie Web de cet ERP, il est possible d'intervenir à plusieurs\nendroits pour modifier son fonctionnement :",[59,420,421,428,438],{},[62,422,423,424,427],{},"Le paramétrage (",[30,425,426],{},"BDD",") : Modification d'un paramètre pour agir sur\nle comportement du logiciel",[62,429,430,431,434,435,437],{},"La couche métier (",[30,432,433],{},"JAVA",") : Lit le paramétrage (",[30,436,426],{},") et réalise\nles traitements. Il est possible de développer de nouveaux objets,\nmais aussi de dériver ceux existants.",[62,439,440,441,443],{},"La couche de présentation (",[30,442,360],{},") : A l'aide d'un flux de\nprésentation généré par la couche métier et d'un fichier de\nconfiguration, présente les données à l'écran.",[12,445,446],{},"La dernière couche est donc l'interprétation d'un flux de donnée,\ngénérée à partir de la couche métier (JAVA), à l'aide de feuille de\nstyle XSL.",[12,448,449,451,452,454],{},[101,450,24],{}," sert à modifier la couche de présentation (",[30,453,360],{},"). Sur cette\ndernière couche, on crée et modifie des feuilles de styles pour modifier\nla présentation des données à l'écran (Déplacer des champs, supprimer\ndes champs, ajouter des champs, règle de gestion simple ...).",[12,456,457,458,461],{},"En mode ",[30,459,460],{},"projet",", chez les clients, les modifications ne sont pas faites\ndirectement sur les feuilles de styles standard livrées, mais sur des\nfeuilles de styles dérivées, afin de faciliter les migrations, et la\ncorrection des anomalies.",[12,463,464],{},[94,465],{"alt":466,"src":467},"Structure","\u002FXINX\u002Fpresentation-de-xinx\u002Fstructure_dossier.png",[12,469,470,471,474,475,376],{},"Lors de la modification de feuille de style ",[30,472,473],{},"standard",", il faut alors\nrenommer et placer ce fichier dans un dossier séparé. C'est de cette\ntâche récurrente qu'est venue la création de l'éditeur de feuille de\nstyle ",[101,476,24],{},[12,478,479],{},"Le but était alors, lors de la sauvegarde d'un fichier standard, de\nproposer automatiquement la sauvegarde dans le bon dossier.",[12,481,482,483,485,486,488,489,492],{},"L'autre point à l'origine de la création de ",[101,484,24],{}," est la\nnon-existence d'un logiciel de développement de feuille de style ",[30,487,360],{},"\ngratuit et\u002Fou libre (Il y a bien ",[30,490,491],{},"XML Spy"," qui correspondait à peu prés\nmais qui était payant, et dont nous n'avions pas la licence).",[12,494,495],{},"Sont alors venu s'ajouter d'autres fonctionnalités : la complétion sur\nles balises, les attributs, les variables, .... :)",[54,497,499],{"id":498},"quest-que-xinx-aujourdhui","Qu'est que XINX aujourd'hui ?",[12,501,502,504,505,507],{},[101,503,24],{}," prévu initialement comme aide au développement des consultants\nqui font des développements de feuille de style, est maintenant un\néditeur de feuille de style ",[30,506,360],{}," avec gestion des plugins. L'un des\nplugins contient des petites fonctionnalités utiles au quotidien par les\nconsultants travaillants sur l'ERP, fonctionnalité auparavant implémenté\ndirectement dans le logiciel.",[12,509,510,511,513,514,516,517,519],{},"Dit autrement, cette nouvelle version marque donc une étape : La partie\nde ",[101,512,24],{}," propre à ",[30,515,400],{}," à été séparée dans un plugin.\n",[101,518,24],{}," en lui même n'est alors plus qu'un éditeur de feuille de style,\nextensible via des plugins, mais il retrouve les mêmes fonctionnalités\ngrâce à ce plugin.",[54,521,523],{"id":522},"licence","Licence",[12,525,526],{},[94,527],{"alt":528,"src":529},"Licence GPLv3","http:\u002F\u002Fwww.gnu.org\u002Fgraphics\u002Fgplv3-127x51.png",[12,531,532,534],{},[101,533,24],{}," est un logiciel libre dont la licence choisie est la GPLv3. Ce\nqui signifie que vous pouvez :",[59,536,537,540,543,546,549,552],{},[62,538,539],{},"télécharger le logiciel",[62,541,542],{},"utiliser le logiciel pour faire ce que vous voulez",[62,544,545],{},"télécharger les sources du logiciels",[62,547,548],{},"modifier les sources du logiciels",[62,550,551],{},"utiliser le logiciel modifié par vos soins",[62,553,554],{},"distribuer le logiciel ou la version modifiée (attention à\ndifférencier les parties originales du logiciel avec le bon\ncopyright, et les parties modifiées).",[12,556,557,558,560,561,565],{},"En tant que logiciel libre ",[101,559,24],{}," possède une plateforme de\ncontribution (ticket, wiki, source, ...) qui se trouve à l'adresse\n",[19,562,563],{"href":563,"rel":564},"http:\u002F\u002Fxinx.shadoware.org",[23],". Vous pouvez donc y aller pour contribuer.",[12,567,568],{},"Vous pouvez contribuer de plusieurs façons :",[59,570,571,574,580,583],{},[62,572,573],{},"Développement d'un Plugin",[62,575,576,577],{},"Développement d'un script ",[30,578,579],{},"ECMAScript",[62,581,582],{},"Développement d'un petit patch",[62,584,585],{},"Développement d'un gros patch",[54,587,589],{"id":588},"technologie","Technologie",[12,591,592,594,595,597,598,601,602,604,605,608,609,612,613,365,616,619],{},[101,593,24],{}," est un logiciel développé en ",[30,596,51],{},". Il compile et tourne sous\n",[30,599,600],{},"Gnu\u002FDebian"," (normalement n'importe quelle distribution devrait faire\nl'affaire, mais ",[30,603,600],{}," est la seule distribution testée), et sous\n",[30,606,607],{},"MS\u002FWindows",". Il devrait normalement également tourner sous ",[30,610,611],{},"MacOS"," (si\nles dépendances comme les librairies ",[30,614,615],{},"libxml2",[30,617,618],{},"libxslt"," sont\ncompilables sous cet OS).",[12,621,622,623,625,626,629,630,632,633,635],{},"A chaque version un paquet ",[30,624,600],{}," est mis à disposition sur le\ndépôt (",[136,627,628],{},"apt.shadoware.org",") et un binaire ",[30,631,607],{}," est proposé en\ntéléchargement. ",[101,634,24],{}," est toujours compilable à partir des sources\npour les autres distributions ou juste parce que vous préférez ainsi. 😄",[54,637,639],{"id":638},"intégration-continue-tests","Intégration continue & Tests",[12,641,642,643,646,647,650,651,656],{},"A chaque ",[30,644,645],{},"validation"," sur le référenciel ",[30,648,649],{},"SubVersion",", l'application est\ncompilée et testée (vous pouvez voir le résultat des tests à l'adresse\n",[19,652,655],{"href":653,"rel":654},"http:\u002F\u002Fxinx.shadoware.org\u002Fbuild",[23],"suivante",". A la sortie de la version 0.9.0, les tests couvrent 27% de\nla librairie principale. Je dois donc encore écrire d'autres jeux de\ntests.",[12,658,659],{},[94,660],{"alt":661,"src":662},"Intégration","\u002FXINX\u002Fpresentation-de-xinx\u002Fbitten.png",[54,664,666],{"id":665},"code-réutilisable-pour-dautres-projets","Code réutilisable pour d'autres projets",[12,668,669,671,672,376],{},[101,670,24],{}," peut également être intéressant pour d'autres développeurs\n",[30,673,51],{},[12,675,676],{},"En effet, vous pouvez trouver dans la dernière version, ainsi que dans\nles versions précédentes plusieurs classes utilitaires.Par exemple\n(liste presque non exhaustive) :",[59,678,679,687,695,703,711,726],{},[62,680,681,686],{},[19,682,685],{"href":683,"rel":684},"http:\u002F\u002Fxinx.shadoware.org\u002Fdoxygen\u002Fdevel\u002Fhtml\u002FclassTreeProxyItemModel.html",[23],"TreeProxyItemModel"," : convertit un modèle format table en modèle\nformat arbre. Utile lorsque l'arbre est représenté dans une base de\ndonnée relationnelle par exemple.",[62,688,689,694],{},[19,690,693],{"href":691,"rel":692},"http:\u002F\u002Fxinx.shadoware.org\u002Fdoxygen\u002Fdevel\u002Fhtml\u002FclassRecursiveSortFilterProxyModel.html",[23],"RecursiveSortFilterProxyModel"," : Utilisé pour rechercher\nfacilement des données dans un arbre et permet d'afficher les\nenfants.",[62,696,697,702],{},[19,698,701],{"href":699,"rel":700},"http:\u002F\u002Fxinx.shadoware.org\u002Fdoxygen\u002Fdevel\u002Fhtml\u002FclassXinxLineEdit.html",[23],"XinxLineEdit"," : Inspiré de KDE, affiche un bouton pour effacer le\ntexte dans la ligne d'édition",[62,704,705,710],{},[19,706,709],{"href":707,"rel":708},"http:\u002F\u002Fxinx.shadoware.org\u002Fdoxygen\u002Fdevel\u002Fhtml\u002FclassXinxListWidgetImpl.html",[23],"XinxListWidgetImpl"," : Permet de modifier une liste de valeur\n(ajout, suppression, valeur par défaut, classement, ...)",[62,712,713,718,719,722,723,376],{},[19,714,717],{"href":715,"rel":716},"http:\u002F\u002Fxinx.shadoware.org\u002Fdoxygen\u002Fdevel\u002Fhtml\u002FclassPluginSelector.html",[23],"PluginSelector"," : Inspiré de KDE, permet d'afficher une liste des\nplugins, avec un bouton ",[30,720,721],{},"A propos de ..."," et un bouton ",[30,724,725],{},"Configurer\n...",[62,727,728,733],{},[19,729,732],{"href":730,"rel":731},"http:\u002F\u002Fxinx.shadoware.org\u002Fdoxygen\u002Fdevel\u002Fhtml\u002FclassQMenuView.html",[23],"QMenuView"," : Inspiré d'un exemple de Qt et permet d'afficher un\nmenu à partir d'un modèle.",[54,735,737],{"id":736},"fonctionnalités","Fonctionnalités",[87,739,741],{"id":740},"recherche-parmi-les-fichiers-dun-dossier","Recherche parmi les fichiers d'un dossier",[12,743,744],{},"Un dock sur le coté permet en mode projet de rechercher et d'ouvrir un\nfichier parmi une multitude de fichier d'un projet (utile pour les\nfichiers avec beaucoup de feuille de style).",[12,746,747],{},"La recherche peut se faire avec des Jockers (*)",[12,749,750],{},[94,751],{"alt":752,"src":753},"Dock","\u002FXINX\u002Fpresentation-de-xinx\u002Fdockprojet.png",[87,755,757],{"id":756},"la-complétion-xsl","La complétion XSL",[12,759,760],{},[94,761],{"alt":762,"src":763},"Completion","\u002FXINX\u002Fpresentation-de-xinx\u002Fcompletion.png",[12,765,766,768,769,777],{},[101,767,24],{}," permet de compléter sur les feuilles de styles à plusieurs\nniveaux",[403,770,771],{},[19,772,776],{"href":773,"ariaDescribedBy":774,"dataFootnoteRef":296,"id":775},"#user-content-fn-2",[409],"user-content-fnref-2","2"," :",[59,779,780,786,792],{},[62,781,782,783,785],{},"la balise (fonctionnalité standard vous allez me dire) : ",[101,784,24],{},"\npermet de compléter sur les balises xsl:, les balises html ...",[62,787,788,789,791],{},"les attributs (encore standard). Pour chaque balise, ",[101,790,24],{}," est\ncapable de compléter sur les attributs de la balise saisie.",[62,793,794,795,797,798,800,801,803,804,806,807,810,811,814],{},"les valeurs d'attribut (là c'est intéressant). Permet de compléter\nsur les variables déclarées dans le fichier ",[30,796,360],{},", ainsi que dans\nles fichiers importés (pour retrouver les fichiers importés,\n",[101,799,24],{},", utilise le mode projet et les paramètres qui y sont\ndéfinits). De plus sur les attributs non ",[30,802,360],{},", ",[101,805,24],{}," ajoute\nautomatiquement les accolades ",[136,808,809],{},"{ }"," et les ",[136,812,813],{},"$"," pour les variables\net les paramètres.",[12,816,817,818,820,821,824,825,828,829,832,833,835],{},"De plus lors de l'utilisation de la balise call:template, ",[101,819,24],{}," va\nchercher automatiquement les paramètres (",[136,822,823],{},"xsl:param",") du template donné,\net les ajoute automatiquement en ",[136,826,827],{},"xsl:with-param",".Pour les balises\n",[136,830,831],{},"xsl:apply-templates"," ",[101,834,24],{}," propose la liste des modes des templates\nexistants.",[12,837,838],{},[94,839],{"alt":762,"src":840},"\u002FXINX\u002Fpresentation-de-xinx\u002Fcompletion2.png",[87,842,844],{"id":843},"le-parsing-de-la-feuille-de-style","Le parsing de la feuille de style",[12,846,847,848,850,851,854],{},"Fonctionnalité du moment, si vous indiquez un flux de données et une\nfeuille de style, ",[101,849,24],{}," est capable d'afficher le résultat (la source\n",[30,852,853],{},"HTML"," et le résultat dans un navigateur Webkit)",[12,856,857],{},"Si l'emplacement où doivent s'exécuter les pages est définit alors, les\nfeuilles de styles, les images, ... pourront être affichées.",[12,859,860],{},[94,861],{"alt":862,"src":863},"Représentation","\u002FXINX\u002Fpresentation-de-xinx\u002Frepresentation_html.png",[54,865,867],{"id":866},"a-venir","A venir",[12,869,870],{},"Bien que l'avenir du logiciel dépend de ces utilisateurs, voici les\nnouvelles fonctionnalités que devrait apporter la prochaine version :",[59,872,873,876,879],{},[62,874,875],{},"Déverminage de feuille de style XSL",[62,877,878],{},"Amélioration du parseur JavaScript et CSS",[62,880,881],{},"Quelques réécritures (Vue projet, ...)",[54,883,885],{"id":884},"le-plugin-gce","Le plugin GCE",[12,887,888,889,891,892,376],{},"Comme indiqué ci-dessous, il existe un plugin ",[30,890,415],{}," utilisé par les\nconsultants travaillants sur l'ERP ",[30,893,415],{},[12,895,896,897,376],{},"Ce plugin permet de dupliquer une feuille de style d'un dossier à un\nautre (sans modification des fichiers standards), de lire les\ndictionnaires de libellé de l'ERP GCE, la lecture du fichier de\nconfiguration du lecteur ",[30,898,415],{},[12,900,901],{},[94,902],{"alt":903,"src":904},"Dérivation","\u002FXINX\u002Fpresentation-de-xinx\u002Fderivation.png",[54,906,908],{"id":907},"téléchargement","Téléchargement",[12,910,911,912,914,915,919],{},"Vous pouvez télécharger ",[101,913,24],{}," à l'adresse\n",[19,916,917],{"href":917,"rel":918},"http:\u002F\u002Fxinx.shadoware.org\u002Fdownloads",[23]," (source et version Windows).",[12,921,922,923,925],{},"Si vous voulez installer ",[101,924,24],{}," sur une Gnu\u002FDebian (32 ou 64 bits)\nvous pouvez inclure le dépôt suivant :",[927,928,933],"pre",{"className":929,"code":931,"language":932},[930],"language-text","# Shadoware.Org\ndeb http:\u002F\u002Fapt.shadoware.org\u002F squeeze main\n","text",[136,934,931],{"__ignoreMap":296},[12,936,937],{},"Et installé de la façon suivante :",[927,939,943],{"className":940,"code":941,"language":942,"meta":296,"style":296},"language-bash shiki shiki-themes one-dark-pro","aptitude install xinx\n","bash",[136,944,945],{"__ignoreMap":296},[946,947,950,954,958],"span",{"class":948,"line":949},"line",1,[946,951,953],{"class":952},"sVbv2","aptitude",[946,955,957],{"class":956},"subq3"," install",[946,959,960],{"class":956}," xinx\n",[12,962,963,964],{},"Vous pouvez vous tenir au courant des sorties de version grâce à la\n",[19,965,968],{"href":966,"rel":967},"http:\u002F\u002Flists.shadoware.org\u002Flistinfo\u002Fxinx",[23],"mailing list",[970,971,974,980],"section",{"className":972,"dataFootnotes":296},[973],"footnotes",[975,976,979],"h2",{"className":977,"id":409},[978],"sr-only","Footnotes",[981,982,983,994],"ol",{},[62,984,986,987],{"id":985},"user-content-fn-1","Un ERP et un logiciel de gestion d'entreprise. Un ERP permet de gérer, par exemple, les produits, les clients, les fournisseurs, les stocks, les ventes, les achats, la logistique, la comptabilité, .... Je ne vais pas vous faire une présentation des ERPs, car même si cela pourrait faire un billet intéressant, ce n'est pas le but ici. ",[19,988,993],{"href":989,"ariaLabel":990,"className":991,"dataFootnoteBackref":296},"#user-content-fnref-1","Back to reference 1",[992],"data-footnote-backref","↩",[62,995,997,998,1003,1004],{"id":996},"user-content-fn-2","Merci à ",[19,999,1002],{"href":1000,"rel":1001},"http:\u002F\u002Fqcodeedit.edyuk.org\u002F",[23],"QCodeEdit"," qui me fournit quelques fonctionnalités utiles. ",[19,1005,993],{"href":1006,"ariaLabel":1007,"className":1008,"dataFootnoteBackref":296},"#user-content-fnref-2","Back to reference 2",[992],[1010,1011,1012],"style",{},"html pre.shiki code .sVbv2, html code.shiki .sVbv2{--shiki-default:#61AFEF}html pre.shiki code .subq3, html code.shiki .subq3{--shiki-default:#98C379}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":296,"searchDepth":297,"depth":297,"links":1014},[1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025],{"id":393,"depth":300,"text":394},{"id":498,"depth":300,"text":499},{"id":522,"depth":300,"text":523},{"id":588,"depth":300,"text":589},{"id":638,"depth":300,"text":639},{"id":665,"depth":300,"text":666},{"id":736,"depth":300,"text":737},{"id":866,"depth":300,"text":867},{"id":884,"depth":300,"text":885},{"id":907,"depth":300,"text":908},{"id":409,"depth":297,"text":979},"2010-05-02","Ce billet fait suite à la sortie de la version 0.9.0 de XINX et va\nvous décrire ce logiciel. XINX est éditeur de feuille de style XSL\n(il fait également éditeur JavaScript et CSS mais actuellement moins\nbien que ce que peuvent faire d'autres).",{"type":9,"value":1029},[1030,1042,1046,1052],[12,1031,351,1032,354,1034,357,1036,361,1038,365,1040,369],{},[101,1033,24],{},[101,1035,24],{},[30,1037,360],{},[30,1039,364],{},[30,1041,368],{},[12,1043,372,1044,376],{},[136,1045,375],{},[12,1047,379,1048,382,1050,376],{},[30,1049,360],{},[30,1051,385],{},[12,1053,1054],{},[94,1055],{"alt":24,"src":390},{},"\u002Fpost\u002Fpresentation-de-xinx",{"title":346,"description":1027},"presentation-de-xinx","posts\u002FXINX\u002F2010-05-02-presentation-de-xinx",[305,339,340,341],8,"wli16MFeBVMaJbc921USFquc6EZTDzFocvtCkto8yo8",{"id":1065,"title":1066,"author":7,"body":1067,"category":2331,"categorySlug":2332,"date":2333,"description":1071,"excerpt":2334,"extension":330,"location":331,"meta":2342,"navigation":333,"path":2343,"published":333,"seo":2344,"slug":2345,"stem":2346,"tags":2347,"timeToRead":1525,"__hash__":2349},"posts\u002Fposts\u002FProgrammation\u002F2009-05-31-parseur-xml.md","Parseur XML",{"type":9,"value":1068,"toc":2325},[1069,1072,1079,1082,1086,1089,1092,1095,1098,1102,1105,1108,1152,1161,1310,1313,1316,1319,1325,1329,1332,1346,1349,1353,1366,1369,1375,1378,1384,1387,1391,1394,1397,2132,2147,2150,2156,2159,2302,2322],[12,1070,1071],{},"Bonjours à tous,",[12,1073,1074,1075,1078],{},"L'utilisation des fichiers XML est, à ce jour, un fait dans la plupart\ndes logiciels et est fortement à la mode. Une entreprise qui ne fait pas\nun peu de XML est souvent ",[30,1076,1077],{},"has-been",". On utilise alors le XML à bon ou\nmauvais escient.",[1010,1080,1081],{},"\nth {background-color: #E4E4E4;weigh: bold;}\n .veryslow {background-color: #FF0000;}\n .slow {background-color: #FF8686;}\n .good {background-color: #C3FFC7;}\n .ignored {background-color: #E4E4E4;}\n",[54,1083,1085],{"id":1084},"avantages-inconvénients","Avantages \u002F Inconvénients",[12,1087,1088],{},"Pourquoi utiliser les fichiers XML ? Les fichiers XML sont, pour\ncommencer, des fichiers textes, il seront donc toujours lisibles, ce qui\ngarantit une meilleur pérennité de l'information. Les fichiers XML sont\nstructurés hiérarchiquement et suivent une syntaxe stricte. Ainsi le XML\nest lisible informatiquement par les différents langages de\nprogrammation existant, pour organiser vos données, en utilisant\ndifférents niveaux. Les fichiers XML peuvent être commenté ce qui peut\naméliorer la lisibilité pour un humain.",[12,1090,1091],{},"Le gros inconvénient du XML est sa verbosité. Pour chaque noeud dans la\nhiérarchie, il y a une balise de début, et une balise de fin contenant\nle nom de la balise. Le fichier est moins compact que s'il avait été\nécrit en binaire. Cela peut poser des problèmes comme alourdir les\ncommunications réseaux (ex: pour les webservices). Le fichier est aussi\nplus long à lire qu'un fichier binaire et peut contenir des erreurs.",[12,1093,1094],{},"Si le fichier n'a pas besoin d'être hiérarchique, il est possible\nd'utiliser une structure de fichier INI pour ses données.",[12,1096,1097],{},"Nous nous arrêterons là pour les avantages\u002Finconvénients. L'utilisation\nou non d'un fichier XML est ensuite une question (besoin, éthique, ...)\nà se poser pour ses données et la nécessité de pouvoir les lire\nautrement que par le programme lui-même.",[54,1099,1101],{"id":1100},"performance-des-parseurs","Performance des parseurs.",[12,1103,1104],{},"Je me suis amusé à effectuer le test de lecture de différents fichiers\nde donnée au format XML de taille différentes par une variété de parseur\nXML en construisant si possible un arbre DOM. Le but est donc de créer\nun objet par noeud\u002Fattribut du fichier XML et de reconstituer la\nhiérarchie.",[12,1106,1107],{},"Les parseurs choisis pour ce test sont :",[59,1109,1110,1116,1122,1128,1134,1140,1146],{},[62,1111,1112,1115],{},[101,1113,1114],{},"QtXml"," : Le module XML de la librairie Qt (de la société Nokia)",[62,1117,1118,1121],{},[101,1119,1120],{},"LibXml2"," : Une librairie C permettant de faire du parsing XML en\nutilisant DOM ou SAX",[62,1123,1124,1127],{},[101,1125,1126],{},"LibExpat"," : Un parseur orienté flux (plus proche de la méthode\nSAX que du DOM)",[62,1129,1130,1133],{},[101,1131,1132],{},"SCEW"," : Un parseur basé sur Expat générant un arbre DOM (donc un\npeu plus comparable aux autre parseur).",[62,1135,1136,1139],{},[101,1137,1138],{},"TinyXML"," : Encore un autre parseur XML",[62,1141,1142,1145],{},[101,1143,1144],{},"Xerces-C++"," : Le parseur XML d’Apache",[62,1147,1148,1151],{},[101,1149,1150],{},"Oracle XML Parser"," : Le parseur d’Oracle propriétaire utiliser\ndans le serveur d’application.",[12,1153,1154,1155,1160],{},"Pour faire cette suite de benchmark",[403,1156,1157],{},[19,1158,411],{"href":407,"ariaDescribedBy":1159,"dataFootnoteRef":296,"id":410},[409],", j’ai utilisé la librairie\nQTestLib de Nokia\u002FQt. Je vous offre donc en avant première le résultat\nde ce test :",[1162,1163,1165,1169],"table",{"style":1164},"width:100%",[1166,1167,1168],"caption",{},"Temps de lecture d'un fichier XML en ms",[1170,1171,1172,1191,1209,1228,1247,1262,1278,1296],"tbody",{},[1173,1174,1175,1179,1183,1184,1187,1188,1183],"tr",{},[1176,1177,1178],"td",{},"               ",[1180,1181,1182],"th",{},"250k","                     ",[1180,1185,1186],{},"9300k","                      ",[1180,1189,1190],{},"11300k",[1173,1192,1193,1196,1201,1205],{},[1180,1194,1195],{},"Qt DOM         ",[1176,1197,1200],{"className":1198},[1199],"veryslow","41,42 ms",[1176,1202,1204],{"className":1203},[1199],"2184,34 ms",[1176,1206,1208],{"className":1207},[1199],"2648,71 ms",[1173,1210,1211,1214,1217,1218,1223,1224,1223],{},[1180,1212,1213],{},"LibXML2        ",[1176,1215,1216],{},"16,55 ms","                 ",[1176,1219,1222],{"className":1220},[1221],"good","710,09 ms","     ",[1176,1225,1227],{"className":1226},[1221],"874,42 ms",[1173,1229,1230,1233,1238,1239,1238,1243,1238],{},[1180,1231,1232],{},"Expat (SAX)    ",[1176,1234,1237],{"className":1235},[1236],"ignored","5,95 ms","  ",[1176,1240,1242],{"className":1241},[1236],"312,02 ms",[1176,1244,1246],{"className":1245},[1236],"393,58 ms",[1173,1248,1249,1252,1217,1255,1258,1259,1217],{},[1180,1250,1251],{},"Oracle         ",[1176,1253,1254],{},"23,24 ms",[1176,1256,1257],{},"928,93 ms","                  ",[1176,1260,1261],{},"1135,86 ms",[1173,1263,1264,1267,1271,1272,1258,1275,1217],{},[1180,1265,1266],{},"Scew           ",[1176,1268,1270],{"className":1269},[1221],"12,05 ms","    ",[1176,1273,1274],{},"944,37 ms",[1176,1276,1277],{},"1184,46 ms",[1173,1279,1280,1283,1271,1288,1223,1292,1223],{},[1180,1281,1282],{},"Tiny XML       ",[1176,1284,1287],{"className":1285},[1286],"slow","28,91 ms",[1176,1289,1291],{"className":1290},[1286],"1101,8 ms",[1176,1293,1295],{"className":1294},[1286],"1369,8 ms",[1173,1297,1298,1301,1217,1304,1258,1307,1258],{},[1180,1299,1300],{},"Xerces (Apache)",[1176,1302,1303],{},"25,03 ms",[1176,1305,1306],{},"742,22 ms",[1176,1308,1309],{},"904,62 ms",[12,1311,1312],{},"La conclusion de ce résultat signifie que le parseur inclu dans Qt (pour\nla construction d'un arbre DOM) est très lent ;). Mais pour une\nutilisation dans une interface graphique, sur de petits fichiers, ne\ndevrait pas poser de problème.",[12,1314,1315],{},"Enfin le parseur le plus rapide (pour les gros fichiers) est Libxml2. Le\nparseur C d'oracle, bien que propriétaire n'a rien d'exceptionnel (si on\ncompte avec les problèmes présenté également ci-dessous). Peut-être que\nla version Java est elle plus performante.",[12,1317,1318],{},"Vous pouvez retrouver quelques graphiques ci-dessous :",[12,1320,1321],{},[94,1322],{"alt":1323,"src":1324},"TestXMLPerf","\u002FProgrammation\u002Fparseur-xml\u002FTestXMLPerf.png",[54,1326,1328],{"id":1327},"le-source-du-benchmark","Le source du benchmark",[12,1330,1331],{},"Voici de suite :",[59,1333,1334,1340],{},[62,1335,1336],{},[19,1337,1339],{"href":1338},"\u002FProgrammation\u002Fparseur-xml\u002Fxmlparser-bench.7z","les sources de l'application",[62,1341,1342,376],{},[19,1343,1345],{"href":1344},"\u002FProgrammation\u002Fparseur-xml\u002Fbenchmark_100iterations.ods","le résultat du bench",[12,1347,1348],{},"Pour la partie utilisation du Parseur Oracle, il a fallut contourner\nplusieurs petits problèmes. Ceci est la joie des librairies propriétaires\nbien documentées.",[87,1350,1352],{"id":1351},"compilation-avec-le-xdk-9","Compilation avec le XDK 9",[12,1354,1355,1356,1359,1360,1363,1364,376],{},"Lors de la compilation avec le XDK 9, l'application ne dépasse pas le\nstade du ",[30,1357,1358],{},"linkage",". Les méthodes sont pourtant bien dans les ",[30,1361,1362],{},"includes",".\nDe plus les librairies sont bien précisées pour le ",[30,1365,1358],{},[12,1367,1368],{},"La définition faite dans le projet est :",[927,1370,1373],{"className":1371,"code":1372,"language":932},[930],"XDKPATH = xdk9\nXDK_LIB = -lxmlg9 -lxml9 -lxsd9\nORA_LIB = -lcore9 -lnls9 -lunls9 -lcore9 -lnls9 -lcore9\nNET_LIB = -lnsl\nLIBS += -L$$XDKPATH\u002Flib $$XDK_LIB $$ORA_LIB $$NET_LIB -lpthread\nINCLUDEPATH += $$XDKPATH\u002Fxdk\u002Finclude\n",[136,1374,1372],{"__ignoreMap":296},[12,1376,1377],{},"A la suite de ça, lors de la phase de compilation, on se retrouve avec\nles messages d'erreurs suivants :",[927,1379,1382],{"className":1380,"code":1381,"language":932},[930],"g++ -Wl,-O1 -o xmlparserbenchmark libxml2parser.o expatparser.o xercescppparser.o oracleparser.o qtparser.o scewparser.o tinyparser.o tinyxml.o tinystr.o tinyxmlerror.o tinyxmlparser.o xmlparserbenchmark.o moc_xmlparserbenchmark.o -L\u002Fusr\u002Flib -lxml2 -lexpat -lxerces-c -Lxdk9\u002Flib -lxmlg9 -lxml9 -lxsd9 -lcore9 -lnls9 -lunls9 -lcore9 -lnls9 -lcore9 -lnsl -lpthread -Lscew\u002Fscew -lscew -lQtTest -lQtXml -lQtGui -lQtCore -lpthread\noracleparser.o: In function `parseWithOracleParser(QString const&)':\noracleparser.cpp:(.text+0x82): undefined reference to `XMLParser::xmlinit(unsigned char*, void (*)(void*, unsigned char const*, unsigned int), void*, xmlsaxcb*, void*, unsigned char*)'\noracleparser.cpp:(.text+0xa8): undefined reference to `XMLParser::xmlparse(unsigned char*, unsigned char*, unsigned int)'\noracleparser.cpp:(.text+0x2b4): undefined reference to `XMLParser::getDocumentElement()'\noracleparser.cpp:(.text+0x2ca): undefined reference to `XMLParser::xmlterm()'\n",[136,1383,1381],{"__ignoreMap":296},[12,1385,1386],{},"J'ai alors essayé de recompiler les exemples de démonstrations mais là,\nmême problème ...",[87,1388,1390],{"id":1389},"compilation-avec-le-xdk-10","Compilation avec le XDK 10",[12,1392,1393],{},"Avec cette version du XDK, nous avons le droit à deux problèmes. Le\npremier est une grosse fuite mémoire (si on écrit le programme tel que\ndécrit dans la démo), et à un problème d'initialisation du parseur.",[12,1395,1396],{},"Le code permettant de parser le fichier XML et de générer l'arbre DOM\nressemble à ceci :",[927,1398,1402],{"className":1399,"code":1400,"language":1401,"meta":296,"style":296},"language-cpp shiki shiki-themes one-dark-pro","CXmlCtx * ctxp = 0;\ntry {\n    ctxp = new CXmlCtx();\n} catch( XmlException & e ) {\n    unsigned ecode = e.getCode();\n    QFAIL( qPrintable( QString(\"Failed to initialize XML context, error %1\").arg( ecode ) ) );\n}\n\nFactory\u003CCXmlCtx,xmlnode> * fp = 0;\ntry {\n    fp = new Factory\u003CCXmlCtx,xmlnode>( ctxp );\n} catch( FactoryException & fe ) {\n    unsigned ecode = fe.getCode();\n    QFAIL( qPrintable( QString(\"Failed to create create parser, error %1\").arg( ecode ) ) );\n}\n\nDOMParser\u003CCXmlCtx,xmlnode> * parserp = 0;\ntry {\n    parserp = fp->createDOMParser( DOMParCXml, NULL );\n} catch( FactoryException & fe ) {\n    delete fp;\n    unsigned ecode = fe.getCode();\n    QFAIL( qPrintable( QString(\"Failed to create parser, error %1\").arg( ecode ) ) );\n}\n\nconst char * fname = filename;\nFileSource * isrcp = new FileSource( (oratext*) fname );\ntry {\n    DocumentRef\u003Cxmlnode> * docrefp = parserp->parse( isrcp, FALSE );\n    if( docrefp == NULL ) {\n        QFAIL( qPrintable( QString(\"NULL document\") ) );\n        return;\n    }\n    xmlnode * np = docrefp->getDocumentElement();\n    if( np == NULL ) {\n        QFAIL( qPrintable( QString(\"Empty document\") ) );\n        return;\n    }\n    docrefp->markToDelete();\n    delete docrefp;\n} catch( ParserException & pe ) {\n    delete parserp;\n    delete isrcp;\n    delete fp;\n\n    unsigned ecode = pe.getCode();\n    QFAIL( qPrintable( QString( \"Failed to parse the document, error %1\").arg( ecode ) ) );\n}\n\u002F\u002F    delete parserp;\n\u002F\u002F    delete isrcp;\n\u002F\u002F    delete fp;\n\u002F\u002F    delete ctxp;\n","cpp",[136,1403,1404,1427,1435,1451,1470,1492,1523,1529,1534,1561,1568,1595,1610,1628,1652,1657,1662,1685,1692,1718,1731,1740,1757,1781,1786,1791,1810,1836,1843,1873,1891,1913,1921,1927,1950,1964,1984,1991,1996,2009,2017,2032,2040,2048,2055,2060,2078,2102,2107,2114,2120,2126],{"__ignoreMap":296},[946,1405,1406,1410,1414,1417,1420,1424],{"class":948,"line":949},[946,1407,1409],{"class":1408},"sn6KH","CXmlCtx ",[946,1411,1413],{"class":1412},"seHd6","*",[946,1415,1416],{"class":1408}," ctxp ",[946,1418,1419],{"class":1412},"=",[946,1421,1423],{"class":1422},"sVC51"," 0",[946,1425,1426],{"class":1408},";\n",[946,1428,1429,1432],{"class":948,"line":297},[946,1430,1431],{"class":1412},"try",[946,1433,1434],{"class":1408}," {\n",[946,1436,1437,1440,1442,1445,1448],{"class":948,"line":300},[946,1438,1439],{"class":1408},"    ctxp ",[946,1441,1419],{"class":1412},[946,1443,1444],{"class":1412}," new",[946,1446,1447],{"class":952}," CXmlCtx",[946,1449,1450],{"class":1408},"();\n",[946,1452,1454,1457,1460,1463,1467],{"class":948,"line":1453},4,[946,1455,1456],{"class":1408},"} ",[946,1458,1459],{"class":1412},"catch",[946,1461,1462],{"class":1408},"( XmlException ",[946,1464,1466],{"class":1465},"sjrmR","&",[946,1468,1469],{"class":1408}," e ) {\n",[946,1471,1473,1476,1479,1481,1485,1487,1490],{"class":948,"line":1472},5,[946,1474,1475],{"class":1412},"    unsigned",[946,1477,1478],{"class":1408}," ecode ",[946,1480,1419],{"class":1412},[946,1482,1484],{"class":1483},"sU0A5"," e",[946,1486,376],{"class":1408},[946,1488,1489],{"class":952},"getCode",[946,1491,1450],{"class":1408},[946,1493,1494,1497,1500,1503,1505,1508,1511,1514,1517,1520],{"class":948,"line":342},[946,1495,1496],{"class":952},"    QFAIL",[946,1498,1499],{"class":1408},"( ",[946,1501,1502],{"class":952},"qPrintable",[946,1504,1499],{"class":1408},[946,1506,1507],{"class":952},"QString",[946,1509,1510],{"class":1408},"(",[946,1512,1513],{"class":956},"\"Failed to initialize XML context, error %1\"",[946,1515,1516],{"class":1408},").",[946,1518,1519],{"class":952},"arg",[946,1521,1522],{"class":1408},"( ecode ) ) );\n",[946,1524,1526],{"class":948,"line":1525},7,[946,1527,1528],{"class":1408},"}\n",[946,1530,1531],{"class":948,"line":1062},[946,1532,1533],{"emptyLinePlaceholder":333},"\n",[946,1535,1537,1540,1543,1546,1549,1552,1555,1557,1559],{"class":948,"line":1536},9,[946,1538,1539],{"class":1408},"Factory",[946,1541,1542],{"class":1412},"\u003C",[946,1544,1545],{"class":1408},"CXmlCtx,xmlnode",[946,1547,1548],{"class":1412},">",[946,1550,1551],{"class":1412}," *",[946,1553,1554],{"class":1408}," fp ",[946,1556,1419],{"class":1412},[946,1558,1423],{"class":1422},[946,1560,1426],{"class":1408},[946,1562,1564,1566],{"class":948,"line":1563},10,[946,1565,1431],{"class":1412},[946,1567,1434],{"class":1408},[946,1569,1571,1574,1576,1578,1581,1583,1586,1589,1592],{"class":948,"line":1570},11,[946,1572,1573],{"class":1408},"    fp ",[946,1575,1419],{"class":1412},[946,1577,1444],{"class":1412},[946,1579,1580],{"class":952}," Factory",[946,1582,1542],{"class":1408},[946,1584,1585],{"class":1483},"CXmlCtx",[946,1587,1588],{"class":1408},",",[946,1590,1591],{"class":1483},"xmlnode",[946,1593,1594],{"class":1408},">( ctxp );\n",[946,1596,1598,1600,1602,1605,1607],{"class":948,"line":1597},12,[946,1599,1456],{"class":1408},[946,1601,1459],{"class":1412},[946,1603,1604],{"class":1408},"( FactoryException ",[946,1606,1466],{"class":1465},[946,1608,1609],{"class":1408}," fe ) {\n",[946,1611,1613,1615,1617,1619,1622,1624,1626],{"class":948,"line":1612},13,[946,1614,1475],{"class":1412},[946,1616,1478],{"class":1408},[946,1618,1419],{"class":1412},[946,1620,1621],{"class":1483}," fe",[946,1623,376],{"class":1408},[946,1625,1489],{"class":952},[946,1627,1450],{"class":1408},[946,1629,1631,1633,1635,1637,1639,1641,1643,1646,1648,1650],{"class":948,"line":1630},14,[946,1632,1496],{"class":952},[946,1634,1499],{"class":1408},[946,1636,1502],{"class":952},[946,1638,1499],{"class":1408},[946,1640,1507],{"class":952},[946,1642,1510],{"class":1408},[946,1644,1645],{"class":956},"\"Failed to create create parser, error %1\"",[946,1647,1516],{"class":1408},[946,1649,1519],{"class":952},[946,1651,1522],{"class":1408},[946,1653,1655],{"class":948,"line":1654},15,[946,1656,1528],{"class":1408},[946,1658,1660],{"class":948,"line":1659},16,[946,1661,1533],{"emptyLinePlaceholder":333},[946,1663,1665,1668,1670,1672,1674,1676,1679,1681,1683],{"class":948,"line":1664},17,[946,1666,1667],{"class":1408},"DOMParser",[946,1669,1542],{"class":1412},[946,1671,1545],{"class":1408},[946,1673,1548],{"class":1412},[946,1675,1551],{"class":1412},[946,1677,1678],{"class":1408}," parserp ",[946,1680,1419],{"class":1412},[946,1682,1423],{"class":1422},[946,1684,1426],{"class":1408},[946,1686,1688,1690],{"class":948,"line":1687},18,[946,1689,1431],{"class":1412},[946,1691,1434],{"class":1408},[946,1693,1695,1698,1700,1703,1706,1709,1712,1715],{"class":948,"line":1694},19,[946,1696,1697],{"class":1408},"    parserp ",[946,1699,1419],{"class":1412},[946,1701,1702],{"class":1483}," fp",[946,1704,1705],{"class":1408},"->",[946,1707,1708],{"class":952},"createDOMParser",[946,1710,1711],{"class":1408},"( DOMParCXml, ",[946,1713,1714],{"class":1422},"NULL",[946,1716,1717],{"class":1408}," );\n",[946,1719,1721,1723,1725,1727,1729],{"class":948,"line":1720},20,[946,1722,1456],{"class":1408},[946,1724,1459],{"class":1412},[946,1726,1604],{"class":1408},[946,1728,1466],{"class":1465},[946,1730,1609],{"class":1408},[946,1732,1734,1737],{"class":948,"line":1733},21,[946,1735,1736],{"class":1412},"    delete",[946,1738,1739],{"class":1408}," fp;\n",[946,1741,1743,1745,1747,1749,1751,1753,1755],{"class":948,"line":1742},22,[946,1744,1475],{"class":1412},[946,1746,1478],{"class":1408},[946,1748,1419],{"class":1412},[946,1750,1621],{"class":1483},[946,1752,376],{"class":1408},[946,1754,1489],{"class":952},[946,1756,1450],{"class":1408},[946,1758,1760,1762,1764,1766,1768,1770,1772,1775,1777,1779],{"class":948,"line":1759},23,[946,1761,1496],{"class":952},[946,1763,1499],{"class":1408},[946,1765,1502],{"class":952},[946,1767,1499],{"class":1408},[946,1769,1507],{"class":952},[946,1771,1510],{"class":1408},[946,1773,1774],{"class":956},"\"Failed to create parser, error %1\"",[946,1776,1516],{"class":1408},[946,1778,1519],{"class":952},[946,1780,1522],{"class":1408},[946,1782,1784],{"class":948,"line":1783},24,[946,1785,1528],{"class":1408},[946,1787,1789],{"class":948,"line":1788},25,[946,1790,1533],{"emptyLinePlaceholder":333},[946,1792,1794,1797,1800,1802,1805,1807],{"class":948,"line":1793},26,[946,1795,1796],{"class":1412},"const",[946,1798,1799],{"class":1412}," char",[946,1801,1551],{"class":1412},[946,1803,1804],{"class":1408}," fname ",[946,1806,1419],{"class":1412},[946,1808,1809],{"class":1408}," filename;\n",[946,1811,1813,1816,1818,1821,1823,1825,1828,1831,1833],{"class":948,"line":1812},27,[946,1814,1815],{"class":1408},"FileSource ",[946,1817,1413],{"class":1412},[946,1819,1820],{"class":1408}," isrcp ",[946,1822,1419],{"class":1412},[946,1824,1444],{"class":1412},[946,1826,1827],{"class":952}," FileSource",[946,1829,1830],{"class":1408},"( (oratext",[946,1832,1413],{"class":1412},[946,1834,1835],{"class":1408},") fname );\n",[946,1837,1839,1841],{"class":948,"line":1838},28,[946,1840,1431],{"class":1412},[946,1842,1434],{"class":1408},[946,1844,1846,1849,1851,1853,1855,1857,1860,1862,1865,1867,1870],{"class":948,"line":1845},29,[946,1847,1848],{"class":1408},"    DocumentRef",[946,1850,1542],{"class":1412},[946,1852,1591],{"class":1408},[946,1854,1548],{"class":1412},[946,1856,1551],{"class":1412},[946,1858,1859],{"class":1408}," docrefp ",[946,1861,1419],{"class":1412},[946,1863,1864],{"class":1483}," parserp",[946,1866,1705],{"class":1408},[946,1868,1869],{"class":952},"parse",[946,1871,1872],{"class":1408},"( isrcp, FALSE );\n",[946,1874,1876,1879,1882,1885,1888],{"class":948,"line":1875},30,[946,1877,1878],{"class":1412},"    if",[946,1880,1881],{"class":1408},"( docrefp ",[946,1883,1884],{"class":1412},"==",[946,1886,1887],{"class":1422}," NULL",[946,1889,1890],{"class":1408}," ) {\n",[946,1892,1894,1897,1899,1901,1903,1905,1907,1910],{"class":948,"line":1893},31,[946,1895,1896],{"class":952},"        QFAIL",[946,1898,1499],{"class":1408},[946,1900,1502],{"class":952},[946,1902,1499],{"class":1408},[946,1904,1507],{"class":952},[946,1906,1510],{"class":1408},[946,1908,1909],{"class":956},"\"NULL document\"",[946,1911,1912],{"class":1408},") ) );\n",[946,1914,1916,1919],{"class":948,"line":1915},32,[946,1917,1918],{"class":1412},"        return",[946,1920,1426],{"class":1408},[946,1922,1924],{"class":948,"line":1923},33,[946,1925,1926],{"class":1408},"    }\n",[946,1928,1930,1933,1935,1938,1940,1943,1945,1948],{"class":948,"line":1929},34,[946,1931,1932],{"class":1408},"    xmlnode ",[946,1934,1413],{"class":1412},[946,1936,1937],{"class":1408}," np ",[946,1939,1419],{"class":1412},[946,1941,1942],{"class":1483}," docrefp",[946,1944,1705],{"class":1408},[946,1946,1947],{"class":952},"getDocumentElement",[946,1949,1450],{"class":1408},[946,1951,1953,1955,1958,1960,1962],{"class":948,"line":1952},35,[946,1954,1878],{"class":1412},[946,1956,1957],{"class":1408},"( np ",[946,1959,1884],{"class":1412},[946,1961,1887],{"class":1422},[946,1963,1890],{"class":1408},[946,1965,1967,1969,1971,1973,1975,1977,1979,1982],{"class":948,"line":1966},36,[946,1968,1896],{"class":952},[946,1970,1499],{"class":1408},[946,1972,1502],{"class":952},[946,1974,1499],{"class":1408},[946,1976,1507],{"class":952},[946,1978,1510],{"class":1408},[946,1980,1981],{"class":956},"\"Empty document\"",[946,1983,1912],{"class":1408},[946,1985,1987,1989],{"class":948,"line":1986},37,[946,1988,1918],{"class":1412},[946,1990,1426],{"class":1408},[946,1992,1994],{"class":948,"line":1993},38,[946,1995,1926],{"class":1408},[946,1997,1999,2002,2004,2007],{"class":948,"line":1998},39,[946,2000,2001],{"class":1483},"    docrefp",[946,2003,1705],{"class":1408},[946,2005,2006],{"class":952},"markToDelete",[946,2008,1450],{"class":1408},[946,2010,2012,2014],{"class":948,"line":2011},40,[946,2013,1736],{"class":1412},[946,2015,2016],{"class":1408}," docrefp;\n",[946,2018,2020,2022,2024,2027,2029],{"class":948,"line":2019},41,[946,2021,1456],{"class":1408},[946,2023,1459],{"class":1412},[946,2025,2026],{"class":1408},"( ParserException ",[946,2028,1466],{"class":1465},[946,2030,2031],{"class":1408}," pe ) {\n",[946,2033,2035,2037],{"class":948,"line":2034},42,[946,2036,1736],{"class":1412},[946,2038,2039],{"class":1408}," parserp;\n",[946,2041,2043,2045],{"class":948,"line":2042},43,[946,2044,1736],{"class":1412},[946,2046,2047],{"class":1408}," isrcp;\n",[946,2049,2051,2053],{"class":948,"line":2050},44,[946,2052,1736],{"class":1412},[946,2054,1739],{"class":1408},[946,2056,2058],{"class":948,"line":2057},45,[946,2059,1533],{"emptyLinePlaceholder":333},[946,2061,2063,2065,2067,2069,2072,2074,2076],{"class":948,"line":2062},46,[946,2064,1475],{"class":1412},[946,2066,1478],{"class":1408},[946,2068,1419],{"class":1412},[946,2070,2071],{"class":1483}," pe",[946,2073,376],{"class":1408},[946,2075,1489],{"class":952},[946,2077,1450],{"class":1408},[946,2079,2081,2083,2085,2087,2089,2091,2093,2096,2098,2100],{"class":948,"line":2080},47,[946,2082,1496],{"class":952},[946,2084,1499],{"class":1408},[946,2086,1502],{"class":952},[946,2088,1499],{"class":1408},[946,2090,1507],{"class":952},[946,2092,1499],{"class":1408},[946,2094,2095],{"class":956},"\"Failed to parse the document, error %1\"",[946,2097,1516],{"class":1408},[946,2099,1519],{"class":952},[946,2101,1522],{"class":1408},[946,2103,2105],{"class":948,"line":2104},48,[946,2106,1528],{"class":1408},[946,2108,2110],{"class":948,"line":2109},49,[946,2111,2113],{"class":2112},"sV9Aq","\u002F\u002F    delete parserp;\n",[946,2115,2117],{"class":948,"line":2116},50,[946,2118,2119],{"class":2112},"\u002F\u002F    delete isrcp;\n",[946,2121,2123],{"class":948,"line":2122},51,[946,2124,2125],{"class":2112},"\u002F\u002F    delete fp;\n",[946,2127,2129],{"class":948,"line":2128},52,[946,2130,2131],{"class":2112},"\u002F\u002F    delete ctxp;\n",[12,2133,2134,2135,2138,2139,2141,2142,376],{},"Le premier problème se situe lors de la suppression du contexte\n(dernière ligne, en commentaire). Si cette ligne est exécutée, alors\nnous avons une grosse erreur de segmentation. J'ai le problème, quels\nque soient les ",[136,2136,2137],{},"delete"," que je fais avant.Même en faisant le maximum de\n",[136,2140,2137],{}," (soit parserp, isrcp, fp), le fait de ne pas supprimer le\ncontext (ctxp), fait qu'au bout de plusieurs itérations, nous avons une\nbonne fuite mémoire",[403,2143,2144],{},[19,2145,776],{"href":773,"ariaDescribedBy":2146,"dataFootnoteRef":296,"id":775},[409],[12,2148,2149],{},"Vient ensuite le second problème, celui des erreurs d'intialisation. Si\nle parseur est lancé plusieurs fois de suite, alors l'application\naffiche les erreurs suivantes à l'écran :",[927,2151,2154],{"className":2152,"code":2153,"language":932},[930],"LPX-00202: Message 202 not found; No message file for product=XDK, facility=LPX\nFAIL!  : XmlParserBenchmark::oracleParser(file250k.xml) Failed to parse the document, error 202\n    Loc: [oracleparser.cpp(73)]\n",[136,2155,2153],{"__ignoreMap":296},[12,2157,2158],{},"Aucune explication sur le pourquoi. Parfois ça marche, parfois non...\nPour contourner le problème, j'ai forké le parseur pour l'exécuter isolé\ndu reste.",[927,2160,2164],{"className":2161,"code":2162,"language":2163,"meta":296,"style":296},"language-c shiki shiki-themes one-dark-pro","pid_t pid = fork();\nif( pid > 0 ) {\n    waitpid( pid, (int*)0, 0 );\n} else if( pid == 0 ) {\n    if( ! filename.isEmpty() )\n        parse( qPrintable( filename ) );\n    exit( 0 );\n} else {\n    QFAIL( \"Cannot fork\" );\n}\n","c",[136,2165,2166,2181,2195,2218,2236,2256,2268,2279,2287,2298],{"__ignoreMap":296},[946,2167,2168,2171,2174,2176,2179],{"class":948,"line":949},[946,2169,2170],{"class":1412},"pid_t",[946,2172,2173],{"class":1408}," pid ",[946,2175,1419],{"class":1412},[946,2177,2178],{"class":952}," fork",[946,2180,1450],{"class":1408},[946,2182,2183,2186,2189,2191,2193],{"class":948,"line":297},[946,2184,2185],{"class":1412},"if",[946,2187,2188],{"class":1408},"( pid ",[946,2190,1548],{"class":1412},[946,2192,1423],{"class":1422},[946,2194,1890],{"class":1408},[946,2196,2197,2200,2203,2206,2209,2212,2214,2216],{"class":948,"line":300},[946,2198,2199],{"class":952},"    waitpid",[946,2201,2202],{"class":1408},"( pid, (",[946,2204,2205],{"class":1412},"int*",[946,2207,2208],{"class":1408},")",[946,2210,2211],{"class":1422},"0",[946,2213,803],{"class":1408},[946,2215,2211],{"class":1422},[946,2217,1717],{"class":1408},[946,2219,2220,2222,2225,2228,2230,2232,2234],{"class":948,"line":1453},[946,2221,1456],{"class":1408},[946,2223,2224],{"class":1412},"else",[946,2226,2227],{"class":1412}," if",[946,2229,2188],{"class":1408},[946,2231,1884],{"class":1412},[946,2233,1423],{"class":1422},[946,2235,1890],{"class":1408},[946,2237,2238,2240,2242,2245,2248,2250,2253],{"class":948,"line":1472},[946,2239,1878],{"class":1412},[946,2241,1499],{"class":1408},[946,2243,2244],{"class":1465},"!",[946,2246,2247],{"class":1483}," filename",[946,2249,376],{"class":1408},[946,2251,2252],{"class":952},"isEmpty",[946,2254,2255],{"class":1408},"() )\n",[946,2257,2258,2261,2263,2265],{"class":948,"line":342},[946,2259,2260],{"class":952},"        parse",[946,2262,1499],{"class":1408},[946,2264,1502],{"class":952},[946,2266,2267],{"class":1408},"( filename ) );\n",[946,2269,2270,2273,2275,2277],{"class":948,"line":1525},[946,2271,2272],{"class":952},"    exit",[946,2274,1499],{"class":1408},[946,2276,2211],{"class":1422},[946,2278,1717],{"class":1408},[946,2280,2281,2283,2285],{"class":948,"line":1062},[946,2282,1456],{"class":1408},[946,2284,2224],{"class":1412},[946,2286,1434],{"class":1408},[946,2288,2289,2291,2293,2296],{"class":948,"line":1536},[946,2290,1496],{"class":952},[946,2292,1499],{"class":1408},[946,2294,2295],{"class":956},"\"Cannot fork\"",[946,2297,1717],{"class":1408},[946,2299,2300],{"class":948,"line":1563},[946,2301,1528],{"class":1408},[970,2303,2305,2308],{"className":2304,"dataFootnotes":296},[973],[975,2306,979],{"className":2307,"id":409},[978],[981,2309,2310,2316],{},[62,2311,2312,2313],{"id":985},"Ces tests ont été réalisé dans un chroot 32-bits allant à 2,4GHz. Les temps sont une moyenne sur 100 itérations ",[19,2314,993],{"href":989,"ariaLabel":990,"className":2315,"dataFootnoteBackref":296},[992],[62,2317,2318,2319],{"id":996},"Si quelqu'un a déjà utilisé ce parseur, et qu'il sait comment il fonctionne, il peut m'écrire ",[19,2320,993],{"href":1006,"ariaLabel":1007,"className":2321,"dataFootnoteBackref":296},[992],[1010,2323,2324],{},"html pre.shiki code .sn6KH, html code.shiki .sn6KH{--shiki-default:#ABB2BF}html pre.shiki code .seHd6, html code.shiki .seHd6{--shiki-default:#C678DD}html pre.shiki code .sVC51, html code.shiki .sVC51{--shiki-default:#D19A66}html pre.shiki code .sVbv2, html code.shiki .sVbv2{--shiki-default:#61AFEF}html pre.shiki code .sjrmR, html code.shiki .sjrmR{--shiki-default:#56B6C2}html pre.shiki code .sU0A5, html code.shiki .sU0A5{--shiki-default:#E5C07B}html pre.shiki code .subq3, html code.shiki .subq3{--shiki-default:#98C379}html pre.shiki code .sV9Aq, html code.shiki .sV9Aq{--shiki-default:#7F848E;--shiki-default-font-style:italic}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":296,"searchDepth":297,"depth":297,"links":2326},[2327,2328,2329,2330],{"id":1084,"depth":300,"text":1085},{"id":1100,"depth":300,"text":1101},{"id":1327,"depth":300,"text":1328},{"id":409,"depth":297,"text":979},"Programmation","programmation","2009-05-31",{"type":9,"value":2335},[2336,2338],[12,2337,1071],{},[12,2339,1074,2340,1078],{},[30,2341,1077],{},{},"\u002Fpost\u002Fparseur-xml",{"title":1066,"description":1071},"parseur-xml","posts\u002FProgrammation\u002F2009-05-31-parseur-xml",[2348,340,341],"performance","G7dHisiUAKK_MNKBFUElPa66LJWw54bB5Z9U4-7H4Ck",{"id":2351,"title":2352,"author":7,"body":2353,"category":24,"categorySlug":305,"date":2527,"description":14,"excerpt":2528,"extension":330,"location":331,"meta":2542,"navigation":333,"path":2543,"published":333,"seo":2544,"slug":2545,"stem":2546,"tags":2547,"timeToRead":1453,"__hash__":2548},"posts\u002Fposts\u002FXINX\u002F2009-05-26-xinx-0.8.1.0.md","XINX 0.8.1.0",{"type":9,"value":2354,"toc":2519},[2355,2357,2366,2374,2378,2384,2387,2390,2396,2402,2406,2412,2415,2419,2426,2432,2445,2448,2451,2457,2461,2468,2472,2475,2478,2480,2496,2505],[12,2356,14],{},[12,2358,2359],{},[2360,2361,2362,2365],"ins",{},[101,2363,2364],{},"Erratum :"," La dernière version est numéroté 0.8.1.1. Un petit\nbug (pouvant être gênant lors de l'ouverture de feuille de style sans\nutilisation du mode projet) a été corrigé dans la foulé. La page est\ncorrigé en conséquence",[12,2367,2368,2369,2373],{},"Je souhaite vous annoncer la sortie de la version ",[2370,2371,2372],"strike",{},"0.8.1.0","\n0.8.1.1 de XINX. Pas d'énorme changement pour vous depuis la version 0.8.0.0\n(sinon nous serions passés à la version 0.9.0.0) mais de gros changements\ninternes.",[54,2375,2377],{"id":2376},"vue-contenue","Vue Contenue",[12,2379,2380],{},[94,2381],{"alt":2382,"src":2383},"ContentViewDock.png","\u002FXINX\u002Fxinx-0.8.1.0\u002FContentViewDock.png",[12,2385,2386],{},"En fait, la partie gérant la vue contenue a été complètement ré-écrite.\nElle est maintenant parallélisée et partagée entre les différents\néditeurs. Au final l'empreinte mémoire, ainsi que la fluidité a chargé\nles différents fichiers de XINX devrait être amélioré. (Enfin j'espère,\ncar je n'ai pas fait de benchmark). De ce coté le code est lui aussi\nbeaucoup plus propre et plus souple.",[12,2388,2389],{},"XINX étant toujours dans les versions 0.XX, je n'ose vous rappeler que\nce n'est pas ce qu'on appelle une version finie, mais une série de bêta\n;) . Étant donné le peu de test que j'ai pu faire sur cette version en\nparticulier j'aurais dû la nommer en -rc ou en -beta mais je me suis dit\nque cela serait redondant, et que si ça ne convenait pas vous ajouteriez\nun ticket sur ce site pour me prévenir. Enfin j'espère que cette version\nne sera pas trop miner. 😄",[12,2391,2392,2393,2395],{},"La ré-écriture de la partie ",[30,2394,2377],{}," permet donc de préciser dans\nles propriétés du projet quelques fichiers qui seront pré-chargés au\nchargement du projet. Ces fichiers étant pré-chargés, l'ouverture des\nfeuilles de styles devrait être accéléré. Si de votre coté, XINX\nprésente quelques faiblesses, merci de me prévenir. La complétion a\négalement été améliorée (avec la suppression des bug, comme l'affichage\nde balise with-param en double). Lors de vos déplacements dans\nl'éditeur, la vue contenue vous indique votre emplacement dans la vue\ncontenue.",[12,2397,2398],{},[94,2399],{"alt":2400,"src":2401},"PreloadedFiles.png","\u002FXINX\u002Fxinx-0.8.1.0\u002FPreloadedFiles.png",[54,2403,2405],{"id":2404},"dictionnaire","Dictionnaire",[12,2407,2408],{},[94,2409],{"alt":2410,"src":2411},"Dictionary.png","\u002FXINX\u002Fxinx-0.8.1.0\u002FDictionary.png",[12,2413,2414],{},"L'autre nouveau point et l'ajout d'un nouveau Dock par l'intermédiaire\ndes plugins. Ce Dock vous propose l'affichage du dictionnaire dans les\nversions GCE130 et GCE140. Pour l'instant le seul intérêt de ce dock est\nl'affichage du dictionnaire à la recherche d'un label. C'est un point de\ndépart pouvant vous servir à faire des tickets sur des améliorations à\napporter. (Celle que j'ai en tête est la gestion de la complétion sur\nles libellés du dictionnaire). Merci de passer par le système de ticket\npour proposer d'autres améliorations sur le DOCK Dictionnaire.",[54,2416,2418],{"id":2417},"pré-visualisation","Pré-visualisation",[12,2420,2421,2422,2425],{},"Enfin, dernière évolution intéressante, est l'affichage de la\npré-visualisation de la page. Cette fonctionnalité est à noter comme\n",[30,2423,2424],{},"extrêmement expérimental",",et n'évoluera peut-être pas (selon les\ndemandes qui sont faites dessus, ainsi que suivant les problèmes\ntechniques rencontrés), et ne fonctionnera peut-être pas avec les\nprochaines versions de GCE. (En version 140, les libellés ne sont pas\nremplacés).",[12,2427,2428],{},[94,2429],{"alt":2430,"src":2431},"CustomWebPlugin.png","\u002FXINX\u002Fxinx-0.8.1.0\u002FCustomWebPlugin.png",[12,2433,2434,2435,2438,2439,2444],{},"Pour faire fonctionner la prévisualisation, vous devez renseigner\nl'emplacement de la ",[30,2436,2437],{},"ServletControl",", configurer, dans les propriétés du\nplugin WEB, le parseur à utiliser",[403,2440,2441],{},[19,2442,411],{"href":407,"ariaDescribedBy":2443,"dataFootnoteRef":296,"id":410},[409]," et de configurer le lecteur\n(je vous conseille Webkit).",[12,2446,2447],{},"De là, lors des développements de feuille de style en mode projet, si\nvous sélectionnez un flux de présentation XML (dans le dock associé) et\nappuyé sur F9, vous devriez avoir la prévisualisation de votre feuille\nde style.",[12,2449,2450],{},"Le même principe peut-être appliqué pour une page HTML. Là, pas besoin\nde parseur, ni de flux de présentation. Vous pouvez avoir directement la\nprévisualisation de votre page HTML.",[12,2452,2453],{},[94,2454],{"alt":2455,"src":2456},"ParseXsl.png","\u002FXINX\u002Fxinx-0.8.1.0\u002FParseXsl.png",[54,2458,2460],{"id":2459},"gestion-des-plugins","Gestion des plugins",[12,2462,2463,2464,2467],{},"Enfin, la gestion des plugins n'a cessé de s'améliorer. Il est de plus\nen plus facile d'étendre ",[30,2465,2466],{},"'XINX","'. Ceci par l'intermédiare de Script ou\nde Plugins. Si une fonctionnalité vous manque, vous pouvez donc non\nseulement la proposer, mais aussi l'écrire en script, ou si le script\nest trop limité, vous pouvez aussi écrire le plugin. Les plugins\npermettent donc d'ajouter des actions à XINX, des Docks, des éditeurs,\ndes gestionnaires de version, des pages de configuration du projet, ...",[54,2469,2471],{"id":2470},"d-bus","D-BUS",[12,2473,2474],{},"Alors que D-BUS avait été ajouté dans les précédentes versions afin de\npermettre une plus grande interopérabilité, ce dernier a été retiré pour\ncette version. Ainsi XINX est maintenant indépendant de D-BUS. Il a été\ndécidé de retirer D-BUS pour plusieurs raisons : Simplification de la\ncompilation, source de problème sous MS\u002FWindows. Il devient maintenant\nbeaucoup plus simple de compiler XINX sous Windows. L'interface avec\nD-BUS reviendra dans une future version mais sera alors optionnel.",[12,2476,2477],{},"Je vous souhaite une bonne installation.",[87,2479,908],{"id":907},[59,2481,2482,2489],{},[62,2483,2484],{},[19,2485,2488],{"href":2486,"rel":2487},"http:\u002F\u002Fxinx.shadoware.org\u002Fdownloads\u002F45",[23],"binaire i386 windows",[62,2490,2491],{},[19,2492,2495],{"href":2493,"rel":2494},"http:\u002F\u002Fxinx.shadoware.org\u002Fdownloads\u002F46",[23],"source",[12,2497,2498,2499,2502],{},"Sous Debian, ajout du dépôt :",[2500,2501],"br",{},[136,2503,2504],{},"deb http:\u002F\u002Fapt.shadoware.org\u002F sid main",[970,2506,2508,2511],{"className":2507,"dataFootnotes":296},[973],[975,2509,979],{"className":2510,"id":409},[978],[981,2512,2513],{},[62,2514,2515,2516],{"id":985},"je vous conseille celui d'Oracle, Il est plus long à se lancer mais permet de gérer les noms de domaine Generix. ",[19,2517,993],{"href":989,"ariaLabel":990,"className":2518,"dataFootnoteBackref":296},[992],{"title":296,"searchDepth":297,"depth":297,"links":2520},[2521,2522,2523,2524,2525,2526],{"id":2376,"depth":300,"text":2377},{"id":2404,"depth":300,"text":2405},{"id":2417,"depth":300,"text":2418},{"id":2459,"depth":300,"text":2460},{"id":2470,"depth":300,"text":2471},{"id":409,"depth":297,"text":979},"2009-05-26",{"type":9,"value":2529},[2530,2532,2538],[12,2531,14],{},[12,2533,2534],{},[2360,2535,2536,2365],{},[101,2537,2364],{},[12,2539,2368,2540,2373],{},[2370,2541,2372],{},{},"\u002Fpost\u002Fxinx-0.8.1.0",{"title":2352,"description":14},"xinx-0.8.1.0","posts\u002FXINX\u002F2009-05-26-xinx-0.8.1.0",[305,339,340,341],"8aKIzfM_YqZZxhEq2D3RIfltjcXI7zx2CQJUUEok8_U",{"id":2550,"title":2551,"author":7,"body":2552,"category":24,"categorySlug":305,"date":2973,"description":296,"excerpt":2974,"extension":330,"location":331,"meta":2990,"navigation":333,"path":2991,"published":333,"seo":2992,"slug":2993,"stem":2994,"tags":2995,"timeToRead":1453,"__hash__":2997},"posts\u002Fposts\u002FXINX\u002F2009-03-06-xinx-0.8.0.0.md","XINX 0.8.0.0",{"type":9,"value":2553,"toc":2966},[2554,2560,2565,2573,2576,2584,2587,2590,2594,2605,2612,2615,2620,2626,2643,2647,2653,2656,2659,2663,2668,2676,2865,2875,2879,2882,2890,2894,2898,2910,2913,2917,2920,2926,2929,2957,2963],[12,2555,2556],{},[94,2557],{"alt":2558,"src":2559},"Editeur","\u002FXINX\u002Fxinx-0.8.0.0\u002Fediteur_de_texte.png",[12,2561,2562,2563,376],{},"J'ai le plaisir de vous annoncer la sortie de la nouvelle version de\n",[101,2564,24],{},[12,2566,2567,2569,2570,376],{},[101,2568,24],{}," est un éditeur de projet web basé sur les technologies XSL,\nHTML, CSS, JavaScript. Il possède un mode projet permettant de dériver\nles projets à la manière des consultants GCE de l'entreprise ",[30,2571,2572],{},"Generix\nGroup",[12,2574,2575],{},"Cette dernière version a mis beaucoup de temps pour sortir et est moins\ncomplète que celle que je souhaitais faire à l'origine. Cela viens de\nplusieurs raison :",[59,2577,2578,2581],{},[62,2579,2580],{},"de gros changement interne",[62,2582,2583],{},"moins de temps le soir et le week-end.",[12,2585,2586],{},"La prochaine version 0.8.1 contiendra les développements que je n'ai pu\nmettre dans cette version. N'hésitez pas à faire un retour sur les\nproblèmes que vous rencontrez pour que ces derniers soit également\ncorriger pour la prochaine version.",[12,2588,2589],{},"Nous allons détailler ci-dessous les différentes amélioration incluse\ndans cette version.",[54,2591,2593],{"id":2592},"qcodeedit-le-nouvel-éditeur","QCodeEdit - Le nouvel éditeur",[12,2595,2596,2597,2600,2601,2604],{},"L'éditeur de texte de cette version a complètement été remplacé. On est\npassé de QTextEdit (",[30,2598,2599],{},"éditeur de texte de Qt Software",") à QCodeEdit\n(",[30,2602,2603],{},"Développé par Luc Bruant aka fullmetalcoder","). Heureusement que les\nAPIs de ces deux éditeurs sont très similaire ce qui a permis\nd'effectuer les changements assez rapidement (quelques mois au lieu de\nquelques années ;) ).",[12,2606,2607,2608,2611],{},"Je tiens également à remercier ",[30,2609,2610],{},"fullmetalcoder"," de sa réactivité sur le\ndéveloppement de QCodeEdit.",[12,2613,2614],{},"Les nouveautés qu'apportent ce nouvel éditeur par rapport à QTextEdit\nsont :",[59,2616,2617],{},[62,2618,2619],{},"le folding",[12,2621,2622],{},[94,2623],{"alt":2624,"src":2625},"Mark","\u002FXINX\u002Fxinx-0.8.0.0\u002Fmarqueur.png",[59,2627,2628,2631,2637,2640],{},[62,2629,2630],{},"les couleurs de fond sur les marque pages et les erreurs (pour une\nplus grande clarté).",[62,2632,2633,2634,2208],{},"un chargement plus rapide des fichiers (exemple :\n",[136,2635,2636],{},"configuration.xml",[62,2638,2639],{},"pourvoir faire des sélections verticales (à l'aide de Ctrl+Shift)\ncomme le font certain éditeurs",[62,2641,2642],{},"afficher les correspondances de parenthèses",[54,2644,2646],{"id":2645},"test-du-xpath","Test du XPATH",[12,2648,2649],{},[94,2650],{"alt":2651,"src":2652},"X-Quey","\u002FXINX\u002Fxinx-0.8.0.0\u002Fxpath.png",[12,2654,2655],{},"Cette boite de dialogue permet d'exécuter un X-PATH (ou une requête\nXQuery) sur un fichier de présentation. Cela permet de tester rapidement\nles X-PATH compliqué avant de lancer la page sous le navigateur.",[12,2657,2658],{},"Il est possible de saisir des X-PATH relativement à un X-PATH\nsélectionné dans le flux de présentation ou de manière absolu.",[54,2660,2662],{"id":2661},"script-automatique","Script automatique",[12,2664,2665,2667],{},[101,2666,24],{}," permet également d'appeler un script lors de la sauvegarde d'un\nfichier. Pour cela un nouvel objet permettant de modifier le contenue de\nl'éditeur plus facilement a été créé.Comme exemple à la sauvegarde de\nscript ont été mis à jours :",[59,2669,2670,2673],{},[62,2671,2672],{},"La mise à jours des key('url-param','') par des X-PATH",[62,2674,2675],{},"La mise à jours du nom du fichier dans les feuilles de styles.",[927,2677,2681],{"className":2678,"code":2679,"language":2680,"meta":296,"style":296},"language-javascript shiki shiki-themes one-dark-pro","obj.beforeSave = function() {\n  this.run();\n};\n\nobj.run = function() {\n  var search = new DocumentSearch(textEdit);\n\n  search.options.regExp = true;\n  search.searchText = \"key\\\\('url-param', '(.*)'\\\\)\";\n  search.replaceText =\n    \"\u002Flayout_data\u002Fapplication_data\u002Ftemporaire\u002Fparam[@name='\\\\1']\";\n\n  while (search.next()) {}\n};\n","javascript",[136,2682,2683,2702,2714,2719,2723,2737,2761,2765,2787,2814,2826,2838,2842,2861],{"__ignoreMap":296},[946,2684,2685,2688,2690,2693,2696,2699],{"class":948,"line":949},[946,2686,2687],{"class":1483},"obj",[946,2689,376],{"class":1408},[946,2691,2692],{"class":952},"beforeSave",[946,2694,2695],{"class":1465}," =",[946,2697,2698],{"class":1412}," function",[946,2700,2701],{"class":1408},"() {\n",[946,2703,2704,2707,2709,2712],{"class":948,"line":297},[946,2705,2706],{"class":1483},"  this",[946,2708,376],{"class":1408},[946,2710,2711],{"class":952},"run",[946,2713,1450],{"class":1408},[946,2715,2716],{"class":948,"line":300},[946,2717,2718],{"class":1408},"};\n",[946,2720,2721],{"class":948,"line":1453},[946,2722,1533],{"emptyLinePlaceholder":333},[946,2724,2725,2727,2729,2731,2733,2735],{"class":948,"line":1472},[946,2726,2687],{"class":1483},[946,2728,376],{"class":1408},[946,2730,2711],{"class":952},[946,2732,2695],{"class":1465},[946,2734,2698],{"class":1412},[946,2736,2701],{"class":1408},[946,2738,2739,2742,2746,2748,2750,2753,2755,2758],{"class":948,"line":342},[946,2740,2741],{"class":1412},"  var",[946,2743,2745],{"class":2744},"sVyAn"," search",[946,2747,2695],{"class":1465},[946,2749,1444],{"class":1412},[946,2751,2752],{"class":952}," DocumentSearch",[946,2754,1510],{"class":1408},[946,2756,2757],{"class":2744},"textEdit",[946,2759,2760],{"class":1408},");\n",[946,2762,2763],{"class":948,"line":1525},[946,2764,1533],{"emptyLinePlaceholder":333},[946,2766,2767,2770,2772,2775,2777,2780,2782,2785],{"class":948,"line":1062},[946,2768,2769],{"class":1483},"  search",[946,2771,376],{"class":1408},[946,2773,2774],{"class":1483},"options",[946,2776,376],{"class":1408},[946,2778,2779],{"class":2744},"regExp",[946,2781,2695],{"class":1465},[946,2783,2784],{"class":1422}," true",[946,2786,1426],{"class":1408},[946,2788,2789,2791,2793,2796,2798,2801,2804,2807,2809,2812],{"class":948,"line":1536},[946,2790,2769],{"class":1483},[946,2792,376],{"class":1408},[946,2794,2795],{"class":2744},"searchText",[946,2797,2695],{"class":1465},[946,2799,2800],{"class":956}," \"key",[946,2802,2803],{"class":1465},"\\\\",[946,2805,2806],{"class":956},"('url-param', '(.*)'",[946,2808,2803],{"class":1465},[946,2810,2811],{"class":956},")\"",[946,2813,1426],{"class":1408},[946,2815,2816,2818,2820,2823],{"class":948,"line":1563},[946,2817,2769],{"class":1483},[946,2819,376],{"class":1408},[946,2821,2822],{"class":2744},"replaceText",[946,2824,2825],{"class":1465}," =\n",[946,2827,2828,2831,2833,2836],{"class":948,"line":1570},[946,2829,2830],{"class":956},"    \"\u002Flayout_data\u002Fapplication_data\u002Ftemporaire\u002Fparam[@name='",[946,2832,2803],{"class":1465},[946,2834,2835],{"class":956},"1']\"",[946,2837,1426],{"class":1408},[946,2839,2840],{"class":948,"line":1597},[946,2841,1533],{"emptyLinePlaceholder":333},[946,2843,2844,2847,2850,2853,2855,2858],{"class":948,"line":1612},[946,2845,2846],{"class":1412},"  while",[946,2848,2849],{"class":1408}," (",[946,2851,2852],{"class":1483},"search",[946,2854,376],{"class":1408},[946,2856,2857],{"class":952},"next",[946,2859,2860],{"class":1408},"()) {}\n",[946,2862,2863],{"class":948,"line":1630},[946,2864,2718],{"class":1408},[12,2866,2867,2868,2870,2871,2874],{},"La nouveauté se trouve dans l'ajout de quatre nouvelle méthodes. La\nméthode utilisé ici est ",[136,2869,2692],{}," et permet de faire des\nmodifications au texte avant sauvegarde. Tout comme ",[136,2872,2873],{},"afterSave"," permet\nd'effectuer des modifications au texte après sauvegarde. Nous avons\négalement deux méthodes beforeLoad et afterLoad pour les opérations à\nfaire lors de la lecture.",[54,2876,2878],{"id":2877},"autres-nouveautés","Autres nouveautés",[12,2880,2881],{},"Bien sur cet version apporte aussi d'autres nouveautés comme :",[59,2883,2884,2887],{},[62,2885,2886],{},"la fermeture automatique de balise",[62,2888,2889],{},"des nouvelles options, ...",[54,2891,2893],{"id":2892},"installation","Installation",[87,2895,2897],{"id":2896},"sous-mswindows","Sous Ms\u002FWindows",[12,2899,2900,2901,2903,2904,2909],{},"Pour installer la dernière version de ",[101,2902,24],{}," vous pouvez télécharger\nle ",[19,2905,2908],{"href":2906,"rel":2907},"http:\u002F\u002Fxinx.shadoware.org\u002Fdownloads\u002F40",[23],"programme d'installation"," et le lancer. Il remplacera\nautomatiquement l'ancienne version.",[12,2911,2912],{},"Si vous avez des fichiers de données modifiés (template, script, ...)\npensez à les sauvegarder.",[87,2914,2916],{"id":2915},"sous-gnulinux","Sous Gnu\u002FLinux",[12,2918,2919],{},"Sous Debian, vous pouvez ajouter le dépôt dans le fichier\n\u002Fetc\u002Fapt\u002Fsources.list. Ainsi vous serez automatiquement prévenu des\nmises à jours éventuelle.",[927,2921,2924],{"className":2922,"code":2923,"language":932},[930],"deb http:\u002F\u002Fapt.shadoware.org\u002F sid main\n",[136,2925,2923],{"__ignoreMap":296},[12,2927,2928],{},"puis dans une console :",[927,2930,2932],{"className":940,"code":2931,"language":942,"meta":296,"style":296},"sudo apt-cache search xinx\nsudo aptitude install xinx\n",[136,2933,2934,2946],{"__ignoreMap":296},[946,2935,2936,2939,2942,2944],{"class":948,"line":949},[946,2937,2938],{"class":952},"sudo",[946,2940,2941],{"class":956}," apt-cache",[946,2943,2745],{"class":956},[946,2945,960],{"class":956},[946,2947,2948,2950,2953,2955],{"class":948,"line":297},[946,2949,2938],{"class":952},[946,2951,2952],{"class":956}," aptitude",[946,2954,957],{"class":956},[946,2956,960],{"class":956},[12,2958,2959,2960,2962],{},"Pour les autres distributions ou pour les machines MacOS vous pouvez\ncompiler ",[101,2961,24],{}," à partir des sources.",[1010,2964,2965],{},"html pre.shiki code .sU0A5, html code.shiki .sU0A5{--shiki-default:#E5C07B}html pre.shiki code .sn6KH, html code.shiki .sn6KH{--shiki-default:#ABB2BF}html pre.shiki code .sVbv2, html code.shiki .sVbv2{--shiki-default:#61AFEF}html pre.shiki code .sjrmR, html code.shiki .sjrmR{--shiki-default:#56B6C2}html pre.shiki code .seHd6, html code.shiki .seHd6{--shiki-default:#C678DD}html pre.shiki code .sVyAn, html code.shiki .sVyAn{--shiki-default:#E06C75}html pre.shiki code .sVC51, html code.shiki .sVC51{--shiki-default:#D19A66}html pre.shiki code .subq3, html code.shiki .subq3{--shiki-default:#98C379}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":296,"searchDepth":297,"depth":297,"links":2967},[2968,2969,2970,2971,2972],{"id":2592,"depth":300,"text":2593},{"id":2645,"depth":300,"text":2646},{"id":2661,"depth":300,"text":2662},{"id":2877,"depth":300,"text":2878},{"id":2892,"depth":300,"text":2893},"2009-03-06",{"type":9,"value":2975},[2976,2980,2984],[12,2977,2978],{},[94,2979],{"alt":2558,"src":2559},[12,2981,2562,2982,376],{},[101,2983,24],{},[12,2985,2986,2569,2988,376],{},[101,2987,24],{},[30,2989,2572],{},{},"\u002Fpost\u002Fxinx-0.8.0.0",{"title":2551,"description":296},"xinx-0.8.0.0","posts\u002FXINX\u002F2009-03-06-xinx-0.8.0.0",[2996,305,339,340,341],"debian","2LVP73RxAuNHiNwoDLW7n9zx61WC1hKRo8CPZUCY5rk",{"id":2999,"title":3000,"author":7,"body":3001,"category":24,"categorySlug":305,"date":3326,"description":1071,"excerpt":3327,"extension":330,"location":331,"meta":3343,"navigation":333,"path":3344,"published":333,"seo":3345,"slug":3346,"stem":3347,"tags":3348,"timeToRead":1453,"__hash__":3349},"posts\u002Fposts\u002FXINX\u002F2009-02-18-xinx-editeur-de-feuille-de-style.md","XINX - Editeur de feuille de style",{"type":9,"value":3002,"toc":3321},[3003,3005,3014,3017,3023,3027,3041,3068,3093,3099,3125,3164,3168,3173,3178,3234,3255],[12,3004,1071],{},[12,3006,3007,3008,3010,3011,3013],{},"Ce billet, parle de ",[101,3009,24],{},", un logiciel libre que j'ai développé et\nque je continue à développer sur mon temps libre. Le but de se billet\nest de présenter ",[101,3012,24],{}," et d'être le début d'une longue série de\nbillet parlant de son développement.",[12,3015,3016],{},"En effet, même si le programme est propre à une utilisation particulière\npour un cercle de personne restreint, les méthodes, classes, et idées\nutilisées dans ce programme peuvent intéresser d'autres personnes.",[12,3018,3019],{},[94,3020],{"alt":3021,"src":3022},"Nouvelle","\u002FXINX\u002Fxinx-editeur-de-feuille-de-style\u002FScreenShot151.png",[54,3024,3026],{"id":3025},"présentation","Présentation",[12,3028,3029,3031,3032,3035,3036,376],{},[101,3030,24],{}," est un éditeur de feuille de style sur lequel je travail depuis\ndébut 2006. En faite j'avais commencé un autre éditeur à l'aide de\n",[101,3033,3034],{},"Borland\u002FDelphi 7"," mais il a été rapidement arrêté pour prendre une\nnouvelle direction dans un nouveau langage avec un nouveau\ndépart",[403,3037,3038],{},[19,3039,411],{"href":407,"ariaDescribedBy":3040,"dataFootnoteRef":296,"id":410},[409],[12,3042,3043,3044,3047,3048,3055,3060,3061,3063,3064,3067],{},"Cet éditeur de feuille de style à la particularité de pouvoir être\nutilisé dans le cadre de mon travail : sur l'application ",[30,3045,3046],{},"eGx"," (de la\nsociété ",[101,3049,3050],{},[19,3051,3054],{"href":3052,"rel":3053},"http:\u002F\u002Fwww.fr.generixgroup.com",[23],"Générix",[403,3056,3057],{},[19,3058,776],{"href":773,"ariaDescribedBy":3059,"dataFootnoteRef":296,"id":775},[409],"). ",[101,3062,24],{}," permet non seulement\nl'édition de feuille de style (XSL), en proposant une ",[30,3065,3066],{},"complétion","\nintuitive, mais propose également un mode projet, dans lequel il est\npossible de dérivé une feuille de style plutôt que de la remplacer (de\nfaçon spécifique à notre méthode de travail en projet chez le client).",[12,3069,3070,3072,3073,3081,3082,3085,3086,3088,3089,3092],{},[101,3071,24],{}," est un acronyme récursive",[403,3074,3075],{},[19,3076,3080],{"href":3077,"ariaDescribedBy":3078,"dataFootnoteRef":296,"id":3079},"#user-content-fn-3",[409],"user-content-fnref-3","3"," qui signifie ",[30,3083,3084],{},"XINX Is Not\nXDME",". Ce nom a été choisis car ",[101,3087,24],{}," est le complément idéal à\n",[101,3090,3091],{},"XDME"," (l'éditeur de fichier de configuration d*'eGx*).",[12,3094,3095],{},[94,3096],{"alt":3097,"src":3098},"Logo","\u002FXINX\u002Fxinx-editeur-de-feuille-de-style\u002Flogo_nokia_qt.png",[12,3100,3101,3102,3105,3106,803,3108,3110,3111,3114,3115,3117,3118,3121,3124],{},"Au niveau du choix du langage, a contrario des autres applications\n",[101,3103,3104],{},"Generix"," écritent en ",[30,3107,433],{},[101,3109,24],{}," a été programmé en ",[30,3112,3113],{},"C++",". Le\nframework ",[30,3116,51],{}," de la société ",[2370,3119,3120],{},"Trolltech",[101,3122,3123],{},"Nokia"," a été\nchoisis pour simplifier la programmation. Pourquoi ce choix de langage :",[59,3126,3127,3135,3148],{},[62,3128,3129,3131,3132,3134],{},[101,3130,24],{}," est une application écrite sur mon temps libre, j'ai donc\nchoisis un langage que je souhaité apprendre. En faite la raison de\nl'existence de ",[101,3133,24],{},", et la volonté d'apprendre à utiliser ce\nframework.",[62,3136,3137,3138,3140,3141,3144,3145,376],{},"Le framework ",[30,3139,51],{}," est utilisé par l'environnement de bureau ",[101,3142,3143],{},"KDE",".\nCet environnement de bureau est celui que j'utilise tous les jours,\npendant mon temps libre (chez moi), sous ",[101,3146,3147],{},"Gnu\u002FLinux",[62,3149,3150,3151,3153,3154,2208,3156,376],{},"La version 4 de ce framework est utilisable sous ",[101,3152,607],{},",\nsans payer de licence, dans le cadre de l'écriture d'un logiciel\nlibre (au bureau tout nos poste sont sous ",[101,3155,607],{},[403,3157,3158],{},[19,3159,3163],{"href":3160,"ariaDescribedBy":3161,"dataFootnoteRef":296,"id":3162},"#user-content-fn-4",[409],"user-content-fnref-4","4",[54,3165,3167],{"id":3166},"architecture","Architecture",[12,3169,3170],{},[94,3171],{"alt":3167,"src":3172},"\u002FXINX\u002Fxinx-editeur-de-feuille-de-style\u002FarchiXINX.png",[12,3174,3175,3177],{},[101,3176,24],{}," est décomposé en plusieurs parties :",[59,3179,3180,3183,3186,3206,3209,3215,3229],{},[62,3181,3182],{},"la librairie de composant (contenant un gestionnaire de plugin en\nQt, un combobox pour choisir une couleur, une liste de valeur avec\nles boutons pour ajouter ou supprimer des éléments, une barre\nd'édition pour faciliter l'édition de dossier)",[62,3184,3185],{},"la librairie principale (externalisant ce qui peut être nécessaire\naux plugins).",[62,3187,3188,3189,3191,3192],{},"une série de plugin permettant, dans ",[101,3190,24],{}," de",[59,3193,3194,3197,3200,3203],{},[62,3195,3196],{},"gérer CVS",[62,3198,3199],{},"gérer SubVersion",[62,3201,3202],{},"gérer les extentions XSL, JS, XML, HTML",[62,3204,3205],{},"gérer les WebServices",[62,3207,3208],{},"l'application elle-même",[62,3210,3211,3212,3214],{},"une application de migration de projet (pour migrer les fichiers\nprojets ",[101,3213,24],{}," quand ces derniers changent)",[62,3216,3217,3218,3221,2208],{},"une librairie gérant l'éditeur de code (l'éditeur utilisé pour la\nprochaine version est ",[19,3219,1002],{"href":1000,"rel":3220},[23],[403,3222,3223],{},[19,3224,3228],{"href":3225,"ariaDescribedBy":3226,"dataFootnoteRef":296,"id":3227},"#user-content-fn-5",[409],"user-content-fnref-5","5",[62,3230,3231,3232],{},"les librairies du framework ",[30,3233,51],{},[12,3235,3236,3237,3242,3243,3248,3249,3254],{},"Vous pouvez une documentation sur l'écriture de ",[19,3238,3241],{"href":3239,"rel":3240},"http:\u002F\u002Fxinx.shadoware.org\u002Fwiki\u002FXinxPlugins",[23],"plugins"," sur le site\nde ",[101,3244,3245],{},[19,3246,24],{"href":563,"rel":3247},[23]," ainsi qu'une documentation au format ",[19,3250,3253],{"href":3251,"rel":3252},"http:\u002F\u002Fxinx.shadoware.org\u002Fdoxygen\u002Fmain.html",[23],"Doxygen"," des\nlibrairies.",[970,3256,3258,3261],{"className":3257,"dataFootnotes":296},[973],[975,3259,979],{"className":3260,"id":409},[978],[981,3262,3263,3271,3282,3298,3312],{},[62,3264,3265,3267,3268],{"id":985},[101,3266,3034],{}," étant limité à la plateforme de Microsoft, et l'application ayant pris dés le début une mauvaise direction (orienté fichier de configuration plutôt que feuille de style) ",[19,3269,993],{"href":989,"ariaLabel":990,"className":3270,"dataFootnoteBackref":296},[992],[62,3272,3273,3275,3276,832,3279],{"id":996},[101,3274,3104],{}," est un éditeur de logiciel de gestion d'entreprise, dit ",[30,3277,3278],{},"ERP",[19,3280,993],{"href":1006,"ariaLabel":1007,"className":3281,"dataFootnoteBackref":296},[992],[62,3283,3285,3286,3289,3290,832,3293],{"id":3284},"user-content-fn-3","Un acronyme qui contient l'acronyme même, comme ",[101,3287,3288],{},"Gnu"," pour ",[30,3291,3292],{},"Gnu Is not Unix",[19,3294,993],{"href":3295,"ariaLabel":3296,"className":3297,"dataFootnoteBackref":296},"#user-content-fnref-3","Back to reference 3",[992],[62,3299,3301,3303,3304,3306,3307],{"id":3300},"user-content-fn-4",[101,3302,24],{}," est un logiciel libre non parce que je n'avais pas le choix dû à la double licence de la librairie ",[30,3305,51],{}," mais bien par choix personnelle de développer du logiciel libre sur mon temps personnel. ",[19,3308,993],{"href":3309,"ariaLabel":3310,"className":3311,"dataFootnoteBackref":296},"#user-content-fnref-4","Back to reference 4",[992],[62,3313,3315,3316],{"id":3314},"user-content-fn-5","QCodeEdit est un éditeur de code écrit pour Qt. Il est très performant, et possède beaucoup de fonctionnalité utile. ",[19,3317,993],{"href":3318,"ariaLabel":3319,"className":3320,"dataFootnoteBackref":296},"#user-content-fnref-5","Back to reference 5",[992],{"title":296,"searchDepth":297,"depth":297,"links":3322},[3323,3324,3325],{"id":3025,"depth":300,"text":3026},{"id":3166,"depth":300,"text":3167},{"id":409,"depth":297,"text":979},"2009-02-18",{"type":9,"value":3328},[3329,3331,3337,3339],[12,3330,1071],{},[12,3332,3007,3333,3010,3335,3013],{},[101,3334,24],{},[101,3336,24],{},[12,3338,3016],{},[12,3340,3341],{},[94,3342],{"alt":3021,"src":3022},{},"\u002Fpost\u002Fxinx-editeur-de-feuille-de-style",{"title":3000,"description":1071},"xinx-editeur-de-feuille-de-style","posts\u002FXINX\u002F2009-02-18-xinx-editeur-de-feuille-de-style",[305,339,340,341],"zpIhRB-KvKQE1lDggeBl1D-gfvOgwt-duiaJNbpQxj4",1777849588121]