Telegram Web K with changes to work inside I2P
https://web.telegram.i2p/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
246 lines
6.6 KiB
246 lines
6.6 KiB
// @ts-check |
|
/* |
|
* https://github.com/morethanwords/tweb |
|
* Copyright (C) 2019-2021 Eduard Kuzmenko |
|
* https://github.com/morethanwords/tweb/blob/master/LICENSE |
|
*/ |
|
|
|
let emoji = require('./in/emoji_pretty.json'); |
|
//let countries = require('./countries_pretty.json'); |
|
|
|
// let countries = require('fs').readFileSync('./in/countries.dat').toString(); |
|
let countries = require('./in/countries.mtproto.json'); |
|
//console.log(countries); |
|
|
|
//console.log(emoji, countries); |
|
|
|
const path = process.argv[2]; |
|
const writePathTo = (/* path || */__dirname + '/out/'); |
|
console.log('Writing to:', writePathTo); |
|
|
|
let formatted = emoji.filter(e => e.has_img_apple); |
|
|
|
function encodeEmoji(emojiText) { |
|
const codepoints = toCodePoints(removeVS16s(emojiText)).join('-'); |
|
return codepoints; |
|
} |
|
|
|
const vs16RegExp = /\uFE0F/g; |
|
// avoid using a string literal like '\u200D' here because minifiers expand it inline |
|
const zeroWidthJoiner = String.fromCharCode(0x200d); |
|
|
|
const removeVS16s = (rawEmoji) => (rawEmoji.indexOf(zeroWidthJoiner) < 0 ? rawEmoji.replace(vs16RegExp, '') : rawEmoji); |
|
|
|
function toCodePoints(unicodeSurrogates) { |
|
const points = []; |
|
let char = 0; |
|
let previous = 0; |
|
let i = 0; |
|
while(i < unicodeSurrogates.length) { |
|
char = unicodeSurrogates.charCodeAt(i++); |
|
if(previous) { |
|
points.push((0x10000 + ((previous - 0xd800) << 10) + (char - 0xdc00)).toString(16)); |
|
previous = 0; |
|
} else if (char > 0xd800 && char <= 0xdbff) { |
|
previous = char; |
|
} else { |
|
points.push(char.toString(16)); |
|
} |
|
} |
|
|
|
if(points.length && points[0].length == 2) { |
|
points[0] = '00' + points[0]; |
|
} |
|
|
|
return points; |
|
} |
|
|
|
/* formatted = formatted.map(e => { |
|
let {unified, name, short_names, category, sheet_x, sheet_y} = e; |
|
|
|
return { |
|
unified, |
|
//name, |
|
//short_names, |
|
category, |
|
sheet_x, |
|
sheet_y |
|
}; |
|
}); |
|
|
|
require('fs').writeFileSync('./emoji.json', JSON.stringify(formatted)); */ |
|
|
|
if(false) { |
|
let obj = {}; |
|
formatted.forEach(e => { |
|
let {unified, name, short_names, category, sheet_x, sheet_y, sort_order} = e; |
|
|
|
let emoji = unified.split('-') |
|
.reduce((prev, curr) => prev + String.fromCodePoint(parseInt(curr, 16)), ''); |
|
|
|
obj[/* unified */emoji] = { |
|
//unified, |
|
//name, |
|
//short_names, |
|
category, |
|
sheet_x, |
|
sheet_y, |
|
sort_order |
|
}; |
|
}); |
|
|
|
require('fs').writeFileSync('./out/emoji.json', JSON.stringify(obj)); |
|
} |
|
|
|
{ |
|
let categories = { |
|
"Smileys & Emotion": 1 |
|
, "People & Body": 1 |
|
, "Animals & Nature": 2 |
|
, "Food & Drink": 3 |
|
, "Travel & Places": 4 |
|
, "Activities": 5 |
|
, "Objects": 6 |
|
, "Symbols": 6 |
|
, "Flags": 7 |
|
, "Skin Tones": 8 |
|
}; |
|
|
|
let concatCategories = [['Objects', 'Symbols'], ['Smileys & Emotion', 'People & Body']]; |
|
let maxIndexes = {}; |
|
|
|
let maxObjectsIndex = -1; |
|
formatted.forEach(e => { |
|
if(concatCategories.findIndex(c => c[0] == e.category) === -1) return; |
|
|
|
if(!maxIndexes.hasOwnProperty(e.category)) maxIndexes[e.category] = 0; |
|
if(e.sort_order > maxIndexes[e.category]) { |
|
maxIndexes[e.category] = e.sort_order; |
|
} |
|
}); |
|
formatted.forEach(e => { |
|
let concatDetails = concatCategories.find(c => c[1] == e.category); |
|
if(!concatDetails) return; |
|
|
|
e.sort_order += maxIndexes[concatDetails[0]]; |
|
}); |
|
|
|
formatted.forEach(e => { |
|
if(e.skin_variations) { |
|
for(let i in e.skin_variations) { |
|
formatted.push(e.skin_variations[i]); |
|
} |
|
} |
|
}); |
|
|
|
let obj = {}; |
|
if(false/* || true */) formatted.forEach(e => { |
|
let {unified, name, short_names, category, sheet_x, sheet_y, sort_order} = e; |
|
|
|
let emoji = unified/* .replace(/-FE0F/gi, '') */.split('-') |
|
.reduce((prev, curr) => prev + String.fromCodePoint(parseInt(curr, 16)), ''); |
|
|
|
//emoji = emoji.replace(/[\ufe0f\u200d]/g, ''); |
|
|
|
let c = categories[category] === undefined ? 9 : categories[category]; |
|
//obj[emoji] = '' + c + sort_order; |
|
//obj[emoji] = +('' + (c * 1000 + sort_order)).replace(/0+/g, '0').replace(/^(\d)0(\d)/g, '$1$2'); |
|
obj[emoji] = e.sort_order !== undefined ? +('' + c + sort_order) : 0; |
|
}); |
|
|
|
const migrateFromVersion = 13.1; |
|
if(true) formatted.forEach(e => { |
|
let {unified, name, short_names, category, sheet_x, sheet_y, sort_order, added_in} = e; |
|
|
|
let emoji = unified.split('-') |
|
.reduce((prev, curr) => prev + String.fromCodePoint(parseInt(curr, 16)), ''); |
|
|
|
emoji = encodeEmoji(emoji); |
|
emoji = emoji.replace(/-?fe0f/g, ''); |
|
//emoji = emoji.replace(/-?fe0f$/, ''); |
|
|
|
let _obj = obj; |
|
if(migrateFromVersion) { |
|
const version = +added_in; |
|
const key = migrateFromVersion >= version ? '' : version; |
|
_obj = obj[key] ?? (obj[key] = {}); |
|
} |
|
|
|
let c = categories[category] === undefined ? 9 : categories[category]; |
|
//obj[emoji] = '' + c + sort_order; |
|
//obj[emoji] = +('' + (c * 1000 + sort_order)).replace(/0+/g, '0').replace(/^(\d)0(\d)/g, '$1$2'); |
|
_obj[emoji] = e.sort_order !== undefined ? +('' + c + sort_order) : 0; |
|
}); |
|
|
|
console.log(obj); |
|
|
|
require('fs').writeFileSync(writePathTo + 'emoji.json', JSON.stringify(obj)); |
|
} |
|
|
|
/* { |
|
let obj = {}; |
|
formatted.forEach(e => { |
|
let {unified, name, short_names, category, sheet_x, sheet_y} = e; |
|
|
|
|
|
let categories = ["Smileys & People", "Animals & Nature", "Food & Drink", |
|
"Travel & Places", "Activities", "Objects", "Symbols", "Flags", "Skin Tones"]; |
|
let categoryId = categories.findIndex(c => c == category); |
|
if(categoryId === -1) throw new Error(category); |
|
|
|
obj[unified] = [ |
|
sheet_x, |
|
sheet_y, |
|
categoryId |
|
]; |
|
}); |
|
|
|
require('fs').writeFileSync('./emoji.json', JSON.stringify(obj)); |
|
} */ |
|
|
|
// old countries format |
|
// { |
|
// let arr = []; |
|
// /* countries.forEach(e => { |
|
// let {name, code, phoneCode} = e; |
|
|
|
// arr.push([name, code, phoneCode]); |
|
// }); */ |
|
|
|
// const lines = countries.split('\n'); |
|
// const data2 = []; |
|
// lines.forEach(x => { |
|
// if(!x.trim()) return; |
|
// const split = x.split(';'); |
|
// const item = { |
|
// phoneCode: split[0], |
|
// code: split[1], |
|
// name: split[2], |
|
// pattern: split[3], |
|
// //count: Number(split[4]), |
|
// emoji: split[5] |
|
// }; |
|
|
|
// arr.push(item); |
|
// //console.log(item); |
|
// }); |
|
|
|
// require('fs').writeFileSync(writePathTo + 'countries.json', JSON.stringify(arr)); |
|
// } |
|
|
|
{ |
|
const c = countries.filter(country => !country.pFlags.hidden); |
|
c.forEach(country => { |
|
delete country._; |
|
delete country.pFlags; |
|
delete country.flags; |
|
|
|
country.country_codes.forEach(countryCode => { |
|
delete countryCode._; |
|
delete countryCode.pFlags; |
|
delete countryCode.flags; |
|
}); |
|
}); |
|
|
|
require('fs').writeFileSync(writePathTo + 'countries.json', JSON.stringify(c)); |
|
}
|
|
|