Enquêter sur ce qui pourrait être utilisé comme analyseur Markdown en Python

Je veux manipuler un document Markdown.

Si vous recherchez quelque chose comme ça en Python, il semble courant de convertir Markdown en HTML. Au lieu de cela, si vous souhaitez travailler avec des documents au format Markdown, vous devez pouvoir utiliser quelque chose comme AST. Il n'y avait pas grand-chose en soi, alors j'ai cherché quelque chose qui pourrait être utilisé comme base pour le remodelage.

Notions de base

Manupuler un document Markdown est difficile.

Par exemple, supposons que vous souhaitiez créer une extension oléore (extension nanbuwks) qui insère un modèle spécifique lorsque vous écrivez le commentaire suivant dans la phrase.


[](nanbuwks:template)

Est-il possible de simplement rechercher / remplacer une chaîne de caractères pour le texte Makrdown?

――Non, si cette ligne est incluse dans le bloc de code, vous devez l'ignorer.

Après tout, vous devez analyser la structure du document markdown pour déterminer si elle peut être considérée comme du texte brut, puis rechercher / remplacer la chaîne de caractères.

Cela ne se limite pas à l'expansion oléore, mais également lors du changement du chemin de l'image, du changement de niveau d'en-tête, du formatage automatique, etc.

・ ・ ・ Comment analyser la structure du document de markdown?

Analyseur général

En général, il semble produire Markdown en HTML.

Markdown → Talkerizer → Données de structure du document → Renderer → Sortie au format HTML

Sera. Imaginez ce qui suit.

Parleur

Comme ça?

--markdown a un niveau de bloc et un niveau de portée --Il existe des jetons de bloc et des jetons d'étendue comme jetons.

Données de structure de document

Stocker la structure du document examinée par le locuteur dans les données internes Les données de la structure du document ont une structure arborescente

Renderer

Reconstruisez le document en ajoutant des balises et du texte de contrôle en fonction des données de structure du document. En général, il y a beaucoup de choses pour faire du HTML ici.

Ce que tu veux

Ceux qui peuvent utiliser le Markdown brut

Si vous pouvez obtenir les données de structure du document en les liant à la structure de texte Markdown d'origine, vous pouvez agir en vous référant à la structure du document. Mais je n'ai pas pu le trouver. Ensuite, j'ai voulu faire quelque chose comme ça en essayant de modifier l'existant, mais cela semble prendre beaucoup de temps, alors j'ai abandonné cette fois.

Que peut faire Markdown à partir de données abstraites

Le démarquage peut être régénéré à partir des données et du contexte de la structure du document. Cependant, comme il est basé sur des données abstraites, le document original ne peut pas être entièrement reproduit. N'y a-t-il pas une telle chose parce que ça va? → Cela ne semblait pas être là.

Ceux qui peuvent générer des données abstraites

Pouvez-vous obtenir quelque chose comme AST? Il ne semble pas y avoir de sortie sans modifier le code.

(Ajouté le 4 janvier 2020. J'ai trouvé des choses à convertir de Markdown en JSON plus tard. Je n'ai pas examiné les détails, mais cela a peut-être satisfait aux exigences.)

Choses qui pourraient faire Markdown à partir de données abstraites

Il semble que Markdown puisse sortir en modifiant le code existant. Est-il facile d'ajouter plus de fonctions si cela peut être fait?

Enquête

Enquêter avec les exigences suivantes

Python-Markdown

https://github.com/Python-Markdown/markdown Cela ressemble à une bibliothèque standard. Il existe de nombreux plug-ins. Cependant, il ne semble pas être converti en autre chose que du HTML. Par exemple, Markdown-LaTeX semble également convertir la notation Markdown-LaTeXTEX en ligne en Markdown en HTML. J'ai abandonné parce qu'il semble que c'est différent de ce que je veux.

commonmark.py

https://github.com/readthedocs/commonmark.py

Port Commonmark vers Python. La marque commune est faite avec l'idée standard de Markdown. L'implémentation de référence est ci-dessous. https://github.com/commonmark/commonmark.js

En me concentrant sur la pièce de référence, j'abandonne car il semble qu'elle ne convient pas à l'application.

mistune

Le traitement semble être rapide La version2 est sortie le 12/12/2019, mais à partir du 1/1/2019, la 0.8.4 est installée sur Ubuntu pip3. J'ai fait ce qui suit pour installer la dernière version.


$ sudo pip3 install git+https://github.com/lepture/mistune.git

Abandonner faute de documentation

mistletoe

Par défaut, le gui a une sortie vers LaTeX en plus du HTML.

Il semble facile à utiliser, donc je vais essayer de le faire sur cette base.

Ce que j'ai appris après l'enquête

Celui qui semble bon qui est sorti après avoir examiné les quatre ci-dessus et l'avoir fait avec du gui. Je ne l'ai pas vérifié correctement, mais je saisis une autre occasion.

pycmark

https://github.com/tk0miya/pycmark

Il y a une description selon laquelle "parce qu'il a une extensibilité, une analyse flexible telle que la prise en charge de GFM (GitHub Flavored Markdown) et l'ajout de la notation originale est possible" https://www.papercall.io/speakers/tk0miya/speaker_talks/78833-markdown

marko

https://pypi.org/project/marko/#extend-marko

Among all implementations of Python's markdown parser, it is a common issue that user can't easily extend it to add his own features. une.

Recommended Posts

Enquêter sur ce qui pourrait être utilisé comme analyseur Markdown en Python
Un enregistrement que GAMEBOY n'a pas pu être fait avec Python. (PYBOY)
33 chaînes à ne pas utiliser comme noms de variables en python
Tkinter n'a pas pu être importé en Python
Que se passe-t-il si vous "importez A, B comme C" en Python?
J'ai essayé d'implémenter ce qui semble être un outil de snipper Windows avec Python
Pour pouvoir utiliser le japonais avec Python dans l'environnement Docker
Spécifiez une sous-commande comme argument de ligne de commande en Python
Une collection de code souvent utilisée dans Python personnel
compréhension de liste car operator.methodcaller ne peut pas être utilisé avec python 2.5
Comment afficher DataFrame sous forme de tableau dans Markdown
Operators ++, - ne peut pas être utilisé en python (différence de php)
Gérer le démarquage avec python
Peut être utilisé chez les pros de la compétition! Bibliothèque standard Python
[Redash] La bibliothèque standard ne peut pas être utilisée dans la fonction python
Que signifie le dernier () dans une fonction en Python?
Ce qui semble être un modèle pour la partie d'entrée standard du pro de la concurrence en python3
L'image en échelle de gris est affichée sous forme d'image couleur dans OpenCV / Python
Scripts pouvant être utilisés lors de l'utilisation de Bottle en Python
Prendre une capture d'écran en Python
Créer une fonction en Python
Créer un bookmarklet en Python
Dessinez un cœur en Python
Ce que j'ai appris en Python
Compilateur en Python: analyseur PL / 0
Exécutez le code de sortie sur le serveur Web local en tant que "A, faisant semblant d'être B" en python
[Python] Mémo des phrases fréquemment utilisées dans les scripts Python
Que faire si vous obtenez moins zéro en Python
Un minuteur (ticker) qui peut être utilisé sur le terrain (peut être utilisé n'importe où)
Nouvelles fonctionnalités de Python 3.9 (1) -L'opérateur d'ensemble de somme peut être utilisé dans le type de dictionnaire.
Résumé de l'entrée standard de Python pouvant être utilisée dans Competition Pro
Une classe qui résume les méthodes fréquemment utilisées dans l'api twitter (python)
Obtenez la formule dans le fichier Excel sous forme de chaîne en Python
J'ai écrit un tri-arbre qui peut être utilisé pour l'implémentation de dictionnaire à grande vitesse en langage D et Python
[Python] Qu'est-ce qu'une fonction zip?
Probablement dans un serpent Nishiki (Titre original: Peut-être en Python)
[Python] Qu'est-ce qu'une instruction with?
Ecrire une dichotomie en Python
Utilisez pymol comme bibliothèque python
[python] Gérer les fonctions dans une liste
Appuyez sur une commande en Python (Windows)
8 commandes fréquemment utilisées dans Python Django
Créer un conteneur DI avec Python
Dessinez une matrice de diagramme de dispersion avec python
ABC166 en Python A ~ C problème
Ecrire des algorithmes A * (A-star) en Python
[Python] Connaissances de base utilisées dans AtCoder
Utilisez Blender comme module Python
Résoudre ABC036 A ~ C avec Python
Ecrire un graphique à secteurs en Python
Ecrire le plugin vim en Python
Écrire une recherche de priorité en profondeur en Python
Implémentation d'un algorithme simple en Python 2
Résoudre ABC037 A ~ C avec Python
Lancer le script Python en service
Exécutez un algorithme simple en Python