Commit 5a5de813 authored by chauveau's avatar chauveau
Browse files

gestion de l'apparat critique natif, debug pager, prettyName d'une édition

parent bc9840bc
......@@ -52,14 +52,14 @@ svn co --username <username> https://subversion.certic.unicaen.fr/svn/biblissima
cd max
npm update
bower install
#dans un environnement de développement uniquemennt:
#dans un environnement de développement uniquement:
gulp build
```
* **Java 7**
* **Tomcat 7(*)**
* **[BaseX](http://basex.org)** dans sa version 83 ou +
* **[BaseX](http://basex.org)** dans sa version 83 ou +, avec la librairie saxon9he.jar en complément (à ajouter au dossier **lib** de BaseX).
* **[Nodejs](https://nodejs.org)** : Une fois installé, son gestionnaire de paquet permettra entre autres l'installation de Gulp et Bower
* **[Bower](http://bower.io/)**: installe les dépendances javascript: **JQuery**, **Mathjax**, **[Bootstrap](http://getbootstrap.com)**, ...
* **[Gulp](http://gulpjs.com/)** :gestionnaire de tâches (minification des fichiers js et css, compilation de css [Less](http://lesscss.org/))
......@@ -401,7 +401,7 @@ La configuration d'une édition/d'un projet (noeud &lt;edition/&gt;) permet de d
* *html* : le parcours est décrit dans un fichier HTML statique (attribut **file** du noeud &lt;routeList/&gt;)
* *xquery* : le parcours résulte d'une XQuery définie dans un fichier (attribut **file** du noeud &lt;routeList/&gt;)
* *xquery* : le parcours résulte d'une XQuery définie dans un fichier (attribut **file** du noeud &lt;routeList/&gt;). Cette xquery doit générer une liste html (ul) avec l'identifiant "**routeEntries**.
* *default* : Par défaut, MaX considére chaque document comme un parcours. La requête listant les parcours génère une liste arborescente de liens pointant vers les documents XML complet de la base de données cible. Les grammaires TEI et EAD sont nativement gérées par MaX qui utilise les titres des documents comme contenu des liens.
......
var gulp = require('gulp'),
rename = require('gulp-rename'),// Renommage des fichiers
less = require('gulp-less'),// Conversion LESS en CSS
uglify = require('gulp-uglify'); //Minification/Obfuscation des JS
uglify = require('gulp-uglify'), //Minification/Obfuscation des JS
gutil = require('gulp-util');
//COMPILATION DES FICHIERS LESS
gulp.task('compile-less', function () {
......@@ -53,8 +53,8 @@ gulp.task('js-uglify-addons', function()
console.log("Minification de " + path.basename +".js")
path.basename = path.basename.replace(".src", ".min");
}))
.pipe(uglify())
.pipe(gulp.dest('./ui/js/dist/'));
.pipe(uglify().on('error',gutil.log))
.pipe(gulp.dest('./ui/js/dist/'));
});
......
......@@ -56,7 +56,7 @@ function max:page($project, $page){
}
}
catch err:config {max:max-error($err:description)}
catch err:FODC0002 {max:max-error("Main configuration file is missing (configuration/configuration.xml).")}
catch err:FODC0002 {<div>{$err:description} - {$err:module} - {$err:line-number}</div>}
};
......@@ -68,7 +68,7 @@ function max:document($project,$routeDoc){
let $f:= max.route:getRouteQueryFile($project, $routeDoc)
return
if(not(file:exists($f)))
then web:redirect("../doc/" || $routeDoc)
then web:redirect("../doc/" || $routeDoc)
else
max.html:wrapInHTML($project, "parcours", max.route:getRouteEntriesAsHTML($project, $routeDoc))
};
......
var moduleApparat = new Object();
const PLUGIN_NAME="apparat";
var lacunaryWitnesses = new Array();
moduleApparat['onTextChange'] = function() {
//si le fragment courant en contient pas d'apparat
//si le fragment courant ne contient pas d'apparat
if(!docWithApparat())
return;
;
//sinon
var route = (window.location.href.split("/" + MAX.getProjectID() +"/")[1]).split(".xml")[0] + ".xml";
var witnessQueryURL =
......@@ -16,7 +18,12 @@ moduleApparat['onTextChange'] = function() {
$('#options-list').append(data);
$('#txt_options').show();
});
showWitness("lem");
//récupération des témoins intégralement lacunaire sur le fragment courant
$.get(MAX.getPluginsBaseURL() + "/" + PLUGIN_NAME + "/lacunarywit/"+MAX.getProjectID() +"/"+route+"/"+MAX.getFragmentId(),
function(data){
})
showWitness("lem");
witnessTooltiping();
};
......@@ -25,6 +32,7 @@ MAX.addModule(moduleApparat);
function showWitness(witnessClass){
$(".apparat").hide();
$("."+witnessClass).show();
hideLacunas(witnessClass);
}
function witnessTooltiping(){
......@@ -40,6 +48,76 @@ function witnessTooltiping(){
});
}
function hideLacunas(witId){
/*masque les lacunas à partir des lacunaStarts
- cherche la lacuneEnd correspondante
- Si la lacunaEnd n'existe pas (elle se trouve dans un autre fragment),
l'intégralité du texte suivant est masqué
*/
$('.lacunaStart').each(function(){
if($(this).attr('data-lacuna-wit').indexOf('\#'+witId)>-1){
//on echappe les . et # de l'id cible de la lacunaEnd correspondante
var searchedId = "#" + $(this).attr('data-lacuna-synch').replace(/([#.])/g,'\\$1')
var endElement = $(searchedId)
console.log('traitement de la lacuna '+ $(this).attr('id'));
endElement = endElement.size() === 0 ? $('#bas_de_page') : endElement
var eltsBetween = $(getElementsBetweenTree(($(this))[0], endElement[0]))
console.log("Nombre d'éléments à masquer (lacune "+$(this).attr('id')+")"+eltsBetween.size());
eltsBetween.each(function(){
$(this).wrap("<span class='generated_lacuna'></span>")
})
}
})
/*Cas où un couple lacunaStart/lacunaEnd se trouve respectivement dans
des fragments qui précédent et suivent le fragment courant:
nécessite une requête sur la DB pour accedéer aux autres noeuds XML*/
}
/****************************************/
function getElementsBetweenTree(start, end) {
var ancestor= getCommonAncestor(start, end);
var before= [];
while (start.parentNode!==ancestor) {
var el= start;
while (el.nextSibling)
before.push(el= el.nextSibling);
start= start.parentNode;
}
var after= [];
while (end.parentNode!==ancestor) {
var el= end;
while (el.previousSibling)
after.push(el= el.previousSibling);
end= end.parentNode;
}
after.reverse();
while ((start= start.nextSibling)!==end)
before.push(start);
return before.concat(after);
}
// Get the innermost element that is an ancestor of two nodes.
//
function getCommonAncestor(a, b) {
var parents= $(a).parents().andSelf();
while (b) {
var ix= parents.index(b);
if (ix!==-1)
return b;
b= b.parentNode;
}
return null;
}
/****************************************/
function docWithApparat(){
return $(".apparat").size() > 0
return ($(".apparat").size() + $(".lacunaStart").size() + $(".lacunaEnd").size()) > 0
}
\ No newline at end of file
......@@ -27,7 +27,7 @@ function max.plugin.apparat_critique:getRouteWitnesses($project, $route){
};
(:
Route witnesses list
Route witnesses list as html
:)
declare
%rest:GET
......@@ -51,3 +51,22 @@ function max.plugin.apparat_critique:getRouteWitnessesAsHTML($project, $route)
<li role="separator" class="divider"></li>
};
(:
Recherche des témoins intégralement lacunaires sur le fragment $fragmentId
= un lacunaStart présent dans un fragment précédent $fragmentId couplé à un
lacunaEnd présent dans un fragment suivant $fragmentId.
Il est donc nécessaire de parcourir intégralement la collection hôte
:)
declare
%rest:GET
%output:method("html")
%rest:path("/plugins/apparat/lacunarywit/{$project}/{$route=.*\.xml}/{$fragmentId}")
function max.plugin.apparat_critique:getLacunaryWitnesses($project, $route, $fragmentId)
{
(:"{'witnesses':{['a','b']}}":)
for $i in collection(max.config:getProjectDBPath($project))//*[@xml:id=$fragmentId]/preceding::*
return base-uri($i)
};
\ No newline at end of file
......@@ -37,8 +37,21 @@
</xsl:template>
<xsl:template match="//tei:lacunaStart | //tei:lacunaEnd">
<xsl:template match="//tei:lacunaStart | //tei:lacunaEnd">
<span>
<xsl:attribute name='class'>
<xsl:value-of select='name(.)'/>
</xsl:attribute>
<xsl:attribute name='data-lacuna-synch'>
<xsl:value-of select='@synch'/>
</xsl:attribute>
<xsl:attribute name='data-lacuna-wit'>
<xsl:value-of select='@wit'/>
</xsl:attribute>
<xsl:attribute name='id'>
<xsl:value-of select='@xml:id'/>
</xsl:attribute>
</span>
</xsl:template>
<xsl:template match="//tei:span[contains(@class,'varLong')]">
......
......@@ -19,10 +19,7 @@ correctionOptions['onTextChange'] = function() {
off();
}
$("#options-list").append(
"<li><a href='#'>
<input id='toggle_corr' type='checkbox' onchange='setCorrVisible()' "+checkAttr+"' name='toggle_corr'>Afficher les corrections
</a></li>");
$("#options-list").append("<li><a href='#'><input id='toggle_corr' type='checkbox' onchange='setCorrVisible()' "+checkAttr+" name='toggle_corr'>Afficher les corrections</a></li>");
}
......
......@@ -7,14 +7,8 @@ moduleEquations['onTextChange'] = function(){
$("head").append('<script type="text/javascript" src="' + MAX.getBaseURL() + '/ui/js/lib/MathJax/MathJax.js?config=TeX-AMS_HTML.js"></script>');
//appends text options components
$("#options-list").append("<li role='separator' class='divider'></li><li><a href='#'>
<input id='toggle_pb' type='radio' name='equations' onchange='toggleModernEquations(false)' checked=''>
Afficher les images de l\'édition originale
</a></li>");
$("#options-list").append("<li><a href='#'>
<input id='toggle_pb' type='radio' name='equations' onchange='toggleModernEquations(true)' checked='' >
Afficher les équations modernisées en mode texte
</a></li><li role='separator' class='divider'></li>");
$("#options-list").append("<li role='separator' class='divider'></li><li><a href='#'><input id='toggle_pb' type='radio' name='equations' onchange='toggleModernEquations(false)' checked=''>Afficher les images de l\'édition originale</a></li>");
$("#options-list").append("<li><a href='#'><input id='toggle_pb' type='radio' name='equations' onchange='toggleModernEquations(true)' checked='' >Afficher les équations modernisées en mode texte</a></li><li role='separator' class='divider'></li>");
setEquationsVisible();
}
......
......@@ -14,8 +14,11 @@ declare
%output:method("html")
%rest:path("/editions/{$project}/{$route=.*\.xml}/page/{$n}")
function max.plugin.pager:paginate($project as xs:string, $route as xs:string, $n as xs:integer){
let $routeDoc := if(starts-with($route,'doc/'))
then tokenize($route, 'doc/')[last()]
else $route
let $xml :=
max.plugin.pager:paginateNodes($project, $route, $n, max.config:getProjectDBPath($project))
max.plugin.pager:paginateNodes($project, $routeDoc, $n, max.config:getProjectDBPath($project))
let $xsltDoc := max.util:buildXSLTDoc(
max.config:getDefaultTextXSL($project),
max.config:getXSLTAddons($project, $route))
......@@ -28,7 +31,7 @@ function max.plugin.pager:paginate($project as xs:string, $route as xs:string, $
declare function max.plugin.pager:paginateNodes(
$project as xs:string,
$route as xs:string,
$routeDoc as xs:string,
$currentPage as xs:integer,
$context as xs:string){
......@@ -40,7 +43,7 @@ declare function max.plugin.pager:paginateNodes(
(:computes start and end page links:)
let $beforeRange:= ceiling($nbLinks div 2)
let $count := xquery:eval('count('||$itemsPath||')',map{'' : db:open($context)})
let $count := xquery:eval("count(doc('" || $project ||"/" || $routeDoc || "')"||$itemsPath||")",map{'' : db:open($context)})
let $startPage := if(($currentPage - $beforeRange) < 0)
then 1
else ($currentPage - $beforeRange) + 1
......
......@@ -26,5 +26,6 @@ Le Moteur d'Affichage XML est une interface de lecture de sources XML développ
* Installation de MaX dans BaseX:
* cd [rep_install_tomcat]/tomcat7/webapps/BaseX[version]/
* sudo ln -s [rep_install_max]/tags/MaX-[numVersion] MaX
* Ajouter la librairie saxon9 (saxon9.jar ou saxon9he.jar) dans le path de BaseX (sous-répertoire WEB-INF/lib de la webapp BaseX)
* Copier le fichier de configuration par défaut configuration/configuration.dist.xml et le renommer en configuration/configuration.xml
\ No newline at end of file
......@@ -24,6 +24,15 @@ declare function max.config:getEditionIDs(){
doc($max.config:CONFIGURATION_FILE)//edition/@xml:id
};
(:returns edition prettyName from config file:)
declare function max.config:getProjectPrettyName($projectId){
let $prettyName := doc($max.config:CONFIGURATION_FILE)//edition[@xml:id=$projectId]/@prettyName
return
if($prettyName)
then string($prettyName)
else $projectId
};
(:returns project's plugin name list from config file:)
declare function max.config:getPluginNameList($projectId){
doc($max.config:CONFIGURATION_FILE)//edition[@xml:id=$projectId]//plugin/@name
......@@ -231,3 +240,7 @@ declare function max.config:getCheckboxTextOptions($project){
doc($max.config:CONFIGURATION_FILE)//edition[@xml:id=$project]/textOptions/checkboxOptions/targetClass/text()
};
declare function max.config:getTextOptionsFragment($project){
string(doc($max.config:CONFIGURATION_FILE)//edition[@xml:id=$project]/textOptions/htmlFragment/@file)
};
......@@ -58,7 +58,7 @@ declare function max.html:wrapInHTML(
max.html:applyBindingsOnTemplate(doc(max.config:getProjectLayoutTemplate($projectId)),
map{
'projectId':$projectId,
'projectId': max.config:getProjectPrettyName($projectId) ,
'devListCombobox': $devListCombobox,
'menu': $menu,
'head': $head,
......@@ -219,76 +219,6 @@ as element(link)*
};
(:
Builds menu/sub menu HTML from menu.xml file
declare %private function max.html:buildMenu(
$projectId as xs:string,
$menuOrRouteId as xs:string,
$fragmentId as xs:string ?)
as element(div)
{
<div id="navbar" class="collapse navbar-collapse">
<ul class="nav navbar-nav">{
try{
for $entry in doc("../editions/" || $projectId || "/" || $max.cons:MENU_FILE)//entry[@type='main']
let $href := max.config:getReversedProxyBaseURI() || "/" || $projectId || "/" || $entry/target/text()
let $label := max.i18n:getText($projectId, "menu." || $entry/id)
return
if(string($entry/target) = $menuOrRouteId) then
max.html:subMenu($label, $href, 'active', $entry)
else
max.html:subMenu($label, $href, (), $entry)
}
catch err:FODC0002
{
<div class="404">Fichier de menu manquant.</div>
}
}
</ul>
{
if($fragmentId)
then
(max.html:getNavigationBarForRoute($projectId, $menuOrRouteId, $fragmentId),
max.html:buildTextOptionsMenu($projectId))
else max.html:buildTextOptionsMenu($projectId)
}
</div>
};
Builds submenu
declare %private function max.html:subMenu($labelMenu, $href, $className, $subXML){
let $withSubentries := count($subXML//subentries/subentry) > 0
return
<li class="{$className}">{
if($withSubentries)
then
<a href="{$href}" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
{$labelMenu}
<span class="caret"></span>
</a>
else <a href="{$href}">{$labelMenu}</a>
}
{
if($withSubentries)
then
<ul class="dropdown-menu">
<li><a href="{$href}">{$labelMenu}</a></li>
{for $se in $subXML//subentries/subentry
return <li><a href="#">{$se/text()}</a></li>
}
</ul>
else()
}
</li>
};
:)
declare %private function max.html:buildMenu(
$projectId as xs:string,
......@@ -331,6 +261,7 @@ declare %private function max.html:buildSubMenu($projectId, $pageId){
try{
let $docMenu := doc("../editions/" || $projectId || "/" || $max.cons:MENU_FILE)
let $subEntries := $docMenu//entry[./target/text()=$pageId]//subentry
let $parentEntry := $docMenu//entry//subentry[text()=$pageId]/..
let $withSubentries := count($subEntries) > 0
return
......@@ -344,7 +275,17 @@ declare %private function max.html:buildSubMenu($projectId, $pageId){
}
</ul>
</div>
else ()
else if($parentEntry)
then
<div id="sub-navbar" class="collapse navbar-collapse">
<ul class="nav navbar-nav">{
for $c in $parentEntry/subentry
let $target := $c/target/text()
return <li><a href="{$target}">{$c/text()}</a></li>
}
</ul>
</div>
else()
}
catch err:FODC0002
{
......@@ -360,11 +301,19 @@ declare function max.html:getHTMLFragment($project, $fragmentName as xs:string)
as element(div){
let $fragmentPath := concat("../editions/",$project, "/fragments/", $fragmentName, ".frag.html")
(:let $uri := base-uri(doc($fragmentPath))
let $html :=fetch:text($uri):)
return <div id='content'>{doc($fragmentPath)}</div>
};
(:gets a project static HTML fragment (wrapped in an html div):)
declare function max.html:getHTMLFragmentFile($project, $fragmentFile as xs:string)
as element(){
let $fragmentPath := concat("../", $fragmentFile)
return doc($fragmentPath)/*[1]
};
......@@ -430,7 +379,14 @@ declare %private function max.html:buildTextOptionsMenu($projectId){
id="toggle_{$cssClass}"
data-option="{$cssClass}"
onchange="MAX.setClassVisibility('{$cssClass}')"/>Afficher les {max.i18n:getText($projectId,$cssClass)}</a></li>
}
}
{
(:adds static text options frag if specified in configuration file:)
let $frg := max.config:getTextOptionsFragment($projectId)
return if($frg)
then max.html:getHTMLFragmentFile($projectId,$frg)
else ()
}
</ul>
</div>
</div>
......
......@@ -36,5 +36,22 @@ function max.api:getFragment($uniqueID){
(:Returns XML fragment identified by $id in specified document:)
declare
%rest:GET
%output:method("html")
%rest:path("/sf/idindoc/{$doc=.*\.xml}/{$id}")
function max.api:getXMLByIDInDoc($doc, $id){
let $target := doc($doc)//*[@xml:id=$id or @id=$id]
return
if(count($target) = 1)
then $target
else () (:todo: error:)
};
......@@ -12,6 +12,14 @@ xmlns:hfp="http://www.w3.org/2001/XMLSchema-hasFacetAndProperty">
<titleStmt>
<title>Lorem Ipsum In MaX - Corrections, notes &amp; sauts de page</title>
</titleStmt>
<sourceDesc>
<listWit>
<witness xml:id="w1">Témoin A</witness>
<witness xml:id="w2">Témoin B</witness>
<witness xml:id="w3">Témoin C</witness>
<witness xml:id="w4">Témoin D</witness>
</listWit>
</sourceDesc>
</fileDesc>
</teiHeader>
......@@ -83,10 +91,12 @@ elementum mi. Phasellus non ullamcorper urna.</quote>
<div type="chapitre" xml:id="c3">
<head>Sub lorem C</head>
<p xml:id="p6">Suspendisse lectus leo, consectetur in tempor sit amet, placerat quis neque. Etiam luctus porttitor lorem, sed suscipit
<p xml:id="p6">
<lacunaStart xml:id='demo_lorem.xml#lacStart0' synch='demo_lorem_2.xml#lacEnd0' wit='#w4'/>
Suspendisse lectus leo, consectetur in tempor sit amet, placerat quis neque. Etiam luctus porttitor lorem, sed suscipit
est rutrum non. Curabitur lobortis nisl a enim congue semper. Aenean commodo ultrices imperdiet. Vestibulum ut justo vel
sapien venenatis tincidunt. Phasellus eget dolor sit amet ipsum dapibus condimentum vitae quis lectus. Aliquam ut massa in
turpis dapibus convallis. Praesent elit lacus, vestibulum at malesuada et, ornare et est. Ut augue nunc, sodales ut euismod
turpis dapibus convallis. <lacunaStart xml:id='demo_lorem.xml#lacStart1' synch='demo_lorem_2.xml#lacEnd1' wit='#w2'/>Praesent elit lacus, vestibulum at malesuada et, ornare et est. Ut augue nunc, sodales ut euismod
non, adipiscing vitae orci. Mauris ut placerat justo. Mauris in ultricies enim. Quisque nec est eleifend nulla ultrices
egestas quis ut quam. Donec sollicitudin lectus a mauris pulvinar id aliquam urna cursus. Cras quis ligula sem, vel
elementum mi. Phasellus non ullamcorper urna.
......
......@@ -18,6 +18,7 @@ xmlns:hfp="http://www.w3.org/2001/XMLSchema-hasFacetAndProperty">
<witness xml:id="w1">Témoin A</witness>
<witness xml:id="w2">Témoin B</witness>
<witness xml:id="w3">Témoin C</witness>
<witness xml:id="w4">Témoin D</witness>
</listWit>
</sourceDesc>
</fileDesc>
......@@ -25,7 +26,7 @@ xmlns:hfp="http://www.w3.org/2001/XMLSchema-hasFacetAndProperty">
<text>
<front>
</front>
<body>
<div type="chapitre" xml:id="c2.1">
......@@ -35,13 +36,13 @@ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam lectus. Se
quam viverra nec consectetur ante hendrerit. Donec et mollis dolor. Praesent et diam eget libero egestas mattis sit amet vitae augue.
Nam tincidunt congue enim, <choice><sic>it</sic><corr>ut</corr></choice> porta lorem lacinia consectetur. Donec ut libero sed arcu vehicula ultricies a non tortor. Lorem ipsum
dolor sit amet, consectetur adipiscing elit. Aenean ut gravida lorem. Ut turpis felis, pulvinar a semper sed, adipiscing id dolor.
Pellentesque auctor nisi id magna consequat sagittis. Curabitur dapibus enim sit amet elit pharetra tincidunt feugiat nisl imperdiet.
Ut convallis libero in urna ultrices accumsan. Donec <app><lem wit="w1 w2">Mais</lem><rdg cause="omission" type="substantive" wit="w3"/></app>sed odio eros.
Donec viverra mi quis quam pulvinar at malesuada arcu rhoncus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In rutrum accumsan ultricies. Mauris vitae nisidolor sit amet, consectetur adipiscing elit. Aenean ut gravida lorem. Ut turpis felis, pulvinar a semper sed, adipiscing id dolor.Pellentesque auctor nisi id magna consequat sagittis. Curabitur dapibus enim sit amet elit pharetra tincidunt feugiat nisl imperdiet. <app><lem wit="w1">Math. 7 : 13.</lem><rdg cause="expansion" wit="w2">Mathieu 7. 12.</rdg><rdg cause="abbreviation" wit="w3">Math ; 7. 12.</rdg></app><app><lem wit="w2 w3">c'est à dire que</lem><rdg type="substantive" wit="w1">c'est</rdg></app>
Pellentesque auctor nisi id magna consequat sagittis. <lacunaEnd xml:id='demo_lorem_2.xml#lacEnd1' synch='demo_lorem.xml#lacStart1' wit='#w2'/>Curabitur dapibus enim sit amet elit pharetra tincidunt feugiat nisl imperdiet.
Ut convallis libero in urna ultrices accumsan. Donec <app><lem wit="#w1 #w2">Mais</lem><rdg cause="omission" type="substantive" wit="#w3"/></app>sed odio eros.
Donec viverra mi quis quam pulvinar at malesuada arcu rhoncus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In rutrum accumsan ultricies. Mauris vitae nisidolor sit amet, consectetur adipiscing elit. Aenean ut gravida lorem. Ut turpis felis, pulvinar a semper sed, adipiscing id dolor.Pellentesque auctor nisi id magna consequat sagittis. Curabitur dapibus enim sit amet elit pharetra tincidunt feugiat nisl imperdiet. <app><lem wit="#w1">Math. 7 : 13.</lem><rdg cause="expansion" wit="#w2">Mathieu 7. 12.</rdg><rdg cause="abbreviation" wit="#w3">Math ; 7. 12.</rdg></app><app><lem wit="#w2 #w3">c'est à dire que</lem><rdg type="substantive" wit="#w1">c'est</rdg></app>
Ut convallis libero in urna ultrices accumsan. Donec sed odio eros. Donec viverra mi quis quam pulvinar at malesuada arcu rhoncus.
Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In rutrum accumsan ultricies. Mauris vitae nisi
at sem facilisis semper ac in est.at sem facilisis semper ac in est.Donec ut libero sed arcu vehicula ultricies a non tortor. Lorem ipsum
dolor sit amet, consectetur adipiscing elit. <app><lem wit="w1 w3">Aenean ut gravida lorem. Ut turpis felis, pulvinar a semper sed</lem><rdg wit="w2">Aenan uti gravidai loremu. Ut turpis acfelis, pulvinarum a semper sedac</rdg></app>, adipiscing id dolor.
dolor sit amet, consectetur adipiscing elit. <app><lem wit="#w1 #w3">Aenean ut gravida lorem. Ut turpis felis, pulvinar a semper sed</lem><rdg wit="#w2">Aenan uti gravidai loremu. Ut turpis acfelis, pulvinarum a semper sedac</rdg></app>, adipiscing id dolor.
Pellentesque auctor nisi id magna consequat sagittis. Curabitur dapibus enim sit amet elit pharetra tincidunt feugiat nisl imperdiet.
Ut convallis libero in urna ultrices accumsan. Donec sed odio eros. Donec viverra mi quis quam pulvinar at malesuada arcu rhoncus.
Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In rutrum accumsan ultricies. Mauris vitae nisidolor sit amet, consectetur adipiscing elit. Aenean ut gravida lorem. Ut turpis felis, pulvinar a semper sed, adipiscing id dolor.Pellentesque auctor nisi id magna consequat sagittis. Curabitur dapibus enim sit amet elit pharetra tincidunt feugiat nisl imperdiet.
......@@ -51,7 +52,7 @@ at sem facilisis semper ac in est.at sem facilisis semper ac in est
</p>
<p xml:id="p2.2">Vivamus fermentum semper porta. Nunc diam velit, adipiscing ut tristique vitae, sagittis vel odio. Maecenas convallis
<p xml:id="p2.2">Vivamus fermentum semper porta. <lacunaStart xml:id='demo_lorem_2.xml#lacStart2' synch='demo_lorem_2.xml#lacEnd2' wit='#w2 #w3'/>Nunc diam velit,<lacunaEnd xml:id='demo_lorem_2.xml#lacEnd2' synch='demo_lorem_2.xml#lacStart2' wit='#w2 #w3'/> adipiscing ut tristique vitae, sagittis vel odio. Maecenas convallis
ullamcorper ultricies. Curabitur ornare, ligula semper consectetur sagittis, nisi diam iaculis velit, id
fringilla sem nunc vel mi.<note type='marginalia' place='margin_right'>Note en marge droite</note>
Nam dictum, odio nec pretium volutpat, arcu ante placerat erat, non tristique elit urna et turpis. Quisque mi metus, ornare sit
......
......@@ -12,6 +12,14 @@ xmlns:hfp="http://www.w3.org/2001/XMLSchema-hasFacetAndProperty">
<titleStmt>
<title>Lorem Ipsum in MaX - Tome 3. Images et Équations</title>
</titleStmt>
<sourceDesc>
<listWit>
<witness xml:id="w1">Témoin A</witness>
<witness xml:id="w2">Témoin B</witness>
<witness xml:id="w3">Témoin C</witness>
<witness xml:id="w4">Témoin D</witness>
</listWit>
</sourceDesc>
</fileDesc>
</teiHeader>
......@@ -28,7 +36,7 @@ quam viverra nec consectetur ante hendrerit. Donec et mollis dolor. Praesent et
Nam tincidunt congue enim, porta lorem lacinia consectetur. Donec ut libero sed arcu vehicula ultricies a non tortor. Lorem ipsum
dolor sit amet, consectetur adipiscing elit. Aenean ut gravida lorem. Ut turpis felis, pulvinar a semper sed, adipiscing id dolor.
Pellentesque auctor nisi id magna consequat sagittis. Curabitur dapibus enim sit amet elit pharetra tincidunt feugiat nisl imperdiet.
Ut convallis libero in urna ultrices accumsan. <figure xml:id="fig_1"><graphic url="figures/fig_1.jpg"/></figure>Donec sed odio eros. Donec viverra mi quis quam pulvinar at malesuada arcu rhoncus.
Ut convallis libero in urna ultrices accumsan. <lacunaEnd xml:id='demo_lorem_3.xml#lacEnd0' synch='demo_lorem.xml#lacStart0' wit='#w4'/><figure xml:id="fig_1"><graphic url="figures/fig_1.jpg"/></figure>Donec sed odio eros. Donec viverra mi quis quam pulvinar at malesuada arcu rhoncus.
Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In rutrum accumsan ultricies. Mauris vitae nisidolor sit amet, consectetur adipiscing elit. Aenean ut gravida lorem. Ut turpis felis, pulvinar a semper sed, adipiscing id dolor.Pellentesque auctor nisi id magna consequat sagittis. Curabitur dapibus enim sit amet elit pharetra tincidunt feugiat nisl imperdiet.
Ut convallis libero in urna ultrices accumsan. Donec sed odio eros. Donec viverra mi quis quam pulvinar at malesuada arcu rhoncus.
Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In rutrum accumsan ultricies. Mauris vitae nisi
......
......@@ -12,7 +12,7 @@
<routeList type="default">
<!-- parcours MS Bouet Desbordes -->
<!-- Si @xsl précisé: xsl appliquée à l'affichage de la liste des entrées du parcours -->