Библиотека, которая конвертирует HTML в Markdown для вашего удобства и здравомыслия.
Требуется : PHP 7.2+.
Ведущий разработчик : @colinodell
Автор оригинала : @nickcernis
«Что это за алхимия?» бормочешь ты. «Я понимаю, почему вы конвертируете Markdown в HTML», — продолжаете вы, уже немного обдумывая вопрос, — «но зачем идти другим путем?»
Обычно вам следует конвертировать HTML в Markdown, если:
Запросите библиотеку, выполнив следующую команду:
composer require league/html-to-markdown
Добавьте require 'vendor/autoload.php';
в начало вашего скрипта.
Затем создайте новый экземпляр HtmlConverter, передав действительный HTML-код в его функцию convert()
:
use League HTMLToMarkdown HtmlConverter ;
$ converter = new HtmlConverter ();
$ html = " <h3>Quick, to the Batpoles!</h3> " ;
$ markdown = $ converter -> convert ( $ html );
Переменная $markdown
теперь содержит версию HTML в формате Markdown в виде строки:
echo $ markdown ; / / == > ### Quick, to the Batpoles!
Включенный demo
каталог содержит форму преобразования HTML->Markdown, которую можно попробовать.
Осторожность
По умолчанию эта библиотека сохраняет HTML-теги без эквивалентов Markdown, таких как <span>
, <div>
, <iframe>
, <script>
и т. д. Если вы будете анализировать ненадежный ввод от пользователей, рассмотрите возможность установки strip_tags
и/или remove_nodes
параметры, описанные ниже, а также использование библиотеки (например, HTML Purifier) для обеспечения дополнительной фильтрации HTML.
Чтобы удалить HTML-теги, не имеющие эквивалента Markdown, сохранив при этом содержимое внутри них, установите для strip_tags
значение true, например:
$ converter = new HtmlConverter ( array ( ' strip_tags ' => true ));
$ html = ' <span>Turnips!</span> ' ;
$ markdown = $ converter -> convert ( $ html ); / / $ markdown now contains "Turnips!"
Или более явно, вот так:
$ converter = new HtmlConverter ();
$ converter -> getConfig ()-> setOption ( ' strip_tags ' , true );
$ html = ' <span>Turnips!</span> ' ;
$ markdown = $ converter -> convert ( $ html ); / / $ markdown now contains "Turnips!"
Обратите внимание, что удаляются только сами теги, а не содержимое, которое они содержат.
Чтобы удалить теги и их содержимое, передайте список тегов, разделенный пробелами, в remove_nodes
, например:
$ converter = new HtmlConverter ( array ( ' remove_nodes ' => ' span div ' ));
$ html = ' <span>Turnips!</span><div>Monkeys!</div> ' ;
$ markdown = $ converter -> convert ( $ html ); / / $ markdown now contains ""
По умолчанию все комментарии удаляются из контента. Чтобы сохранить их, используйте опцию preserve_comments
, например:
$ converter = new HtmlConverter ( array ( ' preserve_comments ' => true ));
$ html = ' <span>Turnips!</span><!-- Monkeys! --> ' ;
$ markdown = $ converter -> convert ( $ html ); / / $ markdown now contains "Turnips!<!-- Monkeys! -->"
Чтобы сохранить только определенные комментарии, задайте для preserve_comments
массив строк, например:
$ converter = new HtmlConverter ( array ( ' preserve_comments ' => array ( ' Eggs! ' )));
$ html = ' <span>Turnips!</span><!-- Monkeys! --><!-- Eggs! --> ' ;
$ markdown = $ converter -> convert ( $ html ); / / $ markdown now contains "Turnips!<!-- Eggs! -->"
По умолчанию ссылки-заполнители сохраняются. Чтобы удалить ссылки-заполнители, используйте параметр strip_placeholder_links
, например:
$ converter = new HtmlConverter ( array ( ' strip_placeholder_links ' => true ));
$ html = ' <a>Github</a> ' ;
$ markdown = $ converter -> convert ( $ html ); / / $ markdown now contains "Github"
По умолчанию теги, выделенные жирным шрифтом, преобразуются с использованием синтаксиса звездочки, а теги, выделенные курсивом, преобразуются с использованием подчеркнутого синтаксиса. Измените их, используя параметры bold_style
и 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__"
По умолчанию теги br
преобразуются в два пробела, за которыми следует символ новой строки, как в традиционном Markdown. Установите для hard_break
значение true
, чтобы пропустить два пробела, согласно 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"
По умолчанию a
преобразуются в самый простой синтаксис ссылок, т.е. если текст или заголовок недоступны, то будет использоваться синтаксис <url>
, а не полный синтаксис [url](url)
. Установите для use_autolinks
значение false
, чтобы изменить это поведение и всегда использовать синтаксис полной ссылки.
$ 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)"
Вы можете передать текущий объект Environment
, чтобы настроить, например, какие преобразователи следует использовать.
$ 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="" />"
Поддержка таблиц Markdown не включена по умолчанию, поскольку она не является частью исходного синтаксиса Markdown. Чтобы использовать таблицы, добавьте конвертер явно:
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 );
Заголовки Setext (подчеркнутые) используются по умолчанию для H1 и H2. Если вы предпочитаете стиль ATX для H1 и H2 (# Header 1 и ## Header 2), установите для header_style
значение «atx» в массиве параметров при создании экземпляра объекта:
$converter = new HtmlConverter(array('header_style'=>'atx'));
Заголовки с приоритетом H3 и ниже всегда используют стиль atx.
Ссылки и изображения указаны внутри. Ссылки на сноски (где в сносках указаны атрибуты image src иnchor href) не используются.
Блоковые кавычки не переносятся по строкам — это упрощает редактирование преобразованного Markdown.
HTML To Markdown требует расширений PHP xml, lib-xml и dom, которые в большинстве дистрибутивов включены по умолчанию.
Такие ошибки, как «Неустранимая ошибка: класс DOMDocument не найден» в таких дистрибутивах, как CentOS, в которых отключено расширение PHP xml, можно устранить, установив php-xml.
Большое спасибо всем участникам. Дальнейшие улучшения и предложения по функциям приветствуются.
HTML To Markdown создает DOMDocument из предоставленного HTML, проходит по дереву и преобразует каждый узел в текстовый узел, содержащий эквивалентную уценку, начиная с наиболее глубоко вложенного узла и продвигаясь внутрь к корневому узлу.
style
).Используйте одну из этих замечательных библиотек:
Однако никаких гарантий насчет эльфийцев.