libpurple/protocols/zephyr/zephyr_html.c

Mon, 22 Aug 2022 21:40:04 -0500

author
Elliott Sales de Andrade <quantum.analyst@gmail.com>
date
Mon, 22 Aug 2022 21:40:04 -0500
branch
gtk4
changeset 41567
517ac516af27
parent 41084
72d6941bfa2e
permissions
-rw-r--r--

Inline pidgin_make_scrollable

We need to change it for GTK4, and there are few enough that it can be inlined. Eventually, that code might be a `.ui` anyway.

Testing Done:
Compile only.

Reviewed at https://reviews.imfreedom.org/r/1615/

40681
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
1 /*
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
2 * Purple - Internet Messaging Library
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
3 * Copyright (C) Pidgin Developers <devel@pidgin.im>
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
4 *
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
5 * Purple is the legal property of its developers, whose names are too numerous
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
6 * to list here. Please refer to the COPYRIGHT file distributed with this
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
7 * source distribution.
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
8 *
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
9 * This program is free software; you can redistribute it and/or modify
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
10 * it under the terms of the GNU General Public License as published by
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
11 * the Free Software Foundation; either version 2 of the License, or
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
12 * (at your option) any later version.
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
13 *
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
14 * This program is distributed in the hope that it will be useful,
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
17 * GNU General Public License for more details.
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
18 *
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
19 * You should have received a copy of the GNU General Public License
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
20 * along with this program; if not, see <https://www.gnu.org/licenses/>.
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
21 */
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
22
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
23 #include <ctype.h>
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
24
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
25 #include <purple.h>
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
26
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
27 #include "zephyr_html.h"
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
28
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
29 typedef struct _zframe zframe;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
30
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
31 struct _zframe {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
32 /* common part */
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
33 /* true for everything but @color, since inside the parens of that one is
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
34 * the color. */
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
35 gboolean has_closer;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
36 /* </i>, </font>, </b>, etc. */
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
37 const char *closing;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
38 /* text including the opening html thingie. */
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
39 GString *text;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
40
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
41 /* html_to_zephyr */
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
42 /* @i, @b, etc. */
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
43 const char *env;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
44 /* }=1, ]=2, )=4, >=8 */
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
45 int closer_mask;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
46 /* href for links */
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
47 gboolean is_href;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
48 GString *href;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
49
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
50 /* zephyr_to_html */
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
51 /* }, ], ), > */
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
52 char *closer;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
53 };
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
54
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
55 static zframe *
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
56 zframe_new_with_text(const gchar *text, const gchar *closing, gboolean has_closer)
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
57 {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
58 zframe *frame = g_new(zframe, 1);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
59
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
60 frame->text = g_string_new(text);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
61 frame->closing = closing;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
62 frame->has_closer = has_closer;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
63
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
64 return frame;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
65 }
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
66
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
67 static inline zframe *
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
68 zframe_new(const gchar *closing, gboolean has_closer)
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
69 {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
70 return zframe_new_with_text("", closing, has_closer);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
71 }
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
72
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
73 static gboolean
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
74 zframe_href_has_prefix(const zframe *frame, const gchar *prefix)
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
75 {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
76 gsize prefix_len = strlen(prefix);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
77
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
78 return (frame->href->len == (prefix_len + frame->text->len)) &&
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
79 !strncmp(frame->href->str, prefix, prefix_len) &&
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
80 purple_strequal(frame->href->str + prefix_len, frame->text->str);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
81 }
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
82
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
83 static gsize
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
84 html_to_zephyr_pop(GQueue *frames)
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
85 {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
86 zframe *popped = (zframe *)g_queue_pop_head(frames);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
87 zframe *head = (zframe *)g_queue_peek_head(frames);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
88 gsize result = strlen(popped->closing);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
89
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
90 if (popped->is_href) {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
91 head->href = popped->text;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
92 } else {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
93 g_string_append(head->text, popped->env);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
94 if (popped->has_closer) {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
95 g_string_append_c(head->text,
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
96 (popped->closer_mask & 1) ? '{' :
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
97 (popped->closer_mask & 2) ? '[' :
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
98 (popped->closer_mask & 4) ? '(' :
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
99 '<');
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
100 }
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
101 g_string_append(head->text, popped->text->str);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
102 if (popped->href) {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
103 if (!purple_strequal(popped->href->str, popped->text->str) &&
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
104 !zframe_href_has_prefix(popped, "http://") &&
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
105 !zframe_href_has_prefix(popped, "mailto:")) {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
106 g_string_append(head->text, " <");
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
107 g_string_append(head->text, popped->href->str);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
108 if (popped->closer_mask & ~8) {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
109 g_string_append_c(head->text, '>');
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
110 popped->closer_mask &= ~8;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
111 } else {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
112 g_string_append(head->text, "@{>}");
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
113 }
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
114 }
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
115 g_string_free(popped->href, TRUE);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
116 }
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
117 if (popped->has_closer) {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
118 g_string_append_c(head->text,
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
119 (popped->closer_mask & 1) ? '}' :
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
120 (popped->closer_mask & 2) ? ']' :
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
121 (popped->closer_mask & 4) ? ')' :
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
122 '>');
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
123 }
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
124 if (!popped->has_closer) {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
125 head->closer_mask = popped->closer_mask;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
126 }
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
127 g_string_free(popped->text, TRUE);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
128 }
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
129 g_free(popped);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
130 return result;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
131 }
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
132
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
133 char *
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
134 html_to_zephyr(const char *message)
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
135 {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
136 GQueue frames = G_QUEUE_INIT;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
137 zframe *frame, *new_f;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
138 char *ret;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
139
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
140 if (*message == '\0')
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
141 return g_strdup("");
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
142
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
143 frame = zframe_new(NULL, FALSE);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
144 frame->href = NULL;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
145 frame->is_href = FALSE;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
146 frame->env = "";
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
147 frame->closer_mask = 15;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
148
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
149 g_queue_push_head(&frames, frame);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
150
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
151 purple_debug_info("zephyr", "html received %s\n", message);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
152 while (*message) {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
153 frame = (zframe *)g_queue_peek_head(&frames);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
154 if (frame->closing && purple_str_has_caseprefix(message, frame->closing)) {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
155 message += html_to_zephyr_pop(&frames);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
156 } else if (*message == '<') {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
157 if (!g_ascii_strncasecmp(message + 1, "i>", 2)) {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
158 new_f = zframe_new("</i>", TRUE);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
159 new_f->href = NULL;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
160 new_f->is_href = FALSE;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
161 new_f->env = "@i";
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
162 new_f->closer_mask = 15;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
163 g_queue_push_head(&frames, new_f);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
164 message += 3;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
165 } else if (!g_ascii_strncasecmp(message + 1, "b>", 2)) {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
166 new_f = zframe_new("</b>", TRUE);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
167 new_f->href = NULL;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
168 new_f->is_href = FALSE;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
169 new_f->env = "@b";
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
170 new_f->closer_mask = 15;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
171 g_queue_push_head(&frames, new_f);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
172 message += 3;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
173 } else if (!g_ascii_strncasecmp(message + 1, "br>", 3)) {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
174 g_string_append_c(frame->text, '\n');
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
175 message += 4;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
176 } else if (!g_ascii_strncasecmp(message + 1, "a href=\"", 8)) {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
177 message += 9;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
178 new_f = zframe_new("</a>", FALSE);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
179 new_f->href = NULL;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
180 new_f->is_href = FALSE;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
181 new_f->env = "";
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
182 new_f->closer_mask = frame->closer_mask;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
183 g_queue_push_head(&frames, new_f);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
184 new_f = zframe_new("\">", FALSE);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
185 new_f->href = NULL;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
186 new_f->is_href = TRUE;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
187 new_f->closer_mask = frame->closer_mask;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
188 g_queue_push_head(&frames, new_f);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
189 } else if (!g_ascii_strncasecmp(message + 1, "font", 4)) {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
190 new_f = zframe_new("</font>", TRUE);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
191 new_f->href = NULL;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
192 new_f->is_href = FALSE;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
193 new_f->closer_mask = 15;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
194 g_queue_push_head(&frames, new_f);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
195 message += 5;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
196 while (*message == ' ') {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
197 message++;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
198 }
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
199 if (!g_ascii_strncasecmp(message, "color=\"", 7)) {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
200 message += 7;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
201 new_f->env = "@";
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
202 new_f = zframe_new("\">", TRUE);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
203 new_f->env = "@color";
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
204 new_f->href = NULL;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
205 new_f->is_href = FALSE;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
206 new_f->closer_mask = 15;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
207 g_queue_push_head(&frames, new_f);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
208 } else if (!g_ascii_strncasecmp(message, "face=\"", 6)) {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
209 message += 6;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
210 new_f->env = "@";
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
211 new_f = zframe_new("\">", TRUE);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
212 new_f->env = "@font";
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
213 new_f->href = NULL;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
214 new_f->is_href = FALSE;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
215 new_f->closer_mask = 15;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
216 g_queue_push_head(&frames, new_f);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
217 } else if (!g_ascii_strncasecmp(message, "size=\"", 6)) {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
218 message += 6;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
219 if ((*message == '1') || (*message == '2')) {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
220 new_f->env = "@small";
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
221 } else if ((*message == '3') || (*message == '4')) {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
222 new_f->env = "@medium";
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
223 } else if ((*message == '5') || (*message == '6')
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
224 || (*message == '7')) {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
225 new_f->env = "@large";
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
226 } else {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
227 new_f->env = "";
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
228 new_f->has_closer = FALSE;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
229 new_f->closer_mask = frame->closer_mask;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
230 }
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
231 message += 3;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
232 } else {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
233 /* Drop all unrecognized/misparsed font tags */
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
234 new_f->env = "";
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
235 new_f->has_closer = FALSE;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
236 new_f->closer_mask = frame->closer_mask;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
237 while (g_ascii_strncasecmp(message, "\">", 2) != 0) {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
238 message++;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
239 }
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
240 if (*message != '\0') {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
241 message += 2;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
242 }
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
243 }
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
244 } else {
41084
72d6941bfa2e Fix typos in protocol plugins
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 40681
diff changeset
245 /* Catch all for all unrecognized/misparsed <foo> tags */
40681
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
246 g_string_append_c(frame->text, *message++);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
247 }
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
248 } else if (*message == '@') {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
249 g_string_append(frame->text, "@@");
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
250 message++;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
251 } else if (*message == '}') {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
252 if (frame->closer_mask & ~1) {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
253 frame->closer_mask &= ~1;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
254 g_string_append_c(frame->text, *message++);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
255 } else {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
256 g_string_append(frame->text, "@[}]");
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
257 message++;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
258 }
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
259 } else if (*message == ']') {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
260 if (frame->closer_mask & ~2) {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
261 frame->closer_mask &= ~2;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
262 g_string_append_c(frame->text, *message++);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
263 } else {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
264 g_string_append(frame->text, "@{]}");
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
265 message++;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
266 }
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
267 } else if (*message == ')') {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
268 if (frame->closer_mask & ~4) {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
269 frame->closer_mask &= ~4;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
270 g_string_append_c(frame->text, *message++);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
271 } else {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
272 g_string_append(frame->text, "@{)}");
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
273 message++;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
274 }
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
275 } else if (!g_ascii_strncasecmp(message, "&gt;", 4)) {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
276 if (frame->closer_mask & ~8) {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
277 frame->closer_mask &= ~8;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
278 g_string_append_c(frame->text, *message++);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
279 } else {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
280 g_string_append(frame->text, "@{>}");
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
281 message += 4;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
282 }
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
283 } else {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
284 g_string_append_c(frame->text, *message++);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
285 }
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
286 }
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
287 frame = (zframe *)g_queue_pop_head(&frames);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
288 ret = g_string_free(frame->text, FALSE);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
289 g_free(frame);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
290 purple_debug_info("zephyr", "zephyr outputted %s\n", ret);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
291 return ret;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
292 }
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
293
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
294 static void
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
295 zephyr_to_html_pop(GQueue *frames, gboolean *last_had_closer)
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
296 {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
297 zframe *popped = (zframe *)g_queue_pop_head(frames);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
298 zframe *head = (zframe *)g_queue_peek_head(frames);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
299
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
300 g_string_append(head->text, popped->text->str);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
301 g_string_append(head->text, popped->closing);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
302
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
303 if (last_had_closer != NULL) {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
304 *last_had_closer = popped->has_closer;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
305 }
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
306
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
307 g_string_free(popped->text, TRUE);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
308 g_free(popped);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
309 }
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
310
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
311 char *
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
312 zephyr_to_html(const char *message)
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
313 {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
314 GQueue frames = G_QUEUE_INIT;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
315 zframe *frame;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
316 char *ret;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
317
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
318 frame = zframe_new("", FALSE);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
319 frame->closer = NULL;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
320
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
321 g_queue_push_head(&frames, frame);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
322
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
323 while (*message) {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
324 frame = (zframe *)g_queue_peek_head(&frames);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
325 if (*message == '@' && message[1] == '@') {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
326 g_string_append(frame->text, "@");
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
327 message += 2;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
328 } else if (*message == '@') {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
329 int end = 1;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
330 while (message[end] && (isalnum(message[end]) || message[end] == '_')) {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
331 end++;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
332 }
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
333 if (message[end] &&
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
334 (message[end] == '{' || message[end] == '[' || message[end] == '(' ||
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
335 !g_ascii_strncasecmp(message + end, "&lt;", 4))) {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
336 zframe *new_f;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
337 char *buf;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
338 char *closer;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
339 buf = g_new0(char, end);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
340 g_snprintf(buf, end, "%s", message + 1);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
341 message += end;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
342 closer = (*message == '{' ? "}" :
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
343 *message == '[' ? "]" :
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
344 *message == '(' ? ")" :
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
345 "&gt;");
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
346 message += (*message == '&' ? 4 : 1);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
347 if (!g_ascii_strcasecmp(buf, "italic") || !g_ascii_strcasecmp(buf, "i")) {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
348 new_f = zframe_new_with_text("<i>", "</i>", TRUE);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
349 } else if (!g_ascii_strcasecmp(buf, "small")) {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
350 new_f = zframe_new_with_text("<font size=\"1\">", "</font>", TRUE);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
351 } else if (!g_ascii_strcasecmp(buf, "medium")) {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
352 new_f = zframe_new_with_text("<font size=\"3\">", "</font>", TRUE);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
353 } else if (!g_ascii_strcasecmp(buf, "large")) {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
354 new_f = zframe_new_with_text("<font size=\"7\">", "</font>", TRUE);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
355 } else if (!g_ascii_strcasecmp(buf, "bold")
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
356 || !g_ascii_strcasecmp(buf, "b")) {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
357 new_f = zframe_new_with_text("<b>", "</b>", TRUE);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
358 } else if (!g_ascii_strcasecmp(buf, "font")) {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
359 zframe *extra_f;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
360 extra_f = zframe_new("</font>", FALSE);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
361 extra_f->closer = frame->closer;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
362 g_queue_push_head(&frames, extra_f);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
363 new_f = zframe_new_with_text("<font face=\"", "\">", TRUE);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
364 } else if (!g_ascii_strcasecmp(buf, "color")) {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
365 zframe *extra_f;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
366 extra_f = zframe_new("</font>", FALSE);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
367 extra_f->closer = frame->closer;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
368 g_queue_push_head(&frames, extra_f);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
369 new_f = zframe_new_with_text("<font color=\"", "\">", TRUE);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
370 } else {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
371 new_f = zframe_new("", TRUE);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
372 }
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
373 new_f->closer = closer;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
374 g_queue_push_head(&frames, new_f);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
375 g_free(buf);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
376 } else {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
377 /* Not a formatting tag, add the character as normal. */
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
378 g_string_append_c(frame->text, *message++);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
379 }
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
380 } else if (frame->closer && purple_str_has_caseprefix(message, frame->closer)) {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
381 message += strlen(frame->closer);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
382 if (g_queue_get_length(&frames) > 1) {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
383 gboolean last_had_closer;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
384
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
385 do {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
386 zephyr_to_html_pop(&frames, &last_had_closer);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
387 } while (g_queue_get_length(&frames) > 1 && !last_had_closer);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
388 } else {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
389 g_string_append_c(frame->text, *message);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
390 }
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
391 } else if (*message == '\n') {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
392 g_string_append(frame->text, "<br>");
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
393 message++;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
394 } else {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
395 g_string_append_c(frame->text, *message++);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
396 }
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
397 }
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
398 /* go through all the stuff that they didn't close */
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
399 while (g_queue_get_length(&frames) > 1) {
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
400 zephyr_to_html_pop(&frames, NULL);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
401 }
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
402 frame = (zframe *)g_queue_pop_head(&frames);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
403 ret = g_string_free(frame->text, FALSE);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
404 g_free(frame);
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
405 return ret;
675b8605dca2 Move zephyr<->html conversion to own module
Arkadiy Illarionov <qarkai@gmail.com>
parents:
diff changeset
406 }

mercurial