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 &&
Seemingly Similar 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