Skip to content

Commit

Permalink
Добавил новые режимы для невидимых символов
Browse files Browse the repository at this point in the history
  • Loading branch information
hcodes committed Dec 24, 2016
1 parent c2ad401 commit f266cf6
Show file tree
Hide file tree
Showing 5 changed files with 117 additions and 62 deletions.
19 changes: 15 additions & 4 deletions README.md
Expand Up @@ -132,13 +132,24 @@ Typograf.rule({
var tp = new Typograf({lang: 'ru'});
tp.execute('...'); //

// HTML-сущности, как имена
// HTML-сущности в виде имён
var tpName = new Typograf({lang: 'ru', mode: 'name'});
tpName.execute('...'); // …
tpName.execute('12 кг...'); // 12 кг…

// HTML-сущности, как цифры
// HTML-сущности в виде цифр
var tpDigit = new Typograf({lang: 'ru', mode: 'digit'});
tpDigit.execute('...'); // …
tpDigit.execute('12 кг...'); // 12 кг…

// HTML-сущности в виде имён только для невидимых символов
var tpNameInvisible = new Typograf({lang: 'ru', mode: 'name-invisible'});
tpNameInvisible.execute('12 кг...'); // 12 кг…

// HTML-сущности в виде цифр только для невидимых символов
var tpDigitInvisible = new Typograf({lang: 'ru', mode: 'digit-invisible'});
tpDigitInvisible.execute('12 кг...'); // 12 кг…

// Невидимые символы —         ­ ‌ ‍ ‎ ‏

```

### Типографика на лету
Expand Down
62 changes: 37 additions & 25 deletions src/entities.js
@@ -1,8 +1,5 @@
Typograf.prototype.entities = [];

// http://www.w3.org/TR/html4/sgml/entities
[
['nbsp', 160],
var visibleEntities = [
['iexcl', 161],
['cent', 162],
['pound', 163],
Expand All @@ -15,7 +12,6 @@ Typograf.prototype.entities = [];
['ordf', 170],
['laquo', 171],
['not', 172],
['shy', 173],
['reg', 174],
['macr', 175],
['deg', 176],
Expand Down Expand Up @@ -229,13 +225,6 @@ Typograf.prototype.entities = [];
['Yuml', 376],
['circ', 710],
['tilde', 732],
['ensp', 8194],
['emsp', 8195],
['thinsp', 8201],
['zwnj', 8204],
['zwj', 8205],
['lrm', 8206],
['rlm', 8207],
['ndash', 8211],
['mdash', 8212],
['lsquo', 8216],
Expand All @@ -252,17 +241,40 @@ Typograf.prototype.entities = [];
['euro', 8364],
['NestedGreaterGreater', 8811],
['NestedLessLess', 8810]
].forEach(function(en) {
var name = en[0],
num = en[1],
sym = String.fromCharCode(num),
buf = [
'&' + name + ';', // 0 -  
'&#' + num + ';', // 1 -  
sym, // 2 - \u00A0
new RegExp('&' + name + ';', 'g'),
new RegExp(sym, 'g') // 4
];
];

var invisibleEntities = [
['nbsp', 160],
['thinsp', 8201],
['ensp', 8194],
['emsp', 8195],
['shy', 173],
['zwnj', 8204],
['zwj', 8205],
['lrm', 8206],
['rlm', 8207]
];

function prepareEntities(entities) {
var result = [];

entities.forEach(function(en) {
var name = en[0],
num = en[1],
sym = String.fromCharCode(num),
buf = [
'&' + name + ';', // 0 -  
'&#' + num + ';', // 1 -  
sym, // 2 - \u00A0
new RegExp('&' + name + ';', 'g'),
new RegExp(sym, 'g') // 4
];

result.push(buf);
}, this);

return result;
}

Typograf.prototype.entities.push(buf);
}, this);
Typograf.prototype.entities = prepareEntities([].concat(visibleEntities, invisibleEntities));
Typograf.prototype.invisibleEntities = prepareEntities(invisibleEntities);
26 changes: 20 additions & 6 deletions src/main.js
Expand Up @@ -620,15 +620,29 @@ Typograf.prototype = {
});
},
_modification: function(text, mode) {
var index;

if (mode === 'name' || mode === 'name-invisible') {
index = 0;
} else if (mode === 'digit' || mode === 'digit-invisible') {
index = 1;
}

if (mode === 'name' || mode === 'digit') {
var index = mode === 'name' ? 0 : 1;
this.entities.forEach(function(entity) {
if (entity[index]) {
text = text.replace(entity[4], entity[index]);
}
});
text = this._modificationEntities(text, index, this.entities);
} else if (mode === 'name-invisible' || mode === 'digit-invisible') {
text = this._modificationEntities(text, index, this.invisibleEntities);
}

return text;
},
_modificationEntities: function(text, index, entities) {
entities.forEach(function(entity) {
if (entity[index]) {
text = text.replace(entity[4], entity[index]);
}
});

return text;
}
};
27 changes: 0 additions & 27 deletions test/test.api.js
Expand Up @@ -93,33 +93,6 @@ describe('API', function() {
assert.equal(t.setting('fake'), undefined);
});

it('should get entities as name or digit', function() {
const t2 = new Typograf({mode: 'name'});
assert.equal(t2.execute('1\u00A02'), '1 2');
assert.equal(t2.execute('1 2'), '1 2');

const t3 = new Typograf({mode: 'digit'});
assert.equal(t3.execute('1\u00A02'), '1 2');
assert.equal(t3.execute('1 2'), '1 2');
});

it('should get entities as name or digit with method "execute"', function() {
const t2 = new Typograf();
assert.equal(t2.execute('1\u00A02\u00A03', {mode: 'name'}), '1 2 3');
assert.equal(t2.execute('1 2 3', {mode: 'name'}), '1 2 3');
assert.equal(t2.execute('1 2 3', {mode: 'name'}), '1 2 3');
assert.equal(t2.execute('1 2 3', {mode: 'name'}), '1 2 3');
assert.equal(t2.execute('1 2 3', {mode: 'name'}), '1 2 3');

const t3 = new Typograf();
assert.equal(t3.execute('1\u00A02\u00A03', {mode: 'digit'}), '1 2 3');
assert.equal(t3.execute('1 2 3', {mode: 'digit'}), '1 2 3');
assert.equal(t3.execute('1 2 3', {mode: 'digit'}), '1 2 3');
assert.equal(t3.execute('1 2 3', {mode: 'digit'}), '1 2 3');
assert.equal(t3.execute('1 2 3', {mode: 'digit'}), '1 2 3');
assert.equal(t3.execute('1 2 3', {mode: 'digit'}), '1 2 3');
});

it('should add safe tag', function() {
const t2 = new Typograf();
t2.addSafeTag('<myTag>', '</myTag>');
Expand Down
45 changes: 45 additions & 0 deletions test/test.entities.js
@@ -0,0 +1,45 @@
'use strict';

const assert = require('chai').assert;
const rules = require('../build/rules');
const Typograf = require('../build/typograf');
const t = new Typograf();

describe('Entities', function() {
it('should get entities as name or digit', function() {
const t2 = new Typograf({mode: 'name'});
assert.equal(t2.execute('1\u00A02'), '1&nbsp;2');
assert.equal(t2.execute('1&#160;2'), '1&nbsp;2');

const t3 = new Typograf({mode: 'digit'});
assert.equal(t3.execute('1\u00A02'), '1&#160;2');
assert.equal(t3.execute('1&nbsp;2'), '1&#160;2');
});

it('should get entities as name only for invisible symbols', function() {
const t = new Typograf({mode: 'name-invisible'});
assert.equal(t.execute('1\u00A02… a\u00A0b…'), '1&nbsp;2… a&nbsp;b…');
});

it('should get entities as digit only for invisible symbols', function() {
const t = new Typograf({mode: 'digit-invisible'});
assert.equal(t.execute('1\u00A02… a\u00A0b…'), '1&#160;2… a&#160;b…');
});

it('should get entities as name or digit with method "execute"', function() {
const t2 = new Typograf();
assert.equal(t2.execute('1\u00A02\u00A03', {mode: 'name'}), '1&nbsp;2&nbsp;3');
assert.equal(t2.execute('1&#160;2&#160;3', {mode: 'name'}), '1&nbsp;2&nbsp;3');
assert.equal(t2.execute('1&#xA0;2&#160;3', {mode: 'name'}), '1&nbsp;2&nbsp;3');
assert.equal(t2.execute('1&#xa0;2&#160;3', {mode: 'name'}), '1&nbsp;2&nbsp;3');
assert.equal(t2.execute('1&#xa0;2&#xa0;3', {mode: 'name'}), '1&nbsp;2&nbsp;3');

const t3 = new Typograf();
assert.equal(t3.execute('1\u00A02\u00A03', {mode: 'digit'}), '1&#160;2&#160;3');
assert.equal(t3.execute('1&nbsp;2&nbsp;3', {mode: 'digit'}), '1&#160;2&#160;3');
assert.equal(t3.execute('1&#xa0;2&nbsp;3', {mode: 'digit'}), '1&#160;2&#160;3');
assert.equal(t3.execute('1&#xa0;2&#160;3', {mode: 'digit'}), '1&#160;2&#160;3');
assert.equal(t3.execute('1&#xa0;2&#xa0;3', {mode: 'digit'}), '1&#160;2&#160;3');
assert.equal(t3.execute('1&#XA0;2&#XA0;3', {mode: 'digit'}), '1&#160;2&#160;3');
});
});

0 comments on commit f266cf6

Please sign in to comment.