Commit 502c52ed authored by Jerome Chauveau's avatar Jerome Chauveau
Browse files

Initial commit from poc repository.

parent bb41440e
Loading
Loading
Loading
Loading

.gitignore

0 → 100644
+8 −0
Original line number Diff line number Diff line
/content_html
/templates
/autoroute
/package
.max
.idea
/config.xml
/dist

Makefile

0 → 100644
+127 −0
Original line number Diff line number Diff line
SRC_DIR=${CURDIR}/src

install-basex: # BaseX & dépendances: Téléchargement, installation et définition du mot de passe admin
	@if [ -d '.max/basex' ]; then\
		echo 'BaseX install OK.';\
	else\
	  	mkdir .max;\
		cd .max;\
		curl https://files.basex.org/releases/11.1/BaseX111.zip --output BaseX111.zip;\
		unzip BaseX111.zip;\
		curl https://repo1.maven.org/maven2/net/sf/saxon/Saxon-HE/10.8/Saxon-HE-10.8.jar --output Saxon-HE-10.8.jar;\
		mv Saxon-HE-10.8.jar basex/lib/custom/;\
		rm BaseX111.zip;\
		cd ..;\
		./.max/basex/bin/basexhttpstop || true;\
		./.max/basex/bin/basexhttp -S ;\
		echo 'Please define a BaseX admin password';\
		./.max/basex/bin/basex -c'PASSWORD';\
		./.max/basex/bin/basexhttpstop;\
		echo 'BaseX install done.';\
    fi
.PHONY: install-basex


install: install-basex ## Installation de MaX
	@if [ -d '.max/basex/webapp/max' ]; then\
		echo 'MaX install OK.';\
	else\
		mkdir -p .max/basex/webapp/max;\
	  	mkdir -p .max/basex/repo/max;\
		ln -s $(SRC_DIR)/main/webapp/routes.xqm .max/basex/webapp/max/routes.xqm;\
		ln -s $(SRC_DIR)/resources .max/resources;\
		ln -s ../../../../expath-pkg.xml .max/basex/repo/max/expath-pkg.xml;\
		ln -s $(SRC_DIR)/main/core .max/basex/repo/max/max;\
		ln -s ../fixtures .max/fixtures;\
		echo 'MaX install done.';\
	fi
.PHONY: install

package: install ## Construction d'une version distribuable de MaX
	@if [ -d package ]; then\
		rm -rf package;\
	fi
	@mkdir -p package
	@cp -rL .max package/.max
# nettoyage du BaseX copié : suppression fichiers liées aux bundles, des données
	@rm package/.max/basex/.basex
	@rm package/.max/basex/webapp/max/*.xqm
	@rm -rf package/.max/basex/repo/max-*
	@find package/.max/basex/data/ -mindepth 1 -type d -exec rm -rf '{}' '+'
# copie des sources à la racine du .max
	@cp $(SRC_DIR)/main/webapp/routes.xqm package/.max/basex/webapp/max/
	@mkdir package/.max/src
	@cp -r src/main package/.max/src/
# génération d'un fichier VERSION
	@git rev-parse HEAD >> package/VERSION
	@echo 'Package built in package directory.'
# création du Makefile (les cibles de dev sont supprimées)
	@echo -n "SRC_DIR=$$" > package/Makefile
	@echo "{CURDIR}/.max/src" >> package/Makefile
	@awk '/.PHONY: package/ {p=1;next}p' Makefile >> package/Makefile
.PHONY: package

demo:  ## Installation d'une édition de démo
	@if [ ! -d '.max/basex' ]; then\
		echo 'MaX is not installed, please run make install first.';\
	else\
		cp -r .max/fixtures/max .max/basex/data/;\
		cp -r .max/fixtures/content_html .;\
		cp -r .max/fixtures/templates .;\
		cp -r .max/fixtures/autoroute .;\
		cp -r .max/fixtures/config.xml .;\
		ln -s $(SRC_DIR)/main/bundles/max-autoroute-bundle/autoroute/webapp/autoroute.xqm .max/basex/webapp/max/autoroutes.xqm;\
		ln -s $(SRC_DIR)/main/bundles/max-content-html-bundle/content-html/webapp/content-html.xqm .max/basex/webapp/max/content-html.xqm;\
		ln -s $(SRC_DIR)/main/bundles/max-content-html-bundle .max/basex/repo/max-content-html-bundle;\
		ln -s $(SRC_DIR)/main/bundles/max-autoroute-bundle .max/basex/repo/max-autoroute-bundle;\
		ln -s $(SRC_DIR)/main/bundles/max-tei-bundle .max/basex/repo/max-tei-bundle;\
		echo 'demo installed.';\
	fi
.PHONY: demo

check: ## vérification de la configuration
	@if [ -f 'config.xml' ]; then\
		.max/basex/bin/basex -q"validate:rng('config.xml', '.max/resources/max-configuration.rng')" || false;\
		echo 'SUCCESS : config.xml file is valid.';\
	else\
  		echo 'Missing configuration file : config.xml';\
  		exit 1;\
  	fi
.PHONY: check

run:  check ## Lancement de MaX
	@.max/basex/bin/basexhttpstop || true
	@.max/basex/bin/basexhttp -h1234
.PHONY: run

build:	run ## Construction de la version statique dans le répertoire dist/
	@if [ -d dist ]; then\
		rm -rf dist;\
	fi
	sleep 5
	@echo "Statification..." ; \
	wget -P dist -nH --mirror --page-requisites --html-extension --convert-links 'http://127.0.0.1:1234/fr/pages/index.html' ; \
	echo "Version statique construite dans le répertoire dist/"
.PHONY: build

clean: ## Supprime l'installation de MaX et les fichiers du projet
	@read -p "Êtes-vous sûr? [o/N] " ans && ans=$${ans:-N} ; \
    if [ $${ans} = o ] || [ $${ans} = O ]; then \
		rm -rf content_html;\
		rm -rf templates;\
		rm -rf autoroute;\
		rm config.xml;\
		rm -rf .max;\
    else \
        echo "Opération annulée" ; \
    fi
.PHONY: clean

help: ## Affiche cette aide
	@echo "\nChoisissez une commande. Les choix sont:\n"
	@grep -E '^[0-9a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "  \033[0;36m%-12s\033[m %s\n", $$1, $$2}'
	@echo ""
.PHONY: help

test:
	@echo $(SRC_DIR)
 No newline at end of file
+111 −52
Original line number Diff line number Diff line
# max-v2
# MaX v2

## La collaboration devrait s'articuler autour de la prochaine version de MaX. ##
## Prérequis
 - Java

### Objectifs ###
## Dépendances
 - BaseX
 - Saxon

Fournir un environnement applicatif permettant l'affichage et la lecture de sources structurées en XML dans un environnement web.    
Cet outil — moteur d'affichage XML — se composera :
Celles-ci sont automatiquement installées par la commande `make install`

- d'un cœur applicatif : @todo
- de modules : @todo
## Installation

### Exigences fonctionnelles ###
``
make help
``

L'outil doit :
## Fonctionnement général

- proposer des modules d'affichage pour les vocabulaires TEI et EAD ;
- faciliter la modification des comportements par défaut ;
- permettre l'intégration de nouvelles fonctionnalités sans modification du coeur applicatif ;
- proposer une solution de statification/pétrifications des contenus générés.
L'application est scindée en 2 blocs :
 - le cœur : déclaration des routes/fonctionnalités de base, accès aux sources xml et à la configuration, système de templating, traduction etc.
 - les bundles : chaque bundle ajoute une (ou des) fonctionnalité à MaX.

### Exigences techniques ###
Il existe actuellement 3 bundles en cours de développement :
 - max-tei-bundle : bundle de gestion de l'affichage de sources encodées selon le vocabulaire XML-TEI.
 - max-contents-html-bundle : affichage de fichiers statiques HTML stockés dans le répertoire `content_html`.
 - max-autoroute-bundle : exécution d'une xquery dont la route correspond à un fichier du même nom.

- fonctionner sur un environnement Unix ;
- permettre la modification des comportements via les languages XQuery et XSL ;
- proposer un fonctionnement simplifié avec stockage des sources sur le système de fichier ;
- permettre un fonctionnement avancé avec utilisation d'une base de données XML BaseX ;
- proposer un code source facilitant l'utilisation d'autres systèmes de stockage des sources (SGBD par exemple) ;
- minimiser les dépendances logicielles ;
- proposer la solution la plus légère et écologique possible.
Les sources XML à afficher doivent être stockées dans une base nommée `max`.

### Pistes ###
## Bundle de vocabulaire
    
On s'inspire de Francium (makefile et le moins de technologies mobilisées possibles). On ajoute simplement un appel, ou des appels, saxon pour la transformation du corpus XML en HTML. L'appel aux XSLs devra être clarifié, mais il dépendra des modules installés et appelés. Il sera probablement indispensable de disposer d'un ou deux scénarios de transformations de base un peu "câblés" : un pour les données encodées en TEI et un pour les données encodées en EAD.
Un bundle de *vocabulaire* est spécialisé dans le rendu d'un vocabulaire XML. C'est le cas du `max-tei-bundle`.
Ce type de bundle doit contenir :
 - une fonction xquery déclarée dans l'espace de nom du bundle et définie par `[ns]:doc-to-html($document as document-node(), $lang as xs:string)`
  Cette fonction sera automatiquement appelée par le cœur pour la route `/{$lang=[a-z]{2}}/{$collection=.+}/{$doc=[a-zA-Z0-9_]+}.html`
 - un dossier templates contenant les templates :
   - `page.html` : template appliqué par défaut par le cœur pour les rendus des différentes pages
   - `error.html` : template d'erreur appliqué par défaut par le cœur
 - un fichier `expath-pkg.xml` définissant le module au format EXPath
 - un dossier `autoroute` (optionnel) avec un fichier `[page].xq` pour chaque fonctionnalité servie sur la route `/{$lang=[a-z]{2}}/{$page=[a-zA-Z0-9_]+}.html`
 - un dossier `webapp` (optionnel) contenant les routes (restxq) servies par le bundle
 - un dossier `locales` (optionnel) avec un fichier `[codelang].json` par langues gérées
 - un dossier `static` (optionnel) contenant les assets du bundle (fichiers js, css, images etc.)

Pas de solution de stockage par défaut : ce sont des fichiers stockés sur le système de fichiers qui seront transformés en HTML.

Il faudra que l'utilisateur exprime sa volonté d'utiliser une solution de stockage (BaseX ou SGBDR (PGSQL probablement?)) en intervenant dans le fichier de configuration directement. Cette solution permet de fixer le coût d'entrée technique : si l'utilisateur ne sait pas intervenir dans un script `sh`, pas la peine d'y mettre le nez plus avant… il devra se contenter d'utiliser la version de base du moteur qui devra proposer un résultat HTML minimal exploitable (façon TEIPublisher).
### Configuration

La modification du comportement des transformations (et des requêtes XQuery le cas échéant) se fera *via* un simple mécanisme de renommage des fichiers avec un suffixe, ou un préfixe, qui sera pris en charge préférentiellement dès qu'il existera (ie : tohtml_custom.xsl sera utilisé à la place de tohtml.xsl).
La configuration se fait dans le fichier `config.xml`.

L'ogranisation sera basée sur des modules. Les utilisateurs devront pouvoir ajouter des modules facilement. Certains modules seront "certifiés" par l'équipe de développement de MaX, garantissant ainsi leurs bon fonctionnement.
Afin d'opérer à un rendu, un bundle de vocabulaire doit être déclaré dans le fichier de configuration de MaX.

Intégration d'Heimdall (à discuter précisément avec Régis).
Exemple de configuration minimale :

Intégration de DTS. C'est une expérimentation à laquelle nous nous sommes engagée dans le cadre de Biblissima+. Lors des dernières journées du cluster 5b, il apparaît que DTS (dont une POC est développée en XQquery dans BaseX) pourrait être une solution élégante et efficace pour permettre de renvoyer côté données l'accès aux fragments (introduction, chapitre, section, etc.). En effet, en s'appuyant sur un élément TEI dédié (spécialement ajouté pour DTS) il est possible de faire l'association entre un type de partie de texte et un XPath directement dans une instance XML. Voir la définition de l'élément [citeStructure](https://tei-c.org/release/doc/tei-p5-doc/en/html/ref-citeStructure.html) 
````xml
<configuration xmlns="http://certic.unicaen.fr/max/ns/1.0" env="dev" vocabulary-bundle="max-tei-bundle">
    <languages>
        <language>fr</language>
        <language>en</language>
    </languages>
    <title>mon Corpus Numérique</title>
</configuration>
````

MaX embarquera (ou permettra l'installation) de :

- saxon ;
- BaseX (pas embarqué par défaut) ;
- serveur web (pour permettre l'affichage des pages HTML dans le cadre d'une utilisation de base). De cette manière le comportement du moteur sera toujours le même, quelle que soit la solution de stockage retenue.
### Modules XQuery
Le cœur et les bundles sont packagés puis déclarés comme modules XQUERY ([EXPath Packaging](https://docs.basex.org/12/Repository#expath_packaging)) auprès de BaseX afin de faciliter
le développement.


Proposition d'organisation des fichiers (avec probablement plein de problèmes à discuter…) :
## Organisation des sources

- `src` : toutes les sources
  - `main` : sources applicatives
    - `core`
    - `bundles`
    - `webapp`
  - `resources` : ressources additionnelles  
  - `test` : source des tests

```
## Le dossier `.max`

.
├── app
├── content
├── data
├── modules
│   ├── actes
│   ├── dts
│   ├── ead
│   ├── heimdall
│   ├── inventaires
│   ├── pdf
│   └── tei
└── themes
    ├── css
    ├── js
    └── templates
Il contient le serveur BaseX. C'est un dossier (caché) purement technique dans lequel l'utilisateur n'aura pas (et ne devra pas) intervenir.


```

## Liens symboliques dans un environnement de développement

- dossier `max` dans`.max/basex/webapp/max/` avec lien vers  `src/main/webapp/routes.xqm` et les différents fichiers RestXQ des bundles `src/main/bundles/*/webapp/*.xqm`
- dossier max dans `.max/basex/repo` avec lien vers `src/main/core` et `expath-pkg.xml`
- liens depuis `.max/basex/repo` vers les différents bundles (`src/main/bundles`)

Ces liens sont automatiquement créé par la commande `make install`

*Note* : 
Tous ces liens doivent être gérés par le CLI et/ou le Makefile, le développeur de MaX ou d'un Bundle n'édite que les fichiers dans `src/`.
L'utilisateur édite dans : `/templates`, `/autoroute`, `/content_html`.
Dans la version packagée, les liens symboliques seront remplacés par les fichiers (absence du dossier `src`)

## Les routes principales

### Du cœur

Elles sont déclarées dans le fichier `src/main/routes.xqm`

- `/{$lang=[a-z]{2}}/{$collection=.+}/{$doc=[a-zA-Z0-9_]+}.html` : version HTML du source XML nommé `$doc.xml` dans la collection `$collection`
- `/{$bundle}/static/{$filename}` : fichier statique d'un bundle (js, css, etc.)
- `/sources.zip` : archive zip contenant les sources XML
- `/max-infos.html` : affiche les informations de configuration et d'environnement. (disponible uniquement en mode `dev`)

### Des bundles

#### max-content-html-bundle

`/{$lang=[a-z]{2}}/pages/{$page=[a-zA-Z0-9_]+}.html` : rend la page HTML stockée dans  `content_html/[$lang]/[$page].html`


#### max-autoroute-bundle
`/{$lang=[a-z]{2}}/{$page=[a-zA-Z0-9_]+}.html` : exécute 

- `autoroute/{$page}.xq` : si le fichier existe
- sinon, `.max/basex/repo/${bundle_vocabulaire}/autoroute/{$page}.xq` : si le fichier existe
- sinon, exécute la fonction `${bundle_vocabulaire}:doc-to-html` du bundle de vocabulaire actif (transformation de la source `{$page}.xml`)

Par exemple, si `max-tei-bundle` est actif, la route `/fr/tdm.html` retourne le résultat de `.max/basex/repo/max-tei-bundle/autoroute/tdm.xq`


*Question/remarque* : les fonctionnalités de `max-autoroute-bundle` ne devraient-elle pas être intégrées au cœur ?

## Templating

@todo

## I18n

@todo

config.xml.sample

0 → 100644
+8 −0
Original line number Diff line number Diff line
<?xml version="1.0" encoding="UTF-8"?>
<configuration xmlns="http://certic.unicaen.fr/max/ns/1.0" env="dev" vocabulary-bundle="max-tei-bundle">
    <languages>
        <language>fr</language>
        <language>en</language>
    </languages>
    <title>mon Corpus Numérique</title>
</configuration>

expath-pkg.xml

0 → 100644
+39 −0
Original line number Diff line number Diff line
<package xmlns="http://expath.org/ns/pkg"
         name="max"
         abbrev="max"
         version="0.0.1"
         spec="1.0">

   <title>MaX app</title>

   <xquery>
      <namespace>https://certic.unicaen.fr/max/conf</namespace>
      <file>conf.xqm</file>
   </xquery>

   <xquery>
      <namespace>https://certic.unicaen.fr/max/database</namespace>
      <file>database.xqm</file>
   </xquery>

   <xquery>
      <namespace>https://certic.unicaen.fr/max/templating</namespace>
      <file>templating.xqm</file>
   </xquery>

   <xquery>
      <namespace>https://certic.unicaen.fr/max/i18n</namespace>
      <file>i18n.xqm</file>
   </xquery>

   <xquery>
      <namespace>https://certic.unicaen.fr/max/errors</namespace>
      <file>errors.xqm</file>
   </xquery>

   <xquery>
      <namespace>https://certic.unicaen.fr/max/utils</namespace>
      <file>utils.xqm</file>
   </xquery>

</package>
Loading