@common.js/po-parser 2.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +5 -0
- package/dist/index.d.ts +40 -0
- package/dist/index.js +471 -0
- package/package.json +37 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Jan Amann
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
type Entry = {
|
|
2
|
+
msgctxt?: string;
|
|
3
|
+
msgid: string;
|
|
4
|
+
msgstr: string;
|
|
5
|
+
references?: Array<{
|
|
6
|
+
path: string;
|
|
7
|
+
line?: number;
|
|
8
|
+
}>;
|
|
9
|
+
extractedComments?: Array<string>;
|
|
10
|
+
flags?: Array<string>;
|
|
11
|
+
};
|
|
12
|
+
type Catalog = {
|
|
13
|
+
meta?: Record<string, string>;
|
|
14
|
+
messages?: Array<Entry>;
|
|
15
|
+
};
|
|
16
|
+
declare class POParser {
|
|
17
|
+
private static readonly KEYWORDS;
|
|
18
|
+
private static readonly COMMENTS;
|
|
19
|
+
private static readonly QUOTE;
|
|
20
|
+
private static readonly NEWLINE;
|
|
21
|
+
private static readonly FILE_COLUMN_SEPARATOR;
|
|
22
|
+
private static readonly META_SEPARATOR;
|
|
23
|
+
private static readonly FLAG_SEPARATOR;
|
|
24
|
+
private static readonly ESCAPE_LOOKUP;
|
|
25
|
+
private static readonly UNESCAPE_LOOKUP;
|
|
26
|
+
static parse(content: string): Catalog;
|
|
27
|
+
private static isMetaEntry;
|
|
28
|
+
static serialize(catalog: Catalog): string;
|
|
29
|
+
private static lineStartsWithPrefix;
|
|
30
|
+
private static throwWithLine;
|
|
31
|
+
private static splitLines;
|
|
32
|
+
private static ensureEntry;
|
|
33
|
+
private static finishEntry;
|
|
34
|
+
private static extractQuotedString;
|
|
35
|
+
private static escape;
|
|
36
|
+
private static unescape;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export { POParser as default };
|
|
40
|
+
export type { Entry };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,471 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "default", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return POParser;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
function _arrayLikeToArray(arr, len) {
|
|
12
|
+
if (len == null || len > arr.length) len = arr.length;
|
|
13
|
+
for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
|
|
14
|
+
return arr2;
|
|
15
|
+
}
|
|
16
|
+
function _arrayWithHoles(arr) {
|
|
17
|
+
if (Array.isArray(arr)) return arr;
|
|
18
|
+
}
|
|
19
|
+
function _classCallCheck(instance, Constructor) {
|
|
20
|
+
if (!(instance instanceof Constructor)) {
|
|
21
|
+
throw new TypeError("Cannot call a class as a function");
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function _defineProperties(target, props) {
|
|
25
|
+
for(var i = 0; i < props.length; i++){
|
|
26
|
+
var descriptor = props[i];
|
|
27
|
+
descriptor.enumerable = descriptor.enumerable || false;
|
|
28
|
+
descriptor.configurable = true;
|
|
29
|
+
if ("value" in descriptor) descriptor.writable = true;
|
|
30
|
+
Object.defineProperty(target, descriptor.key, descriptor);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function _createClass(Constructor, protoProps, staticProps) {
|
|
34
|
+
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
|
|
35
|
+
if (staticProps) _defineProperties(Constructor, staticProps);
|
|
36
|
+
return Constructor;
|
|
37
|
+
}
|
|
38
|
+
function _iterableToArrayLimit(arr, i) {
|
|
39
|
+
var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
|
|
40
|
+
if (_i == null) return;
|
|
41
|
+
var _arr = [];
|
|
42
|
+
var _n = true;
|
|
43
|
+
var _d = false;
|
|
44
|
+
var _s, _e;
|
|
45
|
+
try {
|
|
46
|
+
for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){
|
|
47
|
+
_arr.push(_s.value);
|
|
48
|
+
if (i && _arr.length === i) break;
|
|
49
|
+
}
|
|
50
|
+
} catch (err) {
|
|
51
|
+
_d = true;
|
|
52
|
+
_e = err;
|
|
53
|
+
} finally{
|
|
54
|
+
try {
|
|
55
|
+
if (!_n && _i["return"] != null) _i["return"]();
|
|
56
|
+
} finally{
|
|
57
|
+
if (_d) throw _e;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return _arr;
|
|
61
|
+
}
|
|
62
|
+
function _nonIterableRest() {
|
|
63
|
+
throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
64
|
+
}
|
|
65
|
+
function _slicedToArray(arr, i) {
|
|
66
|
+
return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();
|
|
67
|
+
}
|
|
68
|
+
function _unsupportedIterableToArray(o, minLen) {
|
|
69
|
+
if (!o) return;
|
|
70
|
+
if (typeof o === "string") return _arrayLikeToArray(o, minLen);
|
|
71
|
+
var n = Object.prototype.toString.call(o).slice(8, -1);
|
|
72
|
+
if (n === "Object" && o.constructor) n = o.constructor.name;
|
|
73
|
+
if (n === "Map" || n === "Set") return Array.from(n);
|
|
74
|
+
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
|
|
75
|
+
}
|
|
76
|
+
var POParser = /*#__PURE__*/ function() {
|
|
77
|
+
"use strict";
|
|
78
|
+
function POParser() {
|
|
79
|
+
_classCallCheck(this, POParser);
|
|
80
|
+
}
|
|
81
|
+
_createClass(POParser, null, [
|
|
82
|
+
{
|
|
83
|
+
key: "parse",
|
|
84
|
+
value: function parse(content) {
|
|
85
|
+
var lines = POParser.splitLines(content);
|
|
86
|
+
var messages = [];
|
|
87
|
+
var meta = {};
|
|
88
|
+
var state = "entry";
|
|
89
|
+
var entry;
|
|
90
|
+
for(var i = 0; i < lines.length; i++){
|
|
91
|
+
var line = lines[i].trim();
|
|
92
|
+
// An empty line indicates the end of an entry
|
|
93
|
+
if (!line) {
|
|
94
|
+
if (state === "entry" && entry) {
|
|
95
|
+
messages.push(POParser.finishEntry(entry));
|
|
96
|
+
entry = undefined;
|
|
97
|
+
}
|
|
98
|
+
state = "entry";
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
if (state === "meta") {
|
|
102
|
+
if (line.startsWith(POParser.QUOTE)) {
|
|
103
|
+
var rawMetaLine = POParser.extractQuotedString(line, state);
|
|
104
|
+
var metaLine = POParser.unescape(rawMetaLine);
|
|
105
|
+
var cleaned = metaLine.endsWith("\n") ? metaLine.slice(0, -1) : metaLine;
|
|
106
|
+
var separatorIndex = cleaned.indexOf(POParser.META_SEPARATOR);
|
|
107
|
+
if (separatorIndex > 0) {
|
|
108
|
+
var key = cleaned.substring(0, separatorIndex).trim();
|
|
109
|
+
var value = cleaned.substring(separatorIndex + 1).trim();
|
|
110
|
+
meta[key] = value;
|
|
111
|
+
}
|
|
112
|
+
} else {
|
|
113
|
+
POParser.throwWithLine("Encountered unexpected non-quoted metadata line", line);
|
|
114
|
+
}
|
|
115
|
+
} else {
|
|
116
|
+
// Unsupported comment types
|
|
117
|
+
if (POParser.lineStartsWithPrefix(line, POParser.COMMENTS.TRANSLATOR)) {
|
|
118
|
+
POParser.throwWithLine("Translator comments (#) are not supported, use inline descriptions instead", line);
|
|
119
|
+
}
|
|
120
|
+
if (POParser.lineStartsWithPrefix(line, POParser.COMMENTS.PREVIOUS)) {
|
|
121
|
+
POParser.throwWithLine("Previous string key comments (#|) are not supported", line);
|
|
122
|
+
}
|
|
123
|
+
// Flag comments
|
|
124
|
+
if (POParser.lineStartsWithPrefix(line, POParser.COMMENTS.FLAG)) {
|
|
125
|
+
entry = POParser.ensureEntry(entry);
|
|
126
|
+
var flagsText = line.substring(POParser.COMMENTS.FLAG.length).trim();
|
|
127
|
+
entry.flags = flagsText.split(",").map(function(flag) {
|
|
128
|
+
return flag.trim();
|
|
129
|
+
}).filter(Boolean);
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
// Reference comments
|
|
133
|
+
if (POParser.lineStartsWithPrefix(line, POParser.COMMENTS.REFERENCE)) {
|
|
134
|
+
var _entry;
|
|
135
|
+
entry = POParser.ensureEntry(entry);
|
|
136
|
+
var parts = line.substring(POParser.COMMENTS.REFERENCE.length).trim().split(POParser.FILE_COLUMN_SEPARATOR);
|
|
137
|
+
var path = parts[0];
|
|
138
|
+
var lineNumber = void 0;
|
|
139
|
+
if (parts.length > 1) {
|
|
140
|
+
var parsedLine = parseInt(parts[1]);
|
|
141
|
+
if (!isNaN(parsedLine)) {
|
|
142
|
+
lineNumber = parsedLine;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
var _references;
|
|
146
|
+
(_references = (_entry = entry).references) !== null && _references !== void 0 ? _references : _entry.references = [];
|
|
147
|
+
var reference = {
|
|
148
|
+
path: path
|
|
149
|
+
};
|
|
150
|
+
if (lineNumber) {
|
|
151
|
+
reference.line = lineNumber;
|
|
152
|
+
}
|
|
153
|
+
entry.references.push(reference);
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
// Extracted comments
|
|
157
|
+
if (POParser.lineStartsWithPrefix(line, POParser.COMMENTS.EXTRACTED)) {
|
|
158
|
+
var _entry1;
|
|
159
|
+
entry = POParser.ensureEntry(entry);
|
|
160
|
+
var comment = line.substring(POParser.COMMENTS.EXTRACTED.length).trim();
|
|
161
|
+
var _extractedComments;
|
|
162
|
+
(_extractedComments = (_entry1 = entry).extractedComments) !== null && _extractedComments !== void 0 ? _extractedComments : _entry1.extractedComments = [];
|
|
163
|
+
entry.extractedComments.push(comment);
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
// Check for unsupported features
|
|
167
|
+
if (POParser.lineStartsWithPrefix(line, POParser.KEYWORDS.MSGID_PLURAL)) {
|
|
168
|
+
POParser.throwWithLine("Plural forms (msgid_plural) are not supported, use ICU pluralization instead", line);
|
|
169
|
+
}
|
|
170
|
+
// msgctxt
|
|
171
|
+
if (POParser.lineStartsWithPrefix(line, POParser.KEYWORDS.MSGCTXT)) {
|
|
172
|
+
entry = POParser.ensureEntry(entry);
|
|
173
|
+
entry.msgctxt = POParser.unescape(POParser.extractQuotedString(line.substring(POParser.KEYWORDS.MSGCTXT.length + 1), state));
|
|
174
|
+
continue;
|
|
175
|
+
}
|
|
176
|
+
// msgid
|
|
177
|
+
if (POParser.lineStartsWithPrefix(line, POParser.KEYWORDS.MSGID)) {
|
|
178
|
+
entry = POParser.ensureEntry(entry);
|
|
179
|
+
entry.msgid = POParser.unescape(POParser.extractQuotedString(line.substring(POParser.KEYWORDS.MSGID.length + 1), state));
|
|
180
|
+
if (POParser.isMetaEntry(entry, messages)) {
|
|
181
|
+
state = "meta";
|
|
182
|
+
entry = undefined;
|
|
183
|
+
}
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
// msgstr
|
|
187
|
+
if (POParser.lineStartsWithPrefix(line, POParser.KEYWORDS.MSGSTR)) {
|
|
188
|
+
entry = POParser.ensureEntry(entry);
|
|
189
|
+
entry.msgstr = POParser.unescape(POParser.extractQuotedString(line.substring(POParser.KEYWORDS.MSGSTR.length + 1), state));
|
|
190
|
+
if (POParser.isMetaEntry(entry, messages)) {
|
|
191
|
+
state = "meta";
|
|
192
|
+
entry = undefined;
|
|
193
|
+
}
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
// Multi-line strings are not supported in entry mode
|
|
197
|
+
if (line.startsWith(POParser.QUOTE)) {
|
|
198
|
+
POParser.throwWithLine("Multi-line strings are not supported, use single-line strings instead", line);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
// Finish any remaining entry
|
|
203
|
+
if (state === "entry" && entry) {
|
|
204
|
+
messages.push(POParser.finishEntry(entry));
|
|
205
|
+
}
|
|
206
|
+
return {
|
|
207
|
+
meta: Object.keys(meta).length > 0 ? meta : undefined,
|
|
208
|
+
messages: messages.length > 0 ? messages : undefined
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
},
|
|
212
|
+
{
|
|
213
|
+
key: "isMetaEntry",
|
|
214
|
+
value: function isMetaEntry(entry, messages) {
|
|
215
|
+
return messages.length === 0 && entry.msgid === "" && entry.msgstr === "";
|
|
216
|
+
}
|
|
217
|
+
},
|
|
218
|
+
{
|
|
219
|
+
key: "serialize",
|
|
220
|
+
value: function serialize(catalog) {
|
|
221
|
+
var lines = [];
|
|
222
|
+
// Metadata
|
|
223
|
+
if (catalog.meta) {
|
|
224
|
+
lines.push("".concat(POParser.KEYWORDS.MSGID, " ").concat(POParser.QUOTE).concat(POParser.QUOTE));
|
|
225
|
+
lines.push("".concat(POParser.KEYWORDS.MSGSTR, " ").concat(POParser.QUOTE).concat(POParser.QUOTE));
|
|
226
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
227
|
+
try {
|
|
228
|
+
for(var _iterator = Object.entries(catalog.meta)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
229
|
+
var _value = _slicedToArray(_step.value, 2), key = _value[0], value = _value[1];
|
|
230
|
+
lines.push("".concat(POParser.QUOTE).concat(key).concat(POParser.META_SEPARATOR, " ").concat(POParser.escape(value)).concat(POParser.NEWLINE).concat(POParser.QUOTE));
|
|
231
|
+
}
|
|
232
|
+
} catch (err) {
|
|
233
|
+
_didIteratorError = true;
|
|
234
|
+
_iteratorError = err;
|
|
235
|
+
} finally{
|
|
236
|
+
try {
|
|
237
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
238
|
+
_iterator.return();
|
|
239
|
+
}
|
|
240
|
+
} finally{
|
|
241
|
+
if (_didIteratorError) {
|
|
242
|
+
throw _iteratorError;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
lines.push("");
|
|
247
|
+
}
|
|
248
|
+
// Messages
|
|
249
|
+
if (catalog.messages) {
|
|
250
|
+
var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
|
|
251
|
+
try {
|
|
252
|
+
for(var _iterator1 = catalog.messages[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){
|
|
253
|
+
var entry = _step1.value;
|
|
254
|
+
if (entry.extractedComments && entry.extractedComments.length > 0) {
|
|
255
|
+
var _iteratorNormalCompletion2 = true, _didIteratorError2 = false, _iteratorError2 = undefined;
|
|
256
|
+
try {
|
|
257
|
+
for(var _iterator2 = entry.extractedComments[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true){
|
|
258
|
+
var comment = _step2.value;
|
|
259
|
+
lines.push("".concat(POParser.COMMENTS.EXTRACTED, " ").concat(comment));
|
|
260
|
+
}
|
|
261
|
+
} catch (err) {
|
|
262
|
+
_didIteratorError2 = true;
|
|
263
|
+
_iteratorError2 = err;
|
|
264
|
+
} finally{
|
|
265
|
+
try {
|
|
266
|
+
if (!_iteratorNormalCompletion2 && _iterator2.return != null) {
|
|
267
|
+
_iterator2.return();
|
|
268
|
+
}
|
|
269
|
+
} finally{
|
|
270
|
+
if (_didIteratorError2) {
|
|
271
|
+
throw _iteratorError2;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
if (entry.references && entry.references.length > 0) {
|
|
277
|
+
var _iteratorNormalCompletion3 = true, _didIteratorError3 = false, _iteratorError3 = undefined;
|
|
278
|
+
try {
|
|
279
|
+
for(var _iterator3 = entry.references[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true){
|
|
280
|
+
var ref = _step3.value;
|
|
281
|
+
var refString = ref.path;
|
|
282
|
+
if (ref.line) {
|
|
283
|
+
refString += "".concat(POParser.FILE_COLUMN_SEPARATOR).concat(ref.line);
|
|
284
|
+
}
|
|
285
|
+
lines.push("".concat(POParser.COMMENTS.REFERENCE, " ").concat(refString));
|
|
286
|
+
}
|
|
287
|
+
} catch (err) {
|
|
288
|
+
_didIteratorError3 = true;
|
|
289
|
+
_iteratorError3 = err;
|
|
290
|
+
} finally{
|
|
291
|
+
try {
|
|
292
|
+
if (!_iteratorNormalCompletion3 && _iterator3.return != null) {
|
|
293
|
+
_iterator3.return();
|
|
294
|
+
}
|
|
295
|
+
} finally{
|
|
296
|
+
if (_didIteratorError3) {
|
|
297
|
+
throw _iteratorError3;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
if (entry.flags && entry.flags.length > 0) {
|
|
303
|
+
lines.push("".concat(POParser.COMMENTS.FLAG, " ").concat(entry.flags.join(POParser.FLAG_SEPARATOR)));
|
|
304
|
+
}
|
|
305
|
+
if (entry.msgctxt) {
|
|
306
|
+
lines.push("".concat(POParser.KEYWORDS.MSGCTXT, " ").concat(POParser.QUOTE).concat(POParser.escape(entry.msgctxt)).concat(POParser.QUOTE));
|
|
307
|
+
}
|
|
308
|
+
lines.push("".concat(POParser.KEYWORDS.MSGID, " ").concat(POParser.QUOTE).concat(POParser.escape(entry.msgid)).concat(POParser.QUOTE));
|
|
309
|
+
lines.push("".concat(POParser.KEYWORDS.MSGSTR, " ").concat(POParser.QUOTE).concat(POParser.escape(entry.msgstr)).concat(POParser.QUOTE));
|
|
310
|
+
lines.push("");
|
|
311
|
+
}
|
|
312
|
+
} catch (err) {
|
|
313
|
+
_didIteratorError1 = true;
|
|
314
|
+
_iteratorError1 = err;
|
|
315
|
+
} finally{
|
|
316
|
+
try {
|
|
317
|
+
if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
|
|
318
|
+
_iterator1.return();
|
|
319
|
+
}
|
|
320
|
+
} finally{
|
|
321
|
+
if (_didIteratorError1) {
|
|
322
|
+
throw _iteratorError1;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
return lines.join("\n");
|
|
328
|
+
}
|
|
329
|
+
},
|
|
330
|
+
{
|
|
331
|
+
key: "lineStartsWithPrefix",
|
|
332
|
+
value: function lineStartsWithPrefix(line, prefix) {
|
|
333
|
+
return line.startsWith(prefix + " ");
|
|
334
|
+
}
|
|
335
|
+
},
|
|
336
|
+
{
|
|
337
|
+
key: "throwWithLine",
|
|
338
|
+
value: function throwWithLine(message, line) {
|
|
339
|
+
throw new Error("".concat(message, ":\n> ").concat(line));
|
|
340
|
+
}
|
|
341
|
+
},
|
|
342
|
+
{
|
|
343
|
+
key: "splitLines",
|
|
344
|
+
value: function splitLines(content) {
|
|
345
|
+
// Avoid overhead for Unix newlines only
|
|
346
|
+
if (content.includes("\r")) {
|
|
347
|
+
content = content.replace(/\r\n/g, "\n");
|
|
348
|
+
}
|
|
349
|
+
return content.split("\n");
|
|
350
|
+
}
|
|
351
|
+
},
|
|
352
|
+
{
|
|
353
|
+
key: "ensureEntry",
|
|
354
|
+
value: function ensureEntry(entry) {
|
|
355
|
+
return entry || {};
|
|
356
|
+
}
|
|
357
|
+
},
|
|
358
|
+
{
|
|
359
|
+
key: "finishEntry",
|
|
360
|
+
value: function finishEntry(entry) {
|
|
361
|
+
if (entry.msgid == null || entry.msgstr == null) {
|
|
362
|
+
throw new Error("Incomplete message entry: both msgid and msgstr are required");
|
|
363
|
+
}
|
|
364
|
+
return {
|
|
365
|
+
msgctxt: entry.msgctxt,
|
|
366
|
+
msgid: entry.msgid,
|
|
367
|
+
msgstr: entry.msgstr,
|
|
368
|
+
extractedComments: entry.extractedComments,
|
|
369
|
+
references: entry.references,
|
|
370
|
+
flags: entry.flags
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
},
|
|
374
|
+
{
|
|
375
|
+
key: "extractQuotedString",
|
|
376
|
+
value: function extractQuotedString(line, state) {
|
|
377
|
+
var trimmed = line.trim();
|
|
378
|
+
if (!trimmed.startsWith(POParser.QUOTE)) {
|
|
379
|
+
POParser.throwWithLine("Incomplete quoted string", line);
|
|
380
|
+
}
|
|
381
|
+
if (!trimmed.endsWith(POParser.QUOTE)) {
|
|
382
|
+
if (state === "meta") {
|
|
383
|
+
return trimmed.substring(POParser.QUOTE.length);
|
|
384
|
+
}
|
|
385
|
+
POParser.throwWithLine("Incomplete quoted string", line);
|
|
386
|
+
}
|
|
387
|
+
var endIndex = trimmed.length - POParser.QUOTE.length;
|
|
388
|
+
return trimmed.substring(POParser.QUOTE.length, endIndex);
|
|
389
|
+
}
|
|
390
|
+
},
|
|
391
|
+
{
|
|
392
|
+
key: "escape",
|
|
393
|
+
value: function escape(value) {
|
|
394
|
+
var result = "";
|
|
395
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
396
|
+
try {
|
|
397
|
+
for(var _iterator = value[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
398
|
+
var char = _step.value;
|
|
399
|
+
var mapped = POParser.ESCAPE_LOOKUP[char];
|
|
400
|
+
result += mapped != null ? "\\".concat(mapped) : char;
|
|
401
|
+
}
|
|
402
|
+
} catch (err) {
|
|
403
|
+
_didIteratorError = true;
|
|
404
|
+
_iteratorError = err;
|
|
405
|
+
} finally{
|
|
406
|
+
try {
|
|
407
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
408
|
+
_iterator.return();
|
|
409
|
+
}
|
|
410
|
+
} finally{
|
|
411
|
+
if (_didIteratorError) {
|
|
412
|
+
throw _iteratorError;
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
return result;
|
|
417
|
+
}
|
|
418
|
+
},
|
|
419
|
+
{
|
|
420
|
+
key: "unescape",
|
|
421
|
+
value: function unescape(value) {
|
|
422
|
+
var result = "";
|
|
423
|
+
for(var i = 0; i < value.length; i++){
|
|
424
|
+
var char = value[i];
|
|
425
|
+
if (char === "\\" && i + 1 < value.length) {
|
|
426
|
+
var nextChar = value[i + 1];
|
|
427
|
+
var mapped = POParser.UNESCAPE_LOOKUP[nextChar];
|
|
428
|
+
if (mapped != null) {
|
|
429
|
+
result += mapped;
|
|
430
|
+
i++;
|
|
431
|
+
continue;
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
result += char;
|
|
435
|
+
}
|
|
436
|
+
return result;
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
]);
|
|
440
|
+
return POParser;
|
|
441
|
+
}();
|
|
442
|
+
POParser.KEYWORDS = {
|
|
443
|
+
MSGID: "msgid",
|
|
444
|
+
MSGSTR: "msgstr",
|
|
445
|
+
MSGCTXT: "msgctxt",
|
|
446
|
+
MSGID_PLURAL: "msgid_plural"
|
|
447
|
+
};
|
|
448
|
+
POParser.COMMENTS = {
|
|
449
|
+
REFERENCE: "#:",
|
|
450
|
+
EXTRACTED: "#.",
|
|
451
|
+
TRANSLATOR: "#",
|
|
452
|
+
FLAG: "#,",
|
|
453
|
+
PREVIOUS: "#|"
|
|
454
|
+
};
|
|
455
|
+
POParser.QUOTE = '"';
|
|
456
|
+
POParser.NEWLINE = "\\n";
|
|
457
|
+
POParser.FILE_COLUMN_SEPARATOR = ":";
|
|
458
|
+
POParser.META_SEPARATOR = ":";
|
|
459
|
+
POParser.FLAG_SEPARATOR = ", ";
|
|
460
|
+
POParser.ESCAPE_LOOKUP = {
|
|
461
|
+
"\\": "\\",
|
|
462
|
+
'"': '"',
|
|
463
|
+
"\n": "n",
|
|
464
|
+
"\r": "r",
|
|
465
|
+
" ": "t"
|
|
466
|
+
};
|
|
467
|
+
POParser.UNESCAPE_LOOKUP = Object.entries(POParser.ESCAPE_LOOKUP).reduce(function(acc, param) {
|
|
468
|
+
var _param = _slicedToArray(param, 2), char = _param[0], code = _param[1];
|
|
469
|
+
acc[code] = char;
|
|
470
|
+
return acc;
|
|
471
|
+
}, {});
|
package/package.json
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@common.js/po-parser",
|
|
3
|
+
"version": "2.1.1",
|
|
4
|
+
"homepage": "https://github.com/etienne-martin/common.js#readme",
|
|
5
|
+
"repository": "etienne-martin/common.js",
|
|
6
|
+
"description": "po-parser package exported as CommonJS modules",
|
|
7
|
+
"main": "dist/index.js",
|
|
8
|
+
"types": "dist/index.d.ts",
|
|
9
|
+
"type": "commonjs",
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "bunchee",
|
|
12
|
+
"lint": "tsc --noEmit",
|
|
13
|
+
"test": "vitest"
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist"
|
|
17
|
+
],
|
|
18
|
+
"license": "MIT",
|
|
19
|
+
"packageManager": "pnpm@10.17.1",
|
|
20
|
+
"publishConfig": {
|
|
21
|
+
"provenance": true
|
|
22
|
+
},
|
|
23
|
+
"devDependencies": {
|
|
24
|
+
"@semantic-release/changelog": "^6.0.3",
|
|
25
|
+
"@semantic-release/commit-analyzer": "^13.0.1",
|
|
26
|
+
"@semantic-release/git": "^10.0.1",
|
|
27
|
+
"@semantic-release/github": "^12.0.2",
|
|
28
|
+
"@semantic-release/npm": "^12.0.0",
|
|
29
|
+
"@semantic-release/release-notes-generator": "^14.1.0",
|
|
30
|
+
"bunchee": "^6.6.2",
|
|
31
|
+
"conventional-changelog-conventionalcommits": "^9.1.0",
|
|
32
|
+
"semantic-release": "^25.0.2",
|
|
33
|
+
"typescript": "^5.9.3",
|
|
34
|
+
"vitest": "^4.0.9"
|
|
35
|
+
},
|
|
36
|
+
"dependencies": {}
|
|
37
|
+
}
|