• Aucun résultat trouvé

PolyDoc : un exemple d’application XML pour la création personnalisée de polycopiés

N/A
N/A
Protected

Academic year: 2022

Partager "PolyDoc : un exemple d’application XML pour la création personnalisée de polycopiés"

Copied!
25
0
0

Texte intégral

(1)

Cahiers

enberg

GUT GUT GUT

m POLYDOC : UN EXEMPLE D’APPLICATION XML POUR LA CRÉATION PERSONNALISÉE DE POLYCOPIÉS

P Michel Cubero-Castan

Cahiers GUTenberg, n  35-36 (2000), p. 133-155.

<http://cahiers.gutenberg.eu.org/fitem?id=CG_2000___35-36_133_0>

© Association GUTenberg, 2000, tous droits réservés.

L’accès aux articles des Cahiers GUTenberg (http://cahiers.gutenberg.eu.org/),

implique l’accord avec les conditions générales

d’utilisation (http://cahiers.gutenberg.eu.org/legal.html).

Toute utilisation commerciale ou impression systématique

est constitutive d’une infraction pénale. Toute copie ou impression

de ce fichier doit contenir la présente mention de copyright.

(2)
(3)

PolyDoc : un exemple d'application

XML pour la création personnalisée de

polycopiés

MichelCubero-Castan

InstitutNationaldesSciences Appliquées deToulouse

Départementde Génie Electrique etInformatique

Michel.Cubero-Castan@insa-tlse.fr

Résumé

LeDocumentObjectModel(DOM)deW3Cestunenormequispé-

cieuneAPIpermettantd'eectuerdesopérationsdecréation,demodi-

cationoudeconsultationdesélémentsd'undocumentXMLreprésenté

sous forme arborescente. Des implémentations du DOM existent pour

diverslangages deprogrammation,enparticulierJava.

CetarticleprésentePolyDoc,uneapplicationJavabaséesurleDOM,

et permettant la traduction d'un document XML vers HTML, L A

T

E X,

Opene-Book,...ouencoreXML(maisavecuneDTDdiérente).Atra-

versPolyDoc,nousdécrivonsunprocessus deproduction dedocuments

suivanttroisétapes:

écritureducontenudansleformatXML,

miseenformeglobalepersonnaliséeenJava,

productiondurésultatviaHTML,L A

T

E X,...

A titred'exemple, un documenttype,lachedeprogrammation,est traitéede

manièredétaillée.

1. Introduction

Souvent,lorsqu'un enseignantala charged'un cours,il est amenéàpréparer

uncertainnombrededocumentsliésàcetenseignement.Lepremierpeutêtre

unechedescriptiveducourscontenantparexemplelesobjectifsdel'enseigne-

ment,le plan détaillé, lenombrede séancesouencoredes référencesversdes

ouvragesoudesressourcesliésàcetenseignement.Ledeuxièmedocumentpeut

être un polycopié du cours dont le plan est justement celui présenté dans la

chedescriptive.Ace polycopié,nouspourrionsajouterunrecueil d'exercices

(4)

tiques. Enn, l'enseignantpeutcréer destransparentspour illustreruncours

magistral.

Quelsoutils utiliserpourlaréalisationdeces documents?Avant derépondre

à cette question, essayons d'examiner quelles seraient les fonctionnalités de

l'outil idéal. Lanotiond'idéal est icipersonnelle, elleest directementliéeaux

habitudes del'utilisateur.Pourl'auteurdecetarticle,voiciquelqueséléments

qu'iljugesinonnécessaires,dumoinspratiques:

séparationentre contenuet forme

partagedefragment

plusieursformatsdesortie

plusieursformatsd'entrée

personnalisation

Examinonsmaintenantces diérentspoints.

1.1. Séparation entre contenu et forme

Les utilisateursdeL A

T

E

X nenouscontredirontpas,lorsqu'onrédige undocu-

ment, ilest préférabledes'intéresser toutd'abordaucontenuavantlaforme.

D'autant plusque laforme, c'est à direla présentation durésultat, peut dé-

pendredusupportutilisé.Beaucoupdesystèmesutilisentcette approche,par

exempleparlebiaisdefeuilles destyle.

1.2. Partage de fragment

Lorsqu'onrédigeplusieursdocumentspourunmêmeenseignement,onestsou-

ventamenéàutiliserdesfragmentsd'undocumentdansunautre.Parexemple,

untransparentpourraconteniruneformulemathématique déjàprésente dans

le polycopié. Lasolution ducopier-coller, quoiquetrès simple, est loin d'être

satisfaisante : silaformule initialedoitêtre modiée, ondoitreporter lamo-

dicationdanstouslesdocumentscontenantcetteformule.Uneautresolution

estl'insertiondechier:lefragmentpartagésetrouveradansunchierséparé

qui sera inséré dans les diérents documents par une commande d'insertion.

En généralune tellecommande,sielleexiste,est globaleauniveauduchier,

c'est àdirequ'ilnepeutyavoirquel'insertionducontenu completduchier

etnonunfragment.Pourproterdecettefonctionnalité,onpeutêtreconduit

àavoirunemultitude depetitschiers,cequi n'estguèrefacileàgérer.

Danscertainscas,l'approche"unchierparfragment"n'estpaspossible.Ainsi,

dansuncoursdeprogrammation,onpeutêtreamenéàincluredanslepolyco-

pié,unepetitepartiedeprogrammepourillustrerteloutelpoint.Engénéral,

(5)

procédure répartie sur plusieurschiers. Cettediculté conduit àinsérerdu

textedanslaprogrammation,commeonlefaitdanslaprogrammationlittérale,

plutôtquel'inverse.

1.3. Plusieurs formats de sortie

Jusqu'àces dernièresannées,touslesdocuments utilisaient lepapierou assi-

milé(transparent)commesupport.L'outilL A

T

E

Xest alorsunexcellentmoyen

pourobtenirdesdocuments orantune qualité typographique dignedes pro-

fessionnelsdel'édition.

L'arrivée de nouvelles technologies (NT) amène l'enseignant à diversier les

supportsdesdocuments.Lepolycopiéseprésenterasouslaformed'uneliasse

defeuilles de papiermais aussisousforme d'unchierau formatPDF ouau

formatOpene-Bookdestinéàêtreconsultéviaunlivreélectronique.Ilenest

de même pour le recueil d'exercices. Le recueil de travaux pratiques pourra

seretrouverauformatHTML demanièreàorir, lorsdesaconsultation,les

avantages de l'hypertexte pour l'accès aux divers documents annexes qui ne

seraientaccessiblesquevialeréseau.La chedescriptiveducourspeutaussi

utiliserceformatpourautorisersaconsultationàpartird'internet.Al'ancien

transparent,nouspourronsluipréférerlarétroprojectiond'écrand'ordinateur

pourapporterplusdedynamiquedanslecours.

1.4. Plusieurs formats d'entrée

Lesnouveaux supports d'informationdeviennent deplus enplusmultimédia.

Il faut donc pouvoir intégreraisément ces médias dans le document source.

On doit pouvoirinsérerpar exemple une animationgraphique, une séquence

sonoreouvidéo,ouencoreinclureuneappliquette java.

Sansallerjusqu'aumultimédia,unesimpleillustrationdansuntextedoitpou-

voirprovenirdeplusieurssourcesdiérentessansavoiràeectuermanuellement

lesconversions nécessaires pour telou telsupport de sortie. Par exemple,on

peut produire telle illustration avec le logiciel de dessin xg et telle autre à

partirdecode PSTricksparexemple.Commepourlepartagede fragmentde

document,l'utilisateurnedoitmanipulerqu'unseulchier,lasourcedel'illus-

tration.Ilnedoitpasêtreobligédesauvegarderexplicitementsonillustration

auformatepspourêtretraitéparL A

T

E

X ,ouauformatpngpourêtrevisualisé

(6)

1.5. Personnalisation

Enn,ledernierpointetnonlemoindreatraitàlapersonnalisationdelapré-

sentationdurésultat.C'estuneaairedegoût.Chacundoitpouvoirprésenter

unrésultatsuivantsa personnalité.Un outildeproductiondedocumentsdoit

doncêtrefacilementmalléabledecepointdevue.

2. L'approche L A

T

E X

Est-ce que L A

T

E

X correspond à l'outil idéal? Examinons chacun des points

énumérésci-dessus.

2.1. Séparation entre contenu et forme

Leprincipedemacropermetàl'utilisateurdeL A

T

E

Xdes'intéresseraucontenu

avantlaforme.Letraitementdelaprésentationestreléguéàlaprogrammation

desmacrosutilisables.C'estdoncunbonpointpourL A

T

E X.

2.2. Partage de fragment

L A

T

E

X permet l'inclusion de chier dans un document grâce à la commande

\input{filename}.Cependant,l'inclusionconcerneunchiercompletet non

pas un fragment. C'est une manière de découpage de chier volumineux en

petitschiersplutôtqu'unpartagedefragment.

Pourcertainscasparticuliers,parexemplel'insertiondelisting,ilestpossible

desélectionneretd'insérerunfragmentdechierenindiquantlenumérodela

premièreligneàinsérer,ainsiquelenumérodeladernière.C'estuneméthode

quipossèdeledéfautdel'adressageabsolue:silechiercontenantlefragmentà

incluresetrouvemodié,parexempleenrajoutantunenouvelleligneaudébut

duchier,il fautmodier lesadressesde lignedanslacommanded'insertion.

Biensûr,ilestpossibledecréeruneextensiondeL A

T

E

Xréalisantcetraitement

d'insertion,maisce typedeprogrammationrelèveduT

E Xpert.

2.3. Plusieurs formats de sortie

L'utilisateurdeT

E X/L

A

T

E

Xdisposedéjàd'unepanopliedelogicielspermettant

deproduireledocumentsurdessupportsdiérentsdusupportpapier.Onpeut

ainsiutiliser, soitlatex2htmlpourlaproductiondechiersauformatHTML,

(7)

dicile(sinon trèsdicile)d'obtenir, avecces outils,unrésultatpersonnalisé

auniveaudelavisualisation dudocumentnal.

2.4. Plusieurs formats d'entrée

L A

T

E

X est principalementdédié à lapublication surpapier. Iln'est pasques-

tionicid'incluredesélémentsissusd'autresmédia.Seulsdesélémentsdetype

imagepeuventêtreutilisés.Leproblèmeicivientduformat,principalementdu

PostScriptEncapsulé (EPS),qui oblige àcréerexplicitementdes sauvegardes

de dessin sous ce format. Ici aussi, il est possible de créer une extension de

L A

T

E

X réalisantautomatiquement une telle conversion,mais, encore une fois,

celarelèveduT

E X pert.

2.5. Personnalisation

L A

T

E

X permet une personnalisation de l'apparence du résultat relativement

simple,grâceàunemultituded'extensionsdisponibles.Lemanquesefaitsentir

dèsquel'onutilisedesoutilscomplexestelsquelatex2html.

3. L'approche XML

SGML apporte une première solution à tous ces problèmes. Par la création

de nouvelles balises, il est possible de faire cohabiter, dans le même chier

source, diérents médias. De plus, il existe beaucoup d'outils permettant le

traitementdechierSGMLpourobtenirdiérentsformatssupports.Onpeut

ainsicitersgml2latex,sgml2html,sgml2text,etc.Cependant,souventcesoutils

travaillent sur des documents respectantune DTD unique sevoulant laplus

générale possible,et qui, par voie de conséquence, devient complexe. Il sut

d'examinerlaDTD deDocBook pours'enrendrecompte.

En général,pourla rédactiondesdocuments liésàun cours,l'enseignantn'a

pasbesoind'utiliserunlargeéventaildebalises,niuneDTDtropgénérale.Ce

qu'illui faut, c'est plutôt une DTD adaptée àsontexte, avec, peut-être, des

balisesspéciques.

LanormeXMLoreunesolutiontrèssatisfaisantepourcetypedetraitement.

Par son langage de balises extensible, il est possible de prendre en compte

tout type d'élément dans un document. Grâce aux feuilles de style XSL, la

traductionsimpleversd'autresformats(L A

T

E

X,HTML)est facile.L'interface

DOMpermet une manipulation pluscomplexe du documentau moyend'une

(8)

HTMLàlavolée,sil'onsouhaiteproduiredespagesenfonctiondunavigateur

utilisépourlavisualisation.

3.1. Séparation entre contenu et forme

Comme SGML, XML est unlangage de balisage.Un documentXML corres-

pondàuncontenustructurépardesbalisesassimilablesdecefaitauxmacros

de L A

T

E

X. Ilyaune parfaite séparationentrecontenuet formepuisque cette

dernièrene seradénie que parl'applicationqui traitera ledocument XML :

soituneapplicationC++ouJavaquitransformeralecontenupourluidonner

une forme grâceàl'interfaceDOM,soit une feuillede styleXSL qui fournira

lesrèglesdetransformationàappliquersurledocumentXML.

3.2. Partage de fragment

Outrel'inclusionclassiquedechiergrâceauxentitésexternes,lelangageXML

peut être enrichi d'objets de type lien (XLink) permettant, entre autres, un

partagedefragmententrechiersXML.Encoreenstadededéveloppement,il

n'existepasencoredemoteursXLinksusammentstables.Onpeuttoutefois,

via laprogrammationJavaet l'interfaceDOM, réaliserunsous ensemble des

fonctionnalitésdulienXML.

3.3. Plusieurs formats de sortie

Dufaitdelaséparationentrecontenuetforme,iln'yapasderestrictionsurles

formatsdesortiepossiblespourunmêmedocumentXML.Larecommandation

décrivantlelangagedesfeuilles de styleXSLpropose unformatintermédaire

dedescriptiondesortie:fo.Déjàdesconvertisseursdeceformatversd'autres

formatscommencentàapparaitre(parexempledefoversPDF).

3.4. Plusieurs formats d'entrée

LadénitiondulangageXMLaétéorientée,dèsledépart,pourorirunformat

d'échange de données de tout types. Par le biais des balises, on peut donc

inclure, dans un chier XML, tout type de donnée. C'est l'applicationXML

qui serachargéededirigertelle outelledonnéeversleprogrammepouvantla

(9)

3.5. Personnalisation

Unepersonnalisationdel'apparencequel'onveutdonneraurésultatpourrase

faireparl'écritured'applicationsspéciquesoudefeuillesdestylespéciques.

4. L'outil PolyDoc

L'outilPolyDocestunprogrammeJavachargédetraduireundocumentXML

soitversL A

T

E

XsoitversHTML.LechoixdeJavavientdesamodularitéetsur-

toutdesaportabilité.AjouterdenouvellesbalisesdanslaDTD dudocument

est une opération très simple. Dufait de lamodularitéde la programmation

Java,ilestpresqueaussifacilederajouterlesméthodesdetraductionassociées

àune nouvellebalise.

4.1. Un exemplede document : la che de programmation

Pourdécrirelescapacitésdel'approchePolyDoc,regardonscommentcréeret

traiteruntypededocumentsimple:lachedeprogrammation.

Lachedeprogrammationestundocumentdécrivantlaprogrammationd'un

problèmedonné. C'est un document nenécessitantpas une présentation très

élaborée;laDTDutiliséeseratrèssimple.

4.1.1. La DTD dela che deProgrammation

Unechedeprogrammationseracontituéede5élémentsdepremierniveau:

titre sanscommentaire!

auteur l'auteur de la che. Cet élément sera lui-même constitué de 4sous

élémentsindiquantrespectivementsonnom,sonprénom,sonadresseélec-

tronique,et l'adressedesapagepersonnellesur internet.

date ladatedemiseàjourdelache,constituéede3souséléments:lejour,

lemoiset l'année.

problème ladescriptiondu problèmeposé, organiséeen une suitede para-

graphes.

solution la solution du problème organisée en suite de paragraphes et de

sections, une section correspondant ici à une étape clé dans le proces-

sus de programmation. La section comprendra un titre et une suite de

paragraphes.Iln'y aurapasd'autressubdivisions.

(10)

<?xml version="1.0" encoding="ISO-8859-1"?>

<!ELEMENT ficheProg (titre, auteur, date, problème, solution)>

<!ELEMENT titre (#PCDATA)>

<!ELEMENT auteur (nom, prénom, mél, siteweb)>

<!ELEMENT nom (#PCDATA)>

<!ELEMENT prénom (#PCDATA)>

<!ELEMENT mél (#PCDATA)>

<!ELEMENT siteweb (#PCDATA)>

<!ELEMENT date (jour, mois, an)>

<!ELEMENT jour (#PCDATA)>

<!ELEMENT mois (#PCDATA)>

<!ELEMENT an (#PCDATA)>

<!ELEMENT problème (p*)>

<!ELEMENT solution (p*, sect*)>

<!ELEMENT sect (titreSect, p*)>

<!ELEMENT titreSect (#PCDATA)>

...

Parmi les éléments disponibles, deux ont été rassemblés par l'entité interne

xlink:

...

<!ENTITY % xlink " insertionXML | insertionFichier ">

<!ELEMENT insertionXML EMPTY>

<!ATTLIST insertionXML show CDATA #FIXED "embed">

<!ATTLIST insertionXML actuate CDATA #FIXED "auto">

<!ATTLIST insertionXML xml:link CDATA #FIXED "simple">

<!ATTLIST insertionXML href CDATA #IMPLIED>

<!ATTLIST insertionXML inline CDATA #FIXED "true">

<!ATTLIST insertionXML idref CDATA #REQUIRED>

<!ATTLIST insertionXML id ID #IMPLIED>

<!ELEMENT insertionFichier EMPTY>

<!ATTLIST insertionFichier src CDATA #REQUIRED>

<!ATTLIST insertionFichier début CDATA #IMPLIED>

<!ATTLIST insertionFichier fin CDATA #IMPLIED>

<!ATTLIST insertionFichier id ID #IMPLIED>

(11)

Lenomdel'entité,xlink,aétéchoisipourrappelerlespointeursXMLproposés

par le consortium w3. Ce ne sont pas de véritables pointeurs XML, ceux-ci

n'étantpasactuellementsupportésparlesoutilsutilisables.

Lepremier,insertionXML,correspondàunpointeurXMLtrès limité;parmi

toussesattributs,seulslesattributshrefetidrefsontutilisésparPolyDoc.

Lesautres sontlàpourpouvoirêtre utiliséspardesmoteursXLINK, lorsque

cesderniersserontdisponibles. Lefonctionnementdecet élémentest simple:

après la lecture d'un document, PolyDocremplace tous les éléments de nom

insertionXMLparl'élémentcontenu danslechierréférencéparlavaleurde

l'attributhref,et possédantunidenticateurdontlenomestceluicorrespon-

dant à la valeur de l'attribut idref. Si l'attribut href n'est pas présent, le

documentréférencéest luimême.

L'élémentinsertionFichierpermetd'insérernonpasdesélémentsXMLmais

de simples données (PCDATA : Parsed Character Data) issues d'un chier

texte(ici,unprogrammesourcejava). L'attributsrcindiquelechiersource

duquelcesdonnéesvontêtreextraites.Lesattributsdébutetfinindiquentles

marquesdélimitantlazoneàextraire(sil'attributdébutestinexistant,ledébut

delazoneestledébutduchier;l'attributfinaunfonctionnementanalogue).

Lamarquecorrespondàlachaînedecaractèresdélimitéepar"/*marque="et

"*/".

Lesélémentsrestantàdécriresontceuxcorrespondantauxparagraphesetaux

élémentscontenusdanslesparagraphes.Touscesélémentssontrassemblésdans

l'entitéinterne texteFormaté.Ils possèdenttousunattribut IDdemanièreà

pouvoirêtreréférencésparunlienXML.

...

<!ENTITY % texteFormaté "p | em | latex | java | %xlink; ">

...

L'élémentsuivantpermetdedélimiterunparagraphe:

...

<!ELEMENT p (#PCDATA | %texteFormaté; )* >

<!ATTLIST p position (centrée|aligné) "aligné">

<!ATTLIST p id ID #IMPLIED>

...

Leparagraphepeut contenirtout élémentindiqué parl'entitéinterne texte-

Formaté.L'attributpositionpermetdechoisirentreunparagraphecentréou

unparagraphealigné.

(12)

L'élémentempermet unformatagedetexte:

...

<!ELEMENT em (#PCDATA | %texteFormaté; )*>

<!ATTLIST em format (italique|gras|tty) 'italique'>

<!ATTLIST em id ID #IMPLIED>

...

L'attribut formatpermet dechoisirentre dutexte italique, grasouavec des

caractèrestélétype.

Les deux derniersélémentspermettent d'insérer dans le code XML, du code

L A

T

E

X ouducodeJava:

...

<!ELEMENT latex (#PCDATA)>

<!ATTLIST latex xml:space (default|preserve) 'preserve'>

<!ATTLIST latex id ID #IMPLIED>

<!ELEMENT java (#PCDATA|insertionFichier)*>

<!ATTLIST java xml:space (default|preserve) 'preserve'>

<!ATTLIST java id ID #IMPLIED>

4.1.2. Uneche de programmation XML

RegardonsàprésentcommentonpeutcréerledocumentXMLàpartirdecette

DTD.Nousavonschoisi,commeexempledeche,leproblèmedelarésolution

d'uneéquation duseconddegrédans l'espaceR. Laversionpapierdelache

est donnée en annexe, une versionen ligneest accessibleàl'adresse http :-

//wwwdgei.insa-tlse.fr/~castan/GUT2000.Examinons les aspects intéres-

santsdesarédaction.

Lesujet commenceparlalignesuivante :

Soitl'équationax 2

+bx+c=0.

Onconstatequ'ellecontientuneprésentationdignedecenompourl'équation

duseconddegré.LaDTD n'orantpaslespossibilitésd'écritured'expressions

mathématiques de MathML, nous devons passer par le biais de L A

T

E X pour

obteniruneprésentationcorrecte.Ledocumentseradoncrédigédelamanière

suivante :

(13)

Soit l'équation

<latex id="ax2-bx-c">$a\times x^2 + b \times x + c = 0$</latex>.

</p><p>

Ecrire un programme <em format="gras">Java</em> permettant sa

résolution dans R.

...

L'élémentlatexci-dessus contient unattribut id devaleur "ax2-bx-c".Cet

identicateur nous permettra d'utiliser,dans lasuite de lache, un élément

insertionXMLquiseraremplacéparl'élémentlatex.C'estcequiapparaitau

débutdelapartiesolutiondudocumentXML:

...

<solution>

<p position="centrée"><insertionXML idref="ax2-bx-c"/></p>

<sect>

<titreSect>Utilisation du programme</titreSect>

<p>Le programme que l'on va obtenir aura pour nom

...

Ennledocumentcontientdesextraitsd'un programmejava.Ce programme

estentièrementcontenudanslechierracine.java.Onvapouvoirrécupérer

des extraits de ce chier grâce à l'élément insertionFichier.Parexemple,

pour inclure un fragment du chier java, la deuxième section du document

contientlecodeXML suivant:

...

suivante (il convient de vérifier à ce niveau la validité des

coefficients, soit a#0).

<java> ...

<insertionFichier src="racine.java" début="etape1"

fin="etape2"/>

...

</java>

...

Lechiersourceracine.javadoitalorscontenir:

...

System.exit(0);

}

/*marque=etape1*/

(14)

double a = Float.valueOf(args[0]).doubleValue();

double b = Float.valueOf(args[1]).doubleValue();

double c = Float.valueOf(args[2]).doubleValue();

if (a==0.0) {

System.out.println("a doit etre non nul");

} else {

/* resolution dans R */

/*marque=etape2*/ double delta = b*b - 4.*a*c;

...

On peut remarquer que les commentaires relatifs aux marques sont éliminés

danslechier résultat,que cesmarques soientcellesrecherchées ounon!

4.2. Prise en compte d'une nouvelle DTD

Lasection4.1précédenteamontrécommentcommentcréeruneDTDetundo-

cumentrespectantlastructuredecetteDTD.Ilresteàexaminer,maintenant,

commentprogrammer enJava,lesméthodes et classesqui vontpermettre de

traiter de tels documents pour produire diérentsformats de sortie (HTML,

L A

T

E

X ouautre).

4.2.1. Organisation générale

Le traitement, par PolyDoc, d'un document décrit par la DTD de nom DTD

pourune production dedocumentdansun formatdenom FORMATest réalisé

parlaclassePolyDoc.DTD.FORMAT.Ainsi,pournotreexemple,nousavons

dûécrireuneclassePolyDoc.cheProg.HTMLpourproduirelaversionenligne,

et uneclassePolyDoc.cheProg.Latexpourproduirelaversionpapier:

package PolyDoc.ficheProg;

public class HTML {

org.w3c.dom.Document docXML;

...

public HTML (String nomFichierXML,

String répertoireDestination,

boolean traitementDessin) {

(15)

}

public void traitement() {

...

}

...

}

package PolyDoc.ficheProg;

public class Latex {

org.w3c.dom.Document docXML;

...

public Latex (String nomFichierXML,

String répertoireDestination,

boolean traitementDessin) {

...

}

public void traitement() {

...

}

...

}

Leconstructeurdechaqueclasseestdéniavectrois paramètres:

nomFichierXML: donne lenom duchier XML contenantle document

sourcepourceformat.Eneet,bienquelapartieXMLestcommunepour

touslesformats,lapartiedéclarationdelaDTDpeutêtrediérente(par

exemple,lecaractèreseradénipourleformatHTMLparl'entité

<!ENTITY micro "&amp;#181;">

et pourleformatLatexparl'entité

<!ENTITY micro "<latex>$\mu$</latex>">

répertoireDestination:donnelerépertoiredanslequelleouleschiers

produitsserontcréés,

traitementDessin: indique si les diérentes images contenues dans le

chiersource doivent être produites ounon (ainsi, dans notre exemple,

cela permet d'éviter de créer les images qui correspondent à des équa-

tionsécritesenL A

T

E

X,àchaquetraitementduchierXML,demanièreà

obteniruntraitement,certeincomplet,maisplusrapide,lorsdelaphase

(16)

Un des traitements réalisés par le constructeur est la création de l'objet

docXMLconstruitàpartird'uneplateformeXML(plusieurssontdisponibles,

voir http : //www.w3.org/XML). Cet objet possède une hiérarchie arbores-

centeoùlesnoeudssontlesbalisesXML,et lesfeuilles,lesdonnéestextuelles

dudocument.

4.2.2. Méthode traitement()

La méthode public void traitement()permet la génération du ou des -

chiersrésultatsàpartirdel'objetdocXML.Parexemple,danslecasdelaclasse

PolyDoc.ficheProg.Latex,nouspourrionsavoir:

public void traitement() {

try {

String nomFichLatex =

(new File(nomFichierXML)).getName();

nomFichLatex =

nomFichLatex.substring

(0, nomFichLatex.indexOf("."));

File fichierLatex = new File(répertoireDestination,

nomFichLatex+".tex");

FileOutputStream strFich =

new FileOutputStream(fichierLatex);

WriterLatex out =

new WriterLatex(new DataOutputStream(strFich));

// Génération de l'en-tête du fichier

// Génération de la partie Problème

// Génération de la partie Solution

// Génération de la fin du fichier latex

out.close();

strFich.close();

System.out.println("Terminé");

} catch (Exception e) {

System.err.println("Problème durant la création "+

(17)

}

}

Laclasse WriterLatexest une sous-classede java.io.PrintWriterrassem-

blantdesméthodesd'usage général,commelagénérationde l'en-têted'un -

chierL A

T

E

X,pourrendrelaprogrammationpluslisible.Entreautre,cetteclasse

redénirala méthodepublic void print(String str) dejava.io.Print-

Writerdemanièreàeectuerdestransformationsdescaractèrespouvantêtre

interprétéscommedescommandesL A

T

E

X, parexemple:

'~'doitêtreremplacépar"\\verb+~+"

'$'doitêtreremplacépar"\\$"

...

UneautreméthodeWriterLatex.printLatex(String str)permettrajuste-

mentd'évitercettetransformationlorsdelaproductiondetextecontenantdes

commandesL A

T

E X .

ExaminonsmaintenantcommentprogrammerunepartiedelaméthodePoly-

Doc.ficheProg.Latex.traitement, par exemple celle qui produit la partie

solution,partiecontenantdessections:

// Génération de la partie Solution

Element racine = docXML.getDocumentElement();

Node nodeSolution = racine.getFirstChild()

.getNextSibling()

.getNextSibling()

.getNextSibling()

.getNextSibling();

printTexteFormaté(nodeSolution.getFirstChild(),

out);

NodeList lstSect =

((Element) nodeSolution)

.getElementsByTagName("sect");

for (int noSect=0; noSect&lt;

lstSect.getLength();

noSect++) {

Node noeudSection = lstSect.item(noSect);

out.println();

out.printLatex("\\section{");

out.print(noeudSection.getFirstChild()

.getFirstChild()

(18)

out.printlnLatex("}");

printTexteFormaté(

noeudSection.getFirstChild()

.getNextSibling(),

out);

out.println();

}

La méthode getDocumentElement(),méthode standard de l'interface DOM,

permet d'obtenir la racine de l'arbre du document (c'est à dire, ici, l'élé-

mentficheProg).LesméthodesgetFirstChild()etgetNextSibling()per-

mettentd'obtenirrespectivement,lepremierélémentd'unnoeuddel'arbreet

l'élémentsuivantdemêmeniveau.Ainsi,ilestfaciled'atteindrelenoeuddela

partie solutionàpartirdelaracine,grâceàcesdeuxméthodes.

L'accès aux diérentes sections se fait àpartir de laméthode getElements-

ByTagName(String tag)qui renvoie unelistede noeudscorrespondantàdes

éléments dont le nom est donné en paramètre à la méthode. getLength()

permet alors de connaître le nombre de noeuds dans cette liste, tandis que

item(int i)permet d'obtenirlei e

noeuddelaliste.

LatransformationdugrapheencodeL A

T

E

Xestalorssimple.Elleutiliselamé-

thode printTexteFormaté(Node nd, WriterLatex out) qui traite une suc-

cessiondeparagraphes,validéeparlaDTD.RegardonslecodageJavadecette

méthode:

public void printTexteFormaté(Node nd, WriterLatex out) {

switch (nd.getNodeType()) {

case Node.CDATA_SECTION_NODE :

out.println(nd.getNodeValue());

break;

case Node.TEXT_NODE :

out.print(nd.getNodeValue());

break;

case Node.ELEMENT_NODE :

String tag = ((Element) nd).getTagName();

try {

Class[] paramètresFormels = {

Class.forName("org.w3c.dom.Element"),

Class.forName("PolyDoc.ficheProg.WriterLatex")

};

Object méthode = getClass().getMethod(

(19)

paramètresFormels);

Object[] arguments = new Object[2];

arguments[0] = nd;

arguments[1] = out;

((java.lang.reflect.Method) méthode)

.invoke(this, arguments);

} catch(Exception e) {

if (tag.equals("sect")) break;

System.out.println("Tag inconnu : "+tag);

}

}

}

Lefonctionnementdecetteméthodeestplussimplequ'iln'yparait.Unnoeud

del'arborescenceestpasséenparamètre.Sicenoeudcorrespondàunedonnée

textuelle (noeud texte ou noeud CDATA), on envoie, grâce à l'instance de

WriterLatex passée en second paramètre, le texte associée sur le chier en

coursde création.Sinon,si ce noeudest unnoeud élément,on faitappelàla

méthodedontlenomestlenomdel'élémentpréxéparlachaîne"TAG_"et

dontlesparamètressontlesmêmesqueceuxdeprintTexteFormaté.Si cette

méthoden'existepas,c'estquenousavonsatteintland'unesection(enfait

lenoeudsectionsuivant).Letraitements'arrêtealorsnormalement.

Examinons maintenant quelques unes des méthodes préxées par la chaîne

"TAG_".

4.2.3. Traitement des éléments

Lapremièreméthodequel'onvatraiterestcelle associéeàlabalisejava:

public void TAG_java(Element nd, WriterLatex out) {

out.printlnLatex("\\nopagebreak\n");

out.printlnLatex("\\begin{lstlisting}{}");

printTexteFormatéLatex(nd.getFirstChild(), out);

out.println();

out.printlnLatex("\\end{lstlisting} ");

}

Son travail est de générer le début et la n du code contenu dans la balise

(onutilise ici l'extension L A

T

E

Xlstlisting. Lasuite dutravailsera faitpar

les éléments contenus dans l'élément java grâce à la méthode printTexte-

FormatéLatex(cetteméthodeestdiérentedelaméthodeprintTexteFormaté

(20)

Examinons maintenant l'élément em qui, par rapport à l'élément précédent,

possèdeunattribut:

public void TAG_em(Element nd, WriterLatex out) {

String format = nd.getAttribute("format");

if (format.equals("italique"))

out.printLatex("{\\itshape ");

else if (format.equals("tty"))

out.printLatex("{\\ttfamily ");

else out.printLatex("{\\bfseries ");

printTexteFormaté(nd.getFirstChild(), out);

out.printLatex("}");

}

L'acquisition de la valeur de l'attribut est possible via la méthode get-

Attribute (String nom)delaclasseorg.w3c.dom.Element.Lerestesepasse

decommentaires.

4.3. Un groupement de documents PolyDoc

Nous venonsde présenter unexemplede documenttraité parPolyDoc.Nous

avonsvu audébut de cet articlequ'en général,pourunenseignementdonné,

ondoitgénérerplusieursdocuments.Parexemple,aveccetarticle,nousavons

le résuméutilisé lorsde laphasede soumission, puisl'article lui-même,enn

l'exemplecomplet développé.

Comment regrouper tous ces documents? La solution que nous avonschoisi

dans PolyDocest d'yfaireréférencedansunautredocumentXMLgrâceàla

balisedocPolyDocsuivante :

<!ELEMENT docPolyDoc (description, format*)>

<!ATTLIST docPolyDoc id ID #REQUIRED>

<!ATTLIST docPolyDoc type CDATA #REQUIRED>

<!ELEMENT description (#PCDATA)>

<!ELEMENT format EMPTY>

<!ATTLIST format type CDATA #REQUIRED>

<!ATTLIST format src CDATA #REQUIRED>

<!ATTLIST format repDst CDATA #REQUIRED>

(21)

Un élémentdocPolyDocpermet d'identierundocument traitéparPolyDoc.

L'attribut id donne l'identicateur du document tandis que l'attribut type

indiqueletypededocument(article,polycopié,présentation,...).Cetélément

peutlui-mêmecontenirunouplusieursélémentsassociésàunformatdesortie

durésultat.Chaqueélémentformatdisposedetroisattributs:

type: letypedesortie(HTML,L A

T

E

X,fo,XML, ...)

src:lechemind'accèsauchierXMLdudocument,pourleformatdésiré

resDst:lerépertoirededestinationdeschiersproduits

Parexemple,ledocumentcorrespondantàl'exempleseradésignéparl'élément

suivant:

<docPolyDoc id="idExemple"

type="ficheProg">

<description>L'exemple de l'article</description>

<format type="HTML"

src="ProgEquationHTML.xml"

repDst="/home/castan/public_html/GUT2000doc/"/>

<format type="Latex"

src="ProgEquationLatex.xml"

repDst="Latex/"/>

</docPolyDoc>

UndocumentXMLcontenantcettebalisepourraitêtreceluiquipermettrade

générerla paged'accueil dugroupede documents sur le Web. Le traitement

d'unélémentdocPolyDocseraidentiqueautraitementdelabaliseurl,balise

permettantdecréerunlienhypertextesurledocument.

L'outil PolyDocutilisera ce document "paged'accueil" pour lancer letraite-

mentde teloutelélémentdocPolyDoc,soit via uneinterfacegraphique,soit

parlalignedecommandedelancementdel'application.Ainsi,lalignedecom-

mande suivante démarrera le traitement de l'exemple pour une sortie L A

T

E X

(GUT2000doc.xmlétantlechiercontenantdesbalisesdocPolyDoc,etenpar-

ticulier,uneayantidExemplepourvaleurdel'attributid):

java PolyDoc.Main GUT2000doc.xml idExemple latex

5. Conclusion

Nousavonsvoulu montrer, grâceà unexemplesimple, commentonpeut ex-

(22)

pourtraiterfacilementundocument,ensuivantunprocessusdeproductionen

3étapes:

écritureducontenudansleformatXML,

miseenformeglobalepersonnaliséeenJava,

productiondurésultatviaHTML, L A

T

E X,...

Une approchecommecelledePolyDocne rejettedoncpasl'énormecontribu-

tion de la communauté T

E X/L

A

T

E

X , mais peut correspondre àune évolution

naturelle commece futlecaspourL A

T

E

X visàvisdeT

E X.

Laversionen ligne decetarticleestaccessible àl'adresse

http ://wwwdgei.insa-tlse.fr/~castan/GUT2000doc/index.html

L'outil PolyDocestaccessible àl'adresse

http ://wwwdgei.insa-tlse.fr/~castan/PolyDoc/index.html

Des exemples de documentsgénérés avec PolyDoc sontaccessibles àl'adresse

http ://wwwdgei.insa-tlse.fr/~castan/Enseignements/index.html

(23)

Appendix

Résolution d'une équation du second degré

MichelCubero-Castan

c

Cubero-Castan

Soitl'équationax 2

+bx+c=0.EcrireunprogrammeJava permettant

sarésolutiondansR.

Rappel:lessolutionssontdonnéesparlaformule b

p

b 2

4ac

2a

(24)

Solution

ax 2

+bx+c=0

1. Utilisation du programme

Leprogrammequel'onvaobteniraurapournomracine.Lesvaleursdescoef-

cientsserontdonnéessurlalignedelancementduprogramme. Parexemple,

sionveutrésoudrel'équation x 2

7x+12:25=0

onutiliseralalignedecommande:

java racine 1 -7 +12.25

Onsecontenterad'écrireuneseuleméthode,laméthodemain.L'aspectgénéral

duprogrammeseradonc:

/

Programme permettant de resoudre dans R une equation du

second degre ax2+bx+c= 0 . <br>

Les coefficients a b et c sont donnes sur la ligne de

lancement du programme: ' java racine 3 1 5' pour la

resolution de 3x2+bx+5=0.

/

public class racine {

public static void main(String [] args) {

if (args.length!=3) {

System.out.println

("usage: java racine 1 7 +12.25");

System.exit (0);

}

...

}

2. Traitement des coecients

Lesvaleursdescoecientssontfourniessousformedechaînesdecaractères.Il

fautdonclesconvertirenvaleursdetypedouble,cequisefaitendeuxétapes:

l'obtentiond'uneinstancedelaclasseFloat,puisl'obtentiond'unevaleurde

(25)

codesuivante(ilconvientdevérieràceniveaulavaliditédescoecients,soit

a#0).

...

/ on recupere les valeurs des coefficients /

double a = Float.valueOf(args [0]). doubleValue();

double b = Float.valueOf(args [1]). doubleValue();

double c = Float.valueOf(args [2]). doubleValue();

if (a==0.0) {

System.out.println("a doit etre non nul");

} else {

/ resolution dans R /

...

3. Résolution du problème

Nous pouvons maintenant résoudre le problème. Suivant la valeurde delta=

p

b 2

4ac , on obtiendra 0,1 ou 2solutionsdans R. La partie du pro-

grammeréalisantcetterésolutionest:

...

double delta = bb 4.ac;

if ( delta<0.0)

System.out.println("Pas de solution reelle !");

else if (delta==0.0)

System.out.println("U n e solution double : "

+( b/(2.a)));

else

System.out.println("D e u x solutions : "+

(( b+Math.sqrt(delta))/(2.a))+" et "+

(( b Math.sqrt(delta))/(2.a)));

}

}

}

Références

Documents relatifs

On appelle ENT un Environnement Numérique de Travail. Il s’agit d’un espace de travail personnalisable. Chaque utilisateur se connecte à l’ENT depuis n'importe quel

Level-2 and above contains references of the nodes belonging to the immediate higher level (composite event containing more than two constituents) or sentinels. The change is

Aquí ja podem entreveure un dels principals reptes de la digitalització: l'equi- libri entre les necessitats de qualitat, amb la demanda de més colors, més reso- lució i sense

Ces caractéristiques propres aux documents semi-structurés ne posent pas unique- ment des problèmes de « haut niveau » (comme l’extraction d’information ou les re-

Une façon simple d’y arriver est de créer un fond d’écran avec les bornes pour une résolution de 800x600 pixels et de 1024x768 pixels. IFT1147 -

Une version XML est le document de D qui correspond à un ensemble d’événe- ments de contrôle de versions, l’ensemble des événements qui a donné lieu à cette version. Dans

In addition to providing algorithms for, and a full characterization of, the complexity of com- puting the aggregation for both PrXML mux,det and PrXML cie models (which corresponds

l’utilisation d’une adresse absolue dans une formule y faisant référence