Commit 8cc8cc2a authored by Neveux Anais's avatar Neveux Anais

Merge branch 'master' of gitlab.utc.fr:crozatst/hdoc

parents 6618d4db d77c17a9
*/input/* */input/*
*/tmp/* */tmp/*
*/output/* */output/*
*/node_modules*/
*.DS_Store* *.DS_Store*
[submodule "hdoc_to_mongo/node_modules/node-mongodb-native"]
path = hdoc_to_mongo/node_modules/node-mongodb-native
url = https://github.com/mongodb/node-mongodb-native.git
...@@ -16,7 +16,7 @@ http://www.gnu.org/licenses/gpl-3.0.txt ...@@ -16,7 +16,7 @@ http://www.gnu.org/licenses/gpl-3.0.txt
- Fecherolle Cécile - Fecherolle Cécile
## Presentation ## Presentation
This module is able to convert several [etherpad](http://etherpad.org/) files (exported as html files) to the hdoc format. This module is able to convert several [framad](https://framapad.org/) files (exported as html files) to the hdoc format.
## User documentation ## User documentation
...@@ -24,8 +24,8 @@ This module is able to convert several [etherpad](http://etherpad.org/) files (e ...@@ -24,8 +24,8 @@ This module is able to convert several [etherpad](http://etherpad.org/) files (e
Vous êtes un utilisateur de framapad et en créez un pour un projet. Après avoir travaillé sur votre pad, vous souhaitez transformer ce document en un autre format que vous pourrez utiliser dans un nouveau contexte de travail. Pour ce faire, vous exportez le framapad au format HTML grâce au bouton « Import/Export ». Vous récupérez ensuite les fichiers nécessaires à la transformation framapad to hdoc sur le répertoire git du projet hdoc (voir http://hdoc.crzt.fr/). Il ne vous reste alors plus qu'à placer le fichier html précédemment récupéré dans le dossier « input » du dossier framapad_to_hdoc et à exécuter le /run.bat si vous êtes sur Windows ou le /run.sh si vous êtes sur Linux/Mac. Cela produira une archive .hdoc dont l'intérêt est de servir de format de passage pour une transformation d'un format à un autre, et ce pour une grande variété de format. Il vous restera ensuite à déterminer le nouveau format dans lequel vous voulez transformer votre hdoc et utiliser le convertisseur approprié s'il existe. Vous êtes un utilisateur de framapad et en créez un pour un projet. Après avoir travaillé sur votre pad, vous souhaitez transformer ce document en un autre format que vous pourrez utiliser dans un nouveau contexte de travail. Pour ce faire, vous exportez le framapad au format HTML grâce au bouton « Import/Export ». Vous récupérez ensuite les fichiers nécessaires à la transformation framapad to hdoc sur le répertoire git du projet hdoc (voir http://hdoc.crzt.fr/). Il ne vous reste alors plus qu'à placer le fichier html précédemment récupéré dans le dossier « input » du dossier framapad_to_hdoc et à exécuter le /run.bat si vous êtes sur Windows ou le /run.sh si vous êtes sur Linux/Mac. Cela produira une archive .hdoc dont l'intérêt est de servir de format de passage pour une transformation d'un format à un autre, et ce pour une grande variété de format. Il vous restera ensuite à déterminer le nouveau format dans lequel vous voulez transformer votre hdoc et utiliser le convertisseur approprié s'il existe.
## Running etherpad_to_hdoc.ant ## Running framapad_to_hdoc.ant
1. Create an etherpad document and export it as an html file. 1. Create a framapad document and export it as an html file.
2. please place your html files in the `/input` folder 2. please place your html files in the `/input` folder
3. run the `run.[bat|sh]` script of your choice depending on your OS 3. run the `run.[bat|sh]` script of your choice depending on your OS
4. and retrieve the hdoc outputs in the `/output` folder 4. and retrieve the hdoc outputs in the `/output` folder
......
...@@ -10,6 +10,21 @@ ...@@ -10,6 +10,21 @@
</xsl:template> </xsl:template>
<xsl:template match="//ul[parent::ul or parent::ol]" priority="1">
<li>
<ul>
<xsl:apply-templates select="*"/>
</ul>
</li>
</xsl:template>
<xsl:template match="//ol[parent::ul or parent::ol]" priority="1">
<li>
<ol>
<xsl:apply-templates select="*"/>
</ol>
</li>
</xsl:template>
<!--Identity template, <!--Identity template,
provides default behavior that copies all content into the output --> provides default behavior that copies all content into the output -->
<xsl:template match="@*|node()"> <xsl:template match="@*|node()">
......
...@@ -6,12 +6,12 @@ ...@@ -6,12 +6,12 @@
<xsl:template match="ul"> <xsl:template match="ul">
<ul> <ul>
<xsl:apply-templates select="*"/> <xsl:apply-templates select="*"/>
</ul><br/> </ul>
</xsl:template> </xsl:template>
<xsl:template match="ol"> <xsl:template match="ol">
<ol> <ol>
<xsl:apply-templates select="*"/> <xsl:apply-templates select="*"/>
</ol><br/> </ol>
</xsl:template> </xsl:template>
<xsl:template match="@*|node()"> <xsl:template match="@*|node()">
......
...@@ -48,8 +48,14 @@ ...@@ -48,8 +48,14 @@
<xsl:apply-templates select="*"/> <xsl:apply-templates select="*"/>
</ol> </ol>
</xsl:template> </xsl:template>
<xsl:template match="h1 | h2 | h3 | h4 | h5 | h6">
Titre (non pris en compte pour l'instant) :
<xsl:apply-templates select="@*|node()"/>
</xsl:template>
<xsl:template match="code">
Code (non pris en compte pour l'instant) :
<xsl:apply-templates select="@*|node()"/>
</xsl:template>
<xsl:template match="page"> <xsl:template match="page">
<xsl:apply-templates select="@*|node()"/> <xsl:apply-templates select="@*|node()"/>
</xsl:template> </xsl:template>
......
# Etherpad2Opale -- HDOC CONVERTER PROJECT # framapad2opale -- HDOC CONVERTER PROJECT
## License ## License
[GPL 3.0](http://www.gnu.org/licenses/gpl-3.0.txt) [GPL 3.0](http://www.gnu.org/licenses/gpl-3.0.txt)
## Credits ## Credits
- Boucaud Fabien
- Chognard Etienne
- Rit Gabrielle - Rit Gabrielle
- Vintache Jean - Vintache Jean
- Douteau Jean-Come - Douteau Jean-Come
- Fecherolle Cecile (2014) - Fecherolle Cecile (2014)
## Presentation ## Presentation
How to transform an etherpad document in opale document. How to transform an framapad document in opale document.
Filepaths in this document are relative to this readme file. Filepaths in this document are relative to this readme file.
## Dependence ## Dependence
- Etherpad2Hdoc - framapad2Hdoc
- Hdoc2Opale - Hdoc2Opale
## User Documentation ## User Documentation
1. Download an etherpad document in html format. 1. Download a framapad document in html format.
1. Create or join an etherpad document then export it in html format (Import/Export Button) in the `/input` directory (if the directory does not exists, you have to create it). 1. Create or join a framapad document then export it in html format (Import/Export Button) in the `/input` directory (if the directory does not exists, you have to create it).
2. Execute the file `/run.bat` or `/run.sh` depending on the OS. A `.scar` file is created in the directory `/output` 2. Execute the file `/run.bat` or `/run.sh` depending on the OS. A `.scar` file is created in the directory `/output`
*If the `/input` directory contains multiple files, they will be all treated. *If the `/input` directory contains multiple files, they will be all treated.
3. Open the document with Opale 3. Open the document with Opale
1. Open Scenari, and choose "UTC-etu_opale" as distant depot. 1. Open Scenari, and choose "UTC-etu_opale" as distant depot.
2. Go in the directory `sandBox/etherpad-to-opale.` 2. Go in the sandbox.
3. Import your `.scar` file in the directory. 3. Import your `.scar` file in the directory.
4. Open the file Main.xml created. 4. Open the file Main.xml created.
...@@ -52,7 +54,7 @@ Here's an example : ...@@ -52,7 +54,7 @@ Here's an example :
- Correct nested lists - Correct nested lists
## Technical notes ## Technical notes
### Description of etherpad_to_hdoc.ant ### Description of framapad_to_hdoc.ant
#### Prelude #### Prelude
- Importation of necessary classes (antlib, htmlcleaner, jing) - Importation of necessary classes (antlib, htmlcleaner, jing)
......
!input/.gitkeep
!output/.gitkeep
\ No newline at end of file
...@@ -3,11 +3,10 @@ ...@@ -3,11 +3,10 @@
(: For example, $author := '^Baptiste Montangé$', to search for an exact name:) (: For example, $author := '^Baptiste Montangé$', to search for an exact name:)
(: For example, $name := 'Montangé', to search for documents whose author named Coutant:) (: For example, $name := 'Montangé', to search for documents whose author named Coutant:)
(: Remark : Accents in the authors' names have been taken care of :) (: Remark : Accents in the authors' names have been taken care of :)
declare function local:searchDocByAuthor($name as xs:string, $docs as node()*) as node()*
<documents>{ {
let $name := 'Montangé'
let $name_noAcc := translate($name, 'áàâäéèêëíìîïóòôöúùûü','aaaaeeeeiiiioooouuuu') let $name_noAcc := translate($name, 'áàâäéèêëíìîïóòôöúùûü','aaaaeeeeiiiioooouuuu')
for $doc in //document for $doc in $docs
return return
for $author in $doc/authors/author for $author in $doc/authors/author
let $titre := $doc/titre let $titre := $doc/titre
...@@ -15,4 +14,7 @@ ...@@ -15,4 +14,7 @@
where matches($author_noAcc, $name_noAcc) where matches($author_noAcc, $name_noAcc)
group by $titre (: Avoid duplications of documents by their titre:) group by $titre (: Avoid duplications of documents by their titre:)
return $doc return $doc
}</documents> };
\ No newline at end of file
(: Example :)
local:searchDocByAuthor('Montangé', //document)
\ No newline at end of file
...@@ -3,9 +3,12 @@ ...@@ -3,9 +3,12 @@
(: For example, $name := '^NF29_HdocEtherpad$', to search for an exact name:) (: For example, $name := '^NF29_HdocEtherpad$', to search for an exact name:)
(: For example, $name := 'NF29', to search for documents whose name contains 'NF29':) (: For example, $name := 'NF29', to search for documents whose name contains 'NF29':)
<documents>{ declare function local:searchDocByTitle($name as xs:string, $docs as node()*) as node()*
let $name := '^NF29_HdocEtherpad$' {
for $doc in //document for $doc in $docs
where matches($doc/titre, $name, "i") where matches($doc/titre, $name, "i")
return $doc return $doc
}</documents> };
\ No newline at end of file
(: Example :)
local:searchDocByTitle('^NF29_HdocEtherpad$', //document)
\ No newline at end of file
...@@ -20,6 +20,10 @@ Dependencies ...@@ -20,6 +20,10 @@ Dependencies
--- ---
There's no particular dependencies needed to run the converter. There's no particular dependencies needed to run the converter.
Conditions particulières
---
Pour le moment, il ne faut pas utilisé les "sous-Division" de Opale. Les divisions à la racine sont autorisées.
User Story User Story
--- ---
### Running the script ### Running the script
......
...@@ -32,16 +32,16 @@ ...@@ -32,16 +32,16 @@
<!-- Targeted markups. --> <!-- Targeted markups. -->
<xsl:template match="h:img"> <xsl:template match="h:img">
<copy tofile="${{filename2}}/decompressedOpale/res/{./@src}" file="${{filename2}}/decompressedHdoc/{./@src}"/> <copy tofile="${{filename2}}/decompressedcanoprof/res/{./@src}" file="${{filename2}}/decompressedHdoc/{./@src}"/>
</xsl:template> </xsl:template>
<xsl:template match="h:audio"> <xsl:template match="h:audio">
<copy tofile="${{filename2}}/decompressedOpale/res/{./@src}" file="${{filename2}}/decompressedHdoc/{./@src}"/> <copy tofile="${{filename2}}/decompressedcanoprof/res/{./@src}" file="${{filename2}}/decompressedHdoc/{./@src}"/>
</xsl:template> </xsl:template>
<xsl:template match="h:video"> <xsl:template match="h:video">
<copy tofile="${{filename2}}/decompressedOpale/res/{./@src}" file="${{filename2}}/decompressedHdoc/{./@src}"/> <copy tofile="${{filename2}}/decompressedcanoprof/res/{./@src}" file="${{filename2}}/decompressedHdoc/{./@src}"/>
</xsl:template> </xsl:template>
<xsl:template match="h:object"> <xsl:template match="h:object">
<copy tofile="${{filename2}}/decompressedOpale/res/{./@data}" file="${{filename2}}/decompressedHdoc/{./@data}"/> <copy tofile="${{filename2}}/decompressedcanoprof/res/{./@data}" file="${{filename2}}/decompressedHdoc/{./@data}"/>
</xsl:template> </xsl:template>
<!-- These markups are matched in order to minimize "apply-templates" side-effects (i.e. their contents are not relevant for this transformation). --> <!-- These markups are matched in order to minimize "apply-templates" side-effects (i.e. their contents are not relevant for this transformation). -->
......
This diff is collapsed.
...@@ -12,9 +12,53 @@ Kapilraj Thangeswaran ...@@ -12,9 +12,53 @@ Kapilraj Thangeswaran
This module is able to extract data from a file in Hdoc format and insert them into MongoDB. This module is able to extract data from a file in Hdoc format and insert them into MongoDB.
## Dependencies ## Dependencies
No dependance needed. - In order to make this module work you have to download and install Node.js from the [Node.js download page](https://nodejs.org/en/).
- If needed, download and install MongoDB from the [MongoDB download page](https://www.mongodb.com/download-center#community).
## Instructions
1. Install dependencies
2. Edit "config.json" file from "mongo" folder (for more details, please check "Mongo configuration")
3. Execute run.bat or run.sh
## Web
This module provides a Web application to access MongoDB and execute simples requests.
1. Launch MongoDB using `mongod.exe --rest --jsonp` command from "MongoDB/Server/3.2/bin" folder.
2. Edit "config.json" file from "web" folder (for more details, please check "MongoDB configuration")
3. Open "index.html" in "web" folder
## MongoDB configuration
### In "mongo" folder
Use "config.json" in the "mongo" folder to specify :
- url : mongodb's url
- database : the database you are using
- collection : the collection you are using
- request : the request you want to perform (for allowed requests, please check "Supported requests")
```
{
"url" : "mongodb://localhost:27017/",
"database" : "database",
"collection" : "collection",
"request" : "insert"
}
```
### In "web" folder
Use "config.json" in the "web" folder to specify :
- url : mongodb's url including the database
- collection : the collection you are using
```
{
"url" : "mongodb://localhost:27017/database",
"collection" : "collection",
}
```
## Supported requests
- insert
- update (using the title as filter)
- remove (using the title as filter)
## User stories ## User stories
En tant qu’utilisateur rédigeant des documents sous opale, je veux récupérer les exercices corrigés d’un sujet donné dans le but de les réutiliser. - En tant qu’utilisateur rédigeant des documents sous opale, je veux récupérer les exercices corrigés d’un sujet donné dans le but de les réutiliser.
En tant qu’utilisateur rédigeant des documents sous opale, je veux récupérer les cours d’un auteur précis dans le but d’utiliser ses cours comme références. - En tant qu’utilisateur rédigeant des documents sous opale, je veux récupérer les cours d’un auteur précis dans le but d’utiliser ses cours comme références.
En tant qu’utilisateur universitaire, je souhaite mettre à disposition mes exercices sur internet de manière structuré dans le but de permettre à d’autre utilisateurs universitaires de les trouver, par thème, auteur ou contenu et de les réutiliser. - En tant qu’utilisateur universitaire, je souhaite mettre à disposition mes exercices sur internet de manière structuré dans le but de permettre à d’autre utilisateurs universitaires de les trouver, par thème, auteur ou contenu et de les réutiliser.
libdir=${basedir}/lib libdir=${basedir}/lib
xsldir=${basedir}/xsl xsldir=${basedir}/xsl
hdocdir=${basedir}/hdoc tmpdir=${basedir}/tmp
inputPath=${basedir}/input inputPath=${basedir}/input
outputPath=${basedir}/output outputPath=${basedir}/output
<html>
<head>
<title>page principale</title>
<script type="text/javascript" src="https://code.jquery.com/jquery-3.1.1.min.js" ></script>
<script type="text/javascript">
jQuery("document").ready(function () {
var myData = [{
"title":
"XSLT (oprations avances): expressions rgulires et fichiers texte"
,
"authors":
"Karim El Aktaa (Contributions: Stphane Crozat et les tudiants de NF29)"
,
"keywords":
[
"XSL"
,
"XSLT"
,
"XSL-XSLT"
,
"Expression rgulire"
]
,
"rights":
"by-sa"
,
"introduction":
"XSL-XSLT est un langage de programmation qui permet notamment de manipuler des documents XML. Ce module a pour but de vous apporter des connaissances plus approfondies sur ce langage que vous connaissez dj: l'utilisation de document non XML et d'expressions rgulires."
},
{
"title":
"XSLT (oprations avances): expressions rgulires et fichiers texte"
,
"authors":
"Karim El Aktaa (Contributions: Stphane Crozat et les tudiants de NF29)"
,
"keywords":
[
"XSL"
,
"XSLT"
,
"XSL-XSLT"
,
"Expression rgulire"
]
,
"rights":
"by-sa"
,
"introduction":
"XSL-XSLT est un langage de programmation qui permet notamment de manipuler des documents XML. Ce module a pour but de vous apporter des connaissances plus approfondies sur ce langage que vous connaissez dj: l'utilisation de document non XML et d'expressions rgulires."
}]
for (var item in myData) {
var model = jQuery("div[name='toFill']").first().clone();
model.find("a[name='link']").attr("href", "title.html#" + encodeURI(JSON.stringify(myData[item])));
model.find("span[name='title']").text(myData[item].title);
model.css("display", "block")
model.appendTo(jQuery("body").first());
}
});
</script>
</head>
<body>
<input type="text" id="search" style="width:100%"/>
<div name="toFill" style="display:none;">
<a href="" name="link">
<div style="width:100%; text-align: center; border: solid 1px black; padding: 5px; margin: 3px;">
<span name="title">
</span>
</div>
</a>
</div>
</body>
</html>
\ No newline at end of file
<html>
<head>
<title>page secondaire</title>
<script type="text/javascript" src="https://code.jquery.com/jquery-3.1.1.min.js" ></script>
<script type="text/javascript">
jQuery("document").ready(function () {
var myData = JSON.parse(decodeURI(document.location.href.split("#")[1]));
jQuery("#title").text(myData.title);
jQuery("#spData").append("<p>Auteur(s) : " + myData.authors + "</p>");
jQuery("#spData").append("<p>License de droits d'usage : " + myData.rights + "</p>");
jQuery("#spData").append("");
jQuery("#rwData").append("<p>non classs : " + myData.keywords.join(", ") + "</p>");
jQuery("#introduction").text(myData.introduction);
});
function loadFullText() {
jQuery("#preview").empty();
jQuery("#preview").text("TODO");
}
</script>
<style type="text/css">
div {
border: solid 1px black;
}
</style>
</head>
<body>
<div id="toFill">
<h1 id="title"></h1>
<div>
<div style="width: 62%; display:inline-block">
<p id="spData">
</p>
<div style="text-align:center;"><a href="#todo">Lien de tlchargement</a></div>
</div>
<div id="rwData" style="width: 35%; margin-top:0px; float:right;%">
<h2>Tags</h2>
</div>
</div>
<div id="preview" style="clear:both">
<div id="introduction" ></div>
<div style="text-align:center;">
<a href="#" onclick="loadFullText()">Lire plus ...</a>
</div>
</div>
</div>
</body>
</html>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<container version="1.0" xmlns="urn:utc.fr:ics:hdoc:container">
<rootfiles>
<rootfile full-path="content.xml" media-type="text/xml" />
</rootfiles>
</container>
<?xml version="1.0" encoding="UTF-8"?>
<?oxygen RNGSchema="http://hdoc.crzt.fr/schemas/xhtml/hdoc1-xhtml.rng" type="xml"
?><html xmlns="http://www.utc.fr/ics/hdoc/xhtml" xmlns:sc="http://www.utc.fr/ics/scenari/v3/core" xmlns:sp="http://www.utc.fr/ics/scenari/v3/primitive" xmlns:op="utc.fr:ics/opale3"><head><title>XSLT (opérations avancées) : expressions régulières et fichiers texte</title><meta charset="utf-8"/><meta content="HdocConverter/Opale3.4" name="generator"/><meta name="keywords" content="XSL"/><meta name="keywords" content="XSLT"/><meta name="keywords" content="XSL-XSLT"/><meta name="keywords" content="Expression régulière"/><meta name="rights" content="by-sa"/><meta name="author" content="Karim El Aktaa (Contributions : Stéphane Crozat et les étudiants de NF29)"/></head><body><section><header><h1>Objectifs</h1></header><div><ul><li><p>Utiliser un fichier de texte brut non XML</p></li><li><p>Utiliser des expressions régulières</p></li></ul></div></section><section data-hdoc-type="introduction"><header><h1>Introduction</h1></header><div><p>XSL-XSLT est un langage de programmation qui permet notamment de manipuler des documents XML.</p><p>Ce module a pour but de vous apporter des connaissances plus approfondies sur ce langage que vous connaissez déjà : l'utilisation de document non XML et d'expressions régulières.</p></div></section><section><header><h1>Cours</h1></header><section><header><h1>Lecture de fichier texte non XML</h1></header><div><h6>Introduction</h6><p>Dans cette partie du cours, nous allons voir comment utiliser un fichier texte brut (non XML) avec le langage XSLT.</p></div><div data-hdoc-type="complement"><h6>Limitation du XSLT</h6><p>Dans son principe de fonctionnement originel, XSLT est conçu pour prendre en entrée un fichier XML bien formé.</p></div><div data-hdoc-type="emphasis"><h6>Lecture de fichier non XML</h6><p>XSLT 2.0 introduit la possibilité de lire des fichiers texte qui ne sont pas nécessairement des fichiers XML bien formés.</p><p>La fonction :</p><p>unparsed-text($href as xs:string?, $encoding as xs:string) as xs:string?</p><p>permet en effet de lire une ressource externe et de renvoyer le résultat sous forme d'une chaîne de caractères.</p><p>L'argument <em>$href</em> correspond à l'URI de la ressource externe à lire.</p><p>Il est également possible de préciser un encodage spécifique via l'argument optionnel <em>$encoding</em>.</p></div><div data-hdoc-type="example"><h6>Exemple de lecture d'un fichier texte non XML</h6><p>Lecture du fichier <em>txt.txt</em>, en utilisant l'encoding <em>iso-8859-1</em>. La fonction <em>unparsed-text(...)</em> récupère le contenu du fichier et renvoie le résultat sous forme d'une chaîne de caractère à la commande <em>xsl :value-of</em>, qui affiche donc le contenu du fichier lu.</p><p>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0"&gt;
&lt;xsl:output method="text"&gt;&lt;/xsl:output&gt;
&lt;xsl:template match="/"&gt;
&lt;xsl:value-of select="unparsed-text('txt.txt', 'iso-8859-1')" disable-output-escaping="yes"/&gt;
&lt;/xsl:template&gt;
&lt;/xsl:stylesheet&gt;</p><p>Le paramètre <em>disable-output-escaping</em>, permet d'indiquer si les caractères spéciaux (comme '&lt;' par exemple) sont échappés ou non.</p></div><div data-hdoc-type="advice"><h6>Comment lancer la transformation sans fichier XML source ?</h6><p>Habituellement l'utilisation d'une transformation XSLT se fait via le document XML source (en utilisant la <i>processing instruction</i> <q>&lt;?xml-stylesheet ... ?&gt;</q>).</p><p>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;?xml-stylesheet type="xsl" href="poeme.xsl"?&gt;
&lt;poeme titre="The Stone Troll" auteur="JRR Tolkien"&gt;
&lt;strophe&gt;
&lt;vers&gt;Troll sat alone on his seat of stone,&lt;/vers&gt;
&lt;vers&gt;And munched and mumbled a bare old bone;&lt;/vers&gt;
&lt;/strophe&gt;
&lt;strophe&gt;
&lt;vers&gt;Up came Tom with his big boots on.&lt;/vers&gt;
&lt;vers&gt;Said he to Troll: 'Pray, what is yon?&lt;/vers&gt;
&lt;/strophe&gt;
&lt;/poeme&gt;</p><p>Pour pallier ce principe, si on ne souhaite pas faire appel à un fichier XML source, il faut utiliser le fichier XSLT (qui est du XML) comme entrée.</p></div><footer/></section><section><header><h1>Expression régulière avec XSL-XSLT</h1></header><div><h6>Introduction</h6><p>Dans cette partie du cours, nous allons voir comment utiliser des expressions régulières avec le langage XSLT, après avoir fait un rappel sur ce que sont les expressions régulières.</p></div><div data-hdoc-type="emphasis"><h6>Qu'est ce qu'une expression régulière ?</h6><p><q>Une expression régulière est une chaîne de caractères que l'on appelle parfois un motif et qui décrit un ensemble de chaînes de caractères possibles selon une syntaxe précise.</q></p><p>Une expression régulière est une suite de caractères typographiques (un « motif » ou « pattern ») décrivant une chaîne de caractères dans le but de la trouver dans un bloc de texte pour lui appliquer un traitement automatisé, comme un ajout, son remplacement ou sa suppression.</p><p>Syntaxe des expressions régulières dans XSL-XSLT/XPath.</p></div><div data-hdoc-type="example"><h6>Exemples d'expressions régulières</h6><table><caption>Exemples de regex</caption><tr><td><p>Expression régulière</p></td><td><p>Résultats</p></td></tr><tr><td><p>a</p></td><td><p>match le caractère a seul</p></td></tr><tr><td><p>a+b</p></td><td><p>match les mots commençants par a suivi de de zéro ou plusieurs a et finissant par b</p></td></tr><tr><td><p>[a-z]{5}</p></td><td><p>match les mots composés de 5 caractères compris entre a et z</p></td></tr><tr><td><p>a\.b+c?</p></td><td><p>match : a.b, a.bc, a.bb, a.bbc, a.bbbc...</p></td></tr><tr><td><p>(http|https|ftp):\/\/([a-zA-Z0-9]*)\.([a-zA-Z0-9]*)\.(com|net)</p></td><td><p>Pattern simpliste d'adresse web</p></td></tr></table></div><div data-hdoc-type="advice"><h6>Expressions régulières avec oXygen</h6><p>Outils -&gt; Constructeur des expressions régulières</p></div><div data-hdoc-type="emphasis"><h6>Les expressions régulières dans XSL-XSLT</h6><p>Dans le langage XSL-XSLT il y a 4 fonctions qui permettent d'utiliser les expressions régulières :</p><ol><li><p><em>tokenize</em></p></li><li><p><em>matches</em></p></li><li><p><em>replace</em></p></li><li><p><em>xsl:analyze-string</em></p></li></ol></div><div data-hdoc-type="emphasis"><h6>Tokenize</h6><p>La fonction <em>tokenize($input, $pattern)</em> est pratique car elle permet de séparer une chaîne de caractères en une séquence de chaînes de caractères.</p><p>L'argument<em> $input</em> désigne la chaîne de caractère d'entrée, et l'argument <em>$pattern</em> désigne le pattern (ou expression régulière) qui match le délimiteur choisi.</p></div><div data-hdoc-type="example"><h6>Exemple de récupération d'un fichier texte et de tokenize</h6><p>On cherche à lire un fichier texte et à remplacer les sauts de lignes par des points virgules.</p><p>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0"&gt;
&lt;xsl:output method="text"&gt;&lt;/xsl:output&gt;
&lt;xsl:template match="/"&gt;
&lt;xsl:for-each select="tokenize(unparsed-text('txt.txt', 'iso-8859-1'), '\r?\n')"&gt;
&lt;xsl:copy&gt;&lt;/xsl:copy&gt;&lt;xsl:text&gt;;&lt;/xsl:text&gt;
&lt;/xsl:for-each&gt;
&lt;/xsl:template&gt;
&lt;/xsl:stylesheet&gt;
</p></div><div data-hdoc-type="emphasis"><h6>Matches</h6><p>La fonction <em>matches</em><em>($input, $pattern)</em> permet de vérifier si <em>$input</em> match l'expression régulière <em>$pattern</em>.</p></div><div data-hdoc-type="emphasis"><h6>Replace</h6><p>La fonction <em>replace</em><em>($input, $pattern, $replacement)</em> permet de remplacer les parties de <em>$input</em> qui matchent <em>$pattern</em> avec <em>$replacement</em>.</p></div><div data-hdoc-type="emphasis"><h6>Analyse de chaîne de caractère</h6><p>L'instruction <em>xsl:analyze-string</em> permet d'analyser une chaîne de caractère en fonction d'une expression régulière. On peut accéder aux sous chaînes de caractères qui correspondent à l'expression régulière avec l'instruction <em>xsl:matching-substring</em>, et inversement aux sous chaînes de caractères qui ne correspondent pas à la regex avec <em>xsl:non-matching-substring</em>.</p><p>&lt;xsl:analyze-string
select = expression
regex = { string }
flags? = { string }&gt;
&lt;!-- Content: (xsl:matching-substring?, xsl:non-matching-substring?, xsl:fallback*) --&gt;
&lt;/xsl:analyze-string&gt;</p></div><div data-hdoc-type="example"><h6>Exemple d'analyse de string avec une regex</h6><p>Cet exemple remplace tout les caractères '\n' (newline) par la balise &lt;br/&gt;.</p><p>&lt;xsl:analyze-string select="abstract" regex="\n"&gt;
&lt;xsl:matching-substring&gt;
&lt;br/&gt;
&lt;/xsl:matching-substring&gt;
&lt;xsl:non-matching-substring&gt;
&lt;xsl:value-of select="."/&gt;
&lt;/xsl:non-matching-substring&gt;
&lt;/xsl:analyze-string&gt;
</p></div><footer/></section><footer/></section><section><header><h1>Exercices</h1></header><footer/></section></body></html>
application/x-hdoc+zip
\ No newline at end of file
<project name="hdoc_to_optim" default="main"> <project name="hdoc_to_mongo" default="mongoDB">
<property file="build.properties"/> <property file="build.properties"/>
<taskdef resource="net/sf/antcontrib/antlib.xml">
<classpath>
<pathelement location="lib/ant-contrib.jar"/>
</classpath>
</taskdef>
<target name="preparation"> <target name="preparation">
<mkdir dir="${hdocdir}"/> <mkdir dir="${tmpdir}"/>
<chmod perm="777" dir="${hdocdir}"></chmod> <chmod perm="777" dir="${tmpdir}"></chmod>
<delete dir="${outputPath}" /> <delete dir="${outputPath}" />
<mkdir dir="${outputPath}"/> <mkdir dir="${outputPath}"/>
<chmod perm="777" dir="${outputPath}"></chmod> <chmod perm="777" dir="${outputPath}"></chmod>
</target> </target>
<target name="unzipSource" depends="preparation"> <target name="main" depends="preparation">
<fileset dir="${inputPath}" id="hdocFile"> <for param="file">
<include name="*.hdoc"/> <path>
</fileset> <fileset dir="${inputPath}" includes="*.hdoc"/>
<pathconvert property="hdocFilePath" pathsep="" refid="hdocFile" /> </path>
<sequential>
<var name="fileName" unset="true"/>
<basename file="@{file}" property="fileName"/>
<antcall target="unzipHdoc">
<param name="file" value="${fileName}"/>
</antcall>
<echo>Entry file : ${hdocFilePath}</echo> <antcall target="convertHdoc">
<param name="file" value="${fileName}"/>
</antcall>
<antcall target="clean" />
</sequential>
</for>
</target>
<target name="unzipHdoc">
<echo>Unzip ${inputPath}/${file}</echo>
<!--unzips the hdoc to be converted--> <!--unzips the hdoc to be converted-->
<unzip dest="${hdocdir}" src ="${hdocFilePath}"/> <unzip dest="${tmpdir}" src="${inputPath}/${file}"/>
</target>
<target name="convertHdoc">
<echo>Convert ${inputPath}/${file}</echo>
<basename property="basename" file="${inputPath}/${file}" suffix=".hdoc"/>
<xslt in="${tmpdir}/content.xml" out="${outputPath}/${basename}.json" style="xsl/main.xsl"/>
</target> </target>
<target name="main" depends="unzipSource"> <target name="clean">
<xslt in="${hdocdir}/content.xml" out="${outputPath}/result.json" style="xsl/main.xsl"/> <delete dir="${tmpdir}" />
</target> </target>
<target name="clean" depends="unzipSource"> <target name="mongoDB" depends="main">
<delete dir="${hdocdir}" /> <exec executable="node" dir="mongo">
<arg line="main.js"/>
</exec>
</target> </target>
</project> </project>
\ No newline at end of file
{
"url" : "mongodb://localhost:27017/",
"database" : "test",
"collection" : "nf29",
"request" : "insert"
}
\ No newline at end of file
const fs = require('fs');
const config = JSON.parse(fs.readFileSync('config.json'));
const MongoClient = require('mongodb').MongoClient;
const assert = require('assert');
const ObjectId = require('mongodb').ObjectID;
var url = config.url;
if(url.slice(-1) == "/") {
url += config.database;
} else {
url += "/" + config.database;
}
const outputFolder = "../output";
var insertDocument = function(db, collection, json) {
db.collection(collection).insertOne(json, function(err, result) {
assert.equal(err, null);
console.log(json.title + " inserted into " + collection + " collection.");
});
};
var updateDocument = function(db, collection, json) {
db.collection(collection).updateOne({"title" : json.title}, json, function(err, result) {
assert.equal(err, null);
if(result.result.n > 0) {
console.log(json.title + " updated.");