Comparing version 2.0.0 to 2.0.2
{ | ||
"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" | ||
] | ||
} |
/*! 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 = '(«|»|„|“|”|‘|’|"|")', | ||
quotesR = '(»|“|"|")', | ||
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', // — | ||
dashInterval: '\u2014' // — | ||
} | ||
@@ -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='(«|»|„|“|”|‘|’|"|")',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; | ||
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('...'); // … | ||
var tpDigit = new Typograf({lang: 'ru', mode: 'digit'}); // HTML-сущности, как цифры | ||
tpDigit.execute('...'); //… | ||
``` | ||
// HTML-сущности, как цифры | ||
var tpDigit = new Typograf({lang: 'ru', mode: 'digit'}); | ||
tpDigit.execute('...'); //… | ||
``` | ||
@@ -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
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
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
269676
24
1688
133
0
8761