WebGL Tutorial
and more

GraphvizFigure Test

关于HTML转义

由于Graphviz的源代码需要>等特殊的HTML字符,所以不能对这类字符进行转义。因此,应当使用:

let src = this.innerHTML;

来原样取出所有的HTML代码。

但实际上,上面的代码将导致HTML中的>等特殊字符被转化为>。因此,需要将它们转换回来:

src = src.replace(/&lt;/g, '<') .replace(/&gt;/g, '>');

Simple

HTML页面中编写下面代码:

digraph { a -> b; c -> d; }

即可显示:

digraph { a -> b; c -> d; }

HTML-Like Label

而对于类似于下面的带有table的代码时:

digraph { struct1 [shape=plaintext, label=< <TABLE> <TR><TD>1</TD><TD>2</TD><TD>3</TD></TR> </TABLE> >]; }

在使用:

let src = this.innerHTML;

时,代码将会变成:

123

即自动加上了tbody标签。而Graphivz不认识此标签,从而导致编译出错。因此,可使用:

src = src.replace(/&lt;/g, '<').replace(/&gt;/g, '>') .replace(/<tbody>/g, '') .replace(/<\/tbody>/g, '');

来将它们替换为空字符串。

显示:

digraph { struct1 [shape=plaintext, label=<
123
>]; }

支持亮色主题的转换

由于GraphvizFigure被设计为尽可能轻量级的组件,因此将被广泛应用。而当用户切换亮色主题时,如若不能智能地随之而切换颜色,将不可忍受。因此,先预定义了两种主题的源代码:

this.srcLight = ...; this.srcDark = ...;

在本站中,当用户单击亮色主题的按钮时,将触发一个自定义事件:

window.parent.dispatchEvent(new CustomEvent('color-scheme-changed', { detail: eventDetail }));

GraphvizFigure可响应此事件:

window.addEventListener('color-scheme-changed', (evt) => { this.decideScheme(); this.render(); }); decideScheme() { if (getCurrColorTheme() === 'dark') { this.src = this.srcDark; } else { this.src = this.srcLight; } }

调整亮色主题后,重新渲染即可。剩下的问题,便是如何才能设计好两套亮色主题的问题了。