zenn-embed-elements 0.1.103-alpha.0 → 0.1.104-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/classes/mermaid.d.ts +3 -4
- package/lib/classes/mermaid.js +40 -24
- package/package.json +2 -2
package/lib/classes/mermaid.d.ts
CHANGED
|
@@ -2,10 +2,9 @@
|
|
|
2
2
|
* original: https://github.com/gitlabhq/gitlabhq/blob/master/app/assets/javascripts/behaviors/markdown/render_mermaid.js
|
|
3
3
|
*/
|
|
4
4
|
export declare class EmbedMermaid extends HTMLElement {
|
|
5
|
-
private
|
|
6
|
-
private
|
|
7
|
-
private readonly _svgContainer;
|
|
8
|
-
constructor();
|
|
5
|
+
private observer?;
|
|
6
|
+
private _tmpContainer?;
|
|
9
7
|
connectedCallback(): Promise<void>;
|
|
8
|
+
disconnectedCallback(): void;
|
|
10
9
|
render(): Promise<void>;
|
|
11
10
|
}
|
package/lib/classes/mermaid.js
CHANGED
|
@@ -95,38 +95,51 @@ function getPotentialPerformanceRisk(source) {
|
|
|
95
95
|
};
|
|
96
96
|
}
|
|
97
97
|
class EmbedMermaid extends HTMLElement {
|
|
98
|
-
constructor() {
|
|
99
|
-
super();
|
|
100
|
-
// コード記述が格納されている pre タグを取得
|
|
101
|
-
// できるだけコードがちらつかないようにインスタンス変数に入れて削除してしまう
|
|
102
|
-
// パフォーマンスのために削除しているが、「コードをコピペしたい」みたいな話がでてきたときは残してHiddenにする
|
|
103
|
-
const sourceContainer = this.childNodes[0];
|
|
104
|
-
// detailsタグの中ではinnerTextがnullになることがあるため
|
|
105
|
-
this._source = sourceContainer.textContent || sourceContainer.innerText;
|
|
106
|
-
sourceContainer.remove();
|
|
107
|
-
// 一時コンテナ
|
|
108
|
-
const tmpContainer = document.createElement('div');
|
|
109
|
-
this.appendChild(tmpContainer);
|
|
110
|
-
this._tmpContainer = tmpContainer;
|
|
111
|
-
// 描画後のSVGを格納する div タグを作成
|
|
112
|
-
const container = document.createElement('div');
|
|
113
|
-
this.appendChild(container);
|
|
114
|
-
this._svgContainer = container;
|
|
115
|
-
}
|
|
116
98
|
connectedCallback() {
|
|
117
99
|
return __awaiter(this, void 0, void 0, function* () {
|
|
118
|
-
|
|
100
|
+
// 一時コンテナ
|
|
101
|
+
const tmpContainer = document.createElement('div');
|
|
102
|
+
this.appendChild(tmpContainer);
|
|
103
|
+
this._tmpContainer = tmpContainer;
|
|
104
|
+
// 以下の理由からmermaidのレンダリングを遅延する
|
|
105
|
+
// - パフォーマンスのため
|
|
106
|
+
// - Safariでdetailsタグ内のmermaid.jsがうまくレンダリングされないため
|
|
107
|
+
this.observer = new IntersectionObserver((entries) => {
|
|
108
|
+
entries.forEach((entry) => {
|
|
109
|
+
var _a;
|
|
110
|
+
if (entry.isIntersecting) {
|
|
111
|
+
this.render();
|
|
112
|
+
if (!this._tmpContainer) {
|
|
113
|
+
console.error('Something wrong with _tmpContainer');
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
(_a = this.observer) === null || _a === void 0 ? void 0 : _a.unobserve(this._tmpContainer); // 一度レンダリングされたらobserveを解除する
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
}, { rootMargin: '1000px 0px' } // 手前で発火
|
|
120
|
+
);
|
|
121
|
+
this._tmpContainer && this.observer.observe(this._tmpContainer);
|
|
119
122
|
});
|
|
120
123
|
}
|
|
124
|
+
disconnectedCallback() {
|
|
125
|
+
// observeを解除
|
|
126
|
+
if (this.observer) {
|
|
127
|
+
this._tmpContainer && this.observer.unobserve(this._tmpContainer);
|
|
128
|
+
this.observer.disconnect();
|
|
129
|
+
}
|
|
130
|
+
}
|
|
121
131
|
render() {
|
|
122
132
|
return __awaiter(this, void 0, void 0, function* () {
|
|
123
133
|
yield initMermaid();
|
|
134
|
+
const content = this.textContent || this.innerText;
|
|
124
135
|
// Mermaid モジュールの読み込みに失敗したり、レンダリング対象のコンテンツが空の場合は何もせずに終了
|
|
125
|
-
if (!
|
|
136
|
+
if (!content)
|
|
126
137
|
return;
|
|
127
|
-
|
|
138
|
+
// 図だけを表示するためにコードは非表示に
|
|
139
|
+
const sourceContainer = this.childNodes[0];
|
|
140
|
+
sourceContainer.setAttribute('style', 'display:none');
|
|
128
141
|
// 文法エラーやパフォーマンスリスクが検出された場合、注意書きをレンダリングして終了
|
|
129
|
-
const risk = getPotentialPerformanceRisk(
|
|
142
|
+
const risk = getPotentialPerformanceRisk(content);
|
|
130
143
|
if (Object.values(risk)
|
|
131
144
|
.map((r) => r.yes)
|
|
132
145
|
.includes(true)) {
|
|
@@ -149,9 +162,12 @@ class EmbedMermaid extends HTMLElement {
|
|
|
149
162
|
// https://github.com/mermaidjs/mermaid-gitbook/blob/master/content/usage.md#binding-events
|
|
150
163
|
// ここを参考に追加する
|
|
151
164
|
const insert = (svgCode) => {
|
|
152
|
-
|
|
165
|
+
// 描画後のSVGを格納する div タグを作成
|
|
166
|
+
const container = document.createElement('div');
|
|
167
|
+
this.appendChild(container);
|
|
168
|
+
container.innerHTML = svgCode;
|
|
153
169
|
};
|
|
154
|
-
mermaid === null || mermaid === void 0 ? void 0 : mermaid.mermaidAPI.render(`${containerId}-${Date.now().valueOf()}-render`,
|
|
170
|
+
mermaid === null || mermaid === void 0 ? void 0 : mermaid.mermaidAPI.render(`${containerId}-${Date.now().valueOf()}-render`, content, insert, this._tmpContainer);
|
|
155
171
|
});
|
|
156
172
|
}
|
|
157
173
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "zenn-embed-elements",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.104-alpha.1",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "Web components for embedded contents.",
|
|
6
6
|
"repository": {
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"rimraf": "^3.0.2",
|
|
29
29
|
"typescript": "^3.9.3"
|
|
30
30
|
},
|
|
31
|
-
"gitHead": "
|
|
31
|
+
"gitHead": "fa5b958c21c58d24cbe7926591ec134a176bc6a5",
|
|
32
32
|
"publishConfig": {
|
|
33
33
|
"access": "public"
|
|
34
34
|
}
|