Commit 04e7e5fe authored by Pierre-Yves Buard's avatar Pierre-Yves Buard
Browse files

Ajout des .html dans les urls et gestion distincte des types d'index

parent 24f23bf9
Loading
Loading
Loading
Loading
+23 −24
Changes for plugins/index/index.xqm: 23 added lines, 24 removed lines.
Original line number Diff line number Diff line
@@ -8,48 +8,47 @@ declare variable $max.plugin.index:PLUGIN_ID := "index";

(:
returns index fragment if exists (already generated)
returns a news generated one if not
returns a new generated one if not
:)
declare
%rest:GET
%output:method("html")
%rest:path("/{$project}/index")
function max.plugin.index:index($project){
  let $indexFilePath :=file:parent(file:parent(file:parent(static-base-uri()))) || '/editions/'||$project||'/fragments/index.frag.html'
%rest:path("/{$project}/index/{$type}.html")
function max.plugin.index:index($project,$type){
  let $indexFilePath :=file:parent(file:parent(file:parent(static-base-uri()))) || '/editions/'||$project||'/fragments/index_'||$type||'.frag.html'
  return
    if(file:exists($indexFilePath))
    then 
          let $content := <div id='content'>{doc($indexFilePath)}</div>
          return max.html:render($project, 'index', $content)
    else max.plugin.index:generateIndex($project)
    else max.plugin.index:generateIndex($project,$type)
};

declare function max.plugin.index:generateIndex($project,$type){  
let $indexFilePath :=file:parent(file:parent(file:parent(static-base-uri()))) || '/editions/'||$project||'/fragments/index_'||$type||'.frag.html'

declare function max.plugin.index:generateIndex($project){  
let $dbPath := max.config:getProjectDBPath($project)
let $indexFilePath :=file:parent(file:parent(file:parent(static-base-uri()))) || '/editions/'||$project||'/fragments/index.frag.html'
let $HTMLIndex := max.plugin.index:loadIndex($project,$type)
return file:write($indexFilePath, <div class='index'>{$HTMLIndex}</div>), max.plugin.index:index($project,$type)
};

let $idxGenreform := <index type="Type de documents">{for $idx in collection($dbPath)//*:controlaccess/*:genreform
declare function max.plugin.index:loadIndex($edition,$type) {
  let $dbPath := max.config:getProjectDBPath($edition)
  let $projectIndex := if($type='typesdocs')
                       then <index type="typesdocs">{
                         for $idx in collection($dbPath)//*:controlaccess/*:genreform
                         order by $idx/text()
                         let $cId := $idx/ancestor::*:c[1]/@id
                         let $cOtherlevel := $idx/ancestor::*:c[1]/@otherlevel
                         let $cUnitid := $idx/ancestor::*:c[1]/descendant::*:unitid[1]/text()
                         let $result := <marker id="{$cId}" otherlevel="{$cOtherlevel}"><entry>{$cUnitid}</entry><value>{$idx/text()}</value></marker>
                         return $result}</index>
                       else let $custIndex := file:parent(file:parent(file:parent(static-base-uri())))||"editions/"||$edition||"/xq/index_"||$type||".xq"
                         return if (file:exists($custIndex)) then xquery:eval(xs:anyURI($custIndex))

let $idx := <idx>{$idxGenreform}{max.plugin.index:loadIndex($project)}</idx>

let $indexCore := xslt:transform($idx, 'indexing.xsl', ())
let $projectXSLIndex := file:parent(file:parent(file:parent(static-base-uri())))||'/editions/'||$project||'/ui/xsl/indexing.xsl'
let $HTMLIndex := if (file:exists($projectXSLIndex)) 
                  then xslt:transform($indexCore, $projectXSLIndex, ())
                  else $indexCore
(: return  max.html:render($project, 'index', <div class='index'>{$HTMLIndex}</div>) :)
return file:write($indexFilePath, <div class='index'>{$HTMLIndex}</div>), max.plugin.index:index($project)
};
  let $HTMLProjectIndex := if($type='typesdocs')
                             then xslt:transform($projectIndex, 'indexing.xsl', ())
                           else let $custXSL := file:parent(file:parent(file:parent(static-base-uri())))||"editions/"||$edition||"/ui/xsl/index_"||$type||".xsl"
                             return if (file:exists($custXSL)) then xslt:transform($projectIndex, $custXSL, ())

declare function max.plugin.index:loadIndex($edition) {
  let $projectIndex := file:parent(file:parent(file:parent(static-base-uri())))||"editions/"||$edition||"/xq/index.xq"
  return if (file:exists($projectIndex))
  then xquery:eval(xs:anyURI($projectIndex))
  else()
  return $HTMLProjectIndex
};
 No newline at end of file
+2 −31
Changes for plugins/index/indexing.xsl: 2 added lines, 31 removed lines.
Original line number Diff line number Diff line
@@ -18,17 +18,9 @@
  
  <xsl:output method="xml" encoding="utf-8"/>
  
  <xsl:template match="/idx">
    <div class="idx">
      <xsl:apply-templates/>
    </div>
  </xsl:template>
  
  <xsl:template match="index[@type='Type de documents']">
  <xsl:template match="/index[@type='typesdocs']">
    <div class="{./@type}">
      <h1>
        <xsl:value-of select="@type"/>
      </h1>
      <h1>Type de documents</h1>
      <xsl:for-each-group select="./descendant::marker" group-by="./value">
        <h2>
          <xsl:value-of select="current-grouping-key()"/>
@@ -40,27 +32,6 @@
    </div>
  </xsl:template>
  
  <xsl:template match="index[@type='Personnes']">
    <div class="{./@type}">
      <h1>
        <xsl:value-of select="@type"/>
      </h1>
      <xsl:for-each-group select="./descendant::marker" group-by="./@role">
        <h2>
          <xsl:value-of select="current-grouping-key()"/>
        </h2>
        <xsl:for-each-group select="current-group()" group-by="./value">
          <h3>
            <xsl:value-of select="current-grouping-key()"/>
          </h3>
          <div class="entries">
            <xsl:value-of select="current-group()/entry" separator="&#160;; "/>
          </div>
        </xsl:for-each-group>
      </xsl:for-each-group>
    </div>
  </xsl:template>
  
  <xsl:template match="index">
    <xsl:copy-of select="."/>
  </xsl:template>
+10 −35
Changes for plugins/index/readme.md: 10 added lines, 35 removed lines.
Original line number Diff line number Diff line
@@ -4,15 +4,14 @@ Ce plugin propose une route unique pour tous les index.

Les index sont trop spécifiques pour permettre la mise en place d'un traitement par défaut satisfaisant.

La route associée est `projet/index`. Un fichier html est généré lors du premier accès à cette page. Pour générer à nouveau la page d'index il suffit de supprimer le fichier `PROJET/fragments/index.frag.html`.
La route associée à un index est `projet/index/typeindex.html` où `typeindex` est une valeur choisie par l'utilisateur. 

Ce plugin permet la surcharge en utilisant `PROJET/xq/index.xq` et `PROJET/ui/xsl/indexing.xsl`.
Ce plugin propose une route de base pour les types de documents en EAD (voir `index.xqm` et `indexing.xsl`).

Exemple de surcharge d'`ui/index.xq` :
Exemple de configuration du fichier xquery pour la génération d'un index des personnes (`ui/index_personnes.xq`) :

```
<custIndex>
<index type="Personnes">{for $idx in collection("bvmsm")//*:persname
<index type="personnes">{for $idx in collection("bvmsm")//*:persname
                let $cId := $idx/ancestor::*:c[1]/@id
                let $cOtherlevel := $idx/ancestor::*:c[1]/@otherlevel
                let $role := $idx/@role
@@ -20,53 +19,27 @@ Exemple de surcharge d'`ui/index.xq` :
                let $result := <marker id="{$cId}" otherlevel="{$cOtherlevel}" role="{$role}"><entry>{$cUnitid}</entry><value>{data($idx/@normal)}</value></marker>
                return $result}</index>

<index type="Titles">{
  for $idx in collection("bvmsm")//*:title[@type='incipit_repere' or @type='explicit_repere']
  let $cId := $idx/ancestor::*:c[1]/@id
  let $cOtherlevel := $idx/ancestor::*:c[1]/@otherlevel
  let $cUnitid := $idx/ancestor::*:c[1]/descendant::*:unitid[1]/text()
  let $result := <marker id="{$cId}" otherlevel="{$cOtherlevel}"><entry>{$cUnitid}</entry><value>{data($idx/@normal)}</value></marker>
  return $result
}
</index>
</custIndex>

```

Exemple de surcharge de `ui/xsl/indexing.xsl` :
Exemple de traitement XSL associé (`ui/xsl/index_personnes.xsl`) :

```
<xsl:stylesheet	version="2.0" 
  xmlns="urn:isbn:1-931666-22-9"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:xlink="http://www.w3.org/1999/xlink"
  xmlns:xinclude="http://www.w3.org/2001/XInclude"
  xmlns:xhtml="http://www.w3.org/TR/xhtml/strict"
  xmlns:tei="http://www.tei-c.org/ns/1.0"
  xmlns:ns="urn:isbn:1-931666-22-9"
  xmlns:hfp="http://www.w3.org/2001/XMLSchema-hasFacetAndProperty"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  
  exclude-result-prefixes="tei xsl xsi xs xlink xinclude xhtml tei ns hfp">
  exclude-result-prefixes="tei xsl xsi xs xlink xinclude xhtml tei hfp">
  
  <xsl:output method="xml" encoding="utf-8"/>
 
  <xsl:template match="/">
    <div class="idx">
      <xsl:apply-templates select="*:div[@class='idx']"/>
    </div>
  </xsl:template>
  
  <xsl:template match="*:div[@class='idx']">
    <xsl:copy-of select="*:div"/>
    <xsl:apply-templates select="./*:index"/>
  </xsl:template>

  <xsl:template match="*:index[@type='Titles']">
  <xsl:template match="/*:index[@type='personnes']">
    <div class="{./@type}">
      <h1>
        <xsl:value-of select="@type"/>
      </h1>
      <h1>Index des personnes</h1>
      <xsl:for-each-group select="./descendant::*:marker" group-by="./*:value">
        <h2>
          <xsl:value-of select="current-grouping-key()"/>
@@ -80,3 +53,5 @@ Exemple de surcharge de `ui/xsl/indexing.xsl` :

</xsl:stylesheet>
```  

Un fichier html est généré lors du premier accès à cette page, la requête XQUERY et le traitement XSL associé sont exécutés lors de ce premier appel. Pour générer à nouveau la page d'index il suffit de supprimer le fichier `PROJET/fragments/index_typeindex.frag.html` souhaité.