From: Kristen Carlson Accardi <kristen@linux.intel.com>
To: ofono@ofono.org
Subject: [PATCH 1/9] stkutil: display text attributes as html
Date: Fri, 02 Jul 2010 06:46:00 -0700 [thread overview]
Message-ID: <1278078368-32565-2-git-send-email-kristen@linux.intel.com> (raw)
In-Reply-To: <1278078368-32565-1-git-send-email-kristen@linux.intel.com>
[-- Attachment #1: Type: text/plain, Size: 7146 bytes --]
---
src/stkutil.c | 229 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
src/stkutil.h | 2 +
2 files changed, 231 insertions(+), 0 deletions(-)
diff --git a/src/stkutil.c b/src/stkutil.c
index e92add3..6c82e4d 100644
--- a/src/stkutil.c
+++ b/src/stkutil.c
@@ -5847,3 +5847,232 @@ const unsigned char *stk_pdu_from_envelope(const struct stk_envelope *envelope,
return pdu;
}
+
+static const char *html_colors[] = {
+ "#000000", /* Black */
+ "#808080", /* Dark Grey */
+ "#C11B17", /* Dark Red */
+ "#FBB117", /* Dark Yellow */
+ "#347235", /* Dark Green */
+ "#307D7E", /* Dark Cyan */
+ "#0000A0", /* Dark Blue */
+ "#C031C7", /* Dark Magenta */
+ "#C0C0C0", /* Grey */
+ "#FFFFFF", /* White */
+ "#FF0000", /* Bright Red */
+ "#FFFF00", /* Bright Yellow */
+ "#00FF00", /* Bright Green */
+ "#00FFFF", /* Bright Cyan */
+ "#0000FF", /* Bright Blue */
+ "#FF00FF", /* Bright Magenta */
+};
+
+#define STK_TEXT_FORMAT_ALIGN_MASK 0x03
+#define STK_TEXT_FORMAT_FONT_MASK 0x0C
+#define STK_TEXT_FORMAT_STYLE_MASK 0xF0
+#define STK_DEFAULT_TEXT_ALIGNMENT 0x00
+#define STK_TEXT_FORMAT_INIT 0xFFFF
+
+/* Defined in ETSI 123 40 9.2.3.24.10.1.1 */
+enum stk_text_format_code {
+ STK_TEXT_FORMAT_LEFT_ALIGN = 0x00,
+ STK_TEXT_FORMAT_CENTER_ALIGN = 0x01,
+ STK_TEXT_FORMAT_RIGHT_ALIGN = 0x02,
+ STK_TEXT_FORMAT_NO_ALIGN = 0x03,
+ STK_TEXT_FORMAT_FONT_SIZE_LARGE = 0x04,
+ STK_TEXT_FORMAT_FONT_SIZE_SMALL = 0x08,
+ STK_TEXT_FORMAT_FONT_SIZE_RESERVED = 0x0c,
+ STK_TEXT_FORMAT_STYLE_BOLD = 0x10,
+ STK_TEXT_FORMAT_STYLE_ITALIC = 0x20,
+ STK_TEXT_FORMAT_STYLE_UNDERLINED = 0x40,
+ STK_TEXT_FORMAT_STYLE_STRIKETHROUGH = 0x80,
+};
+
+
+static void end_format(GString *string, guint8 code, guint8 color)
+{
+ if ((code & ~STK_TEXT_FORMAT_ALIGN_MASK) || color)
+ g_string_append(string, "</span>");
+
+ if ((code & STK_TEXT_FORMAT_ALIGN_MASK) != STK_TEXT_FORMAT_NO_ALIGN)
+ g_string_append(string, "</div>");
+}
+
+static void start_format(GString *string, guint8 code, guint8 color)
+{
+ guint8 align = code & STK_TEXT_FORMAT_ALIGN_MASK;
+ guint8 font = code & STK_TEXT_FORMAT_FONT_MASK;
+ guint8 style = code & STK_TEXT_FORMAT_STYLE_MASK;
+ int fg = color & 0x0f;
+ int bg = (color >> 4) & 0x0f;
+
+ /* align formatting applies to a block of test */
+ if (align != STK_TEXT_FORMAT_NO_ALIGN)
+ g_string_append(string, "<div style=\"");
+
+ switch (align) {
+ case STK_TEXT_FORMAT_RIGHT_ALIGN:
+ g_string_append(string, "text-align: right;\">");
+ break;
+ case STK_TEXT_FORMAT_CENTER_ALIGN:
+ g_string_append(string, "text-align: center;\">");
+ break;
+ case STK_TEXT_FORMAT_LEFT_ALIGN:
+ g_string_append(string, "text-align: left;\">");
+ break;
+ }
+
+ if (((code & ~STK_TEXT_FORMAT_ALIGN_MASK) == 0) && (color == 0))
+ return;
+
+ /* font, style, and color are inline */
+ g_string_append(string, "<span style=\"");
+
+ switch (font) {
+ case STK_TEXT_FORMAT_FONT_SIZE_LARGE:
+ g_string_append(string, "font-size: big;");
+ break;
+ case STK_TEXT_FORMAT_FONT_SIZE_SMALL:
+ g_string_append(string, "font-size: small;");
+ break;
+ }
+
+ switch (style) {
+ case STK_TEXT_FORMAT_STYLE_BOLD:
+ g_string_append(string, "font-weight: bold;");
+ break;
+ case STK_TEXT_FORMAT_STYLE_ITALIC:
+ g_string_append(string, "font-style: italic;");
+ break;
+ case STK_TEXT_FORMAT_STYLE_UNDERLINED:
+ g_string_append(string, "text-decoration: underline;");
+ break;
+ case STK_TEXT_FORMAT_STYLE_STRIKETHROUGH:
+ g_string_append(string, "text-decoration: line-through;");
+ break;
+ }
+
+ /* add any color */
+ if (fg)
+ g_string_append_printf(string, "color: %s;", html_colors[fg]);
+ if (bg)
+ g_string_append_printf(string, "background-color: %s;",
+ html_colors[bg]);
+ g_string_append(string, "\">");
+}
+
+char *stk_text_to_html(const char *utf8,
+ const unsigned short *attrs, int num_attrs)
+{
+ long text_len = g_utf8_strlen(utf8, -1);
+ GString *string = g_string_sized_new(strlen(utf8) + 1);
+ short *formats;
+ int pos, i, j;
+ guint16 start, end, len, attr, prev_attr;
+ guint8 code, color, align;
+ const char *text = utf8;
+ int attrs_len = num_attrs * 4;
+
+ formats = g_try_malloc0(sizeof(gint16) * (text_len + 1));
+ if (formats == NULL)
+ return NULL;
+
+ /* we will need formatting at the position beyond the last char */
+ for (i = 0; i <= text_len; i++)
+ formats[i] = STK_TEXT_FORMAT_INIT;
+
+ for (i = 0; i < attrs_len; i += 4) {
+ start = attrs[i];
+ len = attrs[i + 1];
+ code = attrs[i + 2] & 0xFF;
+ color = attrs[i + 3] & 0xFF;
+
+ if (len == 0)
+ end = text_len;
+ else
+ end = start + len;
+
+ /* sanity check values */
+ if (start > end || end > text_len)
+ continue;
+
+ /*
+ * if the alignment is the same as either the default
+ * or the last alignment used, don't set any alignment
+ * value.
+ */
+ if (start == 0)
+ align = STK_DEFAULT_TEXT_ALIGNMENT;
+ else {
+ align = (formats[start - 1] & 0xFF) &
+ STK_TEXT_FORMAT_ALIGN_MASK;
+ if (align == STK_TEXT_FORMAT_NO_ALIGN)
+ align = STK_DEFAULT_TEXT_ALIGNMENT;
+ }
+
+ if ((code & STK_TEXT_FORMAT_ALIGN_MASK) == align)
+ code |= STK_TEXT_FORMAT_NO_ALIGN;
+
+ attr = code | (color << 8);
+
+ for (j = start; j < end; j++)
+ formats[j] = attr;
+ }
+
+ prev_attr = STK_TEXT_FORMAT_INIT;
+
+ for (pos = 0; pos <= text_len; pos++) {
+ attr = formats[pos];
+ if (attr != prev_attr) {
+ if (prev_attr != STK_TEXT_FORMAT_INIT)
+ end_format(string, prev_attr & 0xFF,
+ (attr >> 8) & 0xFF);
+
+ if (attr != STK_TEXT_FORMAT_INIT)
+ start_format(string, attr & 0xFF,
+ (attr >> 8) & 0xFF);
+
+ prev_attr = attr;
+ }
+
+ if (pos == text_len)
+ break;
+
+ switch (g_utf8_get_char(text)) {
+ case '\n':
+ g_string_append(string, "<br/>");
+ break;
+ case '\r':
+ {
+ char *next = g_utf8_next_char(text);
+ gunichar c = g_utf8_get_char(next);
+
+ g_string_append(string, "<br/>");
+
+ if ((pos + 1 < text_len) && (c == '\n')) {
+ text = g_utf8_next_char(text);
+ pos++;
+ }
+ break;
+ }
+ case '<':
+ g_string_append(string, "<");
+ break;
+ case '>':
+ g_string_append(string, ">");
+ break;
+ case '&':
+ g_string_append(string, "&");
+ break;
+ default:
+ g_string_append_unichar(string, g_utf8_get_char(text));
+ }
+
+ text = g_utf8_next_char(text);
+ }
+
+ g_free(formats);
+
+ /* return characters from string. Caller must free char data */
+ return g_string_free(string, FALSE);
+}
diff --git a/src/stkutil.h b/src/stkutil.h
index 978a229..1fbd68b 100644
--- a/src/stkutil.h
+++ b/src/stkutil.h
@@ -1642,3 +1642,5 @@ const unsigned char *stk_pdu_from_response(const struct stk_response *response,
unsigned int *out_length);
const unsigned char *stk_pdu_from_envelope(const struct stk_envelope *envelope,
unsigned int *out_length);
+char *stk_text_to_html(const char *text,
+ const unsigned short *attrs, int num_attrs);
--
1.6.6.1
next prev parent reply other threads:[~2010-07-02 13:46 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-07-02 13:45 [PATCH 0/9] html text attribute patches Kristen Carlson Accardi
2010-07-02 13:46 ` Kristen Carlson Accardi [this message]
2010-07-08 22:49 ` [PATCH 1/9] stkutil: display text attributes as html Denis Kenzior
2010-07-09 21:58 ` Kristen Carlson Accardi
2010-07-09 22:13 ` Denis Kenzior
2010-07-09 22:26 ` Kristen Carlson Accardi
2010-07-13 15:00 ` Denis Kenzior
2010-07-15 20:17 ` andrzej zaborowski
2010-07-15 20:32 ` Denis Kenzior
2010-07-02 13:46 ` [PATCH 2/9] test-stkutil: add unit test for html text attributes Kristen Carlson Accardi
2010-07-02 13:46 ` [PATCH 3/9] test-stkutil: add html attribute test for Display Text tests Kristen Carlson Accardi
2010-07-02 13:46 ` [PATCH 4/9] test-stkutil: add html attribute tests for get_inkey_test Kristen Carlson Accardi
2010-07-02 13:46 ` [PATCH 5/9] test-stkutil: add html attribute tests for get_input_test Kristen Carlson Accardi
2010-07-02 13:46 ` [PATCH 6/9] test-stkutil: add html attribute tests for play_tone_test Kristen Carlson Accardi
2010-07-02 13:46 ` [PATCH 7/9] test-stkutil: add html attribute test for setup_menu_test Kristen Carlson Accardi
2010-07-02 13:46 ` [PATCH 8/9] test-stkutil: add html attribute test for select_item_test Kristen Carlson Accardi
2010-07-02 13:46 ` [PATCH 9/9] test-stkutil: add html attribute tests for setup idle mode tests Kristen Carlson Accardi
-- strict thread matches above, loose matches on Subject: below --
2010-07-13 12:40 [PATCH 0/9] html text attribute patches Kristen Carlson Accardi
2010-07-13 12:40 ` [PATCH 1/9] stkutil: display text attributes as html Kristen Carlson Accardi
2010-07-13 20:38 ` Denis Kenzior
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1278078368-32565-2-git-send-email-kristen@linux.intel.com \
--to=kristen@linux.intel.com \
--cc=ofono@ofono.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.