Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

gettext-parser

Package Overview
Dependencies
Maintainers
1
Versions
44
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

gettext-parser - npm Package Compare versions

Comparing version 0.2.0 to 1.0.0

.jshintrc

7

CHANGELOG.md
# Changelog
## v1.0.0 2015-01-21
* Bumped version to 1.0.0 to be compatible with semver
* Changed tests from nodeunit to mocha
* Unified code style in files and added jshint task to check it
* Added Grunt support to check style and run tests on `npm test`
## v0.2.0 2013-12-30

@@ -4,0 +11,0 @@

18

index.js

@@ -1,13 +0,13 @@

"use strict";
'use strict';
module.exports = {
po: {
parse: require("./lib/poparser"),
compile: require("./lib/pocompiler")
},
po: {
parse: require('./lib/poparser'),
compile: require('./lib/pocompiler')
},
mo: {
parse: require("./lib/moparser"),
compile: require("./lib/mocompiler")
}
mo: {
parse: require('./lib/moparser'),
compile: require('./lib/mocompiler')
}
};

@@ -1,5 +0,5 @@

"use strict";
'use strict';
var encoding = require("encoding"),
sharedFuncs = require("./shared");
var encoding = require('encoding');
var sharedFuncs = require('./shared');

@@ -13,3 +13,3 @@ /**

*/
module.exports = function(table){
module.exports = function(table) {
var compiler = new Compiler(table);

@@ -25,3 +25,3 @@ return compiler.compile();

*/
function Compiler(table){
function Compiler(table) {
this._table = table || {};

@@ -33,3 +33,3 @@ this._table.headers = this._table.headers || {};

this._writeFunc = "writeUInt32LE";
this._writeFunc = 'writeUInt32LE';

@@ -47,4 +47,4 @@ this._handleCharset();

*/
Compiler.prototype._handleCharset = function(){
var parts = (this._table.headers['content-type'] || "text/plain").split(";"),
Compiler.prototype._handleCharset = function() {
var parts = (this._table.headers['content-type'] || 'text/plain').split(';'),
contentType = parts.shift(),

@@ -54,12 +54,12 @@ charset = sharedFuncs.formatCharset(this._table.charset),

params = parts.map(function(part){
var parts = part.split("="),
params = parts.map(function(part) {
var parts = part.split('='),
key = parts.shift().trim(),
value = parts.join("=");
value = parts.join('=');
if(key.toLowerCase() == "charset"){
if(!charset){
charset = sharedFuncs.formatCharset(value.trim() || "utf-8");
if (key.toLowerCase() === 'charset') {
if (!charset) {
charset = sharedFuncs.formatCharset(value.trim() || 'utf-8');
}
return "charset=" + charset;
return 'charset=' + charset;
}

@@ -70,9 +70,9 @@

if(!charset){
charset = this._table.charset || "utf-8";
params.push("charset=" + charset);
if (!charset) {
charset = this._table.charset || 'utf-8';
params.push('charset=' + charset);
}
this._table.charset = charset;
this._table.headers['content-type'] = contentType + "; " + params.join("; ");
this._table.headers['content-type'] = contentType + '; ' + params.join('; ');

@@ -88,3 +88,3 @@ this._charset = charset;

*/
Compiler.prototype._generateList = function(){
Compiler.prototype._generateList = function() {
var list = [];

@@ -97,11 +97,11 @@

Object.keys(this._table.translations).forEach((function(msgctxt){
if(typeof this._table.translations[msgctxt] != "object"){
Object.keys(this._table.translations).forEach((function(msgctxt) {
if (typeof this._table.translations[msgctxt] !== 'object') {
return;
}
Object.keys(this._table.translations[msgctxt]).forEach((function(msgid){
if(typeof this._table.translations[msgctxt][msgid] != "object"){
Object.keys(this._table.translations[msgctxt]).forEach((function(msgid) {
if (typeof this._table.translations[msgctxt][msgid] !== 'object') {
return;
}
if(msgctxt === "" && msgid === ""){
if (msgctxt === '' && msgid === '') {
return;

@@ -114,11 +114,11 @@ }

if(msgctxt){
key = msgctxt + "\u0004" + key;
if (msgctxt) {
key = msgctxt + '\u0004' + key;
}
if(msgid_plural){
key += "\u0000" + msgid_plural;
if (msgid_plural) {
key += '\u0000' + msgid_plural;
}
value = [].concat(this._table.translations[msgctxt][msgid].msgstr || []).join("\u0000");
value = [].concat(this._table.translations[msgctxt][msgid].msgstr || []).join('\u0000');

@@ -141,6 +141,8 @@ list.push({

*/
Compiler.prototype._calculateSize = function(list){
var msgidLength = 0, msgstrLength = 0, totalLength = 0;
Compiler.prototype._calculateSize = function(list) {
var msgidLength = 0,
msgstrLength = 0,
totalLength = 0;
list.forEach(function(translation){
list.forEach(function(translation) {
msgidLength += translation.msgid.length + 1; // + extra 0x00

@@ -151,12 +153,12 @@ msgstrLength += translation.msgstr.length + 1; // + extra 0x00

totalLength = 4 + // magic number
4 + // revision
4 + // string count
4 + // original string table offset
4 + // translation string table offset
4 + // hash table size
4 + // hash table offset
(4+4) * list.length + // original string table
(4+4) * list.length + // translations string table
msgidLength + // originals
msgstrLength; // translations
4 + // revision
4 + // string count
4 + // original string table offset
4 + // translation string table offset
4 + // hash table size
4 + // hash table offset
(4 + 4) * list.length + // original string table
(4 + 4) * list.length + // translations string table
msgidLength + // originals
msgstrLength; // translations

@@ -177,3 +179,3 @@ return {

*/
Compiler.prototype._build = function(list, size){
Compiler.prototype._build = function(list, size) {
var returnBuffer = new Buffer(size.total),

@@ -196,3 +198,3 @@ curPosition = 0,

// translation string table offset
returnBuffer[this._writeFunc](28 + (4+4) * list.length, 16);
returnBuffer[this._writeFunc](28 + (4 + 4) * list.length, 16);

@@ -203,7 +205,7 @@ // hash table size

// hash table offset
returnBuffer[this._writeFunc](28 + (4+4) * list.length, 24);
returnBuffer[this._writeFunc](28 + (4 + 4) * list.length, 24);
// build originals table
curPosition = 28 + 2 * (4 + 4) * list.length;
for(i=0, len = list.length; i < len; i++){
for (i = 0, len = list.length; i < len; i++) {
list[i].msgid.copy(returnBuffer, curPosition);

@@ -213,10 +215,10 @@ returnBuffer[this._writeFunc](list[i].msgid.length, 28 + i * 8);

returnBuffer[curPosition + list[i].msgid.length] = 0x00;
curPosition += list[i].msgid.length+1;
curPosition += list[i].msgid.length + 1;
}
// build translations table
for(i=0, len = list.length; i<len; i++){
for (i = 0, len = list.length; i < len; i++) {
list[i].msgstr.copy(returnBuffer, curPosition);
returnBuffer[this._writeFunc](list[i].msgstr.length, 28 + (4 + 4) * list.length + i * 8);
returnBuffer[this._writeFunc](curPosition, 28 + (4+4) * list.length + i * 8 + 4);
returnBuffer[this._writeFunc](curPosition, 28 + (4 + 4) * list.length + i * 8 + 4);
returnBuffer[curPosition + list[i].msgstr.length] = 0x00;

@@ -234,3 +236,3 @@ curPosition += list[i].msgstr.length + 1;

*/
Compiler.prototype.compile = function(){
Compiler.prototype.compile = function() {
var list = this._generateList(),

@@ -240,7 +242,7 @@ size = this._calculateSize(list);

// sort by msgid
list.sort(function(a, b){
if(a.msgid > b.msgid){
list.sort(function(a, b) {
if (a.msgid > b.msgid) {
return 1;
}
if(a.msgid < b.msgid){
if (a.msgid < b.msgid) {
return -1;

@@ -252,2 +254,2 @@ }

return this._build(list, size);
};
};

@@ -1,5 +0,5 @@

"use strict";
'use strict';
var encoding = require("encoding"),
sharedFuncs = require("./shared");
var encoding = require('encoding');
var sharedFuncs = require('./shared');

@@ -13,3 +13,3 @@ /**

*/
module.exports = function(buffer, defaultCharset){
module.exports = function(buffer, defaultCharset) {
var parser = new Parser(buffer, defaultCharset);

@@ -26,3 +26,3 @@ return parser.parse();

*/
function Parser(fileContents, defaultCharset){
function Parser(fileContents, defaultCharset) {

@@ -34,3 +34,3 @@ this._fileContents = fileContents;

*/
this._writeFunc = "writeUInt32LE";
this._writeFunc = 'writeUInt32LE';

@@ -40,5 +40,5 @@ /**

*/
this._readFunc = "readUInt32LE";
this._readFunc = 'readUInt32LE';
this._charset = defaultCharset || "iso-8859-1";
this._charset = defaultCharset || 'iso-8859-1';

@@ -62,12 +62,12 @@ this._table = {

*/
Parser.prototype._checkMagick = function(){
if(this._fileContents.readUInt32LE(0) == this.MAGIC){
this._readFunc = "readUInt32LE";
this._writeFunc = "writeUInt32LE";
Parser.prototype._checkMagick = function() {
if (this._fileContents.readUInt32LE(0) === this.MAGIC) {
this._readFunc = 'readUInt32LE';
this._writeFunc = 'writeUInt32LE';
return true;
}else if(this._fileContents.readUInt32BE(0) == this.MAGIC){
this._readFunc = "readUInt32BE";
this._writeFunc = "writeUInt32BE";
} else if (this._fileContents.readUInt32BE(0) === this.MAGIC) {
this._readFunc = 'readUInt32BE';
this._writeFunc = 'writeUInt32BE';
return true;
}else{
} else {
return false;

@@ -81,3 +81,3 @@ }

*/
Parser.prototype._loadTranslationTable = function(){
Parser.prototype._loadTranslationTable = function() {
var offsetOriginals = this._offsetOriginals,

@@ -88,3 +88,3 @@ offsetTranslations = this._offsetTranslations,

for(var i = 0; i < this._total; i++){
for (var i = 0; i < this._total; i++) {
// msgid string

@@ -104,8 +104,8 @@ length = this._fileContents[this._readFunc](offsetOriginals);

if(!i && !msgid.toString()){
if (!i && !msgid.toString()) {
this._handleCharset(msgstr);
}
msgid = encoding.convert(msgid, "utf-8", this._charset).toString("utf-8");
msgstr = encoding.convert(msgstr, "utf-8", this._charset).toString("utf-8");
msgid = encoding.convert(msgid, 'utf-8', this._charset).toString('utf-8');
msgstr = encoding.convert(msgstr, 'utf-8', this._charset).toString('utf-8');

@@ -124,3 +124,3 @@ this._addString(msgid, msgstr);

*/
Parser.prototype._handleCharset = function(headers){
Parser.prototype._handleCharset = function(headers) {

@@ -130,7 +130,7 @@ var headersStr = headers.toString(),

if((match = headersStr.match(/[; ]charset\s*=\s*([\w\-]+)/i))){
if ((match = headersStr.match(/[; ]charset\s*=\s*([\w\-]+)/i))) {
this._charset = this._table.charset = sharedFuncs.formatCharset(match[1], this._charset);
}
headers = encoding.convert(headers, "utf-8", this._charset).toString("utf-8");
headers = encoding.convert(headers, 'utf-8', this._charset).toString('utf-8');

@@ -146,15 +146,16 @@ this._table.headers = sharedFuncs.parseHeader(headers);

*/
Parser.prototype._addString = function(msgid, msgstr){
var translation = {}, parts, msgctxt, msgid_plural;
Parser.prototype._addString = function(msgid, msgstr) {
var translation = {},
parts, msgctxt, msgid_plural;
msgid = msgid.split("\u0004");
if(msgid.length > 1){
msgid = msgid.split('\u0004');
if (msgid.length > 1) {
msgctxt = msgid.shift();
translation.msgctxt = msgctxt;
}else{
msgctxt = "";
} else {
msgctxt = '';
}
msgid = msgid.join("\u0004");
msgid = msgid.join('\u0004');
parts = msgid.split("\u0000");
parts = msgid.split('\u0000');
msgid = parts.shift();

@@ -164,10 +165,10 @@

if((msgid_plural = parts.join("\u0000"))){
if ((msgid_plural = parts.join('\u0000'))) {
translation.msgid_plural = msgid_plural;
}
msgstr = msgstr.split("\u0000");
msgstr = msgstr.split('\u0000');
translation.msgstr = [].concat(msgstr || []);
if(!this._table.translations[msgctxt]){
if (!this._table.translations[msgctxt]) {
this._table.translations[msgctxt] = {};

@@ -184,4 +185,4 @@ }

*/
Parser.prototype.parse = function(){
if(!this._checkMagick()){
Parser.prototype.parse = function() {
if (!this._checkMagick()) {
return false;

@@ -214,2 +215,2 @@ }

return this._table;
};
};

@@ -1,5 +0,5 @@

"use strict";
'use strict';
var encoding = require("encoding"),
sharedFuncs = require("./shared");
var encoding = require('encoding');
var sharedFuncs = require('./shared');

@@ -13,3 +13,3 @@ /**

*/
module.exports = function(table){
module.exports = function(table) {
var compiler = new Compiler(table);

@@ -25,9 +25,7 @@ return compiler.compile();

*/
function Compiler(table){
function Compiler(table) {
this._table = table || {};
this._table.headers = this._table.headers || {};
this._table.translations = this._table.translations || {};
this._translations = [];
this._handleCharset();

@@ -38,3 +36,3 @@ }

* Converts a comments object to a comment string. The comment object is
* in the form of {translator:"", reference: "", extracted: "", flag: "", previous:""}
* in the form of {translator:'', reference: '', extracted: '', flag: '', previous:''}
*

@@ -44,32 +42,26 @@ * @param {Object} comments A comments object

*/
Compiler.prototype._drawComments = function(comments){
Compiler.prototype._drawComments = function(comments) {
var lines = [];
var types = [
{
key: "translator",
prefix: "# "
},
{
key: "reference",
prefix: "#: "
},
{
key: "extracted",
prefix: "#. "
},
{
key: "flag",
prefix: "#, "
},
{
key: "previous",
prefix: "#| "
}
];
var types = [{
key: 'translator',
prefix: '# '
}, {
key: 'reference',
prefix: '#: '
}, {
key: 'extracted',
prefix: '#. '
}, {
key: 'flag',
prefix: '#, '
}, {
key: 'previous',
prefix: '#| '
}];
types.forEach(function(type){
if(!comments[type.key]){
types.forEach(function(type) {
if (!comments[type.key]) {
return;
}
comments[type.key].split(/\r?\n|\r/).forEach(function(line){
comments[type.key].split(/\r?\n|\r/).forEach(function(line) {
lines.push(type.prefix + line);

@@ -79,3 +71,3 @@ });

return lines.join("\n");
return lines.join('\n');
};

@@ -90,3 +82,3 @@

*/
Compiler.prototype._drawBlock = function(block, override){
Compiler.prototype._drawBlock = function(block, override) {

@@ -104,25 +96,25 @@ override = override || {};

// add comments
if(comments && (comments = this._drawComments(comments))){
if (comments && (comments = this._drawComments(comments))) {
response.push(comments);
}
if(msgctxt){
response.push(this._addPOString("msgctxt", msgctxt));
if (msgctxt) {
response.push(this._addPOString('msgctxt', msgctxt));
}
response.push(this._addPOString("msgid", msgid || ""));
response.push(this._addPOString('msgid', msgid || ''));
if(msgid_plural){
response.push(this._addPOString("msgid_plural", msgid_plural));
if (msgid_plural) {
response.push(this._addPOString('msgid_plural', msgid_plural));
}
if(msgstr.length <= 1){
response.push(this._addPOString("msgstr", msgstr[0] || ""));
}else{
msgstr.forEach((function(msgstr, i){
response.push(this._addPOString("msgstr["+i+"]", msgstr || ""));
if (msgstr.length <= 1) {
response.push(this._addPOString('msgstr', msgstr[0] || ''));
} else {
msgstr.forEach((function(msgstr, i) {
response.push(this._addPOString('msgstr[' + i + ']', msgstr || ''));
}).bind(this));
}
return response.join("\n");
return response.join('\n');
};

@@ -137,33 +129,33 @@

*/
Compiler.prototype._addPOString = function(key, value){
Compiler.prototype._addPOString = function(key, value) {
var line;
key = (key || "").toString();
key = (key || '').toString();
// escape newlines and quotes
value = (value || "").toString().
replace(/\\/g, "\\\\").
replace(/\"/g, "\\\"").
replace(/\t/g, "\\t").
replace(/\r/g, "\\r").
replace(/\n/g, "\\n");
value = (value || '').toString().
replace(/\\/g, '\\\\').
replace(/"/g, '\\"').
replace(/\t/g, '\\t').
replace(/\r/g, '\\r').
replace(/\n/g, '\\n');
var lines = sharedFuncs.foldLine(value);
if(lines.length < 2){
return key + " \"" + (lines.shift() || "") + "\"";
}else{
return key + " \"\"\n\"" + lines.join("\"\n\"") + "\"";
if (lines.length < 2) {
return key + ' "' + (lines.shift() || '') + '"';
} else {
return key + ' ""\n"' + lines.join('"\n"') + '"';
}
if(value.match(/\n/)){
value = value.replace(/\n/g, "\\n\n").replace(/\n$/, "");
line = ("\n"+value).split("\n").map(function(l){
if (value.match(/\n/)) {
value = value.replace(/\n/g, '\\n\n').replace(/\n$/, '');
line = ('\n' + value).split('\n').map(function(l) {
return '"' + l + '"';
}).join("\n");
}else{
}).join('\n');
} else {
line = '"' + value + '"';
}
return key + " " + line;
return key + ' ' + line;
};

@@ -174,18 +166,18 @@

*/
Compiler.prototype._handleCharset = function(){
var parts = (this._table.headers['content-type'] || "text/plain").split(";"),
contentType = parts.shift(),
charset = sharedFuncs.formatCharset(this._table.charset),
params = [];
Compiler.prototype._handleCharset = function() {
var parts = (this._table.headers['content-type'] || 'text/plain').split(';');
var contentType = parts.shift();
var charset = sharedFuncs.formatCharset(this._table.charset);
var params = [];
params = parts.map(function(part){
var parts = part.split("="),
params = parts.map(function(part) {
var parts = part.split('='),
key = parts.shift().trim(),
value = parts.join("=");
value = parts.join('=');
if(key.toLowerCase() == "charset"){
if(!charset){
charset = sharedFuncs.formatCharset(value.trim() || "utf-8");
if (key.toLowerCase() === 'charset') {
if (!charset) {
charset = sharedFuncs.formatCharset(value.trim() || 'utf-8');
}
return "charset=" + charset;
return 'charset=' + charset;
}

@@ -196,9 +188,9 @@

if(!charset){
charset = this._table.charset || "utf-8";
params.push("charset=" + charset);
if (!charset) {
charset = this._table.charset || 'utf-8';
params.push('charset=' + charset);
}
this._table.charset = charset;
this._table.headers['content-type'] = contentType + "; " + params.join("; ");
this._table.headers['content-type'] = contentType + '; ' + params.join('; ');

@@ -213,18 +205,20 @@ this._charset = charset;

*/
Compiler.prototype.compile = function(){
Compiler.prototype.compile = function() {
var response = [],
headerBlock = this._table.translations[""] && this._table.translations[""][""] || {};
headerBlock = this._table.translations[''] && this._table.translations[''][''] || {};
response.push(this._drawBlock(headerBlock, {msgstr: sharedFuncs.generateHeader(this._table.headers)}));
response.push(this._drawBlock(headerBlock, {
msgstr: sharedFuncs.generateHeader(this._table.headers)
}));
Object.keys(this._table.translations).forEach((function(msgctxt){
if(typeof this._table.translations[msgctxt] != "object"){
Object.keys(this._table.translations).forEach((function(msgctxt) {
if (typeof this._table.translations[msgctxt] !== 'object') {
return;
}
Object.keys(this._table.translations[msgctxt]).forEach((function(msgid){
if(typeof this._table.translations[msgctxt][msgid] != "object"){
Object.keys(this._table.translations[msgctxt]).forEach((function(msgid) {
if (typeof this._table.translations[msgctxt][msgid] !== 'object') {
return;
}
if(msgctxt === "" && msgid === ""){
if (msgctxt === '' && msgid === '') {
return;

@@ -237,7 +231,7 @@ }

if(this._charset == "utf-8" || this._charset == "ascii"){
return new Buffer(response.join("\n\n"), "utf-8");
}else{
return encoding.convert(response.join("\n\n"), this._charset);
if (this._charset === 'utf-8' || this._charset === 'ascii') {
return new Buffer(response.join('\n\n'), 'utf-8');
} else {
return encoding.convert(response.join('\n\n'), this._charset);
}
};
};

@@ -1,5 +0,5 @@

"use strict";
'use strict';
var encoding = require("encoding"),
sharedFuncs = require("./shared");
var encoding = require('encoding');
var sharedFuncs = require('./shared');

@@ -13,3 +13,3 @@ /**

*/
module.exports = function(buffer, defaultCharset){
module.exports = function(buffer, defaultCharset) {
var parser = new Parser(buffer, defaultCharset);

@@ -27,10 +27,10 @@ return parser.parse();

*/
function Parser(fileContents, defaultCharset){
function Parser(fileContents, defaultCharset) {
this._charset = defaultCharset || "iso-8859-1";
this._charset = defaultCharset || 'iso-8859-1';
if(typeof fileContents == "string"){
this._charset = "utf-8";
if (typeof fileContents === 'string') {
this._charset = 'utf-8';
this._fileContents = fileContents;
}else{
} else {
this._handleCharset(fileContents);

@@ -46,8 +46,9 @@ }

*/
Parser.prototype._handleCharset = function(buf){
var str = (buf || "").toString(),
pos, headers = "", match;
Parser.prototype._handleCharset = function(buf) {
var str = (buf || '').toString(),
pos, headers = '',
match;
if((pos = str.search(/^\s*msgid/im))>=0){
if((pos = pos + str.substr(pos + 5).search(/^\s*(msgid|msgctxt)/im))){
if ((pos = str.search(/^\s*msgid/im)) >= 0) {
if ((pos = pos + str.substr(pos + 5).search(/^\s*(msgid|msgctxt)/im))) {
headers = str.substr(0, pos);

@@ -57,10 +58,10 @@ }

if((match = headers.match(/[; ]charset\s*=\s*([\w\-]+)(?:[\s;]|\\n)*"\s*$/mi))){
if ((match = headers.match(/[; ]charset\s*=\s*([\w\-]+)(?:[\s;]|\\n)*"\s*$/mi))) {
this._charset = sharedFuncs.formatCharset(match[1], this._charset);
}
if(this._charset == "utf-8"){
if (this._charset === 'utf-8') {
this._fileContents = str;
}else{
this._fileContents = encoding.convert(buf, "utf-8", this._charset).toString("utf-8");
} else {
this._fileContents = encoding.convert(buf, 'utf-8', this._charset).toString('utf-8');
}

@@ -92,3 +93,3 @@ };

Parser.prototype.symbols = {
quotes: /['"]/,
quotes: /["']/,
comments: /\#/,

@@ -104,3 +105,3 @@ whitespace: /\s/,

*/
Parser.prototype._lexer = function(){
Parser.prototype._lexer = function() {
var chr,

@@ -112,10 +113,10 @@ escaped = false,

for(var i=0, len = this._fileContents.length; i<len; i++){
for (var i = 0, len = this._fileContents.length; i < len; i++) {
chr = this._fileContents.charAt(i);
switch(state){
switch (state) {
case this.states.none:
if(chr.match(this.symbols.quotes)){
if (chr.match(this.symbols.quotes)) {
node = {
type: this.types.string,
value: "",
value: '',
quote: chr

@@ -125,10 +126,10 @@ };

state = this.states.string;
}else if(chr.match(this.symbols.comments)){
} else if (chr.match(this.symbols.comments)) {
node = {
type: this.types.comments,
value: ""
value: ''
};
lex.push(node);
state = this.states.comments;
}else if(!chr.match(this.symbols.whitespace)){
} else if (!chr.match(this.symbols.whitespace)) {
node = {

@@ -143,5 +144,5 @@ type: this.types.key,

case this.states.comments:
if(chr == "\n"){
if (chr === '\n') {
state = this.states.none;
}else if(chr != "\r"){
} else if (chr !== '\r') {
node.value += chr;

@@ -151,7 +152,13 @@ }

case this.states.string:
if(escaped){
switch(chr){
case "t": node.value += "\t"; break;
case "n": node.value += "\n"; break;
case "r": node.value += "\r"; break;
if (escaped) {
switch (chr) {
case 't':
node.value += '\t';
break;
case 'n':
node.value += '\n';
break;
case 'r':
node.value += '\r';
break;
default:

@@ -161,9 +168,9 @@ node.value += chr;

escaped = false;
}else{
if(chr == node.quote){
} else {
if (chr === node.quote) {
state = this.states.none;
}else if(chr == "\\"){
} else if (chr === '\\') {
escaped = true;
break;
}else{
} else {
node.value += chr;

@@ -175,6 +182,6 @@ }

case this.states.key:
if(!chr.match(this.symbols.key)){
if (!chr.match(this.symbols.key)) {
state = this.states.none;
i--;
}else{
} else {
node.value += chr;

@@ -195,11 +202,11 @@ }

*/
Parser.prototype._joinStringValues = function(lex){
Parser.prototype._joinStringValues = function(lex) {
var lastNode, response = [];
for(var i=0, len = lex.length; i<len; i++){
if(lastNode && lex[i].type == this.types.string && lastNode.type == this.types.string){
for (var i = 0, len = lex.length; i < len; i++) {
if (lastNode && lex[i].type === this.types.string && lastNode.type === this.types.string) {
lastNode.value += lex[i].value;
}else if(lastNode && lex[i].type == this.types.comments && lastNode.type == this.types.comments){
lastNode.value += "\n" + lex[i].value;
}else{
} else if (lastNode && lex[i].type === this.types.comments && lastNode.type === this.types.comments) {
lastNode.value += '\n' + lex[i].value;
} else {
response.push(lex[i]);

@@ -218,26 +225,32 @@ lastNode = lex[i];

*/
Parser.prototype._parseComments = function(lex){
Parser.prototype._parseComments = function(lex) {
// parse comments
lex.forEach((function(node){
lex.forEach((function(node) {
var comment, lines;
if(node && node.type == this.types.comments){
comment = {translator: [], extracted: [], reference: [], flag: [], previous: []};
lines = (node.value || "").split(/\n/);
lines.forEach(function(line){
switch(line.charAt(0) || ""){
case ":":
if (node && node.type === this.types.comments) {
comment = {
translator: [],
extracted: [],
reference: [],
flag: [],
previous: []
};
lines = (node.value || '').split(/\n/);
lines.forEach(function(line) {
switch (line.charAt(0) || '') {
case ':':
comment.reference.push(line.substr(1).trim());
break;
case ".":
comment.extracted.push(line.substr(1).replace(/^\s+/, ""));
case '.':
comment.extracted.push(line.substr(1).replace(/^\s+/, ''));
break;
case ",":
comment.flag.push(line.substr(1).replace(/^\s+/, ""));
case ',':
comment.flag.push(line.substr(1).replace(/^\s+/, ''));
break;
case "|":
comment.previous.push(line.substr(1).replace(/^\s+/, ""));
case '|':
comment.previous.push(line.substr(1).replace(/^\s+/, ''));
break;
default:
comment.translator.push(line.replace(/^\s+/, ""));
comment.translator.push(line.replace(/^\s+/, ''));
}

@@ -248,5 +261,5 @@ });

Object.keys(comment).forEach(function(key){
if(comment[key] && comment[key].length){
node.value[key] = comment[key].join("\n");
Object.keys(comment).forEach(function(key) {
if (comment[key] && comment[key].length) {
node.value[key] = comment[key].join('\n');
}

@@ -264,16 +277,17 @@ });

*/
Parser.prototype._handleKeys = function(lex){
var response = [], lastNode;
Parser.prototype._handleKeys = function(lex) {
var response = [],
lastNode;
for(var i=0, len = lex.length; i<len; i++){
if(lex[i].type == this.types.key){
for (var i = 0, len = lex.length; i < len; i++) {
if (lex[i].type === this.types.key) {
lastNode = {
key: lex[i].value
};
if(i && lex[i-1].type == this.types.comments){
lastNode.comments = lex[i-1].value;
if (i && lex[i - 1].type === this.types.comments) {
lastNode.comments = lex[i - 1].value;
}
lastNode.value = "";
lastNode.value = '';
response.push(lastNode);
}else if(lex[i].type == this.types.string && lastNode){
} else if (lex[i].type === this.types.string && lastNode) {
lastNode.value += lex[i].value;

@@ -292,10 +306,11 @@ }

*/
Parser.prototype._handleValues = function(lex){
var response = [], lastNode, curContext, curComments;
Parser.prototype._handleValues = function(lex) {
var response = [],
lastNode, curContext, curComments;
for(var i=0, len = lex.length; i<len; i++){
if(lex[i].key.toLowerCase() == "msgctxt"){
for (var i = 0, len = lex.length; i < len; i++) {
if (lex[i].key.toLowerCase() === 'msgctxt') {
curContext = lex[i].value;
curComments = lex[i].comments;
}else if(lex[i].key.toLowerCase() == "msgid"){
} else if (lex[i].key.toLowerCase() === 'msgid') {
lastNode = {

@@ -305,11 +320,11 @@ msgid: lex[i].value

if(curContext){
if (curContext) {
lastNode.msgctxt = curContext;
}
if(curComments){
if (curComments) {
lastNode.comments = curComments;
}
if(lex[i].comments && !lastNode.comments){
if (lex[i].comments && !lastNode.comments) {
lastNode.comments = lex[i].comments;

@@ -321,8 +336,8 @@ }

response.push(lastNode);
}else if(lex[i].key.toLowerCase() == "msgid_plural"){
if(lastNode){
} else if (lex[i].key.toLowerCase() === 'msgid_plural') {
if (lastNode) {
lastNode.msgid_plural = lex[i].value;
}
if(lex[i].comments && !lastNode.comments){
if (lex[i].comments && !lastNode.comments) {
lastNode.comments = lex[i].comments;

@@ -333,8 +348,8 @@ }

curComments = false;
}else if(lex[i].key.substr(0, 6).toLowerCase() == "msgstr"){
if(lastNode){
} else if (lex[i].key.substr(0, 6).toLowerCase() === 'msgstr') {
if (lastNode) {
lastNode.msgstr = (lastNode.msgstr || []).concat(lex[i].value);
}
if(lex[i].comments && !lastNode.comments){
if (lex[i].comments && !lastNode.comments) {
lastNode.comments = lex[i].comments;

@@ -357,3 +372,3 @@ }

*/
Parser.prototype._normalize = function(lex){
Parser.prototype._normalize = function(lex) {
var msgctxt,

@@ -366,10 +381,10 @@ table = {

for(var i=0, len = lex.length; i < len; i++){
msgctxt = lex[i].msgctxt || "";
for (var i = 0, len = lex.length; i < len; i++) {
msgctxt = lex[i].msgctxt || '';
if(!table.translations[msgctxt]){
if (!table.translations[msgctxt]) {
table.translations[msgctxt] = {};
}
if(!table.headers && !msgctxt && !lex[i].msgid){
if (!table.headers && !msgctxt && !lex[i].msgid) {
table.headers = sharedFuncs.parseHeader(lex[i].msgstr[0]);

@@ -389,3 +404,3 @@ }

*/
Parser.prototype.parse = function(){
Parser.prototype.parse = function() {
var lex = this._lexer();

@@ -399,2 +414,2 @@

return this._normalize(lex);
};
};

@@ -1,2 +0,2 @@

"use strict";
'use strict';

@@ -15,17 +15,17 @@ // Expose to the world

*/
function parseHeader(str){
var lines = (str || "").split("\n"),
headers = {};
function parseHeader(str) {
var lines = (str || '').split('\n'),
headers = {};
lines.forEach(function(line){
var parts = line.trim().split(":"),
key = (parts.shift() || "").trim().toLowerCase(),
value = parts.join(":").trim();
if(!key){
return;
}
headers[key] = value;
});
lines.forEach(function(line) {
var parts = line.trim().split(':'),
key = (parts.shift() || '').trim().toLowerCase(),
value = parts.join(':').trim();
if (!key) {
return;
}
headers[key] = value;
});
return headers;
return headers;
}

@@ -39,6 +39,6 @@

*/
function upperCaseWords(str){
return (str || "").toLowerCase().trim().replace(/^(MIME|POT?(?=\-)|[a-z])|\-[a-z]/gi, function(str){
return str.toUpperCase();
});
function upperCaseWords(str) {
return (str || '').toLowerCase().trim().replace(/^(MIME|POT?(?=\-)|[a-z])|\-[a-z]/gi, function(str) {
return str.toUpperCase();
});
}

@@ -52,12 +52,12 @@

*/
function generateHeader(header){
var lines = [];
function generateHeader(header) {
var lines = [];
Object.keys(header || {}).forEach(function(key){
if(key){
lines.push(upperCaseWords(key) + ": " + (header[key] || "").trim());
}
});
Object.keys(header || {}).forEach(function(key) {
if (key) {
lines.push(upperCaseWords(key) + ': ' + (header[key] || '').trim());
}
});
return lines.join("\n") + (lines.length ? "\n" : "");
return lines.join('\n') + (lines.length ? '\n' : '');
}

@@ -71,10 +71,10 @@

*/
function formatCharset(charset, defaultCharset){
return (charset || "iso-8859-1").toString().toLowerCase().
replace(/^utf[\-_]?(\d+)$/, "utf-$1").
replace(/^win(?:dows)?[\-_]?(\d+)$/, "windows-$1").
replace(/^latin[\-_]?(\d+)$/, "iso-8859-$1").
replace(/^(us[\-_]?)?ascii$/, "ascii").
replace(/^charset$/, defaultCharset || "iso-8859-1").
trim();
function formatCharset(charset, defaultCharset) {
return (charset || 'iso-8859-1').toString().toLowerCase().
replace(/^utf[\-_]?(\d+)$/, 'utf-$1').
replace(/^win(?:dows)?[\-_]?(\d+)$/, 'windows-$1').
replace(/^latin[\-_]?(\d+)$/, 'iso-8859-$1').
replace(/^(us[\-_]?)?ascii$/, 'ascii').
replace(/^charset$/, defaultCharset || 'iso-8859-1').
trim();
}

@@ -89,3 +89,3 @@

*/
function foldLine(str, maxLen){
function foldLine(str, maxLen) {

@@ -95,3 +95,3 @@ maxLen = maxLen || 76;

var lines = [],
curLine = "",
curLine = '',
pos = 0,

@@ -101,3 +101,3 @@ len = str.length,

while(pos < len){
while (pos < len) {
curLine = str.substr(pos, maxLen);

@@ -107,3 +107,3 @@

// make longer lines if needed
while(curLine.substr(-1) == "\\" && pos + curLine.length < len){
while (curLine.substr(-1) === '\\' && pos + curLine.length < len) {
curLine += str.charAt(pos + curLine.length);

@@ -113,8 +113,8 @@ }

// ensure that if possible, line breaks are done at reasonable places
if((match = curLine.match(/\\n/))){
if ((match = curLine.match(/\\n/))) {
curLine = curLine.substr(0, match.index + 2);
}else if(pos + curLine.length < len){
if((match = curLine.match(/(\s+)[^\s]*$/)) && match.index > 0){
} else if (pos + curLine.length < len) {
if ((match = curLine.match(/(\s+)[^\s]*$/)) && match.index > 0) {
curLine = curLine.substr(0, match.index + match[1].length);
}else if((match = curLine.match(/([\x21-\x40\x5b-\x60\x7b-\x7e]+)[^\x21-\x40\x5b-\x60\x7b-\x7e]*$/)) && match.index > 0){
} else if ((match = curLine.match(/([\x21-\x40\x5b-\x60\x7b-\x7e]+)[^\x21-\x40\x5b-\x60\x7b-\x7e]*$/)) && match.index > 0) {
curLine = curLine.substr(0, match.index + match[1].length);

@@ -129,2 +129,2 @@ }

return lines;
}
}
{
"name": "gettext-parser",
"description": "Parse and compile gettext po and mo files to/from json, nothing more, nothing less",
"version": "0.2.0",
"author" : "Andris Reinman",
"homepage": "http://github.com/andris9/gettext-parser",
"repository" : {
"type" : "git",
"url" : "http://github.com/andris9/gettext-parser.git"
},
"scripts":{
"test": "nodeunit test/"
},
"main" : "./index",
"license" : "MIT",
"dependencies": {
"encoding":"~0.1"
},
"devDependencies": {
"nodeunit": "*"
},
"keywords": ["i18n", "l10n", "gettext", "mo", "po"]
"name": "gettext-parser",
"description": "Parse and compile gettext po and mo files to/from json, nothing more, nothing less",
"version": "1.0.0",
"author": "Andris Reinman",
"homepage": "http://github.com/andris9/gettext-parser",
"repository": {
"type": "git",
"url": "http://github.com/andris9/gettext-parser.git"
},
"scripts": {
"test": "grunt"
},
"main": "./index",
"license": "MIT",
"dependencies": {
"encoding": "^0.1.11"
},
"devDependencies": {
"chai": "^1.10.0",
"grunt": "^0.4.5",
"grunt-contrib-jshint": "^0.10.0",
"grunt-mocha-test": "^0.12.7",
"mocha": "^2.1.0"
},
"keywords": [
"i18n",
"l10n",
"gettext",
"mo",
"po"
]
}

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc