Biblioteca que convierte HTML a Markdown para su cordura y conveniencia.
Requiere : PHP 7.2+
Desarrollador principal : @colinodell
Autor original : @nickcernis
"¿Qué alquimia es esta?" murmuras. "Puedo ver por qué convertirías Markdown a HTML", continúas, ya trabajando un poco en la pregunta, "pero ¿por qué ir al revés?"
Normalmente convertirías HTML a Markdown si:
Solicite la biblioteca emitiendo este comando:
composer require league/html-to-markdown
Agregar require 'vendor/autoload.php';
a la parte superior de su guión.
A continuación, cree una nueva instancia de HtmlConverter, pasando su código HTML válido a su función convert()
:
use League HTMLToMarkdown HtmlConverter ;
$ converter = new HtmlConverter ();
$ html = " <h3>Quick, to the Batpoles!</h3> " ;
$ markdown = $ converter -> convert ( $ html );
La variable $markdown
ahora contiene la versión Markdown de su HTML como una cadena:
echo $ markdown ; / / == > ### Quick, to the Batpoles!
El directorio demo
incluido contiene un formulario de conversión HTML->Markdown para probar.
Precaución
De forma predeterminada, esta biblioteca conserva etiquetas HTML sin equivalentes de Markdown, como <span>
, <div>
, <iframe>
, <script>
, etc. Si va a analizar entradas de usuarios que no son de confianza, considere configurar strip_tags
y/o remove_nodes
opciones documentadas a continuación, y también el uso de una biblioteca (como HTML Purifier) para proporcionar filtrado HTML adicional.
Para eliminar etiquetas HTML que no tienen un equivalente de Markdown y al mismo tiempo conservar el contenido dentro de ellas, establezca strip_tags
en verdadero, de esta manera:
$ converter = new HtmlConverter ( array ( ' strip_tags ' => true ));
$ html = ' <span>Turnips!</span> ' ;
$ markdown = $ converter -> convert ( $ html ); / / $ markdown now contains "Turnips!"
O más explícitamente, así:
$ converter = new HtmlConverter ();
$ converter -> getConfig ()-> setOption ( ' strip_tags ' , true );
$ html = ' <span>Turnips!</span> ' ;
$ markdown = $ converter -> convert ( $ html ); / / $ markdown now contains "Turnips!"
Tenga en cuenta que sólo se eliminan las etiquetas, no el contenido que contienen.
Para eliminar las etiquetas y su contenido, pase una lista de etiquetas separadas por espacios en remove_nodes
, como esta:
$ converter = new HtmlConverter ( array ( ' remove_nodes ' => ' span div ' ));
$ html = ' <span>Turnips!</span><div>Monkeys!</div> ' ;
$ markdown = $ converter -> convert ( $ html ); / / $ markdown now contains ""
De forma predeterminada, todos los comentarios se eliminan del contenido. Para conservarlos, utilice la opción preserve_comments
, así:
$ converter = new HtmlConverter ( array ( ' preserve_comments ' => true ));
$ html = ' <span>Turnips!</span><!-- Monkeys! --> ' ;
$ markdown = $ converter -> convert ( $ html ); / / $ markdown now contains "Turnips!<!-- Monkeys! -->"
Para conservar solo comentarios específicos, configure preserve_comments
con una serie de cadenas, como esta:
$ converter = new HtmlConverter ( array ( ' preserve_comments ' => array ( ' Eggs! ' )));
$ html = ' <span>Turnips!</span><!-- Monkeys! --><!-- Eggs! --> ' ;
$ markdown = $ converter -> convert ( $ html ); / / $ markdown now contains "Turnips!<!-- Eggs! -->"
De forma predeterminada, los enlaces de marcador de posición se conservan. Para eliminar los enlaces del marcador de posición, use la opción strip_placeholder_links
, como esta:
$ converter = new HtmlConverter ( array ( ' strip_placeholder_links ' => true ));
$ html = ' <a>Github</a> ' ;
$ markdown = $ converter -> convert ( $ html ); / / $ markdown now contains "Github"
De forma predeterminada, las etiquetas en negrita se convierten utilizando la sintaxis de asterisco y las etiquetas en cursiva se convierten utilizando la sintaxis subrayada. Cámbielos usando las opciones bold_style
y italic_style
.
$ converter = new HtmlConverter ();
$ converter -> getConfig ()-> setOption ( ' italic_style ' , ' * ' );
$ converter -> getConfig ()-> setOption ( ' bold_style ' , ' __ ' );
$ html = ' <em>Italic</em> and a <strong>bold</strong> ' ;
$ markdown = $ converter -> convert ( $ html ); / / $ markdown now contains "*Italic* and a __bold__"
De forma predeterminada, las etiquetas br
se convierten en dos espacios seguidos de un carácter de nueva línea según el Markdown tradicional. Establezca hard_break
en true
para omitir los dos espacios, según GitHub Flavored Markdown (GFM).
$ converter = new HtmlConverter ();
$ html = ' <p>test<br>line break</p> ' ;
$ converter -> getConfig ()-> setOption ( ' hard_break ' , true );
$ markdown = $ converter -> convert ( $ html ); / / $ markdown now contains "test n line break"
$ converter -> getConfig ()-> setOption ( ' hard_break ' , false ); / / default
$ markdown = $ converter -> convert ( $ html ); / / $ markdown now contains "test n line break"
De forma predeterminada, a
etiquetas se convierten a la sintaxis de enlace más sencilla posible, es decir, si no hay texto o título disponible, se utilizará la sintaxis <url>
en lugar de la sintaxis completa [url](url)
. Establezca use_autolinks
en false
para cambiar este comportamiento y utilizar siempre la sintaxis de enlace completa.
$ converter = new HtmlConverter ();
$ html = ' <p><a href="https://thephpleague.com">https://thephpleague.com</a></p> ' ;
$ converter -> getConfig ()-> setOption ( ' use_autolinks ' , true );
$ markdown = $ converter -> convert ( $ html ); / / $ markdown now contains "<https://thephpleague.com>"
$ converter -> getConfig ()-> setOption ( ' use_autolinks ' , false ); / / default
$ markdown = $ converter -> convert ( $ html ); / / $ markdown now contains "[https://thephpleague.com](https://thephpleague.com)"
Puede pasar el objeto Environment
actual para personalizar, es decir, qué convertidores se deben utilizar.
$ environment = new Environment ( array (
/ / your configuration here
));
$ environment -> addConverter ( new HeaderConverter ()); / / optionally - add converter manually
$ converter = new HtmlConverter ( $ environment );
$ html = ' <h3>Header</h3>
<img src="" />
' ;
$ markdown = $ converter -> convert ( $ html ); / / $markdown now contains " ### Header" and "<img src="" />"
La compatibilidad con tablas Markdown no está habilitada de forma predeterminada porque no forma parte de la sintaxis original de Markdown. Para usar tablas agregue el convertidor explícitamente:
use League HTMLToMarkdown HtmlConverter ;
use League HTMLToMarkdown Converter TableConverter ;
$ converter = new HtmlConverter ();
$ converter -> getEnvironment ()-> addConverter ( new TableConverter ());
$ html = " <table><tr><th>A</th></tr><tr><td>a</td></tr></table> " ;
$ markdown = $ converter -> convert ( $ html );
Los encabezados Setext (subrayados) son los predeterminados para H1 y H2. Si prefiere el estilo ATX para H1 y H2 (# Encabezado 1 y ## Encabezado 2), establezca header_style
en 'atx' en la matriz de opciones cuando cree una instancia del objeto:
$converter = new HtmlConverter(array('header_style'=>'atx'));
Los encabezados de prioridad H3 e inferiores siempre usan el estilo atx.
Se hace referencia a enlaces e imágenes en línea. Las referencias a notas al pie (donde los atributos image src y Anchor href se enumeran en las notas al pie) no se utilizan.
Las citas en bloque no están ajustadas en líneas, lo que hace que el Markdown convertido sea más fácil de editar.
HTML To Markdown requiere las extensiones xml, lib-xml y dom de PHP, todas las cuales están habilitadas de forma predeterminada en la mayoría de las distribuciones.
Errores como "Error fatal: Clase 'DOMDocument' no encontrada" en distribuciones como CentOS que deshabilitan la extensión xml de PHP se pueden resolver instalando php-xml.
Muchas gracias a todos los contribuyentes hasta ahora. Se agradecen más mejoras y sugerencias de funciones.
HTML To Markdown crea un DOMDocument a partir del HTML proporcionado, recorre el árbol y convierte cada nodo en un nodo de texto que contiene el descuento equivalente, comenzando desde el nodo más anidado y avanzando hacia el nodo raíz.
style
).Utilice una de estas fantásticas bibliotecas:
Sin embargo, no hay garantías sobre los élficos.