Pekka Lampila
2007-Oct-19 12:35 UTC
[Swfdec] 3 commits - libswfdec/swfdec_html_parser.c libswfdec/swfdec_text_field_movie.c
libswfdec/swfdec_html_parser.c | 89 +++++++++++++++++++++++------------- libswfdec/swfdec_text_field_movie.c | 1 2 files changed, 60 insertions(+), 30 deletions(-) New commits: commit b4c20d7519ae5d93c9ba3258bde8444aebdd1be6 Author: Pekka Lampila <pekka.lampila at iki.fi> Date: Fri Oct 19 15:32:39 2007 +0300 If closing tag doesn't match in the HTML parser, close tags until it does diff --git a/libswfdec/swfdec_html_parser.c b/libswfdec/swfdec_html_parser.c index 5bd0367..5d9153a 100644 --- a/libswfdec/swfdec_html_parser.c +++ b/libswfdec/swfdec_html_parser.c @@ -270,16 +270,17 @@ swfdec_text_field_movie_html_parse_tag (ParserData *data, const char *p) if (close) { - if (data->tags_open != NULL) { - tag = (ParserTag *)data->tags_open->data; - } else { - tag = NULL; - } + GSList *iter; - if (tag != NULL && name_length == tag->name_length && - !g_strncasecmp (name, tag->name, name_length)) + for (iter = data->tags_open; iter != NULL; iter = iter->next) { + tag = iter->data; + swfdec_text_field_movie_html_parse_close_tag (data, tag); + + if (name_length == tag->name_length && + !g_strncasecmp (name, tag->name, name_length)) + break; } end = strchr (end, '>'); commit ba1618408e635618fa4f6908e0bacf5a69bebb1d Author: Pekka Lampila <pekka.lampila at iki.fi> Date: Fri Oct 19 15:26:22 2007 +0300 Clean up TextField's HTML parsing code somewhat, fix few version 6 issues diff --git a/libswfdec/swfdec_html_parser.c b/libswfdec/swfdec_html_parser.c index 5d058df..5bd0367 100644 --- a/libswfdec/swfdec_html_parser.c +++ b/libswfdec/swfdec_html_parser.c @@ -44,6 +44,39 @@ typedef struct { GSList * tags_closed; } ParserData; +static void +swfdec_text_field_movie_html_parse_close_tag (ParserData *data, ParserTag *tag) +{ + if (data->cx->version < 7 && + ((tag->name_length == 1 && !g_strncasecmp (tag->name, "p", 1)) || + (tag->name_length == 2 && !g_strncasecmp (tag->name, "li", 2)))) + { + GSList *iter; + + for (iter = data->tags_closed; iter != NULL; iter = iter->next) { + ParserTag *f = iter->data; + if (f->end_index < tag->index) + break; + if (f->name_length == 4 && !g_strncasecmp (f->name, "font", 4)) { + ParserTag *n = g_new0 (ParserTag, 1); + n->name = f->name; + n->name_length = f->name_length; + n->index = data->text->len; + n->end_index = data->text->len + 1; + n->format = swfdec_text_format_copy (f->format); + data->tags_closed = g_slist_prepend (data->tags_closed, n); + break; + } + } + data->text = g_string_append_c (data->text, '\r'); + } + + tag->end_index = data->text->len; + + data->tags_open = g_slist_remove (data->tags_open, tag); + data->tags_closed = g_slist_prepend (data->tags_closed, tag); +} + static const char * swfdec_text_field_movie_html_parse_comment (ParserData *data, const char *p) { @@ -246,17 +279,7 @@ swfdec_text_field_movie_html_parse_tag (ParserData *data, const char *p) if (tag != NULL && name_length == tag->name_length && !g_strncasecmp (name, tag->name, name_length)) { - if (data->cx->version == 6) { - if ((name_length == 1 && !g_strncasecmp (name, "p", 1)) || - (name_length == 2 && !g_strncasecmp (name, "li", 2))) { - data->text = g_string_append_c (data->text, '\r'); - } - } - - tag->end_index = data->text->len; - - data->tags_open = g_slist_remove (data->tags_open, tag); - data->tags_closed = g_slist_prepend (data->tags_closed, tag); + swfdec_text_field_movie_html_parse_close_tag (data, tag); } end = strchr (end, '>'); @@ -265,7 +288,7 @@ swfdec_text_field_movie_html_parse_tag (ParserData *data, const char *p) } else { - if (data->cx->version == 6 && + if (data->cx->version < 7 && (name_length == 2 && !g_strncasecmp (name, "br", 2))) { data->text = g_string_append_c (data->text, '\r'); tag = NULL; @@ -273,6 +296,22 @@ swfdec_text_field_movie_html_parse_tag (ParserData *data, const char *p) SwfdecAsObject *object; SwfdecAsValue val; + if (data->cx->version < 7 && + ((name_length == 1 && !g_strncasecmp (name, "p", 1)) || + (name_length == 2 && !g_strncasecmp (name, "li", 2)))) + { + GSList *iter; + + for (iter = data->tags_open; iter != NULL; iter = iter->next) { + ParserTag *f = iter->data; + if ((f->name_length == 1 && !g_strncasecmp (f->name, "p", 1)) || + (f->name_length == 2 && !g_strncasecmp (f->name, "li", 2))) { + data->text = g_string_append_c (data->text, '\r'); + break; + } + } + } + tag = g_new0 (ParserTag, 1); tag->name = name; tag->name_length = name_length; @@ -386,19 +425,8 @@ swfdec_text_field_movie_html_parse (SwfdecTextFieldMovie *text, const char *str) // close remaining tags while (data.tags_open != NULL) { - ParserTag *tag = (ParserTag *)data.tags_open->data; - - if (data.cx->version == 6) { - if ((tag->name_length == 1 && !g_strncasecmp (tag->name, "p", 1)) || - (tag->name_length == 2 && !g_strncasecmp (tag->name, "li", 2))) { - data.text = g_string_append_c (data.text, '\r'); - } - } - - tag->end_index = data.text->len; - - data.tags_open = g_slist_remove (data.tags_open, tag); - data.tags_closed = g_slist_prepend (data.tags_closed, tag); + swfdec_text_field_movie_html_parse_close_tag (&data, + (ParserTag *)data.tags_open->data); } // set parsed text commit a700c8838e1b7894f55337caf9faae8bba842e4b Author: Pekka Lampila <pekka.lampila at iki.fi> Date: Fri Oct 19 14:27:57 2007 +0300 Fix a bug in swfdec_text_field_movie_set_text_format diff --git a/libswfdec/swfdec_text_field_movie.c b/libswfdec/swfdec_text_field_movie.c index 737357b..b0e26a8 100644 --- a/libswfdec/swfdec_text_field_movie.c +++ b/libswfdec/swfdec_text_field_movie.c @@ -1031,6 +1031,7 @@ swfdec_text_field_movie_set_text_format (SwfdecTextFieldMovie *text, swfdec_text_format_equal (findex->format, ((SwfdecFormatIndex *)next->data)->format)) { + ((SwfdecFormatIndex *)next->data)->index = findex->index; text->formats = g_slist_remove (text->formats, findex); findex = findex_prev; }
Pekka Lampila
2007-Oct-21 21:00 UTC
[Swfdec] 3 commits - libswfdec/swfdec_html_parser.c libswfdec/swfdec_text_field_movie.c
libswfdec/swfdec_html_parser.c | 16 ++++++---------- libswfdec/swfdec_text_field_movie.c | 4 ++-- 2 files changed, 8 insertions(+), 12 deletions(-) New commits: commit a2bb0d97dc4aa9b6d0bb502e72a26fca924c038b Author: Pekka Lampila <pekka.lampila at iki.fi> Date: Sun Oct 21 23:57:36 2007 +0300 TextField: Don't apply non-left align twice when wordWrap is disabled diff --git a/libswfdec/swfdec_text_field_movie.c b/libswfdec/swfdec_text_field_movie.c index 034e6ab..1d3e791 100644 --- a/libswfdec/swfdec_text_field_movie.c +++ b/libswfdec/swfdec_text_field_movie.c @@ -515,7 +515,7 @@ swfdec_text_field_movie_get_layouts (SwfdecTextFieldMovie *text, int *num, } else { - if (block->align != PANGO_ALIGN_LEFT) { + if (!text->text->word_wrap && block->align != PANGO_ALIGN_LEFT) { int line_width; pango_layout_get_pixel_size (playout, &line_width, 0); if (line_width < width) { commit 2909d64e8dfb84e2074efc85c089fe434c5b6b4c Author: Pekka Lampila <pekka.lampila at iki.fi> Date: Sun Oct 21 23:39:28 2007 +0300 TextField HTML: Don't close non-matching tags until a match is found after all diff --git a/libswfdec/swfdec_html_parser.c b/libswfdec/swfdec_html_parser.c index 305df9e..968d6ce 100644 --- a/libswfdec/swfdec_html_parser.c +++ b/libswfdec/swfdec_html_parser.c @@ -271,17 +271,11 @@ swfdec_text_field_movie_html_parse_tag (ParserData *data, const char *p) if (close) { - GSList *iter; - - for (iter = data->tags_open; iter != NULL; iter = iter->next) - { - tag = iter->data; - - swfdec_text_field_movie_html_parse_close_tag (data, tag); - + if (data->tags_open != NULL) { + tag = data->tags_open->data; if (name_length == tag->name_length && !g_strncasecmp (name, tag->name, name_length)) - break; + swfdec_text_field_movie_html_parse_close_tag (data, tag); } end = strchr (end, '>'); commit 9d0204dd657be32a82bdd23986aceece533b9b2b Author: Pekka Lampila <pekka.lampila at iki.fi> Date: Sun Oct 21 23:26:04 2007 +0300 Add \r after </p> and </li> even in version > 6, if multiline is enabled Fixed an assert in swfdec_text_field_movie_html_text_append_paragraph diff --git a/libswfdec/swfdec_html_parser.c b/libswfdec/swfdec_html_parser.c index 5d9153a..305df9e 100644 --- a/libswfdec/swfdec_html_parser.c +++ b/libswfdec/swfdec_html_parser.c @@ -39,6 +39,7 @@ typedef struct { typedef struct { SwfdecAsContext *cx; + gboolean multiline; GString * text; GSList * tags_open; GSList * tags_closed; @@ -47,7 +48,7 @@ typedef struct { static void swfdec_text_field_movie_html_parse_close_tag (ParserData *data, ParserTag *tag) { - if (data->cx->version < 7 && + if (data->multiline && ((tag->name_length == 1 && !g_strncasecmp (tag->name, "p", 1)) || (tag->name_length == 2 && !g_strncasecmp (tag->name, "li", 2)))) { @@ -406,6 +407,7 @@ swfdec_text_field_movie_html_parse (SwfdecTextFieldMovie *text, const char *str) g_return_if_fail (str != NULL); data.cx = SWFDEC_AS_OBJECT (text)->context; + data.multiline = (data.cx->version < 7 || text->text->multiline); data.text = g_string_new (""); data.tags_open = NULL; data.tags_closed = NULL; diff --git a/libswfdec/swfdec_text_field_movie.c b/libswfdec/swfdec_text_field_movie.c index b0e26a8..034e6ab 100644 --- a/libswfdec/swfdec_text_field_movie.c +++ b/libswfdec/swfdec_text_field_movie.c @@ -1237,7 +1237,7 @@ swfdec_text_field_movie_html_text_append_paragraph (SwfdecTextFieldMovie *text, g_return_val_if_fail (SWFDEC_IS_TEXT_FIELD_MOVIE (text), string); g_return_val_if_fail (string != NULL, string); - g_return_val_if_fail (start_index < end_index, string); + g_return_val_if_fail (start_index <= end_index, string); g_return_val_if_fail (text->formats != NULL, string); for (iter = text->formats; iter->next != NULL &&
Possibly Parallel Threads
- 3 commits - libswfdec/swfdec_as_interpret.c libswfdec/swfdec_html_parser.c libswfdec/swfdec_sprite_movie_as.c libswfdec/swfdec_text_field_movie.c
- 9 commits - libswfdec/swfdec_as_strings.c libswfdec/swfdec_html_parser.c libswfdec/swfdec_style_sheet.c libswfdec/swfdec_style_sheet.h libswfdec/swfdec_text_field_movie_as.c libswfdec/swfdec_text_field_movie.c libswfdec/swfdec_text_field_movie.h
- libswfdec/swfdec_text_field_movie.c libswfdec/swfdec_text_field_movie_html.c
- 20 commits - libswfdec/Makefile.am libswfdec/swfdec_as_interpret.c libswfdec/swfdec_html_parser.c libswfdec/swfdec_initialize.as libswfdec/swfdec_initialize.h libswfdec/swfdec_text_field.c libswfdec/swfdec_text_field.h
- 2 commits - libswfdec/swfdec_sound.c libswfdec/swfdec_text_field_movie_as.c libswfdec/swfdec_text_field_movie.c libswfdec/swfdec_text_field_movie_html.c