HTML网页解析函数

网页调入函数

该函数只调用ychtml.cpp的ychtmlCLASS::htmlLoad()函数。

YHTML *YC_htmlLoad(
    const char *htmfile=0,  //文件名或网址,如yc.htm、http://www.ycbro.com
    YPOST *pPost=0,         //POST数据指针
    void *hwnd=0,           //窗口句柄。显示网页的窗口。为null时只渲染,不显示
    htmlHOOK hookPage=0,    //回调函数。在网页的调入解析渲染过程中会通过消息调用它
    void *pHookData=0,      //回调函数所需数据地址
    void *pCppObject=0,     //通过<script language=ycscript>嵌入HTML的c/c++代码对象
    int aState=0            //状态
    int htmltype=HTML_DIALOG, //网页渲染的方式及用途
    int aDebug=0,     //执行网页Javascript时是否记录代码位置,以便确定运行时错误的位置
    YPARA *pPara=0   //其它参数
    );

参数
htmfile
  文件名或网址,有下列4种方式:
  (1) htmfile为null时,创建一个空白网页。
  (2) htmfile的后缀名为.js时,将htmfile当作Javascript代码文件执行。
  (3) htmfile的后缀名为.ysp时,将htmfile当作YSP动态网页文件处理。
  (4) htmfile的后缀名为其它时,将htmfile当作静态网页处理。

返回值
    如果函数运行成功,将创建一个描述网页的YHTML数据结构,并返回其地址。返回值称为页面指针,必须用YC_cppFree()函数释放。如果函数运行失败,则返回NULL。

页面释放函数

    该函数只调用ychtml.cpp的YCHTML->htmlFree(phtml)。

int YC_htmlFree(
    YHTML *phtml   //被释放的网页
    );

返回值
    如果页面中的Javascript代码无错误,则返回0,否则返回其错误个数。

执行Javascript代码的函数

    该函数内部调用ycjit.cpp文件的ycjitCLASS::jsRun()函数。

_int64 YC_jsRun(
    YHTML *phtml,         //执行Javascript代码的网页指针
    wchar_t *srcbuf,      //Javascript代码地址
    int glen=0,           //Javascript代码长度
    wchar_t **pWide=0,    //unicode字符串返回地址
    double *pDouble=0     //double类型数据返回地址
    );

参数
phtml
    在网页phtml中执行Javascript代码。
srcbuf
    unicode格式的Javascript代码缓冲区地址。
glen
    Javascript代码长度。如果glen=0,函数内部将用语句:glen = wcslen(srcbuf);获得glen
pWide
    当pWide不等于NULL时,代码返回值值以unicode字符串格式存放在内存,该内存的地址被放入pWide。
    该内存可能将在下一次参数pWide不为NULL的YC_jsRun()调用中被释放而变成无效,因此调用者需及时将
pWide中的内容备份。
pDouble
    当pDouble不等于NULL时,代码返回值以double格式存入pDouble。

返回值
返回Javascript代码的返回值。

执行Javascript格式代码的函数
 _int64 YC_jsRunf(
     YHTML *phtml,            //在phtml网页中执行Javascript代码
     wchar_t *format, ...);   //定义格式的unicode字符串

该函数的源码为:

_int64 YC_jsRunf(YHTML *phtml,wchar_t *format, ...)
{
    va_list argptr;
    va_start(argptr, format);
    wchar_t srcbuf[16384];
    int kk = _vsnwprintf(srcbuf, wsizeof(srcbuf), format, argptr);
    _int64 glen = YCJIT->jsRun(phtml,srcbuf,kk);
    va_end(argptr);
    return glen;
}
1. C/C++程序用YC_jsRun()或YC_jsRunf()函数执行Javascript代码
#include <stdio.h>
#include <stdlib.h>
#include "yc.h"
void main()
{
    _int64 t0 = YCWEB->clock();
    YHTML *phtml = YC_htmlLoad();      //创建的空白网页

    double pval;
    int glen = YC_jsRun(phtml,L"Math.sin(3.14/8) + Math.pow(3, 2.7)",0,0,&pval);
    printf("pval =  %.15f\n",pval);  //打印Javascript表达式的值pval,它是浮点数
    printf("glen =  %d\n\n",glen);   //打印YC_jsRun()返回值,它是pval的整数部分

    wchar_t *pWide;
    glen = YC_jsRun(phtml,L" `日暮苍山远,"
                            L"天寒白屋贫。"
                            L"柴门闻犬吠,"
                            L"风雪夜归人。`"
                            L" + new Date().toLocaleDateString()",
                             0,&pWide,&pval);
    char *pChar = YC_wideToChar(&glen,pWide,glen); //将表达式的值转换为ansi格式
    printf("pChar = %s\n\n",pChar);              //打印类型为字符串的表达式的值
    free(pChar);

    int kk = YC_jsRunf(phtml,L"Math.tan( Math.PI / %f) * %f", 2.001735, 2.71828);
    printf("kk = %d\n",kk);

    YC_htmlFree(phtml);
    printf("time: %d ms\n",YCWEB->clock() - t0);
}

                            c/c++代码文件:fair.cpp
编译:用 YC命令: ycc fair.cpp 或 VC++命令: cl fair.cpp 生成执行文件: fair.exe
运行:在cmd界面运行fair.exe后,输出下列文字:
    pval = 19.801523017047352
    glen = 19

    pChar = 日暮苍山远,天寒白屋贫。柴门闻犬吠,风雪夜归人。2020年2月9日

    kk = 1996
    time: 22 ms

2. C/C++程序用YC_htmlLoad()函数执行Javascript文件
```c
const t1 = new Date();
(function ()
{
    var res = 7.01
    for(var ii=0; ii<3999999; ii++)
      {
        res += Math.cos(ii)
        res += Math.sin(ii)
      }
    document.write(res, "<br>\n")
    document.write(ii, "<br>\n")
})()

function getdate(str)
{
    document.write(`  <br>\n\n${str}  <br>` );
    return `日期: ${ new Date().toLocaleDateString() }\n` +
           `时间: ${ new Date().toLocaleTimeString() }\n`
}
document.write(new Date() - t1 + 'ms')

                            Javascript代码文件:dark.js

#include <stdio.h>
#include <ycapi.h>
void main()
{
    YHTML *phtml = YC_htmlLoad("dark.js");  //创建网页执行Javascript文件dark.js
    wchar_t *pWide;
    int glen = YC_jsRun(phtml,L"getdate(`人间四月芳菲尽,山寺桃花始盛开。"
                              L"长恨春归无觅处,不知转入此中来。`)",
                              0,
                              &pWide); //执行 dark.js 函数 getdate()
    char srcbuf[1024];
    YC_wideToCharEx(srcbuf,sizeof srcbuf,pWide,glen); //unicode转换为ansi字符串
    printf("\n\n%s",srcbuf);
    YC_htmlFree(phtml);
}

                            c/c++代码文件:kind.cpp

编译:用 YC命令: ycc kind.cpp 或 VC++命令: cl kind.cpp 生成执行文件: kind.exe
运行:在cmd界面执行kind.exe后,输出下列文字:
      9.2261870027

      3999999

      359ms

      人间四月芳菲尽,山寺桃花始盛开。长恨春归无觅处,不知转入此中来。

      日期: 2020年2月9日
      时间: 12:30:47

文件dark.js也可以在下列的HTML文件中执行:

<body style='font-size:24px;'>
<script src=dark.js></script>
<script>
  document.write("<br><span style='font-size:20px;'>")
  document.write(getdate(`曾经沧海难为水,<br>
                          除却巫山不是云。<br>
                          取次花丛懒回顾,<br>
                          半缘修道半缘君。<br>`))
</script>

                            HTML代码文件:dark.htm

将dark.htm调入YC编辑器,按F9键运行后,输出下列文字:
      9.2261870027
      3999999
      375ms

      曾经沧海难为水,
      除却巫山不是云。
      取次花丛懒回顾,
      半缘修道半缘君。
      日期: 2020年2月9日 时间: 12:42:05

在Chrome浏览器调入dark.htm,显示下列文字:
      9.226187002699044
      3999999
      739ms

      曾经沧海难为水,
      除却巫山不是云。
      取次花丛懒回顾,
      半缘修道半缘君。

      日期: 2020/2/9 时间: 下午12:40:20

    从结果看,尽管YC编译器编译Javascript源码还有较大优化空间有待完成,但其生成的Javascript执行代码在运行速度上与Chrome浏览器还是接近的。

3. C/C++程序用YC_htmlLoad()函数执行YSP文件
<!--http:/127.0.0.1:80/moon.ysp?size=32&type=Peking&%u6587%u672C=%u5317%u4EAC&color=red&yxb=fire&xuan=spring-->
<% printf("document.file = %s<br>",document.file) %>
<% printf("document.URL = %s<br>",document.URL) %>
<script> document.write('春眠不觉晓<br>'); </script>
<%=`处处闻` + "啼鸟<br>"%>
<%
    YC_form({ type:"离离原上草", 文本:"一岁一枯荣", yxb:"野火烧不尽",
                                                        xuan:"春风吹又生"})
    printf("\n参数 request.form.type = %s<br>\n",request.form.type);
    printf("参数 request.form.文本 = %s<br>\n",request.form.文本);
    printf("参数 request.form.yxb = %s<br>\n",request.form.yxb);
    printf("参数 request.form.xuan = %s<br>\n",request.form.xuan);
%>
<div style="color:<%=request.form.color%>;font-size:<%=request.form.size%>">
<%=request.form.文本%>
</div>
<%
  pstr = sprintf("%s  %s<br>\n",new Date().toLocaleDateString()
                               ,new Date().toLocaleTimeString());
  printf(pstr);

  if(localStorage.visit_count == undefined)  localStorage.visit_count = 0;
  else                                       localStorage.visit_count++;
  printf("visit_count = %d  <br>\n",localStorage.visit_count);
%>
<script> document.write('夜来风雨声<br>'); </script>
                   

                            YSP代码文件:moon.ysp

#include <stdio.h>
#include <stdlib.h>
#include "yc.h"
void main()
{
  char pfile[] = "moon.ysp?size=88&type=Peking&文本=北京&color=red&yxb=1&xuan=9";
  YHTML *phtml = YC_htmlLoad(pfile);
  int glen;
  wchar_t *wiptr = YCHTML->sourceHTML(phtml,&glen);    //获得YSP输出文本
  char *yspPtr = YC_wideToChar(&glen,wiptr,glen);
  printf(yspPtr);
  YCWEB->MessageBoxA(phtml,yspPtr,pfile,0,glen);  //在对话框中显示网页
  free(yspPtr);
  YC_htmlFree(phtml);
}

                            c/c++代码文件:star.cpp

编译:用 YC命令: ycc star.cpp 或 VC++命令: cl star.cpp 生成执行文件: star.exe
运行:在cmd界面执行star.exe后,输出下列文字:

document.file = moon

document.URL = moon.ysp

处处闻啼鸟

参数 request.form.type = Peking

参数 request.form.文本 = 北京

参数 request.form.yxb = 1

参数 request.form.xuan = 9

北京
2020年1月13日 7:33:34
visit_count = 152

    并显示一个对话框。

    运行ycs.exe服务器,在Chrome浏览器地址栏输入网址:
http:/127.0.0.1:80/moon.ysp?size=32&type=Peking&%u6587%u672C=%u5317%u4EAC&color=red&yxb=fire&xuan=spring
    (其中,参数 &文本=北京 经escape编码后变为 &%u6587%u672C=%u5317%u4EAC)
回车后,显示如下:
    document.file = moon
    document.URL = F:/yjy/qxzm/moon.ysp
    春眠不觉晓
    处处闻啼鸟
    参数 request.form.type = Peking
    参数 request.form.文本 = 北京
    参数 request.form.yxb = fire
    参数 request.form.xuan = spring
    北京
    2020年2月9日 13:38:50
    visit_count = 16
    夜来风雨声

4. C/C++程序用YC_htmlLoad()执行嵌入了C/C++代码的YSP文件
<div style="color:green;font-size:56px;font-family:黑体;
        text-shadow:3px 3px 25px #000;">计算圆周率的800</div><hr>
<%  //在此用标签<% % >嵌入与Javascript代码
[%   //在此用标签[% % ]嵌入c/c++代码
char *calc_pi(char *cStr,char *pTim)
{
    int b_time = clock();
    #define  PI_LEN   80 * 7 * 5
    static char pbuf[PI_LEN];
    int *f = new int[PI_LEN + 1];

    int a=10000,b=0,c=PI_LEN,d,e=0,g,kk=0;
    for(; b-c; )  f[b++] = a/5;

    for(; d=0, g=c*2; c -= 14,
                      sprintf(&pbuf[kk],"%.4d",e+d/a),
                      kk ? 0 : (memmove(&pbuf[2],&pbuf[1],3),pbuf[1]='.',kk=1),
                      kk += 4,
                      e = d % a)
          for(b=c; d+=f[b]*a, f[b]=d%--g,d/=g--,--b; d*=b);

    delete f;
    sprintf(&pbuf[kk],"\n<br>%d %s\n<br>%s: %d ",kk-1,cStr,pTim,clock() - b_time);
    return pbuf;
}
%]

 printf(`<style> #tp { font-size:48px;font-family:黑体;color:olive;} </style>
         <div id=tp></div><hr><span style="font-size:20px;word-break:break-all;">
         <script>
         function timer()
           {
             const wk = ["日","一","二","三","四","五","六"]
             var as = new Date().toLocaleDateString()
             as += ' 星期' + wk[new Date().getDay()]
             as += ' ' + new Date().toLocaleTimeString()
             as += ' ' + new Date().getMilliseconds()
             tp.innerHTML = as;
           }
         timer();
         setInterval(timer,1);
         </script>\n`);
 printf(calc_pi("位","时间"));
%>

                            YSP代码文件:sea.ysp

#include <stdio.h>
#include <stdlib.h>
#include "yc.h"
void main()
{
  YHTML *phtml = YC_htmlLoad("sea.ysp");
  int glen;
  wchar_t *wiptr = YCHTML->sourceHTML(phtml,&glen);    //获得YSP输出文本
  char *yspPtr = YC_wideToChar(&glen,wiptr,glen);
  printf(yspPtr);
  YCWEB->MessageBoxW(phtml,wiptr,L"计算圆周率",0,glen);
  free(yspPtr);
  YC_htmlFree(phtml);
}

                            c/c++代码文件:land.cpp

编译:用 YC命令: ycc land.cpp 或 VC++命令: cl land.cpp 生成执行文件: land.exe
运行:在cmd界面执行land.exe后,将显示一个对话框并输出下列文字:

<div style="color:green;font-size:56px;font-family:黑体;
        text-shadow:3px 3px 25px #000;">计算圆周率的800</div><hr>

<style> #tp { font-size:48px;font-family:黑体;color:olive;} </style>
         <div id=tp></div><hr><span style="font-size:20px;word-break:break-all;">
         <script>
         function timer()
           {
             const wk = ["日","一","二","三","四","五","六"]
             var as = new Date().toLocaleDateString()
             as += ' 星期' + wk[new Date().getDay()]
             as += ' ' + new Date().toLocaleTimeString()
             as += ' ' + new Date().getMilliseconds()
             tp.innerHTML = as;
           }
         timer();
         setInterval(timer,1);
         </script>
3.141592653589793238462643383279502884197169399375105820974944592307816406286208
99862803482534211706798214808651328230664709384460955058223172535940812848111745
02841027019385211055596446229489549303819644288109756659334461284756482337867831
65271201909145648566923460348610454326648213393607260249141273724587006606315588
17488152092096282925409171536436789259036001133053054882046652138414695194151160
94330572703657595919530921861173819326117931051185480744623799627495673518857527
24891227938183011949129833673362440656643086021394946395224737190702179860943702
77053921717629317675238467481846766940513200056812714526356082778577134275778960
91736371787214684409012249534301465495853710507922796892589235420199561121290219
608640344181598136297747713099605187072113499999983729780499510597317328160963185
<br>800<br>时间: 0

    运行ycs.exe服务器,在Chrome浏览器地址栏输入网址:http://127.0.0.1/sea.ysp
并回车后,将显示一个由YC编译器生成的动态网页。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值