Как сделать круглые скобки как часть URL в метке gtk?

0

Я использую 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, чтобы избежать этой проблемы?

  • 2
    Пожалуйста, назовите «различные методы», которые вы уже попробовали, чтобы люди не предлагали, а вы говорите «да, я уже пробовал». Вы пробовали наиболее распространенную форму экранирования URL? %28...%29
  • 0
    Обновленный вопрос
Показать ещё 7 комментариев
Теги:
gtk

2 ответа

1
Лучший ответ

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)&amp;iwloc=A&amp;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, или если это так, как ваш ярлык отформатирован/построен.

  • 0
    Да, в другой части приложения можно выбрать опцию меню для просмотра той же ссылки с помощью gnome_url_show (), которая отлично работает. Проблема в том, как отображается язык разметки в метке.
  • 0
    Спасибо, я попробую свой код с GTK 2.24 и 3.6.4. Мое приложение было стабильным выпуском в течение нескольких лет, и было бы неплохо, чтобы оно работало на дистрибутивах, использующих более старые версии gtk. Вот почему я искал возможную работу вокруг.
Показать ещё 5 комментариев
2

Вы должны избегать ваших амперсандов с помощью &amp; ,

Я уверен, что 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 &amp;

  • 0
    Я не использую gtk_label_set_markup () и в приведенном выше примере я только добавил к вопросу, что он показывает, что амперсанды не нужно экранировать.
  • 0
    Это никоим образом не показывает, что амперсанды не нужно экранировать, в примере, приведенном в документации, есть ошибка. Вместо title=\"&lt;i&gt;Our&/i&gt; website\" , следует написать title=\"&lt;i&gt;Our&lt;/i&gt; website\"
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню