void t2HTMLParser::parse() { if(!bLoaded) t2PrintError("html文件未被加载, 无法解析"); parser->parse(html.c_str()); // --!设计失误 拷贝css地址 for(auto p : parser->cssFilePaths) cssFilePaths.push_back(p); }
void t2HTMLParser::t2LabelParser::parse(const char* html) { GumboOutput* output = gumbo_parse(html); GumboNode *root = output->root; if(root->type != GUMBO_NODE_ELEMENT) { t2PrintError("html格式有误"); return; } // find head GumboVector *rootChildren = &root->v.element.children; GumboNode *h = NULL, *b = NULL; for(int i = 0; i < rootChildren->length; i++) { GumboNode *child = (GumboNode *) rootChildren->data[i]; if(child->type == GUMBO_NODE_ELEMENT && child->v.element.tag == GUMBO_TAG_HEAD) h = child; else if(child->type == GUMBO_NODE_ELEMENT && child->v.element.tag == GUMBO_TAG_BODY) b = child; } if(!h) { t2PrintError("html文件缺少<head>标签"); return; } head(h); // find body if(!b) { t2PrintError("html文件缺少<body>标签"); return; } body(b); gumbo_destroy_output(&kGumboDefaultOptions, output); }
void t2HTMLParser::t2LabelParser::head(GumboNode *h) { GumboVector *headChildren = &h->v.element.children; for(int i = 0; i < headChildren->length; i++) { GumboNode *child = (GumboNode *) headChildren->data[i]; // find title if(child->type == GUMBO_NODE_ELEMENT && child->v.element.tag == GUMBO_TAG_TITLE) { if(child->v.element.children.length != 1) { t2PrintError("<empty title>"); return; } // title无子节点 GumboNode *title = (GumboNode *) child->v.element.children.data[0]; if(title->type != GUMBO_NODE_TEXT && title->type != GUMBO_NODE_WHITESPACE) { t2PrintError("标题只可为空或文字"); return; } t2Window::getInstance()->window->setTitle(title->v.text.text); } // find css file else if(child->type == GUMBO_NODE_ELEMENT && child->v.element.tag == GUMBO_TAG_LINK) { GumboAttribute *href = gumbo_get_attribute(&child->v.element.attributes, "href"); if(!href) t2PrintError("<link>缺失href属性"); cssFilePaths.push_back(href->value); } } }
bool t2Image::loadImage(string path) { img = nvgCreateImage(t2GetContext(), path.c_str(), 0); if(!img) { bLoaded = false; t2PrintError("图片读取失败,可能是路径有误"); return false; } else { bLoaded = true; nvgImageSize(t2GetContext(), img, &width, &height); return true; } }
void t2LayoutController::updateDiv(t2Div* div, bool bCondition) { if(div->parent) { switch(div->parent->layout) { case T2_LINEAR_LAYOUT: linearLayout(div, bCondition); break; case T2_LIST_LAYOUT: listLayout(div, bCondition); break; default: t2PrintError("错误布局代码"); break; } } // 根节点默认为线性布局 else linearLayout(div); }