diff --git a/plugins/command-line/index.html b/plugins/command-line/index.html index 146b5d7935..0de8e3ab9e 100644 --- a/plugins/command-line/index.html +++ b/plugins/command-line/index.html @@ -30,7 +30,7 @@
Add class command-line to your <pre>
. For a server command line, specify the user and host names using the data-user
and data-host
attributes. The resulting prompt displays a # for the root user and $ for all other users. For any other command line, such as a Windows prompt, you may specify the entire prompt using the data-prompt
attribute.
Optional: You may specify the lines to be presented as output (no prompt) through the data-output
attribute on the <pre>
element in the following simple format:
Optional: You may specify the lines to be presented as output (no prompt and no highlighting) through the data-output
attribute on the <pre>
element in the following simple format:
Optional: To automatically present some lines as output, you can prefix those lines with any string and specify the prefix using the data-filter-output
attribute on the <pre>
element. For example, data-filter-output="(out)"
will treat lines beginning with (out)
as output and remove the prefix.
wrapped inside (not inline).
var pre = env.element.parentNode;
- var clsReg = /\s*\bcommand-line\b\s*/;
- if (
- !pre || !/pre/i.test(pre.nodeName) ||
- // Abort only if neither the nor the have the class
- (!clsReg.test(pre.className) && !clsReg.test(env.element.className))
- ) {
+ if (!pre || !/pre/i.test(pre.nodeName) || // Abort only if neither the nor the have the class
+ (!clsReg.test(pre.className) && !clsReg.test(env.element.className))) {
+ env.vars['command-line'].complete = true;
return;
}
- if (env.element.querySelector('.command-line-prompt')) {
- // Abort if prompt already exists.
+ if (env.element.querySelector('.command-line-prompt')) { // Abort if prompt already exists.
+ env.vars['command-line'].complete = true;
return;
}
- if (clsReg.test(env.element.className)) {
- // Remove the class "command-line" from the
- env.element.className = env.element.className.replace(clsReg, '');
+ var codeLines = env.code.split('\n');
+ env.vars['command-line'].numberOfLines = codeLines.length;
+ env.vars['command-line'].outputLines = [];
+
+ var outputSections = pre.getAttribute('data-output');
+ var outputFilter = pre.getAttribute('data-filter-output');
+ if (outputSections || outputSections === '') { // The user specified the output lines. -- cwells
+ outputSections = outputSections.split(',');
+ for (var i = 0; i < outputSections.length; i++) { // Parse the output sections into start/end ranges. -- cwells
+ var range = outputSections[i].split('-');
+ var outputStart = parseInt(range[0], 10);
+ var outputEnd = (range.length === 2 ? parseInt(range[1], 10) : outputStart);
+
+ if (!isNaN(outputStart) && !isNaN(outputEnd)) {
+ if (outputStart < 1) {
+ outputStart = 1;
+ }
+ if (outputEnd > codeLines.length) {
+ outputEnd = codeLines.length;
+ }
+ // Convert start and end to 0-based to simplify the arrays. -- cwells
+ outputStart--;
+ outputEnd--;
+ // Save the output line in an array and clear it in the code so it's not highlighted. -- cwells
+ for (var j = outputStart; j <= outputEnd; j++) {
+ env.vars['command-line'].outputLines[j] = codeLines[j];
+ codeLines[j] = '';
+ }
+ }
+ }
+ } else if (outputFilter) { // Treat lines beginning with this string as output. -- cwells
+ for (var i = 0; i < codeLines.length; i++) {
+ if (codeLines[i].indexOf(outputFilter) === 0) { // This line is output. -- cwells
+ env.vars['command-line'].outputLines[i] = codeLines[i].slice(outputFilter.length);
+ codeLines[i] = '';
+ }
+ }
+ }
+
+ env.code = codeLines.join('\n');
+});
+
+Prism.hooks.add('before-insert', function (env) {
+ env.vars = env.vars || {};
+ env.vars['command-line'] = env.vars['command-line'] || {};
+ if (env.vars['command-line'].complete) {
+ return;
}
- if (!clsReg.test(pre.className)) {
- // Add the class "command-line" to the
+
+ // Reinsert the output lines into the highlighted code. -- cwells
+ var codeLines = env.highlightedCode.split('\n');
+ for (var i = 0; i < env.vars['command-line'].outputLines.length; i++) {
+ if (env.vars['command-line'].outputLines.hasOwnProperty(i)) {
+ codeLines[i] = env.vars['command-line'].outputLines[i];
+ }
+ }
+ env.highlightedCode = codeLines.join('\n');
+});
+
+Prism.hooks.add('complete', function (env) {
+ env.vars = env.vars || {};
+ env.vars['command-line'] = env.vars['command-line'] || {};
+ if (env.vars['command-line'].complete) {
+ return;
+ }
+
+ var pre = env.element.parentNode;
+ if (clsReg.test(env.element.className)) { // Remove the class "command-line" from the
+ env.element.className = env.element.className.replace(clsReg, ' ');
+ }
+ if (!clsReg.test(pre.className)) { // Add the class "command-line" to the
pre.className += ' command-line';
}
@@ -39,43 +107,33 @@ Prism.hooks.add('complete', function (env) {
};
// Create the "rows" that will become the command-line prompts. -- cwells
- var lines = new Array(1 + env.code.split('\n').length);
+ var promptLines = new Array(env.vars['command-line'].numberOfLines + 1);
var promptText = getAttribute('data-prompt', '');
if (promptText !== '') {
- lines = lines.join('');
+ promptLines = promptLines.join('');
} else {
var user = getAttribute('data-user', 'user');
var host = getAttribute('data-host', 'localhost');
- lines = lines.join('');
+ promptLines = promptLines.join('');
}
// Create the wrapper element. -- cwells
var prompt = document.createElement('span');
prompt.className = 'command-line-prompt';
- prompt.innerHTML = lines;
-
- // Mark the output lines so they can be styled differently (no prompt). -- cwells
- var outputSections = pre.getAttribute('data-output') || '';
- outputSections = outputSections.split(',');
- for (var i = 0; i < outputSections.length; i++) {
- var outputRange = outputSections[i].split('-');
- var outputStart = parseInt(outputRange[0]);
- var outputEnd = outputStart; // Default: end at the first line when it's not an actual range. -- cwells
- if (outputRange.length === 2) {
- outputEnd = parseInt(outputRange[1]);
- }
+ prompt.innerHTML = promptLines;
- if (!isNaN(outputStart) && !isNaN(outputEnd)) {
- for (var j = outputStart; j <= outputEnd && j <= prompt.children.length; j++) {
- var node = prompt.children[j - 1];
- node.removeAttribute('data-user');
- node.removeAttribute('data-host');
- node.removeAttribute('data-prompt');
- }
+ // Remove the prompt from the output lines. -- cwells
+ for (var i = 0; i < env.vars['command-line'].outputLines.length; i++) {
+ if (env.vars['command-line'].outputLines.hasOwnProperty(i)) {
+ var node = prompt.children[i];
+ node.removeAttribute('data-user');
+ node.removeAttribute('data-host');
+ node.removeAttribute('data-prompt');
}
}
- env.element.innerHTML = prompt.outerHTML + env.element.innerHTML;
+ env.element.insertBefore(prompt, env.element.firstChild);
+ env.vars['command-line'].complete = true;
});
}());
diff --git a/plugins/command-line/prism-command-line.min.js b/plugins/command-line/prism-command-line.min.js
index 6e40c05cbf..159f4094f5 100644
--- a/plugins/command-line/prism-command-line.min.js
+++ b/plugins/command-line/prism-command-line.min.js
@@ -1 +1 @@
-!function(){"undefined"!=typeof self&&self.Prism&&self.document&&Prism.hooks.add("complete",function(e){if(e.code){var t=e.element.parentNode,a=/\s*\bcommand-line\b\s*/;if(t&&/pre/i.test(t.nodeName)&&(a.test(t.className)||a.test(e.element.className))&&!e.element.querySelector(".command-line-prompt")){a.test(e.element.className)&&(e.element.className=e.element.className.replace(a,"")),a.test(t.className)||(t.className+=" command-line");var n=function(e,a){return(t.getAttribute(e)||a).replace(/"/g,""")},s=new Array(1+e.code.split("\n").length),r=n("data-prompt","");if(""!==r)s=s.join('');else{var l=n("data-user","user"),m=n("data-host","localhost");s=s.join('')}var o=document.createElement("span");o.className="command-line-prompt",o.innerHTML=s;var i=t.getAttribute("data-output")||"";i=i.split(",");for(var c=0;c=f&&f<=o.children.length;f++){var N=o.children[f-1];N.removeAttribute("data-user"),N.removeAttribute("data-host"),N.removeAttribute("data-prompt")}}e.element.innerHTML=o.outerHTML+e.element.innerHTML}}})}();
\ No newline at end of file
+!function(){if("undefined"!=typeof self&&self.Prism&&self.document){var e=/\s*\bcommand-line\b\s*/;Prism.hooks.add("before-highlight",function(a){if(a.vars=a.vars||{},a.vars["command-line"]=a.vars["command-line"]||{},a.vars["command-line"].complete||!a.code)return a.vars["command-line"].complete=!0,void 0;var n=a.element.parentNode;if(!n||!/pre/i.test(n.nodeName)||!e.test(n.className)&&!e.test(a.element.className))return a.vars["command-line"].complete=!0,void 0;if(a.element.querySelector(".command-line-prompt"))return a.vars["command-line"].complete=!0,void 0;var t=a.code.split("\n");a.vars["command-line"].numberOfLines=t.length,a.vars["command-line"].outputLines=[];var r=n.getAttribute("data-output"),s=n.getAttribute("data-filter-output");if(r||""===r){r=r.split(",");for(var o=0;oi&&(i=1),l>t.length&&(l=t.length),i--,l--;for(var d=i;l>=d;d++)a.vars["command-line"].outputLines[d]=t[d],t[d]=""}}}else if(s)for(var o=0;o');else{var o=t("data-user","user"),m=t("data-host","localhost");r=r.join('')}var i=document.createElement("span");i.className="command-line-prompt",i.innerHTML=r;for(var l=0;l