pyecharts源码解读(7)渲染包render之display模块:构造HTML、Javascript代码

当前pyecharts版本为1.9.0

概述

render包结构

render包位于pyecharts包顶级目录中,用于渲染图表。render包结构如下:

├─render # 渲染设置包
│  │  display.py # 定义HTML、JavaScript显示类,用于支持在notebook中嵌入输出结果
│  │  engine.py # 定义渲染相关类、函数
│  │  snapshot.py # 定义渲染图片函数
│  │  __init__.py # 暴露渲染图片函数
│  │
│  ├─templates # 定义渲染模板
│  │      components.html
│  │      macro
│  │      nb_components.html
│  │      nb_jupyter_globe.html
│  │      nb_jupyter_lab.html
│  │      nb_jupyter_lab_tab.html
│  │      nb_jupyter_notebook.html
│  │      nb_jupyter_notebook_tab.html
│  │      nb_nteract.html
│  │      simple_chart.html
│  │      simple_globe.html
│  │      simple_page.html
│  │      simple_tab.html

display模块

display模块,路径为pyecharts/render/display.py,作用为构造HTML和JavaScript的显示类,用于支持在notebook中嵌入输出结果。
display模块包含HTMLJavascript这两个类,这两个类主要用于pyecharts/render/engine.py,用于notebook渲染输出。该模块的设计几乎照搬IPython.display模块的HTMLJavascript类的设计。

HTML

HTML类的构造函数参数为data,类型为字符串,即HTML字符串。__html___repr_html_方法等价,返回HTML字符串。

Javascript

Javascript类的构造函数有三个参数:

  • data :JavaScript语句字符串。
  • css:CSS文件的路径。类型为字符串或序列。
  • lib:JavaScript文件的路径。类型为字符串或序列。

_repr_javascript_方法用于将构造函数接收的参数格式化为JavaScript语句,创建相关元素。

案例:HTML类的应用

from pyecharts.render.display import HTML

s="<a href='foo'>adf</a>"
h=HTML(s)
print(h.data)
print(h.__html__())
print(h._repr_html_())
h

在notebook中的输出为:
在这里插入图片描述

案例:Javascript类的应用

from pyecharts.render.display import Javascript

data = "var a=10;"
lib = "jquery.min.js"
css = "main.css"

js = Javascript(data=data,lib=lib,css=css)
print(js._repr_javascript_())

输出为:

var link = document.createElement("link");
    link.ref = "stylesheet";
    link.type = "text/css";
    link.href = "main.css";
    document.head.appendChild(link);
new Promise(function(resolve, reject) {
    var script = document.createElement("script");
    script.onload = resolve;
    script.onerror = reject;
    script.src = "jquery.min.js";
    document.head.appendChild(script);
}).then(() => {
var a=10;
});

pyecharts/render/display.py模块源码

class HTML:
    def __init__(self, data: Optional[str] = None):
        self.data = data

    def _repr_html_(self):
        return self.data

    def __html__(self):
        return self._repr_html_()


_lib_t1 = """new Promise(function(resolve, reject) {
    var script = document.createElement("script");
    script.onload = resolve;
    script.onerror = reject;
    script.src = "%s";
    document.head.appendChild(script);
}).then(() => {
"""

_lib_t2 = """
});"""

_css_t = """var link = document.createElement("link");
    link.ref = "stylesheet";
    link.type = "text/css";
    link.href = "%s";
    document.head.appendChild(link);
"""


class Javascript:
    def __init__(
        self,
        data: Optional[str] = None,
        lib: Optional[Union[str, Sequence]] = None,
        css: Optional[Union[str, Sequence]] = None,
    ):
        if isinstance(lib, str):
            lib = [lib]
        elif lib is None:
            lib = []
        if isinstance(css, str):
            css = [css]
        elif css is None:
            css = []
        self.lib = lib
        self.css = css
        self.data = data or ""

    def _repr_javascript_(self):
        r = ""
        for c in self.css:
            r += _css_t % c
        for d in self.lib:
            r += _lib_t1 % d
        r += self.data
        r += _lib_t2 * len(self.lib)
        return r
### DOM树、CSSOM树和渲染树的概念及关系 #### 什么是DOM树? 文档对象模型(Document Object Model, DOM)是一种用于表示HTML或XML文档的标准编程接口。当浏览器接收到HTML文件并开始解析,它会将这些标记语言的内容转换为一棵节点树,即DOM树。这棵树中的每个节点代表了一个HTML元素、属性或者文本片段[^4]。 #### CSSOM树是什么? 层叠样式表对象模型(CSS Object Model, CSSOM),类似于DOM,但它专注于描述如何应用样式到网页上。一旦外部或内部的CSS资源被下载完成,浏览器就会创建一颗CSSOM树来存储所有的样式规则及其对应的选择器信息[^1]。 #### 渲染树的意义 渲染树是由DOM树与CSSOM树共同组合而成的一棵新树。此树含了可见于屏幕上的所有内容——无论是来自HTML还是通过CSS定义的视觉效果。只有那些最终会被显示出来的部分才会进入这个阶段;例如,`display:none;`隐藏掉的部分不会出现在渲染树里[^2]。 #### 构建过程概述 整个构建流程可以分为以下几个主要环节: 1. **加载HTML**: 当用户访问某个URL地址之后,浏览器发起HTTP请求获取该页面对应的HTML源码。 2. **构建DOM树**: 接着,基于所接收的数据流逐步建立起了反映文档逻辑结构的抽象表现形式—DOM Tree。 3. **加载CSS**: 并行地,在继续读取更多HTML数据之前,任何关联好的CSS文件也会尽快被抓取下来以便尽早影响布局计算工作。 4. **构建CSSOM树**: 使用已有的CSS声明建立起另一套专门针对样式的层级体系–CSSOM Tree. 5. **合成渲染树**: 将上述两颗独立存在的树木结合起来形成第三种形态叫Render Tree(亦可称为Layout Tree),其中仅保留实际需要呈现给用户的那部分内容节点。 6. **执行布局(Layout)**: 计算每一个可视区域的具体尺寸位置参数等细节方面的东西。 7. **绘制(Paint)**: 把经过精确测量后的图形化组件按照指定顺序画出来构成完整的视图界面供人们观看交互操作之用[^3]. 8. **JavaScript运行**: 如果存在脚本,则可能改变以上任何一个步骤的结果甚至重新触发某些特定事件链路从而引起回流(reflow) 或重绘(repait). #### 示例代码展示简单的DOM操作 下面是一个简单例子演示如何利用javascript动态修改现有的dom元素: ```javascript // 获取id为example的div元素 var divElement = document.getElementById('example'); // 修改其背景颜色 divElement.style.backgroundColor = 'blue'; // 添加一个新的子段落p标签进去 var newParagraph = document.createElement('p'); newParagraph.textContent = 'This is a dynamically added paragraph.'; divElement.appendChild(newParagraph); ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值