This commit is contained in:
d98762625 2018-05-18 12:50:23 +01:00
parent bca73b496f
commit bfb405c4a6
3 changed files with 111 additions and 32 deletions

View File

@ -0,0 +1,13 @@
/**
* Returns the index of a label.
*
* @private
* @param {Object} state
* @param {string} name
* @returns {number}
*/
export function getLabelIndex(name, state) {
return state.opList.findIndex((operation) => {
return (operation.name === "Label") && (name === operation.ingValues[0]);
});
}

View File

@ -0,0 +1,66 @@
/**
* @author n1474335 [n1474335@gmail.com]
* @copyright Crown Copyright 2018
* @license Apache-2.0
*/
import Operation from "../Operation";
import { getLabelIndex } from "../lib/FlowControl";
/**
* Jump operation
*/
class Jump extends Operation {
/**
* Jump constructor
*/
constructor() {
super();
this.name = "Jump";
this.flowControl = true;
this.module = "Default";
this.description = "Jump forwards or backwards to the specified Label";
this.inputType = "string";
this.outputType = "string";
this.args = [
{
"name": "Label name",
"type": "string",
"value": ""
},
{
"name": "Maximum jumps (if jumping backwards)",
"type": "number",
"value": 10
}
];
}
/**
* @param {string} input
* @param {Object[]} args
* @returns {string}
*/
run(state) {
const ings = state.opList[state.progress].ingValues;
const label = ings[0];
const maxJumps = ings[1];
const jmpIndex = getLabelIndex(label, state);
if (state.numJumps >= maxJumps || jmpIndex === -1) {
log.debug("Maximum jumps reached or label cannot be found");
return state;
}
state.progress = jmpIndex;
state.numJumps++;
log.debug(`Jumping to label '${label}' at position ${jmpIndex} (jumps = ${state.numJumps})`);
return state;
}
}
export default Jump;

View File

@ -114,38 +114,38 @@ TestRegister.addTests([
// }, // },
// ], // ],
// }, // },
// { {
// name: "Jump: skips 1", name: "Jump: skips 1",
// input: [ input: [
// "shouldnt be changed", "shouldnt be changed",
// ].join("\n"), ].join("\n"),
// expectedOutput: [ expectedOutput: [
// "shouldnt be changed", "shouldnt be changed",
// ].join("\n"), ].join("\n"),
// recipeConfig: [ recipeConfig: [
// { {
// op: "Jump", op: "Jump",
// args: ["skipReplace", 10], args: ["skipReplace", 10],
// }, },
// { {
// op: "Find / Replace", op: "Find / Replace",
// args: [ args: [
// { {
// "option": "Regex", "option": "Regex",
// "string": "shouldnt be changed" "string": "shouldnt be changed"
// }, },
// "shouldnt be changed was changed", "shouldnt be changed was changed",
// true, true,
// true, true,
// true, true,
// ], ],
// }, },
// { {
// op: "Label", op: "Label",
// args: ["skipReplace"] args: ["skipReplace"]
// }, },
// ], ],
// }, },
// { // {
// name: "Conditional Jump: Skips 0", // name: "Conditional Jump: Skips 0",
// input: [ // input: [