diff --git a/index.js b/index.js index 34a4d01..ba35796 100644 --- a/index.js +++ b/index.js @@ -7,10 +7,15 @@ var JSONSelect = require('JSONSelect'), xm = require('xml-mapping'), mkdirp = require('mkdirp'), + mustache = require('mustache'), fs = require('fs'), path = require('path'), extend = require('util')._extend; +/* Constantes */ +var JSON_EXTENSION = new RegExp(/(.json)$/g); + +// Main Object var object = {}; // Regroupe les fonctions liées aux chemins @@ -18,13 +23,15 @@ /** * Initialise les chemins d'un module R&D - * @param {Object} paths Liste des chemins sous forme d'objet JSON (clé => valeur) - * @param {String} root Racine du module - * @return {Object} L'objet contenant les chemins initialisés + * @param {object} paths Liste des chemins sous forme d'objet JSON (clé => valeur) + * @param {string} root Racine du module + * @return {object} L'objet contenant les chemins initialisés */ object.paths.init = function(paths, root) { var result = {}; + // Pour chaque chemin for (var k in paths) { + // On construit le chemin absolu if (paths.hasOwnProperty(k) && typeof paths[k] !== 'function') { result[k] = path.join(root, paths[k]); } @@ -36,14 +43,18 @@ object.resources = {}; /** - * Charge toutes les ressources d'un module R&D - * @param {Object} paths Liste des chemins sous forme d'objet JSON (clé => valeur) - * @return {Object} L'objet contenant toutes les ressources + * Require toutes les ressources d'un module R&D + * @param {object} paths Liste des chemins sous forme d'objet JSON (clé => valeur) + * @return {object} L'objet contenant toutes les ressources chargée */ -object.resources.load = function(paths) { +object.resources.require = function(paths) { var result = {}; for (var k in paths) { - result[k] = require(paths[k]); + if ((typeof paths[k] === 'string') && paths[k].match(JSON_EXTENSION)) { // Require du fichier s'il a une extension JSON + result[k] = require(paths[k]); + } else if (typeof paths[k] === 'object') { // Relance du traitement si un c'est un object + result[k] = object.resources.require(paths[k]); + } } return result; }; @@ -59,9 +70,9 @@ * { mime: 'text/plain', original: false }, --> ficher txt généré par LoadIstex (original = false) * { mime: 'text/plain'} --> ficher txt * ] - * @param {Array} files (jsonLine.metadata || jsonLine.fulltext) - * @param {Array} options Liste (ordonnées) des caractéristiques du document recherché - * @return {Array} L'objet correspondant le mieux aux critères ou [] + * @param {array} files (jsonLine.metadata || jsonLine.fulltext) + * @param {array} options Liste (ordonnées) des caractéristiques du document recherché + * @return {array} L'objet correspondant le mieux aux critères ou [] */ object.files.selectAll = function(files, options) { var result = [], @@ -91,9 +102,9 @@ * { mime: 'text/plain', original: false }, --> ficher txt généré par LoadIstex (choix n°1) * { mime: 'text/plain'} --> ficher txt (choix n°2, seulement s'il n'y a aucun choix n°1) * ] - * @param {Array} files (jsonLine.metadata || jsonLine.fulltext) - * @param {Array} options Liste (ordonnées) des caractéristiques du document recherché - * @return {Object} L'objet correspondant le mieux aux critères ou null + * @param {array} files (jsonLine.metadata || jsonLine.fulltext) + * @param {array} options Liste (ordonnées) des caractéristiques du document recherché + * @return {object} L'objet correspondant le mieux aux critères ou null */ object.files.select = function(files, options) { for (var i = 0; i < options.length; i++) { @@ -108,9 +119,9 @@ * Exemple : Je souhaite récupérer le fichier txt généré par LoadIstex * files = docObject.fulltext (paramètre du docObject contenant les infos liées au fulltext) * criteria = { mime: 'text/plain', original: false }, --> ficher txt généré par LoadIstex - * @param {Array} files Tableau d'objet représentant un ensemble de fichier (ex : jsonLine.metadata || jsonLine.fulltext) - * @param {Object} criteria Objet regroupant les critères du document recherché - * @return {Object} L'objet correspondant ou null + * @param {array} files Tableau d'objet représentant un ensemble de fichier (ex : jsonLine.metadata || jsonLine.fulltext) + * @param {object} criteria Objet regroupant les critères du document recherché + * @return {object} L'objet correspondant ou null */ object.files.get = function(files, criteria) { var keys = Object.keys(criteria); @@ -130,13 +141,13 @@ * Pour l'id: 0123456789012345678901234567890123456789 * - directory => [corpusPath]/0/1/2/0123456789012345678901234567890123456789/[type]/([label]/) * - filename => 0123456789012345678901234567890123456789.([label].)[extension] - * @param {Object} options Objet comportant toutes les informations nécessaire à la création du chemin : - * - {String} corpusPath Chemin du corpusOutput - * - {String} id Id Istex du document - * - {String} type Type de document (metadata | enrichements | fulltext) - * - {String} label Label du module (ce qui permet d'ajouter un sous-répertoire dédié au module, utile dans le cas où plusieurs enrichissements différents peuvent être produits) - * - {String} extension Extension du document (ex : .tei.xml) - * @return {Object} fileInfos sous la forme : { filemane, directory } + * @param {object} options Objet comportant toutes les informations nécessaire à la création du chemin : + * - {string} corpusPath Chemin du corpusOutput + * - {string} id Id Istex du document + * - {string} type Type de document (metadata | enrichments | fulltext) + * - {string} label Label du module (ce qui permet d'ajouter un sous-répertoire dédié au module, utile dans le cas où plusieurs enrichissements différents peuvent être produits) + * - {string} extension Extension du document (ex : .tei.xml) + * @return {object} fileInfos sous la forme : { filemane, directory } */ object.files.createPath = function(options) { var result = null; @@ -149,12 +160,68 @@ return result; }; +// Regroupe les fonctions liées aux fichiers TEI dans la chaine LoadIstex +object.enrichments = {}; + +/** + * Sauvegarde un enrichissement dans le jsonLine + * @param {object} enrichments enrichments d'un jsonLine d'un docObject + * @param {object} options Options : + * - {string} label Label du module + * - {object} enrichment Enrichissment à sauvegarder + * @return {undefined} Return undefined + */ +object.enrichments.save = function(enrichments, options) { + // Si jsonLine ne contient pas encore de clé enrichments + if (!enrichments) enrichments = {}; + // Si enrichments[options.label] ne contient pas encore d'enrichissement + if (!enrichments[options.label]) { + enrichments[options.label] = []; + enrichments[options.label].push(options.enrichment); + } else { + var isAlready = object.files.get(enrichments[options.label], options.enrichment); + // Si l'objet n'est pas déjà dans le jsonLine + if (!isAlready) { + // Ajout de l'enrichissement + enrichments[options.label].push(options.enrichment); + } + } + return enrichments; +}; + +/** + * Écrit un fichier de TEI + * @param {object} options Objet comportant toutes les informations nécessaire à la création du chemin : + * - {string} template Chemin du Tempalte + * - {object} data Données à insérer dans le Template + * - {object} output Données sur l'Output (voir : object.files.createPath) + * @param {function} cb Callback appelée à la fin du traitement, avec comme paramètre disponible : + * - {Error} err Erreur de Lecture/Écriture + * @return {undefined} Return undefined + */ +object.enrichments.write = function(options, cb) { + // Récupération du fragment de TEI + fs.readFile(options.template, 'utf-8', function(err, tpl) { + // Lecture impossible + if (err) return cb(err); + // Si le répertoire n'existe pas + object.directories.sync(options.output.directory); + // Construction du fragment depuis le template et du nom de fichier + var fragment = mustache.render(tpl, options.data), + filename = path.join(options.output.directory, options.output.filename); + // Écriture du fragment de TEI + fs.writeFile(filename, fragment, 'utf8', function(err) { + return cb(err); + }); + }); +}; + // Regroupe les fonctions liées aux répertoires dans la chaine LoadIstex object.directories = {} /** * Créer un répertoire s'il n'existe pas déjà - * @param {String} path Chemin du répertoire à créer + * @param {string} path Chemin du répertoire à créer * @return {undefined} Return undefined */ object.directories.sync = function(path) { @@ -170,8 +237,8 @@ /** * Parse le contenu d'un fichier XML - * @param {String} xmlStr Sélecteur - * @return {Object} Objet JSON représentant le document XML ou null + * @param {string} xmlStr Sélecteur + * @return {object} Objet JSON représentant le document XML ou null */ object.XML.load = function(xmlStr) { var result = xm.load(xmlStr); @@ -180,9 +247,9 @@ /** * Retourne les élement présent dans un xml "JSONifié" correspondant au sélecteur indiqué - * @param {String} selector Sélecteur - * @param {Object} jsonObject Objet JSON représentant un document xml - * @return {Array} Array contenant les éléments sélectionnés + * @param {string} selector Sélecteur + * @param {object} jsonObject Objet JSON représentant un document xml + * @return {array} Array contenant les éléments sélectionnés */ object.XML.select = function(selector, jsonObject) { try { @@ -197,9 +264,9 @@ /** * Construit l'url d'une requête http GET - * @param {String} url Toutes la partie de l'url avant le '?' - * @param {Object} parameters Paramètres à ajouter à l'url (après le '?') - * @return {String} L'url complète encodée + * @param {string} url Toutes la partie de l'url avant le '?' + * @param {object} parameters Paramètres à ajouter à l'url (après le '?') + * @return {string} L'url complète encodée */ object.URL.addParameters = function(url, parameters) { var keys = Object.keys(parameters), diff --git a/package.json b/package.json index 28ef2fb..239c5bd 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "async": "^2.1.4", "mkdirp": "^0.5.1", "mocha": "^3.2.0", + "mustache": "^2.2.1", "rd-tu": "git+ssh://vsistex.intra.inist.fr:22222/istex/rd-tu.git" } }