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 2.0.0 to 2.0.2

coverage/coverage.json

5

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

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

"dist/typograf.js",
"dist/typograf.min.js"
"dist/typograf.min.js",
"dist/typograf.css"
]
}

253

dist/typograf.js
/*! Typograf | (c) 2014 Denis Seleznev | https://github.com/hcodes/typograf/ */
/**
* @constructor
*/
* @constructor
*/
function Typograf(prefs) {

@@ -23,13 +22,13 @@ this._prefs = typeof prefs === 'object' ? prefs : {};

/**
* Добавить правило.
*
* @static
* @param {Object} rule
* @param {string} rule.name Название правила
* @param {string} rule.title Описание правила
* @param {string} rule.sortIndex Индекс сортировки, чем выше, тем позже выполняется
* @param {Function} rule.func Функция обработки
* @param {boolean} rule.enabled Включено ли правило по умолчанию
* @return {Typograf} this
*/
* Добавить правило.
*
* @static
* @param {Object} rule
* @param {string} rule.name Название правила
* @param {string} rule.title Описание правила
* @param {string} rule.sortIndex Индекс сортировки, чем выше, тем позже выполняется
* @param {Function} rule.func Функция обработки
* @param {boolean} rule.enabled Включено ли правило по умолчанию
* @return {Typograf} this
*/
Typograf.rule = function(rule) {

@@ -48,8 +47,8 @@ rule.enabled = rule.enabled === false ? false : true;

/**
* Добавить общие данные для использования в правилах.
*
* @static
* @param {string} key Название ключа
* @param {*} value Значение ключа
*/
* Добавить общие данные для использования в правилах.
*
* @static
* @param {string} key Название ключа
* @param {*} value Значение ключа
*/
Typograf.data = function(key, value) {

@@ -90,5 +89,5 @@ Typograf.prototype.data[key] = value;

var isHTML = text.search(/<|>/) !== -1;
this._isHTML = text.search(/<[a-z]/) !== -1;
if(isHTML) {
if(this._isHTML) {
text = this._hideSafeTags(text);

@@ -100,3 +99,5 @@ }

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

@@ -108,3 +109,3 @@ }

if(isHTML) {
if(this._isHTML) {
text = this._showSafeTags(text);

@@ -117,8 +118,8 @@ }

/**
* Установить/получить настройку
*
* @param {string} rule Имя правила
* @param {string} name Имя настройки
* @return {*} [value] Значение настройки
*/
* Установить/получить настройку
*
* @param {string} rule Имя правила
* @param {string} name Имя настройки
* @return {*} [value] Значение настройки
*/
setting: function(rule, name, value) {

@@ -136,7 +137,7 @@ if(arguments.length <= 2) {

/**
* Включено ли правило.
*
* @param {string} rule Название правила
* @return {boolean}
*/
* Включено ли правило.
*
* @param {string} rule Название правила
* @return {boolean}
*/
enabled: function(rule) {

@@ -147,7 +148,7 @@ return this._enabledRules[rule];

/**
* Отключено ли правило.
*
* @param {string} rule Название правила
* @return {boolean}
*/
* Отключено ли правило.
*
* @param {string} rule Название правила
* @return {boolean}
*/
disabled: function(rule) {

@@ -158,7 +159,7 @@ return !this._enabledRules[rule];

/**
* Включить правило.
*
* @param {string} rule Название правила
* @return {boolean}
*/
* Включить правило.
*
* @param {string} rule Название правила
* @return {boolean}
*/
enable: function(rule) {

@@ -169,7 +170,7 @@ return this._enable(rule, true);

/**
* Отключить правило.
*
* @param {string} rule Название правила
* @return {boolean}
*/
* Отключить правило.
*
* @param {string|Array[string]} rule Название правила
* @return {boolean}
*/
disable: function(rule) {

@@ -182,6 +183,6 @@ return this._enable(rule, false);

rule.forEach(function(el) {
this._enabledRules[el] = enabled;
this._enableByMask(el, enabled);
}, this);
} else {
this._enabledRules[rule] = enabled;
this._enableByMask(rule, enabled);
}

@@ -191,2 +192,19 @@

},
_enableByMask: function(rule, enabled) {
var re;
if(rule.search(/\*/) !== -1) {
re = new RegExp(rule
.replace(/\//g, '\\\/')
.replace(/\*/, '.*'));
this._rules.forEach(function(el) {
var name = el.name;
if(re.test(name)) {
this._enabledRules[name] = enabled;
}
}, this);
} else {
this._enabledRules[rule] = enabled;
}
},
_rules: [],

@@ -599,2 +617,3 @@ _hideSafeTags: function(text) {

var letter = '[\\w\\dа-яёА-ЯЁ]',
tag = '(?:^|<\\w.*?>)*',
lquot = settings.lquot,

@@ -604,26 +623,30 @@ rquot = settings.rquot,

rquot2 = settings.rquot2,
tag = '(?:^|<\\w.*?>)*',
phraseL = '(?:…|' + letter + '|\\n)',
phraseR = '(?:' + [letter, '[)!?.:;#*]'].join('|') + ')*',
quotesL = '(«|»|„|“|”|‘|’|&quot;|")',
quotesR = '(»|“|&quot;|")',
phraseR = '(?:' + [letter, '[)!?.:;#*,]'].join('|') + ')*',
quotesL = '(«|„|“|")',
quotesR = '(»|”|“|")',
reL = new RegExp('(' + tag + ')?' + quotesL + '(' + tag + phraseL + tag + ')', 'g'),
reR = new RegExp('(' + tag + phraseR + tag + ')' + quotesR + '(' + phraseR + ')', 'g'),
reL2 = new RegExp('(' + lquot + ')(.*?)' + lquot + '(.*?)(' + rquot + ')', 'g'),
reR2 = new RegExp('(' + lquot + ')(.*?)' + rquot + '(.*?)(' + rquot + ')', 'g'),
reDoubleL = new RegExp(lquot + lquot, 'g'),
reDoubleR = new RegExp(rquot + rquot, 'g');
re2, reL2, reR2;
text = text
.replace(reL, '$1' + lquot + '$3')
.replace(reR, '$1' + rquot + '$3');
.replace(reL, '$1' + lquot + '$3') // Открывающая кавычка
.replace(reR, '$1' + rquot + '$3') // Закрывающая кавычка
.replace(new RegExp('(^|\\w|\\s)' + rquot + lquot, 'g'),
'$1' + lquot + lquot); // фикс для случая »« в начале текста
if(lquot === lquot2 && rquot === rquot2) {
text = text
.replace(reDoubleL, '$1$2' + lquot + '$3$4')
.replace(reDoubleR, '$1$2' + rquot + '$3$4');
.replace(new RegExp(lquot + lquot, 'g'), lquot) // ««Энергия» Синергия» -> «Энергия» Синергия»
.replace(new RegExp(rquot + rquot, 'g'), rquot); // «Энергия «Синергия»» -> «Энергия «Синергия»
} else {
re2 = new RegExp('(' + lquot + ')([^' + rquot + ']*?)' + lquot +
'(.*?)' + rquot + '([^' + lquot + ']*?)(' + rquot + ')', 'g');
reL2 = new RegExp('(' + lquot2 + ')(.*?)' + lquot + '(.*?)(' + rquot2 + ')', 'g');
reR2 = new RegExp('(' + lquot2 + ')(.*?)' + rquot + '(.*?)(' + rquot2 + ')', 'g');
text = text
.replace(reL2, '$1$2' + lquot2 + '$3$4')
.replace(reR2, '$1$2' + rquot2 + '$3$4');
.replace(re2, '$1$2' + lquot2 + '$3' + rquot2 + '$4$5') // Предварительная расстановка вложенных кавычек
.replace(reL2, '$1$2' + lquot2 + '$3$4') // Вложенная открывающая кавычка
.replace(reR2, '$1$2' + rquot2 + '$3$4'); // Вложенная закрывающая кавычка
}

@@ -859,3 +882,3 @@

return text.replace(/\(r\)/gi, '®')
.replace(/\((c|с)\)/gi, '©')
.replace(/(copyright )?\((c|с)\)/gi, '©')
.replace(/\(tm\)/gi, '™');

@@ -969,11 +992,13 @@ }

func: function(text) {
var re = new RegExp('(\\s|\u00A0)(-|—)(\\s|\\n)', 'g');
var dashes = '(-|--|–|—)',
re1 = new RegExp('( |\u00A0)' + dashes + '( |\\n)', 'g'),
re2 = new RegExp('(X|I|V)(?: |\u00A0)?' + dashes + '(?: |\u00A0)?(X|I|V)', 'g');
return text
.replace(re, '\u00A0—$3')
.replace(/(X|I|V)(?: |\u00A0)?(-|—)(?: |\u00A0)?(X|I|V)/g, '$1—$3');
.replace(re1, '\u00A0' + this.setting('ru/dash/main', 'dash') + '$3')
.replace(re2, '$1' + this.setting('ru/dash/main', 'dashInterval') + '$3');
},
settings: {
dash: '\u2014',
dashInterval: '\u2014'
dash: '\u2014', // &mdash;
dashInterval: '\u2014' // &mdash;
}

@@ -1079,3 +1104,4 @@ });

.replace(/(\d+)( |\u00A0)?(р|руб)\.(?=\s+[A-ЯЁ])/g, rep + '.');
}
},
enabled: false
});

@@ -1183,3 +1209,80 @@

/*jshint maxlen:1000 */
Typograf.rule({
title: 'Висячая пунктуация для открывающей скобки',
name: 'ru/optalign/bracket',
sortIndex: 1001,
func: function(text, settings) {
return text
.replace(/( |\u00A0)\(/g, '<span class="typograf-oa-sp-lbracket">$1</span><span class="typograf-oa-lbracket">(</span>')
.replace(/(^|\n)\(/g, '$1<span class="typograf-oa-n-lbracket">(</span>');
},
enabled: false
})
.rule({
name: '-ru/optalign/bracket',
sortIndex: -10,
func: function(text) {
// Зачистка HTML-тегов от висячая пунктуация для скобки
if(this.enabled('ru/optalign/bracket')) {
return text.replace(/<span class="typograf-oa-(sp-lbracket|lbracket|n-lbracket)">(.*?)<\/span>/g, '$2');
} else {
return text;
}
}
});
/*jshint maxlen:1000 */
Typograf.rule({
title: 'Висячая типографика для запятой',
name: 'ru/optalign/comma',
sortIndex: 1002,
func: function(text, settings) {
return text.replace(/([а-яёa-z0-9]+)\, /gi, '$1<span class="typograf-oa-comma">,</span><span class="typograf-oa-comma-sp"> </span>');
},
enabled: false
})
.rule({
name: '-ru/optalign/comma',
sortIndex: -10,
func: function(text) {
// Зачистка HTML-тегов от висячей пунктуации для запятой
if(this.enabled('ru/optalign/comma')) {
return text.replace(/<span class="typograf-oa-(comma|comma-sp)">(.*?)<\/span>/g, '$2');
} else {
return text;
}
}
});
/*jshint maxlen:1000 */
Typograf.rule({
title: 'Висячая пунктуация для открывающей кавычки',
name: 'ru/optalign/quot',
sortIndex: 1000,
func: function(text, settings) {
var quotes = '(' + this.setting('ru/quot', 'lquot') + '|' + this.setting('ru/quot', 'lquot2') + ')',
re = new RegExp('([a-zа-яё\\-]{3,})( |\u00A0)(' + quotes + ')', 'gi'),
re2 = new RegExp('(^|\n|<p> *)' + quotes, 'g');
return text
.replace(re, '$1<span class="typograf-oa-sp-lquot">$2</span><span class="typograf-oa-lquot">$3</span>')
.replace(re2, '$1<span class="typograf-oa-n-lquot">$2</span>');
},
enabled: false
})
.rule({
name: '-ru/optalign/quot',
sortIndex: -10,
func: function(text) {
// Зачистка HTML-тегов от висячей пунктуации для кавычки
if(this.enabled('ru/optalign/quot')) {
return text.replace(/<span class="typograf-oa-(sp-lquot|lquot|n-lquot)">(.*?)<\/span>/g, '$2');
} else {
return text;
}
}
});
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){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;
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;return n||(n=this._prefs.lang),(e=""+e)?(e=e.replace(/\r\n/g,"\n").replace(/\r/g,"\n"),this._isHTML=-1!==e.search(/<[a-z]/),this._isHTML&&(e=this._hideSafeTags(e)),e=this._utfication(e),this._rules.forEach(function(r){var t=r._lang.replace(/^_/,"");!this.enabled(r.name)||"common"!==t&&t!==n||(e=r.func.call(this,e,this._settings[r.name]))},this),e=this._modification(e),this._isHTML&&(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._enableByMask(e,r)},this):this._enableByMask(e,r),this},_enableByMask:function(e,r){var n;-1!==e.search(/\*/)?(n=new RegExp(e.replace(/\//g,"\\/").replace(/\*/,".*")),this._rules.forEach(function(e){var t=e.name;n.test(t)&&(this._enabledRules[t]=r)},this)):this._enabledRules[e]=r},_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,t,a,o="[\\w\\dа-яёА-ЯЁ]",u="(?:^|<\\w.*?>)*",l=r.lquot,c=r.rquot,s=r.lquot2,i=r.rquot2,p="(?:…|"+o+"|\\n)",g="(?:"+[o,"[)!?.:;#*,]"].join("|")+")*",f='(«|„|“|")',d='(»|”|“|")',m=new RegExp("("+u+")?"+f+"("+u+p+u+")","g"),h=new RegExp("("+u+g+u+")"+d+"("+g+")","g");return e=e.replace(m,"$1"+l+"$3").replace(h,"$1"+c+"$3").replace(new RegExp("(^|\\w|\\s)"+c+l,"g"),"$1"+l+l),l===s&&c===i?e=e.replace(new RegExp(l+l,"g"),l).replace(new RegExp(c+c,"g"),c):(n=new RegExp("("+l+")([^"+c+"]*?)"+l+"(.*?)"+c+"([^"+l+"]*?)("+c+")","g"),t=new RegExp("("+s+")(.*?)"+l+"(.*?)("+i+")","g"),a=new RegExp("("+s+")(.*?)"+c+"(.*?)("+i+")","g"),e=e.replace(n,"$1$2"+s+"$3"+i+"$4$5").replace(t,"$1$2"+s+"$3$4").replace(a,"$1$2"+i+"$3$4")),e},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(/(copyright )?\((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="(-|--|–|—)",n=new RegExp("( | )"+r+"( |\\n)","g"),t=new RegExp("(X|I|V)(?: | )?"+r+"(?: | )?(X|I|V)","g");return e.replace(n," "+this.setting("ru/dash/main","dash")+"$3").replace(t,"$1"+this.setting("ru/dash/main","dashInterval")+"$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+".")},enabled:!1}),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.rule({title:"Висячая пунктуация для открывающей скобки",name:"ru/optalign/bracket",sortIndex:1001,func:function(e){return e.replace(/( |\u00A0)\(/g,'<span class="typograf-oa-sp-lbracket">$1</span><span class="typograf-oa-lbracket">(</span>').replace(/(^|\n)\(/g,'$1<span class="typograf-oa-n-lbracket">(</span>')},enabled:!1}).rule({name:"-ru/optalign/bracket",sortIndex:-10,func:function(e){return this.enabled("ru/optalign/bracket")?e.replace(/<span class="typograf-oa-(sp-lbracket|lbracket|n-lbracket)">(.*?)<\/span>/g,"$2"):e}}),Typograf.rule({title:"Висячая типографика для запятой",name:"ru/optalign/comma",sortIndex:1002,func:function(e){return e.replace(/([а-яёa-z0-9]+)\, /gi,'$1<span class="typograf-oa-comma">,</span><span class="typograf-oa-comma-sp"> </span>')},enabled:!1}).rule({name:"-ru/optalign/comma",sortIndex:-10,func:function(e){return this.enabled("ru/optalign/comma")?e.replace(/<span class="typograf-oa-(comma|comma-sp)">(.*?)<\/span>/g,"$2"):e}}),Typograf.rule({title:"Висячая пунктуация для открывающей кавычки",name:"ru/optalign/quot",sortIndex:1e3,func:function(e){var r="("+this.setting("ru/quot","lquot")+"|"+this.setting("ru/quot","lquot2")+")",n=new RegExp("([a-zа-яё\\-]{3,})( | )("+r+")","gi"),t=new RegExp("(^|\n|<p> *)"+r,"g");return e.replace(n,'$1<span class="typograf-oa-sp-lquot">$2</span><span class="typograf-oa-lquot">$3</span>').replace(t,'$1<span class="typograf-oa-n-lquot">$2</span>')},enabled:!1}).rule({name:"-ru/optalign/quot",sortIndex:-10,func:function(e){return this.enabled("ru/optalign/quot")?e.replace(/<span class="typograf-oa-(sp-lquot|lquot|n-lquot)">(.*?)<\/span>/g,"$2"):e}}),Typograf._sortRules(),Typograf._needSortRules=!0;
{
"name": "typograf",
"description": "The client and server typographer",
"version": "2.0.0",
"version": "2.0.2",
"author": {

@@ -27,3 +27,3 @@ "name": "Denis Seleznev",

"gulp": "~3.8.5",
"gulp-concat": "~2.2.0",
"gulp-concat": "~2.4.x",
"gulp-filter": "^1.0.2",

@@ -33,3 +33,3 @@ "gulp-jscs": "^1.1.2",

"gulp-rename": "~1.2.0",
"gulp-uglify": "~0.2.1",
"gulp-uglify": "~1.0.x",
"jscs": "^1.7.x",

@@ -36,0 +36,0 @@ "jshint": "2.x"

@@ -1,6 +0,10 @@

[![Build Status](https://travis-ci.org/hcodes/typograf.png?branch=master)](https://travis-ci.org/hcodes/typograf)
Типограф на JavaScript
======================
[![NPM version](https://badge.fury.io/js/typograf.svg)](http://badge.fury.io/js/typograf)
[![Build Status](https://travis-ci.org/hcodes/typograf.png?branch=master)](https://travis-ci.org/hcodes/typograf)
[![Coverage Status](https://img.shields.io/coveralls/hcodes/typograf.svg?branch=master)](https://coveralls.io/r/hcodes/typograf)
[![Dependency Status](https://gemnasium.com/hcodes/typograf.svg)](https://gemnasium.com/hcodes/typograf)
[Типограф в действии](http://hcodes.github.io/typograf/) с [мобильной версией](http://hcodes.github.io/typograf/site/mobile.html)
## Что может типограф:

@@ -28,2 +32,3 @@ + правильно расставлять кавычки и тире;

+ и пр.
+ висячая пунктуация.

@@ -36,3 +41,4 @@

+ utf-8;
+ поддержка Node.js.
+ поддержка Node.js;
+ TDD.

@@ -43,7 +49,7 @@

### В браузере
```
```
bower install typograf
```
```HTML
```
```HTML
<script src="dist/typograf.min.js"></script>

@@ -54,9 +60,10 @@ <script>

</script>
```
```
### Node.js
```
```
npm install typograf
```
```JavaScript
```
```JavaScript
var Typograf = require('typograf'),

@@ -66,6 +73,23 @@ tp = new Typograf({lang: 'ru'});

console.log(tp.execute(' Мир - мой мир!! '));
```
```
## Висячая пунктуация
По умолчанию висячая пунктуация отключена.
Для включения необходимо подключить правила:
```JavaScript
var Typograf = require('typograf'),
tp = new Typograf({lang: 'ru'});
tp.enable('ru/optalign/*');
console.log(tp.execute('"Мир"'));
```
А также в HTML-код страницы добавить:
```HTML
<link rel="stylesheet" href="dist/typograf.css" type="text/css" />
```
## Включить/отключить правило
```JavaScript
```JavaScript
var tp = new Typograf({lang: 'ru'});

@@ -75,6 +99,6 @@ tp.disable('ru/space/afterNum'); // Отключить правило

tp.enable('ru/space/afterNum'); // Включить правило
```
```
## Добавить правило
```JavaScript
```JavaScript
Typograf.rule({

@@ -88,16 +112,19 @@ title: 'Пример правила',

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

@@ -104,0 +131,0 @@

@@ -5,3 +5,3 @@ var tests = [];

/* jshint maxlen:1024 */
/* jshint maxlen:1000 */
tests.push(['common/delDoublePunctiation', [

@@ -29,3 +29,6 @@ ['У меня была только синяя краска;; но,, несмотря на это,, я затеял нарисовать охоту.', 'У меня была только синяя краска; но, несмотря на это, я затеял нарисовать охоту.'],

['"Пример"', '«Пример»'],
['ОАО "Пример"', 'ОАО «Пример»']
['ОАО "Пример"', 'ОАО «Пример»'],
['В самом добром кино “Мамы”, в молодежном триллере “Закрытая школа” на СТС. А еще на сцене театра им. Вл. Маяковского в спектакле “Не все коту масленица”.', 'В самом добром кино «Мамы», в молодежном триллере «Закрытая школа» на СТС. А еще на сцене театра им. Вл. Маяковского в спектакле «Не все коту масленица».'],
['В самом добром кино “Мамы”, в молодежном триллере “Закрытая школа” на СТС', 'В самом добром кино «Мамы», в молодежном триллере «Закрытая школа» на СТС'],
['В самом добром кино “Мамы, в молодежном триллере “Закрытая школа” на СТС"', 'В самом добром кино «Мамы, в молодежном триллере „Закрытая школа“ на СТС»']
]]);

@@ -134,2 +137,4 @@

['(с)', '©'],
['Copyright (с)', '©'],
['copyright (с)', '©'],
['(r)', '®'],

@@ -312,1 +317,35 @@ ['(tm)', '™']

]]);
/*jshint maxlen:1000 */
tests.push(['ru/optalign/bracket', [
['В самом добром (кино)', 'В самом добром<span class="typograf-oa-sp-lbracket"> </span><span class="typograf-oa-lbracket">(</span>кино)'],
['В самом добром\n(кино)', 'В самом добром\n<span class="typograf-oa-n-lbracket">(</span>кино)']
]]);
tests.push(['-ru/optalign/bracket', [
['<span class="typograf-oa-sp-lbracket"> </span>', ' '],
['<span class="typograf-oa-lbracket">(</span>', '(']
]]);
/*jshint maxlen:1000 */
tests.push(['ru/optalign/comma', [
['В самом добром, кино', 'В самом добром<span class="typograf-oa-comma">,</span><span class="typograf-oa-comma-sp"> </span>кино']
]]);
tests.push(['-ru/optalign/comma', [
['<span class="typograf-oa-comma">,</span>', ','],
['<span class="typograf-oa-comma-sp"> </span>', ' ']
]]);
/*jshint maxlen:1000 */
tests.push(['ru/optalign/quot', [
['Вот у вас «Мой спутник».', 'Вот у вас<span class="typograf-oa-sp-lquot"> </span><span class="typograf-oa-lquot">«</span>Мой спутник».'],
['Вот у вас\n«Мой спутник».', 'Вот у вас\n<span class="typograf-oa-n-lquot">«</span>Мой спутник».'],
['Вот у вас<p> «Мой спутник».</p>', 'Вот у вас<p> <span class="typograf-oa-n-lquot">«</span>Мой спутник».</p>']
]]);
tests.push(['-ru/optalign/quot', [
['<span class="typograf-oa-sp-lquot"> </span>', ' '],
['<span class="typograf-oa-lquot">«</span>', '«'],
['\n<span class="typograf-oa-n-lquot">«</span>', '\n«']
]]);

@@ -29,2 +29,12 @@ var assert = require('chai').assert,

t.disable(['common/html/pbr', 'common/html/url']);
t.enable('ru/optalign/*');
assert.ok(t.enabled('ru/optalign/quot'));
assert.ok(t.enabled('ru/optalign/bracket'));
assert.ok(t.enabled('ru/optalign/comma'));
t.disable('ru/optalign/*');
assert.ok(t.disabled('ru/optalign/quot'));
assert.ok(t.disabled('ru/optalign/bracket'));
assert.ok(t.disabled('ru/optalign/comma'));
});

@@ -31,0 +41,0 @@

var assert = require('chai').assert,
rules = require('./rules.js'),
Typograf = require('../dist/typograf.js'),
t = new Typograf({lang: 'ru'});
t = new Typograf({lang: 'ru'}),
_settings;
function pushSettings(ruleName, settings) {
_settings = {};
Object.keys(settings).forEach(function(key) {
_settings[key] = t.setting(ruleName, key);
t.setting(ruleName, key, settings[key]);
});
}
function popSettings(ruleName) {
Object.keys(_settings).forEach(function(key) {
t.setting(ruleName, key, _settings[key]);
});
}
function executeRule(name, text) {
var rules = Typograf.prototype._rules;
rules.forEach(function(f) {

@@ -14,3 +30,3 @@ if(f.name === name) {

});
return text;

@@ -20,2 +36,5 @@ }

describe('rules', function() {
var optRules = ['ru/optalign/quot', 'ru/optalign/bracket', 'ru/optalign/comma'];
t.enable(optRules);
rules.forEach(function(elem) {

@@ -28,2 +47,21 @@ it(elem[0], function() {

});
it('quotes lquot = lquot2 and rquot = rquot2', function() {
pushSettings('ru/quot', {
lquot: '«',
rquot: '»',
lquot2: '«',
rquot2: '»'
});
assert.equal(executeRule('ru/quot', '"Триллер “Закрытая школа” на СТС"'), '«Триллер «Закрытая школа» на СТС»');
assert.equal(executeRule('ru/quot', 'Триллер "Триллер “Закрытая школа” на СТС" Триллер'), 'Триллер «Триллер «Закрытая школа» на СТС» Триллер');
assert.equal(executeRule('ru/quot', '"“Закрытая школа” на СТС"'), '«Закрытая школа» на СТС»');
assert.equal(executeRule('ru/quot', 'Триллер "“Закрытая школа” на СТС" Триллер'), 'Триллер «Закрытая школа» на СТС» Триллер');
assert.equal(executeRule('ru/quot', '"Триллер “Закрытая школа"'), '«Триллер «Закрытая школа»');
assert.equal(executeRule('ru/quot', 'Триллер "Триллер “Закрытая школа" Триллер'), 'Триллер «Триллер «Закрытая школа» Триллер');
popSettings('ru/quot');
});
});

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