Fix parsing links with markup to entities.
This commit is contained in:
parent
2d71162f4a
commit
0028a534d2
1 changed files with 27 additions and 15 deletions
|
|
@ -3167,7 +3167,8 @@ void String::enumerateText(TextSelection selection, AppendPartCallback appendPar
|
||||||
if (rangeTo > rangeFrom) { // handle click handler
|
if (rangeTo > rangeFrom) { // handle click handler
|
||||||
QStringRef r = _text.midRef(rangeFrom, rangeTo - rangeFrom);
|
QStringRef r = _text.midRef(rangeFrom, rangeTo - rangeFrom);
|
||||||
if (lnkFrom != rangeFrom || blockFrom != rangeTo) {
|
if (lnkFrom != rangeFrom || blockFrom != rangeTo) {
|
||||||
appendPartCallback(r);
|
// Ignore links that are partially copied.
|
||||||
|
clickHandlerFinishCallback(r, nullptr);
|
||||||
} else {
|
} else {
|
||||||
clickHandlerFinishCallback(r, _links.at(lnkIndex - 1));
|
clickHandlerFinishCallback(r, _links.at(lnkIndex - 1));
|
||||||
}
|
}
|
||||||
|
|
@ -3192,7 +3193,6 @@ void String::enumerateText(TextSelection selection, AppendPartCallback appendPar
|
||||||
|
|
||||||
if ((*i)->type() == TextBlockTSkip) continue;
|
if ((*i)->type() == TextBlockTSkip) continue;
|
||||||
|
|
||||||
if (!blockLnkIndex) {
|
|
||||||
auto rangeFrom = qMax(selection.from, blockFrom);
|
auto rangeFrom = qMax(selection.from, blockFrom);
|
||||||
auto rangeTo = qMin(selection.to, uint16(blockFrom + countBlockLength(i, e)));
|
auto rangeTo = qMin(selection.to, uint16(blockFrom + countBlockLength(i, e)));
|
||||||
if (rangeTo > rangeFrom) {
|
if (rangeTo > rangeFrom) {
|
||||||
|
|
@ -3200,7 +3200,6 @@ void String::enumerateText(TextSelection selection, AppendPartCallback appendPar
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
QString String::toString(TextSelection selection) const {
|
QString String::toString(TextSelection selection) const {
|
||||||
return toText(selection, false, false).rich.text;
|
return toText(selection, false, false).rich.text;
|
||||||
|
|
@ -3270,23 +3269,21 @@ TextForMimeData String::toText(
|
||||||
linkStart = result.rich.text.size();
|
linkStart = result.rich.text.size();
|
||||||
};
|
};
|
||||||
const auto clickHandlerFinishCallback = [&](
|
const auto clickHandlerFinishCallback = [&](
|
||||||
const QStringRef &part,
|
const QStringRef &inText,
|
||||||
const ClickHandlerPtr &handler) {
|
const ClickHandlerPtr &handler) {
|
||||||
|
if (!handler || (!composeExpanded && !composeEntities)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
const auto entity = handler->getTextEntity();
|
const auto entity = handler->getTextEntity();
|
||||||
const auto plainUrl = (entity.type == EntityType::Url)
|
const auto plainUrl = (entity.type == EntityType::Url)
|
||||||
|| (entity.type == EntityType::Email);
|
|| (entity.type == EntityType::Email);
|
||||||
const auto full = plainUrl
|
const auto full = plainUrl
|
||||||
? entity.data.midRef(0, entity.data.size())
|
? entity.data.midRef(0, entity.data.size())
|
||||||
: part;
|
: inText;
|
||||||
result.rich.text.append(full);
|
|
||||||
if (!composeExpanded && !composeEntities) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const auto customTextLink = (entity.type == EntityType::CustomUrl);
|
const auto customTextLink = (entity.type == EntityType::CustomUrl);
|
||||||
const auto internalLink = customTextLink
|
const auto internalLink = customTextLink
|
||||||
&& entity.data.startsWith(qstr("internal:"));
|
&& entity.data.startsWith(qstr("internal:"));
|
||||||
if (composeExpanded) {
|
if (composeExpanded) {
|
||||||
result.expanded.append(full);
|
|
||||||
const auto sameAsTextLink = customTextLink
|
const auto sameAsTextLink = customTextLink
|
||||||
&& (entity.data
|
&& (entity.data
|
||||||
== UrlClickHandler::EncodeForOpening(full.toString()));
|
== UrlClickHandler::EncodeForOpening(full.toString()));
|
||||||
|
|
@ -3299,7 +3296,7 @@ TextForMimeData String::toText(
|
||||||
insertEntity({
|
insertEntity({
|
||||||
entity.type,
|
entity.type,
|
||||||
linkStart,
|
linkStart,
|
||||||
full.size(),
|
(result.rich.text.size() - linkStart),
|
||||||
plainUrl ? QString() : entity.data });
|
plainUrl ? QString() : entity.data });
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
@ -3317,6 +3314,21 @@ TextForMimeData String::toText(
|
||||||
clickHandlerFinishCallback,
|
clickHandlerFinishCallback,
|
||||||
flagsChangeCallback);
|
flagsChangeCallback);
|
||||||
|
|
||||||
|
if (composeEntities) {
|
||||||
|
const auto proj = [](const EntityInText &entity) {
|
||||||
|
const auto type = entity.type();
|
||||||
|
const auto isUrl = (type == EntityType::Url)
|
||||||
|
|| (type == EntityType::CustomUrl)
|
||||||
|
|| (type == EntityType::BotCommand)
|
||||||
|
|| (type == EntityType::Mention)
|
||||||
|
|| (type == EntityType::MentionName)
|
||||||
|
|| (type == EntityType::Hashtag)
|
||||||
|
|| (type == EntityType::Cashtag);
|
||||||
|
return std::pair{ entity.offset(), isUrl ? 0 : 1 };
|
||||||
|
};
|
||||||
|
ranges::sort(result.rich.entities, std::less<>(), proj);
|
||||||
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue