Я использую gtk в приложении, и я использую возможности текста gtklabel, которые будут отображаться автоматически в качестве URL с возможностью клика. Это работает хорошо в большинстве случаев, однако с URL-адресом, который содержит круглые скобки "(" и ")" это не работает. Используемые версии - это те, которые доступны на дебианской (старой) стабильной, то есть debian 6 (2.20) и 7 (3.4.2).
Например, я пытаюсь отобразить следующий URL:
https://maps.google.com/maps?q=62.1891,+-141.5372+(Example+text+in+here+will+be+rendered+in+the+maps+label)&iwloc=A&hl=en
Когда я создаю gtklabel с этим текстом, например:
text="<b><a href=\"https://maps.google.com/maps?q=62.1891,+-141.5372+(Example+text+in+here+will+be+rendered+in+the+maps+label)&iwloc=A&hl=en\" title=\"Map\">Click here for Map</a></b>\n"
Затем он будет отображаться в ярлыке в виде подчеркнутой ссылки, выделенной жирным шрифтом, с текстом. Щелкните здесь для получения карты
Однако, когда вы нажимаете на ссылку, она будет отображаться неправильно, и эта ошибка появляется:
Gtk-WARNING **: Unable to show '(null)': Operation not supported
Похоже, что круглые скобки испортили рендеринг URL файла с помощью gtk.
Есть ли способ избежать скобок или использовать другой символ, который работает в URL-адресе карты для создания метки?
Я пробовал различные способы избежать этого, однако пока никто не действовал. Такие, как использование% 28 и% 29 для замены скобок, а также обратных косых черт в качестве escape-символа.
Я использую метод, описанный в https://developer.gnome.org/gtk2/2.24/GtkLabel.html и https://developer.gnome.org/gtk3/stable/GtkLabel.html в разделе "Ссылки", который позволяет автоматическое рендеринг ссылок:
связи
Начиная с версии 2.18, GTK+ поддерживает разметку для интерактивных гиперссылок в дополнение к обычной разметке Pango. Разметка для ссылок заимствована из HTML, используя атрибуты a с href и title. GTK+ отображает ссылки, похожие на то, как они появляются в веб-браузерах, с цветным подчеркнутым текстом. Атрибут title отображается как подсказка по ссылке. Пример выглядит следующим образом:
1 gtk_label_set_markup (метка, "Перейдите на веб-сайт http://www.gtk.org \" title=\"<i> Our &/i> website \"> GTK+ для получения дополнительной информации... ");
Я понимаю, что он работает в более поздних версиях gtk (2.24 и 3.6), чтобы избежать амперсандов. Но мне было интересно, есть ли работа для старых версий gtk, чтобы избежать этой проблемы?
jku прав, амперсанд должен быть экранирован. Это пример, использующий ту же строку, что и вы, и он работает (проверен на 3.6.4 и 2.24.17).
#include <gtk/gtk.h>
int
main (int argc, char **argv)
{
gtk_init (&argc, &argv);
GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
// This one won't work, needs ampersand escaping
// GtkWidget *label = gtk_label_new ("<b><a href=\"https://maps.google.com/maps?q=62.1891,+-141.5372+(Example+text+in+here+will+be+rendered+in+the+maps+label)&iwloc=A&hl=en\" title=\"Map\">Click here for Map</a></b>\n");
GtkWidget *label = gtk_label_new ("<b><a href=\"https://maps.google.com/maps?q=62.1891,+-141.5372+(Example+text+in+here+will+be+rendered+in+the+maps+label)&iwloc=A&hl=en\" title=\"Map\">Click here for Map</a></b>\n");
gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
gtk_container_add (GTK_CONTAINER(window), label);
gtk_widget_show_all (GTK_WIDGET (window));
g_signal_connect (window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
gtk_main ();
return 0;
}
Оригинальный ответ:
Вы пытались вызвать gtk_show_uri с этой ссылкой? Затем вы можете увидеть, есть ли проблема с обработкой URI, или если это так, как ваш ярлык отформатирован/построен.
Вы должны избегать ваших амперсандов с помощью &
,
Я уверен, что GTK выдает предупреждение о времени выполнения, сообщающее об этом, когда вы вызываете gtk_label_set_markup()
.
Здесь предупреждение о GTK 3.6.4:
Gtk-WARNING **: Failed to set text from markup due to error parsing markup: Error on line 1: Entity did not end with a semicolon; most likely you used an ampersand character without intending to start an entity - escape ampersand as &
title=\"<i>Our&/i> website\"
, следует написать title=\"<i>Our</i> website\"
%28...%29