Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

typograf

Package Overview
Dependencies
Maintainers
1
Versions
101
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

typograf - npm Package Compare versions

Comparing version 1.2.5 to 2.0.0

2

bower.json
{
"name": "typograf",
"version": "1.2.5",
"version": "2.0.0",
"description": "The client and server typographer",

@@ -5,0 +5,0 @@ "bugs": "https://github.com/hcodes/typograf/issues/new",

@@ -14,4 +14,7 @@ /*! Typograf | (c) 2014 Denis Seleznev | https://github.com/hcodes/typograf/ */

this._rules.forEach(function(rule) {
this._settings[rule.name] = rule.settings || {};
this._enabledRules[rule.name] = rule.enabled;
var name = rule.name;
rule._lang = name.split('/')[0];
this._settings[name] = rule.settings || {};
this._enabledRules[name] = rule.enabled;
}, this);

@@ -67,5 +70,11 @@ }

* @param {string} text
* @param {Object} params
* @return {string}
*/
execute: function(text) {
execute: function(text, params) {
var lang = params && params.lang;
if(!lang) {
lang = this._prefs.lang;
}
text = '' + text;

@@ -90,3 +99,3 @@

this._rules.forEach(function(rule) {
if(this.enabled(rule.name)) {
if(this.enabled(rule.name) && (rule._lang === 'common' || rule._lang === lang)) {
text = rule.func.call(this, text, this._settings[rule.name]);

@@ -493,9 +502,10 @@ }

['rsaquo', 8250],
['euro', 8364]
['euro', 8364],
[null, 8381] // рубль
].forEach(function(en) {
var name = en[0] + ';',
num = en[1] + ';',
buf = ['&' + name, '&#' + num, String.fromCharCode(en[1])];
var name = en[0],
num = en[1],
buf = ['&' + name + ';', '&#' + num + ';', String.fromCharCode(en[1])];
buf.push(new RegExp('(\\&\\#' + num + (name ? '|\\&' + name : '') + ')', 'g'));
buf.push(new RegExp('(\\&\\#' + num + ';' + (name ? '|\\&' + name + ';' : '') + ')', 'g'));

@@ -505,3 +515,3 @@ Typograf.prototype.entities.push(buf);

Typograf.data('month', [
Typograf.data('ru/month', [
'январь',

@@ -521,3 +531,18 @@ 'февраль',

Typograf.data('weekday', [
Typograf.data('ru/monthCase', [
'января',
'февраля',
'марта',
'апреля',
'мая',
'июня',
'июля',
'августа',
'сентября',
'октября',
'ноября',
'декабря'
]);
Typograf.data('ru/weekday', [
'понедельник',

@@ -534,3 +559,3 @@ 'вторник',

title: 'Удаление двойной пунктуации',
name: 'delDoublePunctiation',
name: 'common/delDoublePunctiation',
sortIndex: 580,

@@ -544,3 +569,3 @@ func: function(text) {

title: '!! → !',
name: 'exclamation',
name: 'common/exclamation',
sortIndex: 1150,

@@ -556,3 +581,3 @@ func: function(text) {

title: '!? → ?!',
name: 'exclamationQuestion',
name: 'common/exclamationQuestion',
sortIndex: 1140,

@@ -567,3 +592,3 @@ func: function(text) {

title: 'Расстановка кавычек',
name: 'quot',
name: 'ru/quot',
sortIndex: 700,

@@ -613,121 +638,4 @@ func: function(text, settings) {

Typograf.rule({
title: 'Преобразование дат к виду DD.MM.YYYY',
name: 'date/main',
sortIndex: 1300,
func: function(text) {
var sp1 = '(-|\\.|\\/)',
sp2 = '(-|\\/)',
re1 = new RegExp('(^|\\D)(\\d{4})' + sp1 + '(\\d{2})' + sp1 + '(\\d{2})(\\D|$)', 'gi'),
re2 = new RegExp('(^|\\D)(\\d{2})' + sp2 + '(\\d{2})' + sp2 + '(\\d{4})(\\D|$)', 'gi');
return text
.replace(re1, '$1$6.$4.$2$7')
.replace(re2, '$1$4.$2.$6$7');
}
});
(function() {
var before = '(^| |\\n)',
after = '( |,|\\.|\\?|\\:|\\!|$)';
Typograf.rule({
title: 'Дефис перед то, либо, нибудь, ка, де, кась',
name: 'dash/to',
sortIndex: 30,
func: function(text) {
var re = new RegExp('( | ?- ?)(то|либо|нибудь|ка|де|кась)' + after, 'g');
return text.replace(re, '-$2$3');
}
});
Typograf.rule({
title: 'Дефис между из-за',
name: 'dash/izza',
sortIndex: 33,
func: function(text) {
var re = new RegExp(before + '(И|и)з за' + after, 'g');
return text.replace(re, '$1$2з-за$3');
}
});
Typograf.rule({
title: 'Дефис между из-под',
name: 'dash/izpod',
sortIndex: 35,
func: function(text) {
var re = new RegExp(before + '(И|и)з под' + after, 'g');
return text.replace(re, '$1$2з-под$3');
}
});
Typograf.rule({
title: 'Дефис после кое и кой',
name: 'dash/koe',
sortIndex: 38,
func: function(text) {
var re = new RegExp(before + '(К|к)ое\\s([а-яё]{3,})' + after, 'g');
text = text.replace(re, '$1$2ое-$3$4');
var re2 = new RegExp(before + '(К|к)ой\\s([а-я]{3,})' + after, 'g');
return text.replace(re2, '$1$2ой-$3$4');
}
});
Typograf.rule({
title: 'Дефис между верно-таки и т.д.',
name: 'dash/taki',
sortIndex: 39,
func: function(text) {
var re = new RegExp('(верно|довольно|опять|прямо|так|всё|действительно|неужели)\\s(таки)' + after, 'g');
return text.replace(re, '$1-$2$3');
}
});
})();
Typograf.rule({
title: 'Дефис на тире',
name: 'dash/main',
sortIndex: 620,
func: function(text) {
var re = new RegExp('(\\s|\u00A0)(-|—)(\\s|\\n)', 'g');
return text
.replace(re, '\u00A0—$3')
.replace(/(X|I|V)(?: |\u00A0)?(-|—)(?: |\u00A0)?(X|I|V)/g, '$1—$3');
},
settings: {
dash: '\u2014',
dashInterval: '\u2014'
}
});
Typograf.rule({
title: 'Дефис между месяцами',
name: 'dash/month',
sortIndex: 610,
func: function(text) {
var part = '(' + this.data.month.join('|') + ')',
re = new RegExp(part + ' ?(-|—) ?' + part, 'gi');
return text.replace(re, '$1' + this.setting('dash/main', 'dashInterval') + '$3');
}
});
Typograf.rule({
title: 'Дефис между днями недели',
name: 'dash/weekday',
sortIndex: 600,
func: function(text) {
var part = '(' + this.data.weekday.join('|') + ')',
re = new RegExp(part + ' ?(-|—) ?' + part, 'gi');
return text.replace(re, '$1' + this.setting('dash/main', 'dashInterval') + '$3');
}
});
Typograf.rule({
title: 'Замена перевода строки на <br/>',
name: 'html/nbr',
name: 'common/html/nbr',
sortIndex: 710,

@@ -742,3 +650,3 @@ func: function(text) {

title: 'Расстановка <p> и <br/>',
name: 'html/pbr',
name: 'common/html/pbr',
sortIndex: 700,

@@ -760,3 +668,3 @@ func: function(text) {

title: 'Удаление HTML-тегов',
name: 'html/stripTags',
name: 'common/html/stripTags',
sortIndex: 5,

@@ -771,3 +679,3 @@ func: function(text) {

title: 'Расстановка ссылок',
name: 'html/url',
name: 'common/html/url',
sortIndex: 200,

@@ -798,37 +706,7 @@ func: function(text) {

Typograf.rule({
title: '$100 → 100 $',
name: 'money/dollar',
sortIndex: 1140,
func: function(text) {
var re1 = new RegExp('(^|[\\D]{2,})\\$ ?([\\d.,]+)', 'g'),
re2 = new RegExp('(^|[\\D])([\\d.,]+) ?\\$'),
rep = '$1$2\u00A0$';
return text
.replace(re1, rep)
.replace(re2, rep);
}
});
Typograf.rule({
title: '€100 → 100 €',
name: 'money/euro',
sortIndex: 1140,
func: function(text) {
var re1 = new RegExp('(^|[\\D]{2,})€ ?([\\d.]+)', 'g'),
re2 = new RegExp('(^|[\\D])([\\d.,]+) ?€'),
rep = '$1$2\u00A0€';
return text
.replace(re1, rep)
.replace(re2, rep);
}
});
Typograf.rule({
title: 'Неразрывный пробел после № и §',
name: 'nbsp/afterNum',
title: 'Неразрывный пробел после §',
name: 'common/nbsp/afterPara',
sortIndex: 610,
func: function(text) {
return text.replace(/№ ?(\d)/g, '№\u00A0$1').replace(/§ ?(\d|I|V|X)/g, '§\u00A0$1');
return text.replace(/§ ?(\d|I|V|X)/g, '§\u00A0$1');
}

@@ -839,7 +717,7 @@ });

title: 'Неразрывный пробел после короткого слова',
name: 'nbsp/afterShortWord',
name: 'common/nbsp/afterShortWord',
sortIndex: 590,
func: function(text, settings) {
var len = settings.lengthShortWord,
re = new RegExp('( [а-яёА-ЯЁ\\w]{1,' + len + '}) ', 'g');
re = new RegExp('( [\\w]{1,' + len + '}) ', 'g');

@@ -854,17 +732,8 @@ return text.replace(re, '$1\u00A0');

Typograf.rule({
title: 'Неразрывный пробел перед ли, ль, же, бы, б',
name: 'nbsp/beforeParticle',
sortIndex: 570,
func: function(text) {
return text.replace(/ (ли|ль|же|ж|бы|б)([^а-яёА-ЯЁ])/g, '\u00A0$1$2');
}
});
Typograf.rule({
title: 'Неразрывный пробел перед последним коротким словом в предложении',
name: 'nbsp/beforeShortLastWord',
name: 'common/nbsp/beforeShortLastWord',
sortIndex: 620,
func: function(text, settings) {
var len = settings.lengthLastWord,
re = new RegExp(' ([а-яёА-ЯЁ\\w]{1,' + len + '})(\\.|\\?|:|!|,)', 'g');
re = new RegExp(' ([\\w]{1,' + len + '})(\\.|\\?|:|!|,)', 'g');

@@ -879,8 +748,9 @@ return text.replace(re, '\u00A0$1$2');

Typograf.rule({
title: 'Расстановка запятых и неразрывного пробела перед а и но',
name: 'nbsp/but',
sortIndex: 1110,
title: 'Пробел после знаков пунктуации',
name: 'common/space/afterPunctuation',
sortIndex: 560,
func: function(text) {
var re = new RegExp('([,])?( |\u00A0|\n)(а|но)( |\u00A0|\n)', 'g');
return text.replace(re, ',$2$3$4');
return text
.replace(/(\!|;|\?)([^ \n\t\!;\?])/g, '$1 $2')
.replace(/(\D)(,|\:)([^ \/\d\n\t\!;,\?\.\:])/g, '$1$2 $3');
}

@@ -890,13 +760,20 @@ });

Typograf.rule({
title: 'm2 → м², m3 → м³ и неразрывный пробел',
name: 'nbsp/m',
sortIndex: 1030,
title: 'Удаление пробела перед %',
name: 'common/space/delBeforePercent',
sortIndex: 600,
func: function(text) {
var m = '(км|м|дм|см|мм)',
re2 = new RegExp('(^|\\D)(\\d+) ?' + m + '2(\\D|$)', 'g'),
re3 = new RegExp('(^|\\D)(\\d+) ?' + m + '3(\\D|$)', 'g');
return text.replace(/(\d)( |\u00A0)%/g, '$1%');
}
});
text = text.replace(re2, '$1$2\u00A0$3²$4');
return text.replace(re3, '$1$2\u00A0$3³$4');
Typograf.rule({
title: 'Удаление пробелов перед знаками пунктуации',
name: 'common/space/delBeforePunctuation',
sortIndex: 550,
func: function(text) {
return text.replace(/ (\!|;|,|\?|\.|\:)/g, '$1')
.replace(/\( /g, '(')
.replace(/([^ ])\(/g, '$1 (')
.replace(/ \)/g, ')')
.replace(/\)([^\!;,\?\.\:])/g, ') $1');
}

@@ -906,7 +783,7 @@ });

Typograf.rule({
title: 'Неразрывный пробел после OOO или ОАО',
name: 'nbsp/ooo',
sortIndex: 1100,
title: 'Удаление повторяющихся переносов строки (не более двух)',
name: 'common/space/delRepeatN',
sortIndex: 545,
func: function(text) {
return text.replace(/(ООО|ОАО) /g, '$1\u00A0');
return text.replace(/\n{3,}/g, '\n\n');
}

@@ -916,7 +793,7 @@ });

Typograf.rule({
title: 'Неразрывный пробел после XXXX',
name: 'nbsp/xxxx',
sortIndex: 1060,
title: 'Удаление повторяющихся пробелов',
name: 'common/space/delRepeatSpace',
sortIndex: 540,
func: function(text) {
return text.replace(/(^|\D)(\d{4}) ?г( |,|;|\.|\n|$)/g, '$1$2\u00A0г$3');
return text.replace(/( |\t){2,}/g, '$1');
}

@@ -926,7 +803,7 @@ });

Typograf.rule({
title: 'г.г. → гг. и неразрывный пробел',
name: 'nbsp/yy',
sortIndex: 1080,
title: 'Удаление пробелов в конце строк',
name: 'common/space/delTrailingBlanks',
sortIndex: 505,
func: function(text) {
return text.replace(/(^|\d) ?г\. ?г\./g, '$1\u00A0гг.');
return text.replace(/( |\t)+\n/g, '\n');
}

@@ -936,4 +813,22 @@ });

Typograf.rule({
title: 'Замена табов на пробелы',
name: 'common/space/replaceTab',
sortIndex: 510,
func: function(text) {
return text.replace(/\t/g, ' ');
}
});
Typograf.rule({
title: 'Удаление пробелов в начале и в конце текста',
name: 'common/space/trim',
sortIndex: 530,
func: function(text) {
return text.trim();
}
});
Typograf.rule({
title: '-> → →, <- → ←',
name: 'sym/arrow',
name: 'common/sym/arrow',
sortIndex: 1130,

@@ -947,3 +842,3 @@ func: function(text) {

title: 'Удаление лишних точек и пробелов в вв.',
name: 'sym/cc',
name: 'common/sym/cc',
sortIndex: 1090,

@@ -959,3 +854,3 @@ func: function(text) {

title: 'Добавление ° к C и F',
name: 'sym/cf',
name: 'common/sym/cf',
sortIndex: 1020,

@@ -971,3 +866,3 @@ func: function(text) {

title: '(c) → ©, (tm) → ©, (r) → ™',
name: 'sym/copy',
name: 'common/sym/copy',
sortIndex: 10,

@@ -983,3 +878,3 @@ func: function(text) {

title: '1/2 → ½, 1/4 → ¼, 3/3 → ¾',
name: 'sym/fraction',
name: 'common/sym/fraction',
sortIndex: 1120,

@@ -995,3 +890,3 @@ func: function(text) {

title: '... → …',
name: 'sym/hellip',
name: 'common/sym/hellip',
sortIndex: 20,

@@ -1005,3 +900,3 @@ func: function(text) {

title: '+- → ±',
name: 'sym/plusMinus',
name: 'common/sym/plusMinus',
sortIndex: 1010,

@@ -1016,3 +911,3 @@ func: function(text) {

title: 'x → ×',
name: 'sym/times',
name: 'common/sym/times',
sortIndex: 1050,

@@ -1024,10 +919,76 @@ func: function(text) {

(function() {
var before = '(^| |\\n)',
after = '( |,|\\.|\\?|\\:|\\!|$)';
Typograf.rule({
title: 'Пробел после знаков пунктуации',
name: 'space/afterPunctuation',
sortIndex: 560,
title: 'Дефис перед то, либо, нибудь, ка, де, кась',
name: 'ru/dash/to',
sortIndex: 30,
func: function(text) {
var re = new RegExp('( | ?- ?)(то|либо|нибудь|ка|де|кась)' + after, 'g');
return text.replace(re, '-$2$3');
}
});
Typograf.rule({
title: 'Дефис между из-за',
name: 'ru/dash/izza',
sortIndex: 33,
func: function(text) {
var re = new RegExp(before + '(И|и)з за' + after, 'g');
return text.replace(re, '$1$2з-за$3');
}
});
Typograf.rule({
title: 'Дефис между из-под',
name: 'ru/dash/izpod',
sortIndex: 35,
func: function(text) {
var re = new RegExp(before + '(И|и)з под' + after, 'g');
return text.replace(re, '$1$2з-под$3');
}
});
Typograf.rule({
title: 'Дефис после кое и кой',
name: 'ru/dash/koe',
sortIndex: 38,
func: function(text) {
var re = new RegExp(before + '(К|к)ое\\s([а-яё]{3,})' + after, 'g');
text = text.replace(re, '$1$2ое-$3$4');
var re2 = new RegExp(before + '(К|к)ой\\s([а-я]{3,})' + after, 'g');
return text.replace(re2, '$1$2ой-$3$4');
}
});
Typograf.rule({
title: 'Дефис между верно-таки и т.д.',
name: 'ru/dash/taki',
sortIndex: 39,
func: function(text) {
var re = new RegExp('(верно|довольно|опять|прямо|так|всё|действительно|неужели)\\s(таки)' + after, 'g');
return text.replace(re, '$1-$2$3');
}
});
})();
Typograf.rule({
title: 'Дефис на тире',
name: 'ru/dash/main',
sortIndex: 620,
func: function(text) {
var re = new RegExp('(\\s|\u00A0)(-|—)(\\s|\\n)', 'g');
return text
.replace(/(\!|;|\?)([^ \n\t\!;\?])/g, '$1 $2')
.replace(/(\D)(,|\:)([^ \/\d\n\t\!;,\?\.\:])/g, '$1$2 $3');
.replace(re, '\u00A0—$3')
.replace(/(X|I|V)(?: |\u00A0)?(-|—)(?: |\u00A0)?(X|I|V)/g, '$1—$3');
},
settings: {
dash: '\u2014',
dashInterval: '\u2014'
}

@@ -1037,7 +998,22 @@ });

Typograf.rule({
title: 'Удаление пробела перед %',
name: 'space/delBeforePercent',
title: 'Дефис между месяцами',
name: 'ru/dash/month',
sortIndex: 610,
func: function(text) {
var part = '(' + this.data['ru/month'].join('|') + ')',
re = new RegExp(part + ' ?(-|—) ?' + part, 'gi');
return text.replace(re, '$1' + this.setting('ru/dash/main', 'dashInterval') + '$3');
}
});
Typograf.rule({
title: 'Дефис между днями недели',
name: 'ru/dash/weekday',
sortIndex: 600,
func: function(text) {
return text.replace(/(\d)( |\u00A0)%/g, '$1%');
var part = '(' + this.data['ru/weekday'].join('|') + ')',
re = new RegExp(part + ' ?(-|—) ?' + part, 'gi');
return text.replace(re, '$1' + this.setting('ru/dash/main', 'dashInterval') + '$3');
}

@@ -1047,11 +1023,14 @@ });

Typograf.rule({
title: 'Удаление пробелов перед знаками пунктуации',
name: 'space/delBeforePunctuation',
sortIndex: 550,
title: 'Преобразование дат к виду DD.MM.YYYY',
name: 'ru/date/main',
sortIndex: 1300,
func: function(text) {
return text.replace(/ (\!|;|,|\?|\.|\:)/g, '$1')
.replace(/\( /g, '(')
.replace(/([^ ])\(/g, '$1 (')
.replace(/ \)/g, ')')
.replace(/\)([^\!;,\?\.\:])/g, ') $1');
var sp1 = '(-|\\.|\\/)',
sp2 = '(-|\\/)',
re1 = new RegExp('(^|\\D)(\\d{4})' + sp1 + '(\\d{2})' + sp1 + '(\\d{2})(\\D|$)', 'gi'),
re2 = new RegExp('(^|\\D)(\\d{2})' + sp2 + '(\\d{2})' + sp2 + '(\\d{4})(\\D|$)', 'gi');
return text
.replace(re1, '$1$6.$4.$2$7')
.replace(re2, '$1$4.$2.$6$7');
}

@@ -1061,7 +1040,15 @@ });

Typograf.rule({
title: 'Удаление повторяющихся переносов строки (не более двух)',
name: 'space/delRepeatN',
sortIndex: 545,
title: '2 Мая, Понедельник → 2 мая, понедельник',
name: 'ru/date/weekday',
sortIndex: 1310,
func: function(text) {
return text.replace(/\n{3,}/g, '\n\n');
var space = '( |\u00A0)',
monthCase = this.data['ru/monthCase'].join('|'),
weekday = this.data['ru/weekday'].join('|'),
re = new RegExp('(\\d)' + space + '(' + monthCase + '),' + space + '(' + weekday + ')', 'gi');
return text.replace(re, function() {
var a = arguments;
return a[1] + a[2] + a[3].toLowerCase() + ',' + a[4] + a[5].toLowerCase();
});
}

@@ -1071,7 +1058,13 @@ });

Typograf.rule({
title: 'Удаление повторяющихся пробелов',
name: 'space/delRepeatSpace',
sortIndex: 540,
title: '$100 → 100 $',
name: 'ru/money/dollar',
sortIndex: 1140,
func: function(text) {
return text.replace(/( |\t){2,}/g, '$1');
var re1 = new RegExp('(^|[\\D]{2,})\\$ ?([\\d.,]+)', 'g'),
re2 = new RegExp('(^|[\\D])([\\d.,]+) ?\\$'),
rep = '$1$2\u00A0$';
return text
.replace(re1, rep)
.replace(re2, rep);
}

@@ -1081,7 +1074,13 @@ });

Typograf.rule({
title: 'Удаление пробелов в конце строк',
name: 'space/delTrailingBlanks',
sortIndex: 505,
title: '€100 → 100 €',
name: 'ru/money/euro',
sortIndex: 1140,
func: function(text) {
return text.replace(/( |\t)+\n/g, '\n');
var re1 = new RegExp('(^|[\\D]{2,})€ ?([\\d.]+)', 'g'),
re2 = new RegExp('(^|[\\D])([\\d.,]+) ?€'),
rep = '$1$2\u00A0€';
return text
.replace(re1, rep)
.replace(re2, rep);
}

@@ -1091,7 +1090,11 @@ });

Typograf.rule({
title: 'Замена табов на пробелы',
name: 'space/replaceTab',
sortIndex: 510,
title: '1 руб. → 1 ₽',
name: 'ru/money/ruble',
sortIndex: 1145,
func: function(text) {
return text.replace(/\t/g, ' ');
var rep = '$1\u00A0₽';
return text
.replace(/^(\d+)( |\u00A0)?(р|руб)\.$/, rep)
.replace(/(\d+)( |\u00A0)?(р|руб)\.(?=[!?,:;])/g, rep)
.replace(/(\d+)( |\u00A0)?(р|руб)\.(?=\s+[A-ЯЁ])/g, rep + '.');
}

@@ -1101,11 +1104,102 @@ });

Typograf.rule({
title: 'Удаление пробелов в начале и в конце текста',
name: 'space/trim',
sortIndex: 530,
title: 'Неразрывный пробел после № и §',
name: 'ru/nbsp/afterNum',
sortIndex: 610,
func: function(text) {
return text.trim();
return text.replace(/№ ?(\d)/g, '№\u00A0$1').replace(/§ ?(\d|I|V|X)/g, '§\u00A0$1');
}
});
Typograf.rule({
title: 'Неразрывный пробел после короткого слова',
name: 'ru/nbsp/afterShortWord',
sortIndex: 590,
func: function(text, settings) {
var len = settings.lengthShortWord,
re = new RegExp('( [а-яёА-ЯЁ]{1,' + len + '}) ', 'g');
return text.replace(re, '$1\u00A0');
},
settings: {
lengthShortWord: 2
}
});
Typograf.rule({
title: 'Неразрывный пробел перед ли, ль, же, бы, б',
name: 'ru/nbsp/beforeParticle',
sortIndex: 570,
func: function(text) {
return text.replace(/ (ли|ль|же|ж|бы|б)([^а-яёА-ЯЁ])/g, '\u00A0$1$2');
}
});
Typograf.rule({
title: 'Неразрывный пробел перед последним коротким словом в предложении',
name: 'ru/nbsp/beforeShortLastWord',
sortIndex: 620,
func: function(text, settings) {
var len = settings.lengthLastWord,
re = new RegExp(' ([а-яёА-ЯЁ]{1,' + len + '})(\\.|\\?|:|!|,)', 'g');
return text.replace(re, '\u00A0$1$2');
},
settings: {
lengthLastWord: 3
}
});
Typograf.rule({
title: 'Расстановка запятых и неразрывного пробела перед а и но',
name: 'ru/nbsp/but',
sortIndex: 1110,
func: function(text) {
var re = new RegExp('([,])?( |\u00A0|\n)(а|но)( |\u00A0|\n)', 'g');
return text.replace(re, ',$2$3$4');
}
});
Typograf.rule({
title: 'm2 → м², m3 → м³ и неразрывный пробел',
name: 'ru/nbsp/m',
sortIndex: 1030,
func: function(text) {
var m = '(км|м|дм|см|мм)',
re2 = new RegExp('(^|\\D)(\\d+) ?' + m + '2(\\D|$)', 'g'),
re3 = new RegExp('(^|\\D)(\\d+) ?' + m + '3(\\D|$)', 'g');
text = text.replace(re2, '$1$2\u00A0$3²$4');
return text.replace(re3, '$1$2\u00A0$3³$4');
}
});
Typograf.rule({
title: 'Неразрывный пробел после OOO или ОАО',
name: 'ru/nbsp/ooo',
sortIndex: 1100,
func: function(text) {
return text.replace(/(ООО|ОАО) /g, '$1\u00A0');
}
});
Typograf.rule({
title: 'Неразрывный пробел после XXXX',
name: 'ru/nbsp/xxxx',
sortIndex: 1060,
func: function(text) {
return text.replace(/(^|\D)(\d{4}) ?г( |,|;|\.|\n|$)/g, '$1$2\u00A0г$3');
}
});
Typograf.rule({
title: 'г.г. → гг. и неразрывный пробел',
name: 'ru/nbsp/yy',
sortIndex: 1080,
func: function(text) {
return text.replace(/(^|\d) ?г\. ?г\./g, '$1\u00A0гг.');
}
});
Typograf._sortRules();
Typograf._needSortRules = true;

@@ -1,1 +0,1 @@

function Typograf(e){this._prefs="object"==typeof e?e:{},this._settings={},this._enabledRules={},this._rules.forEach(function(e){this._settings[e.name]=e.settings||{},this._enabledRules[e.name]=e.enabled},this)}Typograf.rule=function(e){return e.enabled=e.enabled===!1?!1:!0,Typograf.prototype._rules.push(e),Typograf._needSortRules&&this._sortRules(),this},Typograf.data=function(e,r){Typograf.prototype.data[e]=r},Typograf._sortRules=function(){Typograf.prototype._rules.sort(function(e,r){return e.sortIndex>r.sortIndex?1:-1})},Typograf.prototype={constructor:Typograf,execute:function(e){if(e=""+e,!e)return"";e=e.replace(/\r\n/g,"\n").replace(/\r/g,"\n");var r=-1!==e.search(/<|>/);return r&&(e=this._hideSafeTags(e)),e=this._utfication(e),this._rules.forEach(function(r){this.enabled(r.name)&&(e=r.func.call(this,e,this._settings[r.name]))},this),e=this._modification(e),r&&(e=this._showSafeTags(e)),e},setting:function(e,r,n){return arguments.length<=2?this._settings[e]&&this._settings[e][r]:(this._settings[e]=this._settings[e]||{},this._settings[e][r]=n,this)},enabled:function(e){return this._enabledRules[e]},disabled:function(e){return!this._enabledRules[e]},enable:function(e){return this._enable(e,!0)},disable:function(e){return this._enable(e,!1)},data:{},_enable:function(e,r){return Array.isArray(e)?e.forEach(function(e){this._enabledRules[e]=r},this):this._enabledRules[e]=r,this},_rules:[],_hideSafeTags:function(e){this._hiddenSafeTags={};var r=this,n="",t=[["<!--","-->"],["<pre[^>]*>","<\\/pre>"],["<code[^>]*>","<\\/code>"],["<style[^>]*>","<\\/style>"],["<script[^>]*>","<\\/script>"],["<object>","<\\/object>"]];t.forEach(function(e){n+="("+e[0]+"(.|\\n)*?"+e[1]+")|"},this);var a=0;return e=e.replace(new RegExp("("+n+"<[^>]*[\\s][^>]*>)","gim"),function(e){var n="__typograf"+a+"__";return r._hiddenSafeTags[n]=e,a++,n})},_showSafeTags:function(e){return Object.keys(this._hiddenSafeTags).forEach(function(r){e=e.replace(new RegExp(r,"gim"),this._hiddenSafeTags[r])},this),delete this._hiddenSafeTags,e},_utfication:function(e){return-1===e.search("&")?e:(this.entities.forEach(function(r){e=e.replace(r[3],r[2])},this),e)},_modification:function(e){var r,n=this._prefs.mode;return("name"===n||"digit"===n)&&(r="name"===n?0:1,this.entities.forEach(function(n){e=e.replace(new RegExp(n[2],"g"),n[r])},this)),e}},"object"==typeof exports&&(module.exports=Typograf),Typograf.prototype.entities=[],[["nbsp",160],["iexcl",161],["cent",162],["pound",163],["curren",164],["yen",165],["brvbar",166],["sect",167],["uml",168],["copy",169],["ordf",170],["laquo",171],["not",172],["shy",173],["reg",174],["macr",175],["deg",176],["plusmn",177],["sup2",178],["sup3",179],["acute",180],["micro",181],["para",182],["middot",183],["cedil",184],["sup1",185],["ordm",186],["raquo",187],["frac14",188],["frac12",189],["frac34",190],["iquest",191],["Agrave",192],["Aacute",193],["Acirc",194],["Atilde",195],["Auml",196],["Aring",197],["AElig",198],["Ccedil",199],["Egrave",200],["Eacute",201],["Ecirc",202],["Euml",203],["Igrave",204],["Iacute",205],["Icirc",206],["Iuml",207],["ETH",208],["Ntilde",209],["Ograve",210],["Oacute",211],["Ocirc",212],["Otilde",213],["Ouml",214],["times",215],["Oslash",216],["Ugrave",217],["Uacute",218],["Ucirc",219],["Uuml",220],["Yacute",221],["THORN",222],["szlig",223],["agrave",224],["aacute",225],["acirc",226],["atilde",227],["auml",228],["aring",229],["aelig",230],["ccedil",231],["egrave",232],["eacute",233],["ecirc",234],["euml",235],["igrave",236],["iacute",237],["icirc",238],["iuml",239],["eth",240],["ntilde",241],["ograve",242],["oacute",243],["ocirc",244],["otilde",245],["ouml",246],["divide",247],["oslash",248],["ugrave",249],["uacute",250],["ucirc",251],["uuml",252],["yacute",253],["thorn",254],["yuml",255],["fnof",402],["Alpha",913],["Beta",914],["Gamma",915],["Delta",916],["Epsilon",917],["Zeta",918],["Eta",919],["Theta",920],["Iota",921],["Kappa",922],["Lambda",923],["Mu",924],["Nu",925],["Xi",926],["Omicron",927],["Pi",928],["Rho",929],["Sigma",931],["Tau",932],["Upsilon",933],["Phi",934],["Chi",935],["Psi",936],["Omega",937],["alpha",945],["beta",946],["gamma",947],["delta",948],["epsilon",949],["zeta",950],["eta",951],["theta",952],["iota",953],["kappa",954],["lambda",955],["mu",956],["nu",957],["xi",958],["omicron",959],["pi",960],["rho",961],["sigmaf",962],["sigma",963],["tau",964],["upsilon",965],["phi",966],["chi",967],["psi",968],["omega",969],["thetasym",977],["upsih",978],["piv",982],["bull",8226],["hellip",8230],["prime",8242],["Prime",8243],["oline",8254],["frasl",8260],["weierp",8472],["image",8465],["real",8476],["trade",8482],["alefsym",8501],["larr",8592],["uarr",8593],["rarr",8594],["darr",8595],["harr",8596],["crarr",8629],["lArr",8656],["uArr",8657],["rArr",8658],["dArr",8659],["hArr",8660],["forall",8704],["part",8706],["exist",8707],["empty",8709],["nabla",8711],["isin",8712],["notin",8713],["ni",8715],["prod",8719],["sum",8721],["minus",8722],["lowast",8727],["radic",8730],["prop",8733],["infin",8734],["ang",8736],["and",8743],["or",8744],["cap",8745],["cup",8746],["int",8747],["there4",8756],["sim",8764],["cong",8773],["asymp",8776],["ne",8800],["equiv",8801],["le",8804],["ge",8805],["sub",8834],["sup",8835],["nsub",8836],["sube",8838],["supe",8839],["oplus",8853],["otimes",8855],["perp",8869],["sdot",8901],["lceil",8968],["rceil",8969],["lfloor",8970],["rfloor",8971],["lang",9001],["rang",9002],["spades",9824],["clubs",9827],["hearts",9829],["diams",9830],["loz",9674],["OElig",338],["oelig",339],["Scaron",352],["scaron",353],["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],["rsquo",8217],["sbquo",8218],["ldquo",8220],["rdquo",8221],["bdquo",8222],["dagger",8224],["Dagger",8225],["permil",8240],["lsaquo",8249],["rsaquo",8250],["euro",8364]].forEach(function(e){var r=e[0]+";",n=e[1]+";",t=["&"+r,"&#"+n,String.fromCharCode(e[1])];t.push(new RegExp("(\\&\\#"+n+(r?"|\\&"+r:"")+")","g")),Typograf.prototype.entities.push(t)},this),Typograf.data("month",["январь","февраль","март","апрель","май","июнь","июль","август","сентябрь","октябрь","ноябрь","декабрь"]),Typograf.data("weekday",["понедельник","вторник","среда","четверг","пятница","суббота","воскресенье"]),Typograf.rule({title:"Удаление двойной пунктуации",name:"delDoublePunctiation",sortIndex:580,func:function(e){return e.replace(/(,|:|;|\?){2,}/g,"$1")}}),Typograf.rule({title:"!! → !",name:"exclamation",sortIndex:1150,func:function(e){return e.replace(/(^|[^!])\!{2}($|[^!])/,"$1!$2").replace(/(^|[^!])\!{4}?($|[^!])/,"$1!!!$2")}}),Typograf.rule({title:"!? → ?!",name:"exclamationQuestion",sortIndex:1140,func:function(e){var r=new RegExp("(^|[^!])!\\?([^?]|$)","g");return e.replace(r,"$1?!$2")}}),Typograf.rule({title:"Расстановка кавычек",name:"quot",sortIndex:700,func:function(e,r){var n="[\\w\\dа-яёА-ЯЁ]",t=r.lquot,a=r.rquot,u=r.lquot2,o=r.rquot2,i="(?:^|<\\w.*?>)*",l="(?:…|"+n+"|\\n)",c="(?:"+[n,"[)!?.:;#*]"].join("|")+")*",s='(«|»|„|“|”|‘|’|&quot;|")',p='(»|“|&quot;|")',g=new RegExp("("+i+")?"+s+"("+i+l+i+")","g"),f=new RegExp("("+i+c+i+")"+p+"("+c+")","g"),d=new RegExp("("+t+")(.*?)"+t+"(.*?)("+a+")","g"),$=new RegExp("("+t+")(.*?)"+a+"(.*?)("+a+")","g"),m=new RegExp(t+t,"g"),h=new RegExp(a+a,"g");return e=e.replace(g,"$1"+t+"$3").replace(f,"$1"+a+"$3"),e=t===u&&a===o?e.replace(m,"$1$2"+t+"$3$4").replace(h,"$1$2"+a+"$3$4"):e.replace(d,"$1$2"+u+"$3$4").replace($,"$1$2"+o+"$3$4")},settings:{lquot:"«",rquot:"»",lquot2:"„",rquot2:"“"}}),function(){var e="(^| |\\n)",r="( |,|\\.|\\?|\\:|\\!|$)";Typograf.rule({title:"Дефис перед то, либо, нибудь, ка, де, кась",name:"dash/to",sortIndex:30,func:function(e){var n=new RegExp("( | ?- ?)(то|либо|нибудь|ка|де|кась)"+r,"g");return e.replace(n,"-$2$3")}}),Typograf.rule({title:"Дефис между из-за",name:"dash/izza",sortIndex:33,func:function(n){var t=new RegExp(e+"(И|и)з за"+r,"g");return n.replace(t,"$1$2з-за$3")}}),Typograf.rule({title:"Дефис между из-под",name:"dash/izpod",sortIndex:35,func:function(n){var t=new RegExp(e+"(И|и)з под"+r,"g");return n.replace(t,"$1$2з-под$3")}}),Typograf.rule({title:"Дефис после кое и кой",name:"dash/koe",sortIndex:38,func:function(n){var t=new RegExp(e+"(К|к)ое\\s([а-яё]{3,})"+r,"g");n=n.replace(t,"$1$2ое-$3$4");var a=new RegExp(e+"(К|к)ой\\s([а-я]{3,})"+r,"g");return n.replace(a,"$1$2ой-$3$4")}}),Typograf.rule({title:"Дефис между верно-таки и т.д.",name:"dash/taki",sortIndex:39,func:function(e){var n=new RegExp("(верно|довольно|опять|прямо|так|всё|действительно|неужели)\\s(таки)"+r,"g");return e.replace(n,"$1-$2$3")}})}(),Typograf.rule({title:"Дефис на тире",name:"dash/main",sortIndex:620,func:function(e){var r=new RegExp("(\\s| )(-|—)(\\s|\\n)","g");return e.replace(r," —$3").replace(/(X|I|V)(?: |\u00A0)?(-|—)(?: |\u00A0)?(X|I|V)/g,"$1—$3")},settings:{dash:"—",dashInterval:"—"}}),Typograf.rule({title:"Дефис между месяцами",name:"dash/month",sortIndex:610,func:function(e){var r="("+this.data.month.join("|")+")",n=new RegExp(r+" ?(-|—) ?"+r,"gi");return e.replace(n,"$1"+this.setting("dash/main","dashInterval")+"$3")}}),Typograf.rule({title:"Дефис между днями недели",name:"dash/weekday",sortIndex:600,func:function(e){var r="("+this.data.weekday.join("|")+")",n=new RegExp(r+" ?(-|—) ?"+r,"gi");return e.replace(n,"$1"+this.setting("dash/main","dashInterval")+"$3")}}),Typograf.rule({title:"Преобразование дат к виду DD.MM.YYYY",name:"date/main",sortIndex:1300,func:function(e){var r="(-|\\.|\\/)",n="(-|\\/)",t=new RegExp("(^|\\D)(\\d{4})"+r+"(\\d{2})"+r+"(\\d{2})(\\D|$)","gi"),a=new RegExp("(^|\\D)(\\d{2})"+n+"(\\d{2})"+n+"(\\d{4})(\\D|$)","gi");return e.replace(t,"$1$6.$4.$2$7").replace(a,"$1$4.$2.$6$7")}}),Typograf.rule({title:"Замена перевода строки на <br/>",name:"html/nbr",sortIndex:710,func:function(e){return e.replace(/\n/g,"<br/>")},enabled:!1}),Typograf.rule({title:"Расстановка <p> и <br/>",name:"html/pbr",sortIndex:700,func:function(e){return-1===e.search(/\n/)?e="<p>"+e+"</p>":(e="<p>"+e.replace(/\n\n/g,"</p>\n<p>")+"</p>",e=e.replace(/([^>])\n/g,"$1<br/>\n")),e},enabled:!1}),Typograf.rule({title:"Удаление HTML-тегов",name:"html/stripTags",sortIndex:5,func:function(e){return e.replace(/<\/?[^>]+>/g,"")},enabled:!1}),Typograf.rule({title:"Расстановка ссылок",name:"html/url",sortIndex:200,func:function(e){var r="(http|https|ftp|telnet|news|gopher|file|wais)://",n="([a-zA-Z0-9/\\n+-=%&:_.~?]+[a-zA-Z0-9#+]*)",t=new RegExp(r+n,"g");return e.replace(t,function(e,r,n){var t=n,a=r+"://"+n,u='<a href="'+a+'">';return"http"===r?(t=t.replace(/^www\./,"").replace(/^([^\/]+)\/$/,"$1"),u+t+"</a>"):u+a+"</a>"})}}),Typograf.rule({title:"$100 → 100 $",name:"money/dollar",sortIndex:1140,func:function(e){var r=new RegExp("(^|[\\D]{2,})\\$ ?([\\d.,]+)","g"),n=new RegExp("(^|[\\D])([\\d.,]+) ?\\$"),t="$1$2 $";return e.replace(r,t).replace(n,t)}}),Typograf.rule({title:"€100 → 100 €",name:"money/euro",sortIndex:1140,func:function(e){var r=new RegExp("(^|[\\D]{2,})€ ?([\\d.]+)","g"),n=new RegExp("(^|[\\D])([\\d.,]+) ?€"),t="$1$2 €";return e.replace(r,t).replace(n,t)}}),Typograf.rule({title:"Неразрывный пробел после № и §",name:"nbsp/afterNum",sortIndex:610,func:function(e){return e.replace(/№ ?(\d)/g,"№ $1").replace(/§ ?(\d|I|V|X)/g,"§ $1")}}),Typograf.rule({title:"Неразрывный пробел после короткого слова",name:"nbsp/afterShortWord",sortIndex:590,func:function(e,r){var n=r.lengthShortWord,t=new RegExp("( [а-яёА-ЯЁ\\w]{1,"+n+"}) ","g");return e.replace(t,"$1 ")},settings:{lengthShortWord:2}}),Typograf.rule({title:"Неразрывный пробел перед ли, ль, же, бы, б",name:"nbsp/beforeParticle",sortIndex:570,func:function(e){return e.replace(/ (ли|ль|же|ж|бы|б)([^а-яёА-ЯЁ])/g," $1$2")}}),Typograf.rule({title:"Неразрывный пробел перед последним коротким словом в предложении",name:"nbsp/beforeShortLastWord",sortIndex:620,func:function(e,r){var n=r.lengthLastWord,t=new RegExp(" ([а-яёА-ЯЁ\\w]{1,"+n+"})(\\.|\\?|:|!|,)","g");return e.replace(t," $1$2")},settings:{lengthLastWord:3}}),Typograf.rule({title:"Расстановка запятых и неразрывного пробела перед а и но",name:"nbsp/but",sortIndex:1110,func:function(e){var r=new RegExp("([,])?( | |\n)(а|но)( | |\n)","g");return e.replace(r,",$2$3$4")}}),Typograf.rule({title:"m2 → м², m3 → м³ и неразрывный пробел",name:"nbsp/m",sortIndex:1030,func:function(e){var r="(км|м|дм|см|мм)",n=new RegExp("(^|\\D)(\\d+) ?"+r+"2(\\D|$)","g"),t=new RegExp("(^|\\D)(\\d+) ?"+r+"3(\\D|$)","g");return e=e.replace(n,"$1$2 $3²$4"),e.replace(t,"$1$2 $3³$4")}}),Typograf.rule({title:"Неразрывный пробел после OOO или ОАО",name:"nbsp/ooo",sortIndex:1100,func:function(e){return e.replace(/(ООО|ОАО) /g,"$1 ")}}),Typograf.rule({title:"Неразрывный пробел после XXXX",name:"nbsp/xxxx",sortIndex:1060,func:function(e){return e.replace(/(^|\D)(\d{4}) ?г( |,|;|\.|\n|$)/g,"$1$2 г$3")}}),Typograf.rule({title:"г.г. → гг. и неразрывный пробел",name:"nbsp/yy",sortIndex:1080,func:function(e){return e.replace(/(^|\d) ?г\. ?г\./g,"$1 гг.")}}),Typograf.rule({title:"Пробел после знаков пунктуации",name:"space/afterPunctuation",sortIndex:560,func:function(e){return e.replace(/(\!|;|\?)([^ \n\t\!;\?])/g,"$1 $2").replace(/(\D)(,|\:)([^ \/\d\n\t\!;,\?\.\:])/g,"$1$2 $3")}}),Typograf.rule({title:"Удаление пробела перед %",name:"space/delBeforePercent",sortIndex:600,func:function(e){return e.replace(/(\d)( |\u00A0)%/g,"$1%")}}),Typograf.rule({title:"Удаление пробелов перед знаками пунктуации",name:"space/delBeforePunctuation",sortIndex:550,func:function(e){return e.replace(/ (\!|;|,|\?|\.|\:)/g,"$1").replace(/\( /g,"(").replace(/([^ ])\(/g,"$1 (").replace(/ \)/g,")").replace(/\)([^\!;,\?\.\:])/g,") $1")}}),Typograf.rule({title:"Удаление повторяющихся переносов строки (не более двух)",name:"space/delRepeatN",sortIndex:545,func:function(e){return e.replace(/\n{3,}/g,"\n\n")}}),Typograf.rule({title:"Удаление повторяющихся пробелов",name:"space/delRepeatSpace",sortIndex:540,func:function(e){return e.replace(/( |\t){2,}/g,"$1")}}),Typograf.rule({title:"Удаление пробелов в конце строк",name:"space/delTrailingBlanks",sortIndex:505,func:function(e){return e.replace(/( |\t)+\n/g,"\n")}}),Typograf.rule({title:"Замена табов на пробелы",name:"space/replaceTab",sortIndex:510,func:function(e){return e.replace(/\t/g," ")}}),Typograf.rule({title:"Удаление пробелов в начале и в конце текста",name:"space/trim",sortIndex:530,func:function(e){return e.trim()}}),Typograf.rule({title:"-> → →, <- → ←",name:"sym/arrow",sortIndex:1130,func:function(e){return e.replace(/(^|[^-])->(?!>)/g,"$1→").replace(/(^|[^<])<-(?!-)/g,"$1←")}}),Typograf.rule({title:"Удаление лишних точек и пробелов в вв.",name:"sym/cc",sortIndex:1090,func:function(e){return e=e.replace(/(^|\d|V|I|X) ?в(в)?( |,|;|\n|$)/g,"$1 в$2.$3"),e.replace(/(^|\d|[IVX]) ?в\.? ?в\./g,"$1 вв.")}}),Typograf.rule({title:"Добавление ° к C и F",name:"sym/cf",sortIndex:1020,func:function(e){var r=new RegExp('(\\d+)( | )?(C|F)([\\W \\.,:\\!\\?"\\]\\)]|$)',"g");return e.replace(r,"$1 °$3$4")}}),Typograf.rule({title:"(c) → ©, (tm) → ©, (r) → ™",name:"sym/copy",sortIndex:10,func:function(e){return e.replace(/\(r\)/gi,"®").replace(/\((c|с)\)/gi,"©").replace(/\(tm\)/gi,"™")}}),Typograf.rule({title:"1/2 → ½, 1/4 → ¼, 3/3 → ¾",name:"sym/fraction",sortIndex:1120,func:function(e){return e.replace(/(^|\D)1\/2(\D|$)/g,"$1½$2").replace(/(^|\D)1\/4(\D|$)/g,"$1¼$2").replace(/(^|\D)3\/4(\D|$)/g,"$1¾$2")}}),Typograf.rule({title:"... → …",name:"sym/hellip",sortIndex:20,func:function(e){return e.replace(/(^|[^.])\.{3,4}([^.]|$)/g,"$1…$2")}}),Typograf.rule({title:"+- → ±",name:"sym/plusMinus",sortIndex:1010,func:function(e){var r=new RegExp("(^| |\\>| )\\+-(\\d)","g");return e.replace(r,"$1±$2").replace(/(^\s*)\+-(\s*$)/g,"$1±$2")}}),Typograf.rule({title:"x → ×",name:"sym/times",sortIndex:1050,func:function(e){return e.replace(/(\d) ?(x|х) ?(\d)/g,"$1×$3")}}),Typograf._sortRules(),Typograf._needSortRules=!0;
function Typograf(e){this._prefs="object"==typeof e?e:{},this._settings={},this._enabledRules={},this._rules.forEach(function(e){var r=e.name;e._lang=r.split("/")[0],this._settings[r]=e.settings||{},this._enabledRules[r]=e.enabled},this)}Typograf.rule=function(e){return e.enabled=e.enabled===!1?!1:!0,Typograf.prototype._rules.push(e),Typograf._needSortRules&&this._sortRules(),this},Typograf.data=function(e,r){Typograf.prototype.data[e]=r},Typograf._sortRules=function(){Typograf.prototype._rules.sort(function(e,r){return e.sortIndex>r.sortIndex?1:-1})},Typograf.prototype={constructor:Typograf,execute:function(e,r){var n=r&&r.lang;if(n||(n=this._prefs.lang),e=""+e,!e)return"";e=e.replace(/\r\n/g,"\n").replace(/\r/g,"\n");var t=-1!==e.search(/<|>/);return t&&(e=this._hideSafeTags(e)),e=this._utfication(e),this._rules.forEach(function(r){!this.enabled(r.name)||"common"!==r._lang&&r._lang!==n||(e=r.func.call(this,e,this._settings[r.name]))},this),e=this._modification(e),t&&(e=this._showSafeTags(e)),e},setting:function(e,r,n){return arguments.length<=2?this._settings[e]&&this._settings[e][r]:(this._settings[e]=this._settings[e]||{},this._settings[e][r]=n,this)},enabled:function(e){return this._enabledRules[e]},disabled:function(e){return!this._enabledRules[e]},enable:function(e){return this._enable(e,!0)},disable:function(e){return this._enable(e,!1)},data:{},_enable:function(e,r){return Array.isArray(e)?e.forEach(function(e){this._enabledRules[e]=r},this):this._enabledRules[e]=r,this},_rules:[],_hideSafeTags:function(e){this._hiddenSafeTags={};var r=this,n="",t=[["<!--","-->"],["<pre[^>]*>","<\\/pre>"],["<code[^>]*>","<\\/code>"],["<style[^>]*>","<\\/style>"],["<script[^>]*>","<\\/script>"],["<object>","<\\/object>"]];t.forEach(function(e){n+="("+e[0]+"(.|\\n)*?"+e[1]+")|"},this);var a=0;return e=e.replace(new RegExp("("+n+"<[^>]*[\\s][^>]*>)","gim"),function(e){var n="__typograf"+a+"__";return r._hiddenSafeTags[n]=e,a++,n})},_showSafeTags:function(e){return Object.keys(this._hiddenSafeTags).forEach(function(r){e=e.replace(new RegExp(r,"gim"),this._hiddenSafeTags[r])},this),delete this._hiddenSafeTags,e},_utfication:function(e){return-1===e.search("&")?e:(this.entities.forEach(function(r){e=e.replace(r[3],r[2])},this),e)},_modification:function(e){var r,n=this._prefs.mode;return("name"===n||"digit"===n)&&(r="name"===n?0:1,this.entities.forEach(function(n){e=e.replace(new RegExp(n[2],"g"),n[r])},this)),e}},"object"==typeof exports&&(module.exports=Typograf),Typograf.prototype.entities=[],[["nbsp",160],["iexcl",161],["cent",162],["pound",163],["curren",164],["yen",165],["brvbar",166],["sect",167],["uml",168],["copy",169],["ordf",170],["laquo",171],["not",172],["shy",173],["reg",174],["macr",175],["deg",176],["plusmn",177],["sup2",178],["sup3",179],["acute",180],["micro",181],["para",182],["middot",183],["cedil",184],["sup1",185],["ordm",186],["raquo",187],["frac14",188],["frac12",189],["frac34",190],["iquest",191],["Agrave",192],["Aacute",193],["Acirc",194],["Atilde",195],["Auml",196],["Aring",197],["AElig",198],["Ccedil",199],["Egrave",200],["Eacute",201],["Ecirc",202],["Euml",203],["Igrave",204],["Iacute",205],["Icirc",206],["Iuml",207],["ETH",208],["Ntilde",209],["Ograve",210],["Oacute",211],["Ocirc",212],["Otilde",213],["Ouml",214],["times",215],["Oslash",216],["Ugrave",217],["Uacute",218],["Ucirc",219],["Uuml",220],["Yacute",221],["THORN",222],["szlig",223],["agrave",224],["aacute",225],["acirc",226],["atilde",227],["auml",228],["aring",229],["aelig",230],["ccedil",231],["egrave",232],["eacute",233],["ecirc",234],["euml",235],["igrave",236],["iacute",237],["icirc",238],["iuml",239],["eth",240],["ntilde",241],["ograve",242],["oacute",243],["ocirc",244],["otilde",245],["ouml",246],["divide",247],["oslash",248],["ugrave",249],["uacute",250],["ucirc",251],["uuml",252],["yacute",253],["thorn",254],["yuml",255],["fnof",402],["Alpha",913],["Beta",914],["Gamma",915],["Delta",916],["Epsilon",917],["Zeta",918],["Eta",919],["Theta",920],["Iota",921],["Kappa",922],["Lambda",923],["Mu",924],["Nu",925],["Xi",926],["Omicron",927],["Pi",928],["Rho",929],["Sigma",931],["Tau",932],["Upsilon",933],["Phi",934],["Chi",935],["Psi",936],["Omega",937],["alpha",945],["beta",946],["gamma",947],["delta",948],["epsilon",949],["zeta",950],["eta",951],["theta",952],["iota",953],["kappa",954],["lambda",955],["mu",956],["nu",957],["xi",958],["omicron",959],["pi",960],["rho",961],["sigmaf",962],["sigma",963],["tau",964],["upsilon",965],["phi",966],["chi",967],["psi",968],["omega",969],["thetasym",977],["upsih",978],["piv",982],["bull",8226],["hellip",8230],["prime",8242],["Prime",8243],["oline",8254],["frasl",8260],["weierp",8472],["image",8465],["real",8476],["trade",8482],["alefsym",8501],["larr",8592],["uarr",8593],["rarr",8594],["darr",8595],["harr",8596],["crarr",8629],["lArr",8656],["uArr",8657],["rArr",8658],["dArr",8659],["hArr",8660],["forall",8704],["part",8706],["exist",8707],["empty",8709],["nabla",8711],["isin",8712],["notin",8713],["ni",8715],["prod",8719],["sum",8721],["minus",8722],["lowast",8727],["radic",8730],["prop",8733],["infin",8734],["ang",8736],["and",8743],["or",8744],["cap",8745],["cup",8746],["int",8747],["there4",8756],["sim",8764],["cong",8773],["asymp",8776],["ne",8800],["equiv",8801],["le",8804],["ge",8805],["sub",8834],["sup",8835],["nsub",8836],["sube",8838],["supe",8839],["oplus",8853],["otimes",8855],["perp",8869],["sdot",8901],["lceil",8968],["rceil",8969],["lfloor",8970],["rfloor",8971],["lang",9001],["rang",9002],["spades",9824],["clubs",9827],["hearts",9829],["diams",9830],["loz",9674],["OElig",338],["oelig",339],["Scaron",352],["scaron",353],["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],["rsquo",8217],["sbquo",8218],["ldquo",8220],["rdquo",8221],["bdquo",8222],["dagger",8224],["Dagger",8225],["permil",8240],["lsaquo",8249],["rsaquo",8250],["euro",8364],[null,8381]].forEach(function(e){var r=e[0],n=e[1],t=["&"+r+";","&#"+n+";",String.fromCharCode(e[1])];t.push(new RegExp("(\\&\\#"+n+";"+(r?"|\\&"+r+";":"")+")","g")),Typograf.prototype.entities.push(t)},this),Typograf.data("ru/month",["январь","февраль","март","апрель","май","июнь","июль","август","сентябрь","октябрь","ноябрь","декабрь"]),Typograf.data("ru/monthCase",["января","февраля","марта","апреля","мая","июня","июля","августа","сентября","октября","ноября","декабря"]),Typograf.data("ru/weekday",["понедельник","вторник","среда","четверг","пятница","суббота","воскресенье"]),Typograf.rule({title:"Удаление двойной пунктуации",name:"common/delDoublePunctiation",sortIndex:580,func:function(e){return e.replace(/(,|:|;|\?){2,}/g,"$1")}}),Typograf.rule({title:"!! → !",name:"common/exclamation",sortIndex:1150,func:function(e){return e.replace(/(^|[^!])\!{2}($|[^!])/,"$1!$2").replace(/(^|[^!])\!{4}?($|[^!])/,"$1!!!$2")}}),Typograf.rule({title:"!? → ?!",name:"common/exclamationQuestion",sortIndex:1140,func:function(e){var r=new RegExp("(^|[^!])!\\?([^?]|$)","g");return e.replace(r,"$1?!$2")}}),Typograf.rule({title:"Расстановка кавычек",name:"ru/quot",sortIndex:700,func:function(e,r){var n="[\\w\\dа-яёА-ЯЁ]",t=r.lquot,a=r.rquot,o=r.lquot2,u=r.rquot2,i="(?:^|<\\w.*?>)*",c="(?:…|"+n+"|\\n)",l="(?:"+[n,"[)!?.:;#*]"].join("|")+")*",s='(«|»|„|“|”|‘|’|&quot;|")',p='(»|“|&quot;|")',g=new RegExp("("+i+")?"+s+"("+i+c+i+")","g"),f=new RegExp("("+i+l+i+")"+p+"("+l+")","g"),d=new RegExp("("+t+")(.*?)"+t+"(.*?)("+a+")","g"),m=new RegExp("("+t+")(.*?)"+a+"(.*?)("+a+")","g"),$=new RegExp(t+t,"g"),h=new RegExp(a+a,"g");return e=e.replace(g,"$1"+t+"$3").replace(f,"$1"+a+"$3"),e=t===o&&a===u?e.replace($,"$1$2"+t+"$3$4").replace(h,"$1$2"+a+"$3$4"):e.replace(d,"$1$2"+o+"$3$4").replace(m,"$1$2"+u+"$3$4")},settings:{lquot:"«",rquot:"»",lquot2:"„",rquot2:"“"}}),Typograf.rule({title:"Замена перевода строки на <br/>",name:"common/html/nbr",sortIndex:710,func:function(e){return e.replace(/\n/g,"<br/>")},enabled:!1}),Typograf.rule({title:"Расстановка <p> и <br/>",name:"common/html/pbr",sortIndex:700,func:function(e){return-1===e.search(/\n/)?e="<p>"+e+"</p>":(e="<p>"+e.replace(/\n\n/g,"</p>\n<p>")+"</p>",e=e.replace(/([^>])\n/g,"$1<br/>\n")),e},enabled:!1}),Typograf.rule({title:"Удаление HTML-тегов",name:"common/html/stripTags",sortIndex:5,func:function(e){return e.replace(/<\/?[^>]+>/g,"")},enabled:!1}),Typograf.rule({title:"Расстановка ссылок",name:"common/html/url",sortIndex:200,func:function(e){var r="(http|https|ftp|telnet|news|gopher|file|wais)://",n="([a-zA-Z0-9/\\n+-=%&:_.~?]+[a-zA-Z0-9#+]*)",t=new RegExp(r+n,"g");return e.replace(t,function(e,r,n){var t=n,a=r+"://"+n,o='<a href="'+a+'">';return"http"===r?(t=t.replace(/^www\./,"").replace(/^([^\/]+)\/$/,"$1"),o+t+"</a>"):o+a+"</a>"})}}),Typograf.rule({title:"Неразрывный пробел после §",name:"common/nbsp/afterPara",sortIndex:610,func:function(e){return e.replace(/§ ?(\d|I|V|X)/g,"§ $1")}}),Typograf.rule({title:"Неразрывный пробел после короткого слова",name:"common/nbsp/afterShortWord",sortIndex:590,func:function(e,r){var n=r.lengthShortWord,t=new RegExp("( [\\w]{1,"+n+"}) ","g");return e.replace(t,"$1 ")},settings:{lengthShortWord:2}}),Typograf.rule({title:"Неразрывный пробел перед последним коротким словом в предложении",name:"common/nbsp/beforeShortLastWord",sortIndex:620,func:function(e,r){var n=r.lengthLastWord,t=new RegExp(" ([\\w]{1,"+n+"})(\\.|\\?|:|!|,)","g");return e.replace(t," $1$2")},settings:{lengthLastWord:3}}),Typograf.rule({title:"Пробел после знаков пунктуации",name:"common/space/afterPunctuation",sortIndex:560,func:function(e){return e.replace(/(\!|;|\?)([^ \n\t\!;\?])/g,"$1 $2").replace(/(\D)(,|\:)([^ \/\d\n\t\!;,\?\.\:])/g,"$1$2 $3")}}),Typograf.rule({title:"Удаление пробела перед %",name:"common/space/delBeforePercent",sortIndex:600,func:function(e){return e.replace(/(\d)( |\u00A0)%/g,"$1%")}}),Typograf.rule({title:"Удаление пробелов перед знаками пунктуации",name:"common/space/delBeforePunctuation",sortIndex:550,func:function(e){return e.replace(/ (\!|;|,|\?|\.|\:)/g,"$1").replace(/\( /g,"(").replace(/([^ ])\(/g,"$1 (").replace(/ \)/g,")").replace(/\)([^\!;,\?\.\:])/g,") $1")}}),Typograf.rule({title:"Удаление повторяющихся переносов строки (не более двух)",name:"common/space/delRepeatN",sortIndex:545,func:function(e){return e.replace(/\n{3,}/g,"\n\n")}}),Typograf.rule({title:"Удаление повторяющихся пробелов",name:"common/space/delRepeatSpace",sortIndex:540,func:function(e){return e.replace(/( |\t){2,}/g,"$1")}}),Typograf.rule({title:"Удаление пробелов в конце строк",name:"common/space/delTrailingBlanks",sortIndex:505,func:function(e){return e.replace(/( |\t)+\n/g,"\n")}}),Typograf.rule({title:"Замена табов на пробелы",name:"common/space/replaceTab",sortIndex:510,func:function(e){return e.replace(/\t/g," ")}}),Typograf.rule({title:"Удаление пробелов в начале и в конце текста",name:"common/space/trim",sortIndex:530,func:function(e){return e.trim()}}),Typograf.rule({title:"-> → →, <- → ←",name:"common/sym/arrow",sortIndex:1130,func:function(e){return e.replace(/(^|[^-])->(?!>)/g,"$1→").replace(/(^|[^<])<-(?!-)/g,"$1←")}}),Typograf.rule({title:"Удаление лишних точек и пробелов в вв.",name:"common/sym/cc",sortIndex:1090,func:function(e){return e=e.replace(/(^|\d|V|I|X) ?в(в)?( |,|;|\n|$)/g,"$1 в$2.$3"),e.replace(/(^|\d|[IVX]) ?в\.? ?в\./g,"$1 вв.")}}),Typograf.rule({title:"Добавление ° к C и F",name:"common/sym/cf",sortIndex:1020,func:function(e){var r=new RegExp('(\\d+)( | )?(C|F)([\\W \\.,:\\!\\?"\\]\\)]|$)',"g");return e.replace(r,"$1 °$3$4")}}),Typograf.rule({title:"(c) → ©, (tm) → ©, (r) → ™",name:"common/sym/copy",sortIndex:10,func:function(e){return e.replace(/\(r\)/gi,"®").replace(/\((c|с)\)/gi,"©").replace(/\(tm\)/gi,"™")}}),Typograf.rule({title:"1/2 → ½, 1/4 → ¼, 3/3 → ¾",name:"common/sym/fraction",sortIndex:1120,func:function(e){return e.replace(/(^|\D)1\/2(\D|$)/g,"$1½$2").replace(/(^|\D)1\/4(\D|$)/g,"$1¼$2").replace(/(^|\D)3\/4(\D|$)/g,"$1¾$2")}}),Typograf.rule({title:"... → …",name:"common/sym/hellip",sortIndex:20,func:function(e){return e.replace(/(^|[^.])\.{3,4}([^.]|$)/g,"$1…$2")}}),Typograf.rule({title:"+- → ±",name:"common/sym/plusMinus",sortIndex:1010,func:function(e){var r=new RegExp("(^| |\\>| )\\+-(\\d)","g");return e.replace(r,"$1±$2").replace(/(^\s*)\+-(\s*$)/g,"$1±$2")}}),Typograf.rule({title:"x → ×",name:"common/sym/times",sortIndex:1050,func:function(e){return e.replace(/(\d) ?(x|х) ?(\d)/g,"$1×$3")}}),function(){var e="(^| |\\n)",r="( |,|\\.|\\?|\\:|\\!|$)";Typograf.rule({title:"Дефис перед то, либо, нибудь, ка, де, кась",name:"ru/dash/to",sortIndex:30,func:function(e){var n=new RegExp("( | ?- ?)(то|либо|нибудь|ка|де|кась)"+r,"g");return e.replace(n,"-$2$3")}}),Typograf.rule({title:"Дефис между из-за",name:"ru/dash/izza",sortIndex:33,func:function(n){var t=new RegExp(e+"(И|и)з за"+r,"g");return n.replace(t,"$1$2з-за$3")}}),Typograf.rule({title:"Дефис между из-под",name:"ru/dash/izpod",sortIndex:35,func:function(n){var t=new RegExp(e+"(И|и)з под"+r,"g");return n.replace(t,"$1$2з-под$3")}}),Typograf.rule({title:"Дефис после кое и кой",name:"ru/dash/koe",sortIndex:38,func:function(n){var t=new RegExp(e+"(К|к)ое\\s([а-яё]{3,})"+r,"g");n=n.replace(t,"$1$2ое-$3$4");var a=new RegExp(e+"(К|к)ой\\s([а-я]{3,})"+r,"g");return n.replace(a,"$1$2ой-$3$4")}}),Typograf.rule({title:"Дефис между верно-таки и т.д.",name:"ru/dash/taki",sortIndex:39,func:function(e){var n=new RegExp("(верно|довольно|опять|прямо|так|всё|действительно|неужели)\\s(таки)"+r,"g");return e.replace(n,"$1-$2$3")}})}(),Typograf.rule({title:"Дефис на тире",name:"ru/dash/main",sortIndex:620,func:function(e){var r=new RegExp("(\\s| )(-|—)(\\s|\\n)","g");return e.replace(r," —$3").replace(/(X|I|V)(?: |\u00A0)?(-|—)(?: |\u00A0)?(X|I|V)/g,"$1—$3")},settings:{dash:"—",dashInterval:"—"}}),Typograf.rule({title:"Дефис между месяцами",name:"ru/dash/month",sortIndex:610,func:function(e){var r="("+this.data["ru/month"].join("|")+")",n=new RegExp(r+" ?(-|—) ?"+r,"gi");return e.replace(n,"$1"+this.setting("ru/dash/main","dashInterval")+"$3")}}),Typograf.rule({title:"Дефис между днями недели",name:"ru/dash/weekday",sortIndex:600,func:function(e){var r="("+this.data["ru/weekday"].join("|")+")",n=new RegExp(r+" ?(-|—) ?"+r,"gi");return e.replace(n,"$1"+this.setting("ru/dash/main","dashInterval")+"$3")}}),Typograf.rule({title:"Преобразование дат к виду DD.MM.YYYY",name:"ru/date/main",sortIndex:1300,func:function(e){var r="(-|\\.|\\/)",n="(-|\\/)",t=new RegExp("(^|\\D)(\\d{4})"+r+"(\\d{2})"+r+"(\\d{2})(\\D|$)","gi"),a=new RegExp("(^|\\D)(\\d{2})"+n+"(\\d{2})"+n+"(\\d{4})(\\D|$)","gi");return e.replace(t,"$1$6.$4.$2$7").replace(a,"$1$4.$2.$6$7")}}),Typograf.rule({title:"2 Мая, Понедельник → 2 мая, понедельник",name:"ru/date/weekday",sortIndex:1310,func:function(e){var r="( | )",n=this.data["ru/monthCase"].join("|"),t=this.data["ru/weekday"].join("|"),a=new RegExp("(\\d)"+r+"("+n+"),"+r+"("+t+")","gi");return e.replace(a,function(){var e=arguments;return e[1]+e[2]+e[3].toLowerCase()+","+e[4]+e[5].toLowerCase()})}}),Typograf.rule({title:"$100 → 100 $",name:"ru/money/dollar",sortIndex:1140,func:function(e){var r=new RegExp("(^|[\\D]{2,})\\$ ?([\\d.,]+)","g"),n=new RegExp("(^|[\\D])([\\d.,]+) ?\\$"),t="$1$2 $";return e.replace(r,t).replace(n,t)}}),Typograf.rule({title:"€100 → 100 €",name:"ru/money/euro",sortIndex:1140,func:function(e){var r=new RegExp("(^|[\\D]{2,})€ ?([\\d.]+)","g"),n=new RegExp("(^|[\\D])([\\d.,]+) ?€"),t="$1$2 €";return e.replace(r,t).replace(n,t)}}),Typograf.rule({title:"1 руб. → 1 ₽",name:"ru/money/ruble",sortIndex:1145,func:function(e){var r="$1 ₽";return e.replace(/^(\d+)( |\u00A0)?(р|руб)\.$/,r).replace(/(\d+)( |\u00A0)?(р|руб)\.(?=[!?,:;])/g,r).replace(/(\d+)( |\u00A0)?(р|руб)\.(?=\s+[A-ЯЁ])/g,r+".")}}),Typograf.rule({title:"Неразрывный пробел после № и §",name:"ru/nbsp/afterNum",sortIndex:610,func:function(e){return e.replace(/№ ?(\d)/g,"№ $1").replace(/§ ?(\d|I|V|X)/g,"§ $1")}}),Typograf.rule({title:"Неразрывный пробел после короткого слова",name:"ru/nbsp/afterShortWord",sortIndex:590,func:function(e,r){var n=r.lengthShortWord,t=new RegExp("( [а-яёА-ЯЁ]{1,"+n+"}) ","g");return e.replace(t,"$1 ")},settings:{lengthShortWord:2}}),Typograf.rule({title:"Неразрывный пробел перед ли, ль, же, бы, б",name:"ru/nbsp/beforeParticle",sortIndex:570,func:function(e){return e.replace(/ (ли|ль|же|ж|бы|б)([^а-яёА-ЯЁ])/g," $1$2")}}),Typograf.rule({title:"Неразрывный пробел перед последним коротким словом в предложении",name:"ru/nbsp/beforeShortLastWord",sortIndex:620,func:function(e,r){var n=r.lengthLastWord,t=new RegExp(" ([а-яёА-ЯЁ]{1,"+n+"})(\\.|\\?|:|!|,)","g");return e.replace(t," $1$2")},settings:{lengthLastWord:3}}),Typograf.rule({title:"Расстановка запятых и неразрывного пробела перед а и но",name:"ru/nbsp/but",sortIndex:1110,func:function(e){var r=new RegExp("([,])?( | |\n)(а|но)( | |\n)","g");return e.replace(r,",$2$3$4")}}),Typograf.rule({title:"m2 → м², m3 → м³ и неразрывный пробел",name:"ru/nbsp/m",sortIndex:1030,func:function(e){var r="(км|м|дм|см|мм)",n=new RegExp("(^|\\D)(\\d+) ?"+r+"2(\\D|$)","g"),t=new RegExp("(^|\\D)(\\d+) ?"+r+"3(\\D|$)","g");return e=e.replace(n,"$1$2 $3²$4"),e.replace(t,"$1$2 $3³$4")}}),Typograf.rule({title:"Неразрывный пробел после OOO или ОАО",name:"ru/nbsp/ooo",sortIndex:1100,func:function(e){return e.replace(/(ООО|ОАО) /g,"$1 ")}}),Typograf.rule({title:"Неразрывный пробел после XXXX",name:"ru/nbsp/xxxx",sortIndex:1060,func:function(e){return e.replace(/(^|\D)(\d{4}) ?г( |,|;|\.|\n|$)/g,"$1$2 г$3")}}),Typograf.rule({title:"г.г. → гг. и неразрывный пробел",name:"ru/nbsp/yy",sortIndex:1080,func:function(e){return e.replace(/(^|\d) ?г\. ?г\./g,"$1 гг.")}}),Typograf._sortRules(),Typograf._needSortRules=!0;
var Typograf = require('typograf');
var tp = new Typograf();
var tp = new Typograf({lang: 'ru'});
console.log(tp.execute(' Мир - мой мир!! '));
{
"name": "typograf",
"description": "The client and server typographer",
"version": "1.2.5",
"version": "2.0.0",
"author": {

@@ -6,0 +6,0 @@ "name": "Denis Seleznev",

@@ -33,3 +33,3 @@ [![Build Status](https://travis-ci.org/hcodes/typograf.png?branch=master)](https://travis-ci.org/hcodes/typograf)

+ кроссбраузерность;
+ мультиязычность (TODO);
+ мультиязычность;
+ utf-8;

@@ -49,3 +49,3 @@ + поддержка Node.js.

<script>
var tp = new Typograf();
var tp = new Typograf({lang: 'ru'});
alert(tp.execute(' Мир - мой мир! '));

@@ -61,3 +61,3 @@ </script>

var Typograf = require('typograf'),
tp = new Typograf();
tp = new Typograf({lang: 'ru'});

@@ -69,6 +69,6 @@ console.log(tp.execute(' Мир - мой мир!! '));

```JavaScript
var tp = new Typograf();
tp.disable('space/afterNum'); // Отключить в группе "space" правило "afterNum"
var tp = new Typograf({lang: 'ru'});
tp.disable('ru/space/afterNum'); // Отключить правило
//...
tp.enable('space/afterNum'); // Включить в группе "space" правило "afterNum"
tp.enable('ru/space/afterNum'); // Включить правило
```

@@ -80,3 +80,3 @@

title: 'Пример правила',
name: 'other/parampampam', // Группа "other", правило "parampampam"
name: 'common/other/parampampam', // common - для любого языка, группа "other", правило "parampampam"
sortIndex: 2000, // меньше - раньше, больше - позже выполняется

@@ -92,9 +92,9 @@ func: function(text) {

```JavaScript
var tp = new Typograf(); // Режим по умолчанию, HTML-сущности в utf-8
var tp = new Typograf({lang: 'ru'}); // Режим по умолчанию, HTML-сущности, как utf-8 символы
tp.execute('...'); // …
var tpName = new Typograf({mode: 'name'}); // HTML-сущности как имена
var tpName = new Typograf({lang: 'ru', mode: 'name'}); // HTML-сущности, как имена
tpName.execute('...'); // &hellip;
var tpDigit = new Typograf({mode: 'digit'}); // HTML-сущности как цифры
var tpDigit = new Typograf({lang: 'ru', mode: 'digit'}); // HTML-сущности, как цифры
tpDigit.execute('...'); //&#8230;

@@ -101,0 +101,0 @@ ```

@@ -6,4 +6,3 @@ var tests = [];

/* jshint maxlen:1024 */
tests.push(['delDoublePunctiation', [
tests.push(['common/delDoublePunctiation', [
['У меня была только синяя краска;; но,, несмотря на это,, я затеял нарисовать охоту.', 'У меня была только синяя краска; но, несмотря на это, я затеял нарисовать охоту.'],

@@ -13,3 +12,3 @@ ['Никогда не отказывайся от малого в работе:: из малого строится великое.', 'Никогда не отказывайся от малого в работе: из малого строится великое.']

tests.push(['exclamation', [
tests.push(['common/exclamation', [
['!!', '!'],

@@ -21,3 +20,3 @@ ['Ура!! ', 'Ура! '],

tests.push(['exclamationQuestion', [
tests.push(['common/exclamationQuestion', [
['!?', '?!'],

@@ -28,3 +27,3 @@ ['Может домой!?', 'Может домой?!']

/*jshint maxlen:1000 */
tests.push(['quot', [
tests.push(['ru/quot', [
['Вот у вас "Мой спутник" – это не сочинение, это хорошо, потому что не выдумано.', 'Вот у вас «Мой спутник» – это не сочинение, это хорошо, потому что не выдумано.'],

@@ -36,3 +35,131 @@ ['««Цыганы» мои не продаются вовсе»', '«„Цыганы“ мои не продаются вовсе»'],

tests.push(['dash/izza', [
tests.push(['common/html/nbr', [
['a\nb\nc', 'a<br/>b<br/>c']
]]);
tests.push(['common/html/pbr', [
['a\n\nb\nc\n\nd', '<p>a</p>\n<p>b<br/>\nc</p>\n<p>d</p>'],
['a', '<p>a</p>']
]]);
tests.push(['common/html/stripTags', [
['123123 12<br/>12312 312 3<p>asdlalsdpa</p>', '123123 1212312 312 3asdlalsdpa'],
['<p', '<p'],
['<p align="center">Hello</p>', 'Hello']
]]);
tests.push(['common/html/url', [
['Ссылка https://example.com', 'Ссылка <a href="https://example.com">https://example.com</a>'],
['Ссылка http://example.com/', 'Ссылка <a href="http://example.com/">example.com</a>'],
['Ссылка http://example.com/path/', 'Ссылка <a href="http://example.com/path/">example.com/path/</a>'],
['Ссылка http://ww2.example.com/path/', 'Ссылка <a href="http://ww2.example.com/path/">ww2.example.com/path/</a>'],
['Ссылка http://www.example.com/path/', 'Ссылка <a href="http://www.example.com/path/">example.com/path/</a>']
]]);
tests.push(['common/nbsp/afterPara', [
[' § 123', ' §\u00A0123'],
[' §123', ' §\u00A0123'],
[' §XX', ' §\u00A0XX']
]]);
/*jshint maxlen:1000 */
tests.push(['common/nbsp/afterShortWord', [
['Apply non-breaking spaces to all frames of the current page.', 'Apply non-breaking spaces to\u00A0all frames of\u00A0the current page.']
]]);
tests.push(['common/nbsp/beforeShortLastWord', [
['Fedora, SuSE, Gentoo, Mandrake, or PLD.', 'Fedora, SuSE, Gentoo, Mandrake, or\u00A0PLD.']
]]);
tests.push(['common/space/afterPunctuation', [
['Солнце садилось за горизонт,и поднялся ветер. Вот.', 'Солнце садилось за горизонт, и поднялся ветер. Вот.'],
['Солнце садилось за горизонт,и поднялся ветер!Вот.', 'Солнце садилось за горизонт, и поднялся ветер! Вот.'],
['Солнце садилось за горизонт,и поднялся ветер?Вот.', 'Солнце садилось за горизонт, и поднялся ветер? Вот.']
]]);
tests.push(['common/space/delBeforePercent', [
['20 %', '20%'],
['около 4\u00A0%', 'около 4%']
]]);
/*jshint maxlen:1000 */
tests.push(['common/space/delBeforePunctuation', [
['И был посажен в крепость вместе с Измайловым ( странна судьба и союз сих имен ! ) .', 'И был посажен в крепость вместе с Измайловым (странна судьба и союз сих имен!).']
]]);
tests.push(['common/space/delRepeatN', [
['asdk oasdk\nas\n\n\n\nd koa\n\n\nsd ', 'asdk oasdk\nas\n\nd koa\n\nsd ']
]]);
tests.push(['common/space/delRepeatSpace', [
[' asdk oaskdo askd oasdk oasdk asd koasd ', ' asdk oaskdo askd oasdk oasdk asd koasd ']
]]);
/*jshint maxlen:1000 */
tests.push(['common/space/delTrailingBlanks', [
['asda d \t \n er er ert er er \n\n\n\nassdf asf sdf asdf\n', 'asda d\n er er ert er er\n\n\n\nassdf asf sdf asdf\n']
]]);
tests.push(['common/space/replaceTab', [
[' \t \t \t ', ' ']
]]);
tests.push(['common/space/trim', [
[' wkd kqw0ek 0qw ', 'wkd kqw0ek 0qw']
]]);
tests.push(['common/sym/arrow', [
['20 + 10 -> 30', '20 + 10 → 30'],
['20 + 10 <- 30', '20 + 10 ← 30'],
['<-', '←'],
['->', '→']
]]);
tests.push(['common/sym/cc', [
['20 в. в.', '20\u00A0вв.'],
['1934 в. в.', '1934\u00A0вв.'],
['1934в.в.', '1934\u00A0вв.'],
['1934в. в.', '1934\u00A0вв.'],
['1934 в.в.', '1934\u00A0вв.']
]]);
tests.push(['common/sym/cf', [
[' 200 C', ' 200 °C'],
[' 200 C.', ' 200 °C.'],
[' 20d C', ' 20d C'],
[' 20 C1', ' 20 C1'],
[' 200 F', ' 200 °F']
]]);
tests.push(['common/sym/copy', [
['(c)', '©'],
['(с)', '©'],
['(r)', '®'],
['(tm)', '™']
]]);
tests.push(['common/sym/fraction', [
['1/2', '½'],
['1/4', '¼'],
['3/4', '¾']
]]);
tests.push(['common/sym/hellip', [
['Текст текст... Другой текст... ', 'Текст текст… Другой текст… '],
['..', '..'],
['...', '…'],
['.....', '.....']
]]);
tests.push(['common/sym/plusMinus', [
['+-', '±'],
['+-100', '±100']
]]);
tests.push(['common/sym/times', [
['100 x 2', '100×2'],
['Пример: 30x3=90', 'Пример: 30×3=90']
]]);
tests.push(['ru/dash/izza', [
['Из за лесу', 'Из-за лесу'],

@@ -44,3 +171,3 @@ [' Из за лесу', ' Из-за лесу'],

tests.push(['dash/izpod', [
tests.push(['ru/dash/izpod', [
[' из под печки', ' из-под печки'],

@@ -50,3 +177,3 @@ [' Из под печки', ' Из-под печки']

tests.push(['dash/koe', [
tests.push(['ru/dash/koe', [
['Завелись кое какие деньжонки.', 'Завелись кое-какие деньжонки.'],

@@ -61,3 +188,3 @@ ['Кое какие деньжонки.', 'Кое-какие деньжонки.'],

tests.push(['dash/to', [
tests.push(['ru/dash/to', [
['Подобру то поздорову.', 'Подобру-то поздорову.'],

@@ -71,3 +198,3 @@ ['когда то', 'когда-то'],

tests.push(['dash/taki', [
tests.push(['ru/dash/taki', [
['верно таки', 'верно-таки'],

@@ -83,3 +210,3 @@ ['довольно таки', 'довольно-таки'],

tests.push(['dash/main', [
tests.push(['ru/dash/main', [
['Правда - небольшая ложь', 'Правда\u00A0— небольшая ложь'],

@@ -90,3 +217,3 @@ ['XX-XXI', 'XX—XXI'],

tests.push(['dash/month', [
tests.push(['ru/dash/month', [
['Март-декабрь', 'Март—декабрь'],

@@ -96,3 +223,3 @@ ['январь-май', 'январь—май']

tests.push(['dash/weekday', [
tests.push(['ru/dash/weekday', [
['Вторник-среда', 'Вторник—среда'],

@@ -102,3 +229,3 @@ ['понедельник-четверг', 'понедельник—четверг']

tests.push(['date/main', [
tests.push(['ru/date/main', [
['2010-02-01', '01.02.2010'],

@@ -110,26 +237,10 @@ [' 2010-02-01 ', ' 01.02.2010 '],

tests.push(['html/nbr', [
['a\nb\nc', 'a<br/>b<br/>c']
tests.push(['ru/date/weekday', [
['25 Мая, Понедельник', '25 мая, понедельник'],
['25 Мая, Понедельник', '25 мая, понедельник'],
['25 Мая, понедельник', '25 мая, понедельник'],
['25 мая, Понедельник', '25 мая, понедельник']
]]);
tests.push(['html/pbr', [
['a\n\nb\nc\n\nd', '<p>a</p>\n<p>b<br/>\nc</p>\n<p>d</p>'],
['a', '<p>a</p>']
]]);
tests.push(['html/stripTags', [
['123123 12<br/>12312 312 3<p>asdlalsdpa</p>', '123123 1212312 312 3asdlalsdpa'],
['<p', '<p'],
['<p align="center">Hello</p>', 'Hello']
]]);
tests.push(['html/url', [
['Ссылка https://example.com', 'Ссылка <a href="https://example.com">https://example.com</a>'],
['Ссылка http://example.com/', 'Ссылка <a href="http://example.com/">example.com</a>'],
['Ссылка http://example.com/path/', 'Ссылка <a href="http://example.com/path/">example.com/path/</a>'],
['Ссылка http://ww2.example.com/path/', 'Ссылка <a href="http://ww2.example.com/path/">ww2.example.com/path/</a>'],
['Ссылка http://www.example.com/path/', 'Ссылка <a href="http://www.example.com/path/">example.com/path/</a>']
]]);
tests.push(['money/dollar', [
tests.push(['ru/money/dollar', [
['100$', '100\u00A0$'],

@@ -144,3 +255,3 @@ ['100 $', '100\u00A0$'],

tests.push(['money/euro', [
tests.push(['ru/money/euro', [
['100€', '100\u00A0€'],

@@ -155,17 +266,25 @@ ['100 €', '100\u00A0€'],

tests.push(['nbsp/afterNum', [
tests.push(['ru/money/ruble', [
['100 руб.', '100\u00A0₽'],
['100руб.', '100\u00A0₽'],
['100р.', '100\u00A0₽'],
['100 р.', '100\u00A0₽'],
['100 р.!', '100\u00A0₽!'],
['100 р.?', '100\u00A0₽?'],
['100 р. 20 коп.', '100 р. 20 коп.'],
['У меня 100 р., а у тебя нет.', 'У меня 100\u00A0₽, а у тебя нет.'],
['У меня 100 р. У Миши 20 р.', 'У меня 100\u00A0₽. У Миши 20 р.']
]]);
tests.push(['ru/nbsp/afterNum', [
[' № 123', ' №\u00A0123'],
[' №123', ' №\u00A0123'],
[' § 123', ' §\u00A0123'],
[' §123', ' §\u00A0123'],
[' §XX', ' §\u00A0XX']
[' №123', ' №\u00A0123']
]]);
/*jshint maxlen:1000 */
tests.push(['nbsp/afterShortWord', [
tests.push(['ru/nbsp/afterShortWord', [
['Повторять, пока процесс не свернётся в навык.', 'Повторять, пока процесс не\u00A0свернётся в\u00A0навык.']
]]);
tests.push(['nbsp/beforeParticle', [
tests.push(['ru/nbsp/beforeParticle', [
['Может ли быть?', 'Может\u00A0ли быть?'],

@@ -175,3 +294,3 @@ ['Может же быть?', 'Может\u00A0же быть?']

tests.push(['nbsp/beforeShortLastWord', [
tests.push(['ru/nbsp/beforeShortLastWord', [
['Голубка дряхлая моя!', 'Голубка дряхлая\u00A0моя!']

@@ -181,3 +300,3 @@ ]]);

/*jshint maxlen:1000 */
tests.push(['nbsp/but', [
tests.push(['ru/nbsp/but', [
['Его лодка скользнула вниз но бедняга держался по-прежнему стойко.', 'Его лодка скользнула вниз, но бедняга держался по-прежнему стойко.'],

@@ -187,3 +306,3 @@ ['Я пошёл домой а он остался.', 'Я пошёл домой, а он остался.']

tests.push(['nbsp/m', [
tests.push(['ru/nbsp/m', [
[' 2 м2 ', ' 2\u00A0м² '],

@@ -195,3 +314,3 @@ [' 2.0 м2 ', ' 2.0\u00A0м² '],

tests.push(['nbsp/ooo', [
tests.push(['ru/nbsp/ooo', [
['ООО "Пример"', 'ООО\u00A0"Пример"'],

@@ -201,3 +320,3 @@ ['ОАО "Пример"', 'ОАО\u00A0"Пример"']

tests.push(['nbsp/xxxx', [
tests.push(['ru/nbsp/xxxx', [
['2012 г.', '2012\u00A0г.'],

@@ -207,95 +326,5 @@ [' (2012 г.) ', ' (2012\u00A0г.) ']

tests.push(['nbsp/yy', [
tests.push(['ru/nbsp/yy', [
['2012-2015 г. г. ', '2012-2015\u00A0гг. '],
['2012-2015г.г. ', '2012-2015\u00A0гг. ']
]]);
tests.push(['space/afterPunctuation', [
['Солнце садилось за горизонт,и поднялся ветер. Вот.', 'Солнце садилось за горизонт, и поднялся ветер. Вот.'],
['Солнце садилось за горизонт,и поднялся ветер!Вот.', 'Солнце садилось за горизонт, и поднялся ветер! Вот.'],
['Солнце садилось за горизонт,и поднялся ветер?Вот.', 'Солнце садилось за горизонт, и поднялся ветер? Вот.']
]]);
tests.push(['space/delBeforePercent', [
['20 %', '20%'],
['около 4\u00A0%', 'около 4%']
]]);
/*jshint maxlen:1000 */
tests.push(['space/delBeforePunctuation', [
['И был посажен в крепость вместе с Измайловым ( странна судьба и союз сих имен ! ) .', 'И был посажен в крепость вместе с Измайловым (странна судьба и союз сих имен!).']
]]);
tests.push(['space/delRepeatN', [
['asdk oasdk\nas\n\n\n\nd koa\n\n\nsd ', 'asdk oasdk\nas\n\nd koa\n\nsd ']
]]);
tests.push(['space/delRepeatSpace', [
[' asdk oaskdo askd oasdk oasdk asd koasd ', ' asdk oaskdo askd oasdk oasdk asd koasd ']
]]);
/*jshint maxlen:1000 */
tests.push(['space/delTrailingBlanks', [
['asda d \t \n er er ert er er \n\n\n\nassdf asf sdf asdf\n', 'asda d\n er er ert er er\n\n\n\nassdf asf sdf asdf\n']
]]);
tests.push(['space/replaceTab', [
[' \t \t \t ', ' ']
]]);
tests.push(['space/trim', [
[' wkd kqw0ek 0qw ', 'wkd kqw0ek 0qw']
]]);
tests.push(['sym/arrow', [
['20 + 10 -> 30', '20 + 10 → 30'],
['20 + 10 <- 30', '20 + 10 ← 30'],
['<-', '←'],
['->', '→']
]]);
tests.push(['sym/cc', [
['20 в. в.', '20\u00A0вв.'],
['1934 в. в.', '1934\u00A0вв.'],
['1934в.в.', '1934\u00A0вв.'],
['1934в. в.', '1934\u00A0вв.'],
['1934 в.в.', '1934\u00A0вв.']
]]);
tests.push(['sym/cf', [
[' 200 C', ' 200 °C'],
[' 200 C.', ' 200 °C.'],
[' 20d C', ' 20d C'],
[' 20 C1', ' 20 C1'],
[' 200 F', ' 200 °F']
]]);
tests.push(['sym/copy', [
['(c)', '©'],
['(с)', '©'],
['(r)', '®'],
['(tm)', '™']
]]);
tests.push(['sym/fraction', [
['1/2', '½'],
['1/4', '¼'],
['3/4', '¾']
]]);
tests.push(['sym/hellip', [
['Текст текст... Другой текст... ', 'Текст текст… Другой текст… '],
['..', '..'],
['...', '…'],
['.....', '.....']
]]);
tests.push(['sym/plusMinus', [
['+-', '±'],
['+-100', '±100']
]]);
tests.push(['sym/times', [
['100 x 2', '100×2'],
['Пример: 30x3=90', 'Пример: 30×3=90']
]]);
var assert = require('chai').assert,
rules = require('./rules.js'),
Typograf = require('../dist/typograf.js'),
t = new Typograf();
t = new Typograf({lang: 'ru'});
describe('API', function() {
it('disable rule', function() {
t.disable('quot');
assert.ok(t.disabled('quot'));
t.disable('ru/quot');
assert.ok(t.disabled('ru/quot'));
t.enable('quot');
t.enable('ru/quot');
});
it('enable rule', function() {
assert.ok(t.disabled('html/pbr'));
assert.ok(t.disabled('common/html/pbr'));
t.enable('html/pbr');
assert.ok(t.enabled('html/pbr'));
t.enable('common/html/pbr');
assert.ok(t.enabled('common/html/pbr'));
t.disable('html/pbr');
t.disable('common/html/pbr');
});
it('enable some rules', function() {
t.enable(['html/pbr', 'html/url']);
assert.ok(t.enabled('html/pbr'));
assert.ok(t.enabled('html/url'));
t.enable(['common/html/pbr', 'common/html/url']);
assert.ok(t.enabled('common/html/pbr'));
assert.ok(t.enabled('common/html/url'));
t.disable(['html/pbr', 'html/url']);
t.disable(['common/html/pbr', 'common/html/url']);
});

@@ -36,3 +36,3 @@

assert.equal(t.setting('nbsp/beforeShortLastWord', 'lengthLastWord'), 3);
assert.equal(t.setting('common/nbsp/beforeShortLastWord', 'lengthLastWord'), 3);

@@ -54,3 +54,3 @@ assert.equal(t.setting('fake'), undefined);

Typograf.rule({
name: 'example',
name: 'common/example',
sortIndex: 100,

@@ -57,0 +57,0 @@ func: function(text) {

var assert = require('chai').assert,
rules = require('./rules.js'),
Typograf = require('../dist/typograf.js'),
t = new Typograf();
t = new Typograf({lang: 'ru'});

@@ -6,0 +6,0 @@ function executeRule(name, text) {

var assert = require('chai').assert,
Typograf = require('../dist/typograf'),
t = new Typograf(),
t = new Typograf({lang: 'ru'}),
tests = [

@@ -20,3 +20,3 @@ [' Мир - мой мир! ', 'Мир\u00A0— мой\u00A0мир!'],

describe('smoke', function() {
describe('ru/smoke', function() {
tests.forEach(function(item) {

@@ -23,0 +23,0 @@ it(item[0], function() {

Sorry, the diff of this file is not supported yet

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