myPandoc Documentation

Convertisseur de documents inspiré du projet Pandoc

Qu'est-ce que myPandoc?

myPandoc est un convertisseur de documents inspiré du projet Pandoc original. Ce programme permet de convertir des documents entre différents formats (XML, JSON, Markdown) tout en préservant leur structure et leur contenu.

myPandoc Illustration

Fonctionnalités principales

Conversion multi-formats

Convertissez facilement entre XML, JSON et Markdown

Détection automatique

Détection automatique du format d'entrée

Bibliothèque custom

Bibliothèque de parsing personnalisée en Haskell

Structure préservée

Conservation de la structure du document pendant la conversion

Installation

Prérequis

  • Stack (version 2.1.3 ou supérieure)
  • GHC (installé automatiquement par Stack)

Compilation

Terminal
make

Cette commande va compiler le projet et générer l'exécutable mypandoc.

Utilisation

Syntaxe
./mypandoc -i ifile -f oformat [-o ofile] [-e iformat]

Options

  • -i ifile: Chemin vers le fichier d'entrée (obligatoire)
  • -f oformat: Format de sortie (xml, json, markdown) (obligatoire)
  • -o ofile: Chemin vers le fichier de sortie (optionnel, stdout par défaut)
  • -e iformat: Format d'entrée (xml, json, markdown) (optionnel, détection automatique par défaut)

Exemples d'utilisation

Convertir un fichier XML en Markdown
./mypandoc -i example.xml -f markdown
Convertir un fichier JSON en XML et sauvegarder le résultat
./mypandoc -i document.json -f xml -o result.xml
Spécifier explicitement le format d'entrée
./mypandoc -i document.txt -e json -f markdown -o result.md

Formats supportés

XML

XML (Extensible Markup Language) est un langage de balisage et un format de fichier pour stocker, transmettre et reconstruire des données arbitraires.

Exemple de document XML
<document>
    <header title="Simple example"></header>
    <body>
        <paragraph>This is a simple example</paragraph>
    </body>
</document>

JSON

JSON (JavaScript Object Notation) est un format léger d'échange de données qui est un sous-ensemble du langage JavaScript.

Exemple de document JSON
{
    "header": {
        "title": "Simple example"
    },
    "body": [
        "This is a simple example"
    ]
}

Markdown

Markdown est un langage de balisage léger pour créer du texte formaté à l'aide d'un éditeur de texte brut.

Exemple de document Markdown
---
title: Simple example
---

This is a simple example

Architecture du projet

Architecture du projet myPandoc
Structure du projet
.
├── app/                    # Code source de l'application principale
│   └── Main.hs             # Point d'entrée du programme
├── src/                    # Bibliothèques et modules
│   ├── Parser/             # Notre bibliothèque de parsing custom
│   │   ├── Combinators.hs  # Combinateurs de parsers
│   │   ├── Core.hs         # Fonctions de base pour le parsing
│   │   └── ...
│   ├── Document/           # Définition de la structure de document
│   │   ├── Types.hs        # Types de données pour représenter un document
│   │   └── ...
│   ├── Format/             # Parsers et générateurs pour chaque format
│   │   ├── XML.hs          # Parser et générateur XML
│   │   ├── JSON.hs         # Parser et générateur JSON
│   │   ├── Markdown.hs     # Parser et générateur Markdown
│   │   ├── ConvJson.hs     # Converstiseur JSON
│   │   └── ...
├── test/                   # Tests unitaires et tests d'intégration
├── examples/               # Exemples de documents dans différents formats
├── Makefile                # Pour la compilation du projet
├── package.yaml            # Configuration du package hpack
├── stack.yaml              # Configuration de Stack
└── README.md               # Ce fichier

Composants clés

Bibliothèque de Parsing

Une bibliothèque de parsing personnalisée développée pour ce projet qui facilite l'implémentation des parsers pour chaque format.

Structure de Document

Une représentation intermédiaire commune qui permet de convertir facilement entre les différents formats.

Parsers de Format

Modules spécifiques pour analyser et générer chaque format supporté (XML, JSON, Markdown).

CLI

Interface en ligne de commande pour interagir avec le programme.

Bibliothèque de Parsing

Pour ce projet, nous avons développé notre propre bibliothèque de parsing en Haskell qui nous aide à implémenter les parsers pour les différents formats de fichiers.

Exemple de Combinateurs

Parser/Combinators.hs
-- Exemples de combinateurs de parsers
-- Ces fonctions permettent de combiner des parsers simples
-- pour créer des parsers plus complexes

-- Parser pour une chaîne spécifique
string :: String -> Parser String
string [] = return []
string (c:cs) = do
    char c
    string cs
    return (c:cs)

-- Parser pour un choix entre deux parsers
(<|>) :: Parser a -> Parser a -> Parser a
p1 <|> p2 = Parser $ \input -> 
    case runParser p1 input of
        Left _ -> runParser p2 input
        right -> right

-- Parser qui applique une fonction à un résultat
(<$>) :: (a -> b) -> Parser a -> Parser b
f <$> p = Parser $ \input ->
    case runParser p input of
        Left err -> Left err
        Right (rest, res) -> Right (rest, f res)

Exemples

Exemple de conversion XML vers Markdown

Fichier d'entrée (example.xml)

example.xml
<document>
    <header title="Simple example" author="John Doe" date="2023-05-15"></header>
    <body>
        <paragraph>Ceci est un paragraphe d'exemple avec du texte <italic>en italique</italic> et <bold>en gras</bold>.</paragraph>
        <section title="Une section">
            <paragraph>Contenu de la section avec un <link href="https://example.com">lien</link>.</paragraph>
        </section>
    </body>
</document>

Commande

Terminal
./mypandoc -i example.xml -f markdown -o result.md

Résultat (result.md)

result.md
---
title: Simple example
author: John Doe
date: 2023-05-15
---

Ceci est un paragraphe d'exemple avec du texte *en italique* et **en gras**.

## Une section

Contenu de la section avec un [lien](https://example.com).

Tests

Pour exécuter les tests unitaires et d'intégration:

Terminal
make tests_run

Notre suite de tests vérifie la bonne conversion entre les différents formats ainsi que le bon fonctionnement de la bibliothèque de parsing.

Fonctionnalités bonus

Support des tableaux

Support amélioré pour les tableaux en Markdown

Détection avancée

Détection avancée du format d'entrée

Gestion des erreurs

Gestion des erreurs détaillée et informative

Notes de bas de page

Support pour les notes de bas de page

Contributeurs

GBETCHEDJI James

@Noge

Salemgnk

@Scorpi7

KAKPO Emmanuelle

@emmanuellakakpo

Elias Hounnou

@saliehsab

Ce projet est réalisé dans le cadre du module B-FUN-400 à Epitech.