diff options
Diffstat (limited to 'node_modules/gettext-parser/lib/shared.js')
-rw-r--r-- | node_modules/gettext-parser/lib/shared.js | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/node_modules/gettext-parser/lib/shared.js b/node_modules/gettext-parser/lib/shared.js new file mode 100644 index 000000000..44bfb86f7 --- /dev/null +++ b/node_modules/gettext-parser/lib/shared.js @@ -0,0 +1,120 @@ +'use strict'; + +// Expose to the world +module.exports.parseHeader = parseHeader; +module.exports.generateHeader = generateHeader; +module.exports.formatCharset = formatCharset; +module.exports.foldLine = foldLine; + +/** + * Parses a header string into an object of key-value pairs + * + * @param {String} str Header string + * @return {Object} An object of key-value pairs + */ +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; + }); + + return headers; +} + +/** + * Convert first letters after - to uppercase, other lowercase + * + * @param {String} str String to be updated + * @return {String} A string with uppercase words + */ +function upperCaseWords(str) { + return (str || '').toLowerCase().trim().replace(/^(MIME|POT?(?=\-)|[a-z])|\-[a-z]/gi, function(str) { + return str.toUpperCase(); + }); +} + +/** + * Joins a header object of key value pairs into a header string + * + * @param {Object} header Object of key value pairs + * @return {String} Header string + */ +function generateHeader(header) { + var lines = []; + + Object.keys(header || {}).forEach(function(key) { + if (key) { + lines.push(upperCaseWords(key) + ': ' + (header[key] || '').trim()); + } + }); + + return lines.join('\n') + (lines.length ? '\n' : ''); +} + +/** + * Normalizes charset name. Converts utf8 to utf-8, WIN1257 to windows-1257 etc. + * + * @param {String} charset Charset name + * @return {String} Normalized charset name + */ +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(); +} + +/** + * Folds long lines according to PO format + * + * @param {String} str PO formatted string to be folded + * @param {Number} [maxLen=76] Maximum allowed length for folded lines + * @return {Array} An array of lines + */ +function foldLine(str, maxLen) { + + maxLen = maxLen || 76; + + var lines = [], + curLine = '', + pos = 0, + len = str.length, + match; + + while (pos < len) { + curLine = str.substr(pos, maxLen); + + // ensure that the line never ends with a partial escaping + // make longer lines if needed + while (curLine.substr(-1) === '\\' && pos + curLine.length < len) { + curLine += str.charAt(pos + curLine.length); + } + + // ensure that if possible, line breaks are done at reasonable places + 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) { + 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) { + curLine = curLine.substr(0, match.index + match[1].length); + } + } + + lines.push(curLine); + pos += curLine.length; + } + + return lines; +}
\ No newline at end of file |