diff --git a/devices/pdp11/machine/1170/panel/debugger/xxdp/README.md b/devices/pdp11/machine/1170/panel/debugger/xxdp/README.md
index 115bd5dc7..dd4bade4a 100644
--- a/devices/pdp11/machine/1170/panel/debugger/xxdp/README.md
+++ b/devices/pdp11/machine/1170/panel/debugger/xxdp/README.md
@@ -14,10 +14,10 @@ machines:
sticky: top
commands:
bootXXDP: |
- select rl11 listDrives RL0
- select rl11 listDisks "XXDP+ Diagnostics"
- load rl11
- boot rl11
+ select rl11 listDrives RL0;
+ select rl11 listDisks "XXDP+ Diagnostics";
+ click rl11 loadDisk;
+ click rl11 bootDisk
---
This machine is ready to boot [XXDP+ Diagnostics](/disks/dec/rl02k/xxdp/) ("BOOT RL0") and run
diff --git a/docs/pcx86/examples/components.xsl b/docs/pcx86/examples/components.xsl
index e873f0c46..fa882c147 100644
--- a/docs/pcx86/examples/components.xsl
+++ b/docs/pcx86/examples/components.xsl
@@ -14,11 +14,11 @@
pcjspcx86PCx86
- 1.32.1
+ 1.32.2www.pcjs.org
-
+
diff --git a/modules/htmlout/lib/htmlout.js b/modules/htmlout/lib/htmlout.js
index 353e2a5bc..694974570 100644
--- a/modules/htmlout/lib/htmlout.js
+++ b/modules/htmlout/lib/htmlout.js
@@ -1923,7 +1923,6 @@ HTMLOut.prototype.processMachines = function(aMachines, buildOptions, done)
var sScriptFolder = sScriptName == "c1p"? "c1pjs" : (sScriptName.substr(0, 3) == "pdp"? "pdpjs" : sScriptName);
asFiles.push("/versions/" + sScriptFolder + "/" + sVersion + "/components.css");
asFiles.push("/versions/" + sScriptFolder + "/" + sVersion + "/" + sScriptFile);
- this.addFilesToHTML(asFiles, sScriptEmbed);
}
else if (asFiles = aMachineFiles[sType]) {
/*
@@ -1968,22 +1967,26 @@ HTMLOut.prototype.processMachines = function(aMachines, buildOptions, done)
}
}
}
- this.addFilesToHTML(asFiles, sScriptEmbed);
- if (infoMachine['sticky']) {
- asFiles = [];
- asFiles.push("/modules/shared/lib/sticky.js");
- sScriptEmbed = '';
- this.addFilesToHTML(asFiles, sScriptEmbed);
- }
- if (buildOptions.id) {
- asFiles = [];
- asFiles.push("/modules/build/lib/build.js");
- sScriptEmbed = '';
- this.addFilesToHTML(asFiles, sScriptEmbed);
- }
}
else {
HTMLOut.logDebug('HTMLOut.processMachines(): unrecognized machine type "' + sType + '"');
+ continue;
+ }
+
+ this.addFilesToHTML(asFiles, sScriptEmbed);
+
+ if (infoMachine['sticky']) {
+ asFiles = [];
+ asFiles.push("/modules/shared/lib/sticky.js");
+ sScriptEmbed = '';
+ this.addFilesToHTML(asFiles, sScriptEmbed);
+ }
+
+ if (buildOptions.id) {
+ asFiles = [];
+ asFiles.push("/modules/build/lib/build.js");
+ sScriptEmbed = '';
+ this.addFilesToHTML(asFiles, sScriptEmbed);
}
}
if (done) done();
diff --git a/modules/markout/lib/markout.js b/modules/markout/lib/markout.js
index 998e9c794..241a96bdb 100644
--- a/modules/markout/lib/markout.js
+++ b/modules/markout/lib/markout.js
@@ -114,6 +114,7 @@ function MarkOut(sMD, sIndent, req, aParms, fDebug, sMachineFile, fAutoHeading)
this.aMachines = []; // this keeps track of embedded machines on the page
this.buildOptions = {}; // this keeps track of any build options specified on the page
this.aMachineDefs = {}; // this keeps track of any machine definitions at the top of the file (as part of any Jekyll "Front Matter")
+ this.aCommandDefs = {}; // this keeps track of any command definitions at the top of the file (as part of any Jekyll "Front Matter")
}
/*
@@ -426,10 +427,12 @@ MarkOut.prototype.convertMD = function(sIndent)
if (sMD.substr(0, 3) == "---") {
aMatch = sMD.match(/^---([\s\S]*?)---[ \t]*\n*/);
if (aMatch) {
+
/*
* Remove the Front Matter.
*/
sMD = sMD.replace(aMatch[0], "");
+
/*
* Extract machine definitions, if any, from the Front Matter.
*/
@@ -519,14 +522,31 @@ MarkOut.prototype.convertMD = function(sIndent)
if (id) this.aMachineDefs[id] = machine;
}
}
+
+ var aCommandDefs = aMatch[1].match(/\ncommands:([\s\S]*?)\n([^\s]|$)/);
+ if (aCommandDefs) {
+ var reCommand = /[ \t]+([^:]+):\s*\|/g;
+ var aCommands = aCommandDefs[1].split(reCommand);
+ /*
+ * Since the preceding RegExp contains a capture group (representing the name of the command),
+ * it will be "spliced" into the split results. So, aCommands[0] will be whatever characters precede
+ * the first command (which we can ignore), followed by the first command name, followed by one or more
+ * command lines, followed by the second command name, followed by one or more command lines, and so on.
+ */
+ for (var iCommand = 1; iCommand < aCommands.length; iCommand += 2) {
+ this.aCommandDefs[aCommands[iCommand]] = aCommands[iCommand+1].trim().replace(/\n[ \t]*/g, "").replace(/"/g, """);
+ }
+ }
+
/*
- * If a "title" element existed in the Front Matter, this code auto-generates a top-level
- * heading with the same value.
+ * If a "title" element existed in the Front Matter, this code auto-generates a top-level heading
+ * with the same value.
*/
if (this.fAutoHeading) {
aSubMatch = aMatch[1].match(/title:\s*(.*?)\s*?\n/);
if (aSubMatch) sMD = aSubMatch[1] + "\n---\n\n" + sMD;
}
+
/*
* If a "build" ID element existed in the Front Matter, capture it.
*/
@@ -576,7 +596,7 @@ MarkOut.prototype.convertMD = function(sIndent)
* you want the second paragraph to appear as a code block, it must be indented TWICE (by 8 spaces
* or 2 tabs). That behavior should fall out of this hack as well.
*/
- var re = /(^|\n)( ? ?)([\*+-]|[0-9]+\.)([^\n]*\n)([ \t]+[^\n]*\n|\n)+([ \t]+[^\n]+)/g;
+ var re = /(^|\n)( ? ?)([*+-]|[0-9]+\.)([^\n]*\n)([ \t]+[^\n]*\n|\n)+([ \t]+[^\n]+)/g;
//noinspection UnnecessaryLocalVariableJS
var sMDOrig = sMD;
while ((aMatch = re.exec(sMDOrig))) {
@@ -845,7 +865,7 @@ MarkOut.prototype.convertMDList = function(sBlock, sIndent)
var aMatch;
var aMatches = [];
- var re = /(^|\n) ? ? ?([\*+-]|[0-9]+\.)[ \t]+/g;
+ var re = /(^|\n) ? ? ?([*+-]|[0-9]+\.)[ \t]+/g;
while ((aMatch = re.exec(sBlock))) {
aMatches.push(aMatch);
}
@@ -946,8 +966,8 @@ MarkOut.prototype.convertMDLinks = function(sBlock)
* page's Front Matter; however, unless/until we start using Node again to host the public site,
* that's low priority.
*/
- sBlock = sBlock.replace(/([^\t])\{([\{%]).*?\2}/g, "$1");
- sBlock = sBlock.replace(/(\{)([\{%])(.*?\2})/g, "