UNPKG

grunt-rot13

Version:

Encrypt strings in file with ROT-13 algorithm.

84 lines (70 loc) 2.81 kB
/* * grunt-rot13 * https://github.com/creativ/grunt-rot13 * * Copyright (c) 2015 Dmitriy Tkalich * Licensed under the MIT license. */ 'use strict'; var fs = require('fs'); var rot = require('rot'); var esprima = require('esprima'); var estraverse = require('estraverse'); var escodegen = require('escodegen'); module.exports = function(grunt) { grunt.registerMultiTask('rot13', 'Encrypt strings in file with ROT-13 algorithm.', function() { var options = this.options({ prependDecodeFunction: true, decodeFunctionName: 'rot', encryptionBase: 13, randomBase: false }); this.files.forEach(function(f) { // Build AST from source code var code = grunt.file.read(f.src); var ast = esprima.parse(code); var literalsCount = 1; ast = estraverse.replace(ast, { enter: function(node) { // Filter string if(node.type === 'Literal' && typeof node.value == 'string' && node.value.length > 0) { literalsCount++; if(literalsCount % 2 != 0) return node; var encryptionBase = options.encryptionBase; if(options.randomBase) { encryptionBase = Math.floor(Math.random() * (25 - 1 + 1)) + 1; } var decryptionBase = 26 - encryptionBase; // Wrap encrypted string with decrypt function node = { type: 'CallExpression', callee: { type: 'Identifier', name: options.decodeFunctionName }, arguments: [{ type: 'Literal', value: rot(node.value, encryptionBase), raw: rot(node.value, encryptionBase) }, { type: 'Literal', value: decryptionBase, raw: decryptionBase }] }; return node; } } }); // ROT-13 decode function var prependCode = ''; if(options.prependDecodeFunction == true) { prependCode = 'var lowercase="abcdefghijklmnopqrstuvwxyz",uppercase="ABCDEFGHIJKLMNOPQRSTUVWXYZ",regexLowercase=/[a-z]/,regexUppercase=/[A-Z]/,'+ options.decodeFunctionName + '=function(e,r){if(null==r&&(r=13),r=Number(r),e=String(e),0==r)return e;0>r&&(r+=26);for(var a,c,t,s=e.length,p=-1,n="";++p<s;)a=e.charAt(p),regexLowercase.test(a)?(c=lowercase.indexOf(a),t=(c+r)%26,n+=lowercase.charAt(t)):regexUppercase.test(a)?(c=uppercase.indexOf(a),t=(c+r)%26,n+=uppercase.charAt(t)):n+=a;return n}\n'; } // Generate new file from modified AST var modifiedCode = prependCode + escodegen.generate(ast); grunt.file.write(f.dest, modifiedCode); grunt.log.writeln('File "' + f.dest + '" encrypted.'); }); }); };