de-compromise 0.0.4 → 0.0.6

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.
@@ -53,6 +53,8 @@
53
53
  };
54
54
  var compute$9 = fns$4;
55
55
 
56
+ // wrappers for loops in javascript arrays
57
+
56
58
  const forEach = function (cb) {
57
59
  let ptrs = this.fullPointer;
58
60
  ptrs.forEach((ptr, i) => {
@@ -64,11 +66,14 @@
64
66
 
65
67
  const map = function (cb, empty) {
66
68
  let ptrs = this.fullPointer;
67
- // let cache = this._cache || []
68
69
  let res = ptrs.map((ptr, i) => {
69
70
  let view = this.update([ptr]);
70
- // view._cache = cache[i]
71
- return cb(view, i)
71
+ let out = cb(view, i);
72
+ // if we returned nothing, return a view
73
+ if (out === undefined) {
74
+ return this.none()
75
+ }
76
+ return out
72
77
  });
73
78
  if (res.length === 0) {
74
79
  return empty || this.update([])
@@ -95,23 +100,18 @@
95
100
 
96
101
  const filter = function (cb) {
97
102
  let ptrs = this.fullPointer;
98
- // let cache = this._cache || []
99
103
  ptrs = ptrs.filter((ptr, i) => {
100
104
  let view = this.update([ptr]);
101
- // view._cache = cache[i]
102
105
  return cb(view, i)
103
106
  });
104
- let res = this.update(ptrs); //TODO: keep caches automatically
105
- // res._cache = ptrs.map(ptr => cache[ptr[0]])
107
+ let res = this.update(ptrs);
106
108
  return res
107
109
  };
108
110
 
109
111
  const find = function (cb) {
110
112
  let ptrs = this.fullPointer;
111
- // let cache = this._cache || []
112
113
  let found = ptrs.find((ptr, i) => {
113
114
  let view = this.update([ptr]);
114
- // view._cache = cache[i]
115
115
  return cb(view, i)
116
116
  });
117
117
  return this.update([found])
@@ -119,10 +119,8 @@
119
119
 
120
120
  const some = function (cb) {
121
121
  let ptrs = this.fullPointer;
122
- // let cache = this._cache || []
123
122
  return ptrs.some((ptr, i) => {
124
123
  let view = this.update([ptr]);
125
- // view._cache = cache[i]
126
124
  return cb(view, i)
127
125
  })
128
126
  };
@@ -176,14 +174,11 @@
176
174
  /** */
177
175
  eq: function (n) {
178
176
  let ptr = this.pointer;
179
- let cache = this._cache || [];
180
177
  if (!ptr) {
181
178
  ptr = this.docs.map((_doc, i) => [i]);
182
179
  }
183
180
  if (ptr[n]) {
184
- let view = this.update([ptr[n]]);
185
- view._cache = cache[n];
186
- return view
181
+ return this.update([ptr[n]])
187
182
  }
188
183
  return this.none()
189
184
  },
@@ -268,7 +263,7 @@
268
263
 
269
264
  // aliases
270
265
  methods$l.get = methods$l.eq;
271
- var api$d = methods$l;
266
+ var api$f = methods$l;
272
267
 
273
268
  class View {
274
269
  constructor(document, pointer, groups = {}) {
@@ -342,31 +337,27 @@
342
337
  update(pointer) {
343
338
  let m = new View(this.document, pointer);
344
339
  // send the cache down, too?
345
- if (m._cache && pointer && pointer.length > 1) {
346
- // only if it's full
340
+ if (this._cache && pointer && pointer.length > 0) {
341
+ // only keep cache if it's a full-sentence
347
342
  let cache = [];
348
- pointer.forEach(ptr => {
343
+ pointer.forEach((ptr, i) => {
344
+ let [n, start, end] = ptr;
349
345
  if (ptr.length === 1) {
350
- cache.push(m._cache[ptr[0]]);
346
+ cache[i] = this._cache[n];
347
+ } else if (start === 0 && this.document[n].length === end) {
348
+ cache[i] = this._cache[n];
351
349
  }
352
- // let [n, start, end] = ptr
353
- // if (start === 0 && this.document[n][end - 1] && !this.document[n][end]) {
354
- // console.log('=-=-=-= here -=-=-=-')
355
- // }
356
350
  });
357
- m._cache = cache;
351
+ if (cache.length > 0) {
352
+ m._cache = cache;
353
+ }
358
354
  }
359
355
  m.world = this.world;
360
356
  return m
361
357
  }
362
358
  // create a new View, from this one
363
359
  toView(pointer) {
364
- if (pointer === undefined) {
365
- pointer = this.pointer;
366
- }
367
- let m = new View(this.document, pointer);
368
- // m._cache = this._cache // share this full thing
369
- return m
360
+ return new View(this.document, pointer || this.pointer)
370
361
  }
371
362
  fromText(input) {
372
363
  const { methods } = this;
@@ -397,10 +388,10 @@
397
388
  return m
398
389
  }
399
390
  }
400
- Object.assign(View.prototype, api$d);
391
+ Object.assign(View.prototype, api$f);
401
392
  var View$1 = View;
402
393
 
403
- var version$1 = '14.3.1';
394
+ var version$1 = '14.6.0';
404
395
 
405
396
  const isObject$6 = function (item) {
406
397
  return item && typeof item === 'object' && !Array.isArray(item)
@@ -435,6 +426,54 @@
435
426
  return model
436
427
  }
437
428
 
429
+ const addIrregulars = function (model, conj) {
430
+ let m = model.two.models || {};
431
+ Object.keys(conj).forEach(k => {
432
+ // verb forms
433
+ if (conj[k].pastTense) {
434
+ if (m.toPast) {
435
+ m.toPast.exceptions[k] = conj[k].pastTense;
436
+ }
437
+ if (m.fromPast) {
438
+ m.fromPast.exceptions[conj[k].pastTense] = k;
439
+ }
440
+ }
441
+ if (conj[k].presentTense) {
442
+ if (m.toPresent) {
443
+ m.toPresent.exceptions[k] = conj[k].presentTense;
444
+ }
445
+ if (m.fromPresent) {
446
+ m.fromPresent.exceptions[conj[k].presentTense] = k;
447
+ }
448
+ }
449
+ if (conj[k].gerund) {
450
+ if (m.toGerund) {
451
+ m.toGerund.exceptions[k] = conj[k].gerund;
452
+ }
453
+ if (m.fromGerund) {
454
+ m.fromGerund.exceptions[conj[k].gerund] = k;
455
+ }
456
+ }
457
+ // adjective forms
458
+ if (conj[k].comparative) {
459
+ if (m.toComparative) {
460
+ m.toComparative.exceptions[k] = conj[k].comparative;
461
+ }
462
+ if (m.fromComparative) {
463
+ m.fromComparative.exceptions[conj[k].comparative] = k;
464
+ }
465
+ }
466
+ if (conj[k].superlative) {
467
+ if (m.toSuperlative) {
468
+ m.toSuperlative.exceptions[k] = conj[k].superlative;
469
+ }
470
+ if (m.fromSuperlative) {
471
+ m.fromSuperlative.exceptions[conj[k].superlative] = k;
472
+ }
473
+ }
474
+ });
475
+ };
476
+
438
477
  const extend = function (plugin, world, View, nlp) {
439
478
  const { methods, model, compute, hooks } = world;
440
479
  if (plugin.methods) {
@@ -443,6 +482,9 @@
443
482
  if (plugin.model) {
444
483
  mergeDeep(model, plugin.model);
445
484
  }
485
+ if (plugin.irregulars) {
486
+ addIrregulars(model, plugin.irregulars);
487
+ }
446
488
  // shallow-merge compute
447
489
  if (plugin.compute) {
448
490
  Object.assign(compute, plugin.compute);
@@ -583,7 +625,6 @@
583
625
  return doc
584
626
  };
585
627
 
586
-
587
628
  /** extend compromise functionality */
588
629
  nlp.plugin = function (plugin) {
589
630
  extend$1(plugin, this._world, View$1, this);
@@ -671,7 +712,7 @@
671
712
  const addAPI$3 = function (View) {
672
713
  Object.assign(View.prototype, methods$j);
673
714
  };
674
- var api$c = addAPI$3;
715
+ var api$e = addAPI$3;
675
716
 
676
717
  var compute$8 = {
677
718
  cache: function (view) {
@@ -680,7 +721,7 @@
680
721
  };
681
722
 
682
723
  var cache$1 = {
683
- api: api$c,
724
+ api: api$e,
684
725
  compute: compute$8,
685
726
  methods: methods$k,
686
727
  };
@@ -859,7 +900,7 @@
859
900
  after 46-thousand sentences
860
901
 
861
902
  */
862
- let start$1 = 0;
903
+ let index$2 = 0;
863
904
 
864
905
  const pad3 = (str) => {
865
906
  str = str.length < 3 ? '0' + str : str;
@@ -868,19 +909,17 @@
868
909
 
869
910
  const toId = function (term) {
870
911
  let [n, i] = term.index || [0, 0];
871
- start$1 += 1;
872
- var now = start$1;
873
- now = parseInt(now, 10);
912
+ index$2 += 1;
874
913
 
875
- //don't overflow time
876
- now = now > 46655 ? 46655 : now;
914
+ //don't overflow index
915
+ index$2 = index$2 > 46655 ? 0 : index$2;
877
916
  //don't overflow sentences
878
- n = n > 46655 ? 46655 : n;
917
+ n = n > 46655 ? 0 : n;
879
918
  // //don't overflow terms
880
- i = i > 1294 ? 1294 : i;
919
+ i = i > 1294 ? 0 : i;
881
920
 
882
921
  // 3 digits for time
883
- let id = pad3(now.toString(36));
922
+ let id = pad3(index$2.toString(36));
884
923
  // 3 digit for sentence index (46k)
885
924
  id += pad3(n.toString(36));
886
925
 
@@ -903,7 +942,7 @@
903
942
  // are we inserting inside a contraction?
904
943
  // expand it first
905
944
  const expand$2 = function (m) {
906
- if (m.has('@hasContraction')) {//&& m.after('^.').has('@hasContraction')
945
+ if (m.has('@hasContraction') && typeof m.contractions === 'function') {//&& m.after('^.').has('@hasContraction')
907
946
  let more = m.grow('@hasContraction');
908
947
  more.contractions().expand();
909
948
  }
@@ -928,7 +967,7 @@
928
967
  }
929
968
  //allow a view object
930
969
  if (typeof input === 'object' && input.isView) {
931
- return input.clone().docs[0] //assume one sentence
970
+ return input.clone().docs[0] || [] //assume one sentence
932
971
  }
933
972
  //allow an array of terms, too
934
973
  if (isArray$7(input)) {
@@ -939,6 +978,7 @@
939
978
 
940
979
  const insert = function (input, view, prepend) {
941
980
  const { document, world } = view;
981
+ view.uncache();
942
982
  // insert words at end of each doc
943
983
  let ptrs = view.fullPointer;
944
984
  let selfPtrs = view.fullPointer;
@@ -948,6 +988,10 @@
948
988
  // add-in the words
949
989
  let home = document[n];
950
990
  let terms = getTerms(input, world);
991
+ // are we inserting nothing?
992
+ if (terms.length === 0) {
993
+ return
994
+ }
951
995
  terms = addIds$2(terms);
952
996
  if (prepend) {
953
997
  expand$2(view.update([ptr]).firstTerm());
@@ -1027,6 +1071,7 @@
1027
1071
  fns$2.replaceWith = function (input, keep = {}) {
1028
1072
  let ptrs = this.fullPointer;
1029
1073
  let main = this;
1074
+ this.uncache();
1030
1075
  if (typeof input === 'function') {
1031
1076
  return replaceByFn(main, input)
1032
1077
  }
@@ -1073,6 +1118,7 @@
1073
1118
  if (!m.found) {
1074
1119
  return this
1075
1120
  }
1121
+ this.soften();
1076
1122
  return m.replaceWith(input, keep)
1077
1123
  };
1078
1124
  var replace = fns$2;
@@ -1172,6 +1218,7 @@
1172
1218
  /** */
1173
1219
  remove: function (reg) {
1174
1220
  const { indexN } = this.methods.one.pointer;
1221
+ this.uncache();
1175
1222
  // two modes:
1176
1223
  // - a. remove self, from full parent
1177
1224
  let self = this.all();
@@ -1181,9 +1228,10 @@
1181
1228
  self = this;
1182
1229
  not = this.match(reg);
1183
1230
  }
1231
+ let isFull = !self.ptrs;
1184
1232
  // is it part of a contraction?
1185
- if (self.has('@hasContraction') && self.contractions) {
1186
- let more = self.grow('@hasContraction');
1233
+ if (not.has('@hasContraction') && not.contractions) {
1234
+ let more = not.grow('@hasContraction');
1187
1235
  more.contractions().expand();
1188
1236
  }
1189
1237
 
@@ -1194,16 +1242,18 @@
1194
1242
  // repair our pointers
1195
1243
  let gonePtrs = indexN(nots);
1196
1244
  ptrs = fixPointers$1(ptrs, gonePtrs);
1197
-
1198
1245
  // clean up our original inputs
1199
1246
  self.ptrs = ptrs;
1200
1247
  self.document = document;
1201
1248
  self.compute('index');
1249
+ // if we started zoomed-out, try to end zoomed-out
1250
+ if (isFull) {
1251
+ self.ptrs = undefined;
1252
+ }
1202
1253
  if (!reg) {
1203
1254
  this.ptrs = [];
1204
1255
  return self.none()
1205
1256
  }
1206
- // self._cache = null
1207
1257
  let res = self.toView(ptrs); //return new document
1208
1258
  return res
1209
1259
  },
@@ -1318,7 +1368,7 @@
1318
1368
  methods$h.deHyphenate = methods$h.dehyphenate;
1319
1369
  methods$h.toQuotation = methods$h.toQuotations;
1320
1370
 
1321
- var whitespace$1 = methods$h;
1371
+ var whitespace = methods$h;
1322
1372
 
1323
1373
  /** alphabetical order */
1324
1374
  const alpha = (a, b) => {
@@ -1410,6 +1460,7 @@
1410
1460
  /** re-arrange the order of the matches (in place) */
1411
1461
  const sort = function (input) {
1412
1462
  let { docs, pointer } = this;
1463
+ this.uncache();
1413
1464
  if (typeof input === 'function') {
1414
1465
  return customSort(this, input)
1415
1466
  }
@@ -1449,6 +1500,9 @@
1449
1500
  let ptrs = this.pointer || this.docs.map((_d, n) => [n]);
1450
1501
  ptrs = [].concat(ptrs);
1451
1502
  ptrs = ptrs.reverse();
1503
+ if (this._cache) {
1504
+ this._cache = this._cache.reverse();
1505
+ }
1452
1506
  return this.update(ptrs)
1453
1507
  };
1454
1508
 
@@ -1541,12 +1595,12 @@
1541
1595
  };
1542
1596
  var harden$1 = { harden, soften };
1543
1597
 
1544
- const methods$f = Object.assign({}, caseFns, insert$1, replace, remove, whitespace$1, sort$1, concat, harden$1);
1598
+ const methods$f = Object.assign({}, caseFns, insert$1, replace, remove, whitespace, sort$1, concat, harden$1);
1545
1599
 
1546
1600
  const addAPI$2 = function (View) {
1547
1601
  Object.assign(View.prototype, methods$f);
1548
1602
  };
1549
- var api$b = addAPI$2;
1603
+ var api$d = addAPI$2;
1550
1604
 
1551
1605
  const compute$6 = {
1552
1606
  id: function (view) {
@@ -1563,7 +1617,7 @@
1563
1617
  var compute$7 = compute$6;
1564
1618
 
1565
1619
  var change = {
1566
- api: api$b,
1620
+ api: api$d,
1567
1621
  compute: compute$7,
1568
1622
  };
1569
1623
 
@@ -1793,6 +1847,37 @@
1793
1847
  };
1794
1848
  var numberRange$1 = numberRange;
1795
1849
 
1850
+ const numUnit = /^([+-]?[0-9][.,0-9]*)([a-z°²³µ/]+)$/; //(must be lowercase)
1851
+
1852
+ const notUnit = new Set([
1853
+ 'st',
1854
+ 'nd',
1855
+ 'rd',
1856
+ 'th',
1857
+ 'am',
1858
+ 'pm',
1859
+ 'max',
1860
+ '°',
1861
+ 's', // 1990s
1862
+ 'e' // 18e - french/spanish ordinal
1863
+ ]);
1864
+
1865
+ const numberUnit = function (terms, i) {
1866
+ let term = terms[i];
1867
+ let parts = term.text.match(numUnit);
1868
+ if (parts !== null) {
1869
+ // is it a recognized unit, like 'km'?
1870
+ let unit = parts[2].toLowerCase().trim();
1871
+ // don't split '3rd'
1872
+ if (notUnit.has(unit)) {
1873
+ return null
1874
+ }
1875
+ return [parts[1], unit] //split it
1876
+ }
1877
+ return null
1878
+ };
1879
+ var numberUnit$1 = numberUnit;
1880
+
1796
1881
  const byApostrophe = /'/;
1797
1882
  const numDash = /^[0-9][^-–—]*[-–—].*?[0-9]/;
1798
1883
 
@@ -1809,10 +1894,6 @@
1809
1894
  end += 1;
1810
1895
  }
1811
1896
  tmp.ptrs = [[0, start, end]];
1812
- tmp.compute('lexicon');
1813
- if (tmp.world.compute.preTagger) {
1814
- tmp.compute('preTagger');
1815
- }
1816
1897
  };
1817
1898
 
1818
1899
  const byEnd = {
@@ -1854,7 +1935,7 @@
1854
1935
 
1855
1936
  const toDocs = function (words, view) {
1856
1937
  let doc = view.fromText(words.join(' '));
1857
- doc.compute('id');
1938
+ doc.compute(['id', 'alias']);
1858
1939
  return doc.docs[0]
1859
1940
  };
1860
1941
 
@@ -1863,6 +1944,7 @@
1863
1944
  let { world, document } = view;
1864
1945
  const { model, methods } = world;
1865
1946
  let list = model.one.contractions || [];
1947
+ new Set(model.one.units || []);
1866
1948
  // each sentence
1867
1949
  document.forEach((terms, n) => {
1868
1950
  // loop through terms backwards
@@ -1898,10 +1980,18 @@
1898
1980
  methods.one.setTag(words, 'NumberRange', world);//add custom tag
1899
1981
  // is it a time-range, like '5-9pm'
1900
1982
  if (words[2] && words[2].tags.has('Time')) {
1901
- methods.one.setTag([words[0]], 'Time', world);
1983
+ methods.one.setTag([words[0]], 'Time', world, null, 'time-range');
1902
1984
  }
1903
1985
  reTag(document[n], view, i, words.length);
1904
1986
  }
1987
+ continue
1988
+ }
1989
+ // split-apart '4km'
1990
+ words = numberUnit$1(terms, i);
1991
+ if (words) {
1992
+ words = toDocs(words, view);
1993
+ splice(document, [n, i], words);
1994
+ methods.one.setTag([words[1]], 'Unit', world, null, 'contraction-unit');
1905
1995
  }
1906
1996
  }
1907
1997
  });
@@ -2002,7 +2092,7 @@
2002
2092
 
2003
2093
  // tag any words in our lexicon - even if it hasn't been filled-up yet
2004
2094
  // rest of pre-tagger is in ./two/preTagger
2005
- const firstPass$1 = function (view) {
2095
+ const lexicon$5 = function (view) {
2006
2096
  const world = view.world;
2007
2097
  view.docs.forEach(terms => {
2008
2098
  for (let i = 0; i < terms.length; i += 1) {
@@ -2017,7 +2107,7 @@
2017
2107
  };
2018
2108
 
2019
2109
  var compute$4 = {
2020
- lexicon: firstPass$1
2110
+ lexicon: lexicon$5
2021
2111
  };
2022
2112
 
2023
2113
  // derive clever things from our lexicon key-value pairs
@@ -2026,12 +2116,12 @@
2026
2116
  let lex = {};
2027
2117
  // console.log('start:', Object.keys(lex).length)
2028
2118
  let _multi = {};
2029
-
2030
2119
  // go through each word in this key-value obj:
2031
2120
  Object.keys(words).forEach(word => {
2032
2121
  let tag = words[word];
2033
2122
  // normalize lexicon a little bit
2034
2123
  word = word.toLowerCase().trim();
2124
+ word = word.replace(/'s\b/, '');
2035
2125
  // cache multi-word terms
2036
2126
  let split = word.split(/ /);
2037
2127
  if (split.length > 1) {
@@ -2241,7 +2331,7 @@
2241
2331
  return Object.prototype.toString.call(val) === '[object Object]'
2242
2332
  };
2243
2333
 
2244
- function api$a (View) {
2334
+ function api$c (View) {
2245
2335
 
2246
2336
  /** find all matches in this document */
2247
2337
  View.prototype.lookup = function (input, opts = {}) {
@@ -2290,14 +2380,16 @@
2290
2380
  /** pre-compile a list of matches to lookup */
2291
2381
  const lib$4 = {
2292
2382
  /** turn an array or object into a compressed trie*/
2293
- compile: function (input) {
2383
+ buildTrie: function (input) {
2294
2384
  const trie = build(input, this.world());
2295
2385
  return compress$1(trie)
2296
2386
  }
2297
2387
  };
2388
+ // add alias
2389
+ lib$4.compile = lib$4.buildTrie;
2298
2390
 
2299
2391
  var lookup = {
2300
- api: api$a,
2392
+ api: api$c,
2301
2393
  lib: lib$4
2302
2394
  };
2303
2395
 
@@ -2348,6 +2440,19 @@
2348
2440
  // return false
2349
2441
  // }
2350
2442
 
2443
+ const parseRegs = function (regs, opts, world) {
2444
+ const one = world.methods.one;
2445
+ if (typeof regs === 'number') {
2446
+ regs = String(regs);
2447
+ }
2448
+ // support param as string
2449
+ if (typeof regs === 'string') {
2450
+ regs = one.killUnicode(regs, world);
2451
+ regs = one.parseMatch(regs, opts, world);
2452
+ }
2453
+ return regs
2454
+ };
2455
+
2351
2456
  const match$2 = function (regs, group, opts) {
2352
2457
  const one = this.methods.one;
2353
2458
  // support param as view object
@@ -2358,25 +2463,12 @@
2358
2463
  if (isNet(regs)) {
2359
2464
  return this.sweep(regs, { tagger: false }).view.settle()
2360
2465
  }
2361
- // support param as string
2362
- if (typeof regs === 'string') {
2363
- regs = one.killUnicode(regs, this.world);
2364
- regs = one.parseMatch(regs, opts, this.world);
2365
- }
2466
+ regs = parseRegs(regs, opts, this.world);
2366
2467
  let todo = { regs, group };
2367
2468
  let res = one.match(this.docs, todo, this._cache);
2368
2469
  let { ptrs, byGroup } = fixPointers(res, this.fullPointer);
2369
2470
  let view = this.toView(ptrs);
2370
2471
  view._groups = byGroup;
2371
- // try to keep some of the cache
2372
- // if (this._cache) {
2373
- // view._cache = view.ptrs.map(ptr => {
2374
- // if (isFull(ptr, this.document)) {
2375
- // return this._cache[ptr[0]]
2376
- // }
2377
- // return null
2378
- // })
2379
- // }
2380
2472
  return view
2381
2473
  };
2382
2474
 
@@ -2390,10 +2482,7 @@
2390
2482
  if (isNet(regs)) {
2391
2483
  return this.sweep(regs, { tagger: false, matchOne: true }).view
2392
2484
  }
2393
- if (typeof regs === 'string') {
2394
- regs = one.killUnicode(regs, this.world);
2395
- regs = one.parseMatch(regs, opts, this.world);
2396
- }
2485
+ regs = parseRegs(regs, opts, this.world);
2397
2486
  let todo = { regs, group, justOne: true };
2398
2487
  let res = one.match(this.docs, todo, this._cache);
2399
2488
  let { ptrs, byGroup } = fixPointers(res, this.fullPointer);
@@ -2413,10 +2502,7 @@
2413
2502
  if (isNet(regs)) {
2414
2503
  return this.sweep(regs, { tagger: false }).view.found
2415
2504
  }
2416
- if (typeof regs === 'string') {
2417
- regs = one.killUnicode(regs, this.world);
2418
- regs = one.parseMatch(regs, opts, this.world);
2419
- }
2505
+ regs = parseRegs(regs, opts, this.world);
2420
2506
  let todo = { regs, group, justOne: true };
2421
2507
  let ptrs = one.match(this.docs, todo, this._cache).ptrs;
2422
2508
  return ptrs.length > 0
@@ -2434,10 +2520,7 @@
2434
2520
  let m = this.sweep(regs, { tagger: false }).view.settle();
2435
2521
  return this.if(m)//recurse with result
2436
2522
  }
2437
- if (typeof regs === 'string') {
2438
- regs = one.killUnicode(regs, this.world);
2439
- regs = one.parseMatch(regs, opts, this.world);
2440
- }
2523
+ regs = parseRegs(regs, opts, this.world);
2441
2524
  let todo = { regs, group, justOne: true };
2442
2525
  let ptrs = this.fullPointer;
2443
2526
  let cache = this._cache || [];
@@ -2467,10 +2550,7 @@
2467
2550
  return this.ifNo(m)
2468
2551
  }
2469
2552
  // otherwise parse the match string
2470
- if (typeof regs === 'string') {
2471
- regs = one.killUnicode(regs, this.world);
2472
- regs = one.parseMatch(regs, opts, this.world);
2473
- }
2553
+ regs = parseRegs(regs, opts, this.world);
2474
2554
  let cache = this._cache || [];
2475
2555
  let view = this.filter((m, i) => {
2476
2556
  let todo = { regs, group, justOne: true };
@@ -2669,7 +2749,7 @@
2669
2749
  const matchAPI = function (View) {
2670
2750
  Object.assign(View.prototype, methods$c);
2671
2751
  };
2672
- var api$9 = matchAPI;
2752
+ var api$b = matchAPI;
2673
2753
 
2674
2754
  // match 'foo /yes/' and not 'foo/no/bar'
2675
2755
  const bySlashes = /(?:^|\s)([![^]*(?:<[^<]*>)?\/.*?[^\\/]\/[?\]+*$~]*)(?:\s|$)/;
@@ -2849,14 +2929,24 @@
2849
2929
  return obj
2850
2930
  }
2851
2931
 
2852
- //machine/sense overloaded
2932
+ //root/sense overloaded
2853
2933
  if (start(w) === '{' && end(w) === '}') {
2854
2934
  w = stripBoth(w);
2935
+ obj.id = w;
2936
+ obj.root = w;
2855
2937
  if (/\//.test(w)) {
2856
- obj.sense = w;
2857
- obj.greedy = true;
2858
- } else {
2859
- obj.machine = w;
2938
+ let split = obj.root.split(/\//);
2939
+ obj.root = split[0];
2940
+ obj.pos = split[1];
2941
+ if (obj.pos === 'adj') {
2942
+ obj.pos = 'Adjective';
2943
+ }
2944
+ // titlecase
2945
+ obj.pos = obj.pos.charAt(0).toUpperCase() + obj.pos.substr(1).toLowerCase();
2946
+ // add sense-number too
2947
+ if (split[2] !== undefined) {
2948
+ obj.num = split[2];
2949
+ }
2860
2950
  }
2861
2951
  return obj
2862
2952
  }
@@ -2965,6 +3055,80 @@
2965
3055
  };
2966
3056
  var splitHyphens$2 = splitHyphens$1;
2967
3057
 
3058
+ // add all conjugations of this verb
3059
+ const addVerbs = function (token, world) {
3060
+ let { all } = world.methods.two.transform.verb || {};
3061
+ let str = token.root;
3062
+ // if (toInfinitive) {
3063
+ // str = toInfinitive(str, world.model)
3064
+ // }
3065
+ if (!all) {
3066
+ return []
3067
+ }
3068
+ return all(str, world.model)
3069
+ };
3070
+
3071
+ // add all inflections of this noun
3072
+ const addNoun = function (token, world) {
3073
+ let { all } = world.methods.two.transform.noun || {};
3074
+ if (!all) {
3075
+ return [token.root]
3076
+ }
3077
+ return all(token.root, world.model)
3078
+ };
3079
+
3080
+ // add all inflections of this adjective
3081
+ const addAdjective = function (token, world) {
3082
+ let { all } = world.methods.two.transform.adjective || {};
3083
+ if (!all) {
3084
+ return [token.root]
3085
+ }
3086
+ return all(token.root, world.model)
3087
+ };
3088
+
3089
+ // turn '{walk}' into 'walking', 'walked', etc
3090
+ const inflectRoot = function (regs, world) {
3091
+ // do we have compromise/two?
3092
+ regs = regs.map(token => {
3093
+ // a reg to convert '{foo}'
3094
+ if (token.root) {
3095
+ // check if compromise/two is loaded
3096
+ if (world.methods.two && world.methods.two.transform) {
3097
+ let choices = [];
3098
+ // have explicitly set from POS - '{sweet/adjective}'
3099
+ if (token.pos) {
3100
+ if (token.pos === 'Verb') {
3101
+ choices = choices.concat(addVerbs(token, world));
3102
+ } else if (token.pos === 'Noun') {
3103
+ choices = choices.concat(addNoun(token, world));
3104
+ } else if (token.pos === 'Adjective') {
3105
+ choices = choices.concat(addAdjective(token, world));
3106
+ }
3107
+ } else {
3108
+ // do verb/noun/adj by default
3109
+ choices = choices.concat(addVerbs(token, world));
3110
+ choices = choices.concat(addNoun(token, world));
3111
+ choices = choices.concat(addAdjective(token, world));
3112
+ }
3113
+ choices = choices.filter(str => str);
3114
+ if (choices.length > 0) {
3115
+ token.operator = 'or';
3116
+ token.fastOr = new Set(choices);
3117
+ }
3118
+ } else {
3119
+ // if no compromise/two, drop down into 'machine' lookup
3120
+ token.machine = token.root;
3121
+ delete token.id;
3122
+ delete token.root;
3123
+ }
3124
+ }
3125
+ return token
3126
+ });
3127
+
3128
+ return regs
3129
+ };
3130
+ var inflectRoot$1 = inflectRoot;
3131
+
2968
3132
  // name any [unnamed] capture-groups with a number
2969
3133
  const nameGroups = function (regs) {
2970
3134
  let index = 0;
@@ -3073,6 +3237,8 @@
3073
3237
  tokens = tokens.map(str => parseToken$1(str, opts));
3074
3238
  // '~re-do~'
3075
3239
  tokens = splitHyphens$2(tokens, world);
3240
+ // '{walk}'
3241
+ tokens = inflectRoot$1(tokens, world);
3076
3242
  //clean up anything weird
3077
3243
  tokens = postProcess$1(tokens);
3078
3244
  // console.log(tokens)
@@ -3193,7 +3359,7 @@
3193
3359
  const endQuote = /([\u0022\uFF02\u0027\u201D\u2019\u00BB\u203A\u2032\u2033\u2034\u301E\u00B4])/;
3194
3360
 
3195
3361
  const hasHyphen$1 = /^[-–—]$/;
3196
- const hasDash$1 = / [-–—] /;
3362
+ const hasDash$1 = / [-–—]{1,3} /;
3197
3363
 
3198
3364
  /** search the term's 'post' punctuation */
3199
3365
  const hasPost = (term, punct) => term.post.indexOf(punct) !== -1;
@@ -3215,6 +3381,8 @@
3215
3381
  hasEllipses: term => hasPost(term, '..') || hasPost(term, '…') || hasPre(term, '..') || hasPre(term, '…'),
3216
3382
  /** is there a semicolon after term word? */
3217
3383
  hasSemicolon: term => hasPost(term, ';'),
3384
+ /** is there a colon after term word? */
3385
+ hasColon: term => hasPost(term, ':'),
3218
3386
  /** is there a slash '/' in term word? */
3219
3387
  hasSlash: term => /\//.test(term.text),
3220
3388
  /** a hyphen connects two words like-term */
@@ -3328,6 +3496,10 @@
3328
3496
  }
3329
3497
  // support optimized (one|two)
3330
3498
  if (reg.fastOr !== undefined) {
3499
+ // {work/verb} must be a verb
3500
+ if (reg.pos && !term.tags.has(reg.pos)) {
3501
+ return null
3502
+ }
3331
3503
  return reg.fastOr.has(term.implicit) || reg.fastOr.has(term.normal) || reg.fastOr.has(term.text) || reg.fastOr.has(term.machine)
3332
3504
  }
3333
3505
  //support slower (one|two)
@@ -3593,17 +3765,82 @@
3593
3765
  };
3594
3766
  var doAndBlock = andBlock;
3595
3767
 
3768
+ const negGreedy = function (state, reg, nextReg) {
3769
+ let skip = 0;
3770
+ for (let t = state.t; t < state.terms.length; t += 1) {
3771
+ let found = matchTerm(state.terms[t], reg, state.start_i + state.t, state.phrase_length);
3772
+ // we don't want a match, here
3773
+ if (found) {
3774
+ break//stop going
3775
+ }
3776
+ // are we doing 'greedy-to'?
3777
+ // - "!foo+ after" should stop at 'after'
3778
+ if (nextReg) {
3779
+ found = matchTerm(state.terms[t], nextReg, state.start_i + state.t, state.phrase_length);
3780
+ if (found) {
3781
+ break
3782
+ }
3783
+ }
3784
+ skip += 1;
3785
+ // is it max-length now?
3786
+ if (reg.max !== undefined && skip === reg.max) {
3787
+ break
3788
+ }
3789
+ }
3790
+ if (skip === 0) {
3791
+ return false //dead
3792
+ }
3793
+ // did we satisfy min for !foo{min,max}
3794
+ if (reg.min && reg.min > skip) {
3795
+ return false//dead
3796
+ }
3797
+ state.t += skip;
3798
+ // state.r += 1
3799
+ return true
3800
+ };
3801
+
3802
+ var negGreedy$1 = negGreedy;
3803
+
3596
3804
  // '!foo' should match anything that isn't 'foo'
3597
3805
  // if it matches, return false
3598
3806
  const doNegative = function (state) {
3599
3807
  const { regs } = state;
3600
3808
  let reg = regs[state.r];
3809
+
3810
+ // match *anything* but this term
3601
3811
  let tmpReg = Object.assign({}, reg);
3602
3812
  tmpReg.negative = false; // try removing it
3603
- let foundNeg = matchTerm(state.terms[state.t], tmpReg, state.start_i + state.t, state.phrase_length);
3604
- if (foundNeg === true) {
3605
- return null //bye!
3813
+
3814
+ // found it? if so, we die here
3815
+ let found = matchTerm(state.terms[state.t], tmpReg, state.start_i + state.t, state.phrase_length);
3816
+ if (found) {
3817
+ return false//bye
3818
+ }
3819
+ // should we skip the term too?
3820
+ if (reg.optional) {
3821
+ // "before after" - "before !foo? after"
3822
+ // does the next reg match the this term?
3823
+ let nextReg = regs[state.r + 1];
3824
+ if (nextReg) {
3825
+ let fNext = matchTerm(state.terms[state.t], nextReg, state.start_i + state.t, state.phrase_length);
3826
+ if (fNext) {
3827
+ state.r += 1;
3828
+ } else if (nextReg.optional && regs[state.r + 2]) {
3829
+ // ugh. ok,
3830
+ // support "!foo? extra? need"
3831
+ // but don't scan ahead more than that.
3832
+ let fNext2 = matchTerm(state.terms[state.t], regs[state.r + 2], state.start_i + state.t, state.phrase_length);
3833
+ if (fNext2) {
3834
+ state.r += 2;
3835
+ }
3836
+ }
3837
+ }
3838
+ }
3839
+ // negative greedy - !foo+ - super hard!
3840
+ if (reg.greedy) {
3841
+ return negGreedy$1(state, tmpReg, regs[state.r + 1])
3606
3842
  }
3843
+ state.t += 1;
3607
3844
  return true
3608
3845
  };
3609
3846
  var doNegative$1 = doNegative;
@@ -3735,6 +3972,7 @@
3735
3972
  * starting at this certain term.
3736
3973
  */
3737
3974
  const tryHere = function (terms, regs, start_i, phrase_length) {
3975
+ // console.log(`\n\n:start: '${terms[0].text}':`)
3738
3976
  if (terms.length === 0 || regs.length === 0) {
3739
3977
  return null
3740
3978
  }
@@ -3797,6 +4035,10 @@
3797
4035
  }
3798
4036
  // support '.' as any-single
3799
4037
  if (reg.anything === true) {
4038
+ // '!.' negative anything should insta-fail
4039
+ if (reg.negative && reg.anything) {
4040
+ return null
4041
+ }
3800
4042
  let alive = simpleMatch$1(state);
3801
4043
  if (!alive) {
3802
4044
  return null
@@ -3811,22 +4053,27 @@
3811
4053
  }
3812
4054
  continue
3813
4055
  }
3814
- // ok, finally test the term-reg
3815
- let hasMatch = matchTerm(state.terms[state.t], reg, state.start_i + state.t, state.phrase_length);
3816
- if (hasMatch === true) {
3817
- let alive = simpleMatch$1(state);
4056
+ // ok, it doesn't match - but maybe it wasn't *supposed* to?
4057
+ if (reg.negative) {
4058
+ // we want *anything* but this term
4059
+ let alive = doNegative$1(state);
3818
4060
  if (!alive) {
3819
4061
  return null
3820
4062
  }
3821
4063
  continue
3822
4064
  }
3823
- // ok, it doesn't match - but maybe it wasn't *supposed* to?
3824
- if (reg.negative) {
3825
- let alive = doNegative$1(state);
4065
+ // ok, finally test the term-reg
4066
+ // console.log(' - ' + state.terms[state.t].text)
4067
+ let hasMatch = matchTerm(state.terms[state.t], reg, state.start_i + state.t, state.phrase_length);
4068
+ if (hasMatch === true) {
4069
+ let alive = simpleMatch$1(state);
3826
4070
  if (!alive) {
3827
4071
  return null
3828
4072
  }
4073
+ continue
3829
4074
  }
4075
+ // console.log('=-=-=-= here -=-=-=-')
4076
+
3830
4077
  //ok who cares, keep going
3831
4078
  if (reg.optional === true) {
3832
4079
  continue
@@ -3991,7 +4238,7 @@
3991
4238
  };
3992
4239
 
3993
4240
  var match = {
3994
- api: api$9,
4241
+ api: api$b,
3995
4242
  methods: methods$a,
3996
4243
  lib: lib$3,
3997
4244
  };
@@ -4601,6 +4848,9 @@
4601
4848
  if (method === 'normal') {
4602
4849
  return this.text('normal')
4603
4850
  }
4851
+ if (method === 'root') {
4852
+ return this.text('root')
4853
+ }
4604
4854
  if (method === 'machine' || method === 'reduced') {
4605
4855
  return this.text('machine')
4606
4856
  }
@@ -4678,7 +4928,7 @@
4678
4928
  if (fmt && typeof fmt === 'string' && fmts$1.hasOwnProperty(fmt)) {
4679
4929
  opts = Object.assign({}, fmts$1[fmt]);
4680
4930
  } else if (fmt && isObject$1(fmt)) {
4681
- opts = Object.assign({}, fmt, opts);//todo: fixme
4931
+ opts = Object.assign({}, opts, fmt);//todo: fixme
4682
4932
  }
4683
4933
  if (this.pointer) {
4684
4934
  opts.keepSpace = false;
@@ -4700,10 +4950,10 @@
4700
4950
  const addAPI$1 = function (View) {
4701
4951
  Object.assign(View.prototype, methods$6);
4702
4952
  };
4703
- var api$8 = addAPI$1;
4953
+ var api$a = addAPI$1;
4704
4954
 
4705
4955
  var output = {
4706
- api: api$8,
4956
+ api: api$a,
4707
4957
  methods: {
4708
4958
  one: {
4709
4959
  hash: md5
@@ -4839,7 +5089,7 @@
4839
5089
 
4840
5090
  var splitAll$1 = splitAll;
4841
5091
 
4842
- const max$1 = 4;
5092
+ const max$1 = 20;
4843
5093
 
4844
5094
  // sweep-around looking for our start term uuid
4845
5095
  const blindSweep = function (id, doc, n) {
@@ -5115,11 +5365,11 @@
5115
5365
  // add set/intersection/union
5116
5366
  Object.assign(View.prototype, methods$4);
5117
5367
  };
5118
- var api$7 = addAPI;
5368
+ var api$9 = addAPI;
5119
5369
 
5120
5370
  var pointers = {
5121
5371
  methods: methods$5,
5122
- api: api$7,
5372
+ api: api$9,
5123
5373
  };
5124
5374
 
5125
5375
  var lib$2 = {
@@ -5132,7 +5382,7 @@
5132
5382
  }
5133
5383
  };
5134
5384
 
5135
- const api$5 = function (View) {
5385
+ const api$7 = function (View) {
5136
5386
 
5137
5387
  /** speedy match a sequence of matches */
5138
5388
  View.prototype.sweep = function (net, opts = {}) {
@@ -5176,7 +5426,7 @@
5176
5426
  };
5177
5427
 
5178
5428
  };
5179
- var api$6 = api$5;
5429
+ var api$8 = api$7;
5180
5430
 
5181
5431
  // extract the clear needs for an individual match token
5182
5432
  const getTokenNeeds = function (reg) {
@@ -5240,7 +5490,7 @@
5240
5490
  return { wants, count }
5241
5491
  };
5242
5492
 
5243
- const parse$1 = function (matches, world) {
5493
+ const parse$2 = function (matches, world) {
5244
5494
  const parseMatch = world.methods.one.parseMatch;
5245
5495
  matches.forEach(obj => {
5246
5496
  obj.regs = parseMatch(obj.match, {}, world);
@@ -5259,12 +5509,12 @@
5259
5509
  return matches
5260
5510
  };
5261
5511
 
5262
- var parse$2 = parse$1;
5512
+ var parse$3 = parse$2;
5263
5513
 
5264
5514
  // do some indexing on the list of matches
5265
- const compile = function (matches, world) {
5515
+ const buildNet = function (matches, world) {
5266
5516
  // turn match-syntax into json
5267
- matches = parse$2(matches, world);
5517
+ matches = parse$3(matches, world);
5268
5518
 
5269
5519
  // collect by wants and needs
5270
5520
  let hooks = {};
@@ -5300,7 +5550,7 @@
5300
5550
  }
5301
5551
  };
5302
5552
 
5303
- var buildNet = compile;
5553
+ var buildNet$1 = buildNet;
5304
5554
 
5305
5555
  // for each cached-sentence, find a list of possible matches
5306
5556
  const getHooks = function (docCaches, hooks) {
@@ -5336,7 +5586,7 @@
5336
5586
  });
5337
5587
  // ensure nothing matches in our 'ifNo' property
5338
5588
  list = list.filter(obj => {
5339
- if (obj.ifNo !== undefined && obj.ifNo.some(no => docCache[n].has(no)) === true) {
5589
+ if (obj.ifNo !== undefined && obj.ifNo.some(no => haves.has(no)) === true) {
5340
5590
  return false
5341
5591
  }
5342
5592
  return true
@@ -5357,7 +5607,7 @@
5357
5607
 
5358
5608
  // finally,
5359
5609
  // actually run these match-statements on the terms
5360
- const runMatch = function (maybeList, document, methods, opts) {
5610
+ const runMatch = function (maybeList, document, docCache, methods, opts) {
5361
5611
  let results = [];
5362
5612
  for (let n = 0; n < maybeList.length; n += 1) {
5363
5613
  for (let i = 0; i < maybeList[n].length; i += 1) {
@@ -5366,9 +5616,23 @@
5366
5616
  let res = methods.one.match([document[n]], m);
5367
5617
  // found something.
5368
5618
  if (res.ptrs.length > 0) {
5369
- // let index=document[n][0].index
5370
5619
  res.ptrs.forEach(ptr => {
5371
5620
  ptr[0] = n; // fix the sentence pointer
5621
+ // check ifNo
5622
+ // if (m.ifNo !== undefined) {
5623
+ // let terms = document[n].slice(ptr[1], ptr[2])
5624
+ // for (let k = 0; k < m.ifNo.length; k += 1) {
5625
+ // const no = m.ifNo[k]
5626
+ // // quick-check cache
5627
+ // if (docCache[n].has(no)) {
5628
+ // // console.log(no)
5629
+ // if (terms.find(t => t.normal === no || t.tags.has(no))) {
5630
+ // // console.log('+' + no)
5631
+ // return
5632
+ // }
5633
+ // }
5634
+ // }
5635
+ // }
5372
5636
  let todo = Object.assign({}, m, { pointer: ptr });
5373
5637
  if (m.unTag !== undefined) {
5374
5638
  todo.unTag = m.unTag;
@@ -5410,16 +5674,8 @@
5410
5674
  // if we don't have enough words
5411
5675
  maybeList = tooSmall(maybeList, document);
5412
5676
 
5413
- // maybeList.forEach((arr, i) => {
5414
- // let txt = document[i].map(t => t.text).join(' ')
5415
- // console.log(`==== ${txt} ====`)
5416
- // arr.forEach(m => {
5417
- // console.log(` - ${m.match}`)
5418
- // })
5419
- // })
5420
-
5421
5677
  // now actually run the matches
5422
- let results = runMatch$1(maybeList, document, methods, opts);
5678
+ let results = runMatch$1(maybeList, document, docCache, methods, opts);
5423
5679
  // console.dir(results, { depth: 5 })
5424
5680
  return results
5425
5681
  };
@@ -5447,6 +5703,7 @@
5447
5703
  const tagger$3 = function (list, document, world) {
5448
5704
  const { model, methods } = world;
5449
5705
  const { getDoc, setTag, unTag } = methods.one;
5706
+ const looksPlural = methods.two.looksPlural;
5450
5707
  if (list.length === 0) {
5451
5708
  return list
5452
5709
  }
@@ -5456,7 +5713,7 @@
5456
5713
  console.log(`\n\n \x1b[32m→ ${list.length} post-tagger:\x1b[0m`); //eslint-disable-line
5457
5714
  }
5458
5715
  return list.map(todo => {
5459
- if (!todo.tag && !todo.chunk) {
5716
+ if (!todo.tag && !todo.chunk && !todo.unTag) {
5460
5717
  return
5461
5718
  }
5462
5719
  let reason = todo.reason || todo.match;
@@ -5475,9 +5732,12 @@
5475
5732
  if (todo.tag !== undefined) {
5476
5733
  setTag(terms, todo.tag, world, todo.safe, `[post] '${reason}'`);
5477
5734
  // quick and dirty plural tagger
5478
- if (terms.length === 1 && todo.tag === 'Noun') {
5479
- if (terms[0].text && terms[0].text.match(/..s$/) !== null) {
5480
- setTag(terms, 'Plural', world, todo.safe, 'quick-plural');
5735
+ if (todo.tag === 'Noun') {
5736
+ let term = terms[terms.length - 1];
5737
+ if (looksPlural(term.text)) {
5738
+ setTag([term], 'Plural', world, todo.safe, 'quick-plural');
5739
+ } else {
5740
+ setTag([term], 'Singular', world, todo.safe, 'quick-singular');
5481
5741
  }
5482
5742
  }
5483
5743
  }
@@ -5493,14 +5753,14 @@
5493
5753
  var bulkTagger = tagger$3;
5494
5754
 
5495
5755
  var methods$3 = {
5496
- buildNet,
5756
+ buildNet: buildNet$1,
5497
5757
  bulkMatch,
5498
5758
  bulkTagger
5499
5759
  };
5500
5760
 
5501
5761
  var sweep = {
5502
5762
  lib: lib$2,
5503
- api: api$6,
5763
+ api: api$8,
5504
5764
  methods: {
5505
5765
  one: methods$3,
5506
5766
  }
@@ -5549,7 +5809,7 @@
5549
5809
  }
5550
5810
  // finally, add our tag
5551
5811
  term.tags.add(tag);
5552
- // now it's dirty
5812
+ // now it's dirty?
5553
5813
  term.dirty = true;
5554
5814
  // add a chunk too, if it's easy
5555
5815
  addChunk(term, tag);
@@ -5601,6 +5861,10 @@
5601
5861
  tag.forEach(tg => setTag(terms, tg, world, isSafe));
5602
5862
  return
5603
5863
  }
5864
+ if (typeof tag !== 'string') {
5865
+ console.warn(`compromise: Invalid tag '${tag}'`);// eslint-disable-line
5866
+ return
5867
+ }
5604
5868
  tag = tag.trim();
5605
5869
  // support '#Noun . #Adjective' syntax
5606
5870
  if (isMulti.test(tag)) {
@@ -5890,7 +6154,7 @@
5890
6154
  const tagAPI = function (View) {
5891
6155
  Object.assign(View.prototype, tag$1);
5892
6156
  };
5893
- var api$4 = tagAPI;
6157
+ var api$6 = tagAPI;
5894
6158
 
5895
6159
  // wire-up more pos-tags to our model
5896
6160
  const addTags = function (tags) {
@@ -5944,12 +6208,16 @@
5944
6208
  tagRank: tagRank$1
5945
6209
  },
5946
6210
  methods: methods$2,
5947
- api: api$4,
6211
+ api: api$6,
5948
6212
  lib: lib$1
5949
6213
  };
5950
6214
 
5951
- const initSplit = /(\S.+?[.!?\u203D\u2E18\u203C\u2047-\u2049])(?=\s|$)/g; //!TODO: speedup this regex
6215
+ // split by periods, question marks, unicode ⁇, etc
6216
+ const initSplit = /([.!?\u203D\u2E18\u203C\u2047-\u2049]+\s)/g;
6217
+ // merge these back into prev sentence
6218
+ const splitsOnly = /^[.!?\u203D\u2E18\u203C\u2047-\u2049]+\s$/;
5952
6219
  const newLine = /((?:\r?\n|\r)+)/; // Match different new-line formats
6220
+
5953
6221
  // Start with a regex:
5954
6222
  const basicSplit = function (text) {
5955
6223
  let all = [];
@@ -5959,76 +6227,32 @@
5959
6227
  //split by period, question-mark, and exclamation-mark
5960
6228
  let arr = lines[i].split(initSplit);
5961
6229
  for (let o = 0; o < arr.length; o++) {
5962
- all.push(arr[o]);
6230
+ // merge 'foo' + '.'
6231
+ if (arr[o + 1] && splitsOnly.test(arr[o + 1]) === true) {
6232
+ arr[o] += arr[o + 1];
6233
+ arr[o + 1] = '';
6234
+ }
6235
+ if (arr[o] !== '') {
6236
+ all.push(arr[o]);
6237
+ }
5963
6238
  }
5964
6239
  }
5965
6240
  return all
5966
6241
  };
5967
- var basicSplit$1 = basicSplit;
6242
+ var simpleSplit = basicSplit;
5968
6243
 
5969
- const isAcronym$2 = /[ .][A-Z]\.? *$/i;
5970
- const hasEllipse = /(?:\u2026|\.{2,}) *$/;
5971
- const hasLetter$1 = /\p{L}/u;
6244
+ const hasLetter$2 = /[a-z0-9\u00C0-\u00FF\u00a9\u00ae\u2000-\u3300\ud000-\udfff]/i;
6245
+ const hasSomething$1 = /\S/;
5972
6246
 
5973
- /** does this look like a sentence? */
5974
- const isSentence = function (str, abbrevs) {
5975
- // must have a letter
5976
- if (hasLetter$1.test(str) === false) {
5977
- return false
5978
- }
5979
- // check for 'F.B.I.'
5980
- if (isAcronym$2.test(str) === true) {
5981
- return false
5982
- }
5983
- //check for '...'
5984
- if (hasEllipse.test(str) === true) {
5985
- return false
5986
- }
5987
- let txt = str.replace(/[.!?\u203D\u2E18\u203C\u2047-\u2049] *$/, '');
5988
- let words = txt.split(' ');
5989
- let lastWord = words[words.length - 1].toLowerCase();
5990
- // check for 'Mr.'
5991
- if (abbrevs.hasOwnProperty(lastWord) === true) {
5992
- return false
5993
- }
5994
- // //check for jeopardy!
5995
- // if (blacklist.hasOwnProperty(lastWord)) {
5996
- // return false
5997
- // }
5998
- return true
5999
- };
6000
- var isSentence$1 = isSentence;
6001
-
6002
- //(Rule-based sentence boundary segmentation) - chop given text into its proper sentences.
6003
- // Ignore periods/questions/exclamations used in acronyms/abbreviations/numbers, etc.
6004
- //regs-
6005
- const hasSomething = /\S/;
6006
- const startWhitespace = /^\s+/;
6007
- const hasLetter = /[a-z0-9\u00C0-\u00FF\u00a9\u00ae\u2000-\u3300\ud000-\udfff]/i;
6008
-
6009
- const splitSentences = function (text, model) {
6010
- let abbrevs = model.one.abbreviations || new Set();
6011
- text = text || '';
6012
- text = String(text);
6013
- let sentences = [];
6014
- // First do a greedy-split..
6247
+ const notEmpty = function (splits) {
6015
6248
  let chunks = [];
6016
- // Ensure it 'smells like' a sentence
6017
- if (!text || typeof text !== 'string' || hasSomething.test(text) === false) {
6018
- return sentences
6019
- }
6020
- // cleanup unicode-spaces
6021
- text = text.replace('\xa0', ' ');
6022
- // Start somewhere:
6023
- let splits = basicSplit$1(text);
6024
- // Filter-out the crap ones
6025
6249
  for (let i = 0; i < splits.length; i++) {
6026
6250
  let s = splits[i];
6027
6251
  if (s === undefined || s === '') {
6028
6252
  continue
6029
6253
  }
6030
6254
  //this is meaningful whitespace
6031
- if (hasSomething.test(s) === false || hasLetter.test(s) === false) {
6255
+ if (hasSomething$1.test(s) === false || hasLetter$2.test(s) === false) {
6032
6256
  //add it to the last one
6033
6257
  if (chunks[chunks.length - 1]) {
6034
6258
  chunks[chunks.length - 1] += s;
@@ -6042,12 +6266,20 @@
6042
6266
  //else, only whitespace, no terms, no sentence
6043
6267
  chunks.push(s);
6044
6268
  }
6045
- //detection of non-sentence chunks:
6046
- //loop through these chunks, and join the non-sentence chunks back together..
6269
+ return chunks
6270
+ };
6271
+ var simpleMerge = notEmpty;
6272
+
6273
+ //loop through these chunks, and join the non-sentence chunks back together..
6274
+ const smartMerge = function (chunks, world) {
6275
+ const isSentence = world.methods.one.tokenize.isSentence;
6276
+ const abbrevs = world.model.one.abbreviations || new Set();
6277
+
6278
+ let sentences = [];
6047
6279
  for (let i = 0; i < chunks.length; i++) {
6048
6280
  let c = chunks[i];
6049
6281
  //should this chunk be combined with the next one?
6050
- if (chunks[i + 1] && isSentence$1(c, abbrevs) === false) {
6282
+ if (chunks[i + 1] && isSentence(c, abbrevs) === false) {
6051
6283
  chunks[i + 1] = c + (chunks[i + 1] || '');
6052
6284
  } else if (c && c.length > 0) {
6053
6285
  //this chunk is a proper sentence..
@@ -6055,6 +6287,143 @@
6055
6287
  chunks[i] = '';
6056
6288
  }
6057
6289
  }
6290
+ return sentences
6291
+ };
6292
+ var smartMerge$1 = smartMerge;
6293
+
6294
+ // merge embedded quotes into 1 sentence
6295
+ // like - 'he said "no!" and left.'
6296
+ const MAX_QUOTE = 280;// ¯\_(ツ)_/¯
6297
+
6298
+ // don't support single-quotes for multi-sentences
6299
+ const pairs = {
6300
+ '\u0022': '\u0022', // 'StraightDoubleQuotes'
6301
+ '\uFF02': '\uFF02', // 'StraightDoubleQuotesWide'
6302
+ // '\u0027': '\u0027', // 'StraightSingleQuotes'
6303
+ '\u201C': '\u201D', // 'CommaDoubleQuotes'
6304
+ // '\u2018': '\u2019', // 'CommaSingleQuotes'
6305
+ '\u201F': '\u201D', // 'CurlyDoubleQuotesReversed'
6306
+ // '\u201B': '\u2019', // 'CurlySingleQuotesReversed'
6307
+ '\u201E': '\u201D', // 'LowCurlyDoubleQuotes'
6308
+ '\u2E42': '\u201D', // 'LowCurlyDoubleQuotesReversed'
6309
+ '\u201A': '\u2019', // 'LowCurlySingleQuotes'
6310
+ '\u00AB': '\u00BB', // 'AngleDoubleQuotes'
6311
+ '\u2039': '\u203A', // 'AngleSingleQuotes'
6312
+ '\u2035': '\u2032', // 'PrimeSingleQuotes'
6313
+ '\u2036': '\u2033', // 'PrimeDoubleQuotes'
6314
+ '\u2037': '\u2034', // 'PrimeTripleQuotes'
6315
+ '\u301D': '\u301E', // 'PrimeDoubleQuotes'
6316
+ // '\u0060': '\u00B4', // 'PrimeSingleQuotes'
6317
+ '\u301F': '\u301E', // 'LowPrimeDoubleQuotesReversed'
6318
+ };
6319
+ const openQuote = RegExp('(' + Object.keys(pairs).join('|') + ')', 'g');
6320
+ const closeQuote = RegExp('(' + Object.values(pairs).join('|') + ')', 'g');
6321
+
6322
+ const closesQuote = function (str) {
6323
+ if (!str) {
6324
+ return false
6325
+ }
6326
+ let m = str.match(closeQuote);
6327
+ if (m !== null && m.length === 1) {
6328
+ return true
6329
+ }
6330
+ return false
6331
+ };
6332
+
6333
+ // allow micro-sentences when inside a quotation, like:
6334
+ // the doc said "no sir. i will not beg" and walked away.
6335
+ const quoteMerge = function (splits) {
6336
+ let arr = [];
6337
+ for (let i = 0; i < splits.length; i += 1) {
6338
+ let split = splits[i];
6339
+ // do we have an open-quote and not a closed one?
6340
+ let m = split.match(openQuote);
6341
+ if (m !== null && m.length === 1) {
6342
+
6343
+ // look at the next sentence for a closing quote,
6344
+ if (closesQuote(splits[i + 1]) && splits[i + 1].length < MAX_QUOTE) {
6345
+ splits[i] += splits[i + 1];// merge them
6346
+ arr.push(splits[i]);
6347
+ splits[i + 1] = '';
6348
+ i += 1;
6349
+ continue
6350
+ }
6351
+ // look at n+2 for a closing quote,
6352
+ if (closesQuote(splits[i + 2])) {
6353
+ let toAdd = splits[i + 1] + splits[i + 2];// merge them all
6354
+ //make sure it's not too-long
6355
+ if (toAdd.length < MAX_QUOTE) {
6356
+ splits[i] += toAdd;
6357
+ arr.push(splits[i]);
6358
+ splits[i + 1] = '';
6359
+ splits[i + 2] = '';
6360
+ i += 2;
6361
+ continue
6362
+ }
6363
+ }
6364
+ }
6365
+ arr.push(splits[i]);
6366
+ }
6367
+ return arr
6368
+ };
6369
+ var quoteMerge$1 = quoteMerge;
6370
+
6371
+ const MAX_LEN = 250;// ¯\_(ツ)_/¯
6372
+
6373
+ // support unicode variants?
6374
+ // https://stackoverflow.com/questions/13535172/list-of-all-unicodes-open-close-brackets
6375
+ const hasOpen = /\(/g;
6376
+ const hasClosed = /\)/g;
6377
+ const mergeParens = function (splits) {
6378
+ let arr = [];
6379
+ for (let i = 0; i < splits.length; i += 1) {
6380
+ let split = splits[i];
6381
+ let m = split.match(hasOpen);
6382
+ if (m !== null && m.length === 1) {
6383
+ // look at next sentence, for closing parenthesis
6384
+ if (splits[i + 1] && splits[i + 1].length < MAX_LEN) {
6385
+ let m2 = splits[i + 1].match(hasClosed);
6386
+ if (m2 !== null && m.length === 1 && !hasOpen.test(splits[i + 1])) {
6387
+ // merge in 2nd sentence
6388
+ splits[i] += splits[i + 1];
6389
+ arr.push(splits[i]);
6390
+ splits[i + 1] = '';
6391
+ i += 1;
6392
+ continue
6393
+ }
6394
+ }
6395
+ }
6396
+ arr.push(splits[i]);
6397
+ }
6398
+ return arr
6399
+ };
6400
+ var parensMerge = mergeParens;
6401
+
6402
+ //(Rule-based sentence boundary segmentation) - chop given text into its proper sentences.
6403
+ // Ignore periods/questions/exclamations used in acronyms/abbreviations/numbers, etc.
6404
+ //regs-
6405
+ const hasSomething = /\S/;
6406
+ const startWhitespace = /^\s+/;
6407
+
6408
+ const splitSentences = function (text, world) {
6409
+ text = text || '';
6410
+ text = String(text);
6411
+ // Ensure it 'smells like' a sentence
6412
+ if (!text || typeof text !== 'string' || hasSomething.test(text) === false) {
6413
+ return []
6414
+ }
6415
+ // cleanup unicode-spaces
6416
+ text = text.replace('\xa0', ' ');
6417
+ // First do a greedy-split..
6418
+ let splits = simpleSplit(text);
6419
+ // Filter-out the crap ones
6420
+ let sentences = simpleMerge(splits);
6421
+ //detection of non-sentence chunks:
6422
+ sentences = smartMerge$1(sentences, world);
6423
+ // allow 'he said "no sir." and left.'
6424
+ sentences = quoteMerge$1(sentences);
6425
+ // allow 'i thought (no way!) and left.'
6426
+ sentences = parensMerge(sentences);
6058
6427
  //if we never got a sentence, return the given text
6059
6428
  if (sentences.length === 0) {
6060
6429
  return [text]
@@ -6070,7 +6439,7 @@
6070
6439
  }
6071
6440
  return sentences
6072
6441
  };
6073
- var sentence = splitSentences;
6442
+ var splitSentences$1 = splitSentences;
6074
6443
 
6075
6444
  const hasHyphen = function (str, model) {
6076
6445
  let parts = str.split(/[-–—]/);
@@ -6154,7 +6523,7 @@
6154
6523
  const isBoundary = /^[!?.]+$/;
6155
6524
  const naiiveSplit = /(\S+)/;
6156
6525
 
6157
- let notWord = ['.', '?', '!', ':', ';', '-', '–', '—', '--', '...', '(', ')', '[', ']', '"', "'", '`'];
6526
+ let notWord = ['.', '?', '!', ':', ';', '-', '–', '—', '--', '...', '(', ')', '[', ']', '"', "'", '`', '«', '»', '*'];
6158
6527
  notWord = notWord.reduce((h, c) => {
6159
6528
  h[c] = true;
6160
6529
  return h
@@ -6218,40 +6587,68 @@
6218
6587
  result = result.filter(s => s);
6219
6588
  return result
6220
6589
  };
6221
- var term = splitWords;
6590
+ var splitTerms = splitWords;
6591
+
6592
+ const allowBefore = [
6593
+ '#', //#hastag
6594
+ '@', //@atmention
6595
+ '_',//underscore
6596
+ // '\\-',//-4 (escape)
6597
+ '+',//+4
6598
+ '.',//.4
6599
+ ];
6600
+ const allowAfter = [
6601
+ '%',//88%
6602
+ '_',//underscore
6603
+ '°',//degrees, italian ordinal
6604
+ // '\'',// \u0027
6605
+ ];
6222
6606
 
6223
6607
  //all punctuation marks, from https://en.wikipedia.org/wiki/Punctuation
6608
+ let beforeReg = new RegExp(`[${allowBefore.join('')}]+$`, '');
6609
+ let afterReg = new RegExp(`^[${allowAfter.join('')}]+`, '');
6610
+
6224
6611
  //we have slightly different rules for start/end - like #hashtags.
6225
- const startings =
6226
- /^[ \n\t.[\](){}⟨⟩:,،、‒–—―…!‹›«»‐\-?‘’;/⁄·&*•^†‡°¡¿※№÷׺ª%‰+−=‱¶′″‴§~|‖¦©℗®℠™¤₳฿\u0022\uFF02\u0027\u201C\u201F\u201B\u201E\u2E42\u201A\u2035\u2036\u2037\u301D\u0060\u301F]+/;
6227
- const endings =
6228
- /[ \n\t.'[\](){}⟨⟩:,،、‒–—―…!‹›«»‐\-?‘’;/⁄·&*@•^†‡°¡¿※#№÷׺ª‰+−=‱¶′″‴§~|‖¦©℗®℠™¤₳฿\u0022\uFF02\u201D\u00B4\u301E]+$/;
6612
+ const endings = /[\p{Punctuation}\s]+$/u;
6613
+ const startings = /^[\p{Punctuation}\s]+/u;
6229
6614
  const hasApostrophe$1 = /['’]/;
6230
6615
  const hasAcronym = /^[a-z]\.([a-z]\.)+/i;
6231
- const minusNumber = /^[-+.][0-9]/;
6232
6616
  const shortYear = /^'[0-9]{2}/;
6617
+ const isNumber = /^-[0-9]/;
6233
6618
 
6234
6619
  const normalizePunctuation = function (str) {
6235
6620
  let original = str;
6236
6621
  let pre = '';
6237
6622
  let post = '';
6238
- // number cleanups
6623
+ // adhoc cleanup for pre
6239
6624
  str = str.replace(startings, found => {
6240
- pre = found;
6241
- // support '-40'
6242
- if ((pre === '-' || pre === '+' || pre === '.') && minusNumber.test(str)) {
6243
- pre = '';
6244
- return found
6625
+ // punctuation symboles like '@' to allow at start of term
6626
+ let m = found.match(beforeReg);
6627
+ if (m) {
6628
+ pre = found.replace(beforeReg, '');
6629
+ return m
6245
6630
  }
6246
6631
  // support years like '97
6247
6632
  if (pre === `'` && shortYear.test(str)) {
6248
6633
  pre = '';
6249
6634
  return found
6250
6635
  }
6636
+ // support prefix negative signs like '-45'
6637
+ if (found === '-' && isNumber.test(str)) {
6638
+ return found
6639
+ }
6640
+ pre = found; //keep it
6251
6641
  return ''
6252
6642
  });
6643
+ // ad-hoc cleanup for post
6253
6644
  str = str.replace(endings, found => {
6254
- post = found;
6645
+ // punctuation symboles like '@' to allow at start of term
6646
+ let m = found.match(afterReg);
6647
+ if (m) {
6648
+ post = found.replace(afterReg, '');
6649
+ return m
6650
+ }
6651
+
6255
6652
  // keep s-apostrophe - "flanders'" or "chillin'"
6256
6653
  if (hasApostrophe$1.test(found) && /[sn]['’]$/.test(original) && hasApostrophe$1.test(pre) === false) {
6257
6654
  post = post.replace(hasApostrophe$1, '');
@@ -6259,9 +6656,10 @@
6259
6656
  }
6260
6657
  //keep end-period in acronym
6261
6658
  if (hasAcronym.test(str) === true) {
6262
- post = post.replace(/\./, '');
6659
+ post = found.replace(/^\./, '');
6263
6660
  return '.'
6264
6661
  }
6662
+ post = found;//keep it
6265
6663
  return ''
6266
6664
  });
6267
6665
  //we went too far..
@@ -6289,7 +6687,21 @@
6289
6687
  };
6290
6688
  return parsed
6291
6689
  };
6292
- var whitespace = parseTerm;
6690
+ var splitWhitespace = parseTerm;
6691
+
6692
+ // 'Björk' to 'Bjork'.
6693
+ const killUnicode = function (str, world) {
6694
+ const unicode = world.model.one.unicode || {};
6695
+ str = str || '';
6696
+ let chars = str.split('');
6697
+ chars.forEach((s, i) => {
6698
+ if (unicode[s]) {
6699
+ chars[i] = unicode[s];
6700
+ }
6701
+ });
6702
+ return chars.join('')
6703
+ };
6704
+ var killUnicode$1 = killUnicode;
6293
6705
 
6294
6706
  /** some basic operations on a string to reduce noise */
6295
6707
  const clean = function (str) {
@@ -6329,7 +6741,7 @@
6329
6741
  const noPeriodAcronym$1 = /[A-Z]{2,}('s|,)?$/;
6330
6742
  const lowerCaseAcronym$1 = /([a-z]\.)+[a-z]\.?$/;
6331
6743
 
6332
- const isAcronym$1 = function (str) {
6744
+ const isAcronym$3 = function (str) {
6333
6745
  //like N.D.A
6334
6746
  if (periodAcronym$1.test(str) === true) {
6335
6747
  return true
@@ -6350,7 +6762,7 @@
6350
6762
  };
6351
6763
 
6352
6764
  const doAcronym = function (str) {
6353
- if (isAcronym$1(str)) {
6765
+ if (isAcronym$3(str)) {
6354
6766
  str = str.replace(/\./g, '');
6355
6767
  }
6356
6768
  return str
@@ -6369,27 +6781,13 @@
6369
6781
  };
6370
6782
  var normal = normalize;
6371
6783
 
6372
- // 'Björk' to 'Bjork'.
6373
- const killUnicode = function (str, world) {
6374
- const unicode = world.model.one.unicode || {};
6375
- str = str || '';
6376
- let chars = str.split('');
6377
- chars.forEach((s, i) => {
6378
- if (unicode[s]) {
6379
- chars[i] = unicode[s];
6380
- }
6381
- });
6382
- return chars.join('')
6383
- };
6384
- var killUnicode$1 = killUnicode;
6385
-
6386
6784
  // turn a string input into a 'document' json format
6387
- const fromString = function (input, world) {
6785
+ const parse$1 = function (input, world) {
6388
6786
  const { methods, model } = world;
6389
6787
  const { splitSentences, splitTerms, splitWhitespace } = methods.one.tokenize;
6390
6788
  input = input || '';
6391
6789
  // split into sentences
6392
- let sentences = splitSentences(input, model);
6790
+ let sentences = splitSentences(input, world);
6393
6791
  // split into word objects
6394
6792
  input = sentences.map((txt) => {
6395
6793
  let terms = splitTerms(txt, model);
@@ -6403,14 +6801,54 @@
6403
6801
  });
6404
6802
  return input
6405
6803
  };
6804
+ var fromString = parse$1;
6805
+
6806
+ const isAcronym$2 = /[ .][A-Z]\.? *$/i; //asci - 'n.s.a.'
6807
+ const hasEllipse$1 = /(?:\u2026|\.{2,}) *$/; // '...'
6808
+ const hasLetter$1 = /\p{L}/u;
6809
+ const leadInit = /^[A-Z]\. $/; // "W. Kensington"
6810
+
6811
+ /** does this look like a sentence? */
6812
+ const isSentence$2 = function (str, abbrevs) {
6813
+ // must have a letter
6814
+ if (hasLetter$1.test(str) === false) {
6815
+ return false
6816
+ }
6817
+ // check for 'F.B.I.'
6818
+ if (isAcronym$2.test(str) === true) {
6819
+ return false
6820
+ }
6821
+ // check for leading initial - "W. Kensington"
6822
+ if (str.length === 3 && leadInit.test(str)) {
6823
+ return false
6824
+ }
6825
+ //check for '...'
6826
+ if (hasEllipse$1.test(str) === true) {
6827
+ return false
6828
+ }
6829
+ let txt = str.replace(/[.!?\u203D\u2E18\u203C\u2047-\u2049] *$/, '');
6830
+ let words = txt.split(' ');
6831
+ let lastWord = words[words.length - 1].toLowerCase();
6832
+ // check for 'Mr.'
6833
+ if (abbrevs.hasOwnProperty(lastWord) === true) {
6834
+ return false
6835
+ }
6836
+ // //check for jeopardy!
6837
+ // if (blacklist.hasOwnProperty(lastWord)) {
6838
+ // return false
6839
+ // }
6840
+ return true
6841
+ };
6842
+ var isSentence$3 = isSentence$2;
6406
6843
 
6407
6844
  var methods$1 = {
6408
6845
  one: {
6409
6846
  killUnicode: killUnicode$1,
6410
6847
  tokenize: {
6411
- splitSentences: sentence,
6412
- splitTerms: term,
6413
- splitWhitespace: whitespace,
6848
+ splitSentences: splitSentences$1,
6849
+ isSentence: isSentence$3,
6850
+ splitTerms,
6851
+ splitWhitespace,
6414
6852
  fromString,
6415
6853
  },
6416
6854
  },
@@ -6502,7 +6940,6 @@
6502
6940
  'lt',
6503
6941
  'maj',
6504
6942
  'messrs',
6505
- 'mister',
6506
6943
  'mlle',
6507
6944
  'mme',
6508
6945
  'mr',
@@ -6523,7 +6960,7 @@
6523
6960
  'sir',
6524
6961
  'sr',
6525
6962
  'supt',
6526
- 'surg',
6963
+ 'surg'
6527
6964
  //miss
6528
6965
  //misses
6529
6966
  ];
@@ -6606,7 +7043,7 @@
6606
7043
  'dl',
6607
7044
  'ml',
6608
7045
  'gal',
6609
- 'ft', //ambiguous
7046
+ // 'ft', //ambiguous
6610
7047
  'qt',
6611
7048
  'pt',
6612
7049
  'tbl',
@@ -6635,13 +7072,12 @@
6635
7072
  'kmph', //kilometers per hour
6636
7073
  'kb', //kilobyte
6637
7074
  'mb', //megabyte
6638
- 'gb', //ambig
7075
+ // 'gb', //ambig
6639
7076
  'tb', //terabyte
6640
7077
  'lx', //lux
6641
7078
  'lm', //lumen
6642
- 'pa', //ambig
7079
+ // 'pa', //ambig
6643
7080
  'fl oz', //
6644
-
6645
7081
  'yb',
6646
7082
  ];
6647
7083
 
@@ -6761,7 +7197,7 @@
6761
7197
  r: 'ŔŕŖŗŘřƦȐȑȒȓɌɍЃГЯгяѓҐґ',
6762
7198
  s: 'ŚśŜŝŞşŠšƧƨȘșȿЅѕ',
6763
7199
  t: 'ŢţŤťŦŧƫƬƭƮȚțȶȾΓΤτϮТт',
6764
- u: 'µÙÚÛÜùúûüŨũŪūŬŭŮůŰűŲųƯưƱƲǓǔǕǖǗǘǙǚǛǜȔȕȖȗɄΰμυϋύ',
7200
+ u: 'ÙÚÛÜùúûüŨũŪūŬŭŮůŰűŲųƯưƱƲǓǔǕǖǗǘǙǚǛǜȔȕȖȗɄΰυϋύ',
6765
7201
  v: 'νѴѵѶѷ',
6766
7202
  w: 'ŴŵƜωώϖϢϣШЩшщѡѿ',
6767
7203
  x: '×ΧχϗϰХхҲҳӼӽӾӿ',
@@ -6795,7 +7231,7 @@
6795
7231
  // const hasApostrophe = /['’]s$/
6796
7232
 
6797
7233
  const addAliases = function (term, world) {
6798
- let str = term.normal || term.text;
7234
+ let str = term.normal || term.text || term.machine;
6799
7235
  const aliases = world.model.one.aliases;
6800
7236
  // lookup known aliases like '&'
6801
7237
  if (aliases.hasOwnProperty(str)) {
@@ -7015,10 +7451,10 @@
7015
7451
  return this
7016
7452
  };
7017
7453
 
7018
- const api$2 = function (View) {
7454
+ const api$4 = function (View) {
7019
7455
  View.prototype.autoFill = autoFill;
7020
7456
  };
7021
- var api$3 = api$2;
7457
+ var api$5 = api$4;
7022
7458
 
7023
7459
  // generate all the possible prefixes up-front
7024
7460
  const getPrefixes = function (arr, opts, world) {
@@ -7100,7 +7536,7 @@
7100
7536
  };
7101
7537
  var typeahead = {
7102
7538
  model: model$2,
7103
- api: api$3,
7539
+ api: api$5,
7104
7540
  lib,
7105
7541
  compute: compute$1,
7106
7542
  hooks: ['typeahead']
@@ -7259,15 +7695,16 @@
7259
7695
  };
7260
7696
  var reverse$1 = reverse;
7261
7697
 
7262
- // generated in ./learn/tiger/conjugate
7263
7698
  var presentModel = {
7264
- rules: '.5t¦aLbKcHeDfindRgreChaftRiBleiMn9o8r6s4t3u2we1ä0ü0;mmN;ndPrtP;ldGndL;attNeuKriL;peisMt0;ellLi4rebL;eiFs0teilK;etzJt7;niGppE;giFko0st5tiF;mmG;cEndCsiDtiD;ifEnzE;i2r0st1;g0iA;ehB;g7n2;h0ki7;aff8t0;ig7;leib6ring6;c4gi3mm2nd1us0;ch4;eln;ern;er1;ht0;en|.6t¦chaft2eu1hneid2mitteln,r0steuern;a0echn1i0;cht0;en|.2ifft¦treffen|.2icht¦brechen|.2immt¦nnehmen|.4le¦wickeln|.4t¦aVcSdPeLgiKharrYinJkIlFmEnCppeUr9s6t3us7w2z0ündY;ahlXeugXie0;hWlW;eisVirkV;e1i0s3;erTmmT;ilSllS;etzRiDorgRseQte1u0;chQ;hPln;e1gehOi0üH;erNngN;ckMdMifMnnM;de0geKi7;ln,rn;i5meF;angIeibIi0;e0ngH;gGrG;ehrFi1ommF;dEigE;erD;g2i1ndCrtCu0;eAtB;chAdAtA;e5n9;e1ie0;n7r7;ck6;h0ke1;au4e0n4;ln;ft2tt2u0;ch1e0;rn;en|wirbt¦werben|rifft¦reffen|hilft¦helfen|läuft¦laufen|fängt¦fangen|richt¦rechen|.5¦denken|nimmt¦nehmen|.2ßt¦passen|.2itt¦treten|gibt¦geben|.3t¦aNbeMdLeHfGgEhCiAkeMl9ndQo8peMr7s5t3u1ze6ße2ährQöpfQü0;ckPhrPtP;chOe0tO;rn;e0igMtM;hLrn;agKchKe0;ln;dIeuItIufI;mmHtzH;dGegGigG;chFe0mmFn7;gEhElEnErE;auDe0örD;bCrn;e0nB;hAln,rn;e5t9;ck8d8h2i1n0rr8tz8ug8;g7k7n7;b6f6h6l6n6s6ß6;l5n5r5;e0ig4;ln,rn;c1ff2h0mm2nk2rr2ub2;l1n1;h0k0;en|ilft¦elfen|sieht¦sehen|immt¦ehmen|ißt¦issen|ritt¦reten|.4¦ützen|.2t¦a8ch9e7ff9h6i5ll9mm9n4o3pf9r2tz9u1äg9ö0üh9;r8s8;b7g7;g6k6n6r6;b5l5;g4k4n4z4;g3l3n3;l2r2;g1r1u1;n0r0u0;en|gt¦gen|lt¦len|ut¦u0;en,n|xt¦xen|zt¦zen|ßt¦ßen|t¦en',
7265
- exceptions: 'gilt¦gelten|hält¦halten|.8¦aJbeimessUeCfestlegUgefährdUherrüBmiAnachgFpläd9schrOt8v1z0;erse5usP;er0orE;büEdienRfa8helfRl2meidRs1tretRze0;ihQrrQ;pürPtoßPuO;a1e0;tzN;ngMufM;ang0end0;ierK;tteilJßaG;hrI;in5mp3nt0;s0wertG;innFt0;ehE;fi0;ndC;h3planB;b8n5u0;f2s0;blut8h0saug8weit8;alt7;d0werf6;eck5;ri1s0treff4;chau3;cht2;stamm1wei0;ch0;en|.7¦a8b3er2gesellEhingebErut1s0täu1vorsBzulD;chuldDprengDtrotzD;schC;blühBkaufBnä3zeugB;e0illigA;dank9gegn9harr9ke2r0st6wein9;aub8ü0;hr7;hr6nn6;ddier5n3u0;f0slös4;g0hör3;eh2;bahn1halt1p0weis1;ass0;en|.4ät¦ent0ver0;raten|weiߦwissen|fällt¦fallen|.6¦a9b4ergBg2möchtEr1s0trinkEumg8zusagE;chämDpeisDtr7;auchCechnC;e0renzB;hörAlobA;e1re0;ch8nn8;g1h0;eb6üt6;eb5;b2n0;g0leg3r2;eh2;lös1r0;uf0;en|läßt¦lassen|.4ällt¦au2e1miß3v0z0;er2;in1nt1;f0s0;fallen|.4¦e1r0seh2töt2werd2;ed1uh1;bn0ss0;en|.5¦b8dehnBfü7ha6kaufBl5mü6prägBrü4s3t2w1z0;a6ehrAielA;erb9irk9;arn8rag8;org7par7;ck6hr6;aut5e4ieb5;ss4;hl3;a1e0;rg1ut1;ck0;en|rät¦raten|.9¦aAb6darstellBe4fe3gebrau2ignor7offenlegBrauskommBuntersagBver0überwa2;bleibAste0zi8;ck9ll9;ch8;rnhalt7ststeh7;n0rschöpf6xist2;gag1tfremd5;e1lock0;ier3;oba0schaff2tra0;cht1;nschick0ufbring0;en|.5ieht¦geschehen|.7t¦an9be8e4f2ge9heiratAs1tr0;ill5ockn9;chalt8pötteln;lü0ür0;cht6;nt2r0;inn0öffn4;ern;pupp2zwei2;last1scher1;biet0;en|.4ägt¦betr0schl0;agen|.10¦aBbevor9d7e4hinzu6offen9profitCrekl8unter3v0;er0orankommC;anlassBbrau0glei0schiebB;chA;halt9lieg9;in0rniedrig8xpand7;be0schlag7;zi3;iff0urchlauf5;am3;st0;eh2;bschneid1ppell0;ier0;en|.4ag¦vermögen|.5t¦auf8biet7ernt7g5ha4ko4l3ordn7pu4t1w0ähn2öffn7;alt6eh7idm6;a2e2it0r4;eln;a0i0;st2;enüg1l0;imm0;en;tun|.3ät¦b0g0;eraten|.8t¦au6behaup7ent4gest5sch3ver0;b1m1w0;al5üs5;ie4;immern,ütteln;f0las2;al1;flis0srüs0;ten|führen¦fahren|.4ält¦auf0ent0ver0;halten|.4ßt¦be0er0um0;fassen|.9t¦be1durchquer2ver0;markt1tröst1;fürcht0inhalt0;en|.4te¦freuen|.11¦autoris7be5gleichkomm8komm4präs4registr7unterdrück8v1zurück0;tret7zi5;ers0orbeifahr6;ch0treich5;ling4melz4wend4;ent2;einfluss2kanntgeb2reitst0;eh1;ier0;en|wirft¦werfen|.4icht¦verfechten|.4iehlt¦empfehlen|.7ägt¦au0ver1;f0s0;schlagen|.12¦be3durch2entschuld4kollabor1rechtfert4s0wiedertreff5zusammengeh5;icherstell4tabilis0;ier3;leucht2schlag2;absicht0schleun0;ig0;en|.13¦e0zurückerhalt2übereinstimm2;ntgegen0rwirtschaft1;nehm0steh0;en|.2ßt¦fa0kü0;ssen|.15¦aufrechterhalt0entgegenschlag0;en|.4t¦atm0bad0nütz0wat0;en|.5ält¦festhalten|Melden¦melden|Erteilt¦erteilen|.6ält¦durch0offen0vorbe0;halten|.5ägt¦bei1h0mit1v0;er0;tragen|Greift¦greifen|.3ält¦be0er0;halten|.6st¦anfleh1betteln,sch0wimmern;ick0rei0;en|Weißt¦weißen|Spürst¦spüren|.9ält¦gefangenhalten|.6t¦brü3ermüd4ge1innehab4kundtun,lei3s0wick2;chad3palt3;denk2iß0;eln;st0;en|wächst¦wachsen|.2ößt¦stoßen|.4ißt¦vergessen|.6te¦fertigen|.11t¦veranstalten|.3te¦fax0kos0;en|.4äßt¦aus0ent0ver0;lassen|liest¦lesen|.6ägt¦umschl0übertr0;agen|.3ällt¦ab0ge0um0;fallen|Tauschen¦tauschen|.3arf¦bedürfen|.2äbt¦graben|.3ährt¦an0er0;fahren|.10t¦mit0unterordn1ver0;schwimm0;en|.4illt¦schwellen|.14¦gegenüberstehen|.6irft¦unterwerfen|.4irft¦ent0ver0;werfen|.4irfst¦vorwerfen|.2äst¦blasen|Tagt¦tagen|.4irgt¦verbergen|.4äft¦schlafen|.2hlt¦malen|Gestatten¦gestatten|.5äßt¦überlassen|.6ällt¦unterfallen|.9ächst¦zusammenwachsen|Blüht¦blühen|mißt¦messen|.4ädt¦e0;in0nt0;laden|.3ißt¦zumessen|.3äßt¦belassen|.3ßt¦pressen|.7äßt¦h0;erein0inter0;lassen|.3irft¦abwerfen|.2dtschlägt¦totschlagen|Berücksichtigen¦berücksichtigen|.3ächst¦erwachsen|wäscht¦waschen|Offeriert¦offerieren|.8ßt¦bezuschussen|.3iehlt¦befehlen|.3gen¦folen|.2irbt¦sterben|.4ährt¦entfahren|.2icht¦stechen|.6ßt¦verblassen|.5ißt¦zerfressen|.7ält¦bereithalten|.7äft¦verschlafen|.6äßt¦unterlassen|lädt¦laden|.4ächst¦auswachsen|.4ingen¦auffangen|.2ißt¦fressen|.9ägt¦unterschlagen|.5irbt¦aussterben|.4irbt¦erst0verd0;erben|.7ällt¦hereinfallen|Telefoniert¦telefonieren|.2illt¦quellen|.10ßt¦zusammenfassen|.14t¦zurückvermieten|Bereinigt¦bereinigen|.3iert¦gebären|.5te¦schoten|.4ilzt¦schmelzen|.3äscht¦abwaschen|.5ällt¦überfallen|Wetten¦wetten|.8e¦be0;hi0wu0;ndern|.6e¦hung1koppeln,steu1w0;and0eig0;ern|.5e¦lagern,regeln|.7e¦annäh0bedau0;ern|.7le¦verhandeln|.4le¦wandeln|.9e¦verbessern|Feiert¦feiern|.13t¦herunterleiern|.12e¦verschlimmern|.2t¦tun'
7699
+ rules: 'elten|ilt,erraten|3ät,ädieren|6,schehen|3ieht,ermögen|3ag,mgeben|5,hlaufen|6,usagen|5,ufgehen|6,rblühen|6,fechten|1icht,prengen|6,pfehlen|2iehlt,rtreten|6,eunigen|6,etragen|3ägt,egegnen|6,rstoßen|6,itragen|3ägt,ntgeben|6,fährden|6,orsehen|6,ufhören|6,chreien|5st,etteln|5st,nflehen|5st,osen|2te,esen|iest,tteilen|6,uziehen|6,rinken|5,egeben|5,rocknen|6t,uslösen|6,zichten|6,edürfen|2arf,edauern|6e,erden|3,brufen|5,flussen|6,öten|3,eharren|6,tsinnen|6,chützen|6,eloben|5,hwellen|2illt,pfinden|6,kziehen|6,eweinen|6,rletzen|6,blösen|5,chulden|6,ssaugen|6,ekehren|6,lasen|1äst,imessen|6,rzerren|6,ekennen|6,bachten|6,ulassen|6,chgehen|6,nplanen|6,bnen|3,tmen|3t,chämen|5,fhalten|2ält,ßachten|6,erauben|6,rspüren|6,agern|4e,rmeiden|6,rdenken|6,nfahren|2ährt,ntraten|3ät,chussen|3ßt,ktreten|6,hhalten|2ält,efehlen|2iehlt,rbünden|6,nrufen|5,ingeben|6,tfahren|2ährt,techen|1icht,nehaben|4t,andern|5e,fdecken|6,axen|2te,blassen|3ßt,nnähern|6e,rnähren|6,nbahnen|6,hlingen|6,twerten|6,hwenden|6,esellen|6,stlegen|6,shalten|6,fremden|6,ifahren|6,ttragen|3ägt,ffangen|2ingen,hdenken|6,eheben|5,edanken|6,idmen|4t,sweiten|6,rzeihen|6,edrigen|6,rderben|2irbt,uellen|1illt,fwerfen|6,sbluten|6,ddieren|6,ebären|2iert,choten|4te,limmern|6e,öchten|5,ehüten|5,öffnen|5t,eraten|2ät,stützen|6,werben|1irbt,ehalten|2ält,nlegen|5,ordnen|5t,chlafen|3äft,amieren|6,issen|1ßt,waschen|1äscht,thalten|2ält,rhalten|6,fangen|1ängt,rühren|5,tstehen|6,rtragen|3ägt,helfen|1ilft,laden|1ädt,sterben|2irbt,treffen|2ifft,wachsen|1ächst,passen|2ßt,tun|2t,fassen|2ßt,essen|ißt,werfen|1irft,treten|2itt,gnen|3t,sehen|1ieht,laufen|1äuft,chnen|4t,lassen|1äßt,nehmen|1immt,rechen|1icht,geben|1ibt,fallen|1ällt,den|2t,eln|2t,ern|2t,ten|2t,en|t',
7700
+ exceptions: 'halten|1ält,verlangen|8,bestehen|7,wissen|1eiß,rechnen|6,anschauen|8,sehen|4,denken|5,wirken|5,raten|1ät,darstellen|9,gehören|6,schlagen|4ägt,einbeziehen|10,hungern|6e,fahren|1ühren,ruhen|4,fühlen|5,freuen|4te,kommentieren|11,verschmelzen|11,speisen|6,versuchen|8,steuern|6e,ausschlagen|7ägt,entgegenstehen|13,streben|6,lauten|5,feiern|Feiert,engagieren|9,melden|Melden,erteilen|Erteilt,verstreichen|11,durchleuchten|12,greifen|Greift,erhalten|3ält,regeln|5e,präsentieren|11,entwickeln|7le,existieren|9,angehen|6,wimmern|6st,weißen|Weißt,spüren|Spürst,gefangenhalten|9ält,vorankommen|10,ignorieren|9,tragen|5,stoßen|2ößt,fertigen|6te,umschlagen|6ägt,erwirtschaften|13,billigen|7,verdienen|8,rauchen|6,tauschen|Tauschen,betrachten|9,zielen|5,werben|5,appellieren|10,tangieren|8,sorgen|5,verhandeln|7le,durchschlagen|12,unterdrücken|11,zahlen|5,verbrauchen|10,graben|2äbt,rücken|5,gebrauchen|9,erfahren|3ährt,unterliegen|10,registrieren|11,verbessern|9e,bedenken|7,anschicken|9,gegenüberstehen|14,fernhalten|9,sparen|5,blockieren|9,verhalten|4ält,schicken|6st,rauskommen|9,zuschauen|8,profitieren|10,lieben|5,bewundern|8e,rechtfertigen|12,vorwerfen|4irfst,vorfinden|8,brechen|6,tagen|Tagt,verstecken|9,offenhalten|6ält,grenzen|6,verbergen|4irgt,weigern|6e,verlaufen|8,malen|2hlt,entgegennehmen|13,gestatten|Gestatten,vergleichen|10,prägen|5,behindern|8e,sicherstellen|12,untersagen|9,reden|4,kaufen|5,anrichten|8,beuten|5,verfahren|8,verschlagen|7ägt,übereinstimmen|13,verschieben|10,zehren|5,strotzen|7,blühen|Blüht,abstammen|8,koppeln|6e,bevorstehen|10,schrecken|8,pressen|3ßt,aufschlagen|7ägt,hassen|5,bergen|5,antreffen|8,anweisen|7,totschlagen|2dtschlägt,berücksichtigen|Berücksichtigen,rutschen|7,autorisieren|11,offerieren|Offeriert,folen|3gen,brennen|6,beabsichtigen|12,veranlassen|10,verbleiben|9,anhalten|7,abschneiden|10,dehnen|5,essen|4,gleichkommen|11,beschaffen|9,entschuldigen|12,küssen|2ßt,anpassen|7,tendieren|8,erzeugen|7,tarnen|5,zersetzen|8,kollaborieren|12,aufbringen|9,überwachen|9,verstellen|9,täuschen|7,offenstehen|10,ergehen|6,unterschlagen|9ägt,entgegenschlagen|15,verhelfen|8,erschöpfen|9,telefonieren|Telefoniert,stabilisieren|12,abweichen|8,backen|5,bereinigen|Bereinigt,wandeln|4le,zusammengehen|12,expandieren|10,abwickeln|6le,einhalten|8,schmelzen|4ilzt,wiedertreffen|12,müssen|5,lecken|5,einschlagen|10,wetten|Wetten,erkaufen|7,gelten|1ilt,hissen|2ßt',
7701
+ rev: 'hnelt|4n,schieht|3ehen,rinnert|6n,erficht|3echten,eißelt|5n,immerst|5n,chreist|5en,ettelst|5n,nflehst|5en,tößt|1oßen,ergißt|3essen,iest|esen,ähert|4n,räbt|1aben,rleiert|6n,chwillt|3ellen,chickst|5en,rwirfst|2erfen,läst|1asen,erbirgt|3ergen,ermißt|4ssen,ufhält|3alten,reßt|2ssen,uschußt|5ssen,rchhält|4alten,uchert|5n,ticht|1echen,nnehat|5ben,erblaßt|5ssen,rillert|6n,uillt|1ellen,ebiert|2ären,chmilzt|3elzen,ßert|3n,fiehlt|1ehlen,behält|3alten,enhält|3alten,erhält|3alten,mißt|1essen,frißt|2essen,schläft|4afen,tschert|6n,ssert|4n,wäscht|1aschen,pert|3n,auert|4n,thält|2alten,fängt|1angen,kert|3n,fährt|1ahren,hilft|1elfen,lädt|1aden,trifft|2effen,felt|3n,wächst|1achsen,paßt|2ssen,zelt|3n,tut|2n,rät|1aten,faßt|2ssen,mmelt|4n,pelt|3n,wirft|1erfen,chelt|4n,belt|3n,fert|3n,schlägt|4agen,irbt|erben,trägt|2agen,tritt|2eten,bert|3n,ichert|5n,delt|3n,mmert|4n,telt|3n,sieht|1ehen,läuft|1aufen,euert|4n,läßt|1assen,selt|3n,nimmt|1ehmen,kelt|3n,richt|1echen,gibt|1eben,fällt|1allen,gert|3n,gelt|3n,tert|3n,dert|3n,et|1n,t|en,eiß|issen,ermag|3ögen,ühren|ahren,olgen|2en,ffingen|2angen,reute|3en,egele|4n,ertigte|5en,oste|2en,bessere|6n,oppele|5n,axte|2en,nnähere|6n,chotte|4en,limmere|6n,uere|3n,wickle|4eln,andle|3eln,gere|3n,ndere|4n,e|1n,edarf|2ürfen,erd|3en'
7266
7702
  };
7267
7703
 
7268
7704
  var pastModel = {
7269
- rules: '.5te¦aGblickIchDe8haftIi6l5n4o3r2st1u0;ti9zi9;ellGi8;leibFrschFseBteilF;ni6rde8;di5ti5zi5;eitCli4;ch0egAll8ni3si3;nAtA;chn9ig2r0ti1;i0leg8;er7;e0n6;rn;t1ä0;tz3;ig2;cht1nd0;eln;en|.2ieb¦treiben|.2af¦treffen|.2iefen¦rlaufen|.3ug¦chlagen|.2ogen¦fliegen|.2ag¦rliegen|.2iegen¦steigen|.2achte¦bringen|.2ang¦pringen|lich¦leichen|.3and¦e0r0;stehen|.3ie¦chreien|.2ienen¦cheinen|.2uhr¦rfahren|.2itt¦treiten|.2oߦrgießen|.2ossen¦ch0fl0;ießen|.2ab¦rgeben|.4te¦aIchHdiGeFgiGkElBm9n8orDr4s3t0viGziG;e1i0rauJsCteIä9;erImmI;ckHilHllH;etzGiCu9;d2e1iBle0s8änkFü7;bEgE;ckDdD;eBigC;geln,i7;e0i6;rk9;ang8i1o0;ck7;ch6;ehr5i1lag5;dig4gn4ue3;er3;n2t2;st1ue0;rn;en|.4ten¦artAche9deckAed8henkAi7ld6m4n3perrAr1t0;reb9t7;dn8ei0hol8;k7s7;bar6d2ge5s1;a0m3;ch4;e2ig3;nig2st2;eln;rn;en|rieb¦reiben|fand¦finden|warf¦werfen|lang¦lingen|wang¦wingen|ich¦eichen|.2ingen¦n0s0;gehen|.2ing¦rgehen|zog¦ziehen|.2and¦stehen|dachten¦denken|rank¦rinken|fielen¦fallen|nahm¦nehmen|kam¦kommen|fuhr¦fahren|uchs¦achsen|wies¦weisen|.2ßten¦fassen|.2at¦treten|hielten¦halten|riߦreißen|ruben¦raben|gab¦geben|hob¦heben|.3te¦aHbeGdeFeCfBgAi9l7ntJrtJs6t4u1äumJü0;ckIhrIllI;c1e3mmHt0;en,zG;hFkF;e0igEtEufEörE;rn;agCchC;dBe0igB;bAgA;ck9e4;e5n8;e4t7;ck6d6h1i0ll6tz6;l5m5;n4r4;ln,rn;ln;ff1hn1mm1nk1u0;b0s0;en|arben¦erben|and¦inden|.3ten¦a2eug3g1h1irk3mpf3o0peln,ütz3;ff2lg2rg2;ern;ch0un0;en|arf¦erfen|rief¦rufen|arg¦ergen|og¦iehen|sah¦sehen|ahm¦ehmen|am¦ommen|annte¦ennen|annen¦innen|ies¦eisen|ißte¦issen|riet¦raten|ot¦ieten|rat¦reten|tießen¦toßen|ud¦aden|.2ten¦as0pf0;en|.2te¦a6ck7e4hl7nz7pp7r3tz7u2ä1ös7ü0;g6ß6;h5r5;h4l4;k3m3n3r3;l0r0;en,n;l0u0;en|iet¦aten|ute¦uen|vte¦ven|zte¦zen',
7270
- exceptions: '.4or¦erfr0verl0;ieren|.11ten¦argument3beabsich2demonstr3interess3rechtfer2substitu3unterbreit4ver0zurückreich4;ans0gewal1schleiern;chlag2talt2;tig1;ier0;en|.9ten¦aNbeGdiEeinschäDfCgarantPinsAk8m6provozPre5s2ver1widerseDz0überdau4;erschellPir2;billHdiJköGsiegFteidHweig2;chlumm1pe0;kulL;ern;b1kl9;ißhandAod0;ellH;andidGo0;nsumFrrigF;istEpi0;rDzD;inanzCrühstückD;tzC;ff0skutA;am9;a5f3gün1kräft2schränk9tra4zweif0;eln;st0;ig6;ra0ür0;cht4;rb1uftrag3;bsolv1usbr0;eit1;ier0;en|.10ten¦auszeichnBb9erleicht8favor7konkurrAorgan7pr6v1über0;ford7nachtA;er1or0;a1ber2herrsch8;a0dächtig7einnahm7schlepp7;rb0;eit5;aktiz3otest3äsent3;is2;ern;eeindruck1ombard0;ier0;en|.7ten¦aPbMeIfFhantiZkDlBnahelCoperiZpAs7traHum6ver1wegräum03zus0;piKti01;bu3harr01klär01l2mut01nein01s1t0übC;eil00ief00;pürZu1;angYoQ;chX;pflügWsteL;ch1t0;eigEill3udiQ;uftTweSüttT;assiOolstC;ahml0eerf0;egQ;ampiLling0;eln;l0ür1;imm6ü0;chtL;in1r0;krankJmordJ;reihIse0;tzH;e1lätt0;ern;gegnEkuCruh5schAwertEzwe6;bAn8r6u0;f2s0;de5fü0;llA;heul9mu1ze0;ig8;ck7;beit6gwö0;hn5;imi0last4;er3;sti1we0;nd1;mm0;en|.8ten¦aKbFeBgeAho9i6kumuOm5resi4s3ve0überquP;geBr0;goLhärtOst0weG;eckNärkN;chillAkan0tag4;diK;iterlebKusiziJ;g2n0;itiiHto0;niG;noriF;brauBfährdF;ntzü6r1skaCxis0;tiC;ford0richtC;ern;e0locki9;antrag9flüg2g0hand2rechn9teilig9;leit8rü0;nd7;eln;nstreng5ppe3us0;bi1rei0stell4;ch3;ld2;li0;er0;en|.6ten¦aUbNdiMeIfGgeFkElausOpCrBs9tr8urteil00v5w2z0;e0uwinkZ;itBrlJ;er1i0;c0nzP;keln;er1o0;rwKtiM;eIsJ;au8östR;ch0peI;mähPwebP;egiHiAutsC;oliGred0;igM;apiEerk2;maJwäA;ahBolt0;ern;in1r0;laubGsE;büßFl0;egE;chtD;asi5e1rau0;chB;e2fr1harrAs8wa0;hr9;ag8;nd7;er6;b2n1u0;fhör4slos4;rück3s1wähl3;le1s0;etz1;hn0;en|.12ten¦diskrimin1identifiz1natural0solidar0zurückfordern;is0;ieren|.5or¦einfrieren|Debattierten¦debattieren|.4ten¦bFdrohHfehlHhDkBliCm9nu8pumpHr6s5t4w1z0;eigGierG;a1einFäh0;lErE;lzDrnDtD;anzCeilCrauC;iegBäumB;e0i1ollA;ck9d9if9;tz8;e0u4;hr6rk6;e4l0;eb4;o0äuf3;ck2;lüh1o0uch1;hr0;en|.2or¦frieren|.15ten¦weiter0;debatt0produz0;ieren|Dominierten¦dominieren|.5ten¦anrOblickPdNeJfeHgeGkElBpAr9s3t2verübPweitPz0öffnP;u0üC;hKlM;au9re4;ch4p2t0;ammKo0römK;ckJppJ;a0eisIrühI;nnH;auGürG;ei2ottF;flDok7u4;a1ös0;chC;ndB;nallAo0;st9;h5nüg8;i0u0;ern;ign5mp2r0;hö0tön4;h3r3;ör2;eut1räng1;eg0;en|.3aߦbesitzen|saßen¦sitzen|.10aߦgegenübersitzen|.7olzen¦verschmelzen|.4olz¦schmelzen|.5aßen¦festsitzen|.4aßen¦einsitzen|.6amen¦h0;eran0inzu0;kommen|.6ämen¦davonkommen|.9amen¦zusammenkommen|.7amen¦zugutekommen|.3amen¦umkommen|.3äme¦zukommen|wusch¦waschen|.3ahmen¦annehmen|.4ähme¦hinnehmen|.4ähmen¦aufnehmen|.4oll¦schwellen|.2oll¦quellen|.2ünden¦stehen|.4ünde¦bestehen|.5anden¦entstehen|.4anden¦anstehen|.7ünden¦unterstehen|.4aben¦aufgeben|.3aben¦begeben|.5aben¦übergeben|.3äben¦ab0er0;geben|.3anden¦befinden|.7anden¦verschwinden|.3ten¦bau0eil0heg0jag0tob0;en|.7ogen¦vorbeiziehen|.2ohen¦fliehen|.6ogen¦einbe0unter0;ziehen|.4ogen¦einziehen|.3ogen¦abziehen|hielte¦halten|.3ielt¦an0be0;halten|.4ielt¦ent0vor0;halten|.9ielte¦zusammenhalten|.7te¦a9be8e6heiratDkremp5mitwirkDp4s1tro2ver0wechs5;hängCka9liebCsorgCwahrC;ch1ta0;mm2;alt9lüpf9;lapp7rang7;eln;inreis6r0;inn4reich5öffn5;reit4straf4;n1ufhä0;uf2;gehör1näh0;ern;en|.4iesen¦hinweisen|Suchte¦suchen|.3ahl¦befehlen|.4ahl¦empfehlen|.9te¦anprang8beschädig7durchpauk7e3prophezei7umkremp6ver0überrei1;br3körp7sic1ursa0;ch5;h5k5;ntw1rarb0;eit2;ick0urz0;eln;en;ern|.6te¦ausholIbEdBer9f8g7k6liefDm5rätsFs1torkFver0zaubD;ebbHhörHtagHwehH;ch2i1p0treifG;altFrengF;ck9edB;adDenkD;ind7utmaßC;anz8leidBü5;lucksAründA;olg4rist9;folg8ob3w0;ach7ähn7ürg7;onn1ä0;mm0;ern;e1reit3umm0;eln;d0frei1;eck0roh0;en|.5te¦anhörDbAer9flachDmündDo7prallDrü6s4t3w1ä0;rg7uß7;a0idmB;b5rtA;e2rimm9;chä0perr8tütz8;l7m7;st6;pf0rdn5;ern;bos3r2;e0rems2;jah1müh1ton1w0;eg0;en|.5annten¦verbrennen|.2annten¦brennen|.3annten¦bekennen|.3iel¦gefallen|.4iele¦entfallen|.4iel¦ausfallen|.2ichen¦gleichen|.4äten¦betreten|.13ten¦erwirtschaften|.14ten¦auskundschaft0veranschaulich0;en|.8te¦aCbe9e6ge5nachfragGsch3ver0;drängFeiEk1w7ä0;ndFußF;nü1äm1ündD;eppDildDrum0ütB;pfB;nehm1st2;ntf1rkund0;ig8;alt7;h1vorzug6z0;aub6iff6;aupt4ind5;blief4n1u0;fspieß2sweit2;kreid1zet0;teln;en;ern|.13te¦beglückwünsch0zusammenknüpf0;en|.5achten¦verbringen|.5ächten¦aufbringen|.4te¦atmFbetFdDendFfChBjäAkaufFleEm8n7p5r4s2t1w0zollF;iDohnE;rübDötD;eBpü0;lBrB;ä4ö5ühmA;lan9r0;äg8üf8;eig7ä2;a0ein6;ch5;hr4;emm3i2;ilm2rag2u1;eck1reh1ü0;nk0;en|bat¦bitten|.4aten¦ver0;bitten,tun|.2ieben¦bl0tr0;eiben|.9ieben¦unterschreiben|rieben¦reiben|.8ieben¦festschreiben|.3arfen¦bewerfen|.7angen¦durchk0versch0;lingen|.2ieg¦steigen|.5ieg¦versteigen|fuhren¦fahren|.7ühre¦weiterfahren|.2afen¦treffen|.5afen¦eintreffen|.4issen¦wegreißen|Schirmte¦schirmen|warb¦werben|.3arb¦bewerben|riefen¦rufen|.4iefe¦aufrufen|.10te¦auf1beanstand2mit1niederkni2unterstütz2ver0;kleinern,wechseln;arbeit0;en|.2angen¦dr0zw0;ingen|.2ßte¦fassen|.4ßte¦anp0erf0;assen|.7inge¦weitergehen|.2itt¦gleiten|.3uf¦schaffen|wußten¦wissen|.3üchse¦erwachsen|.4ing¦auf2e0ver1;in1mp0;fang1;geh0;en|.7ub¦untergraben|hoben¦heben|.11te¦durchforst0entschuldig0;en|.6ief¦durch0unter0;laufen|dachte¦denken|.4ägen¦vorliegen|.6achen¦aus0ent0;sprechen|.4omm¦erklimmen|.3ach¦sprechen|.3te¦ein3h2k1lob3müh3reg3tag3w0;ag2eh2;ur1ür1;ol0ör0;en|lieߦlassen|.3ieße¦zulassen|.3ießen¦erlassen|.2achen¦brechen|.2ugen¦tragen|gingen¦gehen|.5ied¦bescheiden|.4oߦschließen|Hätte¦haben|.4iffen¦begreifen|hieߦheißen|.7ieg¦verschweigen|lief¦laufen|lag¦liegen|galt¦gelten|.2iff¦greifen|.4iefen¦rumlau0schla0;fen|.6oben¦verschieben|litten¦leiden|.4ieߦe1ver0;heiß2l1;inl0ntl0;ass0;en|.4ug¦betragen|.6ach¦versprechen|.5ah¦geschehen|.2te¦üben|wandte¦wenden|.4iߦschm0verb0;eißen|.4itten¦sch0;neid0reit0;en|fingen¦fangen|tat¦tun|.3iefen¦belaufen|.6oߦan0be0er0;schließen|.5ug¦aus0bei0;tragen|sank¦sinken|.5agen¦festliegen|.3itten¦erleiden|.3ang¦bes0err0;ingen|.6ied¦aus0ent0;scheiden|.4anken¦versinken|.5ieߦüberlassen|.8ächen¦widersprechen|.7oߦe0;inschließ0ntschliess0;en|sang¦singen|.2ßten¦passen|.3ieden¦scheiden|.5chten¦vermögen|aߦessen|.4test¦sollen|.8itt¦fortschreiten|.9itt¦unterschreiten|.6ing¦herumgehen|.4ieg¦schweigen|.2ank¦stinken|.4andte¦entsenden|mochte¦mögen|.4iff¦ergreifen|hingen¦hängen|.3ingen¦anfang1be0zu0;geh0;en|.4aߦvergessen|ziehen¦zeihen|.10achen¦zusammenbrechen|.4ieh¦verleihen|.5achen¦aufbrechen|.7ießen¦hinterlassen|.6oren¦beschwören|ward¦werden|.2aßen¦fressen|.5ach¦aus0ein0;brechen|.3andte¦anwenden|.7iefen¦hinauslaufen|half¦helfen|wogen¦wägen|.3og¦erwägen|lasen¦lesen|.3ob¦schieben|.6ug¦übertragen|.3ossen¦gen0spr0;ießen|.5ieb¦ausbleiben|mied¦meiden|.7itten¦einschreiten|.8iedet¦unterscheiden|Unkten¦unken|.9ag¦zugrundeliegen|.4ammen¦schwimmen|wog¦wiegen|.8urde¦bekanntwerden|.7ag¦zurückliegen|maߦmessen|.5ugen¦vortragen|.3ief¦ablaufen|sandte¦senden|.3urfte¦bedürfen|wart¦sein|.5ieben¦verbleiben|.7ossen¦entschließen|.7ach¦unterbrechen|.5ogen¦überwiegen|.4ied¦vermeiden|.3tet¦kosen|.6ang¦durchringen|.4alfen¦verhelfen|.5angen¦eindringen|.8ang¦herausdringen|.5ßten¦verpassen|.6ießen¦übriglassen|.2ochen¦kriechen|.5iffen¦aufgreifen|.7ieb¦unterbleiben|.5ießen¦freilassen|.5ügen¦vertragen|.3aten¦abtun|barsten¦bersten|.9ingen¦zusammenhängen|.6ingen¦draufgehen|.7ing¦zurückgehen|bisse¦beißen|sog¦saugen|.7ief¦zurücklaufen|mußte¦müssen|.4as¦verlesen|rangen¦ringen|.4äte¦auftun|roch¦riechen|.7össen¦ausschließen|.14te¦entgegenrieseln|.12te¦niedermetzeln|.15te¦zusammenbrutzeln'
7705
+ rules: 'klimmen|2omm,iziehen|2ogen,hwellen|2oll,ulassen|2ieße,rlieren|2or,sdehnen|5ten,efehlen|2ahl,rkünden|6te,rtönen|4ten,nregen|4ten,esitzen|2aß,ehalten|2ielt,ufgeben|3aben,blehnen|5ten,pfehlen|2ahl,hlingen|2angen,efinden|2anden,elten|alt,otten|4ten,haupten|6te,tdecken|5ten,ewegen|4te,etonen|4te,chlafen|3iefen,egeben|2aben,toppen|4ten,hmlegen|5ten,eenden|5ten,tlassen|2ieß,etragen|3ug,chuften|6ten,etreten|3äten,liehen|1ohen,üsten|4te,flegen|4ten,erebben|5te,ühmen|3te,rsitzen|2aß,pfangen|2ing,ntragen|5ten,schehen|3ah,rhängen|5te,eidigen|5ten,hneiden|2itten,rwarten|6ten,elaufen|2iefen,rumpfen|5te,itragen|3ug,scheren|5ten,rspüren|5ten,tliegen|2agen,lingeln|6ten,rbitten|2aten,längern|6ten,rringen|2ang,greißen|2issen,rsinken|2anken,udieren|5ten,ingehen|3ing,osten|4ten,hädigen|5te,lüchten|6ten,liessen|1oß,ermuten|6ten,erüben|4ten,ekennen|2annten,redigen|5ten,rgraben|3ub,tiieren|5ten,prühen|4ten,lvieren|5ten,idmen|4te,ermögen|4chten,erehren|5ten,hwinden|2anden,rägen|3te,helegen|5ten,rhöhen|4ten,trömen|4ten,ümpeln|5ten,edrohen|5te,umgehen|3ing,rmorden|6ten,ewerten|6ten,drucken|5ten,pflügen|5ten,nstigen|5ten,tinken|1ank,rqueren|5ten,usten|4ten,ftragen|5ten,rehen|3te,ilmen|3te,erknien|6te,röffnen|6te,hezeien|5te,ürgern|5ten,fheulen|5ten,öten|3te,nlasten|6ten,undigen|5te,rwürgen|5te,egegnen|6ten,standen|6te,efallen|2iel,rbosen|4te,ulegen|4ten,palten|5te,rlauben|5ten,ejahen|4te,egehen|2ingen,fährden|6ten,inbüßen|5ten,lucksen|5te,rleihen|2ieh,ufrufen|3iefe,mpieren|5ten,uwinken|5ten,rwähnen|5te,tfalten|6te,tfallen|2iele,sfallen|2iel,chwören|3oren,gnieren|5ten,rsachen|5te,rwenden|6ten,ugehen|2ingen,ressen|1aßen,flügeln|6ten,nwenden|2andte,eitigen|5ten,ehmigen|5te,fdecken|5ten,nweisen|2iesen,enügen|4ten,slaufen|2iefen,utmaßen|5te,gräumen|5ten,rgolden|6ten,rwägen|2og,rüfen|3te,ruhigen|5ten,umpen|3ten,uellen|1oll,erübeln|6ten,hleppen|5ten,ohnen|3te,ewirken|5ten,anschen|5ten,inzeren|5ten,östigen|5ten,chellen|5ten,hwemmen|5ten,irieren|5ten,orzugen|5te,tarten|5ten,peisen|4ten,tuieren|5ten,bildern|6ten,nlassen|2ieß,elieren|5ten,ekunden|6ten,rwachen|5te,lanen|3te,chaden|5te,npassen|3ßte,eliegen|2ag,spießen|5te,stragen|3ug,rrieren|5ten,hwimmen|2ammen,altigen|5ten,ewerfen|2arfen,nrücken|5ten,tapeln|5ten,okern|4ten,sbilden|6ten,twerden|2urde,rlieben|5te,rlocken|5ten,kliegen|2ag,limmern|6ten,sfüllen|5ten,ewahren|5ten,chweben|5ten,ungern|5ten,hillern|6ten,blaufen|2ief,mpören|4ten,bziehen|2ogen,rneinen|5ten,gwöhnen|5ten,edürfen|2urfte,ringern|6ten,ichtern|6ten,alzen|3ten,efragen|5ten,olstern|6ten,emahnen|5ten,pannen|4ten,rimmen|4te,rwiegen|2ogen,orwagen|5ten,nfangen|2ingen,ulichen|5ten,bgeben|2äben,hringen|2ang,esten|4te,rhelfen|2alfen,stücken|5ten,uhören|4ten,penden|5ten,strafen|5te,sweiten|6te,rsorgen|5te,nallen|4ten,glassen|2ießen,rfangen|2ing,chämen|4te,mlaufen|2iefen,bdecken|5ten,oltern|5ten,ilassen|2ießen,lündern|6ten,ewerben|2arb,esetzen|5ten,ufhören|5ten,tmen|3te,erfegen|5ten,bwenden|6ten,forsten|6te,ümmeln|5ten,btun|2aten,ertun|3aten,prengen|5te,trengen|5ten,zwecken|5ten,ersten|arsten,erkern|5ten,efreien|5te,chalten|6te,eiraten|6te,risten|5te,tocken|4ten,hlaufen|2ief,ckgehen|3ing,fnehmen|2ähmen,chüren|4ten,nnahmen|5ten,rwalten|6te,kreiden|6te,lummern|6ten,remsen|4te,umieren|5ten,siegeln|6ten,treifen|5te,nachten|6ten,rdieren|5ten,rösten|5ten,illegen|5ten,mkommen|2amen,rtiefen|5ten,ohren|3ten,augen|og,bsetzen|5ten,klaufen|2ief,fhäufen|5te,lühen|3ten,üssen|ußte,erlesen|3as,apieren|5ten,uslosen|5ten,ächen|3te,rdauern|6ten,uftun|3äte,erkeln|5ten,umpeln|5ten,alieren|5ten,ahnden|5ten,nreihen|5ten,öschen|4ten,auben|3te,ordnen|5ten,eiern|4ten,erholen|5ten,rleiben|5te,hweigen|2ieg,cheinen|2ienen,ürchten|6ten,treiten|2itt,mühen|3te,sammeln|6ten,währen|4ten,stufen|4te,chreien|3ie,mitteln|6ten,treiken|5ten,pringen|2ang,lagern|5ten,leiden|1itten,folgen|4ten,graben|2uben,rdigen|4te,aunen|3ten,bergen|1arg,heben|1ob,harren|4ten,uldigen|5ten,laden|1ud,rlaufen|2iefen,amieren|5ten,isten|4ten,senden|1andte,regen|3te,zünden|5ten,issen|1ßte,denken|1achten,ruhen|3te,tagen|3te,rliegen|2ag,kaufen|4te,wachsen|1uchs,edigen|4te,sorgen|4ten,heißen|1ieß,ähen|2te,buchen|4ten,trinken|2ank,ummen|3te,eimen|3te,hoffen|4ten,nsetzen|5ten,dichten|6ten,rgießen|2oß,nten|3te,nbaren|4ten,affen|3te,fragen|4te,mucken|4ten,usgehen|3ingen,streben|5ten,meiden|1ied,üben|2te,oppeln|5ten,dringen|2angen,passen|2ßten,chützen|5ten,ammen|3te,singen|1ang,rasen|3ten,lasten|5te,horchen|5te,zeigen|4ten,hängen|1ingen,ngehen|2ingen,ausen|3te,wählen|4ten,wandern|6ten,wehen|3te,lden|3te,innen|annen,cheiden|2ied,ndigen|4ten,eden|3te,ehnen|3te,erben|arben,rufen|1ief,fliegen|2ogen,wingen|1ang,frieren|2or,rmen|2te,ahnen|3te,fassen|2ßten,rgehen|2ing,dienen|4te,stimmen|5te,einigen|5ten,bieten|1ot,essen|aß,sitzen|1aßen,leiten|5te,zeugen|4ten,langen|4te,ven|1te,üpfen|3te,stoßen|2ießen,uten|3te,lingen|1ang,raten|1iet,äumen|3te,klagen|4te,ügen|2te,rbeiten|6ten,üßen|2te,steigen|2iegen,fahren|1uhr,treffen|2af,ppen|2te,reisen|4ten,sehen|1ah,ösen|2te,lichen|4te,achen|3ten,reiben|1ieb,werfen|1arf,sagen|3te,ligen|3te,rnen|2te,tten|3te,rten|3te,treten|2at,pfen|2ten,gnen|3te,eißen|iß,ften|3te,bringen|2achte,leben|3te,chlagen|3ug,eichen|ich,uchen|3te,ennen|annte,fallen|1ielen,legen|3te,ziehen|1og,chnen|4te,halten|1ielten,weisen|1ies,inden|and,ießen|ossen,uen|1te,stehen|2and,geben|1ab,nehmen|1ahm,schen|3te,chten|4te,tigen|3te,kommen|1am,zen|1te,eln|2te,len|1te,ken|1te,ern|2te,ren|1te',
7706
+ exceptions: 'wünschen|6ten,aussprechen|6achen,machen|4te,entsprechen|6achen,halten|1ielte,sprechen|3ach,loben|3te,lassen|1ieß,suchen|Suchte,argumentieren|11ten,erlassen|3ießen,brechen|2achen,rebellieren|9ten,demonstrieren|11ten,versuchen|7ten,erreichen|7te,tragen|2ugen,gehen|1ingen,stehen|2ünden,rufen|1iefen,schaffen|3uf,gehören|5ten,fassen|2ßte,protestieren|10ten,gründen|6te,schließen|4oß,teilen|4ten,organisieren|10ten,haben|Hätte,begreifen|4iffen,rutschen|6ten,laufen|1ief,liegen|1ag,bitten|1at,heben|1oben,beschränken|9ten,besiedeln|8ten,wissen|1ußten,verlangen|7ten,warnen|4ten,deuten|5ten,treffen|2afen,bleiben|2ieben,meinen|4te,greifen|2iff,bekräftigen|9ten,treiben|2ieben,landen|5ten,verschieben|6oben,errichten|8ten,drohen|4ten,einlegen|6ten,begründen|8ten,neigen|4te,reichen|5ten,fehlen|4ten,brauchen|6ten,richten|6ten,unterschreiben|9ieben,verweigern|9ten,versprechen|6ach,wenden|1andte,feuern|5ten,steigen|2ieg,stammen|5ten,übergeben|5aben,öffnen|5ten,rollen|4ten,verbrennen|5annten,ändern|5ten,fangen|1ingen,tun|1at,denken|1achte,wirken|4ten,einschätzen|9ten,beschließen|6oß,präsentieren|10ten,drängen|5ten,siegen|4ten,sinken|1ank,bestehen|4ünde,begleiten|8ten,ignorieren|8ten,verbringen|5achten,verbreiten|9te,versperren|8ten,fahren|1uhren,gestalten|8te,blockieren|8ten,entstehen|5anden,beabsichtigen|11ten,ordnen|5te,erfordern|8ten,verstärken|8ten,beteiligen|8ten,veranschlagen|11ten,diskutieren|9ten,veranstalten|11ten,verlassen|4ieß,votieren|6ten,überlassen|5ieß,brennen|2annten,widersprechen|8ächen,ausstellen|8ten,verschmelzen|7olzen,mißhandeln|9ten,anstehen|4anden,scheiden|3ieden,vorherrschen|10ten,lieben|4ten,verdrängen|8te,werben|1arb,blicken|5ten,gleichen|2ichen,sichern|6ten,enthalten|4ielt,annehmen|3ahmen,kumulieren|8ten,enden|4te,skandieren|8ten,eintreffen|5afen,lauschen|6ten,weinen|4ten,sollen|4test,fortschreiten|8itt,identifizieren|12ten,beschenken|8ten,abstimmen|7ten,existieren|8ten,reifen|4ten,verkämpfen|8te,urteilen|6ten,unterschreiten|9itt,tauchen|5ten,tummeln|6ten,verschenken|9ten,hegen|3ten,zustimmen|7ten,merken|4ten,interessieren|11ten,mögen|1ochte,bereiten|7te,entschuldigen|11te,ergreifen|4iff,naturalisieren|12ten,schmelzen|4olz,kehren|4ten,trauern|6ten,operieren|7ten,kleiden|6te,schmähen|6ten,behandeln|8ten,rechtfertigen|11ten,absperren|7ten,bezweifeln|9ten,vorliegen|4ägen,betrachten|9ten,widersetzen|9ten,steigern|7ten,ergeben|3äben,basieren|6ten,weiterfahren|7ühre,beten|4te,erfassen|4ßte,zeihen|1iehen,kichern|6ten,breiten|6te,zusammenbrechen|10achen,verhindern|9ten,ausreichen|8ten,aufbrechen|5achen,auszeichnen|10ten,wagen|3te,zwingen|2angen,honorieren|8ten,einbeziehen|6ogen,hinterlassen|7ießen,passieren|7ten,weitergehen|7inge,reiben|1ieben,debattieren|Debattierten,kleben|4ten,werden|1ard,hinzukommen|6amen,einen|3te,animieren|7ten,zerlegen|6ten,einbrechen|5ach,gleiten|2itt,mitarbeiten|10te,erfolgen|6te,einschließen|7oß,polieren|6ten,blättern|7ten,nutzen|4ten,ausbreiten|9ten,helfen|1alf,wägen|1ogen,lesen|1asen,eignen|5ten,hemmen|4te,schieben|3ob,überreichen|9te,übertragen|6ug,erkranken|7ten,unterbreiten|11ten,residieren|8ten,erhören|5ten,bauen|3ten,schreiten|4itten,ausbleiben|5ieb,eilen|3ten,einschreiten|7itten,erwirtschaften|13ten,unterscheiden|8iedet,unken|Unkten,trennen|5ten,zuspitzen|7ten,münden|5te,garantieren|9ten,verklären|7ten,nähern|5ten,erarbeiten|9te,insistieren|9ten,vorhalten|4ielt,betteln|6ten,abschütteln|10ten,zieren|4ten,regieren|6ten,vorbereiten|10ten,wiegen|1og,recken|4ten,davonkommen|6ämen,einziehen|4ogen,trauen|4ten,favorisieren|10ten,zusammenkommen|9amen,vortragen|5ugen,reden|4ten,unterstehen|7ünden,erwachsen|3üchse,einreisen|7te,zirkulieren|9ten,waschen|1usch,verdächtigen|10ten,inspizieren|9ten,auskundschaften|14ten,säumen|4ten,sein|wart,befrachten|9ten,weiten|5ten,solidarisieren|12ten,verbleiben|5ieben,umstellen|7ten,zugutekommen|7amen,zurückreichen|11ten,finanzieren|9ten,anhalten|3ielt,flachen|5te,vermindern|9ten,versteigen|5ieg,hinnehmen|4ähme,unterbrechen|7ach,unterlaufen|6ief,weiterproduzieren|15ten,kosen|3tet,musizieren|8ten,toben|3ten,häufen|4ten,berechnen|8ten,herausdringen|8ang,miterleben|8ten,korrigieren|9ten,aufbringen|5ächten,versagen|6ten,praktizieren|10ten,kandidieren|9ten,erschließen|6oß,herankommen|6amen,schauen|5ten,intonieren|8ten,vegetieren|8ten,kriechen|2ochen,ritzen|4ten,aufgreifen|5iffen,unterbleiben|7ieb,jagen|3ten,wildern|6ten,diskriminieren|12ten,aufgehen|4ing,tanzen|4ten,vertragen|5ügen,zusammenhalten|9ielte,hocken|4ten,verstecken|8ten,durchklingen|7angen,trachten|7ten,weiterdebattieren|15ten,verbilligen|9ten,mehren|4ten,dominieren|Dominierten,schirmen|Schirmte,draufgehen|6ingen,beißen|1isse,ersetzen|6ten,provozieren|9ten,ausbrechen|5ach,aufarbeiten|10te,festschreiben|8ieben,überfordern|10ten,spekulieren|9ten,schütten|7ten,gebrauchen|8ten,unterziehen|6ogen,nützen|4ten,modellieren|9ten,ansiedeln|8ten,wickeln|6ten,zurückfordern|12ten,ringen|1angen,anschließen|6oß,waten|4ten,riechen|1och,ausschließen|7össen,zukommen|3äme,hantieren|7ten,verhärten|8ten,verteilen|7ten,saugen|1og',
7707
+ rev: 'rklomm|3immen,nahm|1ehmen,kam|1ommen,uließe|2assen,estünde|3ehen,ochte|ögen,erführe|3ahren,ufriefe|3ufen,erginge|3ehen,ntfiele|3allen,npaßte|3ssen,ntwurde|3erden,rwüchse|2achsen,edurfte|2ürfen,eitelte|5n,innähme|3ehmen,isse|eißen,ußte|üssen,uftäte|3un,ukäme|2ommen,felte|3n,herte|3n,kelte|3n,mmerte|4n,ißte|1ssen,faßte|2ssen,ickerte|5n,schrie|4eien,empelte|5n,ttelte|4n,hielte|1alten,äußerte|5n,nerte|3n,mmelte|4n,perte|3n,ferte|3n,berte|3n,belte|3n,andte|enden,zelte|3n,selte|3n,delte|3n,brachte|2ingen,gerte|3n,annte|ennen,gelte|3n,uerte|3n,derte|3n,terte|3n,ete|1n,te|en,chuf|2affen,alf|elfen,griff|2eifen,rief|1ufen,traf|2effen,warf|1erfen,lief|1aufen,efanden|2inden,ußten|issen,hliefen|2afen,schoben|3ieben,eträten|3eten,lohen|1iehen,euerten|4n,rachten|1ingen,stlagen|3iegen,uhren|ahren,erbaten|3itten,grissen|2eißen,rsanken|2inken,prächen|2echen,kannten|1ennen,hmolzen|2elzen,chieden|2eiden,möchten|2gen,hwanden|2inden,lichen|1eichen,nnahmen|2ehmen,orlägen|3iegen,iehen|eihen,chworen|3ören,raßen|1essen,nwiesen|2eisen,asen|esen,äherten|4n,hwammen|2immen,onkämen|3ommen,ewarfen|2erfen,llerten|4n,erwogen|3iegen,rhalfen|2elfen,rächten|1ingen,rochen|1iechen,rtrügen|3agen,arsten|ersten,fnähmen|2ehmen,hlössen|2ießen,eierten|4n,griffen|2eifen,chienen|2einen,rannten|1ennen,standen|2ehen,gruben|2aben,trafen|2effen,auerten|4n,dachten|1enken,gäben|1eben,hritten|2eiten,kerten|3n,mmerten|4n,trugen|2agen,stünden|2ehen,fingen|1angen,taten|1un,hingen|1ängen,annen|innen,gaben|1eben,itten|eiden,arben|erben,flogen|2iegen,saßen|1itzen,stießen|2oßen,ließen|1assen,stiegen|2eigen,terten|3n,rachen|1echen,zogen|1iehen,liefen|1aufen,aßten|1ssen,kamen|1ommen,angen|ingen,ieben|eiben,fielen|1allen,gerten|3n,gingen|1ehen,hielten|1alten,ossen|ießen,derten|3n,elten|2n,eten|1n,ten|en,alt|elten,olltest|3en,chiedet|2eiden,ostet|2en,bot|1ieten,riet|1aten,hielt|1alten,itt|eiten,trat|2eten,tschloß|5iessen,saß|1itzen,hieß|1eißen,aß|essen,ließ|1assen,iß|eißen,oß|ießen,tergrub|5aben,chob|2ieben,hob|1eben,warb|1erben,ieb|eiben,gab|1eben,chmolz|3elzen,erlieh|3eihen,usch|aschen,och|iechen,rach|1echen,ah|ehen,ich|eichen,ard|erden,lud|1aden,band|1inden,ied|eiden,fand|1inden,stand|2ehen,rwog|2ägen,fing|1angen,barg|1ergen,ieg|eigen,lag|1iegen,ging|1ehen,zog|1iehen,ug|agen,ang|ingen,erlas|3esen,wuchs|1achsen,wies|1eisen,oll|ellen,fahl|1ehlen,fiel|1allen,or|ieren,fuhr|1ahren,ank|inken'
7271
7708
  };
7272
7709
 
7273
7710
  let infToPresent = uncompress$1(presentModel);
@@ -7291,8 +7728,24 @@
7291
7728
  return convert$1(str, pastToInf)
7292
7729
  };
7293
7730
 
7731
+ const all = function (str) {
7732
+ let arr = [str];
7733
+ let past = toPast(str);
7734
+ if (past !== str) {
7735
+ arr.push(past);
7736
+ }
7737
+ let present = toPresent(str);
7738
+ if (present !== str) {
7739
+ arr.push(present);
7740
+ }
7741
+ return arr
7742
+ };
7294
7743
 
7295
- var conjugate = { toPresent, fromPresent, toPast, fromPast };
7744
+ var verb = { toPresent, fromPresent, toPast, fromPast, all };
7745
+
7746
+
7747
+ // console.log(toPresent('zusammenzufuehren'))
7748
+ // console.log(toPast('gehen'))
7296
7749
 
7297
7750
  // generated in ./lib/lexicon
7298
7751
  var lexData = {
@@ -7303,7 +7756,7 @@
7303
7756
  "Conjunction": "true¦bAd7entwed6falls,in5nach5o3so2und,w0zumal;e0ohingegen;d4il,nn2;lange,ndern,wie;b0d2;!glei3;dem;er;a1enn,o0;ch;ss,ß;e0zw;vor,ziehungsweise",
7304
7757
  "Determiner": "true¦d2ein0;!e0;!m,n,r,s;as,e0ie;m,n,r,s",
7305
7758
  "City": "true¦0:3A;a2Yb28c1Yd1Te1Sf1Qg1Kh1Ci1Ajakar2Jk11l0Um0Gn0Co0ApZquiYrVsLtCuBv8w3y1zuri22;ang1We1okohama;katerin1Krev0;ars4e3i1rocl4;ckl0Yn1;nipeg,terth0Z;llingt1Rxford;aw;a2i1;en2Klni33;lenc2Yncouv0Ir2J;lan bat0Ftrecht;a7bilisi,e6he5i4o3rondheim,u1;nWr1;in,ku;kyo,ronJulouD;anj26l16miso2Mra2D; haKssaloni10;gucigalpa,hr0l av0O;i1llinn,mpe2Engi09rtu;chu25n0pU;a4e3h2kopje,t1ydney;ockholm,uttga15;angh1Ienzh20;o0Nv01;int peters0Xl4n1ppo1I; 1ti1E;jo1salv3;se;v1z0T;adW;eykjavik,i2o1;me,sario,t28;ga,o de janei1A;to;a9e7h6i5o3r1ueb1Tyongya1Q;a1etor28;gue;rt1zn0; elizabe4o;ls1Jrae28;iladelph23nom pe0Aoenix;r1tah tik1C;th;lerLr1tr13;is;dessa,s1ttawa;a1Klo;a3ew 1is;delWtaip1york ci1U;ei;goya,nt0Xpl0Xv0;a7e6i5o2u1;mb0Oni0L;nt2sco1;u,w;evideo,real;l0n03skolc;dellín,lbour0U;drid,l6n4r1;ib2se1;ille;or;chest1dalYi11;er;mo;a6i3o1vCy03;nd1s angel0H;on,r0G;ma1nz,sb00verpo2;!ss1;ol; pla0Jusan0G;a6hark5i4laipeda,o2rak1uala lump3;ow;be,pavog1sice;ur;ev,ng9;iv;b4mpa0Lndy,ohsiu0Ira1un04;c1j;hi;ncheNstanb1̇zmir;ul;a6e4o1; chi mi2ms,u1;stJ;nh;lsin1rakliH;ki;ifa,m1noi,va0B;bu0UiltE;alw5dan4en3hent,iza,othen2raz,ua1;dalaj0Hngzhou;bu0R;eVoa,ève;sk;ay;es,rankfu1;rt;dmont5indhovV;a2ha02oha,u1;blSrb0shanbe;e1kar,masc0HugavpiK;gu,je1;on;a8ebu,h3o1raioKuriti02;lo1nstanKpenhagOrk;gGmbo;enn4i2ristchur1;ch;ang m2c1ttagoM;ago;ai;i1lgary,pe town,rac5;ro;aIeCirminghXogoBr6u1;char4dap4enos air3r1s0;g1sa;as;es;est;a3isba2usse1;ls;ne;silRtisla1;va;ta;i4lgrade,r1;g2l1n;in;en;ji1rut;ng;ku,n4r1sel;celo2ranquil1;la;na;g2ja lu1;ka;alo1kok;re;aDbBhmedabad,l8m5n3qa2sh1thens,uckland;dod,gabat;ba;k1twerp;ara;m0s1;terd1;am;exandr2ma1;ty;ia;idj0u dhabi;an;lbo2rh1;us;rg",
7306
- "Verb": "true¦0:5M;1:5E;2:5L;3:4M;4:4O;5:4D;6:3O;a56b46d41e3Af31g24h1Ri2Lk1Ml1Hm1Cn1Ap18r15s0Ot0Hu09vTwHz9ä8über7;nehm0ras2sp3ZtrVwa2;nd3Juß1N;eDi3Dog0u7ä3Aög0;geBrück8sammen7;geb5Lhä1;ge8zu7;drä1erob3E;ga1wies0;la5Gsp5Hw58;ig16rstö2G;aGeEiBoAu9ä8ü7;nsche4rde4;ch28hl0re4;chs,rd0ß3;l1Ord0;ch0der2Pe8r7s15;d,ke4;derhol0Ms;i7r3C;ch0gere,st,ß;ch10ndt0r7;!en,f,n3;erAor7;ausg1Cge7lR;d3Bga1schl7;ag0;anke1ZbHdGfüg0gFhä1lCmOrat0s9tret0we8öffentlich7;en,t;chs42i1S;ch8pr7ta1Ou2P;e2ic5o2;li1ob0;a8oren7;!g12;ng0u3S;a1e4PliE;eutli2ie1Nrä1;ot0u3Z;mg0Xnter7;brClBs7;t7uc5;r7üS;ei2i7;ch6;ag;i1o2;aBhro1Dr8u3Uä7;t0us2;a8i7ug;n2Rtt;f,ge,t6;pp0u7;ch0s2;aLchFeDiBol0LpAt7uc5;a8e7ieg,reik0ärk0ü3I;c2Li3Jll3;mm3Knd6;iel0ra2;n7tz0;d,g0ke;i7nk3tz04;!d,en;aBeAi1Ql9rie8we2Zü7;tz0;!b;a39epp0;in0nk3;fZue;g7h,nk;e,te;e8ief,uts2ä7üc26;ch0um3;agiOi27;asJlant2Fr7;ophez2Xäg0;a7iedeV;hm6nn3;achAe9i8öch3ü7;sEßM;s2tb1Vßbrau2;in3lde3;e,te4;a9e8ie2Sud,ä7ös0;dt,g0;g3hn3;g6s7;se;aAlett9omme,ri8önne,ü7;mm14nd24;e2tisi7;er3;m6uB;aGerDiBo9ä7;lt,n27t7;te4;f7l3;fe;l2Xn7;blä0Pg0wegtäus2;rsche,vo7;rg7;ega1;be4l3nde8t7;!te4;le;a02e9i8l7;aub0i2änz0;b,lt,ng6;bUdTfSga1hRlQmac5pMrLsDtBw8z7;og0wu1;a8es0o7;nn0rd0;n2Ds2;an,r7;ag0o18;chBp2It9u7;c5n7;g0k0;a7orb0ri2;nd;a12l7;eu7o2B;st;at0u1;a8la7;nt;a7rkt;rt;a0Cu1;alt0t;a02u1E;ac5ru1;eAo9r7;a7o2;c5uc5;r0t0;!t0;b6lt;anEeIiCorderBreigeAuß0ördQü7;h7r13;le4r7;e4te4;sp1R;n,te4;el7ng0;!e4;d,g0;ingeVmpfSntMr7;fJga1hIinnerHklär0BläutGmögli03rDs9wäg0z7örtG;wu1ä7;hl0;ch7to2;i8o1Gü7;ttB;en6;ei7u1;ch7;e,t03;ern;n,t01;ob0öhS;r06ü7;ll0;ga1la15s7;ch8pr7tand6;a2e2ic5o2;ei8ied6;!en;de;a8i7;ng;hl,ng0;d7frVga1;ru1;enAr9urchd8ürf7;e,t0;ri1;a1i1ä1ück0;ke;a04eCiBliebHot,ra7;ch9u7;ch7;e4t;en,te4;e3n;aWdien0fSgQherrs2kam0mängPnötiNrJsCt7wältKzeichne3;on9r7;aVo7;ff0;en,t7;!e;chBitze,p0Et8uc5;ht;ra09ät7;ig7;en,te;ied,lo08w7äft9;or0;ich8ücksicht7;ig0;te3;te;ge4;!n;eln;an7li2onn0rab0;g0n;i9r8ür7;cht0;eit;nd0;bsichti7nspru2;ge;ng0t,u7;e,t;bJnFu7;fCs7;fiel,g7ma2spra2;e7i1;bMg8s7;cJpL;a1li2;ge7ma2;bIfa1ga1hob0zwu1;bot,ge7;bot0fa1ga1spGw7;an7;dt;ge8hä1;ng0;bBs7;c8tra7;ft;hlo7;ss0;ro2;ch0;en",
7759
+ "Verb": "true¦0:4P;1:4I;2:4O;3:3W;4:3U;a4Ab3Gd3Be2Nf2Gg1Nh1Ci23k1Al15m12n10p0Yr0Ws0Ht0Bu05vSwFz7ä6über5;ne10ras2sp39trUwa2;nd2Uußer4;eBi2Qog0u5ä2Nög0;ge9rück6sammen5;geb4Mhä1;ge6zu5;drä1erob2P;ga1wies0;la4Hsp4Iw4A;igDrstö1Y;aFeDi9o8u7ä6ü5;nsche3rde3;hl0re3;rd0ß4;l17rd0;ch0der24e6r5s0S;d,ke3;derhol5s;e,te;i5r2N;ch0gere,st;ch0Mndt0r5;!en,f,n4;er8or5;ausg0Uge5lK;d2Kga1schl5;ag0;bCdBfüg0gAhä1l8mHrat0s6tret0wechs39öffentlich5;en,t;chli1pr5ucht2W;e2ic2Ao2;a1oren5;!g0M;a1e3Sli2;eutli2ie17rä1;ot0u36;mg0Inter5;br8l7st5;r5üP;ei2ich05;ag;i1o2;a8hro0Zr6ue,ä5;t0us2;a5in26ug;f,t0;pp0u5;ch0s2;a2VchEeCiAol09p9t5;a6e5reik0ärk0ü2S;c20i2Tll4;mm5ndT;e,t;iel0ra2;n5tz0;d,g0ke;i5tzt0;!d,en;a8ein0ienMl7rie6we2Aü5;tz0;!b;a2Iepp0;fOue;ei1Qief,uts2ä5üc1N;ch0um4;asElant1Wr5;ophezeit,äg0;a5iedeM;hm0;ach1Eein4i6öch4ü5;s9ßF;s2tb1Dßbrau2;a6ehn4ie27ud,ä5ös0;dt,g0;g6s5;se;!en;am0omme,rie2önne,ü5;mm0Pnd1L;aCer9in8of7ä5;n1Qt5;te3;fe;blä0Hg0wegtäus2;rs0Ivo5;rg5;ega1;be3l4nde6t5;!te3;le;ab0e7i6l5;aub0i2änz0;b,ng;bPdOfNga1halt0lu1mac0JpJrIsBt9w6z5;og0wu1;a6es0o5;nn0rd0;n1Us2;an,r5;ag0o0W;ch8p1Yt7u5;c0Bn5;g0k0;a07orb0ri2;a0Rl5;eu5o1S;st;at0u1;a6la5;nt;a5rkt;rt;aVu11;acZru1;e8o7r5;a5o2;cWucW;r0t0;!t0;a1eEiAorder9reige8uß0ördKü5;h5rc0S;le3r5;e,te3;sp1B;n,te3;el08ng0;ingeQmpfPntIr5;fFga1hEinnerDklär05läutCmögliYrAs7wäg0z5örtC;wu1ä5;hl0;ch5to2;i0o12ü5;tt7;ei5u1;che;ern;n,tX;ob0öhP;r00ü5;ll0;ga1la0Ts5;ch8pr6ta5;nd;a2e2ic5o2;ht;ei5ied0;de;a1ing;d5frQga1;ru1;en8r7urchd6ürf5;e,t0;ri1;a1i1ä1ück0;ke;aXe9i8liebEra5;cSu5;ch5;e3t;e4n;aQdien0fNgLherrs2kam0mängKnötiIrFsAt5wältG;on7r5;aPo5;ff0;en,t5;!e;ch7itze,p04tät5;ig5;en,te;ied,lo00w5äft7;or0;ichte4ücksicht5;ig0;te;ge3;!n;eln;an5li2onn0rab0;g0n;i6ürc5;ht0;nd0;bsichti5nspru2;ge;ng0ue;bFngeCu5;f9s5;ge5ma2;bIg6s5;cFpH;a1li2;ge5ma2;bEfa1ga1hob0zwu1;bot0fa1ga1spDw5;an5;dt;ge6hä1;ng0;b8s5;c5traft;hlo5;ss0;ro2;ch0;en",
7307
7760
  "Noun": "true¦0:8A;1:7Z;2:89;3:7K;4:7H;5:7Q;6:87;7:7F;8:7P;9:5K;A:7B;B:84;a7Cb6Ec68d60e5Nf51g4Ah3Ti3Oj3Kk36l2Um27n20o1Zp1Kr16s0Gt07u03vSwHzDäCölvor5Jüber2J;gypten4Sngs3rz3;aEeDuCwic3E;ge,kä1Bstande5G;c4hn3Qit04l3;c6Ogr6T;aKeGiEocheCä4Lört2ürst2;!nC;!en7J;dersCnt1ssen4D;a4Zp5O;ge,hrpflichtige,iElt,n7GrCsen4T;n1rat36tC;!e,papi6U;g1se;ff0hl0ige9lC;den40es;arian3eIieHoC;igt,lk,rC;ab1Lg7Kpres2sCwürfe6;chußlorbe6NitzendeDtandsC;sp2PvA;!r;l77rteljahrhunde67;ned3PrC;antwortlic5brau4KdDgleic4haCkä0Plus3teid6F;l51ndlungst1N;acBächtige6;ltent2QmDnterCrN;geb4Sschri3U;brü2fr78sCwelt3D;chuldungs4Ntänd0;aHei9hyss0iGoFreDürC;!en;ndCpp2uhanda5O;!w7;de,nn0;e0Xg1s51;sc5tDuC;be,s7;sac5;aZchVeUiTkand2Non5DpOtEuDynod2Nz4UüC;d0pp2;c4detendeuts2mI;aJeIimHrEuCädt2;dieCf0nd0;ngebü3Qr7;aDeC;et,ß;t5Eß0;me6;inkohleze2l1Z;atsCdtrat,rza3T;a01di5U;arFd ErC;ac4echC;ch6Wer;frak3Ll4SvA;er,te;cBgnal6Wnn;i6Tuc5;arpings,e09in,neid1rDuld0wC;ierig0Käc5;eibt0MiCöd1;fts27tt;chCnkt,rajewo;e6sen-an5U;aOeGiFoEu4üC;ckCd58he;s16t5L;be4Wl1G;tu1Tv1;chGgierungsQiCst;h0sC;ch,eDighaC;uf0;!n5N;er2tC;e,saC;nwa8;c4hmen3A;aMeJfIhänom3Qioni4YoGrC;eDoCä08; kopf 08grammv1Ujek3tes3;isCsseE;absp61verfal9;lizeiCr2D;sp0V;enn1Xl0N;it2ArC;es,sC;onal,pek3Y;lästinense4MpieErC;lamentCol0teivA;es,swahl0;re;berfläc4f1Qliv1ppenheim1stslawonie1C;aGeEieDorCä4;be44drhein westf12;r0tz20;andert0QgativtrCuk24;end;chCme;b5Gr08s4Ft;aUcdonnTeQiJoIuGäFöglichEüC;lCn2;heim kärli34l1;keit0;d2rk3;lCseum;is30;dellcharakt1nats7rd;chae9eHlGnDtC;gefang2Gtwo2X;destDisterpräCut0;sident0;ein2B;itär,lia3U;rt,te;nDrC;kma02rD;achem,em,ge,schenre1C;ell;astrOl1nErktn45schinenDßC;e,n2G;!pistol0;ge9n;aIeGiFokal2SuCä32;dCft;ew0SwigC;!shaf3P;cBs3;ch,g7iCu4T;c5pz0O;ch1fontain2LndCst0teini11;eDgerC;icB;!sC;e18k12vA;aMe3BiKoGrDu2ZöCüc4;ln,nig4Nr3;a25iegsCu0U;en3TverbC;re1A;h9llekRmmun0nCst0;flik3tC;ak3rolC;le;nCrc5;ke9;bel,mpagn0rDss0tschthCuf;al1;is1Ut0;ahrEerusalDuCürg0;gendliche3Wppé;em;!es7hundertw7tausendw7zehnt;deFmperaEnDrCtali2Y;an,e24;ha8itiative6;tiv;al0;aJeFoDundertCäf0Tö4;taus7;eCr0T;ch0Sn0;broEn1WrCß;b0Qrn,sCzog;tell1;n 0T;ftJlInGuC;ptDshaltC;!sstreits;urs2NvC;erantwor0A;delsCs jo2;!ab0N;s,t;!a1O;a0EeIipHläub36mbh,oGrCünt1;oßofEundDöße,ünC;de6en;ig;fens35;lft20tt;fe9;bTfaRha8lPmeinde6nOrKsEwC;a8erkschaftC;en,svA;chFeCicBpräc5ta8;llCtze;schaC;ft0;iCwor08;ch3;ichtDäuC;sc4;!eC;!s;era9f;d,senkC;ir2;hr,ngeneC;n,r;ie3üC;hr0;aWdp0GeUiPlKoHrDäll0ührungseC;be0R;aDeiheiC;tli2;g0kCu0;tion1Q;l08rC;meln,sC;ch1;aFuDäc5üchC;tlin04;cBgangC;st;mm0sc5;liale6schC;!erC;!eiC;abC;komm0;ld,stgenommC;en0;ll28milienangehöriT;bNiHnGpoc4rDuC;le,ropä1;achDde,folg,ha8löse,wachC;en,sene1R;tens;de,tge8;m1nC;bFheiEnDzelhande9;ls;ahm0;m0Yt0;rüc4;ene6;am0eIgbHiEraDu0YörfC;ch0er;ch;enstDnCvid7;ge;e,mäd2; vA;fizi3legie12utsc5;du FhCo8;arakter1Lef,iC;le,nabesuchC;es;lCvA;ande0J;a02eTilSlutvergieß0oPrKuGüC;ch1hErgerC;!initiaC;tiv0;ne;ndesCrs2;aDhaus0FläCtagsabgeordne3vA;nder6;nsta8;ancheDief,oCöt2;schür0t;!nC;!kollC;eg0;rcCusquLx0;heC;rt;d,l;am3b0freiungstJhöIrGsEtrC;iCoffP;eb;chäftig0TucheC;r,s;ekCgsteEicht0Tnd;et;rd0;ig1;dHnErriDsf,ueC;rn;er0;an0kC;darlCen;eh0;en1;a2b0Bgab,kb0Al06nWrSsOuC;fFge,sC;lä06sCwei2;ag0chußvAicBprC;ac4;entIsDtC;ritt;ichtsratDtändC;is2;svA;orsiC;tz7;ha8;c4ylsuch7;enC;de;he;beitsEgumen3tenvielC;fa8;te;plätz0we8;geIhHlGsDtwoCwa8zeig0;rt0;icBprüc5ta8;lt;he6;ag0;äng1;hörCklagt0stellO;igeC;!n,r;exaDternatC;ive;nd1;er;ar;endIgeordneGhFsC;icBpC;ra2;ht;ör0;te6;!n;!e;ch0;en",
7308
7761
  "Country": "true¦0:2Q;1:2P;a2Ib23c21d1Se1Lf1Hg19h18i13j10k0Rl0Nm0En05o04pYrVsKtEu7v4weißrusXz3ä2öster1I;quatorial02thiopi0;entralafrik1Type9;anuatu,e2ietnam;nezue2Jreinigte 2;arabische emira1Kstaat0;.6gan2GkraiLn2ruWsbeD;ga4ited 2;arab emirates,kingdom,states2;! of ame1T;rn;k.,s.2; virgin islands,a.;a5ha9o4rinidad und toba1Nsch3u2ürk1U;n0Trkme2Evalu;ad,echi0;go,nga;dschi2nsan0Y;ki2B;aAchwed0e9i7low6omal0Wpa1ri lan0Jt. 5u4was3y26ão tomé und príncipe,üd2;afri0IkNsud2A;il1D;d28riname;kitts und nevis,luc0Svincent und die grenadD;ak1Je1;erra leo2mbabwe,ngapur;ne;negKr03ychell0;lomon0m2n marino,udi-ara02;b0Moa;e15u2;an1Rmä1s2;sl12;a4eGhilipp3o2;l0rtugD;in0;ki1Tl0Cnama,pua-neu3ra2;guay;guin0L;m1Rsttim0O;a8e6i4or2;dk2weg0;or0H;caragua,ederlanRger2;!ia;p2useel0P;al;mib04u2;ru;a4exi7ikronUo2yanmK;ldawi0n2samb0I;aco,gol0Stenegro;dagaskHl5r3ur2zedo1;eta1itius;ok2shallinseln;ko;a2ediv0i,ta;wi,ysU;a0Re4i2uxemburg;b2echtenste0Ttau0;erRy0;sotho,tX;a6enPir5o3roati0u2önigreich großbritan1;ba,wait;lum2mor0;bi0;gisi0ZibaZ;m4na0Rp ver3sach0Yt2;ar;de;bodscha,erI;a2em0;mai2p0U;ka;nd4r3s2ta0H;lVrael;ak,lU;i0on2;esi0;aiMondur0A;a6ha01r5u2;atema0Einea2ya00;!-biss2;au;ena0Aieche8;b3mb2;ia;un;i3rank2;reiX;dschi,n2;nlF;cu6l4ritr3s2;tlD;ea; salv3fenbeinküs2;te;ad2;or;e6omini3schibu2änemark;ti;ca,k2;anische republ2;ik;mokratische re3utschl2;and;publik kon2;go;hi9osta 2;rica;aAe8hutSo6r4u2;lgaMr2;kina faso,undi;asiEun2;ei;livi0snien und herzegowi2tswa2;na;l2n7;gi0ize;h4nglades3rbad2;os;ch;am3ra2;in;as;fghaBl7n4r3serbaidschDustra2;li0;genti1me1;dorra,go3tigua und barbu2;da;la;ba1ge2;ri0;ni0;en;ni2;st2;an",
7309
7762
  "Region": "true¦0:1S;1:20;a1Yb1Rc1Hd1Ces1Bf18g12h0Zi0Wj0Uk0Sl0Rm0GnZoXpSqPrMsDtAut9v6w4y2zacatec20;o05u2;cat17kZ;a2est vi4isconsin,yomi13;rwick0shington dc;er3i2;rgin1R;acruz,mont;ah,tar pradesh;a3e2laxca1DuscaB;nnessee,x1Q;bas0Kmaulip1PsmK;a7i5o3taf0Ou2ylh13;ffWrr02s0Y;me10no1Auth 2;cTdS;ber1Hc2naloa;hu0Sily;n3skatchew0Rxo2;ny; luis potosi,ta catari1;a2hode8;j2ngp04;asth0Mshahi;inghai,u2;e2intana roo;bec,ensYreta0E;ara5e3rince edward2; isW;i,nnsylv2rnambu02;an13;!na;axa0Ndisha,h2klaho1Antar2reg5x04;io;ayarit,eCo4u2;evo le2nav0L;on;r2tt0Rva scot0W;f7mandy,th2; 2ampton0;c4d3yo2;rk0;ako0X;aroli1;olk;bras0Wva01w2; 3foundland2;! and labrador;brunswick,hamp0jers3mexiJyork2;! state;ey;a7i3o2;nta1relos;ch4dlands,n3ss2;issippi,ouri;as geraFneso0K;igPoacP;dhya,harasht03ine,ni4r2ssachusetts;anhao,y2;land;p2toba;ur;anca0eiHincoln0ouis7;a2entucky,hul1;ns08rnata0Dshmir;alis2iangxi;co;daho,llino3nd2owa;ia1;is;a3ert2idalFunB;ford0;mp0waii;ansu,eorgWlou6u2;an3erre2izhou,jarat;ro;ajuato,gdo2;ng;cester0;lori3uji2;an;da;sex;e5o3uran2;go;rs2;et;lawaFrby0;a9ea8hi7o2umbrH;ahui5l4nnectic3rsi2ventry;ca;ut;iMorado;la;apEhuahua;ra;l8m2;bridge0peche;a5ritish columb7uck2;ingham0;shi2;re;h3ja cal2sque,var3;iforn2;ia;guascalientes,l5r2;izo1kans2;as;na;a3ber2;ta;ba3s2;ka;ma",
@@ -7488,12 +7941,12 @@
7488
7941
  // add conjugations for our verbs
7489
7942
  if (tag === 'Infinitive') {
7490
7943
  // add present tense
7491
- let pres = conjugate.toPresent(w);
7944
+ let pres = verb.toPresent(w);
7492
7945
  if (pres && pres !== w) {
7493
7946
  lexicon$1[pres] = 'PresentTense';
7494
7947
  }
7495
7948
  // add past tense
7496
- let past = conjugate.toPast(w);
7949
+ let past = verb.toPast(w);
7497
7950
  if (past && past !== w) {
7498
7951
  lexicon$1[past] = 'PastTense';
7499
7952
  }
@@ -7505,11 +7958,90 @@
7505
7958
 
7506
7959
  var lexicon$2 = lexicon$1;
7507
7960
 
7961
+ const verbForm = function (term) {
7962
+ let want = [
7963
+ 'FirstPerson',
7964
+ 'SecondPerson',
7965
+ 'ThirdPerson',
7966
+ 'FirstPersonPlural',
7967
+ 'SecondPersonPlural',
7968
+ 'ThirdPersonPlural',
7969
+ ];
7970
+ return want.find(tag => term.tags.has(tag))
7971
+ };
7972
+
7973
+ //relajarse -> relajar
7974
+ const stripReflexive = function (str) {
7975
+ str = str.replace(/se$/, '');
7976
+ str = str.replace(/te$/, '');
7977
+ str = str.replace(/me$/, '');
7978
+ return str
7979
+ };
7980
+
7981
+ const root = function (view) {
7982
+
7983
+ const { verb, noun, adjective } = view.world.methods.two.transform;
7984
+ view.docs.forEach(terms => {
7985
+ terms.forEach(term => {
7986
+ let str = term.implicit || term.normal || term.text;
7987
+
7988
+ if (term.tags.has('Reflexive')) {
7989
+ str = stripReflexive(str);
7990
+ }
7991
+ // get infinitive form of the verb
7992
+ if (term.tags.has('Verb')) {
7993
+ let form = verbForm(term);
7994
+ if (term.tags.has('Gerund')) {
7995
+ term.root = verb.fromGerund(str, form);
7996
+ } else if (term.tags.has('PresentTense')) {
7997
+ term.root = verb.fromPresent(str, form);
7998
+ } else if (term.tags.has('PastTense')) {
7999
+ term.root = verb.fromPast(str, form);
8000
+ } else if (term.tags.has('FutureTense')) {
8001
+ term.root = verb.fromFuture(str, form);
8002
+ } else if (term.tags.has('Conditional')) {
8003
+ term.root = verb.fromConditional(str, form);
8004
+ } else ;
8005
+ }
8006
+
8007
+ // nouns -> singular masculine form
8008
+ // if (term.tags.has('Noun')) {
8009
+ // if (term.tags.has('Plural')) {
8010
+ // str = noun.toSingular(str)
8011
+ // }
8012
+ // if (term.tags.has('FemaleNoun')) {
8013
+ // // not sure about this
8014
+ // // str = noun.toMasculine(str)
8015
+ // }
8016
+ // term.root = str
8017
+ // }
8018
+
8019
+ // // nouns -> singular masculine form
8020
+ // if (term.tags.has('Adjective')) {
8021
+ // if (term.tags.has('PluralAdjective')) {
8022
+ // if (term.tags.has('FemaleAdjective')) {
8023
+ // str = adjective.fromFemalePlural(str)
8024
+ // } else {
8025
+ // str = adjective.toSingular(str)
8026
+ // }
8027
+ // }
8028
+ // if (term.tags.has('FemaleAdjective')) {
8029
+ // str = adjective.fromFemale(str)
8030
+ // }
8031
+ // term.root = str
8032
+ // }
8033
+ });
8034
+ });
8035
+ return view
8036
+ };
8037
+ var root$1 = root;
8038
+
7508
8039
  var lexicon = {
8040
+ compute: { root: root$1 },
7509
8041
  methods: {
7510
- one: {
8042
+ two: {
7511
8043
  transform: {
7512
- conjugate
8044
+ verb: verb
7513
8045
  }
7514
8046
  }
7515
8047
  },
@@ -7638,7 +8170,7 @@
7638
8170
  },
7639
8171
  };
7640
8172
 
7641
- var verbs$1 = {
8173
+ var verbs$2 = {
7642
8174
  Verb: {
7643
8175
  not: ['Noun', 'Adjective', 'Adverb', 'Value', 'Expression'],
7644
8176
  },
@@ -7856,7 +8388,7 @@
7856
8388
  },
7857
8389
  };
7858
8390
 
7859
- let tags = Object.assign({}, nouns$1, verbs$1, values$1, dates, misc);
8391
+ let tags = Object.assign({}, nouns$1, verbs$2, values$1, dates, misc);
7860
8392
 
7861
8393
  var tagset = {
7862
8394
  tags
@@ -7940,10 +8472,49 @@
7940
8472
  { word: 'zur', out: ['zu', 'der'] }, //(to the / to)
7941
8473
  ];
7942
8474
 
8475
+ const isAcronym$1 = /[ .][A-Z]\.? *$/i;
8476
+ const hasEllipse = /(?:\u2026|\.{2,}) *$/;
8477
+ const hasLetter = /\p{L}/u;
8478
+ const isOrdinal = /[0-9]\. *$/;
8479
+
8480
+ /** does this look like a sentence? */
8481
+ const isSentence = function (str, abbrevs) {
8482
+ // must have a letter
8483
+ if (hasLetter.test(str) === false) {
8484
+ return false
8485
+ }
8486
+ // check for 'F.B.I.'
8487
+ if (isAcronym$1.test(str) === true) {
8488
+ return false
8489
+ }
8490
+ // german ordinals like '4.'
8491
+ if (isOrdinal.test(str) === true) {
8492
+ return false
8493
+ }
8494
+ //check for '...'
8495
+ if (hasEllipse.test(str) === true) {
8496
+ return false
8497
+ }
8498
+ let txt = str.replace(/[.!?\u203D\u2E18\u203C\u2047-\u2049] *$/, '');
8499
+ let words = txt.split(' ');
8500
+ let lastWord = words[words.length - 1].toLowerCase();
8501
+ // check for 'Mr.'
8502
+ if (abbrevs.hasOwnProperty(lastWord) === true) {
8503
+ return false
8504
+ }
8505
+ // //check for jeopardy!
8506
+ // if (blacklist.hasOwnProperty(lastWord)) {
8507
+ // return false
8508
+ // }
8509
+ return true
8510
+ };
8511
+ var isSentence$1 = isSentence;
8512
+
7943
8513
  var tokenizer = {
7944
8514
  mutate: (world) => {
7945
8515
  world.model.one.unicode = unicode$1;
7946
8516
  world.model.one.contractions = contractions;
8517
+ world.methods.one.tokenize.isSentence = isSentence$1;
7947
8518
  },
7948
8519
  };
7949
8520
 
@@ -7954,7 +8525,7 @@
7954
8525
 
7955
8526
  let values = { more: [] };
7956
8527
  let nouns = { more: [] };
7957
- let verbs = { more: [] };
8528
+ let verbs$1 = { more: [] };
7958
8529
  let adjectives = { more: [] };
7959
8530
 
7960
8531
  var model$1 = {
@@ -7962,7 +8533,7 @@
7962
8533
  splitter: {
7963
8534
  values,
7964
8535
  nouns,
7965
- verbs,
8536
+ verbs: verbs$1,
7966
8537
  adjectives
7967
8538
  }
7968
8539
  }
@@ -8079,6 +8650,8 @@
8079
8650
  };
8080
8651
 
8081
8652
  const hasApostrophe = /['‘’‛‵′`´]/;
8653
+ const hasPeriod = /\./;
8654
+ const isNum = /^[0-9+-,]+$/;
8082
8655
 
8083
8656
  // normal regexes
8084
8657
  const doRegs = function (str, regs) {
@@ -8100,6 +8673,12 @@
8100
8673
  if (hasApostrophe.test(term.post) && !hasApostrophe.test(term.pre)) {
8101
8674
  text += term.post.trim();
8102
8675
  }
8676
+ // keep period in number ordinals?
8677
+ if (hasPeriod.test(term.post) && isNum.test(text)) {
8678
+ setTag([term], ['Ordinal', 'NumericValue'], world, false, `1-regex-ordinal`);
8679
+ term.confidence = 0.6;
8680
+ return true
8681
+ }
8103
8682
  let arr = doRegs(text, regexText) || doRegs(normal, regexNormal);
8104
8683
  // hide a bunch of number regexes behind this one
8105
8684
  if (!arr && /[0-9]/.test(normal)) {
@@ -8512,6 +9091,9 @@
8512
9091
  // ending-apostrophes
8513
9092
  [/.{3}[lkmnp]in['‘’‛‵′`´]$/, 'Gerund', "chillin'"],
8514
9093
  [/.{4}s['‘’‛‵′`´]$/, 'Possessive', "flanders'"],
9094
+
9095
+ // german ordinals '4.'
9096
+ // [/^[0-9]+\.$/, 'Ordinal'],
8515
9097
  ];
8516
9098
 
8517
9099
  const rb = 'Adverb';
@@ -9074,9 +9656,9 @@
9074
9656
  var format = formatNumber;
9075
9657
 
9076
9658
  // return the nth elem of a doc
9077
- const getNth = (doc, n) => (typeof n === 'number' ? doc.eq(n) : doc);
9659
+ const getNth$1 = (doc, n) => (typeof n === 'number' ? doc.eq(n) : doc);
9078
9660
 
9079
- const api = function (View) {
9661
+ const api$2 = function (View) {
9080
9662
  /** */
9081
9663
  class Numbers extends View {
9082
9664
  constructor(document, pointer, groups) {
@@ -9084,13 +9666,13 @@
9084
9666
  this.viewType = 'Numbers';
9085
9667
  }
9086
9668
  parse(n) {
9087
- return getNth(this, n).map(parse)
9669
+ return getNth$1(this, n).map(parse)
9088
9670
  }
9089
9671
  get(n) {
9090
- return getNth(this, n).map(parse).map(o => o.num)
9672
+ return getNth$1(this, n).map(parse).map(o => o.num)
9091
9673
  }
9092
9674
  json(n) {
9093
- let doc = getNth(this, n);
9675
+ let doc = getNth$1(this, n);
9094
9676
  return doc.map(p => {
9095
9677
  let json = p.toView().json(n)[0];
9096
9678
  let parsed = parse(p);
@@ -9321,19 +9903,62 @@
9321
9903
  }
9322
9904
  // make sure splitter has run
9323
9905
  m.compute('splitter');
9324
- m = getNth(m, n);
9906
+ m = getNth$1(m, n);
9325
9907
  return new Numbers(this.document, m.pointer)
9326
9908
  };
9327
9909
  // alias
9328
9910
  View.prototype.values = View.prototype.numbers;
9329
9911
  };
9330
- var api$1 = api;
9912
+ var api$3 = api$2;
9331
9913
 
9332
9914
  var numbers = {
9333
- api: api$1
9915
+ api: api$3
9334
9916
  };
9335
9917
 
9336
- var version = '0.0.4';
9918
+ const getNth = (doc, n) => (typeof n === 'number' ? doc.eq(n) : doc);
9919
+
9920
+ // get root form of adjective
9921
+ const getRoot = function (m, methods) {
9922
+ m.compute('root');
9923
+ let str = m.text('root');
9924
+ return str
9925
+ };
9926
+
9927
+ const api = function (View) {
9928
+ class Verbs extends View {
9929
+ constructor(document, pointer, groups) {
9930
+ super(document, pointer, groups);
9931
+ this.viewType = 'Verbs';
9932
+ }
9933
+ conjugate(n) {
9934
+ const methods = this.methods.two.transform.verb;
9935
+ const { toPresent, toPast, toFuture, toConditional, toGerund } = methods;
9936
+ return getNth(this, n).map(m => {
9937
+ let str = getRoot(m);
9938
+ return {
9939
+ presentTense: toPresent(str),
9940
+ pastTense: toPast(str),
9941
+ // futureTense: toFuture(str),
9942
+ // conditional: toConditional(str),
9943
+ // gerund: toGerund(str),
9944
+ }
9945
+ }, [])
9946
+ }
9947
+ }
9948
+
9949
+ View.prototype.verbs = function (n) {
9950
+ let m = this.match('#Verb+');
9951
+ m = getNth(m, n);
9952
+ return new Verbs(this.document, m.pointer)
9953
+ };
9954
+ };
9955
+ var api$1 = api;
9956
+
9957
+ var verbs = {
9958
+ api: api$1,
9959
+ };
9960
+
9961
+ var version = '0.0.6';
9337
9962
 
9338
9963
  nlp$1.plugin(tokenizer);
9339
9964
  nlp$1.plugin(tagset);
@@ -9342,13 +9967,25 @@
9342
9967
  nlp$1.plugin(postTagger);
9343
9968
  nlp$1.plugin(splitter);
9344
9969
  nlp$1.plugin(numbers);
9345
-
9970
+ nlp$1.plugin(verbs);
9346
9971
 
9347
9972
  const de = function (txt, lex) {
9348
9973
  let dok = nlp$1(txt, lex);
9349
9974
  return dok
9350
9975
  };
9351
9976
 
9977
+ // copy constructor methods over
9978
+ Object.keys(nlp$1).forEach(k => {
9979
+ if (nlp$1.hasOwnProperty(k)) {
9980
+ de[k] = nlp$1[k];
9981
+ }
9982
+ });
9983
+
9984
+ // this one is hidden
9985
+ Object.defineProperty(de, '_world', {
9986
+ value: nlp$1._world,
9987
+ writable: true,
9988
+ });
9352
9989
  /** log the decision-making to console */
9353
9990
  de.verbose = function (set) {
9354
9991
  let env = typeof process === 'undefined' ? self.env || {} : process.env; //use window, in browser