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.
@@ -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 readonly _source;
6
- private readonly _tmpContainer;
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
  }
@@ -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
- this.render();
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 (!this._source) {
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(this._source);
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
- this._svgContainer.innerHTML = svgCode;
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`, this._source, insert, this._tmpContainer);
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.103-alpha.0",
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": "f9f3ceee7e681a3b6168c724ac0833a886118b8d",
31
+ "gitHead": "fa5b958c21c58d24cbe7926591ec134a176bc6a5",
32
32
  "publishConfig": {
33
33
  "access": "public"
34
34
  }