mirror of https://github.com/procxx/kepka.git
Fix some missing emoji display.
This commit is contained in:
parent
60711471fc
commit
ec2a1b3ddb
|
@ -1890,6 +1890,30 @@ InputCategory Category7 = {
|
||||||
{ 0xD83CDDFFU, 0xD83CDDFCU, },
|
{ 0xD83CDDFFU, 0xD83CDDFCU, },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Original data has those emoji only with gender symbols.
|
||||||
|
// But they should be displayed as emoji even without gender symbols.
|
||||||
|
// So we map which gender symbol to use for an emoji without one.
|
||||||
|
std::map<InputId, uint32> WithoutGenderAliases = {
|
||||||
|
{ { 0xD83EDDB8U, }, 0x2640U },
|
||||||
|
{ { 0xD83EDDB9U, }, 0x2640U },
|
||||||
|
{ { 0xD83EDDD9U, }, 0x2640U },
|
||||||
|
{ { 0xD83EDDDAU, }, 0x2640U },
|
||||||
|
{ { 0xD83EDDDBU, }, 0x2640U },
|
||||||
|
{ { 0xD83EDDDCU, }, 0x2642U },
|
||||||
|
{ { 0xD83EDDDDU, }, 0x2642U },
|
||||||
|
{ { 0xD83EDDDEU, }, 0x2642U },
|
||||||
|
{ { 0xD83EDDD6U, }, 0x2642U },
|
||||||
|
{ { 0xD83EDDD7U, }, 0x2640U },
|
||||||
|
{ { 0xD83EDDD8U, }, 0x2640U },
|
||||||
|
};
|
||||||
|
|
||||||
|
// Some flags are sent as one string, but are rendered as a different too.
|
||||||
|
std::map<InputId, InputId> FlagAliases = {
|
||||||
|
{ { 0xD83CDDE8U, 0xD83CDDF5U, }, { 0xD83CDDEBU, 0xD83CDDF7U, } },
|
||||||
|
{ { 0xD83CDDE7U, 0xD83CDDFBU, }, { 0xD83CDDF3U, 0xD83CDDF4U, } },
|
||||||
|
{ { 0xD83CDDE6U, 0xD83CDDE8U, }, { 0xD83CDDF8U, 0xD83CDDEDU, } },
|
||||||
|
};
|
||||||
|
|
||||||
std::map<Id, Id> Aliases;
|
std::map<Id, Id> Aliases;
|
||||||
|
|
||||||
constexpr auto kErrorBadData = 401;
|
constexpr auto kErrorBadData = 401;
|
||||||
|
@ -2087,7 +2111,7 @@ bool AddItemBeforeItem(const InputId &add, const InputId &before) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CheckOldInCurrent() {
|
bool CheckOldInCurrent(std::set<Id> variatedIds) {
|
||||||
const auto categories = {
|
const auto categories = {
|
||||||
&Category1,
|
&Category1,
|
||||||
&Category2,
|
&Category2,
|
||||||
|
@ -2107,28 +2131,47 @@ bool CheckOldInCurrent() {
|
||||||
&old::Category7,
|
&old::Category7,
|
||||||
};
|
};
|
||||||
const auto genders = { 0x2640U, 0x2642U };
|
const auto genders = { 0x2640U, 0x2642U };
|
||||||
const auto addGender = [&](const InputId &was, int index) {
|
const auto addGender = [](const InputId &was, uint32 gender) {
|
||||||
auto result = was;
|
auto result = was;
|
||||||
result.push_back(0x200DU);
|
result.push_back(0x200DU);
|
||||||
result.push_back(*(begin(genders) + index));
|
result.push_back(gender);
|
||||||
result.push_back(0xFE0FU);
|
result.push_back(0xFE0FU);
|
||||||
return result;
|
return result;
|
||||||
};
|
};
|
||||||
|
const auto addGenderByIndex = [&](const InputId &was, int index) {
|
||||||
|
return addGender(was, *(begin(genders) + index));
|
||||||
|
};
|
||||||
|
const auto find = [](
|
||||||
|
const InputCategory &list,
|
||||||
|
const InputId &id) {
|
||||||
|
return (std::find(begin(list), end(list), id) != end(list));
|
||||||
|
};
|
||||||
|
const auto findInMany = [&](
|
||||||
|
auto &&list,
|
||||||
|
const InputId &id) {
|
||||||
|
for (const auto current : list) {
|
||||||
|
if (find(*current, id)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
const auto emplaceColoredAlias = [](const InputId &real, const InputId &alias, uint32_t color) {
|
||||||
|
if (real.size() < 2 || alias.size() < 2 || real[1] != Colors[0] || alias[1] != Colors[0]) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
auto key = real;
|
||||||
|
key[1] = color;
|
||||||
|
auto value = alias;
|
||||||
|
value[1] = color;
|
||||||
|
Aliases.emplace(BareIdFromInput(key), BareIdFromInput(value));
|
||||||
|
return true;
|
||||||
|
};
|
||||||
auto result = true;
|
auto result = true;
|
||||||
for (auto c = begin(old); c != end(old); ++c) {
|
for (auto c = begin(old); c != end(old); ++c) {
|
||||||
const auto category = *c;
|
const auto category = *c;
|
||||||
for (auto i = begin(*category); i != end(*category); ++i) {
|
for (auto i = begin(*category); i != end(*category); ++i) {
|
||||||
const auto find = [](
|
if (findInMany(categories, *i)) {
|
||||||
auto &&list,
|
|
||||||
const InputId &id) {
|
|
||||||
for (const auto current : list) {
|
|
||||||
if (std::find(begin(*current), end(*current), id) != end(*current)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
if (find(categories, *i)) {
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2136,7 +2179,7 @@ bool CheckOldInCurrent() {
|
||||||
if (i->back() == 0xFE0FU) {
|
if (i->back() == 0xFE0FU) {
|
||||||
auto other = *i;
|
auto other = *i;
|
||||||
other.pop_back();
|
other.pop_back();
|
||||||
if (find(categories, other)) {
|
if (findInMany(categories, other)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2145,7 +2188,7 @@ bool CheckOldInCurrent() {
|
||||||
if (i->back() != 0xFE0FU) {
|
if (i->back() != 0xFE0FU) {
|
||||||
auto other = *i;
|
auto other = *i;
|
||||||
other.push_back(0xFE0FU);
|
other.push_back(0xFE0FU);
|
||||||
if (find(categories, other)) {
|
if (findInMany(categories, other)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2158,7 +2201,7 @@ bool CheckOldInCurrent() {
|
||||||
altered.push_back(0x200DU);
|
altered.push_back(0x200DU);
|
||||||
altered.push_back(*g);
|
altered.push_back(*g);
|
||||||
altered.push_back(0xFE0FU);
|
altered.push_back(0xFE0FU);
|
||||||
if (find(old, altered)) {
|
if (findInMany(old, altered)) {
|
||||||
return int(g - begin(genders));
|
return int(g - begin(genders));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2176,9 +2219,9 @@ bool CheckOldInCurrent() {
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto genderIndex = (1 - otherGenderIndex);
|
const auto genderIndex = (1 - otherGenderIndex);
|
||||||
const auto real = addGender(*i, genderIndex);
|
const auto real = addGenderByIndex(*i, genderIndex);
|
||||||
const auto bare = BareIdFromInput(real);
|
const auto bare = BareIdFromInput(real);
|
||||||
if (!find(categories, real)) {
|
if (!findInMany(categories, real)) {
|
||||||
common::logError(kErrorBadData, "input")
|
common::logError(kErrorBadData, "input")
|
||||||
<< "Bad data: old emoji (category "
|
<< "Bad data: old emoji (category "
|
||||||
<< (c - begin(old))
|
<< (c - begin(old))
|
||||||
|
@ -2198,11 +2241,6 @@ bool CheckOldInCurrent() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (auto i = begin(old::ColoredEmoji); i != end(old::ColoredEmoji); ++i) {
|
for (auto i = begin(old::ColoredEmoji); i != end(old::ColoredEmoji); ++i) {
|
||||||
const auto find = [](
|
|
||||||
const InputCategory &list,
|
|
||||||
const InputId &id) {
|
|
||||||
return (std::find(begin(list), end(list), id) != end(list));
|
|
||||||
};
|
|
||||||
if (find(ColoredEmoji, *i)) {
|
if (find(ColoredEmoji, *i)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -2229,7 +2267,7 @@ bool CheckOldInCurrent() {
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto genderIndex = (1 - otherGenderIndex);
|
const auto genderIndex = (1 - otherGenderIndex);
|
||||||
const auto real = addGender(*i, genderIndex);
|
const auto real = addGenderByIndex(*i, genderIndex);
|
||||||
const auto bare = BareIdFromInput(real);
|
const auto bare = BareIdFromInput(real);
|
||||||
if (!find(ColoredEmoji, real)) {
|
if (!find(ColoredEmoji, real)) {
|
||||||
common::logError(kErrorBadData, "input")
|
common::logError(kErrorBadData, "input")
|
||||||
|
@ -2245,19 +2283,8 @@ bool CheckOldInCurrent() {
|
||||||
<< "Bad data: two aliases for a gendered emoji.";
|
<< "Bad data: two aliases for a gendered emoji.";
|
||||||
result = false;
|
result = false;
|
||||||
} else {
|
} else {
|
||||||
const auto emplaceAlias = [&](uint32_t color) {
|
|
||||||
if (real.size() < 2 || i->size() < 2 || real[1] != Colors[0] || (*i)[1] != Colors[0]) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
auto key = real;
|
|
||||||
key[1] = color;
|
|
||||||
auto value = *i;
|
|
||||||
value[1] = color;
|
|
||||||
Aliases.emplace(BareIdFromInput(key), BareIdFromInput(value));
|
|
||||||
return true;
|
|
||||||
};
|
|
||||||
for (const auto color : Colors) {
|
for (const auto color : Colors) {
|
||||||
if (!emplaceAlias(color)) {
|
if (!emplaceColoredAlias(real, *i, color)) {
|
||||||
common::logError(kErrorBadData, "input")
|
common::logError(kErrorBadData, "input")
|
||||||
<< "Bad data: bad colored emoji.";
|
<< "Bad data: bad colored emoji.";
|
||||||
result = false;
|
result = false;
|
||||||
|
@ -2266,6 +2293,60 @@ bool CheckOldInCurrent() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (const auto [inputId, gender] : WithoutGenderAliases) {
|
||||||
|
if (findInMany(categories, inputId)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
const auto real = [&] {
|
||||||
|
auto result = addGender(inputId, gender);
|
||||||
|
if (findInMany(categories, result)) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
result.push_back(kPostfix);
|
||||||
|
return result;
|
||||||
|
}();
|
||||||
|
const auto bare = BareIdFromInput(real);
|
||||||
|
if (!findInMany(categories, real)) {
|
||||||
|
common::logError(kErrorBadData, "input")
|
||||||
|
<< "Bad data: without gender alias not found with gender.";
|
||||||
|
result = false;
|
||||||
|
} else if (Aliases.find(bare) != end(Aliases)) {
|
||||||
|
common::logError(kErrorBadData, "input")
|
||||||
|
<< "Bad data: two aliases for a gendered emoji.";
|
||||||
|
result = false;
|
||||||
|
} else {
|
||||||
|
Aliases.emplace(bare, BareIdFromInput(inputId));
|
||||||
|
}
|
||||||
|
if (variatedIds.find(bare) != variatedIds.end()) {
|
||||||
|
auto colorReal = real;
|
||||||
|
colorReal.insert(colorReal.begin() + 1, Colors[0]);
|
||||||
|
auto colorInput = inputId;
|
||||||
|
colorInput.insert(colorInput.begin() + 1, Colors[0]);
|
||||||
|
for (const auto color : Colors) {
|
||||||
|
if (!emplaceColoredAlias(colorReal, colorInput, color)) {
|
||||||
|
common::logError(kErrorBadData, "input")
|
||||||
|
<< "Bad data: bad colored emoji.";
|
||||||
|
result = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const auto [inputId, real] : FlagAliases) {
|
||||||
|
const auto bare = BareIdFromInput(real);
|
||||||
|
if (Aliases.find(bare) != end(Aliases)) {
|
||||||
|
common::logError(kErrorBadData, "input")
|
||||||
|
<< "Bad data: two aliases for a flag emoji.";
|
||||||
|
result = false;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Aliases.emplace(bare, BareIdFromInput(inputId));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2289,7 +2370,7 @@ Data PrepareData() {
|
||||||
return Data();
|
return Data();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!CheckOldInCurrent()) {
|
if (!CheckOldInCurrent(variatedIds)) {
|
||||||
return Data();
|
return Data();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue