UNPKG

generator-android-hipster

Version:

Android generator based on MVP, Dagger2, RxJava, Java & Kotlin Stack and usefull libraries for Android

356 lines (274 loc) 10.8 kB
'use strict'; var path = require('path'), fs = require('fs'), html = require("html-wiring"), shelljs = require('shelljs'), engine = require('ejs').render; module.exports = { rewrite: rewrite, rewriteReplace: rewriteReplace, rewriteReplaceMultiple: rewriteReplaceMultiple, rewriteFile: rewriteFile, rewriteFileMultiple: rewriteFileMultiple, replaceContent: replaceContent, classify: classify, rewriteJSONFile: rewriteJSONFile, copyWebResource: copyWebResource }; function rewriteReplaceMultiple(args) { args.path = args.path || process.cwd(); var fullPath = path.join(args.path, args.file); args.haystack = fs.readFileSync(fullPath, 'utf8'); var body = rewriteReplaceFileMultiple(args); fs.writeFileSync(fullPath, body); } function rewriteReplace(args) { args.path = args.path || process.cwd(); var fullPath = path.join(args.path, args.file); args.haystack = fs.readFileSync(fullPath, 'utf8'); var body = rewriteReplaceFile(args); fs.writeFileSync(fullPath, body); } function rewriteFile(args) { args.path = args.path || process.cwd(); var fullPath = path.join(args.path, args.file); args.haystack = fs.readFileSync(fullPath, 'utf8'); var body = rewrite(args); fs.writeFileSync(fullPath, body); } function rewriteFileMultiple(args) { args.path = args.path || process.cwd(); var fullPath = path.join(args.path, args.file); args.haystack = fs.readFileSync(fullPath, 'utf8'); var body = rewriteMultiple(args); fs.writeFileSync(fullPath, body); } function replaceContent(args) { args.path = args.path || process.cwd(); var fullPath = path.join(args.path, args.file); var re = args.regex ? new RegExp(args.pattern, 'g') : args.pattern; var body = fs.readFileSync(fullPath, 'utf8'); body = body.replace(re, args.content); fs.writeFileSync(fullPath, body); } function escapeRegExp(str) { return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&'); } function rewriteReplaceFile(args) { // check if splicable is already in the body text var re = new RegExp(args.splicable.map(function (line) { return '\s*' + escapeRegExp(line); }).join('\n')); if (re.test(args.haystack)) { return args.haystack; } var lines = args.haystack.split('\n'); var otherwiseLineIndex = -1; lines.forEach(function (line, i) { if (line.indexOf(args.needle) !== -1) { otherwiseLineIndex = i; } }); var spaces = 0; while (lines[otherwiseLineIndex].charAt(spaces) === ' ') { spaces += 1; } var spaceStr = ''; while ((spaces -= 1) >= 0) { spaceStr += ' '; } lines[otherwiseLineIndex] = args.splicable.map(function (line) { return spaceStr + line; }).join('\n'); return lines.join('\n'); } function rewriteReplaceFileMultiple(args) { var lines = args.haystack.split('\n'); for (var i = 0; i < args.dependencies.length; i++) { var otherwiseLineIndex = -1; var needle = args.dependencies[i].scope + ' "' + args.dependencies[i].group + ':' + args.dependencies[i].name + ':'; lines.forEach(function (line, i) { if (line.indexOf(needle) !== -1) { otherwiseLineIndex = i; } }); var isNew = false; if (lines[otherwiseLineIndex] == undefined) { // dont have the dependency, added now... var needle = args.needle || 'android-hipster-needle-gradle-dependency'; lines.forEach(function (line, i) { if (line.indexOf(needle) !== -1) { otherwiseLineIndex = i; isNew = true; } }); } var spaces = 0; while (lines[otherwiseLineIndex].charAt(spaces) === ' ') { spaces += 1; } var spaceStr = ''; while ((spaces -= 1) >= 0) { spaceStr += ' '; } var dep = args.dependencies[i].scope + ' "' + args.dependencies[i].group + ':' + args.dependencies[i].name + ':' + args.dependencies[i].version + '"'; console.log('updated:', dep); if (isNew) { lines.splice(otherwiseLineIndex, 0, spaceStr + args.dependencies[i].scope + ' "' + args.dependencies[i].group + ':' + args.dependencies[i].name + ':' + args.dependencies[i].version + '"').join('\n'); } else { lines[otherwiseLineIndex] = spaceStr + (dep); } } return lines.join('\n'); } function rewriteMultiple(args) { var lines = args.haystack.split('\n'); for (var i = 0; i < args.dependencies.length; i++) { var needle = args.needle || 'android-hipster-needle-gradle-dependency'; var otherwiseLineIndex = -1; lines.forEach(function (line, i) { if (line.indexOf(needle) !== -1) { otherwiseLineIndex = i; } }); var spaces = 0; while (lines[otherwiseLineIndex].charAt(spaces) === ' ') { spaces += 1; } var spaceStr = ''; while ((spaces -= 1) >= 0) { spaceStr += ' '; } var dep = args.dependencies[i].scope + ' "' + args.dependencies[i].group + ':' + args.dependencies[i].name + ':' + args.dependencies[i].version + '"'; console.log('added:', dep); lines.splice(otherwiseLineIndex, 0, spaceStr + args.dependencies[i].scope + ' "' + args.dependencies[i].group + ':' + args.dependencies[i].name + ':' + args.dependencies[i].version + '"').join('\n'); } return lines.join('\n'); } function rewrite(args) { // check if splicable is already in the body text var re = new RegExp(args.splicable.map(function (line) { return '\s*' + escapeRegExp(line); }).join('\n')); if (re.test(args.haystack)) { return args.haystack; } var lines = args.haystack.split('\n'); var otherwiseLineIndex = -1; lines.forEach(function (line, i) { if (line.indexOf(args.needle) !== -1) { otherwiseLineIndex = i; } }); var spaces = 0; while (lines[otherwiseLineIndex].charAt(spaces) === ' ') { spaces += 1; } var spaceStr = ''; while ((spaces -= 1) >= 0) { spaceStr += ' '; } lines.splice(otherwiseLineIndex, 0, args.splicable.map(function (line) { return spaceStr + line; }).join('\n')); return lines.join('\n'); } // _.classify uses _.titleize which lowercase the string, // so if the user chooses a proper ClassName it will not rename properly function classify(string) { string = string.replace(/[\W_](\w)/g, function (match) { return ' ' + match[1].toUpperCase(); }).replace(/\s/g, ''); return string.charAt(0).toUpperCase() + string.slice(1); } function rewriteJSONFile(filePath, rewriteFile) { var jsonObj = JSON.parse(fs.readFileSync(filePath, 'utf8')); rewriteFile(jsonObj); fs.writeFileSync(filePath, JSON.stringify(jsonObj, null, 4)); } function copyWebResource(source, dest, regex, type, _this, _opt, template) { _opt = _opt !== undefined ? _opt : {}; if (_this.enableTranslation) { // uses template method instead of copy if template boolean is set as true template ? _this.template(source, dest, _this, _opt) : _this.copy(source, dest); } else { var body = stripContent(source, regex, _this, _opt); switch (type) { case 'html' : body = replacePlaceholders(body, _this); break; case 'js' : body = replaceTitle(body, _this, template); break; } _this.write(dest, body); } } function stripContent(source, regex, _this, _opt) { var re = new RegExp(regex, 'g'); var body = html.readFileAsString(path.join(_this.sourceRoot(), source)); //temp hack to fix error thrown by ejs during entity creation, this needs a permanent fix when we add more .ejs files _opt.filename = path.join(_this.sourceRoot(), "src/main/webapp/app/ng_validators.ejs"); body = engine(body, _this, _opt); body = body.replace(re, ''); return body; } function replaceTitle(body, _this, template) { var re = /pageTitle[\s]*:[\s]*[\'|\"]([a-zA-Z0-9\.\-\_]+)[\'|\"]/g; var match; while (match = re.exec(body)) { // match is now the next match, in array form and our key is at index 1, index 1 is replace target. var key = match[1], target = key; var jsonData = geti18nJson(key, _this); var keyValue = jsonData !== undefined ? deepFind(jsonData, key) : undefined; body = body.replace(target, keyValue !== undefined ? keyValue : _this.baseName); } return body; } function replacePlaceholders(body, _this) { var re = /placeholder=[\'|\"]([\{]{2}[\'|\"]([a-zA-Z0-9\.\-\_]+)[\'|\"][\s][\|][\s](translate)[\}]{2})[\'|\"]/g; var match; while (match = re.exec(body)) { // match is now the next match, in array form and our key is at index 2, index 1 is replace target. var key = match[2], target = match[1]; var jsonData = geti18nJson(key, _this); var keyValue = jsonData !== undefined ? deepFind(jsonData, key, true) : undefined; // dirty fix to get placeholder as it is not in proper json format, name has a dot in it. Assuming that all placeholders are in similar format body = body.replace(target, keyValue !== undefined ? keyValue : ''); } return body; } function geti18nJson(key, _this, template) { var i18nDirectory = 'src/main/webapp/i18n/en/', name = key.split('.')[0].replace('-', '.'), filename = i18nDirectory + name + '.json', keyValue, render = template; if (!shelljs.test('-f', path.join(_this.sourceRoot(), filename))) { filename = i18nDirectory + '_' + name + '.json'; render = true; } try { var file = html.readFileAsString(path.join(_this.sourceRoot(), filename)); file = render ? engine(file, _this, {}) : file; file = JSON.parse(file); return file; } catch (err) { console.log('error' + err); // 'Error reading translation file!' return undefined; } } function deepFind(obj, path, placeholder) { var paths = path.split('.'), current = obj, i; if (placeholder) {// dirty fix for placeholders, the json files needs to be corrected paths[paths.length - 2] = paths[paths.length - 2] + '.' + paths[paths.length - 1]; paths.pop(); } for (i = 0; i < paths.length; ++i) { if (current[paths[i]] == undefined) { return undefined; } else { current = current[paths[i]]; } } return current; }