Added storage of surrogate pairs count to every emoji.

This commit is contained in:
23rd 2024-03-06 17:35:19 +03:00 committed by John Preston
parent 5d7445ce7d
commit 3c8cf5f5db
2 changed files with 61 additions and 23 deletions

View file

@ -373,6 +373,24 @@ void ClearUniversalChecked() {
}
}
[[nodiscard]] uint8 EmojiSurrogatePairs(const QString &e) {
if (e.size() > 1) {
auto count = uint8(0);
const auto begin = e.data();
auto ch = begin;
for (const auto end = begin + e.size(); ch != end; ++ch) {
if ((ch + 1 < end)
&& ch->isHighSurrogate()
&& (ch + 1)->isLowSurrogate()) {
count++;
}
}
return count;
} else {
return 0;
}
}
} // namespace
namespace internal {
@ -627,6 +645,22 @@ int GetSizeTouchbar() {
}
#endif
One::One(
const QString &id,
EmojiPtr original,
uint32 index,
bool hasPostfix,
bool colorizable,
const CreationTag &)
: _id(id)
, _original(original)
, _index(index)
, _hasPostfix(hasPostfix)
, _colorizable(colorizable)
, _surrogatePairs(EmojiSurrogatePairs(text())) {
Expects(!_colorizable || !colored());
}
int One::variantsCount() const {
return hasVariants() ? 5 : 0;
}

View file

@ -51,66 +51,70 @@ class One {
public:
One(One &&other) = default;
One(const QString &id, EmojiPtr original, uint32 index, bool hasPostfix, bool colorizable, const CreationTag &)
: _id(id)
, _original(original)
, _index(index)
, _hasPostfix(hasPostfix)
, _colorizable(colorizable) {
Expects(!_colorizable || !colored());
}
One(
const QString &id,
EmojiPtr original,
uint32 index,
bool hasPostfix,
bool colorizable,
const CreationTag &);
QString id() const {
[[nodiscard]] QString id() const {
return _id;
}
QString text() const {
[[nodiscard]] QString text() const {
return hasPostfix() ? (_id + QChar(kPostfix)) : _id;
}
bool colored() const {
[[nodiscard]] bool colored() const {
return (_original != nullptr);
}
EmojiPtr original() const {
[[nodiscard]] EmojiPtr original() const {
return _original ? _original : this;
}
QString nonColoredId() const {
[[nodiscard]] QString nonColoredId() const {
return original()->id();
}
bool hasPostfix() const {
[[nodiscard]] bool hasPostfix() const {
return _hasPostfix;
}
bool hasVariants() const {
[[nodiscard]] bool hasVariants() const {
return _colorizable || colored();
}
int variantsCount() const;
int variantIndex(EmojiPtr variant) const;
EmojiPtr variant(int index) const;
[[nodiscard]] int variantsCount() const;
[[nodiscard]] int variantIndex(EmojiPtr variant) const;
[[nodiscard]] EmojiPtr variant(int index) const;
int index() const {
[[nodiscard]] int index() const {
return _index;
}
int sprite() const {
[[nodiscard]] int sprite() const {
return int(_index >> 9);
}
int row() const {
[[nodiscard]] int row() const {
return int((_index >> 5) & 0x0FU);
}
int column() const {
[[nodiscard]] int column() const {
return int(_index & 0x1FU);
}
QString toUrl() const {
[[nodiscard]] QString toUrl() const {
return "emoji://e." + QString::number(index());
}
[[nodiscard]] uint8 surrogatePairs() const {
return _surrogatePairs;
}
private:
const QString _id;
const EmojiPtr _original = nullptr;
const uint32 _index = 0;
const bool _hasPostfix = false;
const bool _colorizable = false;
const uint8 _surrogatePairs;
friend void internal::Init();