[JAVA] J'ai essayé d'utiliser anakia + Jing maintenant

XSLT est généralement le mécanisme principal de conversion de documents XML. Cependant, vers 2009, Anakia utilisant Apache (Jakarta) Velocity comme moteur de modèle a suscité beaucoup d'enthousiasme, et moi-même (récemment mis à jour). Je l'utilise pour bloguer (pas).

Velocity lui-même est encore en cours de développement et est connu comme le moteur de modèle pour les applications Web Java. Malheureusement, anakia n'a pas été développé et n'est pas inclus dans la dernière version de Velocity Engine 2.0. Un mécanisme basé sur un schéma prédéfini tel que DocBook est utilisé, mais un mécanisme qui convertit n'importe quel format XML propre, non limité à Anakia, n'est pas couramment utilisé, et un mécanisme tel que le démarquage devient répandu. Je pense que tu le fais.

Puisque XSLT est un tuuring complet et a un goût prononcé pour un langage fonctionnel, il a été complété en décrivant le traitement récursif et en suivant la syntaxe XML, la quantité de description est plus grande que celle d'un langage de programmation général par la quantité de balises. D'autre part, certains éléments sont plus gênants que faciles à utiliser.

XSLT et XSL-FO sont d'excellentes technologies, mais je pense aussi que le préjugé selon lequel elles doivent être utilisées limite l'utilisation de XML.

Récemment, j'ai personnellement commencé à écrire des articles avec Markdown (md) et Asciidoc (adoc) avec Hugo comme back-end pour la création de sites Web statiques, mais md Bien que le format et adoc soit simple, j'ai personnellement les plaintes suivantes.

Étant donné que l'objectif est différent en premier lieu, il est déraisonnable que nous ne puissions pas faire ce que nous avons réalisé avec XML, mais lors de la rédaction de documents techniques, les personnes qui souhaitent décrire l'entrée au clavier et la sortie d'écran plus clairement et séparément Je le sens.

Le format adoc est pratique à cet égard car il peut recevoir n'importe quel attribut de classe ou id. Si vous unifiez le style d'écriture, vous pourrez l'absorber avec CSS. Cependant, je pense qu'on ne sait toujours pas s'il est facile à lire ou si les fonctions intégrées uniques sont vraiment pratiques, mais il est nécessaire de fonctionner avec une forte conscience de la sortie de l'écran plutôt que du contexte pur. Je vais le sentir.

En outre, le format adoc semble difficile à forcer les autres à utiliser. C'est bien meilleur que le format roff, mais même si c'est une option pour moi, si je veux unifier le format avec un nombre non spécifié de personnes, je pense que la fonction de vérification est médiocre ou difficile à utiliser.

Par conséquent, j'ai essayé de placer le fichier HTML produit par Anakia dans une partie du contenu / de la hiérarchie d'Hugo. De plus, le schéma est défini par Relax-NG et vérifié par Jing.

Markdown est suffisant, et je pense qu'il y a des gens qui pensent que c'est simple, c'est mieux. Personnellement, j'ai un sentiment proche de la conviction que le traitement des données de document et la représentation de sortie doivent être séparés, donc je pense que le principe XML (like) est également très influent.

Ceci est l'introduction, et je voulais utiliser le document écrit au format XML original créé par anakia dans le passé, j'ai donc résumé les problèmes que je ressentais en ce moment.

environnement

Les fichiers téléchargés se trouvent dans ~ / Downloads /. De plus, chaque commande est exécutée à chaque fois depuis le répertoire de travail supérieur. J'exécute des commandes comme `` $ cd tools '' à plusieurs reprises, mais sachez que vous pouvez les ignorer si vous les avez déjà déplacées.

Obtenir et installer Anakia

Il y a un lien vers anakia-1.0 au bas de la page de téléchargement du site officiel de Velocity, mais je ne l'utilise pas.

Comme cela sera décrit plus tard, obtenez velocity-1.7 sur la page de publication du site officiel, et anakia Nous utiliserons la vitesse 1.7 au lieu de -1.0. Je pense que le seul changement est le nom du package d'AnakiaTask, donc si vous faites référence à la documentation anakia-1.0, vous devez être prudent lors de la création d'une tâche fourmi.

$ mkdir tools
$ cd tools
$ tar xvzf ~/Downloads/velocity-1.7.tar.gz
$ ln -s velocity-1.7 velocity

Outils autres que Anakia

Puisque RelaxNG et Jing sont utilisés pour vérifier le fichier XML, nous déploierons également des outils pour cela.

Site Web officiel de Jing existe sur relaxng.org, mais le code source est distribué sur Github ([relaxng / jing-trang](https :: Allez sur //github.com/relaxng/jing-trang)).

Le fichier JAR requis pour l'exécution est téléchargé à partir de la page de téléchargement du site officiel pour 20091111.

$ cd tools   ##Déplacer dans le même répertoire que anakia
$ unzip ~/Downloads/jing-20091111.zip
$ ln -s jing-20091111 jing

Puisque anakia commence comme une tâche de fourmi, obtenez la dernière version de la série 1.9 à partir du site de téléchargement.

$ cd tools  ## anakia、jing,Déplacer vers le même répertoire que trnag
$ tar xvzf ~/Downloads/apache-ant-1.9.13-bin.tar.gz 
$ ln -s apache-ant-1.9.13 apache-ant

Jusqu'à présent, le répertoire des outils ressemble à ceci:

$ ls -F
apache-ant@  apache-ant-1.9.13/  jing@  jing-20091111/   velocity@  velocity-1.7/

Préparation de l'environnement d'exécution

Préparez le répertoire bin en parallèle avec le répertoire tools et préparez-vous à exécuter la commande.

$ mkdir bin   ##Créez-le au même emplacement que le répertoire des outils.

Tout d'abord, préparez le fichier bin / envrc.

bin/envrc


## Please change the following line for your correct JDK location.
JAVA_HOME=/opt/jdk1.8.0_191
export JAVA_HOME

WD="$(pwd)"
SCRIPTFILE="$(readlink -f $0)"
BASEDIR="$(dirname $SCRIPTFILE)"
TOPDIR="${BASEDIR}/.."
export WD SCRIPTFILE BASEDIR TOPDIR

TOOLDIR="${TOPDIR}/tools"
ANT_HOME=${TOOLDIR}/apache-ant
VELOCITY_HOME=${TOOLDIR}/velocity
JING_HOME=${TOOLDIR}/jing

export ANT_HOME VELOCITY_HOME JING_HOME
export PATH=${ANT_HOME}/bin:${PATH}

CP_ANT=$(find ${ANT_HOME}/. -name '*.jar' | tr '\n' ':')
CP_VELOCITY=$(find ${VELOCITY_HOME}/. -name '*.jar' | tr '\n' ':')
CP_JING=$(find ${JING_HOME}/. -name '*.jar' | tr '\n' ':')
export CLASSPATH=${CLASSPATH}:${CP_VELOCITY}:${CP_ANT}:${CP_JING}

Cette fois, nous préparons un fichier xml qui décrit la tâche fourmi dans bin.

bin/run-anakia.xml


<project name="build-site" default="doc" basedir=".">
  <property environment="env" />
  <!-- Please change the following property variables -->
  <property name="docs.infilepattern" value="20*.xml" />
  <property name="docs.basedir" value="${env.WD}" />
  <property name="docs.destdir" value="${env.WD}" />
  <property name="docs.vslfilename" value="blog.vsl"/>
  <property name="docs.projfilename" value="project.xml"/>
  <property name="docs.propfilepath" value="${env.BASEDIR}/velocity.properties"/>
  
  <taskdef name="jing" classname="com.thaiopensource.relaxng.util.JingTask"/>
  
  <target name="validate_relaxng">
    <jing rngfile="${docs.basedir}/blog.rng">
      <fileset dir="${docs.basedir}" includes="${docs.infilepattern}"/>
    </jing>
  </target>
  
  <target name="doc" depends="validate_relaxng">
    <taskdef name="anakia"
	     classname="org.apache.velocity.anakia.AnakiaTask"/>
    <anakia basedir="${docs.basedir}"
	    includes="${docs.infilepattern}"
	    destdir="${docs.destdir}"
	    extension=".html"
	    style="${docs.vslfilename}"
	    projectFile="${docs.projfilename}"
	    velocityPropertiesFile="${docs.propfilepath}"
	    lastModifiedCheck="true" >
    </anakia>
  </target>
  
</project>

Préparez bin / run-anakia.sh en tant que script wrapper pour effectuer ces opérations.

bin/run-anakia.sh


#!/bin/bash

SCRIPTFILE="$(readlink -f $0)"
BASEDIR="$(dirname $SCRIPTFILE)"
. "${BASEDIR}/envrc"

## main ##
ant -f ${BASEDIR}/run-anakia.xml "$@"

Lorsque ce script est exécuté, Jing effectuera la validation et la génération du fichier HTML en même temps, mais il est également possible d'exécuter uniquement la tâche de validation comme `` $ bin / run-anakia.sh validate_relaxng ''.

Ensuite, préparez velocity.properties. La langue par défaut est le latin-1 (ISO-8859-1), elle est donc obligatoire.

bin/velocity.properties


input.encoding=UTF-8
output.encoding=UTF-8

Enfin, les fichiers suivants sont préparés.

$ cd bin
$ ls
envrc  run-anakia.sh  run-anakia.xml  velocity.properties

Préparation d'article

Allez ensuite dans le répertoire cible et préparez les trois fichiers.

Le premier project.xml est presque vide car je ne l'ai pas utilisé en particulier.

${target_dir}/project.xml


<?xml version="1.0" encoding="UTF-8"?>
<project name="Anakia"
         href="http://velocity.apache.org/anakia">
</project>

Comme le schéma RelaxNG et le modèle VSL utilisés sont longs, le modèle VSL et le fichier XML de l'article sont mis en correspondance avec le fichier RNG extrait de OASIS Tutorial. Est affiché comme un échantillon.

${target_dir}/blog.vsl


<html>
#set($cards = $xpath.applyTo("/card", $root))
#foreach($card in $cards)
<ul>
#foreach($c in $card.getContent())
#if($c.name == "name")
  <li>Name: $c.getValue()</li>
#elseif($c.name == "email")
  <li>EMail: $c.getValue()</li>
#end
#end
</ul>
#end
</html>

${target_dir}/blog.rng


<?xml version="1.0" encoding="UTF-8" ?>
<grammar xmlns="http://relaxng.org/ns/structure/1.0">
  <start>
    <element name="addressBook">
      <zeroOrMore>
        <element name="card">
          <ref name="cardContent"/>
        </element>
      </zeroOrMore>
    </element>
  </start>
  <define name="cardContent">
    <element name="name">
      <text/>
    </element>
    <element name="email">
      <text/>
    </element>
  </define>
</grammar>

Génération de documents

Après avoir placé le fichier de configuration, placez le document approprié dans le même répertoire.

${target_dir}/20190114.xml


<addressBook>
  <card>
    <name>John Smith</name>
    <email>[email protected]</email>
  </card>
  <card>
    <name>Fred Bloggs</name>
    <email>[email protected]</email>
  </card>
</addressBook>

Si vous lancez le script dans ce répertoire, vous obtiendrez les résultats suivants:

$ cd ${target_dir}
$ ls -F
20190114.xml  blog.rng*  blog.vsl   project.xml  velocity.log
$ ../bin/run-anakia.sh
...
$ cat 20190114.html 
<html>
<ul>
  <li>Name: John Smith</li>
  <li>EMail: [email protected]</li>
</ul>
<ul>
  <li>Name: Fred Bloggs</li>
  <li>EMail: [email protected]</li>
</ul>
</html>

Défis en collaboration avec Hugo

Puisque Hugo lui-même n'a pas de mécanisme pour ajouter son propre préprocesseur, il est nécessaire de sortir un fichier HTML sous content / comme prétraitement séparément de l'exécution hugo.

Par conséquent, placez le fichier source écrit au format XML dans un répertoire qui n'est pas sous le contrôle d'Hugo et utilisez Anakia Task pour générer le fichier HTML vers n'importe quel emplacement sous le contenu.

Puisqu'il est nécessaire d'ajouter Front Matter lorsque le fichier HTML est placé, il est préférable d'ajouter Title dans le fichier VSL. Je pense que ce sera.

Velocity lui-même n'a pas un bon moyen de connaître l'heure de mise à jour d'un fichier, donc pour ajouter une date à Front Matter, spécifiez un fichier XML avec le nom du fichier, etc. et la chaîne de caractères de la date de création du fichier comme CustomContext Il semble qu'une certaine ingéniosité soit nécessaire.

Problèmes qui surviennent lors de l'utilisation d'anakia-1.0

Si vous utilisez l'anakia-1.0 distribué, il peut ne pas fonctionner comme décrit dans la documentation anakia en raison du fichier velocity-1.5.jar inclus.

Utilisez $ velocityHasNext

Le $ velocityHasNext```, qui est nécessaire pour décrire le traitement à effectuer au début et à la fin de la boucle #foreach dans le fichier modèle VSL, n'est pas implémenté dans velocity-1.5.

Celles-ci sont définies comme valeurs par défaut pour velocity.properties. directive.foreach.counter.name = velocityCount directive.foreach.iterator.name = velocityHasNext

Par exemple, lors de l'écriture de balises au format TOML dans Front Matter d'Hugo, il est nécessaire de les mettre entre parenthèses comme tags = ["tag1", "tag2"] `` car elles sont écrites au format liste. Il y a. Si le nom de la balise était à l'origine stocké dans une variable \ $ tags au format liste, vous auriez besoin d'un code comme celui-ci, car il n'y a pas de bon moyen de comparer le résultat de \ $ tags.size () avec \ $ velocityCount. \ $ velocityHasNext est requis.

#foreach ($tag in $tags)
  #if ($tags.size() == 1)
tags: [ "$tag.getValue()" ]
  #elseif ($velocityCount == 1)
tags: [ "$tag.getValue()"##
  #elseif ($velocityHasNext)
, "$tag.getValue()"##
  #else
, "$tag.getValue()" ] 
  #end
#end

De plus, les versions antérieures à velocity-1.7 ont divers problèmes, il n'est donc pas recommandé d'utiliser anakia-1.0, qui dépend de velocity-1.5.

Résumé-Pourquoi utiliser Anakia

En tant que norme de l'industrie, je pense que la théorie est d'utiliser XSLT, XSL-FO, mais pour le fichier XML au format unique défini par un schéma tel que RelaxNG, créez un document bien formé avec une certaine signification. Je pense que c'est un bon moyen de répondre aux besoins de conversion en HTML, etc.

Personnellement, je n'ai aucune objection à la diffusion de Markdown et d'Asciidoc, mais je ne peux pas penser que c'est bien parce que c'est pratique.

Je pense qu'il est nécessaire d'ajouter une annotation qui peut être un indice en tant que matériel de référence qui est traité par un ordinateur, non limité à l'IA, et même si vous n'utilisez pas RDF ou Ontology, le nom de la balise peut être un indice XML Je pense que le document est bon.

Anakia est plus facile à apprendre et à utiliser que XSLT, je voudrais donc l'utiliser comme un outil à portée de main et le diffuser.

Recommended Posts

J'ai essayé d'utiliser anakia + Jing maintenant
J'ai essayé d'utiliser Gson
J'ai essayé d'utiliser TestNG
J'ai essayé d'utiliser Galasa
J'ai essayé d'utiliser azure cloud-init
J'ai essayé d'utiliser Apache Wicket
J'ai essayé d'utiliser Java REPL
J'ai essayé d'utiliser Spring + Mybatis + DbUnit
J'ai essayé d'utiliser JOOQ avec Gradle
J'ai essayé d'utiliser l'API Java8 Stream
J'ai essayé d'utiliser JWT en Java
[Android] J'ai essayé d'utiliser la disposition du coordinateur.
J'ai essayé d'utiliser le conteneur Pari gp
J'ai essayé d'utiliser WebAssembly Stadio (version 2018/4/17)
J'ai essayé de résumer Java 8 maintenant
J'ai essayé d'utiliser le mémo Java LocalDate
J'ai essayé d'utiliser Google HttpClient de Java
J'ai essayé d'utiliser l'API Elasticsearch en Java
J'ai essayé d'utiliser Realm avec Swift UI
J'ai essayé d'utiliser l'outil de diagnostic Java Arthas
J'ai essayé d'utiliser UICollectionViewListCell ajouté à partir de Xcode12.
J'ai essayé d'utiliser Scalar DL avec Docker
J'ai essayé d'utiliser OnlineConverter avec SpringBoot + JODConverter
C'est nouveau, mais j'ai essayé d'utiliser Groonga
J'ai essayé d'utiliser OpenCV avec Java + Tomcat
J'ai essayé Spring.
J'ai essayé de mettre Tomcat
J'ai essayé youtubeDataApi.
J'ai essayé de refactoriser ①
J'ai essayé FizzBuzz.
J'ai essayé JHipster 5.1
J'ai essayé d'utiliser Junit avec Mac VScode Maven
[Pour les débutants] J'ai essayé d'utiliser DBUnit avec Eclipse
[Pour les débutants] J'ai essayé d'utiliser JUnit 5 avec Eclipse
[Android] J'ai quitté SQLite et essayé d'utiliser Realm
J'ai fait un blackjack avec Ruby (j'ai essayé d'utiliser minitest)
[API] J'ai essayé d'utiliser l'API de recherche par code postal
J'ai essayé d'implémenter un serveur en utilisant Netty
J'ai essayé d'utiliser le profileur d'IntelliJ IDEA
J'ai essayé d'utiliser une connexion à une base de données dans le développement Android
[J'ai essayé] Tutoriel de printemps
J'ai essayé d'utiliser la fonction Server Push de Servlet 4.0
J'ai essayé d'exécuter Autoware
J'ai essayé d'utiliser le service KMS (Key Management Service) d'Alibaba Cloud
J'ai essayé de faire fonctionner SQS en utilisant AWS Java SDK
J'ai essayé QUARKUS immédiatement
J'ai essayé d'utiliser la boîte à outils de migration pour les fichiers binaires d'application
J'ai essayé d'utiliser Log4j2 sur un serveur Java EE
J'ai essayé Spring Batch
J'ai essayé d'utiliser YOLO v4 sur Ubuntu et ROS
J'ai essayé node-jt400 (Programmes)
J'ai essayé d'utiliser l'instruction Extended for en Java
J'ai essayé node-jt400 (exécuter)
~ J'ai essayé d'apprendre la programmation fonctionnelle avec Java maintenant ~
J'ai essayé de gratter un graphique boursier en utilisant Java (Jsoup)
J'ai essayé node-jt400 (Transactions)