Skip to content

Commit 792a586

Browse files
Merge pull request #539 from zenn-dev/fix-image-attr
[Breaking Change] markdown-itで変換したimgタグにclassとlazyを追加します
2 parents f9fbc35 + 67c2831 commit 792a586

File tree

7 files changed

+31
-11
lines changed

7 files changed

+31
-11
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,5 @@ yarn-error.log
55
lerna-debug.log
66
.node-version
77
.idea
8-
.turbo
8+
.turbo
9+
.claude/settings.local.json

packages/zenn-cli/articles/100-example-markdown-guide.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,8 @@ Markdownエディタでは、テキストを範囲選択した状態でURLをペ
104104
[![](画像のURL)](リンクのURL)
105105
```
106106

107+
[![](https://storage.googleapis.com/zenn-user-upload/gxnwu3br83nsbqs873uibiy6fd43 =250x)](https://zenn.dev)
108+
107109
## テーブル
108110

109111
```

packages/zenn-content-css/src/_content.scss

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -250,19 +250,19 @@ pre {
250250
.code-block-filename-container + pre {
251251
border-top-left-radius: 0;
252252
}
253-
img:not(.emoji) {
253+
img.md-img {
254254
margin: 1.5rem auto;
255255
display: table;
256256
max-width: 100%;
257257
height: auto;
258258
background: var(--c-bg-image);
259259
}
260-
img + br {
260+
img.md-img + br {
261261
display: none;
262262
}
263263
// ![](path_to_image)
264264
// *caption*
265-
img ~ em {
265+
img.md-img ~ em {
266266
display: block;
267267
margin: -1rem auto 0;
268268
line-height: 1.3;
@@ -271,7 +271,7 @@ img ~ em {
271271
font-size: 0.92em;
272272
}
273273
// リンクの中に画像がある場合、リンクの範囲を画像の大きさと合わせる
274-
a:has(img) {
274+
a:has(img.md-img) {
275275
display: table;
276276
margin: 0 auto;
277277
}

packages/zenn-content-css/test.html

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ <h2 id="埋め込み">埋め込み</h2>
4848
<p>
4949
👇このようなモーダルが開きます。<br />
5050
<img src="https://storage.googleapis.com/zenn-user-upload/3eczstjiajdxbqujkloer616mj6r" width="400" alt=""
51-
loading="lazy" /><br />
51+
class="md-img" loading="lazy" /><br />
5252
ツイートやYouTube、CodePen、SpeakerDeckなどを挿入できます。
5353
</p>
5454
<h2 id="その他のショートカット">その他のショートカット</h2>
@@ -280,7 +280,7 @@ <h2 id="画像の挿入">画像の挿入</h2>
280280
<pre class="highlight plaintext"><code>![altテキスト](https://画像のURL)</code></pre>
281281
</div>
282282
<p>
283-
<img src="https://storage.googleapis.com/zenn-user-upload-dev/05882bdcec20-20250626.webp" title="" alt="altテキスト" />
283+
<img src="https://storage.googleapis.com/zenn-user-upload-dev/05882bdcec20-20250626.webp" title="" alt="altテキスト" class="md-img" />
284284
<em>Captionテキスト</em>
285285
</p>
286286
<h3 id="画像の横幅を指定する">画像の横幅を指定する</h3>
@@ -289,7 +289,7 @@ <h3 id="画像の横幅を指定する">画像の横幅を指定する</h3>
289289
</div>
290290
<p>
291291
<img src="https://storage.googleapis.com/zenn-user-upload/gxnwu3br83nsbqs873uibiy6fd43" width="250" alt="altテキスト"
292-
loading="lazy" /><br />
292+
class="md-img" loading="lazy" /><br />
293293
画像の表示が大きすぎる場合は、URLの後に半角スペースを空けて<code>=○○x</code>と記述すると、画像の幅を指定できます。
294294
</p>
295295
<h3 id="画像をリンクにする">画像をリンクにする</h3>
@@ -299,7 +299,7 @@ <h3 id="画像をリンクにする">画像をリンクにする</h3>
299299
<p>
300300
<a href="https://zenn.dev">
301301
<img src="https://storage.googleapis.com/zenn-user-upload/gxnwu3br83nsbqs873uibiy6fd43" width="250"
302-
alt="altテキスト" loading="lazy" />
302+
alt="altテキスト" class="md-img" loading="lazy" />
303303
</a>
304304
直後にテキストがある場合もスタイルの影響は受けません。
305305
</p>

packages/zenn-markdown-html/__tests__/basic.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,6 @@ describe('MarkdownからHTMLへの変換テスト', () => {
3737

3838
test('dataスキーマの画像は除外する', () => {
3939
const html = markdownToHtml(`![](data:image/png;base64,xxxx)`);
40-
expect(html).toContain('<img alt />');
40+
expect(html).toContain('<img alt class="md-img" loading="lazy" />');
4141
});
4242
});

packages/zenn-markdown-html/src/index.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { mdLinkAttributes } from './utils/md-link-attributes';
1414
import { mdSourceMap } from './utils/md-source-map';
1515
import { mdLinkifyToCard } from './utils/md-linkify-to-card';
1616
import { mdRendererFence } from './utils/md-renderer-fence';
17+
import { mdImage } from './utils/md-image';
1718
import {
1819
containerDetailsOptions,
1920
containerMessageOptions,
@@ -61,7 +62,8 @@ const markdownToHtml = (text: string, options?: MarkdownOptions): string => {
6162
}),
6263
tabIndex: false,
6364
})
64-
.use(mdSourceMap);
65+
.use(mdSourceMap)
66+
.use(mdImage);
6567

6668
// custom footnote
6769
md.renderer.rules.footnote_block_open = () =>
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import MarkdownIt from 'markdown-it';
2+
import { RenderRule } from 'markdown-it/lib/renderer';
3+
4+
export const mdImage = (md: MarkdownIt): void => {
5+
const originalImageRenderRule = md.renderer.rules['image'] as RenderRule;
6+
7+
md.renderer.rules.image = (tokens, idx, options, env, slf) => {
8+
const token = tokens[idx];
9+
10+
token.attrJoin('class', 'md-img');
11+
token.attrSet('loading', 'lazy');
12+
13+
return originalImageRenderRule(tokens, idx, options, env, slf);
14+
};
15+
};

0 commit comments

Comments
 (0)