typograf 6.12.0 → 6.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -5,7 +5,6 @@
5
5
  [![NPM version](https://img.shields.io/npm/v/typograf.svg?style=flat)](https://www.npmjs.com/package/typograf)
6
6
  [![NPM downloads](https://img.shields.io/npm/dm/typograf.svg?style=flat)](https://www.npmjs.com/package/typograf)
7
7
  [![Coverage Status](https://img.shields.io/coveralls/typograf/typograf.svg?style=flat)](https://coveralls.io/r/typograf/typograf)
8
- [![Dependency Status](https://img.shields.io/david/typograf/typograf.svg?style=flat)](https://david-dm.org/typograf/typograf)
9
8
  [![bundlephobia](https://badgen.net/bundlephobia/minzip/typograf)](https://bundlephobia.com/result?p=typograf)
10
9
 
11
10
  Помогает автоматически расставить неразрывные пробелы, исправить мелкие опечатки, привести кавычки к правильному виду, заменить дефисы на тире в нужных местах и многое другое.
@@ -52,7 +52,7 @@
52
52
  }
53
53
 
54
54
  function _iterableToArrayLimit(arr, i) {
55
- var _i = arr && (typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]);
55
+ var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
56
56
 
57
57
  if (_i == null) return;
58
58
  var _arr = [];
@@ -380,6 +380,10 @@
380
380
 
381
381
  var regExpUrl = new RegExp('(https?|file|ftp)://([a-zA-Z0-9/+-=%&:_.~?]+[a-zA-Z0-9#+]*)', 'g');
382
382
  var regExpNumber = '\\d+([.,]\\d+)?';
383
+ var regExpDigit = /\d/;
384
+ function isDigit(symbol) {
385
+ return symbol.search(regExpDigit) > -1;
386
+ }
383
387
 
384
388
  var privateLabel = "\uF000";
385
389
  var privateSeparateLabel = "\uF001";
@@ -1211,7 +1215,7 @@
1211
1215
 
1212
1216
  return Typograf;
1213
1217
  }();
1214
- Typograf.version = '6.12.0';
1218
+ Typograf.version = '6.14.0';
1215
1219
  Typograf.addLocale = addLocale;
1216
1220
  Typograf.getLocales = getLocales;
1217
1221
  Typograf.hasLocale = hasLocale;
@@ -1630,7 +1634,7 @@
1630
1634
  var afterNumber = {
1631
1635
  name: 'common/nbsp/afterNumber',
1632
1636
  handler: function handler(text, settings, context) {
1633
- var re = '(^|\\D)(\\d{1,5}) ([' + context.getData('char') + ']+)';
1637
+ var re = '(^|\\s)(\\d{1,5}) ([' + context.getData('char') + ']+)';
1634
1638
  return text.replace(new RegExp(re, 'gi'), "$1$2\xA0$3");
1635
1639
  },
1636
1640
  disabled: true
@@ -1823,12 +1827,12 @@
1823
1827
  }
1824
1828
  };
1825
1829
 
1830
+ var MAX_LEVEL_WITH_ERRORS = 2;
1826
1831
  var Quote = {
1827
1832
  bufferQuotes: {
1828
1833
  left: "\uF005\uF006\uF007",
1829
1834
  right: "\uF008\uF009\uF0A0"
1830
1835
  },
1831
- maxLevel: 3,
1832
1836
  beforeLeft: " \n\t\xA0[(",
1833
1837
  afterRight: " \n\t\xA0!?.:;#*,\u2026)\\]",
1834
1838
  process: function process(params) {
@@ -1935,8 +1939,8 @@
1935
1939
  var lquote = params.settings.left[0];
1936
1940
  var lquote2 = params.settings.left[1] || lquote;
1937
1941
  var rquote = params.settings.right[0];
1938
- var reL = new RegExp('(^|[' + this.beforeLeft + '])([' + quotes + ']{1,' + this.maxLevel + '})(?=[^\\s' + privateLabel + '])', 'gim');
1939
- var reR = new RegExp('([^\\s' + privateLabel + '])([' + quotes + ']{1,' + this.maxLevel + '})(?=[' + this.afterRight + ']|$)', 'gim');
1942
+ var reL = new RegExp('(^|[' + this.beforeLeft + '])([' + quotes + ']+)(?=[^\\s' + privateLabel + '])', 'gim');
1943
+ var reR = new RegExp('([^\\s' + privateLabel + '])([' + quotes + ']+)(?=[' + this.afterRight + ']|$)', 'gim');
1940
1944
  text = text.replace(reL, function ($0, $1, $2) {
1941
1945
  return $1 + repeat(lquote, $2.length);
1942
1946
  }).replace(reR, function ($0, $1, $2) {
@@ -2037,18 +2041,10 @@
2037
2041
  return null;
2038
2042
  },
2039
2043
  setInner: function setInner(text, settings) {
2040
- var leftQuotes = [];
2041
- var rightQuotes = [];
2042
-
2043
- for (var k = 0; k < settings.left.length; k++) {
2044
- leftQuotes.push(settings.left[k]);
2045
- rightQuotes.push(settings.right[k]);
2046
- }
2047
-
2048
2044
  var lquote = settings.left[0];
2049
2045
  var rquote = settings.right[0];
2050
- var minLevel = -1;
2051
- var maxLevel = leftQuotes.length - 1;
2046
+ var minLevel = 0;
2047
+ var maxLevel = this.getMaxLevel(text, lquote, rquote, settings.left.length);
2052
2048
  var level = minLevel;
2053
2049
  var result = '';
2054
2050
 
@@ -2056,25 +2052,20 @@
2056
2052
  var letter = text[i];
2057
2053
 
2058
2054
  if (letter === lquote) {
2055
+ result += settings.left[level > maxLevel - 1 ? maxLevel - 1 : level];
2059
2056
  level++;
2060
2057
 
2061
2058
  if (level > maxLevel) {
2062
2059
  level = maxLevel;
2063
2060
  }
2064
-
2065
- result += leftQuotes[level];
2066
2061
  } else if (letter === rquote) {
2067
- if (level <= minLevel) {
2068
- level = 0;
2069
- result += rightQuotes[level];
2070
- } else {
2071
- result += rightQuotes[level];
2072
- level--;
2073
-
2074
- if (level < minLevel) {
2075
- level = minLevel;
2076
- }
2062
+ level--;
2063
+
2064
+ if (level < minLevel) {
2065
+ level = minLevel;
2077
2066
  }
2067
+
2068
+ result += settings.right[level];
2078
2069
  } else {
2079
2070
  if (letter === '"') {
2080
2071
  level = minLevel;
@@ -2084,8 +2075,11 @@
2084
2075
  }
2085
2076
  }
2086
2077
 
2087
- var count = this.count(result, settings);
2088
- return count[lquote] !== count[rquote] ? text : result;
2078
+ return result;
2079
+ },
2080
+ getMaxLevel: function getMaxLevel(text, leftQuote, rightQuote, length) {
2081
+ var count = this.count(text);
2082
+ return count[leftQuote] === count[rightQuote] ? length : Math.min(length, MAX_LEVEL_WITH_ERRORS);
2089
2083
  }
2090
2084
  };
2091
2085
  var quote = {
@@ -2137,15 +2131,6 @@
2137
2131
 
2138
2132
  Typograf.addRules([apostrophe, delDoublePunctuation, hellip, quote, quoteLink]);
2139
2133
 
2140
- var afterPunctuation = {
2141
- name: 'common/space/afterPunctuation',
2142
- handler: function handler(text) {
2143
- var reExcl = new RegExp('(!|;|\\?)([^).…!;?\\s[\\])' + privateLabel + getData('common/quote') + '])', 'g');
2144
- var reComma = new RegExp('(\\D)(,|:)([^)",:.?\\s\\/\\\\' + privateLabel + '])', 'g');
2145
- return text.replace(reExcl, '$1 $2').replace(reComma, '$1$2 $3');
2146
- }
2147
- };
2148
-
2149
2134
  var beforeBracket = {
2150
2135
  name: 'common/space/beforeBracket',
2151
2136
  handler: function handler(text, settings, context) {
@@ -2277,7 +2262,49 @@
2277
2262
  }
2278
2263
  };
2279
2264
 
2280
- Typograf.addRules([afterPunctuation, beforeBracket, bracket, delBeforeDot, delBeforePercent, delBeforePunctuation, delBetweenExclamationMarks, delLeadingBlanks, delRepeatN, delRepeatSpace, delTrailingBlanks, insertFinalNewline, replaceTab, squareBracket, trimLeft, trimRight]);
2265
+ var reColon = new RegExp('(\\D):([^)",:.?\\s\\/\\\\' + privateLabel + '])', 'g');
2266
+ var afterColon = {
2267
+ name: 'common/space/afterColon',
2268
+ handler: function handler(text) {
2269
+ return text.replace(reColon, '$1: $2');
2270
+ }
2271
+ };
2272
+
2273
+ var reComma = new RegExp('(.),([^)",:.?\\s\\/\\\\' + privateLabel + '])', 'g');
2274
+ var afterComma = {
2275
+ name: 'common/space/afterComma',
2276
+ handler: function handler(text) {
2277
+ return text.replace(reComma, function ($0, $1, $2) {
2278
+ return isDigit($1) && isDigit($2) ? $0 : $1 + ', ' + $2;
2279
+ });
2280
+ }
2281
+ };
2282
+
2283
+ var reQuestionMark = new RegExp('\\?([^).…!;?\\s[\\])' + privateLabel + getData('common/quote') + '])', 'g');
2284
+ var afterQuestionMark = {
2285
+ name: 'common/space/afterQuestionMark',
2286
+ handler: function handler(text) {
2287
+ return text.replace(reQuestionMark, '? $1');
2288
+ }
2289
+ };
2290
+
2291
+ var reExclamationMark = new RegExp('!([^).…!;?\\s[\\])' + privateLabel + getData('common/quote') + '])', 'g');
2292
+ var afterExclamationMark = {
2293
+ name: 'common/space/afterExclamationMark',
2294
+ handler: function handler(text) {
2295
+ return text.replace(reExclamationMark, '! $1');
2296
+ }
2297
+ };
2298
+
2299
+ var reSemicolon = new RegExp(';([^).…!;?\\s[\\])' + privateLabel + getData('common/quote') + '])', 'g');
2300
+ var afterSemicolon = {
2301
+ name: 'common/space/afterSemicolon',
2302
+ handler: function handler(text) {
2303
+ return text.replace(reSemicolon, '; $1');
2304
+ }
2305
+ };
2306
+
2307
+ Typograf.addRules([afterColon, afterComma, afterQuestionMark, afterExclamationMark, afterSemicolon, beforeBracket, bracket, delBeforeDot, delBeforePercent, delBeforePunctuation, delBetweenExclamationMarks, delLeadingBlanks, delRepeatN, delRepeatSpace, delTrailingBlanks, insertFinalNewline, replaceTab, squareBracket, trimLeft, trimRight]);
2281
2308
 
2282
2309
  var arrow = {
2283
2310
  name: 'common/symbols/arrow',
@@ -2649,7 +2676,7 @@
2649
2676
  var spaces = "\xA0\u202F "; // nbsp, thinsp
2650
2677
 
2651
2678
  var quote = getData('ru/quote');
2652
- var re = new RegExp('(^|[' + spaces + quote.left + privateLabel + '"])([А-ЯЁ])\\.[' + spaces + ']?([А-ЯЁ])\\.[' + spaces + ']?([А-ЯЁ][а-яё]+)(?=[\\s.,;:?!"' + quote.right + ']|$)', 'gm');
2679
+ var re = new RegExp('(^|[' + spaces + quote.left + privateLabel + '"])([А-ЯЁ])\\.[' + spaces + ']?([А-ЯЁ])\\.[' + spaces + ']?([А-ЯЁ][а-яё]+)(?=[\\s.,;:?!"' + quote.right + privateLabel + ']|$)', 'gm');
2653
2680
  return text.replace(re, "$1$2.\xA0$3.\xA0$4");
2654
2681
  }
2655
2682
  };
@@ -3009,11 +3036,9 @@
3009
3036
  var ano = {
3010
3037
  name: 'ru/punctuation/ano',
3011
3038
  handler: function handler(text) {
3012
- var re = new RegExp("([^\xAB\u201E[(!?,:;\\-\u2012\u2013\u2014\\s])(\\s+)(\u0430|\u043D\u043E)(?= |\xA0|\\n)", 'g');
3039
+ var re = new RegExp('([^«„[(!?,:;\\-‒–—\\s' + privateLabel + "])(\\s+)(\u0430|\u043D\u043E)(?= |\xA0|\\n)", 'g');
3013
3040
  return text.replace(re, '$1,$2$3');
3014
- },
3015
- // Запятая может идти после ссылки.
3016
- queue: 'hide-safe-tags-html'
3041
+ }
3017
3042
  };
3018
3043
 
3019
3044
  var exclamation = {
@@ -3217,9 +3242,25 @@
3217
3242
  "en-US": "Removal quotes outside a link",
3218
3243
  "ru": "Вынос кавычек за пределы ссылки"
3219
3244
  },
3220
- "common/space/afterPunctuation": {
3221
- "en-US": "space after punctuation",
3222
- "ru": "Пробел после знаков пунктуации"
3245
+ "common/space/afterColon": {
3246
+ "en-US": "space after colon",
3247
+ "ru": "Пробел после двоеточия"
3248
+ },
3249
+ "common/space/afterComma": {
3250
+ "en-US": "space after comma",
3251
+ "ru": "Пробел после запятой"
3252
+ },
3253
+ "common/space/afterExclamationMark": {
3254
+ "en-US": "space after exclamation mark",
3255
+ "ru": "Пробел после знака восклицания"
3256
+ },
3257
+ "common/space/afterQuestionMark": {
3258
+ "en-US": "space after question mark",
3259
+ "ru": "Пробел после знака вопроса"
3260
+ },
3261
+ "common/space/afterSemicolon": {
3262
+ "en-US": "space after semicolon",
3263
+ "ru": "Пробел после точки с запятой"
3223
3264
  },
3224
3265
  "common/space/beforeBracket": {
3225
3266
  "en-US": "Space before opening bracket",