android-sex-size
Version:
a nodejs cli tool for android screen adaptation
164 lines (140 loc) • 4.22 kB
JavaScript
// 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);