URL: https://linuxfr.org/forums/programmation-perl/posts/classer-des-documents-markdown-par-niveau-de-titres Title: classer des documents markdown par niveau de titres Authors: zurvan Date: 2021年01月31日T13:39:00+01:00 License: CC By-SA Tags: Score: 1 Il peut être pratique à certaines occasions de trier des fichiers markdown (ou apparentés), selon leur titres / entêtes. Cela peut concerner un classement par dates, ou par numéros de chapitres par exemple, ce qui pourrait s'appliquer pour un blog, un livre etc Un exemple de fichier de départ : ```markdown C'est un exemple pour le script de classement par titres. # Chapitre 01 Cette partie appartient au "Chapitre 01". ## 2020年12月15日 Cette partie appartient au "Chapitre 01", et a pour titre 2020年12月15日. ## 2020年12月14日 Cette partie appartient au "Chapitre 01", et a pour titre 2020年12月14日. ## 2020年12月16日 Cette partie appartient au "Chapitre 01", et a pour titre 2020年12月15日. # Chapitre 02 Cette partie appartient au "Chapitre 02". ## 2020年11月17日 Cette partie appartient au "Chapitre 02", et a pour titre 2020年11月17日. ## 2021年02月14日 Cette partie appartient au "Chapitre 02", et a pour titre 2021年02月14日. ## 2020年12月16日 Cette partie appartient au "Chapitre 02", et a pour titre 2020年12月15日. # Chapitre 04 ## 2020年11月17日 Cette partie appartient au "Chapitre 04", et a pour titre 2020年11月17日. ## 2020年10月07日 Cette partie appartient au "Chapitre 04", et a pour titre 2020年10月07日. # Chapitre 03 ## 2020年11月17日 Cette partie appartient au "Chapitre 03", et a pour titre 2020年11月17日. ## 2020年04月06日 Cette partie appartient au "Chapitre 03", et a pour titre 2020年04月06日. ``` Idéalement, il devrait être possible de classer les titres 1 en premier, par ordre croissant, puis les sous titres (titre 2) également par ordre croissant, mais uniquement à l'intérieur de leur parent. Ce qui donnerait cela : ```markdown C'est un exemple pour le script de classement par titres. # Chapitre 01 Cette partie appartient au "Chapitre 01". ## 2020年12月14日 Cette partie appartient au "Chapitre 01", et a pour titre 2020年12月14日. ## 2020年12月15日 Cette partie appartient au "Chapitre 01", et a pour titre 2020年12月15日. ## 2020年12月16日 Cette partie appartient au "Chapitre 01", et a pour titre 2020年12月15日. # Chapitre 02 Cette partie appartient au "Chapitre 02". ## 2020年11月17日 Cette partie appartient au "Chapitre 02", et a pour titre 2020年11月17日. ## 2020年12月16日 Cette partie appartient au "Chapitre 02", et a pour titre 2020年12月15日. ## 2021年02月14日 Cette partie appartient au "Chapitre 02", et a pour titre 2021年02月14日. # Chapitre 03 ## 2020年04月06日 Cette partie appartient au "Chapitre 03", et a pour titre 2020年04月06日. ## 2020年11月17日 Cette partie appartient au "Chapitre 03", et a pour titre 2020年11月17日. # Chapitre 04 ## 2020年10月07日 Cette partie appartient au "Chapitre 04", et a pour titre 2020年10月07日. ## 2020年11月17日 Cette partie appartient au "Chapitre 04", et a pour titre 2020年11月17日. ``` J'ai trouvé un petit script qui permet de faire ça, mais qui ne prend pas en compte toutes les possibilités : https://stackoverflow.com/questions/25351917/sort-markdown-file-by-heading ```sh perl -0777 -ne ' (undef,@paragraphs) = split /^#(?=[^#])/m; print map {"#$_"} sort @paragraphs; ' file.md ``` Le problème, c'est que si on classe par titre 1, la ou les lignes avant le titre 1 sont effacées. Si on adapte pour classer par titre 2, avec ça à la place : ```sh perl -0777 -ne '(undef,@paragraphs) = split /^##(?=[^#])/m; print map {"##$_"} sort @paragraphs;' file.md ``` cela ne va bien évidemment pas prendre en compte les titres niveau 1, et donner un résultat non souhaité. Avez-vous des idées pour corriger cela ? Je n'y connais pas grand chose en perl (ça peut aussi se résoudre en python ou autre... à votre bon coeur...)