Почему 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, использующих разметку.