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
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
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
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
ejecute recursivamente este comando sed (reemplace programáticamente NOMBRE DE ARCHIVO)
sed -n -i.bak '/href="\./s/\.md/\.html/' FILENAME.html
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
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)
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 adoc_relevant
que luego se usa para (1) compilar un descuento en html o (2) copiar ese archivo enHTML_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
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 adoc_relevant
que luego se usa para (1) compilar un descuento en html o (2) copiar ese archivo enHTML_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