Markdown 中的 Shortcodes
Shortcodes 是一種特殊的語法,允許你在 Markdown 文檔中嵌入複雜的功能,而無需編寫完整的 HTML 或 JavaScript 代碼。它們像是內容模板的快捷方式。
什麼是 Shortcodes?
Shortcodes 是由靜態網站生成器(如 Hugo、Jekyll、Gatsby)提供的簡短代碼片段,可以在 Markdown 中調用預定義的功能或組件。
基本語法
不同平臺的 shortcode 語法略有不同:
Hugo
markdown
{{< shortcode-name param1="value1" >}}
{{< shortcode-name param1="value1" >}}
內容
{{< /shortcode-name >}}Jekyll
markdown
{% shortcode_name param1='value1' %}
{% shortcode_name param1='value1' %}
內容
{% endshortcode_name %}Docusaurus / MDX
markdown
<ShortcodeName param1="value1" />
<ShortcodeName param1="value1">
內容
</ShortcodeName>常見 Shortcodes
圖片和媒體
Hugo 圖片 Shortcode
markdown
{{< figure src="/images/example.jpg" title="示例圖片" caption="這是一個示例圖片" >}}視頻嵌入
markdown
{{< youtube "dQw4w9WgXcQ" >}}
{{< vimeo "123456789" >}}
{{< bilibili "BV1xx411c7mD" >}}音頻播放器
markdown
{{< audio src="/audio/podcast.mp3" >}}提示和警告框
markdown
{{< note >}}
這是一個提示信息。
{{< /note >}}
{{< warning >}}
這是一個警告信息。
{{< /warning >}}
{{< danger >}}
這是一個危險警告。
{{< /danger >}}
{{< tip >}}
這是一個小技巧。
{{< /tip >}}代碼示例
markdown
{{< highlight python "linenos=table,hl_lines=2-3" >}}
def hello_world():
print("Hello")
print("World")
{{< /highlight >}}
{{< code-tabs >}}
{{< code-tab lang="javascript" >}}
console.log("Hello World");
{{< /code-tab >}}
{{< code-tab lang="python" >}}
print("Hello World")
{{< /code-tab >}}
{{< /code-tabs >}}選項卡
markdown
{{< tabs >}}
{{< tab "選項卡 1" >}}
這是選項卡 1 的內容。
{{< /tab >}}
{{< tab "選項卡 2" >}}
這是選項卡 2 的內容。
{{< /tab >}}
{{< /tabs >}}摺疊面板
markdown
{{< collapse "點擊展開詳情" >}}
這裡是摺疊的內容。
只有在用戶點擊時才會顯示。
{{< /collapse >}}
{{< accordion >}}
{{< accordion-item "問題 1" >}}
答案 1
{{< /accordion-item >}}
{{< accordion-item "問題 2" >}}
答案 2
{{< /accordion-item >}}
{{< /accordion >}}創建自定義 Shortcodes
Hugo 自定義 Shortcode
簡單 Shortcode
layouts/shortcodes/highlight-box.html:
html
<div class="highlight-box">
{{ .Inner | markdownify }}
</div>使用:
markdown
{{< highlight-box >}}
這是**重要**內容。
{{< /highlight-box >}}帶參數的 Shortcode
layouts/shortcodes/alert.html:
html
<div class="alert alert-{{ .Get "type" }}">
<strong>{{ .Get "title" }}</strong>
{{ .Inner }}
</div>使用:
markdown
{{< alert type="warning" title="注意" >}}
請小心操作!
{{< /alert >}}Jekyll 自定義標籤
簡單標籤
_plugins/highlight_tag.rb:
ruby
module Jekyll
class HighlightTag < Liquid::Block
def render(context)
content = super
"<div class='highlight-box'>#{content}</div>"
end
end
end
Liquid::Template.register_tag('highlight', Jekyll::HighlightTag)使用:
markdown
{% highlight %}
重要內容
{% endhighlight %}MDX 自定義組件
React 組件
components/Callout.jsx:
jsx
export default function Callout({ type, title, children }) {
const colors = {
info: 'blue',
warning: 'yellow',
error: 'red',
success: 'green'
};
return (
<div className={`callout callout-${colors[type]}`}>
{title && <strong>{title}</strong>}
<div>{children}</div>
</div>
);
}使用:
mdx
import Callout from '@/components/Callout';
<Callout type="warning" title="注意">
這是一個重要的警告信息。
</Callout>最佳實踐
1. 保持簡潔
markdown
# 好的:簡潔清晰
{{< note >}}
重要提示
{{< /note >}}
# 避免:過於複雜
{{< container type="note" style="background:blue;padding:20px" id="note-1" class="custom" >}}
重要提示
{{< /container >}}2. 提供清晰的參數
markdown
# 好的:明確的參數名
{{< video src="video.mp4" poster="thumbnail.jpg" width="800" >}}
# 避免:模糊的參數
{{< video "video.mp4" "thumbnail.jpg" "800" >}}3. 文檔化你的 Shortcodes
創建 shortcode 文檔:
markdown
# Shortcode 參考
## note
創建一個提示框。
**語法**:
\`\`\`
{{< note >}}
你的內容
{{< /note >}}
\`\`\`
**參數**:無
**示例**:
\`\`\`
{{< note >}}
這是一個重要提示。
{{< /note >}}
\`\`\`結論
Shortcodes 是擴展 Markdown 功能的強大工具。它們讓你能夠在保持內容可讀性的同時,添加豐富的互動功能。選擇適合你平臺的 shortcode 系統,並遵循最佳實踐來創建可維護的內容。