浏览代码

Merge pull request #6 from Loquicom/oppf

Oppf
Loquicom 5 年之前
父节点
当前提交
967795d98f

+ 19 - 14
README.md

@@ -2,12 +2,16 @@
 
 ## Arthur Brandao & Maxence Bacquet - M2 ILI
 
-Programme pour interroger la base de données DBLP au format XML pour trouver les co-auteurs d'un auteur donné. Le programme possède deux fonctions, la première permet de faire un pré-traitement de la base dans un fichier .ppf, le second permet d'effectuer la recherche depuis le fichier obtenu suite au pré-traitement.
+Programme pour interroger la base de données DBLP au format XML.
 
 ## Documentation des commandes
 
 La documentation suivante pars du principe qu'un terminal est ouvert dans le dossier du projet et que nodejs est installé
 
+## Partie 1 - Recherche des co-auteurs d'un auteur
+
+L'objectif du programme est de trouver les co-auteurs d'un auteur donné. Le programme possède deux fonctions, la première permet de faire un pré-traitement de la base dans un fichier .ppf (Pre Processing File), le second permet d'effectuer la recherche depuis le fichier obtenu suite au pré-traitement.
+
 ### Commande de pré-traitement de la base
 
 Cette commande permet de générer un fichier .ppf (si aucune destination n'est indiquée le chemin vers le fichier seras le quivant : `./data/data.ppf`)
@@ -15,7 +19,7 @@ Cette commande permet de générer un fichier .ppf (si aucune destination n'est
 La commande est :
 
 ```bash
-node main.js prepare <source> [destination]
+node coauth.js prepare <source> [destination]
 ```
 
 - `<source>` : correspond au chemin vers la base de données au format xml
@@ -26,7 +30,7 @@ Une commande npm est aussi disponible, elle est l'équivalent de la commande en
 ```bash
 npm run preprocess
 # <=>
-node main.js prepare ./data/dblp.xml ./data/data.ppf
+node coauth.js prepare ./data/dblp.xml ./data/data.ppf
 ```
 
 ### Commande de recherche des co-auteurs
@@ -36,7 +40,7 @@ La recherche des co-auteurs ne peut avoir lieu qu'après avoir executé une fois
 La commande de base est la suivante :
 
 ```bash
-node main.js
+node coauth.js
 ```
 
 Avec cette commande le programme considère que le fichier .ppf est dans `./data/data.ppf`. Le nom de l'auteur dont il faut chercher les co-auteurs seras demandé par le programme dans la console.
@@ -52,9 +56,9 @@ La commande admet plusieurs options :
 Voici quelques exemples avec des options :
 
 ```bash
-node main.js -n "Fabien Delorme"
-node main.js --name="Anne-Cécile Caron" -f "./data/data.ppf"
-node main.js --name "Francis Bossut" --file "./tmp/coauth.ppf" -v
+node coauth.js -n "Fabien Delorme"
+node coauth.js --name="Anne-Cécile Caron" -f "./data/data.ppf"
+node coauth.js --name "Francis Bossut" --file "./tmp/coauth.ppf" -v
 ```
 
 Le retour du programme sans l'option verbose est similaire au retour du programme de reference fournit. Attention la recherche sur le nom est sensible à la casse.
@@ -64,7 +68,7 @@ Il existe aussi une commande npm pour executer le programme, elle est équivalen
 ```bash
 npm start
 # <=>
-node main.js -f "./data/data.ppf"
+node coauth.js -f "./data/data.ppf"
 ```
 
 ### Commande d'éxecution du pré-traitement puis de la recherche
@@ -75,13 +79,13 @@ Voici quelques exemples expliqués de la commande avec l'option process :
 
 ```bash
 # Lance le pré-traitement sur le fichier ./data/dblp.xml, génere le fichier ./data/data.ppf et le nom de l'auteur pour la recherche est demandé dans la console
-node main.js --process ./data/dblp.xml
+node coauth.js --process ./data/dblp.xml
 
 # Lance le pré-traitement sur le fichier ./data/dblp.xml, génere le fichier ./data/data.ppf et fait la recherche sur Fabien Delorme
-node main.js -p ./data/dblp.xml -n "Fabien Delorme"
+node coauth.js -p ./data/dblp.xml -n "Fabien Delorme"
 
 # Lance le pré-traitement sur le fichier ./data/dblp.xml, génere le fichier ./tmp/coauth.ppf et fait la recherche sur Fabien Delorme
-node main.js -p ./data/dblp.xml -n "Fabien Delorme" -f ./tmp/coauth.ppf
+node coauth.js -p ./data/dblp.xml -n "Fabien Delorme" -f ./tmp/coauth.ppf
 ```
 
 Une commande avec npm est aussi disponible, elle est équivalente à la commande en dessous d'elle. Le nom de l'auteur pour la recherche est demandé dans la console lors de l'execution.
@@ -89,12 +93,13 @@ Une commande avec npm est aussi disponible, elle est équivalente à la commande
 ```bash
 npm run process
 # <=>
-node main.js --process ./data/dblp.xml
+node coauth.js --process ./data/dblp.xml
 ```
 
-## Temps d'execution
+### Temps d'exécution
 
 Les temps d'executions des commandes sur nos PC sont de :
 
-- **Préparation** : entre 5 et 6 minutes
+- **Référence** : entre 5 et 6 minutes
+- **Préparation** : environ 2 minutes
 - **Recherche** : entre 5 et 10 secondes

+ 0 - 0
SUBJECT.md → SUBJECT1.md


+ 64 - 0
SUBJECT2.md

@@ -0,0 +1,64 @@
+# TP SAX: PARTIE II
+
+Vous devez réaliser un programme permettant d'extraire une partie de la base de données DBLP représentée au format XML.
+Le choix du langage de programmation et des technologies utilisés sont libres. La qualité du code source ne sera pas évaluée, seul le résultat le sera.
+Votre programme doit, à partir d'un nom d'auteur donné en argument, extraire les informations le concernant sous la forme d'un document XML.
+
+On souhaite extraire les "article" et les "inproceedings" concernant l'auteur, ainsi que la liste de ses coauteurs. Le document résultat devra ressembler à:
+
+```xml
+<extract>
+    <name>Totor le Castor</name>
+    <coauthors>
+        <author>Toto</author>
+        <author>Titi</author>
+    </coauthors>
+<article key="abcdef">
+	<author>Totor le Castor</author>
+	<author>Toto</author>
+	<author>Titi</author>
+	<title>Un article</title>
+	<year>2018</year>
+</article>
+</extract>
+```
+
+Le document doit respecter la DTD suivante:
+
+```dtd
+<!ELEMENT extract (name, coauthors, article*, inproceedings*)>
+<!ELEMENT name (#PCDATA)>
+<!ELEMENT coauthors (author*)>
+<!ELEMENT article (author+,title,year)*>
+<!ATTLIST article key CDATA #REQUIRED>
+<!ELEMENT inproceedings (author+,title,year)*>
+<!ATTLIST inproceedings key CDATA #REQUIRED>
+<!ELEMENT author (#PCDATA)>
+<!ELEMENT title (#PCDATA)>
+<!ELEMENT year (#PCDATA)>
+```
+
+Notez que le contenu des éléments "article" et "inproceedings" est un sous-ensemble des éléments d'origine.
+
+## Critères d'évaluation
+
+Le programme sera testé sur 4 noms d'auteurs.
+Pour chaque nom, si le document XML généré est conforme à la DTD mais le contenu ne correspond pas à ce qui est attendu: 1 point.
+Si le document est conforme, et contient les bonnes informations sauf ce qui concerne les coauteurs : 3 points.
+Si le contenu est conforme et contient les bonnes informations): 5 points.
+
+Pour chaque auteur, le programme sera killé automatiquement au bout de 5 minutes.
+
+## Détails pratiques
+Ce travail est à réaliser en binôme. Vous devrez remettre à l'enseignant une archive .zip ou .tar.gz ou .tgz dont le nom sera les noms de familles dex deux membres du binôme, séparés par un tiret, suivi d'un tiret et du nombre 2 (pour "tp n°2"). Les
+symbôles non alphabétiques seront supprimés, les accents et cédilles supprimés. Par exemple, si votre nom de famille est "de La Tour" et celui de votre binôme "Petit-Grégoire", votre fichier s'appellera
+"delatour-petitgregoire-2.tgz". 
+
+L'archive doit contenir tous vos fichiers sources, ainsi qu'un fichier README indiquant :
+- comment compiler votre programme,
+- comment l'utiliser.
+
+**ATTENTION!** le non-respect de ces consignes entraînera une pénalité de 5 points. En cas de doute, demandez à l'enseignant.
+
+
+Le tout doit être envoyé par mail à l'adresse fdelorme@pm.me au plus tard la veille au soir de l'examen écrit.

+ 87 - 0
SUBJECT3.md

@@ -0,0 +1,87 @@
+# TP XSLT
+
+Vous devez réaliser un document XSLT permettant de transformer le document produit en partie II du TP sur SAX en HTML5.
+Si, par exemple, le document produit est:
+
+    <extract>
+        <name>Totor le Castor</name>
+        <coauthors>
+            <author>Toto</author>
+            <author>Titi</author>
+        </coauthors>
+        <article key="abcdef">
+            <author>Totor le Castor</author>
+            <author>Toto</author>
+            <author>Titi</author>
+            <title>Un article</title>
+            <year>2018</year>
+	   </article>
+    </extract>
+
+Le document HTML5 en sortie sera:
+
+    <!DOCTYPE html>
+    <html>
+        <head>
+            <meta charset="UTF-8"/>
+            <title>Extrait concernant Totor le Castor</title>
+        </head>
+        <body>
+            <h1>Extrait concernant Totor le Castor</h1>
+            <h2>Coauteurs</h2>
+            <div>
+                <p>Totor le castor a écrit avec 2 personnes:</p>
+                <ul>
+                    <li>Titi</li>
+                    <li>Toto</li>
+                </ul>
+            </div>
+            <h2>Articles</h2>
+            <div>
+                <p>Totor le Castor a écrit 1 article:</p>
+                <ul>
+                    <li>
+                        Article "Un article", publié en 2018, auteurs:
+                        <ul>
+                            <li>Totor le Castor</li>
+                            <li>Toto</li>
+                            <li>Titi</li>
+                        </ul>
+                    </li>
+                </ul>
+            </div>
+            <h2>InProceedings</h2>
+            <div>
+                <p>Totor le Castor n'a pas écrit d'article de type inproceedings.</p>
+            </div>
+            <h3>Statistiques sur les articles</h3>
+            <p>En 2018, Totor le Castor a écrit 1 article.</p>
+        </body>
+    </html>
+
+## Précisions
+Le document produit indiquera le nombre de coauteurs de l'auteur (attention au pluriel: "0 personne", "1 personne", "2 personnes", etc.), ainsi que les noms des coauteurs, triés par ordre alphabétique.
+
+Puis il contiendra la liste des articles, triés de l'année la plus
+ancienne à l'année la plus récente, en indiquant la liste des auteurs de
+chaque article, cette fois dans l'ordre du document d'origine. De la même
+manière, il contiendra la liste des in proceedings.
+
+Enfin, on indiquera les statistiques, année par année, en précisant le
+nombre d'articles (et uniquement les articles) publiés cette année-là.
+À nouveau, attention aux pluriels. Si, une année, il n'y a pas eu de
+publication, on l'ignore. Les statistiques seront triées par ordre
+croissant (de l'année la plus ancienne à la plus récente).
+
+## Détails pratiques
+Ce travail est à réaliser en binôme. Vous devrez remettre à l'enseignant
+un fichier .xsl dont le nom sera les noms de familles dex deux membres du
+binôme. Les symbôles non alphabétiques seront supprimés, les accents et
+cédilles supprimés. Par exemple, si votre nom de famille est "de La Tour"
+et celui de votre binôme "Petit-Grégoire", votre fichier s'appellera
+"delatour-petitgregoire.xsl". **ATTENTION!** le non-respect de cette
+consigne entraînera une pénalité de 5 points. En cas de doute, demandez
+à l'enseignant.
+
+Le fichier doit être envoyé par mail à l'adresse fdelorme@pm.me au plus
+tard la veille au soir de l'examen écrit.

+ 3 - 3
main.js → coauth.js

@@ -12,7 +12,7 @@ let preprocessFile = './data/data.ppf';
 let verbose = false;
 
 // Parametrage CLI
-program.version('1.3.3');
+program.version('1.4.0');
 
 program
     .option('-n, --name <string>', 'Nom de l\'auteur dont il faut chercher les co-auteurs')
@@ -104,7 +104,7 @@ function parse(source, dest, callback = null) {
         timer.start();
     }
     // Analyse du fichier xml
-    const parser = require('./src/parser').from(source).to(dest);
+    const parser = require('./src/coauth/parser').from(source).to(dest);
     parser.parse(dest => {
         if (verbose) {
             timer.stop();
@@ -127,7 +127,7 @@ function find(source, name) {
         console.info(`Search for ${name}'s co-authors...`);
         timer.start();
     }
-    const finder = require('./src/finder');
+    const finder = require('./src/coauth/finder');
     finder.in(source).find(name, (result) => {
         if (verbose) {
             timer.stop();

+ 52 - 5
package-lock.json

@@ -1,9 +1,14 @@
 {
   "name": "projet-dblp",
-  "version": "0.0.1",
+  "version": "1.3.3",
   "lockfileVersion": 1,
   "requires": true,
   "dependencies": {
+    "adm-zip": {
+      "version": "0.4.13",
+      "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.13.tgz",
+      "integrity": "sha512-fERNJX8sOXfel6qCBCMPvZLzENBEhZTzKqg6vrOW5pvoEaQuJhRU4ndTAh6lHOxn1I6jnz2NHra56ZODM751uw=="
+    },
     "ansi-escapes": {
       "version": "4.2.1",
       "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.2.1.tgz",
@@ -104,6 +109,11 @@
       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
       "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
     },
+    "html-entities": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz",
+      "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8="
+    },
     "iconv-lite": {
       "version": "0.4.24",
       "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
@@ -112,6 +122,11 @@
         "safer-buffer": ">= 2.1.2 < 3"
       }
     },
+    "inherits": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+    },
     "inquirer": {
       "version": "7.0.0",
       "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.0.tgz",
@@ -170,6 +185,16 @@
       "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
       "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
     },
+    "readable-stream": {
+      "version": "3.4.0",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz",
+      "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==",
+      "requires": {
+        "inherits": "^2.0.3",
+        "string_decoder": "^1.1.1",
+        "util-deprecate": "^1.0.1"
+      }
+    },
     "restore-cursor": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
@@ -195,15 +220,24 @@
         "tslib": "^1.9.0"
       }
     },
+    "safe-buffer": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
+      "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg=="
+    },
     "safer-buffer": {
       "version": "2.1.2",
       "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
       "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
     },
-    "sax": {
-      "version": "1.2.4",
-      "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
-      "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
+    "saxophone": {
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/saxophone/-/saxophone-0.5.0.tgz",
+      "integrity": "sha512-n5CcJShLz8snkPKA7+4Oup9KsgMdSytyHV9mMAAVUyoepydmSyQtk37elZwVrXvTh2bUW4r/XHXDCj0RB10BZg==",
+      "requires": {
+        "readable-stream": "^3.0.3",
+        "string_decoder": "^1.1.1"
+      }
     },
     "signal-exit": {
       "version": "3.0.2",
@@ -220,6 +254,14 @@
         "strip-ansi": "^5.2.0"
       }
     },
+    "string_decoder": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+      "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+      "requires": {
+        "safe-buffer": "~5.2.0"
+      }
+    },
     "strip-ansi": {
       "version": "5.2.0",
       "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
@@ -258,6 +300,11 @@
       "version": "0.5.2",
       "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.5.2.tgz",
       "integrity": "sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw=="
+    },
+    "util-deprecate": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
     }
   }
 }

+ 9 - 8
package.json

@@ -1,6 +1,6 @@
 {
   "name": "projet-dblp",
-  "version": "1.3.3",
+  "version": "1.4.0",
   "description": "Projet cours XML M2 Informatique Artois",
   "homepage": "https://github.com/Loquicom/XML-DBPL",
   "author": {
@@ -14,21 +14,22 @@
     "dbpl",
     "sax"
   ],
-  "main": "main.js",
   "private": true,
   "scripts": {
-    "start": "node main.js",
-    "preprocess": "node main.js prepare ./data/dblp.xml",
-    "exemple": "node main.js --name \"Fabien Delorme\"",
-    "process": "node main.js --process ./data/dblp.xml",
-    "test": "node main.js -n \"Nathalie Chetcuti-Sperandio\" -v"
+    "start": "node coauth.js",
+    "preprocess": "node coauth.js prepare ./data/dblp.xml",
+    "exemple": "node coauth.js --name \"Fabien Delorme\"",
+    "process": "node coauth.js --process ./data/dblp.xml",
+    "test": "node coauth.js -n \"Nathalie Chetcuti-Sperandio\" -v"
   },
   "engines": {
     "node": ">=10.12.0"
   },
   "dependencies": {
+    "adm-zip": "^0.4.13",
     "commander": "^3.0.2",
+    "html-entities": "^1.2.1",
     "inquirer": "^7.0.0",
-    "sax": "^1.2.4"
+    "saxophone": "^0.5.0"
   }
 }

+ 1 - 1
src/finder/finder.js → src/coauth/finder/finder.js

@@ -1,5 +1,5 @@
 const readline = require('readline');
-const file = require('../file');
+const file = require('../../file');
 const result = require('./result');
 
 let instance = null;

+ 27 - 0
src/coauth/finder/formatter.js

@@ -0,0 +1,27 @@
+const Entities = require('html-entities').AllHtmlEntities;
+const entities = new Entities();
+
+const formatter = class Formatter {
+
+    format(result) {
+        let name = this._decode(result.name);
+        let coAuthors = result.coAuthors.map(this._decode);
+        coAuthors.sort(this._alphabeticalSort);
+        let str = `"${name}" has ${coAuthors.length} coauthors:`;
+        for (const index in coAuthors) {
+            str += `\n- ${coAuthors[index]}`;
+        }
+        return str;
+    }
+
+    _decode(elt) {
+        return entities.decode(elt);
+    }
+
+    _alphabeticalSort(a, b) {
+        return (a > b) ? 1 : -1;
+    }
+
+};
+
+module.exports = formatter;

+ 0 - 0
src/finder/index.js → src/coauth/finder/index.js


+ 0 - 0
src/finder/result.js → src/coauth/finder/result.js


+ 0 - 0
src/parser/index.js → src/coauth/parser/index.js


+ 8 - 6
src/parser/parser.js → src/coauth/parser/parser.js

@@ -1,4 +1,5 @@
-const file = require('../file');
+const Saxophone = require('saxophone');
+const file = require('../../file');
 
 const ROOT_TAG = 'dblp';
 const TAGS = [
@@ -24,10 +25,10 @@ const parser = class Parser {
         this.callback = null;
         this.source = null;
         this.dest = null;
-        this.sax = require('sax').createStream(true);
+        this.sax = new Saxophone();
         this.sax.on('error', this._error);
-        this.sax.on('opentag', this._opentag);
-        this.sax.on('closetag', this._closetag);
+        this.sax.on('tagopen', this._opentag);
+        this.sax.on('tagclose', this._closetag);
         this.sax.on('text', this._text);
     }
 
@@ -47,7 +48,7 @@ const parser = class Parser {
             }
         }
         this.callback = callback;
-        file.fs.createReadStream(this.source).pipe(this.sax);
+        file.fs.createReadStream(this.source, {start: 77}).pipe(this.sax);
     }
 
     from(source) {
@@ -84,6 +85,7 @@ const parser = class Parser {
     }
 
     _closetag(tag) {
+        tag = tag.name;
         if (tag === ROOT_TAG && instance.callback !== null) {
             instance.callback(instance.dest);
         } else if (instance._inTag && instance._tag === tag) {
@@ -99,7 +101,7 @@ const parser = class Parser {
 
     _text(text) {
         if (instance._isAuth) {
-            instance._auth.push(text);
+            instance._auth.push(text.contents);
         }
     }
 

+ 0 - 18
src/finder/formatter.js

@@ -1,18 +0,0 @@
-const formatter = class Formatter {
-
-    format(result) {
-        result.coAuthors.sort(this._alphabeticalSort);
-        let str = `"${result.name}" has ${result.coAuthors.length} coauthors:`;
-        for (const index in result.coAuthors) {
-            str += `\n- ${result.coAuthors[index]}`;
-        }
-        return str;
-    }
-
-    _alphabeticalSort(a, b) {
-        return (a > b) ? 1 : -1;
-    }
-
-};
-
-module.exports = formatter;