Convierta enlaces de Markdown a HTML con Pandoc

6 minutos de lectura

Avatar de usuario de P. Tail
P. Cola

En mi nuevo proyecto tengo varios archivos Markdown que están vinculados entre sí. Estos enlaces se refieren al original. .md archivos

Ejemplo:

Archivo LÉAME.md

...
1. [Development documentation](Development.md)
1. [User documentation](Usage.md)
...

Si convierto estos archivos con Pandoc, por ejemplo, a archivos HTML, todos los enlaces siguen apuntando al original .md archivo. Estoy buscando una manera de convertir también el tipo de enlace, lo que significa que los archivos de salida deben hacer referencia al tipo de archivo de salida, como HTML, PDF, Texasetc. ¿Hay alguna forma de convertir el tipo de enlace interno con Pandoc?

Yo uso esto para convertir los archivos:

pandoc -f markdown -t html5 input.md -o output.html

Avatar de usuario de JW.
JW.

Ejemplo con el filtros Lua incorporados:

-- links-to-html.lua
function Link(el)
  el.target = string.gsub(el.target, "%.md", ".html")
  return el
end

Entonces:

pandoc -f markdown -t html5 input.md -o output.html --lua-filter=links-to-html.lua

  • Tenga en cuenta que # no es un comentario de Lua válido. Utilice — si desea conservar la primera línea.

    – gaitero

    25 de junio de 2021 a las 8:58

  • Esperaría que esto preservara los enlaces y solo cambiara el href; pero el comando dado también convierte las etiquetas “a” en etiquetas “incrustadas”, ¿lo cual es de alguna manera peor? Me pregunto qué podría estar haciendo mal.

    – Juan Enrique

    1 de noviembre de 2021 a las 0:12


Avatar de usuario de Sergio Correia
Sergio Correia

Puede crear un filtro que verifique cada enlace elemento y—si la URL termina con .md—lo reemplaza por .html.

Ejemplo con Python, usando el flauta de pan paquete:

import panflute as pf

def action(elem, doc):
    if isinstance(elem, pf.Link) and elem.url.endswith('.md'):
        elem.url = elem.url[:-3] + '.html'
        return elem

if __name__ == '__main__':
    pf.run_filter(action)

  • ¡Gracias, eso es genial! Me pregunto si no hay una manera simple de usar las opciones de Pandoc.

    – P. Cola

    8 de diciembre de 2016 a las 8:42

  • @ P. Tail no, no hay una forma lista para usar de hacer eso. Markdown asume que sus enlaces ya apuntan a los documentos HTML renderizados y no altera sus URL. De hecho, cualquier alteración de las URL sería un error. Por supuesto, es posible usar un complemento personalizado (como el que se muestra aquí) con varios analizadores Markdown. Pero tiene que ser personalizado porque solo usted conoce sus necesidades específicas y ninguna solución única podría satisfacer las necesidades de la mayoría (y mucho menos de todos) los usuarios.

    – Waylán

    8 dic 2016 a las 15:17

Avatar de usuario de Nick Roz
Nick Roz

Suponiendo que va a servirle páginas HTML a través de un servidor web, es relativamente simple resolver todos *.md URL como *.html en lugar de reescribirlos a través de Pandoc, por ejemplo, usando Nginx:

location ~ \.md$ {
  if (!-f $request_filename) {
    rewrite ^(.*)\.md$ $1 permanent;
  }
}

location / {
  try_files /$uri /$uri.html;
}

Alternativamente, puede reemplazar todos md enlaces con html usando sed
(tomado de aquí):

Cambie todas las URL de archivos internos para que no apunten a enlaces *.md y, en su lugar, apunten al archivo local *.html

  1. ejecute recursivamente este comando sed (reemplace programáticamente NOMBRE DE ARCHIVO)

    sed -n -i.bak '/href="\./s/\.md/\.html/' FILENAME.html
    
  2. alternativamente, ejecute el siguiente comando en su lugar (reemplace programáticamente NOMBRE DE ARCHIVO)

    sed -e '/href="\./s/\.md/\.html/' FILENAME.html > FILENAME.html.tmp && mv FILENAME.html.tmp FILENAME.html`
    

  • No recomendaría este enfoque, porque podría haber un enlace en las secciones de código que no desearía convertir y otras complicaciones similares en las que quizás no piense en este momento, y que elude automáticamente si usa otra herramienta para analizar, como pandoc.

    – hoijui

    16 de agosto de 2019 a las 15:01

Avatar de usuario de Stefan
stefano

Una ligera modificación a la respuesta de Sergio Correia también capta enlaces de anclaje en documentos. Cuidarse; en algunos casos raros, esto podría distorsionar los enlaces…

import panflute as pf

def action(elem, doc):
    if isinstance(elem, pf.Link):
        if elem.url.endswith('.md'):
            elem.url = elem.url[:-3] + '.html'
            return elem
        elif elem.url.find('.md#'):
            elem.url = elem.url.replace('.md#', '.html#')
            return elem

if __name__ == '__main__':
    pf.run_filter(action)

Avatar de usuario de MatrixManAtYrService
MatrixManAtYrService

Tuve un problema similar, así que hice md_htmldoc.

encuentra todos los .md archivos en un directorio y luego crea un directorio separado donde todos los archivos Markdown se han convertido a HTML.

Corrige hipervínculos (gracias a la respuesta de Sergio Correia).

También recopila las referencias de archivos locales para que los enlaces a las imágenes y demás sigan funcionando.

  • Vi en tu código (get_references.py), que usa expresiones regulares para encontrar enlaces en Markdown. No recomendaría este enfoque, porque podría haber enlaces en secciones de código que no desearía convertir y otras complicaciones similares en las que quizás no piense en este momento. podría eludir esto automáticamente, si siempre usa otra herramienta para analizar, como pandoc (como también lo haces por flauta de pan).

    – hoijui

    16 de agosto de 2019 a las 15:07

  • @hoijui: get_references.py no se usa para convertir algo, solo se usa para encontrar referencias. Cada referencia encontrada se verifica si se refiere a un archivo local; si es así, se agrega a doc_relevantque luego se usa para (1) compilar un descuento en html o (2) copiar ese archivo en HTML_DIR

    – Stefan

    31 de enero de 2020 a las 15:19

  • ok, gracias 🙂 aún así, es posible que pierda referencias de esta manera, por las razones mencionadas anteriormente. Solo la construcción de un AST puede hacerlo correctamente (que es lo que hace pandoc, por ejemplo). usando filtros y salida AST (¿sin procesar?) Con pandoc, es bastante fácil de hacer.

    – hoijui

    1 de febrero de 2020 a las 6:22

Avatar de usuario de Stéphane Gourichon
Stéphane Gourichon

Para cualquiera que use un Makefile para impulsar la conversión, aquí hay un fragmento de Makefile que proporciona una regla que transforma un .md en un .html con el enlace ajustado:

SHELL=/bin/bash

%.html: %.md
    ( set -eu -o pipefail ; \
    pandoc -i $< -t html | \
    sed -E 's/<a href="([^"]*).md/<a href="\1.html/g' > $@.tmp && mv -vf $@.tmp $@ ; )

Si test.md existe en el directorio actual, make test.html lo haré.

La regla también se encarga de no aplastar un archivo HTML existente (cualquiera que sea el motivo) hasta que la conversión realmente se realice correctamente.

  • Vi en tu código (get_references.py), que usa expresiones regulares para encontrar enlaces en Markdown. No recomendaría este enfoque, porque podría haber enlaces en secciones de código que no desearía convertir y otras complicaciones similares en las que quizás no piense en este momento. podría eludir esto automáticamente, si siempre usa otra herramienta para analizar, como pandoc (como también lo haces por flauta de pan).

    – hoijui

    16 de agosto de 2019 a las 15:07

  • @hoijui: get_references.py no se usa para convertir algo, solo se usa para encontrar referencias. Cada referencia encontrada se verifica si se refiere a un archivo local; si es así, se agrega a doc_relevantque luego se usa para (1) compilar un descuento en html o (2) copiar ese archivo en HTML_DIR

    – Stefan

    31 de enero de 2020 a las 15:19

  • ok, gracias 🙂 aún así, es posible que pierda referencias de esta manera, por las razones mencionadas anteriormente. Solo la construcción de un AST puede hacerlo correctamente (que es lo que hace pandoc, por ejemplo). usando filtros y salida AST (¿sin procesar?) Con pandoc, es bastante fácil de hacer.

    – hoijui

    1 de febrero de 2020 a las 6:22

¿Ha sido útil esta solución?