Comparing version 1.2.5 to 2.0.0
{ | ||
"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='(«|»|„|“|”|‘|’|"|")',p='(»|“|"|")',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='(«|»|„|“|”|‘|’|"|")',p='(»|“|"|")',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('...'); // … | ||
var tpDigit = new Typograf({mode: 'digit'}); // HTML-сущности как цифры | ||
var tpDigit = new Typograf({lang: 'ru', mode: 'digit'}); // HTML-сущности, как цифры | ||
tpDigit.execute('...'); //… | ||
@@ -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
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Mixed license
License(Experimental) Package contains multiple licenses.
Found 1 instance in 1 package
1
76292
18
1418
1