@rudra-js/attested 0.7.2 → 0.7.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -3
- package/dist/phrases.d.ts +1 -1
- package/dist/phrases.d.ts.map +1 -1
- package/dist/phrases.js +68 -2
- package/dist/phrases.js.map +1 -1
- package/dist/verify.d.ts.map +1 -1
- package/dist/verify.js +20 -10
- package/dist/verify.js.map +1 -1
- package/package.json +1 -1
- package/src/phrases.ts +69 -4
- package/src/verify.ts +24 -8
package/README.md
CHANGED
|
@@ -102,15 +102,22 @@ is two numbers and a fact of 23 does not stand behind it.
|
|
|
102
102
|
### Layer two — wording. This is the best-effort half.
|
|
103
103
|
|
|
104
104
|
Claims with no number in them: "cheap", "bargain", "on sale", "best-selling",
|
|
105
|
-
"selling fast", "in stock", "free delivery". There is no value to
|
|
106
|
-
there is nothing to invert. It stays a denylist, it stays open and
|
|
105
|
+
"selling fast", "in stock", "free delivery", "trending". There is no value to
|
|
106
|
+
check, so there is nothing to invert. It stays a denylist, it stays open and
|
|
107
107
|
English-first, and every result it produces says so:
|
|
108
108
|
|
|
109
109
|
```ts
|
|
110
110
|
verify('Selling fast', { values: [] }).wording;
|
|
111
|
-
// { supported: false, strength: 'best-effort', checked:
|
|
111
|
+
// { supported: false, strength: 'best-effort', checked: 122, findings: [...] }
|
|
112
112
|
```
|
|
113
113
|
|
|
114
|
+
The list also carries generic environmental claims — "eco-friendly", "carbon
|
|
115
|
+
neutral", "sustainable". Under EU Directive 2024/825, applied through each
|
|
116
|
+
country's own law from 27 September 2026, a generic environmental claim is
|
|
117
|
+
unfair unless the trader can show recognised excellent environmental
|
|
118
|
+
performance, and a "neutral" claim based on offsetting is unfair outright. The
|
|
119
|
+
list leaves out the bare word "green", which is too often a colour.
|
|
120
|
+
|
|
114
121
|
Add your own for your own language, and name the wording you stand behind:
|
|
115
122
|
|
|
116
123
|
```ts
|
package/dist/phrases.d.ts
CHANGED
package/dist/phrases.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"phrases.d.ts","sourceRoot":"","sources":["../src/phrases.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,cAAc,EAAE,SAAS,MAAM,
|
|
1
|
+
{"version":3,"file":"phrases.d.ts","sourceRoot":"","sources":["../src/phrases.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,cAAc,EAAE,SAAS,MAAM,EA2H3C,CAAC;AAsDF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,UAAQ,GAAG,MAAM,CAmBtE;AAQD,MAAM,WAAW,IAAI;IACnB,KAAK,EAAE,MAAM,CAAC;IAEd,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IAEb,QAAQ,EAAE,MAAM,CAAC;IAEjB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAYnD;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,CA2BhE"}
|
package/dist/phrases.js
CHANGED
|
@@ -60,6 +60,9 @@ export const BANNED_PHRASES = [
|
|
|
60
60
|
'limited time',
|
|
61
61
|
'today only',
|
|
62
62
|
'ends soon',
|
|
63
|
+
'ends today',
|
|
64
|
+
'ends tonight',
|
|
65
|
+
'ends at midnight',
|
|
63
66
|
'hurry',
|
|
64
67
|
'act fast',
|
|
65
68
|
'do not miss',
|
|
@@ -80,7 +83,45 @@ export const BANNED_PHRASES = [
|
|
|
80
83
|
'star rating',
|
|
81
84
|
'customer favourite',
|
|
82
85
|
'customer favorite',
|
|
86
|
+
'trending',
|
|
87
|
+
'others are looking',
|
|
88
|
+
'people are looking',
|
|
89
|
+
'others are viewing',
|
|
90
|
+
'people are viewing',
|
|
91
|
+
'others are buying',
|
|
92
|
+
'people are buying',
|
|
93
|
+
'in other carts',
|
|
94
|
+
'in other baskets',
|
|
83
95
|
'money back',
|
|
96
|
+
'eco friendly',
|
|
97
|
+
'environmentally friendly',
|
|
98
|
+
'planet friendly',
|
|
99
|
+
'earth friendly',
|
|
100
|
+
'nature friendly',
|
|
101
|
+
'climate friendly',
|
|
102
|
+
'carbon friendly',
|
|
103
|
+
'good for the planet',
|
|
104
|
+
'kind to the planet',
|
|
105
|
+
'gentle on the environment',
|
|
106
|
+
'ecological',
|
|
107
|
+
'ecologically',
|
|
108
|
+
'environmentally correct',
|
|
109
|
+
'eco conscious',
|
|
110
|
+
'environmentally conscious',
|
|
111
|
+
'sustainable',
|
|
112
|
+
'sustainably',
|
|
113
|
+
'biodegradable',
|
|
114
|
+
'compostable',
|
|
115
|
+
'biobased',
|
|
116
|
+
'energy efficient',
|
|
117
|
+
'carbon neutral',
|
|
118
|
+
'climate neutral',
|
|
119
|
+
'net zero',
|
|
120
|
+
'carbon negative',
|
|
121
|
+
'carbon positive',
|
|
122
|
+
'climate positive',
|
|
123
|
+
'carbon offset',
|
|
124
|
+
'zero waste',
|
|
84
125
|
];
|
|
85
126
|
const CONFUSABLES = {
|
|
86
127
|
а: 'a',
|
|
@@ -111,11 +152,36 @@ const CONFUSABLES = {
|
|
|
111
152
|
τ: 't',
|
|
112
153
|
υ: 'u',
|
|
113
154
|
χ: 'x',
|
|
155
|
+
ϳ: 'j',
|
|
156
|
+
ѵ: 'v',
|
|
157
|
+
};
|
|
158
|
+
// Capitals that lowercasing reads wrong: Ν becomes ν, which reads as v.
|
|
159
|
+
const CAPITALS = {
|
|
160
|
+
Β: 'b',
|
|
161
|
+
Ζ: 'z',
|
|
162
|
+
Η: 'h',
|
|
163
|
+
Μ: 'm',
|
|
164
|
+
Ν: 'n',
|
|
165
|
+
Υ: 'y',
|
|
166
|
+
Ү: 'y',
|
|
167
|
+
Ӏ: 'i',
|
|
168
|
+
Ԛ: 'q',
|
|
169
|
+
Ԝ: 'w',
|
|
170
|
+
Ϻ: 'm',
|
|
171
|
+
Ϝ: 'f',
|
|
172
|
+
Ԍ: 'g',
|
|
114
173
|
};
|
|
115
174
|
const LINE_BREAK = /[\n\v\f\r\u0085\u2028\u2029]/;
|
|
116
|
-
export function normalisePhrasing(text) {
|
|
175
|
+
export function normalisePhrasing(text, byLook = false) {
|
|
117
176
|
// NFKC would turn the lunate sigmas into ς and Σ, which the fold can't read as c.
|
|
118
|
-
const
|
|
177
|
+
const compatible = stripInvisible(text).replace(/[ϲϹ]/g, 'c').normalize('NFKC');
|
|
178
|
+
let cased = compatible;
|
|
179
|
+
if (byLook) {
|
|
180
|
+
cased = '';
|
|
181
|
+
for (const char of compatible)
|
|
182
|
+
cased += CAPITALS[char] ?? char;
|
|
183
|
+
}
|
|
184
|
+
const lowered = stripMarks(cased.toLowerCase().normalize('NFC'));
|
|
119
185
|
let folded = '';
|
|
120
186
|
for (const char of lowered)
|
|
121
187
|
folded += CONFUSABLES[char] ?? char;
|
package/dist/phrases.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"phrases.js","sourceRoot":"","sources":["../src/phrases.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzD,MAAM,CAAC,MAAM,cAAc,GAAsB;IAC/C,OAAO;IACP,SAAS;IACT,UAAU;IACV,YAAY;IACZ,SAAS;IACT,aAAa;IACb,YAAY;IACZ,WAAW;IACX,aAAa;IACb,cAAc;IACd,YAAY;IACZ,YAAY;IACZ,eAAe;IACf,cAAc;IACd,WAAW;IACX,eAAe;IACf,MAAM;IACN,aAAa;IACb,YAAY;IACZ,UAAU;IACV,UAAU;IACV,YAAY;IACZ,WAAW;IACX,eAAe;IACf,eAAe;IACf,cAAc;IACd,cAAc;IACd,YAAY;IACZ,eAAe;IACf,UAAU;IACV,UAAU;IACV,oBAAoB;IACpB,kBAAkB;IAClB,oBAAoB;IACpB,aAAa;IACb,UAAU;IACV,cAAc;IACd,WAAW;IACX,eAAe;IACf,aAAa;IACb,aAAa;IACb,eAAe;IACf,WAAW;IACX,UAAU;IACV,aAAa;IACb,iBAAiB;IACjB,iBAAiB;IACjB,cAAc;IACd,YAAY;IACZ,aAAa;IACb,YAAY;IACZ,mBAAmB;IACnB,aAAa;IACb,aAAa;IACb,UAAU;IACV,UAAU;IACV,aAAa;IACb,cAAc;IACd,YAAY;IACZ,WAAW;IACX,OAAO;IACP,UAAU;IACV,aAAa;IACb,YAAY;IACZ,aAAa;IACb,cAAc;IACd,YAAY;IACZ,aAAa;IACb,cAAc;IACd,cAAc;IACd,UAAU;IACV,WAAW;IACX,cAAc;IACd,eAAe;IACf,eAAe;IACf,YAAY;IACZ,WAAW;IACX,aAAa;IACb,oBAAoB;IACpB,mBAAmB;IACnB,YAAY;CACb,CAAC;AAEF,MAAM,WAAW,GAA2B;IAC1C,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;CACP,CAAC;AAEF,MAAM,UAAU,GAAG,8BAA8B,CAAC;AAElD,MAAM,UAAU,iBAAiB,CAAC,IAAY;
|
|
1
|
+
{"version":3,"file":"phrases.js","sourceRoot":"","sources":["../src/phrases.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzD,MAAM,CAAC,MAAM,cAAc,GAAsB;IAC/C,OAAO;IACP,SAAS;IACT,UAAU;IACV,YAAY;IACZ,SAAS;IACT,aAAa;IACb,YAAY;IACZ,WAAW;IACX,aAAa;IACb,cAAc;IACd,YAAY;IACZ,YAAY;IACZ,eAAe;IACf,cAAc;IACd,WAAW;IACX,eAAe;IACf,MAAM;IACN,aAAa;IACb,YAAY;IACZ,UAAU;IACV,UAAU;IACV,YAAY;IACZ,WAAW;IACX,eAAe;IACf,eAAe;IACf,cAAc;IACd,cAAc;IACd,YAAY;IACZ,eAAe;IACf,UAAU;IACV,UAAU;IACV,oBAAoB;IACpB,kBAAkB;IAClB,oBAAoB;IACpB,aAAa;IACb,UAAU;IACV,cAAc;IACd,WAAW;IACX,eAAe;IACf,aAAa;IACb,aAAa;IACb,eAAe;IACf,WAAW;IACX,UAAU;IACV,aAAa;IACb,iBAAiB;IACjB,iBAAiB;IACjB,cAAc;IACd,YAAY;IACZ,aAAa;IACb,YAAY;IACZ,mBAAmB;IACnB,aAAa;IACb,aAAa;IACb,UAAU;IACV,UAAU;IACV,aAAa;IACb,cAAc;IACd,YAAY;IACZ,WAAW;IACX,YAAY;IACZ,cAAc;IACd,kBAAkB;IAClB,OAAO;IACP,UAAU;IACV,aAAa;IACb,YAAY;IACZ,aAAa;IACb,cAAc;IACd,YAAY;IACZ,aAAa;IACb,cAAc;IACd,cAAc;IACd,UAAU;IACV,WAAW;IACX,cAAc;IACd,eAAe;IACf,eAAe;IACf,YAAY;IACZ,WAAW;IACX,aAAa;IACb,oBAAoB;IACpB,mBAAmB;IACnB,UAAU;IACV,oBAAoB;IACpB,oBAAoB;IACpB,oBAAoB;IACpB,oBAAoB;IACpB,mBAAmB;IACnB,mBAAmB;IACnB,gBAAgB;IAChB,kBAAkB;IAClB,YAAY;IACZ,cAAc;IACd,0BAA0B;IAC1B,iBAAiB;IACjB,gBAAgB;IAChB,iBAAiB;IACjB,kBAAkB;IAClB,iBAAiB;IACjB,qBAAqB;IACrB,oBAAoB;IACpB,2BAA2B;IAC3B,YAAY;IACZ,cAAc;IACd,yBAAyB;IACzB,eAAe;IACf,2BAA2B;IAC3B,aAAa;IACb,aAAa;IACb,eAAe;IACf,aAAa;IACb,UAAU;IACV,kBAAkB;IAClB,gBAAgB;IAChB,iBAAiB;IACjB,UAAU;IACV,iBAAiB;IACjB,iBAAiB;IACjB,kBAAkB;IAClB,eAAe;IACf,YAAY;CACb,CAAC;AAEF,MAAM,WAAW,GAA2B;IAC1C,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;CACP,CAAC;AAEF,wEAAwE;AACxE,MAAM,QAAQ,GAA2B;IACvC,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;CACP,CAAC;AAEF,MAAM,UAAU,GAAG,8BAA8B,CAAC;AAElD,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,MAAM,GAAG,KAAK;IAC5D,kFAAkF;IAClF,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAEhF,IAAI,KAAK,GAAG,UAAU,CAAC;IACvB,IAAI,MAAM,EAAE,CAAC;QACX,KAAK,GAAG,EAAE,CAAC;QACX,KAAK,MAAM,IAAI,IAAI,UAAU;YAAE,KAAK,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;IACjE,CAAC;IACD,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IAEjE,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,KAAK,MAAM,IAAI,IAAI,OAAO;QAAE,MAAM,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;IAEhE,OAAO,MAAM;SACV,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC;SAC/B,OAAO,CAAC,qBAAqB,EAAE,GAAG,CAAC;SACnC,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;SAC7D,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,GAAG,UAAU,CAAC;AAE9B,SAAS,OAAO,CAAC,IAAwB;IACvC,OAAO,IAAI,KAAK,SAAS,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrD,CAAC;AAgBD,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAE/B,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,IAAI;YAAE,SAAS;QAC5C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpB,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,OAAgB,EAAE,MAAc;IACtD,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAE1C,MAAM,KAAK,GAAW,EAAE,CAAC;IACzB,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC/D,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEtC,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAElE,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,SAAS,CAAC;QACR,MAAM,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC1C,IAAI,EAAE,KAAK,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QAE5B,MAAM,KAAK,GAAG,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QAC7B,MAAM,GAAG,GAAG,KAAK,CAAC,EAAE,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;QAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QAE3B,MAAM,MAAM,GAAG,IAAI,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QAEvD,MAAM,MAAM,GAAG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;QACtD,MAAM,KAAK,GAAG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;QACnD,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK;YAAE,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAElD,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC;IAChB,CAAC;AACH,CAAC"}
|
package/dist/verify.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../src/verify.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../src/verify.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,KAAK,GAAG,UAAU,GAAG,SAAS,CAAC;AAE3C,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,KAAK,CAAC;IAEb,KAAK,EAAE,MAAM,CAAC;IAEd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,OAAO,CAAC;IAEnB,QAAQ,EAAE,OAAO,GAAG,aAAa,CAAC;IAElC,OAAO,EAAE,MAAM,CAAC;IAEhB,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,WAAW,CAAC;IACtB,OAAO,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,KAAK;IACpB,MAAM,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IAE9C,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAElC,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,YAAY,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,WAAW,EAAE,CAAC;IAEtB,YAAY,EAAE,WAAW,CAAC;CAC3B;AA2ID,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,YAAY,CAE/D;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,KAAK,GAAG,WAAW,CAmBtF"}
|
package/dist/verify.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { numeralsIn, supportedValues } from './numerals.js';
|
|
2
|
-
import { BANNED_PHRASES, indexPhrasing, normalisePhrasing, spansIn } from './phrases.js';
|
|
2
|
+
import { BANNED_PHRASES, indexPhrasing, normalisePhrasing, spansIn, } from './phrases.js';
|
|
3
3
|
const readings = new WeakMap();
|
|
4
4
|
function unchanged(held, values) {
|
|
5
5
|
if (held.length !== values.length)
|
|
@@ -78,21 +78,31 @@ function standsBehind(allowed, hit) {
|
|
|
78
78
|
return false;
|
|
79
79
|
}
|
|
80
80
|
function checkWording(text, phrases, allowed) {
|
|
81
|
-
|
|
82
|
-
const
|
|
81
|
+
// Read twice, since Ν reads as N but ν as v; both readings are the same length, so spans line up.
|
|
82
|
+
const texts = [normalisePhrasing(text)];
|
|
83
|
+
const byLook = normalisePhrasing(text, true);
|
|
84
|
+
if (byLook !== texts[0])
|
|
85
|
+
texts.push(byLook);
|
|
86
|
+
const scans = [];
|
|
83
87
|
const spans = [];
|
|
84
|
-
for (const
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
+
for (const normalised of texts) {
|
|
89
|
+
const indexed = indexPhrasing(normalised);
|
|
90
|
+
scans.push(indexed);
|
|
91
|
+
for (const phrase of allowed) {
|
|
92
|
+
for (const span of spansIn(indexed, phrase)) {
|
|
93
|
+
if (!normalised.slice(span.start, span.end + 1).includes('\n'))
|
|
94
|
+
spans.push(span);
|
|
95
|
+
}
|
|
88
96
|
}
|
|
89
97
|
}
|
|
90
98
|
const findings = [];
|
|
91
99
|
for (const phrase of phrases) {
|
|
92
100
|
let caught = false;
|
|
93
|
-
for (const
|
|
94
|
-
|
|
95
|
-
|
|
101
|
+
for (const indexed of scans) {
|
|
102
|
+
for (const hit of spansIn(indexed, phrase)) {
|
|
103
|
+
if (!standsBehind(spans, hit))
|
|
104
|
+
caught = true;
|
|
105
|
+
}
|
|
96
106
|
}
|
|
97
107
|
if (!caught)
|
|
98
108
|
continue;
|
package/dist/verify.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../src/verify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAgB,MAAM,eAAe,CAAC;AAC1E,OAAO,
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../src/verify.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/phrases.ts
CHANGED
|
@@ -61,6 +61,9 @@ export const BANNED_PHRASES: readonly string[] = [
|
|
|
61
61
|
'limited time',
|
|
62
62
|
'today only',
|
|
63
63
|
'ends soon',
|
|
64
|
+
'ends today',
|
|
65
|
+
'ends tonight',
|
|
66
|
+
'ends at midnight',
|
|
64
67
|
'hurry',
|
|
65
68
|
'act fast',
|
|
66
69
|
'do not miss',
|
|
@@ -81,7 +84,45 @@ export const BANNED_PHRASES: readonly string[] = [
|
|
|
81
84
|
'star rating',
|
|
82
85
|
'customer favourite',
|
|
83
86
|
'customer favorite',
|
|
87
|
+
'trending',
|
|
88
|
+
'others are looking',
|
|
89
|
+
'people are looking',
|
|
90
|
+
'others are viewing',
|
|
91
|
+
'people are viewing',
|
|
92
|
+
'others are buying',
|
|
93
|
+
'people are buying',
|
|
94
|
+
'in other carts',
|
|
95
|
+
'in other baskets',
|
|
84
96
|
'money back',
|
|
97
|
+
'eco friendly',
|
|
98
|
+
'environmentally friendly',
|
|
99
|
+
'planet friendly',
|
|
100
|
+
'earth friendly',
|
|
101
|
+
'nature friendly',
|
|
102
|
+
'climate friendly',
|
|
103
|
+
'carbon friendly',
|
|
104
|
+
'good for the planet',
|
|
105
|
+
'kind to the planet',
|
|
106
|
+
'gentle on the environment',
|
|
107
|
+
'ecological',
|
|
108
|
+
'ecologically',
|
|
109
|
+
'environmentally correct',
|
|
110
|
+
'eco conscious',
|
|
111
|
+
'environmentally conscious',
|
|
112
|
+
'sustainable',
|
|
113
|
+
'sustainably',
|
|
114
|
+
'biodegradable',
|
|
115
|
+
'compostable',
|
|
116
|
+
'biobased',
|
|
117
|
+
'energy efficient',
|
|
118
|
+
'carbon neutral',
|
|
119
|
+
'climate neutral',
|
|
120
|
+
'net zero',
|
|
121
|
+
'carbon negative',
|
|
122
|
+
'carbon positive',
|
|
123
|
+
'climate positive',
|
|
124
|
+
'carbon offset',
|
|
125
|
+
'zero waste',
|
|
85
126
|
];
|
|
86
127
|
|
|
87
128
|
const CONFUSABLES: Record<string, string> = {
|
|
@@ -113,15 +154,39 @@ const CONFUSABLES: Record<string, string> = {
|
|
|
113
154
|
τ: 't',
|
|
114
155
|
υ: 'u',
|
|
115
156
|
χ: 'x',
|
|
157
|
+
ϳ: 'j',
|
|
158
|
+
ѵ: 'v',
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
// Capitals that lowercasing reads wrong: Ν becomes ν, which reads as v.
|
|
162
|
+
const CAPITALS: Record<string, string> = {
|
|
163
|
+
Β: 'b',
|
|
164
|
+
Ζ: 'z',
|
|
165
|
+
Η: 'h',
|
|
166
|
+
Μ: 'm',
|
|
167
|
+
Ν: 'n',
|
|
168
|
+
Υ: 'y',
|
|
169
|
+
Ү: 'y',
|
|
170
|
+
Ӏ: 'i',
|
|
171
|
+
Ԛ: 'q',
|
|
172
|
+
Ԝ: 'w',
|
|
173
|
+
Ϻ: 'm',
|
|
174
|
+
Ϝ: 'f',
|
|
175
|
+
Ԍ: 'g',
|
|
116
176
|
};
|
|
117
177
|
|
|
118
178
|
const LINE_BREAK = /[\n\v\f\r\u0085\u2028\u2029]/;
|
|
119
179
|
|
|
120
|
-
export function normalisePhrasing(text: string): string {
|
|
180
|
+
export function normalisePhrasing(text: string, byLook = false): string {
|
|
121
181
|
// NFKC would turn the lunate sigmas into ς and Σ, which the fold can't read as c.
|
|
122
|
-
const
|
|
123
|
-
|
|
124
|
-
|
|
182
|
+
const compatible = stripInvisible(text).replace(/[ϲϹ]/g, 'c').normalize('NFKC');
|
|
183
|
+
|
|
184
|
+
let cased = compatible;
|
|
185
|
+
if (byLook) {
|
|
186
|
+
cased = '';
|
|
187
|
+
for (const char of compatible) cased += CAPITALS[char] ?? char;
|
|
188
|
+
}
|
|
189
|
+
const lowered = stripMarks(cased.toLowerCase().normalize('NFC'));
|
|
125
190
|
|
|
126
191
|
let folded = '';
|
|
127
192
|
for (const char of lowered) folded += CONFUSABLES[char] ?? char;
|
package/src/verify.ts
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
import { numeralsIn, supportedValues, type Numeral } from './numerals.js';
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
BANNED_PHRASES,
|
|
4
|
+
indexPhrasing,
|
|
5
|
+
normalisePhrasing,
|
|
6
|
+
spansIn,
|
|
7
|
+
type Indexed,
|
|
8
|
+
type Span,
|
|
9
|
+
} from './phrases.js';
|
|
3
10
|
|
|
4
11
|
export type Layer = 'quantity' | 'wording';
|
|
5
12
|
|
|
@@ -131,21 +138,30 @@ function standsBehind(allowed: Span[], hit: Span): boolean {
|
|
|
131
138
|
}
|
|
132
139
|
|
|
133
140
|
function checkWording(text: string, phrases: string[], allowed: string[]): LayerReport {
|
|
134
|
-
|
|
135
|
-
const
|
|
141
|
+
// Read twice, since Ν reads as N but ν as v; both readings are the same length, so spans line up.
|
|
142
|
+
const texts = [normalisePhrasing(text)];
|
|
143
|
+
const byLook = normalisePhrasing(text, true);
|
|
144
|
+
if (byLook !== texts[0]) texts.push(byLook);
|
|
136
145
|
|
|
146
|
+
const scans: Indexed[] = [];
|
|
137
147
|
const spans: Span[] = [];
|
|
138
|
-
for (const
|
|
139
|
-
|
|
140
|
-
|
|
148
|
+
for (const normalised of texts) {
|
|
149
|
+
const indexed = indexPhrasing(normalised);
|
|
150
|
+
scans.push(indexed);
|
|
151
|
+
for (const phrase of allowed) {
|
|
152
|
+
for (const span of spansIn(indexed, phrase)) {
|
|
153
|
+
if (!normalised.slice(span.start, span.end + 1).includes('\n')) spans.push(span);
|
|
154
|
+
}
|
|
141
155
|
}
|
|
142
156
|
}
|
|
143
157
|
|
|
144
158
|
const findings: Finding[] = [];
|
|
145
159
|
for (const phrase of phrases) {
|
|
146
160
|
let caught = false;
|
|
147
|
-
for (const
|
|
148
|
-
|
|
161
|
+
for (const indexed of scans) {
|
|
162
|
+
for (const hit of spansIn(indexed, phrase)) {
|
|
163
|
+
if (!standsBehind(spans, hit)) caught = true;
|
|
164
|
+
}
|
|
149
165
|
}
|
|
150
166
|
if (!caught) continue;
|
|
151
167
|
|