Ecrire des filtres Pandec en Python

Ecrire des filtres Pandec en Python

J'utilise l'outil de conversion de format de document à usage général pandoc. Pour plus d'informations sur Pandoc, veuillez consulter le Guide de l'utilisateur japonais.

Cependant, dans certains cas, vous souhaiterez peut-être modifier subtilement le document pendant la conversion. Par exemple, vous souhaiterez peut-être remplacer les URL de lien en même temps lors de la conversion d'un document écrit en Markdown en HTML. Il est facile de convertir avec une expression régulière, mais pandoc fournit en fait une fonction de filtre. Les filtres vous permettent de tirer parti de l'arborescence syntaxique des documents analysés. Les filtres peuvent être écrits en Haskell ainsi qu'en pandoc lui-même, mais mécaniquement, ils peuvent être écrits dans n'importe quel langage et Python est officiellement pris en charge.

Comme indiqué ci-dessous, l'arborescence de syntaxe du document analysé par pandoc est convertie au format JSON et transmise au filtre via l'entrée / sortie standard (la figure est tirée du manuel).

                         source format
                              ↓
                           (pandoc)
                              ↓
                      JSON-formatted AST
                              ↓
                           (filter)
                              ↓
                      JSON-formatted AST
                              ↓
                           (pandoc)
                              ↓
                        target format

Vous pouvez l'utiliser pour écrire des filtres intelligents. Tout d'abord, installons les filtres pandoc officiellement fournis.

pip install pandocfilters

Utilisons ceci pour écrire un filtre qui change immédiatement l'URL du lien dans le document.

convertlink.py


from pandocfilters import toJSONFilter, Link


def myfilter(key, value, format_, meta):
    if key == 'Link':
        value[1][0] = "prefix/" + value[1][0]
        return Link(*value)


if __name__ == "__main__":
    toJSONFilter(myfilter)

Pour exécuter, spécifiez l'option de filtre lors de l'exécution de pandoc. Notez que vous devez écrire "./convertlink.py" pour spécifier le script du répertoire courant.

sample.txt


## sample document
text text text

[link](path/to/otherpage)
$ pandoc --filter=./convertlink.py -t markdown sample.txt
sample document
---------------

text text text

[link](prefix/path/to/otherpage)

Autres conseils

Un exemple d'arbre de syntaxe (pandoc AST) utilisé par pandoc peut être généré avec pandoc. Si vous spécifiez json, vous pouvez le vérifier au format JSON, et si vous spécifiez native, vous pouvez le vérifier au format Haskell.


$ pandoc -t json sample.txt 
[{"unMeta":{}},[{"t":"Header","c":[2,["sample-document",[],[]],[{"t":"Str","c":"sample"},{"t":"Space","c":[]},{"t":"Str","c":"document"}]]},{"t":"Para","c":[{"t":"Str","c":"text"},{"t":"Space","c":[]},{"t":"Str","c":"text"},{"t":"Space","c":[]},{"t":"Str","c":"text"}]},{"t":"Para","c":[{"t":"Link","c":[[{"t":"Str","c":"link"}],["path/to/otherpage",""]]}]}]]
$ pandoc -t native sample.txt
[Header 2 ("sample-document",[],[]) [Str "sample",Space,Str "document"]
,Para [Str "text",Space,Str "text",Space,Str "text"]
,Para [Link [Str "link"]("path/to/otherpage","")]]

Les détails du format peuvent être trouvés dans Text.Pandoc.Definition Documentation.

En outre, la spécification de l'option de filtre est équivalente au pipeline de commandes suivant, qui peut être utilisé pendant le débogage.


$ pandoc -t json sample.txt | python ./convertlink.py | pandoc -f json -t markdown

Recommended Posts

Ecrire des filtres Pandec en Python
Ecrire Python dans MySQL
Écrire une distribution bêta en Python
Ecrire python dans Rstudio (réticulé)
Ecrire une dichotomie en Python
Ecrire un schéma JSON avec Python DSL
Ecrire un serveur HTTP / 2 en Python
Ecrire une fonction AWS Lambda en Python
Ecrire des algorithmes A * (A-star) en Python
Ecrire le code de test du sélénium en python
Ecrire un graphique à secteurs en Python
Ecrire le plugin vim en Python
Écrire une recherche de priorité en profondeur en Python
Ecrire un test unitaire de langage C en Python
Écrire de la documentation dans Sphinx avec Python Livereload
Quadtree en Python --2
Python en optimisation
Métaprogrammation avec Python
Python 3.3 avec Anaconda
Géocodage en python
SendKeys en Python
Méta-analyse en Python
Unittest en Python
Ecrire le test dans la docstring python
Implémenter le filtre FIR en langage Python et C
Époque en Python
Discord en Python
Ecrire une courte définition de propriété en Python
Allemand en Python
DCI en Python
tri rapide en python
nCr en python
Ecrire le fichier O_SYNC en C et Python
N-Gram en Python
Programmation avec Python
Ecrire un programme de chiffrement Caesar en Python
Plink en Python
Constante en Python
Lire et écrire des fichiers JSON avec Python
Ecrire une méthode de cupidité simple en Python
FizzBuzz en Python
Sqlite en Python
Étape AIC en Python
Ecrire un module python dans fortran en utilisant f2py
Ecrire un plugin Vim simple en Python 3
LINE-Bot [0] en Python
CSV en Python
Assemblage inversé avec Python
Réflexion en Python
Constante en Python
nCr en Python.
format en python
Scons en Python 3
Puyopuyo en python
python dans virtualenv
PPAP en Python
Quad-tree en Python
Réflexion en Python
Chimie avec Python