如何将 linenums 动态添加到 Google 代码美化?
How can I add linenums dynamically to Google Code prettify?
我有this fiddle。我正在尝试格式化一些代码,但在动态插入和删除行号时遇到问题。似乎在第一页加载时会出现行号,但是一旦我单击 运行,我就无法取回它们。在我的网站上,它们根本不显示。我想让用户点击一个按钮并动态地转动 on/off 行号:
<body>
<pre id="pre">
<script type="text/javascript">
// Say hello world until the user starts questioning
// the meaningfulness of their existence.
function helloWorld(world) {
for (var i = 42; --i >= 0;) {
alert('Hello ' + String(world));
}
}
</script>
<style>
p { color: pink }
b { color: blue }
u { color: "umber" }
</style>
</pre>
<button id="button">My button</button>
</body>
$(document).ready(function(){
$("#button").on("click", function(){
$("#pre").addClass("prettyprint").addClass("linenums").addClass("lang-js");
$("#pre").html(PR.prettyPrintOne($("#pre").html()));
});
});
谢谢!
编辑:请注意,这与 How to add line numbers to all lines in Google Prettify? 不同。在我的代码中,如果我手动将 linenums
class 添加到 pre
标签,行号会首先显示。问题是将它们 on/off 转为 jquery 不起作用。
通过调用 prettyPrintOne
,您实际上是在绕过基于 class 的初始化。该方法具有告诉美化如何表现的参数。
您正在尝试使用 classes 修改 prettify 的行为方式,但 prettify 忽略了这一点,因为它只关心为 null 的参数,因此它们回退到内部默认值。
查看记录该方法的源代码:
/**
* Pretty print a chunk of code.
* @param {string} sourceCodeHtml The HTML to pretty print.
* @param {string} opt_langExtension The language name to use.
* Typically, a filename extension like 'cpp' or 'java'.
* @param {number|boolean} opt_numberLines True to number lines,
* or the 1-indexed number of the first line in sourceCodeHtml.
* @return {string} code as html, but prettier
*/
prettyPrintOne
本质上是用于解析作为字符串传递给它的一些代码,并返回结果,其中的选项由这些参数控制。相反,prettyPrint
将遍历 DOM 寻找您要添加的 classes,并根据它找到的 classes 进行操作。当你想切换时,你会想继续使用 prettyPrintOne
以便我们可以控制何时显示美化输出,以及何时显示原始输出 - 稍后会详细介绍。
顺便说一句,当你得到的是 HTML 在脚本标签中包含 JS 并在样式标签中包含 CSS 时,你告诉 prettify 格式化 JS。所以你会想要使用 HTML 作为 lang 扩展,而不是 JS。
无论如何,您需要做的就是将调用调整为以下内容,另外添加 prettify
class 以便您的美化主题 CSS 适用:
$("#pre").html( PR.prettyPrintOne($("#pre").html(), "html", true) )
.addClass("prettyprint");
瞧瞧:
至于切换,您只需要调整逻辑,以便在美化时将原始 HTML 存储在某处,并在下次单击按钮时恢复它:
$("#button").on("click", function() {
// Cache jquery object
var $pre = $("#pre");
// If the element has a prettyprint class, it's already been manually
// prettified
if (!$pre.hasClass("prettyprint")) {
// Element hasn't been prettified, store the html in jQuery data
$pre.data("original-html", $pre.html());
// Manually prettify
$pre.html(PR.prettyPrintOne($pre.html(), "html", true))
.addClass("prettyprint");
} else {
// Element has been prettified, restore the orginal html stored in jQuery
// data and remove the prettyprint class, back to where we started
$pre.html($pre.data("original-html"))
.removeClass("prettyprint");
// Remove the jQuery data entry for our original HTML, so next time we
// start fresh
$pre.data("original-html", null);
}
});
这是一个 jsfiddle,展示了它的实际效果:https://jsfiddle.net/joshdavenport/68thqus1/27/
我有this fiddle。我正在尝试格式化一些代码,但在动态插入和删除行号时遇到问题。似乎在第一页加载时会出现行号,但是一旦我单击 运行,我就无法取回它们。在我的网站上,它们根本不显示。我想让用户点击一个按钮并动态地转动 on/off 行号:
<body>
<pre id="pre">
<script type="text/javascript">
// Say hello world until the user starts questioning
// the meaningfulness of their existence.
function helloWorld(world) {
for (var i = 42; --i >= 0;) {
alert('Hello ' + String(world));
}
}
</script>
<style>
p { color: pink }
b { color: blue }
u { color: "umber" }
</style>
</pre>
<button id="button">My button</button>
</body>
$(document).ready(function(){
$("#button").on("click", function(){
$("#pre").addClass("prettyprint").addClass("linenums").addClass("lang-js");
$("#pre").html(PR.prettyPrintOne($("#pre").html()));
});
});
谢谢!
编辑:请注意,这与 How to add line numbers to all lines in Google Prettify? 不同。在我的代码中,如果我手动将 linenums
class 添加到 pre
标签,行号会首先显示。问题是将它们 on/off 转为 jquery 不起作用。
通过调用 prettyPrintOne
,您实际上是在绕过基于 class 的初始化。该方法具有告诉美化如何表现的参数。
您正在尝试使用 classes 修改 prettify 的行为方式,但 prettify 忽略了这一点,因为它只关心为 null 的参数,因此它们回退到内部默认值。
查看记录该方法的源代码:
/**
* Pretty print a chunk of code.
* @param {string} sourceCodeHtml The HTML to pretty print.
* @param {string} opt_langExtension The language name to use.
* Typically, a filename extension like 'cpp' or 'java'.
* @param {number|boolean} opt_numberLines True to number lines,
* or the 1-indexed number of the first line in sourceCodeHtml.
* @return {string} code as html, but prettier
*/
prettyPrintOne
本质上是用于解析作为字符串传递给它的一些代码,并返回结果,其中的选项由这些参数控制。相反,prettyPrint
将遍历 DOM 寻找您要添加的 classes,并根据它找到的 classes 进行操作。当你想切换时,你会想继续使用 prettyPrintOne
以便我们可以控制何时显示美化输出,以及何时显示原始输出 - 稍后会详细介绍。
顺便说一句,当你得到的是 HTML 在脚本标签中包含 JS 并在样式标签中包含 CSS 时,你告诉 prettify 格式化 JS。所以你会想要使用 HTML 作为 lang 扩展,而不是 JS。
无论如何,您需要做的就是将调用调整为以下内容,另外添加 prettify
class 以便您的美化主题 CSS 适用:
$("#pre").html( PR.prettyPrintOne($("#pre").html(), "html", true) )
.addClass("prettyprint");
瞧瞧:
至于切换,您只需要调整逻辑,以便在美化时将原始 HTML 存储在某处,并在下次单击按钮时恢复它:
$("#button").on("click", function() {
// Cache jquery object
var $pre = $("#pre");
// If the element has a prettyprint class, it's already been manually
// prettified
if (!$pre.hasClass("prettyprint")) {
// Element hasn't been prettified, store the html in jQuery data
$pre.data("original-html", $pre.html());
// Manually prettify
$pre.html(PR.prettyPrintOne($pre.html(), "html", true))
.addClass("prettyprint");
} else {
// Element has been prettified, restore the orginal html stored in jQuery
// data and remove the prettyprint class, back to where we started
$pre.html($pre.data("original-html"))
.removeClass("prettyprint");
// Remove the jQuery data entry for our original HTML, so next time we
// start fresh
$pre.data("original-html", null);
}
});
这是一个 jsfiddle,展示了它的实际效果:https://jsfiddle.net/joshdavenport/68thqus1/27/