aboutsummaryrefslogtreecommitdiff
path: root/node_modules/po2json/lib/parse.js
diff options
context:
space:
mode:
authorFlorian Dold <florian.dold@gmail.com>2016-10-10 03:43:44 +0200
committerFlorian Dold <florian.dold@gmail.com>2016-10-10 03:43:44 +0200
commitabd94a7f5a50f43c797a11b53549ae48fff667c3 (patch)
treeab8ed457f65cdd72e13e0571d2975729428f1551 /node_modules/po2json/lib/parse.js
parenta0247c6a3fd6a09a41a7e35a3441324c4dcb58be (diff)
add node_modules to address #4364
Diffstat (limited to 'node_modules/po2json/lib/parse.js')
-rw-r--r--node_modules/po2json/lib/parse.js106
1 files changed, 106 insertions, 0 deletions
diff --git a/node_modules/po2json/lib/parse.js b/node_modules/po2json/lib/parse.js
new file mode 100644
index 000000000..06139b2b5
--- /dev/null
+++ b/node_modules/po2json/lib/parse.js
@@ -0,0 +1,106 @@
+/**
+ * Parse PO buffer to JSON
+ *
+ * @param {Buffer|String} buffer - Buffer PO object or unicode string with PO data
+ * @param {Object} [options]
+ * @return {Object|String} Translation JSON
+ */
+
+module.exports = function(buffer, options) {
+
+ // Setup options and load in defaults
+ options = options || {};
+ var defaults = {
+ pretty: false,
+ fuzzy: false,
+ stringify: false,
+ format: 'raw',
+ domain: 'messages',
+ charset: 'utf8'
+ };
+
+ for (var property in defaults) {
+ options[property] = 'undefined' !== typeof options[property] ? options[property] : defaults[property];
+ }
+
+ // Parse the PO file
+ var parsed = require('gettext-parser').po.parse( buffer, defaults.charset );
+
+ // Create gettext/Jed compatible JSON from parsed data
+ var result = {},
+ contexts = parsed.translations;
+
+ Object.keys(contexts).forEach(function (context) {
+ var translations = parsed.translations[context];
+ var pluralForms = parsed.headers ? parsed.headers['plural-forms'] : '';
+
+ Object.keys(translations).forEach(function (key, i) {
+ var t = translations[key],
+ translationKey = context.length ? context + '\u0004' + key : key,
+ fuzzy = t.comments && t.comments.flag && t.comments.flag.match(/fuzzy/) !== null;
+
+ if (!fuzzy || options.fuzzy) {
+ if (options.format === 'mf') {
+ result[translationKey] = t.msgstr[0];
+ } else {
+ if(pluralForms == 'nplurals=1; plural=0;') {
+ msgstr = t.msgid_plural ? [t.msgstr] : t.msgstr
+ result[translationKey] = [ t.msgid_plural ? t.msgid_plural : null ].concat(msgstr);
+ } else {
+ result[translationKey] = [ t.msgid_plural ? t.msgid_plural : null ].concat(t.msgstr);
+ }
+ }
+ }
+
+ // In the case of fuzzy or empty messages, use msgid(/msgid_plural)
+ if (options['fallback-to-msgid'] && (fuzzy && !options.fuzzy || t.msgstr[0] === '')) {
+ if (options.format === 'mf') {
+ result[translationKey] = key;
+ } else {
+ result[translationKey] = [ t.msgid_plural ? t.msgid_plural : null ]
+ .concat(t.msgid_plural ? [key, t.msgid_plural] : [key]);
+ }
+ }
+
+ });
+ });
+
+ // Attach headers (overwrites any empty translation keys that may have somehow gotten in)
+ if (parsed.headers) {
+ result[''] = parsed.headers;
+ }
+
+ if (options.format === 'mf') {
+ delete result[''];
+ }
+
+ // Make JSON fully Jed-compatible
+ if (options.format.indexOf('jed') === 0) {
+ var jed = {
+ domain: options.domain,
+ locale_data: {}
+ };
+ if (options.format === 'jed1.x'){
+ for (var key in result) {
+ if (result.hasOwnProperty(key) && key !== ''){
+ for (var i = 2; i < result[key].length; i++){
+ if ('' === result[key][i]){
+ result[key][i] = result[key][0];
+ }
+ }
+ result[key].shift();
+ }
+ }
+ }
+ jed.locale_data[options.domain] = result;
+ jed.locale_data[options.domain][''] = {
+ domain: options.domain,
+ plural_forms: result['']['plural-forms'],
+ lang: result['']['language']
+ };
+
+ result = jed;
+ }
+
+ return options.stringify ? JSON.stringify( result, null, options.pretty ? ' ' : null ) : result;
+}