Skip to content
Snippets Groups Projects
Commit 604e0b8e authored by dje's avatar dje
Browse files

amélioration install d'une édition, des plugins + debug mathjax

max.sh exécutable hors répertoire tools + readme docker
parent 3509f816
No related branches found
No related tags found
No related merge requests found
......@@ -5,17 +5,19 @@
"main": "max.js",
"repository": "git@git.unicaen.fr:pdn-certic/MaX.git",
"author": "JC / Certic / DSI / Unicaen",
"devDependencies": {
"babel-polyfill": "^6.26.0",
"bootstrap": "^4.3.1",
"jquery": "^3.3.1",
"popper.js": "^1.14.7"
},
"license": "CECILL",
"private": true,
"scripts": {},
"dependencies": {
"babel-polyfill": "^6.26.0",
"bootstrap": "^4.3.1",
"child_process": "^1.0.2",
"fs": "0.0.1-security",
"install": "^0.12.1",
"jquery": "^3.3.1",
"mathjax": "^2.7.7",
"openseadragon": "^2.4.1",
"popper.js": "^1.14.7",
"readline": "^1.3.0",
"xmldom": "^0.1.27"
}
......
import {Plugin} from '../../core/ui/js/Plugin.js';
// const MathJax = require('mathjax');
class EquationPlugin extends Plugin{
constructor(name) {
......@@ -9,8 +9,12 @@ class EquationPlugin extends Plugin{
run(){
if(!this.docWithEquation())
return;
//appends lib into head element
$("head").append('<script type="text/javascript" src="' + MAX.getBaseURL() +'/'+projectId+ '/core/ui/js/lib/MathJax/MathJax.js?config=TeX-AMS_HTML.js"></script>');
//appends lib + conf into head element
let mathjax = "<script type='text/x-mathjax-config'>";
mathjax += "MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]}";
mathjax+=",TeX: {Macros: {textnormal: '{}',ad: '{=}'}}});</script>";
$("head").append(mathjax);
$("head").append('<script type="text/javascript" src="'+MAX.getBaseURL() +projectId+ '/core/ui/lib/mathjax/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>');
//appends text options components
$("#options-list").append("<li role='separator' class='divider'></li><li><a href='#'>"
......@@ -24,23 +28,7 @@ class EquationPlugin extends Plugin{
setEquationsVisible(){
$(".tex").show();
$(".formula").hide();
enableAndRunMathJax();
}
enableAndRunMathJax(){
MathJax.Hub.Config({
tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]},
TeX: {
Macros: {
textnormal: '{}',
ad: '{=}'
}
}
});
MathJax.Hub.Queue(["Typeset", MathJax.Hub]);
}
toggleModernEquations(on){
console.log("Set modern equations visible =" + on)
......
Plugin de gestion des équations
=======================
Nécessite l'installation de la librairie Mathjax:
```
$ yarn add mathjax
```
\ No newline at end of file
* Fonctionne avec la librairie Mathjax
* Pour que le plugin fonctionne, la librairie doit être présente dans le dossier ui/lib
{
"mathjax": "node_modules/mathjax"
}
......@@ -19,7 +19,7 @@ function max.plugin.img_viewer:viewer($projectId, $path, $img){
return
<div id='img_viewer'>
<div id="openseadragon1" style="width: 800px; height: 600px;"></div>
<script src="{max.config:getBaseURI() || $projectId|| '/core/ui/js/openseadragon.min.js'}">
<script src="{max.config:getBaseURI() || $projectId|| '/core/ui/lib/openseadragon.min.js'}">
</script>
<script type="text/javascript">{
"var viewer = OpenSeadragon({
......
Plugin d'affichage des images
=======================
Nécessite l'installation de la librairie Openseadragon:
```
$ yarn add openseadragon
```
\ No newline at end of file
* Fonctionne avec la librairie Openseadragon
* Pour que le plugin fonctionne, la librairie doit être présente dans le dossier ui/lib
{
"openseadragon": "node_modules/openseadragon/build/openseadragon"
}
......@@ -20,7 +20,7 @@ Vous pouvez nous contacter via [contact.certic@unicaen.fr](mailto:contact.certic
- Java 8+
- NodeJS et Yarn
- NodeJS (et npm)
- xmllint
......@@ -29,7 +29,7 @@ Vous pouvez nous contacter via [contact.certic@unicaen.fr](mailto:contact.certic
## Installation
```bash
$ yarn install
$ cd tools && ./max.sh --init
# change dir to your basex app folder
$ cd </path/to/basex>/webapp
# create a symlink on your MaX instance
......@@ -103,10 +103,34 @@ Ces opérations de création et d'inclusion de fichier sont effectuées automati
### Plugins
## Exécution dans un container Docker
Certains plugins ont des dépendances vers des librairies js (ex : *img_viewer* requiert *OpenSeadragon*).
Ces librairies sont automatiquement copiées à l'installation du plugin pour une édition à la lecture
du fichier *plugins/<plugin_name>/dependencies.json*.
Ex : l'édition de démo fonctionnant avec les plugins *img_viewer* et *equations*, les librairies *Mathjax* et *Openseadragon* sont
automatiquement copiés lors de l'installation de l'édition (lecture de *equations/dependencies.json* et *img_viewer/dependencies.json*).
## Exécution d'une édition dans un container Docker
** L'image ne peut être créée que si une édition existe (la création d'une image à partir d'un MaX vide est impossible, et inutile !). **
Création de l'image de l'édition (exemple avec l'édition de démonstration) puis lancement du container accessible sur le port 9999 (base XML du projet stockée dans */opt/basex/data/max_demo_lorem* :
Création de l'édition de démonstration
```
$ ./tools/max.sh --init && ./tools/max.sh --install-demo
```
Ajout des droits sur les données de la base pour le container :
```
$ sudo chown -R 1984 /opt/basex/data
```
Création de l'image de l'édition puis lancement du container :
```
$ sudo docker build -t unicaen/max_demo_lorem .
$ sudo docker run -ti -p 9999:8984 --volume /opt/basex/data/max_demo_lorem:/srv/basex/data/max_demo_lorem unicaen/max-demo-lorem
......
//checks dependencies availabilty
var execSync;
var fs;
try {
require.resolve("readline");
require.resolve("xmldom");
execSync = require('child_process').execSync;
fs = require('fs');
} catch (e) {
console.log("Missing librairies - Please run npm install readline xmldom");
console.log("Missing librairies - Please run npm install readline xmldom child_process");
process.exit(e.code);
}
......@@ -14,11 +19,11 @@ var DOMParser = require('xmldom').DOMParser;
var XMLSerializer = require('xmldom').XMLSerializer;
const CONFIGURATION_FOLDER_PATH = "../configuration/";
const EDITIONS_FOLDER_PATH = "../editions/";
const CONFIGURATION_FOLDER_PATH = __dirname + "/../configuration/";
const EDITIONS_FOLDER_PATH = __dirname + "/../editions/";
const MAIN_CONFIG_FILE_NAME = "configuration.xml";
const MAIN_CONFIG_FILE = CONFIGURATION_FOLDER_PATH + MAIN_CONFIG_FILE_NAME;
const TEMPLATE_CONFIG_FILE = "./edition_conf_tmpl.xml";
const TEMPLATE_CONFIG_FILE = __dirname + "/edition_conf_tmpl.xml";
const DEMO_CONFIG_INC = EDITIONS_FOLDER_PATH + "demo_lorem/demo_lorem_config_inc.xml"
......@@ -42,16 +47,11 @@ function new_edition(editionId) {
rl.question('Chemin de la collection XML?', function (answer) {
var db = answer;
rl.question('Vocabulaire XML du projet (tei, ead, ...)?', function (answer) {
var type = answer;
rl.close();
create_project_baseconf(editionId, db, type);
});
});
......@@ -64,29 +64,24 @@ function new_edition(editionId) {
function create_project_baseconf(id, db, type_env) {
var template = fs.readFileSync(TEMPLATE_CONFIG_FILE, {encoding: 'utf-8'})
template = template.replace("%ID%", id).replace("%DB%", db).replace("%ENV%", type_env);
//Écriture du fichier de config.
var filename = id + "_config_inc.xml";
fs.writeFile(filename, template, function (err) {
if (err) {
return console.log(err);
}
if (!fs.existsSync(EDITIONS_FOLDER_PATH + id)) {
fs.mkdirSync(EDITIONS_FOLDER_PATH + id, (err) => {
if (err) console.log(err);
});
}
//Déplacement du fichier créé dans le répertoire de l'édition.
fs.rename(filename, EDITIONS_FOLDER_PATH + id + "/" + filename, function (err) {
if (err) {
return console.log(err);
}
});
console.log("=== Création du fichier de configuration " + filename + " - OK");
include_baseconf(EDITIONS_FOLDER_PATH + id + "/" + filename);
......@@ -100,17 +95,15 @@ Inclusion d'une configuration d'une édition au sein de la configuration globale
function include_baseconf(config_file) {
try {
var include_content = "<xi:include href='" + config_file + "' xmlns:xi='http://www.w3.org/2001/XInclude'/>";
var relative_file = config_file.split(__dirname +'/')[1]
var include_content = "<xi:include href='" + relative_file + "' xmlns:xi='http://www.w3.org/2001/XInclude'/>";
var config_content = fs.readFileSync(config_file, {encoding: 'utf-8'})
var include_dom = new DOMParser().parseFromString(include_content);
var config_content = fs.readFileSync(MAIN_CONFIG_FILE, {encoding: 'utf-8'})
var config_dom = new DOMParser().parseFromString(config_content);
installPluginDependencies(new DOMParser().parseFromString(config_content));
var main_config_content = fs.readFileSync(MAIN_CONFIG_FILE, {encoding: 'utf-8'})
var config_dom = new DOMParser().parseFromString(main_config_content);
var editions_node =
config_dom.getElementsByTagName('configuration')[0].getElementsByTagName('editions')[0];
var a = config_dom.importNode(include_dom, 1);
editions_node.appendChild(a);
var s = new XMLSerializer();
......@@ -120,10 +113,39 @@ function include_baseconf(config_file) {
if (err) {
return console.log("erreur de sérialisation / " + err);
}
console.log("=== Mise à jour de la configuration principale de MaX (inclusion de " + config_file + ") - OK");
console.log("=== Mise à jour de la configuration principale de MaX (inclusion de " + relative_file + ") - OK");
});
} catch (e) {
console.log(e)
}
}
/*
* Installation des plugins
*/
function installPluginDependencies(dom){
let pluginElts = dom.getElementsByTagName('plugins')[0].getElementsByTagName('plugin');
if(pluginElts.length > 0)
console.log("==== Installation des plugins [" + pluginElts.length +"]")
else {
console.log("==== Aucun plugin a installer")
}
for(let i = 0; i < pluginElts.length; i++){
let name = pluginElts[i].getAttribute('name');
let path = '../plugins/' + name +'/resources.json';
if (fs.existsSync(path)) {
console.log(' + Installation des dépendences pour ' + name);
let data = fs.readFileSync(path);
let deps = JSON.parse(data);
Object.keys(deps).forEach(function(k,v){
console.log(' cp -r ../'+deps[k] +' ../ui/lib/');
execSync('cp -r ../'+deps[k] +' ../ui/lib/');
});
}
else{
console.log(' - Pas de dépendences pour ' + name);
}
}
}
#!/bin/bash
PWD=`pwd`
#PWD=`pwd`
PORT=1984
DIRECTORY=$(cd `dirname $0` && pwd)
display_usage(){
echo ""
......@@ -15,7 +16,7 @@ display_usage(){
}
db_demo_feed(){
db_project_feed max_demo_lorem $PWD/demo/demo_data/
db_project_feed max_demo_lorem $DIRECTORY/demo/demo_data/
}
#adds xml datas to a new db
db_project_feed(){
......@@ -43,21 +44,21 @@ db_project_feed(){
}
demo_edition_build(){
if [ ! -d ../editions ]
if [ ! -d $DIRECTORY/../editions ]
then
echo 'Création répertoire "editions"'
mkdir ../editions
mkdir $DIRECTORY/../editions
fi
if [ -d ../editions/demo_lorem ]; then
if [ -d $DIRECTORY/../editions/demo_lorem ]; then
echo "Suppression de la demo existante"
rm -rf ../editions/demo_lorem
rm -rf $DIRECTORY/../editions/demo_lorem
fi
cp -r demo/demo_edition ../editions/demo_lorem
cp demo/demo_lorem_config_inc.xml ../editions/demo_lorem
cp -r $DIRECTORY/demo/demo_edition $DIRECTORY/../editions/demo_lorem
cp $DIRECTORY/demo/demo_lorem_config_inc.xml $DIRECTORY/../editions/demo_lorem
echo " -> resource files copy: DONE"
node edition_manager.js -demo
node $DIRECTORY/edition_manager.js -demo
if [ $? -ne 0 ]
then
echo 'Process failed'
......@@ -73,17 +74,22 @@ new_edition_build(){
}
format_configuration_file(){
FILE="../configuration/configuration.xml"
FILE=$DIRECTORY"/../configuration/configuration.xml"
mv $FILE $FILE".bak" || exit 1
xmllint --format $FILE".bak" > $FILE
rm $FILE".bak"
}
init_max(){
cd ..
bower install && gulp build
cd $DIRECTORY/..
echo " -> Installation des dépendences node"
npm install
echo " -> Création du .ignore dans le répertoire nodes_modules"
#creates a .ignore file in nodejs dependencies folder
touch $PWD"/../node_modules/.ignore"
touch $DIRECTORY"/../node_modules/.ignore"
echo "
*** Initialisation de MaX terminée :) ***
";
}
......@@ -106,7 +112,7 @@ fi
if [ ! -f "../configuration/configuration.xml" ]
then
echo "Configuration file does not exists: copying the .dist one"
cp ../configuration/configuration.dist.xml ../configuration/configuration.xml
cp $DIRECTORY/../configuration/configuration.dist.xml $DIRECTORY/../configuration/configuration.xml
fi
......@@ -117,12 +123,12 @@ then
read -e -p "Dossier des sources XML à charger ?" data_path
db_project_feed $project_id $data_path
#mkdir $PWD/../editions/$project_id
mkdir $PWD/../editions/$project_id/ui
mkdir $PWD/../editions/$project_id/ui/css
mkdir $PWD/../editions/$project_id/ui/js
mkdir $PWD/../editions/$project_id/ui/images
touch $PWD/../editions/$project_id/ui/css/$project_id.css
cp $PWD/menu_default.xml $PWD/../editions/$project_id/menu.xml
mkdir $DIRECTORY/../editions/$project_id/ui
mkdir $DIRECTORY/../editions/$project_id/ui/css
mkdir $DIRECTORY/../editions/$project_id/ui/js
mkdir $DIRECTORY/../editions/$project_id/ui/images
touch $DIRECTORY/../editions/$project_id/ui/css/$project_id.css
cp $DIRECTORY/menu_default.xml $DIRECTORY/../editions/$project_id/menu.xml
exit 0
fi
......
../../node_modules/openseadragon/build/openseadragon
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment