25 Commits

Author SHA1 Message Date
tate
50c1f3aa73 Update README.md 2021-11-29 14:03:02 +11:00
TateB
0f14f53ec4 updated to add morre homoglyphs + use english chars only 2021-11-29 13:40:18 +11:00
Vitaly Puzrin
7a61c5e20e 1.0.6 released 2020-05-18 08:06:29 +03:00
Vitaly Puzrin
87c8f30f3e dev deps bump 2020-05-18 08:04:21 +03:00
Vitaly Puzrin
9d6bc548cd Encode 2028 & 2029 chars in text form, close #7 2020-05-18 08:02:04 +03:00
Vitaly Puzrin
193738762a Mapping data update to v13.0.0 2020-05-18 07:30:45 +03:00
Vitaly Puzrin
af3e0a9b7c 1.0.5 released 2020-03-03 05:02:17 +03:00
Vitaly Puzrin
7ff0277276 Merge pull request #6 from turt2live/patch-1
Ship the TypeScript declarations too
2020-03-03 04:59:09 +03:00
Travis Ralston
d6ec78e7c1 Ship the TypeScript declarations too
TypeScript declarations were added, but unfortunately they didn't get put into the release because they weren't listed as a file.
2020-03-02 18:19:17 -07:00
Vitaly Puzrin
7ac80669b0 1.0.4 released 2020-02-05 22:14:43 +03:00
Vitaly Puzrin
0fca8b9920 Revert "Use HTTPS do download confusables"
This reverts commit a6c803a17d.
2020-02-05 22:06:25 +03:00
Vitaly Puzrin
b7a5926d98 Merge pull request #5 from foldleft/foldleft/type-defs
add a type definition file for typescript users
2020-02-05 21:55:09 +03:00
Zoe
fee537fbf9 add a type definition file for typescript users 2020-02-05 12:01:02 +00:00
Vitaly Puzrin
5fa3d0af6f Use HTTPS do download confusables (#4)
Use HTTPS do download confusables
2020-01-15 20:13:39 +03:00
Jonathan Leitschuh
a6c803a17d Use HTTPS do download confusables 2020-01-15 12:10:41 -05:00
Vitaly Puzrin
2f17975f88 1.0.3 released 2019-11-04 19:50:58 +03:00
Vitaly Puzrin
ef5dfe6afc Dev deps bump 2019-11-04 19:48:24 +03:00
Vitaly Puzrin
cb57f4472e Travis-CI: use last stable node for testing 2019-11-04 19:43:33 +03:00
Vitaly Puzrin
189c8c278c Merge pull request #3 from petitchevalroux/v-12.1.0
Mapping data update to v12.1.0
2019-11-04 19:10:58 +03:00
Patrick Poulain
0b428f40cf Mapping data update to v12.1.0 2019-11-04 17:03:50 +01:00
Vitaly Puzrin
fed5576b38 Improve example 2017-04-09 14:23:14 +03:00
Vitaly Puzrin
77448891d7 Typo fix 2017-03-15 07:26:18 +03:00
Vitaly Puzrin
59c5f0e151 Add more explanations to readme 2017-03-05 06:06:21 +03:00
Vitaly Puzrin
0bc3804849 1.0.2 released 2017-03-05 05:21:05 +03:00
Vitaly Puzrin
ce667c335a Mapping data update to v9.0.0 2017-03-05 05:16:50 +03:00
10 changed files with 674 additions and 205 deletions

View File

@@ -1,5 +1,3 @@
language: node_js
node_js:
- '4'
- '6'
sudo: false
- node

View File

@@ -1,3 +1,38 @@
1.0.6 / 2020-05-18
------------------
- Update mapping data to version 13.0.0
http://www.unicode.org/Public/security/latest/confusables.txt
- Encode `\u2028` & `\u2029` as text, #7.
- Dev deps bump.
1.0.5 / 2020-03-03
------------------
- Include missed TS definition into npm package.
1.0.4 / 2020-02-05
------------------
- Added TS definition.
1.0.3 / 2019-11-04
------------------
- Update mapping data to version 12.1.0
http://www.unicode.org/Public/security/latest/confusables.txt
- Dev deps bump.
1.0.2 / 2017-03-05
------------------
- Update mapping data to version 9.0.0
http://www.unicode.org/Public/security/latest/confusables.txt
1.0.1 / 2016-12-09
------------------

View File

@@ -4,14 +4,21 @@
[![NPM version](https://img.shields.io/npm/v/unhomoglyph.svg?style=flat)](https://www.npmjs.org/package/unhomoglyph)
> Replace all homoglyphs with base characters. Useful to detect similar strings.
For example, to prohibit register similar looking nicknames at websites.
Data source - [Recommended confusable mapping for IDN](http://www.unicode.org/Public/security/latest/confusables.txt), v8.0.0.
Data source - [Recommended confusable mapping for IDN](http://www.unicode.org/Public/security/latest/confusables.txt), v13.0.0.
Similar letters array in addOther.js provided by [litruv](https://github.com/litruv) and [KillAllTheHippies](https://github.com/killallthehippies).
__Note!__ Text after transform is NOT intended be read by humans. For example,
`m` will be transformed to `r` + `n`. Goal is to compare 2 strings after
transform, to check if sources looks similar or not. If sources look similar,
then transformed strings are equal.
## Install
```bash
npm install unhomoglyph --save
npm i git+https://github.com/TateB/unhomoglyph.git
```
@@ -21,6 +28,18 @@ npm install unhomoglyph --save
const unhomoglyph = require('unhomoglyph');
console.log(unhomoglyph('AΑА')); // => AAAAAAA
console.log(unhomoglyph('m')); // => rn (r + n)
//
// Compare nicknames
//
const username1 = 'm';
const username2 = 'rn';
if (unhomoglyph(username1) === unhomoglyph(username2)) {
console.log(`"${username1}" and "${username2} look similar`);
}
```

44
addOther.js Normal file
View File

@@ -0,0 +1,44 @@
const fs = require('fs')
const path = require('path')
const savePath = path.join(__dirname, 'data.json')
var data = require('./data.json')
const similarLetters = [
{ eng: "a", alts: "₳АаДдӔӕА̊а̊А̄а̄ӒӓӐӑꙘꙙѦѧӘәa͏α𝓐𝓪𝐀🇦𝐚" },
{ eng: "b", alts: "฿БбВвЫыЪъЬь6Ҍҍb͏𝓑𝓫𝐁𝐛🇧" },
{ eng: "c", alts: "🇨₵Сс(ҪҫС́с́c͏¢𝓒𝓬𝐂𝐜" },
{ eng: "d", alts: "ĐԂԃ🇩Ԁԁd͏𝓓𝓭𝐃𝐝" },
{ eng: "e", alts: ЕеЁёЗ🇪зЭэЄ̈є̈Е̃е̃Е̄е̄Ё̄ё̄ӖӗЀѐԐԑЄєӠӡe͏𝓔𝓮𝐄𝐞" },
{ eng: "f", alts: "₣Ғғf͏𝓕🇫𝓯𝐅𝐟" },
{ eng: "g", alts: "₲Ԍԍg͏𝓖𝓰𝐆🇬𝐠" },
{ eng: "h", alts: "НⱧнӉӊҢңԨԩӇӈҺһԊԋ🇭h͏𝓗𝓱𝐇𝐡" },
{ eng: "i", alts: "l1ł|ӀӏЇїІіi͏ι𝓘𝓲🇮𝐈𝐢" },
{ eng: "j", alts: "Јјj͏Jנ𝓙𝓳𝐉𝐣🇯" },
{ eng: "k", alts: "КкҚқ₭ҜҝҞҟҠҡk͏𝓚𝓴𝐊🇰𝐤" },
{ eng: "l", alts: "l͏𝓛𝓵𝐋𝐥🇱" },
{ eng: "m", alts: "МмӍӎm͏𝓜𝓶𝐌𝐦🇲" },
{ eng: "n", alts: "ИиЙйЛлП₦пԤԥn͏𝓝𝓷𝐍𝐧🇳" },
{ eng: "o", alts: "ОоЮюФф0ӪØӫӦӧО̄о̄ꙔꙕѲѳѺѻꙪꙫꙨꙩꚚꚛӨө🇴o͏σ𝓞𝓸𝐎𝐨" },
{ eng: "p", alts: "РрР̌р̌Ҏҏp͏ρ𝓟𝓹𝐏🇵" },
{ eng: "q", alts: "g9q͏𝓠𝓺𝐐Q𝐪🇶" },
{ eng: "r", alts: гЯяԘԙԆԇԄԅr͏𝓡𝓻𝐑𝐫Ɽ🇷" },
{ eng: "s", alts: "5Ѕѕs͏𝓢𝓼𝐒𝐬🇸₴" },
{ eng: "t", alts: "ТтҬҭt͏𝓣𝓽𝐓𝐭₮🇹" },
{ eng: "u", alts: "vЦцꙠꙡu͏υ𝓤𝓾𝐔𝐮🇺Ʉ"},
{ eng: "v", alts: "ѶѷѴѵv͏ν𝓥𝓿𝐕𝐯🇻"},
{ eng: "w", alts: "ШшЩщꚆꚇѠѡԜԝw͏ω𝓦𝔀𝐖𝐰🇼₩" },
{ eng: "x", alts: "ХхҲҳӾӿӼӽx͏χ𝓧𝔁𝐗🇽𝐱" },
{ eng: "y", alts: "УуҮүЧчЦцӮӯӰӱЎўӲӳꚎꚏy͏🇾𝓨𝔂𝐘𝐲Ɏ" },
{ eng: "z", alts: "2ЗзЖжЗ́ж́z͏𝓩𝔃𝐙𝐳Ⱬ🇿" }
]
similarLetters.forEach((letter) => {
const alts = letter.alts.normalize('NFD').replace(/\p{Diacritic}/gu, "").replace(/[\u200B-\u200D\uFEFF\u034F]/g, '');
[...alts].forEach((alt) => {
data[alt.toLowerCase()] = letter.eng
})
})
fs.writeFileSync(savePath, JSON.stringify(data, null, 2))
console.log("Added alternatives")

746
data.json

File diff suppressed because it is too large Load Diff

4
index.d.ts vendored Normal file
View File

@@ -0,0 +1,4 @@
declare module 'unhomoglyph' {
const unhomoglyph: (s: string) => string;
export default unhomoglyph;
}

View File

@@ -14,7 +14,7 @@ function replace_fn(match) {
}
function unhomoglyph(str) {
return str.replace(REPLACE_RE, replace_fn);
return str.toLowerCase().normalize('NFD').replace(/\p{Diacritic}/gu, "").replace(/[\u200B-\u200D\uFEFF\u034F]/g, '').replace(REPLACE_RE, replace_fn).toLowerCase();
}
module.exports = unhomoglyph;

View File

@@ -1,6 +1,6 @@
{
"name": "unhomoglyph",
"version": "1.0.1",
"version": "1.0.6",
"description": "Replace all homoglyphs with base characters.",
"keywords": [
"homoglyph",
@@ -10,7 +10,8 @@
"license": "MIT",
"files": [
"index.js",
"data.json"
"data.json",
"index.d.ts"
],
"scripts": {
"lint": "eslint .",
@@ -18,7 +19,7 @@
"update": "node update.js && npm test"
},
"devDependencies": {
"eslint": "^3.11.1",
"mocha": "^3.2.0"
"eslint": "^7.0.0",
"mocha": "^7.1.2"
}
}

View File

@@ -26,4 +26,8 @@ describe('unhomoglyph', function () {
assert.strictEqual(unhomoglyph('1abcаа'), 'labcaa');
});
it('2028 & 2029 should be ok after replace in updater', function () {
assert.strictEqual(data['\u2028'], ' ');
assert.strictEqual(data['\u2029'], ' ');
});
});

View File

@@ -37,8 +37,14 @@ function save(str) {
result[src] = dst;
});
let output = JSON.stringify(result, null, ' ')
// Workaround for ES9 <=> ES10 inconsistency
// https://github.com/nodeca/unhomoglyph/issues/7
// https://github.com/facebook/hermes/issues/235#issuecomment-623606572
.replace(/\u2028/g, '\\u2028')
.replace(/\u2029/g, '\\u2029');
fs.writeFileSync(SAVE_PATH, JSON.stringify(result, null, ' '));
fs.writeFileSync(SAVE_PATH, output);
console.log('Done!');
}