UNPKG

android-sex-size

Version:

a nodejs cli tool for android screen adaptation

164 lines (140 loc) 4.22 kB
// Generated by CoffeeScript 1.12.6 (function() { var CHARSET, DECLARATION, Promise, SEED, _, colors, convert, dispatcher, duplicate, expect, fs, glob, handler, logger, measure, mkdirs, names, parser, read, uid, write; _ = require('lodash'); fs = require('fs'); uid = require('uid'); colors = require('colors/safe'); glob = require('glob'); mkdirs = require('./mkdirs'); convert = require('xml-js'); logger = require('./logger'); Promise = require('bluebird'); read = Promise.promisify(fs.readFile); write = Promise.promisify(fs.writeFile); measure = require('./measurer'); expect = function(v) { return /^-?\d+((\.?\d+(dp|sp))|(dp|sp))$/.test(v); }; DECLARATION = '<?xml version="1.0" encoding="utf-8"?>'; SEED = 10; duplicate = false; names = {}; CHARSET = 'utf-8'; dispatcher = function(file, elements, counter) { return read(file, 'utf-8').then(function(xmlstr) { var document, xmloutstr; document = convert.xml2js(xmlstr); parser(document, elements, counter); xmloutstr = convert.js2xml(document, { indentAttributes: true, ignoreDeclaration: true, spaces: 4 }); return write(file, "" + DECLARATION + xmloutstr); }); }; parser = function(document, elements, counter) { var key, name, results, v, value; results = []; for (key in document) { value = document[key]; if (_.isArray(value)) { results.push((function() { var i, len, results1; results1 = []; for (i = 0, len = value.length; i < len; i++) { v = value[i]; results1.push(parser(v, elements, counter)); } return results1; })()); } else if (_.isObject(value)) { results.push(parser(value, elements, counter)); } else { if (expect(value)) { counter.value++; name = "ithot" + (uid(SEED)); elements.push({ type: 'element', name: 'dimen', attributes: { name: name }, elements: [ { type: 'text', text: value } ] }); results.push(document[key] = "@dimen/" + name); } else { results.push(void 0); } } } return results; }; handler = function(arg) { var base, counter, dimens, dimensfile, dimenstr, dimensxml, dragon, file, files, promises, targets; base = arg.base, targets = arg.targets, dragon = arg.dragon; files = glob.sync(dragon + "/src/main/res/**/!(dimens).xml"); dimens = { declaration: { attributes: { version: '1.0', encoding: 'utf-8' } }, elements: [ { type: 'element', name: 'resources', elements: [] } ] }; dimensfile = dragon + "/src/main/res/values/dimens.xml"; if (fs.existsSync(dimensfile)) { dimenstr = fs.readFileSync(dimensfile, CHARSET); dimensxml = convert.xml2js(dimenstr, { ignoreComment: true, ignoreDeclaration: true }); if (dimensxml.elements[0].elements != null) { dimens.elements[0].elements = dimensxml.elements[0].elements; } } counter = { value: 0 }; promises = (function() { var i, len, results; results = []; for (i = 0, len = files.length; i < len; i++) { file = files[i]; results.push(dispatcher(file, dimens.elements[0].elements, counter)); } return results; })(); return Promise.all(promises).then(function() { return write("" + dimensfile, convert.js2xml(dimens, { spaces: 4 })); }).then(function() { var option; logger.info("> extract " + (colors.yellow(counter.value)) + " values to " + (colors.cyan('dimens.xml')) + " all done."); option = { base: base, source: dimensfile, targets: targets, output: dragon + "/src/main/res/" }; return measure(option); }); }; module.exports = function(option) { return handler(option); }; }).call(this);