Skip to content
Extraits de code Groupes Projets

Odt2Spip - Refactorisation

Généralités

L'idée principale derrière cette réécriture de odt2spip est de permettre de bien mieux gérer les styles des fichiers .odt lors de leur import, en cherchant à récupérer les styles personnalisés (définis dans les styles) et les styles automatisés (lorsque l'on crée par exemple un paragraphe intégralement en gras).

Cette refonte se veut aussi une occasion d'écrire des tests, afin de s'assurer que de futures évolutions du plugin n'introduisent pas de régressions.

Choix éditoriaux

  • il me semble que ce plugin perd une grande partie de son intérêt si l'on n'est pas en mesure de conserver véritablement les niveaux de titres : le plugin porte_plume_intertitres est donc ajouté aux dépendances ;
  • il n'y a aucune raison mes yeux de prendre le premier heading du document pour construire le titre de l'article SPIP : soit ce dernier provient du titre du document, soit de son nom de fichier ;
  • actuellement, toute une mécanique existe pour faire "glisser" les niveaux de titres ; mais je ne crois pas que ce soit au plugin de corriger le mal-formatage d'un document .odt : les titres doivent être importés tels qu'ils sont définis, qu'il manque ou non des niveaux...

État des lieux

  • le Parser avec ses Transcribers pour SPIP et Markdown permettent de gérer bon nombre de cas mais il demeure certaines régressions ou interrogations :
    • fusion des cellules des tableaux
    • syntaxe des liens à utiliser pour la syntaxe Markdown
    • ...
  • le Handler, s'appelle ainsi dans le traiter() du formulaire document2spip :
try {
    $handler = new Handler('fichier', $objet, $id_objet, $creer_objet);
    $id = $handler->handle($conserver, $mode);
} catch (Exception $e) {
    spip_logger('odt2spip')->error($e->getMessage());
    $res['message_erreur'] = $e->getMessage();
    return $res;
}

Il permet bien de créer un article, de gérer les images, de mettre à jour les modèles... Mais il reste à faire ou à questionner :

  • conversion vers odt avec libreoffice ;
  • le redimensionnement des images : pour le moment, on récupère les images, on les conserve telles quelles, on ne fait qu'ajouter un filtre |largeur au modèle ;

Développement

Inspiré des éléments du cœur ou de certains plugins-dist, des scripts composer ont été ajoutés au composer.json :

"scripts": {
    "analyse": "vendor/bin/phpstan --memory-limit=-1",
    "check-cs": "vendor/bin/ecs check --ansi",
    "fix-cs": "vendor/bin/ecs check --fix --ansi",
    "rector": "vendor/bin/rector process --ansi",
    "rector-dry-run": "vendor/bin/rector process --dry-run --ansi",
    "test": "vendor/bin/phpunit -c ../../plugins/odt2spip/phpunit.xml.dist --colors --testdox --no-coverage",
    "test-coverage": [
      "@putenv XDEBUG_MODE=coverage",
      "vendor/bin/phpunit -c ../../plugins/odt2spip/phpunit.xml.dist --colors --testdox"
    ]
}

Tests

Parser

composer test-coverage tests/ParserTest.php

ddev composer -d plugins/odt2spip test-coverage plugins/odt2spip/tests/ParserTest.php

Les fichiers utilisés sont en partie ceux utilisés dans les tests de Pandoc (https://github.com/jgm/pandoc/tree/main/test/odt/odt).

Pour un fichier .odt :

  1. modifier son estension en .zip ;
  2. unzip fichier.zip -d fichier.
  3. créer les fichiers fichier.spip.txt ou fichier.md.txt.

/!\ ATTENTION : ne surtout pas "beautifier" les content.xml