Re-writing pre-processor to be a bit clearer.
This commit is contained in:
parent
8ecabc91cc
commit
eb627c52d8
|
@ -6,67 +6,76 @@ const {
|
||||||
includesAny,
|
includesAny,
|
||||||
} = require("../utilities")
|
} = require("../utilities")
|
||||||
|
|
||||||
function handleProcessor(string, match, fn) {
|
class Preprocessor {
|
||||||
const output = fn(match)
|
constructor(name, fn) {
|
||||||
const idx = string.indexOf(match)
|
this.name = name
|
||||||
return swapStrings(string, idx, match.length, output)
|
this.fn = fn
|
||||||
|
}
|
||||||
|
|
||||||
|
process(fullString, statement) {
|
||||||
|
const output = this.fn(statement)
|
||||||
|
const idx = fullString.indexOf(statement)
|
||||||
|
return swapStrings(fullString, idx, statement.length, output)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function swapToDotNotation(statement) {
|
const PROCESSORS = [
|
||||||
let startBraceIdx = statement.indexOf("[")
|
new Preprocessor("swap-to-dot-notation", statement => {
|
||||||
let lastIdx = 0
|
let startBraceIdx = statement.indexOf("[")
|
||||||
while (startBraceIdx !== -1) {
|
let lastIdx = 0
|
||||||
// if the character previous to the literal specifier is alpha-numeric this should happen
|
while (startBraceIdx !== -1) {
|
||||||
if (isAlphaNumeric(statement.charAt(startBraceIdx - 1))) {
|
// if the character previous to the literal specifier is alpha-numeric this should happen
|
||||||
statement = swapStrings(statement, startBraceIdx + lastIdx, 1, ".[")
|
if (isAlphaNumeric(statement.charAt(startBraceIdx - 1))) {
|
||||||
|
statement = swapStrings(statement, startBraceIdx + lastIdx, 1, ".[")
|
||||||
|
}
|
||||||
|
lastIdx = startBraceIdx + 1
|
||||||
|
startBraceIdx = statement.substring(lastIdx + 1).indexOf("[")
|
||||||
}
|
}
|
||||||
lastIdx = startBraceIdx + 1
|
return statement
|
||||||
startBraceIdx = statement.substring(lastIdx + 1).indexOf("[")
|
}),
|
||||||
}
|
|
||||||
return statement
|
|
||||||
}
|
|
||||||
|
|
||||||
function handleSpacesInProperties(statement) {
|
new Preprocessor("handle-spaces-in-properties", statement => {
|
||||||
// exclude helpers and brackets, regex will only find double brackets
|
// exclude helpers and brackets, regex will only find double brackets
|
||||||
const exclusions = HelperFunctions.concat(["{{", "}}"])
|
const exclusions = HelperFunctions.concat(["{{", "}}"])
|
||||||
// find all the parts split by spaces
|
// find all the parts split by spaces
|
||||||
const splitBySpaces = statement.split(" ")
|
const splitBySpaces = statement.split(" ")
|
||||||
// remove the excluded elements
|
// remove the excluded elements
|
||||||
const propertyParts = splitBySpaces.filter(
|
const propertyParts = splitBySpaces.filter(
|
||||||
part => exclusions.indexOf(part) === -1
|
part => exclusions.indexOf(part) === -1
|
||||||
)
|
)
|
||||||
// rebuild to get the full property
|
// rebuild to get the full property
|
||||||
const fullProperty = propertyParts.join(" ")
|
const fullProperty = propertyParts.join(" ")
|
||||||
// now work out the dot notation layers and split them up
|
// now work out the dot notation layers and split them up
|
||||||
const propertyLayers = fullProperty.split(".")
|
const propertyLayers = fullProperty.split(".")
|
||||||
// find the layers which need to be wrapped and wrap them
|
// find the layers which need to be wrapped and wrap them
|
||||||
for (let layer of propertyLayers) {
|
for (let layer of propertyLayers) {
|
||||||
if (layer.indexOf(" ") !== -1) {
|
if (layer.indexOf(" ") !== -1) {
|
||||||
statement = swapStrings(
|
statement = swapStrings(
|
||||||
statement,
|
statement,
|
||||||
statement.indexOf(layer),
|
statement.indexOf(layer),
|
||||||
layer.length,
|
layer.length,
|
||||||
`[${layer}]`
|
`[${layer}]`
|
||||||
)
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
// remove the edge case of double brackets being entered (in-case user already has specified)
|
||||||
// remove the edge case of double brackets being entered (in-case user already has specified)
|
return statement.replace(/\[\[/g, "[").replace(/]]/g, "]")
|
||||||
return statement.replace(/\[\[/g, "[").replace(/]]/g, "]")
|
}),
|
||||||
}
|
|
||||||
|
|
||||||
function finalise(statement) {
|
new Preprocessor("finalise", statement => {
|
||||||
let insideStatement = statement.slice(2, statement.length - 2)
|
let insideStatement = statement.slice(2, statement.length - 2)
|
||||||
if (insideStatement.charAt(0) === " ") {
|
if (insideStatement.charAt(0) === " ") {
|
||||||
insideStatement = insideStatement.slice(1)
|
insideStatement = insideStatement.slice(1)
|
||||||
}
|
}
|
||||||
if (insideStatement.charAt(insideStatement.length - 1) === " ") {
|
if (insideStatement.charAt(insideStatement.length - 1) === " ") {
|
||||||
insideStatement = insideStatement.slice(0, insideStatement.length - 1)
|
insideStatement = insideStatement.slice(0, insideStatement.length - 1)
|
||||||
}
|
}
|
||||||
if (includesAny(insideStatement, HelperFunctions)) {
|
if (includesAny(insideStatement, HelperFunctions)) {
|
||||||
insideStatement = `(${insideStatement})`
|
insideStatement = `(${insideStatement})`
|
||||||
}
|
}
|
||||||
return `{{ all ${insideStatement} }}`
|
return `{{ all ${insideStatement} }}`
|
||||||
}
|
})
|
||||||
|
]
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* When running handlebars statements to execute on the context of the automation it possible user's may input handlebars
|
* When running handlebars statements to execute on the context of the automation it possible user's may input handlebars
|
||||||
|
@ -80,16 +89,15 @@ function finalise(statement) {
|
||||||
* @returns {string} The string that was input with processed up handlebars statements as required.
|
* @returns {string} The string that was input with processed up handlebars statements as required.
|
||||||
*/
|
*/
|
||||||
module.exports.preprocess = string => {
|
module.exports.preprocess = string => {
|
||||||
let preprocessors = [swapToDotNotation, handleSpacesInProperties, finalise]
|
for (let processor of PROCESSORS) {
|
||||||
for (let processor of preprocessors) {
|
// re-run search each time incase previous processor updated/removed a match
|
||||||
// re-run search each time incase previous cleaner update/removed a match
|
|
||||||
let regex = new RegExp(FIND_HBS_REGEX)
|
let regex = new RegExp(FIND_HBS_REGEX)
|
||||||
let matches = string.match(regex)
|
let matches = string.match(regex)
|
||||||
if (matches == null) {
|
if (matches == null) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
for (let match of matches) {
|
for (let match of matches) {
|
||||||
string = handleProcessor(string, match, processor)
|
string = processor.process(string, match)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return string
|
return string
|
||||||
|
|
Loading…
Reference in New Issue