1
0
mirror of synced 2025-01-31 12:03:42 +01:00

Merge remote-tracking branch 'refs/remotes/upstream/master'

This commit is contained in:
Matt C 2017-02-04 00:01:44 +00:00
commit 02fce74a65
83 changed files with 13643 additions and 3229 deletions

1
.gitignore vendored
View File

@ -4,3 +4,4 @@ build/dev
docs/* docs/*
!docs/*.conf.json !docs/*.conf.json
!docs/*.ico !docs/*.ico
.vscode

View File

@ -7,12 +7,12 @@ module.exports = function(grunt) {
// Tasks // Tasks
grunt.registerTask("dev", grunt.registerTask("dev",
"A persistent task which creates a development build whenever source files are modified.", "A persistent task which creates a development build whenever source files are modified.",
["clean:dev", "concat:css", "concat:js", "copy:html_dev", "copy:static_dev", "chmod:build", "watch"]); ["clean:dev", "concat:css", "concat:js", "copy:htmlDev", "copy:staticDev", "chmod:build", "watch"]);
grunt.registerTask("prod", grunt.registerTask("prod",
"Creates a production-ready build. Use the --msg flag to add a compile message.", "Creates a production-ready build. Use the --msg flag to add a compile message.",
["eslint", "exec:stats", "clean", "jsdoc", "concat", "copy:html_dev", "copy:html_prod", "copy:html_inline", ["eslint", "exec:stats", "clean", "jsdoc", "concat", "copy:htmlDev", "copy:htmlProd", "copy:htmlInline",
"copy:static_dev", "copy:static_prod", "cssmin", "uglify:prod", "inline", "htmlmin", "chmod"]); "copy:staticDev", "copy:staticProd", "cssmin", "uglify:prod", "inline", "htmlmin", "chmod"]);
grunt.registerTask("docs", grunt.registerTask("docs",
"Compiles documentation in the /docs directory.", "Compiles documentation in the /docs directory.",
@ -20,15 +20,15 @@ module.exports = function(grunt) {
grunt.registerTask("stats", grunt.registerTask("stats",
"Provides statistics about the code base such as how many lines there are as well as details of file sizes before and after compression.", "Provides statistics about the code base such as how many lines there are as well as details of file sizes before and after compression.",
["concat:js", "uglify:prod", "exec:stats", "exec:repo_size", "exec:display_stats"]); ["concat:js", "uglify:prod", "exec:stats", "exec:repoSize", "exec:displayStats"]);
grunt.registerTask("release", grunt.registerTask("release",
"Prepares and deploys a production version of CyberChef to the gh-pages branch.", "Prepares and deploys a production version of CyberChef to the gh-pages branch.",
["copy:gh_pages", "exec:deploy_gh_pages"]); ["copy:ghPages", "exec:deployGhPages"]);
grunt.registerTask("default", grunt.registerTask("default",
"Lints the code base and shows stats", "Lints the code base and shows stats",
["jshint", "exec:stats", "exec:display_stats"]); ["eslint", "exec:stats", "exec:displayStats"]);
grunt.registerTask("doc", "docs"); grunt.registerTask("doc", "docs");
grunt.registerTask("lint", "eslint"); grunt.registerTask("lint", "eslint");
@ -50,7 +50,7 @@ module.exports = function(grunt) {
// JS includes // JS includes
var js_files = [ var jsFiles = [
// Third party framework libraries // Third party framework libraries
"src/js/lib/jquery-2.1.1.js", "src/js/lib/jquery-2.1.1.js",
"src/js/lib/bootstrap-3.3.6.js", "src/js/lib/bootstrap-3.3.6.js",
@ -93,6 +93,10 @@ module.exports = function(grunt) {
"src/js/lib/cryptojs/tripledes.js", "src/js/lib/cryptojs/tripledes.js",
"src/js/lib/cryptojs/rc4.js", "src/js/lib/cryptojs/rc4.js",
"src/js/lib/cryptojs/pbkdf2.js", "src/js/lib/cryptojs/pbkdf2.js",
"src/js/lib/cryptoapi/crypto-api.js",
"src/js/lib/cryptoapi/hasher.md2.js",
"src/js/lib/cryptoapi/hasher.md4.js",
"src/js/lib/cryptoapi/hasher.sha0.js",
"src/js/lib/jsbn/jsbn.js", "src/js/lib/jsbn/jsbn.js",
"src/js/lib/jsbn/jsbn2.js", "src/js/lib/jsbn/jsbn2.js",
"src/js/lib/jsbn/base64.js", "src/js/lib/jsbn/base64.js",
@ -130,7 +134,8 @@ module.exports = function(grunt) {
"src/js/lib/vkbeautify.js", "src/js/lib/vkbeautify.js",
"src/js/lib/Sortable.js", "src/js/lib/Sortable.js",
"src/js/lib/bootstrap-colorpicker.js", "src/js/lib/bootstrap-colorpicker.js",
"src/js/lib/xpath.js",
// Custom libraries // Custom libraries
"src/js/lib/canvas_components.js", "src/js/lib/canvas_components.js",
@ -174,10 +179,10 @@ module.exports = function(grunt) {
* limitations under the License.\n\ * limitations under the License.\n\
*/\n'; */\n';
var template_options = { var templateOptions = {
data: { data: {
compile_msg: grunt.option("compile-msg") || grunt.option("msg") || "", compileMsg: grunt.option("compile-msg") || grunt.option("msg") || "",
codebase_stats: grunt.file.read("src/static/stats.txt").split("\n").join("<br>") codebaseStats: grunt.file.read("src/static/stats.txt").split("\n").join("<br>")
} }
}; };
@ -215,7 +220,7 @@ module.exports = function(grunt) {
}, },
concat: { concat: {
options: { options: {
process: template_options process: templateOptions
}, },
css: { css: {
options: { options: {
@ -237,43 +242,43 @@ module.exports = function(grunt) {
options: { options: {
banner: '"use strict";\n' banner: '"use strict";\n'
}, },
src: js_files, src: jsFiles,
dest: "build/dev/scripts.js" dest: "build/dev/scripts.js"
} }
}, },
copy: { copy: {
html_dev: { htmlDev: {
options: { options: {
process: function(content, srcpath) { process: function(content, srcpath) {
return grunt.template.process(content, template_options); return grunt.template.process(content, templateOptions);
} }
}, },
src: "src/html/index.html", src: "src/html/index.html",
dest: "build/dev/index.html" dest: "build/dev/index.html"
}, },
html_prod: { htmlProd: {
options: { options: {
process: function(content, srcpath) { process: function(content, srcpath) {
return grunt.template.process(content, template_options); return grunt.template.process(content, templateOptions);
} }
}, },
src: "src/html/index.html", src: "src/html/index.html",
dest: "build/prod/index.html" dest: "build/prod/index.html"
}, },
html_inline: { htmlInline: {
options: { options: {
process: function(content, srcpath) { process: function(content, srcpath) {
// TODO: Do all this in Jade // TODO: Do all this in Jade
content = content.replace( content = content.replace(
'<a href="cyberchef.htm" style="float: left; margin-left: 10px; margin-right: 80px;" download>Download CyberChef<img src="images/download-24x24.png" /></a>', '<a href="cyberchef.htm" style="float: left; margin-left: 10px; margin-right: 80px;" download>Download CyberChef<img src="images/download-24x24.png" /></a>',
'<span style="float: left; margin-left: 10px;">Compile time: ' + grunt.template.today("dd/mm/yyyy HH:MM:ss") + " UTC</span>"); '<span style="float: left; margin-left: 10px;">Compile time: ' + grunt.template.today("dd/mm/yyyy HH:MM:ss") + " UTC</span>");
return grunt.template.process(content, template_options); return grunt.template.process(content, templateOptions);
} }
}, },
src: "src/html/index.html", src: "src/html/index.html",
dest: "build/prod/cyberchef.htm" dest: "build/prod/cyberchef.htm"
}, },
static_dev: { staticDev: {
files: [ files: [
{ {
expand: true, expand: true,
@ -288,7 +293,7 @@ module.exports = function(grunt) {
} }
] ]
}, },
static_prod: { staticProd: {
files: [ files: [
{ {
expand: true, expand: true,
@ -303,13 +308,13 @@ module.exports = function(grunt) {
} }
] ]
}, },
gh_pages: { ghPages: {
options: { options: {
process: function(content, srcpath) { process: function(content, srcpath) {
// Add Google Analytics code to index.html // Add Google Analytics code to index.html
content = content.replace("</body></html>", content = content.replace("</body></html>",
grunt.file.read("src/static/ga.html") + "</body></html>"); grunt.file.read("src/static/ga.html") + "</body></html>");
return grunt.template.process(content, template_options); return grunt.template.process(content, templateOptions);
} }
}, },
src: "build/prod/index.html", src: "build/prod/index.html",
@ -326,12 +331,12 @@ module.exports = function(grunt) {
ASCIIOnly: true, ASCIIOnly: true,
beautify: { beautify: {
beautify: false, beautify: false,
inline_script: true, inline_script: true, // eslint-disable-line camelcase
ascii_only: true, ascii_only: true, // eslint-disable-line camelcase
screw_ie8: true screw_ie8: true // eslint-disable-line camelcase
}, },
compress: { compress: {
screw_ie8: true screw_ie8: true // eslint-disable-line camelcase
}, },
banner: banner banner: banner
}, },
@ -403,7 +408,7 @@ module.exports = function(grunt) {
} }
}, },
exec: { exec: {
repo_size: { repoSize: {
command: [ command: [
"git ls-files | wc -l | xargs printf '\n%b\ttracked files\n'", "git ls-files | wc -l | xargs printf '\n%b\ttracked files\n'",
"du -hs | egrep -o '^[^\t]*' | xargs printf '%b\trepository size\n'" "du -hs | egrep -o '^[^\t]*' | xargs printf '%b\trepository size\n'"
@ -438,13 +443,13 @@ module.exports = function(grunt) {
].join(" >> src/static/stats.txt;") + " >> src/static/stats.txt;", ].join(" >> src/static/stats.txt;") + " >> src/static/stats.txt;",
stderr: false stderr: false
}, },
display_stats: { displayStats: {
command: "cat src/static/stats.txt" command: "cat src/static/stats.txt"
}, },
clean_git: { cleanGit: {
command: "git gc --prune=now --aggressive" command: "git gc --prune=now --aggressive"
}, },
deploy_gh_pages: { deployGhPages: {
command: [ command: [
"git add build/prod/index.html -v", "git add build/prod/index.html -v",
"COMMIT_HASH=$(git rev-parse HEAD)", "COMMIT_HASH=$(git rev-parse HEAD)",
@ -466,15 +471,15 @@ module.exports = function(grunt) {
}, },
html: { html: {
files: "src/html/**/*.html", files: "src/html/**/*.html",
tasks: ["copy:html_dev", "chmod:build"] tasks: ["copy:htmlDev", "chmod:build"]
}, },
static: { static: {
files: ["src/static/**/*", "src/static/**/.*"], files: ["src/static/**/*", "src/static/**/.*"],
tasks: ["copy:static_dev", "chmod:build"] tasks: ["copy:staticDev", "chmod:build"]
}, },
grunt: { grunt: {
files: "Gruntfile.js", files: "Gruntfile.js",
tasks: ["clean:dev", "concat:css", "concat:js", "copy:html_dev", "copy:static_dev", "chmod:build"] tasks: ["clean:dev", "concat:css", "concat:js", "copy:htmlDev", "copy:staticDev", "chmod:build"]
} }
}, },
}); });

File diff suppressed because one or more lines are too long

BIN
build/prod/images/fork_me.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 235 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 245 B

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -21,27 +21,24 @@
"format", "format",
"cybersecurity" "cybersecurity"
], ],
"bugs": {
"email": ""
},
"repository": { "repository": {
"type": "git", "type": "git",
"url": "" "url": "https://github.com/gchq/CyberChef/"
}, },
"devDependencies": { "devDependencies": {
"grunt": "~0.4.5", "grunt": "~1.0.1",
"grunt-chmod": "~1.1.1", "grunt-chmod": "~1.1.1",
"grunt-contrib-clean": "~1.0.0", "grunt-contrib-clean": "~1.0.0",
"grunt-contrib-concat": "~1.0.0", "grunt-contrib-concat": "~1.0.0",
"grunt-contrib-copy": "~0.8.2", "grunt-contrib-copy": "~1.0.0",
"grunt-contrib-cssmin": "~0.14.0", "grunt-contrib-cssmin": "~1.0.2",
"grunt-contrib-htmlmin": "~0.6.0", "grunt-contrib-htmlmin": "~2.0.0",
"grunt-contrib-uglify": "~0.11.1", "grunt-contrib-uglify": "~2.0.0",
"grunt-contrib-watch": "~0.6.1", "grunt-contrib-watch": "~1.0.0",
"grunt-eslint": "^19.0.0", "grunt-eslint": "^19.0.0",
"grunt-exec": "~0.4.6", "grunt-exec": "~1.0.1",
"grunt-inline-alt": "~0.3.10", "grunt-inline-alt": "~0.3.10",
"grunt-jsdoc": "^1.1.0", "grunt-jsdoc": "^2.1.0",
"ink-docstrap": "^1.1.4" "ink-docstrap": "^1.1.4"
} }
} }

View File

@ -1,58 +0,0 @@
/** @license
========================================================================
StyleSheet for JQuery splitter Plugin
Copyright (C) 2010 Jakub Jankiewicz <http://jcubic.pl>
Same license as plugin
*/
.splitter_panel {
position: relative;
}
.splitter_panel .vsplitter {
background-color: grey;
cursor: col-resize;
z-index:900;
width: 4px;
}
.splitter_panel .hsplitter {
background-color: #5F5F5F;
cursor: row-resize;
z-index: 800;
height: 4px;
}
.splitter_panel .vsplitter.splitter-invisible,
.splitter_panel .hsplitter.splitter-invisible {
background: none;
}
.splitter_panel .vsplitter, .splitter_panel .left_panel, .splitter_panel .right_panel,
.splitter_panel .hsplitter, .splitter_panel .top_panel, .splitter_panel .bottom_panel {
position: absolute;
overflow: auto;
}
.splitter_panel .vsplitter, .splitter_panel .left_panel, .splitter_panel .right_panel {
height: 100%;
}
.splitter_panel .hsplitter, .splitter_panel .top_panel, .splitter_panel .bottom_panel {
width: 100%;
}
.splitter_panel .top_panel, .splitter_panel .left_panel, .splitter_panel .vsplitter {
top: 0;
}
.splitter_panel .top_panel, .splitter_panel .bottom_panel, .splitter_panel .left_panel, .splitter_panel .hsplitter {
left: 0;
}
.splitter_panel .bottom_panel {
bottom: 0;
}
.splitter_panel .right_panel {
right: 0;
}
.splitterMask {
position: absolute;
left: 0;
top: 0;
right: 0;
bottom: 0;
z-index: 1000;
}

View File

@ -105,8 +105,8 @@ textarea,
border: none; border: none;
} }
#op_list, #op-list,
#rec_list { #rec-list {
position: absolute; position: absolute;
top: 43px; top: 43px;
bottom: 0; bottom: 0;
@ -116,13 +116,13 @@ textarea,
padding: 0; padding: 0;
} }
.op_list { .op-list {
list-style-type: none; list-style-type: none;
margin: 0; margin: 0;
padding: 0; padding: 0;
} }
#rec_list { #rec-list {
bottom: 120px; /* Linked to #controls height */ bottom: 120px; /* Linked to #controls height */
overflow: auto; overflow: auto;
} }
@ -137,7 +137,7 @@ textarea,
#controls { #controls {
position: absolute; position: absolute;
width: 100%; width: 100%;
height: 120px; /* Linked to #rec_list bottom */ height: 120px; /* Linked to #rec-list bottom */
bottom: 0; bottom: 0;
padding: 10px; padding: 10px;
} }

View File

@ -64,6 +64,10 @@ blockquote {
font-size: inherit; font-size: inherit;
} }
blockquote a {
cursor: pointer;
}
optgroup { optgroup {
font-weight: bold; font-weight: bold;
} }

View File

@ -30,13 +30,13 @@
border-top-width: 0; border-top-width: 0;
} }
.op_list .operation { /*blue*/ .op-list .operation { /*blue*/
color: #3a87ad; color: #3a87ad;
background-color: #d9edf7; background-color: #d9edf7;
border-color: #bce8f1; border-color: #bce8f1;
} }
#rec_list .operation { /*green*/ #rec-list .operation { /*green*/
color: #468847; color: #468847;
background-color: #dff0d8; background-color: #dff0d8;
border-color: #d6e9c6; border-color: #d6e9c6;

View File

@ -58,13 +58,13 @@
<div id="operations" class="split split-horizontal no-select"> <div id="operations" class="split split-horizontal no-select">
<div class="title no-select">Operations</div> <div class="title no-select">Operations</div>
<input type="search" class="form-control" id="search" placeholder="Search..." autocomplete="off"> <input type="search" class="form-control" id="search" placeholder="Search..." autocomplete="off">
<ul class="op_list" id="search-results"></ul> <ul class="op-list" id="search-results"></ul>
<div class="panel-group no-select" id="categories"></div> <div class="panel-group no-select" id="categories"></div>
</div> </div>
<div id="recipe" class="split split-horizontal no-select"> <div id="recipe" class="split split-horizontal no-select">
<div class="title no-select">Recipe</div> <div class="title no-select">Recipe</div>
<ul id="rec_list" class="no-select"></ul> <ul id="rec-list" class="no-select"></ul>
<div id="controls" class="no-select"> <div id="controls" class="no-select">
<div id="operational-controls"> <div id="operational-controls">
@ -114,9 +114,10 @@
<div class="title no-select"> <div class="title no-select">
Output Output
<div class="btn-group io-btn-group"> <div class="btn-group io-btn-group">
<button type="button" class="btn btn-default btn-sm" id="save-to-file"><img src="images/save_as-16x16.png" /> Save to file</button> <button type="button" class="btn btn-default btn-sm" id="save-to-file" title="Save to file"><img src="images/save_as-16x16.png" /> Save to file</button>
<button type="button" class="btn btn-default btn-sm" id="switch"><img src="images/switch-16x16.png" /> Move output to input</button> <button type="button" class="btn btn-default btn-sm" id="switch" title="Move output to input"><img src="images/switch-16x16.png" /> Move output to input</button>
<button type="button" class="btn btn-default btn-sm" id="undo-switch" disabled="disabled"><img src="images/undo-16x16.png" /> Undo</button> <button type="button" class="btn btn-default btn-sm" id="undo-switch" title="Undo move" disabled="disabled"><img src="images/undo-16x16.png" /> Undo</button>
<button type="button" class="btn btn-default btn-sm" id="maximise-output" title="Maximise"><img src="images/maximise-16x16.png" /> Max</button>
</div> </div>
<div class="io-info" id="output-info"></div> <div class="io-info" id="output-info"></div>
<div class="io-info" id="output-selection-info"></div> <div class="io-info" id="output-selection-info"></div>
@ -251,7 +252,7 @@
<li><span style="font-weight: bold">To remove:</span> hit the red cross or drag out of the list below</li> <li><span style="font-weight: bold">To remove:</span> hit the red cross or drag out of the list below</li>
</ul> </ul>
<br> <br>
<ul id="edit-favourites-list" class="op_list"></ul> <ul id="edit-favourites-list" class="op-list"></ul>
<div class="option-item"> <div class="option-item">
</div> </div>
</div> </div>
@ -335,7 +336,7 @@
<div role='tabpanel' class='tab-pane' id='stats'> <div role='tabpanel' class='tab-pane' id='stats'>
<br> <br>
<p>If you're a nerd like me, you might find statistics really fun! Here's some about the CyberChef code base:</p> <p>If you're a nerd like me, you might find statistics really fun! Here's some about the CyberChef code base:</p>
<br><pre><%= codebase_stats %></pre> <br><pre><%= codebaseStats %></pre>
</div> </div>
<div role='tabpanel' class='tab-pane' id='about' style="padding: 20px;"> <div role='tabpanel' class='tab-pane' id='about' style="padding: 20px;">
<h4>What</h4> <h4>What</h4>
@ -364,6 +365,9 @@
<div class="modal-footer"> <div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button> <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
</div> </div>
<a href="https://github.com/gchq/CyberChef">
<img style="position: absolute; top: 0; right: 0; border: 0;" src="images/fork_me.png" alt="Fork me on GitHub">
</a>
</div> </div>
</div> </div>
</div> </div>

View File

@ -58,6 +58,9 @@
"quotes": ["error", "double", { "quotes": ["error", "double", {
"avoidEscape": true "avoidEscape": true
}], }],
"camelcase": ["error", {
"properties": "always"
}],
"semi": ["error", "always"], "semi": ["error", "always"],
"unicode-bom": "error" "unicode-bom": "error"
}, },

View File

@ -17,7 +17,7 @@
* @constant * @constant
* @type {CatConf[]} * @type {CatConf[]}
*/ */
const Categories = [ var Categories = [
{ {
name: "Favourites", name: "Favourites",
ops: [] ops: []
@ -82,6 +82,7 @@ const Categories = [
"XOR Brute Force", "XOR Brute Force",
"Vigenère Encode", "Vigenère Encode",
"Vigenère Decode", "Vigenère Decode",
"Substitute",
"Derive PBKDF2 key", "Derive PBKDF2 key",
"Derive EVP key", "Derive EVP key",
] ]
@ -148,6 +149,7 @@ const Categories = [
"Sort", "Sort",
"Unique", "Unique",
"Split", "Split",
"Filter",
"Count occurrences", "Count occurrences",
"Expand alphabet range", "Expand alphabet range",
"Parse escaped string", "Parse escaped string",
@ -189,6 +191,8 @@ const Categories = [
"Extract file paths", "Extract file paths",
"Extract dates", "Extract dates",
"Regular expression", "Regular expression",
"XPath expression",
"CSS selector",
] ]
}, },
{ {
@ -210,7 +214,10 @@ const Categories = [
ops: [ ops: [
"Analyse hash", "Analyse hash",
"Generate all hashes", "Generate all hashes",
"MD2",
"MD4",
"MD5", "MD5",
"SHA0",
"SHA1", "SHA1",
"SHA224", "SHA224",
"SHA256", "SHA256",
@ -219,7 +226,10 @@ const Categories = [
"SHA3", "SHA3",
"RIPEMD-160", "RIPEMD-160",
"HMAC", "HMAC",
"Fletcher-8 Checksum",
"Fletcher-16 Checksum", "Fletcher-16 Checksum",
"Fletcher-32 Checksum",
"Fletcher-64 Checksum",
"Adler-32 Checksum", "Adler-32 Checksum",
"CRC-32 Checksum", "CRC-32 Checksum",
"TCP/IP Checksum", "TCP/IP Checksum",
@ -241,6 +251,8 @@ const Categories = [
"SQL Minify", "SQL Minify",
"CSS Beautify", "CSS Beautify",
"CSS Minify", "CSS Minify",
"XPath expression",
"CSS selector",
"Strip HTML tags", "Strip HTML tags",
"Diff", "Diff",
] ]

File diff suppressed because it is too large Load Diff

View File

@ -15,10 +15,10 @@ var Chef = function() {
/** /**
* Runs the recipe over the input. * Runs the recipe over the input.
* *
* @param {string} input_text - The input data as a string * @param {string} inputText - The input data as a string
* @param {Object[]} recipe_config - The recipe configuration object * @param {Object[]} recipeConfig - The recipe configuration object
* @param {Object} options - The options object storing various user choices * @param {Object} options - The options object storing various user choices
* @param {boolean} options.attemp_highlight - Whether or not to attempt highlighting * @param {boolean} options.attempHighlight - Whether or not to attempt highlighting
* @param {number} progress - The position in the recipe to start from * @param {number} progress - The position in the recipe to start from
* @param {number} [step] - The number of operations to execute * @param {number} [step] - The number of operations to execute
* *
@ -30,41 +30,41 @@ var Chef = function() {
* @returns {number} response.duration - The number of ms it took to execute the recipe * @returns {number} response.duration - The number of ms it took to execute the recipe
* @returns {number} response.error - The error object thrown by a failed operation (false if no error) * @returns {number} response.error - The error object thrown by a failed operation (false if no error)
*/ */
Chef.prototype.bake = function(input_text, recipe_config, options, progress, step) { Chef.prototype.bake = function(inputText, recipeConfig, options, progress, step) {
var start_time = new Date().getTime(), var startTime = new Date().getTime(),
recipe = new Recipe(recipe_config), recipe = new Recipe(recipeConfig),
contains_fc = recipe.contains_flow_control(), containsFc = recipe.containsFlowControl(),
error = false; error = false;
// Reset attempt_highlight flag // Reset attemptHighlight flag
if (options.hasOwnProperty("attempt_highlight")) { if (options.hasOwnProperty("attemptHighlight")) {
options.attempt_highlight = true; options.attemptHighlight = true;
} }
if (contains_fc) options.attempt_highlight = false; if (containsFc) options.attemptHighlight = false;
// Clean up progress // Clean up progress
if (progress >= recipe_config.length) { if (progress >= recipeConfig.length) {
progress = 0; progress = 0;
} }
if (step) { if (step) {
// Unset breakpoint on this step // Unset breakpoint on this step
recipe.set_breakpoint(progress, false); recipe.setBreakpoint(progress, false);
// Set breakpoint on next step // Set breakpoint on next step
recipe.set_breakpoint(progress + 1, true); recipe.setBreakpoint(progress + 1, true);
} }
// If stepping with flow control, we have to start from the beginning // If stepping with flow control, we have to start from the beginning
// but still want to skip all previous breakpoints // but still want to skip all previous breakpoints
if (progress > 0 && contains_fc) { if (progress > 0 && containsFc) {
recipe.remove_breaks_up_to(progress); recipe.removeBreaksUpTo(progress);
progress = 0; progress = 0;
} }
// If starting from scratch, load data // If starting from scratch, load data
if (progress === 0) { if (progress === 0) {
this.dish.set(input_text, Dish.STRING); this.dish.set(inputText, Dish.STRING);
} }
try { try {
@ -80,10 +80,10 @@ Chef.prototype.bake = function(input_text, recipe_config, options, progress, ste
result: this.dish.type === Dish.HTML ? result: this.dish.type === Dish.HTML ?
this.dish.get(Dish.HTML) : this.dish.get(Dish.HTML) :
this.dish.get(Dish.STRING), this.dish.get(Dish.STRING),
type: Dish.enum_lookup(this.dish.type), type: Dish.enumLookup(this.dish.type),
progress: progress, progress: progress,
options: options, options: options,
duration: new Date().getTime() - start_time, duration: new Date().getTime() - startTime,
error: error error: error
}; };
}; };
@ -103,18 +103,18 @@ Chef.prototype.bake = function(input_text, recipe_config, options, progress, ste
* This will only actually execute the recipe if auto-bake is enabled, otherwise it will just load * This will only actually execute the recipe if auto-bake is enabled, otherwise it will just load
* the recipe, ingredients and dish. * the recipe, ingredients and dish.
* *
* @param {Object[]} recipe_config - The recipe configuration object * @param {Object[]} recipeConfig - The recipe configuration object
* @returns {number} The time it took to run the silent bake in milliseconds. * @returns {number} The time it took to run the silent bake in milliseconds.
*/ */
Chef.prototype.silent_bake = function(recipe_config) { Chef.prototype.silentBake = function(recipeConfig) {
var start_time = new Date().getTime(), var startTime = new Date().getTime(),
recipe = new Recipe(recipe_config), recipe = new Recipe(recipeConfig),
dish = new Dish("", Dish.STRING); dish = new Dish("", Dish.STRING);
try { try {
recipe.execute(dish); recipe.execute(dish);
} catch(err) { } catch(err) {
// Suppress all errors // Suppress all errors
} }
return new Date().getTime() - start_time; return new Date().getTime() - startTime;
}; };

View File

@ -6,7 +6,7 @@
* @license Apache-2.0 * @license Apache-2.0
* *
* @class * @class
* @param {byte_array|string|number} value - The value of the input data. * @param {byteArray|string|number} 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.
*/ */
var Dish = function(value, type) { var Dish = function(value, type) {
@ -45,12 +45,12 @@ Dish.HTML = 3;
* Returns the data type enum for the given type string. * Returns the data type enum for the given type string.
* *
* @static * @static
* @param {string} type_str - The name of the data type. * @param {string} typeStr - The name of the data type.
* @returns {number} The data type enum value. * @returns {number} The data type enum value.
*/ */
Dish.type_enum = function(type_str) { Dish.typeEnum = function(typeStr) {
switch (type_str) { switch (typeStr) {
case "byte_array": case "byteArray":
case "Byte array": case "Byte array":
return Dish.BYTE_ARRAY; return Dish.BYTE_ARRAY;
case "string": case "string":
@ -72,13 +72,13 @@ Dish.type_enum = function(type_str) {
* Returns the data type string for the given type enum. * Returns the data type string for the given type enum.
* *
* @static * @static
* @param {string} type_enum - The enum value of the data type. * @param {string} typeEnum - The enum value of the data type.
* @returns {number} The data type as a string. * @returns {number} The data type as a string.
*/ */
Dish.enum_lookup = function(type_enum) { Dish.enumLookup = function(typeEnum) {
switch (type_enum) { switch (typeEnum) {
case Dish.BYTE_ARRAY: case Dish.BYTE_ARRAY:
return "byte_array"; return "byteArray";
case Dish.STRING: case Dish.STRING:
return "string"; return "string";
case Dish.NUMBER: case Dish.NUMBER:
@ -94,7 +94,7 @@ Dish.enum_lookup = function(type_enum) {
/** /**
* Sets the data value and type and then validates them. * Sets the data value and type and then validates them.
* *
* @param {byte_array|string|number} value - The value of the input data. * @param {byteArray|string|number} 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) {
@ -103,7 +103,7 @@ Dish.prototype.set = function(value, type) {
if (!this.valid()) { if (!this.valid()) {
var sample = Utils.truncate(JSON.stringify(this.value), 13); var sample = Utils.truncate(JSON.stringify(this.value), 13);
throw "Data is not a valid " + Dish.enum_lookup(type) + ": " + sample; throw "Data is not a valid " + Dish.enumLookup(type) + ": " + sample;
} }
}; };
@ -112,7 +112,7 @@ 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 {byte_array|string|number} The value of the output data. * @returns {byteArray|string|number} The value of the output data.
*/ */
Dish.prototype.get = function(type) { Dish.prototype.get = function(type) {
if (this.type !== type) { if (this.type !== type) {
@ -125,36 +125,36 @@ Dish.prototype.get = function(type) {
/** /**
* Translates the data to the given type format. * Translates the data to the given type format.
* *
* @param {number} to_type - The data type of value, see Dish enums. * @param {number} toType - The data type of value, see Dish enums.
*/ */
Dish.prototype.translate = function(to_type) { Dish.prototype.translate = function(toType) {
// Convert data to intermediate byte_array type // Convert data to intermediate byteArray type
switch (this.type) { switch (this.type) {
case Dish.STRING: case Dish.STRING:
this.value = this.value ? Utils.str_to_byte_array(this.value) : []; this.value = this.value ? Utils.strToByteArray(this.value) : [];
this.type = Dish.BYTE_ARRAY; this.type = Dish.BYTE_ARRAY;
break; break;
case Dish.NUMBER: case Dish.NUMBER:
this.value = typeof this.value == "number" ? Utils.str_to_byte_array(this.value.toString()) : []; this.value = typeof this.value == "number" ? Utils.strToByteArray(this.value.toString()) : [];
this.type = Dish.BYTE_ARRAY; this.type = Dish.BYTE_ARRAY;
break; break;
case Dish.HTML: case Dish.HTML:
this.value = this.value ? Utils.str_to_byte_array(Utils.strip_html_tags(this.value, true)) : []; this.value = this.value ? Utils.strToByteArray(Utils.stripHtmlTags(this.value, true)) : [];
this.type = Dish.BYTE_ARRAY; this.type = Dish.BYTE_ARRAY;
break; break;
default: default:
break; break;
} }
// Convert from byte_array to to_type // Convert from byteArray to toType
switch (to_type) { switch (toType) {
case Dish.STRING: case Dish.STRING:
case Dish.HTML: case Dish.HTML:
this.value = this.value ? Utils.byte_array_to_utf8(this.value) : ""; this.value = this.value ? Utils.byteArrayToUtf8(this.value) : "";
this.type = Dish.STRING; this.type = Dish.STRING;
break; break;
case Dish.NUMBER: case Dish.NUMBER:
this.value = this.value ? parseFloat(Utils.byte_array_to_utf8(this.value)) : 0; this.value = this.value ? parseFloat(Utils.byteArrayToUtf8(this.value)) : 0;
this.type = Dish.NUMBER; this.type = Dish.NUMBER;
break; break;
default: default:

View File

@ -7,7 +7,7 @@
* *
* @namespace * @namespace
*/ */
const FlowControl = { var FlowControl = {
/** /**
* @constant * @constant
@ -19,6 +19,11 @@ const FlowControl = {
* @default * @default
*/ */
MERGE_DELIM: "\\n", MERGE_DELIM: "\\n",
/**
* @constant
* @default
*/
FORK_IGNORE_ERRORS: false,
/** /**
* Fork operation. * Fork operation.
@ -26,47 +31,55 @@ const FlowControl = {
* @param {Object} state - The current state of the recipe. * @param {Object} state - The current state of the recipe.
* @param {number} state.progress - The current position in the recipe. * @param {number} state.progress - The current position in the recipe.
* @param {Dish} state.dish - The Dish being operated on. * @param {Dish} state.dish - The Dish being operated on.
* @param {Operation[]} state.op_list - The list of operations in the recipe. * @param {Operation[]} state.opList - The list of operations in the recipe.
* @returns {Object} The updated state of the recipe. * @returns {Object} The updated state of the recipe.
*/ */
run_fork: function(state) { runFork: function(state) {
var op_list = state.op_list, var opList = state.opList,
input_type = op_list[state.progress].input_type, inputType = opList[state.progress].inputType,
output_type = op_list[state.progress].output_type, outputType = opList[state.progress].outputType,
input = state.dish.get(input_type), input = state.dish.get(inputType),
ings = op_list[state.progress].get_ing_values(), ings = opList[state.progress].getIngValues(),
split_delim = ings[0], splitDelim = ings[0],
merge_delim = ings[1], mergeDelim = ings[1],
sub_op_list = [], ignoreErrors = ings[2],
inputs = []; subOpList = [],
inputs = [];
if (input) if (input)
inputs = input.split(split_delim); inputs = input.split(splitDelim);
// Create sub_op_list for each tranche to operate on // Create subOpList for each tranche to operate on
// (all remaining operations unless we encounter a Merge) // (all remaining operations unless we encounter a Merge)
for (var i = state.progress + 1; i < op_list.length; i++) { for (var i = state.progress + 1; i < opList.length; i++) {
if (op_list[i].name === "Merge" && !op_list[i].is_disabled()) { if (opList[i].name === "Merge" && !opList[i].isDisabled()) {
break; break;
} else { } else {
sub_op_list.push(op_list[i]); subOpList.push(opList[i]);
} }
} }
var recipe = new Recipe(), var recipe = new Recipe(),
output = "", output = "",
progress; progress = 0;
recipe.add_operations(sub_op_list); recipe.addOperations(subOpList);
// Run recipe over each tranche // Run recipe over each tranche
for (i = 0; i < inputs.length; i++) { for (i = 0; i < inputs.length; i++) {
var dish = new Dish(inputs[i], input_type); var dish = new Dish(inputs[i], inputType);
progress = recipe.execute(dish, 0); try {
output += dish.get(output_type) + merge_delim; progress = recipe.execute(dish, 0);
} catch(err) {
if (!ignoreErrors) {
throw err;
}
progress = err.progress + 1;
}
output += dish.get(outputType) + mergeDelim;
} }
state.dish.set(output, output_type); state.dish.set(output, outputType);
state.progress += progress; state.progress += progress;
return state; return state;
}, },
@ -78,10 +91,10 @@ const FlowControl = {
* @param {Object} state - The current state of the recipe. * @param {Object} state - The current state of the recipe.
* @param {number} state.progress - The current position in the recipe. * @param {number} state.progress - The current position in the recipe.
* @param {Dish} state.dish - The Dish being operated on. * @param {Dish} state.dish - The Dish being operated on.
* @param {Operation[]} state.op_list - The list of operations in the recipe. * @param {Operation[]} state.opList - The list of operations in the recipe.
* @returns {Object} The updated state of the recipe. * @returns {Object} The updated state of the recipe.
*/ */
run_merge: function(state) { runMerge: function(state) {
// No need to actually do anything here. The fork operation will // No need to actually do anything here. The fork operation will
// merge when it sees this operation. // merge when it sees this operation.
return state; return state;
@ -105,21 +118,22 @@ const FlowControl = {
* @param {Object} state - The current state of the recipe. * @param {Object} state - The current state of the recipe.
* @param {number} state.progress - The current position in the recipe. * @param {number} state.progress - The current position in the recipe.
* @param {Dish} state.dish - The Dish being operated on. * @param {Dish} state.dish - The Dish being operated on.
* @param {Operation[]} state.op_list - The list of operations in the recipe. * @param {Operation[]} state.opList - The list of operations in the recipe.
* @param {number} state.num_jumps - The number of jumps taken so far. * @param {number} state.numJumps - The number of jumps taken so far.
* @returns {Object} The updated state of the recipe. * @returns {Object} The updated state of the recipe.
*/ */
run_jump: function(state) { runJump: function(state) {
var ings = state.op_list[state.progress].get_ing_values(), var ings = state.opList[state.progress].getIngValues(),
jump_num = ings[0], jumpNum = ings[0],
max_jumps = ings[1]; maxJumps = ings[1];
if (state.num_jumps >= max_jumps) { if (state.numJumps >= maxJumps) {
throw "Reached maximum jumps, sorry!"; state.progress++;
return state;
} }
state.progress += jump_num; state.progress += jumpNum;
state.num_jumps++; state.numJumps++;
return state; return state;
}, },
@ -130,24 +144,25 @@ const FlowControl = {
* @param {Object} state - The current state of the recipe. * @param {Object} state - The current state of the recipe.
* @param {number} state.progress - The current position in the recipe. * @param {number} state.progress - The current position in the recipe.
* @param {Dish} state.dish - The Dish being operated on. * @param {Dish} state.dish - The Dish being operated on.
* @param {Operation[]} state.op_list - The list of operations in the recipe. * @param {Operation[]} state.opList - The list of operations in the recipe.
* @param {number} state.num_jumps - The number of jumps taken so far. * @param {number} state.numJumps - The number of jumps taken so far.
* @returns {Object} The updated state of the recipe. * @returns {Object} The updated state of the recipe.
*/ */
run_cond_jump: function(state) { runCondJump: function(state) {
var ings = state.op_list[state.progress].get_ing_values(), var ings = state.opList[state.progress].getIngValues(),
dish = state.dish, dish = state.dish,
regex_str = ings[0], regexStr = ings[0],
jump_num = ings[1], jumpNum = ings[1],
max_jumps = ings[2]; maxJumps = ings[2];
if (state.num_jumps >= max_jumps) { if (state.numJumps >= maxJumps) {
throw "Reached maximum jumps, sorry!"; state.progress++;
return state;
} }
if (regex_str !== "" && dish.get(Dish.STRING).search(regex_str) > -1) { if (regexStr !== "" && dish.get(Dish.STRING).search(regexStr) > -1) {
state.progress += jump_num; state.progress += jumpNum;
state.num_jumps++; state.numJumps++;
} }
return state; return state;
@ -160,11 +175,11 @@ const FlowControl = {
* @param {Object} state - The current state of the recipe. * @param {Object} state - The current state of the recipe.
* @param {number} state.progress - The current position in the recipe. * @param {number} state.progress - The current position in the recipe.
* @param {Dish} state.dish - The Dish being operated on. * @param {Dish} state.dish - The Dish being operated on.
* @param {Operation[]} state.op_list - The list of operations in the recipe. * @param {Operation[]} state.opList - The list of operations in the recipe.
* @returns {Object} The updated state of the recipe. * @returns {Object} The updated state of the recipe.
*/ */
run_return: function(state) { runReturn: function(state) {
state.progress = state.op_list.length; state.progress = state.opList.length;
return state; return state;
}, },

View File

@ -6,15 +6,15 @@
* @license Apache-2.0 * @license Apache-2.0
* *
* @class * @class
* @param {Object} ingredient_config * @param {Object} ingredientConfig
*/ */
var Ingredient = function(ingredient_config) { var Ingredient = function(ingredientConfig) {
this.name = ""; this.name = "";
this.type = ""; this.type = "";
this.value = null; this.value = null;
if (ingredient_config) { if (ingredientConfig) {
this._parse_config(ingredient_config); this._parseConfig(ingredientConfig);
} }
}; };
@ -23,11 +23,11 @@ var Ingredient = function(ingredient_config) {
* Reads and parses the given config. * Reads and parses the given config.
* *
* @private * @private
* @param {Object} ingredient_config * @param {Object} ingredientConfig
*/ */
Ingredient.prototype._parse_config = function(ingredient_config) { Ingredient.prototype._parseConfig = function(ingredientConfig) {
this.name = ingredient_config.name; this.name = ingredientConfig.name;
this.type = ingredient_config.type; this.type = ingredientConfig.type;
}; };
@ -36,7 +36,7 @@ Ingredient.prototype._parse_config = function(ingredient_config) {
* *
* @returns {*} * @returns {*}
*/ */
Ingredient.prototype.get_config = function() { Ingredient.prototype.getConfig = function() {
return this.value; return this.value;
}; };
@ -46,7 +46,7 @@ Ingredient.prototype.get_config = function() {
* *
* @param {*} value * @param {*} value
*/ */
Ingredient.prototype.set_value = function(value) { Ingredient.prototype.setValue = function(value) {
this.value = Ingredient.prepare(value, this.type); this.value = Ingredient.prepare(value, this.type);
}; };
@ -61,14 +61,14 @@ Ingredient.prototype.set_value = function(value) {
*/ */
Ingredient.prepare = function(data, type) { Ingredient.prepare = function(data, type) {
switch (type) { switch (type) {
case "binary_string": case "binaryString":
case "binary_short_string": case "binaryShortString":
case "editable_option": case "editableOption":
return Utils.parse_escaped_chars(data); return Utils.parseEscapedChars(data);
case "byte_array": case "byteArray":
if (typeof data == "string") { if (typeof data == "string") {
data = data.replace(/\s+/g, ""); data = data.replace(/\s+/g, "");
return Utils.hex_to_byte_array(data); return Utils.hexToByteArray(data);
} else { } else {
return data; return data;
} }

View File

@ -6,23 +6,23 @@
* @license Apache-2.0 * @license Apache-2.0
* *
* @class * @class
* @param {string} operation_name * @param {string} operationName
* @param {Object} operation_config * @param {Object} operationConfig
*/ */
var Operation = function(operation_name, operation_config) { var Operation = function(operationName, operationConfig) {
this.name = operation_name; this.name = operationName;
this.description = ""; this.description = "";
this.input_type = -1; this.inputType = -1;
this.output_type = -1; this.outputType = -1;
this.run = null; this.run = null;
this.highlight = null; this.highlight = null;
this.highlight_reverse = null; this.highlightReverse = null;
this.breakpoint = false; this.breakpoint = false;
this.disabled = false; this.disabled = false;
this.ing_list = []; this.ingList = [];
if (operation_config) { if (operationConfig) {
this._parse_config(operation_config); this._parseConfig(operationConfig);
} }
}; };
@ -31,21 +31,21 @@ var Operation = function(operation_name, operation_config) {
* Reads and parses the given config. * Reads and parses the given config.
* *
* @private * @private
* @param {Object} operation_config * @param {Object} operationConfig
*/ */
Operation.prototype._parse_config = function(operation_config) { Operation.prototype._parseConfig = function(operationConfig) {
this.description = operation_config.description; this.description = operationConfig.description;
this.input_type = Dish.type_enum(operation_config.input_type); this.inputType = Dish.typeEnum(operationConfig.inputType);
this.output_type = Dish.type_enum(operation_config.output_type); this.outputType = Dish.typeEnum(operationConfig.outputType);
this.run = operation_config.run; this.run = operationConfig.run;
this.highlight = operation_config.highlight; this.highlight = operationConfig.highlight;
this.highlight_reverse = operation_config.highlight_reverse; this.highlightReverse = operationConfig.highlightReverse;
this.flow_control = operation_config.flow_control; this.flowControl = operationConfig.flowControl;
for (var a = 0; a < operation_config.args.length; a++) { for (var a = 0; a < operationConfig.args.length; a++) {
var ingredient_config = operation_config.args[a]; var ingredientConfig = operationConfig.args[a];
var ingredient = new Ingredient(ingredient_config); var ingredient = new Ingredient(ingredientConfig);
this.add_ingredient(ingredient); this.addIngredient(ingredient);
} }
}; };
@ -55,19 +55,19 @@ Operation.prototype._parse_config = function(operation_config) {
* *
* @returns {Object} * @returns {Object}
*/ */
Operation.prototype.get_config = function() { Operation.prototype.getConfig = function() {
var ingredient_config = []; var ingredientConfig = [];
for (var o = 0; o < this.ing_list.length; o++) { for (var o = 0; o < this.ingList.length; o++) {
ingredient_config.push(this.ing_list[o].get_config()); ingredientConfig.push(this.ingList[o].getConfig());
} }
var operation_config = { var operationConfig = {
"op": this.name, "op": this.name,
"args": ingredient_config "args": ingredientConfig
}; };
return operation_config; return operationConfig;
}; };
@ -76,19 +76,19 @@ Operation.prototype.get_config = function() {
* *
* @param {Ingredient} ingredient * @param {Ingredient} ingredient
*/ */
Operation.prototype.add_ingredient = function(ingredient) { Operation.prototype.addIngredient = function(ingredient) {
this.ing_list.push(ingredient); this.ingList.push(ingredient);
}; };
/** /**
* Set the Ingredient values for this Operation. * Set the Ingredient values for this Operation.
* *
* @param {Object[]} ing_values * @param {Object[]} ingValues
*/ */
Operation.prototype.set_ing_values = function(ing_values) { Operation.prototype.setIngValues = function(ingValues) {
for (var i = 0; i < ing_values.length; i++) { for (var i = 0; i < ingValues.length; i++) {
this.ing_list[i].set_value(ing_values[i]); this.ingList[i].setValue(ingValues[i]);
} }
}; };
@ -98,12 +98,12 @@ Operation.prototype.set_ing_values = function(ing_values) {
* *
* @returns {Object[]} * @returns {Object[]}
*/ */
Operation.prototype.get_ing_values = function() { Operation.prototype.getIngValues = function() {
var ing_values = []; var ingValues = [];
for (var i = 0; i < this.ing_list.length; i++) { for (var i = 0; i < this.ingList.length; i++) {
ing_values.push(this.ing_list[i].value); ingValues.push(this.ingList[i].value);
} }
return ing_values; return ingValues;
}; };
@ -112,7 +112,7 @@ Operation.prototype.get_ing_values = function() {
* *
* @param {boolean} value * @param {boolean} value
*/ */
Operation.prototype.set_breakpoint = function(value) { Operation.prototype.setBreakpoint = function(value) {
this.breakpoint = !!value; this.breakpoint = !!value;
}; };
@ -122,7 +122,7 @@ Operation.prototype.set_breakpoint = function(value) {
* *
* @returns {boolean} * @returns {boolean}
*/ */
Operation.prototype.is_breakpoint = function() { Operation.prototype.isBreakpoint = function() {
return this.breakpoint; return this.breakpoint;
}; };
@ -132,7 +132,7 @@ Operation.prototype.is_breakpoint = function() {
* *
* @param {boolean} value * @param {boolean} value
*/ */
Operation.prototype.set_disabled = function(value) { Operation.prototype.setDisabled = function(value) {
this.disabled = !!value; this.disabled = !!value;
}; };
@ -142,7 +142,7 @@ Operation.prototype.set_disabled = function(value) {
* *
* @returns {boolean} * @returns {boolean}
*/ */
Operation.prototype.is_disabled = function() { Operation.prototype.isDisabled = function() {
return this.disabled; return this.disabled;
}; };
@ -152,6 +152,6 @@ Operation.prototype.is_disabled = function() {
* *
* @returns {boolean} * @returns {boolean}
*/ */
Operation.prototype.is_flow_control = function() { Operation.prototype.isFlowControl = function() {
return this.flow_control; return this.flowControl;
}; };

View File

@ -6,13 +6,13 @@
* @license Apache-2.0 * @license Apache-2.0
* *
* @class * @class
* @param {Object} recipe_config * @param {Object} recipeConfig
*/ */
var Recipe = function(recipe_config) { var Recipe = function(recipeConfig) {
this.op_list = []; this.opList = [];
if (recipe_config) { if (recipeConfig) {
this._parse_config(recipe_config); this._parseConfig(recipeConfig);
} }
}; };
@ -21,17 +21,17 @@ var Recipe = function(recipe_config) {
* Reads and parses the given config. * Reads and parses the given config.
* *
* @private * @private
* @param {Object} recipe_config * @param {Object} recipeConfig
*/ */
Recipe.prototype._parse_config = function(recipe_config) { Recipe.prototype._parseConfig = function(recipeConfig) {
for (var c = 0; c < recipe_config.length; c++) { for (var c = 0; c < recipeConfig.length; c++) {
var operation_name = recipe_config[c].op; var operationName = recipeConfig[c].op;
var operation_config = OperationConfig[operation_name]; var operationConfig = OperationConfig[operationName];
var operation = new Operation(operation_name, operation_config); var operation = new Operation(operationName, operationConfig);
operation.set_ing_values(recipe_config[c].args); operation.setIngValues(recipeConfig[c].args);
operation.set_breakpoint(recipe_config[c].breakpoint); operation.setBreakpoint(recipeConfig[c].breakpoint);
operation.set_disabled(recipe_config[c].disabled); operation.setDisabled(recipeConfig[c].disabled);
this.add_operation(operation); this.addOperation(operation);
} }
}; };
@ -41,14 +41,14 @@ Recipe.prototype._parse_config = function(recipe_config) {
* *
* @returns {*} * @returns {*}
*/ */
Recipe.prototype.get_config = function() { Recipe.prototype.getConfig = function() {
var recipe_config = []; var recipeConfig = [];
for (var o = 0; o < this.op_list.length; o++) { for (var o = 0; o < this.opList.length; o++) {
recipe_config.push(this.op_list[o].get_config()); recipeConfig.push(this.opList[o].getConfig());
} }
return recipe_config; return recipeConfig;
}; };
@ -57,8 +57,8 @@ Recipe.prototype.get_config = function() {
* *
* @param {Operation} operation * @param {Operation} operation
*/ */
Recipe.prototype.add_operation = function(operation) { Recipe.prototype.addOperation = function(operation) {
this.op_list.push(operation); this.opList.push(operation);
}; };
@ -67,8 +67,8 @@ Recipe.prototype.add_operation = function(operation) {
* *
* @param {Operation[]} operations * @param {Operation[]} operations
*/ */
Recipe.prototype.add_operations = function(operations) { Recipe.prototype.addOperations = function(operations) {
this.op_list = this.op_list.concat(operations); this.opList = this.opList.concat(operations);
}; };
@ -78,9 +78,9 @@ Recipe.prototype.add_operations = function(operations) {
* @param {number} position - The index of the Operation * @param {number} position - The index of the Operation
* @param {boolean} value * @param {boolean} value
*/ */
Recipe.prototype.set_breakpoint = function(position, value) { Recipe.prototype.setBreakpoint = function(position, value) {
try { try {
this.op_list[position].set_breakpoint(value); this.opList[position].setBreakpoint(value);
} catch (err) { } catch (err) {
// Ignore index error // Ignore index error
} }
@ -93,9 +93,9 @@ Recipe.prototype.set_breakpoint = function(position, value) {
* *
* @param {number} pos * @param {number} pos
*/ */
Recipe.prototype.remove_breaks_up_to = function(pos) { Recipe.prototype.removeBreaksUpTo = function(pos) {
for (var i = 0; i < pos; i++) { for (var i = 0; i < pos; i++) {
this.op_list[i].set_breakpoint(false); this.opList[i].setBreakpoint(false);
} }
}; };
@ -105,9 +105,9 @@ Recipe.prototype.remove_breaks_up_to = function(pos) {
* *
* @returns {boolean} * @returns {boolean}
*/ */
Recipe.prototype.contains_flow_control = function() { Recipe.prototype.containsFlowControl = function() {
for (var i = 0; i < this.op_list.length; i++) { for (var i = 0; i < this.opList.length; i++) {
if (this.op_list[i].is_flow_control()) return true; if (this.opList[i].isFlowControl()) return true;
} }
return false; return false;
}; };
@ -117,17 +117,17 @@ Recipe.prototype.contains_flow_control = function() {
* Returns the index of the last Operation index that will be executed, taking into account disabled * Returns the index of the last Operation index that will be executed, taking into account disabled
* Operations and breakpoints. * Operations and breakpoints.
* *
* @param {number} [start_index=0] - The index to start searching from * @param {number} [startIndex=0] - The index to start searching from
* @returns (number} * @returns (number}
*/ */
Recipe.prototype.last_op_index = function(start_index) { Recipe.prototype.lastOpIndex = function(startIndex) {
var i = start_index + 1 || 0, var i = startIndex + 1 || 0,
op; op;
for (; i < this.op_list.length; i++) { for (; i < this.opList.length; i++) {
op = this.op_list[i]; op = this.opList[i];
if (op.is_disabled()) return i-1; if (op.isDisabled()) return i-1;
if (op.is_breakpoint()) return i-1; if (op.isBreakpoint()) return i-1;
} }
return i-1; return i-1;
@ -138,59 +138,58 @@ Recipe.prototype.last_op_index = function(start_index) {
* Executes each operation in the recipe over the given Dish. * Executes each operation in the recipe over the given Dish.
* *
* @param {Dish} dish * @param {Dish} dish
* @param {number} [start_from=0] - The index of the Operation to start executing from * @param {number} [startFrom=0] - The index of the Operation to start executing from
* @returns {number} - The final progress through the recipe * @returns {number} - The final progress through the recipe
*/ */
Recipe.prototype.execute = function(dish, start_from) { Recipe.prototype.execute = function(dish, startFrom) {
start_from = start_from || 0; startFrom = startFrom || 0;
var op, input, output, num_jumps = 0; var op, input, output, numJumps = 0;
for (var i = start_from; i < this.op_list.length; i++) { for (var i = startFrom; i < this.opList.length; i++) {
op = this.op_list[i]; op = this.opList[i];
if (op.is_disabled()) { if (op.isDisabled()) {
continue; continue;
} }
if (op.is_breakpoint()) { if (op.isBreakpoint()) {
return i; return i;
} }
try { try {
input = dish.get(op.input_type); input = dish.get(op.inputType);
if (op.is_flow_control()) { if (op.isFlowControl()) {
// Package up the current state // Package up the current state
var state = { var state = {
"progress" : i, "progress" : i,
"dish" : dish, "dish" : dish,
"op_list" : this.op_list, "opList" : this.opList,
"num_jumps" : num_jumps "numJumps" : numJumps
}; };
state = op.run(state); state = op.run(state);
i = state.progress; i = state.progress;
num_jumps = state.num_jumps; numJumps = state.numJumps;
} else { } else {
output = op.run(input, op.get_ing_values()); output = op.run(input, op.getIngValues());
dish.set(output, op.output_type); dish.set(output, op.outputType);
} }
} catch (err) { } catch (err) {
var e = typeof err == "string" ? { message: err } : err; var e = typeof err == "string" ? { message: err } : err;
e.progress = i; e.progress = i;
e.display_str = op.name + " - ";
if (e.fileName) { if (e.fileName) {
e.display_str += e.name + " in " + e.fileName + e.displayStr = op.name + " - " + e.name + " in " +
" on line " + e.lineNumber + e.fileName + " on line " + e.lineNumber +
".<br><br>Message: " + e.message; ".<br><br>Message: " + (e.displayStr || e.message);
} else { } else {
e.display_str += e.message; e.displayStr = op.name + " - " + (e.displayStr || e.message);
} }
throw e; throw e;
} }
} }
return this.op_list.length; return this.opList.length;
}; };
@ -199,17 +198,17 @@ Recipe.prototype.execute = function(dish, start_from) {
* *
* @returns {string} * @returns {string}
*/ */
Recipe.prototype.to_string = function() { Recipe.prototype.toString = function() {
return JSON.stringify(this.get_config()); return JSON.stringify(this.getConfig());
}; };
/** /**
* Creates a Recipe from a given configuration string. * Creates a Recipe from a given configuration string.
* *
* @param {string} recipe_str * @param {string} recipeStr
*/ */
Recipe.prototype.from_string = function(recipe_str) { Recipe.prototype.fromString = function(recipeStr) {
var recipe_config = JSON.parse(recipe_str); var recipeConfig = JSON.parse(recipeStr);
this._parse_config(recipe_config); this._parseConfig(recipeConfig);
}; };

View File

@ -51,23 +51,23 @@ var Utils = {
* *
* @example * @example
* // returns "0a" * // returns "0a"
* Utils.pad_left("a", 2); * Utils.padLeft("a", 2);
* *
* // returns "000a" * // returns "000a"
* Utils.pad_left("a", 4); * Utils.padLeft("a", 4);
* *
* // returns "xxxa" * // returns "xxxa"
* Utils.pad_left("a", 4, "x"); * Utils.padLeft("a", 4, "x");
* *
* // returns "bcabchello" * // returns "bcabchello"
* Utils.pad_left("hello", 10, "abc"); * Utils.padLeft("hello", 10, "abc");
*/ */
pad_left: function(str, max, chr) { padLeft: function(str, max, chr) {
chr = chr || "0"; chr = chr || "0";
var start_index = chr.length - (max - str.length); var startIndex = chr.length - (max - str.length);
start_index = start_index < 0 ? 0 : start_index; startIndex = startIndex < 0 ? 0 : startIndex;
return str.length < max ? return str.length < max ?
Utils.pad_left(chr.slice(start_index, chr.length) + str, max, chr) : str; Utils.padLeft(chr.slice(startIndex, chr.length) + str, max, chr) : str;
}, },
@ -81,23 +81,23 @@ var Utils = {
* *
* @example * @example
* // returns "a " * // returns "a "
* Utils.pad_right("a", 4); * Utils.padRight("a", 4);
* *
* // returns "axxx" * // returns "axxx"
* Utils.pad_right("a", 4, "x"); * Utils.padRight("a", 4, "x");
*/ */
pad_right: function(str, max, chr) { padRight: function(str, max, chr) {
chr = chr || " "; chr = chr || " ";
return str.length < max ? return str.length < max ?
Utils.pad_right(str + chr.slice(0, max-str.length), max, chr) : str; Utils.padRight(str + chr.slice(0, max-str.length), max, chr) : str;
}, },
/** /**
* @alias Utils.pad_left * @alias Utils.padLeft
*/ */
pad: function(str, max, chr) { pad: function(str, max, chr) {
return Utils.pad_left(str, max, chr); return Utils.padLeft(str, max, chr);
}, },
@ -171,19 +171,19 @@ var Utils = {
* Returns a string with all non-printable chars as dots, optionally preserving whitespace. * Returns a string with all non-printable chars as dots, optionally preserving whitespace.
* *
* @param {string} str - The input string to display. * @param {string} str - The input string to display.
* @param {boolean} [preserve_ws=false] - Whether or not to print whitespace. * @param {boolean} [preserveWs=false] - Whether or not to print whitespace.
* @returns {string} * @returns {string}
*/ */
printable: function(str, preserve_ws) { printable: function(str, preserveWs) {
if (window && window.app && !window.app.options.treat_as_utf8) { if (window && window.app && !window.app.options.treatAsUtf8) {
str = Utils.byte_array_to_chars(Utils.str_to_byte_array(str)); str = Utils.byteArrayToChars(Utils.strToByteArray(str));
} }
var re = /[\0-\x08\x0B-\x0C\x0E-\x1F\x7F-\x9F\xAD\u0378\u0379\u037F-\u0383\u038B\u038D\u03A2\u0528-\u0530\u0557\u0558\u0560\u0588\u058B-\u058E\u0590\u05C8-\u05CF\u05EB-\u05EF\u05F5-\u0605\u061C\u061D\u06DD\u070E\u070F\u074B\u074C\u07B2-\u07BF\u07FB-\u07FF\u082E\u082F\u083F\u085C\u085D\u085F-\u089F\u08A1\u08AD-\u08E3\u08FF\u0978\u0980\u0984\u098D\u098E\u0991\u0992\u09A9\u09B1\u09B3-\u09B5\u09BA\u09BB\u09C5\u09C6\u09C9\u09CA\u09CF-\u09D6\u09D8-\u09DB\u09DE\u09E4\u09E5\u09FC-\u0A00\u0A04\u0A0B-\u0A0E\u0A11\u0A12\u0A29\u0A31\u0A34\u0A37\u0A3A\u0A3B\u0A3D\u0A43-\u0A46\u0A49\u0A4A\u0A4E-\u0A50\u0A52-\u0A58\u0A5D\u0A5F-\u0A65\u0A76-\u0A80\u0A84\u0A8E\u0A92\u0AA9\u0AB1\u0AB4\u0ABA\u0ABB\u0AC6\u0ACA\u0ACE\u0ACF\u0AD1-\u0ADF\u0AE4\u0AE5\u0AF2-\u0B00\u0B04\u0B0D\u0B0E\u0B11\u0B12\u0B29\u0B31\u0B34\u0B3A\u0B3B\u0B45\u0B46\u0B49\u0B4A\u0B4E-\u0B55\u0B58-\u0B5B\u0B5E\u0B64\u0B65\u0B78-\u0B81\u0B84\u0B8B-\u0B8D\u0B91\u0B96-\u0B98\u0B9B\u0B9D\u0BA0-\u0BA2\u0BA5-\u0BA7\u0BAB-\u0BAD\u0BBA-\u0BBD\u0BC3-\u0BC5\u0BC9\u0BCE\u0BCF\u0BD1-\u0BD6\u0BD8-\u0BE5\u0BFB-\u0C00\u0C04\u0C0D\u0C11\u0C29\u0C34\u0C3A-\u0C3C\u0C45\u0C49\u0C4E-\u0C54\u0C57\u0C5A-\u0C5F\u0C64\u0C65\u0C70-\u0C77\u0C80\u0C81\u0C84\u0C8D\u0C91\u0CA9\u0CB4\u0CBA\u0CBB\u0CC5\u0CC9\u0CCE-\u0CD4\u0CD7-\u0CDD\u0CDF\u0CE4\u0CE5\u0CF0\u0CF3-\u0D01\u0D04\u0D0D\u0D11\u0D3B\u0D3C\u0D45\u0D49\u0D4F-\u0D56\u0D58-\u0D5F\u0D64\u0D65\u0D76-\u0D78\u0D80\u0D81\u0D84\u0D97-\u0D99\u0DB2\u0DBC\u0DBE\u0DBF\u0DC7-\u0DC9\u0DCB-\u0DCE\u0DD5\u0DD7\u0DE0-\u0DF1\u0DF5-\u0E00\u0E3B-\u0E3E\u0E5C-\u0E80\u0E83\u0E85\u0E86\u0E89\u0E8B\u0E8C\u0E8E-\u0E93\u0E98\u0EA0\u0EA4\u0EA6\u0EA8\u0EA9\u0EAC\u0EBA\u0EBE\u0EBF\u0EC5\u0EC7\u0ECE\u0ECF\u0EDA\u0EDB\u0EE0-\u0EFF\u0F48\u0F6D-\u0F70\u0F98\u0FBD\u0FCD\u0FDB-\u0FFF\u10C6\u10C8-\u10CC\u10CE\u10CF\u1249\u124E\u124F\u1257\u1259\u125E\u125F\u1289\u128E\u128F\u12B1\u12B6\u12B7\u12BF\u12C1\u12C6\u12C7\u12D7\u1311\u1316\u1317\u135B\u135C\u137D-\u137F\u139A-\u139F\u13F5-\u13FF\u169D-\u169F\u16F1-\u16FF\u170D\u1715-\u171F\u1737-\u173F\u1754-\u175F\u176D\u1771\u1774-\u177F\u17DE\u17DF\u17EA-\u17EF\u17FA-\u17FF\u180F\u181A-\u181F\u1878-\u187F\u18AB-\u18AF\u18F6-\u18FF\u191D-\u191F\u192C-\u192F\u193C-\u193F\u1941-\u1943\u196E\u196F\u1975-\u197F\u19AC-\u19AF\u19CA-\u19CF\u19DB-\u19DD\u1A1C\u1A1D\u1A5F\u1A7D\u1A7E\u1A8A-\u1A8F\u1A9A-\u1A9F\u1AAE-\u1AFF\u1B4C-\u1B4F\u1B7D-\u1B7F\u1BF4-\u1BFB\u1C38-\u1C3A\u1C4A-\u1C4C\u1C80-\u1CBF\u1CC8-\u1CCF\u1CF7-\u1CFF\u1DE7-\u1DFB\u1F16\u1F17\u1F1E\u1F1F\u1F46\u1F47\u1F4E\u1F4F\u1F58\u1F5A\u1F5C\u1F5E\u1F7E\u1F7F\u1FB5\u1FC5\u1FD4\u1FD5\u1FDC\u1FF0\u1FF1\u1FF5\u1FFF\u200B-\u200F\u202A-\u202E\u2060-\u206F\u2072\u2073\u208F\u209D-\u209F\u20BB-\u20CF\u20F1-\u20FF\u218A-\u218F\u23F4-\u23FF\u2427-\u243F\u244B-\u245F\u2700\u2B4D-\u2B4F\u2B5A-\u2BFF\u2C2F\u2C5F\u2CF4-\u2CF8\u2D26\u2D28-\u2D2C\u2D2E\u2D2F\u2D68-\u2D6E\u2D71-\u2D7E\u2D97-\u2D9F\u2DA7\u2DAF\u2DB7\u2DBF\u2DC7\u2DCF\u2DD7\u2DDF\u2E3C-\u2E7F\u2E9A\u2EF4-\u2EFF\u2FD6-\u2FEF\u2FFC-\u2FFF\u3040\u3097\u3098\u3100-\u3104\u312E-\u3130\u318F\u31BB-\u31BF\u31E4-\u31EF\u321F\u32FF\u4DB6-\u4DBF\u9FCD-\u9FFF\uA48D-\uA48F\uA4C7-\uA4CF\uA62C-\uA63F\uA698-\uA69E\uA6F8-\uA6FF\uA78F\uA794-\uA79F\uA7AB-\uA7F7\uA82C-\uA82F\uA83A-\uA83F\uA878-\uA87F\uA8C5-\uA8CD\uA8DA-\uA8DF\uA8FC-\uA8FF\uA954-\uA95E\uA97D-\uA97F\uA9CE\uA9DA-\uA9DD\uA9E0-\uA9FF\uAA37-\uAA3F\uAA4E\uAA4F\uAA5A\uAA5B\uAA7C-\uAA7F\uAAC3-\uAADA\uAAF7-\uAB00\uAB07\uAB08\uAB0F\uAB10\uAB17-\uAB1F\uAB27\uAB2F-\uABBF\uABEE\uABEF\uABFA-\uABFF\uD7A4-\uD7AF\uD7C7-\uD7CA\uD7FC-\uF8FF\uFA6E\uFA6F\uFADA-\uFAFF\uFB07-\uFB12\uFB18-\uFB1C\uFB37\uFB3D\uFB3F\uFB42\uFB45\uFBC2-\uFBD2\uFD40-\uFD4F\uFD90\uFD91\uFDC8-\uFDEF\uFDFE\uFDFF\uFE1A-\uFE1F\uFE27-\uFE2F\uFE53\uFE67\uFE6C-\uFE6F\uFE75\uFEFD-\uFF00\uFFBF-\uFFC1\uFFC8\uFFC9\uFFD0\uFFD1\uFFD8\uFFD9\uFFDD-\uFFDF\uFFE7\uFFEF-\uFFFB\uFFFE\uFFFF]/g; var re = /[\0-\x08\x0B-\x0C\x0E-\x1F\x7F-\x9F\xAD\u0378\u0379\u037F-\u0383\u038B\u038D\u03A2\u0528-\u0530\u0557\u0558\u0560\u0588\u058B-\u058E\u0590\u05C8-\u05CF\u05EB-\u05EF\u05F5-\u0605\u061C\u061D\u06DD\u070E\u070F\u074B\u074C\u07B2-\u07BF\u07FB-\u07FF\u082E\u082F\u083F\u085C\u085D\u085F-\u089F\u08A1\u08AD-\u08E3\u08FF\u0978\u0980\u0984\u098D\u098E\u0991\u0992\u09A9\u09B1\u09B3-\u09B5\u09BA\u09BB\u09C5\u09C6\u09C9\u09CA\u09CF-\u09D6\u09D8-\u09DB\u09DE\u09E4\u09E5\u09FC-\u0A00\u0A04\u0A0B-\u0A0E\u0A11\u0A12\u0A29\u0A31\u0A34\u0A37\u0A3A\u0A3B\u0A3D\u0A43-\u0A46\u0A49\u0A4A\u0A4E-\u0A50\u0A52-\u0A58\u0A5D\u0A5F-\u0A65\u0A76-\u0A80\u0A84\u0A8E\u0A92\u0AA9\u0AB1\u0AB4\u0ABA\u0ABB\u0AC6\u0ACA\u0ACE\u0ACF\u0AD1-\u0ADF\u0AE4\u0AE5\u0AF2-\u0B00\u0B04\u0B0D\u0B0E\u0B11\u0B12\u0B29\u0B31\u0B34\u0B3A\u0B3B\u0B45\u0B46\u0B49\u0B4A\u0B4E-\u0B55\u0B58-\u0B5B\u0B5E\u0B64\u0B65\u0B78-\u0B81\u0B84\u0B8B-\u0B8D\u0B91\u0B96-\u0B98\u0B9B\u0B9D\u0BA0-\u0BA2\u0BA5-\u0BA7\u0BAB-\u0BAD\u0BBA-\u0BBD\u0BC3-\u0BC5\u0BC9\u0BCE\u0BCF\u0BD1-\u0BD6\u0BD8-\u0BE5\u0BFB-\u0C00\u0C04\u0C0D\u0C11\u0C29\u0C34\u0C3A-\u0C3C\u0C45\u0C49\u0C4E-\u0C54\u0C57\u0C5A-\u0C5F\u0C64\u0C65\u0C70-\u0C77\u0C80\u0C81\u0C84\u0C8D\u0C91\u0CA9\u0CB4\u0CBA\u0CBB\u0CC5\u0CC9\u0CCE-\u0CD4\u0CD7-\u0CDD\u0CDF\u0CE4\u0CE5\u0CF0\u0CF3-\u0D01\u0D04\u0D0D\u0D11\u0D3B\u0D3C\u0D45\u0D49\u0D4F-\u0D56\u0D58-\u0D5F\u0D64\u0D65\u0D76-\u0D78\u0D80\u0D81\u0D84\u0D97-\u0D99\u0DB2\u0DBC\u0DBE\u0DBF\u0DC7-\u0DC9\u0DCB-\u0DCE\u0DD5\u0DD7\u0DE0-\u0DF1\u0DF5-\u0E00\u0E3B-\u0E3E\u0E5C-\u0E80\u0E83\u0E85\u0E86\u0E89\u0E8B\u0E8C\u0E8E-\u0E93\u0E98\u0EA0\u0EA4\u0EA6\u0EA8\u0EA9\u0EAC\u0EBA\u0EBE\u0EBF\u0EC5\u0EC7\u0ECE\u0ECF\u0EDA\u0EDB\u0EE0-\u0EFF\u0F48\u0F6D-\u0F70\u0F98\u0FBD\u0FCD\u0FDB-\u0FFF\u10C6\u10C8-\u10CC\u10CE\u10CF\u1249\u124E\u124F\u1257\u1259\u125E\u125F\u1289\u128E\u128F\u12B1\u12B6\u12B7\u12BF\u12C1\u12C6\u12C7\u12D7\u1311\u1316\u1317\u135B\u135C\u137D-\u137F\u139A-\u139F\u13F5-\u13FF\u169D-\u169F\u16F1-\u16FF\u170D\u1715-\u171F\u1737-\u173F\u1754-\u175F\u176D\u1771\u1774-\u177F\u17DE\u17DF\u17EA-\u17EF\u17FA-\u17FF\u180F\u181A-\u181F\u1878-\u187F\u18AB-\u18AF\u18F6-\u18FF\u191D-\u191F\u192C-\u192F\u193C-\u193F\u1941-\u1943\u196E\u196F\u1975-\u197F\u19AC-\u19AF\u19CA-\u19CF\u19DB-\u19DD\u1A1C\u1A1D\u1A5F\u1A7D\u1A7E\u1A8A-\u1A8F\u1A9A-\u1A9F\u1AAE-\u1AFF\u1B4C-\u1B4F\u1B7D-\u1B7F\u1BF4-\u1BFB\u1C38-\u1C3A\u1C4A-\u1C4C\u1C80-\u1CBF\u1CC8-\u1CCF\u1CF7-\u1CFF\u1DE7-\u1DFB\u1F16\u1F17\u1F1E\u1F1F\u1F46\u1F47\u1F4E\u1F4F\u1F58\u1F5A\u1F5C\u1F5E\u1F7E\u1F7F\u1FB5\u1FC5\u1FD4\u1FD5\u1FDC\u1FF0\u1FF1\u1FF5\u1FFF\u200B-\u200F\u202A-\u202E\u2060-\u206F\u2072\u2073\u208F\u209D-\u209F\u20BB-\u20CF\u20F1-\u20FF\u218A-\u218F\u23F4-\u23FF\u2427-\u243F\u244B-\u245F\u2700\u2B4D-\u2B4F\u2B5A-\u2BFF\u2C2F\u2C5F\u2CF4-\u2CF8\u2D26\u2D28-\u2D2C\u2D2E\u2D2F\u2D68-\u2D6E\u2D71-\u2D7E\u2D97-\u2D9F\u2DA7\u2DAF\u2DB7\u2DBF\u2DC7\u2DCF\u2DD7\u2DDF\u2E3C-\u2E7F\u2E9A\u2EF4-\u2EFF\u2FD6-\u2FEF\u2FFC-\u2FFF\u3040\u3097\u3098\u3100-\u3104\u312E-\u3130\u318F\u31BB-\u31BF\u31E4-\u31EF\u321F\u32FF\u4DB6-\u4DBF\u9FCD-\u9FFF\uA48D-\uA48F\uA4C7-\uA4CF\uA62C-\uA63F\uA698-\uA69E\uA6F8-\uA6FF\uA78F\uA794-\uA79F\uA7AB-\uA7F7\uA82C-\uA82F\uA83A-\uA83F\uA878-\uA87F\uA8C5-\uA8CD\uA8DA-\uA8DF\uA8FC-\uA8FF\uA954-\uA95E\uA97D-\uA97F\uA9CE\uA9DA-\uA9DD\uA9E0-\uA9FF\uAA37-\uAA3F\uAA4E\uAA4F\uAA5A\uAA5B\uAA7C-\uAA7F\uAAC3-\uAADA\uAAF7-\uAB00\uAB07\uAB08\uAB0F\uAB10\uAB17-\uAB1F\uAB27\uAB2F-\uABBF\uABEE\uABEF\uABFA-\uABFF\uD7A4-\uD7AF\uD7C7-\uD7CA\uD7FC-\uF8FF\uFA6E\uFA6F\uFADA-\uFAFF\uFB07-\uFB12\uFB18-\uFB1C\uFB37\uFB3D\uFB3F\uFB42\uFB45\uFBC2-\uFBD2\uFD40-\uFD4F\uFD90\uFD91\uFDC8-\uFDEF\uFDFE\uFDFF\uFE1A-\uFE1F\uFE27-\uFE2F\uFE53\uFE67\uFE6C-\uFE6F\uFE75\uFEFD-\uFF00\uFFBF-\uFFC1\uFFC8\uFFC9\uFFD0\uFFD1\uFFD8\uFFD9\uFFDD-\uFFDF\uFFE7\uFFEF-\uFFFB\uFFFE\uFFFF]/g;
var ws_re = /[\x09-\x10\x0D\u2028\u2029]/g; var wsRe = /[\x09-\x10\x0D\u2028\u2029]/g;
str = str.replace(re, "."); str = str.replace(re, ".");
if (!preserve_ws) str = str.replace(ws_re, "."); if (!preserveWs) str = str.replace(wsRe, ".");
return str; return str;
}, },
@ -196,12 +196,12 @@ var Utils = {
* *
* @example * @example
* // returns "\x00" * // returns "\x00"
* Utils.parse_escaped_chars("\\x00"); * Utils.parseEscapedChars("\\x00");
* *
* // returns "\n" * // returns "\n"
* Utils.parse_escaped_chars("\\n"); * Utils.parseEscapedChars("\\n");
*/ */
parse_escaped_chars: function(str) { parseEscapedChars: function(str) {
return str.replace(/(\\)?\\([nrtbf]|x[\da-f]{2})/g, function(m, a, b) { return str.replace(/(\\)?\\([nrtbf]|x[\da-f]{2})/g, function(m, a, b) {
if (a === "\\") return "\\"+b; if (a === "\\") return "\\"+b;
switch (b[0]) { switch (b[0]) {
@ -225,85 +225,85 @@ var Utils = {
/** /**
* Expand an alphabet range string into a list of the characters in that range. * Expand an alphabet range string into a list of the characters in that range.
* *
* @param {string} alph_str * @param {string} alphStr
* @returns {char[]} * @returns {char[]}
* *
* @example * @example
* // returns ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"] * // returns ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
* Utils.expand_alph_range("0-9"); * Utils.expandAlphRange("0-9");
* *
* // returns ["a", "b", "c", "d", "0", "1", "2", "3", "+", "/"] * // returns ["a", "b", "c", "d", "0", "1", "2", "3", "+", "/"]
* Utils.expand_alph_range("a-d0-3+/"); * Utils.expandAlphRange("a-d0-3+/");
* *
* // returns ["a", "b", "c", "d", "0", "-", "3"] * // returns ["a", "b", "c", "d", "0", "-", "3"]
* Utils.expand_alph_range("a-d0\\-3") * Utils.expandAlphRange("a-d0\\-3")
*/ */
expand_alph_range: function(alph_str) { expandAlphRange: function(alphStr) {
var alph_arr = []; var alphArr = [];
for (var i = 0; i < alph_str.length; i++) { for (var i = 0; i < alphStr.length; i++) {
if (i < alph_str.length - 2 && if (i < alphStr.length - 2 &&
alph_str[i+1] === "-" && alphStr[i+1] === "-" &&
alph_str[i] !== "\\") { alphStr[i] !== "\\") {
var start = Utils.ord(alph_str[i]), var start = Utils.ord(alphStr[i]),
end = Utils.ord(alph_str[i+2]); end = Utils.ord(alphStr[i+2]);
for (var j = start; j <= end; j++) { for (var j = start; j <= end; j++) {
alph_arr.push(Utils.chr(j)); alphArr.push(Utils.chr(j));
} }
i += 2; i += 2;
} else if (i < alph_str.length - 2 && } else if (i < alphStr.length - 2 &&
alph_str[i] === "\\" && alphStr[i] === "\\" &&
alph_str[i+1] === "-") { alphStr[i+1] === "-") {
alph_arr.push("-"); alphArr.push("-");
i++; i++;
} else { } else {
alph_arr.push(alph_str[i]); alphArr.push(alphStr[i]);
} }
} }
return alph_arr; return alphArr;
}, },
/** /**
* Translates a hex string into an array of bytes. * Translates a hex string into an array of bytes.
* *
* @param {string} hex_str * @param {string} hexStr
* @returns {byte_array} * @returns {byteArray}
* *
* @example * @example
* // returns [0xfe, 0x09, 0xa7] * // returns [0xfe, 0x09, 0xa7]
* Utils.hex_to_byte_array("fe09a7"); * Utils.hexToByteArray("fe09a7");
*/ */
hex_to_byte_array: function(hex_str) { hexToByteArray: function(hexStr) {
// TODO: Handle errors i.e. input string is not hex // TODO: Handle errors i.e. input string is not hex
if (!hex_str) return []; if (!hexStr) return [];
hex_str = hex_str.replace(/\s+/g, ""); hexStr = hexStr.replace(/\s+/g, "");
var byte_array = []; var byteArray = [];
for (var i = 0; i < hex_str.length; i += 2) { for (var i = 0; i < hexStr.length; i += 2) {
byte_array.push(parseInt(hex_str.substr(i, 2), 16)); byteArray.push(parseInt(hexStr.substr(i, 2), 16));
} }
return byte_array; return byteArray;
}, },
/** /**
* Translates an array of bytes to a hex string. * Translates an array of bytes to a hex string.
* *
* @param {byte_array} byte_array * @param {byteArray} byteArray
* @returns {string} * @returns {string}
* *
* @example * @example
* // returns "fe09a7" * // returns "fe09a7"
* Utils.byte_array_to_hex([0xfe, 0x09, 0xa7]); * Utils.byteArrayToHex([0xfe, 0x09, 0xa7]);
*/ */
byte_array_to_hex: function(byte_array) { byteArrayToHex: function(byteArray) {
if (!byte_array) return ""; if (!byteArray) return "";
var hex_str = ""; var hexStr = "";
for (var i = 0; i < byte_array.length; i++) { for (var i = 0; i < byteArray.length; i++) {
hex_str += Utils.hex(byte_array[i]) + " "; hexStr += Utils.hex(byteArray[i]) + " ";
} }
return hex_str.slice(0, hex_str.length-1); return hexStr.slice(0, hexStr.length-1);
}, },
@ -312,25 +312,25 @@ var Utils = {
* Treats the string as UTF-8 if any values are over 255. * Treats the string as UTF-8 if any values are over 255.
* *
* @param {string} str * @param {string} str
* @returns {byte_array} * @returns {byteArray}
* *
* @example * @example
* // returns [72,101,108,108,111] * // returns [72,101,108,108,111]
* Utils.str_to_byte_array("Hello"); * Utils.strToByteArray("Hello");
* *
* // returns [228,189,160,229,165,189] * // returns [228,189,160,229,165,189]
* Utils.str_to_byte_array("你好"); * Utils.strToByteArray("你好");
*/ */
str_to_byte_array: function(str) { strToByteArray: function(str) {
var byte_array = new Array(str.length); var byteArray = new Array(str.length);
var i = str.length, b; var i = str.length, b;
while (i--) { while (i--) {
b = str.charCodeAt(i); b = str.charCodeAt(i);
byte_array[i] = b; byteArray[i] = b;
// If any of the bytes are over 255, read as UTF-8 // If any of the bytes are over 255, read as UTF-8
if (b > 255) return Utils.str_to_utf8_byte_array(str); if (b > 255) return Utils.strToUtf8ByteArray(str);
} }
return byte_array; return byteArray;
}, },
@ -338,22 +338,22 @@ var Utils = {
* Converts a string to a UTF-8 byte array. * Converts a string to a UTF-8 byte array.
* *
* @param {string} str * @param {string} str
* @returns {byte_array} * @returns {byteArray}
* *
* @example * @example
* // returns [72,101,108,108,111] * // returns [72,101,108,108,111]
* Utils.str_to_utf8_byte_array("Hello"); * Utils.strToUtf8ByteArray("Hello");
* *
* // returns [228,189,160,229,165,189] * // returns [228,189,160,229,165,189]
* Utils.str_to_utf8_byte_array("你好"); * Utils.strToUtf8ByteArray("你好");
*/ */
str_to_utf8_byte_array: function(str) { strToUtf8ByteArray: function(str) {
var word_array = CryptoJS.enc.Utf8.parse(str), var wordArray = CryptoJS.enc.Utf8.parse(str),
byte_array = Utils.word_array_to_byte_array(word_array); byteArray = Utils.wordArrayToByteArray(wordArray);
if (str.length !== word_array.sigBytes) if (str.length !== wordArray.sigBytes)
window.app.options.attempt_highlight = false; window.app.options.attemptHighlight = false;
return byte_array; return byteArray;
}, },
@ -361,54 +361,54 @@ var Utils = {
* Converts a string to a charcode array * Converts a string to a charcode array
* *
* @param {string} str * @param {string} str
* @returns {byte_array} * @returns {byteArray}
* *
* @example * @example
* // returns [72,101,108,108,111] * // returns [72,101,108,108,111]
* Utils.str_to_charcode("Hello"); * Utils.strToCharcode("Hello");
* *
* // returns [20320,22909] * // returns [20320,22909]
* Utils.str_to_charcode("你好"); * Utils.strToCharcode("你好");
*/ */
str_to_charcode: function(str) { strToCharcode: function(str) {
var byte_array = new Array(str.length); var byteArray = new Array(str.length);
var i = str.length; var i = str.length;
while (i--) { while (i--) {
byte_array[i] = str.charCodeAt(i); byteArray[i] = str.charCodeAt(i);
} }
return byte_array; return byteArray;
}, },
/** /**
* Attempts to convert a byte array to a UTF-8 string. * Attempts to convert a byte array to a UTF-8 string.
* *
* @param {byte_array} byte_array * @param {byteArray} byteArray
* @returns {string} * @returns {string}
* *
* @example * @example
* // returns "Hello" * // returns "Hello"
* Utils.byte_array_to_utf8([72,101,108,108,111]); * Utils.byteArrayToUtf8([72,101,108,108,111]);
* *
* // returns "你好" * // returns "你好"
* Utils.byte_array_to_utf8([228,189,160,229,165,189]); * Utils.byteArrayToUtf8([228,189,160,229,165,189]);
*/ */
byte_array_to_utf8: function(byte_array) { byteArrayToUtf8: function(byteArray) {
try { try {
// Try to output data as UTF-8 string // Try to output data as UTF-8 string
var words = []; var words = [];
for (var i = 0; i < byte_array.length; i++) { for (var i = 0; i < byteArray.length; i++) {
words[i >>> 2] |= byte_array[i] << (24 - (i % 4) * 8); words[i >>> 2] |= byteArray[i] << (24 - (i % 4) * 8);
} }
var word_array = new CryptoJS.lib.WordArray.init(words, byte_array.length), var wordArray = new CryptoJS.lib.WordArray.init(words, byteArray.length),
str = CryptoJS.enc.Utf8.stringify(word_array); str = CryptoJS.enc.Utf8.stringify(wordArray);
if (str.length !== word_array.sigBytes) if (str.length !== wordArray.sigBytes)
window.app.options.attempt_highlight = false; window.app.options.attemptHighlight = false;
return str; return str;
} catch (err) { } catch (err) {
// If it fails, treat it as ANSI // If it fails, treat it as ANSI
return Utils.byte_array_to_chars(byte_array); return Utils.byteArrayToChars(byteArray);
} }
}, },
@ -416,47 +416,47 @@ var Utils = {
/** /**
* Converts a charcode array to a string. * Converts a charcode array to a string.
* *
* @param {byte_array} byte_array * @param {byteArray} byteArray
* @returns {string} * @returns {string}
* *
* @example * @example
* // returns "Hello" * // returns "Hello"
* Utils.byte_array_to_chars([72,101,108,108,111]); * Utils.byteArrayToChars([72,101,108,108,111]);
* *
* // returns "你好" * // returns "你好"
* Utils.byte_array_to_chars([20320,22909]); * Utils.byteArrayToChars([20320,22909]);
*/ */
byte_array_to_chars: function(byte_array) { byteArrayToChars: function(byteArray) {
if (!byte_array) return ""; if (!byteArray) return "";
var str = ""; var str = "";
for (var i = 0; i < byte_array.length;) { for (var i = 0; i < byteArray.length;) {
str += String.fromCharCode(byte_array[i++]); str += String.fromCharCode(byteArray[i++]);
} }
return str; return str;
}, },
/** /**
* Converts a CryptoJS.lib.WordArray to a byte_array. * Converts a CryptoJS.lib.WordArray to a byteArray.
* *
* @param {CryptoJS.lib.WordArray} word_array * @param {CryptoJS.lib.WordArray} wordArray
* @returns {byte_array} * @returns {byteArray}
* *
* @example * @example
* // returns [84, 101, 115, 116] * // returns [84, 101, 115, 116]
* Utils.word_array_to_byte_array(CryptoJS.enc.Hex.parse("54657374")); * Utils.wordArrayToByteArray(CryptoJS.enc.Hex.parse("54657374"));
*/ */
word_array_to_byte_array: function(word_array) { wordArrayToByteArray: function(wordArray) {
if (word_array.sigBytes <= 0) return []; if (wordArray.sigBytes <= 0) return [];
var words = word_array.words, var words = wordArray.words,
byte_array = []; byteArray = [];
for (var i = 0; i < word_array.sigBytes; i++) { for (var i = 0; i < wordArray.sigBytes; i++) {
byte_array.push((words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff); byteArray.push((words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff);
} }
return byte_array; return byteArray;
}, },
@ -536,20 +536,20 @@ var Utils = {
/** /**
* Converts a Unicode string to Windows-1251 encoding * Converts a Unicode string to Windows-1251 encoding
* *
* @param {string} unic_str * @param {string} unicStr
* @returns {string} String encoded in Windows-1251 * @returns {string} String encoded in Windows-1251
* *
* @example * @example
* // returns "îáíîâëåííàÿ òåõíè÷êà ïî Áîèíãó. îðèãèíàë ó ìåíÿ. çàáåðåòå êîãäà áóäåòå â ÊÈ" * // returns "îáíîâëåííàÿ òåõíè÷êà ïî Áîèíãó. îðèãèíàë ó ìåíÿ. çàáåðåòå êîãäà áóäåòå â ÊÈ"
* Utils.unicode_to_win1251("обновленная техничка по Боингу. оригинал у меня. заберете когда будете в КИ"); * Utils.unicodeToWin1251("обновленная техничка по Боингу. оригинал у меня. заберете когда будете в КИ");
*/ */
unicode_to_win1251: function(unic_str) { unicodeToWin1251: function(unicStr) {
var res = []; var res = [];
for (var i = 0; i < unic_str.length; i++) { for (var i = 0; i < unicStr.length; i++) {
var ord = unic_str.charCodeAt(i); var ord = unicStr.charCodeAt(i);
if (!(ord in Utils.UNIC_WIN1251_MAP)) if (!(ord in Utils.UNIC_WIN1251_MAP))
throw "Character '" + unic_str.charAt(i) + "' isn't supported by Windows-1251"; throw "Character '" + unicStr.charAt(i) + "' isn't supported by Windows-1251";
res.push(String.fromCharCode(Utils.UNIC_WIN1251_MAP[ord])); res.push(String.fromCharCode(Utils.UNIC_WIN1251_MAP[ord]));
} }
@ -560,20 +560,20 @@ var Utils = {
/** /**
* Converts a Windows-1251 string to Unicode encoding * Converts a Windows-1251 string to Unicode encoding
* *
* @param {string} win1251_str * @param {string} win1251Str
* @returns {string} String encoded in Unicode * @returns {string} String encoded in Unicode
* *
* @example * @example
* // returns "обновленная техничка по Боингу. оригинал у меня. заберете когда будете в КИ" * // returns "обновленная техничка по Боингу. оригинал у меня. заберете когда будете в КИ"
* Utils.unicode_to_win1251("îáíîâëåííàÿ òåõíè÷êà ïî Áîèíãó. îðèãèíàë ó ìåíÿ. çàáåðåòå êîãäà áóäåòå â ÊÈ"); * Utils.unicodeToWin1251("îáíîâëåííàÿ òåõíè÷êà ïî Áîèíãó. îðèãèíàë ó ìåíÿ. çàáåðåòå êîãäà áóäåòå â ÊÈ");
*/ */
win1251_to_unicode: function(win1251_str) { win1251ToUnicode: function(win1251Str) {
var res = []; var res = [];
for (var i = 0; i < win1251_str.length; i++) { for (var i = 0; i < win1251Str.length; i++) {
var ord = win1251_str.charCodeAt(i); var ord = win1251Str.charCodeAt(i);
if (!(ord in Utils.WIN1251_UNIC_MAP)) if (!(ord in Utils.WIN1251_UNIC_MAP))
throw "Character '" + win1251_str.charAt(i) + "' isn't supported by Windows-1251"; throw "Character '" + win1251Str.charAt(i) + "' isn't supported by Windows-1251";
res.push(String.fromCharCode(Utils.WIN1251_UNIC_MAP[ord])); res.push(String.fromCharCode(Utils.WIN1251_UNIC_MAP[ord]));
} }
@ -584,25 +584,25 @@ var Utils = {
/** /**
* Base64's the input byte array using the given alphabet, returning a string. * Base64's the input byte array using the given alphabet, returning a string.
* *
* @param {byte_array|string} data * @param {byteArray|string} data
* @param {string} [alphabet] * @param {string} [alphabet]
* @returns {string} * @returns {string}
* *
* @example * @example
* // returns "SGVsbG8=" * // returns "SGVsbG8="
* Utils.to_base64([72, 101, 108, 108, 111]); * Utils.toBase64([72, 101, 108, 108, 111]);
* *
* // returns "SGVsbG8=" * // returns "SGVsbG8="
* Utils.to_base64("Hello"); * Utils.toBase64("Hello");
*/ */
to_base64: function(data, alphabet) { toBase64: function(data, alphabet) {
if (!data) return ""; if (!data) return "";
if (typeof data == "string") { if (typeof data == "string") {
data = Utils.str_to_byte_array(data); data = Utils.strToByteArray(data);
} }
alphabet = alphabet ? alphabet = alphabet ?
Utils.expand_alph_range(alphabet).join("") : Utils.expandAlphRange(alphabet).join("") :
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
var output = "", var output = "",
chr1, chr2, chr3, chr1, chr2, chr3,
@ -636,38 +636,38 @@ var Utils = {
/** /**
* UnBase64's the input string using the given alphabet, returning a byte array. * UnBase64's the input string using the given alphabet, returning a byte array.
* *
* @param {byte_array} data * @param {byteArray} data
* @param {string} [alphabet] * @param {string} [alphabet]
* @param {string} [return_type="string"] - Either "string" or "byte_array" * @param {string} [returnType="string"] - Either "string" or "byteArray"
* @param {boolean} [remove_non_alph_chars=true] * @param {boolean} [removeNonAlphChars=true]
* @returns {byte_array} * @returns {byteArray}
* *
* @example * @example
* // returns "Hello" * // returns "Hello"
* Utils.from_base64("SGVsbG8="); * Utils.fromBase64("SGVsbG8=");
* *
* // returns [72, 101, 108, 108, 111] * // returns [72, 101, 108, 108, 111]
* Utils.from_base64("SGVsbG8=", null, "byte_array"); * Utils.fromBase64("SGVsbG8=", null, "byteArray");
*/ */
from_base64: function(data, alphabet, return_type, remove_non_alph_chars) { fromBase64: function(data, alphabet, returnType, removeNonAlphChars) {
return_type = return_type || "string"; returnType = returnType || "string";
if (!data) { if (!data) {
return return_type === "string" ? "" : []; return returnType === "string" ? "" : [];
} }
alphabet = alphabet ? alphabet = alphabet ?
Utils.expand_alph_range(alphabet).join("") : Utils.expandAlphRange(alphabet).join("") :
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
if (remove_non_alph_chars === undefined) if (removeNonAlphChars === undefined)
remove_non_alph_chars = true; removeNonAlphChars = true;
var output = [], var output = [],
chr1, chr2, chr3, chr1, chr2, chr3,
enc1, enc2, enc3, enc4, enc1, enc2, enc3, enc4,
i = 0; i = 0;
if (remove_non_alph_chars) { if (removeNonAlphChars) {
var re = new RegExp("[^" + alphabet.replace(/[\[\]\\\-^$]/g, "\\$&") + "]", "g"); var re = new RegExp("[^" + alphabet.replace(/[\[\]\\\-^$]/g, "\\$&") + "]", "g");
data = data.replace(re, ""); data = data.replace(re, "");
} }
@ -696,26 +696,26 @@ var Utils = {
} }
} }
return return_type === "string" ? Utils.byte_array_to_utf8(output) : output; return returnType === "string" ? Utils.byteArrayToUtf8(output) : output;
}, },
/** /**
* Convert a byte array into a hex string. * Convert a byte array into a hex string.
* *
* @param {byte_array} data * @param {byteArray} data
* @param {string} [delim=" "] * @param {string} [delim=" "]
* @param {number} [padding=2] * @param {number} [padding=2]
* @returns {string} * @returns {string}
* *
* @example * @example
* // returns "0a 14 1e" * // returns "0a 14 1e"
* Utils.to_hex([10,20,30]); * Utils.toHex([10,20,30]);
* *
* // returns "0a:14:1e" * // returns "0a:14:1e"
* Utils.to_hex([10,20,30], ":"); * Utils.toHex([10,20,30], ":");
*/ */
to_hex: function(data, delim, padding) { toHex: function(data, delim, padding) {
if (!data) return ""; if (!data) return "";
delim = typeof delim == "string" ? delim : " "; delim = typeof delim == "string" ? delim : " ";
@ -740,14 +740,14 @@ var Utils = {
/** /**
* Convert a byte array into a hex string as efficiently as possible with no options. * Convert a byte array into a hex string as efficiently as possible with no options.
* *
* @param {byte_array} data * @param {byteArray} data
* @returns {string} * @returns {string}
* *
* @example * @example
* // returns "0a141e" * // returns "0a141e"
* Utils.to_hex([10,20,30]); * Utils.toHex([10,20,30]);
*/ */
to_hex_fast: function(data) { toHexFast: function(data) {
if (!data) return ""; if (!data) return "";
var output = []; var output = [];
@ -766,27 +766,27 @@ var Utils = {
* *
* @param {string} data * @param {string} data
* @param {string} [delim] * @param {string} [delim]
* @param {number} [byte_len=2] * @param {number} [byteLen=2]
* @returns {byte_array} * @returns {byteArray}
* *
* @example * @example
* // returns [10,20,30] * // returns [10,20,30]
* Utils.from_hex("0a 14 1e"); * Utils.fromHex("0a 14 1e");
* *
* // returns [10,20,30] * // returns [10,20,30]
* Utils.from_hex("0a:14:1e", "Colon"); * Utils.fromHex("0a:14:1e", "Colon");
*/ */
from_hex: function(data, delim, byte_len) { fromHex: function(data, delim, byteLen) {
delim = delim || (data.indexOf(" ") >= 0 ? "Space" : "None"); delim = delim || (data.indexOf(" ") >= 0 ? "Space" : "None");
byte_len = byte_len || 2; byteLen = byteLen || 2;
if (delim !== "None") { if (delim !== "None") {
var delim_regex = Utils.regex_rep[delim]; var delimRegex = Utils.regexRep[delim];
data = data.replace(delim_regex, ""); data = data.replace(delimRegex, "");
} }
var output = []; var output = [];
for (var i = 0; i < data.length; i += byte_len) { for (var i = 0; i < data.length; i += byteLen) {
output.push(parseInt(data.substr(i, byte_len), 16)); output.push(parseInt(data.substr(i, byteLen), 16));
} }
return output; return output;
}, },
@ -800,33 +800,33 @@ var Utils = {
* *
* @example * @example
* // returns [["head1", "head2"], ["data1", "data2"]] * // returns [["head1", "head2"], ["data1", "data2"]]
* Utils.parse_csv("head1,head2\ndata1,data2"); * Utils.parseCSV("head1,head2\ndata1,data2");
*/ */
parse_csv: function(data) { parseCSV: function(data) {
var b, var b,
ignore_next = false, ignoreNext = false,
in_string = false, inString = false,
cell = "", cell = "",
line = [], line = [],
lines = []; lines = [];
for (var i = 0; i < data.length; i++) { for (var i = 0; i < data.length; i++) {
b = data[i]; b = data[i];
if (ignore_next) { if (ignoreNext) {
cell += b; cell += b;
ignore_next = false; ignoreNext = false;
} else if (b === "\\") { } else if (b === "\\") {
cell += b; cell += b;
ignore_next = true; ignoreNext = true;
} else if (b === "\"" && !in_string) { } else if (b === "\"" && !inString) {
in_string = true; inString = true;
} else if (b === "\"" && in_string) { } else if (b === "\"" && inString) {
in_string = false; inString = false;
} else if (b === "," && !in_string) { } else if (b === "," && !inString) {
line.push(cell); line.push(cell);
cell = ""; cell = "";
} else if ((b === "\n" || b === "\r") && !in_string) { } else if ((b === "\n" || b === "\r") && !inString) {
line.push(cell); line.push(cell);
cell = ""; cell = "";
lines.push(line); lines.push(line);
@ -848,19 +848,19 @@ var Utils = {
/** /**
* Removes all HTML (or XML) tags from the input string. * Removes all HTML (or XML) tags from the input string.
* *
* @param {string} html_str * @param {string} htmlStr
* @param {boolean} remove_script_and_style - Flag to specify whether to remove entire script or style blocks * @param {boolean} removeScriptAndStyle - Flag to specify whether to remove entire script or style blocks
* @returns {string} * @returns {string}
* *
* @example * @example
* // returns "Test" * // returns "Test"
* Utils.strip_html_tags("<div>Test</div>"); * Utils.stripHtmlTags("<div>Test</div>");
*/ */
strip_html_tags: function(html_str, remove_script_and_style) { stripHtmlTags: function(htmlStr, removeScriptAndStyle) {
if (remove_script_and_style) { if (removeScriptAndStyle) {
html_str = html_str.replace(/<(script|style)[^>]*>.*<\/(script|style)>/gmi, ""); htmlStr = htmlStr.replace(/<(script|style)[^>]*>.*<\/(script|style)>/gmi, "");
} }
return html_str.replace(/<[^>\n]+>/g, ""); return htmlStr.replace(/<[^>\n]+>/g, "");
}, },
@ -872,9 +872,9 @@ var Utils = {
* *
* @example * @example
* // return "A &lt;script> tag" * // return "A &lt;script> tag"
* Utils.escape_html("A <script> tag"); * Utils.escapeHtml("A <script> tag");
*/ */
escape_html: function(str) { escapeHtml: function(str) {
return str.replace(/</g, "&lt;") return str.replace(/</g, "&lt;")
.replace(/'/g, "&apos;") .replace(/'/g, "&apos;")
.replace(/"/g, "&quot;") .replace(/"/g, "&quot;")
@ -904,12 +904,12 @@ var Utils = {
* *
* @example * @example
* // returns "3 minutes" * // returns "3 minutes"
* Utils.fuzzy_time(152435); * Utils.fuzzyTime(152435);
* *
* // returns "5 days" * // returns "5 days"
* Utils.fuzzy_time(456851321); * Utils.fuzzyTime(456851321);
*/ */
fuzzy_time: function(ms) { fuzzyTime: function(ms) {
return moment.duration(ms, "milliseconds").humanize(); return moment.duration(ms, "milliseconds").humanize();
}, },
@ -933,7 +933,7 @@ var Utils = {
* A mapping of names of delimiter characters to their symbols. * A mapping of names of delimiter characters to their symbols.
* @constant * @constant
*/ */
char_rep: { charRep: {
"Space": " ", "Space": " ",
"Comma": ",", "Comma": ",",
"Semi-colon": ";", "Semi-colon": ";",
@ -951,7 +951,7 @@ var Utils = {
* A mapping of names of delimiter characters to regular expressions which can select them. * A mapping of names of delimiter characters to regular expressions which can select them.
* @constant * @constant
*/ */
regex_rep: { regexRep: {
"Space": /\s+/g, "Space": /\s+/g,
"Comma": /,/g, "Comma": /,/g,
"Semi-colon": /;/g, "Semi-colon": /;/g,

View File

@ -0,0 +1,768 @@
/** @license
========================================================================
Crypto API for JavaScript - https://github.com/nf404/crypto-api
The MIT License (MIT)
Copyright (c) 2015 nf404
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
/*global module, require */
(/**
* @param {Object} root
* @returns {CryptoApi}
*/
function (root) {
'use strict';
/**
* @class CryptoApi
* @classdesc Main class
* @public
*/
var CryptoApi = function cryptoApi () {
/**
* @property Hashers
* @type {Hashers}
*/
this.Hashers = new Hashers();
/**
* @property Encodes
* @type {Encodes}
*/
this.Encodes = new Encodes();
/**
* @property Macs
* @type {Macs}
*/
this.Macs = new Macs();
/**
* @property Tools
* @type {Tools}
*/
this.Tools = new Tools();
};
/**
* @interface HasherInterface
* @classdesc All hashers MUST implement this interface
* @public
*/
var HasherInterface = function () {};
/**
* @memberOf HasherInterface
* @constructor
*/
HasherInterface.prototype.constructor = function constructor() {};
/**
* @desc Process ready block
* @memberOf HasherInterface
* @method processBlock
* @param {number[]} block
*/
HasherInterface.prototype.processBlock = function processBlock(block) {};
/**
* Update message
* @memberOf HasherInterface
* @method update
* @param {string} message
*/
HasherInterface.prototype.update = function update(message) {};
/**
* @desc Process last block and return hash
* @memberOf HasherInterface
* @method finalize
* @return {HashArray} hash
*/
HasherInterface.prototype.finalize = function finalize() {};
/**
* @class BaseHasher
* @param {string} name
* @param {Object} options
* @public
*/
var BaseHasher = function(name, options) {};
BaseHasher.prototype.constructor = function (name, options) {
/**
* @desc Hasher name
* @property name
* @type {string}
*/
this.name = name;
/**
* @desc All algorithm variables that changed during process
* @property state
* @type {Object}
*/
this.state = {};
/**
* @desc Unprocessed Message
* @memberof! BaseHasher#
* @alias state.message
* @type {number[]}
*/
this.state.message = [];
/**
* @desc Length of message
* @memberof! BaseHasher#
* @alias state.length
* @type {number}
*/
this.state.length = 0;
/**
* @memberof! BaseHasher#
* @alias state.options
* @type {Object}
*/
this.state.options = options;
this.blockUnits = [];
};
/**
* Size of unit in bytes (4 = 32 bits)
* @memberOf BaseHasher
* @member {number} unitSize
* @static
*/
BaseHasher.prototype.unitSize = 4;
/**
* Bytes order in unit
* 0 - normal
* 1 - reverse
* @memberOf BaseHasher
* @member {number} unitOrder
* @static
*/
BaseHasher.prototype.unitOrder = 0;
/**
* Size of block in units
* @memberOf BaseHasher
* @member {number} blockSize
* @static
*/
BaseHasher.prototype.blockSize = 16;
/**
* Return current state
* @memberOf BaseHasher
* @method getState
* @returns {Object}
*/
BaseHasher.prototype.getState = function getState() {
return JSON.parse(JSON.stringify(this.state));
};
/**
* Set state
* @memberOf BaseHasher
* @method setState
* @param {Object} state
* @return {HasherInterface}
*/
BaseHasher.prototype.setState = function setState(state) {
this.state = state;
return this;
};
/**
* Update message
* @memberOf BaseHasher
* @method update
* @param {string} message
*/
BaseHasher.prototype.update = function update(message) {
var l = 0;
for (var i = 0, msgLen = message.length; i < msgLen; i++) {
var charcode = message.charCodeAt(i);
if (charcode < 0x80) {
this.state.message.push(charcode);
l += 1;
}
else if (charcode < 0x800) {
this.state.message.push(0xc0 | (charcode >> 6),
0x80 | (charcode & 0x3f));
l += 2;
}
else if (charcode < 0xd800 || charcode >= 0xe000) {
this.state.message.push(0xe0 | (charcode >> 12),
0x80 | ((charcode >> 6) & 0x3f),
0x80 | (charcode & 0x3f));
l += 3;
}
// surrogate pair
else {
i++;
// UTF-16 encodes 0x10000-0x10FFFF by
// subtracting 0x10000 and splitting the
// 20 bits of 0x0-0xFFFFF into two halves
charcode = 0x10000 + (((charcode & 0x3ff) << 10)
| (message.charCodeAt(i) & 0x3ff));
this.state.message.push(0xf0 | (charcode >> 18),
0x80 | ((charcode >> 12) & 0x3f),
0x80 | ((charcode >> 6) & 0x3f),
0x80 | (charcode & 0x3f));
l += 4;
}
}
this.state.length += l;
this.process();
};
/**
* Update message from array
* @memberOf BaseHasher
* @method updateFromArray
* @param {number[]} message
* @return {BaseHasher}
*/
BaseHasher.prototype.updateFromArray = function updateFromArray(message) {
this.state.length += message.length;
this.state.message = this.state.message.concat(message);
this.process();
return this;
};
/**
* Process ready blocks
* @memberOf BaseHasher
* @method process
*/
BaseHasher.prototype.process = function process() {
while (this.state.message.length >= this.blockSize * this.unitSize) {
var j = 0, b = 0, block = this.state.message.splice(0, this.blockSize * this.unitSize);
if (this.unitSize > 1) {
this.blockUnits = [];
for (var i = 0, u = 0; i < block.length; i += this.unitSize, u++) {
if (this.unitOrder === 1) {
for (j = this.unitSize - 1, b = 0; j >= 0; j--, b += 8) {
this.blockUnits[u] |= (block[i + j] << b);
}
} else {
for (j = 0, b = 0; j < this.unitSize; j++, b += 8) {
this.blockUnits[u] |= (block[i + j] << b);
}
}
}
this.processBlock(this.blockUnits);
} else {
this.processBlock(block);
}
}
};
/**
* @memberOf CryptoApi
* @member {BaseHasher} BaseHasher
*/
CryptoApi.prototype.BaseHasher = BaseHasher;
/**
* @class Hasher8
* @desc Hasher for 32 bit little endian blocks
* @extends BaseHasher
* @param {string} name
* @param {Object} options
* @public
*/
var Hasher8 = function (name, options) {
this.constructor(name, options);
};
Hasher8.prototype = Object.create(BaseHasher.prototype);
/**
* @desc Normal order of bytes
* @memberOf Hasher8#
* @member {number} unitOrder
*/
Hasher8.prototype.unitOrder = 0;
/**
* @desc Size of unit = 1 byte
* @memberOf Hasher8#
* @member {number} unitSize
*/
Hasher8.prototype.unitSize = 1;
/**
* @memberOf Hasher8
* @constructor
* @param {string} name
* @param {Object} options
*/
Hasher8.prototype.constructor = function (name, options) {
BaseHasher.prototype.constructor.call(this, name, options);
};
/**
* Process ready blocks
* @memberOf Hasher8
* @method process
*/
Hasher8.prototype.process = function process() {
while (this.state.message.length >= this.blockSize * this.unitSize) {
var block = this.state.message.splice(0, this.blockSize * this.unitSize);
this.blockUnits = [];
for (var i = 0; i < this.blockSize; i++) {
this.blockUnits[i] = (block[i]);
}
this.processBlock(this.blockUnits);
}
};
/**
* @memberOf CryptoApi
* @member {Hasher8} Hasher8
*/
CryptoApi.prototype.Hasher8 = Hasher8;
/**
* @class Hasher32le
* @desc Hasher for 32 bit little endian blocks
* @extends BaseHasher
* @param {string} name
* @param {Object} options
* @public
*/
var Hasher32le = function (name, options) {
this.constructor(name, options);
};
Hasher32le.prototype = Object.create(BaseHasher.prototype);
Hasher32le.prototype.unitOrder = 0; // Normal order of bytes
/**
* @memberOf Hasher32le
* @constructor
* @param {string} name
* @param {Object} options
*/
Hasher32le.prototype.constructor = function (name, options) {
BaseHasher.prototype.constructor.call(this, name, options);
};
/**
* Process ready blocks
* @memberOf Hasher32le
* @method process
*/
Hasher32le.prototype.process = function process() {
while (this.state.message.length >= this.blockSize * this.unitSize) {
var block = this.state.message.splice(0, this.blockSize * this.unitSize);
this.blockUnits = [];
for (var i = 0, b = 0; i < this.blockSize; i++, b+=4) {
this.blockUnits[i] = (block[b]);
this.blockUnits[i] |= (block[b + 1] << 8);
this.blockUnits[i] |= (block[b + 2] << 16);
this.blockUnits[i] |= (block[b + 3] << 24);
}
this.processBlock(this.blockUnits);
}
};
/**
* @memberOf CryptoApi
* @member {Hasher32le} Hasher32
*/
CryptoApi.prototype.Hasher32le = Hasher32le;
/**
* @class Hasher32be
* @desc Hasher for 32 bit big endian blocks
* @extends BaseHasher
* @param {string} name
* @param {Object} options
* @public
*/
var Hasher32be = function (name, options) {
this.constructor(name, options);
};
Hasher32be.prototype = Object.create(BaseHasher.prototype);
Hasher32be.prototype.unitOrder = 1; // Reverse order of bytes
/**
* @memberOf Hasher32be
* @constructor
* @param {string} name
* @param {Object} options
*/
Hasher32be.prototype.constructor = function (name, options) {
BaseHasher.prototype.constructor.call(this, name, options);
};
/**
* Process ready blocks
* @memberOf Hasher32be
* @method process
*/
Hasher32be.prototype.process = function process() {
while (this.state.message.length >= this.blockSize * this.unitSize) {
var block = this.state.message.splice(0, this.blockSize * this.unitSize);
this.blockUnits = [];
for (var i = 0, b = 0; i < this.blockSize; i++, b+=4) {
this.blockUnits[i] = (block[b] << 24);
this.blockUnits[i] |= (block[b + 1] << 16);
this.blockUnits[i] |= (block[b + 2] << 8);
this.blockUnits[i] |= (block[b + 3]);
}
this.processBlock(this.blockUnits);
}
};
/**
* @memberOf CryptoApi
* @member {Hasher32be} Hasher32be
*/
CryptoApi.prototype.Hasher32be = Hasher32be;
/**
* @interface MacInterface
* @classdesc All coders MUST implement this interface
* @public
*/
var MacInterface = function () {};
/**
* @memberOf MacInterface
* @param {string|number[]} key
* @param {string} hasher
* @param {Object} options
* @constructor
*/
MacInterface.prototype.constructor = function constructor(key, hasher, options) {};
/**
* @desc Process ready block
* @memberOf MacInterface
* @method processBlock
* @param {number[]} block
*/
MacInterface.prototype.processBlock = function processBlock(block) {};
/**
* Update message
* @memberOf MacInterface
* @method update
* @param {string|number[]} message
* @return {MacInterface}
*/
MacInterface.prototype.update = function update(message) {};
/**
* @desc Process last block and return hash
* @memberOf MacInterface
* @method finalize
* @return {HashArray} hash
*/
MacInterface.prototype.finalize = function finalize() {};
/**
* @class BaseMac
* @extends BaseHasher
* @param {string|number[]} key
* @param {string} hasher
* @param {Object} options
* @public
*/
var BaseMac = function(key, hasher, options) {};
BaseMac.prototype = Object.create(BaseHasher.prototype);
BaseMac.prototype.constructor = function (key, hasher, options) {
BaseHasher.prototype.constructor.call(this, hasher, options);
};
/**
* @memberOf CryptoApi
* @member {BaseMac} BaseMac
*/
CryptoApi.prototype.BaseMac = BaseMac;
/**
* @interface EncodeInterface
* @classdesc All encodes MUST implement this interface
* @public
*/
var EncodeInterface = function () {};
/**
* @memberOf EncodeInterface
* @constructor
* @param {HashArray} hash
*/
EncodeInterface.prototype.constructor = function constructor(hash) {};
/**
* @desc Stringify hash
* @memberOf EncodeInterface
* @method stringify
* @returns {string}
*/
EncodeInterface.prototype.stringify = function encode() {};
/**
* @class BaseEncode
* @desc Encode HashArray
* @param {HashArray} hash
* @public
*/
var BaseEncode = function (hash) {};
/**
* @memberOf BaseEncode
* @constructor
* @param {HashArray} hash
*/
BaseEncode.prototype.constructor = function constructor(hash) {
/**
* @property hash
* @type {HashArray}
*/
this.hash = hash;
};
/**
* @memberOf CryptoApi
* @member {BaseEncode} BaseEncode
*/
CryptoApi.prototype.BaseEncode = BaseEncode;
/**
* @class Hashers
* @classdesc Collection of hashers
*/
var Hashers = function hashers() {
/**
* @property hashers
* @type {Object}
*/
this.hashers = {};
};
/**
* @memberOf Hashers
* @method add
* @param {string} name
* @param {HasherInterface} hasher
*/
Hashers.prototype.add = function add(name, hasher) {
if (hasher === undefined) {
throw Error('Error adding hasher: ' + name);
}
this.hashers[name] = hasher;
};
/**
* @memberOf Hashers
* @method add
* @param {string} name
* @param {Object} options
* @returns {HasherInterface}
*/
Hashers.prototype.get = function get(name, options) {
var Hasher = this.hashers[name];
if ((Hasher === undefined) && (typeof require !== 'undefined')) {
var filename = name;
if (filename === 'sha224') {
filename = 'sha256';
}
require('./hasher.' + filename);
Hasher = this.hashers[name];
}
if (Hasher === undefined) {
throw Error('No hash algorithm: ' + name);
}
return new Hasher(name, options);
};
/**
* @class Encodes
* @classdesc Collection of encodes
*/
var Encodes = function encodes() {
/**
* @property encodes
* @type {Object}
*/
this.encodes = {};
};
/**
* @memberOf Encodes
* @method add
* @param {string} name
* @param {BaseEncode} encode
*/
Encodes.prototype.add = function add(name, encode) {
if (encode === undefined) {
throw Error('Error adding encode: ' + name);
}
this.encodes[name] = encode;
};
/**
* @memberOf Encodes
* @method get
* @param {string} name
* @param {HashArray} hash
* @returns {BaseEncode}
*/
Encodes.prototype.get = function get(name, hash) {
var Encode = this.encodes[name];
if ((Encode === undefined) && (typeof require !== 'undefined')) {
require('./enc.' + name);
Encode = this.encodes[name];
}
if (Encode === undefined) {
throw Error('No encode type: ' + name);
}
return new Encode(hash);
};
/**
* @class Macs
* @classdesc Collection of macs
*/
var Macs = function macs() {
/**
* @property macs
* @type {Object}
*/
this.macs = {};
};
/**
* @memberOf Macs
* @method add
* @param {string} name
* @param {BaseMac} mac
*/
Macs.prototype.add = function add(name, mac) {
if (mac === undefined) {
throw Error('Error adding mac: ' + name);
}
this.macs[name] = mac;
};
/**
* @memberOf Macs
* @method get
* @param {string} name
* @param {string|number[]} key
* @param {string} hasher
* @param {Object} options
* @returns {MacInterface}
*/
Macs.prototype.get = function get(name, key, hasher, options) {
var Mac = this.macs[name];
if ((Mac === undefined) && (typeof require !== 'undefined')) {
require('./mac.' + name);
Mac = this.macs[name];
}
if (Mac === undefined) {
throw Error('No mac type: ' + name);
}
return new Mac(key, hasher, options);
};
/**
* @class Tools
* @classdesc Helper with some methods
*/
var Tools = function tools() {};
/**
* Rotate x to n bits left
* @memberOf Tools
* @method rotateLeft
* @param {number} x
* @param {number} n
* @returns {number}
*/
Tools.prototype.rotateLeft = function rotateLeft(x, n) {
return ((x << n) | (x >>> (32 - n))) | 0;
};
/**
* Rotate x to n bits right
* @memberOf Tools
* @method rotateLeft
* @param {number} x
* @param {number} n
* @returns {number}
*/
Tools.prototype.rotateRight = function rotateLeft(x, n) {
return ((x >>> n) | (x << (32 - n))) | 0;
};
/**
* @class HashArray
* @classdesc Array of hash bytes
* @instanceof {Array}
* @param {number[]} hash
* @param {Encodes} Encodes
* @public
*/
var HashArray = function (hash, Encodes) {
Array.prototype.push.apply(this, hash);
/**
* @property Encodes
* @type {Encodes}
*/
this.Encodes = Encodes;
};
HashArray.prototype = Object.create(Array.prototype);
HashArray.prototype.constructor = HashArray;
/**
* Get hash as string
* @param {string} method
* @returns {string|*}
*/
HashArray.prototype.stringify = function stringify(method) {
return this.Encodes.get(method, this).stringify();
};
/**
* Hash message with algo
*
* @memberof CryptoApi
* @method hash
* @public
* @param {string} algo
* @param {string} message
* @param {Object} options
* @return {HashArray} hash
*/
CryptoApi.prototype.hash = function hash(algo, message, options) {
var hash = this.hasher(algo, options);
hash.update(message);
return hash.finalize();
};
/**
* Get new Hasher object
*
* @memberof CryptoApi
* @method hasher
* @public
* @param {string} algo
* @param {Object} options
* @returns {HasherInterface}
*/
CryptoApi.prototype.hasher = function hasher(algo, options) {
return this.Hashers.get(algo, options);
};
/**
* Get new MAC object
*
* @memberof CryptoApi
* @method mac
* @public
* @param {string} algo
* @param {string|number[]} key
* @param {string} hasher
* @param {Object} options
* @returns {MacInterface}
*/
CryptoApi.prototype.mac = function mac(algo, key, hasher, options) {
return this.Macs.get(algo, key, hasher, options);
};
/**
* Get new HashArray
*
* @memberof CryptoApi
* @method hashArray
* @public
* @param {number[]} hash
* @returns {HashArray}
*/
CryptoApi.prototype.hashArray = function hashArray(hash) {
return new HashArray(hash, this.Encodes);
};
root.CryptoApi = new CryptoApi();
if (typeof module !== 'undefined' && module.exports) {
module.exports = root.CryptoApi;
} else {
return root.CryptoApi;
}
})(this);

View File

@ -0,0 +1,113 @@
/*global require */
(/**
* @param {CryptoApi} CryptoApi
* @returns {Md2}
*/
function (CryptoApi) {
'use strict';
/**
* @class Md2
* @extends Hasher8
* @implements HasherInterface
* @desc Md2 hasher
*/
var Md2 = function (name, options) {
this.constructor(name, options);
};
Md2.prototype = Object.create(CryptoApi.Hasher8.prototype);
/**
* @memberOf Md2
* @constructor
*/
Md2.prototype.constructor = function (name, options) {
CryptoApi.Hasher8.prototype.constructor.call(this, name, options);
/**
* @desc Hash state
* @memberOf! Md2#
* @alias state.hash
* @type {number[]}
*/
this.state.hash = new Array(48);
/**
* @desc Checksum
* @memberOf! Md2#
* @alias state.checksum
* @type {number[]}
*/
this.state.checksum = new Array(16);
};
/**
* @desc Constants from Pi
* @link https://github.com/e-sushi/MD2-S-box-creator
* @memberOf Md2#
* @member {number[]} piSubst
*/
Md2.prototype.piSubst = [
0x29, 0x2E, 0x43, 0xC9, 0xA2, 0xD8, 0x7C, 0x01, 0x3D, 0x36, 0x54, 0xA1, 0xEC, 0xF0, 0x06, 0x13,
0x62, 0xA7, 0x05, 0xF3, 0xC0, 0xC7, 0x73, 0x8C, 0x98, 0x93, 0x2B, 0xD9, 0xBC, 0x4C, 0x82, 0xCA,
0x1E, 0x9B, 0x57, 0x3C, 0xFD, 0xD4, 0xE0, 0x16, 0x67, 0x42, 0x6F, 0x18, 0x8A, 0x17, 0xE5, 0x12,
0xBE, 0x4E, 0xC4, 0xD6, 0xDA, 0x9E, 0xDE, 0x49, 0xA0, 0xFB, 0xF5, 0x8E, 0xBB, 0x2F, 0xEE, 0x7A,
0xA9, 0x68, 0x79, 0x91, 0x15, 0xB2, 0x07, 0x3F, 0x94, 0xC2, 0x10, 0x89, 0x0B, 0x22, 0x5F, 0x21,
0x80, 0x7F, 0x5D, 0x9A, 0x5A, 0x90, 0x32, 0x27, 0x35, 0x3E, 0xCC, 0xE7, 0xBF, 0xF7, 0x97, 0x03,
0xFF, 0x19, 0x30, 0xB3, 0x48, 0xA5, 0xB5, 0xD1, 0xD7, 0x5E, 0x92, 0x2A, 0xAC, 0x56, 0xAA, 0xC6,
0x4F, 0xB8, 0x38, 0xD2, 0x96, 0xA4, 0x7D, 0xB6, 0x76, 0xFC, 0x6B, 0xE2, 0x9C, 0x74, 0x04, 0xF1,
0x45, 0x9D, 0x70, 0x59, 0x64, 0x71, 0x87, 0x20, 0x86, 0x5B, 0xCF, 0x65, 0xE6, 0x2D, 0xA8, 0x02,
0x1B, 0x60, 0x25, 0xAD, 0xAE, 0xB0, 0xB9, 0xF6, 0x1C, 0x46, 0x61, 0x69, 0x34, 0x40, 0x7E, 0x0F,
0x55, 0x47, 0xA3, 0x23, 0xDD, 0x51, 0xAF, 0x3A, 0xC3, 0x5C, 0xF9, 0xCE, 0xBA, 0xC5, 0xEA, 0x26,
0x2C, 0x53, 0x0D, 0x6E, 0x85, 0x28, 0x84, 0x09, 0xD3, 0xDF, 0xCD, 0xF4, 0x41, 0x81, 0x4D, 0x52,
0x6A, 0xDC, 0x37, 0xC8, 0x6C, 0xC1, 0xAB, 0xFA, 0x24, 0xE1, 0x7B, 0x08, 0x0C, 0xBD, 0xB1, 0x4A,
0x78, 0x88, 0x95, 0x8B, 0xE3, 0x63, 0xE8, 0x6D, 0xE9, 0xCB, 0xD5, 0xFE, 0x3B, 0x00, 0x1D, 0x39,
0xF2, 0xEF, 0xB7, 0x0E, 0x66, 0x58, 0xD0, 0xE4, 0xA6, 0x77, 0x72, 0xF8, 0xEB, 0x75, 0x4B, 0x0A,
0x31, 0x44, 0x50, 0xB4, 0x8F, 0xED, 0x1F, 0x1A, 0xDB, 0x99, 0x8D, 0x33, 0x9F, 0x11, 0x83, 0x14];
/**
* @memberOf Md2
* @method processBlock
* @param {number[]} block
*/
Md2.prototype.processBlock = function processBlock(block) {
// Append hash
for (var i = 0; i < 16; i++) {
this.state.hash[16 + i] = block[i];
this.state.hash[32 + i] = this.state.hash[16 + i] ^ this.state.hash[i];
}
// 18 Rounds
var t = 0;
for (i = 0; i < 18; i++) {
for (var j = 0; j < 48; j++) {
t = this.state.hash[j] ^= this.piSubst[t];
}
t = (t + i) & 0xff;
}
// Append checksum
t = this.state.checksum[15];
for (i = 0; i < 16; i++) {
t = this.state.checksum[i] ^= this.piSubst[block[i] ^ t];
}
};
/**
* @memberOf Md2
* @method finalize
* @return {HashArray}
*/
Md2.prototype.finalize = function finalize() {
var padLen = this.state.message.length & 0xf;
this.update(new Array(17 - padLen).join(String.fromCharCode(16 - padLen)));
// Process checksum
this.updateFromArray(this.state.checksum);
// Return hash
return CryptoApi.hashArray(this.state.hash.slice(0, 16));
};
CryptoApi.Hashers.add('md2', Md2);
return Md2;
})(
this.CryptoApi || require('./crypto-api')
);

View File

@ -0,0 +1,204 @@
/*global require */
(/**
* @param {CryptoApi} CryptoApi
* @returns {Md4}
*/
function (CryptoApi) {
'use strict';
/**
* @class Md4
* @desc Md4 hasher
* @implements HasherInterface
* @extends Hasher32le
*/
var Md4 = function md4(name, options) {
this.constructor(name, options);
};
Md4.prototype = Object.create(CryptoApi.Hasher32le.prototype);
/**
* @memberOf Md4
* @constructor
*/
Md4.prototype.constructor = function (name, options) {
CryptoApi.Hasher32le.prototype.constructor.call(this, name, options);
/**
* @desc Hash state
* @memberOf! Md4#
* @alias state.hash
* @type {number[]}
*/
this.state.hash = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476];
};
/**
* @desc Transform constants
* @memberOf Md4
* @member {number[]} S
* @const
*/
Md4.prototype.S = [
[3, 7, 11, 19],
[3, 5, 9, 13],
[3, 9, 11, 15]
];
Md4.prototype.F = 0x00000000;
Md4.prototype.G = 0x5a827999;
Md4.prototype.H = 0x6ed9eba1;
// Transform functions
/**
* @param {number} x
* @param {number} y
* @param {number} z
* @returns {number}
*/
Md4.prototype.FF = function FF(x, y, z) {
return (x & y) | ((~x) & z);
};
/**
* @param {number} x
* @param {number} y
* @param {number} z
* @returns {number}
*/
Md4.prototype.GG = function GG(x, y, z) {
return (x & y) | (x & z) | (y & z);
};
/**
* @param {number} x
* @param {number} y
* @param {number} z
* @returns {number}
*/
Md4.prototype.HH = function HH(x, y, z) {
return x ^ y ^ z;
};
/**
*
* @param {function} f
* @param {number} k
* @param {number} a
* @param {number} x
* @param {number} y
* @param {number} z
* @param {number} m
* @param {number} s
* @returns {number}
* @constructor
*/
Md4.prototype.CC = function CC(f, k, a, x, y, z, m, s) {
return CryptoApi.Tools.rotateLeft((a + f(x, y, z) + m + k), s) | 0;
};
/**
* @memberOf Md4
* @method processBlock
* @param {number[]} block
*/
Md4.prototype.processBlock = function processBlock(block) {
// Working variables
var a = this.state.hash[0] | 0;
var b = this.state.hash[1] | 0;
var c = this.state.hash[2] | 0;
var d = this.state.hash[3] | 0;
// Round 1
a = this.CC(this.FF, this.F, a, b, c, d, block[0], this.S[0][0]);
d = this.CC(this.FF, this.F, d, a, b, c, block[1], this.S[0][1]);
c = this.CC(this.FF, this.F, c, d, a, b, block[2], this.S[0][2]);
b = this.CC(this.FF, this.F, b, c, d, a, block[3], this.S[0][3]);
a = this.CC(this.FF, this.F, a, b, c, d, block[4], this.S[0][0]);
d = this.CC(this.FF, this.F, d, a, b, c, block[5], this.S[0][1]);
c = this.CC(this.FF, this.F, c, d, a, b, block[6], this.S[0][2]);
b = this.CC(this.FF, this.F, b, c, d, a, block[7], this.S[0][3]);
a = this.CC(this.FF, this.F, a, b, c, d, block[8], this.S[0][0]);
d = this.CC(this.FF, this.F, d, a, b, c, block[9], this.S[0][1]);
c = this.CC(this.FF, this.F, c, d, a, b, block[10], this.S[0][2]);
b = this.CC(this.FF, this.F, b, c, d, a, block[11], this.S[0][3]);
a = this.CC(this.FF, this.F, a, b, c, d, block[12], this.S[0][0]);
d = this.CC(this.FF, this.F, d, a, b, c, block[13], this.S[0][1]);
c = this.CC(this.FF, this.F, c, d, a, b, block[14], this.S[0][2]);
b = this.CC(this.FF, this.F, b, c, d, a, block[15], this.S[0][3]);
// Round 2
a = this.CC(this.GG, this.G, a, b, c, d, block[0], this.S[1][0]);
d = this.CC(this.GG, this.G, d, a, b, c, block[4], this.S[1][1]);
c = this.CC(this.GG, this.G, c, d, a, b, block[8], this.S[1][2]);
b = this.CC(this.GG, this.G, b, c, d, a, block[12], this.S[1][3]);
a = this.CC(this.GG, this.G, a, b, c, d, block[1], this.S[1][0]);
d = this.CC(this.GG, this.G, d, a, b, c, block[5], this.S[1][1]);
c = this.CC(this.GG, this.G, c, d, a, b, block[9], this.S[1][2]);
b = this.CC(this.GG, this.G, b, c, d, a, block[13], this.S[1][3]);
a = this.CC(this.GG, this.G, a, b, c, d, block[2], this.S[1][0]);
d = this.CC(this.GG, this.G, d, a, b, c, block[6], this.S[1][1]);
c = this.CC(this.GG, this.G, c, d, a, b, block[10], this.S[1][2]);
b = this.CC(this.GG, this.G, b, c, d, a, block[14], this.S[1][3]);
a = this.CC(this.GG, this.G, a, b, c, d, block[3], this.S[1][0]);
d = this.CC(this.GG, this.G, d, a, b, c, block[7], this.S[1][1]);
c = this.CC(this.GG, this.G, c, d, a, b, block[11], this.S[1][2]);
b = this.CC(this.GG, this.G, b, c, d, a, block[15], this.S[1][3]);
// Round 3
a = this.CC(this.HH, this.H, a, b, c, d, block[0], this.S[2][0]);
d = this.CC(this.HH, this.H, d, a, b, c, block[8], this.S[2][1]);
c = this.CC(this.HH, this.H, c, d, a, b, block[4], this.S[2][2]);
b = this.CC(this.HH, this.H, b, c, d, a, block[12], this.S[2][3]);
a = this.CC(this.HH, this.H, a, b, c, d, block[2], this.S[2][0]);
d = this.CC(this.HH, this.H, d, a, b, c, block[10], this.S[2][1]);
c = this.CC(this.HH, this.H, c, d, a, b, block[6], this.S[2][2]);
b = this.CC(this.HH, this.H, b, c, d, a, block[14], this.S[2][3]);
a = this.CC(this.HH, this.H, a, b, c, d, block[1], this.S[2][0]);
d = this.CC(this.HH, this.H, d, a, b, c, block[9], this.S[2][1]);
c = this.CC(this.HH, this.H, c, d, a, b, block[5], this.S[2][2]);
b = this.CC(this.HH, this.H, b, c, d, a, block[13], this.S[2][3]);
a = this.CC(this.HH, this.H, a, b, c, d, block[3], this.S[2][0]);
d = this.CC(this.HH, this.H, d, a, b, c, block[11], this.S[2][1]);
c = this.CC(this.HH, this.H, c, d, a, b, block[7], this.S[2][2]);
b = this.CC(this.HH, this.H, b, c, d, a, block[15], this.S[2][3]);
this.state.hash = [
(this.state.hash[0] + a) | 0,
(this.state.hash[1] + b) | 0,
(this.state.hash[2] + c) | 0,
(this.state.hash[3] + d) | 0
];
};
/**
* @memberOf Md4
* @method finalize
* @return {HashArray} hash
*/
Md4.prototype.finalize = function finalize() {
// Add padding
var padLen = this.state.message.length < 56 ? 56 - this.state.message.length : 120 - this.state.message.length;
var padding = new Array(padLen);
padding[0] = 0x80;
// Add length
var lengthBits = this.state.length * 8;
for (var i = 0; i < 4; i++) {
padding.push((lengthBits >> (8 * i)) & 0xff);
}
// @todo fix length to 64 bit
for (i = 0; i < 4; i++) {
padding.push(0);
}
this.updateFromArray(padding);
var hash = [];
for (i = 0; i < this.state.hash.length; i++) {
for (var j = 0; j < 4; j++) {
hash.push((this.state.hash[i] >> 8 * j) & 0xff);
}
}
// Return hash
return CryptoApi.hashArray(hash);
};
CryptoApi.Hashers.add('md4', Md4);
return Md4;
})(
this.CryptoApi || require('./crypto-api')
);

View File

@ -0,0 +1,125 @@
/*global require */
(/**
*
* @param {CryptoApi} CryptoApi
* @returns {Sha0}
*/
function (CryptoApi) {
'use strict';
// Transform constants
var K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6];
/**
* @class Sha0
* @desc Sha0 hasher
* @implements HasherInterface
* @extends Hasher32be
*/
var Sha0 = function sha0(name, options) {
this.constructor(name, options);
};
Sha0.prototype = Object.create(CryptoApi.Hasher32be.prototype);
/**
* @memberOf Sha0
* @constructor
*/
Sha0.prototype.constructor = function (name, options) {
CryptoApi.Hasher32be.prototype.constructor.call(this, name, options);
/**
* @desc Hash state
* @memberOf! Sha0#
* @alias state.hash
* @type {number[]}
*/
this.state.hash = [
0x67452301,
0xefcdab89,
0x98badcfe,
0x10325476,
0xc3d2e1f0
];
this.W = [];
};
/**
* @memberOf Sha0
* @method processBlock
* @param {number[]} M
*/
Sha0.prototype.processBlock = function processBlock(M) {
// Working variables
var a = this.state.hash[0] | 0;
var b = this.state.hash[1] | 0;
var c = this.state.hash[2] | 0;
var d = this.state.hash[3] | 0;
var e = this.state.hash[4] | 0;
// Calculate hash
for (var i = 0; i < 80; i++) {
if (i < 16) {
this.W[i] = M[i] | 0;
} else {
this.W[i] = (this.W[i - 3] ^ this.W[i - 8] ^ this.W[i - 14] ^ this.W[i - 16]) | 0;
}
var t = (CryptoApi.Tools.rotateLeft(a, 5) + e + this.W[i] + K[(i / 20) >> 0]) | 0;
if (i < 20) {
t = (t + ((b & c) | (~b & d))) | 0;
} else if (i < 40) {
t = (t + (b ^ c ^ d)) | 0;
} else if (i < 60) {
t = (t + ((b & c) | (b & d) | (c & d))) | 0;
} else {
t = (t + (b ^ c ^ d)) | 0;
}
e = d;
d = c;
c = CryptoApi.Tools.rotateLeft(b, 30) | 0;
b = a;
a = t;
}
this.state.hash[0] = (this.state.hash[0] + a) | 0;
this.state.hash[1] = (this.state.hash[1] + b) | 0;
this.state.hash[2] = (this.state.hash[2] + c) | 0;
this.state.hash[3] = (this.state.hash[3] + d) | 0;
this.state.hash[4] = (this.state.hash[4] + e) | 0;
};
/**
* @memberOf Sha0
* @method finalize
* @return {HashArray} hash
*/
Sha0.prototype.finalize = function finalize() {
// Add padding
var padLen = this.state.message.length < 56 ? 56 - this.state.message.length : 120 - this.state.message.length;
padLen += 4; // @todo fix length to 64 bit
var padding = new Array(padLen);
padding[0] = 0x80;
// Add length
var lengthBits = this.state.length * 8;
for (var i = 3; i >= 0; i--) {
padding.push((lengthBits >> (8 * i)) & 0xff);
}
this.updateFromArray(padding);
var hash = [];
for (var k = 0, l = this.state.hash.length; k < l; k++) {
for (var j = 3; j >= 0; j--) {
hash.push((this.state.hash[k] >> 8 * j) & 0xFF);
}
}
// Return hash
return CryptoApi.hashArray(hash);
};
CryptoApi.Hashers.add('sha0', Sha0);
return Sha0;
})(
this.CryptoApi || require('./crypto-api')
);

View File

@ -1,6 +1,6 @@
/** @license /** @license
======================================================================== ========================================================================
Split.js v1.0.7 Split.js v1.1.1
Copyright (c) 2015 Nathan Cahill Copyright (c) 2015 Nathan Cahill
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
@ -22,17 +22,43 @@
THE SOFTWARE. THE SOFTWARE.
*/ */
// The programming goals of Split.js are to deliver readable, understandable and
// maintainable code, while at the same time manually optimizing for tiny minified file size,
// browser compatibility without additional requirements, graceful fallback (IE8 is supported)
// and very few assumptions about the user's page layout.
//
// Make sure all browsers handle this JS library correctly with ES5.
// More information here: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode
'use strict'; 'use strict';
// A wrapper function that does a couple things:
//
// 1. Doesn't pollute the global namespace. This is important for a library.
// 2. Allows us to mount the library in different module systems, as well as
// directly in the browser.
(function() { (function() {
// Save the global `this` for use later. In this case, since the library only
// runs in the browser, it will refer to `window`. Also, figure out if we're in IE8
// or not. IE8 will still render correctly, but will be static instead of draggable.
//
// Save a couple long function names that are used frequently.
// This optimization saves around 400 bytes.
var global = this var global = this
, isIE8 = global.attachEvent && !global[addEventListener]
, document = global.document
, addEventListener = 'addEventListener' , addEventListener = 'addEventListener'
, removeEventListener = 'removeEventListener' , removeEventListener = 'removeEventListener'
, getBoundingClientRect = 'getBoundingClientRect' , getBoundingClientRect = 'getBoundingClientRect'
, isIE8 = global.attachEvent && !global[addEventListener]
, document = global.document
// This library only needs two helper functions:
//
// The first determines which prefixes of CSS calc we need.
// We only need to do this once on startup, when this anonymous function is called.
//
// Tests -webkit, -moz and -o prefixes. Modified from StackOverflow:
// http://stackoverflow.com/questions/16625140/js-feature-detection-to-detect-the-usage-of-webkit-calc-over-calc/16625167#16625167
, calc = (function () { , calc = (function () {
var el var el
, prefixes = ["", "-webkit-", "-moz-", "-o-"] , prefixes = ["", "-webkit-", "-moz-", "-o-"]
@ -46,6 +72,10 @@ var global = this
} }
} }
})() })()
// The second helper function allows elements and string selectors to be used
// interchangeably. In either case an element is returned. This allows us to
// do `Split(elem1, elem2)` as well as `Split('#id1', '#id2')`.
, elementOrSelector = function (el) { , elementOrSelector = function (el) {
if (typeof el === 'string' || el instanceof String) { if (typeof el === 'string' || el instanceof String) {
return document.querySelector(el) return document.querySelector(el)
@ -54,6 +84,38 @@ var global = this
} }
} }
// The main function to initialize a split. Split.js thinks about each pair
// of elements as an independant pair. Dragging the gutter between two elements
// only changes the dimensions of elements in that pair. This is key to understanding
// how the following functions operate, since each function is bound to a pair.
//
// A pair object is shaped like this:
//
// {
// a: DOM element,
// b: DOM element,
// aMin: Number,
// bMin: Number,
// dragging: Boolean,
// parent: DOM element,
// isFirst: Boolean,
// isLast: Boolean,
// direction: 'horizontal' | 'vertical'
// }
//
// The basic sequence:
//
// 1. Set defaults to something sane. `options` doesn't have to be passed at all.
// 2. Initialize a bunch of strings based on the direction we're splitting.
// A lot of the behavior in the rest of the library is paramatized down to
// rely on CSS strings and classes.
// 3. Define the dragging helper functions, and a few helpers to go with them.
// 4. Define a few more functions that "balance" the entire split instance.
// Split.js tries it's best to cope with min sizes that don't add up.
// 5. Loop through the elements while pairing them off. Every pair gets an
// `pair` object, a gutter, and special isFirst/isLast properties.
// 6. Actually size the pair elements, insert gutters and attach event listeners.
// 7. Balance all of the pairs to accomodate min sizes as best as possible.
, Split = function (ids, options) { , Split = function (ids, options) {
var dimension var dimension
, i , i
@ -65,8 +127,9 @@ var global = this
, paddingB , paddingB
, pairs = [] , pairs = []
// Set defaults // 1. Set defaults to something sane. `options` doesn't have to be passed at all,
// so create an options object if none exists. Pixel values 10, 100 and 30 are
// arbitrary but feel natural.
options = typeof options !== 'undefined' ? options : {} options = typeof options !== 'undefined' ? options : {}
if (typeof options.gutterSize === 'undefined') options.gutterSize = 10 if (typeof options.gutterSize === 'undefined') options.gutterSize = 10
@ -74,6 +137,9 @@ var global = this
if (typeof options.snapOffset === 'undefined') options.snapOffset = 30 if (typeof options.snapOffset === 'undefined') options.snapOffset = 30
if (typeof options.direction === 'undefined') options.direction = 'horizontal' if (typeof options.direction === 'undefined') options.direction = 'horizontal'
// 2. Initialize a bunch of strings based on the direction we're splitting.
// A lot of the behavior in the rest of the library is paramatized down to
// rely on CSS strings and classes.
if (options.direction == 'horizontal') { if (options.direction == 'horizontal') {
dimension = 'width' dimension = 'width'
clientDimension = 'clientWidth' clientDimension = 'clientWidth'
@ -94,25 +160,43 @@ var global = this
if (!options.cursor) options.cursor = 'ns-resize' if (!options.cursor) options.cursor = 'ns-resize'
} }
// Event listeners for drag events, bound to a pair object. // 3. Define the dragging helper functions, and a few helpers to go with them.
// Calculate the pair's position and size when dragging starts. // Each helper is bound to a pair object that contains it's metadata. This
// Prevent selection on start and re-enable it when done. // also makes it easy to store references to listeners that that will be
// added and removed.
//
// Even though there are no other functions contained in them, aliasing
// this to self saves 50 bytes or so since it's used so frequently.
//
// The pair object saves metadata like dragging state, position and
// event listener references.
//
// startDragging calls `calculateSizes` to store the inital size in the pair object.
// It also adds event listeners for mouse/touch events,
// and prevents selection while dragging so avoid the selecting text.
var startDragging = function (e) { var startDragging = function (e) {
// Alias frequently used variables to save space. 200 bytes.
var self = this var self = this
, a = self.a , a = self.a
, b = self.b , b = self.b
// Call the onDragStart callback.
if (!self.dragging && options.onDragStart) { if (!self.dragging && options.onDragStart) {
options.onDragStart() options.onDragStart()
} }
// Don't actually drag the element. We emulate that in the drag function.
e.preventDefault() e.preventDefault()
// Set the dragging property of the pair object.
self.dragging = true self.dragging = true
// Create two event listeners bound to the same pair object and store
// them in the pair object.
self.move = drag.bind(self) self.move = drag.bind(self)
self.stop = stopDragging.bind(self) self.stop = stopDragging.bind(self)
// All the binding. `window` gets the stop events in case we drag out of the elements.
global[addEventListener]('mouseup', self.stop) global[addEventListener]('mouseup', self.stop)
global[addEventListener]('touchend', self.stop) global[addEventListener]('touchend', self.stop)
global[addEventListener]('touchcancel', self.stop) global[addEventListener]('touchcancel', self.stop)
@ -120,10 +204,11 @@ var global = this
self.parent[addEventListener]('mousemove', self.move) self.parent[addEventListener]('mousemove', self.move)
self.parent[addEventListener]('touchmove', self.move) self.parent[addEventListener]('touchmove', self.move)
a[addEventListener]('selectstart', preventSelection) // Disable selection. Disable!
a[addEventListener]('dragstart', preventSelection) a[addEventListener]('selectstart', noop)
b[addEventListener]('selectstart', preventSelection) a[addEventListener]('dragstart', noop)
b[addEventListener]('dragstart', preventSelection) b[addEventListener]('selectstart', noop)
b[addEventListener]('dragstart', noop)
a.style.userSelect = 'none' a.style.userSelect = 'none'
a.style.webkitUserSelect = 'none' a.style.webkitUserSelect = 'none'
@ -135,11 +220,16 @@ var global = this
b.style.MozUserSelect = 'none' b.style.MozUserSelect = 'none'
b.style.pointerEvents = 'none' b.style.pointerEvents = 'none'
// Set the cursor, both on the gutter and the parent element.
// Doing only a, b and gutter causes flickering.
self.gutter.style.cursor = options.cursor self.gutter.style.cursor = options.cursor
self.parent.style.cursor = options.cursor self.parent.style.cursor = options.cursor
// Cache the initial sizes of the pair.
calculateSizes.call(self) calculateSizes.call(self)
} }
// stopDragging is very similar to startDragging in reverse.
, stopDragging = function () { , stopDragging = function () {
var self = this var self = this
, a = self.a , a = self.a
@ -151,6 +241,7 @@ var global = this
self.dragging = false self.dragging = false
// Remove the stored event listeners. This is why we store them.
global[removeEventListener]('mouseup', self.stop) global[removeEventListener]('mouseup', self.stop)
global[removeEventListener]('touchend', self.stop) global[removeEventListener]('touchend', self.stop)
global[removeEventListener]('touchcancel', self.stop) global[removeEventListener]('touchcancel', self.stop)
@ -158,13 +249,15 @@ var global = this
self.parent[removeEventListener]('mousemove', self.move) self.parent[removeEventListener]('mousemove', self.move)
self.parent[removeEventListener]('touchmove', self.move) self.parent[removeEventListener]('touchmove', self.move)
// Delete them once they are removed. I think this makes a difference
// in memory usage with a lot of splits on one page. But I don't know for sure.
delete self.stop delete self.stop
delete self.move delete self.move
a[removeEventListener]('selectstart', preventSelection) a[removeEventListener]('selectstart', noop)
a[removeEventListener]('dragstart', preventSelection) a[removeEventListener]('dragstart', noop)
b[removeEventListener]('selectstart', preventSelection) b[removeEventListener]('selectstart', noop)
b[removeEventListener]('dragstart', preventSelection) b[removeEventListener]('dragstart', noop)
a.style.userSelect = '' a.style.userSelect = ''
a.style.webkitUserSelect = '' a.style.webkitUserSelect = ''
@ -179,36 +272,70 @@ var global = this
self.gutter.style.cursor = '' self.gutter.style.cursor = ''
self.parent.style.cursor = '' self.parent.style.cursor = ''
} }
// drag, where all the magic happens. The logic is really quite simple:
//
// 1. Ignore if the pair is not dragging.
// 2. Get the offset of the event.
// 3. Snap offset to min if within snappable range (within min + snapOffset).
// 4. Actually adjust each element in the pair to offset.
//
// ---------------------------------------------------------------------
// | | <- this.aMin || this.bMin -> | |
// | | | <- this.snapOffset || this.snapOffset -> | | |
// | | | || | | |
// | | | || | | |
// ---------------------------------------------------------------------
// | <- this.start this.size -> |
, drag = function (e) { , drag = function (e) {
var offset var offset
if (!this.dragging) return if (!this.dragging) return
// Get the relative position of the event from the first side of the // Get the offset of the event from the first side of the
// pair. // pair `this.start`. Supports touch events, but not multitouch, so only the first
// finger `touches[0]` is counted.
if ('touches' in e) { if ('touches' in e) {
offset = e.touches[0][clientAxis] - this.start offset = e.touches[0][clientAxis] - this.start
} else { } else {
offset = e[clientAxis] - this.start offset = e[clientAxis] - this.start
} }
// If within snapOffset of min or max, set offset to min or max // If within snapOffset of min or max, set offset to min or max.
// snapOffset buffers aMin and bMin, so logic is opposite for both.
if (offset <= this.aMin + options.snapOffset) { // Include the appropriate gutter sizes to prevent overflows.
offset = this.aMin if (offset <= this.aMin + options.snapOffset + this.aGutterSize) {
} else if (offset >= this.size - this.bMin - options.snapOffset) { offset = this.aMin + this.aGutterSize
offset = this.size - this.bMin } else if (offset >= this.size - (this.bMin + options.snapOffset + this.bGutterSize)) {
offset = this.size - (this.bMin + this.bGutterSize)
} }
// Actually adjust the size.
adjust.call(this, offset) adjust.call(this, offset)
// Call the drag callback continously. Don't do anything too intensive
// in this callback.
if (options.onDrag) { if (options.onDrag) {
options.onDrag() options.onDrag()
} }
} }
// Cache some important sizes when drag starts, so we don't have to do that
// continously:
//
// `size`: The total size of the pair. First element + second element + first gutter + second gutter.
// `percentage`: The percentage between 0-100 that the pair occupies in the parent.
// `start`: The leading side of the first element.
//
// ------------------------------------------------ - - - - - - - - - - -
// | aGutterSize -> ||| | |
// | ||| | |
// | ||| | |
// | ||| <- bGutterSize | |
// ------------------------------------------------ - - - - - - - - - - -
// | <- start size -> | parentSize -> |
, calculateSizes = function () { , calculateSizes = function () {
// Calculate the pairs size, and percentage of the parent size // Figure out the parent size minus padding.
var computedStyle = global.getComputedStyle(this.parent) var computedStyle = global.getComputedStyle(this.parent)
, parentSize = this.parent[clientDimension] - parseFloat(computedStyle[paddingA]) - parseFloat(computedStyle[paddingB]) , parentSize = this.parent[clientDimension] - parseFloat(computedStyle[paddingA]) - parseFloat(computedStyle[paddingB])
@ -216,13 +343,21 @@ var global = this
this.percentage = Math.min(this.size / parentSize * 100, 100) this.percentage = Math.min(this.size / parentSize * 100, 100)
this.start = this.a[getBoundingClientRect]()[position] this.start = this.a[getBoundingClientRect]()[position]
} }
, adjust = function (offset) {
// A size is the same as offset. B size is total size - A size.
// Both sizes are calculated from the initial parent percentage.
// Actually adjust the size of elements `a` and `b` to `offset` while dragging.
// calc is used to allow calc(percentage + gutterpx) on the whole split instance,
// which allows the viewport to be resized without additional logic.
// Element a's size is the same as offset. b's size is total size - a size.
// Both sizes are calculated from the initial parent percentage, then the gutter size is subtracted.
, adjust = function (offset) {
this.a.style[dimension] = calc + '(' + (offset / this.size * this.percentage) + '% - ' + this.aGutterSize + 'px)' this.a.style[dimension] = calc + '(' + (offset / this.size * this.percentage) + '% - ' + this.aGutterSize + 'px)'
this.b.style[dimension] = calc + '(' + (this.percentage - (offset / this.size * this.percentage)) + '% - ' + this.bGutterSize + 'px)' this.b.style[dimension] = calc + '(' + (this.percentage - (offset / this.size * this.percentage)) + '% - ' + this.bGutterSize + 'px)'
} }
// 4. Define a few more functions that "balance" the entire split instance.
// Split.js tries it's best to cope with min sizes that don't add up.
// At some point this should go away since it breaks out of the calc(% - px) model.
// Maybe it's a user error if you pass uncomputable minSizes.
, fitMin = function () { , fitMin = function () {
var self = this var self = this
, a = self.a , a = self.a
@ -260,9 +395,31 @@ var global = this
fitMinReverse.call(pairs[i]) fitMinReverse.call(pairs[i])
} }
} }
, preventSelection = function () { return false } , setElementSize = function (el, size, gutterSize) {
// Split.js allows setting sizes via numbers (ideally), or if you must,
// by string, like '300px'. This is less than ideal, because it breaks
// the fluid layout that `calc(% - px)` provides. You're on your own if you do that,
// make sure you calculate the gutter size by hand.
if (typeof size !== 'string' && !(size instanceof String)) {
if (!isIE8) {
size = calc + '(' + size + '% - ' + gutterSize + 'px)'
} else {
size = options.sizes[i] + '%'
}
}
el.style[dimension] = size
}
// No-op function to prevent default. Used to prevent selection.
, noop = function () { return false }
// All DOM elements in the split should have a common parent. We can grab
// the first elements parent and hope users read the docs because the
// behavior will be whacky otherwise.
, parent = elementOrSelector(ids[0]).parentNode , parent = elementOrSelector(ids[0]).parentNode
// Set default options.sizes to equal percentages of the parent element.
if (!options.sizes) { if (!options.sizes) {
var percent = 100 / ids.length var percent = 100 / ids.length
@ -273,6 +430,8 @@ var global = this
} }
} }
// Standardize minSize to an array if it isn't already. This allows minSize
// to be passed as a number.
if (!Array.isArray(options.minSize)) { if (!Array.isArray(options.minSize)) {
var minSizes = [] var minSizes = []
@ -283,15 +442,34 @@ var global = this
options.minSize = minSizes options.minSize = minSizes
} }
// 5. Loop through the elements while pairing them off. Every pair gets a
// `pair` object, a gutter, and isFirst/isLast properties.
//
// Basic logic:
//
// - Starting with the second element `i > 0`, create `pair` objects with
// `a = ids[i - 1]` and `b = ids[i]`
// - Set gutter sizes based on the _pair_ being first/last. The first and last
// pair have gutterSize / 2, since they only have one half gutter, and not two.
// - Create gutter elements and add event listeners.
// - Set the size of the elements, minus the gutter sizes.
//
// -----------------------------------------------------------------------
// | i=0 | i=1 | i=2 | i=3 |
// | | isFirst | | isLast |
// | pair 0 pair 1 pair 2 |
// | | | | |
// -----------------------------------------------------------------------
for (i = 0; i < ids.length; i++) { for (i = 0; i < ids.length; i++) {
var el = elementOrSelector(ids[i]) var el = elementOrSelector(ids[i])
, isFirst = (i == 1) , isFirstPair = (i == 1)
, isLast = (i == ids.length - 1) , isLastPair = (i == ids.length - 1)
, size , size = options.sizes[i]
, gutterSize = options.gutterSize , gutterSize = options.gutterSize
, pair , pair
if (i > 0) { if (i > 0) {
// Create the pair object with it's metadata.
pair = { pair = {
a: elementOrSelector(ids[i - 1]), a: elementOrSelector(ids[i - 1]),
b: el, b: el,
@ -299,27 +477,31 @@ var global = this
bMin: options.minSize[i], bMin: options.minSize[i],
dragging: false, dragging: false,
parent: parent, parent: parent,
isFirst: isFirst, isFirst: isFirstPair,
isLast: isLast, isLast: isLastPair,
direction: options.direction direction: options.direction
} }
// For first and last pairs, first and last gutter width is half. // For first and last pairs, first and last gutter width is half.
pair.aGutterSize = options.gutterSize pair.aGutterSize = options.gutterSize
pair.bGutterSize = options.gutterSize pair.bGutterSize = options.gutterSize
if (isFirst) { if (isFirstPair) {
pair.aGutterSize = options.gutterSize / 2 pair.aGutterSize = options.gutterSize / 2
} }
if (isLast) { if (isLastPair) {
pair.bGutterSize = options.gutterSize / 2 pair.bGutterSize = options.gutterSize / 2
} }
} }
// Determine the size of the current element. IE8 is supported by
// staticly assigning sizes without draggable gutters. Assigns a string
// to `size`.
//
// IE9 and above // IE9 and above
if (!isIE8) { if (!isIE8) {
// Create gutter elements for each pair.
if (i > 0) { if (i > 0) {
var gutter = document.createElement('div') var gutter = document.createElement('div')
@ -334,35 +516,62 @@ var global = this
pair.gutter = gutter pair.gutter = gutter
} }
// Half-size gutters for first and last elements.
if (i === 0 || i == ids.length - 1) { if (i === 0 || i == ids.length - 1) {
gutterSize = options.gutterSize / 2 gutterSize = options.gutterSize / 2
} }
if (typeof options.sizes[i] === 'string' || options.sizes[i] instanceof String) {
size = options.sizes[i]
} else {
size = calc + '(' + options.sizes[i] + '% - ' + gutterSize + 'px)'
}
// IE8 and below
} else {
if (typeof options.sizes[i] === 'string' || options.sizes[i] instanceof String) {
size = options.sizes[i]
} else {
size = options.sizes[i] + '%'
}
} }
el.style[dimension] = size // Set the element size to our determined size.
setElementSize(el, size, gutterSize)
// After the first iteration, and we have a pair object, append it to the
// list of pairs.
if (i > 0) { if (i > 0) {
pairs.push(pair) pairs.push(pair)
} }
} }
// Balance the pairs to try to accomodate min sizes.
balancePairs(pairs) balancePairs(pairs)
return {
setSizes: function (sizes) {
for (var i = 0; i < sizes.length; i++) {
if (i > 0) {
var pair = pairs[i - 1]
setElementSize(pair.a, sizes[i - 1], pair.aGutterSize)
setElementSize(pair.b, sizes[i], pair.bGutterSize)
}
}
},
collapse: function (i) {
var pair
if (i === pairs.length) {
pair = pairs[i - 1]
calculateSizes.call(pair)
adjust.call(pair, pair.size - pair.bGutterSize)
} else {
pair = pairs[i]
calculateSizes.call(pair)
adjust.call(pair, pair.aGutterSize)
}
},
destroy: function () {
for (var i = 0; i < pairs.length; i++) {
pairs[i].parent.removeChild(pairs[i].gutter)
pairs[i].a.style[dimension] = ''
pairs[i].b.style[dimension] = ''
}
}
}
} }
// Play nicely with module systems, and the browser too if you include it raw.
if (typeof exports !== 'undefined') { if (typeof exports !== 'undefined') {
if (typeof module !== 'undefined' && module.exports) { if (typeof module !== 'undefined' && module.exports) {
exports = module.exports = Split exports = module.exports = Split
@ -372,4 +581,5 @@ if (typeof exports !== 'undefined') {
global.Split = Split global.Split = Split
} }
// Call our wrapper function with the current global. In this case, `window`.
}).call(window); }).call(window);

8466
src/js/lib/xpath.js Executable file

File diff suppressed because it is too large Load Diff

View File

@ -22,7 +22,7 @@ var Base = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_to: function(input, args) { runTo: function(input, args) {
if (!input) { if (!input) {
throw ("Error: Input must be a number"); throw ("Error: Input must be a number");
} }
@ -41,7 +41,7 @@ var Base = {
* @param {Object[]} args * @param {Object[]} args
* @returns {number} * @returns {number}
*/ */
run_from: function(input, args) { runFrom: function(input, args) {
var radix = args[0] || Base.DEFAULT_RADIX; var radix = args[0] || Base.DEFAULT_RADIX;
if (radix < 2 || radix > 36) { if (radix < 2 || radix > 36) {
throw "Error: Radix argument must be between 2 and 36"; throw "Error: Radix argument must be between 2 and 36";

View File

@ -36,13 +36,13 @@ var Base64 = {
/** /**
* To Base64 operation. * To Base64 operation.
* *
* @param {byte_array} input * @param {byteArray} input
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_to: function(input, args) { runTo: function(input, args) {
var alphabet = args[0] || Base64.ALPHABET; var alphabet = args[0] || Base64.ALPHABET;
return Utils.to_base64(input, alphabet); return Utils.toBase64(input, alphabet);
}, },
@ -57,13 +57,13 @@ var Base64 = {
* *
* @param {string} input * @param {string} input
* @param {Object[]} args * @param {Object[]} args
* @returns {byte_array} * @returns {byteArray}
*/ */
run_from: function(input, args) { runFrom: function(input, args) {
var alphabet = args[0] || Base64.ALPHABET, var alphabet = args[0] || Base64.ALPHABET,
remove_non_alph_chars = args[1]; removeNonAlphChars = args[1];
return Utils.from_base64(input, alphabet, "byte_array", remove_non_alph_chars); return Utils.fromBase64(input, alphabet, "byteArray", removeNonAlphChars);
}, },
@ -76,15 +76,15 @@ var Base64 = {
/** /**
* To Base32 operation. * To Base32 operation.
* *
* @param {byte_array} input * @param {byteArray} input
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_to_32: function(input, args) { runTo32: function(input, args) {
if (!input) return ""; if (!input) return "";
var alphabet = args[0] ? var alphabet = args[0] ?
Utils.expand_alph_range(args[0]).join("") : "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=", Utils.expandAlphRange(args[0]).join("") : "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=",
output = "", output = "",
chr1, chr2, chr3, chr4, chr5, chr1, chr2, chr3, chr4, chr5,
enc1, enc2, enc3, enc4, enc5, enc6, enc7, enc8, enc1, enc2, enc3, enc4, enc5, enc6, enc7, enc8,
@ -130,21 +130,21 @@ var Base64 = {
* *
* @param {string} input * @param {string} input
* @param {Object[]} args * @param {Object[]} args
* @returns {byte_array} * @returns {byteArray}
*/ */
run_from_32: function(input, args) { runFrom32: function(input, args) {
if (!input) return []; if (!input) return [];
var alphabet = args[0] ? var alphabet = args[0] ?
Utils.expand_alph_range(args[0]).join("") : "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=", Utils.expandAlphRange(args[0]).join("") : "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=",
remove_non_alph_chars = args[0]; removeNonAlphChars = args[0];
var output = [], var output = [],
chr1, chr2, chr3, chr4, chr5, chr1, chr2, chr3, chr4, chr5,
enc1, enc2, enc3, enc4, enc5, enc6, enc7, enc8, enc1, enc2, enc3, enc4, enc5, enc6, enc7, enc8,
i = 0; i = 0;
if (remove_non_alph_chars) { if (removeNonAlphChars) {
var re = new RegExp("[^" + alphabet.replace(/[\]\\\-^]/g, "\\$&") + "]", "g"); var re = new RegExp("[^" + alphabet.replace(/[\]\\\-^]/g, "\\$&") + "]", "g");
input = input.replace(re, ""); input = input.replace(re, "");
} }
@ -190,21 +190,21 @@ var Base64 = {
/** /**
* Show Base64 offsets operation. * Show Base64 offsets operation.
* *
* @param {byte_array} input * @param {byteArray} input
* @param {Object[]} args * @param {Object[]} args
* @returns {html} * @returns {html}
*/ */
run_offsets: function(input, args) { runOffsets: function(input, args) {
var alphabet = args[0] || Base64.ALPHABET, var alphabet = args[0] || Base64.ALPHABET,
show_variable = args[1], showVariable = args[1],
offset0 = Utils.to_base64(input, alphabet), offset0 = Utils.toBase64(input, alphabet),
offset1 = Utils.to_base64([0].concat(input), alphabet), offset1 = Utils.toBase64([0].concat(input), alphabet),
offset2 = Utils.to_base64([0, 0].concat(input), alphabet), offset2 = Utils.toBase64([0, 0].concat(input), alphabet),
len0 = offset0.indexOf("="), len0 = offset0.indexOf("="),
len1 = offset1.indexOf("="), len1 = offset1.indexOf("="),
len2 = offset2.indexOf("="), len2 = offset2.indexOf("="),
script = "<script type='application/javascript'>$('[data-toggle=\"tooltip\"]').tooltip()</script>", script = "<script type='application/javascript'>$('[data-toggle=\"tooltip\"]').tooltip()</script>",
static_section = "", staticSection = "",
padding = ""; padding = "";
if (input.length < 1) { if (input.length < 1) {
@ -213,28 +213,28 @@ var Base64 = {
// Highlight offset 0 // Highlight offset 0
if (len0 % 4 === 2) { if (len0 % 4 === 2) {
static_section = offset0.slice(0, -3); staticSection = offset0.slice(0, -3);
offset0 = "<span data-toggle='tooltip' data-placement='top' title='" + offset0 = "<span data-toggle='tooltip' data-placement='top' title='" +
Utils.escape_html(Utils.from_base64(static_section, alphabet).slice(0, -2)) + "'>" + Utils.escapeHtml(Utils.fromBase64(staticSection, alphabet).slice(0, -2)) + "'>" +
static_section + "</span>" + staticSection + "</span>" +
"<span class='hlgreen'>" + offset0.substr(offset0.length - 3, 1) + "</span>" + "<span class='hlgreen'>" + offset0.substr(offset0.length - 3, 1) + "</span>" +
"<span class='hlred'>" + offset0.substr(offset0.length - 2) + "</span>"; "<span class='hlred'>" + offset0.substr(offset0.length - 2) + "</span>";
} else if (len0 % 4 === 3) { } else if (len0 % 4 === 3) {
static_section = offset0.slice(0, -2); staticSection = offset0.slice(0, -2);
offset0 = "<span data-toggle='tooltip' data-placement='top' title='" + offset0 = "<span data-toggle='tooltip' data-placement='top' title='" +
Utils.escape_html(Utils.from_base64(static_section, alphabet).slice(0, -1)) + "'>" + Utils.escapeHtml(Utils.fromBase64(staticSection, alphabet).slice(0, -1)) + "'>" +
static_section + "</span>" + staticSection + "</span>" +
"<span class='hlgreen'>" + offset0.substr(offset0.length - 2, 1) + "</span>" + "<span class='hlgreen'>" + offset0.substr(offset0.length - 2, 1) + "</span>" +
"<span class='hlred'>" + offset0.substr(offset0.length - 1) + "</span>"; "<span class='hlred'>" + offset0.substr(offset0.length - 1) + "</span>";
} else { } else {
static_section = offset0; staticSection = offset0;
offset0 = "<span data-toggle='tooltip' data-placement='top' title='" + offset0 = "<span data-toggle='tooltip' data-placement='top' title='" +
Utils.escape_html(Utils.from_base64(static_section, alphabet)) + "'>" + Utils.escapeHtml(Utils.fromBase64(staticSection, alphabet)) + "'>" +
static_section + "</span>"; staticSection + "</span>";
} }
if (!show_variable) { if (!showVariable) {
offset0 = static_section; offset0 = staticSection;
} }
@ -243,28 +243,28 @@ var Base64 = {
"<span class='hlgreen'>" + offset1.substr(1, 1) + "</span>"; "<span class='hlgreen'>" + offset1.substr(1, 1) + "</span>";
offset1 = offset1.substr(2); offset1 = offset1.substr(2);
if (len1 % 4 === 2) { if (len1 % 4 === 2) {
static_section = offset1.slice(0, -3); staticSection = offset1.slice(0, -3);
offset1 = padding + "<span data-toggle='tooltip' data-placement='top' title='" + offset1 = padding + "<span data-toggle='tooltip' data-placement='top' title='" +
Utils.escape_html(Utils.from_base64("AA" + static_section, alphabet).slice(1, -2)) + "'>" + Utils.escapeHtml(Utils.fromBase64("AA" + staticSection, alphabet).slice(1, -2)) + "'>" +
static_section + "</span>" + staticSection + "</span>" +
"<span class='hlgreen'>" + offset1.substr(offset1.length - 3, 1) + "</span>" + "<span class='hlgreen'>" + offset1.substr(offset1.length - 3, 1) + "</span>" +
"<span class='hlred'>" + offset1.substr(offset1.length - 2) + "</span>"; "<span class='hlred'>" + offset1.substr(offset1.length - 2) + "</span>";
} else if (len1 % 4 === 3) { } else if (len1 % 4 === 3) {
static_section = offset1.slice(0, -2); staticSection = offset1.slice(0, -2);
offset1 = padding + "<span data-toggle='tooltip' data-placement='top' title='" + offset1 = padding + "<span data-toggle='tooltip' data-placement='top' title='" +
Utils.escape_html(Utils.from_base64("AA" + static_section, alphabet).slice(1, -1)) + "'>" + Utils.escapeHtml(Utils.fromBase64("AA" + staticSection, alphabet).slice(1, -1)) + "'>" +
static_section + "</span>" + staticSection + "</span>" +
"<span class='hlgreen'>" + offset1.substr(offset1.length - 2, 1) + "</span>" + "<span class='hlgreen'>" + offset1.substr(offset1.length - 2, 1) + "</span>" +
"<span class='hlred'>" + offset1.substr(offset1.length - 1) + "</span>"; "<span class='hlred'>" + offset1.substr(offset1.length - 1) + "</span>";
} else { } else {
static_section = offset1; staticSection = offset1;
offset1 = padding + "<span data-toggle='tooltip' data-placement='top' title='" + offset1 = padding + "<span data-toggle='tooltip' data-placement='top' title='" +
Utils.escape_html(Utils.from_base64("AA" + static_section, alphabet).slice(1)) + "'>" + Utils.escapeHtml(Utils.fromBase64("AA" + staticSection, alphabet).slice(1)) + "'>" +
static_section + "</span>"; staticSection + "</span>";
} }
if (!show_variable) { if (!showVariable) {
offset1 = static_section; offset1 = staticSection;
} }
// Highlight offset 2 // Highlight offset 2
@ -272,31 +272,31 @@ var Base64 = {
"<span class='hlgreen'>" + offset2.substr(2, 1) + "</span>"; "<span class='hlgreen'>" + offset2.substr(2, 1) + "</span>";
offset2 = offset2.substr(3); offset2 = offset2.substr(3);
if (len2 % 4 === 2) { if (len2 % 4 === 2) {
static_section = offset2.slice(0, -3); staticSection = offset2.slice(0, -3);
offset2 = padding + "<span data-toggle='tooltip' data-placement='top' title='" + offset2 = padding + "<span data-toggle='tooltip' data-placement='top' title='" +
Utils.escape_html(Utils.from_base64("AAA" + static_section, alphabet).slice(2, -2)) + "'>" + Utils.escapeHtml(Utils.fromBase64("AAA" + staticSection, alphabet).slice(2, -2)) + "'>" +
static_section + "</span>" + staticSection + "</span>" +
"<span class='hlgreen'>" + offset2.substr(offset2.length - 3, 1) + "</span>" + "<span class='hlgreen'>" + offset2.substr(offset2.length - 3, 1) + "</span>" +
"<span class='hlred'>" + offset2.substr(offset2.length - 2) + "</span>"; "<span class='hlred'>" + offset2.substr(offset2.length - 2) + "</span>";
} else if (len2 % 4 === 3) { } else if (len2 % 4 === 3) {
static_section = offset2.slice(0, -2); staticSection = offset2.slice(0, -2);
offset2 = padding + "<span data-toggle='tooltip' data-placement='top' title='" + offset2 = padding + "<span data-toggle='tooltip' data-placement='top' title='" +
Utils.escape_html(Utils.from_base64("AAA" + static_section, alphabet).slice(2, -2)) + "'>" + Utils.escapeHtml(Utils.fromBase64("AAA" + staticSection, alphabet).slice(2, -2)) + "'>" +
static_section + "</span>" + staticSection + "</span>" +
"<span class='hlgreen'>" + offset2.substr(offset2.length - 2, 1) + "</span>" + "<span class='hlgreen'>" + offset2.substr(offset2.length - 2, 1) + "</span>" +
"<span class='hlred'>" + offset2.substr(offset2.length - 1) + "</span>"; "<span class='hlred'>" + offset2.substr(offset2.length - 1) + "</span>";
} else { } else {
static_section = offset2; staticSection = offset2;
offset2 = padding + "<span data-toggle='tooltip' data-placement='top' title='" + offset2 = padding + "<span data-toggle='tooltip' data-placement='top' title='" +
Utils.escape_html(Utils.from_base64("AAA" + static_section, alphabet).slice(2)) + "'>" + Utils.escapeHtml(Utils.fromBase64("AAA" + staticSection, alphabet).slice(2)) + "'>" +
static_section + "</span>"; staticSection + "</span>";
} }
if (!show_variable) { if (!showVariable) {
offset2 = static_section; offset2 = staticSection;
} }
return (show_variable ? "Characters highlighted in <span class='hlgreen'>green</span> could change if the input is surrounded by more data." + return (showVariable ? "Characters highlighted in <span class='hlgreen'>green</span> could change if the input is surrounded by more data." +
"\nCharacters highlighted in <span class='hlred'>red</span> are for padding purposes only." + "\nCharacters highlighted in <span class='hlred'>red</span> are for padding purposes only." +
"\nUnhighlighted characters are <span data-toggle='tooltip' data-placement='top' title='Tooltip on left'>static</span>." + "\nUnhighlighted characters are <span data-toggle='tooltip' data-placement='top' title='Tooltip on left'>static</span>." +
"\nHover over the static sections to see what they decode to on their own.\n" + "\nHover over the static sections to see what they decode to on their own.\n" +
@ -317,7 +317,7 @@ var Base64 = {
* @param {Object[]} args * @param {Object[]} args
* @returns {Object[]} pos * @returns {Object[]} pos
*/ */
highlight_to: function(pos, args) { highlightTo: function(pos, args) {
pos[0].start = Math.floor(pos[0].start / 3 * 4); pos[0].start = Math.floor(pos[0].start / 3 * 4);
pos[0].end = Math.ceil(pos[0].end / 3 * 4); pos[0].end = Math.ceil(pos[0].end / 3 * 4);
return pos; return pos;
@ -332,7 +332,7 @@ var Base64 = {
* @param {Object[]} args * @param {Object[]} args
* @returns {Object[]} pos * @returns {Object[]} pos
*/ */
highlight_from: function(pos, args) { highlightFrom: function(pos, args) {
pos[0].start = Math.ceil(pos[0].start / 4 * 3); pos[0].start = Math.ceil(pos[0].start / 4 * 3);
pos[0].end = Math.floor(pos[0].end / 4 * 3); pos[0].end = Math.floor(pos[0].end / 4 * 3);
return pos; return pos;

View File

@ -15,14 +15,14 @@ var BitwiseOp = {
* Runs bitwise operations across the input data. * Runs bitwise operations across the input data.
* *
* @private * @private
* @param {byte_array} input * @param {byteArray} input
* @param {byte_array} key * @param {byteArray} key
* @param {function} func - The bitwise calculation to carry out * @param {function} func - The bitwise calculation to carry out
* @param {boolean} null_preserving * @param {boolean} nullPreserving
* @param {string} scheme * @param {string} scheme
* @returns {byte_array} * @returns {byteArray}
*/ */
_bit_op: function (input, key, func, null_preserving, scheme) { _bitOp: function (input, key, func, nullPreserving, scheme) {
if (!key || !key.length) key = [0]; if (!key || !key.length) key = [0];
var result = [], var result = [],
x = null, x = null,
@ -32,9 +32,9 @@ var BitwiseOp = {
for (var i = 0; i < input.length; i++) { for (var i = 0; i < input.length; i++) {
k = key[i % key.length]; k = key[i % key.length];
o = input[i]; o = input[i];
x = null_preserving && (o === 0 || o === k) ? o : func(o, k); x = nullPreserving && (o === 0 || o === k) ? o : func(o, k);
result.push(x); result.push(x);
if (scheme !== "Standard" && !(null_preserving && (o === 0 || o === k))) { if (scheme !== "Standard" && !(nullPreserving && (o === 0 || o === k))) {
switch (scheme) { switch (scheme) {
case "Input differential": case "Input differential":
key[i % key.length] = x; key[i % key.length] = x;
@ -69,18 +69,18 @@ var BitwiseOp = {
/** /**
* XOR operation. * XOR operation.
* *
* @param {byte_array} input * @param {byteArray} input
* @param {Object[]} args * @param {Object[]} args
* @returns {byte_array} * @returns {byteArray}
*/ */
run_xor: function (input, args) { runXor: function (input, args) {
var key = Utils.format[args[0].option].parse(args[0].string || ""), var key = Utils.format[args[0].option].parse(args[0].string || ""),
scheme = args[1], scheme = args[1],
null_preserving = args[2]; nullPreserving = args[2];
key = Utils.word_array_to_byte_array(key); key = Utils.wordArrayToByteArray(key);
return BitwiseOp._bit_op(input, key, BitwiseOp._xor, null_preserving, scheme); return BitwiseOp._bitOp(input, key, BitwiseOp._xor, nullPreserving, scheme);
}, },
@ -113,42 +113,42 @@ var BitwiseOp = {
/** /**
* XOR Brute Force operation. * XOR Brute Force operation.
* *
* @param {byte_array} input * @param {byteArray} input
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_xor_brute: function (input, args) { runXorBrute: function (input, args) {
var key_length = parseInt(args[0], 10), var keyLength = parseInt(args[0], 10),
sample_length = args[1], sampleLength = args[1],
sample_offset = args[2], sampleOffset = args[2],
null_preserving = args[3], nullPreserving = args[3],
differential = args[4], differential = args[4],
crib = args[5], crib = args[5],
print_key = args[6], printKey = args[6],
output_hex = args[7], outputHex = args[7],
regex; regex;
var output = "", var output = "",
result, result,
result_utf8; resultUtf8;
input = input.slice(sample_offset, sample_offset + sample_length); input = input.slice(sampleOffset, sampleOffset + sampleLength);
if (crib !== "") { if (crib !== "") {
regex = new RegExp(crib, "im"); regex = new RegExp(crib, "im");
} }
for (var key = 1, l = Math.pow(256, key_length); key < l; key++) { for (var key = 1, l = Math.pow(256, keyLength); key < l; key++) {
result = BitwiseOp._bit_op(input, Utils.hex_to_byte_array(key.toString(16)), BitwiseOp._xor, null_preserving, differential); result = BitwiseOp._bitOp(input, Utils.hexToByteArray(key.toString(16)), BitwiseOp._xor, nullPreserving, differential);
result_utf8 = Utils.byte_array_to_utf8(result); resultUtf8 = Utils.byteArrayToUtf8(result);
if (crib !== "" && result_utf8.search(regex) === -1) continue; if (crib !== "" && resultUtf8.search(regex) === -1) continue;
if (print_key) output += "Key = " + Utils.hex(key, (2*key_length)) + ": "; if (printKey) output += "Key = " + Utils.hex(key, (2*keyLength)) + ": ";
if (output_hex) if (outputHex)
output += Utils.byte_array_to_hex(result) + "\n"; output += Utils.byteArrayToHex(result) + "\n";
else else
output += Utils.printable(result_utf8, false) + "\n"; output += Utils.printable(resultUtf8, false) + "\n";
if (print_key) output += "\n"; if (printKey) output += "\n";
} }
return output; return output;
}, },
@ -157,72 +157,72 @@ var BitwiseOp = {
/** /**
* NOT operation. * NOT operation.
* *
* @param {byte_array} input * @param {byteArray} input
* @param {Object[]} args * @param {Object[]} args
* @returns {byte_array} * @returns {byteArray}
*/ */
run_not: function (input, args) { runNot: function (input, args) {
return BitwiseOp._bit_op(input, null, BitwiseOp._not); return BitwiseOp._bitOp(input, null, BitwiseOp._not);
}, },
/** /**
* AND operation. * AND operation.
* *
* @param {byte_array} input * @param {byteArray} input
* @param {Object[]} args * @param {Object[]} args
* @returns {byte_array} * @returns {byteArray}
*/ */
run_and: function (input, args) { runAnd: function (input, args) {
var key = Utils.format[args[0].option].parse(args[0].string || ""); var key = Utils.format[args[0].option].parse(args[0].string || "");
key = Utils.word_array_to_byte_array(key); key = Utils.wordArrayToByteArray(key);
return BitwiseOp._bit_op(input, key, BitwiseOp._and); return BitwiseOp._bitOp(input, key, BitwiseOp._and);
}, },
/** /**
* OR operation. * OR operation.
* *
* @param {byte_array} input * @param {byteArray} input
* @param {Object[]} args * @param {Object[]} args
* @returns {byte_array} * @returns {byteArray}
*/ */
run_or: function (input, args) { runOr: function (input, args) {
var key = Utils.format[args[0].option].parse(args[0].string || ""); var key = Utils.format[args[0].option].parse(args[0].string || "");
key = Utils.word_array_to_byte_array(key); key = Utils.wordArrayToByteArray(key);
return BitwiseOp._bit_op(input, key, BitwiseOp._or); return BitwiseOp._bitOp(input, key, BitwiseOp._or);
}, },
/** /**
* ADD operation. * ADD operation.
* *
* @param {byte_array} input * @param {byteArray} input
* @param {Object[]} args * @param {Object[]} args
* @returns {byte_array} * @returns {byteArray}
*/ */
run_add: function (input, args) { runAdd: function (input, args) {
var key = Utils.format[args[0].option].parse(args[0].string || ""); var key = Utils.format[args[0].option].parse(args[0].string || "");
key = Utils.word_array_to_byte_array(key); key = Utils.wordArrayToByteArray(key);
return BitwiseOp._bit_op(input, key, BitwiseOp._add); return BitwiseOp._bitOp(input, key, BitwiseOp._add);
}, },
/** /**
* SUB operation. * SUB operation.
* *
* @param {byte_array} input * @param {byteArray} input
* @param {Object[]} args * @param {Object[]} args
* @returns {byte_array} * @returns {byteArray}
*/ */
run_sub: function (input, args) { runSub: function (input, args) {
var key = Utils.format[args[0].option].parse(args[0].string || ""); var key = Utils.format[args[0].option].parse(args[0].string || "");
key = Utils.word_array_to_byte_array(key); key = Utils.wordArrayToByteArray(key);
return BitwiseOp._bit_op(input, key, BitwiseOp._sub); return BitwiseOp._bitOp(input, key, BitwiseOp._sub);
}, },

View File

@ -30,13 +30,13 @@ var ByteRepr = {
/** /**
* To Hex operation. * To Hex operation.
* *
* @param {byte_array} input * @param {byteArray} input
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_to_hex: function(input, args) { runToHex: function(input, args) {
var delim = Utils.char_rep[args[0] || "Space"]; var delim = Utils.charRep[args[0] || "Space"];
return Utils.to_hex(input, delim, 2); return Utils.toHex(input, delim, 2);
}, },
@ -45,11 +45,11 @@ var ByteRepr = {
* *
* @param {string} input * @param {string} input
* @param {Object[]} args * @param {Object[]} args
* @returns {byte_array} * @returns {byteArray}
*/ */
run_from_hex: function(input, args) { runFromHex: function(input, args) {
var delim = args[0] || "Space"; var delim = args[0] || "Space";
return Utils.from_hex(input, delim, 2); return Utils.fromHex(input, delim, 2);
}, },
@ -66,8 +66,8 @@ var ByteRepr = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_to_charcode: function(input, args) { runToCharcode: function(input, args) {
var delim = Utils.char_rep[args[0] || "Space"], var delim = Utils.charRep[args[0] || "Space"],
base = args[1], base = args[1],
output = "", output = "",
padding = 2, padding = 2,
@ -87,11 +87,11 @@ var ByteRepr = {
else if (ordinal < 4294967296) padding = 8; else if (ordinal < 4294967296) padding = 8;
else padding = 2; else padding = 2;
if (padding > 2) app.options.attempt_highlight = false; if (padding > 2) app.options.attemptHighlight = false;
output += Utils.hex(ordinal, padding) + delim; output += Utils.hex(ordinal, padding) + delim;
} else { } else {
app.options.attempt_highlight = false; app.options.attemptHighlight = false;
output += ordinal.toString(base) + delim; output += ordinal.toString(base) + delim;
} }
} }
@ -105,10 +105,10 @@ var ByteRepr = {
* *
* @param {string} input * @param {string} input
* @param {Object[]} args * @param {Object[]} args
* @returns {byte_array} * @returns {byteArray}
*/ */
run_from_charcode: function(input, args) { runFromCharcode: function(input, args) {
var delim = Utils.char_rep[args[0] || "Space"], var delim = Utils.charRep[args[0] || "Space"],
base = args[1], base = args[1],
bites = input.split(delim), bites = input.split(delim),
i = 0; i = 0;
@ -118,7 +118,7 @@ var ByteRepr = {
} }
if (base !== 16) { if (base !== 16) {
app.options.attempt_highlight = false; app.options.attemptHighlight = false;
} }
// Split into groups of 2 if the whole string is concatenated and // Split into groups of 2 if the whole string is concatenated and
@ -134,7 +134,7 @@ var ByteRepr = {
for (i = 0; i < bites.length; i++) { for (i = 0; i < bites.length; i++) {
latin1 += Utils.chr(parseInt(bites[i], base)); latin1 += Utils.chr(parseInt(bites[i], base));
} }
return Utils.str_to_byte_array(latin1); return Utils.strToByteArray(latin1);
}, },
@ -147,8 +147,8 @@ var ByteRepr = {
* @param {Object[]} args * @param {Object[]} args
* @returns {Object[]} pos * @returns {Object[]} pos
*/ */
highlight_to: function(pos, args) { highlightTo: function(pos, args) {
var delim = Utils.char_rep[args[0] || "Space"], var delim = Utils.charRep[args[0] || "Space"],
len = delim === "\r\n" ? 1 : delim.length; len = delim === "\r\n" ? 1 : delim.length;
pos[0].start = pos[0].start * (2 + len); pos[0].start = pos[0].start * (2 + len);
@ -172,8 +172,8 @@ var ByteRepr = {
* @param {Object[]} args * @param {Object[]} args
* @returns {Object[]} pos * @returns {Object[]} pos
*/ */
highlight_from: function(pos, args) { highlightFrom: function(pos, args) {
var delim = Utils.char_rep[args[0] || "Space"], var delim = Utils.charRep[args[0] || "Space"],
len = delim === "\r\n" ? 1 : delim.length, len = delim === "\r\n" ? 1 : delim.length,
width = len + 2; width = len + 2;
@ -194,12 +194,12 @@ var ByteRepr = {
/** /**
* To Decimal operation. * To Decimal operation.
* *
* @param {byte_array} input * @param {byteArray} input
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_to_decimal: function(input, args) { runToDecimal: function(input, args) {
var delim = Utils.char_rep[args[0]]; var delim = Utils.charRep[args[0]];
return input.join(delim); return input.join(delim);
}, },
@ -209,16 +209,16 @@ var ByteRepr = {
* *
* @param {string} input * @param {string} input
* @param {Object[]} args * @param {Object[]} args
* @returns {byte_array} * @returns {byteArray}
*/ */
run_from_decimal: function(input, args) { runFromDecimal: function(input, args) {
var delim = Utils.char_rep[args[0]]; var delim = Utils.charRep[args[0]];
var byte_str = input.split(delim), output = []; var byteStr = input.split(delim), output = [];
if (byte_str[byte_str.length-1] === "") if (byteStr[byteStr.length-1] === "")
byte_str = byte_str.slice(0, byte_str.length-1); byteStr = byteStr.slice(0, byteStr.length-1);
for (var i = 0; i < byte_str.length; i++) { for (var i = 0; i < byteStr.length; i++) {
output[i] = parseInt(byte_str[i], 10); output[i] = parseInt(byteStr[i], 10);
} }
return output; return output;
}, },
@ -227,12 +227,12 @@ var ByteRepr = {
/** /**
* To Binary operation. * To Binary operation.
* *
* @param {byte_array} input * @param {byteArray} input
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_to_binary: function(input, args) { runToBinary: function(input, args) {
var delim = Utils.char_rep[args[0] || "Space"], var delim = Utils.charRep[args[0] || "Space"],
output = "", output = "",
padding = 8; padding = 8;
@ -253,18 +253,18 @@ var ByteRepr = {
* *
* @param {string} input * @param {string} input
* @param {Object[]} args * @param {Object[]} args
* @returns {byte_array} * @returns {byteArray}
*/ */
run_from_binary: function(input, args) { runFromBinary: function(input, args) {
if (args[0] !== "None") { if (args[0] !== "None") {
var delim_regex = Utils.regex_rep[args[0] || "Space"]; var delimRegex = Utils.regexRep[args[0] || "Space"];
input = input.replace(delim_regex, ""); input = input.replace(delimRegex, "");
} }
var output = []; var output = [];
var byte_len = 8; var byteLen = 8;
for (var i = 0; i < input.length; i += byte_len) { for (var i = 0; i < input.length; i += byteLen) {
output.push(parseInt(input.substr(i, byte_len), 2)); output.push(parseInt(input.substr(i, byteLen), 2));
} }
return output; return output;
}, },
@ -279,8 +279,8 @@ var ByteRepr = {
* @param {Object[]} args * @param {Object[]} args
* @returns {Object[]} pos * @returns {Object[]} pos
*/ */
highlight_to_binary: function(pos, args) { highlightToBinary: function(pos, args) {
var delim = Utils.char_rep[args[0] || "Space"]; var delim = Utils.charRep[args[0] || "Space"];
pos[0].start = pos[0].start * (8 + delim.length); pos[0].start = pos[0].start * (8 + delim.length);
pos[0].end = pos[0].end * (8 + delim.length) - delim.length; pos[0].end = pos[0].end * (8 + delim.length) - delim.length;
return pos; return pos;
@ -296,8 +296,8 @@ var ByteRepr = {
* @param {Object[]} args * @param {Object[]} args
* @returns {Object[]} pos * @returns {Object[]} pos
*/ */
highlight_from_binary: function(pos, args) { highlightFromBinary: function(pos, args) {
var delim = Utils.char_rep[args[0] || "Space"]; var delim = Utils.charRep[args[0] || "Space"];
pos[0].start = pos[0].start === 0 ? 0 : Math.floor(pos[0].start / (8 + delim.length)); pos[0].start = pos[0].start === 0 ? 0 : Math.floor(pos[0].start / (8 + delim.length));
pos[0].end = pos[0].end === 0 ? 0 : Math.ceil(pos[0].end / (8 + delim.length)); pos[0].end = pos[0].end === 0 ? 0 : Math.ceil(pos[0].end / (8 + delim.length));
return pos; return pos;
@ -318,40 +318,40 @@ var ByteRepr = {
/** /**
* To Hex Content operation. * To Hex Content operation.
* *
* @param {byte_array} input * @param {byteArray} input
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_to_hex_content: function(input, args) { runToHexContent: function(input, args) {
var convert = args[0]; var convert = args[0];
var spaces = args[1]; var spaces = args[1];
if (convert === "All chars") { if (convert === "All chars") {
var result = "|" + Utils.to_hex(input) + "|"; var result = "|" + Utils.toHex(input) + "|";
if (!spaces) result = result.replace(/ /g, ""); if (!spaces) result = result.replace(/ /g, "");
return result; return result;
} }
var output = "", var output = "",
in_hex = false, inHex = false,
convert_spaces = convert === "Only special chars including spaces", convertSpaces = convert === "Only special chars including spaces",
b; b;
for (var i = 0; i < input.length; i++) { for (var i = 0; i < input.length; i++) {
b = input[i]; b = input[i];
if ((b === 32 && convert_spaces) || (b < 48 && b !== 32) || (b > 57 && b < 65) || (b > 90 && b < 97) || b > 122) { if ((b === 32 && convertSpaces) || (b < 48 && b !== 32) || (b > 57 && b < 65) || (b > 90 && b < 97) || b > 122) {
if (!in_hex) { if (!inHex) {
output += "|"; output += "|";
in_hex = true; inHex = true;
} else if (spaces) output += " "; } else if (spaces) output += " ";
output += Utils.to_hex([b]); output += Utils.toHex([b]);
} else { } else {
if (in_hex) { if (inHex) {
output += "|"; output += "|";
in_hex = false; inHex = false;
} }
output += Utils.chr(input[i]); output += Utils.chr(input[i]);
} }
} }
if (in_hex) output += "|"; if (inHex) output += "|";
return output; return output;
}, },
@ -361,9 +361,9 @@ var ByteRepr = {
* *
* @param {string} input * @param {string} input
* @param {Object[]} args * @param {Object[]} args
* @returns {byte_array} * @returns {byteArray}
*/ */
run_from_hex_content: function(input, args) { runFromHexContent: function(input, args) {
var regex = /\|([a-f\d ]{2,})\|/gi; var regex = /\|([a-f\d ]{2,})\|/gi;
var output = [], m, i = 0; var output = [], m, i = 0;
while ((m = regex.exec(input))) { while ((m = regex.exec(input))) {
@ -372,7 +372,7 @@ var ByteRepr = {
output.push(Utils.ord(input[i++])); output.push(Utils.ord(input[i++]));
// Add match // Add match
var bytes = Utils.from_hex(m[1]); var bytes = Utils.fromHex(m[1]);
if (bytes) { if (bytes) {
for (var a = 0; a < bytes.length;) for (var a = 0; a < bytes.length;)
output.push(bytes[a++]); output.push(bytes[a++]);

View File

@ -25,21 +25,21 @@ var CharEnc = {
* @returns {string} * @returns {string}
*/ */
run: function(input, args) { run: function(input, args) {
var input_format = args[0], var inputFormat = args[0],
output_format = args[1]; outputFormat = args[1];
if (input_format === "Windows-1251") { if (inputFormat === "Windows-1251") {
input = Utils.win1251_to_unicode(input); input = Utils.win1251ToUnicode(input);
input = CryptoJS.enc.Utf8.parse(input); input = CryptoJS.enc.Utf8.parse(input);
} else { } else {
input = Utils.format[input_format].parse(input); input = Utils.format[inputFormat].parse(input);
} }
if (output_format === "Windows-1251") { if (outputFormat === "Windows-1251") {
input = CryptoJS.enc.Utf8.stringify(input); input = CryptoJS.enc.Utf8.stringify(input);
return Utils.unicode_to_win1251(input); return Utils.unicodeToWin1251(input);
} else { } else {
return Utils.format[output_format].stringify(input); return Utils.format[outputFormat].stringify(input);
} }
}, },

View File

@ -10,13 +10,33 @@
var Checksum = { var Checksum = {
/** /**
* Fletcher-16 Checksum operation. * Fletcher-8 Checksum operation.
* *
* @param {byte_array} input * @param {byteArray} input
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_fletcher16: function(input, args) { runFletcher8: function(input, args) {
var a = 0,
b = 0;
for (var i = 0; i < input.length; i++) {
a = (a + input[i]) % 0xf;
b = (b + a) % 0xf;
}
return Utils.hex(((b << 4) | a) >>> 0, 2);
},
/**
* Fletcher-16 Checksum operation.
*
* @param {byteArray} input
* @param {Object[]} args
* @returns {string}
*/
runFletcher16: function(input, args) {
var a = 0, var a = 0,
b = 0; b = 0;
@ -27,16 +47,56 @@ var Checksum = {
return Utils.hex(((b << 8) | a) >>> 0, 4); return Utils.hex(((b << 8) | a) >>> 0, 4);
}, },
/**
* Fletcher-32 Checksum operation.
*
* @param {byteArray} input
* @param {Object[]} args
* @returns {string}
*/
runFletcher32: function(input, args) {
var a = 0,
b = 0;
for (var i = 0; i < input.length; i++) {
a = (a + input[i]) % 0xffff;
b = (b + a) % 0xffff;
}
return Utils.hex(((b << 16) | a) >>> 0, 8);
},
/**
* Fletcher-64 Checksum operation.
*
* @param {byteArray} input
* @param {Object[]} args
* @returns {string}
*/
runFletcher64: function(input, args) {
var a = 0,
b = 0;
for (var i = 0; i < input.length; i++) {
a = (a + input[i]) % 0xffffffff;
b = (b + a) % 0xffffffff;
}
return Utils.hex(b >>> 0, 8) + Utils.hex(a >>> 0, 8);
},
/** /**
* Adler-32 Checksum operation. * Adler-32 Checksum operation.
* *
* @param {byte_array} input * @param {byteArray} input
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_adler32: function(input, args) { runAdler32: function(input, args) {
var MOD_ADLER = 65521, var MOD_ADLER = 65521,
a = 1, a = 1,
b = 0; b = 0;
@ -56,16 +116,16 @@ var Checksum = {
/** /**
* CRC-32 Checksum operation. * CRC-32 Checksum operation.
* *
* @param {byte_array} input * @param {byteArray} input
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_crc32: function(input, args) { runCRC32: function(input, args) {
var crc_table = window.crc_table || (window.crc_table = Checksum._gen_crc_table()), var crcTable = window.crcTable || (window.crcTable = Checksum._genCRCTable()),
crc = 0 ^ (-1); crc = 0 ^ (-1);
for (var i = 0; i < input.length; i++) { for (var i = 0; i < input.length; i++) {
crc = (crc >>> 8) ^ crc_table[(crc ^ input[i]) & 0xff]; crc = (crc >>> 8) ^ crcTable[(crc ^ input[i]) & 0xff];
} }
return Utils.hex((crc ^ (-1)) >>> 0); return Utils.hex((crc ^ (-1)) >>> 0);
@ -76,20 +136,20 @@ var Checksum = {
* TCP/IP Checksum operation. * TCP/IP Checksum operation.
* *
* @author GCHQ Contributor [1] * @author GCHQ Contributor [1]
* @param {byte_array} input * @param {byteArray} input
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
* *
* @example * @example
* // returns '3f2c' * // returns '3f2c'
* Checksum.run_tcp_ip([0x45,0x00,0x00,0x87,0xa3,0x1b,0x40,0x00,0x40,0x06, * Checksum.runTcpIp([0x45,0x00,0x00,0x87,0xa3,0x1b,0x40,0x00,0x40,0x06,
* 0x00,0x00,0xac,0x11,0x00,0x04,0xac,0x11,0x00,0x03]) * 0x00,0x00,0xac,0x11,0x00,0x04,0xac,0x11,0x00,0x03])
* *
* // returns 'a249' * // returns 'a249'
* Checksum.run_tcp_ip([0x45,0x00,0x01,0x11,0x3f,0x74,0x40,0x00,0x40,0x06, * Checksum.runTcpIp([0x45,0x00,0x01,0x11,0x3f,0x74,0x40,0x00,0x40,0x06,
* 0x00,0x00,0xac,0x11,0x00,0x03,0xac,0x11,0x00,0x04]) * 0x00,0x00,0xac,0x11,0x00,0x03,0xac,0x11,0x00,0x04])
*/ */
run_tcp_ip: function(input, args) { runTCPIP: function(input, args) {
var csum = 0; var csum = 0;
for (var i = 0; i < input.length; i++) { for (var i = 0; i < input.length; i++) {
@ -112,19 +172,19 @@ var Checksum = {
* @private * @private
* @returns {array} * @returns {array}
*/ */
_gen_crc_table: function() { _genCRCTable: function() {
var c, var c,
crc_table = []; crcTable = [];
for (var n = 0; n < 256; n++) { for (var n = 0; n < 256; n++) {
c = n; c = n;
for (var k = 0; k < 8; k++) { for (var k = 0; k < 8; k++) {
c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1)); c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));
} }
crc_table[n] = c; crcTable[n] = c;
} }
return crc_table; return crcTable;
}, },
}; };

View File

@ -53,7 +53,7 @@ var Cipher = {
* *
* @private * @private
* @param {function} algo - The CryptoJS algorithm to use * @param {function} algo - The CryptoJS algorithm to use
* @param {byte_array} input * @param {byteArray} input
* @param {function} args * @param {function} args
* @returns {string} * @returns {string}
*/ */
@ -63,8 +63,8 @@ var Cipher = {
salt = Utils.format[args[2].option].parse(args[2].string || ""), salt = Utils.format[args[2].option].parse(args[2].string || ""),
mode = CryptoJS.mode[args[3]], mode = CryptoJS.mode[args[3]],
padding = CryptoJS.pad[args[4]], padding = CryptoJS.pad[args[4]],
result_option = args[5].toLowerCase(), resultOption = args[5].toLowerCase(),
output_format = args[6]; outputFormat = args[6];
if (iv.sigBytes === 0) { if (iv.sigBytes === 0) {
// Use passphrase rather than key. Need to convert it to a string. // Use passphrase rather than key. Need to convert it to a string.
@ -79,13 +79,13 @@ var Cipher = {
}); });
var result = ""; var result = "";
if (result_option === "show all") { if (resultOption === "show all") {
result += "Key: " + encrypted.key.toString(Utils.format[output_format]); result += "Key: " + encrypted.key.toString(Utils.format[outputFormat]);
result += "\nIV: " + encrypted.iv.toString(Utils.format[output_format]); result += "\nIV: " + encrypted.iv.toString(Utils.format[outputFormat]);
if (encrypted.salt) result += "\nSalt: " + encrypted.salt.toString(Utils.format[output_format]); if (encrypted.salt) result += "\nSalt: " + encrypted.salt.toString(Utils.format[outputFormat]);
result += "\n\nCiphertext: " + encrypted.ciphertext.toString(Utils.format[output_format]); result += "\n\nCiphertext: " + encrypted.ciphertext.toString(Utils.format[outputFormat]);
} else { } else {
result = encrypted[result_option].toString(Utils.format[output_format]); result = encrypted[resultOption].toString(Utils.format[outputFormat]);
} }
return result; return result;
@ -97,7 +97,7 @@ var Cipher = {
* *
* @private * @private
* @param {function} algo - The CryptoJS algorithm to use * @param {function} algo - The CryptoJS algorithm to use
* @param {byte_array} input * @param {byteArray} input
* @param {function} args * @param {function} args
* @returns {string} * @returns {string}
*/ */
@ -107,15 +107,15 @@ var Cipher = {
salt = Utils.format[args[2].option].parse(args[2].string || ""), salt = Utils.format[args[2].option].parse(args[2].string || ""),
mode = CryptoJS.mode[args[3]], mode = CryptoJS.mode[args[3]],
padding = CryptoJS.pad[args[4]], padding = CryptoJS.pad[args[4]],
input_format = args[5], inputFormat = args[5],
output_format = args[6]; outputFormat = args[6];
// The ZeroPadding option causes a crash when the input length is 0 // The ZeroPadding option causes a crash when the input length is 0
if (!input.length) { if (!input.length) {
return "No input"; return "No input";
} }
var ciphertext = Utils.format[input_format].parse(input); var ciphertext = Utils.format[inputFormat].parse(input);
if (iv.sigBytes === 0) { if (iv.sigBytes === 0) {
// Use passphrase rather than key. Need to convert it to a string. // Use passphrase rather than key. Need to convert it to a string.
@ -133,7 +133,7 @@ var Cipher = {
var result; var result;
try { try {
result = decrypted.toString(Utils.format[output_format]); result = decrypted.toString(Utils.format[outputFormat]);
} catch (err) { } catch (err) {
result = "Decrypt error: " + err.message; result = "Decrypt error: " + err.message;
} }
@ -149,7 +149,7 @@ var Cipher = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_aes_enc: function (input, args) { runAesEnc: function (input, args) {
return Cipher._enc(CryptoJS.AES, input, args); return Cipher._enc(CryptoJS.AES, input, args);
}, },
@ -161,7 +161,7 @@ var Cipher = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_aes_dec: function (input, args) { runAesDec: function (input, args) {
return Cipher._dec(CryptoJS.AES, input, args); return Cipher._dec(CryptoJS.AES, input, args);
}, },
@ -173,7 +173,7 @@ var Cipher = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_des_enc: function (input, args) { runDesEnc: function (input, args) {
return Cipher._enc(CryptoJS.DES, input, args); return Cipher._enc(CryptoJS.DES, input, args);
}, },
@ -185,7 +185,7 @@ var Cipher = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_des_dec: function (input, args) { runDesDec: function (input, args) {
return Cipher._dec(CryptoJS.DES, input, args); return Cipher._dec(CryptoJS.DES, input, args);
}, },
@ -197,7 +197,7 @@ var Cipher = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_triple_des_enc: function (input, args) { runTripleDesEnc: function (input, args) {
return Cipher._enc(CryptoJS.TripleDES, input, args); return Cipher._enc(CryptoJS.TripleDES, input, args);
}, },
@ -209,7 +209,7 @@ var Cipher = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_triple_des_dec: function (input, args) { runTripleDesDec: function (input, args) {
return Cipher._dec(CryptoJS.TripleDES, input, args); return Cipher._dec(CryptoJS.TripleDES, input, args);
}, },
@ -221,7 +221,7 @@ var Cipher = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_rabbit_enc: function (input, args) { runRabbitEnc: function (input, args) {
return Cipher._enc(CryptoJS.Rabbit, input, args); return Cipher._enc(CryptoJS.Rabbit, input, args);
}, },
@ -233,7 +233,7 @@ var Cipher = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_rabbit_dec: function (input, args) { runRabbitDec: function (input, args) {
return Cipher._dec(CryptoJS.Rabbit, input, args); return Cipher._dec(CryptoJS.Rabbit, input, args);
}, },
@ -256,20 +256,20 @@ var Cipher = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_blowfish_enc: function (input, args) { runBlowfishEnc: function (input, args) {
var key = Utils.format[args[0].option].parse(args[0].string).toString(Utils.format.Latin1), var key = Utils.format[args[0].option].parse(args[0].string).toString(Utils.format.Latin1),
mode = args[1], mode = args[1],
output_format = args[2]; outputFormat = args[2];
if (key.length === 0) return "Enter a key"; if (key.length === 0) return "Enter a key";
var enc_hex = blowfish.encrypt(input, key, { var encHex = blowfish.encrypt(input, key, {
outputType: 1, outputType: 1,
cipherMode: Cipher.BLOWFISH_MODES.indexOf(mode) cipherMode: Cipher.BLOWFISH_MODES.indexOf(mode)
}), }),
enc = CryptoJS.enc.Hex.parse(enc_hex); enc = CryptoJS.enc.Hex.parse(encHex);
return enc.toString(Utils.format[output_format]); return enc.toString(Utils.format[outputFormat]);
}, },
@ -280,14 +280,14 @@ var Cipher = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_blowfish_dec: function (input, args) { runBlowfishDec: function (input, args) {
var key = Utils.format[args[0].option].parse(args[0].string).toString(Utils.format.Latin1), var key = Utils.format[args[0].option].parse(args[0].string).toString(Utils.format.Latin1),
mode = args[1], mode = args[1],
input_format = args[2]; inputFormat = args[2];
if (key.length === 0) return "Enter a key"; if (key.length === 0) return "Enter a key";
input = Utils.format[input_format].parse(input); input = Utils.format[inputFormat].parse(input);
return blowfish.decrypt(input.toString(CryptoJS.enc.Base64), key, { return blowfish.decrypt(input.toString(CryptoJS.enc.Base64), key, {
outputType: 0, // This actually means inputType. The library is weird. outputType: 0, // This actually means inputType. The library is weird.
@ -314,16 +314,16 @@ var Cipher = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_pbkdf2: function (input, args) { runPbkdf2: function (input, args) {
var key_size = args[0] / 32, var keySize = args[0] / 32,
iterations = args[1], iterations = args[1],
salt = CryptoJS.enc.Hex.parse(args[2] || ""), salt = CryptoJS.enc.Hex.parse(args[2] || ""),
input_format = args[3], inputFormat = args[3],
output_format = args[4], outputFormat = args[4],
passphrase = Utils.format[input_format].parse(input), passphrase = Utils.format[inputFormat].parse(input),
key = CryptoJS.PBKDF2(passphrase, salt, { keySize: key_size, iterations: iterations }); key = CryptoJS.PBKDF2(passphrase, salt, { keySize: keySize, iterations: iterations });
return key.toString(Utils.format[output_format]); return key.toString(Utils.format[outputFormat]);
}, },
@ -334,16 +334,16 @@ var Cipher = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_evpkdf: function (input, args) { runEvpkdf: function (input, args) {
var key_size = args[0] / 32, var keySize = args[0] / 32,
iterations = args[1], iterations = args[1],
salt = CryptoJS.enc.Hex.parse(args[2] || ""), salt = CryptoJS.enc.Hex.parse(args[2] || ""),
input_format = args[3], inputFormat = args[3],
output_format = args[4], outputFormat = args[4],
passphrase = Utils.format[input_format].parse(input), passphrase = Utils.format[inputFormat].parse(input),
key = CryptoJS.EvpKDF(passphrase, salt, { keySize: key_size, iterations: iterations }); key = CryptoJS.EvpKDF(passphrase, salt, { keySize: keySize, iterations: iterations });
return key.toString(Utils.format[output_format]); return key.toString(Utils.format[outputFormat]);
}, },
@ -354,7 +354,7 @@ var Cipher = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_rc4: function (input, args) { runRc4: function (input, args) {
var message = Utils.format[args[1]].parse(input), var message = Utils.format[args[1]].parse(input),
passphrase = Utils.format[args[0].option].parse(args[0].string), passphrase = Utils.format[args[0].option].parse(args[0].string),
encrypted = CryptoJS.RC4.encrypt(message, passphrase); encrypted = CryptoJS.RC4.encrypt(message, passphrase);
@ -376,7 +376,7 @@ var Cipher = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_rc4drop: function (input, args) { runRc4drop: function (input, args) {
var message = Utils.format[args[1]].parse(input), var message = Utils.format[args[1]].parse(input),
passphrase = Utils.format[args[0].option].parse(args[0].string), passphrase = Utils.format[args[0].option].parse(args[0].string),
drop = args[3], drop = args[3],
@ -394,13 +394,13 @@ var Cipher = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_vigenere_enc: function (input, args) { runVigenereEnc: function (input, args) {
var alphabet = "abcdefghijklmnopqrstuvwxyz", var alphabet = "abcdefghijklmnopqrstuvwxyz",
key = args[0].toLowerCase(), key = args[0].toLowerCase(),
output = "", output = "",
fail = 0, fail = 0,
key_index, keyIndex,
msg_index, msgIndex,
chr; chr;
if (!key) return "No key entered"; if (!key) return "No key entered";
@ -412,17 +412,17 @@ var Cipher = {
// for chars not in alphabet // for chars not in alphabet
chr = key[(i - fail) % key.length]; chr = key[(i - fail) % key.length];
// Get the location in the vigenere square of the key char // Get the location in the vigenere square of the key char
key_index = alphabet.indexOf(chr); keyIndex = alphabet.indexOf(chr);
// Get the location in the vigenere square of the message char // Get the location in the vigenere square of the message char
msg_index = alphabet.indexOf(input[i]); msgIndex = alphabet.indexOf(input[i]);
// Get the encoded letter by finding the sum of indexes modulo 26 and finding // Get the encoded letter by finding the sum of indexes modulo 26 and finding
// the letter corresponding to that // the letter corresponding to that
output += alphabet[(key_index + msg_index) % 26]; output += alphabet[(keyIndex + msgIndex) % 26];
} else if (alphabet.indexOf(input[i].toLowerCase()) >= 0) { } else if (alphabet.indexOf(input[i].toLowerCase()) >= 0) {
chr = key[(i - fail) % key.length].toLowerCase(); chr = key[(i - fail) % key.length].toLowerCase();
key_index = alphabet.indexOf(chr); keyIndex = alphabet.indexOf(chr);
msg_index = alphabet.indexOf(input[i].toLowerCase()); msgIndex = alphabet.indexOf(input[i].toLowerCase());
output += alphabet[(key_index + msg_index) % 26].toUpperCase(); output += alphabet[(keyIndex + msgIndex) % 26].toUpperCase();
} else { } else {
output += input[i]; output += input[i];
fail++; fail++;
@ -441,13 +441,13 @@ var Cipher = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_vigenere_dec: function (input, args) { runVigenereDec: function (input, args) {
var alphabet = "abcdefghijklmnopqrstuvwxyz", var alphabet = "abcdefghijklmnopqrstuvwxyz",
key = args[0].toLowerCase(), key = args[0].toLowerCase(),
output = "", output = "",
fail = 0, fail = 0,
key_index, keyIndex,
msg_index, msgIndex,
chr; chr;
if (!key) return "No key entered"; if (!key) return "No key entered";
@ -456,16 +456,16 @@ var Cipher = {
for (var i = 0; i < input.length; i++) { for (var i = 0; i < input.length; i++) {
if (alphabet.indexOf(input[i]) >= 0) { if (alphabet.indexOf(input[i]) >= 0) {
chr = key[(i - fail) % key.length]; chr = key[(i - fail) % key.length];
key_index = alphabet.indexOf(chr); keyIndex = alphabet.indexOf(chr);
msg_index = alphabet.indexOf(input[i]); msgIndex = alphabet.indexOf(input[i]);
// Subtract indexes from each other, add 26 just in case the value is negative, // Subtract indexes from each other, add 26 just in case the value is negative,
// modulo to remove if neccessary // modulo to remove if neccessary
output += alphabet[(msg_index - key_index + alphabet.length ) % 26]; output += alphabet[(msgIndex - keyIndex + alphabet.length ) % 26];
} else if (alphabet.indexOf(input[i].toLowerCase()) >= 0) { } else if (alphabet.indexOf(input[i].toLowerCase()) >= 0) {
chr = key[(i - fail) % key.length].toLowerCase(); chr = key[(i - fail) % key.length].toLowerCase();
key_index = alphabet.indexOf(chr); keyIndex = alphabet.indexOf(chr);
msg_index = alphabet.indexOf(input[i].toLowerCase()); msgIndex = alphabet.indexOf(input[i].toLowerCase());
output += alphabet[(msg_index + alphabet.length - key_index) % 26].toUpperCase(); output += alphabet[(msgIndex + alphabet.length - keyIndex) % 26].toUpperCase();
} else { } else {
output += input[i]; output += input[i];
fail++; fail++;
@ -475,6 +475,43 @@ var Cipher = {
return output; return output;
}, },
/**
* @constant
* @default
*/
SUBS_PLAINTEXT: "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
/**
* @constant
* @default
*/
SUBS_CIPHERTEXT: "XYZABCDEFGHIJKLMNOPQRSTUVW",
/**
* Substitute operation.
*
* @param {byteArray} input
* @param {Object[]} args
* @returns {byteArray}
*/
runSubstitute: function (input, args) {
var plaintext = Utils.strToByteArray(Utils.expandAlphRange(args[0]).join()),
ciphertext = Utils.strToByteArray(Utils.expandAlphRange(args[1]).join()),
output = [],
index = -1;
if (plaintext.length !== ciphertext.length) {
output = Utils.strToByteArray("Warning: Plaintext and Ciphertext lengths differ\n\n");
}
for (var i = 0; i < input.length; i++) {
index = plaintext.indexOf(input[i]);
output.push(index > -1 && index < ciphertext.length ? ciphertext[index] : input[i]);
}
return output;
},
}; };

View File

@ -1,4 +1,4 @@
/* globals prettyPrintOne, vkbeautify */ /* globals prettyPrintOne, vkbeautify, xpath */
/** /**
* Code operations. * Code operations.
@ -29,10 +29,10 @@ var Code = {
* @param {Object[]} args * @param {Object[]} args
* @returns {html} * @returns {html}
*/ */
run_syntax_highlight: function(input, args) { runSyntaxHighlight: function(input, args) {
var language = args[0], var language = args[0],
line_nums = args[1]; lineNums = args[1];
return "<code class='prettyprint'>" + prettyPrintOne(Utils.escape_html(input), language, line_nums) + "</code>"; return "<code class='prettyprint'>" + prettyPrintOne(Utils.escapeHtml(input), language, lineNums) + "</code>";
}, },
@ -49,9 +49,9 @@ var Code = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_xml_beautify: function(input, args) { runXmlBeautify: function(input, args) {
var indent_str = args[0]; var indentStr = args[0];
return vkbeautify.xml(input, indent_str); return vkbeautify.xml(input, indentStr);
}, },
@ -62,10 +62,10 @@ var Code = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_json_beautify: function(input, args) { runJsonBeautify: function(input, args) {
var indent_str = args[0]; var indentStr = args[0];
if (!input) return ""; if (!input) return "";
return vkbeautify.json(input, indent_str); return vkbeautify.json(input, indentStr);
}, },
@ -76,9 +76,9 @@ var Code = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_css_beautify: function(input, args) { runCssBeautify: function(input, args) {
var indent_str = args[0]; var indentStr = args[0];
return vkbeautify.css(input, indent_str); return vkbeautify.css(input, indentStr);
}, },
@ -89,9 +89,9 @@ var Code = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_sql_beautify: function(input, args) { runSqlBeautify: function(input, args) {
var indent_str = args[0]; var indentStr = args[0];
return vkbeautify.sql(input, indent_str); return vkbeautify.sql(input, indentStr);
}, },
@ -108,9 +108,9 @@ var Code = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_xml_minify: function(input, args) { runXmlMinify: function(input, args) {
var preserve_comments = args[0]; var preserveComments = args[0];
return vkbeautify.xmlmin(input, preserve_comments); return vkbeautify.xmlmin(input, preserveComments);
}, },
@ -121,7 +121,7 @@ var Code = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_json_minify: function(input, args) { runJsonMinify: function(input, args) {
if (!input) return ""; if (!input) return "";
return vkbeautify.jsonmin(input); return vkbeautify.jsonmin(input);
}, },
@ -134,9 +134,9 @@ var Code = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_css_minify: function(input, args) { runCssMinify: function(input, args) {
var preserve_comments = args[0]; var preserveComments = args[0];
return vkbeautify.cssmin(input, preserve_comments); return vkbeautify.cssmin(input, preserveComments);
}, },
@ -147,7 +147,7 @@ var Code = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_sql_minify: function(input, args) { runSqlMinify: function(input, args) {
return vkbeautify.sqlmin(input); return vkbeautify.sqlmin(input);
}, },
@ -175,48 +175,48 @@ var Code = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_generic_beautify: function(input, args) { runGenericBeautify: function(input, args) {
var code = input, var code = input,
t = 0, t = 0,
preserved_tokens = [], preservedTokens = [],
m; m;
// Remove strings // Remove strings
var sstrings = /'([^'\\]|\\.)*'/g; var sstrings = /'([^'\\]|\\.)*'/g;
while ((m = sstrings.exec(code))) { while ((m = sstrings.exec(code))) {
code = preserve_token(code, m, t++); code = preserveToken(code, m, t++);
sstrings.lastIndex = m.index; sstrings.lastIndex = m.index;
} }
var dstrings = /"([^"\\]|\\.)*"/g; var dstrings = /"([^"\\]|\\.)*"/g;
while ((m = dstrings.exec(code))) { while ((m = dstrings.exec(code))) {
code = preserve_token(code, m, t++); code = preserveToken(code, m, t++);
dstrings.lastIndex = m.index; dstrings.lastIndex = m.index;
} }
// Remove comments // Remove comments
var scomments = /\/\/[^\n\r]*/g; var scomments = /\/\/[^\n\r]*/g;
while ((m = scomments.exec(code))) { while ((m = scomments.exec(code))) {
code = preserve_token(code, m, t++); code = preserveToken(code, m, t++);
scomments.lastIndex = m.index; scomments.lastIndex = m.index;
} }
var mcomments = /\/\*[\s\S]*?\*\//gm; var mcomments = /\/\*[\s\S]*?\*\//gm;
while ((m = mcomments.exec(code))) { while ((m = mcomments.exec(code))) {
code = preserve_token(code, m, t++); code = preserveToken(code, m, t++);
mcomments.lastIndex = m.index; mcomments.lastIndex = m.index;
} }
var hcomments = /(^|\n)#[^\n\r#]+/g; var hcomments = /(^|\n)#[^\n\r#]+/g;
while ((m = hcomments.exec(code))) { while ((m = hcomments.exec(code))) {
code = preserve_token(code, m, t++); code = preserveToken(code, m, t++);
hcomments.lastIndex = m.index; hcomments.lastIndex = m.index;
} }
// Remove regexes // Remove regexes
var regexes = /\/.*?[^\\]\/[gim]{0,3}/gi; var regexes = /\/.*?[^\\]\/[gim]{0,3}/gi;
while ((m = regexes.exec(code))) { while ((m = regexes.exec(code))) {
code = preserve_token(code, m, t++); code = preserveToken(code, m, t++);
regexes.lastIndex = m.index; regexes.lastIndex = m.index;
} }
@ -287,21 +287,136 @@ var Code = {
// Replace preserved tokens // Replace preserved tokens
var ptokens = /###preserved_token(\d+)###/g; var ptokens = /###preservedToken(\d+)###/g;
while ((m = ptokens.exec(code))) { while ((m = ptokens.exec(code))) {
var ti = parseInt(m[1], 10); var ti = parseInt(m[1], 10);
code = code.substring(0, m.index) + preserved_tokens[ti] + code.substring(m.index + m[0].length); code = code.substring(0, m.index) + preservedTokens[ti] + code.substring(m.index + m[0].length);
ptokens.lastIndex = m.index; ptokens.lastIndex = m.index;
} }
return code; return code;
function preserve_token(str, match, t) { function preserveToken(str, match, t) {
preserved_tokens[t] = match[0]; preservedTokens[t] = match[0];
return str.substring(0, match.index) + return str.substring(0, match.index) +
"###preserved_token" + t + "###" + "###preservedToken" + t + "###" +
str.substring(match.index + match[0].length); str.substring(match.index + match[0].length);
} }
}, },
/**
* @constant
* @default
*/
XPATH_INITIAL: "",
/**
* @constant
* @default
*/
XPATH_DELIMITER: "\\n",
/**
* XPath expression operation.
*
* @author Mikescher (https://github.com/Mikescher | https://mikescher.com)
* @param {string} input
* @param {Object[]} args
* @returns {string}
*/
runXpath:function(input, args) {
var query = args[0],
delimiter = args[1];
var xml;
try {
xml = $.parseXML(input);
} catch (err) {
return "Invalid input XML.";
}
var result;
try {
result = xpath.evaluate(xml, query);
} catch (err) {
return "Invalid XPath. Details:\n" + err.message;
}
var serializer = new XMLSerializer();
var nodeToString = function(node) {
switch (node.nodeType) {
case Node.ELEMENT_NODE: return serializer.serializeToString(node);
case Node.ATTRIBUTE_NODE: return node.value;
case Node.COMMENT_NODE: return node.data;
case Node.DOCUMENT_NODE: return serializer.serializeToString(node);
default: throw new Error("Unknown Node Type: " + node.nodeType);
}
};
return Object.keys(result).map(function(key) {
return result[key];
}).slice(0, -1) // all values except last (length)
.map(nodeToString)
.join(delimiter);
},
/**
* @constant
* @default
*/
CSS_SELECTOR_INITIAL: "",
/**
* @constant
* @default
*/
CSS_QUERY_DELIMITER: "\\n",
/**
* CSS selector operation.
*
* @author Mikescher (https://github.com/Mikescher | https://mikescher.com)
* @param {string} input
* @param {Object[]} args
* @returns {string}
*/
runCssQuery: function(input, args) {
var query = args[0],
delimiter = args[1];
var html;
try {
html = $.parseHTML(input);
} catch (err) {
return "Invalid input HTML.";
}
var result;
try {
result = $(html).find(query);
} catch (err) {
return "Invalid CSS Selector. Details:\n" + err.message;
}
var nodeToString = function(node) {
switch (node.nodeType) {
case Node.ELEMENT_NODE: return node.outerHTML;
case Node.ATTRIBUTE_NODE: return node.value;
case Node.COMMENT_NODE: return node.data;
case Node.TEXT_NODE: return node.wholeText;
case Node.DOCUMENT_NODE: return node.outerHTML;
default: throw new Error("Unknown Node Type: " + node.nodeType);
}
};
return Array.apply(null, Array(result.length))
.map(function(_, i) {
return result[i];
})
.map(nodeToString)
.join(delimiter);
},
}; };

View File

@ -44,11 +44,11 @@ var Compress = {
/** /**
* Raw Deflate operation. * Raw Deflate operation.
* *
* @param {byte_array} input * @param {byteArray} input
* @param {Object[]} args * @param {Object[]} args
* @returns {byte_array} * @returns {byteArray}
*/ */
run_raw_deflate: function(input, args) { runRawDeflate: function(input, args) {
var deflate = new Zlib.RawDeflate(input, { var deflate = new Zlib.RawDeflate(input, {
compressionType: Compress.RAW_COMPRESSION_TYPE_LOOKUP[args[0]] compressionType: Compress.RAW_COMPRESSION_TYPE_LOOKUP[args[0]]
}); });
@ -81,20 +81,20 @@ var Compress = {
* @default * @default
*/ */
RAW_BUFFER_TYPE_LOOKUP: { RAW_BUFFER_TYPE_LOOKUP: {
"Adaptive" : Zlib.RawInflate.BufferType.ADAPTIVE, "Adaptive" : Zlib.RawInflate.BufferType.ADAPTIVE,
"Block" : Zlib.RawInflate.BufferType.BLOCK, "Block" : Zlib.RawInflate.BufferType.BLOCK,
}, },
/** /**
* Raw Inflate operation. * Raw Inflate operation.
* *
* @param {byte_array} input * @param {byteArray} input
* @param {Object[]} args * @param {Object[]} args
* @returns {byte_array} * @returns {byteArray}
*/ */
run_raw_inflate: function(input, args) { runRawInflate: function(input, args) {
// Deal with character encoding issues // Deal with character encoding issues
input = Utils.str_to_byte_array(Utils.byte_array_to_utf8(input)); input = Utils.strToByteArray(Utils.byteArrayToUtf8(input));
var inflate = new Zlib.RawInflate(input, { var inflate = new Zlib.RawInflate(input, {
index: args[0], index: args[0],
bufferSize: args[1], bufferSize: args[1],
@ -140,11 +140,11 @@ var Compress = {
/** /**
* Zlib Deflate operation. * Zlib Deflate operation.
* *
* @param {byte_array} input * @param {byteArray} input
* @param {Object[]} args * @param {Object[]} args
* @returns {byte_array} * @returns {byteArray}
*/ */
run_zlib_deflate: function(input, args) { runZlibDeflate: function(input, args) {
var deflate = new Zlib.Deflate(input, { var deflate = new Zlib.Deflate(input, {
compressionType: Compress.ZLIB_COMPRESSION_TYPE_LOOKUP[args[0]] compressionType: Compress.ZLIB_COMPRESSION_TYPE_LOOKUP[args[0]]
}); });
@ -164,13 +164,13 @@ var Compress = {
/** /**
* Zlib Inflate operation. * Zlib Inflate operation.
* *
* @param {byte_array} input * @param {byteArray} input
* @param {Object[]} args * @param {Object[]} args
* @returns {byte_array} * @returns {byteArray}
*/ */
run_zlib_inflate: function(input, args) { runZlibInflate: function(input, args) {
// Deal with character encoding issues // Deal with character encoding issues
input = Utils.str_to_byte_array(Utils.byte_array_to_utf8(input)); input = Utils.strToByteArray(Utils.byteArrayToUtf8(input));
var inflate = new Zlib.Inflate(input, { var inflate = new Zlib.Inflate(input, {
index: args[0], index: args[0],
bufferSize: args[1], bufferSize: args[1],
@ -191,11 +191,11 @@ var Compress = {
/** /**
* Gzip operation. * Gzip operation.
* *
* @param {byte_array} input * @param {byteArray} input
* @param {Object[]} args * @param {Object[]} args
* @returns {byte_array} * @returns {byteArray}
*/ */
run_gzip: function(input, args) { runGzip: function(input, args) {
var filename = args[1], var filename = args[1],
comment = args[2], comment = args[2],
options = { options = {
@ -224,13 +224,13 @@ var Compress = {
/** /**
* Gunzip operation. * Gunzip operation.
* *
* @param {byte_array} input * @param {byteArray} input
* @param {Object[]} args * @param {Object[]} args
* @returns {byte_array} * @returns {byteArray}
*/ */
run_gunzip: function(input, args) { runGunzip: function(input, args) {
// Deal with character encoding issues // Deal with character encoding issues
input = Utils.str_to_byte_array(Utils.byte_array_to_utf8(input)); input = Utils.strToByteArray(Utils.byteArrayToUtf8(input));
var gunzip = new Zlib.Gunzip(input); var gunzip = new Zlib.Gunzip(input);
return Array.prototype.slice.call(gunzip.decompress()); return Array.prototype.slice.call(gunzip.decompress());
}, },
@ -262,15 +262,15 @@ var Compress = {
/** /**
* Zip operation. * Zip operation.
* *
* @param {byte_array} input * @param {byteArray} input
* @param {Object[]} args * @param {Object[]} args
* @returns {byte_array} * @returns {byteArray}
*/ */
run_pkzip: function(input, args) { runPkzip: function(input, args) {
var password = Utils.str_to_byte_array(args[2]), var password = Utils.strToByteArray(args[2]),
options = { options = {
filename: Utils.str_to_byte_array(args[0]), filename: Utils.strToByteArray(args[0]),
comment: Utils.str_to_byte_array(args[1]), comment: Utils.strToByteArray(args[1]),
compressionMethod: Compress.ZIP_COMPRESSION_METHOD_LOOKUP[args[3]], compressionMethod: Compress.ZIP_COMPRESSION_METHOD_LOOKUP[args[3]],
os: Compress.ZIP_OS_LOOKUP[args[4]], os: Compress.ZIP_OS_LOOKUP[args[4]],
deflateOption: { deflateOption: {
@ -295,13 +295,13 @@ var Compress = {
/** /**
* Unzip operation. * Unzip operation.
* *
* @param {byte_array} input * @param {byteArray} input
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_pkunzip: function(input, args) { runPkunzip: function(input, args) {
var options = { var options = {
password: Utils.str_to_byte_array(args[0]), password: Utils.strToByteArray(args[0]),
verify: args[1] verify: args[1]
}, },
file = "", file = "",
@ -313,7 +313,7 @@ var Compress = {
window.uzip = unzip; window.uzip = unzip;
for (var i = 0; i < filenames.length; i++) { for (var i = 0; i < filenames.length; i++) {
file = Utils.byte_array_to_utf8(unzip.decompress(filenames[i])); file = Utils.byteArrayToUtf8(unzip.decompress(filenames[i]));
output += "<div class='panel panel-default'>" + output += "<div class='panel panel-default'>" +
"<div class='panel-heading' role='tab' id='heading" + i + "'>" + "<div class='panel-heading' role='tab' id='heading" + i + "'>" +
"<h4 class='panel-title'>" + "<h4 class='panel-title'>" +
@ -322,7 +322,7 @@ var Compress = {
filenames[i] + "<span class='pull-right'>" + file.length.toLocaleString() + " bytes</span></a></h4></div>" + filenames[i] + "<span class='pull-right'>" + file.length.toLocaleString() + " bytes</span></a></h4></div>" +
"<div id='collapse" + i + "' class='panel-collapse collapse' role='tabpanel' aria-labelledby='heading" + i + "'>" + "<div id='collapse" + i + "' class='panel-collapse collapse' role='tabpanel' aria-labelledby='heading" + i + "'>" +
"<div class='panel-body'>" + "<div class='panel-body'>" +
Utils.escape_html(file) + "</div></div></div>"; Utils.escapeHtml(file) + "</div></div></div>";
} }
return output + "</div>"; return output + "</div>";
@ -332,17 +332,17 @@ var Compress = {
/** /**
* Bzip2 Decompress operation. * Bzip2 Decompress operation.
* *
* @param {byte_array} input * @param {byteArray} input
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_bzip2_decompress: function(input, args) { runBzip2Decompress: function(input, args) {
var compressed = new Uint8Array(input), var compressed = new Uint8Array(input),
bzip2_reader, bzip2Reader,
plain = ""; plain = "";
bzip2_reader = bzip2.array(compressed); bzip2Reader = bzip2.array(compressed);
plain = bzip2.simple(bzip2_reader); plain = bzip2.simple(bzip2Reader);
return plain; return plain;
}, },

View File

@ -64,12 +64,12 @@ var Convert = {
* @param {Object[]} args * @param {Object[]} args
* @returns {number} * @returns {number}
*/ */
run_distance: function (input, args) { runDistance: function (input, args) {
var input_units = args[0], var inputUnits = args[0],
output_units = args[1]; outputUnits = args[1];
input = input * Convert.DISTANCE_FACTOR[input_units]; input = input * Convert.DISTANCE_FACTOR[inputUnits];
return input / Convert.DISTANCE_FACTOR[output_units]; return input / Convert.DISTANCE_FACTOR[outputUnits];
// TODO Remove rounding errors (e.g. 1.000000000001) // TODO Remove rounding errors (e.g. 1.000000000001)
}, },
@ -145,12 +145,12 @@ var Convert = {
* @param {Object[]} args * @param {Object[]} args
* @returns {number} * @returns {number}
*/ */
run_data_size: function (input, args) { runDataSize: function (input, args) {
var input_units = args[0], var inputUnits = args[0],
output_units = args[1]; outputUnits = args[1];
input = input * Convert.DATA_FACTOR[input_units]; input = input * Convert.DATA_FACTOR[inputUnits];
return input / Convert.DATA_FACTOR[output_units]; return input / Convert.DATA_FACTOR[outputUnits];
}, },
@ -225,12 +225,12 @@ var Convert = {
* @param {Object[]} args * @param {Object[]} args
* @returns {number} * @returns {number}
*/ */
run_area: function (input, args) { runArea: function (input, args) {
var input_units = args[0], var inputUnits = args[0],
output_units = args[1]; outputUnits = args[1];
input = input * Convert.AREA_FACTOR[input_units]; input = input * Convert.AREA_FACTOR[inputUnits];
return input / Convert.AREA_FACTOR[output_units]; return input / Convert.AREA_FACTOR[outputUnits];
}, },
@ -336,12 +336,12 @@ var Convert = {
* @param {Object[]} args * @param {Object[]} args
* @returns {number} * @returns {number}
*/ */
run_mass: function (input, args) { runMass: function (input, args) {
var input_units = args[0], var inputUnits = args[0],
output_units = args[1]; outputUnits = args[1];
input = input * Convert.MASS_FACTOR[input_units]; input = input * Convert.MASS_FACTOR[inputUnits];
return input / Convert.MASS_FACTOR[output_units]; return input / Convert.MASS_FACTOR[outputUnits];
}, },
@ -401,12 +401,12 @@ var Convert = {
* @param {Object[]} args * @param {Object[]} args
* @returns {number} * @returns {number}
*/ */
run_speed: function (input, args) { runSpeed: function (input, args) {
var input_units = args[0], var inputUnits = args[0],
output_units = args[1]; outputUnits = args[1];
input = input * Convert.SPEED_FACTOR[input_units]; input = input * Convert.SPEED_FACTOR[inputUnits];
return input / Convert.SPEED_FACTOR[output_units]; return input / Convert.SPEED_FACTOR[outputUnits];
}, },
}; };

View File

@ -24,7 +24,7 @@ var DateTime = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_from_unix_timestamp: function(input, args) { runFromUnixTimestamp: function(input, args) {
var units = args[0], var units = args[0],
d; d;
@ -55,7 +55,7 @@ var DateTime = {
* @param {Object[]} args * @param {Object[]} args
* @returns {number} * @returns {number}
*/ */
run_to_unix_timestamp: function(input, args) { runToUnixTimestamp: function(input, args) {
var units = args[0], var units = args[0],
d = moment(input); d = moment(input);
@ -130,21 +130,21 @@ var DateTime = {
* @param {Object[]} args * @param {Object[]} args
* @returns {html} * @returns {html}
*/ */
run_translate_format: function(input, args) { runTranslateFormat: function(input, args) {
var input_format = args[1], var inputFormat = args[1],
input_timezone = args[2], inputTimezone = args[2],
output_format = args[3], outputFormat = args[3],
output_timezone = args[4], outputTimezone = args[4],
date; date;
try { try {
date = moment.tz(input, input_format, input_timezone); date = moment.tz(input, inputFormat, inputTimezone);
if (!date || date.format() === "Invalid date") throw Error; if (!date || date.format() === "Invalid date") throw Error;
} catch(err) { } catch(err) {
return "Invalid format.\n\n" + DateTime.FORMAT_EXAMPLES; return "Invalid format.\n\n" + DateTime.FORMAT_EXAMPLES;
} }
return date.tz(output_timezone).format(output_format); return date.tz(outputTimezone).format(outputFormat);
}, },
@ -155,14 +155,14 @@ var DateTime = {
* @param {Object[]} args * @param {Object[]} args
* @returns {html} * @returns {html}
*/ */
run_parse: function(input, args) { runParse: function(input, args) {
var input_format = args[1], var inputFormat = args[1],
input_timezone = args[2], inputTimezone = args[2],
date, date,
output = ""; output = "";
try { try {
date = moment.tz(input, input_format, input_timezone); date = moment.tz(input, inputFormat, inputTimezone);
if (!date || date.format() === "Invalid date") throw Error; if (!date || date.format() === "Invalid date") throw Error;
} catch(err) { } catch(err) {
return "Invalid format.\n\n" + DateTime.FORMAT_EXAMPLES; return "Invalid format.\n\n" + DateTime.FORMAT_EXAMPLES;

View File

@ -32,39 +32,39 @@ var Endian = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_swap_endianness: function(input, args) { runSwapEndianness: function(input, args) {
var data_format = args[0], var dataFormat = args[0],
word_length = args[1], wordLength = args[1],
pad_incomplete_words = args[2], padIncompleteWords = args[2],
data = [], data = [],
result = [], result = [],
words = [], words = [],
i = 0, i = 0,
j = 0; j = 0;
if (word_length <= 0) { if (wordLength <= 0) {
return "Word length must be greater than 0"; return "Word length must be greater than 0";
} }
// Convert input to raw data based on specified data format // Convert input to raw data based on specified data format
switch (data_format) { switch (dataFormat) {
case "Hex": case "Hex":
data = Utils.from_hex(input); data = Utils.fromHex(input);
break; break;
case "Raw": case "Raw":
data = Utils.str_to_byte_array(input); data = Utils.strToByteArray(input);
break; break;
default: default:
data = input; data = input;
} }
// Split up into words // Split up into words
for (i = 0; i < data.length; i += word_length) { for (i = 0; i < data.length; i += wordLength) {
var word = data.slice(i, i + word_length); var word = data.slice(i, i + wordLength);
// Pad word if too short // Pad word if too short
if (pad_incomplete_words && word.length < word_length){ if (padIncompleteWords && word.length < wordLength){
for (j = word.length; j < word_length; j++) { for (j = word.length; j < wordLength; j++) {
word.push(0); word.push(0);
} }
} }
@ -81,11 +81,11 @@ var Endian = {
} }
// Convert data back to specified data format // Convert data back to specified data format
switch (data_format) { switch (dataFormat) {
case "Hex": case "Hex":
return Utils.to_hex(result); return Utils.toHex(result);
case "Raw": case "Raw":
return Utils.byte_array_to_utf8(result); return Utils.byteArrayToUtf8(result);
default: default:
return result; return result;
} }

View File

@ -18,14 +18,14 @@ var Entropy = {
/** /**
* Entropy operation. * Entropy operation.
* *
* @param {byte_array} input * @param {byteArray} input
* @param {Object[]} args * @param {Object[]} args
* @returns {html} * @returns {html}
*/ */
run_entropy: function(input, args) { runEntropy: function(input, args) {
var chunk_size = args[0], var chunkSize = args[0],
output = "", output = "",
entropy = Entropy._calc_entropy(input); entropy = Entropy._calcEntropy(input);
output += "Shannon entropy: " + entropy + "\n" + output += "Shannon entropy: " + entropy + "\n" +
"<br><canvas id='chart-area'></canvas><br>\n" + "<br><canvas id='chart-area'></canvas><br>\n" +
@ -35,14 +35,14 @@ var Entropy = {
"The following results show the entropy of chunks of the input data. Chunks with particularly high entropy could suggest encrypted or compressed sections.\n\n" + "The following results show the entropy of chunks of the input data. Chunks with particularly high entropy could suggest encrypted or compressed sections.\n\n" +
"<br><script>\ "<br><script>\
var canvas = document.getElementById('chart-area'),\ var canvas = document.getElementById('chart-area'),\
parent_rect = canvas.parentNode.getBoundingClientRect(),\ parentRect = canvas.parentNode.getBoundingClientRect(),\
entropy = " + entropy + ",\ entropy = " + entropy + ",\
height = parent_rect.height * 0.25;\ height = parentRect.height * 0.25;\
\ \
canvas.width = parent_rect.width * 0.95;\ canvas.width = parentRect.width * 0.95;\
canvas.height = height > 150 ? 150 : height;\ canvas.height = height > 150 ? 150 : height;\
\ \
CanvasComponents.draw_scale_bar(canvas, entropy, 8, [\ CanvasComponents.drawScaleBar(canvas, entropy, 8, [\
{\ {\
label: 'English text',\ label: 'English text',\
min: 3.5,\ min: 3.5,\
@ -55,11 +55,11 @@ var Entropy = {
]);\ ]);\
</script>"; </script>";
var chunk_entropy = 0; var chunkEntropy = 0;
if (chunk_size !== 0) { if (chunkSize !== 0) {
for (var i = 0; i < input.length; i += chunk_size) { for (var i = 0; i < input.length; i += chunkSize) {
chunk_entropy = Entropy._calc_entropy(input.slice(i, i+chunk_size)); chunkEntropy = Entropy._calcEntropy(input.slice(i, i+chunkSize));
output += "Bytes " + i + " to " + (i+chunk_size) + ": " + chunk_entropy + "\n"; output += "Bytes " + i + " to " + (i+chunkSize) + ": " + chunkEntropy + "\n";
} }
} else { } else {
output += "Chunk size cannot be 0."; output += "Chunk size cannot be 0.";
@ -78,17 +78,17 @@ var Entropy = {
/** /**
* Frequency distribution operation. * Frequency distribution operation.
* *
* @param {byte_array} input * @param {byteArray} input
* @param {Object[]} args * @param {Object[]} args
* @returns {html} * @returns {html}
*/ */
run_freq_distrib: function (input, args) { runFreqDistrib: function (input, args) {
if (!input.length) return "No data"; if (!input.length) return "No data";
var distrib = new Array(256), var distrib = new Array(256),
percentages = new Array(256), percentages = new Array(256),
len = input.length, len = input.length,
show_zeroes = args[0]; showZeroes = args[0];
// Initialise distrib to 0 // Initialise distrib to 0
for (var i = 0; i < 256; i++) { for (var i = 0; i < 256; i++) {
@ -115,19 +115,19 @@ var Entropy = {
"\n\nByte Percentage\n" + "\n\nByte Percentage\n" +
"<script>\ "<script>\
var canvas = document.getElementById('chart-area'),\ var canvas = document.getElementById('chart-area'),\
parent_rect = canvas.parentNode.getBoundingClientRect(),\ parentRect = canvas.parentNode.getBoundingClientRect(),\
scores = " + JSON.stringify(percentages) + ";\ scores = " + JSON.stringify(percentages) + ";\
\ \
canvas.width = parent_rect.width * 0.95;\ canvas.width = parentRect.width * 0.95;\
canvas.height = parent_rect.height * 0.9;\ canvas.height = parentRect.height * 0.9;\
\ \
CanvasComponents.draw_bar_chart(canvas, scores, 'Byte', 'Frequency %', 16, 6);\ CanvasComponents.drawBarChart(canvas, scores, 'Byte', 'Frequency %', 16, 6);\
</script>"; </script>";
for (i = 0; i < 256; i++) { for (i = 0; i < 256; i++) {
if (distrib[i] || show_zeroes) { if (distrib[i] || showZeroes) {
output += " " + Utils.hex(i, 2) + " (" + output += " " + Utils.hex(i, 2) + " (" +
Utils.pad_right(percentages[i].toFixed(2).replace(".00", "") + "%)", 8) + Utils.padRight(percentages[i].toFixed(2).replace(".00", "") + "%)", 8) +
Array(Math.ceil(percentages[i])+1).join("|") + "\n"; Array(Math.ceil(percentages[i])+1).join("|") + "\n";
} }
} }
@ -140,13 +140,13 @@ var Entropy = {
* Calculates the Shannon entropy for a given chunk of data. * Calculates the Shannon entropy for a given chunk of data.
* *
* @private * @private
* @param {byte_array} data * @param {byteArray} data
* @returns {number} * @returns {number}
*/ */
_calc_entropy: function(data) { _calcEntropy: function(data) {
var prob = [], var prob = [],
uniques = data.unique(), uniques = data.unique(),
str = Utils.byte_array_to_chars(data); str = Utils.byteArrayToChars(data);
for (var i = 0; i < uniques.length; i++) { for (var i = 0; i < uniques.length; i++) {
prob.push(str.count(Utils.chr(uniques[i])) / data.length); prob.push(str.count(Utils.chr(uniques[i])) / data.length);

View File

@ -10,29 +10,29 @@
var Extract = { var Extract = {
/** /**
* Runs search operations across the input data using refular expressions. * Runs search operations across the input data using regular expressions.
* *
* @private * @private
* @param {string} input * @param {string} input
* @param {RegExp} search_regex * @param {RegExp} searchRegex
* @param {RegExp} remove_regex - A regular expression defining results to remove from the * @param {RegExp} removeRegex - A regular expression defining results to remove from the
* final list * final list
* @param {boolean} include_total - Whether or not to include the total number of results * @param {boolean} includeTotal - Whether or not to include the total number of results
* @returns {string} * @returns {string}
*/ */
_search: function(input, search_regex, remove_regex, include_total) { _search: function(input, searchRegex, removeRegex, includeTotal) {
var output = "", var output = "",
total = 0, total = 0,
match; match;
while ((match = search_regex.exec(input))) { while ((match = searchRegex.exec(input))) {
if (remove_regex && remove_regex.test(match[0])) if (removeRegex && removeRegex.test(match[0]))
continue; continue;
total++; total++;
output += match[0] + "\n"; output += match[0] + "\n";
} }
if (include_total) if (includeTotal)
output = "Total found: " + total + "\n\n" + output; output = "Total found: " + total + "\n\n" + output;
return output; return output;
@ -57,13 +57,13 @@ var Extract = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_strings: function(input, args) { runStrings: function(input, args) {
var min_len = args[0] || Extract.MIN_STRING_LEN, var minLen = args[0] || Extract.MIN_STRING_LEN,
display_total = args[1], displayTotal = args[1],
strings = "[A-Z\\d/\\-:.,_$%'\"()<>= !\\[\\]{}@]", strings = "[A-Z\\d/\\-:.,_$%'\"()<>= !\\[\\]{}@]",
regex = new RegExp(strings + "{" + min_len + ",}", "ig"); regex = new RegExp(strings + "{" + minLen + ",}", "ig");
return Extract._search(input, regex, null, display_total); return Extract._search(input, regex, null, displayTotal);
}, },
@ -90,37 +90,37 @@ var Extract = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_ip: function(input, args) { runIp: function(input, args) {
var include_ipv4 = args[0], var includeIpv4 = args[0],
include_ipv6 = args[1], includeIpv6 = args[1],
remove_local = args[2], removeLocal = args[2],
display_total = args[3], displayTotal = args[3],
ipv4 = "(?:(?:\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d|\\d)(?:\\/\\d{1,2})?", ipv4 = "(?:(?:\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d|\\d)(?:\\/\\d{1,2})?",
ipv6 = "((?=.*::)(?!.*::.+::)(::)?([\\dA-F]{1,4}:(:|\\b)|){5}|([\\dA-F]{1,4}:){6})((([\\dA-F]{1,4}((?!\\3)::|:\\b|(?![\\dA-F])))|(?!\\2\\3)){2}|(((2[0-4]|1\\d|[1-9])?\\d|25[0-5])\\.?\\b){4})", ipv6 = "((?=.*::)(?!.*::.+::)(::)?([\\dA-F]{1,4}:(:|\\b)|){5}|([\\dA-F]{1,4}:){6})((([\\dA-F]{1,4}((?!\\3)::|:\\b|(?![\\dA-F])))|(?!\\2\\3)){2}|(((2[0-4]|1\\d|[1-9])?\\d|25[0-5])\\.?\\b){4})",
ips = ""; ips = "";
if (include_ipv4 && include_ipv6) { if (includeIpv4 && includeIpv6) {
ips = ipv4 + "|" + ipv6; ips = ipv4 + "|" + ipv6;
} else if (include_ipv4) { } else if (includeIpv4) {
ips = ipv4; ips = ipv4;
} else if (include_ipv6) { } else if (includeIpv6) {
ips = ipv6; ips = ipv6;
} }
if (ips) { if (ips) {
var regex = new RegExp(ips, "ig"); var regex = new RegExp(ips, "ig");
if (remove_local) { if (removeLocal) {
var ten = "10\\..+", var ten = "10\\..+",
oneninetwo = "192\\.168\\..+", oneninetwo = "192\\.168\\..+",
oneseventwo = "172\\.(?:1[6-9]|2\\d|3[01])\\..+", oneseventwo = "172\\.(?:1[6-9]|2\\d|3[01])\\..+",
onetwoseven = "127\\..+", onetwoseven = "127\\..+",
remove_regex = new RegExp("^(?:" + ten + "|" + oneninetwo + removeRegex = new RegExp("^(?:" + ten + "|" + oneninetwo +
"|" + oneseventwo + "|" + onetwoseven + ")"); "|" + oneseventwo + "|" + onetwoseven + ")");
return Extract._search(input, regex, remove_regex, display_total); return Extract._search(input, regex, removeRegex, displayTotal);
} else { } else {
return Extract._search(input, regex, null, display_total); return Extract._search(input, regex, null, displayTotal);
} }
} else { } else {
return ""; return "";
@ -135,11 +135,11 @@ var Extract = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_email: function(input, args) { runEmail: function(input, args) {
var display_total = args[0], var displayTotal = args[0],
regex = /\w[-.\w]*@[-\w]+(?:\.[-\w]+)*\.[A-Z]{2,4}/ig; regex = /\w[-.\w]*@[-\w]+(?:\.[-\w]+)*\.[A-Z]{2,4}/ig;
return Extract._search(input, regex, null, display_total); return Extract._search(input, regex, null, displayTotal);
}, },
@ -150,11 +150,11 @@ var Extract = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_mac: function(input, args) { runMac: function(input, args) {
var display_total = args[0], var displayTotal = args[0],
regex = /[A-F\d]{2}(?:[:-][A-F\d]{2}){5}/ig; regex = /[A-F\d]{2}(?:[:-][A-F\d]{2}){5}/ig;
return Extract._search(input, regex, null, display_total); return Extract._search(input, regex, null, displayTotal);
}, },
@ -165,8 +165,8 @@ var Extract = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_urls: function(input, args) { runUrls: function(input, args) {
var display_total = args[0], var displayTotal = args[0],
protocol = "[A-Z]+://", protocol = "[A-Z]+://",
hostname = "[-\\w]+(?:\\.\\w[-\\w]*)+", hostname = "[-\\w]+(?:\\.\\w[-\\w]*)+",
port = ":\\d+", port = ":\\d+",
@ -175,7 +175,7 @@ var Extract = {
path += "(?:[.!,?]+[^.!,?;\"'<>()\\[\\]{}\\s\\x7F-\\xFF]+)*"; path += "(?:[.!,?]+[^.!,?;\"'<>()\\[\\]{}\\s\\x7F-\\xFF]+)*";
var regex = new RegExp(protocol + hostname + "(?:" + port + var regex = new RegExp(protocol + hostname + "(?:" + port +
")?(?:" + path + ")?", "ig"); ")?(?:" + path + ")?", "ig");
return Extract._search(input, regex, null, display_total); return Extract._search(input, regex, null, displayTotal);
}, },
@ -186,14 +186,14 @@ var Extract = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_domains: function(input, args) { runDomains: function(input, args) {
var display_total = args[0], var displayTotal = args[0],
protocol = "https?://", protocol = "https?://",
hostname = "[-\\w\\.]+", hostname = "[-\\w\\.]+",
tld = "\\.(?:com|net|org|biz|info|co|uk|onion|int|mobi|name|edu|gov|mil|eu|ac|ae|af|de|ca|ch|cn|cy|es|gb|hk|il|in|io|tv|me|nl|no|nz|ro|ru|tr|us|az|ir|kz|uz|pk)+", tld = "\\.(?:com|net|org|biz|info|co|uk|onion|int|mobi|name|edu|gov|mil|eu|ac|ae|af|de|ca|ch|cn|cy|es|gb|hk|il|in|io|tv|me|nl|no|nz|ro|ru|tr|us|az|ir|kz|uz|pk)+",
regex = new RegExp("(?:" + protocol + ")?" + hostname + tld, "ig"); regex = new RegExp("(?:" + protocol + ")?" + hostname + tld, "ig");
return Extract._search(input, regex, null, display_total); return Extract._search(input, regex, null, displayTotal);
}, },
@ -215,29 +215,29 @@ var Extract = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_file_paths: function(input, args) { runFilePaths: function(input, args) {
var include_win_path = args[0], var includeWinPath = args[0],
include_unix_path = args[1], includeUnixPath = args[1],
display_total = args[2], displayTotal = args[2],
win_drive = "[A-Z]:\\\\", winDrive = "[A-Z]:\\\\",
win_name = "[A-Z\\d][A-Z\\d\\- '_\\(\\)]{0,61}", winName = "[A-Z\\d][A-Z\\d\\- '_\\(\\)]{0,61}",
win_ext = "[A-Z\\d]{1,6}", winExt = "[A-Z\\d]{1,6}",
win_path = win_drive + "(?:" + win_name + "\\\\?)*" + win_name + winPath = winDrive + "(?:" + winName + "\\\\?)*" + winName +
"(?:\\." + win_ext + ")?", "(?:\\." + winExt + ")?",
unix_path = "(?:/[A-Z\\d.][A-Z\\d\\-.]{0,61})+", unixPath = "(?:/[A-Z\\d.][A-Z\\d\\-.]{0,61})+",
file_paths = ""; filePaths = "";
if (include_win_path && include_unix_path) { if (includeWinPath && includeUnixPath) {
file_paths = win_path + "|" + unix_path; filePaths = winPath + "|" + unixPath;
} else if (include_win_path) { } else if (includeWinPath) {
file_paths = win_path; filePaths = winPath;
} else if (include_unix_path) { } else if (includeUnixPath) {
file_paths = unix_path; filePaths = unixPath;
} }
if (file_paths) { if (filePaths) {
var regex = new RegExp(file_paths, "ig"); var regex = new RegExp(filePaths, "ig");
return Extract._search(input, regex, null, display_total); return Extract._search(input, regex, null, displayTotal);
} else { } else {
return ""; return "";
} }
@ -251,14 +251,14 @@ var Extract = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_dates: function(input, args) { runDates: function(input, args) {
var display_total = args[0], var displayTotal = args[0],
date1 = "(?:19|20)\\d\\d[- /.](?:0[1-9]|1[012])[- /.](?:0[1-9]|[12][0-9]|3[01])", // yyyy-mm-dd date1 = "(?:19|20)\\d\\d[- /.](?:0[1-9]|1[012])[- /.](?:0[1-9]|[12][0-9]|3[01])", // yyyy-mm-dd
date2 = "(?:0[1-9]|[12][0-9]|3[01])[- /.](?:0[1-9]|1[012])[- /.](?:19|20)\\d\\d", // dd/mm/yyyy date2 = "(?:0[1-9]|[12][0-9]|3[01])[- /.](?:0[1-9]|1[012])[- /.](?:19|20)\\d\\d", // dd/mm/yyyy
date3 = "(?:0[1-9]|1[012])[- /.](?:0[1-9]|[12][0-9]|3[01])[- /.](?:19|20)\\d\\d", // mm/dd/yyyy date3 = "(?:0[1-9]|1[012])[- /.](?:0[1-9]|[12][0-9]|3[01])[- /.](?:19|20)\\d\\d", // mm/dd/yyyy
regex = new RegExp(date1 + "|" + date2 + "|" + date3, "ig"); regex = new RegExp(date1 + "|" + date2 + "|" + date3, "ig");
return Extract._search(input, regex, null, display_total); return Extract._search(input, regex, null, displayTotal);
}, },
@ -269,29 +269,29 @@ var Extract = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_all_idents: function(input, args) { runAllIdents: function(input, args) {
var output = ""; var output = "";
output += "IP addresses\n"; output += "IP addresses\n";
output += Extract.run_ip(input, [true, true, false]); output += Extract.runIp(input, [true, true, false]);
output += "\nEmail addresses\n"; output += "\nEmail addresses\n";
output += Extract.run_email(input, []); output += Extract.runEmail(input, []);
output += "\nMAC addresses\n"; output += "\nMAC addresses\n";
output += Extract.run_mac(input, []); output += Extract.runMac(input, []);
output += "\nURLs\n"; output += "\nURLs\n";
output += Extract.run_urls(input, []); output += Extract.runUrls(input, []);
output += "\nDomain names\n"; output += "\nDomain names\n";
output += Extract.run_domains(input, []); output += Extract.runDomains(input, []);
output += "\nFile paths\n"; output += "\nFile paths\n";
output += Extract.run_file_paths(input, [true, true]); output += Extract.runFilePaths(input, [true, true]);
output += "\nDates\n"; output += "\nDates\n";
output += Extract.run_dates(input, []); output += Extract.runDates(input, []);
return output; return output;
}, },
}; };

View File

@ -12,12 +12,12 @@ var FileType = {
/** /**
* Detect File Type operation. * Detect File Type operation.
* *
* @param {byte_array} input * @param {byteArray} input
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_detect: function(input, args) { runDetect: function(input, args) {
var type = FileType._magic_type(input); var type = FileType._magicType(input);
if (!type) { if (!type) {
return "Unknown file type. Have you tried checking the entropy of this data to determine whether it might be encrypted or compressed?"; return "Unknown file type. Have you tried checking the entropy of this data to determine whether it might be encrypted or compressed?";
@ -43,26 +43,26 @@ var FileType = {
/** /**
* Scan for Embedded Files operation. * Scan for Embedded Files operation.
* *
* @param {byte_array} input * @param {byteArray} input
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_scan_for_embedded_files: function(input, args) { runScanForEmbeddedFiles: function(input, args) {
var output = "Scanning data for 'magic bytes' which may indicate embedded files. The following results may be false positives and should not be treat as reliable. Any suffiently long file is likely to contain these magic bytes coincidentally.\n", var output = "Scanning data for 'magic bytes' which may indicate embedded files. The following results may be false positives and should not be treat as reliable. Any suffiently long file is likely to contain these magic bytes coincidentally.\n",
type, type,
ignore_common = args[0], ignoreCommon = args[0],
common_exts = ["ico", "ttf", ""], commonExts = ["ico", "ttf", ""],
num_found = 0, numFound = 0,
num_common_found = 0; numCommonFound = 0;
for (var i = 0; i < input.length; i++) { for (var i = 0; i < input.length; i++) {
type = FileType._magic_type(input.slice(i)); type = FileType._magicType(input.slice(i));
if (type) { if (type) {
if (ignore_common && common_exts.indexOf(type.ext) > -1) { if (ignoreCommon && commonExts.indexOf(type.ext) > -1) {
num_common_found++; numCommonFound++;
continue; continue;
} }
num_found++; numFound++;
output += "\nOffset " + i + " (0x" + Utils.hex(i) + "):\n" + output += "\nOffset " + i + " (0x" + Utils.hex(i) + "):\n" +
" File extension: " + type.ext + "\n" + " File extension: " + type.ext + "\n" +
" MIME type: " + type.mime + "\n"; " MIME type: " + type.mime + "\n";
@ -73,13 +73,13 @@ var FileType = {
} }
} }
if (num_found === 0) { if (numFound === 0) {
output += "\nNo embedded files were found."; output += "\nNo embedded files were found.";
} }
if (num_common_found > 0) { if (numCommonFound > 0) {
output += "\n\n" + num_common_found; output += "\n\n" + numCommonFound;
output += num_common_found === 1 ? output += numCommonFound === 1 ?
" file type was detected that has a common byte sequence. This is likely to be a false positive." : " file type was detected that has a common byte sequence. This is likely to be a false positive." :
" file types were detected that have common byte sequences. These are likely to be false positives."; " file types were detected that have common byte sequences. These are likely to be false positives.";
output += " Run this operation with the 'Ignore common byte sequences' option unchecked to see details."; output += " Run this operation with the 'Ignore common byte sequences' option unchecked to see details.";
@ -94,13 +94,13 @@ var FileType = {
* extension and mime type. * extension and mime type.
* *
* @private * @private
* @param {byte_array} buf * @param {byteArray} buf
* @returns {Object} type * @returns {Object} type
* @returns {string} type.ext - File extension * @returns {string} type.ext - File extension
* @returns {string} type.mime - Mime type * @returns {string} type.mime - Mime type
* @returns {string} [type.desc] - Description * @returns {string} [type.desc] - Description
*/ */
_magic_type: function (buf) { _magicType: function (buf) {
if (!(buf && buf.length > 1)) { if (!(buf && buf.length > 1)) {
return null; return null;
} }

View File

@ -27,35 +27,35 @@ var HTML = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_to_entity: function(input, args) { runToEntity: function(input, args) {
var convert_all = args[0], var convertAll = args[0],
numeric = args[1] === "Numeric entities", numeric = args[1] === "Numeric entities",
hexa = args[1] === "Hex entities"; hexa = args[1] === "Hex entities";
var charcodes = Utils.str_to_charcode(input); var charcodes = Utils.strToCharcode(input);
var output = ""; var output = "";
for (var i = 0; i < charcodes.length; i++) { for (var i = 0; i < charcodes.length; i++) {
if (convert_all && numeric) { if (convertAll && numeric) {
output += "&#" + charcodes[i] + ";"; output += "&#" + charcodes[i] + ";";
} else if (convert_all && hexa) { } else if (convertAll && hexa) {
output += "&#x" + Utils.hex(charcodes[i]) + ";"; output += "&#x" + Utils.hex(charcodes[i]) + ";";
} else if (convert_all) { } else if (convertAll) {
output += HTML._byte_to_entity[charcodes[i]] || "&#" + charcodes[i] + ";"; output += HTML._byteToEntity[charcodes[i]] || "&#" + charcodes[i] + ";";
} else if (numeric) { } else if (numeric) {
if (charcodes[i] > 255 || HTML._byte_to_entity.hasOwnProperty(charcodes[i])) { if (charcodes[i] > 255 || HTML._byteToEntity.hasOwnProperty(charcodes[i])) {
output += "&#" + charcodes[i] + ";"; output += "&#" + charcodes[i] + ";";
} else { } else {
output += Utils.chr(charcodes[i]); output += Utils.chr(charcodes[i]);
} }
} else if (hexa) { } else if (hexa) {
if (charcodes[i] > 255 || HTML._byte_to_entity.hasOwnProperty(charcodes[i])) { if (charcodes[i] > 255 || HTML._byteToEntity.hasOwnProperty(charcodes[i])) {
output += "&#x" + Utils.hex(charcodes[i]) + ";"; output += "&#x" + Utils.hex(charcodes[i]) + ";";
} else { } else {
output += Utils.chr(charcodes[i]); output += Utils.chr(charcodes[i]);
} }
} else { } else {
output += HTML._byte_to_entity[charcodes[i]] || ( output += HTML._byteToEntity[charcodes[i]] || (
charcodes[i] > 255 ? charcodes[i] > 255 ?
"&#" + charcodes[i] + ";" : "&#" + charcodes[i] + ";" :
Utils.chr(charcodes[i]) Utils.chr(charcodes[i])
@ -73,7 +73,7 @@ var HTML = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_from_entity: function(input, args) { runFromEntity: function(input, args) {
var regex = /&(#?x?[a-zA-Z0-9]{1,8});/g, var regex = /&(#?x?[a-zA-Z0-9]{1,8});/g,
output = "", output = "",
m, m,
@ -85,7 +85,7 @@ var HTML = {
output += input[i++]; output += input[i++];
// Add match // Add match
var bite = HTML._entity_to_byte[m[1]]; var bite = HTML._entityToByte[m[1]];
if (bite) { if (bite) {
output += Utils.chr(bite); output += Utils.chr(bite);
} else if (!bite && m[1][0] === "#" && m[1].length > 1 && /^#\d{1,5}$/.test(m[1])) { } else if (!bite && m[1][0] === "#" && m[1].length > 1 && /^#\d{1,5}$/.test(m[1])) {
@ -130,17 +130,17 @@ var HTML = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_strip_tags: function(input, args) { runStripTags: function(input, args) {
var remove_indentation = args[0], var removeIndentation = args[0],
remove_line_breaks = args[1]; removeLineBreaks = args[1];
input = Utils.strip_html_tags(input); input = Utils.stripHtmlTags(input);
if (remove_indentation) { if (removeIndentation) {
input = input.replace(/\n[ \f\t]+/g, "\n"); input = input.replace(/\n[ \f\t]+/g, "\n");
} }
if (remove_line_breaks) { if (removeLineBreaks) {
input = input.replace(/^\s*\n/, "") // first line input = input.replace(/^\s*\n/, "") // first line
.replace(/(\n\s*){2,}/g, "\n"); // all others .replace(/(\n\s*){2,}/g, "\n"); // all others
} }
@ -156,7 +156,7 @@ var HTML = {
* @param {Object[]} args * @param {Object[]} args
* @returns {html} * @returns {html}
*/ */
run_parse_colour_code: function(input, args) { runParseColourCode: function(input, args) {
var m = null, var m = null,
r = 0, g = 0, b = 0, a = 1; r = 0, g = 0, b = 0, a = 1;
@ -177,7 +177,7 @@ var HTML = {
var h_ = parseFloat(m[1]) / 360, var h_ = parseFloat(m[1]) / 360,
s_ = parseFloat(m[2]) / 100, s_ = parseFloat(m[2]) / 100,
l_ = parseFloat(m[3]) / 100, l_ = parseFloat(m[3]) / 100,
rgb_ = HTML._hsl_to_rgb(h_, s_, l_); rgb_ = HTML._hslToRgb(h_, s_, l_);
r = rgb_[0]; r = rgb_[0];
g = rgb_[1]; g = rgb_[1];
@ -195,7 +195,7 @@ var HTML = {
b = Math.round(255 * (1 - y_) * (1 - k_)); b = Math.round(255 * (1 - y_) * (1 - k_));
} }
var hsl_ = HTML._rgb_to_hsl(r, g, b), var hsl_ = HTML._rgbToHsl(r, g, b),
h = Math.round(hsl_[0] * 360), h = Math.round(hsl_[0] * 360),
s = Math.round(hsl_[1] * 100), s = Math.round(hsl_[1] * 100),
l = Math.round(hsl_[2] * 100), l = Math.round(hsl_[2] * 100),
@ -210,9 +210,9 @@ var HTML = {
k = k.toFixed(2); k = k.toFixed(2);
var hex = "#" + var hex = "#" +
Utils.pad_left(Math.round(r).toString(16), 2) + Utils.padLeft(Math.round(r).toString(16), 2) +
Utils.pad_left(Math.round(g).toString(16), 2) + Utils.padLeft(Math.round(g).toString(16), 2) +
Utils.pad_left(Math.round(b).toString(16), 2), Utils.padLeft(Math.round(b).toString(16), 2),
rgb = "rgb(" + r + ", " + g + ", " + b + ")", rgb = "rgb(" + r + ", " + g + ", " + b + ")",
rgba = "rgba(" + r + ", " + g + ", " + b + ", " + a + ")", rgba = "rgba(" + r + ", " + g + ", " + b + ", " + a + ")",
hsl = "hsl(" + h + ", " + s + "%, " + l + "%)", hsl = "hsl(" + h + ", " + s + "%, " + l + "%)",
@ -237,7 +237,7 @@ var HTML = {
var color = e.color.toRGB();\ var color = e.color.toRGB();\
document.getElementById('input-text').value = 'rgba(' +\ document.getElementById('input-text').value = 'rgba(' +\
color.r + ', ' + color.g + ', ' + color.b + ', ' + color.a + ')';\ color.r + ', ' + color.g + ', ' + color.b + ', ' + color.a + ')';\
window.app.auto_bake();\ window.app.autoBake();\
});\ });\
</script>"; </script>";
}, },
@ -246,7 +246,7 @@ var HTML = {
/** /**
* Converts an HSL color value to RGB. Conversion formula * Converts an HSL color value to RGB. Conversion formula
* adapted from http://en.wikipedia.org/wiki/HSL_color_space. * adapted from http://en.wikipedia.org/wiki/HSL_colorSpace.
* Assumes h, s, and l are contained in the set [0, 1] and * Assumes h, s, and l are contained in the set [0, 1] and
* returns r, g, and b in the set [0, 255]. * returns r, g, and b in the set [0, 255].
* *
@ -258,7 +258,7 @@ var HTML = {
* @param {number} l - The lightness * @param {number} l - The lightness
* @return {Array} The RGB representation * @return {Array} The RGB representation
*/ */
_hsl_to_rgb: function(h, s, l){ _hslToRgb: function(h, s, l){
var r, g, b; var r, g, b;
if (s === 0){ if (s === 0){
@ -286,7 +286,7 @@ var HTML = {
/** /**
* Converts an RGB color value to HSL. Conversion formula * Converts an RGB color value to HSL. Conversion formula
* adapted from http://en.wikipedia.org/wiki/HSL_color_space. * adapted from http://en.wikipedia.org/wiki/HSL_colorSpace.
* Assumes r, g, and b are contained in the set [0, 255] and * Assumes r, g, and b are contained in the set [0, 255] and
* returns h, s, and l in the set [0, 1]. * returns h, s, and l in the set [0, 1].
* *
@ -298,7 +298,7 @@ var HTML = {
* @param {number} b - The blue color value * @param {number} b - The blue color value
* @return {Array} The HSL representation * @return {Array} The HSL representation
*/ */
_rgb_to_hsl: function(r, g, b) { _rgbToHsl: function(r, g, b) {
r /= 255; g /= 255; b /= 255; r /= 255; g /= 255; b /= 255;
var max = Math.max(r, g, b), var max = Math.max(r, g, b),
min = Math.min(r, g, b), min = Math.min(r, g, b),
@ -327,7 +327,7 @@ var HTML = {
* @private * @private
* @constant * @constant
*/ */
_byte_to_entity: { _byteToEntity: {
34 : "&quot;", 34 : "&quot;",
38 : "&amp;", 38 : "&amp;",
39 : "&apos;", 39 : "&apos;",
@ -591,7 +591,7 @@ var HTML = {
* @private * @private
* @constant * @constant
*/ */
_entity_to_byte : { _entityToByte : {
"quot" : 34, "quot" : 34,
"amp" : 38, "amp" : 38,
"apos" : 39, "apos" : 39,

View File

@ -18,11 +18,11 @@ var HTTP = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_strip_headers: function(input, args) { runStripHeaders: function(input, args) {
var header_end = input.indexOf("\r\n\r\n") + var headerEnd = input.indexOf("\r\n\r\n") +
(header_end < 0) ? input.indexOf("\n\n") + 2 : header_end + 4; (headerEnd < 0) ? input.indexOf("\n\n") + 2 : headerEnd + 4;
return (header_end < 2) ? input : input.slice(header_end, input.length); return (headerEnd < 2) ? input : input.slice(headerEnd, input.length);
}, },
@ -33,8 +33,8 @@ var HTTP = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_parse_user_agent: function(input, args) { runParseUserAgent: function(input, args) {
var ua = UAS_parser.parse(input); var ua = UAS_parser.parse(input); // eslint-disable-line camelcase
return "Type: " + ua.type + "\n" + return "Type: " + ua.type + "\n" +
"Family: " + ua.uaFamily + "\n" + "Family: " + ua.uaFamily + "\n" +

View File

@ -1,4 +1,4 @@
/* globals CryptoJS, Checksum */ /* globals CryptoApi, CryptoJS, Checksum */
/** /**
* Hashing operations. * Hashing operations.
@ -10,6 +10,30 @@
* @namespace * @namespace
*/ */
var Hash = { var Hash = {
/**
* MD2 operation.
*
* @param {string} input
* @param {Object[]} args
* @returns {string}
*/
runMD2: function (input, args) {
return Utils.toHexFast(CryptoApi.hash("md2", input, {}));
},
/**
* MD4 operation.
*
* @param {string} input
* @param {Object[]} args
* @returns {string}
*/
runMD4: function (input, args) {
return Utils.toHexFast(CryptoApi.hash("md4", input, {}));
},
/** /**
* MD5 operation. * MD5 operation.
@ -18,10 +42,22 @@ var Hash = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_md5: function (input, args) { runMD5: function (input, args) {
input = CryptoJS.enc.Latin1.parse(input); // Cast to WordArray input = CryptoJS.enc.Latin1.parse(input); // Cast to WordArray
return CryptoJS.MD5(input).toString(CryptoJS.enc.Hex); return CryptoJS.MD5(input).toString(CryptoJS.enc.Hex);
}, },
/**
* SHA0 operation.
*
* @param {string} input
* @param {Object[]} args
* @returns {string}
*/
runSHA0: function (input, args) {
return Utils.toHexFast(CryptoApi.hash("sha0", input, {}));
},
/** /**
@ -31,7 +67,7 @@ var Hash = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_sha1: function (input, args) { runSHA1: function (input, args) {
input = CryptoJS.enc.Latin1.parse(input); input = CryptoJS.enc.Latin1.parse(input);
return CryptoJS.SHA1(input).toString(CryptoJS.enc.Hex); return CryptoJS.SHA1(input).toString(CryptoJS.enc.Hex);
}, },
@ -44,7 +80,7 @@ var Hash = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_sha224: function (input, args) { runSHA224: function (input, args) {
input = CryptoJS.enc.Latin1.parse(input); input = CryptoJS.enc.Latin1.parse(input);
return CryptoJS.SHA224(input).toString(CryptoJS.enc.Hex); return CryptoJS.SHA224(input).toString(CryptoJS.enc.Hex);
}, },
@ -57,7 +93,7 @@ var Hash = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_sha256: function (input, args) { runSHA256: function (input, args) {
input = CryptoJS.enc.Latin1.parse(input); input = CryptoJS.enc.Latin1.parse(input);
return CryptoJS.SHA256(input).toString(CryptoJS.enc.Hex); return CryptoJS.SHA256(input).toString(CryptoJS.enc.Hex);
}, },
@ -70,7 +106,7 @@ var Hash = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_sha384: function (input, args) { runSHA384: function (input, args) {
input = CryptoJS.enc.Latin1.parse(input); input = CryptoJS.enc.Latin1.parse(input);
return CryptoJS.SHA384(input).toString(CryptoJS.enc.Hex); return CryptoJS.SHA384(input).toString(CryptoJS.enc.Hex);
}, },
@ -83,7 +119,7 @@ var Hash = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_sha512: function (input, args) { runSHA512: function (input, args) {
input = CryptoJS.enc.Latin1.parse(input); input = CryptoJS.enc.Latin1.parse(input);
return CryptoJS.SHA512(input).toString(CryptoJS.enc.Hex); return CryptoJS.SHA512(input).toString(CryptoJS.enc.Hex);
}, },
@ -102,11 +138,11 @@ var Hash = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_sha3: function (input, args) { runSHA3: function (input, args) {
input = CryptoJS.enc.Latin1.parse(input); input = CryptoJS.enc.Latin1.parse(input);
var sha3_length = args[0], var sha3Length = args[0],
options = { options = {
outputLength: parseInt(sha3_length, 10) outputLength: parseInt(sha3Length, 10)
}; };
return CryptoJS.SHA3(input, options).toString(CryptoJS.enc.Hex); return CryptoJS.SHA3(input, options).toString(CryptoJS.enc.Hex);
}, },
@ -119,7 +155,7 @@ var Hash = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_ripemd160: function (input, args) { runRIPEMD160: function (input, args) {
input = CryptoJS.enc.Latin1.parse(input); input = CryptoJS.enc.Latin1.parse(input);
return CryptoJS.RIPEMD160(input).toString(CryptoJS.enc.Hex); return CryptoJS.RIPEMD160(input).toString(CryptoJS.enc.Hex);
}, },
@ -138,8 +174,8 @@ var Hash = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_hmac: function (input, args) { runHMAC: function (input, args) {
var hash_func = args[1]; var hashFunc = args[1];
input = CryptoJS.enc.Latin1.parse(input); input = CryptoJS.enc.Latin1.parse(input);
var execute = { var execute = {
"MD5": CryptoJS.HmacMD5(input, args[0]), "MD5": CryptoJS.HmacMD5(input, args[0]),
@ -151,7 +187,7 @@ var Hash = {
"SHA3": CryptoJS.HmacSHA3(input, args[0]), "SHA3": CryptoJS.HmacSHA3(input, args[0]),
"RIPEMD-160": CryptoJS.HmacRIPEMD160(input, args[0]), "RIPEMD-160": CryptoJS.HmacRIPEMD160(input, args[0]),
}; };
return execute[hash_func].toString(CryptoJS.enc.Hex); return execute[hashFunc].toString(CryptoJS.enc.Hex);
}, },
@ -162,23 +198,29 @@ var Hash = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_all: function (input, args) { runAll: function (input, args) {
var byte_array = Utils.str_to_byte_array(input), var byteArray = Utils.strToByteArray(input),
output = "MD5: " + Hash.run_md5(input, []) + output = "MD2: " + Hash.runMD2(input, []) +
"\nSHA1: " + Hash.run_sha1(input, []) + "\nMD4: " + Hash.runMD4(input, []) +
"\nSHA2 224: " + Hash.run_sha224(input, []) + "\nMD5: " + Hash.runMD5(input, []) +
"\nSHA2 256: " + Hash.run_sha256(input, []) + "\nSHA0: " + Hash.runSHA0(input, []) +
"\nSHA2 384: " + Hash.run_sha384(input, []) + "\nSHA1: " + Hash.runSHA1(input, []) +
"\nSHA2 512: " + Hash.run_sha512(input, []) + "\nSHA2 224: " + Hash.runSHA224(input, []) +
"\nSHA3 224: " + Hash.run_sha3(input, ["224"]) + "\nSHA2 256: " + Hash.runSHA256(input, []) +
"\nSHA3 256: " + Hash.run_sha3(input, ["256"]) + "\nSHA2 384: " + Hash.runSHA384(input, []) +
"\nSHA3 384: " + Hash.run_sha3(input, ["384"]) + "\nSHA2 512: " + Hash.runSHA512(input, []) +
"\nSHA3 512: " + Hash.run_sha3(input, ["512"]) + "\nSHA3 224: " + Hash.runSHA3(input, ["224"]) +
"\nRIPEMD-160: " + Hash.run_ripemd160(input, []) + "\nSHA3 256: " + Hash.runSHA3(input, ["256"]) +
"\nSHA3 384: " + Hash.runSHA3(input, ["384"]) +
"\nSHA3 512: " + Hash.runSHA3(input, ["512"]) +
"\nRIPEMD-160: " + Hash.runRIPEMD160(input, []) +
"\n\nChecksums:" + "\n\nChecksums:" +
"\nFletcher-16: " + Checksum.run_fletcher16(byte_array, []) + "\nFletcher-8: " + Checksum.runFletcher8(byteArray, []) +
"\nAdler-32: " + Checksum.run_adler32(byte_array, []) + "\nFletcher-16: " + Checksum.runFletcher16(byteArray, []) +
"\nCRC-32: " + Checksum.run_crc32(byte_array, []); "\nFletcher-32: " + Checksum.runFletcher32(byteArray, []) +
"\nFletcher-64: " + Checksum.runFletcher64(byteArray, []) +
"\nAdler-32: " + Checksum.runAdler32(byteArray, []) +
"\nCRC-32: " + Checksum.runCRC32(byteArray, []);
return output; return output;
}, },
@ -191,38 +233,38 @@ var Hash = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_analyse: function(input, args) { runAnalyse: function(input, args) {
input = input.replace(/\s/g, ""); input = input.replace(/\s/g, "");
var output = "", var output = "",
byte_length = input.length / 2, byteLength = input.length / 2,
bit_length = byte_length * 8, bitLength = byteLength * 8,
possible_hash_functions = []; possibleHashFunctions = [];
if (!/^[a-f0-9]+$/i.test(input)) { if (!/^[a-f0-9]+$/i.test(input)) {
return "Invalid hash"; return "Invalid hash";
} }
output += "Hash length: " + input.length + "\n" + output += "Hash length: " + input.length + "\n" +
"Byte length: " + byte_length + "\n" + "Byte length: " + byteLength + "\n" +
"Bit length: " + bit_length + "\n\n" + "Bit length: " + bitLength + "\n\n" +
"Based on the length, this hash could have been generated by one of the following hashing functions:\n"; "Based on the length, this hash could have been generated by one of the following hashing functions:\n";
switch (bit_length) { switch (bitLength) {
case 4: case 4:
possible_hash_functions = [ possibleHashFunctions = [
"Fletcher-4", "Fletcher-4",
"Luhn algorithm", "Luhn algorithm",
"Verhoeff algorithm", "Verhoeff algorithm",
]; ];
break; break;
case 8: case 8:
possible_hash_functions = [ possibleHashFunctions = [
"Fletcher-8", "Fletcher-8",
]; ];
break; break;
case 16: case 16:
possible_hash_functions = [ possibleHashFunctions = [
"BSD checksum", "BSD checksum",
"CRC-16", "CRC-16",
"SYSV checksum", "SYSV checksum",
@ -230,21 +272,21 @@ var Hash = {
]; ];
break; break;
case 32: case 32:
possible_hash_functions = [ possibleHashFunctions = [
"CRC-32", "CRC-32",
"Fletcher-32", "Fletcher-32",
"Adler-32", "Adler-32",
]; ];
break; break;
case 64: case 64:
possible_hash_functions = [ possibleHashFunctions = [
"CRC-64", "CRC-64",
"RIPEMD-64", "RIPEMD-64",
"SipHash", "SipHash",
]; ];
break; break;
case 128: case 128:
possible_hash_functions = [ possibleHashFunctions = [
"MD5", "MD5",
"MD4", "MD4",
"MD2", "MD2",
@ -255,7 +297,7 @@ var Hash = {
]; ];
break; break;
case 160: case 160:
possible_hash_functions = [ possibleHashFunctions = [
"SHA-1", "SHA-1",
"SHA-0", "SHA-0",
"FSB-160", "FSB-160",
@ -266,13 +308,13 @@ var Hash = {
]; ];
break; break;
case 192: case 192:
possible_hash_functions = [ possibleHashFunctions = [
"Tiger", "Tiger",
"HAVAL-192", "HAVAL-192",
]; ];
break; break;
case 224: case 224:
possible_hash_functions = [ possibleHashFunctions = [
"SHA-224", "SHA-224",
"SHA3-224", "SHA3-224",
"ECOH-224", "ECOH-224",
@ -281,7 +323,7 @@ var Hash = {
]; ];
break; break;
case 256: case 256:
possible_hash_functions = [ possibleHashFunctions = [
"SHA-256", "SHA-256",
"SHA3-256", "SHA3-256",
"BLAKE-256", "BLAKE-256",
@ -296,12 +338,12 @@ var Hash = {
]; ];
break; break;
case 320: case 320:
possible_hash_functions = [ possibleHashFunctions = [
"RIPEMD-320", "RIPEMD-320",
]; ];
break; break;
case 384: case 384:
possible_hash_functions = [ possibleHashFunctions = [
"SHA-384", "SHA-384",
"SHA3-384", "SHA3-384",
"ECOH-384", "ECOH-384",
@ -309,7 +351,7 @@ var Hash = {
]; ];
break; break;
case 512: case 512:
possible_hash_functions = [ possibleHashFunctions = [
"SHA-512", "SHA-512",
"SHA3-512", "SHA3-512",
"BLAKE-512", "BLAKE-512",
@ -324,18 +366,18 @@ var Hash = {
]; ];
break; break;
case 1024: case 1024:
possible_hash_functions = [ possibleHashFunctions = [
"Fowler-Noll-Vo", "Fowler-Noll-Vo",
]; ];
break; break;
default: default:
possible_hash_functions = [ possibleHashFunctions = [
"Unknown" "Unknown"
]; ];
break; break;
} }
return output + possible_hash_functions.join("\n"); return output + possibleHashFunctions.join("\n");
}, },
}; };

View File

@ -30,14 +30,14 @@ var Hexdump = {
/** /**
* To Hexdump operation. * To Hexdump operation.
* *
* @param {byte_array} input * @param {byteArray} input
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_to: function(input, args) { runTo: function(input, args) {
var length = args[0] || Hexdump.WIDTH; var length = args[0] || Hexdump.WIDTH;
var upper_case = args[1]; var upperCase = args[1];
var include_final_length = args[2]; var includeFinalLength = args[2];
var output = "", padding = 2; var output = "", padding = 2;
for (var i = 0; i < input.length; i += length) { for (var i = 0; i < input.length; i += length) {
@ -47,18 +47,18 @@ var Hexdump = {
hexa += Utils.hex(buff[j], padding) + " "; hexa += Utils.hex(buff[j], padding) + " ";
} }
var line_no = Utils.hex(i, 8); var lineNo = Utils.hex(i, 8);
if (upper_case) { if (upperCase) {
hexa = hexa.toUpperCase(); hexa = hexa.toUpperCase();
line_no = line_no.toUpperCase(); lineNo = lineNo.toUpperCase();
} }
output += line_no + " " + output += lineNo + " " +
Utils.pad_right(hexa, (length*(padding+1))) + Utils.padRight(hexa, (length*(padding+1))) +
" |" + Utils.pad_right(Utils.printable(Utils.byte_array_to_chars(buff)), buff.length) + "|\n"; " |" + Utils.padRight(Utils.printable(Utils.byteArrayToChars(buff)), buff.length) + "|\n";
if (include_final_length && i+buff.length === input.length) { if (includeFinalLength && i+buff.length === input.length) {
output += Utils.hex(i+buff.length, 8) + "\n"; output += Utils.hex(i+buff.length, 8) + "\n";
} }
} }
@ -72,15 +72,15 @@ var Hexdump = {
* *
* @param {string} input * @param {string} input
* @param {Object[]} args * @param {Object[]} args
* @returns {byte_array} * @returns {byteArray}
*/ */
run_from: function(input, args) { runFrom: function(input, args) {
var output = [], var output = [],
regex = /^\s*(?:[\dA-F]{4,16}:?)?\s*((?:[\dA-F]{2}\s){1,8}(?:\s|[\dA-F]{2}-)(?:[\dA-F]{2}\s){1,8}|(?:[\dA-F]{2}\s|[\dA-F]{4}\s)+)/igm, regex = /^\s*(?:[\dA-F]{4,16}:?)?\s*((?:[\dA-F]{2}\s){1,8}(?:\s|[\dA-F]{2}-)(?:[\dA-F]{2}\s){1,8}|(?:[\dA-F]{2}\s|[\dA-F]{4}\s)+)/igm,
block, line; block, line;
while ((block = regex.exec(input))) { while ((block = regex.exec(input))) {
line = Utils.from_hex(block[1].replace(/-/g, " ")); line = Utils.fromHex(block[1].replace(/-/g, " "));
for (var i = 0; i < line.length; i++) { for (var i = 0; i < line.length; i++) {
output.push(line[i]); output.push(line[i]);
} }
@ -90,7 +90,7 @@ var Hexdump = {
var w = (width - 13) / 4; var w = (width - 13) / 4;
// w should be the specified width of the hexdump and therefore a round number // w should be the specified width of the hexdump and therefore a round number
if (Math.floor(w) !== w || input.indexOf("\r") !== -1 || output.indexOf(13) !== -1) { if (Math.floor(w) !== w || input.indexOf("\r") !== -1 || output.indexOf(13) !== -1) {
app.options.attempt_highlight = false; app.options.attemptHighlight = false;
} }
return output; return output;
}, },
@ -105,7 +105,7 @@ var Hexdump = {
* @param {Object[]} args * @param {Object[]} args
* @returns {Object[]} pos * @returns {Object[]} pos
*/ */
highlight_to: function(pos, args) { highlightTo: function(pos, args) {
// Calculate overall selection // Calculate overall selection
var w = args[0] || 16, var w = args[0] || 16,
width = 14 + (w*4), width = 14 + (w*4),
@ -125,32 +125,32 @@ var Hexdump = {
pos[0].end = line*width + 10 + offset*3 - 1; pos[0].end = line*width + 10 + offset*3 - 1;
// Set up multiple selections for bytes // Set up multiple selections for bytes
var start_line_num = Math.floor(pos[0].start / width); var startLineNum = Math.floor(pos[0].start / width);
var end_line_num = Math.floor(pos[0].end / width); var endLineNum = Math.floor(pos[0].end / width);
if (start_line_num === end_line_num) { if (startLineNum === endLineNum) {
pos.push(pos[0]); pos.push(pos[0]);
} else { } else {
start = pos[0].start; start = pos[0].start;
end = (start_line_num+1) * width - w - 5; end = (startLineNum+1) * width - w - 5;
pos.push({ start: start, end: end }); pos.push({ start: start, end: end });
while (end < pos[0].end) { while (end < pos[0].end) {
start_line_num++; startLineNum++;
start = start_line_num * width + 10; start = startLineNum * width + 10;
end = (start_line_num+1) * width - w - 5; end = (startLineNum+1) * width - w - 5;
if (end > pos[0].end) end = pos[0].end; if (end > pos[0].end) end = pos[0].end;
pos.push({ start: start, end: end }); pos.push({ start: start, end: end });
} }
} }
// Set up multiple selections for ASCII // Set up multiple selections for ASCII
var len = pos.length, line_num = 0; var len = pos.length, lineNum = 0;
start = 0; start = 0;
end = 0; end = 0;
for (var i = 1; i < len; i++) { for (var i = 1; i < len; i++) {
line_num = Math.floor(pos[i].start / width); lineNum = Math.floor(pos[i].start / width);
start = (((pos[i].start - (line_num * width)) - 10) / 3) + (width - w -2) + (line_num * width); start = (((pos[i].start - (lineNum * width)) - 10) / 3) + (width - w -2) + (lineNum * width);
end = (((pos[i].end + 1 - (line_num * width)) - 10) / 3) + (width - w -2) + (line_num * width); end = (((pos[i].end + 1 - (lineNum * width)) - 10) / 3) + (width - w -2) + (lineNum * width);
pos.push({ start: start, end: end }); pos.push({ start: start, end: end });
} }
return pos; return pos;
@ -166,7 +166,7 @@ var Hexdump = {
* @param {Object[]} args * @param {Object[]} args
* @returns {Object[]} pos * @returns {Object[]} pos
*/ */
highlight_from: function(pos, args) { highlightFrom: function(pos, args) {
var w = args[0] || 16; var w = args[0] || 16;
var width = 14 + (w*4); var width = 14 + (w*4);

View File

@ -34,26 +34,26 @@ var IP = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_parse_ip_range: function (input, args) { runParseIpRange: function (input, args) {
var include_network_info = args[0], var includeNetworkInfo = args[0],
enumerate_addresses = args[1], enumerateAddresses = args[1],
allow_large_list = args[2]; allowLargeList = args[2];
// Check what type of input we are looking at // Check what type of input we are looking at
var ipv4_cidr_regex = /^\s*((?:\d{1,3}\.){3}\d{1,3})\/(\d\d?)\s*$/, var ipv4CidrRegex = /^\s*((?:\d{1,3}\.){3}\d{1,3})\/(\d\d?)\s*$/,
ipv4_range_regex = /^\s*((?:\d{1,3}\.){3}\d{1,3})\s*-\s*((?:\d{1,3}\.){3}\d{1,3})\s*$/, ipv4RangeRegex = /^\s*((?:\d{1,3}\.){3}\d{1,3})\s*-\s*((?:\d{1,3}\.){3}\d{1,3})\s*$/,
ipv6_cidr_regex = /^\s*(((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\4)::|:\b|(?![\dA-F])))|(?!\3\4)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4}))\/(\d\d?\d?)\s*$/i, ipv6CidrRegex = /^\s*(((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\4)::|:\b|(?![\dA-F])))|(?!\3\4)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4}))\/(\d\d?\d?)\s*$/i,
ipv6_range_regex = /^\s*(((?=.*::)(?!.*::[^-]+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\4)::|:\b|(?![\dA-F])))|(?!\3\4)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4}))\s*-\s*(((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\17)::|:\b|(?![\dA-F])))|(?!\16\17)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4}))\s*$/i, ipv6RangeRegex = /^\s*(((?=.*::)(?!.*::[^-]+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\4)::|:\b|(?![\dA-F])))|(?!\3\4)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4}))\s*-\s*(((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\17)::|:\b|(?![\dA-F])))|(?!\16\17)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4}))\s*$/i,
match; match;
if ((match = ipv4_cidr_regex.exec(input))) { if ((match = ipv4CidrRegex.exec(input))) {
return IP._ipv4_cidr_range(match, include_network_info, enumerate_addresses, allow_large_list); return IP._ipv4CidrRange(match, includeNetworkInfo, enumerateAddresses, allowLargeList);
} else if ((match = ipv4_range_regex.exec(input))) { } else if ((match = ipv4RangeRegex.exec(input))) {
return IP._ipv4_hyphenated_range(match, include_network_info, enumerate_addresses, allow_large_list); return IP._ipv4HyphenatedRange(match, includeNetworkInfo, enumerateAddresses, allowLargeList);
} else if ((match = ipv6_cidr_regex.exec(input))) { } else if ((match = ipv6CidrRegex.exec(input))) {
return IP._ipv6_cidr_range(match, include_network_info); return IP._ipv6CidrRange(match, includeNetworkInfo);
} else if ((match = ipv6_range_regex.exec(input))) { } else if ((match = ipv6RangeRegex.exec(input))) {
return IP._ipv6_hyphenated_range(match, include_network_info); return IP._ipv6HyphenatedRange(match, includeNetworkInfo);
} else { } else {
return "Invalid input.\n\nEnter either a CIDR range (e.g. 10.0.0.0/24) or a hyphenated range (e.g. 10.0.0.0 - 10.0.1.0). IPv6 also supported."; return "Invalid input.\n\nEnter either a CIDR range (e.g. 10.0.0.0/24) or a hyphenated range (e.g. 10.0.0.0 - 10.0.1.0). IPv6 also supported.";
} }
@ -64,12 +64,12 @@ var IP = {
* @constant * @constant
* @default * @default
*/ */
IPv4_REGEX: /^\s*((?:\d{1,3}\.){3}\d{1,3})\s*$/, IPV4_REGEX: /^\s*((?:\d{1,3}\.){3}\d{1,3})\s*$/,
/** /**
* @constant * @constant
* @default * @default
*/ */
IPv6_REGEX: /^\s*(((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\4)::|:\b|(?![\dA-F])))|(?!\3\4)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4}))\s*$/i, IPV6_REGEX: /^\s*(((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\4)::|:\b|(?![\dA-F])))|(?!\3\4)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4}))\s*$/i,
/** /**
* Parse IPv6 address operation. * Parse IPv6 address operation.
@ -78,14 +78,14 @@ var IP = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_parse_ipv6: function (input, args) { runParseIpv6: function (input, args) {
var match, var match,
output = ""; output = "";
if ((match = IP.IPv6_REGEX.exec(input))) { if ((match = IP.IPV6_REGEX.exec(input))) {
var ipv6 = IP._str_to_ipv6(match[1]), var ipv6 = IP._strToIpv6(match[1]),
longhand = IP._ipv6_to_str(ipv6), longhand = IP._ipv6ToStr(ipv6),
shorthand = IP._ipv6_to_str(ipv6, true); shorthand = IP._ipv6ToStr(ipv6, true);
output += "Longhand: " + longhand + "\nShorthand: " + shorthand + "\n"; output += "Longhand: " + longhand + "\nShorthand: " + shorthand + "\n";
@ -102,13 +102,13 @@ var IP = {
ipv6[3] === 0 && ipv6[4] === 0 && ipv6[5] === 0xffff) { ipv6[3] === 0 && ipv6[4] === 0 && ipv6[5] === 0xffff) {
// IPv4-mapped IPv6 address // IPv4-mapped IPv6 address
output += "\nIPv4-mapped IPv6 address detected. IPv6 clients will be handled natively by default, and IPv4 clients appear as IPv6 clients at their IPv4-mapped IPv6 address."; output += "\nIPv4-mapped IPv6 address detected. IPv6 clients will be handled natively by default, and IPv4 clients appear as IPv6 clients at their IPv4-mapped IPv6 address.";
output += "\nMapped IPv4 address: " + IP._ipv4_to_str((ipv6[6] << 16) + ipv6[7]); output += "\nMapped IPv4 address: " + IP._ipv4ToStr((ipv6[6] << 16) + ipv6[7]);
output += "\nIPv4-mapped IPv6 addresses range: ::ffff:0:0/96"; output += "\nIPv4-mapped IPv6 addresses range: ::ffff:0:0/96";
} else if (ipv6[0] === 0 && ipv6[1] === 0 && ipv6[2] === 0 && } else if (ipv6[0] === 0 && ipv6[1] === 0 && ipv6[2] === 0 &&
ipv6[3] === 0 && ipv6[4] === 0xffff && ipv6[5] === 0) { ipv6[3] === 0 && ipv6[4] === 0xffff && ipv6[5] === 0) {
// IPv4-translated address // IPv4-translated address
output += "\nIPv4-translated address detected. Used by Stateless IP/ICMP Translation (SIIT). See RFCs 6145 and 6052 for more details."; output += "\nIPv4-translated address detected. Used by Stateless IP/ICMP Translation (SIIT). See RFCs 6145 and 6052 for more details.";
output += "\nTranslated IPv4 address: " + IP._ipv4_to_str((ipv6[6] << 16) + ipv6[7]); output += "\nTranslated IPv4 address: " + IP._ipv4ToStr((ipv6[6] << 16) + ipv6[7]);
output += "\nIPv4-translated addresses range: ::ffff:0:0:0/96"; output += "\nIPv4-translated addresses range: ::ffff:0:0:0/96";
} else if (ipv6[0] === 0x100) { } else if (ipv6[0] === 0x100) {
// Discard prefix per RFC 6666 // Discard prefix per RFC 6666
@ -118,50 +118,50 @@ var IP = {
ipv6[3] === 0 && ipv6[4] === 0 && ipv6[5] === 0) { ipv6[3] === 0 && ipv6[4] === 0 && ipv6[5] === 0) {
// IPv4/IPv6 translation per RFC 6052 // IPv4/IPv6 translation per RFC 6052
output += "\n'Well-Known' prefix for IPv4/IPv6 translation detected. See RFC 6052 for more details."; output += "\n'Well-Known' prefix for IPv4/IPv6 translation detected. See RFC 6052 for more details.";
output += "\nTranslated IPv4 address: " + IP._ipv4_to_str((ipv6[6] << 16) + ipv6[7]); output += "\nTranslated IPv4 address: " + IP._ipv4ToStr((ipv6[6] << 16) + ipv6[7]);
output += "\n'Well-Known prefix range: 64:ff9b::/96"; output += "\n'Well-Known prefix range: 64:ff9b::/96";
} else if (ipv6[0] === 0x2001 && ipv6[1] === 0) { } else if (ipv6[0] === 0x2001 && ipv6[1] === 0) {
// Teredo tunneling // Teredo tunneling
output += "\nTeredo tunneling IPv6 address detected\n"; output += "\nTeredo tunneling IPv6 address detected\n";
var server_ipv4 = (ipv6[2] << 16) + ipv6[3], var serverIpv4 = (ipv6[2] << 16) + ipv6[3],
udp_port = (~ipv6[5]) & 0xffff, udpPort = (~ipv6[5]) & 0xffff,
client_ipv4 = ~((ipv6[6] << 16) + ipv6[7]), clientIpv4 = ~((ipv6[6] << 16) + ipv6[7]),
flag_cone = (ipv6[4] >>> 15) & 1, flagCone = (ipv6[4] >>> 15) & 1,
flag_r = (ipv6[4] >>> 14) & 1, flagR = (ipv6[4] >>> 14) & 1,
flag_random1 = (ipv6[4] >>> 10) & 15, flagRandom1 = (ipv6[4] >>> 10) & 15,
flag_ug = (ipv6[4] >>> 8) & 3, flagUg = (ipv6[4] >>> 8) & 3,
flag_random2 = ipv6[4] & 255; flagRandom2 = ipv6[4] & 255;
output += "\nServer IPv4 address: " + IP._ipv4_to_str(server_ipv4) + output += "\nServer IPv4 address: " + IP._ipv4ToStr(serverIpv4) +
"\nClient IPv4 address: " + IP._ipv4_to_str(client_ipv4) + "\nClient IPv4 address: " + IP._ipv4ToStr(clientIpv4) +
"\nClient UDP port: " + udp_port + "\nClient UDP port: " + udpPort +
"\nFlags:" + "\nFlags:" +
"\n\tCone: " + flag_cone; "\n\tCone: " + flagCone;
if (flag_cone) { if (flagCone) {
output += " (Client is behind a cone NAT)"; output += " (Client is behind a cone NAT)";
} else { } else {
output += " (Client is not behind a cone NAT)"; output += " (Client is not behind a cone NAT)";
} }
output += "\n\tR: " + flag_r; output += "\n\tR: " + flagR;
if (flag_r) { if (flagR) {
output += " Error: This flag should be set to 0. See RFC 5991 and RFC 4380."; output += " Error: This flag should be set to 0. See RFC 5991 and RFC 4380.";
} }
output += "\n\tRandom1: " + Utils.bin(flag_random1, 4) + output += "\n\tRandom1: " + Utils.bin(flagRandom1, 4) +
"\n\tUG: " + Utils.bin(flag_ug, 2); "\n\tUG: " + Utils.bin(flagUg, 2);
if (flag_ug) { if (flagUg) {
output += " Error: This flag should be set to 00. See RFC 4380."; output += " Error: This flag should be set to 00. See RFC 4380.";
} }
output += "\n\tRandom2: " + Utils.bin(flag_random2, 8); output += "\n\tRandom2: " + Utils.bin(flagRandom2, 8);
if (!flag_r && !flag_ug && flag_random1 && flag_random2) { if (!flagR && !flagUg && flagRandom1 && flagRandom2) {
output += "\n\nThis is a valid Teredo address which complies with RFC 4380 and RFC 5991."; output += "\n\nThis is a valid Teredo address which complies with RFC 4380 and RFC 5991.";
} else if (!flag_r && !flag_ug) { } else if (!flagR && !flagUg) {
output += "\n\nThis is a valid Teredo address which complies with RFC 4380, however it does not comply with RFC 5991 (Teredo Security Updates) as there are no randomised bits in the flag field."; output += "\n\nThis is a valid Teredo address which complies with RFC 4380, however it does not comply with RFC 5991 (Teredo Security Updates) as there are no randomised bits in the flag field.";
} else { } else {
output += "\n\nThis is an invalid Teredo address."; output += "\n\nThis is an invalid Teredo address.";
@ -187,15 +187,15 @@ var IP = {
output += "\n6to4 transition IPv6 address detected. See RFC 3056 for more details." + output += "\n6to4 transition IPv6 address detected. See RFC 3056 for more details." +
"\n6to4 prefix range: 2002::/16"; "\n6to4 prefix range: 2002::/16";
var v4_addr = IP._ipv4_to_str((ipv6[1] << 16) + ipv6[2]), var v4Addr = IP._ipv4ToStr((ipv6[1] << 16) + ipv6[2]),
sla_id = ipv6[3], slaId = ipv6[3],
interface_id_str = ipv6[4].toString(16) + ipv6[5].toString(16) + ipv6[6].toString(16) + ipv6[7].toString(16), interfaceIdStr = ipv6[4].toString(16) + ipv6[5].toString(16) + ipv6[6].toString(16) + ipv6[7].toString(16),
interface_id = new BigInteger(interface_id_str, 16); interfaceId = new BigInteger(interfaceIdStr, 16);
output += "\n\nEncapsulated IPv4 address: " + v4_addr + output += "\n\nEncapsulated IPv4 address: " + v4Addr +
"\nSLA ID: " + sla_id + "\nSLA ID: " + slaId +
"\nInterface ID (base 16): " + interface_id_str + "\nInterface ID (base 16): " + interfaceIdStr +
"\nInterface ID (base 10): " + interface_id.toString(); "\nInterface ID (base 10): " + interfaceId.toString();
} else if (ipv6[0] >= 0xfc00 && ipv6[0] <= 0xfdff) { } else if (ipv6[0] >= 0xfc00 && ipv6[0] <= 0xfdff) {
// Unique local address // Unique local address
output += "\nThis is a unique local address comparable to the IPv4 private addresses 10.0.0.0/8, 172.16.0.0/12 and 192.168.0.0/16. See RFC 4193 for more details."; output += "\nThis is a unique local address comparable to the IPv4 private addresses 10.0.0.0/8, 172.16.0.0/12 and 192.168.0.0/16. See RFC 4193 for more details.";
@ -229,9 +229,9 @@ var IP = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_change_ip_format: function(input, args) { runChangeIpFormat: function(input, args) {
var in_format = args[0], var inFormat = args[0],
out_format = args[1], outFormat = args[1],
lines = input.split("\n"), lines = input.split("\n"),
output = "", output = "",
j = 0; j = 0;
@ -239,54 +239,54 @@ var IP = {
for (var i = 0; i < lines.length; i++) { for (var i = 0; i < lines.length; i++) {
if (lines[i] === "") continue; if (lines[i] === "") continue;
var ba_ip = []; var baIp = [];
if (in_format === out_format) { if (inFormat === outFormat) {
output += lines[i] + "\n"; output += lines[i] + "\n";
continue; continue;
} }
// Convert to byte array IP from input format // Convert to byte array IP from input format
switch (in_format) { switch (inFormat) {
case "Dotted Decimal": case "Dotted Decimal":
var octets = lines[i].split("."); var octets = lines[i].split(".");
for (j = 0; j < octets.length; j++) { for (j = 0; j < octets.length; j++) {
ba_ip.push(parseInt(octets[j], 10)); baIp.push(parseInt(octets[j], 10));
} }
break; break;
case "Decimal": case "Decimal":
var decimal = lines[i].toString(); var decimal = lines[i].toString();
ba_ip.push(decimal >> 24 & 255); baIp.push(decimal >> 24 & 255);
ba_ip.push(decimal >> 16 & 255); baIp.push(decimal >> 16 & 255);
ba_ip.push(decimal >> 8 & 255); baIp.push(decimal >> 8 & 255);
ba_ip.push(decimal & 255); baIp.push(decimal & 255);
break; break;
case "Hex": case "Hex":
ba_ip = Utils.hex_to_byte_array(lines[i]); baIp = Utils.hexToByteArray(lines[i]);
break; break;
default: default:
throw "Unsupported input IP format"; throw "Unsupported input IP format";
} }
// Convert byte array IP to output format // Convert byte array IP to output format
switch (out_format) { switch (outFormat) {
case "Dotted Decimal": case "Dotted Decimal":
var dd_ip = ""; var ddIp = "";
for (j = 0; j < ba_ip.length; j++) { for (j = 0; j < baIp.length; j++) {
dd_ip += ba_ip[j] + "."; ddIp += baIp[j] + ".";
} }
output += dd_ip.slice(0, dd_ip.length-1) + "\n"; output += ddIp.slice(0, ddIp.length-1) + "\n";
break; break;
case "Decimal": case "Decimal":
var dec_ip = ((ba_ip[0] << 24) | (ba_ip[1] << 16) | (ba_ip[2] << 8) | ba_ip[3]) >>> 0; var decIp = ((baIp[0] << 24) | (baIp[1] << 16) | (baIp[2] << 8) | baIp[3]) >>> 0;
output += dec_ip.toString() + "\n"; output += decIp.toString() + "\n";
break; break;
case "Hex": case "Hex":
var hex_ip = ""; var hexIp = "";
for (j = 0; j < ba_ip.length; j++) { for (j = 0; j < baIp.length; j++) {
hex_ip += Utils.hex(ba_ip[j]); hexIp += Utils.hex(baIp[j]);
} }
output += hex_ip + "\n"; output += hexIp + "\n";
break; break;
default: default:
throw "Unsupported output IP format"; throw "Unsupported output IP format";
@ -320,20 +320,20 @@ var IP = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_group_ips: function(input, args) { runGroupIps: function(input, args) {
var delim = Utils.char_rep[args[0]], var delim = Utils.charRep[args[0]],
cidr = args[1], cidr = args[1],
only_subnets = args[2], onlySubnets = args[2],
ipv4_mask = cidr < 32 ? ~(0xFFFFFFFF >>> cidr) : 0xFFFFFFFF, ipv4Mask = cidr < 32 ? ~(0xFFFFFFFF >>> cidr) : 0xFFFFFFFF,
ipv6_mask = IP._gen_ipv6_mask(cidr), ipv6Mask = IP._genIpv6Mask(cidr),
ips = input.split(delim), ips = input.split(delim),
ipv4_networks = {}, ipv4Networks = {},
ipv6_networks = {}, ipv6Networks = {},
match = null, match = null,
output = "", output = "",
ip = null, ip = null,
network = null, network = null,
network_str = ""; networkStr = "";
if (cidr < 0 || cidr > 127) { if (cidr < 0 || cidr > 127) {
return "CIDR must be less than 32 for IPv4 or 128 for IPv6"; return "CIDR must be less than 32 for IPv4 or 128 for IPv6";
@ -341,57 +341,57 @@ var IP = {
// Parse all IPs and add to network dictionary // Parse all IPs and add to network dictionary
for (var i = 0; i < ips.length; i++) { for (var i = 0; i < ips.length; i++) {
if ((match = IP.IPv4_REGEX.exec(ips[i]))) { if ((match = IP.IPV4_REGEX.exec(ips[i]))) {
ip = IP._str_to_ipv4(match[1]) >>> 0; ip = IP._strToIpv4(match[1]) >>> 0;
network = ip & ipv4_mask; network = ip & ipv4Mask;
if (ipv4_networks.hasOwnProperty(network)) { if (ipv4Networks.hasOwnProperty(network)) {
ipv4_networks[network].push(ip); ipv4Networks[network].push(ip);
} else { } else {
ipv4_networks[network] = [ip]; ipv4Networks[network] = [ip];
} }
} else if ((match = IP.IPv6_REGEX.exec(ips[i]))) { } else if ((match = IP.IPV6_REGEX.exec(ips[i]))) {
ip = IP._str_to_ipv6(match[1]); ip = IP._strToIpv6(match[1]);
network = []; network = [];
network_str = ""; networkStr = "";
for (var j = 0; j < 8; j++) { for (var j = 0; j < 8; j++) {
network.push(ip[j] & ipv6_mask[j]); network.push(ip[j] & ipv6Mask[j]);
} }
network_str = IP._ipv6_to_str(network, true); networkStr = IP._ipv6ToStr(network, true);
if (ipv6_networks.hasOwnProperty(network_str)) { if (ipv6Networks.hasOwnProperty(networkStr)) {
ipv6_networks[network_str].push(ip); ipv6Networks[networkStr].push(ip);
} else { } else {
ipv6_networks[network_str] = [ip]; ipv6Networks[networkStr] = [ip];
} }
} }
} }
// Sort IPv4 network dictionaries and print // Sort IPv4 network dictionaries and print
for (network in ipv4_networks) { for (network in ipv4Networks) {
ipv4_networks[network] = ipv4_networks[network].sort(); ipv4Networks[network] = ipv4Networks[network].sort();
output += IP._ipv4_to_str(network) + "/" + cidr + "\n"; output += IP._ipv4ToStr(network) + "/" + cidr + "\n";
if (!only_subnets) { if (!onlySubnets) {
for (i = 0; i < ipv4_networks[network].length; i++) { for (i = 0; i < ipv4Networks[network].length; i++) {
output += " " + IP._ipv4_to_str(ipv4_networks[network][i]) + "\n"; output += " " + IP._ipv4ToStr(ipv4Networks[network][i]) + "\n";
} }
output += "\n"; output += "\n";
} }
} }
// Sort IPv6 network dictionaries and print // Sort IPv6 network dictionaries and print
for (network_str in ipv6_networks) { for (networkStr in ipv6Networks) {
//ipv6_networks[network_str] = ipv6_networks[network_str].sort(); TODO //ipv6Networks[networkStr] = ipv6Networks[networkStr].sort(); TODO
output += network_str + "/" + cidr + "\n"; output += networkStr + "/" + cidr + "\n";
if (!only_subnets) { if (!onlySubnets) {
for (i = 0; i < ipv6_networks[network_str].length; i++) { for (i = 0; i < ipv6Networks[networkStr].length; i++) {
output += " " + IP._ipv6_to_str(ipv6_networks[network_str][i], true) + "\n"; output += " " + IP._ipv6ToStr(ipv6Networks[networkStr][i], true) + "\n";
} }
output += "\n"; output += "\n";
} }
@ -413,35 +413,35 @@ var IP = {
* *
* @private * @private
* @param {RegExp} cidr * @param {RegExp} cidr
* @param {boolean} include_network_info * @param {boolean} includeNetworkInfo
* @param {boolean} enumerate_addresses * @param {boolean} enumerateAddresses
* @param {boolean} allow_large_list * @param {boolean} allowLargeList
* @returns {string} * @returns {string}
*/ */
_ipv4_cidr_range: function(cidr, include_network_info, enumerate_addresses, allow_large_list) { _ipv4CidrRange: function(cidr, includeNetworkInfo, enumerateAddresses, allowLargeList) {
var output = "", var output = "",
network = IP._str_to_ipv4(cidr[1]), network = IP._strToIpv4(cidr[1]),
cidr_range = parseInt(cidr[2], 10); cidrRange = parseInt(cidr[2], 10);
if (cidr_range < 0 || cidr_range > 31) { if (cidrRange < 0 || cidrRange > 31) {
return "IPv4 CIDR must be less than 32"; return "IPv4 CIDR must be less than 32";
} }
var mask = ~(0xFFFFFFFF >>> cidr_range), var mask = ~(0xFFFFFFFF >>> cidrRange),
ip1 = network & mask, ip1 = network & mask,
ip2 = ip1 | ~mask; ip2 = ip1 | ~mask;
if (include_network_info) { if (includeNetworkInfo) {
output += "Network: " + IP._ipv4_to_str(network) + "\n"; output += "Network: " + IP._ipv4ToStr(network) + "\n";
output += "CIDR: " + cidr_range + "\n"; output += "CIDR: " + cidrRange + "\n";
output += "Mask: " + IP._ipv4_to_str(mask) + "\n"; output += "Mask: " + IP._ipv4ToStr(mask) + "\n";
output += "Range: " + IP._ipv4_to_str(ip1) + " - " + IP._ipv4_to_str(ip2) + "\n"; output += "Range: " + IP._ipv4ToStr(ip1) + " - " + IP._ipv4ToStr(ip2) + "\n";
output += "Total addresses in range: " + (((ip2 - ip1) >>> 0) + 1) + "\n\n"; output += "Total addresses in range: " + (((ip2 - ip1) >>> 0) + 1) + "\n\n";
} }
if (enumerate_addresses) { if (enumerateAddresses) {
if (cidr_range >= 16 || allow_large_list) { if (cidrRange >= 16 || allowLargeList) {
output += IP._generate_ipv4_range(ip1, ip2).join("\n"); output += IP._generateIpv4Range(ip1, ip2).join("\n");
} else { } else {
output += IP._LARGE_RANGE_ERROR; output += IP._LARGE_RANGE_ERROR;
} }
@ -455,42 +455,42 @@ var IP = {
* *
* @private * @private
* @param {RegExp} cidr * @param {RegExp} cidr
* @param {boolean} include_network_info * @param {boolean} includeNetworkInfo
* @returns {string} * @returns {string}
*/ */
_ipv6_cidr_range: function(cidr, include_network_info) { _ipv6CidrRange: function(cidr, includeNetworkInfo) {
var output = "", var output = "",
network = IP._str_to_ipv6(cidr[1]), network = IP._strToIpv6(cidr[1]),
cidr_range = parseInt(cidr[cidr.length-1], 10); cidrRange = parseInt(cidr[cidr.length-1], 10);
if (cidr_range < 0 || cidr_range > 127) { if (cidrRange < 0 || cidrRange > 127) {
return "IPv6 CIDR must be less than 128"; return "IPv6 CIDR must be less than 128";
} }
var mask = IP._gen_ipv6_mask(cidr_range), var mask = IP._genIpv6Mask(cidrRange),
ip1 = new Array(8), ip1 = new Array(8),
ip2 = new Array(8), ip2 = new Array(8),
total_diff = "", totalDiff = "",
total = new Array(128); total = new Array(128);
for (var i = 0; i < 8; i++) { for (var i = 0; i < 8; i++) {
ip1[i] = network[i] & mask[i]; ip1[i] = network[i] & mask[i];
ip2[i] = ip1[i] | (~mask[i] & 0x0000FFFF); ip2[i] = ip1[i] | (~mask[i] & 0x0000FFFF);
total_diff = (ip2[i] - ip1[i]).toString(2); totalDiff = (ip2[i] - ip1[i]).toString(2);
if (total_diff !== "0") { if (totalDiff !== "0") {
for (var n = 0; n < total_diff.length; n++) { for (var n = 0; n < totalDiff.length; n++) {
total[i*16 + 16-(total_diff.length-n)] = total_diff[n]; total[i*16 + 16-(totalDiff.length-n)] = totalDiff[n];
} }
} }
} }
if (include_network_info) { if (includeNetworkInfo) {
output += "Network: " + IP._ipv6_to_str(network) + "\n"; output += "Network: " + IP._ipv6ToStr(network) + "\n";
output += "Shorthand: " + IP._ipv6_to_str(network, true) + "\n"; output += "Shorthand: " + IP._ipv6ToStr(network, true) + "\n";
output += "CIDR: " + cidr_range + "\n"; output += "CIDR: " + cidrRange + "\n";
output += "Mask: " + IP._ipv6_to_str(mask) + "\n"; output += "Mask: " + IP._ipv6ToStr(mask) + "\n";
output += "Range: " + IP._ipv6_to_str(ip1) + " - " + IP._ipv6_to_str(ip2) + "\n"; output += "Range: " + IP._ipv6ToStr(ip1) + " - " + IP._ipv6ToStr(ip2) + "\n";
output += "Total addresses in range: " + (parseInt(total.join(""), 2) + 1) + "\n\n"; output += "Total addresses in range: " + (parseInt(total.join(""), 2) + 1) + "\n\n";
} }
@ -505,7 +505,7 @@ var IP = {
* @param {number} cidr * @param {number} cidr
* @returns {number[]} * @returns {number[]}
*/ */
_gen_ipv6_mask: function(cidr) { _genIpv6Mask: function(cidr) {
var mask = new Array(8), var mask = new Array(8),
shift; shift;
@ -529,15 +529,15 @@ var IP = {
* *
* @private * @private
* @param {RegExp} range * @param {RegExp} range
* @param {boolean} include_network_info * @param {boolean} includeNetworkInfo
* @param {boolean} enumerate_addresses * @param {boolean} enumerateAddresses
* @param {boolean} allow_large_list * @param {boolean} allowLargeList
* @returns {string} * @returns {string}
*/ */
_ipv4_hyphenated_range: function(range, include_network_info, enumerate_addresses, allow_large_list) { _ipv4HyphenatedRange: function(range, includeNetworkInfo, enumerateAddresses, allowLargeList) {
var output = "", var output = "",
ip1 = IP._str_to_ipv4(range[1]), ip1 = IP._strToIpv4(range[1]),
ip2 = IP._str_to_ipv4(range[2]); ip2 = IP._strToIpv4(range[2]);
// Calculate mask // Calculate mask
var diff = ip1 ^ ip2, var diff = ip1 ^ ip2,
@ -552,23 +552,23 @@ var IP = {
mask = ~mask >>> 0; mask = ~mask >>> 0;
var network = ip1 & mask, var network = ip1 & mask,
sub_ip1 = network & mask, subIp1 = network & mask,
sub_ip2 = sub_ip1 | ~mask; subIp2 = subIp1 | ~mask;
if (include_network_info) { if (includeNetworkInfo) {
output += "Minimum subnet required to hold this range:\n"; output += "Minimum subnet required to hold this range:\n";
output += "\tNetwork: " + IP._ipv4_to_str(network) + "\n"; output += "\tNetwork: " + IP._ipv4ToStr(network) + "\n";
output += "\tCIDR: " + cidr + "\n"; output += "\tCIDR: " + cidr + "\n";
output += "\tMask: " + IP._ipv4_to_str(mask) + "\n"; output += "\tMask: " + IP._ipv4ToStr(mask) + "\n";
output += "\tSubnet range: " + IP._ipv4_to_str(sub_ip1) + " - " + IP._ipv4_to_str(sub_ip2) + "\n"; output += "\tSubnet range: " + IP._ipv4ToStr(subIp1) + " - " + IP._ipv4ToStr(subIp2) + "\n";
output += "\tTotal addresses in subnet: " + (((sub_ip2 - sub_ip1) >>> 0) + 1) + "\n\n"; output += "\tTotal addresses in subnet: " + (((subIp2 - subIp1) >>> 0) + 1) + "\n\n";
output += "Range: " + IP._ipv4_to_str(ip1) + " - " + IP._ipv4_to_str(ip2) + "\n"; output += "Range: " + IP._ipv4ToStr(ip1) + " - " + IP._ipv4ToStr(ip2) + "\n";
output += "Total addresses in range: " + (((ip2 - ip1) >>> 0) + 1) + "\n\n"; output += "Total addresses in range: " + (((ip2 - ip1) >>> 0) + 1) + "\n\n";
} }
if (enumerate_addresses) { if (enumerateAddresses) {
if (((ip2 - ip1) >>> 0) <= 65536 || allow_large_list) { if (((ip2 - ip1) >>> 0) <= 65536 || allowLargeList) {
output += IP._generate_ipv4_range(ip1, ip2).join("\n"); output += IP._generateIpv4Range(ip1, ip2).join("\n");
} else { } else {
output += IP._LARGE_RANGE_ERROR; output += IP._LARGE_RANGE_ERROR;
} }
@ -582,13 +582,13 @@ var IP = {
* *
* @private * @private
* @param {RegExp} range * @param {RegExp} range
* @param {boolean} include_network_info * @param {boolean} includeNetworkInfo
* @returns {string} * @returns {string}
*/ */
_ipv6_hyphenated_range: function(range, include_network_info) { _ipv6HyphenatedRange: function(range, includeNetworkInfo) {
var output = "", var output = "",
ip1 = IP._str_to_ipv6(range[1]), ip1 = IP._strToIpv6(range[1]),
ip2 = IP._str_to_ipv6(range[14]); ip2 = IP._strToIpv6(range[14]);
var t = "", var t = "",
total = new Array(128); total = new Array(128);
@ -606,9 +606,9 @@ var IP = {
} }
} }
if (include_network_info) { if (includeNetworkInfo) {
output += "Range: " + IP._ipv6_to_str(ip1) + " - " + IP._ipv6_to_str(ip2) + "\n"; output += "Range: " + IP._ipv6ToStr(ip1) + " - " + IP._ipv6ToStr(ip2) + "\n";
output += "Shorthand range: " + IP._ipv6_to_str(ip1, true) + " - " + IP._ipv6_to_str(ip2, true) + "\n"; output += "Shorthand range: " + IP._ipv6ToStr(ip1, true) + " - " + IP._ipv6ToStr(ip2, true) + "\n";
output += "Total addresses in range: " + (parseInt(total.join(""), 2) + 1) + "\n\n"; output += "Total addresses in range: " + (parseInt(total.join(""), 2) + 1) + "\n\n";
} }
@ -620,36 +620,36 @@ var IP = {
* Converts an IPv4 address from string format to numerical format. * Converts an IPv4 address from string format to numerical format.
* *
* @private * @private
* @param {string} ip_str * @param {string} ipStr
* @returns {number} * @returns {number}
* *
* @example * @example
* // returns 168427520 * // returns 168427520
* IP._str_to_ipv4("10.10.0.0"); * IP._strToIpv4("10.10.0.0");
*/ */
_str_to_ipv4: function (ip_str) { _strToIpv4: function (ipStr) {
var blocks = ip_str.split("."), var blocks = ipStr.split("."),
num_blocks = parse_blocks(blocks), numBlocks = parseBlocks(blocks),
result = 0; result = 0;
result += num_blocks[0] << 24; result += numBlocks[0] << 24;
result += num_blocks[1] << 16; result += numBlocks[1] << 16;
result += num_blocks[2] << 8; result += numBlocks[2] << 8;
result += num_blocks[3]; result += numBlocks[3];
return result; return result;
function parse_blocks(blocks) { function parseBlocks(blocks) {
if (blocks.length !== 4) if (blocks.length !== 4)
throw "More than 4 blocks."; throw "More than 4 blocks.";
var num_blocks = []; var numBlocks = [];
for (var i = 0; i < 4; i++) { for (var i = 0; i < 4; i++) {
num_blocks[i] = parseInt(blocks[i], 10); numBlocks[i] = parseInt(blocks[i], 10);
if (num_blocks[i] < 0 || num_blocks[i] > 255) if (numBlocks[i] < 0 || numBlocks[i] > 255)
throw "Block out of range."; throw "Block out of range.";
} }
return num_blocks; return numBlocks;
} }
}, },
@ -658,18 +658,18 @@ var IP = {
* Converts an IPv4 address from numerical format to string format. * Converts an IPv4 address from numerical format to string format.
* *
* @private * @private
* @param {number} ip_int * @param {number} ipInt
* @returns {string} * @returns {string}
* *
* @example * @example
* // returns "10.10.0.0" * // returns "10.10.0.0"
* IP._ipv4_to_str(168427520); * IP._ipv4ToStr(168427520);
*/ */
_ipv4_to_str: function(ip_int) { _ipv4ToStr: function(ipInt) {
var blockA = (ip_int >> 24) & 255, var blockA = (ipInt >> 24) & 255,
blockB = (ip_int >> 16) & 255, blockB = (ipInt >> 16) & 255,
blockC = (ip_int >> 8) & 255, blockC = (ipInt >> 8) & 255,
blockD = ip_int & 255; blockD = ipInt & 255;
return blockA + "." + blockB + "." + blockC + "." + blockD; return blockA + "." + blockB + "." + blockC + "." + blockD;
}, },
@ -679,40 +679,40 @@ var IP = {
* Converts an IPv6 address from string format to numerical array format. * Converts an IPv6 address from string format to numerical array format.
* *
* @private * @private
* @param {string} ip_str * @param {string} ipStr
* @returns {number[]} * @returns {number[]}
* *
* @example * @example
* // returns [65280, 0, 0, 0, 0, 0, 4369, 8738] * // returns [65280, 0, 0, 0, 0, 0, 4369, 8738]
* IP._str_to_ipv6("ff00::1111:2222"); * IP._strToIpv6("ff00::1111:2222");
*/ */
_str_to_ipv6: function(ip_str) { _strToIpv6: function(ipStr) {
var blocks = ip_str.split(":"), var blocks = ipStr.split(":"),
num_blocks = parse_blocks(blocks), numBlocks = parseBlocks(blocks),
j = 0, j = 0,
ipv6 = new Array(8); ipv6 = new Array(8);
for (var i = 0; i < 8; i++) { for (var i = 0; i < 8; i++) {
if (isNaN(num_blocks[j])) { if (isNaN(numBlocks[j])) {
ipv6[i] = 0; ipv6[i] = 0;
if (i === (8-num_blocks.slice(j).length)) j++; if (i === (8-numBlocks.slice(j).length)) j++;
} else { } else {
ipv6[i] = num_blocks[j]; ipv6[i] = numBlocks[j];
j++; j++;
} }
} }
return ipv6; return ipv6;
function parse_blocks(blocks) { function parseBlocks(blocks) {
if (blocks.length < 3 || blocks.length > 8) if (blocks.length < 3 || blocks.length > 8)
throw "Badly formatted IPv6 address."; throw "Badly formatted IPv6 address.";
var num_blocks = []; var numBlocks = [];
for (var i = 0; i < blocks.length; i++) { for (var i = 0; i < blocks.length; i++) {
num_blocks[i] = parseInt(blocks[i], 16); numBlocks[i] = parseInt(blocks[i], 16);
if (num_blocks[i] < 0 || num_blocks[i] > 65535) if (numBlocks[i] < 0 || numBlocks[i] > 65535)
throw "Block out of range."; throw "Block out of range.";
} }
return num_blocks; return numBlocks;
} }
}, },
@ -727,12 +727,12 @@ var IP = {
* *
* @example * @example
* // returns "ff00::1111:2222" * // returns "ff00::1111:2222"
* IP._ipv6_to_str([65280, 0, 0, 0, 0, 0, 4369, 8738], true); * IP._ipv6ToStr([65280, 0, 0, 0, 0, 0, 4369, 8738], true);
* *
* // returns "ff00:0000:0000:0000:0000:0000:1111:2222" * // returns "ff00:0000:0000:0000:0000:0000:1111:2222"
* IP._ipv6_to_str([65280, 0, 0, 0, 0, 0, 4369, 8738], false); * IP._ipv6ToStr([65280, 0, 0, 0, 0, 0, 4369, 8738], false);
*/ */
_ipv6_to_str: function(ipv6, compact) { _ipv6ToStr: function(ipv6, compact) {
var output = "", var output = "",
i = 0; i = 0;
@ -779,18 +779,18 @@ var IP = {
* *
* @private * @private
* @param {number} ip * @param {number} ip
* @param {number} end_ip * @param {number} endIp
* @returns {string[]} * @returns {string[]}
* *
* @example * @example
* // returns ["0.0.0.1", "0.0.0.2", "0.0.0.3"] * // returns ["0.0.0.1", "0.0.0.2", "0.0.0.3"]
* IP._generate_ipv4_range(1, 3); * IP._generateIpv4Range(1, 3);
*/ */
_generate_ipv4_range: function(ip, end_ip) { _generateIpv4Range: function(ip, endIp) {
var range = []; var range = [];
if (end_ip >= ip) { if (endIp >= ip) {
for (; ip <= end_ip; ip++) { for (; ip <= endIp; ip++) {
range.push(IP._ipv4_to_str(ip)); range.push(IP._ipv4ToStr(ip));
} }
} else { } else {
range[0] = "Second IP address smaller than first."; range[0] = "Second IP address smaller than first.";

View File

@ -44,19 +44,19 @@ var JS = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_parse: function (input, args) { runParse: function (input, args) {
var parse_loc = args[0], var parseLoc = args[0],
parse_range = args[1], parseRange = args[1],
parse_tokens = args[2], parseTokens = args[2],
parse_comment = args[3], parseComment = args[3],
parse_tolerant = args[4], parseTolerant = args[4],
result = {}, result = {},
options = { options = {
loc: parse_loc, loc: parseLoc,
range: parse_range, range: parseRange,
tokens: parse_tokens, tokens: parseTokens,
comment: parse_comment, comment: parseComment,
tolerant: parse_tolerant tolerant: parseTolerant
}; };
result = esprima.parse(input, options); result = esprima.parse(input, options);
@ -92,11 +92,11 @@ var JS = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_beautify: function(input, args) { runBeautify: function(input, args) {
var beautify_indent = args[0] || JS.BEAUTIFY_INDENT, var beautifyIndent = args[0] || JS.BEAUTIFY_INDENT,
quotes = args[1].toLowerCase(), quotes = args[1].toLowerCase(),
beautify_semicolons = args[2], beautifySemicolons = args[2],
beautify_comment = args[3], beautifyComment = args[3],
result = "", result = "",
AST; AST;
@ -110,12 +110,12 @@ var JS = {
var options = { var options = {
format: { format: {
indent: { indent: {
style: beautify_indent style: beautifyIndent
}, },
quotes: quotes, quotes: quotes,
semicolons: beautify_semicolons, semicolons: beautifySemicolons,
}, },
comment: beautify_comment comment: beautifyComment
}; };
if (options.comment) if (options.comment)
@ -137,13 +137,13 @@ var JS = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_minify: function(input, args) { runMinify: function(input, args) {
var result = "", var result = "",
AST = esprima.parse(input), AST = esprima.parse(input),
optimised_AST = esmangle.optimize(AST, null), optimisedAST = esmangle.optimize(AST, null),
mangled_AST = esmangle.mangle(optimised_AST); mangledAST = esmangle.mangle(optimisedAST);
result = escodegen.generate(mangled_AST, { result = escodegen.generate(mangledAST, {
format: { format: {
renumber: true, renumber: true,
hexadecimal: true, hexadecimal: true,

View File

@ -42,15 +42,15 @@ var MAC = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_format: function(input, args) { runFormat: function(input, args) {
if (!input) return ""; if (!input) return "";
var output_case = args[0], var outputCase = args[0],
no_delim = args[1], noDelim = args[1],
dash_delim = args[2], dashDelim = args[2],
colon_delim = args[3], colonDelim = args[3],
cisco_style = args[4], ciscoStyle = args[4],
output_list = [], outputList = [],
macs = input.toLowerCase().split(/[,\s\r\n]+/); macs = input.toLowerCase().split(/[,\s\r\n]+/);
macs.forEach(function(mac) { macs.forEach(function(mac) {
@ -59,30 +59,30 @@ var MAC = {
macColon = cleanMac.replace(/(.{2}(?=.))/g, "$1:"), macColon = cleanMac.replace(/(.{2}(?=.))/g, "$1:"),
macCisco = cleanMac.replace(/(.{4}(?=.))/g, "$1."); macCisco = cleanMac.replace(/(.{4}(?=.))/g, "$1.");
if (output_case === "Lower only") { if (outputCase === "Lower only") {
if (no_delim) output_list.push(cleanMac); if (noDelim) outputList.push(cleanMac);
if (dash_delim) output_list.push(macHyphen); if (dashDelim) outputList.push(macHyphen);
if (colon_delim) output_list.push(macColon); if (colonDelim) outputList.push(macColon);
if (cisco_style) output_list.push(macCisco); if (ciscoStyle) outputList.push(macCisco);
} else if (output_case === "Upper only") { } else if (outputCase === "Upper only") {
if (no_delim) output_list.push(cleanMac.toUpperCase()); if (noDelim) outputList.push(cleanMac.toUpperCase());
if (dash_delim) output_list.push(macHyphen.toUpperCase()); if (dashDelim) outputList.push(macHyphen.toUpperCase());
if (colon_delim) output_list.push(macColon.toUpperCase()); if (colonDelim) outputList.push(macColon.toUpperCase());
if (cisco_style) output_list.push(macCisco.toUpperCase()); if (ciscoStyle) outputList.push(macCisco.toUpperCase());
} else { } else {
if (no_delim) output_list.push(cleanMac, cleanMac.toUpperCase()); if (noDelim) outputList.push(cleanMac, cleanMac.toUpperCase());
if (dash_delim) output_list.push(macHyphen, macHyphen.toUpperCase()); if (dashDelim) outputList.push(macHyphen, macHyphen.toUpperCase());
if (colon_delim) output_list.push(macColon, macColon.toUpperCase()); if (colonDelim) outputList.push(macColon, macColon.toUpperCase());
if (cisco_style) output_list.push(macCisco, macCisco.toUpperCase()); if (ciscoStyle) outputList.push(macCisco, macCisco.toUpperCase());
} }
output_list.push( outputList.push(
"" // Empty line to delimit groups "" // Empty line to delimit groups
); );
}); });
// Return the data as a string // Return the data as a string
return output_list.join("\n"); return outputList.join("\n");
}, },
}; };

View File

@ -16,7 +16,7 @@ var OS = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_parse_unix_perms: function(input, args) { runParseUnixPerms: function(input, args) {
var perms = { var perms = {
d : false, // directory d : false, // directory
sl : false, // symbolic link sl : false, // symbolic link
@ -158,12 +158,12 @@ var OS = {
return "Invalid input format.\nPlease enter the permissions in either octal (e.g. 755) or textual (e.g. drwxr-xr-x) format."; return "Invalid input format.\nPlease enter the permissions in either octal (e.g. 755) or textual (e.g. drwxr-xr-x) format.";
} }
output += "Textual representation: " + OS._perms_to_str(perms); output += "Textual representation: " + OS._permsToStr(perms);
output += "\nOctal representation: " + OS._perms_to_octal(perms); output += "\nOctal representation: " + OS._permsToOctal(perms);
// File type // File type
if (textual) { if (textual) {
output += "\nFile type: " + OS._ft_from_perms(perms); output += "\nFile type: " + OS._ftFromPerms(perms);
} }
// setuid, setgid // setuid, setgid
@ -201,7 +201,7 @@ var OS = {
* @param {Object} perms * @param {Object} perms
* @returns {string} * @returns {string}
*/ */
_perms_to_str: function(perms) { _permsToStr: function(perms) {
var str = "", var str = "",
type = "-"; type = "-";
@ -262,7 +262,7 @@ var OS = {
* @param {Object} perms * @param {Object} perms
* @returns {string} * @returns {string}
*/ */
_perms_to_octal: function(perms) { _permsToOctal: function(perms) {
var d = 0, var d = 0,
u = 0, u = 0,
g = 0, g = 0,
@ -295,7 +295,7 @@ var OS = {
* @param {Object} perms * @param {Object} perms
* @returns {string} * @returns {string}
*/ */
_ft_from_perms: function(perms) { _ftFromPerms: function(perms) {
if (perms.d) return "Directory"; if (perms.d) return "Directory";
if (perms.sl) return "Symbolic link"; if (perms.sl) return "Symbolic link";
if (perms.np) return "Named pipe"; if (perms.np) return "Named pipe";

View File

@ -24,15 +24,15 @@ var PublicKey = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_parse_x509: function (input, args) { runParseX509: function (input, args) {
var cert = new X509(), var cert = new X509(),
input_format = args[0]; inputFormat = args[0];
if (!input.length) { if (!input.length) {
return "No input"; return "No input";
} }
switch (input_format) { switch (inputFormat) {
case "DER Hex": case "DER Hex":
input = input.replace(/\s/g, ""); input = input.replace(/\s/g, "");
cert.hex = input; cert.hex = input;
@ -43,11 +43,11 @@ var PublicKey = {
cert.pem = input; cert.pem = input;
break; break;
case "Base64": case "Base64":
cert.hex = Utils.to_hex(Utils.from_base64(input, null, "byte_array"), ""); cert.hex = Utils.toHex(Utils.fromBase64(input, null, "byteArray"), "");
cert.pem = KJUR.asn1.ASN1Util.getPEMStringFromHex(cert.hex, "CERTIFICATE"); cert.pem = KJUR.asn1.ASN1Util.getPEMStringFromHex(cert.hex, "CERTIFICATE");
break; break;
case "Raw": case "Raw":
cert.hex = Utils.to_hex(Utils.str_to_byte_array(input), ""); cert.hex = Utils.toHex(Utils.strToByteArray(input), "");
cert.pem = KJUR.asn1.ASN1Util.getPEMStringFromHex(cert.hex, "CERTIFICATE"); cert.pem = KJUR.asn1.ASN1Util.getPEMStringFromHex(cert.hex, "CERTIFICATE");
break; break;
default: default:
@ -58,108 +58,108 @@ var PublicKey = {
sn = cert.getSerialNumberHex(), sn = cert.getSerialNumberHex(),
algorithm = KJUR.asn1.x509.OID.oid2name(KJUR.asn1.ASN1Util.oidHexToInt(ASN1HEX.getDecendantHexVByNthList(cert.hex, 0, [0, 2, 0]))), algorithm = KJUR.asn1.x509.OID.oid2name(KJUR.asn1.ASN1Util.oidHexToInt(ASN1HEX.getDecendantHexVByNthList(cert.hex, 0, [0, 2, 0]))),
issuer = cert.getIssuerString(), issuer = cert.getIssuerString(),
not_before = cert.getNotBefore(), notBefore = cert.getNotBefore(),
not_after = cert.getNotAfter(), notAfter = cert.getNotAfter(),
subject = cert.getSubjectString(), subject = cert.getSubjectString(),
pk_algorithm = KJUR.asn1.x509.OID.oid2name(KJUR.asn1.ASN1Util.oidHexToInt(ASN1HEX.getDecendantHexVByNthList(cert.hex, 0, [0, 6, 0, 0]))), pkAlgorithm = KJUR.asn1.x509.OID.oid2name(KJUR.asn1.ASN1Util.oidHexToInt(ASN1HEX.getDecendantHexVByNthList(cert.hex, 0, [0, 6, 0, 0]))),
pk = X509.getPublicKeyFromCertPEM(cert.pem), pk = X509.getPublicKeyFromCertPEM(cert.pem),
pk_fields = [], pkFields = [],
pk_str = "", pkStr = "",
cert_sig_alg = KJUR.asn1.x509.OID.oid2name(KJUR.asn1.ASN1Util.oidHexToInt(ASN1HEX.getDecendantHexVByNthList(cert.hex, 0, [1, 0]))), certSigAlg = KJUR.asn1.x509.OID.oid2name(KJUR.asn1.ASN1Util.oidHexToInt(ASN1HEX.getDecendantHexVByNthList(cert.hex, 0, [1, 0]))),
cert_sig = ASN1HEX.getDecendantHexVByNthList(cert.hex, 0, [2]).substr(2), certSig = ASN1HEX.getDecendantHexVByNthList(cert.hex, 0, [2]).substr(2),
sig_str = "", sigStr = "",
extensions = ASN1HEX.dump(ASN1HEX.getDecendantHexVByNthList(cert.hex, 0, [0, 7])); extensions = ASN1HEX.dump(ASN1HEX.getDecendantHexVByNthList(cert.hex, 0, [0, 7]));
// Public Key fields // Public Key fields
if (pk.type === "EC") { // ECDSA if (pk.type === "EC") { // ECDSA
pk_fields.push({ pkFields.push({
key: "Curve Name", key: "Curve Name",
value: pk.curveName value: pk.curveName
}); });
pk_fields.push({ pkFields.push({
key: "Length", key: "Length",
value: (((new BigInteger(pk.pubKeyHex, 16)).bitLength()-3) /2) + " bits" value: (((new BigInteger(pk.pubKeyHex, 16)).bitLength()-3) /2) + " bits"
}); });
pk_fields.push({ pkFields.push({
key: "pub", key: "pub",
value: PublicKey._format_byte_str(pk.pubKeyHex, 16, 18) value: PublicKey._formatByteStr(pk.pubKeyHex, 16, 18)
}); });
} else if (pk.type === "DSA") { // DSA } else if (pk.type === "DSA") { // DSA
pk_fields.push({ pkFields.push({
key: "pub", key: "pub",
value: PublicKey._format_byte_str(pk.y.toString(16), 16, 18) value: PublicKey._formatByteStr(pk.y.toString(16), 16, 18)
}); });
pk_fields.push({ pkFields.push({
key: "P", key: "P",
value: PublicKey._format_byte_str(pk.p.toString(16), 16, 18) value: PublicKey._formatByteStr(pk.p.toString(16), 16, 18)
}); });
pk_fields.push({ pkFields.push({
key: "Q", key: "Q",
value: PublicKey._format_byte_str(pk.q.toString(16), 16, 18) value: PublicKey._formatByteStr(pk.q.toString(16), 16, 18)
}); });
pk_fields.push({ pkFields.push({
key: "G", key: "G",
value: PublicKey._format_byte_str(pk.g.toString(16), 16, 18) value: PublicKey._formatByteStr(pk.g.toString(16), 16, 18)
}); });
} else if (pk.e) { // RSA } else if (pk.e) { // RSA
pk_fields.push({ pkFields.push({
key: "Length", key: "Length",
value: pk.n.bitLength() + " bits" value: pk.n.bitLength() + " bits"
}); });
pk_fields.push({ pkFields.push({
key: "Modulus", key: "Modulus",
value: PublicKey._format_byte_str(pk.n.toString(16), 16, 18) value: PublicKey._formatByteStr(pk.n.toString(16), 16, 18)
}); });
pk_fields.push({ pkFields.push({
key: "Exponent", key: "Exponent",
value: pk.e + " (0x" + pk.e.toString(16) + ")" value: pk.e + " (0x" + pk.e.toString(16) + ")"
}); });
} else { } else {
pk_fields.push({ pkFields.push({
key: "Error", key: "Error",
value: "Unknown Public Key type" value: "Unknown Public Key type"
}); });
} }
// Signature fields // Signature fields
if (ASN1HEX.dump(cert_sig).indexOf("SEQUENCE") === 0) { // DSA or ECDSA if (ASN1HEX.dump(certSig).indexOf("SEQUENCE") === 0) { // DSA or ECDSA
sig_str = " r: " + PublicKey._format_byte_str(ASN1HEX.getDecendantHexVByNthList(cert_sig, 0, [0]), 16, 18) + "\n" + sigStr = " r: " + PublicKey._formatByteStr(ASN1HEX.getDecendantHexVByNthList(certSig, 0, [0]), 16, 18) + "\n" +
" s: " + PublicKey._format_byte_str(ASN1HEX.getDecendantHexVByNthList(cert_sig, 0, [1]), 16, 18) + "\n"; " s: " + PublicKey._formatByteStr(ASN1HEX.getDecendantHexVByNthList(certSig, 0, [1]), 16, 18) + "\n";
} else { // RSA } else { // RSA
sig_str = " Signature: " + PublicKey._format_byte_str(cert_sig, 16, 18) + "\n"; sigStr = " Signature: " + PublicKey._formatByteStr(certSig, 16, 18) + "\n";
} }
// Format Public Key fields // Format Public Key fields
for (var i = 0; i < pk_fields.length; i++) { for (var i = 0; i < pkFields.length; i++) {
pk_str += " " + pk_fields[i].key + ":" + pkStr += " " + pkFields[i].key + ":" +
Utils.pad_left( Utils.padLeft(
pk_fields[i].value + "\n", pkFields[i].value + "\n",
18 - (pk_fields[i].key.length + 3) + pk_fields[i].value.length + 1, 18 - (pkFields[i].key.length + 3) + pkFields[i].value.length + 1,
" " " "
); );
} }
var issuer_str = PublicKey._format_dn_str(issuer, 2), var issuerStr = PublicKey._formatDnStr(issuer, 2),
nb_date = PublicKey._format_date(not_before), nbDate = PublicKey._formatDate(notBefore),
na_date = PublicKey._format_date(not_after), naDate = PublicKey._formatDate(notAfter),
subject_str = PublicKey._format_dn_str(subject, 2); subjectStr = PublicKey._formatDnStr(subject, 2);
var output = "Version: " + (parseInt(version, 16) + 1) + " (0x" + version + ")\n" + var output = "Version: " + (parseInt(version, 16) + 1) + " (0x" + version + ")\n" +
"Serial number: " + new BigInteger(sn, 16).toString() + " (0x" + sn + ")\n" + "Serial number: " + new BigInteger(sn, 16).toString() + " (0x" + sn + ")\n" +
"Algorithm ID: " + algorithm + "\n" + "Algorithm ID: " + algorithm + "\n" +
"Validity\n" + "Validity\n" +
" Not Before: " + nb_date + " (dd-mm-yy hh:mm:ss) (" + not_before + ")\n" + " Not Before: " + nbDate + " (dd-mm-yy hh:mm:ss) (" + notBefore + ")\n" +
" Not After: " + na_date + " (dd-mm-yy hh:mm:ss) (" + not_after + ")\n" + " Not After: " + naDate + " (dd-mm-yy hh:mm:ss) (" + notAfter + ")\n" +
"Issuer\n" + "Issuer\n" +
issuer_str + issuerStr +
"Subject\n" + "Subject\n" +
subject_str + subjectStr +
"Public Key\n" + "Public Key\n" +
" Algorithm: " + pk_algorithm + "\n" + " Algorithm: " + pkAlgorithm + "\n" +
pk_str + pkStr +
"Certificate Signature\n" + "Certificate Signature\n" +
" Algorithm: " + cert_sig_alg + "\n" + " Algorithm: " + certSigAlg + "\n" +
sig_str + sigStr +
"\nExtensions (parsed ASN.1)\n" + "\nExtensions (parsed ASN.1)\n" +
extensions; extensions;
@ -174,7 +174,7 @@ var PublicKey = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_pem_to_hex: function(input, args) { runPemToHex: function(input, args) {
if (input.indexOf("-----BEGIN") < 0) { if (input.indexOf("-----BEGIN") < 0) {
// Add header so that the KEYUTIL function works // Add header so that the KEYUTIL function works
input = "-----BEGIN CERTIFICATE-----" + input; input = "-----BEGIN CERTIFICATE-----" + input;
@ -200,7 +200,7 @@ var PublicKey = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_hex_to_pem: function(input, args) { runHexToPem: function(input, args) {
return KJUR.asn1.ASN1Util.getPEMStringFromHex(input.replace(/\s/g, ""), args[0]); return KJUR.asn1.ASN1Util.getPEMStringFromHex(input.replace(/\s/g, ""), args[0]);
}, },
@ -212,7 +212,7 @@ var PublicKey = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_hex_to_object_identifier: function(input, args) { runHexToObjectIdentifier: function(input, args) {
return KJUR.asn1.ASN1Util.oidHexToInt(input.replace(/\s/g, "")); return KJUR.asn1.ASN1Util.oidHexToInt(input.replace(/\s/g, ""));
}, },
@ -224,7 +224,7 @@ var PublicKey = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_object_identifier_to_hex: function(input, args) { runObjectIdentifierToHex: function(input, args) {
return KJUR.asn1.ASN1Util.oidIntToHex(input); return KJUR.asn1.ASN1Util.oidIntToHex(input);
}, },
@ -242,11 +242,11 @@ var PublicKey = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_parse_asn1_hex_string: function(input, args) { runParseAsn1HexString: function(input, args) {
var truncate_len = args[1], var truncateLen = args[1],
index = args[0]; index = args[0];
return ASN1HEX.dump(input.replace(/\s/g, ""), { return ASN1HEX.dump(input.replace(/\s/g, ""), {
"ommit_long_octet": truncate_len "ommitLongOctet": truncateLen
}, index); }, index);
}, },
@ -255,14 +255,14 @@ var PublicKey = {
* Formats Distinguished Name (DN) strings. * Formats Distinguished Name (DN) strings.
* *
* @private * @private
* @param {string} dn_str * @param {string} dnStr
* @param {number} indent * @param {number} indent
* @returns {string} * @returns {string}
*/ */
_format_dn_str: function(dn_str, indent) { _formatDnStr: function(dnStr, indent) {
var output = "", var output = "",
fields = dn_str.split(",/|"), fields = dnStr.split(",/|"),
max_key_len = 0, maxKeyLen = 0,
key, key,
value, value,
str; str;
@ -272,7 +272,7 @@ var PublicKey = {
key = fields[i].split("=")[0]; key = fields[i].split("=")[0];
max_key_len = key.length > max_key_len ? key.length : max_key_len; maxKeyLen = key.length > maxKeyLen ? key.length : maxKeyLen;
} }
for (i = 0; i < fields.length; i++) { for (i = 0; i < fields.length; i++) {
@ -280,9 +280,9 @@ var PublicKey = {
key = fields[i].split("=")[0]; key = fields[i].split("=")[0];
value = fields[i].split("=")[1]; value = fields[i].split("=")[1];
str = Utils.pad_right(key, max_key_len) + " = " + value + "\n"; str = Utils.padRight(key, maxKeyLen) + " = " + value + "\n";
output += Utils.pad_left(str, indent + str.length, " "); output += Utils.padLeft(str, indent + str.length, " ");
} }
return output; return output;
@ -293,22 +293,22 @@ var PublicKey = {
* Formats byte strings by adding line breaks and delimiters. * Formats byte strings by adding line breaks and delimiters.
* *
* @private * @private
* @param {string} byte_str * @param {string} byteStr
* @param {number} length - Line width * @param {number} length - Line width
* @param {number} indent * @param {number} indent
* @returns {string} * @returns {string}
*/ */
_format_byte_str: function(byte_str, length, indent) { _formatByteStr: function(byteStr, length, indent) {
byte_str = Utils.to_hex(Utils.from_hex(byte_str), ":"); byteStr = Utils.toHex(Utils.fromHex(byteStr), ":");
length = length * 3; length = length * 3;
var output = ""; var output = "";
for (var i = 0; i < byte_str.length; i += length) { for (var i = 0; i < byteStr.length; i += length) {
var str = byte_str.slice(i, i + length) + "\n"; var str = byteStr.slice(i, i + length) + "\n";
if (i === 0) { if (i === 0) {
output += str; output += str;
} else { } else {
output += Utils.pad_left(str, indent + str.length, " "); output += Utils.padLeft(str, indent + str.length, " ");
} }
} }
@ -320,16 +320,16 @@ var PublicKey = {
* Formats dates. * Formats dates.
* *
* @private * @private
* @param {string} date_str * @param {string} dateStr
* @returns {string} * @returns {string}
*/ */
_format_date: function(date_str) { _formatDate: function(dateStr) {
return date_str[4] + date_str[5] + "/" + return dateStr[4] + dateStr[5] + "/" +
date_str[2] + date_str[3] + "/" + dateStr[2] + dateStr[3] + "/" +
date_str[0] + date_str[1] + " " + dateStr[0] + dateStr[1] + " " +
date_str[6] + date_str[7] + ":" + dateStr[6] + dateStr[7] + ":" +
date_str[8] + date_str[9] + ":" + dateStr[8] + dateStr[9] + ":" +
date_str[10] + date_str[11]; dateStr[10] + dateStr[11];
}, },
}; };
@ -388,9 +388,9 @@ X509.DN_ATTRHEX = {
// "06032a864886f70d010104" : "md5withRSAEncryption", // "06032a864886f70d010104" : "md5withRSAEncryption",
// "06032a864886f70d010105" : "SHA-1WithRSAEncryption", // "06032a864886f70d010105" : "SHA-1WithRSAEncryption",
// "06032a8648ce380403" : "id-dsa-with-sha-1", // "06032a8648ce380403" : "id-dsa-with-sha-1",
// "06032b06010505070302" : "id_kp_clientAuth", // "06032b06010505070302" : "idKpClientAuth",
// "06032b06010505070304" : "id_kp_securityemail", // "06032b06010505070304" : "idKpSecurityemail",
"06032b06010505070201" : "id_certificatePolicies", "06032b06010505070201" : "idCertificatePolicies",
"06036086480186f8420101" : "netscape-cert-type", "06036086480186f8420101" : "netscape-cert-type",
"06036086480186f8420102" : "netscape-base-url", "06036086480186f8420102" : "netscape-base-url",
"06036086480186f8420103" : "netscape-revocation-url", "06036086480186f8420103" : "netscape-revocation-url",
@ -867,25 +867,25 @@ X509.DN_ATTRHEX = {
"06036086480186f8450107010101" : "Unknown Verisign policy qualifier", "06036086480186f8450107010101" : "Unknown Verisign policy qualifier",
"06036086480186f8450107010102" : "Unknown Verisign policy qualifier", "06036086480186f8450107010102" : "Unknown Verisign policy qualifier",
"0603678105" : "TCPA", "0603678105" : "TCPA",
"060367810501" : "tcpa_specVersion", "060367810501" : "tcpaSpecVersion",
"060367810502" : "tcpa_attribute", "060367810502" : "tcpaAttribute",
"06036781050201" : "tcpa_at_tpmManufacturer", "06036781050201" : "tcpaAtTpmManufacturer",
"0603678105020a" : "tcpa_at_securityQualities", "0603678105020a" : "tcpaAtSecurityQualities",
"0603678105020b" : "tcpa_at_tpmProtectionProfile", "0603678105020b" : "tcpaAtTpmProtectionProfile",
"0603678105020c" : "tcpa_at_tpmSecurityTarget", "0603678105020c" : "tcpaAtTpmSecurityTarget",
"0603678105020d" : "tcpa_at_foundationProtectionProfile", "0603678105020d" : "tcpaAtFoundationProtectionProfile",
"0603678105020e" : "tcpa_at_foundationSecurityTarget", "0603678105020e" : "tcpaAtFoundationSecurityTarget",
"0603678105020f" : "tcpa_at_tpmIdLabel", "0603678105020f" : "tcpaAtTpmIdLabel",
"06036781050202" : "tcpa_at_tpmModel", "06036781050202" : "tcpaAtTpmModel",
"06036781050203" : "tcpa_at_tpmVersion", "06036781050203" : "tcpaAtTpmVersion",
"06036781050204" : "tcpa_at_platformManufacturer", "06036781050204" : "tcpaAtPlatformManufacturer",
"06036781050205" : "tcpa_at_platformModel", "06036781050205" : "tcpaAtPlatformModel",
"06036781050206" : "tcpa_at_platformVersion", "06036781050206" : "tcpaAtPlatformVersion",
"06036781050207" : "tcpa_at_componentManufacturer", "06036781050207" : "tcpaAtComponentManufacturer",
"06036781050208" : "tcpa_at_componentModel", "06036781050208" : "tcpaAtComponentModel",
"06036781050209" : "tcpa_at_componentVersion", "06036781050209" : "tcpaAtComponentVersion",
"060367810503" : "tcpa_protocol", "060367810503" : "tcpaProtocol",
"06036781050301" : "tcpa_prtt_tpmIdProtocol", "06036781050301" : "tcpaPrttTpmIdProtocol",
"0603672a00" : "contentType", "0603672a00" : "contentType",
"0603672a0000" : "PANData", "0603672a0000" : "PANData",
"0603672a0001" : "PANToken", "0603672a0001" : "PANToken",

View File

@ -24,7 +24,7 @@ var Punycode = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_to_ascii: function(input, args) { runToAscii: function(input, args) {
var idn = args[0]; var idn = args[0];
if (idn) { if (idn) {
@ -42,7 +42,7 @@ var Punycode = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_to_unicode: function(input, args) { runToUnicode: function(input, args) {
var idn = args[0]; var idn = args[0];
if (idn) { if (idn) {

View File

@ -35,11 +35,11 @@ var QuotedPrintable = {
/** /**
* To Quoted Printable operation. * To Quoted Printable operation.
* *
* @param {byte_array} input * @param {byteArray} input
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_to: function (input, args) { runTo: function (input, args) {
var mimeEncodedStr = QuotedPrintable.mimeEncode(input); var mimeEncodedStr = QuotedPrintable.mimeEncode(input);
// fix line breaks // fix line breaks
@ -58,9 +58,9 @@ var QuotedPrintable = {
* *
* @param {string} input * @param {string} input
* @param {Object[]} args * @param {Object[]} args
* @returns {byte_array} * @returns {byteArray}
*/ */
run_from: function (input, args) { runFrom: function (input, args) {
var str = input.replace(/\=(?:\r?\n|$)/g, ""); var str = input.replace(/\=(?:\r?\n|$)/g, "");
return QuotedPrintable.mimeDecode(str); return QuotedPrintable.mimeDecode(str);
}, },
@ -70,7 +70,7 @@ var QuotedPrintable = {
* Decodes mime-encoded data. * Decodes mime-encoded data.
* *
* @param {string} str * @param {string} str
* @returns {byte_array} * @returns {byteArray}
*/ */
mimeDecode: function(str) { mimeDecode: function(str) {
var encodedBytesCount = (str.match(/\=[\da-fA-F]{2}/g) || []).length, var encodedBytesCount = (str.match(/\=[\da-fA-F]{2}/g) || []).length,
@ -96,7 +96,7 @@ var QuotedPrintable = {
/** /**
* Encodes mime data. * Encodes mime data.
* *
* @param {byte_array} buffer * @param {byteArray} buffer
* @returns {string} * @returns {string}
*/ */
mimeEncode: function(buffer) { mimeEncode: function(buffer) {
@ -130,7 +130,7 @@ var QuotedPrintable = {
* *
* @private * @private
* @param {number} nr * @param {number} nr
* @param {byte_array[]} ranges * @param {byteArray[]} ranges
* @returns {bolean} * @returns {bolean}
*/ */
_checkRanges: function(nr, ranges) { _checkRanges: function(nr, ranges) {

View File

@ -26,10 +26,10 @@ var Rotate = {
* Runs rotation operations across the input data. * Runs rotation operations across the input data.
* *
* @private * @private
* @param {byte_array} data * @param {byteArray} data
* @param {number} amount * @param {number} amount
* @param {function} algo - The rotation operation to carry out * @param {function} algo - The rotation operation to carry out
* @returns {byte_array} * @returns {byteArray}
*/ */
_rot: function(data, amount, algo) { _rot: function(data, amount, algo) {
var result = []; var result = [];
@ -47,13 +47,13 @@ var Rotate = {
/** /**
* Rotate right operation. * Rotate right operation.
* *
* @param {byte_array} input * @param {byteArray} input
* @param {Object[]} args * @param {Object[]} args
* @returns {byte_array} * @returns {byteArray}
*/ */
run_rotr: function(input, args) { runRotr: function(input, args) {
if (args[1]) { if (args[1]) {
return Rotate._rotr_whole(input, args[0]); return Rotate._rotrWhole(input, args[0]);
} else { } else {
return Rotate._rot(input, args[0], Rotate._rotr); return Rotate._rot(input, args[0], Rotate._rotr);
} }
@ -63,13 +63,13 @@ var Rotate = {
/** /**
* Rotate left operation. * Rotate left operation.
* *
* @param {byte_array} input * @param {byteArray} input
* @param {Object[]} args * @param {Object[]} args
* @returns {byte_array} * @returns {byteArray}
*/ */
run_rotl: function(input, args) { runRotl: function(input, args) {
if (args[1]) { if (args[1]) {
return Rotate._rotl_whole(input, args[0]); return Rotate._rotlWhole(input, args[0]);
} else { } else {
return Rotate._rot(input, args[0], Rotate._rotl); return Rotate._rot(input, args[0], Rotate._rotl);
} }
@ -95,16 +95,16 @@ var Rotate = {
/** /**
* ROT13 operation. * ROT13 operation.
* *
* @param {byte_array} input * @param {byteArray} input
* @param {Object[]} args * @param {Object[]} args
* @returns {byte_array} * @returns {byteArray}
*/ */
run_rot13: function(input, args) { runRot13: function(input, args) {
var amount = args[2], var amount = args[2],
output = input, output = input,
chr, chr,
rot13_lowercase = args[0], rot13Lowercase = args[0],
rot13_upperacse = args[1]; rot13Upperacse = args[1];
if (amount) { if (amount) {
if (amount < 0) { if (amount < 0) {
@ -113,10 +113,10 @@ var Rotate = {
for (var i = 0; i < input.length; i++) { for (var i = 0; i < input.length; i++) {
chr = input[i]; chr = input[i];
if (rot13_upperacse && chr >= 65 && chr <= 90) { // Upper case if (rot13Upperacse && chr >= 65 && chr <= 90) { // Upper case
chr = (chr - 65 + amount) % 26; chr = (chr - 65 + amount) % 26;
output[i] = chr + 65; output[i] = chr + 65;
} else if (rot13_lowercase && chr >= 97 && chr <= 122) { // Lower case } else if (rot13Lowercase && chr >= 97 && chr <= 122) { // Lower case
chr = (chr - 97 + amount) % 26; chr = (chr - 97 + amount) % 26;
output[i] = chr + 97; output[i] = chr + 97;
} }
@ -136,11 +136,11 @@ var Rotate = {
* ROT47 operation. * ROT47 operation.
* *
* @author Matt C [matt@artemisbot.pw] * @author Matt C [matt@artemisbot.pw]
* @param {byte_array} input * @param {byteArray} input
* @param {Object[]} args * @param {Object[]} args
* @returns {byte_array} * @returns {byteArray}
*/ */
run_rot47: function(input, args) { runRot47: function(input, args) {
var amount = args[0], var amount = args[0],
output = input, output = input,
chr; chr;
@ -193,23 +193,23 @@ var Rotate = {
* from the end of the array to the beginning. * from the end of the array to the beginning.
* *
* @private * @private
* @param {byte_array} data * @param {byteArray} data
* @param {number} amount * @param {number} amount
* @returns {byte_array} * @returns {byteArray}
*/ */
_rotr_whole: function(data, amount) { _rotrWhole: function(data, amount) {
var carry_bits = 0, var carryBits = 0,
new_byte, newByte,
result = []; result = [];
amount = amount % 8; amount = amount % 8;
for (var i = 0; i < data.length; i++) { for (var i = 0; i < data.length; i++) {
var old_byte = data[i] >>> 0; var oldByte = data[i] >>> 0;
new_byte = (old_byte >> amount) | carry_bits; newByte = (oldByte >> amount) | carryBits;
carry_bits = (old_byte & (Math.pow(2, amount)-1)) << (8-amount); carryBits = (oldByte & (Math.pow(2, amount)-1)) << (8-amount);
result.push(new_byte); result.push(newByte);
} }
result[0] |= carry_bits; result[0] |= carryBits;
return result; return result;
}, },
@ -219,23 +219,23 @@ var Rotate = {
* from the beginning of the array to the end. * from the beginning of the array to the end.
* *
* @private * @private
* @param {byte_array} data * @param {byteArray} data
* @param {number} amount * @param {number} amount
* @returns {byte_array} * @returns {byteArray}
*/ */
_rotl_whole: function(data, amount) { _rotlWhole: function(data, amount) {
var carry_bits = 0, var carryBits = 0,
new_byte, newByte,
result = []; result = [];
amount = amount % 8; amount = amount % 8;
for (var i = data.length-1; i >= 0; i--) { for (var i = data.length-1; i >= 0; i--) {
var old_byte = data[i]; var oldByte = data[i];
new_byte = ((old_byte << amount) | carry_bits) & 0xFF; newByte = ((oldByte << amount) | carryBits) & 0xFF;
carry_bits = (old_byte >> (8-amount)) & (Math.pow(2, amount)-1); carryBits = (oldByte >> (8-amount)) & (Math.pow(2, amount)-1);
result[i] = (new_byte); result[i] = (newByte);
} }
result[data.length-1] = result[data.length-1] | carry_bits; result[data.length-1] = result[data.length-1] | carryBits;
return result; return result;
}, },

View File

@ -32,21 +32,21 @@ var SeqUtils = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_sort: function (input, args) { runSort: function (input, args) {
var delim = Utils.char_rep[args[0]], var delim = Utils.charRep[args[0]],
sort_reverse = args[1], sortReverse = args[1],
order = args[2], order = args[2],
sorted = input.split(delim); sorted = input.split(delim);
if (order === "Alphabetical (case sensitive)") { if (order === "Alphabetical (case sensitive)") {
sorted = sorted.sort(); sorted = sorted.sort();
} else if (order === "Alphabetical (case insensitive)") { } else if (order === "Alphabetical (case insensitive)") {
sorted = sorted.sort(SeqUtils._case_insensitive_sort); sorted = sorted.sort(SeqUtils._caseInsensitiveSort);
} else if (order === "IP address") { } else if (order === "IP address") {
sorted = sorted.sort(SeqUtils._ip_sort); sorted = sorted.sort(SeqUtils._ipSort);
} }
if (sort_reverse) sorted.reverse(); if (sortReverse) sorted.reverse();
return sorted.join(delim); return sorted.join(delim);
}, },
@ -58,8 +58,8 @@ var SeqUtils = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_unique: function (input, args) { runUnique: function (input, args) {
var delim = Utils.char_rep[args[0]]; var delim = Utils.charRep[args[0]];
return input.split(delim).unique().join(delim); return input.split(delim).unique().join(delim);
}, },
@ -77,7 +77,7 @@ var SeqUtils = {
* @param {Object[]} args * @param {Object[]} args
* @returns {number} * @returns {number}
*/ */
run_count: function(input, args) { runCount: function(input, args) {
var search = args[0].string, var search = args[0].string,
type = args[0].option; type = args[0].option;
@ -91,7 +91,7 @@ var SeqUtils = {
} }
} else if (search) { } else if (search) {
if (type.indexOf("Extended") === 0) { if (type.indexOf("Extended") === 0) {
search = Utils.parse_escaped_chars(search); search = Utils.parseEscapedChars(search);
} }
return input.count(search); return input.count(search);
} else { } else {
@ -109,11 +109,11 @@ var SeqUtils = {
/** /**
* Reverse operation. * Reverse operation.
* *
* @param {byte_array} input * @param {byteArray} input
* @param {Object[]} args * @param {Object[]} args
* @returns {byte_array} * @returns {byteArray}
*/ */
run_reverse: function (input, args) { runReverse: function (input, args) {
if (args[0] === "Line") { if (args[0] === "Line") {
var lines = [], var lines = [],
line = [], line = [],
@ -146,7 +146,7 @@ var SeqUtils = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_add_line_numbers: function(input, args) { runAddLineNumbers: function(input, args) {
var lines = input.split("\n"), var lines = input.split("\n"),
output = "", output = "",
width = lines.length.toString().length; width = lines.length.toString().length;
@ -165,7 +165,7 @@ var SeqUtils = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_remove_line_numbers: function(input, args) { runRemoveLineNumbers: function(input, args) {
return input.replace(/^[ \t]{0,5}\d+[\s:|\-,.)\]]/gm, ""); return input.replace(/^[ \t]{0,5}\d+[\s:|\-,.)\]]/gm, "");
}, },
@ -177,8 +177,8 @@ var SeqUtils = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_expand_alph_range: function(input, args) { runExpandAlphRange: function(input, args) {
return Utils.expand_alph_range(input).join(args[0]); return Utils.expandAlphRange(input).join(args[0]);
}, },
@ -190,7 +190,7 @@ var SeqUtils = {
* @param {string} b * @param {string} b
* @returns {number} * @returns {number}
*/ */
_case_insensitive_sort: function(a, b) { _caseInsensitiveSort: function(a, b) {
return a.toLowerCase().localeCompare(b.toLowerCase()); return a.toLowerCase().localeCompare(b.toLowerCase());
}, },
@ -203,7 +203,7 @@ var SeqUtils = {
* @param {string} b * @param {string} b
* @returns {number} * @returns {number}
*/ */
_ip_sort: function(a, b) { _ipSort: function(a, b) {
var a_ = a.split("."), var a_ = a.split("."),
b_ = b.split("."); b_ = b.split(".");

View File

@ -97,30 +97,30 @@ var StrUtils = {
* @param {Object[]} args * @param {Object[]} args
* @returns {html} * @returns {html}
*/ */
run_regex: function(input, args) { runRegex: function(input, args) {
var user_regex = args[1], var userRegex = args[1],
i = args[2], i = args[2],
m = args[3], m = args[3],
display_total = args[4], displayTotal = args[4],
output_format = args[5], outputFormat = args[5],
modifiers = "g"; modifiers = "g";
if (i) modifiers += "i"; if (i) modifiers += "i";
if (m) modifiers += "m"; if (m) modifiers += "m";
if (user_regex && user_regex !== "^" && user_regex !== "$") { if (userRegex && userRegex !== "^" && userRegex !== "$") {
try { try {
var regex = new RegExp(user_regex, modifiers); var regex = new RegExp(userRegex, modifiers);
switch (output_format) { switch (outputFormat) {
case "Highlight matches": case "Highlight matches":
return StrUtils._regex_highlight(input, regex, display_total); return StrUtils._regexHighlight(input, regex, displayTotal);
case "List matches": case "List matches":
return Utils.escape_html(StrUtils._regex_list(input, regex, display_total, true, false)); return Utils.escapeHtml(StrUtils._regexList(input, regex, displayTotal, true, false));
case "List capture groups": case "List capture groups":
return Utils.escape_html(StrUtils._regex_list(input, regex, display_total, false, true)); return Utils.escapeHtml(StrUtils._regexList(input, regex, displayTotal, false, true));
case "List matches with capture groups": case "List matches with capture groups":
return Utils.escape_html(StrUtils._regex_list(input, regex, display_total, true, true)); return Utils.escapeHtml(StrUtils._regexList(input, regex, displayTotal, true, true));
default: default:
return "Error: Invalid output format"; return "Error: Invalid output format";
} }
@ -128,7 +128,7 @@ var StrUtils = {
return "Invalid regex. Details: " + err.message; return "Invalid regex. Details: " + err.message;
} }
} else { } else {
return Utils.escape_html(input); return Utils.escapeHtml(input);
} }
}, },
@ -146,7 +146,7 @@ var StrUtils = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_upper: function (input, args) { runUpper: function (input, args) {
var scope = args[0]; var scope = args[0];
switch (scope) { switch (scope) {
@ -177,7 +177,7 @@ var StrUtils = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_lower: function (input, args) { runLower: function (input, args) {
return input.toLowerCase(); return input.toLowerCase();
}, },
@ -210,7 +210,7 @@ var StrUtils = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_find_replace: function(input, args) { runFindReplace: function(input, args) {
var find = args[0].string, var find = args[0].string,
type = args[0].option, type = args[0].option,
replace = args[1], replace = args[1],
@ -226,7 +226,7 @@ var StrUtils = {
if (type === "Regex") { if (type === "Regex") {
find = new RegExp(find, modifiers); find = new RegExp(find, modifiers);
} else if (type.indexOf("Extended") === 0) { } else if (type.indexOf("Extended") === 0) {
find = Utils.parse_escaped_chars(find); find = Utils.parseEscapedChars(find);
} }
return input.replace(find, replace, modifiers); return input.replace(find, replace, modifiers);
@ -254,12 +254,38 @@ var StrUtils = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_split: function(input, args) { runSplit: function(input, args) {
var split_delim = args[0] || StrUtils.SPLIT_DELIM, var splitDelim = args[0] || StrUtils.SPLIT_DELIM,
join_delim = Utils.char_rep[args[1]], joinDelim = Utils.charRep[args[1]],
sections = input.split(split_delim); sections = input.split(splitDelim);
return sections.join(join_delim); return sections.join(joinDelim);
},
/**
* Filter operation.
*
* @author Mikescher (https://github.com/Mikescher | https://mikescher.com)
* @param {string} input
* @param {Object[]} args
* @returns {string}
*/
runFilter: function(input, args) {
var delim = Utils.charRep[args[0]],
reverse = args[2];
try {
var regex = new RegExp(args[1]);
} catch (err) {
return "Invalid regex. Details: " + err.message;
}
var regexFilter = function(value) {
return reverse ^ regex.test(value);
};
return input.split(delim).filter(regexFilter).join(delim);
}, },
@ -281,13 +307,13 @@ var StrUtils = {
* @param {Object[]} args * @param {Object[]} args
* @returns {html} * @returns {html}
*/ */
run_diff: function(input, args) { runDiff: function(input, args) {
var sample_delim = args[0], var sampleDelim = args[0],
diff_by = args[1], diffBy = args[1],
show_added = args[2], showAdded = args[2],
show_removed = args[3], showRemoved = args[3],
ignore_whitespace = args[4], ignoreWhitespace = args[4],
samples = input.split(sample_delim), samples = input.split(sampleDelim),
output = "", output = "",
diff; diff;
@ -295,19 +321,19 @@ var StrUtils = {
return "Incorrect number of samples, perhaps you need to modify the sample delimiter or add more samples?"; return "Incorrect number of samples, perhaps you need to modify the sample delimiter or add more samples?";
} }
switch (diff_by) { switch (diffBy) {
case "Character": case "Character":
diff = JsDiff.diffChars(samples[0], samples[1]); diff = JsDiff.diffChars(samples[0], samples[1]);
break; break;
case "Word": case "Word":
if (ignore_whitespace) { if (ignoreWhitespace) {
diff = JsDiff.diffWords(samples[0], samples[1]); diff = JsDiff.diffWords(samples[0], samples[1]);
} else { } else {
diff = JsDiff.diffWordsWithSpace(samples[0], samples[1]); diff = JsDiff.diffWordsWithSpace(samples[0], samples[1]);
} }
break; break;
case "Line": case "Line":
if (ignore_whitespace) { if (ignoreWhitespace) {
diff = JsDiff.diffTrimmedLines(samples[0], samples[1]); diff = JsDiff.diffTrimmedLines(samples[0], samples[1]);
} else { } else {
diff = JsDiff.diffLines(samples[0], samples[1]); diff = JsDiff.diffLines(samples[0], samples[1]);
@ -328,11 +354,11 @@ var StrUtils = {
for (var i = 0; i < diff.length; i++) { for (var i = 0; i < diff.length; i++) {
if (diff[i].added) { if (diff[i].added) {
if (show_added) output += "<span class='hlgreen'>" + Utils.escape_html(diff[i].value) + "</span>"; if (showAdded) output += "<span class='hlgreen'>" + Utils.escapeHtml(diff[i].value) + "</span>";
} else if (diff[i].removed) { } else if (diff[i].removed) {
if (show_removed) output += "<span class='hlred'>" + Utils.escape_html(diff[i].value) + "</span>"; if (showRemoved) output += "<span class='hlred'>" + Utils.escapeHtml(diff[i].value) + "</span>";
} else { } else {
output += Utils.escape_html(diff[i].value); output += Utils.escapeHtml(diff[i].value);
} }
} }
@ -353,14 +379,14 @@ var StrUtils = {
* @param {Object[]} args * @param {Object[]} args
* @returns {html} * @returns {html}
*/ */
run_offset_checker: function(input, args) { runOffsetChecker: function(input, args) {
var sample_delim = args[0], var sampleDelim = args[0],
samples = input.split(sample_delim), samples = input.split(sampleDelim),
outputs = [], outputs = [],
i = 0, i = 0,
s = 0, s = 0,
match = false, match = false,
in_match = false, inMatch = false,
chr; chr;
if (!samples || samples.length < 2) { if (!samples || samples.length < 2) {
@ -389,34 +415,34 @@ var StrUtils = {
// Write output for each sample // Write output for each sample
for (s = 0; s < samples.length; s++) { for (s = 0; s < samples.length; s++) {
if (samples[s].length <= i) { if (samples[s].length <= i) {
if (in_match) outputs[s] += "</span>"; if (inMatch) outputs[s] += "</span>";
if (s === samples.length - 1) in_match = false; if (s === samples.length - 1) inMatch = false;
continue; continue;
} }
if (match && !in_match) { if (match && !inMatch) {
outputs[s] += "<span class='hlgreen'>" + Utils.escape_html(samples[s][i]); outputs[s] += "<span class='hlgreen'>" + Utils.escapeHtml(samples[s][i]);
if (samples[s].length === i + 1) outputs[s] += "</span>"; if (samples[s].length === i + 1) outputs[s] += "</span>";
if (s === samples.length - 1) in_match = true; if (s === samples.length - 1) inMatch = true;
} else if (!match && in_match) { } else if (!match && inMatch) {
outputs[s] += "</span>" + Utils.escape_html(samples[s][i]); outputs[s] += "</span>" + Utils.escapeHtml(samples[s][i]);
if (s === samples.length - 1) in_match = false; if (s === samples.length - 1) inMatch = false;
} else { } else {
outputs[s] += Utils.escape_html(samples[s][i]); outputs[s] += Utils.escapeHtml(samples[s][i]);
if (in_match && samples[s].length === i + 1) { if (inMatch && samples[s].length === i + 1) {
outputs[s] += "</span>"; outputs[s] += "</span>";
if (samples[s].length - 1 !== i) in_match = false; if (samples[s].length - 1 !== i) inMatch = false;
} }
} }
if (samples[0].length - 1 === i) { if (samples[0].length - 1 === i) {
if (in_match) outputs[s] += "</span>"; if (inMatch) outputs[s] += "</span>";
outputs[s] += Utils.escape_html(samples[s].substring(i + 1)); outputs[s] += Utils.escapeHtml(samples[s].substring(i + 1));
} }
} }
} }
return outputs.join(sample_delim); return outputs.join(sampleDelim);
}, },
@ -427,8 +453,8 @@ var StrUtils = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_parse_escaped_string: function(input, args) { runParseEscapedString: function(input, args) {
return Utils.parse_escaped_chars(input); return Utils.parseEscapedChars(input);
}, },
@ -438,10 +464,10 @@ var StrUtils = {
* @private * @private
* @param {string} input * @param {string} input
* @param {RegExp} regex * @param {RegExp} regex
* @param {boolean} display_total * @param {boolean} displayTotal
* @returns {string} * @returns {string}
*/ */
_regex_highlight: function(input, regex, display_total) { _regexHighlight: function(input, regex, displayTotal) {
var output = "", var output = "",
m, m,
hl = 1, hl = 1,
@ -450,10 +476,10 @@ var StrUtils = {
while ((m = regex.exec(input))) { while ((m = regex.exec(input))) {
// Add up to match // Add up to match
output += Utils.escape_html(input.slice(i, m.index)); output += Utils.escapeHtml(input.slice(i, m.index));
// Add match with highlighting // Add match with highlighting
output += "<span class='hl"+hl+"'>" + Utils.escape_html(m[0]) + "</span>"; output += "<span class='hl"+hl+"'>" + Utils.escapeHtml(m[0]) + "</span>";
// Switch highlight // Switch highlight
hl = hl === 1 ? 2 : 1; hl = hl === 1 ? 2 : 1;
@ -463,9 +489,9 @@ var StrUtils = {
} }
// Add all after final match // Add all after final match
output += Utils.escape_html(input.slice(i, input.length)); output += Utils.escapeHtml(input.slice(i, input.length));
if (display_total) if (displayTotal)
output = "Total found: " + total + "\n\n" + output; output = "Total found: " + total + "\n\n" + output;
return output; return output;
@ -478,12 +504,12 @@ var StrUtils = {
* @private * @private
* @param {string} input * @param {string} input
* @param {RegExp} regex * @param {RegExp} regex
* @param {boolean} display_total * @param {boolean} displayTotal
* @param {boolean} matches - Display full match * @param {boolean} matches - Display full match
* @param {boolean} capture_groups - Display each of the capture groups separately * @param {boolean} captureGroups - Display each of the capture groups separately
* @returns {string} * @returns {string}
*/ */
_regex_list: function(input, regex, display_total, matches, capture_groups) { _regexList: function(input, regex, displayTotal, matches, captureGroups) {
var output = "", var output = "",
total = 0, total = 0,
match; match;
@ -493,7 +519,7 @@ var StrUtils = {
if (matches) { if (matches) {
output += match[0] + "\n"; output += match[0] + "\n";
} }
if (capture_groups) { if (captureGroups) {
for (var i = 1; i < match.length; i++) { for (var i = 1; i < match.length; i++) {
if (matches) { if (matches) {
output += " Group " + i + ": "; output += " Group " + i + ": ";
@ -503,7 +529,7 @@ var StrUtils = {
} }
} }
if (display_total) if (displayTotal)
output = "Total found: " + total + "\n\n" + output; output = "Total found: " + total + "\n\n" + output;
return output; return output;

View File

@ -47,21 +47,21 @@ var Tidy = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_remove_whitespace: function (input, args) { runRemoveWhitespace: function (input, args) {
var remove_spaces = args[0], var removeSpaces = args[0],
remove_cariage_returns = args[1], removeCariageReturns = args[1],
remove_line_feeds = args[2], removeLineFeeds = args[2],
remove_tabs = args[3], removeTabs = args[3],
remove_form_feeds = args[4], removeFormFeeds = args[4],
remove_full_stops = args[5], removeFullStops = args[5],
data = input; data = input;
if (remove_spaces) data = data.replace(/ /g, ""); if (removeSpaces) data = data.replace(/ /g, "");
if (remove_cariage_returns) data = data.replace(/\r/g, ""); if (removeCariageReturns) data = data.replace(/\r/g, "");
if (remove_line_feeds) data = data.replace(/\n/g, ""); if (removeLineFeeds) data = data.replace(/\n/g, "");
if (remove_tabs) data = data.replace(/\t/g, ""); if (removeTabs) data = data.replace(/\t/g, "");
if (remove_form_feeds) data = data.replace(/\f/g, ""); if (removeFormFeeds) data = data.replace(/\f/g, "");
if (remove_full_stops) data = data.replace(/\./g, ""); if (removeFullStops) data = data.replace(/\./g, "");
return data; return data;
}, },
@ -69,11 +69,11 @@ var Tidy = {
/** /**
* Remove null bytes operation. * Remove null bytes operation.
* *
* @param {byte_array} input * @param {byteArray} input
* @param {Object[]} args * @param {Object[]} args
* @returns {byte_array} * @returns {byteArray}
*/ */
run_remove_nulls: function (input, args) { runRemoveNulls: function (input, args) {
var output = []; var output = [];
for (var i = 0; i < input.length; i++) { for (var i = 0; i < input.length; i++) {
if (input[i] !== 0) output.push(input[i]); if (input[i] !== 0) output.push(input[i]);
@ -101,19 +101,19 @@ var Tidy = {
/** /**
* Drop bytes operation. * Drop bytes operation.
* *
* @param {byte_array} input * @param {byteArray} input
* @param {Object[]} args * @param {Object[]} args
* @returns {byte_array} * @returns {byteArray}
*/ */
run_drop_bytes: function(input, args) { runDropBytes: function(input, args) {
var start = args[0], var start = args[0],
length = args[1], length = args[1],
apply_to_each_line = args[2]; applyToEachLine = args[2];
if (start < 0 || length < 0) if (start < 0 || length < 0)
throw "Error: Invalid value"; throw "Error: Invalid value";
if (!apply_to_each_line) if (!applyToEachLine)
return input.slice(0, start).concat(input.slice(start+length, input.length)); return input.slice(0, start).concat(input.slice(start+length, input.length));
// Split input into lines // Split input into lines
@ -153,19 +153,19 @@ var Tidy = {
/** /**
* Take bytes operation. * Take bytes operation.
* *
* @param {byte_array} input * @param {byteArray} input
* @param {Object[]} args * @param {Object[]} args
* @returns {byte_array} * @returns {byteArray}
*/ */
run_take_bytes: function(input, args) { runTakeBytes: function(input, args) {
var start = args[0], var start = args[0],
length = args[1], length = args[1],
apply_to_each_line = args[2]; applyToEachLine = args[2];
if (start < 0 || length < 0) if (start < 0 || length < 0)
throw "Error: Invalid value"; throw "Error: Invalid value";
if (!apply_to_each_line) if (!applyToEachLine)
return input.slice(start, start+length); return input.slice(start, start+length);
// Split input into lines // Split input into lines
@ -214,7 +214,7 @@ var Tidy = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_pad: function(input, args) { runPad: function(input, args) {
var position = args[0], var position = args[0],
len = args[1], len = args[1],
chr = args[2], chr = args[2],
@ -224,11 +224,11 @@ var Tidy = {
if (position === "Start") { if (position === "Start") {
for (i = 0; i < lines.length; i++) { for (i = 0; i < lines.length; i++) {
output += Utils.pad_left(lines[i], lines[i].length+len, chr) + "\n"; output += Utils.padLeft(lines[i], lines[i].length+len, chr) + "\n";
} }
} else if (position === "End") { } else if (position === "End") {
for (i = 0; i < lines.length; i++) { for (i = 0; i < lines.length; i++) {
output += Utils.pad_right(lines[i], lines[i].length+len, chr) + "\n"; output += Utils.padRight(lines[i], lines[i].length+len, chr) + "\n";
} }
} }

View File

@ -25,9 +25,9 @@ var URL_ = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_to: function(input, args) { runTo: function(input, args) {
var encode_all = args[0]; var encodeAll = args[0];
return encode_all ? URL_._encode_all_chars(input) : encodeURI(input); return encodeAll ? URL_._encodeAllChars(input) : encodeURI(input);
}, },
@ -38,7 +38,7 @@ var URL_ = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_from: function(input, args) { runFrom: function(input, args) {
var data = input.replace(/\+/g, "%20"); var data = input.replace(/\+/g, "%20");
try { try {
return decodeURIComponent(data); return decodeURIComponent(data);
@ -55,7 +55,7 @@ var URL_ = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_parse: function(input, args) { runParse: function(input, args) {
var a = document.createElement("a"); var a = document.createElement("a");
// Overwrite base href which will be the current CyberChef URL to reduce confusion. // Overwrite base href which will be the current CyberChef URL to reduce confusion.
@ -70,7 +70,7 @@ var URL_ = {
if (a.port) output += "Port:\t\t" + a.port + "\n"; if (a.port) output += "Port:\t\t" + a.port + "\n";
} }
if (a.pathname) { if (a.pathname && a.pathname !== window.location.pathname) {
var pathname = a.pathname; var pathname = a.pathname;
if (pathname.indexOf(window.location.pathname) === 0) if (pathname.indexOf(window.location.pathname) === 0)
pathname = pathname.replace(window.location.pathname, ""); pathname = pathname.replace(window.location.pathname, "");
@ -78,22 +78,22 @@ var URL_ = {
output += "Path name:\t" + pathname + "\n"; output += "Path name:\t" + pathname + "\n";
} }
if (a.hash) { if (a.hash && a.hash !== window.location.hash) {
output += "Hash:\t\t" + a.hash + "\n"; output += "Hash:\t\t" + a.hash + "\n";
} }
if (a.search) { if (a.search && a.search !== window.location.search) {
output += "Arguments:\n"; output += "Arguments:\n";
var args_ = (a.search.slice(1, a.search.length)).split("&"); var args_ = (a.search.slice(1, a.search.length)).split("&");
var split_args = [], padding = 0; var splitArgs = [], padding = 0;
for (var i = 0; i < args_.length; i++) { for (var i = 0; i < args_.length; i++) {
split_args.push(args_[i].split("=")); splitArgs.push(args_[i].split("="));
padding = (split_args[i][0].length > padding) ? split_args[i][0].length : padding; padding = (splitArgs[i][0].length > padding) ? splitArgs[i][0].length : padding;
} }
for (i = 0; i < split_args.length; i++) { for (i = 0; i < splitArgs.length; i++) {
output += "\t" + Utils.pad_right(split_args[i][0], padding); output += "\t" + Utils.padRight(splitArgs[i][0], padding);
if (split_args[i].length > 1 && split_args[i][1].length) if (splitArgs[i].length > 1 && splitArgs[i][1].length)
output += " = " + split_args[i][1] + "\n"; output += " = " + splitArgs[i][1] + "\n";
else output += "\n"; else output += "\n";
} }
} }
@ -112,7 +112,7 @@ var URL_ = {
* @param {string} str * @param {string} str
* @returns {string} * @returns {string}
*/ */
_encode_all_chars: function(str) { _encodeAllChars: function(str) {
//TODO Do this programatically //TODO Do this programatically
return encodeURIComponent(str) return encodeURIComponent(str)
.replace(/!/g, "%21") .replace(/!/g, "%21")

View File

@ -16,7 +16,7 @@ var UUID = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_generate_v4: function(input, args) { runGenerateV4: function(input, args) {
if (typeof(window.crypto) !== "undefined" && typeof(window.crypto.getRandomValues) !== "undefined") { if (typeof(window.crypto) !== "undefined" && typeof(window.crypto.getRandomValues) !== "undefined") {
var buf = new Uint32Array(4), var buf = new Uint32Array(4),
i = 0; i = 0;

View File

@ -22,8 +22,8 @@ var Unicode = {
* @param {Object[]} args * @param {Object[]} args
* @returns {string} * @returns {string}
*/ */
run_unescape: function(input, args) { runUnescape: function(input, args) {
var prefix = Unicode._prefix_to_regex[args[0]], var prefix = Unicode._prefixToRegex[args[0]],
regex = new RegExp(prefix+"([a-f\\d]{4,6})", "ig"), regex = new RegExp(prefix+"([a-f\\d]{4,6})", "ig"),
output = "", output = "",
m, m,
@ -53,7 +53,7 @@ var Unicode = {
* @private * @private
* @constant * @constant
*/ */
_prefix_to_regex: { _prefixToRegex: {
"\\u": "\\\\u", "\\u": "\\\\u",
"%u": "%u", "%u": "%u",
"U+": "U\\+" "U+": "U\\+"

View File

@ -19,15 +19,15 @@ var ControlsWaiter = function(app, manager) {
* Adjusts the display properties of the control buttons so that they fit within the current width * Adjusts the display properties of the control buttons so that they fit within the current width
* without wrapping or overflowing. * without wrapping or overflowing.
*/ */
ControlsWaiter.prototype.adjust_width = function() { ControlsWaiter.prototype.adjustWidth = function() {
var controls = document.getElementById("controls"), var controls = document.getElementById("controls"),
step = document.getElementById("step"), step = document.getElementById("step"),
clr_breaks = document.getElementById("clr-breaks"), clrBreaks = document.getElementById("clr-breaks"),
save_img = document.querySelector("#save img"), saveImg = document.querySelector("#save img"),
load_img = document.querySelector("#load img"), loadImg = document.querySelector("#load img"),
step_img = document.querySelector("#step img"), stepImg = document.querySelector("#step img"),
clr_recip_img = document.querySelector("#clr-recipe img"), clrRecipImg = document.querySelector("#clr-recipe img"),
clr_breaks_img = document.querySelector("#clr-breaks img"); clrBreaksImg = document.querySelector("#clr-breaks img");
if (controls.clientWidth < 470) { if (controls.clientWidth < 470) {
step.childNodes[1].nodeValue = " Step"; step.childNodes[1].nodeValue = " Step";
@ -36,23 +36,23 @@ ControlsWaiter.prototype.adjust_width = function() {
} }
if (controls.clientWidth < 400) { if (controls.clientWidth < 400) {
save_img.style.display = "none"; saveImg.style.display = "none";
load_img.style.display = "none"; loadImg.style.display = "none";
step_img.style.display = "none"; stepImg.style.display = "none";
clr_recip_img.style.display = "none"; clrRecipImg.style.display = "none";
clr_breaks_img.style.display = "none"; clrBreaksImg.style.display = "none";
} else { } else {
save_img.style.display = "inline"; saveImg.style.display = "inline";
load_img.style.display = "inline"; loadImg.style.display = "inline";
step_img.style.display = "inline"; stepImg.style.display = "inline";
clr_recip_img.style.display = "inline"; clrRecipImg.style.display = "inline";
clr_breaks_img.style.display = "inline"; clrBreaksImg.style.display = "inline";
} }
if (controls.clientWidth < 330) { if (controls.clientWidth < 330) {
clr_breaks.childNodes[1].nodeValue = " Clear breaks"; clrBreaks.childNodes[1].nodeValue = " Clear breaks";
} else { } else {
clr_breaks.childNodes[1].nodeValue = " Clear breakpoints"; clrBreaks.childNodes[1].nodeValue = " Clear breakpoints";
} }
}; };
@ -62,11 +62,11 @@ ControlsWaiter.prototype.adjust_width = function() {
* *
* @param {boolean} value - The new value for Auto Bake. * @param {boolean} value - The new value for Auto Bake.
*/ */
ControlsWaiter.prototype.set_auto_bake = function(value) { ControlsWaiter.prototype.setAutoBake = function(value) {
var auto_bake_checkbox = document.getElementById("auto-bake"); var autoBakeCheckbox = document.getElementById("auto-bake");
if (auto_bake_checkbox.checked !== value) { if (autoBakeCheckbox.checked !== value) {
auto_bake_checkbox.click(); autoBakeCheckbox.click();
} }
}; };
@ -74,7 +74,7 @@ ControlsWaiter.prototype.set_auto_bake = function(value) {
/** /**
* Handler to trigger baking. * Handler to trigger baking.
*/ */
ControlsWaiter.prototype.bake_click = function() { ControlsWaiter.prototype.bakeClick = function() {
this.app.bake(); this.app.bake();
$("#output-text").selectRange(0); $("#output-text").selectRange(0);
}; };
@ -83,7 +83,7 @@ ControlsWaiter.prototype.bake_click = function() {
/** /**
* Handler for the 'Step through' command. Executes the next step of the recipe. * Handler for the 'Step through' command. Executes the next step of the recipe.
*/ */
ControlsWaiter.prototype.step_click = function() { ControlsWaiter.prototype.stepClick = function() {
this.app.bake(true); this.app.bake(true);
$("#output-text").selectRange(0); $("#output-text").selectRange(0);
}; };
@ -92,18 +92,18 @@ ControlsWaiter.prototype.step_click = function() {
/** /**
* Handler for changes made to the Auto Bake checkbox. * Handler for changes made to the Auto Bake checkbox.
*/ */
ControlsWaiter.prototype.auto_bake_change = function() { ControlsWaiter.prototype.autoBakeChange = function() {
var auto_bake_label = document.getElementById("auto-bake-label"), var autoBakeLabel = document.getElementById("auto-bake-label"),
auto_bake_checkbox = document.getElementById("auto-bake"); autoBakeCheckbox = document.getElementById("auto-bake");
this.app.auto_bake_ = auto_bake_checkbox.checked; this.app.autoBake_ = autoBakeCheckbox.checked;
if (auto_bake_checkbox.checked) { if (autoBakeCheckbox.checked) {
auto_bake_label.classList.remove("btn-default"); autoBakeLabel.classList.remove("btn-default");
auto_bake_label.classList.add("btn-success"); autoBakeLabel.classList.add("btn-success");
} else { } else {
auto_bake_label.classList.remove("btn-success"); autoBakeLabel.classList.remove("btn-success");
auto_bake_label.classList.add("btn-default"); autoBakeLabel.classList.add("btn-default");
} }
}; };
@ -111,8 +111,8 @@ ControlsWaiter.prototype.auto_bake_change = function() {
/** /**
* Handler for the 'Clear recipe' command. Removes all operations from the recipe. * Handler for the 'Clear recipe' command. Removes all operations from the recipe.
*/ */
ControlsWaiter.prototype.clear_recipe_click = function() { ControlsWaiter.prototype.clearRecipeClick = function() {
this.manager.recipe.clear_recipe(); this.manager.recipe.clearRecipe();
}; };
@ -120,8 +120,8 @@ ControlsWaiter.prototype.clear_recipe_click = function() {
* Handler for the 'Clear breakpoints' command. Removes all breakpoints from operations in the * Handler for the 'Clear breakpoints' command. Removes all breakpoints from operations in the
* recipe. * recipe.
*/ */
ControlsWaiter.prototype.clear_breaks_click = function() { ControlsWaiter.prototype.clearBreaksClick = function() {
var bps = document.querySelectorAll("#rec_list li.operation .breakpoint"); var bps = document.querySelectorAll("#rec-list li.operation .breakpoint");
for (var i = 0; i < bps.length; i++) { for (var i = 0; i < bps.length; i++) {
bps[i].setAttribute("break", "false"); bps[i].setAttribute("break", "false");
@ -133,49 +133,49 @@ ControlsWaiter.prototype.clear_breaks_click = function() {
/** /**
* Populates the save disalog box with a URL incorporating the recipe and input. * Populates the save disalog box with a URL incorporating the recipe and input.
* *
* @param {Object[]} [recipe_config] - The recipe configuration object array. * @param {Object[]} [recipeConfig] - The recipe configuration object array.
*/ */
ControlsWaiter.prototype.initialise_save_link = function(recipe_config) { ControlsWaiter.prototype.initialiseSaveLink = function(recipeConfig) {
recipe_config = recipe_config || this.app.get_recipe_config(); recipeConfig = recipeConfig || this.app.getRecipeConfig();
var include_recipe = document.getElementById("save-link-recipe-checkbox").checked, var includeRecipe = document.getElementById("save-link-recipe-checkbox").checked,
include_input = document.getElementById("save-link-input-checkbox").checked, includeInput = document.getElementById("save-link-input-checkbox").checked,
save_link_el = document.getElementById("save-link"), saveLinkEl = document.getElementById("save-link"),
save_link = this.generate_state_url(include_recipe, include_input, recipe_config); saveLink = this.generateStateUrl(includeRecipe, includeInput, recipeConfig);
save_link_el.innerHTML = Utils.truncate(save_link, 120); saveLinkEl.innerHTML = Utils.truncate(saveLink, 120);
save_link_el.setAttribute("href", save_link); saveLinkEl.setAttribute("href", saveLink);
}; };
/** /**
* Generates a URL containing the current recipe and input state. * Generates a URL containing the current recipe and input state.
* *
* @param {boolean} include_recipe - Whether to include the recipe in the URL. * @param {boolean} includeRecipe - Whether to include the recipe in the URL.
* @param {boolean} include_input - Whether to include the input in the URL. * @param {boolean} includeInput - Whether to include the input in the URL.
* @param {Object[]} [recipe_config] - The recipe configuration object array. * @param {Object[]} [recipeConfig] - The recipe configuration object array.
* @returns {string} * @returns {string}
*/ */
ControlsWaiter.prototype.generate_state_url = function(include_recipe, include_input, recipe_config) { ControlsWaiter.prototype.generateStateUrl = function(includeRecipe, includeInput, recipeConfig) {
recipe_config = recipe_config || this.app.get_recipe_config(); recipeConfig = recipeConfig || this.app.getRecipeConfig();
var link = window.location.protocol + "//" + var link = window.location.protocol + "//" +
window.location.host + window.location.host +
window.location.pathname, window.location.pathname,
recipe_str = JSON.stringify(recipe_config), recipeStr = JSON.stringify(recipeConfig),
input_str = Utils.to_base64(this.app.get_input(), "A-Za-z0-9+/"); // B64 alphabet with no padding inputStr = Utils.toBase64(this.app.getInput(), "A-Za-z0-9+/"); // B64 alphabet with no padding
include_recipe = include_recipe && (recipe_config.length > 0); includeRecipe = includeRecipe && (recipeConfig.length > 0);
include_input = include_input && (input_str.length > 0) && (input_str.length < 8000); includeInput = includeInput && (inputStr.length > 0) && (inputStr.length < 8000);
if (include_recipe) { if (includeRecipe) {
link += "?recipe=" + encodeURIComponent(recipe_str); link += "?recipe=" + encodeURIComponent(recipeStr);
} }
if (include_recipe && include_input) { if (includeRecipe && includeInput) {
link += "&input=" + encodeURIComponent(input_str); link += "&input=" + encodeURIComponent(inputStr);
} else if (include_input) { } else if (includeInput) {
link += "?input=" + encodeURIComponent(input_str); link += "?input=" + encodeURIComponent(inputStr);
} }
return link; return link;
@ -185,10 +185,10 @@ ControlsWaiter.prototype.generate_state_url = function(include_recipe, include_i
/** /**
* Handler for changes made to the save dialog text area. Re-initialises the save link. * Handler for changes made to the save dialog text area. Re-initialises the save link.
*/ */
ControlsWaiter.prototype.save_text_change = function() { ControlsWaiter.prototype.saveTextChange = function() {
try { try {
var recipe_config = JSON.parse(document.getElementById("save-text").value); var recipeConfig = JSON.parse(document.getElementById("save-text").value);
this.initialise_save_link(recipe_config); this.initialiseSaveLink(recipeConfig);
} catch(err) {} } catch(err) {}
}; };
@ -196,12 +196,13 @@ ControlsWaiter.prototype.save_text_change = function() {
/** /**
* Handler for the 'Save' command. Pops up the save dialog box. * Handler for the 'Save' command. Pops up the save dialog box.
*/ */
ControlsWaiter.prototype.save_click = function() { ControlsWaiter.prototype.saveClick = function() {
var recipe_config = this.app.get_recipe_config(); var recipeConfig = this.app.getRecipeConfig(),
var recipe_str = JSON.stringify(recipe_config).replace(/},{/g, "},\n{"); recipeStr = JSON.stringify(recipeConfig).replace(/},{/g, "},\n{");
document.getElementById("save-text").value = recipe_str;
document.getElementById("save-text").value = recipeStr;
this.initialise_save_link(recipe_config); this.initialiseSaveLink(recipeConfig);
$("#save-modal").modal(); $("#save-modal").modal();
}; };
@ -209,24 +210,24 @@ ControlsWaiter.prototype.save_click = function() {
/** /**
* Handler for the save link recipe checkbox change event. * Handler for the save link recipe checkbox change event.
*/ */
ControlsWaiter.prototype.slr_check_change = function() { ControlsWaiter.prototype.slrCheckChange = function() {
this.initialise_save_link(); this.initialiseSaveLink();
}; };
/** /**
* Handler for the save link input checkbox change event. * Handler for the save link input checkbox change event.
*/ */
ControlsWaiter.prototype.sli_check_change = function() { ControlsWaiter.prototype.sliCheckChange = function() {
this.initialise_save_link(); this.initialiseSaveLink();
}; };
/** /**
* Handler for the 'Load' command. Pops up the load dialog box. * Handler for the 'Load' command. Pops up the load dialog box.
*/ */
ControlsWaiter.prototype.load_click = function() { ControlsWaiter.prototype.loadClick = function() {
this.populate_load_recipes_list(); this.populateLoadRecipesList();
$("#load-modal").modal(); $("#load-modal").modal();
}; };
@ -234,88 +235,88 @@ ControlsWaiter.prototype.load_click = function() {
/** /**
* Saves the recipe specified in the save textarea to local storage. * Saves the recipe specified in the save textarea to local storage.
*/ */
ControlsWaiter.prototype.save_button_click = function() { ControlsWaiter.prototype.saveButtonClick = function() {
var recipe_name = document.getElementById("save-name").value, var recipeName = document.getElementById("save-name").value,
recipe_str = document.getElementById("save-text").value; recipeStr = document.getElementById("save-text").value;
if (!recipe_name) { if (!recipeName) {
this.app.alert("Please enter a recipe name", "danger", 2000); this.app.alert("Please enter a recipe name", "danger", 2000);
return; return;
} }
var saved_recipes = localStorage.saved_recipes ? var savedRecipes = localStorage.savedRecipes ?
JSON.parse(localStorage.saved_recipes) : [], JSON.parse(localStorage.savedRecipes) : [],
recipe_id = localStorage.recipe_id || 0; recipeId = localStorage.recipeId || 0;
saved_recipes.push({ savedRecipes.push({
id: ++recipe_id, id: ++recipeId,
name: recipe_name, name: recipeName,
recipe: recipe_str recipe: recipeStr
}); });
localStorage.saved_recipes = JSON.stringify(saved_recipes); localStorage.savedRecipes = JSON.stringify(savedRecipes);
localStorage.recipe_id = recipe_id; localStorage.recipeId = recipeId;
this.app.alert("Recipe saved as \"" + recipe_name + "\".", "success", 2000); this.app.alert("Recipe saved as \"" + recipeName + "\".", "success", 2000);
}; };
/** /**
* Populates the list of saved recipes in the load dialog box from local storage. * Populates the list of saved recipes in the load dialog box from local storage.
*/ */
ControlsWaiter.prototype.populate_load_recipes_list = function() { ControlsWaiter.prototype.populateLoadRecipesList = function() {
var load_name_el = document.getElementById("load-name"); var loadNameEl = document.getElementById("load-name");
// Remove current recipes from select // Remove current recipes from select
var i = load_name_el.options.length; var i = loadNameEl.options.length;
while (i--) { while (i--) {
load_name_el.remove(i); loadNameEl.remove(i);
} }
// Add recipes to select // Add recipes to select
var saved_recipes = localStorage.saved_recipes ? var savedRecipes = localStorage.savedRecipes ?
JSON.parse(localStorage.saved_recipes) : []; JSON.parse(localStorage.savedRecipes) : [];
for (i = 0; i < saved_recipes.length; i++) { for (i = 0; i < savedRecipes.length; i++) {
var opt = document.createElement("option"); var opt = document.createElement("option");
opt.value = saved_recipes[i].id; opt.value = savedRecipes[i].id;
opt.innerHTML = saved_recipes[i].name; opt.innerHTML = savedRecipes[i].name;
load_name_el.appendChild(opt); loadNameEl.appendChild(opt);
} }
// Populate textarea with first recipe // Populate textarea with first recipe
document.getElementById("load-text").value = saved_recipes.length ? saved_recipes[0].recipe : ""; document.getElementById("load-text").value = savedRecipes.length ? savedRecipes[0].recipe : "";
}; };
/** /**
* Removes the currently selected recipe from local storage. * Removes the currently selected recipe from local storage.
*/ */
ControlsWaiter.prototype.load_delete_click = function() { ControlsWaiter.prototype.loadDeleteClick = function() {
var id = document.getElementById("load-name").value, var id = parseInt(document.getElementById("load-name").value, 10),
saved_recipes = localStorage.saved_recipes ? savedRecipes = localStorage.savedRecipes ?
JSON.parse(localStorage.saved_recipes) : []; JSON.parse(localStorage.savedRecipes) : [];
saved_recipes = saved_recipes.filter(function(r) { savedRecipes = savedRecipes.filter(function(r) {
return r.id !== id; return r.id !== id;
}); });
localStorage.saved_recipes = JSON.stringify(saved_recipes); localStorage.savedRecipes = JSON.stringify(savedRecipes);
this.populate_load_recipes_list(); this.populateLoadRecipesList();
}; };
/** /**
* Displays the selected recipe in the load text box. * Displays the selected recipe in the load text box.
*/ */
ControlsWaiter.prototype.load_name_change = function(e) { ControlsWaiter.prototype.loadNameChange = function(e) {
var el = e.target, var el = e.target,
saved_recipes = localStorage.saved_recipes ? savedRecipes = localStorage.savedRecipes ?
JSON.parse(localStorage.saved_recipes) : [], JSON.parse(localStorage.savedRecipes) : [],
id = parseInt(el.value, 10); id = parseInt(el.value, 10);
var recipe = saved_recipes.filter(function(r) { var recipe = savedRecipes.filter(function(r) {
return r.id === id; return r.id === id;
})[0]; })[0];
@ -326,12 +327,12 @@ ControlsWaiter.prototype.load_name_change = function(e) {
/** /**
* Loads the selected recipe and populates the Recipe with its operations. * Loads the selected recipe and populates the Recipe with its operations.
*/ */
ControlsWaiter.prototype.load_button_click = function() { ControlsWaiter.prototype.loadButtonClick = function() {
try { try {
var recipe_config = JSON.parse(document.getElementById("load-text").value); var recipeConfig = JSON.parse(document.getElementById("load-text").value);
this.app.set_recipe_config(recipe_config); this.app.setRecipeConfig(recipeConfig);
$("#rec_list [data-toggle=popover]").popover(); $("#rec-list [data-toggle=popover]").popover();
} catch(e) { } catch(e) {
this.app.alert("Invalid recipe", "danger", 2000); this.app.alert("Invalid recipe", "danger", 2000);
} }

View File

@ -11,22 +11,22 @@
* @constructor * @constructor
* @param {CatConf[]} categories - The list of categories and operations to be populated. * @param {CatConf[]} categories - The list of categories and operations to be populated.
* @param {Object.<string, OpConf>} operations - The list of operation configuration objects. * @param {Object.<string, OpConf>} operations - The list of operation configuration objects.
* @param {String[]} default_favourites - A list of default favourite operations. * @param {String[]} defaultFavourites - A list of default favourite operations.
* @param {Object} options - Default setting for app options. * @param {Object} options - Default setting for app options.
*/ */
var HTMLApp = function(categories, operations, default_favourites, default_options) { var HTMLApp = function(categories, operations, defaultFavourites, defaultOptions) {
this.categories = categories; this.categories = categories;
this.operations = operations; this.operations = operations;
this.dfavourites = default_favourites; this.dfavourites = defaultFavourites;
this.doptions = default_options; this.doptions = defaultOptions;
this.options = Utils.extend({}, default_options); this.options = Utils.extend({}, defaultOptions);
this.chef = new Chef(); this.chef = new Chef();
this.manager = new Manager(this); this.manager = new Manager(this);
this.auto_bake_ = false; this.autoBake_ = false;
this.progress = 0; this.progress = 0;
this.ing_id = 0; this.ingId = 0;
window.chef = this.chef; window.chef = this.chef;
}; };
@ -39,13 +39,13 @@ var HTMLApp = function(categories, operations, default_favourites, default_optio
*/ */
HTMLApp.prototype.setup = function() { HTMLApp.prototype.setup = function() {
document.dispatchEvent(this.manager.appstart); document.dispatchEvent(this.manager.appstart);
this.initialise_splitter(); this.initialiseSplitter();
this.load_local_storage(); this.loadLocalStorage();
this.populate_operations_list(); this.populateOperationsList();
this.manager.setup(); this.manager.setup();
this.reset_layout(); this.resetLayout();
this.set_compile_message(); this.setCompileMessage();
this.load_URI_params(); this.loadURIParams();
}; };
@ -54,10 +54,10 @@ HTMLApp.prototype.setup = function() {
* *
* @param {Error} err * @param {Error} err
*/ */
HTMLApp.prototype.handle_error = function(err) { HTMLApp.prototype.handleError = function(err) {
console.error(err); console.error(err);
var msg = err.display_str || err.toString(); var msg = err.displayStr || err.toString();
this.alert(msg, "danger", this.options.error_timeout, !this.options.show_errors); this.alert(msg, "danger", this.options.errorTimeout, !this.options.showErrors);
}; };
@ -72,32 +72,32 @@ HTMLApp.prototype.bake = function(step) {
try { try {
response = this.chef.bake( response = this.chef.bake(
this.get_input(), // The user's input this.getInput(), // The user's input
this.get_recipe_config(), // The configuration of the recipe this.getRecipeConfig(), // The configuration of the recipe
this.options, // Options set by the user this.options, // Options set by the user
this.progress, // The current position in the recipe this.progress, // The current position in the recipe
step // Whether or not to take one step or execute the whole recipe step // Whether or not to take one step or execute the whole recipe
); );
} catch (err) { } catch (err) {
this.handle_error(err); this.handleError(err);
} }
if (!response) return; if (!response) return;
if (response.error) { if (response.error) {
this.handle_error(response.error); this.handleError(response.error);
} }
this.options = response.options; this.options = response.options;
this.dish_str = response.type === "html" ? Utils.strip_html_tags(response.result, true) : response.result; this.dishStr = response.type === "html" ? Utils.stripHtmlTags(response.result, true) : response.result;
this.progress = response.progress; this.progress = response.progress;
this.manager.recipe.update_breakpoint_indicator(response.progress); this.manager.recipe.updateBreakpointIndicator(response.progress);
this.manager.output.set(response.result, response.type, response.duration); this.manager.output.set(response.result, response.type, response.duration);
// If baking took too long, disable auto-bake // If baking took too long, disable auto-bake
if (response.duration > this.options.auto_bake_threshold && this.auto_bake_) { if (response.duration > this.options.autoBakeThreshold && this.autoBake_) {
this.manager.controls.set_auto_bake(false); this.manager.controls.setAutoBake(false);
this.alert("Baking took longer than " + this.options.auto_bake_threshold + this.alert("Baking took longer than " + this.options.autoBakeThreshold +
"ms, Auto Bake has been disabled.", "warning", 5000); "ms, Auto Bake has been disabled.", "warning", 5000);
} }
}; };
@ -106,8 +106,8 @@ HTMLApp.prototype.bake = function(step) {
/** /**
* Runs Auto Bake if it is set. * Runs Auto Bake if it is set.
*/ */
HTMLApp.prototype.auto_bake = function() { HTMLApp.prototype.autoBake = function() {
if (this.auto_bake_) { if (this.autoBake_) {
this.bake(); this.bake();
} }
}; };
@ -122,15 +122,15 @@ HTMLApp.prototype.auto_bake = function() {
* *
* @returns {number} - The number of miliseconds it took to run the silent bake. * @returns {number} - The number of miliseconds it took to run the silent bake.
*/ */
HTMLApp.prototype.silent_bake = function() { HTMLApp.prototype.silentBake = function() {
var start_time = new Date().getTime(), var startTime = new Date().getTime(),
recipe_config = this.get_recipe_config(); recipeConfig = this.getRecipeConfig();
if (this.auto_bake_) { if (this.autoBake_) {
this.chef.silent_bake(recipe_config); this.chef.silentBake(recipeConfig);
} }
return new Date().getTime() - start_time; return new Date().getTime() - startTime;
}; };
@ -139,11 +139,11 @@ HTMLApp.prototype.silent_bake = function() {
* *
* @returns {string} * @returns {string}
*/ */
HTMLApp.prototype.get_input = function() { HTMLApp.prototype.getInput = function() {
var input = this.manager.input.get(); var input = this.manager.input.get();
// Save to session storage in case we need to restore it later // Save to session storage in case we need to restore it later
sessionStorage.setItem("input_length", input.length); sessionStorage.setItem("inputLength", input.length);
sessionStorage.setItem("input", input); sessionStorage.setItem("input", input);
return input; return input;
@ -155,8 +155,8 @@ HTMLApp.prototype.get_input = function() {
* *
* @param {string} input - The string to set the input to * @param {string} input - The string to set the input to
*/ */
HTMLApp.prototype.set_input = function(input) { HTMLApp.prototype.setInput = function(input) {
sessionStorage.setItem("input_length", input.length); sessionStorage.setItem("inputLength", input.length);
sessionStorage.setItem("input", input); sessionStorage.setItem("input", input);
this.manager.input.set(input); this.manager.input.set(input);
}; };
@ -168,32 +168,32 @@ HTMLApp.prototype.set_input = function(input) {
* *
* @fires Manager#oplistcreate * @fires Manager#oplistcreate
*/ */
HTMLApp.prototype.populate_operations_list = function() { HTMLApp.prototype.populateOperationsList = function() {
// Move edit button away before we overwrite it // Move edit button away before we overwrite it
document.body.appendChild(document.getElementById("edit-favourites")); document.body.appendChild(document.getElementById("edit-favourites"));
var html = ""; var html = "";
for (var i = 0; i < this.categories.length; i++) { for (var i = 0; i < this.categories.length; i++) {
var cat_conf = this.categories[i], var catConf = this.categories[i],
selected = i === 0, selected = i === 0,
cat = new HTMLCategory(cat_conf.name, selected); cat = new HTMLCategory(catConf.name, selected);
for (var j = 0; j < cat_conf.ops.length; j++) { for (var j = 0; j < catConf.ops.length; j++) {
var op_name = cat_conf.ops[j], var opName = catConf.ops[j],
op = new HTMLOperation(op_name, this.operations[op_name], this, this.manager); op = new HTMLOperation(opName, this.operations[opName], this, this.manager);
cat.add_operation(op); cat.addOperation(op);
} }
html += cat.to_html(); html += cat.toHtml();
} }
document.getElementById("categories").innerHTML = html; document.getElementById("categories").innerHTML = html;
var op_lists = document.querySelectorAll("#categories .op_list"); var opLists = document.querySelectorAll("#categories .op-list");
for (i = 0; i < op_lists.length; i++) { for (i = 0; i < opLists.length; i++) {
op_lists[i].dispatchEvent(this.manager.oplistcreate); opLists[i].dispatchEvent(this.manager.oplistcreate);
} }
// Add edit button to first category (Favourites) // Add edit button to first category (Favourites)
@ -204,20 +204,23 @@ HTMLApp.prototype.populate_operations_list = function() {
/** /**
* Sets up the adjustable splitter to allow the user to resize areas of the page. * Sets up the adjustable splitter to allow the user to resize areas of the page.
*/ */
HTMLApp.prototype.initialise_splitter = function() { HTMLApp.prototype.initialiseSplitter = function() {
Split(["#operations", "#recipe", "#IO"], { this.columnSplitter = Split(["#operations", "#recipe", "#IO"], {
sizes: [20, 30, 50], sizes: [20, 30, 50],
minSize: [240, 325, 500], minSize: [240, 325, 440],
gutterSize: 4, gutterSize: 4,
onDrag: this.manager.controls.adjust_width.bind(this.manager.controls) onDrag: function() {
this.manager.controls.adjustWidth();
this.manager.output.adjustWidth();
}.bind(this)
}); });
Split(["#input", "#output"], { this.ioSplitter = Split(["#input", "#output"], {
direction: "vertical", direction: "vertical",
gutterSize: 4, gutterSize: 4,
}); });
this.reset_layout(); this.resetLayout();
}; };
@ -225,16 +228,16 @@ HTMLApp.prototype.initialise_splitter = function() {
* Loads the information previously saved to the HTML5 local storage object so that user options * Loads the information previously saved to the HTML5 local storage object so that user options
* and favourites can be restored. * and favourites can be restored.
*/ */
HTMLApp.prototype.load_local_storage = function() { HTMLApp.prototype.loadLocalStorage = function() {
// Load options // Load options
var l_options; var lOptions;
if (localStorage.options !== undefined) { if (localStorage.options !== undefined) {
l_options = JSON.parse(localStorage.options); lOptions = JSON.parse(localStorage.options);
} }
this.manager.options.load(l_options); this.manager.options.load(lOptions);
// Load favourites // Load favourites
this.load_favourites(); this.loadFavourites();
}; };
@ -243,21 +246,21 @@ HTMLApp.prototype.load_local_storage = function() {
* Favourites category with them. * Favourites category with them.
* If the user currently has no saved favourites, the defaults from the view constructor are used. * If the user currently has no saved favourites, the defaults from the view constructor are used.
*/ */
HTMLApp.prototype.load_favourites = function() { HTMLApp.prototype.loadFavourites = function() {
var favourites = localStorage.favourites && var favourites = localStorage.favourites &&
localStorage.favourites.length > 2 ? localStorage.favourites.length > 2 ?
JSON.parse(localStorage.favourites) : JSON.parse(localStorage.favourites) :
this.dfavourites; this.dfavourites;
favourites = this.valid_favourites(favourites); favourites = this.validFavourites(favourites);
this.save_favourites(favourites); this.saveFavourites(favourites);
var fav_cat = this.categories.filter(function(c) { var favCat = this.categories.filter(function(c) {
return c.name === "Favourites"; return c.name === "Favourites";
})[0]; })[0];
if (fav_cat) { if (favCat) {
fav_cat.ops = favourites; favCat.ops = favourites;
} else { } else {
this.categories.unshift({ this.categories.unshift({
name: "Favourites", name: "Favourites",
@ -274,17 +277,17 @@ HTMLApp.prototype.load_favourites = function() {
* @param {string[]} favourites - A list of the user's favourite operations * @param {string[]} favourites - A list of the user's favourite operations
* @returns {string[]} A list of the valid favourites * @returns {string[]} A list of the valid favourites
*/ */
HTMLApp.prototype.valid_favourites = function(favourites) { HTMLApp.prototype.validFavourites = function(favourites) {
var valid_favs = []; var validFavs = [];
for (var i = 0; i < favourites.length; i++) { for (var i = 0; i < favourites.length; i++) {
if (this.operations.hasOwnProperty(favourites[i])) { if (this.operations.hasOwnProperty(favourites[i])) {
valid_favs.push(favourites[i]); validFavs.push(favourites[i]);
} else { } else {
this.alert("The operation \"" + Utils.escape_html(favourites[i]) + this.alert("The operation \"" + Utils.escapeHtml(favourites[i]) +
"\" is no longer available. It has been removed from your favourites.", "info"); "\" is no longer available. It has been removed from your favourites.", "info");
} }
} }
return valid_favs; return validFavs;
}; };
@ -293,8 +296,8 @@ HTMLApp.prototype.valid_favourites = function(favourites) {
* *
* @param {string[]} favourites - A list of the user's favourite operations * @param {string[]} favourites - A list of the user's favourite operations
*/ */
HTMLApp.prototype.save_favourites = function(favourites) { HTMLApp.prototype.saveFavourites = function(favourites) {
localStorage.setItem("favourites", JSON.stringify(this.valid_favourites(favourites))); localStorage.setItem("favourites", JSON.stringify(this.validFavourites(favourites)));
}; };
@ -302,11 +305,11 @@ HTMLApp.prototype.save_favourites = function(favourites) {
* Resets favourite operations back to the default as specified in the view constructor and * Resets favourite operations back to the default as specified in the view constructor and
* refreshes the operation list. * refreshes the operation list.
*/ */
HTMLApp.prototype.reset_favourites = function() { HTMLApp.prototype.resetFavourites = function() {
this.save_favourites(this.dfavourites); this.saveFavourites(this.dfavourites);
this.load_favourites(); this.loadFavourites();
this.populate_operations_list(); this.populateOperationsList();
this.manager.recipe.initialise_operation_drag_n_drop(); this.manager.recipe.initialiseOperationDragNDrop();
}; };
@ -315,7 +318,7 @@ HTMLApp.prototype.reset_favourites = function() {
* *
* @param {string} name - The name of the operation * @param {string} name - The name of the operation
*/ */
HTMLApp.prototype.add_favourite = function(name) { HTMLApp.prototype.addFavourite = function(name) {
var favourites = JSON.parse(localStorage.favourites); var favourites = JSON.parse(localStorage.favourites);
if (favourites.indexOf(name) >= 0) { if (favourites.indexOf(name) >= 0) {
@ -324,19 +327,19 @@ HTMLApp.prototype.add_favourite = function(name) {
} }
favourites.push(name); favourites.push(name);
this.save_favourites(favourites); this.saveFavourites(favourites);
this.load_favourites(); this.loadFavourites();
this.populate_operations_list(); this.populateOperationsList();
this.manager.recipe.initialise_operation_drag_n_drop(); this.manager.recipe.initialiseOperationDragNDrop();
}; };
/** /**
* Checks for input and recipe in the URI parameters and loads them if present. * Checks for input and recipe in the URI parameters and loads them if present.
*/ */
HTMLApp.prototype.load_URI_params = function() { HTMLApp.prototype.loadURIParams = function() {
// Load query string from URI // Load query string from URI
this.query_string = (function(a) { this.queryString = (function(a) {
if (a === "") return {}; if (a === "") return {};
var b = {}; var b = {};
for (var i = 0; i < a.length; i++) { for (var i = 0; i < a.length; i++) {
@ -351,46 +354,46 @@ HTMLApp.prototype.load_URI_params = function() {
})(window.location.search.substr(1).split("&")); })(window.location.search.substr(1).split("&"));
// Turn off auto-bake while loading // Turn off auto-bake while loading
var auto_bake_val = this.auto_bake_; var autoBakeVal = this.autoBake_;
this.auto_bake_ = false; this.autoBake_ = false;
// Read in recipe from query string // Read in recipe from query string
if (this.query_string.recipe) { if (this.queryString.recipe) {
try { try {
var recipe_config = JSON.parse(this.query_string.recipe); var recipeConfig = JSON.parse(this.queryString.recipe);
this.set_recipe_config(recipe_config); this.setRecipeConfig(recipeConfig);
} catch(err) {} } catch(err) {}
} else if (this.query_string.op) { } else if (this.queryString.op) {
// If there's no recipe, look for single operations // If there's no recipe, look for single operations
this.manager.recipe.clear_recipe(); this.manager.recipe.clearRecipe();
try { try {
this.manager.recipe.add_operation(this.query_string.op); this.manager.recipe.addOperation(this.queryString.op);
} catch(err) { } catch(err) {
// If no exact match, search for nearest match and add that // If no exact match, search for nearest match and add that
var matched_ops = this.manager.ops.filter_operations(this.query_string.op, false); var matchedOps = this.manager.ops.filterOperations(this.queryString.op, false);
if (matched_ops.length) { if (matchedOps.length) {
this.manager.recipe.add_operation(matched_ops[0].name); this.manager.recipe.addOperation(matchedOps[0].name);
} }
// Populate search with the string // Populate search with the string
var search = document.getElementById("search"); var search = document.getElementById("search");
search.value = this.query_string.op; search.value = this.queryString.op;
search.dispatchEvent(new Event("search")); search.dispatchEvent(new Event("search"));
} }
} }
// Read in input data from query string // Read in input data from query string
if (this.query_string.input) { if (this.queryString.input) {
try { try {
var input_data = Utils.from_base64(this.query_string.input); var inputData = Utils.fromBase64(this.queryString.input);
this.set_input(input_data); this.setInput(inputData);
} catch(err) {} } catch(err) {}
} }
// Restore auto-bake state // Restore auto-bake state
this.auto_bake_ = auto_bake_val; this.autoBake_ = autoBakeVal;
this.auto_bake(); this.autoBake();
}; };
@ -399,8 +402,8 @@ HTMLApp.prototype.load_URI_params = function() {
* *
* @returns {number} * @returns {number}
*/ */
HTMLApp.prototype.next_ing_id = function() { HTMLApp.prototype.nextIngId = function() {
return this.ing_id++; return this.ingId++;
}; };
@ -409,48 +412,48 @@ HTMLApp.prototype.next_ing_id = function() {
* *
* @returns {Object[]} * @returns {Object[]}
*/ */
HTMLApp.prototype.get_recipe_config = function() { HTMLApp.prototype.getRecipeConfig = function() {
var recipe_config = this.manager.recipe.get_config(); var recipeConfig = this.manager.recipe.getConfig();
sessionStorage.setItem("recipe_config", JSON.stringify(recipe_config)); sessionStorage.setItem("recipeConfig", JSON.stringify(recipeConfig));
return recipe_config; return recipeConfig;
}; };
/** /**
* Given a recipe configuration, sets the recipe to that configuration. * Given a recipe configuration, sets the recipe to that configuration.
* *
* @param {Object[]} recipe_config - The recipe configuration * @param {Object[]} recipeConfig - The recipe configuration
*/ */
HTMLApp.prototype.set_recipe_config = function(recipe_config) { HTMLApp.prototype.setRecipeConfig = function(recipeConfig) {
sessionStorage.setItem("recipe_config", JSON.stringify(recipe_config)); sessionStorage.setItem("recipeConfig", JSON.stringify(recipeConfig));
document.getElementById("rec_list").innerHTML = null; document.getElementById("rec-list").innerHTML = null;
for (var i = 0; i < recipe_config.length; i++) { for (var i = 0; i < recipeConfig.length; i++) {
var item = this.manager.recipe.add_operation(recipe_config[i].op); var item = this.manager.recipe.addOperation(recipeConfig[i].op);
// Populate arguments // Populate arguments
var args = item.querySelectorAll(".arg"); var args = item.querySelectorAll(".arg");
for (var j = 0; j < args.length; j++) { for (var j = 0; j < args.length; j++) {
if (args[j].getAttribute("type") === "checkbox") { if (args[j].getAttribute("type") === "checkbox") {
// checkbox // checkbox
args[j].checked = recipe_config[i].args[j]; args[j].checked = recipeConfig[i].args[j];
} else if (args[j].classList.contains("toggle-string")) { } else if (args[j].classList.contains("toggle-string")) {
// toggle_string // toggleString
args[j].value = recipe_config[i].args[j].string; args[j].value = recipeConfig[i].args[j].string;
args[j].previousSibling.children[0].innerHTML = args[j].previousSibling.children[0].innerHTML =
Utils.escape_html(recipe_config[i].args[j].option) + Utils.escapeHtml(recipeConfig[i].args[j].option) +
" <span class='caret'></span>"; " <span class='caret'></span>";
} else { } else {
// all others // all others
args[j].value = recipe_config[i].args[j]; args[j].value = recipeConfig[i].args[j];
} }
} }
// Set disabled and breakpoint // Set disabled and breakpoint
if (recipe_config[i].disabled) { if (recipeConfig[i].disabled) {
item.querySelector(".disable-icon").click(); item.querySelector(".disable-icon").click();
} }
if (recipe_config[i].breakpoint) { if (recipeConfig[i].breakpoint) {
item.querySelector(".breakpoint").click(); item.querySelector(".breakpoint").click();
} }
@ -462,33 +465,31 @@ HTMLApp.prototype.set_recipe_config = function(recipe_config) {
/** /**
* Resets the splitter positions to default. * Resets the splitter positions to default.
*/ */
HTMLApp.prototype.reset_layout = function() { HTMLApp.prototype.resetLayout = function() {
document.getElementById("operations").style.width = "calc(20% - 2px)"; this.columnSplitter.setSizes([20, 30, 50]);
document.getElementById("recipe").style.width = "calc(30% - 4px)"; this.ioSplitter.setSizes([50, 50]);
document.getElementById("IO").style.width = "calc(50% - 2px)";
document.getElementById("input").style.height = "calc(50% - 2px)";
document.getElementById("output").style.height = "calc(50% - 2px)";
this.manager.controls.adjust_width(); this.manager.controls.adjustWidth();
this.manager.output.adjustWidth();
}; };
/** /**
* Sets the compile message. * Sets the compile message.
*/ */
HTMLApp.prototype.set_compile_message = function() { HTMLApp.prototype.setCompileMessage = function() {
// Display time since last build and compile message // Display time since last build and compile message
var now = new Date(), var now = new Date(),
time_since_compile = Utils.fuzzy_time(now.getTime() - window.compile_time), timeSinceCompile = Utils.fuzzyTime(now.getTime() - window.compileTime),
compile_info = "<span style=\"font-weight: normal\">Last build: " + compileInfo = "<span style=\"font-weight: normal\">Last build: " +
time_since_compile.substr(0, 1).toUpperCase() + time_since_compile.substr(1) + " ago"; timeSinceCompile.substr(0, 1).toUpperCase() + timeSinceCompile.substr(1) + " ago";
if (window.compile_message !== "") { if (window.compileMessage !== "") {
compile_info += " - " + window.compile_message; compileInfo += " - " + window.compileMessage;
} }
compile_info += "</span>"; compileInfo += "</span>";
document.getElementById("notice").innerHTML = compile_info; document.getElementById("notice").innerHTML = compileInfo;
}; };
@ -524,32 +525,32 @@ HTMLApp.prototype.alert = function(str, style, timeout, silent) {
style = style || "danger"; style = style || "danger";
timeout = timeout || 0; timeout = timeout || 0;
var alert_el = document.getElementById("alert"), var alertEl = document.getElementById("alert"),
alert_content = document.getElementById("alert-content"); alertContent = document.getElementById("alert-content");
alert_el.classList.remove("alert-danger"); alertEl.classList.remove("alert-danger");
alert_el.classList.remove("alert-warning"); alertEl.classList.remove("alert-warning");
alert_el.classList.remove("alert-info"); alertEl.classList.remove("alert-info");
alert_el.classList.remove("alert-success"); alertEl.classList.remove("alert-success");
alert_el.classList.add("alert-" + style); alertEl.classList.add("alert-" + style);
// If the box hasn't been closed, append to it rather than replacing // If the box hasn't been closed, append to it rather than replacing
if (alert_el.style.display === "block") { if (alertEl.style.display === "block") {
alert_content.innerHTML += alertContent.innerHTML +=
"<br><br>[" + time.toLocaleTimeString() + "] " + str; "<br><br>[" + time.toLocaleTimeString() + "] " + str;
} else { } else {
alert_content.innerHTML = alertContent.innerHTML =
"[" + time.toLocaleTimeString() + "] " + str; "[" + time.toLocaleTimeString() + "] " + str;
} }
// Stop the animation if it is in progress // Stop the animation if it is in progress
$("#alert").stop(); $("#alert").stop();
alert_el.style.display = "block"; alertEl.style.display = "block";
alert_el.style.opacity = 1; alertEl.style.opacity = 1;
if (timeout > 0) { if (timeout > 0) {
clearTimeout(this.alert_timeout); clearTimeout(this.alertTimeout);
this.alert_timeout = setTimeout(function(){ this.alertTimeout = setTimeout(function(){
$("#alert").slideUp(100); $("#alert").slideUp(100);
}, timeout); }, timeout);
} }
@ -575,20 +576,20 @@ HTMLApp.prototype.confirm = function(title, body, callback, scope) {
document.getElementById("confirm-body").innerHTML = body; document.getElementById("confirm-body").innerHTML = body;
document.getElementById("confirm-modal").style.display = "block"; document.getElementById("confirm-modal").style.display = "block";
this.confirm_closed = false; this.confirmClosed = false;
$("#confirm-modal").modal() $("#confirm-modal").modal()
.one("show.bs.modal", function(e) { .one("show.bs.modal", function(e) {
this.confirm_closed = false; this.confirmClosed = false;
}.bind(this)) }.bind(this))
.one("click", "#confirm-yes", function() { .one("click", "#confirm-yes", function() {
this.confirm_closed = true; this.confirmClosed = true;
callback.bind(scope)(true); callback.bind(scope)(true);
$("#confirm-modal").modal("hide"); $("#confirm-modal").modal("hide");
}.bind(this)) }.bind(this))
.one("hide.bs.modal", function(e) { .one("hide.bs.modal", function(e) {
if (!this.confirm_closed) if (!this.confirmClosed)
callback.bind(scope)(false); callback.bind(scope)(false);
this.confirm_closed = true; this.confirmClosed = true;
}.bind(this)); }.bind(this));
}; };
@ -597,7 +598,7 @@ HTMLApp.prototype.confirm = function(title, body, callback, scope) {
* Handler for the alert close button click event. * Handler for the alert close button click event.
* Closes the alert box. * Closes the alert box.
*/ */
HTMLApp.prototype.alert_close_click = function() { HTMLApp.prototype.alertCloseClick = function() {
document.getElementById("alert").style.display = "none"; document.getElementById("alert").style.display = "none";
}; };
@ -609,13 +610,13 @@ HTMLApp.prototype.alert_close_click = function() {
* @listens Manager#statechange * @listens Manager#statechange
* @param {event} e * @param {event} e
*/ */
HTMLApp.prototype.state_change = function(e) { HTMLApp.prototype.stateChange = function(e) {
this.auto_bake(); this.autoBake();
// Update the current history state (not creating a new one) // Update the current history state (not creating a new one)
if (this.options.update_url) { if (this.options.updateUrl) {
this.last_state_url = this.manager.controls.generate_state_url(true, true); this.lastStateUrl = this.manager.controls.generateStateUrl(true, true);
window.history.replaceState({}, "CyberChef", this.last_state_url); window.history.replaceState({}, "CyberChef", this.lastStateUrl);
} }
}; };
@ -626,9 +627,9 @@ HTMLApp.prototype.state_change = function(e) {
* *
* @param {event} e * @param {event} e
*/ */
HTMLApp.prototype.pop_state = function(e) { HTMLApp.prototype.popState = function(e) {
if (window.location.href.split("#")[0] !== this.last_state_url) { if (window.location.href.split("#")[0] !== this.lastStateUrl) {
this.load_URI_params(); this.loadURIParams();
} }
}; };
@ -636,11 +637,11 @@ HTMLApp.prototype.pop_state = function(e) {
/** /**
* Function to call an external API from this view. * Function to call an external API from this view.
*/ */
HTMLApp.prototype.call_api = function(url, type, data, data_type, content_type) { HTMLApp.prototype.callApi = function(url, type, data, dataType, contentType) {
type = type || "POST"; type = type || "POST";
data = data || {}; data = data || {};
data_type = data_type || undefined; dataType = dataType || undefined;
content_type = content_type || "application/json"; contentType = contentType || "application/json";
var response = null, var response = null,
success = false; success = false;
@ -650,8 +651,8 @@ HTMLApp.prototype.call_api = function(url, type, data, data_type, content_type)
async: false, async: false,
type: type, type: type,
data: data, data: data,
dataType: data_type, dataType: dataType,
contentType: content_type, contentType: contentType,
success: function(data) { success: function(data) {
success = true; success = true;
response = data; response = data;

View File

@ -12,7 +12,7 @@
var HTMLCategory = function(name, selected) { var HTMLCategory = function(name, selected) {
this.name = name; this.name = name;
this.selected = selected; this.selected = selected;
this.op_list = []; this.opList = [];
}; };
@ -21,8 +21,8 @@ var HTMLCategory = function(name, selected) {
* *
* @param {HTMLOperation} operation - The operation to add. * @param {HTMLOperation} operation - The operation to add.
*/ */
HTMLCategory.prototype.add_operation = function(operation) { HTMLCategory.prototype.addOperation = function(operation) {
this.op_list.push(operation); this.opList.push(operation);
}; };
@ -31,18 +31,18 @@ HTMLCategory.prototype.add_operation = function(operation) {
* *
* @returns {string} * @returns {string}
*/ */
HTMLCategory.prototype.to_html = function() { HTMLCategory.prototype.toHtml = function() {
var cat_name = "cat" + this.name.replace(/[\s/-:_]/g, ""); var catName = "cat" + this.name.replace(/[\s/-:_]/g, "");
var html = "<div class='panel category'>\ var html = "<div class='panel category'>\
<a class='category-title' data-toggle='collapse'\ <a class='category-title' data-toggle='collapse'\
data-parent='#categories' href='#" + cat_name + "'>\ data-parent='#categories' href='#" + catName + "'>\
" + this.name + "\ " + this.name + "\
</a>\ </a>\
<div id='" + cat_name + "' class='panel-collapse collapse\ <div id='" + catName + "' class='panel-collapse collapse\
" + (this.selected ? " in" : "") + "'><ul class='op_list'>"; " + (this.selected ? " in" : "") + "'><ul class='op-list'>";
for (var i = 0; i < this.op_list.length; i++) { for (var i = 0; i < this.opList.length; i++) {
html += this.op_list[i].to_stub_html(); html += this.opList[i].toStubHtml();
} }
html += "</ul></div></div>"; html += "</ul></div></div>";

View File

@ -18,11 +18,11 @@ var HTMLIngredient = function(config, app, manager) {
this.type = config.type; this.type = config.type;
this.value = config.value; this.value = config.value;
this.disabled = config.disabled || false; this.disabled = config.disabled || false;
this.disable_args = config.disable_args || false; this.disableArgs = config.disableArgs || false;
this.placeholder = config.placeholder || false; this.placeholder = config.placeholder || false;
this.target = config.target; this.target = config.target;
this.toggle_values = config.toggle_values; this.toggleValues = config.toggleValues;
this.id = "ing-" + this.app.next_ing_id(); this.id = "ing-" + this.app.nextIngId();
}; };
@ -31,12 +31,12 @@ var HTMLIngredient = function(config, app, manager) {
* *
* @returns {string} * @returns {string}
*/ */
HTMLIngredient.prototype.to_html = function() { HTMLIngredient.prototype.toHtml = function() {
var inline = (this.type === "boolean" || var inline = (this.type === "boolean" ||
this.type === "number" || this.type === "number" ||
this.type === "option" || this.type === "option" ||
this.type === "short_string" || this.type === "shortString" ||
this.type === "binary_short_string"), this.type === "binaryShortString"),
html = inline ? "" : "<div class='clearfix'>&nbsp;</div>", html = inline ? "" : "<div class='clearfix'>&nbsp;</div>",
i, m; i, m;
@ -46,50 +46,50 @@ HTMLIngredient.prototype.to_html = function() {
switch (this.type) { switch (this.type) {
case "string": case "string":
case "binary_string": case "binaryString":
case "byte_array": case "byteArray":
html += "<input type='text' id='" + this.id + "' class='arg arg-input' arg_name='" + html += "<input type='text' id='" + this.id + "' class='arg arg-input' arg-name='" +
this.name + "' value='" + this.value + "'" + this.name + "' value='" + this.value + "'" +
(this.disabled ? " disabled='disabled'" : "") + (this.disabled ? " disabled='disabled'" : "") +
(this.placeholder ? " placeholder='" + this.placeholder + "'" : "") + ">"; (this.placeholder ? " placeholder='" + this.placeholder + "'" : "") + ">";
break; break;
case "short_string": case "shortString":
case "binary_short_string": case "binaryShortString":
html += "<input type='text' id='" + this.id + html += "<input type='text' id='" + this.id +
"'class='arg arg-input short-string' arg_name='" + this.name + "'value='" + "'class='arg arg-input short-string' arg-name='" + this.name + "'value='" +
this.value + "'" + (this.disabled ? " disabled='disabled'" : "") + this.value + "'" + (this.disabled ? " disabled='disabled'" : "") +
(this.placeholder ? " placeholder='" + this.placeholder + "'" : "") + ">"; (this.placeholder ? " placeholder='" + this.placeholder + "'" : "") + ">";
break; break;
case "toggle_string": case "toggleString":
html += "<div class='input-group'><div class='input-group-btn'>\ html += "<div class='input-group'><div class='input-group-btn'>\
<button type='button' class='btn btn-default dropdown-toggle' data-toggle='dropdown'\ <button type='button' class='btn btn-default dropdown-toggle' data-toggle='dropdown'\
aria-haspopup='true' aria-expanded='false'" + aria-haspopup='true' aria-expanded='false'" +
(this.disabled ? " disabled='disabled'" : "") + ">" + this.toggle_values[0] + (this.disabled ? " disabled='disabled'" : "") + ">" + this.toggleValues[0] +
" <span class='caret'></span></button><ul class='dropdown-menu'>"; " <span class='caret'></span></button><ul class='dropdown-menu'>";
for (i = 0; i < this.toggle_values.length; i++) { for (i = 0; i < this.toggleValues.length; i++) {
html += "<li><a href='#'>" + this.toggle_values[i] + "</a></li>"; html += "<li><a href='#'>" + this.toggleValues[i] + "</a></li>";
} }
html += "</ul></div><input type='text' class='arg arg-input toggle-string'" + html += "</ul></div><input type='text' class='arg arg-input toggle-string'" +
(this.disabled ? " disabled='disabled'" : "") + (this.disabled ? " disabled='disabled'" : "") +
(this.placeholder ? " placeholder='" + this.placeholder + "'" : "") + "></div>"; (this.placeholder ? " placeholder='" + this.placeholder + "'" : "") + "></div>";
break; break;
case "number": case "number":
html += "<input type='number' id='" + this.id + "'class='arg arg-input' arg_name='" + html += "<input type='number' id='" + this.id + "'class='arg arg-input' arg-name='" +
this.name + "'value='" + this.value + "'" + this.name + "'value='" + this.value + "'" +
(this.disabled ? " disabled='disabled'" : "") + (this.disabled ? " disabled='disabled'" : "") +
(this.placeholder ? " placeholder='" + this.placeholder + "'" : "") + ">"; (this.placeholder ? " placeholder='" + this.placeholder + "'" : "") + ">";
break; break;
case "boolean": case "boolean":
html += "<input type='checkbox' id='" + this.id + "'class='arg' arg_name='" + html += "<input type='checkbox' id='" + this.id + "'class='arg' arg-name='" +
this.name + "'" + (this.value ? " checked='checked' " : "") + this.name + "'" + (this.value ? " checked='checked' " : "") +
(this.disabled ? " disabled='disabled'" : "") + ">"; (this.disabled ? " disabled='disabled'" : "") + ">";
if (this.disable_args) { if (this.disableArgs) {
this.manager.add_dynamic_listener("#" + this.id, "click", this.toggle_disable_args, this); this.manager.addDynamicListener("#" + this.id, "click", this.toggleDisableArgs, this);
} }
break; break;
case "option": case "option":
html += "<select class='arg' id='" + this.id + "'arg_name='" + this.name + "'" + html += "<select class='arg' id='" + this.id + "'arg-name='" + this.name + "'" +
(this.disabled ? " disabled='disabled'" : "") + ">"; (this.disabled ? " disabled='disabled'" : "") + ">";
for (i = 0; i < this.value.length; i++) { for (i = 0; i < this.value.length; i++) {
if ((m = this.value[i].match(/\[([a-z0-9 -()^]+)\]/i))) { if ((m = this.value[i].match(/\[([a-z0-9 -()^]+)\]/i))) {
@ -102,8 +102,8 @@ HTMLIngredient.prototype.to_html = function() {
} }
html += "</select>"; html += "</select>";
break; break;
case "populate_option": case "populateOption":
html += "<select class='arg' id='" + this.id + "'arg_name='" + this.name + "'" + html += "<select class='arg' id='" + this.id + "'arg-name='" + this.name + "'" +
(this.disabled ? " disabled='disabled'" : "") + ">"; (this.disabled ? " disabled='disabled'" : "") + ">";
for (i = 0; i < this.value.length; i++) { for (i = 0; i < this.value.length; i++) {
if ((m = this.value[i].name.match(/\[([a-z0-9 -()^]+)\]/i))) { if ((m = this.value[i].name.match(/\[([a-z0-9 -()^]+)\]/i))) {
@ -117,9 +117,9 @@ HTMLIngredient.prototype.to_html = function() {
} }
html += "</select>"; html += "</select>";
this.manager.add_dynamic_listener("#" + this.id, "change", this.populate_option_change, this); this.manager.addDynamicListener("#" + this.id, "change", this.populateOptionChange, this);
break; break;
case "editable_option": case "editableOption":
html += "<div class='editable-option'>"; html += "<div class='editable-option'>";
html += "<select class='editable-option-select' id='sel-" + this.id + "'" + html += "<select class='editable-option-select' id='sel-" + this.id + "'" +
(this.disabled ? " disabled='disabled'" : "") + ">"; (this.disabled ? " disabled='disabled'" : "") + ">";
@ -128,16 +128,16 @@ HTMLIngredient.prototype.to_html = function() {
} }
html += "</select>"; html += "</select>";
html += "<input class='arg arg-input editable-option-input' id='" + this.id + html += "<input class='arg arg-input editable-option-input' id='" + this.id +
"'arg_name='" + this.name + "'" + " value='" + this.value[0].value + "'" + "'arg-name='" + this.name + "'" + " value='" + this.value[0].value + "'" +
(this.disabled ? " disabled='disabled'" : "") + (this.disabled ? " disabled='disabled'" : "") +
(this.placeholder ? " placeholder='" + this.placeholder + "'" : "") + ">"; (this.placeholder ? " placeholder='" + this.placeholder + "'" : "") + ">";
html += "</div>"; html += "</div>";
this.manager.add_dynamic_listener("#sel-" + this.id, "change", this.editable_option_change, this); this.manager.addDynamicListener("#sel-" + this.id, "change", this.editableOptionChange, this);
break; break;
case "text": case "text":
html += "<textarea id='" + this.id + "' class='arg' arg_name='" + html += "<textarea id='" + this.id + "' class='arg' arg-name='" +
this.name + "'" + (this.disabled ? " disabled='disabled'" : "") + this.name + "'" + (this.disabled ? " disabled='disabled'" : "") +
(this.placeholder ? " placeholder='" + this.placeholder + "'" : "") + ">" + (this.placeholder ? " placeholder='" + this.placeholder + "'" : "") + ">" +
this.value + "</textarea>"; this.value + "</textarea>";
@ -153,18 +153,18 @@ HTMLIngredient.prototype.to_html = function() {
/** /**
* Handler for argument disable toggle. * Handler for argument disable toggle.
* Toggles disabled state for all arguments in the disable_args list for this ingredient. * Toggles disabled state for all arguments in the disableArgs list for this ingredient.
* *
* @param {event} e * @param {event} e
*/ */
HTMLIngredient.prototype.toggle_disable_args = function(e) { HTMLIngredient.prototype.toggleDisableArgs = function(e) {
var el = e.target, var el = e.target,
op = el.parentNode.parentNode, op = el.parentNode.parentNode,
args = op.querySelectorAll(".arg-group"), args = op.querySelectorAll(".arg-group"),
els; els;
for (var i = 0; i < this.disable_args.length; i++) { for (var i = 0; i < this.disableArgs.length; i++) {
els = args[this.disable_args[i]].querySelectorAll("input, select, button"); els = args[this.disableArgs[i]].querySelectorAll("input, select, button");
for (var j = 0; j < els.length; j++) { for (var j = 0; j < els.length; j++) {
if (els[j].getAttribute("disabled")) { if (els[j].getAttribute("disabled")) {
@ -175,7 +175,7 @@ HTMLIngredient.prototype.toggle_disable_args = function(e) {
} }
} }
this.manager.recipe.ing_change(); this.manager.recipe.ingChange();
}; };
@ -185,14 +185,14 @@ HTMLIngredient.prototype.toggle_disable_args = function(e) {
* *
* @param {event} e * @param {event} e
*/ */
HTMLIngredient.prototype.populate_option_change = function(e) { HTMLIngredient.prototype.populateOptionChange = function(e) {
var el = e.target, var el = e.target,
op = el.parentNode.parentNode, op = el.parentNode.parentNode,
target = op.querySelectorAll(".arg-group")[this.target].querySelector("input, select, textarea"); target = op.querySelectorAll(".arg-group")[this.target].querySelector("input, select, textarea");
target.value = el.childNodes[el.selectedIndex].getAttribute("populate-value"); target.value = el.childNodes[el.selectedIndex].getAttribute("populate-value");
this.manager.recipe.ing_change(); this.manager.recipe.ingChange();
}; };
@ -202,11 +202,11 @@ HTMLIngredient.prototype.populate_option_change = function(e) {
* *
* @param {event} e * @param {event} e
*/ */
HTMLIngredient.prototype.editable_option_change = function(e) { HTMLIngredient.prototype.editableOptionChange = function(e) {
var select = e.target, var select = e.target,
input = select.nextSibling; input = select.nextSibling;
input.value = select.childNodes[select.selectedIndex].value; input.value = select.childNodes[select.selectedIndex].value;
this.manager.recipe.ing_change(); this.manager.recipe.ingChange();
}; };

View File

@ -17,13 +17,13 @@ var HTMLOperation = function(name, config, app, manager) {
this.name = name; this.name = name;
this.description = config.description; this.description = config.description;
this.manual_bake = config.manual_bake || false; this.manualBake = config.manualBake || false;
this.config = config; this.config = config;
this.ing_list = []; this.ingList = [];
for (var i = 0; i < config.args.length; i++) { for (var i = 0; i < config.args.length; i++) {
var ing = new HTMLIngredient(config.args[i], this.app, this.manager); var ing = new HTMLIngredient(config.args[i], this.app, this.manager);
this.ing_list.push(ing); this.ingList.push(ing);
} }
}; };
@ -43,7 +43,7 @@ HTMLOperation.REMOVE_ICON = "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABwkl
* *
* @returns {string} * @returns {string}
*/ */
HTMLOperation.prototype.to_stub_html = function(remove_icon) { HTMLOperation.prototype.toStubHtml = function(removeIcon) {
var html = "<li class='operation'"; var html = "<li class='operation'";
if (this.description) { if (this.description) {
@ -53,7 +53,7 @@ HTMLOperation.prototype.to_stub_html = function(remove_icon) {
html += ">" + this.name; html += ">" + this.name;
if (remove_icon) { if (removeIcon) {
html += "<img src='data:image/png;base64," + HTMLOperation.REMOVE_ICON + html += "<img src='data:image/png;base64," + HTMLOperation.REMOVE_ICON +
"' class='op-icon remove-icon'>"; "' class='op-icon remove-icon'>";
} }
@ -73,11 +73,11 @@ HTMLOperation.prototype.to_stub_html = function(remove_icon) {
* *
* @returns {string} * @returns {string}
*/ */
HTMLOperation.prototype.to_full_html = function() { HTMLOperation.prototype.toFullHtml = function() {
var html = "<div class='arg-title'>" + this.name + "</div>"; var html = "<div class='arg-title'>" + this.name + "</div>";
for (var i = 0; i < this.ing_list.length; i++) { for (var i = 0; i < this.ingList.length; i++) {
html += this.ing_list[i].to_html(); html += this.ingList[i].toHtml();
} }
html += "<div class='recip-icons'>\ html += "<div class='recip-icons'>\
@ -95,20 +95,20 @@ HTMLOperation.prototype.to_full_html = function() {
/** /**
* Highlights the searched string in the name and description of the operation. * Highlights the searched string in the name and description of the operation.
* *
* @param {string} search_str * @param {string} searchStr
* @param {number} name_pos - The position of the search string in the operation name * @param {number} namePos - The position of the search string in the operation name
* @param {number} desc_pos - The position of the search string in the operation description * @param {number} descPos - The position of the search string in the operation description
*/ */
HTMLOperation.prototype.highlight_search_string = function(search_str, name_pos, desc_pos) { HTMLOperation.prototype.highlightSearchString = function(searchStr, namePos, descPos) {
if (name_pos >= 0) { if (namePos >= 0) {
this.name = this.name.slice(0, name_pos) + "<b><u>" + this.name = this.name.slice(0, namePos) + "<b><u>" +
this.name.slice(name_pos, name_pos + search_str.length) + "</u></b>" + this.name.slice(namePos, namePos + searchStr.length) + "</u></b>" +
this.name.slice(name_pos + search_str.length); this.name.slice(namePos + searchStr.length);
} }
if (this.description && desc_pos >= 0) { if (this.description && descPos >= 0) {
this.description = this.description.slice(0, desc_pos) + "<b><u>" + this.description = this.description.slice(0, descPos) + "<b><u>" +
this.description.slice(desc_pos, desc_pos + search_str.length) + "</u></b>" + this.description.slice(descPos, descPos + searchStr.length) + "</u></b>" +
this.description.slice(desc_pos + search_str.length); this.description.slice(descPos + searchStr.length);
} }
}; };

View File

@ -11,8 +11,8 @@
var HighlighterWaiter = function(app) { var HighlighterWaiter = function(app) {
this.app = app; this.app = app;
this.mouse_button_down = false; this.mouseButtonDown = false;
this.mouse_target = null; this.mouseTarget = null;
}; };
@ -37,7 +37,7 @@ HighlighterWaiter.OUTPUT = 1;
* @private * @private
* @returns {boolean} * @returns {boolean}
*/ */
HighlighterWaiter.prototype._is_selection_backwards = function() { HighlighterWaiter.prototype._isSelectionBackwards = function() {
var backwards = false, var backwards = false,
sel = window.getSelection(); sel = window.getSelection();
@ -60,7 +60,7 @@ HighlighterWaiter.prototype._is_selection_backwards = function() {
* @param {number} offset - The offset since the last HTML element. * @param {number} offset - The offset since the last HTML element.
* @returns {number} * @returns {number}
*/ */
HighlighterWaiter.prototype._get_output_html_offset = function(node, offset) { HighlighterWaiter.prototype._getOutputHtmlOffset = function(node, offset) {
var sel = window.getSelection(), var sel = window.getSelection(),
range = document.createRange(); range = document.createRange();
@ -81,7 +81,7 @@ HighlighterWaiter.prototype._get_output_html_offset = function(node, offset) {
* @returns {number} pos.start * @returns {number} pos.start
* @returns {number} pos.end * @returns {number} pos.end
*/ */
HighlighterWaiter.prototype._get_output_html_selection_offsets = function() { HighlighterWaiter.prototype._getOutputHtmlSelectionOffsets = function() {
var sel = window.getSelection(), var sel = window.getSelection(),
range, range,
start = 0, start = 0,
@ -90,9 +90,9 @@ HighlighterWaiter.prototype._get_output_html_selection_offsets = function() {
if (sel.rangeCount) { if (sel.rangeCount) {
range = sel.getRangeAt(sel.rangeCount - 1); range = sel.getRangeAt(sel.rangeCount - 1);
backwards = this._is_selection_backwards(); backwards = this._isSelectionBackwards();
start = this._get_output_html_offset(range.startContainer, range.startOffset); start = this._getOutputHtmlOffset(range.startContainer, range.startOffset);
end = this._get_output_html_offset(range.endContainer, range.endOffset); end = this._getOutputHtmlOffset(range.endContainer, range.endOffset);
sel.removeAllRanges(); sel.removeAllRanges();
sel.addRange(range); sel.addRange(range);
@ -117,7 +117,7 @@ HighlighterWaiter.prototype._get_output_html_selection_offsets = function() {
* *
* @param {event} e * @param {event} e
*/ */
HighlighterWaiter.prototype.input_scroll = function(e) { HighlighterWaiter.prototype.inputScroll = function(e) {
var el = e.target; var el = e.target;
document.getElementById("input-highlighter").scrollTop = el.scrollTop; document.getElementById("input-highlighter").scrollTop = el.scrollTop;
document.getElementById("input-highlighter").scrollLeft = el.scrollLeft; document.getElementById("input-highlighter").scrollLeft = el.scrollLeft;
@ -130,7 +130,7 @@ HighlighterWaiter.prototype.input_scroll = function(e) {
* *
* @param {event} e * @param {event} e
*/ */
HighlighterWaiter.prototype.output_scroll = function(e) { HighlighterWaiter.prototype.outputScroll = function(e) {
var el = e.target; var el = e.target;
document.getElementById("output-highlighter").scrollTop = el.scrollTop; document.getElementById("output-highlighter").scrollTop = el.scrollTop;
document.getElementById("output-highlighter").scrollLeft = el.scrollLeft; document.getElementById("output-highlighter").scrollLeft = el.scrollLeft;
@ -143,18 +143,18 @@ HighlighterWaiter.prototype.output_scroll = function(e) {
* *
* @param {event} e * @param {event} e
*/ */
HighlighterWaiter.prototype.input_mousedown = function(e) { HighlighterWaiter.prototype.inputMousedown = function(e) {
this.mouse_button_down = true; this.mouseButtonDown = true;
this.mouse_target = HighlighterWaiter.INPUT; this.mouseTarget = HighlighterWaiter.INPUT;
this.remove_highlights(); this.removeHighlights();
var el = e.target, var el = e.target,
start = el.selectionStart, start = el.selectionStart,
end = el.selectionEnd; end = el.selectionEnd;
if (start !== 0 || end !== 0) { if (start !== 0 || end !== 0) {
document.getElementById("input-selection-info").innerHTML = this.selection_info(start, end); document.getElementById("input-selection-info").innerHTML = this.selectionInfo(start, end);
this.highlight_output([{start: start, end: end}]); this.highlightOutput([{start: start, end: end}]);
} }
}; };
@ -165,18 +165,18 @@ HighlighterWaiter.prototype.input_mousedown = function(e) {
* *
* @param {event} e * @param {event} e
*/ */
HighlighterWaiter.prototype.output_mousedown = function(e) { HighlighterWaiter.prototype.outputMousedown = function(e) {
this.mouse_button_down = true; this.mouseButtonDown = true;
this.mouse_target = HighlighterWaiter.OUTPUT; this.mouseTarget = HighlighterWaiter.OUTPUT;
this.remove_highlights(); this.removeHighlights();
var el = e.target, var el = e.target,
start = el.selectionStart, start = el.selectionStart,
end = el.selectionEnd; end = el.selectionEnd;
if (start !== 0 || end !== 0) { if (start !== 0 || end !== 0) {
document.getElementById("output-selection-info").innerHTML = this.selection_info(start, end); document.getElementById("output-selection-info").innerHTML = this.selectionInfo(start, end);
this.highlight_input([{start: start, end: end}]); this.highlightInput([{start: start, end: end}]);
} }
}; };
@ -187,13 +187,13 @@ HighlighterWaiter.prototype.output_mousedown = function(e) {
* *
* @param {event} e * @param {event} e
*/ */
HighlighterWaiter.prototype.output_html_mousedown = function(e) { HighlighterWaiter.prototype.outputHtmlMousedown = function(e) {
this.mouse_button_down = true; this.mouseButtonDown = true;
this.mouse_target = HighlighterWaiter.OUTPUT; this.mouseTarget = HighlighterWaiter.OUTPUT;
var sel = this._get_output_html_selection_offsets(); var sel = this._getOutputHtmlSelectionOffsets();
if (sel.start !== 0 || sel.end !== 0) { if (sel.start !== 0 || sel.end !== 0) {
document.getElementById("output-selection-info").innerHTML = this.selection_info(sel.start, sel.end); document.getElementById("output-selection-info").innerHTML = this.selectionInfo(sel.start, sel.end);
} }
}; };
@ -203,8 +203,8 @@ HighlighterWaiter.prototype.output_html_mousedown = function(e) {
* *
* @param {event} e * @param {event} e
*/ */
HighlighterWaiter.prototype.input_mouseup = function(e) { HighlighterWaiter.prototype.inputMouseup = function(e) {
this.mouse_button_down = false; this.mouseButtonDown = false;
}; };
@ -213,8 +213,8 @@ HighlighterWaiter.prototype.input_mouseup = function(e) {
* *
* @param {event} e * @param {event} e
*/ */
HighlighterWaiter.prototype.output_mouseup = function(e) { HighlighterWaiter.prototype.outputMouseup = function(e) {
this.mouse_button_down = false; this.mouseButtonDown = false;
}; };
@ -223,8 +223,8 @@ HighlighterWaiter.prototype.output_mouseup = function(e) {
* *
* @param {event} e * @param {event} e
*/ */
HighlighterWaiter.prototype.output_html_mouseup = function(e) { HighlighterWaiter.prototype.outputHtmlMouseup = function(e) {
this.mouse_button_down = false; this.mouseButtonDown = false;
}; };
@ -234,11 +234,11 @@ HighlighterWaiter.prototype.output_html_mouseup = function(e) {
* *
* @param {event} e * @param {event} e
*/ */
HighlighterWaiter.prototype.input_mousemove = function(e) { HighlighterWaiter.prototype.inputMousemove = function(e) {
// Check that the left mouse button is pressed // Check that the left mouse button is pressed
if (!this.mouse_button_down || if (!this.mouseButtonDown ||
e.which !== 1 || e.which !== 1 ||
this.mouse_target !== HighlighterWaiter.INPUT) this.mouseTarget !== HighlighterWaiter.INPUT)
return; return;
var el = e.target, var el = e.target,
@ -246,8 +246,8 @@ HighlighterWaiter.prototype.input_mousemove = function(e) {
end = el.selectionEnd; end = el.selectionEnd;
if (start !== 0 || end !== 0) { if (start !== 0 || end !== 0) {
document.getElementById("input-selection-info").innerHTML = this.selection_info(start, end); document.getElementById("input-selection-info").innerHTML = this.selectionInfo(start, end);
this.highlight_output([{start: start, end: end}]); this.highlightOutput([{start: start, end: end}]);
} }
}; };
@ -258,11 +258,11 @@ HighlighterWaiter.prototype.input_mousemove = function(e) {
* *
* @param {event} e * @param {event} e
*/ */
HighlighterWaiter.prototype.output_mousemove = function(e) { HighlighterWaiter.prototype.outputMousemove = function(e) {
// Check that the left mouse button is pressed // Check that the left mouse button is pressed
if (!this.mouse_button_down || if (!this.mouseButtonDown ||
e.which !== 1 || e.which !== 1 ||
this.mouse_target !== HighlighterWaiter.OUTPUT) this.mouseTarget !== HighlighterWaiter.OUTPUT)
return; return;
var el = e.target, var el = e.target,
@ -270,8 +270,8 @@ HighlighterWaiter.prototype.output_mousemove = function(e) {
end = el.selectionEnd; end = el.selectionEnd;
if (start !== 0 || end !== 0) { if (start !== 0 || end !== 0) {
document.getElementById("output-selection-info").innerHTML = this.selection_info(start, end); document.getElementById("output-selection-info").innerHTML = this.selectionInfo(start, end);
this.highlight_input([{start: start, end: end}]); this.highlightInput([{start: start, end: end}]);
} }
}; };
@ -282,16 +282,16 @@ HighlighterWaiter.prototype.output_mousemove = function(e) {
* *
* @param {event} e * @param {event} e
*/ */
HighlighterWaiter.prototype.output_html_mousemove = function(e) { HighlighterWaiter.prototype.outputHtmlMousemove = function(e) {
// Check that the left mouse button is pressed // Check that the left mouse button is pressed
if (!this.mouse_button_down || if (!this.mouseButtonDown ||
e.which !== 1 || e.which !== 1 ||
this.mouse_target !== HighlighterWaiter.OUTPUT) this.mouseTarget !== HighlighterWaiter.OUTPUT)
return; return;
var sel = this._get_output_html_selection_offsets(); var sel = this._getOutputHtmlSelectionOffsets();
if (sel.start !== 0 || sel.end !== 0) { if (sel.start !== 0 || sel.end !== 0) {
document.getElementById("output-selection-info").innerHTML = this.selection_info(sel.start, sel.end); document.getElementById("output-selection-info").innerHTML = this.selectionInfo(sel.start, sel.end);
} }
}; };
@ -304,21 +304,21 @@ HighlighterWaiter.prototype.output_html_mousemove = function(e) {
* @param {number} end - The end offset. * @param {number} end - The end offset.
* @returns {string} * @returns {string}
*/ */
HighlighterWaiter.prototype.selection_info = function(start, end) { HighlighterWaiter.prototype.selectionInfo = function(start, end) {
var width = end.toString().length; var width = end.toString().length;
width = width < 2 ? 2 : width; width = width < 2 ? 2 : width;
var start_str = Utils.pad(start.toString(), width, " ").replace(/ /g, "&nbsp;"), var startStr = Utils.pad(start.toString(), width, " ").replace(/ /g, "&nbsp;"),
end_str = Utils.pad(end.toString(), width, " ").replace(/ /g, "&nbsp;"), endStr = Utils.pad(end.toString(), width, " ").replace(/ /g, "&nbsp;"),
len_str = Utils.pad((end-start).toString(), width, " ").replace(/ /g, "&nbsp;"); lenStr = Utils.pad((end-start).toString(), width, " ").replace(/ /g, "&nbsp;");
return "start: " + start_str + "<br>end: " + end_str + "<br>length: " + len_str; return "start: " + startStr + "<br>end: " + endStr + "<br>length: " + lenStr;
}; };
/** /**
* Removes highlighting and selection information. * Removes highlighting and selection information.
*/ */
HighlighterWaiter.prototype.remove_highlights = function() { HighlighterWaiter.prototype.removeHighlights = function() {
document.getElementById("input-highlighter").innerHTML = ""; document.getElementById("input-highlighter").innerHTML = "";
document.getElementById("output-highlighter").innerHTML = ""; document.getElementById("output-highlighter").innerHTML = "";
document.getElementById("input-selection-info").innerHTML = ""; document.getElementById("input-selection-info").innerHTML = "";
@ -335,25 +335,25 @@ HighlighterWaiter.prototype.remove_highlights = function() {
* @returns {function} highlights[].b * @returns {function} highlights[].b
* @returns {Object[]} highlights[].args * @returns {Object[]} highlights[].args
*/ */
HighlighterWaiter.prototype.generate_highlight_list = function() { HighlighterWaiter.prototype.generateHighlightList = function() {
var recipe_config = this.app.get_recipe_config(), var recipeConfig = this.app.getRecipeConfig(),
highlights = []; highlights = [];
for (var i = 0; i < recipe_config.length; i++) { for (var i = 0; i < recipeConfig.length; i++) {
if (recipe_config[i].disabled) continue; if (recipeConfig[i].disabled) continue;
// If any breakpoints are set, do not attempt to highlight // If any breakpoints are set, do not attempt to highlight
if (recipe_config[i].breakpoint) return false; if (recipeConfig[i].breakpoint) return false;
var op = this.app.operations[recipe_config[i].op]; var op = this.app.operations[recipeConfig[i].op];
// If any of the operations do not support highlighting, fail immediately. // If any of the operations do not support highlighting, fail immediately.
if (op.highlight === false || op.highlight === undefined) return false; if (op.highlight === false || op.highlight === undefined) return false;
highlights.push({ highlights.push({
f: op.highlight, f: op.highlight,
b: op.highlight_reverse, b: op.highlightReverse,
args: recipe_config[i].args args: recipeConfig[i].args
}); });
} }
@ -372,10 +372,10 @@ HighlighterWaiter.prototype.generate_highlight_list = function() {
* @param {number} pos.start - The start offset. * @param {number} pos.start - The start offset.
* @param {number} pos.end - The end offset. * @param {number} pos.end - The end offset.
*/ */
HighlighterWaiter.prototype.highlight_output = function(pos) { HighlighterWaiter.prototype.highlightOutput = function(pos) {
var highlights = this.generate_highlight_list(); var highlights = this.generateHighlightList();
if (!highlights || !this.app.auto_bake_) { if (!highlights || !this.app.autoBake_) {
return false; return false;
} }
@ -388,7 +388,7 @@ HighlighterWaiter.prototype.highlight_output = function(pos) {
} }
} }
document.getElementById("output-selection-info").innerHTML = this.selection_info(pos[0].start, pos[0].end); document.getElementById("output-selection-info").innerHTML = this.selectionInfo(pos[0].start, pos[0].end);
this.highlight( this.highlight(
document.getElementById("output-text"), document.getElementById("output-text"),
document.getElementById("output-highlighter"), document.getElementById("output-highlighter"),
@ -407,10 +407,10 @@ HighlighterWaiter.prototype.highlight_output = function(pos) {
* @param {number} pos.start - The start offset. * @param {number} pos.start - The start offset.
* @param {number} pos.end - The end offset. * @param {number} pos.end - The end offset.
*/ */
HighlighterWaiter.prototype.highlight_input = function(pos) { HighlighterWaiter.prototype.highlightInput = function(pos) {
var highlights = this.generate_highlight_list(); var highlights = this.generateHighlightList();
if (!highlights || !this.app.auto_bake_) { if (!highlights || !this.app.autoBake_) {
return false; return false;
} }
@ -423,7 +423,7 @@ HighlighterWaiter.prototype.highlight_input = function(pos) {
} }
} }
document.getElementById("input-selection-info").innerHTML = this.selection_info(pos[0].start, pos[0].end); document.getElementById("input-selection-info").innerHTML = this.selectionInfo(pos[0].start, pos[0].end);
this.highlight( this.highlight(
document.getElementById("input-text"), document.getElementById("input-text"),
document.getElementById("input-highlighter"), document.getElementById("input-highlighter"),
@ -442,17 +442,17 @@ HighlighterWaiter.prototype.highlight_input = function(pos) {
* @param {number} pos.end - The end offset. * @param {number} pos.end - The end offset.
*/ */
HighlighterWaiter.prototype.highlight = function(textarea, highlighter, pos) { HighlighterWaiter.prototype.highlight = function(textarea, highlighter, pos) {
if (!this.app.options.show_highlighter) return false; if (!this.app.options.showHighlighter) return false;
if (!this.app.options.attempt_highlight) return false; if (!this.app.options.attemptHighlight) return false;
// Check if there is a carriage return in the output dish as this will not // Check if there is a carriage return in the output dish as this will not
// be displayed by the HTML textarea and will mess up highlighting offsets. // be displayed by the HTML textarea and will mess up highlighting offsets.
if (!this.app.dish_str || this.app.dish_str.indexOf("\r") >= 0) return false; if (!this.app.dishStr || this.app.dishStr.indexOf("\r") >= 0) return false;
var start_placeholder = "[start_highlight]", var startPlaceholder = "[startHighlight]",
start_placeholder_regex = /\[start_highlight\]/g, startPlaceholderRegex = /\[startHighlight\]/g,
end_placeholder = "[end_highlight]", endPlaceholder = "[endHighlight]",
end_placeholder_regex = /\[end_highlight\]/g, endPlaceholderRegex = /\[endHighlight\]/g,
text = textarea.value; text = textarea.value;
// Put placeholders in position // Put placeholders in position
@ -461,33 +461,33 @@ HighlighterWaiter.prototype.highlight = function(textarea, highlighter, pos) {
if (pos.length === 1) { if (pos.length === 1) {
if (pos[0].end < pos[0].start) return; if (pos[0].end < pos[0].start) return;
text = text.slice(0, pos[0].start) + text = text.slice(0, pos[0].start) +
start_placeholder + text.slice(pos[0].start, pos[0].end) + end_placeholder + startPlaceholder + text.slice(pos[0].start, pos[0].end) + endPlaceholder +
text.slice(pos[0].end, text.length); text.slice(pos[0].end, text.length);
} else { } else {
// O(n^2) - Can anyone improve this without overwriting placeholders? // O(n^2) - Can anyone improve this without overwriting placeholders?
var result = "", var result = "",
end_placed = true; endPlaced = true;
for (var i = 0; i < text.length; i++) { for (var i = 0; i < text.length; i++) {
for (var j = 1; j < pos.length; j++) { for (var j = 1; j < pos.length; j++) {
if (pos[j].end < pos[j].start) continue; if (pos[j].end < pos[j].start) continue;
if (pos[j].start === i) { if (pos[j].start === i) {
result += start_placeholder; result += startPlaceholder;
end_placed = false; endPlaced = false;
} }
if (pos[j].end === i) { if (pos[j].end === i) {
result += end_placeholder; result += endPlaceholder;
end_placed = true; endPlaced = true;
} }
} }
result += text[i]; result += text[i];
} }
if (!end_placed) result += end_placeholder; if (!endPlaced) result += endPlaceholder;
text = result; text = result;
} }
var css_class = "hl1"; var cssClass = "hl1";
//if (colour) css_class += "-"+colour; //if (colour) cssClass += "-"+colour;
// Remove HTML tags // Remove HTML tags
text = text.replace(/&/g, "&amp;") text = text.replace(/&/g, "&amp;")
@ -495,8 +495,8 @@ HighlighterWaiter.prototype.highlight = function(textarea, highlighter, pos) {
.replace(/>/g, "&gt;") .replace(/>/g, "&gt;")
.replace(/\n/g, "&#10;") .replace(/\n/g, "&#10;")
// Convert placeholders to tags // Convert placeholders to tags
.replace(start_placeholder_regex, "<span class=\""+css_class+"\">") .replace(startPlaceholderRegex, "<span class=\""+cssClass+"\">")
.replace(end_placeholder_regex, "</span>") + "&nbsp;"; .replace(endPlaceholderRegex, "</span>") + "&nbsp;";
// Adjust width to allow for scrollbars // Adjust width to allow for scrollbars
highlighter.style.width = textarea.clientWidth + "px"; highlighter.style.width = textarea.clientWidth + "px";

View File

@ -14,7 +14,7 @@ var InputWaiter = function(app, manager) {
this.manager = manager; this.manager = manager;
// Define keys that don't change the input so we don't have to autobake when they are pressed // Define keys that don't change the input so we don't have to autobake when they are pressed
this.bad_keys = [ this.badKeys = [
16, //Shift 16, //Shift
17, //Ctrl 17, //Ctrl
18, //Alt 18, //Alt
@ -62,14 +62,14 @@ InputWaiter.prototype.set = function(input) {
* @param {number} length - The length of the current input string * @param {number} length - The length of the current input string
* @param {number} lines - The number of the lines in the current input string * @param {number} lines - The number of the lines in the current input string
*/ */
InputWaiter.prototype.set_input_info = function(length, lines) { InputWaiter.prototype.setInputInfo = function(length, lines) {
var width = length.toString().length; var width = length.toString().length;
width = width < 2 ? 2 : width; width = width < 2 ? 2 : width;
var length_str = Utils.pad(length.toString(), width, " ").replace(/ /g, "&nbsp;"); var lengthStr = Utils.pad(length.toString(), width, " ").replace(/ /g, "&nbsp;");
var lines_str = Utils.pad(lines.toString(), width, " ").replace(/ /g, "&nbsp;"); var linesStr = Utils.pad(lines.toString(), width, " ").replace(/ /g, "&nbsp;");
document.getElementById("input-info").innerHTML = "length: " + length_str + "<br>lines: " + lines_str; document.getElementById("input-info").innerHTML = "length: " + lengthStr + "<br>lines: " + linesStr;
}; };
@ -81,21 +81,21 @@ InputWaiter.prototype.set_input_info = function(length, lines) {
* *
* @fires Manager#statechange * @fires Manager#statechange
*/ */
InputWaiter.prototype.input_change = function(e) { InputWaiter.prototype.inputChange = function(e) {
// 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.remove_highlights(); this.manager.highlighter.removeHighlights();
// Reset recipe progress as any previous processing will be redundant now // Reset recipe progress as any previous processing will be redundant now
this.app.progress = 0; this.app.progress = 0;
// Update the input metadata info // Update the input metadata info
var input_text = this.get(), var inputText = this.get(),
lines = input_text.count("\n") + 1; lines = inputText.count("\n") + 1;
this.set_input_info(input_text.length, lines); this.setInputInfo(inputText.length, lines);
if (this.bad_keys.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);
} }
@ -108,7 +108,7 @@ InputWaiter.prototype.input_change = function(e) {
* *
* @param {event} e * @param {event} e
*/ */
InputWaiter.prototype.input_dragover = function(e) { InputWaiter.prototype.inputDragover = function(e) {
// This will be set if we're dragging an operation // This will be set if we're dragging an operation
if (e.dataTransfer.effectAllowed === "move") if (e.dataTransfer.effectAllowed === "move")
return false; return false;
@ -125,7 +125,7 @@ InputWaiter.prototype.input_dragover = function(e) {
* *
* @param {event} e * @param {event} e
*/ */
InputWaiter.prototype.input_dragleave = function(e) { InputWaiter.prototype.inputDragleave = function(e) {
e.stopPropagation(); e.stopPropagation();
e.preventDefault(); e.preventDefault();
e.target.classList.remove("dropping-file"); e.target.classList.remove("dropping-file");
@ -138,7 +138,7 @@ InputWaiter.prototype.input_dragleave = function(e) {
* *
* @param {event} e * @param {event} e
*/ */
InputWaiter.prototype.input_drop = function(e) { InputWaiter.prototype.inputDrop = function(e) {
// This will be set if we're dragging an operation // This will be set if we're dragging an operation
if (e.dataTransfer.effectAllowed === "move") if (e.dataTransfer.effectAllowed === "move")
return false; return false;
@ -150,29 +150,29 @@ InputWaiter.prototype.input_drop = function(e) {
file = e.dataTransfer.files[0], file = e.dataTransfer.files[0],
text = e.dataTransfer.getData("Text"), text = e.dataTransfer.getData("Text"),
reader = new FileReader(), reader = new FileReader(),
input_charcode = "", inputCharcode = "",
offset = 0, offset = 0,
CHUNK_SIZE = 20480; // 20KB CHUNK_SIZE = 20480; // 20KB
var set_input = function() { var setInput = function() {
if (input_charcode.length > 100000 && this.app.auto_bake_) { if (inputCharcode.length > 100000 && this.app.autoBake_) {
this.manager.controls.set_auto_bake(false); this.manager.controls.setAutoBake(false);
this.app.alert("Turned off Auto Bake as the input is large", "warning", 5000); this.app.alert("Turned off Auto Bake as the input is large", "warning", 5000);
} }
this.set(input_charcode); this.set(inputCharcode);
var recipe_config = this.app.get_recipe_config(); var recipeConfig = this.app.getRecipeConfig();
if (!recipe_config[0] || recipe_config[0].op !== "From Hex") { if (!recipeConfig[0] || recipeConfig[0].op !== "From Hex") {
recipe_config.unshift({op:"From Hex", args:["Space"]}); recipeConfig.unshift({op:"From Hex", args:["Space"]});
this.app.set_recipe_config(recipe_config); this.app.setRecipeConfig(recipeConfig);
} }
el.classList.remove("loading_file"); el.classList.remove("loadingFile");
}.bind(this); }.bind(this);
var seek = function() { var seek = function() {
if (offset >= file.size) { if (offset >= file.size) {
set_input(); setInput();
return; return;
} }
el.value = "Processing... " + Math.round(offset / file.size * 100) + "%"; el.value = "Processing... " + Math.round(offset / file.size * 100) + "%";
@ -182,7 +182,7 @@ InputWaiter.prototype.input_drop = function(e) {
reader.onload = function(e) { reader.onload = function(e) {
var data = new Uint8Array(reader.result); var data = new Uint8Array(reader.result);
input_charcode += Utils.to_hex_fast(data); inputCharcode += Utils.toHexFast(data);
offset += CHUNK_SIZE; offset += CHUNK_SIZE;
seek(); seek();
}; };
@ -191,7 +191,7 @@ InputWaiter.prototype.input_drop = function(e) {
el.classList.remove("dropping-file"); el.classList.remove("dropping-file");
if (file) { if (file) {
el.classList.add("loading_file"); el.classList.add("loadingFile");
seek(); seek();
} else if (text) { } else if (text) {
this.set(text); this.set(text);
@ -205,8 +205,8 @@ InputWaiter.prototype.input_drop = function(e) {
* *
* @fires Manager#statechange * @fires Manager#statechange
*/ */
InputWaiter.prototype.clear_io_click = function() { InputWaiter.prototype.clearIoClick = function() {
this.manager.highlighter.remove_highlights(); this.manager.highlighter.removeHighlights();
document.getElementById("input-text").value = ""; document.getElementById("input-text").value = "";
document.getElementById("output-text").value = ""; document.getElementById("output-text").value = "";
document.getElementById("input-info").innerHTML = ""; document.getElementById("input-info").innerHTML = "";

View File

@ -45,9 +45,9 @@ var Manager = function(app) {
this.seasonal = new SeasonalWaiter(this.app, this); this.seasonal = new SeasonalWaiter(this.app, this);
// Object to store dynamic handlers to fire on elements that may not exist yet // Object to store dynamic handlers to fire on elements that may not exist yet
this.dynamic_handlers = {}; this.dynamicHandlers = {};
this.initialise_event_listeners(); this.initialiseEventListeners();
}; };
@ -55,8 +55,8 @@ var Manager = function(app) {
* Sets up the various components and listeners. * Sets up the various components and listeners.
*/ */
Manager.prototype.setup = function() { Manager.prototype.setup = function() {
this.recipe.initialise_operation_drag_n_drop(); this.recipe.initialiseOperationDragNDrop();
this.controls.auto_bake_change(); this.controls.autoBakeChange();
this.seasonal.load(); this.seasonal.load();
}; };
@ -64,86 +64,87 @@ Manager.prototype.setup = function() {
/** /**
* Main function to handle the creation of the event listeners. * Main function to handle the creation of the event listeners.
*/ */
Manager.prototype.initialise_event_listeners = function() { Manager.prototype.initialiseEventListeners = function() {
// Global // Global
window.addEventListener("resize", this.window.window_resize.bind(this.window)); window.addEventListener("resize", this.window.windowResize.bind(this.window));
window.addEventListener("blur", this.window.window_blur.bind(this.window)); window.addEventListener("blur", this.window.windowBlur.bind(this.window));
window.addEventListener("focus", this.window.window_focus.bind(this.window)); window.addEventListener("focus", this.window.windowFocus.bind(this.window));
window.addEventListener("statechange", this.app.state_change.bind(this.app)); window.addEventListener("statechange", this.app.stateChange.bind(this.app));
window.addEventListener("popstate", this.app.pop_state.bind(this.app)); window.addEventListener("popstate", this.app.popState.bind(this.app));
// Controls // Controls
document.getElementById("bake").addEventListener("click", this.controls.bake_click.bind(this.controls)); document.getElementById("bake").addEventListener("click", this.controls.bakeClick.bind(this.controls));
document.getElementById("auto-bake").addEventListener("change", this.controls.auto_bake_change.bind(this.controls)); document.getElementById("auto-bake").addEventListener("change", this.controls.autoBakeChange.bind(this.controls));
document.getElementById("step").addEventListener("click", this.controls.step_click.bind(this.controls)); document.getElementById("step").addEventListener("click", this.controls.stepClick.bind(this.controls));
document.getElementById("clr-recipe").addEventListener("click", this.controls.clear_recipe_click.bind(this.controls)); document.getElementById("clr-recipe").addEventListener("click", this.controls.clearRecipeClick.bind(this.controls));
document.getElementById("clr-breaks").addEventListener("click", this.controls.clear_breaks_click.bind(this.controls)); document.getElementById("clr-breaks").addEventListener("click", this.controls.clearBreaksClick.bind(this.controls));
document.getElementById("save").addEventListener("click", this.controls.save_click.bind(this.controls)); document.getElementById("save").addEventListener("click", this.controls.saveClick.bind(this.controls));
document.getElementById("save-button").addEventListener("click", this.controls.save_button_click.bind(this.controls)); document.getElementById("save-button").addEventListener("click", this.controls.saveButtonClick.bind(this.controls));
document.getElementById("save-link-recipe-checkbox").addEventListener("change", this.controls.slr_check_change.bind(this.controls)); document.getElementById("save-link-recipe-checkbox").addEventListener("change", this.controls.slrCheckChange.bind(this.controls));
document.getElementById("save-link-input-checkbox").addEventListener("change", this.controls.sli_check_change.bind(this.controls)); document.getElementById("save-link-input-checkbox").addEventListener("change", this.controls.sliCheckChange.bind(this.controls));
document.getElementById("load").addEventListener("click", this.controls.load_click.bind(this.controls)); document.getElementById("load").addEventListener("click", this.controls.loadClick.bind(this.controls));
document.getElementById("load-delete-button").addEventListener("click", this.controls.load_delete_click.bind(this.controls)); document.getElementById("load-delete-button").addEventListener("click", this.controls.loadDeleteClick.bind(this.controls));
document.getElementById("load-name").addEventListener("change", this.controls.load_name_change.bind(this.controls)); document.getElementById("load-name").addEventListener("change", this.controls.loadNameChange.bind(this.controls));
document.getElementById("load-button").addEventListener("click", this.controls.load_button_click.bind(this.controls)); document.getElementById("load-button").addEventListener("click", this.controls.loadButtonClick.bind(this.controls));
this.add_multi_event_listener("#save-text", "keyup paste", this.controls.save_text_change, this.controls); this.addMultiEventListener("#save-text", "keyup paste", this.controls.saveTextChange, this.controls);
// Operations // Operations
this.add_multi_event_listener("#search", "keyup paste search", this.ops.search_operations, this.ops); this.addMultiEventListener("#search", "keyup paste search", this.ops.searchOperations, this.ops);
this.add_dynamic_listener(".op_list li.operation", "dblclick", this.ops.operation_dblclick, this.ops); this.addDynamicListener(".op-list li.operation", "dblclick", this.ops.operationDblclick, this.ops);
document.getElementById("edit-favourites").addEventListener("click", this.ops.edit_favourites_click.bind(this.ops)); document.getElementById("edit-favourites").addEventListener("click", this.ops.editFavouritesClick.bind(this.ops));
document.getElementById("save-favourites").addEventListener("click", this.ops.save_favourites_click.bind(this.ops)); document.getElementById("save-favourites").addEventListener("click", this.ops.saveFavouritesClick.bind(this.ops));
document.getElementById("reset-favourites").addEventListener("click", this.ops.reset_favourites_click.bind(this.ops)); document.getElementById("reset-favourites").addEventListener("click", this.ops.resetFavouritesClick.bind(this.ops));
this.add_dynamic_listener(".op_list .op-icon", "mouseover", this.ops.op_icon_mouseover, this.ops); this.addDynamicListener(".op-list .op-icon", "mouseover", this.ops.opIconMouseover, this.ops);
this.add_dynamic_listener(".op_list .op-icon", "mouseleave", this.ops.op_icon_mouseleave, this.ops); this.addDynamicListener(".op-list .op-icon", "mouseleave", this.ops.opIconMouseleave, this.ops);
this.add_dynamic_listener(".op_list", "oplistcreate", this.ops.op_list_create, this.ops); this.addDynamicListener(".op-list", "oplistcreate", this.ops.opListCreate, this.ops);
this.add_dynamic_listener("li.operation", "operationadd", this.recipe.op_add.bind(this.recipe)); this.addDynamicListener("li.operation", "operationadd", this.recipe.opAdd.bind(this.recipe));
// Recipe // Recipe
this.add_dynamic_listener(".arg", "keyup", this.recipe.ing_change, this.recipe); this.addDynamicListener(".arg", "keyup", this.recipe.ingChange, this.recipe);
this.add_dynamic_listener(".arg", "change", this.recipe.ing_change, this.recipe); this.addDynamicListener(".arg", "change", this.recipe.ingChange, this.recipe);
this.add_dynamic_listener(".disable-icon", "click", this.recipe.disable_click, this.recipe); this.addDynamicListener(".disable-icon", "click", this.recipe.disableClick, this.recipe);
this.add_dynamic_listener(".breakpoint", "click", this.recipe.breakpoint_click, this.recipe); this.addDynamicListener(".breakpoint", "click", this.recipe.breakpointClick, this.recipe);
this.add_dynamic_listener("#rec_list li.operation", "dblclick", this.recipe.operation_dblclick, this.recipe); this.addDynamicListener("#rec-list li.operation", "dblclick", this.recipe.operationDblclick, this.recipe);
this.add_dynamic_listener("#rec_list li.operation > div", "dblclick", this.recipe.operation_child_dblclick, this.recipe); this.addDynamicListener("#rec-list li.operation > div", "dblclick", this.recipe.operationChildDblclick, this.recipe);
this.add_dynamic_listener("#rec_list .input-group .dropdown-menu a", "click", this.recipe.dropdown_toggle_click, this.recipe); this.addDynamicListener("#rec-list .input-group .dropdown-menu a", "click", this.recipe.dropdownToggleClick, this.recipe);
this.add_dynamic_listener("#rec_list", "operationremove", this.recipe.op_remove.bind(this.recipe)); this.addDynamicListener("#rec-list", "operationremove", this.recipe.opRemove.bind(this.recipe));
// Input // Input
this.add_multi_event_listener("#input-text", "keyup paste", this.input.input_change, this.input); this.addMultiEventListener("#input-text", "keyup paste", this.input.inputChange, this.input);
document.getElementById("reset-layout").addEventListener("click", this.app.reset_layout.bind(this.app)); document.getElementById("reset-layout").addEventListener("click", this.app.resetLayout.bind(this.app));
document.getElementById("clr-io").addEventListener("click", this.input.clear_io_click.bind(this.input)); document.getElementById("clr-io").addEventListener("click", this.input.clearIoClick.bind(this.input));
document.getElementById("input-text").addEventListener("dragover", this.input.input_dragover.bind(this.input)); document.getElementById("input-text").addEventListener("dragover", this.input.inputDragover.bind(this.input));
document.getElementById("input-text").addEventListener("dragleave", this.input.input_dragleave.bind(this.input)); document.getElementById("input-text").addEventListener("dragleave", this.input.inputDragleave.bind(this.input));
document.getElementById("input-text").addEventListener("drop", this.input.input_drop.bind(this.input)); document.getElementById("input-text").addEventListener("drop", this.input.inputDrop.bind(this.input));
document.getElementById("input-text").addEventListener("scroll", this.highlighter.input_scroll.bind(this.highlighter)); document.getElementById("input-text").addEventListener("scroll", this.highlighter.inputScroll.bind(this.highlighter));
document.getElementById("input-text").addEventListener("mouseup", this.highlighter.input_mouseup.bind(this.highlighter)); document.getElementById("input-text").addEventListener("mouseup", this.highlighter.inputMouseup.bind(this.highlighter));
document.getElementById("input-text").addEventListener("mousemove", this.highlighter.input_mousemove.bind(this.highlighter)); document.getElementById("input-text").addEventListener("mousemove", this.highlighter.inputMousemove.bind(this.highlighter));
this.add_multi_event_listener("#input-text", "mousedown dblclick select", this.highlighter.input_mousedown, this.highlighter); this.addMultiEventListener("#input-text", "mousedown dblclick select", this.highlighter.inputMousedown, this.highlighter);
// Output // Output
document.getElementById("save-to-file").addEventListener("click", this.output.save_click.bind(this.output)); document.getElementById("save-to-file").addEventListener("click", this.output.saveClick.bind(this.output));
document.getElementById("switch").addEventListener("click", this.output.switch_click.bind(this.output)); document.getElementById("switch").addEventListener("click", this.output.switchClick.bind(this.output));
document.getElementById("undo-switch").addEventListener("click", this.output.undo_switch_click.bind(this.output)); document.getElementById("undo-switch").addEventListener("click", this.output.undoSwitchClick.bind(this.output));
document.getElementById("output-text").addEventListener("scroll", this.highlighter.output_scroll.bind(this.highlighter)); document.getElementById("maximise-output").addEventListener("click", this.output.maximiseOutputClick.bind(this.output));
document.getElementById("output-text").addEventListener("mouseup", this.highlighter.output_mouseup.bind(this.highlighter)); document.getElementById("output-text").addEventListener("scroll", this.highlighter.outputScroll.bind(this.highlighter));
document.getElementById("output-text").addEventListener("mousemove", this.highlighter.output_mousemove.bind(this.highlighter)); document.getElementById("output-text").addEventListener("mouseup", this.highlighter.outputMouseup.bind(this.highlighter));
document.getElementById("output-html").addEventListener("mouseup", this.highlighter.output_html_mouseup.bind(this.highlighter)); document.getElementById("output-text").addEventListener("mousemove", this.highlighter.outputMousemove.bind(this.highlighter));
document.getElementById("output-html").addEventListener("mousemove", this.highlighter.output_html_mousemove.bind(this.highlighter)); document.getElementById("output-html").addEventListener("mouseup", this.highlighter.outputHtmlMouseup.bind(this.highlighter));
this.add_multi_event_listener("#output-text", "mousedown dblclick select", this.highlighter.output_mousedown, this.highlighter); document.getElementById("output-html").addEventListener("mousemove", this.highlighter.outputHtmlMousemove.bind(this.highlighter));
this.add_multi_event_listener("#output-html", "mousedown dblclick select", this.highlighter.output_html_mousedown, this.highlighter); this.addMultiEventListener("#output-text", "mousedown dblclick select", this.highlighter.outputMousedown, this.highlighter);
this.addMultiEventListener("#output-html", "mousedown dblclick select", this.highlighter.outputHtmlMousedown, this.highlighter);
// Options // Options
document.getElementById("options").addEventListener("click", this.options.options_click.bind(this.options)); document.getElementById("options").addEventListener("click", this.options.optionsClick.bind(this.options));
document.getElementById("reset-options").addEventListener("click", this.options.reset_options_click.bind(this.options)); document.getElementById("reset-options").addEventListener("click", this.options.resetOptionsClick.bind(this.options));
$(document).on("switchChange.bootstrapSwitch", ".option-item input:checkbox", this.options.switch_change.bind(this.options)); $(document).on("switchChange.bootstrapSwitch", ".option-item input:checkbox", this.options.switchChange.bind(this.options));
$(document).on("switchChange.bootstrapSwitch", ".option-item input:checkbox", this.options.set_word_wrap.bind(this.options)); $(document).on("switchChange.bootstrapSwitch", ".option-item input:checkbox", this.options.setWordWrap.bind(this.options));
this.add_dynamic_listener(".option-item input[type=number]", "keyup", this.options.number_change, this.options); this.addDynamicListener(".option-item input[type=number]", "keyup", this.options.numberChange, this.options);
this.add_dynamic_listener(".option-item input[type=number]", "change", this.options.number_change, this.options); this.addDynamicListener(".option-item input[type=number]", "change", this.options.numberChange, this.options);
this.add_dynamic_listener(".option-item select", "change", this.options.select_change, this.options); this.addDynamicListener(".option-item select", "change", this.options.selectChange, this.options);
// Misc // Misc
document.getElementById("alert-close").addEventListener("click", this.app.alert_close_click.bind(this.app)); document.getElementById("alert-close").addEventListener("click", this.app.alertCloseClick.bind(this.app));
}; };
@ -151,19 +152,19 @@ Manager.prototype.initialise_event_listeners = function() {
* Adds an event listener to each element in the specified group. * Adds an event listener to each element in the specified group.
* *
* @param {string} selector - A selector string for the element group to add the event to, see * @param {string} selector - A selector string for the element group to add the event to, see
* this.get_all() * this.getAll()
* @param {string} event_type - The event to listen for * @param {string} eventType - The event to listen for
* @param {function} callback - The function to execute when the event is triggered * @param {function} callback - The function to execute when the event is triggered
* @param {Object} [scope=this] - The object to bind to the callback function * @param {Object} [scope=this] - The object to bind to the callback function
* *
* @example * @example
* // Calls the clickable function whenever any element with the .clickable class is clicked * // Calls the clickable function whenever any element with the .clickable class is clicked
* this.add_listeners(".clickable", "click", this.clickable, this); * this.addListeners(".clickable", "click", this.clickable, this);
*/ */
Manager.prototype.add_listeners = function(selector, event_type, callback, scope) { Manager.prototype.addListeners = function(selector, eventType, callback, scope) {
scope = scope || this; scope = scope || this;
[].forEach.call(document.querySelectorAll(selector), function(el) { [].forEach.call(document.querySelectorAll(selector), function(el) {
el.addEventListener(event_type, callback.bind(scope)); el.addEventListener(eventType, callback.bind(scope));
}); });
}; };
@ -172,17 +173,17 @@ Manager.prototype.add_listeners = function(selector, event_type, callback, scope
* Adds multiple event listeners to the specified element. * Adds multiple event listeners to the specified element.
* *
* @param {string} selector - A selector string for the element to add the events to * @param {string} selector - A selector string for the element to add the events to
* @param {string} event_types - A space-separated string of all the event types to listen for * @param {string} eventTypes - A space-separated string of all the event types to listen for
* @param {function} callback - The function to execute when the events are triggered * @param {function} callback - The function to execute when the events are triggered
* @param {Object} [scope=this] - The object to bind to the callback function * @param {Object} [scope=this] - The object to bind to the callback function
* *
* @example * @example
* // Calls the search function whenever the the keyup, paste or search events are triggered on the * // Calls the search function whenever the the keyup, paste or search events are triggered on the
* // search element * // search element
* this.add_multi_event_listener("search", "keyup paste search", this.search, this); * this.addMultiEventListener("search", "keyup paste search", this.search, this);
*/ */
Manager.prototype.add_multi_event_listener = function(selector, event_types, callback, scope) { Manager.prototype.addMultiEventListener = function(selector, eventTypes, callback, scope) {
var evs = event_types.split(" "); var evs = eventTypes.split(" ");
for (var i = 0; i < evs.length; i++) { for (var i = 0; i < evs.length; i++) {
document.querySelector(selector).addEventListener(evs[i], callback.bind(scope)); document.querySelector(selector).addEventListener(evs[i], callback.bind(scope));
} }
@ -193,19 +194,19 @@ Manager.prototype.add_multi_event_listener = function(selector, event_types, cal
* Adds multiple event listeners to each element in the specified group. * Adds multiple event listeners to each element in the specified group.
* *
* @param {string} selector - A selector string for the element group to add the events to * @param {string} selector - A selector string for the element group to add the events to
* @param {string} event_types - A space-separated string of all the event types to listen for * @param {string} eventTypes - A space-separated string of all the event types to listen for
* @param {function} callback - The function to execute when the events are triggered * @param {function} callback - The function to execute when the events are triggered
* @param {Object} [scope=this] - The object to bind to the callback function * @param {Object} [scope=this] - The object to bind to the callback function
* *
* @example * @example
* // Calls the save function whenever the the keyup or paste events are triggered on any element * // Calls the save function whenever the the keyup or paste events are triggered on any element
* // with the .saveable class * // with the .saveable class
* this.add_multi_event_listener(".saveable", "keyup paste", this.save, this); * this.addMultiEventListener(".saveable", "keyup paste", this.save, this);
*/ */
Manager.prototype.add_multi_event_listeners = function(selector, event_types, callback, scope) { Manager.prototype.addMultiEventListeners = function(selector, eventTypes, callback, scope) {
var evs = event_types.split(" "); var evs = eventTypes.split(" ");
for (var i = 0; i < evs.length; i++) { for (var i = 0; i < evs.length; i++) {
this.add_listeners(selector, evs[i], callback, scope); this.addListeners(selector, evs[i], callback, scope);
} }
}; };
@ -215,28 +216,28 @@ Manager.prototype.add_multi_event_listeners = function(selector, event_types, ca
* may not exist in the DOM yet. * may not exist in the DOM yet.
* *
* @param {string} selector - A selector string for the element(s) to add the event to * @param {string} selector - A selector string for the element(s) to add the event to
* @param {string} event_type - The event(s) to listen for * @param {string} eventType - The event(s) to listen for
* @param {function} callback - The function to execute when the event(s) is/are triggered * @param {function} callback - The function to execute when the event(s) is/are triggered
* @param {Object} [scope=this] - The object to bind to the callback function * @param {Object} [scope=this] - The object to bind to the callback function
* *
* @example * @example
* // Pops up an alert whenever any button is clicked, even if it is added to the DOM after this * // Pops up an alert whenever any button is clicked, even if it is added to the DOM after this
* // listener is created * // listener is created
* this.add_dynamic_listener("button", "click", alert, this); * this.addDynamicListener("button", "click", alert, this);
*/ */
Manager.prototype.add_dynamic_listener = function(selector, event_type, callback, scope) { Manager.prototype.addDynamicListener = function(selector, eventType, callback, scope) {
var event_config = { var eventConfig = {
selector: selector, selector: selector,
callback: callback.bind(scope || this) callback: callback.bind(scope || this)
}; };
if (this.dynamic_handlers.hasOwnProperty(event_type)) { if (this.dynamicHandlers.hasOwnProperty(eventType)) {
// Listener already exists, add new handler to the appropriate list // Listener already exists, add new handler to the appropriate list
this.dynamic_handlers[event_type].push(event_config); this.dynamicHandlers[eventType].push(eventConfig);
} else { } else {
this.dynamic_handlers[event_type] = [event_config]; this.dynamicHandlers[eventType] = [eventConfig];
// Set up listener for this new type // Set up listener for this new type
document.addEventListener(event_type, this.dynamic_listener_handler.bind(this)); document.addEventListener(eventType, this.dynamicListenerHandler.bind(this));
} }
}; };
@ -247,8 +248,8 @@ Manager.prototype.add_dynamic_listener = function(selector, event_type, callback
* *
* @param {Event} e - The event to be handled * @param {Event} e - The event to be handled
*/ */
Manager.prototype.dynamic_listener_handler = function(e) { Manager.prototype.dynamicListenerHandler = function(e) {
var handlers = this.dynamic_handlers[e.type], var handlers = this.dynamicHandlers[e.type],
matches = e.target.matches || matches = e.target.matches ||
e.target.webkitMatchesSelector || e.target.webkitMatchesSelector ||
e.target.mozMatchesSelector || e.target.mozMatchesSelector ||

View File

@ -16,7 +16,7 @@ var OperationsWaiter = function(app, manager) {
this.manager = manager; this.manager = manager;
this.options = {}; this.options = {};
this.remove_intent = false; this.removeIntent = false;
}; };
@ -26,17 +26,17 @@ var OperationsWaiter = function(app, manager) {
* *
* @param {event} e * @param {event} e
*/ */
OperationsWaiter.prototype.search_operations = function(e) { OperationsWaiter.prototype.searchOperations = function(e) {
var ops, selected; var ops, selected;
if (e.type === "search") { // Search if (e.type === "search") { // Search
e.preventDefault(); e.preventDefault();
ops = document.querySelectorAll("#search-results li"); ops = document.querySelectorAll("#search-results li");
if (ops.length) { if (ops.length) {
selected = this.get_selected_op(ops); selected = this.getSelectedOp(ops);
if (selected > -1) { if (selected > -1) {
this.manager.recipe.add_operation(ops[selected].innerHTML); this.manager.recipe.addOperation(ops[selected].innerHTML);
this.app.auto_bake(); this.app.autoBake();
} }
} }
} }
@ -47,7 +47,7 @@ OperationsWaiter.prototype.search_operations = function(e) {
e.preventDefault(); e.preventDefault();
ops = document.querySelectorAll("#search-results li"); ops = document.querySelectorAll("#search-results li");
if (ops.length) { if (ops.length) {
selected = this.get_selected_op(ops); selected = this.getSelectedOp(ops);
if (selected > -1) { if (selected > -1) {
ops[selected].classList.remove("selected-op"); ops[selected].classList.remove("selected-op");
} }
@ -58,7 +58,7 @@ OperationsWaiter.prototype.search_operations = function(e) {
e.preventDefault(); e.preventDefault();
ops = document.querySelectorAll("#search-results li"); ops = document.querySelectorAll("#search-results li");
if (ops.length) { if (ops.length) {
selected = this.get_selected_op(ops); selected = this.getSelectedOp(ops);
if (selected > -1) { if (selected > -1) {
ops[selected].classList.remove("selected-op"); ops[selected].classList.remove("selected-op");
} }
@ -66,26 +66,26 @@ OperationsWaiter.prototype.search_operations = function(e) {
ops[selected-1].classList.add("selected-op"); ops[selected-1].classList.add("selected-op");
} }
} else { } else {
var search_results_el = document.getElementById("search-results"), var searchResultsEl = document.getElementById("search-results"),
el = e.target, el = e.target,
str = el.value; str = el.value;
while (search_results_el.firstChild) { while (searchResultsEl.firstChild) {
$(search_results_el.firstChild).popover("destroy"); $(searchResultsEl.firstChild).popover("destroy");
search_results_el.removeChild(search_results_el.firstChild); searchResultsEl.removeChild(searchResultsEl.firstChild);
} }
$("#categories .in").collapse("hide"); $("#categories .in").collapse("hide");
if (str) { if (str) {
var matched_ops = this.filter_operations(str, true), var matchedOps = this.filterOperations(str, true),
matched_ops_html = ""; matchedOpsHtml = "";
for (var i = 0; i < matched_ops.length; i++) { for (var i = 0; i < matchedOps.length; i++) {
matched_ops_html += matched_ops[i].to_stub_html(); matchedOpsHtml += matchedOps[i].toStubHtml();
} }
search_results_el.innerHTML = matched_ops_html; searchResultsEl.innerHTML = matchedOpsHtml;
search_results_el.dispatchEvent(this.manager.oplistcreate); searchResultsEl.dispatchEvent(this.manager.oplistcreate);
} }
} }
}; };
@ -94,37 +94,37 @@ OperationsWaiter.prototype.search_operations = function(e) {
/** /**
* Filters operations based on the search string and returns the matching ones. * Filters operations based on the search string and returns the matching ones.
* *
* @param {string} search_str * @param {string} searchStr
* @param {boolean} highlight - Whether or not to highlight the matching string in the operation * @param {boolean} highlight - Whether or not to highlight the matching string in the operation
* name and description * name and description
* @returns {string[]} * @returns {string[]}
*/ */
OperationsWaiter.prototype.filter_operations = function(search_str, highlight) { OperationsWaiter.prototype.filterOperations = function(searchStr, highlight) {
var matched_ops = [], var matchedOps = [],
matched_descs = []; matchedDescs = [];
search_str = search_str.toLowerCase(); searchStr = searchStr.toLowerCase();
for (var op_name in this.app.operations) { for (var opName in this.app.operations) {
var op = this.app.operations[op_name], var op = this.app.operations[opName],
name_pos = op_name.toLowerCase().indexOf(search_str), namePos = opName.toLowerCase().indexOf(searchStr),
desc_pos = op.description.toLowerCase().indexOf(search_str); descPos = op.description.toLowerCase().indexOf(searchStr);
if (name_pos >= 0 || desc_pos >= 0) { if (namePos >= 0 || descPos >= 0) {
var operation = new HTMLOperation(op_name, this.app.operations[op_name], this.app, this.manager); var operation = new HTMLOperation(opName, this.app.operations[opName], this.app, this.manager);
if (highlight) { if (highlight) {
operation.highlight_search_string(search_str, name_pos, desc_pos); operation.highlightSearchString(searchStr, namePos, descPos);
} }
if (name_pos < 0) { if (namePos < 0) {
matched_ops.push(operation); matchedOps.push(operation);
} else { } else {
matched_descs.push(operation); matchedDescs.push(operation);
} }
} }
} }
return matched_descs.concat(matched_ops); return matchedDescs.concat(matchedOps);
}; };
@ -135,7 +135,7 @@ OperationsWaiter.prototype.filter_operations = function(search_str, highlight) {
* @param {element[]} ops * @param {element[]} ops
* @returns {number} * @returns {number}
*/ */
OperationsWaiter.prototype.get_selected_op = function(ops) { OperationsWaiter.prototype.getSelectedOp = function(ops) {
for (var i = 0; i < ops.length; i++) { for (var i = 0; i < ops.length; i++) {
if (ops[i].classList.contains("selected-op")) { if (ops[i].classList.contains("selected-op")) {
return i; return i;
@ -151,8 +151,8 @@ OperationsWaiter.prototype.get_selected_op = function(ops) {
* @listens Manager#oplistcreate * @listens Manager#oplistcreate
* @param {event} e * @param {event} e
*/ */
OperationsWaiter.prototype.op_list_create = function(e) { OperationsWaiter.prototype.opListCreate = function(e) {
this.manager.recipe.create_sortable_seed_list(e.target); this.manager.recipe.createSortableSeedList(e.target);
$("[data-toggle=popover]").popover(); $("[data-toggle=popover]").popover();
}; };
@ -163,11 +163,11 @@ OperationsWaiter.prototype.op_list_create = function(e) {
* *
* @param {event} e * @param {event} e
*/ */
OperationsWaiter.prototype.operation_dblclick = function(e) { OperationsWaiter.prototype.operationDblclick = function(e) {
var li = e.target; var li = e.target;
this.manager.recipe.add_operation(li.textContent); this.manager.recipe.addOperation(li.textContent);
this.app.auto_bake(); this.app.autoBake();
}; };
@ -177,46 +177,46 @@ OperationsWaiter.prototype.operation_dblclick = function(e) {
* *
* @param {event} e * @param {event} e
*/ */
OperationsWaiter.prototype.edit_favourites_click = function(e) { OperationsWaiter.prototype.editFavouritesClick = function(e) {
e.preventDefault(); e.preventDefault();
e.stopPropagation(); e.stopPropagation();
// Add favourites to modal // Add favourites to modal
var fav_cat = this.app.categories.filter(function(c) { var favCat = this.app.categories.filter(function(c) {
return c.name === "Favourites"; return c.name === "Favourites";
})[0]; })[0];
var html = ""; var html = "";
for (var i = 0; i < fav_cat.ops.length; i++) { for (var i = 0; i < favCat.ops.length; i++) {
var op_name = fav_cat.ops[i]; var opName = favCat.ops[i];
var operation = new HTMLOperation(op_name, this.app.operations[op_name], this.app, this.manager); var operation = new HTMLOperation(opName, this.app.operations[opName], this.app, this.manager);
html += operation.to_stub_html(true); html += operation.toStubHtml(true);
} }
var edit_favourites_list = document.getElementById("edit-favourites-list"); var editFavouritesList = document.getElementById("edit-favourites-list");
edit_favourites_list.innerHTML = html; editFavouritesList.innerHTML = html;
this.remove_intent = false; this.removeIntent = false;
var editable_list = Sortable.create(edit_favourites_list, { var editableList = Sortable.create(editFavouritesList, {
filter: ".remove-icon", filter: ".remove-icon",
onFilter: function (evt) { onFilter: function (evt) {
var el = editable_list.closest(evt.item); var el = editableList.closest(evt.item);
if (el) { if (el) {
$(el).popover("destroy"); $(el).popover("destroy");
el.parentNode.removeChild(el); el.parentNode.removeChild(el);
} }
}, },
onEnd: function(evt) { onEnd: function(evt) {
if (this.remove_intent) evt.item.remove(); if (this.removeIntent) evt.item.remove();
}.bind(this), }.bind(this),
}); });
Sortable.utils.on(edit_favourites_list, "dragleave", function() { Sortable.utils.on(editFavouritesList, "dragleave", function() {
this.remove_intent = true; this.removeIntent = true;
}.bind(this)); }.bind(this));
Sortable.utils.on(edit_favourites_list, "dragover", function() { Sortable.utils.on(editFavouritesList, "dragover", function() {
this.remove_intent = false; this.removeIntent = false;
}.bind(this)); }.bind(this));
$("#edit-favourites-list [data-toggle=popover]").popover(); $("#edit-favourites-list [data-toggle=popover]").popover();
@ -228,18 +228,18 @@ OperationsWaiter.prototype.edit_favourites_click = function(e) {
* Handler for save favourites click events. * Handler for save favourites click events.
* Saves the selected favourites and reloads them. * Saves the selected favourites and reloads them.
*/ */
OperationsWaiter.prototype.save_favourites_click = function() { OperationsWaiter.prototype.saveFavouritesClick = function() {
var favourites_list = [], var favouritesList = [],
favs = document.querySelectorAll("#edit-favourites-list li"); favs = document.querySelectorAll("#edit-favourites-list li");
for (var i = 0; i < favs.length; i++) { for (var i = 0; i < favs.length; i++) {
favourites_list.push(favs[i].textContent); favouritesList.push(favs[i].textContent);
} }
this.app.save_favourites(favourites_list); this.app.saveFavourites(favouritesList);
this.app.load_favourites(); this.app.loadFavourites();
this.app.populate_operations_list(); this.app.populateOperationsList();
this.manager.recipe.initialise_operation_drag_n_drop(); this.manager.recipe.initialiseOperationDragNDrop();
}; };
@ -247,37 +247,37 @@ OperationsWaiter.prototype.save_favourites_click = function() {
* Handler for reset favourites click events. * Handler for reset favourites click events.
* Resets favourites to their defaults. * Resets favourites to their defaults.
*/ */
OperationsWaiter.prototype.reset_favourites_click = function() { OperationsWaiter.prototype.resetFavouritesClick = function() {
this.app.reset_favourites(); this.app.resetFavourites();
}; };
/** /**
* Handler for op_icon mouseover events. * Handler for opIcon mouseover events.
* Hides any popovers already showing on the operation so that there aren't two at once. * Hides any popovers already showing on the operation so that there aren't two at once.
* *
* @param {event} e * @param {event} e
*/ */
OperationsWaiter.prototype.op_icon_mouseover = function(e) { OperationsWaiter.prototype.opIconMouseover = function(e) {
var op_el = e.target.parentNode; var opEl = e.target.parentNode;
if (e.target.getAttribute("data-toggle") === "popover") { if (e.target.getAttribute("data-toggle") === "popover") {
$(op_el).popover("hide"); $(opEl).popover("hide");
} }
}; };
/** /**
* Handler for op_icon mouseleave events. * Handler for opIcon mouseleave events.
* If this icon created a popover and we're moving back to the operation element, display the * If this icon created a popover and we're moving back to the operation element, display the
* operation popover again. * operation popover again.
* *
* @param {event} e * @param {event} e
*/ */
OperationsWaiter.prototype.op_icon_mouseleave = function(e) { OperationsWaiter.prototype.opIconMouseleave = function(e) {
var op_el = e.target.parentNode, var opEl = e.target.parentNode,
to_el = e.toElement || e.relatedElement; toEl = e.toElement || e.relatedElement;
if (e.target.getAttribute("data-toggle") === "popover" && to_el === op_el) { if (e.target.getAttribute("data-toggle") === "popover" && toEl === opEl) {
$(op_el).popover("show"); $(opEl).popover("show");
} }
}; };

View File

@ -52,7 +52,7 @@ OptionsWaiter.prototype.load = function(options) {
* Handler for options click events. * Handler for options click events.
* Dispays the options pane. * Dispays the options pane.
*/ */
OptionsWaiter.prototype.options_click = function() { OptionsWaiter.prototype.optionsClick = function() {
$("#options-modal").modal(); $("#options-modal").modal();
}; };
@ -61,7 +61,7 @@ OptionsWaiter.prototype.options_click = function() {
* Handler for reset options click events. * Handler for reset options click events.
* Resets options back to their default values. * Resets options back to their default values.
*/ */
OptionsWaiter.prototype.reset_options_click = function() { OptionsWaiter.prototype.resetOptionsClick = function() {
this.load(this.app.doptions); this.load(this.app.doptions);
}; };
@ -73,7 +73,7 @@ OptionsWaiter.prototype.reset_options_click = function() {
* @param {event} e * @param {event} e
* @param {boolean} state * @param {boolean} state
*/ */
OptionsWaiter.prototype.switch_change = function(e, state) { OptionsWaiter.prototype.switchChange = function(e, state) {
var el = e.target, var el = e.target,
option = el.getAttribute("option"); option = el.getAttribute("option");
@ -88,7 +88,7 @@ OptionsWaiter.prototype.switch_change = function(e, state) {
* *
* @param {event} e * @param {event} e
*/ */
OptionsWaiter.prototype.number_change = function(e) { OptionsWaiter.prototype.numberChange = function(e) {
var el = e.target, var el = e.target,
option = el.getAttribute("option"); option = el.getAttribute("option");
@ -103,7 +103,7 @@ OptionsWaiter.prototype.number_change = function(e) {
* *
* @param {event} e * @param {event} e
*/ */
OptionsWaiter.prototype.select_change = function(e) { OptionsWaiter.prototype.selectChange = function(e) {
var el = e.target, var el = e.target,
option = el.getAttribute("option"); option = el.getAttribute("option");
@ -113,16 +113,16 @@ OptionsWaiter.prototype.select_change = function(e) {
/** /**
* Sets or unsets word wrap on the input and output depending on the word_wrap option value. * Sets or unsets word wrap on the input and output depending on the wordWrap option value.
*/ */
OptionsWaiter.prototype.set_word_wrap = function() { OptionsWaiter.prototype.setWordWrap = function() {
document.getElementById("input-text").classList.remove("word-wrap"); document.getElementById("input-text").classList.remove("word-wrap");
document.getElementById("output-text").classList.remove("word-wrap"); document.getElementById("output-text").classList.remove("word-wrap");
document.getElementById("output-html").classList.remove("word-wrap"); document.getElementById("output-html").classList.remove("word-wrap");
document.getElementById("input-highlighter").classList.remove("word-wrap"); document.getElementById("input-highlighter").classList.remove("word-wrap");
document.getElementById("output-highlighter").classList.remove("word-wrap"); document.getElementById("output-highlighter").classList.remove("word-wrap");
if (!this.app.options.word_wrap) { if (!this.app.options.wordWrap) {
document.getElementById("input-text").classList.add("word-wrap"); document.getElementById("input-text").classList.add("word-wrap");
document.getElementById("output-text").classList.add("word-wrap"); document.getElementById("output-text").classList.add("word-wrap");
document.getElementById("output-html").classList.add("word-wrap"); document.getElementById("output-html").classList.add("word-wrap");

View File

@ -28,47 +28,47 @@ OutputWaiter.prototype.get = function() {
/** /**
* Sets the output in the output textarea. * Sets the output in the output textarea.
* *
* @param {string} data_str - The output string/HTML * @param {string} dataStr - The output string/HTML
* @param {string} type - The data type of the output * @param {string} type - The data type of the output
* @param {number} duration - The length of time (ms) it took to generate the output * @param {number} duration - The length of time (ms) it took to generate the output
*/ */
OutputWaiter.prototype.set = function(data_str, type, duration) { OutputWaiter.prototype.set = function(dataStr, type, duration) {
var output_text = document.getElementById("output-text"), var outputText = document.getElementById("output-text"),
output_html = document.getElementById("output-html"), outputHtml = document.getElementById("output-html"),
output_highlighter = document.getElementById("output-highlighter"), outputHighlighter = document.getElementById("output-highlighter"),
input_highlighter = document.getElementById("input-highlighter"); inputHighlighter = document.getElementById("input-highlighter");
if (type === "html") { if (type === "html") {
output_text.style.display = "none"; outputText.style.display = "none";
output_html.style.display = "block"; outputHtml.style.display = "block";
output_highlighter.display = "none"; outputHighlighter.display = "none";
input_highlighter.display = "none"; inputHighlighter.display = "none";
output_text.value = ""; outputText.value = "";
output_html.innerHTML = data_str; outputHtml.innerHTML = dataStr;
// Execute script sections // Execute script sections
var script_elements = output_html.querySelectorAll("script"); var scriptElements = outputHtml.querySelectorAll("script");
for (var i = 0; i < script_elements.length; i++) { for (var i = 0; i < scriptElements.length; i++) {
try { try {
eval(script_elements[i].innerHTML); // eslint-disable-line no-eval eval(scriptElements[i].innerHTML); // eslint-disable-line no-eval
} catch (err) { } catch (err) {
console.error(err); console.error(err);
} }
} }
} else { } else {
output_text.style.display = "block"; outputText.style.display = "block";
output_html.style.display = "none"; outputHtml.style.display = "none";
output_highlighter.display = "block"; outputHighlighter.display = "block";
input_highlighter.display = "block"; inputHighlighter.display = "block";
output_text.value = Utils.printable(data_str, true); outputText.value = Utils.printable(dataStr, true);
output_html.innerHTML = ""; outputHtml.innerHTML = "";
} }
this.manager.highlighter.remove_highlights(); this.manager.highlighter.removeHighlights();
var lines = data_str.count("\n") + 1; var lines = dataStr.count("\n") + 1;
this.set_output_info(data_str.length, lines, duration); this.setOutputInfo(dataStr.length, lines, duration);
}; };
@ -79,28 +79,54 @@ OutputWaiter.prototype.set = function(data_str, type, duration) {
* @param {number} lines - The number of the lines in the current output string * @param {number} lines - The number of the lines in the current output string
* @param {number} duration - The length of time (ms) it took to generate the output * @param {number} duration - The length of time (ms) it took to generate the output
*/ */
OutputWaiter.prototype.set_output_info = function(length, lines, duration) { OutputWaiter.prototype.setOutputInfo = function(length, lines, duration) {
var width = length.toString().length; var width = length.toString().length;
width = width < 4 ? 4 : width; width = width < 4 ? 4 : width;
var length_str = Utils.pad(length.toString(), width, " ").replace(/ /g, "&nbsp;"); var lengthStr = Utils.pad(length.toString(), width, " ").replace(/ /g, "&nbsp;");
var lines_str = Utils.pad(lines.toString(), width, " ").replace(/ /g, "&nbsp;"); var linesStr = Utils.pad(lines.toString(), width, " ").replace(/ /g, "&nbsp;");
var time_str = Utils.pad(duration.toString() + "ms", width, " ").replace(/ /g, "&nbsp;"); var timeStr = Utils.pad(duration.toString() + "ms", width, " ").replace(/ /g, "&nbsp;");
document.getElementById("output-info").innerHTML = "time: " + time_str + document.getElementById("output-info").innerHTML = "time: " + timeStr +
"<br>length: " + length_str + "<br>length: " + lengthStr +
"<br>lines: " + lines_str; "<br>lines: " + linesStr;
document.getElementById("input-selection-info").innerHTML = ""; document.getElementById("input-selection-info").innerHTML = "";
document.getElementById("output-selection-info").innerHTML = ""; document.getElementById("output-selection-info").innerHTML = "";
}; };
/**
* Adjusts the display properties of the output buttons so that they fit within the current width
* without wrapping or overflowing.
*/
OutputWaiter.prototype.adjustWidth = function() {
var output = document.getElementById("output"),
saveToFile = document.getElementById("save-to-file"),
switchIO = document.getElementById("switch"),
undoSwitch = document.getElementById("undo-switch"),
maximiseOutput = document.getElementById("maximise-output");
if (output.clientWidth < 680) {
saveToFile.childNodes[1].nodeValue = "";
switchIO.childNodes[1].nodeValue = "";
undoSwitch.childNodes[1].nodeValue = "";
maximiseOutput.childNodes[1].nodeValue = "";
} else {
saveToFile.childNodes[1].nodeValue = " Save to file";
switchIO.childNodes[1].nodeValue = " Move output to input";
undoSwitch.childNodes[1].nodeValue = " Undo";
maximiseOutput.childNodes[1].nodeValue =
maximiseOutput.getAttribute("title") === "Maximise" ? " Max" : " Restore";
}
};
/** /**
* Handler for save click events. * Handler for save click events.
* Saves the current output to a file, downloaded as a URL octet stream. * Saves the current output to a file, downloaded as a URL octet stream.
*/ */
OutputWaiter.prototype.save_click = function() { OutputWaiter.prototype.saveClick = function() {
var data = Utils.to_base64(this.app.dish_str), var data = Utils.toBase64(this.app.dishStr),
filename = window.prompt("Please enter a filename:", "download.dat"); filename = window.prompt("Please enter a filename:", "download.dat");
if (filename) { if (filename) {
@ -122,10 +148,10 @@ OutputWaiter.prototype.save_click = function() {
* Handler for switch click events. * Handler for switch click events.
* Moves the current output into the input textarea. * Moves the current output into the input textarea.
*/ */
OutputWaiter.prototype.switch_click = function() { OutputWaiter.prototype.switchClick = function() {
this.switch_orig_data = this.manager.input.get(); this.switchOrigData = this.manager.input.get();
document.getElementById("undo-switch").disabled = false; document.getElementById("undo-switch").disabled = false;
this.app.set_input(this.app.dish_str); this.app.setInput(this.app.dishStr);
}; };
@ -133,7 +159,30 @@ OutputWaiter.prototype.switch_click = function() {
* Handler for undo switch click events. * Handler for undo switch click events.
* Removes the output from the input and replaces the input that was removed. * Removes the output from the input and replaces the input that was removed.
*/ */
OutputWaiter.prototype.undo_switch_click = function() { OutputWaiter.prototype.undoSwitchClick = function() {
this.app.set_input(this.switch_orig_data); this.app.setInput(this.switchOrigData);
document.getElementById("undo-switch").disabled = true; document.getElementById("undo-switch").disabled = true;
}; };
/**
* Handler for maximise output click events.
* Resizes the output frame to be as large as possible, or restores it to its original size.
*/
OutputWaiter.prototype.maximiseOutputClick = function(e) {
var el = e.target.id === "maximise-output" ? e.target : e.target.parentNode;
if (el.getAttribute("title") === "Maximise") {
this.app.columnSplitter.collapse(0);
this.app.columnSplitter.collapse(1);
this.app.ioSplitter.collapse(0);
el.setAttribute("title", "Restore");
el.innerHTML = "<img src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAlUlEQVQ4y93RwQpBQRQG4C9ba1fxBteGPIj38BTejFJKLFnwCJIiCsW1mcV0k9yx82/OzGK+OXMGOpiiLTFjFNiilQI0sQ7IJiAjLKsgGVYB2YdaVO0kwy46/BVQi9ZDNPyQWen2ub/KufS8y7shfkq9tF9U7SC+/YluKvAI9YZeFeCECXJcA3JHP2WgMXJM/ZUcBwxeM+YuSWTgMtUAAAAASUVORK5CYII='> Restore";
this.adjustWidth();
} else {
el.setAttribute("title", "Maximise");
el.innerHTML = "<img src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAi0lEQVQ4y83TMQrCQBCF4S+5g4rJEdJ7KE+RQ1lrIQQCllroEULuoM0Ww3a7aXwwLAzMPzDvLcz4hnooUItT1rsoVNy+4lgLWNL7RlcCmDBij2eCfNCrUITc0dRCrhj8m5otw0O6SV8LuAV3uhrAAa8sJ2Np7KPFawhgscVLjH9bCDhjt8WNKft88w/HjCvuVqu53QAAAABJRU5ErkJggg=='> Max";
this.app.resetLayout();
}
};

View File

@ -14,79 +14,79 @@
var RecipeWaiter = function(app, manager) { var RecipeWaiter = function(app, manager) {
this.app = app; this.app = app;
this.manager = manager; this.manager = manager;
this.remove_intent = false; this.removeIntent = false;
}; };
/** /**
* Sets up the drag and drop capability for operations in the operations and recipe areas. * Sets up the drag and drop capability for operations in the operations and recipe areas.
*/ */
RecipeWaiter.prototype.initialise_operation_drag_n_drop = function() { RecipeWaiter.prototype.initialiseOperationDragNDrop = function() {
var rec_list = document.getElementById("rec_list"); var recList = document.getElementById("rec-list");
// Recipe list // Recipe list
Sortable.create(rec_list, { Sortable.create(recList, {
group: "recipe", group: "recipe",
sort: true, sort: true,
animation: 0, animation: 0,
delay: 0, delay: 0,
filter: ".arg-input,.arg", // Relies on commenting out a line in Sortable.js which calls evt.preventDefault() filter: ".arg-input,.arg", // Relies on commenting out a line in Sortable.js which calls evt.preventDefault()
setData: function(dataTransfer, drag_el) { setData: function(dataTransfer, dragEl) {
dataTransfer.setData("Text", drag_el.querySelector(".arg-title").textContent); dataTransfer.setData("Text", dragEl.querySelector(".arg-title").textContent);
}, },
onEnd: function(evt) { onEnd: function(evt) {
if (this.remove_intent) { if (this.removeIntent) {
evt.item.remove(); evt.item.remove();
evt.target.dispatchEvent(this.manager.operationremove); evt.target.dispatchEvent(this.manager.operationremove);
} }
}.bind(this) }.bind(this)
}); });
Sortable.utils.on(rec_list, "dragover", function() { Sortable.utils.on(recList, "dragover", function() {
this.remove_intent = false; this.removeIntent = false;
}.bind(this)); }.bind(this));
Sortable.utils.on(rec_list, "dragleave", function() { Sortable.utils.on(recList, "dragleave", function() {
this.remove_intent = true; this.removeIntent = true;
this.app.progress = 0; this.app.progress = 0;
}.bind(this)); }.bind(this));
Sortable.utils.on(rec_list, "touchend", function(e) { Sortable.utils.on(recList, "touchend", function(e) {
var loc = e.changedTouches[0], var loc = e.changedTouches[0],
target = document.elementFromPoint(loc.clientX, loc.clientY); target = document.elementFromPoint(loc.clientX, loc.clientY);
this.remove_intent = !rec_list.contains(target); this.removeIntent = !recList.contains(target);
}.bind(this)); }.bind(this));
// Favourites category // Favourites category
document.querySelector("#categories a").addEventListener("dragover", this.fav_dragover.bind(this)); document.querySelector("#categories a").addEventListener("dragover", this.favDragover.bind(this));
document.querySelector("#categories a").addEventListener("dragleave", this.fav_dragleave.bind(this)); document.querySelector("#categories a").addEventListener("dragleave", this.favDragleave.bind(this));
document.querySelector("#categories a").addEventListener("drop", this.fav_drop.bind(this)); document.querySelector("#categories a").addEventListener("drop", this.favDrop.bind(this));
}; };
/** /**
* Creates a drag-n-droppable seed list of operations. * Creates a drag-n-droppable seed list of operations.
* *
* @param {element} list_el - The list the initialise * @param {element} listEl - The list the initialise
*/ */
RecipeWaiter.prototype.create_sortable_seed_list = function(list_el) { RecipeWaiter.prototype.createSortableSeedList = function(listEl) {
Sortable.create(list_el, { Sortable.create(listEl, {
group: { group: {
name: "recipe", name: "recipe",
pull: "clone", pull: "clone",
put: false put: false
}, },
sort: false, sort: false,
setData: function(dataTransfer, drag_el) { setData: function(dataTransfer, dragEl) {
dataTransfer.setData("Text", drag_el.textContent); dataTransfer.setData("Text", dragEl.textContent);
}, },
onStart: function(evt) { onStart: function(evt) {
$(evt.item).popover("destroy"); $(evt.item).popover("destroy");
evt.item.setAttribute("data-toggle", "popover-disabled"); evt.item.setAttribute("data-toggle", "popover-disabled");
}, },
onEnd: this.op_sort_end.bind(this) onEnd: this.opSortEnd.bind(this)
}); });
}; };
@ -99,9 +99,9 @@ RecipeWaiter.prototype.create_sortable_seed_list = function(list_el) {
* @fires Manager#operationadd * @fires Manager#operationadd
* @param {event} evt * @param {event} evt
*/ */
RecipeWaiter.prototype.op_sort_end = function(evt) { RecipeWaiter.prototype.opSortEnd = function(evt) {
if (this.remove_intent) { if (this.removeIntent) {
if (evt.item.parentNode.id === "rec_list") { if (evt.item.parentNode.id === "rec-list") {
evt.item.remove(); evt.item.remove();
} }
return; return;
@ -112,11 +112,11 @@ RecipeWaiter.prototype.op_sort_end = function(evt) {
$(evt.clone).popover(); $(evt.clone).popover();
$(evt.clone).children("[data-toggle=popover]").popover(); $(evt.clone).children("[data-toggle=popover]").popover();
if (evt.item.parentNode.id !== "rec_list") { if (evt.item.parentNode.id !== "rec-list") {
return; return;
} }
this.build_recipe_operation(evt.item); this.buildRecipeOperation(evt.item);
evt.item.dispatchEvent(this.manager.operationadd); evt.item.dispatchEvent(this.manager.operationadd);
}; };
@ -128,7 +128,7 @@ RecipeWaiter.prototype.op_sort_end = function(evt) {
* *
* @param {event} e * @param {event} e
*/ */
RecipeWaiter.prototype.fav_dragover = function(e) { RecipeWaiter.prototype.favDragover = function(e) {
if (e.dataTransfer.effectAllowed !== "move") if (e.dataTransfer.effectAllowed !== "move")
return false; return false;
@ -153,7 +153,7 @@ RecipeWaiter.prototype.fav_dragover = function(e) {
* *
* @param {event} e * @param {event} e
*/ */
RecipeWaiter.prototype.fav_dragleave = function(e) { RecipeWaiter.prototype.favDragleave = function(e) {
e.stopPropagation(); e.stopPropagation();
e.preventDefault(); e.preventDefault();
document.querySelector("#categories a").classList.remove("favourites-hover"); document.querySelector("#categories a").classList.remove("favourites-hover");
@ -166,13 +166,13 @@ RecipeWaiter.prototype.fav_dragleave = function(e) {
* *
* @param {event} e * @param {event} e
*/ */
RecipeWaiter.prototype.fav_drop = function(e) { RecipeWaiter.prototype.favDrop = function(e) {
e.stopPropagation(); e.stopPropagation();
e.preventDefault(); e.preventDefault();
e.target.classList.remove("favourites-hover"); e.target.classList.remove("favourites-hover");
var op_name = e.dataTransfer.getData("Text"); var opName = e.dataTransfer.getData("Text");
this.app.add_favourite(op_name); this.app.addFavourite(opName);
}; };
@ -181,7 +181,7 @@ RecipeWaiter.prototype.fav_drop = function(e) {
* *
* @fires Manager#statechange * @fires Manager#statechange
*/ */
RecipeWaiter.prototype.ing_change = function() { RecipeWaiter.prototype.ingChange = function() {
window.dispatchEvent(this.manager.statechange); window.dispatchEvent(this.manager.statechange);
}; };
@ -193,7 +193,7 @@ RecipeWaiter.prototype.ing_change = function() {
* @fires Manager#statechange * @fires Manager#statechange
* @param {event} e * @param {event} e
*/ */
RecipeWaiter.prototype.disable_click = function(e) { RecipeWaiter.prototype.disableClick = function(e) {
var icon = e.target; var icon = e.target;
if (icon.getAttribute("disabled") === "false") { if (icon.getAttribute("disabled") === "false") {
@ -218,7 +218,7 @@ RecipeWaiter.prototype.disable_click = function(e) {
* @fires Manager#statechange * @fires Manager#statechange
* @param {event} e * @param {event} e
*/ */
RecipeWaiter.prototype.breakpoint_click = function(e) { RecipeWaiter.prototype.breakpointClick = function(e) {
var bp = e.target; var bp = e.target;
if (bp.getAttribute("break") === "false") { if (bp.getAttribute("break") === "false") {
@ -240,7 +240,7 @@ RecipeWaiter.prototype.breakpoint_click = function(e) {
* @fires Manager#statechange * @fires Manager#statechange
* @param {event} e * @param {event} e
*/ */
RecipeWaiter.prototype.operation_dblclick = function(e) { RecipeWaiter.prototype.operationDblclick = function(e) {
e.target.remove(); e.target.remove();
window.dispatchEvent(this.manager.statechange); window.dispatchEvent(this.manager.statechange);
}; };
@ -253,7 +253,7 @@ RecipeWaiter.prototype.operation_dblclick = function(e) {
* @fires Manager#statechange * @fires Manager#statechange
* @param {event} e * @param {event} e
*/ */
RecipeWaiter.prototype.operation_child_dblclick = function(e) { RecipeWaiter.prototype.operationChildDblclick = function(e) {
e.target.parentNode.remove(); e.target.parentNode.remove();
window.dispatchEvent(this.manager.statechange); window.dispatchEvent(this.manager.statechange);
}; };
@ -262,31 +262,31 @@ RecipeWaiter.prototype.operation_child_dblclick = function(e) {
/** /**
* Generates a configuration object to represent the current recipe. * Generates a configuration object to represent the current recipe.
* *
* @returns {recipe_config} * @returns {recipeConfig}
*/ */
RecipeWaiter.prototype.get_config = function() { RecipeWaiter.prototype.getConfig = function() {
var config = [], ingredients, ing_list, disabled, bp, item, var config = [], ingredients, ingList, disabled, bp, item,
operations = document.querySelectorAll("#rec_list li.operation"); operations = document.querySelectorAll("#rec-list li.operation");
for (var i = 0; i < operations.length; i++) { for (var i = 0; i < operations.length; i++) {
ingredients = []; ingredients = [];
disabled = operations[i].querySelector(".disable-icon"); disabled = operations[i].querySelector(".disable-icon");
bp = operations[i].querySelector(".breakpoint"); bp = operations[i].querySelector(".breakpoint");
ing_list = operations[i].querySelectorAll(".arg"); ingList = operations[i].querySelectorAll(".arg");
for (var j = 0; j < ing_list.length; j++) { for (var j = 0; j < ingList.length; j++) {
if (ing_list[j].getAttribute("type") === "checkbox") { if (ingList[j].getAttribute("type") === "checkbox") {
// checkbox // checkbox
ingredients[j] = ing_list[j].checked; ingredients[j] = ingList[j].checked;
} else if (ing_list[j].classList.contains("toggle-string")) { } else if (ingList[j].classList.contains("toggle-string")) {
// toggle_string // toggleString
ingredients[j] = { ingredients[j] = {
option: ing_list[j].previousSibling.children[0].textContent.slice(0, -1), option: ingList[j].previousSibling.children[0].textContent.slice(0, -1),
string: ing_list[j].value string: ingList[j].value
}; };
} else { } else {
// all others // all others
ingredients[j] = ing_list[j].value; ingredients[j] = ingList[j].value;
} }
} }
@ -315,8 +315,8 @@ RecipeWaiter.prototype.get_config = function() {
* *
* @param {number} position * @param {number} position
*/ */
RecipeWaiter.prototype.update_breakpoint_indicator = function(position) { RecipeWaiter.prototype.updateBreakpointIndicator = function(position) {
var operations = document.querySelectorAll("#rec_list li.operation"); var operations = document.querySelectorAll("#rec-list li.operation");
for (var i = 0; i < operations.length; i++) { for (var i = 0; i < operations.length; i++) {
if (i === position) { if (i === position) {
operations[i].classList.add("break"); operations[i].classList.add("break");
@ -333,19 +333,19 @@ RecipeWaiter.prototype.update_breakpoint_indicator = function(position) {
* *
* @param {element} el - The operation stub element from the operations pane * @param {element} el - The operation stub element from the operations pane
*/ */
RecipeWaiter.prototype.build_recipe_operation = function(el) { RecipeWaiter.prototype.buildRecipeOperation = function(el) {
var op_name = el.textContent; var opName = el.textContent;
var op = new HTMLOperation(op_name, this.app.operations[op_name], this.app, this.manager); var op = new HTMLOperation(opName, this.app.operations[opName], this.app, this.manager);
el.innerHTML = op.to_full_html(); el.innerHTML = op.toFullHtml();
if (this.app.operations[op_name].flow_control) { if (this.app.operations[opName].flowControl) {
el.classList.add("flow-control-op"); el.classList.add("flow-control-op");
} }
// Disable auto-bake if this is a manual op - this should be moved to the 'operationadd' // Disable auto-bake if this is a manual op - this should be moved to the 'operationadd'
// handler after event restructuring // handler after event restructuring
if (op.manual_bake && this.app.auto_bake_) { if (op.manualBake && this.app.autoBake_) {
this.manager.controls.set_auto_bake(false); this.manager.controls.setAutoBake(false);
this.app.alert("Auto-Bake is disabled by default when using this operation.", "info", 5000); this.app.alert("Auto-Bake is disabled by default when using this operation.", "info", 5000);
} }
}; };
@ -357,13 +357,13 @@ RecipeWaiter.prototype.build_recipe_operation = function(el) {
* @param {string} name - The name of the operation to add * @param {string} name - The name of the operation to add
* @returns {element} * @returns {element}
*/ */
RecipeWaiter.prototype.add_operation = function(name) { RecipeWaiter.prototype.addOperation = function(name) {
var item = document.createElement("li"); var item = document.createElement("li");
item.classList.add("operation"); item.classList.add("operation");
item.innerHTML = name; item.innerHTML = name;
this.build_recipe_operation(item); this.buildRecipeOperation(item);
document.getElementById("rec_list").appendChild(item); document.getElementById("rec-list").appendChild(item);
item.dispatchEvent(this.manager.operationadd); item.dispatchEvent(this.manager.operationadd);
return item; return item;
@ -375,27 +375,27 @@ RecipeWaiter.prototype.add_operation = function(name) {
* *
* @fires Manager#operationremove * @fires Manager#operationremove
*/ */
RecipeWaiter.prototype.clear_recipe = function() { RecipeWaiter.prototype.clearRecipe = function() {
var rec_list = document.getElementById("rec_list"); var recList = document.getElementById("rec-list");
while (rec_list.firstChild) { while (recList.firstChild) {
rec_list.removeChild(rec_list.firstChild); recList.removeChild(recList.firstChild);
} }
rec_list.dispatchEvent(this.manager.operationremove); recList.dispatchEvent(this.manager.operationremove);
}; };
/** /**
* Handler for operation dropdown events from toggle_string arguments. * Handler for operation dropdown events from toggleString arguments.
* Sets the selected option as the name of the button. * Sets the selected option as the name of the button.
* *
* @param {event} e * @param {event} e
*/ */
RecipeWaiter.prototype.dropdown_toggle_click = function(e) { RecipeWaiter.prototype.dropdownToggleClick = function(e) {
var el = e.target, var el = e.target,
button = el.parentNode.parentNode.previousSibling; button = el.parentNode.parentNode.previousSibling;
button.innerHTML = el.textContent + " <span class='caret'></span>"; button.innerHTML = el.textContent + " <span class='caret'></span>";
this.ing_change(); this.ingChange();
}; };
@ -406,7 +406,7 @@ RecipeWaiter.prototype.dropdown_toggle_click = function(e) {
* @fires Manager#statechange * @fires Manager#statechange
* @param {event} e * @param {event} e
*/ */
RecipeWaiter.prototype.op_add = function(e) { RecipeWaiter.prototype.opAdd = function(e) {
window.dispatchEvent(this.manager.statechange); window.dispatchEvent(this.manager.statechange);
}; };
@ -418,6 +418,6 @@ RecipeWaiter.prototype.op_add = function(e) {
* @fires Manager#statechange * @fires Manager#statechange
* @param {event} e * @param {event} e
*/ */
RecipeWaiter.prototype.op_remove = function(e) { RecipeWaiter.prototype.opRemove = function(e) {
window.dispatchEvent(this.manager.statechange); window.dispatchEvent(this.manager.statechange);
}; };

View File

@ -24,22 +24,22 @@ SeasonalWaiter.prototype.load = function() {
// Snowfall // Snowfall
if (now.getMonth() === 11 && now.getDate() > 12) { // Dec 13 -> Dec 31 if (now.getMonth() === 11 && now.getDate() > 12) { // Dec 13 -> Dec 31
this.app.options.snow = false; this.app.options.snow = false;
this.create_snow_option(); this.createSnowOption();
$(document).on("switchChange.bootstrapSwitch", ".option-item input:checkbox[option='snow']", this.let_it_snow.bind(this)); $(document).on("switchChange.bootstrapSwitch", ".option-item input:checkbox[option='snow']", this.letItSnow.bind(this));
window.addEventListener("resize", this.let_it_snow.bind(this)); window.addEventListener("resize", this.letItSnow.bind(this));
this.manager.add_listeners(".btn", "click", this.shake_off_snow, this); this.manager.addListeners(".btn", "click", this.shakeOffSnow, this);
if (now.getDate() === 25) this.let_it_snow(); if (now.getDate() === 25) this.letItSnow();
} }
// SpiderChef // SpiderChef
// if (now.getMonth() === 3 && now.getDate() === 1) { // Apr 1 // if (now.getMonth() === 3 && now.getDate() === 1) { // Apr 1
// this.insert_spider_icons(); // this.insertSpiderIcons();
// this.insert_spider_text(); // this.insertSpiderText();
// } // }
// Konami code // Konami code
this.kkeys = []; this.kkeys = [];
window.addEventListener("keydown", this.konami_code_listener.bind(this)); window.addEventListener("keydown", this.konamiCodeListener.bind(this));
}; };
@ -47,7 +47,7 @@ SeasonalWaiter.prototype.load = function() {
* Replaces chef icons with spider icons. * Replaces chef icons with spider icons.
* #spiderchef * #spiderchef
*/ */
SeasonalWaiter.prototype.insert_spider_icons = function() { SeasonalWaiter.prototype.insertSpiderIcons = function() {
var spider16 = "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB3UlEQVQ4y2NgGJaAmYGBgVnf0oKJgYGBobWtXamqqoYTn2I4CI+LTzM2NTulpKbu+vPHz2dV5RWlluZmi3j5+KqFJSSEzpw8uQPdAEYYIzo5Kfjrl28rWFlZzjAzMYuEBQao3Lh+g+HGvbsMzExMDN++fWf4/PXLBzY2tqYNK1f2+4eHM2xcuRLigsT09Igf3384MTExbf767etBI319jU8fPsi+//jx/72HDxh5uLkZ7ty7y/Dz1687Avz8n2UUFR3Z2NjOySoqfmdhYGBg+PbtuwI7O8e5H79+8X379t357PnzYo+ePP7y6cuXc9++f69nYGRsvf/w4XdtLS2R799/bBUWFHr57sP7Jbs3b/ZkzswvUP3165fZ7z9//r988WIVAyPDr8tXr576+u3bpb9//7YwMjKeV1dV41NWVGoVEhDgPH761DJREeHaz1+/lqlpafUx6+jrRfz4+fPy+w8fTu/fsf3uw7t3L39+//4cv7DwGQYGhpdPbt9m4BcRFlNWVJC4fuvWASszs4C379792Ldt2xZBUdEdDP5hYSqQGIjDGa965uYKCalpZQwMDAxhMTG9DAwMDLaurhIkJY7A8IgGBgYGBgd3Dz2yUpeFo6O4rasrA9T24ZRxAAMTwMpgEJwLAAAAAElFTkSuQmCC", var spider16 = "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB3UlEQVQ4y2NgGJaAmYGBgVnf0oKJgYGBobWtXamqqoYTn2I4CI+LTzM2NTulpKbu+vPHz2dV5RWlluZmi3j5+KqFJSSEzpw8uQPdAEYYIzo5Kfjrl28rWFlZzjAzMYuEBQao3Lh+g+HGvbsMzExMDN++fWf4/PXLBzY2tqYNK1f2+4eHM2xcuRLigsT09Igf3384MTExbf767etBI319jU8fPsi+//jx/72HDxh5uLkZ7ty7y/Dz1687Avz8n2UUFR3Z2NjOySoqfmdhYGBg+PbtuwI7O8e5H79+8X379t357PnzYo+ePP7y6cuXc9++f69nYGRsvf/w4XdtLS2R799/bBUWFHr57sP7Jbs3b/ZkzswvUP3165fZ7z9//r988WIVAyPDr8tXr576+u3bpb9//7YwMjKeV1dV41NWVGoVEhDgPH761DJREeHaz1+/lqlpafUx6+jrRfz4+fPy+w8fTu/fsf3uw7t3L39+//4cv7DwGQYGhpdPbt9m4BcRFlNWVJC4fuvWASszs4C379792Ldt2xZBUdEdDP5hYSqQGIjDGa965uYKCalpZQwMDAxhMTG9DAwMDLaurhIkJY7A8IgGBgYGBgd3Dz2yUpeFo6O4rasrA9T24ZRxAAMTwMpgEJwLAAAAAElFTkSuQmCC",
spider32 = "iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAACYVBMVEUAAAAcJSU2Pz85QkM9RUWEhIWMjI2MkJEcJSU2Pz85QkM9RUWWlpc9RUVXXl4cJSU2Pz85QkM8REU9RUVRWFh6ens9RUVCSkpNVFRdY2McJSU5QkM7REQ9RUVGTk5KUlJQVldcY2Rla2uTk5WampscJSVUWltZX2BrcHF1e3scJSUjLCw9RUVASEhFTU1HTk9bYWJeZGRma2xudHV1eHiZmZocJSUyOjpJUFFQVldSWlpTWVpXXl5YXl5rb3B9fX6RkZIcJSUmLy8tNTU9RUVFTU1IT1BOVldRV1hTWlp0enocJSUfKChJUFBWXV1hZ2hnbGwcJSVETExLUlJLU1NNVVVPVlZYXl9cY2RiaGlobW5rcXFyd3h0eHgcJSUpMTFDS0tQV1dRV1hSWFlWXF1bYWJma2tobW5uc3SsrK0cJSVJUFBMVFROVlZVW1xZX2BdYmNhZ2hjaGhla2tqcHBscHE4Pz9KUlJRWVlSWVlXXF1aYGFbYWFfZWZlampqbW4cJSUgKSkiKysuNjY0PD01PT07QkNES0tHTk5JUFBMUlNMU1NOU1ROVVVPVVZRVlZRV1dSWVlWXFxXXV5aX2BbYWFbYWJcYmJcYmNcY2RdYmNgZmZhZmdkaWpkampkamtlamtla2tma2tma2xnbG1obW5pbG1pb3Bqb3Brb3BtcXJudHVvcHFvcXJvc3NwcXNwdXVxc3RzeXl1eXp2eXl3ent6e3x+gYKAhISBg4SKi4yLi4yWlpeampudnZ6fn6CkpaanqKiur6+vr7C4uLm6urq6u7u8vLy9vb3Av8DR0dL2b74UAAAAgHRSTlMAEBAQEBAQECAgICAgMDBAQEBAQEBAUFBQUGBgYGBgYGBgYGBgcHBwcHCAgICAgICAgICAgICPj4+Pj4+Pj4+Pj5+fn5+fn5+fn5+vr6+vr6+/v7+/v7+/v7+/v7+/z8/Pz8/Pz8/Pz8/P39/f39/f39/f39/f7+/v7+/v7+/v78x6RlYAAAGBSURBVDjLY2AYWUCSgUGAk4GBTdlUhQebvP7yjIgCPQbWzBMnjx5wwJSX37Rwfm1isqj9/iPHTuxYlyeMJi+yunfptBkZOw/uWj9h3vatcycu8eRGlldb3Vsts3ph/cFTh7fN3bCoe2Vf8+TZoQhTvBa6REozVC7cuPvQnmULJm1e2z+308eyJieEBSLPXbKQIUqQIczk+N6eNaumtnZMaWhaHM89m8XVCqJA02Y5w0xmga6yfVsamtrN4xoXNzS0JTHkK3CXy4EVFMumcxUy2LbENTVkZfEzMDAudtJyTmNwS2XQreAFyvOlK9louDNVaXurmjkGgnTMkWDgXswtNouFISEX6Awv+RihQi5OcYY4DtVARpCCFCMGhiJ1hjwFBpagEAaWEpFoC0WQOCOjFMRRwXYMDB4BDLJ+QLYsg7GBGjtasLnEMjCIrWBgyAZ7058FI9x1SoFEnTCDsCyIhynPILYYSFgbYpUDA5bpQBluXzxpI1yYAbd2sCMYRhwAAHB9ZPztbuMUAAAAAElFTkSuQmCC", spider32 = "iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAACYVBMVEUAAAAcJSU2Pz85QkM9RUWEhIWMjI2MkJEcJSU2Pz85QkM9RUWWlpc9RUVXXl4cJSU2Pz85QkM8REU9RUVRWFh6ens9RUVCSkpNVFRdY2McJSU5QkM7REQ9RUVGTk5KUlJQVldcY2Rla2uTk5WampscJSVUWltZX2BrcHF1e3scJSUjLCw9RUVASEhFTU1HTk9bYWJeZGRma2xudHV1eHiZmZocJSUyOjpJUFFQVldSWlpTWVpXXl5YXl5rb3B9fX6RkZIcJSUmLy8tNTU9RUVFTU1IT1BOVldRV1hTWlp0enocJSUfKChJUFBWXV1hZ2hnbGwcJSVETExLUlJLU1NNVVVPVlZYXl9cY2RiaGlobW5rcXFyd3h0eHgcJSUpMTFDS0tQV1dRV1hSWFlWXF1bYWJma2tobW5uc3SsrK0cJSVJUFBMVFROVlZVW1xZX2BdYmNhZ2hjaGhla2tqcHBscHE4Pz9KUlJRWVlSWVlXXF1aYGFbYWFfZWZlampqbW4cJSUgKSkiKysuNjY0PD01PT07QkNES0tHTk5JUFBMUlNMU1NOU1ROVVVPVVZRVlZRV1dSWVlWXFxXXV5aX2BbYWFbYWJcYmJcYmNcY2RdYmNgZmZhZmdkaWpkampkamtlamtla2tma2tma2xnbG1obW5pbG1pb3Bqb3Brb3BtcXJudHVvcHFvcXJvc3NwcXNwdXVxc3RzeXl1eXp2eXl3ent6e3x+gYKAhISBg4SKi4yLi4yWlpeampudnZ6fn6CkpaanqKiur6+vr7C4uLm6urq6u7u8vLy9vb3Av8DR0dL2b74UAAAAgHRSTlMAEBAQEBAQECAgICAgMDBAQEBAQEBAUFBQUGBgYGBgYGBgYGBgcHBwcHCAgICAgICAgICAgICPj4+Pj4+Pj4+Pj5+fn5+fn5+fn5+vr6+vr6+/v7+/v7+/v7+/v7+/z8/Pz8/Pz8/Pz8/P39/f39/f39/f39/f7+/v7+/v7+/v78x6RlYAAAGBSURBVDjLY2AYWUCSgUGAk4GBTdlUhQebvP7yjIgCPQbWzBMnjx5wwJSX37Rwfm1isqj9/iPHTuxYlyeMJi+yunfptBkZOw/uWj9h3vatcycu8eRGlldb3Vsts3ph/cFTh7fN3bCoe2Vf8+TZoQhTvBa6REozVC7cuPvQnmULJm1e2z+308eyJieEBSLPXbKQIUqQIczk+N6eNaumtnZMaWhaHM89m8XVCqJA02Y5w0xmga6yfVsamtrN4xoXNzS0JTHkK3CXy4EVFMumcxUy2LbENTVkZfEzMDAudtJyTmNwS2XQreAFyvOlK9louDNVaXurmjkGgnTMkWDgXswtNouFISEX6Awv+RihQi5OcYY4DtVARpCCFCMGhiJ1hjwFBpagEAaWEpFoC0WQOCOjFMRRwXYMDB4BDLJ+QLYsg7GBGjtasLnEMjCIrWBgyAZ7058FI9x1SoFEnTCDsCyIhynPILYYSFgbYpUDA5bpQBluXzxpI1yYAbd2sCMYRhwAAHB9ZPztbuMUAAAAAElFTkSuQmCC",
spider64 = "iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAJZUlEQVR42u1ZaXMU1xXlJ+gHpFITOy5sAcnIYCi2aIL2bTSSZrSP1NpHK41kISQBHgFaQIJBCMwi4TFUGYcPzggwEMcxHVGxQaag5QR/np/QP+Hmnsdr0hpmtEACwulb9aq7p7d3zz333Pt61q2zzTbbbLPNNttss80222yzzTbbVmu7MzKcJRWVkXjntqam6jyURPeGQqeTpqbOqp+evxC5dGlam5m5rE3PzGi8Hzx/4aLzbXDe09HdYxwZHaPc4mLFXVoW9pRXGNv3pDngeHlNLfE2Ljjj4xPOUGjSYKfpq6/+TLdv36bbX39Nt27epGvXvqSLl6bp3LlPtdOnz7jWrPNZ7kLCKCovp5bOTmP/4EHq6vmYMtzuSKbbbQCAHE8Rxd47MjrmuHjxkjF3/z4tLCzQkyc6PX78mB49ekQPHjygub/P0d27f6FrX/6JpqbO0YkT48E1R/sCr9cYHZ+gqrp64mPq+riXcoqKKC0vP9q6VyV/fQOiH+LrsPVY7z82PBKZnb1Bd+7cpfn5eQbgCT1hAADC/MN5uj83R99881eanZ2lL5gN/nrxjihAXwvOJ7l9vuiBQ4dF9LEtLC0V+2rv/ijTX6luaCS3rxT57wADAMTBQ4c9PIIDg4PBwYOHaHhklM5MnSWkwLff/o0+v3qVHv34Iz344QEDc4d8VVXUEAhQXXMzVdQqzKweKq6oABARzOGNOZ+Wl6fD6T25ubQrPT0E5xF93o82tbdjkkZ+iZfAAgbD6fZ6o339A8S0p7HjJ2h4eIQOHf6EujlV9nX3UOj0JDXzfXje+KlTdOPGDeF0T1+fGHg+2JSen08tHZ0CiPySEoPn8vq1IaOgIAzneQK0UzjcQd6qaqrlCVfV1+tpubnRnv5+2p2ZqYMF/oZGPTh0xLhy5Sr9wLn9j++/p5nLn9FxBoLZQJ1dKrkys6iYNeTExEnx3PqWFuF4W9deKq2upkEGCyzyMBC709MFC7r391Fjayv9MSdHZyCU1xJ5FjrNdN6VnU1KS4CjU4Yoh/m8CsezCguFJgAMV05ueP+BfhF5OL+gL9A/f/qJ7t3TaPLMFB09eoy6mTkMGg2PjTELOsS20OcTACgMKqJugqA0NtE7ycn0202b6A+ZmYIVAAKApGZlgRHB/0lqQPAqFEVE9hntM0R0ZblTzeswWdCeU8HAtYW+Uu0AUx+0f/jwoXD+56c/073v7tHU2XMiFbrUfVTNAtfL10FIAQL2QftsBrOEnavld5kg7E7PoF+99x79ev162rJrV9RMi6a2dvKUlQsR5uAgII7/ivMsbEE4g2hggjzC7LQL1OftovoO0WJKUn0gYEAn2hmMXo4QHIXQIfLfsfOXPwuLvB86cpQqamooyEzg1BLMwv04RkoE+B3B4BBBMHEcCwIP0N+ByJdUVhpgBJ7j4WvdANDjeTUglOaWEChfJF7uJzPX2HEPaj1vg7EAbHO5QnAeIPgqKvUB7gtAdbBgcvKMqOnc/NAIVwCcq21qElFnCgvaI9cBBFKhlSPbPzBIbbzduGULpWzfLkDAdZs++sgEwSlZqoIJMg2CzFSNGzODwdBfOi26+w4YTCm9LhDQwQDzdzguFf4FALjciTws8/u1yyx2N2/dovPnL9DRY8PkZ204xtuhoSM0wI7V8DEiirQCCHD+99u2CUdx3Lmvmz7kfemoGDgPEDr4HNKAf1MlAC4wgMGLWFJXQUrklZSEX6rLE2rOyDIQGlhgBUAyYFEZkm2vAGVi4qQ+x83M0389pevXr6OToy07d4qcR+krr/KzqpeJ/IfjGO+npDx3FCKHVPjd1q2LAMBI3ryZ9vL7U56BEzLfD80ACFba876OlGCQV9dAcT0Pyw7PgWij6zPP5Xt9EYgg+n3LosdVzdfz5CI8KY1LH31+5Yro9KanZwjHmPzmHTsoOeVDemfDBuE8dGVnWpqx3unUrE4CDLCAG64XAHB88IFgQV5xMY7DFmc16A6CZvnNBYYVcW+yKj0A/VHTsQ8dwMPNc6X+Gg0VIGbVpzYGWundjRujmGQWi9Eol7+TJ0/R2Nhx2sNlM9YJRPDdDRsM5DGPJB4KHOIhngHhAwixAGAAuDZ2lsuiYnFWBQOYrdEYNochilyiV6YHoH+rRNJkAG+fUw31PzU7Z1EFKPD69CIuQ1Bm6URoh8tFmVym3nc6rZOPyi0cD8HxeHPg3x2InNrbS79JTsYzNXmPuBclsO3ZvKwAOJEGsmI5rT0M+gSf3y9K5LIA1LUEIlL1k0AhCYBH5r9TCqBqib4D+c/1PyInGOThkvuaHCYALhlpbQWBMGR/4IpzTqlpbKQyf0045vdoe0zATHagSYMeWFMkbscnHRYPZjoFJaIiUkz9EJy15j/X3qCsAIqMcFjSWrNE1Iygg0fEmrtLzEUTdT/OhBFht9fHDVCbEUt3LJxi08B8Xj6vTDESriq9lVWqBECgHujqiqAUmufb1X3cfRXoluhjZWiwkOnSUcUS6ZD8LUmmhks6b5j1ezkAkAKZBe5QvPPcNBnoCawMwT66Qxk0R2xwwRAui2iSDGuaPDcubzo3EJq8wcx/9Vmk3QryH42QBQCFF0UagIiJtjX6DskIXTLEucJSHIIIMuO0BOcjn3A3ybU/lu5RCUBc5qA0Ih0Q2EWiCPRk7VfMNhjLW1zETic1tLYZDMKyuSsdfh5l6bwho5+0il4kyA0VohlNcF5FP8DlWo/VB16HYB2hJ0pzgIe2mcXxP2IOumPRY17U0tll8KIkZNb+sppafOxYkQPSaYfchyYoL9GMqWYpTLRIq1QUcT4O3aPQgqVqPwIOIMwDhzX6mQUFIQAgo+9MzcrWrML3mj6+YIKiFCZyhL87RqVQKrEskF+P1BUvfLCAkfRwoPUtq6l5o5+lZb5SolJo6oT8avTCl+c9OTmat6pKW8mLkvBpGzlvsiGuQr4ZEEwA1EQgoR/gNtxIxKBluz+OtMJiF31jHxqXBiAqAUj4WRxpADFM0DCFlv1khvX7Wol4vF4AIldVVxdZqlrIfiCYQPHDy6bAGv7nKYRVY6JewExZVAP+ey5Rv+Ba97aaUHMW5NauLmMZFkegBb/EP14d6NoS9QLWFSzWBmuZza8CQmSpXsAqmGtVy14VALWuuYWWy+W3OteXa4jwceQX6+BKG6J1/8+2VCNkm2222WabbbbZZpttttlmm22rt38DCdA0vq3bcAkAAAAASUVORK5CYII="; spider64 = "iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAJZUlEQVR42u1ZaXMU1xXlJ+gHpFITOy5sAcnIYCi2aIL2bTSSZrSP1NpHK41kISQBHgFaQIJBCMwi4TFUGYcPzggwEMcxHVGxQaag5QR/np/QP+Hmnsdr0hpmtEACwulb9aq7p7d3zz333Pt61q2zzTbbbLPNNttss80222yzzTbbVmu7MzKcJRWVkXjntqam6jyURPeGQqeTpqbOqp+evxC5dGlam5m5rE3PzGi8Hzx/4aLzbXDe09HdYxwZHaPc4mLFXVoW9pRXGNv3pDngeHlNLfE2Ljjj4xPOUGjSYKfpq6/+TLdv36bbX39Nt27epGvXvqSLl6bp3LlPtdOnz7jWrPNZ7kLCKCovp5bOTmP/4EHq6vmYMtzuSKbbbQCAHE8Rxd47MjrmuHjxkjF3/z4tLCzQkyc6PX78mB49ekQPHjygub/P0d27f6FrX/6JpqbO0YkT48E1R/sCr9cYHZ+gqrp64mPq+riXcoqKKC0vP9q6VyV/fQOiH+LrsPVY7z82PBKZnb1Bd+7cpfn5eQbgCT1hAADC/MN5uj83R99881eanZ2lL5gN/nrxjihAXwvOJ7l9vuiBQ4dF9LEtLC0V+2rv/ijTX6luaCS3rxT57wADAMTBQ4c9PIIDg4PBwYOHaHhklM5MnSWkwLff/o0+v3qVHv34Iz344QEDc4d8VVXUEAhQXXMzVdQqzKweKq6oABARzOGNOZ+Wl6fD6T25ubQrPT0E5xF93o82tbdjkkZ+iZfAAgbD6fZ6o339A8S0p7HjJ2h4eIQOHf6EujlV9nX3UOj0JDXzfXje+KlTdOPGDeF0T1+fGHg+2JSen08tHZ0CiPySEoPn8vq1IaOgIAzneQK0UzjcQd6qaqrlCVfV1+tpubnRnv5+2p2ZqYMF/oZGPTh0xLhy5Sr9wLn9j++/p5nLn9FxBoLZQJ1dKrkys6iYNeTExEnx3PqWFuF4W9deKq2upkEGCyzyMBC709MFC7r391Fjayv9MSdHZyCU1xJ5FjrNdN6VnU1KS4CjU4Yoh/m8CsezCguFJgAMV05ueP+BfhF5OL+gL9A/f/qJ7t3TaPLMFB09eoy6mTkMGg2PjTELOsS20OcTACgMKqJugqA0NtE7ycn0202b6A+ZmYIVAAKApGZlgRHB/0lqQPAqFEVE9hntM0R0ZblTzeswWdCeU8HAtYW+Uu0AUx+0f/jwoXD+56c/073v7tHU2XMiFbrUfVTNAtfL10FIAQL2QftsBrOEnavld5kg7E7PoF+99x79ev162rJrV9RMi6a2dvKUlQsR5uAgII7/ivMsbEE4g2hggjzC7LQL1OftovoO0WJKUn0gYEAn2hmMXo4QHIXQIfLfsfOXPwuLvB86cpQqamooyEzg1BLMwv04RkoE+B3B4BBBMHEcCwIP0N+ByJdUVhpgBJ7j4WvdANDjeTUglOaWEChfJF7uJzPX2HEPaj1vg7EAbHO5QnAeIPgqKvUB7gtAdbBgcvKMqOnc/NAIVwCcq21qElFnCgvaI9cBBFKhlSPbPzBIbbzduGULpWzfLkDAdZs++sgEwSlZqoIJMg2CzFSNGzODwdBfOi26+w4YTCm9LhDQwQDzdzguFf4FALjciTws8/u1yyx2N2/dovPnL9DRY8PkZ204xtuhoSM0wI7V8DEiirQCCHD+99u2CUdx3Lmvmz7kfemoGDgPEDr4HNKAf1MlAC4wgMGLWFJXQUrklZSEX6rLE2rOyDIQGlhgBUAyYFEZkm2vAGVi4qQ+x83M0389pevXr6OToy07d4qcR+krr/KzqpeJ/IfjGO+npDx3FCKHVPjd1q2LAMBI3ryZ9vL7U56BEzLfD80ACFba876OlGCQV9dAcT0Pyw7PgWij6zPP5Xt9EYgg+n3LosdVzdfz5CI8KY1LH31+5Yro9KanZwjHmPzmHTsoOeVDemfDBuE8dGVnWpqx3unUrE4CDLCAG64XAHB88IFgQV5xMY7DFmc16A6CZvnNBYYVcW+yKj0A/VHTsQ8dwMPNc6X+Gg0VIGbVpzYGWundjRujmGQWi9Eol7+TJ0/R2Nhx2sNlM9YJRPDdDRsM5DGPJB4KHOIhngHhAwixAGAAuDZ2lsuiYnFWBQOYrdEYNochilyiV6YHoH+rRNJkAG+fUw31PzU7Z1EFKPD69CIuQ1Bm6URoh8tFmVym3nc6rZOPyi0cD8HxeHPg3x2InNrbS79JTsYzNXmPuBclsO3ZvKwAOJEGsmI5rT0M+gSf3y9K5LIA1LUEIlL1k0AhCYBH5r9TCqBqib4D+c/1PyInGOThkvuaHCYALhlpbQWBMGR/4IpzTqlpbKQyf0045vdoe0zATHagSYMeWFMkbscnHRYPZjoFJaIiUkz9EJy15j/X3qCsAIqMcFjSWrNE1Iygg0fEmrtLzEUTdT/OhBFht9fHDVCbEUt3LJxi08B8Xj6vTDESriq9lVWqBECgHujqiqAUmufb1X3cfRXoluhjZWiwkOnSUcUS6ZD8LUmmhks6b5j1ezkAkAKZBe5QvPPcNBnoCawMwT66Qxk0R2xwwRAui2iSDGuaPDcubzo3EJq8wcx/9Vmk3QryH42QBQCFF0UagIiJtjX6DskIXTLEucJSHIIIMuO0BOcjn3A3ybU/lu5RCUBc5qA0Ih0Q2EWiCPRk7VfMNhjLW1zETic1tLYZDMKyuSsdfh5l6bwho5+0il4kyA0VohlNcF5FP8DlWo/VB16HYB2hJ0pzgIe2mcXxP2IOumPRY17U0tll8KIkZNb+sppafOxYkQPSaYfchyYoL9GMqWYpTLRIq1QUcT4O3aPQgqVqPwIOIMwDhzX6mQUFIQAgo+9MzcrWrML3mj6+YIKiFCZyhL87RqVQKrEskF+P1BUvfLCAkfRwoPUtq6l5o5+lZb5SolJo6oT8avTCl+c9OTmat6pKW8mLkvBpGzlvsiGuQr4ZEEwA1EQgoR/gNtxIxKBluz+OtMJiF31jHxqXBiAqAUj4WRxpADFM0DCFlv1khvX7Wol4vF4AIldVVxdZqlrIfiCYQPHDy6bAGv7nKYRVY6JewExZVAP+ey5Rv+Ba97aaUHMW5NauLmMZFkegBb/EP14d6NoS9QLWFSzWBmuZza8CQmSpXsAqmGtVy14VALWuuYWWy+W3OteXa4jwceQX6+BKG6J1/8+2VCNkm2222WabbbbZZpttttlmm22rt38DCdA0vq3bcAkAAAAASUVORK5CYII=";
@ -67,12 +67,12 @@ SeasonalWaiter.prototype.insert_spider_icons = function() {
* Replaces all instances of the word "cyber" with "spider". * Replaces all instances of the word "cyber" with "spider".
* #spiderchef * #spiderchef
*/ */
SeasonalWaiter.prototype.insert_spider_text = function() { SeasonalWaiter.prototype.insertSpiderText = function() {
// Title // Title
document.title = document.title.replace(/Cyber/g, "Spider"); document.title = document.title.replace(/Cyber/g, "Spider");
// Body // Body
SeasonalWaiter.tree_walk(document.body, function(node) { SeasonalWaiter.treeWalk(document.body, function(node) {
// process only text nodes // process only text nodes
if (node.nodeType === 3) { if (node.nodeType === 3) {
node.nodeValue = node.nodeValue.replace(/Cyber/g, "Spider"); node.nodeValue = node.nodeValue.replace(/Cyber/g, "Spider");
@ -80,7 +80,7 @@ SeasonalWaiter.prototype.insert_spider_text = function() {
}, true); }, true);
// Bake button // Bake button
SeasonalWaiter.tree_walk(document.getElementById("bake-group"), function(node) { SeasonalWaiter.treeWalk(document.getElementById("bake-group"), function(node) {
// process only text nodes // process only text nodes
if (node.nodeType === 3) { if (node.nodeType === 3) {
node.nodeValue = node.nodeValue.replace(/Bake/g, "Spin"); node.nodeValue = node.nodeValue.replace(/Bake/g, "Spin");
@ -96,15 +96,15 @@ SeasonalWaiter.prototype.insert_spider_text = function() {
* Adds an option to make it snow. * Adds an option to make it snow.
* #letitsnow * #letitsnow
*/ */
SeasonalWaiter.prototype.create_snow_option = function() { SeasonalWaiter.prototype.createSnowOption = function() {
var options_body = document.getElementById("options-body"), var optionsBody = document.getElementById("options-body"),
option_item = document.createElement("div"); optionItem = document.createElement("div");
option_item.className = "option-item"; optionItem.className = "option-item";
option_item.innerHTML = optionItem.innerHTML =
"<input type='checkbox' option='snow' checked />\ "<input type='checkbox' option='snow' checked />\
Let it snow"; Let it snow";
options_body.appendChild(option_item); optionsBody.appendChild(optionItem);
this.manager.options.load(); this.manager.options.load();
}; };
@ -114,14 +114,14 @@ SeasonalWaiter.prototype.create_snow_option = function() {
* Initialises a snowstorm. * Initialises a snowstorm.
* #letitsnow * #letitsnow
*/ */
SeasonalWaiter.prototype.let_it_snow = function() { SeasonalWaiter.prototype.letItSnow = function() {
$(document).snowfall("clear"); $(document).snowfall("clear");
if (!this.app.options.snow) return; if (!this.app.options.snow) return;
var options = {}, var options = {},
firefox_version = navigator.userAgent.match(/Firefox\/(\d\d?)/); firefoxVersion = navigator.userAgent.match(/Firefox\/(\d\d?)/);
if (firefox_version && parseInt(firefox_version[1], 10) < 30) { if (firefoxVersion && parseInt(firefoxVersion[1], 10) < 30) {
// Firefox < 30 // Firefox < 30
options = { options = {
flakeCount: 10, flakeCount: 10,
@ -163,12 +163,12 @@ SeasonalWaiter.prototype.let_it_snow = function() {
* When a button is clicked, shake the snow off that button. * When a button is clicked, shake the snow off that button.
* #letitsnow * #letitsnow
*/ */
SeasonalWaiter.prototype.shake_off_snow = function(e) { SeasonalWaiter.prototype.shakeOffSnow = function(e) {
var el = e.target, var el = e.target,
rect = el.getBoundingClientRect(), rect = el.getBoundingClientRect(),
canvases = document.querySelectorAll("canvas.snowfall-canvas"), canvases = document.querySelectorAll("canvas.snowfall-canvas"),
canvas = null, canvas = null,
remove_func = function() { removeFunc = function() {
ctx.clearRect(0, 0, canvas.width, canvas.height); ctx.clearRect(0, 0, canvas.width, canvas.height);
$(this).fadeIn(); $(this).fadeIn();
}; };
@ -178,7 +178,7 @@ SeasonalWaiter.prototype.shake_off_snow = function(e) {
if (canvas.style.left === rect.left + "px" && canvas.style.top === (rect.top - 20) + "px") { if (canvas.style.left === rect.left + "px" && canvas.style.top === (rect.top - 20) + "px") {
var ctx = canvas.getContext("2d"); var ctx = canvas.getContext("2d");
$(canvas).fadeOut("slow", remove_func); $(canvas).fadeOut("slow", removeFunc);
break; break;
} }
} }
@ -190,7 +190,7 @@ SeasonalWaiter.prototype.shake_off_snow = function(e) {
* sequence. * sequence.
* #konamicode * #konamicode
*/ */
SeasonalWaiter.prototype.konami_code_listener = function(e) { SeasonalWaiter.prototype.konamiCodeListener = function(e) {
this.kkeys.push(e.keyCode); this.kkeys.push(e.keyCode);
var konami = [38, 38, 40, 40, 37, 39, 37, 39, 66, 65]; var konami = [38, 38, 40, 40, 37, 39, 37, 39, 66, 65];
for (var i = 0; i < this.kkeys.length; i++) { for (var i = 0; i < this.kkeys.length; i++) {
@ -212,20 +212,20 @@ SeasonalWaiter.prototype.konami_code_listener = function(e) {
* @static * @static
* @param {element} parent - The DOM node to start from * @param {element} parent - The DOM node to start from
* @param {Function} fn - The callback function to operate on each node * @param {Function} fn - The callback function to operate on each node
* @param {booleam} all_nodes - Whether to operate on every node or not * @param {booleam} allNodes - Whether to operate on every node or not
*/ */
SeasonalWaiter.tree_walk = (function() { SeasonalWaiter.treeWalk = (function() {
// Create closure for constants // Create closure for constants
var skipTags = { var skipTags = {
"SCRIPT": true, "IFRAME": true, "OBJECT": true, "SCRIPT": true, "IFRAME": true, "OBJECT": true,
"EMBED": true, "STYLE": true, "LINK": true, "META": true "EMBED": true, "STYLE": true, "LINK": true, "META": true
}; };
return function(parent, fn, all_nodes) { return function(parent, fn, allNodes) {
var node = parent.firstChild; var node = parent.firstChild;
while (node && node !== parent) { while (node && node !== parent) {
if (all_nodes || node.nodeType === 1) { if (allNodes || node.nodeType === 1) {
if (fn(node) === false) { if (fn(node) === false) {
return(false); return(false);
} }

View File

@ -18,9 +18,9 @@ var WindowWaiter = function(app) {
* Resets the layout of CyberChef's panes after 200ms (so that continuous resizing doesn't cause * Resets the layout of CyberChef's panes after 200ms (so that continuous resizing doesn't cause
* continuous resetting). * continuous resetting).
*/ */
WindowWaiter.prototype.window_resize = function() { WindowWaiter.prototype.windowResize = function() {
clearTimeout(this.reset_layout_timeout); clearTimeout(this.resetLayoutTimeout);
this.reset_layout_timeout = setTimeout(this.app.reset_layout.bind(this.app), 200); this.resetLayoutTimeout = setTimeout(this.app.resetLayout.bind(this.app), 200);
}; };
@ -29,8 +29,8 @@ WindowWaiter.prototype.window_resize = function() {
* Saves the current time so that we can calculate how long the window was unfocussed for when * Saves the current time so that we can calculate how long the window was unfocussed for when
* focus is returned. * focus is returned.
*/ */
WindowWaiter.prototype.window_blur = function() { WindowWaiter.prototype.windowBlur = function() {
this.window_blur_time = new Date().getTime(); this.windowBlurTime = new Date().getTime();
}; };
@ -44,9 +44,9 @@ WindowWaiter.prototype.window_blur = function() {
* This will stop baking taking a long time when the CyberChef browser tab has been unfocused for * This will stop baking taking a long time when the CyberChef browser tab has been unfocused for
* a long time and the browser has swapped out all its memory. * a long time and the browser has swapped out all its memory.
*/ */
WindowWaiter.prototype.window_focus = function() { WindowWaiter.prototype.windowFocus = function() {
var unfocused_time = new Date().getTime() - this.window_blur_time; var unfocusedTime = new Date().getTime() - this.windowBlurTime;
if (unfocused_time > 60000) { if (unfocusedTime > 60000) {
this.app.silent_bake(); this.app.silentBake();
} }
}; };

View File

@ -10,7 +10,7 @@
* Main function used to build the CyberChef web app. * Main function used to build the CyberChef web app.
*/ */
var main = function() { var main = function() {
var default_favourites = [ var defaultFavourites = [
"To Base64", "To Base64",
"From Base64", "From Base64",
"To Hex", "To Hex",
@ -23,27 +23,27 @@ var main = function() {
"Fork" "Fork"
]; ];
var default_options = { var defaultOptions = {
update_url : true, updateUrl : true,
show_highlighter : true, showHighlighter : true,
treat_as_utf8 : true, treatAsUtf8 : true,
word_wrap : true, wordWrap : true,
show_errors : true, showErrors : true,
error_timeout : 4000, errorTimeout : 4000,
auto_bake_threshold : 200, autoBakeThreshold : 200,
attempt_highlight : true, attemptHighlight : true,
snow : false, snow : false,
}; };
document.removeEventListener("DOMContentLoaded", main, false); document.removeEventListener("DOMContentLoaded", main, false);
window.app = new HTMLApp(Categories, OperationConfig, default_favourites, default_options); window.app = new HTMLApp(Categories, OperationConfig, defaultFavourites, defaultOptions);
window.app.setup(); window.app.setup();
}; };
// Fix issues with browsers that don't support console.log() // Fix issues with browsers that don't support console.log()
window.console = console || {log: function() {}, error: function() {}}; window.console = console || {log: function() {}, error: function() {}};
window.compile_time = moment.tz("<%= grunt.template.today() %>", "ddd MMM D YYYY HH:mm:ss", "UTC").valueOf(); window.compileTime = moment.tz("<%= grunt.template.today() %>", "ddd MMM D YYYY HH:mm:ss", "UTC").valueOf();
window.compile_message = "<%= compile_msg %>"; window.compileMessage = "<%= compileMsg %>";
document.addEventListener("DOMContentLoaded", main, false); document.addEventListener("DOMContentLoaded", main, false);

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 235 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 245 B

View File

@ -1,3 +1,4 @@
<<<<<<< HEAD
203 source files 203 source files
<<<<<<< HEAD <<<<<<< HEAD
<<<<<<< HEAD <<<<<<< HEAD
@ -23,14 +24,24 @@
95316 lines 95316 lines
3.4M size 3.4M size
>>>>>>> master >>>>>>> master
=======
211 source files
114840 lines
4.3M size
78 third party JavaScript source files 141 JavaScript source files
76377 lines 105680 lines
2.7M size 3.7M size
>>>>>>> master
83 third party JavaScript source files
86258 lines
3.0M size
58 first party JavaScript source files 58 first party JavaScript source files
<<<<<<< HEAD <<<<<<< HEAD
<<<<<<< HEAD <<<<<<< HEAD
<<<<<<< HEAD
18934 lines 18934 lines
729K size 729K size
======= =======
@ -41,9 +52,13 @@
18939 lines 18939 lines
724K size 724K size
>>>>>>> master >>>>>>> master
=======
19422 lines
732K size
>>>>>>> master
3.2M uncompressed JavaScript size 3.4M uncompressed JavaScript size
1.7M compressed JavaScript size 1.9M compressed JavaScript size
15 categories 15 categories
155 operations 165 operations