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)
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