Merged master into feature-unicode-strings
This commit is contained in:
commit
fff188eb30
7
package-lock.json
generated
7
package-lock.json
generated
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "cyberchef",
|
"name": "cyberchef",
|
||||||
"version": "7.2.1",
|
"version": "7.5.0",
|
||||||
"lockfileVersion": 1,
|
"lockfileVersion": 1,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@ -1053,6 +1053,11 @@
|
|||||||
"integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==",
|
"integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"bignumber.js": {
|
||||||
|
"version": "5.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-5.0.0.tgz",
|
||||||
|
"integrity": "sha512-KWTu6ZMVk9sxlDJQh2YH1UOnfDP8O8TpxUxgQG/vKASoSnEjK9aVuOueFaPcQEYQ5fyNXNTOYwYw3099RYebWg=="
|
||||||
|
},
|
||||||
"binary-extensions": {
|
"binary-extensions": {
|
||||||
"version": "1.11.0",
|
"version": "1.11.0",
|
||||||
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz",
|
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz",
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "cyberchef",
|
"name": "cyberchef",
|
||||||
"version": "7.2.1",
|
"version": "7.5.0",
|
||||||
"description": "The Cyber Swiss Army Knife for encryption, encoding, compression and data analysis.",
|
"description": "The Cyber Swiss Army Knife for encryption, encoding, compression and data analysis.",
|
||||||
"author": "n1474335 <n1474335@gmail.com>",
|
"author": "n1474335 <n1474335@gmail.com>",
|
||||||
"homepage": "https://gchq.github.io/CyberChef",
|
"homepage": "https://gchq.github.io/CyberChef",
|
||||||
@ -68,6 +68,7 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"babel-polyfill": "^6.26.0",
|
"babel-polyfill": "^6.26.0",
|
||||||
|
"bignumber.js": "^5.0.0",
|
||||||
"bootstrap": "^3.3.7",
|
"bootstrap": "^3.3.7",
|
||||||
"bootstrap-colorpicker": "^2.5.2",
|
"bootstrap-colorpicker": "^2.5.2",
|
||||||
"bootstrap-switch": "^3.3.4",
|
"bootstrap-switch": "^3.3.4",
|
||||||
|
@ -35,10 +35,11 @@ const Chef = function() {
|
|||||||
*/
|
*/
|
||||||
Chef.prototype.bake = async function(input, recipeConfig, options, progress, step) {
|
Chef.prototype.bake = async function(input, recipeConfig, options, progress, step) {
|
||||||
log.debug("Chef baking");
|
log.debug("Chef baking");
|
||||||
let startTime = new Date().getTime(),
|
const startTime = new Date().getTime(),
|
||||||
recipe = new Recipe(recipeConfig),
|
recipe = new Recipe(recipeConfig),
|
||||||
containsFc = recipe.containsFlowControl(),
|
containsFc = recipe.containsFlowControl(),
|
||||||
error = false;
|
notUTF8 = options && options.hasOwnProperty("treatAsUtf8") && !options.treatAsUtf8;
|
||||||
|
let error = false;
|
||||||
|
|
||||||
if (containsFc && ENVIRONMENT_IS_WORKER()) self.setOption("attemptHighlight", false);
|
if (containsFc && ENVIRONMENT_IS_WORKER()) self.setOption("attemptHighlight", false);
|
||||||
|
|
||||||
@ -80,13 +81,13 @@ Chef.prototype.bake = async function(input, recipeConfig, options, progress, ste
|
|||||||
// Depending on the size of the output, we may send it back as a string or an ArrayBuffer.
|
// Depending on the size of the output, we may send it back as a string or an ArrayBuffer.
|
||||||
// This can prevent unnecessary casting as an ArrayBuffer can be easily downloaded as a file.
|
// This can prevent unnecessary casting as an ArrayBuffer can be easily downloaded as a file.
|
||||||
// The threshold is specified in KiB.
|
// The threshold is specified in KiB.
|
||||||
const threshold = (options.outputFileThreshold || 1024) * 1024;
|
const threshold = (options.ioDisplayThreshold || 1024) * 1024;
|
||||||
const returnType = this.dish.size() > threshold ? Dish.ARRAY_BUFFER : Dish.STRING;
|
const returnType = this.dish.size() > threshold ? Dish.ARRAY_BUFFER : Dish.STRING;
|
||||||
|
|
||||||
return {
|
return {
|
||||||
result: this.dish.type === Dish.HTML ?
|
result: this.dish.type === Dish.HTML ?
|
||||||
this.dish.get(Dish.HTML) :
|
this.dish.get(Dish.HTML, notUTF8) :
|
||||||
this.dish.get(returnType),
|
this.dish.get(returnType, notUTF8),
|
||||||
type: Dish.enumLookup(this.dish.type),
|
type: Dish.enumLookup(this.dish.type),
|
||||||
progress: progress,
|
progress: progress,
|
||||||
duration: new Date().getTime() - startTime,
|
duration: new Date().getTime() - startTime,
|
||||||
|
@ -1,14 +1,16 @@
|
|||||||
import Utils from "./Utils.js";
|
import Utils from "./Utils.js";
|
||||||
|
import BigNumber from "bignumber.js";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The data being operated on by each operation.
|
* The data being operated on by each operation.
|
||||||
*
|
*
|
||||||
* @author n1474335 [n1474335@gmail.com]
|
* @author n1474335 [n1474335@gmail.com]
|
||||||
|
* @author Matt C [matt@artemisbot.uk]
|
||||||
* @copyright Crown Copyright 2016
|
* @copyright Crown Copyright 2016
|
||||||
* @license Apache-2.0
|
* @license Apache-2.0
|
||||||
*
|
*
|
||||||
* @class
|
* @class
|
||||||
* @param {byteArray|string|number|ArrayBuffer} value - The value of the input data.
|
* @param {byteArray|string|number|ArrayBuffer|BigNumber} value - The value of the input data.
|
||||||
* @param {number} type - The data type of value, see Dish enums.
|
* @param {number} type - The data type of value, see Dish enums.
|
||||||
*/
|
*/
|
||||||
const Dish = function(value, type) {
|
const Dish = function(value, type) {
|
||||||
@ -47,6 +49,12 @@ Dish.HTML = 3;
|
|||||||
* @enum
|
* @enum
|
||||||
*/
|
*/
|
||||||
Dish.ARRAY_BUFFER = 4;
|
Dish.ARRAY_BUFFER = 4;
|
||||||
|
/**
|
||||||
|
* Dish data type enum for BigNumbers.
|
||||||
|
* @readonly
|
||||||
|
* @enum
|
||||||
|
*/
|
||||||
|
Dish.BIG_NUMBER = 5;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -57,22 +65,22 @@ Dish.ARRAY_BUFFER = 4;
|
|||||||
* @returns {number} The data type enum value.
|
* @returns {number} The data type enum value.
|
||||||
*/
|
*/
|
||||||
Dish.typeEnum = function(typeStr) {
|
Dish.typeEnum = function(typeStr) {
|
||||||
switch (typeStr) {
|
switch (typeStr.toLowerCase()) {
|
||||||
case "byteArray":
|
case "bytearray":
|
||||||
case "Byte array":
|
case "byte array":
|
||||||
return Dish.BYTE_ARRAY;
|
return Dish.BYTE_ARRAY;
|
||||||
case "string":
|
case "string":
|
||||||
case "String":
|
|
||||||
return Dish.STRING;
|
return Dish.STRING;
|
||||||
case "number":
|
case "number":
|
||||||
case "Number":
|
|
||||||
return Dish.NUMBER;
|
return Dish.NUMBER;
|
||||||
case "html":
|
case "html":
|
||||||
case "HTML":
|
|
||||||
return Dish.HTML;
|
return Dish.HTML;
|
||||||
case "arrayBuffer":
|
case "arraybuffer":
|
||||||
case "ArrayBuffer":
|
case "array buffer":
|
||||||
return Dish.ARRAY_BUFFER;
|
return Dish.ARRAY_BUFFER;
|
||||||
|
case "bignumber":
|
||||||
|
case "big number":
|
||||||
|
return Dish.BIG_NUMBER;
|
||||||
default:
|
default:
|
||||||
throw "Invalid data type string. No matching enum.";
|
throw "Invalid data type string. No matching enum.";
|
||||||
}
|
}
|
||||||
@ -83,8 +91,8 @@ Dish.typeEnum = function(typeStr) {
|
|||||||
* Returns the data type string for the given type enum.
|
* Returns the data type string for the given type enum.
|
||||||
*
|
*
|
||||||
* @static
|
* @static
|
||||||
* @param {string} typeEnum - The enum value of the data type.
|
* @param {number} typeEnum - The enum value of the data type.
|
||||||
* @returns {number} The data type as a string.
|
* @returns {string} The data type as a string.
|
||||||
*/
|
*/
|
||||||
Dish.enumLookup = function(typeEnum) {
|
Dish.enumLookup = function(typeEnum) {
|
||||||
switch (typeEnum) {
|
switch (typeEnum) {
|
||||||
@ -98,6 +106,8 @@ Dish.enumLookup = function(typeEnum) {
|
|||||||
return "html";
|
return "html";
|
||||||
case Dish.ARRAY_BUFFER:
|
case Dish.ARRAY_BUFFER:
|
||||||
return "ArrayBuffer";
|
return "ArrayBuffer";
|
||||||
|
case Dish.BIG_NUMBER:
|
||||||
|
return "BigNumber";
|
||||||
default:
|
default:
|
||||||
throw "Invalid data type enum. No matching type.";
|
throw "Invalid data type enum. No matching type.";
|
||||||
}
|
}
|
||||||
@ -107,7 +117,7 @@ Dish.enumLookup = function(typeEnum) {
|
|||||||
/**
|
/**
|
||||||
* Sets the data value and type and then validates them.
|
* Sets the data value and type and then validates them.
|
||||||
*
|
*
|
||||||
* @param {byteArray|string|number|ArrayBuffer} value - The value of the input data.
|
* @param {byteArray|string|number|ArrayBuffer|BigNumber} value - The value of the input data.
|
||||||
* @param {number} type - The data type of value, see Dish enums.
|
* @param {number} type - The data type of value, see Dish enums.
|
||||||
*/
|
*/
|
||||||
Dish.prototype.set = function(value, type) {
|
Dish.prototype.set = function(value, type) {
|
||||||
@ -126,11 +136,12 @@ Dish.prototype.set = function(value, type) {
|
|||||||
* Returns the value of the data in the type format specified.
|
* Returns the value of the data in the type format specified.
|
||||||
*
|
*
|
||||||
* @param {number} type - The data type of value, see Dish enums.
|
* @param {number} type - The data type of value, see Dish enums.
|
||||||
* @returns {byteArray|string|number|ArrayBuffer} The value of the output data.
|
* @param {boolean} [notUTF8] - Do not treat strings as UTF8.
|
||||||
|
* @returns {byteArray|string|number|ArrayBuffer|BigNumber} The value of the output data.
|
||||||
*/
|
*/
|
||||||
Dish.prototype.get = function(type) {
|
Dish.prototype.get = function(type, notUTF8) {
|
||||||
if (this.type !== type) {
|
if (this.type !== type) {
|
||||||
this.translate(type);
|
this.translate(type, notUTF8);
|
||||||
}
|
}
|
||||||
return this.value;
|
return this.value;
|
||||||
};
|
};
|
||||||
@ -140,9 +151,11 @@ Dish.prototype.get = function(type) {
|
|||||||
* Translates the data to the given type format.
|
* Translates the data to the given type format.
|
||||||
*
|
*
|
||||||
* @param {number} toType - The data type of value, see Dish enums.
|
* @param {number} toType - The data type of value, see Dish enums.
|
||||||
|
* @param {boolean} [notUTF8] - Do not treat strings as UTF8.
|
||||||
*/
|
*/
|
||||||
Dish.prototype.translate = function(toType) {
|
Dish.prototype.translate = function(toType, notUTF8) {
|
||||||
log.debug(`Translating Dish from ${Dish.enumLookup(this.type)} to ${Dish.enumLookup(toType)}`);
|
log.debug(`Translating Dish from ${Dish.enumLookup(this.type)} to ${Dish.enumLookup(toType)}`);
|
||||||
|
const byteArrayToStr = notUTF8 ? Utils.byteArrayToChars : Utils.byteArrayToUtf8;
|
||||||
|
|
||||||
// Convert data to intermediate byteArray type
|
// Convert data to intermediate byteArray type
|
||||||
switch (this.type) {
|
switch (this.type) {
|
||||||
@ -159,6 +172,9 @@ Dish.prototype.translate = function(toType) {
|
|||||||
// Array.from() would be nicer here, but it's slightly slower
|
// Array.from() would be nicer here, but it's slightly slower
|
||||||
this.value = Array.prototype.slice.call(new Uint8Array(this.value));
|
this.value = Array.prototype.slice.call(new Uint8Array(this.value));
|
||||||
break;
|
break;
|
||||||
|
case Dish.BIG_NUMBER:
|
||||||
|
this.value = this.value instanceof BigNumber ? Utils.strToByteArray(this.value.toFixed()) : [];
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -169,17 +185,25 @@ Dish.prototype.translate = function(toType) {
|
|||||||
switch (toType) {
|
switch (toType) {
|
||||||
case Dish.STRING:
|
case Dish.STRING:
|
||||||
case Dish.HTML:
|
case Dish.HTML:
|
||||||
this.value = this.value ? Utils.byteArrayToUtf8(this.value) : "";
|
this.value = this.value ? byteArrayToStr(this.value) : "";
|
||||||
this.type = Dish.STRING;
|
this.type = Dish.STRING;
|
||||||
break;
|
break;
|
||||||
case Dish.NUMBER:
|
case Dish.NUMBER:
|
||||||
this.value = this.value ? parseFloat(Utils.byteArrayToUtf8(this.value)) : 0;
|
this.value = this.value ? parseFloat(byteArrayToStr(this.value)) : 0;
|
||||||
this.type = Dish.NUMBER;
|
this.type = Dish.NUMBER;
|
||||||
break;
|
break;
|
||||||
case Dish.ARRAY_BUFFER:
|
case Dish.ARRAY_BUFFER:
|
||||||
this.value = new Uint8Array(this.value).buffer;
|
this.value = new Uint8Array(this.value).buffer;
|
||||||
this.type = Dish.ARRAY_BUFFER;
|
this.type = Dish.ARRAY_BUFFER;
|
||||||
break;
|
break;
|
||||||
|
case Dish.BIG_NUMBER:
|
||||||
|
try {
|
||||||
|
this.value = new BigNumber(byteArrayToStr(this.value));
|
||||||
|
} catch (err) {
|
||||||
|
this.value = new BigNumber(NaN);
|
||||||
|
}
|
||||||
|
this.type = Dish.BIG_NUMBER;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -215,6 +239,8 @@ Dish.prototype.valid = function() {
|
|||||||
return typeof this.value === "number";
|
return typeof this.value === "number";
|
||||||
case Dish.ARRAY_BUFFER:
|
case Dish.ARRAY_BUFFER:
|
||||||
return this.value instanceof ArrayBuffer;
|
return this.value instanceof ArrayBuffer;
|
||||||
|
case Dish.BIG_NUMBER:
|
||||||
|
return this.value instanceof BigNumber;
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -235,6 +261,7 @@ Dish.prototype.size = function() {
|
|||||||
case Dish.HTML:
|
case Dish.HTML:
|
||||||
return this.value.length;
|
return this.value.length;
|
||||||
case Dish.NUMBER:
|
case Dish.NUMBER:
|
||||||
|
case Dish.BIG_NUMBER:
|
||||||
return this.value.toString().length;
|
return this.value.toString().length;
|
||||||
case Dish.ARRAY_BUFFER:
|
case Dish.ARRAY_BUFFER:
|
||||||
return this.value.byteLength;
|
return this.value.byteLength;
|
||||||
|
@ -201,7 +201,7 @@ const Utils = {
|
|||||||
* Utils.parseEscapedChars("\\n");
|
* Utils.parseEscapedChars("\\n");
|
||||||
*/
|
*/
|
||||||
parseEscapedChars: function(str) {
|
parseEscapedChars: function(str) {
|
||||||
return str.replace(/(\\)?\\([nrtbf]|x[\da-f]{2})/g, function(m, a, b) {
|
return str.replace(/(\\)?\\([nrtbf]|x[\da-fA-F]{2})/g, function(m, a, b) {
|
||||||
if (a === "\\") return "\\"+b;
|
if (a === "\\") return "\\"+b;
|
||||||
switch (b[0]) {
|
switch (b[0]) {
|
||||||
case "n":
|
case "n":
|
||||||
|
@ -189,6 +189,7 @@ const Categories = [
|
|||||||
"Find / Replace",
|
"Find / Replace",
|
||||||
"Regular expression",
|
"Regular expression",
|
||||||
"Offset checker",
|
"Offset checker",
|
||||||
|
"Hamming Distance",
|
||||||
"Convert distance",
|
"Convert distance",
|
||||||
"Convert area",
|
"Convert area",
|
||||||
"Convert mass",
|
"Convert mass",
|
||||||
|
@ -525,7 +525,7 @@ const OperationConfig = {
|
|||||||
module: "Default",
|
module: "Default",
|
||||||
description: "Adds together a list of numbers. If an item in the string is not a number it is excluded from the list.<br><br>e.g. <code>0x0a 8 .5</code> becomes <code>18.5</code>",
|
description: "Adds together a list of numbers. If an item in the string is not a number it is excluded from the list.<br><br>e.g. <code>0x0a 8 .5</code> becomes <code>18.5</code>",
|
||||||
inputType: "string",
|
inputType: "string",
|
||||||
outputType: "number",
|
outputType: "BigNumber",
|
||||||
args: [
|
args: [
|
||||||
{
|
{
|
||||||
name: "Delimiter",
|
name: "Delimiter",
|
||||||
@ -538,7 +538,7 @@ const OperationConfig = {
|
|||||||
module: "Default",
|
module: "Default",
|
||||||
description: "Subtracts a list of numbers. If an item in the string is not a number it is excluded from the list.<br><br>e.g. <code>0x0a 8 .5</code> becomes <code>1.5</code>",
|
description: "Subtracts a list of numbers. If an item in the string is not a number it is excluded from the list.<br><br>e.g. <code>0x0a 8 .5</code> becomes <code>1.5</code>",
|
||||||
inputType: "string",
|
inputType: "string",
|
||||||
outputType: "number",
|
outputType: "BigNumber",
|
||||||
args: [
|
args: [
|
||||||
{
|
{
|
||||||
name: "Delimiter",
|
name: "Delimiter",
|
||||||
@ -551,7 +551,7 @@ const OperationConfig = {
|
|||||||
module: "Default",
|
module: "Default",
|
||||||
description: "Multiplies a list of numbers. If an item in the string is not a number it is excluded from the list.<br><br>e.g. <code>0x0a 8 .5</code> becomes <code>40</code>",
|
description: "Multiplies a list of numbers. If an item in the string is not a number it is excluded from the list.<br><br>e.g. <code>0x0a 8 .5</code> becomes <code>40</code>",
|
||||||
inputType: "string",
|
inputType: "string",
|
||||||
outputType: "number",
|
outputType: "BigNumber",
|
||||||
args: [
|
args: [
|
||||||
{
|
{
|
||||||
name: "Delimiter",
|
name: "Delimiter",
|
||||||
@ -564,7 +564,7 @@ const OperationConfig = {
|
|||||||
module: "Default",
|
module: "Default",
|
||||||
description: "Divides a list of numbers. If an item in the string is not a number it is excluded from the list.<br><br>e.g. <code>0x0a 8 .5</code> becomes <code>2.5</code>",
|
description: "Divides a list of numbers. If an item in the string is not a number it is excluded from the list.<br><br>e.g. <code>0x0a 8 .5</code> becomes <code>2.5</code>",
|
||||||
inputType: "string",
|
inputType: "string",
|
||||||
outputType: "number",
|
outputType: "BigNumber",
|
||||||
args: [
|
args: [
|
||||||
{
|
{
|
||||||
name: "Delimiter",
|
name: "Delimiter",
|
||||||
@ -577,7 +577,7 @@ const OperationConfig = {
|
|||||||
module: "Default",
|
module: "Default",
|
||||||
description: "Computes the mean (average) of a number list. If an item in the string is not a number it is excluded from the list.<br><br>e.g. <code>0x0a 8 .5 .5</code> becomes <code>4.75</code>",
|
description: "Computes the mean (average) of a number list. If an item in the string is not a number it is excluded from the list.<br><br>e.g. <code>0x0a 8 .5 .5</code> becomes <code>4.75</code>",
|
||||||
inputType: "string",
|
inputType: "string",
|
||||||
outputType: "number",
|
outputType: "BigNumber",
|
||||||
args: [
|
args: [
|
||||||
{
|
{
|
||||||
name: "Delimiter",
|
name: "Delimiter",
|
||||||
@ -590,7 +590,7 @@ const OperationConfig = {
|
|||||||
module: "Default",
|
module: "Default",
|
||||||
description: "Computes the median of a number list. If an item in the string is not a number it is excluded from the list.<br><br>e.g. <code>0x0a 8 1 .5</code> becomes <code>4.5</code>",
|
description: "Computes the median of a number list. If an item in the string is not a number it is excluded from the list.<br><br>e.g. <code>0x0a 8 1 .5</code> becomes <code>4.5</code>",
|
||||||
inputType: "string",
|
inputType: "string",
|
||||||
outputType: "number",
|
outputType: "BigNumber",
|
||||||
args: [
|
args: [
|
||||||
{
|
{
|
||||||
name: "Delimiter",
|
name: "Delimiter",
|
||||||
@ -603,7 +603,7 @@ const OperationConfig = {
|
|||||||
module: "Default",
|
module: "Default",
|
||||||
description: "Computes the standard deviation of a number list. If an item in the string is not a number it is excluded from the list.<br><br>e.g. <code>0x0a 8 .5</code> becomes <code>4.089281382128433</code>",
|
description: "Computes the standard deviation of a number list. If an item in the string is not a number it is excluded from the list.<br><br>e.g. <code>0x0a 8 .5</code> becomes <code>4.089281382128433</code>",
|
||||||
inputType: "string",
|
inputType: "string",
|
||||||
outputType: "number",
|
outputType: "BigNumber",
|
||||||
args: [
|
args: [
|
||||||
{
|
{
|
||||||
name: "Delimiter",
|
name: "Delimiter",
|
||||||
@ -807,7 +807,7 @@ const OperationConfig = {
|
|||||||
module: "Default",
|
module: "Default",
|
||||||
description: "Converts a number to decimal from a given numerical base.",
|
description: "Converts a number to decimal from a given numerical base.",
|
||||||
inputType: "string",
|
inputType: "string",
|
||||||
outputType: "number",
|
outputType: "BigNumber",
|
||||||
args: [
|
args: [
|
||||||
{
|
{
|
||||||
name: "Radix",
|
name: "Radix",
|
||||||
@ -819,7 +819,7 @@ const OperationConfig = {
|
|||||||
"To Base": {
|
"To Base": {
|
||||||
module: "Default",
|
module: "Default",
|
||||||
description: "Converts a decimal number to a given numerical base.",
|
description: "Converts a decimal number to a given numerical base.",
|
||||||
inputType: "number",
|
inputType: "BigNumber",
|
||||||
outputType: "string",
|
outputType: "string",
|
||||||
args: [
|
args: [
|
||||||
{
|
{
|
||||||
@ -2538,8 +2538,8 @@ const OperationConfig = {
|
|||||||
"Convert distance": {
|
"Convert distance": {
|
||||||
module: "Default",
|
module: "Default",
|
||||||
description: "Converts a unit of distance to another format.",
|
description: "Converts a unit of distance to another format.",
|
||||||
inputType: "number",
|
inputType: "BigNumber",
|
||||||
outputType: "number",
|
outputType: "BigNumber",
|
||||||
args: [
|
args: [
|
||||||
{
|
{
|
||||||
name: "Input units",
|
name: "Input units",
|
||||||
@ -2556,8 +2556,8 @@ const OperationConfig = {
|
|||||||
"Convert area": {
|
"Convert area": {
|
||||||
module: "Default",
|
module: "Default",
|
||||||
description: "Converts a unit of area to another format.",
|
description: "Converts a unit of area to another format.",
|
||||||
inputType: "number",
|
inputType: "BigNumber",
|
||||||
outputType: "number",
|
outputType: "BigNumber",
|
||||||
args: [
|
args: [
|
||||||
{
|
{
|
||||||
name: "Input units",
|
name: "Input units",
|
||||||
@ -2574,8 +2574,8 @@ const OperationConfig = {
|
|||||||
"Convert mass": {
|
"Convert mass": {
|
||||||
module: "Default",
|
module: "Default",
|
||||||
description: "Converts a unit of mass to another format.",
|
description: "Converts a unit of mass to another format.",
|
||||||
inputType: "number",
|
inputType: "BigNumber",
|
||||||
outputType: "number",
|
outputType: "BigNumber",
|
||||||
args: [
|
args: [
|
||||||
{
|
{
|
||||||
name: "Input units",
|
name: "Input units",
|
||||||
@ -2592,8 +2592,8 @@ const OperationConfig = {
|
|||||||
"Convert speed": {
|
"Convert speed": {
|
||||||
module: "Default",
|
module: "Default",
|
||||||
description: "Converts a unit of speed to another format.",
|
description: "Converts a unit of speed to another format.",
|
||||||
inputType: "number",
|
inputType: "BigNumber",
|
||||||
outputType: "number",
|
outputType: "BigNumber",
|
||||||
args: [
|
args: [
|
||||||
{
|
{
|
||||||
name: "Input units",
|
name: "Input units",
|
||||||
@ -2610,8 +2610,8 @@ const OperationConfig = {
|
|||||||
"Convert data units": {
|
"Convert data units": {
|
||||||
module: "Default",
|
module: "Default",
|
||||||
description: "Converts a unit of data to another format.",
|
description: "Converts a unit of data to another format.",
|
||||||
inputType: "number",
|
inputType: "BigNumber",
|
||||||
outputType: "number",
|
outputType: "BigNumber",
|
||||||
args: [
|
args: [
|
||||||
{
|
{
|
||||||
name: "Input units",
|
name: "Input units",
|
||||||
@ -3501,14 +3501,14 @@ const OperationConfig = {
|
|||||||
},
|
},
|
||||||
"Escape string": {
|
"Escape string": {
|
||||||
module: "Default",
|
module: "Default",
|
||||||
description: "Escapes special characters in a string so that they do not cause conflicts. For example, <code>Don't stop me now</code> becomes <code>Don\\'t stop me now</code>.",
|
description: "Escapes special characters in a string so that they do not cause conflicts. For example, <code>Don't stop me now</code> becomes <code>Don\\'t stop me now</code>.<br><br>Supports the following escape sequences:<ul><li><code>\\n</code> (Line feed/newline)</li><li><code>\\r</code> (Carriage return)</li><li><code>\\t</code> (Horizontal tab)</li><li><code>\\b</code> (Backspace)</li><li><code>\\f</code> (Form feed)</li><li><code>\\xnn</code> (Hex, where n is 0-f)</li><li><code>\\\\</code> (Backslash)</li><li><code>\\'</code> (Single quote)</li><li><code>\\"</code> (Double quote)</li></ul>",
|
||||||
inputType: "string",
|
inputType: "string",
|
||||||
outputType: "string",
|
outputType: "string",
|
||||||
args: []
|
args: []
|
||||||
},
|
},
|
||||||
"Unescape string": {
|
"Unescape string": {
|
||||||
module: "Default",
|
module: "Default",
|
||||||
description: "Unescapes characters in a string that have been escaped. For example, <code>Don\\'t stop me now</code> becomes <code>Don't stop me now</code>.",
|
description: "Unescapes characters in a string that have been escaped. For example, <code>Don\\'t stop me now</code> becomes <code>Don't stop me now</code>.<br><br>Supports the following escape sequences:<ul><li><code>\\n</code> (Line feed/newline)</li><li><code>\\r</code> (Carriage return)</li><li><code>\\t</code> (Horizontal tab)</li><li><code>\\b</code> (Backspace)</li><li><code>\\f</code> (Form feed)</li><li><code>\\xnn</code> (Hex, where n is 0-f)</li><li><code>\\\\</code> (Backslash)</li><li><code>\\'</code> (Single quote)</li><li><code>\\"</code> (Double quote)</li></ul>",
|
||||||
inputType: "string",
|
inputType: "string",
|
||||||
outputType: "string",
|
outputType: "string",
|
||||||
args: []
|
args: []
|
||||||
@ -3773,7 +3773,7 @@ const OperationConfig = {
|
|||||||
module: "Default",
|
module: "Default",
|
||||||
description: "Binary-Coded Decimal (BCD) is a class of binary encodings of decimal numbers where each decimal digit is represented by a fixed number of bits, usually four or eight. Special bit patterns are sometimes used for a sign.",
|
description: "Binary-Coded Decimal (BCD) is a class of binary encodings of decimal numbers where each decimal digit is represented by a fixed number of bits, usually four or eight. Special bit patterns are sometimes used for a sign.",
|
||||||
inputType: "string",
|
inputType: "string",
|
||||||
outputType: "number",
|
outputType: "BigNumber",
|
||||||
args: [
|
args: [
|
||||||
{
|
{
|
||||||
name: "Scheme",
|
name: "Scheme",
|
||||||
@ -3801,7 +3801,7 @@ const OperationConfig = {
|
|||||||
"To BCD": {
|
"To BCD": {
|
||||||
module: "Default",
|
module: "Default",
|
||||||
description: "Binary-Coded Decimal (BCD) is a class of binary encodings of decimal numbers where each decimal digit is represented by a fixed number of bits, usually four or eight. Special bit patterns are sometimes used for a sign",
|
description: "Binary-Coded Decimal (BCD) is a class of binary encodings of decimal numbers where each decimal digit is represented by a fixed number of bits, usually four or eight. Special bit patterns are sometimes used for a sign",
|
||||||
inputType: "number",
|
inputType: "BigNumber",
|
||||||
outputType: "string",
|
outputType: "string",
|
||||||
args: [
|
args: [
|
||||||
{
|
{
|
||||||
@ -3936,6 +3936,29 @@ const OperationConfig = {
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"Hamming Distance": {
|
||||||
|
module: "Default",
|
||||||
|
description: "In information theory, the Hamming distance between two strings of equal length is the number of positions at which the corresponding symbols are different. In other words, it measures the minimum number of substitutions required to change one string into the other, or the minimum number of errors that could have transformed one string into the other. In a more general context, the Hamming distance is one of several string metrics for measuring the edit distance between two sequences.",
|
||||||
|
inputType: "string",
|
||||||
|
outputType: "string",
|
||||||
|
args: [
|
||||||
|
{
|
||||||
|
name: "Delimiter",
|
||||||
|
type: "binaryShortString",
|
||||||
|
value: StrUtils.HAMMING_DELIM
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Unit",
|
||||||
|
type: "option",
|
||||||
|
value: StrUtils.HAMMING_UNIT
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Input type",
|
||||||
|
type: "option",
|
||||||
|
value: StrUtils.HAMMING_INPUT_TYPE
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -107,6 +107,7 @@ OpModules.Default = {
|
|||||||
"Unescape string": StrUtils.runUnescape,
|
"Unescape string": StrUtils.runUnescape,
|
||||||
"Head": StrUtils.runHead,
|
"Head": StrUtils.runHead,
|
||||||
"Tail": StrUtils.runTail,
|
"Tail": StrUtils.runTail,
|
||||||
|
"Hamming Distance": StrUtils.runHamming,
|
||||||
"Remove whitespace": Tidy.runRemoveWhitespace,
|
"Remove whitespace": Tidy.runRemoveWhitespace,
|
||||||
"Remove null bytes": Tidy.runRemoveNulls,
|
"Remove null bytes": Tidy.runRemoveNulls,
|
||||||
"Drop bytes": Tidy.runDropBytes,
|
"Drop bytes": Tidy.runDropBytes,
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import Utils from "../Utils.js";
|
import Utils from "../Utils.js";
|
||||||
|
import BigNumber from "bignumber.js";
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -24,11 +25,11 @@ const Arithmetic = {
|
|||||||
*
|
*
|
||||||
* @param {string} input
|
* @param {string} input
|
||||||
* @param {Object[]} args
|
* @param {Object[]} args
|
||||||
* @returns {number}
|
* @returns {BigNumber}
|
||||||
*/
|
*/
|
||||||
runSum: function(input, args) {
|
runSum: function(input, args) {
|
||||||
const val = Arithmetic._sum(Arithmetic._createNumArray(input, args[0]));
|
const val = Arithmetic._sum(Arithmetic._createNumArray(input, args[0]));
|
||||||
return typeof(val) === "number" ? val : NaN;
|
return val instanceof BigNumber ? val : new BigNumber(NaN);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
@ -37,11 +38,11 @@ const Arithmetic = {
|
|||||||
*
|
*
|
||||||
* @param {string} input
|
* @param {string} input
|
||||||
* @param {Object[]} args
|
* @param {Object[]} args
|
||||||
* @returns {number}
|
* @returns {BigNumber}
|
||||||
*/
|
*/
|
||||||
runSub: function(input, args) {
|
runSub: function(input, args) {
|
||||||
let val = Arithmetic._sub(Arithmetic._createNumArray(input, args[0]));
|
let val = Arithmetic._sub(Arithmetic._createNumArray(input, args[0]));
|
||||||
return typeof(val) === "number" ? val : NaN;
|
return val instanceof BigNumber ? val : new BigNumber(NaN);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
@ -50,11 +51,11 @@ const Arithmetic = {
|
|||||||
*
|
*
|
||||||
* @param {string} input
|
* @param {string} input
|
||||||
* @param {Object[]} args
|
* @param {Object[]} args
|
||||||
* @returns {number}
|
* @returns {BigNumber}
|
||||||
*/
|
*/
|
||||||
runMulti: function(input, args) {
|
runMulti: function(input, args) {
|
||||||
let val = Arithmetic._multi(Arithmetic._createNumArray(input, args[0]));
|
let val = Arithmetic._multi(Arithmetic._createNumArray(input, args[0]));
|
||||||
return typeof(val) === "number" ? val : NaN;
|
return val instanceof BigNumber ? val : new BigNumber(NaN);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
@ -63,11 +64,11 @@ const Arithmetic = {
|
|||||||
*
|
*
|
||||||
* @param {string} input
|
* @param {string} input
|
||||||
* @param {Object[]} args
|
* @param {Object[]} args
|
||||||
* @returns {number}
|
* @returns {BigNumber}
|
||||||
*/
|
*/
|
||||||
runDiv: function(input, args) {
|
runDiv: function(input, args) {
|
||||||
let val = Arithmetic._div(Arithmetic._createNumArray(input, args[0]));
|
let val = Arithmetic._div(Arithmetic._createNumArray(input, args[0]));
|
||||||
return typeof(val) === "number" ? val : NaN;
|
return val instanceof BigNumber ? val : new BigNumber(NaN);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
@ -76,11 +77,11 @@ const Arithmetic = {
|
|||||||
*
|
*
|
||||||
* @param {string} input
|
* @param {string} input
|
||||||
* @param {Object[]} args
|
* @param {Object[]} args
|
||||||
* @returns {number}
|
* @returns {BigNumber}
|
||||||
*/
|
*/
|
||||||
runMean: function(input, args) {
|
runMean: function(input, args) {
|
||||||
let val = Arithmetic._mean(Arithmetic._createNumArray(input, args[0]));
|
let val = Arithmetic._mean(Arithmetic._createNumArray(input, args[0]));
|
||||||
return typeof(val) === "number" ? val : NaN;
|
return val instanceof BigNumber ? val : new BigNumber(NaN);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
@ -89,11 +90,11 @@ const Arithmetic = {
|
|||||||
*
|
*
|
||||||
* @param {string} input
|
* @param {string} input
|
||||||
* @param {Object[]} args
|
* @param {Object[]} args
|
||||||
* @returns {number}
|
* @returns {BigNumber}
|
||||||
*/
|
*/
|
||||||
runMedian: function(input, args) {
|
runMedian: function(input, args) {
|
||||||
let val = Arithmetic._median(Arithmetic._createNumArray(input, args[0]));
|
let val = Arithmetic._median(Arithmetic._createNumArray(input, args[0]));
|
||||||
return typeof(val) === "number" ? val : NaN;
|
return val instanceof BigNumber ? val : new BigNumber(NaN);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
@ -102,11 +103,11 @@ const Arithmetic = {
|
|||||||
*
|
*
|
||||||
* @param {string} input
|
* @param {string} input
|
||||||
* @param {Object[]} args
|
* @param {Object[]} args
|
||||||
* @returns {number}
|
* @returns {BigNumber}
|
||||||
*/
|
*/
|
||||||
runStdDev: function(input, args) {
|
runStdDev: function(input, args) {
|
||||||
let val = Arithmetic._stdDev(Arithmetic._createNumArray(input, args[0]));
|
let val = Arithmetic._stdDev(Arithmetic._createNumArray(input, args[0]));
|
||||||
return typeof(val) === "number" ? val : NaN;
|
return val instanceof BigNumber ? val : new BigNumber(NaN);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
@ -116,7 +117,7 @@ const Arithmetic = {
|
|||||||
* @private
|
* @private
|
||||||
* @param {string[]} input
|
* @param {string[]} input
|
||||||
* @param {string} delim
|
* @param {string} delim
|
||||||
* @returns {number[]}
|
* @returns {BigNumber[]}
|
||||||
*/
|
*/
|
||||||
_createNumArray: function(input, delim) {
|
_createNumArray: function(input, delim) {
|
||||||
delim = Utils.charRep[delim || "Space"];
|
delim = Utils.charRep[delim || "Space"];
|
||||||
@ -125,14 +126,14 @@ const Arithmetic = {
|
|||||||
num;
|
num;
|
||||||
|
|
||||||
for (let i = 0; i < splitNumbers.length; i++) {
|
for (let i = 0; i < splitNumbers.length; i++) {
|
||||||
if (splitNumbers[i].indexOf(".") >= 0) {
|
try {
|
||||||
num = parseFloat(splitNumbers[i].trim());
|
num = BigNumber(splitNumbers[i].trim());
|
||||||
} else {
|
if (!num.isNaN()) {
|
||||||
num = parseInt(splitNumbers[i].trim(), 0);
|
|
||||||
}
|
|
||||||
if (!isNaN(num)) {
|
|
||||||
numbers.push(num);
|
numbers.push(num);
|
||||||
}
|
}
|
||||||
|
} catch (err) {
|
||||||
|
// This line is not a valid number
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return numbers;
|
return numbers;
|
||||||
},
|
},
|
||||||
@ -142,12 +143,12 @@ const Arithmetic = {
|
|||||||
* Adds an array of numbers and returns the value.
|
* Adds an array of numbers and returns the value.
|
||||||
*
|
*
|
||||||
* @private
|
* @private
|
||||||
* @param {number[]} data
|
* @param {BigNumber[]} data
|
||||||
* @returns {number}
|
* @returns {BigNumber}
|
||||||
*/
|
*/
|
||||||
_sum: function(data) {
|
_sum: function(data) {
|
||||||
if (data.length > 0) {
|
if (data.length > 0) {
|
||||||
return data.reduce((acc, curr) => acc + curr);
|
return data.reduce((acc, curr) => acc.plus(curr));
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -156,12 +157,12 @@ const Arithmetic = {
|
|||||||
* Subtracts an array of numbers and returns the value.
|
* Subtracts an array of numbers and returns the value.
|
||||||
*
|
*
|
||||||
* @private
|
* @private
|
||||||
* @param {number[]} data
|
* @param {BigNumber[]} data
|
||||||
* @returns {number}
|
* @returns {BigNumber}
|
||||||
*/
|
*/
|
||||||
_sub: function(data) {
|
_sub: function(data) {
|
||||||
if (data.length > 0) {
|
if (data.length > 0) {
|
||||||
return data.reduce((acc, curr) => acc - curr);
|
return data.reduce((acc, curr) => acc.minus(curr));
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -170,12 +171,12 @@ const Arithmetic = {
|
|||||||
* Multiplies an array of numbers and returns the value.
|
* Multiplies an array of numbers and returns the value.
|
||||||
*
|
*
|
||||||
* @private
|
* @private
|
||||||
* @param {number[]} data
|
* @param {BigNumber[]} data
|
||||||
* @returns {number}
|
* @returns {BigNumber}
|
||||||
*/
|
*/
|
||||||
_multi: function(data) {
|
_multi: function(data) {
|
||||||
if (data.length > 0) {
|
if (data.length > 0) {
|
||||||
return data.reduce((acc, curr) => acc * curr);
|
return data.reduce((acc, curr) => acc.times(curr));
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -184,12 +185,12 @@ const Arithmetic = {
|
|||||||
* Divides an array of numbers and returns the value.
|
* Divides an array of numbers and returns the value.
|
||||||
*
|
*
|
||||||
* @private
|
* @private
|
||||||
* @param {number[]} data
|
* @param {BigNumber[]} data
|
||||||
* @returns {number}
|
* @returns {BigNumber}
|
||||||
*/
|
*/
|
||||||
_div: function(data) {
|
_div: function(data) {
|
||||||
if (data.length > 0) {
|
if (data.length > 0) {
|
||||||
return data.reduce((acc, curr) => acc / curr);
|
return data.reduce((acc, curr) => acc.div(curr));
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -198,12 +199,12 @@ const Arithmetic = {
|
|||||||
* Computes mean of a number array and returns the value.
|
* Computes mean of a number array and returns the value.
|
||||||
*
|
*
|
||||||
* @private
|
* @private
|
||||||
* @param {number[]} data
|
* @param {BigNumber[]} data
|
||||||
* @returns {number}
|
* @returns {BigNumber}
|
||||||
*/
|
*/
|
||||||
_mean: function(data) {
|
_mean: function(data) {
|
||||||
if (data.length > 0) {
|
if (data.length > 0) {
|
||||||
return Arithmetic._sum(data) / data.length;
|
return Arithmetic._sum(data).div(data.length);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -212,14 +213,14 @@ const Arithmetic = {
|
|||||||
* Computes median of a number array and returns the value.
|
* Computes median of a number array and returns the value.
|
||||||
*
|
*
|
||||||
* @private
|
* @private
|
||||||
* @param {number[]} data
|
* @param {BigNumber[]} data
|
||||||
* @returns {number}
|
* @returns {BigNumber}
|
||||||
*/
|
*/
|
||||||
_median: function (data) {
|
_median: function (data) {
|
||||||
if ((data.length % 2) === 0) {
|
if ((data.length % 2) === 0 && data.length > 0) {
|
||||||
let first, second;
|
let first, second;
|
||||||
data.sort(function(a, b){
|
data.sort(function(a, b){
|
||||||
return a - b;
|
return a.minus(b);
|
||||||
});
|
});
|
||||||
first = data[Math.floor(data.length / 2)];
|
first = data[Math.floor(data.length / 2)];
|
||||||
second = data[Math.floor(data.length / 2) - 1];
|
second = data[Math.floor(data.length / 2) - 1];
|
||||||
@ -234,17 +235,17 @@ const Arithmetic = {
|
|||||||
* Computes standard deviation of a number array and returns the value.
|
* Computes standard deviation of a number array and returns the value.
|
||||||
*
|
*
|
||||||
* @private
|
* @private
|
||||||
* @param {number[]} data
|
* @param {BigNumber[]} data
|
||||||
* @returns {number}
|
* @returns {BigNumber}
|
||||||
*/
|
*/
|
||||||
_stdDev: function (data) {
|
_stdDev: function (data) {
|
||||||
if (data.length > 0) {
|
if (data.length > 0) {
|
||||||
let avg = Arithmetic._mean(data);
|
let avg = Arithmetic._mean(data);
|
||||||
let devSum = 0;
|
let devSum = new BigNumber(0);
|
||||||
for (let i = 0; i < data.length; i++) {
|
for (let i = 0; i < data.length; i++) {
|
||||||
devSum += (data[i] - avg) ** 2;
|
devSum = devSum.plus(data[i].minus(avg).pow(2));
|
||||||
}
|
}
|
||||||
return Math.sqrt(devSum / data.length);
|
return devSum.div(data.length).sqrt();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import Utils from "../Utils.js";
|
import Utils from "../Utils.js";
|
||||||
|
import BigNumber from "bignumber.js";
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -61,14 +62,14 @@ const BCD = {
|
|||||||
/**
|
/**
|
||||||
* To BCD operation.
|
* To BCD operation.
|
||||||
*
|
*
|
||||||
* @param {number} input
|
* @param {BigNumber} input
|
||||||
* @param {Object[]} args
|
* @param {Object[]} args
|
||||||
* @returns {string}
|
* @returns {string}
|
||||||
*/
|
*/
|
||||||
runToBCD: function(input, args) {
|
runToBCD: function(input, args) {
|
||||||
if (isNaN(input))
|
if (input.isNaN())
|
||||||
return "Invalid input";
|
return "Invalid input";
|
||||||
if (Math.floor(input) !== input)
|
if (!input.floor().equals(input))
|
||||||
return "Fractional values are not supported by BCD";
|
return "Fractional values are not supported by BCD";
|
||||||
|
|
||||||
const encoding = BCD.ENCODING_LOOKUP[args[0]],
|
const encoding = BCD.ENCODING_LOOKUP[args[0]],
|
||||||
@ -77,7 +78,7 @@ const BCD = {
|
|||||||
outputFormat = args[3];
|
outputFormat = args[3];
|
||||||
|
|
||||||
// Split input number up into separate digits
|
// Split input number up into separate digits
|
||||||
const digits = input.toString().split("");
|
const digits = input.toFixed().split("");
|
||||||
|
|
||||||
if (digits[0] === "-" || digits[0] === "+") {
|
if (digits[0] === "-" || digits[0] === "+") {
|
||||||
digits.shift();
|
digits.shift();
|
||||||
@ -152,7 +153,7 @@ const BCD = {
|
|||||||
*
|
*
|
||||||
* @param {string} input
|
* @param {string} input
|
||||||
* @param {Object[]} args
|
* @param {Object[]} args
|
||||||
* @returns {number}
|
* @returns {BigNumber}
|
||||||
*/
|
*/
|
||||||
runFromBCD: function(input, args) {
|
runFromBCD: function(input, args) {
|
||||||
const encoding = BCD.ENCODING_LOOKUP[args[0]],
|
const encoding = BCD.ENCODING_LOOKUP[args[0]],
|
||||||
@ -206,7 +207,7 @@ const BCD = {
|
|||||||
output += val.toString();
|
output += val.toString();
|
||||||
});
|
});
|
||||||
|
|
||||||
return parseInt(output, 10);
|
return new BigNumber(output);
|
||||||
},
|
},
|
||||||
|
|
||||||
};
|
};
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
import BigNumber from "bignumber.js";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Numerical base operations.
|
* Numerical base operations.
|
||||||
*
|
*
|
||||||
@ -18,7 +20,7 @@ const Base = {
|
|||||||
/**
|
/**
|
||||||
* To Base operation.
|
* To Base operation.
|
||||||
*
|
*
|
||||||
* @param {number} input
|
* @param {BigNumber} input
|
||||||
* @param {Object[]} args
|
* @param {Object[]} args
|
||||||
* @returns {string}
|
* @returns {string}
|
||||||
*/
|
*/
|
||||||
@ -39,7 +41,7 @@ const Base = {
|
|||||||
*
|
*
|
||||||
* @param {string} input
|
* @param {string} input
|
||||||
* @param {Object[]} args
|
* @param {Object[]} args
|
||||||
* @returns {number}
|
* @returns {BigNumber}
|
||||||
*/
|
*/
|
||||||
runFrom: function(input, args) {
|
runFrom: function(input, args) {
|
||||||
const radix = args[0] || Base.DEFAULT_RADIX;
|
const radix = args[0] || Base.DEFAULT_RADIX;
|
||||||
@ -48,14 +50,14 @@ const Base = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let number = input.replace(/\s/g, "").split("."),
|
let number = input.replace(/\s/g, "").split("."),
|
||||||
result = parseInt(number[0], radix) || 0;
|
result = new BigNumber(number[0], radix) || 0;
|
||||||
|
|
||||||
if (number.length === 1) return result;
|
if (number.length === 1) return result;
|
||||||
|
|
||||||
// Fractional part
|
// Fractional part
|
||||||
for (let i = 0; i < number[1].length; i++) {
|
for (let i = 0; i < number[1].length; i++) {
|
||||||
const digit = parseInt(number[1][i], radix);
|
const digit = new BigNumber(number[1][i], radix);
|
||||||
result += digit / Math.pow(radix, i+1);
|
result += digit.div(Math.pow(radix, i+1));
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
@ -2,6 +2,7 @@ import Utils from "../Utils.js";
|
|||||||
import CryptoJS from "crypto-js";
|
import CryptoJS from "crypto-js";
|
||||||
import forge from "imports-loader?jQuery=>null!node-forge/dist/forge.min.js";
|
import forge from "imports-loader?jQuery=>null!node-forge/dist/forge.min.js";
|
||||||
import {blowfish as Blowfish} from "sladex-blowfish";
|
import {blowfish as Blowfish} from "sladex-blowfish";
|
||||||
|
import BigNumber from "bignumber.js";
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -520,7 +521,11 @@ DES uses a key length of 8 bytes (64 bits).`;
|
|||||||
* @default
|
* @default
|
||||||
*/
|
*/
|
||||||
PRNG_BYTES: 32,
|
PRNG_BYTES: 32,
|
||||||
PRNG_OUTPUT: ["Hex", "Number", "Byte array", "Raw"],
|
/**
|
||||||
|
* @constant
|
||||||
|
* @default
|
||||||
|
*/
|
||||||
|
PRNG_OUTPUT: ["Hex", "Integer", "Byte array", "Raw"],
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Pseudo-Random Number Generator operation.
|
* Pseudo-Random Number Generator operation.
|
||||||
@ -542,17 +547,17 @@ DES uses a key length of 8 bytes (64 bits).`;
|
|||||||
bytes = forge.random.getBytesSync(numBytes);
|
bytes = forge.random.getBytesSync(numBytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
let value = 0,
|
let value = new BigNumber(0),
|
||||||
i;
|
i;
|
||||||
|
|
||||||
switch (outputAs) {
|
switch (outputAs) {
|
||||||
case "Hex":
|
case "Hex":
|
||||||
return forge.util.bytesToHex(bytes);
|
return forge.util.bytesToHex(bytes);
|
||||||
case "Number":
|
case "Integer":
|
||||||
for (i = bytes.length - 1; i >= 0; i--) {
|
for (i = bytes.length - 1; i >= 0; i--) {
|
||||||
value = (value * 256) + bytes.charCodeAt(i);
|
value = value.mul(256).plus(bytes.charCodeAt(i));
|
||||||
}
|
}
|
||||||
return value.toString();
|
return value.toFixed();
|
||||||
case "Byte array":
|
case "Byte array":
|
||||||
return JSON.stringify(Utils.strToCharcode(bytes));
|
return JSON.stringify(Utils.strToCharcode(bytes));
|
||||||
case "Raw":
|
case "Raw":
|
||||||
|
@ -60,17 +60,16 @@ const Convert = {
|
|||||||
/**
|
/**
|
||||||
* Convert distance operation.
|
* Convert distance operation.
|
||||||
*
|
*
|
||||||
* @param {number} input
|
* @param {BigNumber} input
|
||||||
* @param {Object[]} args
|
* @param {Object[]} args
|
||||||
* @returns {number}
|
* @returns {BigNumber}
|
||||||
*/
|
*/
|
||||||
runDistance: function (input, args) {
|
runDistance: function (input, args) {
|
||||||
let inputUnits = args[0],
|
let inputUnits = args[0],
|
||||||
outputUnits = args[1];
|
outputUnits = args[1];
|
||||||
|
|
||||||
input = input * Convert.DISTANCE_FACTOR[inputUnits];
|
input = input.mul(Convert.DISTANCE_FACTOR[inputUnits]);
|
||||||
return input / Convert.DISTANCE_FACTOR[outputUnits];
|
return input.div(Convert.DISTANCE_FACTOR[outputUnits]);
|
||||||
// TODO Remove rounding errors (e.g. 1.000000000001)
|
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
@ -141,16 +140,16 @@ const Convert = {
|
|||||||
/**
|
/**
|
||||||
* Convert data units operation.
|
* Convert data units operation.
|
||||||
*
|
*
|
||||||
* @param {number} input
|
* @param {BigNumber} input
|
||||||
* @param {Object[]} args
|
* @param {Object[]} args
|
||||||
* @returns {number}
|
* @returns {BigNumber}
|
||||||
*/
|
*/
|
||||||
runDataSize: function (input, args) {
|
runDataSize: function (input, args) {
|
||||||
let inputUnits = args[0],
|
let inputUnits = args[0],
|
||||||
outputUnits = args[1];
|
outputUnits = args[1];
|
||||||
|
|
||||||
input = input * Convert.DATA_FACTOR[inputUnits];
|
input = input.mul(Convert.DATA_FACTOR[inputUnits]);
|
||||||
return input / Convert.DATA_FACTOR[outputUnits];
|
return input.div(Convert.DATA_FACTOR[outputUnits]);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
@ -221,16 +220,16 @@ const Convert = {
|
|||||||
/**
|
/**
|
||||||
* Convert area operation.
|
* Convert area operation.
|
||||||
*
|
*
|
||||||
* @param {number} input
|
* @param {BigNumber} input
|
||||||
* @param {Object[]} args
|
* @param {Object[]} args
|
||||||
* @returns {number}
|
* @returns {BigNumber}
|
||||||
*/
|
*/
|
||||||
runArea: function (input, args) {
|
runArea: function (input, args) {
|
||||||
let inputUnits = args[0],
|
let inputUnits = args[0],
|
||||||
outputUnits = args[1];
|
outputUnits = args[1];
|
||||||
|
|
||||||
input = input * Convert.AREA_FACTOR[inputUnits];
|
input = input.mul(Convert.AREA_FACTOR[inputUnits]);
|
||||||
return input / Convert.AREA_FACTOR[outputUnits];
|
return input.div(Convert.AREA_FACTOR[outputUnits]);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
@ -332,16 +331,16 @@ const Convert = {
|
|||||||
/**
|
/**
|
||||||
* Convert mass operation.
|
* Convert mass operation.
|
||||||
*
|
*
|
||||||
* @param {number} input
|
* @param {BigNumber} input
|
||||||
* @param {Object[]} args
|
* @param {Object[]} args
|
||||||
* @returns {number}
|
* @returns {BigNumber}
|
||||||
*/
|
*/
|
||||||
runMass: function (input, args) {
|
runMass: function (input, args) {
|
||||||
let inputUnits = args[0],
|
let inputUnits = args[0],
|
||||||
outputUnits = args[1];
|
outputUnits = args[1];
|
||||||
|
|
||||||
input = input * Convert.MASS_FACTOR[inputUnits];
|
input = input.mul(Convert.MASS_FACTOR[inputUnits]);
|
||||||
return input / Convert.MASS_FACTOR[outputUnits];
|
return input.div(Convert.MASS_FACTOR[outputUnits]);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
@ -397,16 +396,16 @@ const Convert = {
|
|||||||
/**
|
/**
|
||||||
* Convert speed operation.
|
* Convert speed operation.
|
||||||
*
|
*
|
||||||
* @param {number} input
|
* @param {BigNumber} input
|
||||||
* @param {Object[]} args
|
* @param {Object[]} args
|
||||||
* @returns {number}
|
* @returns {BigNumber}
|
||||||
*/
|
*/
|
||||||
runSpeed: function (input, args) {
|
runSpeed: function (input, args) {
|
||||||
let inputUnits = args[0],
|
let inputUnits = args[0],
|
||||||
outputUnits = args[1];
|
outputUnits = args[1];
|
||||||
|
|
||||||
input = input * Convert.SPEED_FACTOR[inputUnits];
|
input = input.mul(Convert.SPEED_FACTOR[inputUnits]);
|
||||||
return input / Convert.SPEED_FACTOR[outputUnits];
|
return input.div(Convert.SPEED_FACTOR[outputUnits]);
|
||||||
},
|
},
|
||||||
|
|
||||||
};
|
};
|
||||||
|
@ -329,6 +329,75 @@ const StrUtils = {
|
|||||||
})
|
})
|
||||||
.join(delimiter);
|
.join(delimiter);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @constant
|
||||||
|
* @default
|
||||||
|
*/
|
||||||
|
HAMMING_DELIM: "\\n\\n",
|
||||||
|
/**
|
||||||
|
* @constant
|
||||||
|
* @default
|
||||||
|
*/
|
||||||
|
HAMMING_INPUT_TYPE: ["Raw string", "Hex"],
|
||||||
|
/**
|
||||||
|
* @constant
|
||||||
|
* @default
|
||||||
|
*/
|
||||||
|
HAMMING_UNIT: ["Byte", "Bit"],
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Hamming Distance operation.
|
||||||
|
*
|
||||||
|
* @author GCHQ Contributor [2]
|
||||||
|
*
|
||||||
|
* @param {string} input
|
||||||
|
* @param {Object[]} args
|
||||||
|
* @returns {string}
|
||||||
|
*/
|
||||||
|
runHamming: function(input, args) {
|
||||||
|
const delim = args[0],
|
||||||
|
byByte = args[1] === "Byte",
|
||||||
|
inputType = args[2],
|
||||||
|
samples = input.split(delim);
|
||||||
|
|
||||||
|
if (samples.length !== 2) {
|
||||||
|
return "Error: You can only calculae the edit distance between 2 strings. Please ensure exactly two inputs are provided, separated by the specified delimiter.";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (samples[0].length !== samples[1].length) {
|
||||||
|
return "Error: Both inputs must be of the same length.";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (inputType === "Hex") {
|
||||||
|
samples[0] = Utils.fromHex(samples[0]);
|
||||||
|
samples[1] = Utils.fromHex(samples[1]);
|
||||||
|
} else {
|
||||||
|
samples[0] = Utils.strToByteArray(samples[0]);
|
||||||
|
samples[1] = Utils.strToByteArray(samples[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
let dist = 0;
|
||||||
|
|
||||||
|
for (let i = 0; i < samples[0].length; i++) {
|
||||||
|
const lhs = samples[0][i],
|
||||||
|
rhs = samples[1][i];
|
||||||
|
|
||||||
|
if (byByte && lhs !== rhs) {
|
||||||
|
dist++;
|
||||||
|
} else if (!byByte) {
|
||||||
|
let xord = lhs ^ rhs;
|
||||||
|
|
||||||
|
while (xord) {
|
||||||
|
dist++;
|
||||||
|
xord &= xord - 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return dist.toString();
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
export default StrUtils;
|
export default StrUtils;
|
||||||
|
@ -61,9 +61,13 @@ InputWaiter.prototype.set = function(input) {
|
|||||||
if (input instanceof File) {
|
if (input instanceof File) {
|
||||||
this.setFile(input);
|
this.setFile(input);
|
||||||
inputText.value = "";
|
inputText.value = "";
|
||||||
|
this.setInputInfo(input.size, null);
|
||||||
} else {
|
} else {
|
||||||
inputText.value = input;
|
inputText.value = input;
|
||||||
window.dispatchEvent(this.manager.statechange);
|
window.dispatchEvent(this.manager.statechange);
|
||||||
|
const lines = input.length < (this.app.options.ioDisplayThreshold * 1024) ?
|
||||||
|
input.count("\n") + 1 : null;
|
||||||
|
this.setInputInfo(input.length, lines);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -81,6 +85,7 @@ InputWaiter.prototype.setFile = function(file) {
|
|||||||
fileType = document.getElementById("input-file-type"),
|
fileType = document.getElementById("input-file-type"),
|
||||||
fileLoaded = document.getElementById("input-file-loaded");
|
fileLoaded = document.getElementById("input-file-loaded");
|
||||||
|
|
||||||
|
this.fileBuffer = new ArrayBuffer();
|
||||||
fileOverlay.style.display = "block";
|
fileOverlay.style.display = "block";
|
||||||
fileName.textContent = file.name;
|
fileName.textContent = file.name;
|
||||||
fileSize.textContent = file.size.toLocaleString() + " bytes";
|
fileSize.textContent = file.size.toLocaleString() + " bytes";
|
||||||
@ -100,21 +105,28 @@ InputWaiter.prototype.setInputInfo = function(length, lines) {
|
|||||||
width = width < 2 ? 2 : width;
|
width = width < 2 ? 2 : width;
|
||||||
|
|
||||||
const lengthStr = length.toString().padStart(width, " ").replace(/ /g, " ");
|
const lengthStr = length.toString().padStart(width, " ").replace(/ /g, " ");
|
||||||
const linesStr = lines.toString().padStart(width, " ").replace(/ /g, " ");
|
let msg = "length: " + lengthStr;
|
||||||
|
|
||||||
document.getElementById("input-info").innerHTML = "length: " + lengthStr + "<br>lines: " + linesStr;
|
if (typeof lines === "number") {
|
||||||
|
const linesStr = lines.toString().padStart(width, " ").replace(/ /g, " ");
|
||||||
|
msg += "<br>lines: " + linesStr;
|
||||||
|
}
|
||||||
|
|
||||||
|
document.getElementById("input-info").innerHTML = msg;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handler for input scroll events.
|
* Handler for input change events.
|
||||||
* Scrolls the highlighter pane to match the input textarea position and updates history state.
|
|
||||||
*
|
*
|
||||||
* @param {event} e
|
* @param {event} e
|
||||||
*
|
*
|
||||||
* @fires Manager#statechange
|
* @fires Manager#statechange
|
||||||
*/
|
*/
|
||||||
InputWaiter.prototype.inputChange = function(e) {
|
InputWaiter.prototype.inputChange = function(e) {
|
||||||
|
// Ignore this function if the input is a File
|
||||||
|
if (this.fileBuffer) return;
|
||||||
|
|
||||||
// Remove highlighting from input and output panes as the offsets might be different now
|
// Remove highlighting from input and output panes as the offsets might be different now
|
||||||
this.manager.highlighter.removeHighlights();
|
this.manager.highlighter.removeHighlights();
|
||||||
|
|
||||||
@ -123,18 +135,47 @@ InputWaiter.prototype.inputChange = function(e) {
|
|||||||
|
|
||||||
// Update the input metadata info
|
// Update the input metadata info
|
||||||
const inputText = this.get();
|
const inputText = this.get();
|
||||||
const lines = inputText.count("\n") + 1;
|
const lines = inputText.length < (this.app.options.ioDisplayThreshold * 1024) ?
|
||||||
|
inputText.count("\n") + 1 : null;
|
||||||
|
|
||||||
this.setInputInfo(inputText.length, lines);
|
this.setInputInfo(inputText.length, lines);
|
||||||
|
|
||||||
|
if (e && this.badKeys.indexOf(e.keyCode) < 0) {
|
||||||
if (this.badKeys.indexOf(e.keyCode) < 0) {
|
|
||||||
// Fire the statechange event as the input has been modified
|
// Fire the statechange event as the input has been modified
|
||||||
window.dispatchEvent(this.manager.statechange);
|
window.dispatchEvent(this.manager.statechange);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handler for input paste events.
|
||||||
|
* Checks that the size of the input is below the display limit, otherwise treats it as a file/blob.
|
||||||
|
*
|
||||||
|
* @param {event} e
|
||||||
|
*/
|
||||||
|
InputWaiter.prototype.inputPaste = function(e) {
|
||||||
|
const pastedData = e.clipboardData.getData("Text");
|
||||||
|
|
||||||
|
if (pastedData.length < (this.app.options.ioDisplayThreshold * 1024)) {
|
||||||
|
this.inputChange(e);
|
||||||
|
} else {
|
||||||
|
e.preventDefault();
|
||||||
|
e.stopPropagation();
|
||||||
|
|
||||||
|
const file = new File([pastedData], "PastedData", {
|
||||||
|
type: "text/plain",
|
||||||
|
lastModified: Date.now()
|
||||||
|
});
|
||||||
|
|
||||||
|
this.loaderWorker = new LoaderWorker();
|
||||||
|
this.loaderWorker.addEventListener("message", this.handleLoaderMessage.bind(this));
|
||||||
|
this.loaderWorker.postMessage({"file": file});
|
||||||
|
this.set(file);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handler for input dragover events.
|
* Handler for input dragover events.
|
||||||
* Gives the user a visual cue to show that items can be dropped here.
|
* Gives the user a visual cue to show that items can be dropped here.
|
||||||
@ -214,6 +255,10 @@ InputWaiter.prototype.handleLoaderMessage = function(e) {
|
|||||||
fileLoaded.textContent = r.progress + "%";
|
fileLoaded.textContent = r.progress + "%";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (r.hasOwnProperty("error")) {
|
||||||
|
this.app.alert(r.error, "danger", 10000);
|
||||||
|
}
|
||||||
|
|
||||||
if (r.hasOwnProperty("fileBuffer")) {
|
if (r.hasOwnProperty("fileBuffer")) {
|
||||||
log.debug("Input file loaded");
|
log.debug("Input file loaded");
|
||||||
this.fileBuffer = r.fileBuffer;
|
this.fileBuffer = r.fileBuffer;
|
||||||
|
@ -46,5 +46,9 @@ self.loadFile = function(file) {
|
|||||||
seek();
|
seek();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
reader.onerror = function(e) {
|
||||||
|
self.postMessage({"error": file.error.message});
|
||||||
|
};
|
||||||
|
|
||||||
seek();
|
seek();
|
||||||
};
|
};
|
||||||
|
@ -132,7 +132,8 @@ Manager.prototype.initialiseEventListeners = function() {
|
|||||||
this.addDynamicListener("#rec-list", "operationremove", this.recipe.opRemove.bind(this.recipe));
|
this.addDynamicListener("#rec-list", "operationremove", this.recipe.opRemove.bind(this.recipe));
|
||||||
|
|
||||||
// Input
|
// Input
|
||||||
this.addMultiEventListener("#input-text", "keyup paste", this.input.inputChange, this.input);
|
this.addMultiEventListener("#input-text", "keyup", this.input.inputChange, this.input);
|
||||||
|
this.addMultiEventListener("#input-text", "paste", this.input.inputPaste, this.input);
|
||||||
document.getElementById("reset-layout").addEventListener("click", this.app.resetLayout.bind(this.app));
|
document.getElementById("reset-layout").addEventListener("click", this.app.resetLayout.bind(this.app));
|
||||||
document.getElementById("clr-io").addEventListener("click", this.input.clearIoClick.bind(this.input));
|
document.getElementById("clr-io").addEventListener("click", this.input.clearIoClick.bind(this.input));
|
||||||
this.addListeners("#input-text,#input-file", "dragover", this.input.inputDragover, this.input);
|
this.addListeners("#input-text,#input-file", "dragover", this.input.inputDragover, this.input);
|
||||||
|
@ -59,6 +59,9 @@
|
|||||||
"for i in range(additional): Pylon()",
|
"for i in range(additional): Pylon()",
|
||||||
"(creating unresolved tension...",
|
"(creating unresolved tension...",
|
||||||
"Symlinking emacs and vim to ed...",
|
"Symlinking emacs and vim to ed...",
|
||||||
|
"Training branch predictor...",
|
||||||
|
"Timing cache hits...",
|
||||||
|
"Speculatively executing recipes..."
|
||||||
];
|
];
|
||||||
|
|
||||||
// Shuffle array using Durstenfeld algorithm
|
// Shuffle array using Durstenfeld algorithm
|
||||||
@ -115,7 +118,7 @@
|
|||||||
<span id="notice">
|
<span id="notice">
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
// Must be text/javascript rather than application/javascript otherwise IE won't recognise it...
|
// Must be text/javascript rather than application/javascript otherwise IE won't recognise it...
|
||||||
if (navigator.userAgent && navigator.userAgent.match(/MSIE \d\d?\./)) {
|
if (navigator.userAgent && navigator.userAgent.match(/Trident/)) {
|
||||||
document.write("Internet Explorer is not supported, please use Firefox or Chrome instead");
|
document.write("Internet Explorer is not supported, please use Firefox or Chrome instead");
|
||||||
alert("Internet Explorer is not supported, please use Firefox or Chrome instead");
|
alert("Internet Explorer is not supported, please use Firefox or Chrome instead");
|
||||||
}
|
}
|
||||||
@ -369,8 +372,8 @@
|
|||||||
<label for="errorTimeout"> Operation error timeout in ms (0 for never)</label>
|
<label for="errorTimeout"> Operation error timeout in ms (0 for never)</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="option-item">
|
<div class="option-item">
|
||||||
<input type="number" option="outputFileThreshold" id="outputFileThreshold" />
|
<input type="number" option="ioDisplayThreshold" id="ioDisplayThreshold" />
|
||||||
<label for="outputFileThreshold"> Size threshold for treating the output as a file (KiB)</label>
|
<label for="ioDisplayThreshold"> Size threshold for treating the input and output as a file (KiB)</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="option-item">
|
<div class="option-item">
|
||||||
<select option="logLevel" id="logLevel">
|
<select option="logLevel" id="logLevel">
|
||||||
|
@ -47,7 +47,7 @@ function main() {
|
|||||||
attemptHighlight: true,
|
attemptHighlight: true,
|
||||||
theme: "classic",
|
theme: "classic",
|
||||||
useMetaKey: false,
|
useMetaKey: false,
|
||||||
outputFileThreshold: 1024,
|
ioDisplayThreshold: 512,
|
||||||
logLevel: "info"
|
logLevel: "info"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -37,7 +37,7 @@ TestRegister.addTests([
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Fork, (expect) Error, Merge",
|
name: "Fork, (expect) Error, Merge",
|
||||||
input: "1\n2\na\n4",
|
input: "1.1\n2.5\na\n3.4",
|
||||||
expectedError: true,
|
expectedError: true,
|
||||||
recipeConfig: [
|
recipeConfig: [
|
||||||
{
|
{
|
||||||
@ -45,8 +45,8 @@ TestRegister.addTests([
|
|||||||
args: ["\n", "\n", false],
|
args: ["\n", "\n", false],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
op: "To Base",
|
op: "Object Identifier to Hex",
|
||||||
args: [16],
|
args: [],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
op: "Merge",
|
op: "Merge",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user