Pagedown 和尖括号不合作
Pagedown and Angle Brackets not Cooperating
我正在尝试使用 Pagedown 将 markdown(包含代码部分)解析为 html。
它大部分都有效,但我注意到一个奇怪的行为。如果我的 markdown 中有这个:
`ArrayList<String> names = new ArrayList<>();`
最终显示的文字是这样的:
ArrayList<string> names = new ArrayList<>();
请注意,第一个 String
是小写的,第二个 <>
被转换为 html 实体,这些实体未正确显示,因为它们最终位于代码块内.
如果我查看 Pagedown "thinks" 它应该处理的降价,它会变得陌生:
`ArrayList<string> names = new ArrayList<>();`</string>
显然,它将代码文本的 <String>
部分视为 html 标记,并添加结束 </string>
标记。解析降价会产生这个 html:
<code>ArrayList<string> names = new ArrayList&lt;&gt;();</code>
如果我提前对尖括号进行编码:
`ArrayList<String> names = new ArrayList<>();`
然后 Pagedown 只是将 html 实体编码为代码的一部分,这正是我希望它用尖括号做的事情:
<code>ArrayList&lt;String&gt; names = new ArrayList&lt;&gt;();</code>
我只是希望能够将 markdown(包含代码部分)放入 Pagedown 解析器并对其输出进行清理 html。这是我目前正在做的事情:
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="Markdown.Converter.js"></script>
<script type="text/javascript" src="Markdown.Sanitizer.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
<script>
function parseMarkdown(){
var markdown = $("#markdown").html();
console.log("markdown: " + markdown);
var converter = new Markdown.getSanitizingConverter();
var html = converter.makeHtml(markdown);
console.log("html: " + html);
$("#markdown").html(html);
}
$(parseMarkdown);
</script>
</head>
<body onload="parseMarkdown">
<div id="markdown">
`ArrayList<String> names = new ArrayList<>();`
</div>
</body>
</html>
在现实生活中,markdown 要么来自数据库(使用 Pagedown 编辑器编写),要么来自 markdown 文件(使用基本文本编辑器编写)。我缺少额外的步骤吗?上述方法是否存在 JavaScript 在 Markdown 解析之前变为 运行 的风险?
问题与 Markdown 或 Pagedown 无关。
当您将内容放入 HTML 文档时,HTML 解析器(浏览器...)"corrects" 无效 HTML 片段。在您的情况下,它会自动添加一个结束标记以使 HTML 格式正确。作为其解析过程的一部分,它显然还将 "String" 转换为小写 "string"。
正如您自己描述的那样,Markdown 代码可能应该来自不同的来源(JSON、包含在脚本元素中的外部资源等...),您根本不会遇到这个问题。
我正在尝试使用 Pagedown 将 markdown(包含代码部分)解析为 html。
它大部分都有效,但我注意到一个奇怪的行为。如果我的 markdown 中有这个:
`ArrayList<String> names = new ArrayList<>();`
最终显示的文字是这样的:
ArrayList<string> names = new ArrayList<>();
请注意,第一个 String
是小写的,第二个 <>
被转换为 html 实体,这些实体未正确显示,因为它们最终位于代码块内.
如果我查看 Pagedown "thinks" 它应该处理的降价,它会变得陌生:
`ArrayList<string> names = new ArrayList<>();`</string>
显然,它将代码文本的 <String>
部分视为 html 标记,并添加结束 </string>
标记。解析降价会产生这个 html:
<code>ArrayList<string> names = new ArrayList&lt;&gt;();</code>
如果我提前对尖括号进行编码:
`ArrayList<String> names = new ArrayList<>();`
然后 Pagedown 只是将 html 实体编码为代码的一部分,这正是我希望它用尖括号做的事情:
<code>ArrayList&lt;String&gt; names = new ArrayList&lt;&gt;();</code>
我只是希望能够将 markdown(包含代码部分)放入 Pagedown 解析器并对其输出进行清理 html。这是我目前正在做的事情:
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="Markdown.Converter.js"></script>
<script type="text/javascript" src="Markdown.Sanitizer.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
<script>
function parseMarkdown(){
var markdown = $("#markdown").html();
console.log("markdown: " + markdown);
var converter = new Markdown.getSanitizingConverter();
var html = converter.makeHtml(markdown);
console.log("html: " + html);
$("#markdown").html(html);
}
$(parseMarkdown);
</script>
</head>
<body onload="parseMarkdown">
<div id="markdown">
`ArrayList<String> names = new ArrayList<>();`
</div>
</body>
</html>
在现实生活中,markdown 要么来自数据库(使用 Pagedown 编辑器编写),要么来自 markdown 文件(使用基本文本编辑器编写)。我缺少额外的步骤吗?上述方法是否存在 JavaScript 在 Markdown 解析之前变为 运行 的风险?
问题与 Markdown 或 Pagedown 无关。
当您将内容放入 HTML 文档时,HTML 解析器(浏览器...)"corrects" 无效 HTML 片段。在您的情况下,它会自动添加一个结束标记以使 HTML 格式正确。作为其解析过程的一部分,它显然还将 "String" 转换为小写 "string"。
正如您自己描述的那样,Markdown 代码可能应该来自不同的来源(JSON、包含在脚本元素中的外部资源等...),您根本不会遇到这个问题。