Markdown to HTML
До того как мы реализуем метод connect_changed(), сначала нужно реализовать модуль preview, который будет использовать метод, чтобы получить HTML-строку для передачи в web-представление.
Два шага, чтобы преобразовать Markdown в HTML. Первый, включает в себя простое преобразование Markdown в HTML, но и этого недостаточно. Вам также необходимо интегрировать это в дополнительный HTML и сделать поддержку подсветки синтаксиса с помощью JavaScript. Не беспокойтесь, потому что мы будем использовать highlight.js, который позаботится за нас об этом.
Преобразование Markdown в HTML
К счастью, у корпорации Google существует пакет (crate) pulldown-cmark. Обратите внимание, что он реализован в качестве парсера для повышения эффективности. Осталось предоставить Markdown текст в качестве &str в структуру Parser и указать изменяемую ссылку String, чтобы вернуть HTML.
# #![allow(unused_variables)] #fn main() { use pulldown_cmark::{html, Parser}; /// Входит Markdown текст; выходит HTML текст. fn mark_to_html(markdown: &str) -> String { let parser = Parser::new(&markdown); let mut buffer = String::new(); html::push_html(&mut buffer, parser); buffer } #}
Применение стиля к нашему HTML
Мы не хотим останавливаться на достигнутом, поэтому будем использовать функцию (указанную выше) внутри нашей публичной функии render(), чтобы интегрировать CSS вместе с JavaScript и получить ожидаемый вывод HTML в web просмотр.
Заметьте, что мы предоставляем HTML из нашего markdown в секцию body HTML страницы и имеем завернутую строку Raw, чтобы сказать макросу horrorshow не уходить от внутреннего текста. Если вы предпочитаете большее кол-во стилей, тогда вы можете применить дополнительные стили для вашего текста.
# #![allow(unused_variables)] #fn main() { use horrorshow::Raw; use horrorshow::helper::doctype; /// Входит Markdown текст; выходит стильный HTML текст. pub fn render(markdown: &str) -> String { format!( "{}", html!( : doctype::HTML; html { head { link(rel="stylesheet", href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css") {} script(src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js") {} script(src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/languages/rust.min.js") {} script { : Raw("hljs.initHighlightingOnLoad()") } style { : "body { width: 80%; margin: 0 auto }"; : "img { max-width: 80% }" } } body { : Raw(&mark_to_html(markdown)); } } ) ) } #}