7 Commits

Author SHA1 Message Date
Ruben Vermeersch
869f763d80 Release v1.0.0 2015-08-20 15:13:21 +02:00
Ruben Vermeersch
b9394176b1 Handle extracted comments in headers 2015-08-20 15:12:56 +02:00
Ruben Vermeersch
9060221403 Release v0.3.0 2015-07-17 10:36:14 +02:00
Ruben Vermeersch
63c4209cd5 Clean up test names 2015-07-17 10:35:56 +02:00
Ruben Vermeersch
104d114d5d Only write flags when they evaluate to true. 2015-07-17 10:35:25 +02:00
Ruben Vermeersch
db5e540824 Merge pull request #14 from rubenv/fix_issue13
add tests to better document reference comments
2014-08-26 10:38:15 +02:00
Julian Bäume
cfc9b2ae82 add tests to better document reference comments
pofile does not process reference comments in any way, since the format of
references is not exactly specified. This test specifies, what users of
pofile can expect the library to do.
2014-08-12 17:47:47 +02:00
9 changed files with 91 additions and 28 deletions

View File

@@ -1,6 +1,6 @@
{
"name": "pofile",
"version": "0.2.12",
"version": "1.0.0",
"authors": [
"Ruben Vermeersch <ruben@rocketeer.be>"
],

25
dist/pofile.js vendored
View File

@@ -1,4 +1,6 @@
require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({"W8CkM0":[function(require,module,exports){
require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({"pofile":[function(require,module,exports){
module.exports=require('W8CkM0');
},{}],"W8CkM0":[function(require,module,exports){
var fs = require('fs');
var isArray = require('lodash.isarray');
@@ -8,6 +10,7 @@ function trim(string) {
var PO = function () {
this.comments = [];
this.extractedComments = [];
this.headers = {};
this.items = [];
};
@@ -24,6 +27,11 @@ PO.prototype.toString = function () {
lines.push('# ' + comment);
});
}
if (this.extractedComments) {
this.extractedComments.forEach(function (comment) {
lines.push('#. ' + comment);
});
}
lines.push('msgid ""');
lines.push('msgstr ""');
@@ -87,10 +95,11 @@ PO.parse = function (data) {
acc.push(line);
return acc;
}, []).forEach(function (header) {
if (header.match(/^#/)) {
if (header.match(/^#\./)) {
po.extractedComments.push(header.replace(/^#\.\s*/, ''));
} else if (header.match(/^#/)) {
po.comments.push(header.replace(/^#\s*/, ''));
}
if (header.match(/^"/)) {
} else if (header.match(/^"/)) {
header = header.trim().replace(/^"/, '').replace(/\\n"$/, '');
var p = header.split(/:/);
var name = p.shift().trim();
@@ -290,7 +299,9 @@ PO.Item.prototype.toString = function () {
lines.push('#: ' + ref);
});
var flags = Object.keys(this.flags);
var flags = Object.keys(this.flags).filter(function (flag) {
return !!this.flags[flag];
}, this);
if (flags.length > 0) {
lines.push('#, ' + flags.join(','));
}
@@ -320,9 +331,7 @@ PO.Item.prototype.toString = function () {
module.exports = PO;
},{"fs":3,"lodash.isarray":4}],"pofile":[function(require,module,exports){
module.exports=require('W8CkM0');
},{}],3:[function(require,module,exports){
},{"fs":3,"lodash.isarray":4}],3:[function(require,module,exports){
},{}],4:[function(require,module,exports){
/**

2
dist/pofile.min.js vendored

File diff suppressed because one or more lines are too long

View File

@@ -7,6 +7,7 @@ function trim(string) {
var PO = function () {
this.comments = [];
this.extractedComments = [];
this.headers = {};
this.items = [];
};
@@ -23,6 +24,11 @@ PO.prototype.toString = function () {
lines.push('# ' + comment);
});
}
if (this.extractedComments) {
this.extractedComments.forEach(function (comment) {
lines.push('#. ' + comment);
});
}
lines.push('msgid ""');
lines.push('msgstr ""');
@@ -86,10 +92,11 @@ PO.parse = function (data) {
acc.push(line);
return acc;
}, []).forEach(function (header) {
if (header.match(/^#/)) {
if (header.match(/^#\./)) {
po.extractedComments.push(header.replace(/^#\.\s*/, ''));
} else if (header.match(/^#/)) {
po.comments.push(header.replace(/^#\s*/, ''));
}
if (header.match(/^"/)) {
} else if (header.match(/^"/)) {
header = header.trim().replace(/^"/, '').replace(/\\n"$/, '');
var p = header.split(/:/);
var name = p.shift().trim();
@@ -289,7 +296,9 @@ PO.Item.prototype.toString = function () {
lines.push('#: ' + ref);
});
var flags = Object.keys(this.flags);
var flags = Object.keys(this.flags).filter(function (flag) {
return !!this.flags[flag];
}, this);
if (flags.length > 0) {
lines.push('#, ' + flags.join(','));
}

View File

@@ -1,7 +1,7 @@
{
"name": "pofile",
"description": "Parse and serialize Gettext PO files.",
"version": "0.2.12",
"version": "1.0.0",
"author": {
"name": "Ruben Vermeersch",
"email": "ruben@savanne.be",

View File

@@ -1,6 +1,7 @@
# French translation of Link (6.x-2.9)
# Copyright (c) 2011 by the French translation team
#
#. extracted from test
msgid ""
msgstr ""
"Project-Id-Version: Link (6.x-2.9)\n"

View File

@@ -24,3 +24,7 @@ msgstr "Attribut title, en tant que texte brut"
#: b
msgid "X"
msgstr "Y"
#: standard input:12 standard input:17
msgid "Z"
msgstr "ZZ"

View File

@@ -61,27 +61,41 @@ describe('Parse', function () {
assert.notEqual(po, null);
assert.equal(po.items.length, 2);
assert.equal(po.extractedComments.length, 1);
assert.equal(po.extractedComments[0], 'extracted from test');
var item = po.items[0];
assert.equal(item.msgid, 'Title, as plain text');
assert.equal(item.msgstr, 'Attribut title, en tant que texte brut');
assert.deepEqual(item.extractedComments, ['Extracted comment']);
});
it('Handles string references', function () {
describe('Handles string references', function () {
var po = PO.parse(fs.readFileSync(__dirname + '/fixtures/reference.po', 'utf8'));
assert.notEqual(po, null);
assert.equal(po.items.length, 2);
assert.equal(po.items.length, 3);
var item = po.items[0];
assert.equal(item.msgid, 'Title, as plain text');
assert.equal(item.msgstr, 'Attribut title, en tant que texte brut');
assert.deepEqual(item.comments, ['Comment']);
assert.deepEqual(item.references, ['.tmp/crm/controllers/map.js']);
it('in simple cases', function () {
var item = po.items[0];
assert.equal(item.msgid, 'Title, as plain text');
assert.equal(item.msgstr, 'Attribut title, en tant que texte brut');
assert.deepEqual(item.comments, ['Comment']);
assert.deepEqual(item.references, ['.tmp/crm/controllers/map.js']);
});
item = po.items[1];
assert.equal(item.msgid, 'X');
assert.equal(item.msgstr, 'Y');
assert.deepEqual(item.references, ['a', 'b']);
it('with two different references', function () {
var item = po.items[1];
assert.equal(item.msgid, 'X');
assert.equal(item.msgstr, 'Y');
assert.deepEqual(item.references, ['a', 'b']);
});
it('and does not process reference items', function () {
var item = po.items[2];
assert.equal(item.msgid, 'Z');
assert.equal(item.msgstr, 'ZZ');
assert.deepEqual(item.references, ['standard input:12 standard input:17']);
});
});
it('Parses flags', function () {
@@ -145,12 +159,12 @@ describe('Parse', function () {
assert.equal(items[0].msgid, 'The name field must not contain characters like " or \\');
});
it('should handle \n characters', function () {
it('should handle \\n characters', function () {
var item = po.items[1];
assert.equal(item.msgid, '%1$s\n%2$s %3$s\n%4$s\n%5$s');
});
it('should handle \t characters', function () {
it('should handle \\t characters', function () {
var item = po.items[2];
assert.equal(item.msgid, 'define(\'some/test/module\', function () {\n' +
'\t\'use strict\';\n' +

View File

@@ -16,6 +16,20 @@ function assertHasLine(str, line) {
assert(found, 'Could not find line: ' + line);
}
function assertDoesntHaveLine(str, line) {
var lines = str.split('\n');
var found = false;
for (var i = 0; i < lines.length; i++) {
if (lines[i].trim() === line) {
found = true;
break;
}
}
assert(!found, 'Shouldn\'t have line: ' + line);
}
describe('Write', function () {
it('write flags', function () {
var input = fs.readFileSync(__dirname + '/fixtures/fuzzy.po', 'utf8');
@@ -24,6 +38,17 @@ describe('Write', function () {
assertHasLine(str, '#, fuzzy');
});
it('write flags only when true', function () {
var input = fs.readFileSync(__dirname + '/fixtures/fuzzy.po', 'utf8');
var po = PO.parse(input);
// Flip flag
po.items[0].flags.fuzzy = false;
var str = po.toString();
assertDoesntHaveLine(str, '#, fuzzy');
});
it('write msgid', function () {
var input = fs.readFileSync(__dirname + '/fixtures/fuzzy.po', 'utf8');
var po = PO.parse(input);
@@ -49,6 +74,7 @@ describe('Write', function () {
var input = fs.readFileSync(__dirname + '/fixtures/comment.po', 'utf8');
var po = PO.parse(input);
var str = po.toString();
assertHasLine(str, '#. extracted from test');
assertHasLine(str, '#. Extracted comment');
});