Почему MarkdownSharp не кодирует мой HTML?
На мой взгляд, одна из самых больших целей Markdown заключается в том, чтобы запретить пользователю вводить потенциально искаженный HTML напрямую.
Ну, это не совсем верно для меня в MarkdownSharp.
Этот пример работает правильно, когда у вас есть дополнительный разрыв строки сразу после "abc"...
![enter image description here]()
Но когда этого разрыва строки нет, я думаю, что он все равно должен быть HtmlEncoded, но этого здесь не происходит...
![enter image description here]()
За кулисами рендеринговая разметка поступает из iframe. И это код за ним...
<%
var md = new MarkdownSharp.Markdown();
%>
<%= md.Transform(Request.Form[0]) %>
Конечно, я должен что-то упустить. О, и я использую v1.13 (последняя версия на момент написания этой статьи).
EDIT (это тест для реализации StackOverflow)
ABC
это не должно быть красным
Ответы
Ответ 1
Поскольку стало ясно, что реализация StackOverflow содержит довольно много настроек, которые могут потребовать много времени для тестирования и определения, я решил пойти в другом направлении.
Я создал свой собственный упрощенный язык разметки, который является подмножеством Markdown. Проект с открытым исходным кодом находится в http://ultralight.codeplex.com/, и вы можете увидеть рабочий пример http://www.bucketsoft.com/ultralight/
Проект представляет собой полное решение ASP.NET MVC с редактором Javascript. И в отличие от MarkdownSharp, безопасный HTML гарантирован. Парсер Javascript используется как на стороне клиента, так и на стороне сервера, чтобы гарантировать согласованную разметку (особая благодарность Jurassic Javascript компилятор). Прекрасно вешать только одну кодовую базу для этого парсера.
Хотя проект все еще находится в стадии бета-тестирования, я уже использую его на своем собственном сайте и, похоже, работает до сих пор.
Ответ 2
Для тех, кто не хочет использовать настроенное решение Стива Уортама, я представил проблему и предлагаемое исправление для ребят MarkdownSharp: http://code.google.com/p/markdownsharp/issues/detail?id=43
Если вы загрузите прикрепленный файл Markdown.cs, вы найдете новый параметр, который вы можете установить. Это остановит MarkdownSharp от повторного кодирования текста в блоках кода.
Просто не забывайте, что HTML кодирует ваш вход, прежде чем вы передадите его в уценку, а не после.
Другим решением является HTML-теги белого списка, такие как Stack Overflow. Вы сделали бы это ПОСЛЕ того, как вы передадите свой контент на уценку.
См. это для получения дополнительной информации: http://www.CodeTunnel.com/blog/post/24/mardownsharp-and-encoded-html
Ответ 3
Может, я не понимаю? Если вы начинаете новый блок кода в Markdown, во всех его разновидностях вам понадобится двойной линейный и четырехпозиционный отступ - одна новая строка не будет работать ни в одном из рендерингов, которые мне нужно.
abc -- Here comes a code block:
<div style="background-color: red"> This is code</div>
получая:
abc - Здесь идет блок кода:
<div style="background-color: red"> This is code</div>
Из того, что вы говорите, кажется, что MarkdownSharp отлично справляется с этим правилом, поэтому только с одной новой строкой (но отступом):
abc -- Here comes a code block:
<div style="background-color: red"> This should be code</div>
мы получаем беспорядок, а не код:
abc - Здесь идет блок кода: Это должен быть код
Я предполагаю, что StackOverflow лишает теги <div>
, потому что они считают, что комментарии не должны иметь делений и подобных вещей. (?) (В общем, они должны делать много другой обработки, не так ли, например, для выделения синтаксиса и т.д.)
EDIT: Я думаю, что люди ожидают неправильной реализации Markdown. Например, как я сказал ниже, нет такой вещи, как "недопустимая уценка". Это не язык программирования или что-то вроде этого. Я проверил, что все три реализации уценки, которые я получил из командной строки, равнодушно "конвертируют" случайные .js и .c файлы или те, которые вставляются в другую разумную уценку, а также интерполированные zip файлы и другие глупости - в действительный html, который браузеры не против отображения вообще - курица царапины, хотя это так. Если вы хотите что-то исключить, например. в вики-программе вы делаете что-то еще, конечно, как это делают большинство программ wiki, использующих разметку.