// 解析页面模板 int Page::Parse() { FUNCTION_TRACK(); // 函数轨迹跟踪 FileObj file; // 文件名空,则不解析; if("" == m_html) { LOG_DEBUG("no html file. [%s]", m_id.c_str()); return OK; } if( !file.Open(m_html) ) { LOG_ERROR("Can't open html template file: [%s]", m_html.c_str()); return ERR; } int ret; const int nFileSize = file.Size(); std::auto_ptr<char> tmp(new char [nFileSize + 1]); char * const buf = tmp.get(); if(NULL == buf) { LOG_ERROR("分配内存出错"); return ERR; } ret = file.Read(buf, nFileSize); if(nFileSize != ret) { LOG_ERROR("读取文件不完整,[%d/%d]", ret, nFileSize); return ERR; } buf[ret] = '\0'; //LOG_DEBUG("nFileSize=[%d], file=[%s]", nFileSize, buf); m_TagList = new vector< Tag * >; if(NULL == m_TagList) { LOG_ERROR("分配标记容器内存出错"); return ERR; } vector< Tag * > &list = (*m_TagList); char *pBuf = buf; while(NULL != pBuf) { char *left; char *right; char *txt = pBuf; // 正常文本部分 char *tag = NULL; // 标记部分 // 查找标记如:"<!--$.......$-->" if( (left = strstr(pBuf, TAG_LEFT)) != NULL && (right = strstr(left, TAG_RIGHT)) != NULL ) { *left = '\0'; // 去掉左边括号 *right = '\0'; // 去掉右边括号 tag = left + (sizeof(TAG_LEFT) - 1); // 跳过左边括号(指向标记部分) pBuf = right + (sizeof(TAG_RIGHT) - 1); // 跳过右边括号后,指向下段文本; } else { pBuf = NULL; // 准备结束操作 } /* * 每个段文件(及标记),对应一个处理对象; */ // 正常文本 { Tag *objTxt; if( '\0' != *txt && (objTxt = Tag::New("", "TXT")) != NULL // "TXT"对应文件处理对象 ) { // 设置标记,及类型为文本; objTxt->Set(txt, Tag::TXT); // 插入列队 list.push_back(objTxt); //LOG_DEBUG("插入标记对象:[%d][%s]", Tag::TXT, txt); } else { LOG_ERROR("Can't find object of tag: [%s] [%s]", m_html.c_str(), txt); } } // 处理标记 if(NULL != tag && '\0' != tag) { /* * 标记格式如: * <!--$标记记号$类型$-->' * * 当类型空时,表示该标记只从属于当前页面,否则可能 * 是全局有效的标记;[2010-05-01] */ // 分割出命令和类型字段 char *tmp; const char *cmd = tag; const char *type = NULL; tmp = strchr(tag, '$'); if(NULL != tmp) { *tmp = '\0'; // 清掉‘$’ type = tmp + 1; // 指向类型 } if(NULL == type || '\0' == *type) { // 没有类型字段则指向当前页面id type = m_id.c_str(); } Tag *objTag = Tag::New(type, cmd); if( objTag != NULL ) { // 设置标记,及类型为标记; objTag->Set(cmd, Tag::TAG); // 插入列队 list.push_back(objTag); //LOG_DEBUG("插入标记对象:[%d][%s]", Tag::TAG, cmd); } else { LOG_ERROR("Can't find object of tag: [%s] [%s] [%s]", m_html.c_str(), type, cmd); } } }// end of while(NULL != pBuf)... return OK; }// end of int Page::Parse()...