Merge pull request #9 from Open-Xchange-Frontend/fix_commented_obsolete_strings

Fix commented obsolete strings
This commit is contained in:
Ruben Vermeersch 2014-06-19 14:05:32 +02:00
commit 03572f9711
4 changed files with 66 additions and 18 deletions

View File

@ -101,14 +101,18 @@ PO.parse = function (data) {
var item = new PO.Item(),
context = null,
plural = 0,
obsolete = false;
obsoleteCount = 0,
noCommentLineCount = 0;
function finish() {
if (item.msgid.length > 0) {
if (obsoleteCount >= noCommentLineCount) {
item.obsolete = true;
}
obsoleteCount = 0;
noCommentLineCount = 0;
po.items.push(item);
item = new PO.Item();
item.obsolete = obsolete;
obsolete = false;
}
}
@ -122,13 +126,15 @@ PO.parse = function (data) {
while (lines.length > 0) {
var line = trim(lines.shift()),
lineObsolete = false,
add = false;
if (line.match(/^#\~/)) { // Obsolete item
obsolete = true;
//only remove the obsolte comment mark, here
//might be, this is a new item, so
//only remember, this line is marked obsolete, count after line is parsed
line = trim(line.substring(2));
} else {
obsolete = false;
lineObsolete = true;
}
if (line.match(/^#:/)) { // Reference
@ -153,24 +159,29 @@ PO.parse = function (data) {
else if (line.match(/^msgid_plural/)) { // Plural form
item.msgid_plural = extract(line);
context = 'msgid_plural';
noCommentLineCount++;
}
else if (line.match(/^msgid/)) { // Original
finish();
item.msgid = extract(line);
context = 'msgid';
noCommentLineCount++;
}
else if (line.match(/^msgstr/)) { // Translation
var m = line.match(/^msgstr\[(\d+)\]/);
plural = m && m[1] ? parseInt(m[1]) : 0;
item.msgstr[plural] = extract(line);
context = 'msgstr';
noCommentLineCount++;
}
else if (line.match(/^msgctxt/)) { // Context
finish();
item.msgctxt = extract(line);
noCommentLineCount++;
}
else { // Probably multiline string or blank
if (line.length > 0) {
noCommentLineCount++;
if (context === 'msgstr') {
item.msgstr[plural] += extract(line);
}
@ -182,6 +193,10 @@ PO.parse = function (data) {
}
}
}
if (lineObsolete) {
//count obsolete lines for this item
obsoleteCount++;
}
}
finish();
@ -245,27 +260,24 @@ PO.Item.prototype.toString = function () {
if (flags.length > 0) {
lines.push('#, ' + flags.join(","));
}
var mkObsolete = this.obsolete ? '#~ ' : '';
['msgctxt', 'msgid', 'msgid_plural', 'msgstr'].forEach(function (keyword) {
var text = that[keyword];
if (text != null) {
if (isArray(text) && text.length > 1) {
text.forEach(function (t, i) {
lines = lines.concat(_process(keyword, t, i));
lines = lines.concat(mkObsolete + _process(keyword, t, i));
});
}
else {
text = isArray(text) ? text.join() : text;
lines = lines.concat(_process(keyword, text));
lines = lines.concat(mkObsolete + _process(keyword, text));
}
}
});
if (this.obsolete) {
return "#~ " + lines.join("\n#~ ");
} else {
return lines.join("\n");
}
return lines.join("\n");
};
module.exports = PO;

View File

@ -21,3 +21,13 @@ msgstr "{{dataLoader.data.length}} resultaten"
#~ msgid "Add order"
#~ msgstr "Order toevoegen"
#~ # commented obsolete item
#~ #, fuzzy
#~ msgid "Commented item"
#~ msgstr "not sure"
# commented obsolete item
#, fuzzy
#~ msgid "Second commented item"
#~ msgstr "also not sure"

View File

@ -96,16 +96,26 @@ describe('Parse', function () {
it('Handles obsolete items', function () {
var po = PO.parse(fs.readFileSync(__dirname + '/fixtures/commented.po', 'utf8'));
assert.equal(po.items.length, 2);
assert.equal(po.items.length, 4);
var item = po.items[0];
assert.equal(item.obsolete, false);
assert.equal(item.msgid, "{{dataLoader.data.length}} results");
assert.equal(item.msgstr, "{{dataLoader.data.length}} resultaten");
assert.equal(item.msgid, '{{dataLoader.data.length}} results');
assert.equal(item.msgstr, '{{dataLoader.data.length}} resultaten');
item = po.items[1];
assert.equal(item.obsolete, true);
assert.equal(item.msgid, "Add order");
assert.equal(item.msgstr, "Order toevoegen");
assert.equal(item.msgid, 'Add order');
assert.equal(item.msgstr, 'Order toevoegen');
item = po.items[2];
assert.equal(item.obsolete, true);
assert.equal(item.msgid, 'Commented item');
assert.equal(item.msgstr, 'not sure');
item = po.items[3];
assert.equal(item.obsolete, true);
assert.equal(item.msgid, 'Second commented item');
assert.equal(item.msgstr, 'also not sure');
});
describe('C-Strings', function () {

View File

@ -61,6 +61,22 @@ describe('Write', function () {
assertHasLine(str, '#~ msgstr "Order toevoegen"');
});
it('write obsolete items with comment', function () {
var input = fs.readFileSync(__dirname + '/fixtures/commented.po', 'utf8');
var po = PO.parse(input);
var str = po.toString();
//this is what msgcat tool of gettext does: don't print #~ for comments
assertHasLine(str, '# commented obsolete item');
assertHasLine(str, '#, fuzzy');
//items made obsolete by commenting every keyword with #~
assertHasLine(str, '#~ msgid "Commented item"');
assertHasLine(str, '#~ msgstr "not sure"');
assertHasLine(str, '#~ msgid "Second commented item"');
assertHasLine(str, '#~ msgstr "also not sure"');
});
describe('C-Strings', function () {
it('should escape "', function () {
var item = new PO.Item();