00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifdef HAVE_CONFIG_H
00013 # include <config.h>
00014 #endif
00015
00016 #define DISABLE_DEBUGLOG
00017
00018
00019 #include "htmlctx_p.h"
00020 #include "o_box_l.h"
00021 #include "g_box_l.h"
00022
00023 #include <gwenhywfar/misc.h>
00024 #include <gwenhywfar/debug.h>
00025 #include <gwenhywfar/text.h>
00026
00027
00028
00029 GWEN_INHERIT(GWEN_XML_CONTEXT, HTML_XMLCTX)
00030
00031
00032
00033
00034 GWEN_XML_CONTEXT *HtmlCtx_new(uint32_t flags) {
00035 GWEN_XML_CONTEXT *ctx;
00036 HTML_XMLCTX *xctx;
00037 HTML_GROUP *g;
00038 HTML_OBJECT *o;
00039
00040
00041 ctx=GWEN_XmlCtx_new(flags);
00042 assert(ctx);
00043
00044
00045 GWEN_NEW_OBJECT(HTML_XMLCTX, xctx);
00046 assert(xctx);
00047 GWEN_INHERIT_SETDATA(GWEN_XML_CONTEXT, HTML_XMLCTX, ctx, xctx,
00048 HtmlCtx_FreeData);
00049
00050
00051 GWEN_XmlCtx_SetStartTagFn(ctx, HtmlCtx_StartTag);
00052 GWEN_XmlCtx_SetEndTagFn(ctx, HtmlCtx_EndTag);
00053 GWEN_XmlCtx_SetAddDataFn(ctx, HtmlCtx_AddData);
00054 GWEN_XmlCtx_SetAddCommentFn(ctx, HtmlCtx_AddComment);
00055 GWEN_XmlCtx_SetAddAttrFn(ctx, HtmlCtx_AddAttr);
00056
00057 xctx->objects=HtmlObject_Tree_new();
00058 xctx->mediaPaths=GWEN_StringList_new();
00059
00060 xctx->resolutionX=75;
00061 xctx->resolutionY=75;
00062
00063
00064 g=HtmlGroup_Box_new("HTML_ROOT", NULL, ctx);
00065 assert(g);
00066 o=HtmlObject_Box_new(ctx);
00067 HtmlGroup_SetObject(g, o);
00068 HtmlObject_Tree_Add(xctx->objects, o);
00069 HtmlCtx_SetCurrentGroup(ctx, g);
00070
00071
00072 return ctx;
00073 }
00074
00075
00076
00077 GWENHYWFAR_CB
00078 void HtmlCtx_FreeData(void *bp, void *p) {
00079 HTML_XMLCTX *xctx;
00080 HTML_GROUP *g;
00081
00082 xctx=(HTML_XMLCTX*)p;
00083
00084 g=xctx->currentGroup;
00085 while (g) {
00086 HTML_GROUP *gParent;
00087
00088 gParent=HtmlGroup_GetParent(g);
00089 HtmlGroup_free(g);
00090 g=gParent;
00091 }
00092
00093 GWEN_DB_Group_free(xctx->dbCurrentAttribs);
00094 free(xctx->currentTagName);
00095 HtmlObject_Tree_free(xctx->objects);
00096
00097 GWEN_StringList_free(xctx->mediaPaths);
00098
00099 HtmlProps_free(xctx->standardProps);
00100
00101 GWEN_FREE_OBJECT(xctx);
00102 }
00103
00104
00105
00106 int HtmlCtx_GetResolutionX(const GWEN_XML_CONTEXT *ctx) {
00107 HTML_XMLCTX *xctx;
00108
00109 assert(ctx);
00110 xctx=GWEN_INHERIT_GETDATA(GWEN_XML_CONTEXT, HTML_XMLCTX, ctx);
00111 assert(xctx);
00112
00113 return xctx->resolutionX;
00114 }
00115
00116
00117
00118 void HtmlCtx_SetResolutionX(GWEN_XML_CONTEXT *ctx, int i) {
00119 HTML_XMLCTX *xctx;
00120
00121 assert(ctx);
00122 xctx=GWEN_INHERIT_GETDATA(GWEN_XML_CONTEXT, HTML_XMLCTX, ctx);
00123 assert(xctx);
00124
00125 xctx->resolutionX=i;
00126 }
00127
00128
00129
00130 int HtmlCtx_GetResolutionY(const GWEN_XML_CONTEXT *ctx) {
00131 HTML_XMLCTX *xctx;
00132
00133 assert(ctx);
00134 xctx=GWEN_INHERIT_GETDATA(GWEN_XML_CONTEXT, HTML_XMLCTX, ctx);
00135 assert(xctx);
00136
00137 return xctx->resolutionY;
00138 }
00139
00140
00141
00142 void HtmlCtx_SetResolutionY(GWEN_XML_CONTEXT *ctx, int i) {
00143 HTML_XMLCTX *xctx;
00144
00145 assert(ctx);
00146 xctx=GWEN_INHERIT_GETDATA(GWEN_XML_CONTEXT, HTML_XMLCTX, ctx);
00147 assert(xctx);
00148
00149 xctx->resolutionY=i;
00150 }
00151
00152
00153
00154 GWEN_STRINGLIST *HtmlCtx_GetMediaPaths(const GWEN_XML_CONTEXT *ctx) {
00155 HTML_XMLCTX *xctx;
00156
00157 assert(ctx);
00158 xctx=GWEN_INHERIT_GETDATA(GWEN_XML_CONTEXT, HTML_XMLCTX, ctx);
00159 assert(xctx);
00160
00161 return xctx->mediaPaths;
00162 }
00163
00164
00165
00166 void HtmlCtx_AddMediaPath(GWEN_XML_CONTEXT *ctx, const char *s) {
00167 HTML_XMLCTX *xctx;
00168
00169 assert(ctx);
00170 xctx=GWEN_INHERIT_GETDATA(GWEN_XML_CONTEXT, HTML_XMLCTX, ctx);
00171 assert(xctx);
00172
00173 assert(s && *s);
00174 GWEN_StringList_AppendString(xctx->mediaPaths, s, 0, 1);
00175 }
00176
00177
00178
00179
00180 HTML_GROUP *HtmlCtx_GetCurrentGroup(const GWEN_XML_CONTEXT *ctx) {
00181 HTML_XMLCTX *xctx;
00182
00183 assert(ctx);
00184 xctx=GWEN_INHERIT_GETDATA(GWEN_XML_CONTEXT, HTML_XMLCTX, ctx);
00185 assert(xctx);
00186
00187 return xctx->currentGroup;
00188 }
00189
00190
00191
00192 void HtmlCtx_SetCurrentGroup(GWEN_XML_CONTEXT *ctx, HTML_GROUP *g){
00193 HTML_XMLCTX *xctx;
00194
00195 assert(ctx);
00196 xctx=GWEN_INHERIT_GETDATA(GWEN_XML_CONTEXT, HTML_XMLCTX, ctx);
00197 assert(xctx);
00198
00199 xctx->currentGroup=g;
00200 }
00201
00202
00203
00204 const char *HtmlCtx_GetCurrentTagName(const GWEN_XML_CONTEXT *ctx) {
00205 HTML_XMLCTX *xctx;
00206
00207 assert(ctx);
00208 xctx=GWEN_INHERIT_GETDATA(GWEN_XML_CONTEXT, HTML_XMLCTX, ctx);
00209 assert(xctx);
00210
00211 return xctx->currentTagName;
00212 }
00213
00214
00215
00216 void HtmlCtx_SetCurrentTagName(GWEN_XML_CONTEXT *ctx, const char *s) {
00217 HTML_XMLCTX *xctx;
00218
00219 assert(ctx);
00220 xctx=GWEN_INHERIT_GETDATA(GWEN_XML_CONTEXT, HTML_XMLCTX, ctx);
00221 assert(xctx);
00222
00223 free(xctx->currentTagName);
00224 if (s) xctx->currentTagName=strdup(s);
00225 else xctx->currentTagName=NULL;
00226 }
00227
00228
00229
00230 GWEN_DB_NODE *HtmlCtx_GetCurrentAttributes(const GWEN_XML_CONTEXT *ctx) {
00231 HTML_XMLCTX *xctx;
00232
00233 assert(ctx);
00234 xctx=GWEN_INHERIT_GETDATA(GWEN_XML_CONTEXT, HTML_XMLCTX, ctx);
00235 assert(xctx);
00236
00237 return xctx->dbCurrentAttribs;
00238 }
00239
00240
00241
00242 HTML_OBJECT_TREE *HtmlCtx_GetObjects(const GWEN_XML_CONTEXT *ctx) {
00243 HTML_XMLCTX *xctx;
00244
00245 assert(ctx);
00246 xctx=GWEN_INHERIT_GETDATA(GWEN_XML_CONTEXT, HTML_XMLCTX, ctx);
00247 assert(xctx);
00248
00249 return xctx->objects;
00250 }
00251
00252
00253
00254 HTML_OBJECT_TREE *HtmlCtx_TakeObjects(const GWEN_XML_CONTEXT *ctx) {
00255 HTML_XMLCTX *xctx;
00256 HTML_OBJECT_TREE *t;
00257
00258 assert(ctx);
00259 xctx=GWEN_INHERIT_GETDATA(GWEN_XML_CONTEXT, HTML_XMLCTX, ctx);
00260 assert(xctx);
00261
00262 t=xctx->objects;
00263 xctx->objects=NULL;
00264
00265 return t;
00266 }
00267
00268
00269
00270 HTML_OBJECT *HtmlCtx_GetRootObject(const GWEN_XML_CONTEXT *ctx) {
00271 HTML_XMLCTX *xctx;
00272
00273 assert(ctx);
00274 xctx=GWEN_INHERIT_GETDATA(GWEN_XML_CONTEXT, HTML_XMLCTX, ctx);
00275 assert(xctx);
00276
00277 return HtmlObject_Tree_GetFirst(xctx->objects);
00278 }
00279
00280
00281
00282 int HtmlCtx_SanitizeData(GWEN_XML_CONTEXT *ctx,
00283 const char *data,
00284 GWEN_BUFFER *buf) {
00285 if (data && *data) {
00286 const uint8_t *p;
00287 uint8_t *dst;
00288 uint8_t *src;
00289 unsigned int size;
00290 unsigned int i;
00291 int lastWasBlank;
00292 uint8_t *lastBlankPos;
00293 uint32_t bStart=0;
00294
00295 if (GWEN_Text_UnescapeXmlToBuffer(data, buf)) {
00296 DBG_INFO(GWEN_LOGDOMAIN, "here");
00297 return GWEN_ERROR_BAD_DATA;
00298 }
00299 if (GWEN_Buffer_GetUsedBytes(buf)==0) {
00300 DBG_INFO(GWEN_LOGDOMAIN, "Empty data.");
00301 return 0;
00302 }
00303
00304 dst=(uint8_t*)GWEN_Buffer_GetStart(buf);
00305 src=dst;
00306
00307
00308 while(*src && (*src<33 || *src==127))
00309 src++;
00310
00311 p=src;
00312 bStart=src-((uint8_t*)GWEN_Buffer_GetStart(buf));
00313 size=GWEN_Buffer_GetUsedBytes(buf)-bStart;
00314 lastWasBlank=0;
00315 lastBlankPos=0;
00316
00317 for (i=0; i<size; i++) {
00318 uint8_t c;
00319
00320 c=*p;
00321 if (c<32 || c==127)
00322 c=32;
00323
00324
00325 if (c==32) {
00326 if (!lastWasBlank) {
00327
00328 lastWasBlank=1;
00329 lastBlankPos=dst;
00330 *(dst++)=c;
00331 }
00332 }
00333 else {
00334 lastWasBlank=0;
00335 lastBlankPos=0;
00336 *(dst++)=c;
00337 }
00338 p++;
00339 }
00340
00341
00342 if (lastBlankPos!=0)
00343 dst=lastBlankPos;
00344
00345 size=dst-(uint8_t*)GWEN_Buffer_GetStart(buf);
00346 GWEN_Buffer_Crop(buf, 0, size);
00347 }
00348
00349 return 0;
00350 }
00351
00352
00353
00354 HTML_PROPS *HtmlCtx_GetStandardProps(const GWEN_XML_CONTEXT *ctx) {
00355 HTML_XMLCTX *xctx;
00356
00357 assert(ctx);
00358 xctx=GWEN_INHERIT_GETDATA(GWEN_XML_CONTEXT, HTML_XMLCTX, ctx);
00359 assert(xctx);
00360
00361 return xctx->standardProps;
00362 }
00363
00364
00365
00366 void HtmlCtx_SetStandardProps(GWEN_XML_CONTEXT *ctx, HTML_PROPS *pr) {
00367 HTML_XMLCTX *xctx;
00368 HTML_OBJECT *o;
00369
00370 assert(ctx);
00371 xctx=GWEN_INHERIT_GETDATA(GWEN_XML_CONTEXT, HTML_XMLCTX, ctx);
00372 assert(xctx);
00373
00374 HtmlProps_Attach(pr);
00375 HtmlProps_free(xctx->standardProps);
00376 xctx->standardProps=pr;
00377
00378 if (pr) {
00379 if (xctx->currentGroup && HtmlGroup_GetParent(xctx->currentGroup)==NULL)
00380 HtmlGroup_SetProperties(xctx->currentGroup, pr);
00381 o=HtmlObject_Tree_GetFirst(xctx->objects);
00382 if (o && HtmlObject_GetProperties(o)==NULL)
00383 HtmlObject_SetProperties(o, pr);
00384 }
00385 }
00386
00387
00388
00389 int HtmlCtx_StartTag(GWEN_XML_CONTEXT *ctx, const char *tagName) {
00390 HTML_XMLCTX *xctx;
00391
00392 assert(ctx);
00393 xctx=GWEN_INHERIT_GETDATA(GWEN_XML_CONTEXT, HTML_XMLCTX, ctx);
00394 assert(xctx);
00395
00396 DBG_DEBUG(GWEN_LOGDOMAIN, "Starting tag [%s]", tagName);
00397
00398
00399 HtmlCtx_SetCurrentTagName(ctx, tagName);
00400 GWEN_DB_Group_free(xctx->dbCurrentAttribs);
00401 xctx->dbCurrentAttribs=GWEN_DB_Group_new("attribs");
00402
00403 return 0;
00404 }
00405
00406
00407
00408 int HtmlCtx_EndTag(GWEN_XML_CONTEXT *ctx, int closing) {
00409 HTML_XMLCTX *xctx;
00410
00411 assert(ctx);
00412 xctx=GWEN_INHERIT_GETDATA(GWEN_XML_CONTEXT, HTML_XMLCTX, ctx);
00413 assert(xctx);
00414
00415 if (closing) {
00416
00417 DBG_DEBUG(GWEN_LOGDOMAIN, "Closing empty tag [%s]",
00418 (xctx->currentTagName)?xctx->currentTagName:"<noname>");
00419 return 0;
00420 }
00421
00422 if (xctx->currentTagName==NULL) {
00423 DBG_INFO(GWEN_LOGDOMAIN, "No tag name, malformed HTML data");
00424 return GWEN_ERROR_BAD_DATA;
00425 }
00426
00427 DBG_DEBUG(GWEN_LOGDOMAIN, "Completed tag [%s]", xctx->currentTagName);
00428
00429 if (xctx->currentGroup) {
00430 if (*(xctx->currentTagName)=='/') {
00431 int rv;
00432
00433
00434 DBG_DEBUG(GWEN_LOGDOMAIN,
00435 "Calling %s->EndTag(%s)",
00436 HtmlGroup_GetGroupName(xctx->currentGroup),
00437 xctx->currentTagName);
00438 rv=HtmlGroup_EndTag(xctx->currentGroup, xctx->currentTagName+1);
00439 if (rv<0) {
00440 if (rv!=GWEN_ERROR_NOT_IMPLEMENTED) {
00441 DBG_INFO(GWEN_LOGDOMAIN,
00442 "Error in EndTag(%s) for [%s]",
00443 HtmlGroup_GetGroupName(xctx->currentGroup),
00444 xctx->currentTagName);
00445 return rv;
00446 }
00447 }
00448 else if (rv==1) {
00449 HTML_GROUP *g;
00450 HTML_GROUP *gParent;
00451
00452
00453 g=xctx->currentGroup;
00454 gParent=HtmlGroup_GetParent(g);
00455 xctx->currentGroup=gParent;
00456 if (gParent) {
00457 DBG_DEBUG(GWEN_LOGDOMAIN,
00458 "Calling %s->EndSubGroup(%s)",
00459 HtmlGroup_GetGroupName(gParent),
00460 HtmlGroup_GetGroupName(g));
00461 HtmlGroup_EndSubGroup(gParent, g);
00462 }
00463 HtmlGroup_free(g);
00464 GWEN_XmlCtx_DecDepth(ctx);
00465 }
00466 }
00467 else {
00468 int rv;
00469
00470
00471 DBG_DEBUG(GWEN_LOGDOMAIN,
00472 "Calling %s->StartTag(%s)",
00473 HtmlGroup_GetGroupName(xctx->currentGroup),
00474 xctx->currentTagName);
00475 rv=HtmlGroup_StartTag(xctx->currentGroup, xctx->currentTagName);
00476 if (rv<0) {
00477 if (rv!=GWEN_ERROR_NOT_IMPLEMENTED) {
00478 DBG_INFO(GWEN_LOGDOMAIN,
00479 "Error in StartTag(%s) for [%s]",
00480 HtmlGroup_GetGroupName(xctx->currentGroup),
00481 xctx->currentTagName);
00482 return rv;
00483 }
00484 }
00485 }
00486 }
00487
00488 return 0;
00489 }
00490
00491
00492
00493
00494
00495
00496 int HtmlCtx_AddData(GWEN_XML_CONTEXT *ctx, const char *data) {
00497 HTML_XMLCTX *xctx;
00498
00499 assert(ctx);
00500 xctx=GWEN_INHERIT_GETDATA(GWEN_XML_CONTEXT, HTML_XMLCTX, ctx);
00501 assert(xctx);
00502
00503 if (xctx->currentGroup) {
00504 int rv;
00505
00506 DBG_DEBUG(GWEN_LOGDOMAIN,
00507 "Calling %s->AddData()",
00508 HtmlGroup_GetGroupName(xctx->currentGroup));
00509 rv=HtmlGroup_AddData(xctx->currentGroup, data);
00510 if (rv<0) {
00511 if (rv!=GWEN_ERROR_NOT_IMPLEMENTED) {
00512 DBG_INFO(GWEN_LOGDOMAIN,
00513 "Error in AddData(%s)",
00514 HtmlGroup_GetGroupName(xctx->currentGroup));
00515 return rv;
00516 }
00517 }
00518 }
00519
00520 return 0;
00521 }
00522
00523
00524
00525 int HtmlCtx_AddComment(GWEN_XML_CONTEXT *ctx, const char *data) {
00526 HTML_XMLCTX *xctx;
00527
00528 assert(ctx);
00529 xctx=GWEN_INHERIT_GETDATA(GWEN_XML_CONTEXT, HTML_XMLCTX, ctx);
00530 assert(xctx);
00531
00532
00533 return 0;
00534 }
00535
00536
00537
00538 int HtmlCtx_AddAttr(GWEN_XML_CONTEXT *ctx,
00539 const char *attrName,
00540 const char *attrData) {
00541 HTML_XMLCTX *xctx;
00542
00543 assert(ctx);
00544 xctx=GWEN_INHERIT_GETDATA(GWEN_XML_CONTEXT, HTML_XMLCTX, ctx);
00545 assert(xctx);
00546
00547 if (xctx->currentGroup) {
00548 assert(xctx->dbCurrentAttribs);
00549 GWEN_DB_SetCharValue(xctx->dbCurrentAttribs,
00550 GWEN_DB_FLAGS_DEFAULT,
00551 attrName, attrData);
00552 }
00553
00554 return 0;
00555 }
00556
00557
00558
00559 int HtmlCtx_GetTextWidth(GWEN_XML_CONTEXT *ctx,
00560 HTML_FONT *fnt,
00561 const char *s) {
00562 HTML_XMLCTX *xctx;
00563
00564 assert(ctx);
00565 xctx=GWEN_INHERIT_GETDATA(GWEN_XML_CONTEXT, HTML_XMLCTX, ctx);
00566 assert(xctx);
00567
00568 if (xctx->getTextWidthFn)
00569 return xctx->getTextWidthFn(ctx, fnt, s);
00570 else
00571 return -1;
00572 }
00573
00574
00575
00576 int HtmlCtx_GetTextHeight(GWEN_XML_CONTEXT *ctx,
00577 HTML_FONT *fnt,
00578 const char *s) {
00579 HTML_XMLCTX *xctx;
00580
00581 assert(ctx);
00582 xctx=GWEN_INHERIT_GETDATA(GWEN_XML_CONTEXT, HTML_XMLCTX, ctx);
00583 assert(xctx);
00584
00585 if (xctx->getTextHeightFn)
00586 return xctx->getTextHeightFn(ctx, fnt, s);
00587 else
00588 return -1;
00589 }
00590
00591
00592
00593 uint32_t HtmlCtx_GetColorFromName(const GWEN_XML_CONTEXT *ctx,
00594 const char *name) {
00595 HTML_XMLCTX *xctx;
00596
00597 assert(ctx);
00598 xctx=GWEN_INHERIT_GETDATA(GWEN_XML_CONTEXT, HTML_XMLCTX, ctx);
00599 assert(xctx);
00600
00601 if (xctx->getColorFromNameFn)
00602 return xctx->getColorFromNameFn(ctx, name);
00603 else
00604 return 0xffffffff;
00605 }
00606
00607
00608
00609 HTML_FONT *HtmlCtx_GetFont(GWEN_XML_CONTEXT *ctx,
00610 const char *fontName,
00611 int fontSize,
00612 uint32_t fontFlags) {
00613 HTML_XMLCTX *xctx;
00614
00615 assert(ctx);
00616 xctx=GWEN_INHERIT_GETDATA(GWEN_XML_CONTEXT, HTML_XMLCTX, ctx);
00617 assert(xctx);
00618
00619 if (xctx->getFontFn)
00620 return xctx->getFontFn(ctx, fontName, fontSize, fontFlags);
00621 else
00622 return NULL;
00623 }
00624
00625
00626
00627 HTML_IMAGE *HtmlCtx_GetImage(GWEN_XML_CONTEXT *ctx, const char *imageName) {
00628 HTML_XMLCTX *xctx;
00629
00630 assert(ctx);
00631 xctx=GWEN_INHERIT_GETDATA(GWEN_XML_CONTEXT, HTML_XMLCTX, ctx);
00632 assert(xctx);
00633
00634 if (xctx->getImageFn)
00635 return xctx->getImageFn(ctx, imageName);
00636 else
00637 return NULL;
00638 }
00639
00640
00641
00642 HTMLCTX_GET_TEXT_WIDTH_FN HtmlCtx_SetGetTextWidthFn(GWEN_XML_CONTEXT *ctx,
00643 HTMLCTX_GET_TEXT_WIDTH_FN fn) {
00644 HTML_XMLCTX *xctx;
00645 HTMLCTX_GET_TEXT_WIDTH_FN of;
00646
00647 assert(ctx);
00648 xctx=GWEN_INHERIT_GETDATA(GWEN_XML_CONTEXT, HTML_XMLCTX, ctx);
00649 assert(xctx);
00650
00651 of=xctx->getTextWidthFn;
00652 xctx->getTextWidthFn=fn;
00653
00654 return of;
00655 }
00656
00657
00658
00659 HTMLCTX_GET_TEXT_HEIGHT_FN HtmlCtx_SetGetTextHeightFn(GWEN_XML_CONTEXT *ctx,
00660 HTMLCTX_GET_TEXT_HEIGHT_FN fn) {
00661 HTML_XMLCTX *xctx;
00662 HTMLCTX_GET_TEXT_HEIGHT_FN of;
00663
00664 assert(ctx);
00665 xctx=GWEN_INHERIT_GETDATA(GWEN_XML_CONTEXT, HTML_XMLCTX, ctx);
00666 assert(xctx);
00667
00668 of=xctx->getTextHeightFn;
00669 xctx->getTextHeightFn=fn;
00670
00671 return of;
00672 }
00673
00674
00675
00676 HTMLCTX_GET_COLOR_FROM_NAME_FN HtmlCtx_SetGetColorFromNameFn(GWEN_XML_CONTEXT *ctx,
00677 HTMLCTX_GET_COLOR_FROM_NAME_FN fn) {
00678 HTML_XMLCTX *xctx;
00679 HTMLCTX_GET_COLOR_FROM_NAME_FN of;
00680
00681 assert(ctx);
00682 xctx=GWEN_INHERIT_GETDATA(GWEN_XML_CONTEXT, HTML_XMLCTX, ctx);
00683 assert(xctx);
00684
00685 of=xctx->getColorFromNameFn;
00686 xctx->getColorFromNameFn=fn;
00687
00688 return of;
00689 }
00690
00691
00692
00693 HTMLCTX_GET_FONT_FN HtmlCtx_SetGetFontFn(GWEN_XML_CONTEXT *ctx, HTMLCTX_GET_FONT_FN fn) {
00694 HTML_XMLCTX *xctx;
00695 HTMLCTX_GET_FONT_FN of;
00696
00697 assert(ctx);
00698 xctx=GWEN_INHERIT_GETDATA(GWEN_XML_CONTEXT, HTML_XMLCTX, ctx);
00699 assert(xctx);
00700
00701 of=xctx->getFontFn;
00702 xctx->getFontFn=fn;
00703
00704 return of;
00705 }
00706
00707
00708
00709 HTMLCTX_GET_IMAGE_FN HtmlCtx_SetGetImageFn(GWEN_XML_CONTEXT *ctx, HTMLCTX_GET_IMAGE_FN fn) {
00710 HTML_XMLCTX *xctx;
00711 HTMLCTX_GET_IMAGE_FN of;
00712
00713 assert(ctx);
00714 xctx=GWEN_INHERIT_GETDATA(GWEN_XML_CONTEXT, HTML_XMLCTX, ctx);
00715 assert(xctx);
00716
00717 of=xctx->getImageFn;
00718 xctx->getImageFn=fn;
00719
00720 return of;
00721 }
00722
00723
00724
00725 int HtmlCtx_Layout(GWEN_XML_CONTEXT *ctx, int width, int height) {
00726 HTML_XMLCTX *xctx;
00727 HTML_OBJECT *o;
00728 int rv;
00729
00730 assert(ctx);
00731 xctx=GWEN_INHERIT_GETDATA(GWEN_XML_CONTEXT, HTML_XMLCTX, ctx);
00732 assert(xctx);
00733
00734 o=HtmlObject_Tree_GetFirst(xctx->objects);
00735 if (o==NULL) {
00736 DBG_ERROR(GWEN_LOGDOMAIN, "No objects");
00737 return 0;
00738 }
00739
00740 HtmlObject_SetWidth(o, width);
00741 HtmlObject_SetHeight(o, height);
00742 rv=HtmlObject_Layout(o);
00743 if (rv<0) {
00744 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
00745 return rv;
00746 }
00747
00748 return 0;
00749 }
00750
00751
00752
00753 void HtmlCtx_SetText(GWEN_XML_CONTEXT *ctx, const char *s) {
00754 HTML_XMLCTX *xctx;
00755 int rv;
00756 HTML_GROUP *g;
00757 HTML_OBJECT *o;
00758
00759 assert(ctx);
00760 xctx=GWEN_INHERIT_GETDATA(GWEN_XML_CONTEXT, HTML_XMLCTX, ctx);
00761 assert(xctx);
00762
00763
00764 HtmlObject_Tree_Clear(xctx->objects);
00765
00766
00767 g=HtmlGroup_Box_new("HTML_ROOT", NULL, ctx);
00768 assert(g);
00769
00770 HtmlGroup_SetProperties(g, xctx->standardProps);
00771 o=HtmlObject_Box_new(ctx);
00772 HtmlObject_SetProperties(o, xctx->standardProps);
00773 HtmlGroup_SetObject(g, o);
00774 HtmlObject_Tree_Add(xctx->objects, o);
00775 HtmlCtx_SetCurrentGroup(ctx, g);
00776
00777 if (s && *s) {
00778 rv=GWEN_XMLContext_ReadFromString(ctx, s);
00779 if (rv<0) {
00780 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
00781 }
00782 }
00783
00784 #if 0
00785 fprintf(stderr, "============ Objects:\n");
00786 fprintf(stderr, "String: [%s]\n", s);
00787 o=HtmlObject_Tree_GetFirst(xctx->objects);
00788 while(o) {
00789 const char *xx;
00790
00791 xx=HtmlObject_GetText(o);
00792 fprintf(stderr, "Object(%d): [%s]\n",
00793 HtmlObject_GetObjectType(o),
00794 xx?xx:"(NULL)");
00795 o=HtmlObject_Tree_GetBelow(o);
00796 }
00797 #endif
00798 }
00799
00800
00801
00802 int HtmlCtx_GetWidth(const GWEN_XML_CONTEXT *ctx) {
00803 HTML_OBJECT *o;
00804
00805 o=HtmlCtx_GetRootObject(ctx);
00806 if (o)
00807 return HtmlObject_GetWidth(o);
00808 else
00809 return -1;
00810 }
00811
00812
00813
00814 int HtmlCtx_GetHeight(const GWEN_XML_CONTEXT *ctx) {
00815 HTML_OBJECT *o;
00816
00817 o=HtmlCtx_GetRootObject(ctx);
00818 if (o)
00819 return HtmlObject_GetHeight(o);
00820 else
00821 return -1;
00822 }
00823
00824