diff options
Diffstat (limited to 'libempathy-gtk')
-rw-r--r-- | libempathy-gtk/empathy-theme-adium.c | 162 |
1 files changed, 123 insertions, 39 deletions
diff --git a/libempathy-gtk/empathy-theme-adium.c b/libempathy-gtk/empathy-theme-adium.c index 659bbac87..a90095e3e 100644 --- a/libempathy-gtk/empathy-theme-adium.c +++ b/libempathy-gtk/empathy-theme-adium.c @@ -317,6 +317,28 @@ theme_adium_match (const gchar **str, const gchar *match) return FALSE; } +static gboolean +theme_adium_match_with_format (const gchar **str, const gchar *match, + gchar **format) +{ + const gchar *cur = *str; + const gchar *end; + + if (!theme_adium_match (&cur, match)) { + return FALSE; + } + cur++; + + end = strstr (cur, "}%"); + if (!end) { + return FALSE; + } + + *format = g_strndup (cur , end - cur); + *str = end + 1; + return TRUE; +} + static void theme_adium_append_html (EmpathyThemeAdium *theme, const gchar *func, @@ -338,52 +360,55 @@ theme_adium_append_html (EmpathyThemeAdium *theme, string = g_string_sized_new (len + strlen (message)); g_string_append_printf (string, "%s(\"", func); for (cur = html; *cur != '\0'; cur++) { - const gchar *replace = NULL; + const gchar *replace = ""; gchar *dup_replace = NULL; + gchar *format = NULL; - if (theme_adium_match (&cur, "%message%")) { - replace = message; - } else if (theme_adium_match (&cur, "%messageClasses%")) { - replace = message_classes; - } else if (theme_adium_match (&cur, "%userIconPath%")) { + /* Those are all well known keywords that needs replacement in + * html files. Please keep them in the same order than the adium + * spec. See http://trac.adium.im/wiki/CreatingMessageStyles */ + if (theme_adium_match (&cur, "%userIconPath%")) { replace = avatar_filename; - } else if (theme_adium_match (&cur, "%sender%")) { - replace = name; } else if (theme_adium_match (&cur, "%senderScreenName%")) { replace = contact_id; + } else if (theme_adium_match (&cur, "%sender%")) { + replace = name; + } else if (theme_adium_match (&cur, "%senderColor%")) { + /* FIXME: A color derived from the user's name. If a + * colon separated list of HTML colors is at + * Incoming/SenderColors.txt it will be used instead of + * the default colors. + */ + } else if (theme_adium_match (&cur, "%senderStatusIcon%")) { + /* FIXME: The path to the status icon of the sender + * (available, away, etc...) + */ + } else if (theme_adium_match (&cur, "%messageDirection%")) { + /* FIXME: The text direction of the message + * (either rtl or ltr) + */ } else if (theme_adium_match (&cur, "%senderDisplayName%")) { - /* %senderDisplayName% - - * "The serverside (remotely set) name of the sender, - * such as an MSN display name." + /* FIXME: The serverside (remotely set) name of the + * sender, such as an MSN display name. * - * We don't have access to that yet so we use local - * alias instead.*/ + * We don't have access to that yet so we use + * local alias instead. + */ replace = name; - } else if (theme_adium_match (&cur, "%service%")) { - replace = service_name; - } else if (theme_adium_match (&cur, "%shortTime%")) { - dup_replace = empathy_time_to_string_local (timestamp, - EMPATHY_TIME_FORMAT_DISPLAY_SHORT); - replace = dup_replace; - } else if (theme_adium_match (&cur, "%time")) { - gchar *format = NULL; - gchar *end; - /* Time can be in 2 formats: - * %time% or %time{strftime format}% - * Extract the time format if provided. */ - if (cur[1] == '{') { - cur += 2; - end = strstr (cur, "}%"); - if (!end) { - /* Invalid string */ - continue; - } - format = g_strndup (cur, end - cur); - cur = end + 1; - } else { - cur++; - } - + } else if (theme_adium_match_with_format (&cur, "%textbackgroundcolor{", &format)) { + /* FIXME: This keyword is used to represent the + * highlight background color. "X" is the opacity of the + * background, ranges from 0 to 1 and can be any decimal + * between. + */ + } else if (theme_adium_match (&cur, "%message%")) { + replace = message; + } else if (theme_adium_match (&cur, "%time%") || + theme_adium_match_with_format (&cur, "%time{", &format)) { + /* FIXME: format is not exactly strftime. + * See NSDateFormatter spec: + * http://www.stepcase.com/blog/2008/12/02/format-string-for-the-iphone-nsdateformatter/ + */ if (is_backlog) { dup_replace = empathy_time_to_string_local (timestamp, format ? format : EMPATHY_TIME_DATE_FORMAT_DISPLAY_SHORT); @@ -392,7 +417,51 @@ theme_adium_append_html (EmpathyThemeAdium *theme, format ? format : EMPATHY_TIME_FORMAT_DISPLAY_SHORT); } replace = dup_replace; - g_free (format); + } else if (theme_adium_match (&cur, "%shortTime%")) { + dup_replace = empathy_time_to_string_local (timestamp, + EMPATHY_TIME_FORMAT_DISPLAY_SHORT); + replace = dup_replace; + } else if (theme_adium_match (&cur, "%service%")) { + replace = service_name; + } else if (theme_adium_match (&cur, "%variant%")) { + /* FIXME: The name of the active message style variant, + * with all spaces replaced with an underscore. + * A variant named "Alternating Messages - Blue Red" + * will become "Alternating_Messages_-_Blue_Red". + */ + } else if (theme_adium_match (&cur, "%userIcons%")) { + /* FIXME: mus t be "hideIcons" if use preference is set + * to hide avatars */ + replace = "showIcons"; + } else if (theme_adium_match (&cur, "%messageClasses%")) { + replace = message_classes; + } else if (theme_adium_match (&cur, "%status%")) { + /* FIXME: A description of the status event. This is + * neither in the user's local language nor expected to + * be displayed; it may be useful to use a different div + * class to present different types of status messages. + * The following is a list of some of the more important + * status messages; your message style should be able to + * handle being shown a status message not in this list, + * as even at present the list is incomplete and is + * certain to become out of date in the future: + * online + * offline + * away + * away_message + * return_away + * idle + * return_idle + * date_separator + * contact_joined (group chats) + * contact_left + * error + * timed_out + * encryption (all OTR messages use this status) + * purple (all IRC topic and join/part messages use this status) + * fileTransferStarted + * fileTransferCompleted + */ } else { escape_and_append_len (string, cur, 1); continue; @@ -400,7 +469,9 @@ theme_adium_append_html (EmpathyThemeAdium *theme, /* Here we have a replacement to make */ escape_and_append_len (string, replace, -1); + g_free (dup_replace); + g_free (format); } g_string_append (string, "\")"); @@ -531,6 +602,19 @@ theme_adium_append_message (EmpathyChatView *view, } else { g_string_append (message_classes, " incoming"); } + /* FIXME: other classes: + * autoreply - the message is an automatic response, generally due to an + * away status + * mention - the incoming message (in groupchat) matches your username + * or one of the mention keywords specified in Adium's + * advanced prefs. + * focus - the message was received while focus was lost + * firstFocus - the first message received while focus was lost + * status - the message is a status change + * event - the message is a notification of something happening + * (for example, encryption being turned on) + * %status% - See %status% in theme_adium_append_html() + */ /* Define javascript function to use */ if (consecutive) { |