source: trunk/third/gtkhtml3/src/gtkhtmldebug.c @ 21116

Revision 21116, 11.5 KB checked in by ghudson, 20 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r21115, which included commits to RCS files with non-trunk default branches.
Line 
1/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
2/* This file is part of the GtkHTML library
3
4   Copyright (C) 2000 Helix Code, Inc.
5   
6   This library is free software; you can redistribute it and/or
7   modify it under the terms of the GNU Library General Public
8   License as published by the Free Software Foundation; either
9   version 2 of the License, or (at your option) any later version.
10   
11   This library is distributed in the hope that it will be useful,
12   but WITHOUT ANY WARRANTY; without even the implied warranty of
13   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14   Library General Public License for more details.
15   
16   You should have received a copy of the GNU Library General Public License
17   along with this library; see the file COPYING.LIB.  If not, write to
18   the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19   Boston, MA 02111-1307, USA.
20*/
21
22/* Various debugging routines.  */
23
24#include <config.h>
25#include "gtkhtml-compat.h"
26
27#include <stdio.h>
28#include <stdarg.h>
29#include <string.h>
30#include <stdlib.h>
31
32#include "gtkhtml.h"
33#include "htmlobject.h"
34#include "htmltext.h"
35#include "htmltextslave.h"
36#include "htmltable.h"
37#include "htmltablecell.h"
38#include "htmlclue.h"
39#include "htmlclueflow.h"
40#include "htmlframe.h"
41#include "htmlframeset.h"
42#include "htmliframe.h"
43#include "htmlengine.h"
44#include "htmltype.h"
45#include "htmlenums.h"
46#include "htmlenumutils.h"
47
48#include "gtkhtmldebug.h"
49
50
51/**
52 * gtk_html_debug_log:
53 * @html: A GtkHTML widget
54 * @format: A format string, in printf() style
55 *
56 * If @html has debugging turned on, print out the message, just like libc
57 * printf().  Otherwise, just do nothing.
58 **/
59void
60gtk_html_debug_log (GtkHTML *html,
61                    const gchar *format,
62                    ...)
63{
64        va_list ap;
65
66        if (! html->debug)
67                return;
68
69        va_start (ap, format);
70        vprintf (format, ap);
71}
72
73
74static const gchar *
75clueflow_style_to_string (HTMLClueFlowStyle style)
76{
77        switch (style) {
78        case HTML_CLUEFLOW_STYLE_NORMAL:
79                return "Normal";
80        case HTML_CLUEFLOW_STYLE_H1:
81                return "H1";
82        case HTML_CLUEFLOW_STYLE_H2:
83                return "H2";
84        case HTML_CLUEFLOW_STYLE_H3:
85                return "H3";
86        case HTML_CLUEFLOW_STYLE_H4:
87                return "H4";
88        case HTML_CLUEFLOW_STYLE_H5:
89                return "H5";
90        case HTML_CLUEFLOW_STYLE_H6:
91                return "H6";
92        case HTML_CLUEFLOW_STYLE_ADDRESS:
93                return "Address";
94        case HTML_CLUEFLOW_STYLE_PRE:
95                return "Pre";
96        case HTML_CLUEFLOW_STYLE_LIST_ITEM:
97                return "List Item";
98        default:
99                return "UNKNOWN";
100        }
101}
102
103
104void
105gtk_html_debug_dump_table (HTMLObject *o,
106                           gint level)
107{
108        gint c, r;
109        HTMLTable *table = HTML_TABLE (o);
110
111        for (r = 0; r < table->totalRows; r++) {
112                for (c = 0; c < table->totalCols; c++) {
113                        gtk_html_debug_dump_tree (HTML_OBJECT (table->cells[r][c]), level);
114                }
115        }
116
117}
118
119static void
120gtk_html_debug_dump_table_simple (HTMLObject *o, gint level)
121{
122        gint c, r;
123        HTMLTable *table = HTML_TABLE (o);
124
125        for (r = 0; r < table->totalRows; r++) {
126                for (c = 0; c < table->totalCols; c++) {
127                        gtk_html_debug_dump_tree_simple (HTML_OBJECT (table->cells[r][c]), level);
128                }
129        }
130
131}
132
133void
134gtk_html_debug_dump_object (HTMLObject *obj,
135                            gint level)
136{
137        gint i;
138        for (i = 0; i < level; i++)
139                g_print (" ");
140
141        g_print ("ObjectType: %s Pos: %d, %d, MinWidth: %d, Width: %d PrefWidth: %d MaxWidth: %d Ascent %d Descent %d",
142                 html_type_name (HTML_OBJECT_TYPE (obj)),
143                 obj->x, obj->y, obj->min_width, obj->width, obj->pref_width, obj->max_width, obj->ascent, obj->descent);
144
145        if (HTML_OBJECT_TYPE (obj) == HTML_TYPE_CLUEFLOW) {
146                g_print (" [%s, %d]",
147                         clueflow_style_to_string (HTML_CLUEFLOW (obj)->style), HTML_CLUEFLOW (obj)->levels->len);
148                g_print (" levels: [");
149                for (i = 0; i < HTML_CLUEFLOW (obj)->levels->len; i ++) {
150                        g_print ("%d", HTML_CLUEFLOW (obj)->levels->data [i]);
151                        if (i < HTML_CLUEFLOW (obj)->levels->len - 1)
152                                g_print (" ");
153                }
154                g_print ("]");
155        }
156        else if (HTML_OBJECT_TYPE (obj) == HTML_TYPE_TEXTSLAVE) {
157                gchar *sl_text = g_strndup (html_text_get_text (HTML_TEXT (HTML_TEXT_SLAVE (obj)->owner),
158                                                                HTML_TEXT_SLAVE (obj)->posStart),
159                                            html_text_get_index (HTML_TEXT (HTML_TEXT_SLAVE (obj)->owner),
160                                                                 HTML_TEXT_SLAVE (obj)->posStart
161                                                                 + HTML_TEXT_SLAVE (obj)->posLen)
162                                            - html_text_get_index (HTML_TEXT (HTML_TEXT_SLAVE (obj)->owner),
163                                                                   HTML_TEXT_SLAVE (obj)->posStart));
164                g_print ("[start %d end %d] \"%s\" ",
165                         HTML_TEXT_SLAVE (obj)->posStart,
166                         HTML_TEXT_SLAVE (obj)->posStart + HTML_TEXT_SLAVE (obj)->posLen - 1,
167                         sl_text);
168                g_free (sl_text);
169        }
170
171        g_print ("\n");
172
173        switch (HTML_OBJECT_TYPE (obj)) {
174        case HTML_TYPE_TABLE:
175                gtk_html_debug_dump_table (obj, level + 1);
176                break;
177        case HTML_TYPE_TEXT:
178        case HTML_TYPE_LINKTEXT:
179                for (i = 0; i < level; i++)
180                        g_print (" ");
181                g_print ("Text (%d): \"%s\"\n",
182                         HTML_TEXT (obj)->text_len, HTML_TEXT (obj)->text);
183                break;
184
185        case HTML_TYPE_CLUEH:
186        case HTML_TYPE_CLUEV:
187        case HTML_TYPE_CLUEFLOW:
188                /* g_print ("Head: %p Tail: %p\n", HTML_CLUE (obj)->head, HTML_CLUE (obj)->tail); */
189        case HTML_TYPE_CLUEALIGNED:
190        case HTML_TYPE_TABLECELL:
191                for (i = 0; i < level; i++) g_print (" ");
192                g_print ("HAlign: %s VAlign: %s\n",
193                         html_halign_name (HTML_CLUE (obj)->halign),
194                         html_valign_name (HTML_CLUE (obj)->valign));
195                gtk_html_debug_dump_tree (HTML_CLUE (obj)->head, level + 1);
196                break;
197        case HTML_TYPE_IFRAME:
198                gtk_html_debug_dump_tree (GTK_HTML (HTML_IFRAME (obj)->html)->engine->clue, level + 1);
199                break;
200        case HTML_TYPE_FRAME:
201                gtk_html_debug_dump_tree (GTK_HTML (HTML_FRAME (obj)->html)->engine->clue, level + 1);
202                break;
203        case HTML_TYPE_IMAGE:
204                for (i = 0; i < level; i++) g_print (" ");
205                g_print ("Location: %s\n", HTML_IMAGE (obj)->image_ptr->url);
206                break;
207        case HTML_TYPE_FRAMESET: {
208                gint i;
209
210                for (i = 0; i < HTML_FRAMESET (obj)->frames->len; i++)
211                        gtk_html_debug_dump_tree (g_ptr_array_index (HTML_FRAMESET (obj)->frames, i), level + 1);
212                }
213                break;
214        default:
215                break;
216        }
217}
218
219void
220gtk_html_debug_dump_tree (HTMLObject *o,
221                          gint level)
222{
223        HTMLObject *obj;
224
225        obj = o;
226        while (obj) {
227                gtk_html_debug_dump_object (obj, level);
228                obj = obj->next;
229        }
230}
231
232static void
233dump_data (GQuark key_id, gpointer data, gpointer user_data)
234{
235        gint i, level = GPOINTER_TO_INT (user_data);
236
237        for (i = 0; i < level; i++)
238                g_print ("\t");
239
240        printf ("%s: '%s'\n", g_quark_to_string (key_id), (gchar *) data);
241}
242
243static void
244dump_object_simple (HTMLObject *obj,
245                    gint level)
246{
247        gint i;
248
249        for (i = 0; i < level; i++)
250                g_print ("\t");
251
252        if (html_object_is_text (obj)) {
253                HTMLText *text = HTML_TEXT (obj);
254                g_print ("%s `%s'\n",
255                         html_type_name (HTML_OBJECT_TYPE (obj)),
256                         text->text);
257                g_print ("len %d bytes %d\n", text->text_len, text->text_bytes);
258                gtk_html_debug_list_links (text);
259                gtk_html_debug_list_text_attrs (text);
260                /* debug_spell_errors (text->spell_errors); */
261                if (text->pi) {
262                        for (i =0; i < text->pi->n; i ++)
263                                g_print ("item %d offset: %d length: %d\n", i, text->pi->entries [i].item->offset, text->pi->entries [i].item->length);
264                               
265                        for (i = 0; i < text->text_len; i ++) {
266                                union {
267                                        PangoLogAttr attr;
268                                        guint as_int;
269                                } u;
270                                u.attr = text->pi->attrs [i];
271                                g_print ("log attrs[%d]: %d\n\t", i, u.as_int & 0x7ff);
272                                if (u.attr.is_line_break)
273                                        g_print ("line break, ");
274                                if (u.attr.is_mandatory_break)
275                                        g_print ("mandatory break, ");
276                                if (u.attr.is_char_break)
277                                        g_print ("char break, ");
278                                if (u.attr.is_white)
279                                        g_print ("white, ");
280                                if (u.attr.is_cursor_position)
281                                        g_print ("cursor position, ");
282                                if (u.attr.is_word_start)
283                                        g_print ("word start, ");
284                                if (u.attr.is_word_end)
285                                        g_print ("word end, ");
286                                if (u.attr.is_sentence_boundary)
287                                        g_print ("sentence boundary, ");
288                                if (u.attr.is_sentence_start)
289                                        g_print ("sentence start, ");
290                                if (u.attr.is_sentence_end)
291                                        g_print ("sentence end, ");
292                                g_print ("\n");
293                        }
294                }
295        } else if (HTML_OBJECT_TYPE (obj) == HTML_TYPE_TEXTSLAVE) {
296                HTMLTextSlave *slave = HTML_TEXT_SLAVE (obj);
297                gchar *text;
298
299                text = alloca (slave->posLen+1);
300                text [slave->posLen] = 0;
301                strncpy (text, slave->owner->text + slave->posStart, slave->posLen);
302                g_print ("%s `%s'\n",
303                         html_type_name (HTML_OBJECT_TYPE (obj)),
304                         text);
305        } else if (HTML_OBJECT_TYPE (obj) == HTML_TYPE_TABLECELL) {
306                g_print ("%s %d,%d\n", html_type_name (HTML_OBJECT_TYPE (obj)),
307                         HTML_TABLE_CELL (obj)->row, HTML_TABLE_CELL (obj)->col);
308        } else if (HTML_OBJECT_TYPE (obj) == HTML_TYPE_TABLE) {
309                g_print ("%s %d,%d\n", html_type_name (HTML_OBJECT_TYPE (obj)),
310                         HTML_TABLE (obj)->totalRows, HTML_TABLE (obj)->totalCols);
311        } else if (HTML_OBJECT_TYPE (obj) == HTML_TYPE_IFRAME) {
312                g_print ("%s\n", html_type_name (HTML_OBJECT_TYPE (obj)));
313                gtk_html_debug_dump_tree_simple (GTK_HTML (HTML_IFRAME (obj)->html)->engine->clue, level + 1);
314        } else if (HTML_OBJECT_TYPE (obj) == HTML_TYPE_FRAME) {
315                g_print ("%s\n", html_type_name (HTML_OBJECT_TYPE (obj)));
316                gtk_html_debug_dump_tree_simple (GTK_HTML (HTML_FRAME (obj)->html)->engine->clue, level + 1);
317        } else
318                g_print ("%s\n", html_type_name (HTML_OBJECT_TYPE (obj)));
319
320        if (obj->object_data)
321                g_datalist_foreach (&obj->object_data, dump_data, GINT_TO_POINTER (level));
322}
323
324void
325gtk_html_debug_dump_object_type (HTMLObject *o)
326{
327        dump_object_simple (o, 0);
328}
329
330void
331gtk_html_debug_dump_tree_simple (HTMLObject *o,
332                                 gint level)
333{
334        HTMLObject *obj;
335
336        for (obj = o; obj != NULL; obj = obj->next) {
337                if (HTML_OBJECT_TYPE (obj) == HTML_TYPE_TEXTSLAVE)
338                        continue;
339
340                dump_object_simple (obj, level);
341
342                switch (HTML_OBJECT_TYPE (obj)) {
343                case HTML_TYPE_CLUEH:
344                case HTML_TYPE_CLUEV:
345                case HTML_TYPE_CLUEFLOW:
346                case HTML_TYPE_CLUEALIGNED:
347                case HTML_TYPE_TABLECELL:
348                        gtk_html_debug_dump_tree_simple (HTML_CLUE (obj)->head, level + 1);
349                        break;
350                case HTML_TYPE_TABLE:
351                        gtk_html_debug_dump_table_simple (obj, level + 1);
352                        break;
353                default:
354                        break;
355                }
356        }
357}
358
359void
360gtk_html_debug_dump_list_simple (GList *list,
361                                 gint level)
362{
363        HTMLObject *obj;
364        GList *p;
365
366        for (p = list; p != NULL; p = p->next) {
367                obj = HTML_OBJECT (p->data);
368
369                if (HTML_OBJECT_TYPE (obj) == HTML_TYPE_TEXTSLAVE)
370                        continue;
371
372                dump_object_simple (obj, level);
373        }
374}
375
376#define D_ATTR_TYPE(x, s) if ((attr = pango_attr_iterator_get (iter, PANGO_ATTR_ ## x))) g_print ("%3d-%3d: %s\n", attr->start_index, attr->end_index, s);
377#define D_ATTR_TYPE_INT(x, s) if ((attr = pango_attr_iterator_get (iter, PANGO_ATTR_ ## x))) { g_print ("%3d-%3d: %s %d\n", attr->start_index, attr->end_index, s, ((PangoAttrInt *)attr)->value); }
378
379static void
380gtk_html_debug_list_attrs (PangoAttrList *attrs)
381{
382        PangoAttrIterator *iter = pango_attr_list_get_iterator (attrs);
383        PangoAttribute *attr;
384       
385        do {
386                D_ATTR_TYPE (INVALID, "Invalid");
387                D_ATTR_TYPE (LANGUAGE, "Language");
388                D_ATTR_TYPE (FAMILY, "Family");
389                D_ATTR_TYPE (STYLE, "Style");
390                D_ATTR_TYPE (WEIGHT, "Weight");
391                D_ATTR_TYPE (VARIANT, "Variant");
392                D_ATTR_TYPE (STRETCH, "Stretch");
393                D_ATTR_TYPE_INT (SIZE, "Size");
394                D_ATTR_TYPE (FONT_DESC, "Font Desc");
395                D_ATTR_TYPE (FOREGROUND, "Foreground");
396                D_ATTR_TYPE (BACKGROUND, "Background");
397                D_ATTR_TYPE (UNDERLINE, "Underline");
398                D_ATTR_TYPE (STRIKETHROUGH, "Strikethrough");
399                D_ATTR_TYPE (RISE, "Rise");
400                D_ATTR_TYPE (SHAPE, "Shape");
401                D_ATTR_TYPE (SCALE, "Scale");
402                g_print ("------------\n");
403        } while (pango_attr_iterator_next (iter));
404}
405
406void
407gtk_html_debug_list_text_attrs (HTMLText *text)
408{
409        gtk_html_debug_list_attrs (text->attr_list);
410}
411
412void
413gtk_html_debug_list_links (HTMLText *text)
414{
415        GSList *l;
416
417        for (l = text->links; l; l = l->next)
418                if (l->data) {
419                        Link *link = (Link *) l->data;
420
421                        g_print ("%d-%d(%d-%d): %s#%s\n", link->start_offset, link->end_offset, link->start_index, link->end_index, link->url, link->target);
422                }
423}
Note: See TracBrowser for help on using the repository browser.