Exemplo n.º 1
0
// 解析页面模板
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()...