New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

i18n-patch

Package Overview
Dependencies
Maintainers
1
Versions
23
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

i18n-patch - npm Package Compare versions

Comparing version 0.0.6 to 0.0.7

lib/translator.js

373

lib/index.js

@@ -7,14 +7,2 @@ 'use strict';

var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of');
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = require('babel-runtime/helpers/inherits');
var _inherits3 = _interopRequireDefault(_inherits2);
var _keys = require('babel-runtime/core-js/object/keys');

@@ -54,4 +42,6 @@

var _stream = require('stream');
var _translator = require('./translator');
var _translator2 = _interopRequireDefault(_translator);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

@@ -454,2 +444,68 @@

return new _promise2.default(function (resolve, reject) {
if (t.locale) {
var shouldContinue = true;
if (t.locale.include) {
shouldContinue = false;
var _iteratorNormalCompletion10 = true;
var _didIteratorError10 = false;
var _iteratorError10 = undefined;
try {
for (var _iterator10 = (0, _getIterator3.default)(t.locale.include), _step10; !(_iteratorNormalCompletion10 = (_step10 = _iterator10.next()).done); _iteratorNormalCompletion10 = true) {
var l = _step10.value;
if (l === _this2.options.locale) {
shouldContinue = true;
break;
}
}
} catch (err) {
_didIteratorError10 = true;
_iteratorError10 = err;
} finally {
try {
if (!_iteratorNormalCompletion10 && _iterator10.return) {
_iterator10.return();
}
} finally {
if (_didIteratorError10) {
throw _iteratorError10;
}
}
}
} else if (t.locale.exclude) {
shouldContinue = true;
var _iteratorNormalCompletion11 = true;
var _didIteratorError11 = false;
var _iteratorError11 = undefined;
try {
for (var _iterator11 = (0, _getIterator3.default)(t.locale.exclude), _step11; !(_iteratorNormalCompletion11 = (_step11 = _iterator11.next()).done); _iteratorNormalCompletion11 = true) {
var _l = _step11.value;
if (_l === _this2.options.locale) {
shouldContinue = false;
break;
}
}
} catch (err) {
_didIteratorError11 = true;
_iteratorError11 = err;
} finally {
try {
if (!_iteratorNormalCompletion11 && _iterator11.return) {
_iterator11.return();
}
} finally {
if (_didIteratorError11) {
throw _iteratorError11;
}
}
}
}
if (!shouldContinue) {
resolve();
return;
}
}
var srcGlob = t.src || '**/*';

@@ -504,3 +560,3 @@ var srcPaths = _path2.default.join(_this2.options.dest, srcGlob);

// Per-line processing
var translator = new Translator(t);
var translator = new _translator2.default(t);
var out = temp.createWriteStream();

@@ -514,9 +570,9 @@ _fsExtra2.default.createReadStream(file).pipe(translator).on('error', reject).pipe(out).on('error', reject).on('close', function () {

var value = '';
var _iteratorNormalCompletion10 = true;
var _didIteratorError10 = false;
var _iteratorError10 = undefined;
var _iteratorNormalCompletion12 = true;
var _didIteratorError12 = false;
var _iteratorError12 = undefined;
try {
for (var _iterator10 = (0, _getIterator3.default)(translator.beginBuffer), _step10; !(_iteratorNormalCompletion10 = (_step10 = _iterator10.next()).done); _iteratorNormalCompletion10 = true) {
var e = _step10.value;
for (var _iterator12 = (0, _getIterator3.default)(translator.beginBuffer), _step12; !(_iteratorNormalCompletion12 = (_step12 = _iterator12.next()).done); _iteratorNormalCompletion12 = true) {
var e = _step12.value;

@@ -529,12 +585,12 @@ value += e;

} catch (err) {
_didIteratorError10 = true;
_iteratorError10 = err;
_didIteratorError12 = true;
_iteratorError12 = err;
} finally {
try {
if (!_iteratorNormalCompletion10 && _iterator10.return) {
_iterator10.return();
if (!_iteratorNormalCompletion12 && _iterator12.return) {
_iterator12.return();
}
} finally {
if (_didIteratorError10) {
throw _iteratorError10;
if (_didIteratorError12) {
throw _iteratorError12;
}

@@ -549,9 +605,9 @@ }

var _value = '';
var _iteratorNormalCompletion11 = true;
var _didIteratorError11 = false;
var _iteratorError11 = undefined;
var _iteratorNormalCompletion13 = true;
var _didIteratorError13 = false;
var _iteratorError13 = undefined;
try {
for (var _iterator11 = (0, _getIterator3.default)(translator.endBuffer), _step11; !(_iteratorNormalCompletion11 = (_step11 = _iterator11.next()).done); _iteratorNormalCompletion11 = true) {
var _e = _step11.value;
for (var _iterator13 = (0, _getIterator3.default)(translator.endBuffer), _step13; !(_iteratorNormalCompletion13 = (_step13 = _iterator13.next()).done); _iteratorNormalCompletion13 = true) {
var _e = _step13.value;

@@ -564,12 +620,12 @@ _value += _e;

} catch (err) {
_didIteratorError11 = true;
_iteratorError11 = err;
_didIteratorError13 = true;
_iteratorError13 = err;
} finally {
try {
if (!_iteratorNormalCompletion11 && _iterator11.return) {
_iterator11.return();
if (!_iteratorNormalCompletion13 && _iterator13.return) {
_iterator13.return();
}
} finally {
if (_didIteratorError11) {
throw _iteratorError11;
if (_didIteratorError13) {
throw _iteratorError13;
}

@@ -595,9 +651,9 @@ }

try {
var _iteratorNormalCompletion12 = true;
var _didIteratorError12 = false;
var _iteratorError12 = undefined;
var _iteratorNormalCompletion14 = true;
var _didIteratorError14 = false;
var _iteratorError14 = undefined;
try {
for (var _iterator12 = (0, _getIterator3.default)(t.patterns), _step12; !(_iteratorNormalCompletion12 = (_step12 = _iterator12.next()).done); _iteratorNormalCompletion12 = true) {
var p = _step12.value;
for (var _iterator14 = (0, _getIterator3.default)(t.patterns), _step14; !(_iteratorNormalCompletion14 = (_step14 = _iterator14.next()).done); _iteratorNormalCompletion14 = true) {
var p = _step14.value;

@@ -624,12 +680,12 @@ if (p.pattern || !p.insert || !p.insert.resolved) {

} catch (err) {
_didIteratorError12 = true;
_iteratorError12 = err;
_didIteratorError14 = true;
_iteratorError14 = err;
} finally {
try {
if (!_iteratorNormalCompletion12 && _iterator12.return) {
_iterator12.return();
if (!_iteratorNormalCompletion14 && _iterator14.return) {
_iterator14.return();
}
} finally {
if (_didIteratorError12) {
throw _iteratorError12;
if (_didIteratorError14) {
throw _iteratorError14;
}

@@ -699,223 +755,2 @@ }

exports.default = I18nPatch;
var Translator = function (_Transform) {
(0, _inherits3.default)(Translator, _Transform);
function Translator(translation) {
(0, _classCallCheck3.default)(this, Translator);
var _this5 = (0, _possibleConstructorReturn3.default)(this, (0, _getPrototypeOf2.default)(Translator).call(this, { objectMode: true }));
_this5.t = translation;
_this5.matched = false;
_this5.buffer = [];
_this5.beginBuffer = [];
_this5.endBuffer = [];
_this5.pendingPatterns = [];
_this5.inputEnd = false;
return _this5;
}
(0, _createClass3.default)(Translator, [{
key: '_transform',
value: function _transform(chunk, encoding, done) {
var data = chunk.toString();
if (this.lastLineData) {
data = this.lastLineData + data;
}
var lines = data.split(NEWLINE);
this.lastLineData = lines.splice(lines.length - 1, 1)[0];
lines.forEach(function (line) {
this.buffer.push(line);
}.bind(this));
this.process();
done();
}
}, {
key: '_flush',
value: function _flush(done) {
if (this.lastLineData) {
this.buffer.push(this.lastLineData);
}
this.inputEnd = true;
this.process();
this.lastLineData = null;
this.buffer = null;
done();
}
}, {
key: 'process',
value: function process() {
while (this.buffer.length) {
if (!this.processLine(this.t, this.buffer.shift())) {
// Need to wait next data
break;
}
}
}
}, {
key: 'processLine',
value: function processLine(t, line) {
var _this6 = this;
var result = line;
// If pendingPatterns are not empty,
// it means that the first pattern need more lines.
if (0 === this.pendingPatterns.length) {
t.patterns.forEach(function (p) {
_this6.pendingPatterns.push(p);
});
}
while (this.pendingPatterns.length) {
var p = this.pendingPatterns.shift();
if (!p.resolved) {
continue;
}
var before = result;
var beforeMultiline = before;
var patternSource = p.pattern instanceof RegExp ? p.pattern.source : p.pattern;
var patternLines = patternSource
// Usually the pattern includes ([^\n]*) to express a line
// in multiline expression, so this should be removed
// to know how many lines this pattern requires.
.replace('[^\\n]', '').split('\\n').length;
var consumedBuffers = 0;
if (1 < patternLines) {
var currentLines = result.split(NEWLINE).length;
if (patternLines - currentLines <= this.buffer.length) {
for (var i = 0; i < patternLines - currentLines; i++) {
result += NEWLINE + this.buffer[i];
beforeMultiline = result;
consumedBuffers++;
}
} else if (this.inputEnd) {
// We should give up this pattern to be matched
// because there's no more data to read.
continue;
} else {
// If the input is not ended,
// put the current pattern and result back to the buffer
// and wait next data to be arrived.
this.pendingPatterns.unshift(p);
this.buffer.unshift(result);
return false;
}
}
result = this.applyToResolved(result, p, p.pattern, p.exclude, p.flags);
if (p.insert && p.insert.resolved) {
if (p.insert.at === INSERT_AT_BEGIN) {
if (this.beginBuffer.indexOf(p.insert.resolved) < 0) {
this.beginBuffer.push(p.insert.resolved);
}
} else if (p.insert.at === INSERT_AT_END) {
if (this.endBuffer.indexOf(p.insert.resolved) < 0) {
this.endBuffer.push(p.insert.resolved);
}
}
}
if (beforeMultiline === result) {
// result might include the next lines to look-ahead,
// but the next pattern should process the first line of the result.
// So result should be reverted to the value
// of the beginning of the current loop.
result = before;
continue;
}
// We should consume looked-ahead buffers only when they match the pattern.
if (0 < consumedBuffers) {
for (var _i = consumedBuffers; 0 < _i; _i--) {
this.buffer.shift();
}
}
this.matched = true;
if (t.conditionals) {
var _iteratorNormalCompletion13 = true;
var _didIteratorError13 = false;
var _iteratorError13 = undefined;
try {
for (var _iterator13 = (0, _getIterator3.default)(t.conditionals), _step13; !(_iteratorNormalCompletion13 = (_step13 = _iterator13.next()).done); _iteratorNormalCompletion13 = true) {
var c = _step13.value;
if (!c.insert || !c.insert.resolved) {
continue;
}
if (c.insert.at === INSERT_AT_BEGIN) {
if (this.beginBuffer.indexOf(c.insert.resolved) < 0) {
this.beginBuffer.push(c.insert.resolved);
}
} else if (c.insert.at === INSERT_AT_END) {
if (this.endBuffer.indexOf(c.insert.resolved) < 0) {
this.endBuffer.push(c.insert.resolved);
}
}
}
} catch (err) {
_didIteratorError13 = true;
_iteratorError13 = err;
} finally {
try {
if (!_iteratorNormalCompletion13 && _iterator13.return) {
_iterator13.return();
}
} finally {
if (_didIteratorError13) {
throw _iteratorError13;
}
}
}
}
}
// TODO Preserve original newline if possible
this.push(result + NEWLINE);
return true;
}
}, {
key: 'applyToResolved',
value: function applyToResolved(target, obj, pattern, exclude, flags) {
var resolved = obj.resolved;
if (obj.args) {
for (var i = 0; i < obj.args.length; i++) {
var argResolved = obj.argsResolved[i];
if (argResolved) {
if (argResolved.replace && typeof argResolved.replace !== 'function') {
if (argResolved.resolved) {
resolved = this.applyToArgResolved(resolved, argResolved, '{' + i + '}');
} else {
resolved = resolved.replace('{' + i + '}', argResolved.replace);
}
} else {
resolved = resolved.replace('{' + i + '}', argResolved);
}
} else {
resolved = resolved.replace('{' + i + '}', obj.args[i]);
}
}
}
var exp = flags ? new RegExp(pattern, flags) : pattern;
var result = target.replace(exp, resolved);
if (exclude && result !== target && target.match(exclude)) {
return target;
}
return result;
}
}, {
key: 'applyToArgResolved',
value: function applyToArgResolved(target, obj, pattern) {
if (obj.args) {
for (var i = 0; i < obj.args.length; i++) {
var argResolved = obj.argsResolved[i];
if (argResolved) {
obj.resolved = this.applyToArgResolved(obj.resolved, argResolved, '{' + i + '}');
} else {
obj.resolved = obj.resolved.replace('{' + i + '}', obj.args[i]);
}
}
}
return target.replace(pattern, obj.resolved);
}
}]);
return Translator;
}(_stream.Transform);
exports.default = I18nPatch;
{
"name": "i18n-patch",
"version": "0.0.6",
"version": "0.0.7",
"description": "Replacing codes for i18n with patterns.",

@@ -5,0 +5,0 @@ "license": "MIT",

@@ -261,3 +261,3 @@ # i18n-patch

user: ユーザ
editSomething: '{0}を編集'å
editSomething: '{0}を編集'
```

@@ -267,3 +267,3 @@

```
```haml
- if user

@@ -275,3 +275,3 @@ Edit user

```
```haml
- if user

@@ -623,4 +623,57 @@ ユーザを編集

### Include/exclude locales
You can apply a translation config for specific locales using `locale.include` or `locale.exclude` option.
For example, when the following configuration is given,
```yaml
# i18n.yml
translations:
# translation1
- src: 'test.js'
locale:
include: ['ja']
patterns:
- pattern: foo
replace: '${foo}'
# translation2
- src: 'test.js'
locale:
exclude: ['ja']
patterns:
- pattern: bar
replace: '${bar}'
# translation3
- src: 'test.js'
patterns:
- pattern: baz
replace: '${baz}'
# ja.yml
foo: hoge
bar: fuga
baz: piyo
```
the following input file
```
foo
bar
baz
```
will be converted into:
```
hoge
bar
piyo
```
`translation1` and `translation3` can be applied to `ja` locale (`foo` -> `hoge`, `baz` -> `piyo`), but `translation2` (`bar` -> `fuga`) is not applied to `ja` config due to `locale.exclude`.
## License
MIT

@@ -7,3 +7,3 @@ 'use strict';

import 'babel-polyfill';
import { Transform } from 'stream';
import Translator from './translator';
const async = require('async');

@@ -193,2 +193,26 @@ const yaml = require('js-yaml');

return new Promise((resolve, reject) => {
if (t.locale) {
let shouldContinue = true;
if (t.locale.include) {
shouldContinue = false;
for (let l of t.locale.include) {
if (l === this.options.locale) {
shouldContinue = true;
break;
}
}
} else if (t.locale.exclude) {
shouldContinue = true;
for (let l of t.locale.exclude) {
if (l === this.options.locale) {
shouldContinue = false;
break;
}
}
}
if (!shouldContinue) {
resolve();
return;
}
}
let srcGlob = t.src || '**/*';

@@ -350,185 +374,1 @@ let srcPaths = path.join(this.options.dest, srcGlob);

}
class Translator extends Transform {
constructor(translation) {
super({ objectMode: true });
this.t = translation;
this.matched = false;
this.buffer = [];
this.beginBuffer = [];
this.endBuffer = [];
this.pendingPatterns = [];
this.inputEnd = false;
}
_transform(chunk, encoding, done) {
var data = chunk.toString();
if (this.lastLineData) {
data = this.lastLineData + data;
}
var lines = data.split(NEWLINE);
this.lastLineData = lines.splice(lines.length - 1, 1)[0];
lines.forEach(function(line) {
this.buffer.push(line);
}.bind(this));
this.process();
done();
}
_flush(done) {
if (this.lastLineData) {
this.buffer.push(this.lastLineData);
}
this.inputEnd = true;
this.process();
this.lastLineData = null;
this.buffer = null;
done();
}
process() {
while (this.buffer.length) {
if (!this.processLine(this.t, this.buffer.shift())) {
// Need to wait next data
break;
}
}
}
processLine(t, line) {
let result = line;
// If pendingPatterns are not empty,
// it means that the first pattern need more lines.
if (0 === this.pendingPatterns.length) {
t.patterns.forEach((p) => {
this.pendingPatterns.push(p);
});
}
while (this.pendingPatterns.length) {
let p = this.pendingPatterns.shift();
if (!p.resolved) {
continue;
}
let before = result;
let beforeMultiline = before;
let patternSource = p.pattern instanceof RegExp ? p.pattern.source : p.pattern;
let patternLines = patternSource
// Usually the pattern includes ([^\n]*) to express a line
// in multiline expression, so this should be removed
// to know how many lines this pattern requires.
.replace('[^\\n]', '')
.split('\\n').length;
let consumedBuffers = 0;
if (1 < patternLines) {
let currentLines = result.split(NEWLINE).length;
if (patternLines - currentLines <= this.buffer.length) {
for (let i = 0; i < patternLines - currentLines; i++) {
result += NEWLINE + this.buffer[i];
beforeMultiline = result;
consumedBuffers++;
}
} else if (this.inputEnd) {
// We should give up this pattern to be matched
// because there's no more data to read.
continue;
} else {
// If the input is not ended,
// put the current pattern and result back to the buffer
// and wait next data to be arrived.
this.pendingPatterns.unshift(p);
this.buffer.unshift(result);
return false;
}
}
result = this.applyToResolved(result, p, p.pattern, p.exclude, p.flags);
if (p.insert && p.insert.resolved) {
if (p.insert.at === INSERT_AT_BEGIN) {
if (this.beginBuffer.indexOf(p.insert.resolved) < 0) {
this.beginBuffer.push(p.insert.resolved);
}
} else if (p.insert.at === INSERT_AT_END) {
if (this.endBuffer.indexOf(p.insert.resolved) < 0) {
this.endBuffer.push(p.insert.resolved);
}
}
}
if (beforeMultiline === result) {
// result might include the next lines to look-ahead,
// but the next pattern should process the first line of the result.
// So result should be reverted to the value
// of the beginning of the current loop.
result = before;
continue;
}
// We should consume looked-ahead buffers only when they match the pattern.
if (0 < consumedBuffers) {
for (let i = consumedBuffers; 0 < i; i--) {
this.buffer.shift();
}
}
this.matched = true;
if (t.conditionals) {
for (let c of t.conditionals) {
if (!c.insert || !c.insert.resolved) {
continue;
}
if (c.insert.at === INSERT_AT_BEGIN) {
if (this.beginBuffer.indexOf(c.insert.resolved) < 0) {
this.beginBuffer.push(c.insert.resolved);
}
} else if (c.insert.at === INSERT_AT_END) {
if (this.endBuffer.indexOf(c.insert.resolved) < 0) {
this.endBuffer.push(c.insert.resolved);
}
}
}
}
}
// TODO Preserve original newline if possible
this.push(result + NEWLINE);
return true;
}
applyToResolved(target, obj, pattern, exclude, flags) {
let resolved = obj.resolved;
if (obj.args) {
for (let i = 0; i < obj.args.length; i++) {
let argResolved = obj.argsResolved[i];
if (argResolved) {
if (argResolved.replace && typeof argResolved.replace !== 'function') {
if (argResolved.resolved) {
resolved = this.applyToArgResolved(resolved, argResolved, `{${i}}`);
} else {
resolved = resolved.replace(`{${i}}`, argResolved.replace);
}
} else {
resolved = resolved.replace(`{${i}}`, argResolved);
}
} else {
resolved = resolved.replace(`{${i}}`, obj.args[i]);
}
}
}
let exp = flags ? new RegExp(pattern, flags) : pattern;
let result = target.replace(exp, resolved);
if (exclude && result !== target && target.match(exclude)) {
return target;
}
return result;
}
applyToArgResolved(target, obj, pattern) {
if (obj.args) {
for (let i = 0; i < obj.args.length; i++) {
let argResolved = obj.argsResolved[i];
if (argResolved) {
obj.resolved = this.applyToArgResolved(obj.resolved, argResolved, `{${i}}`);
} else {
obj.resolved = obj.resolved.replace(`{${i}}`, obj.args[i]);
}
}
}
return target.replace(pattern, obj.resolved);
}
}
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