代码片段

从您的项目中导入和显示源代码。

使用方法

添加 CodeSnippet 组件

components/content/CodeSnippet.vue
<template>
  <MDC v-if="loadedCode" :value="md" class="not-first:mt-5" />
  <UiAlert v-else variant="destructive">
    <UiAlertTitle>Error</UiAlertTitle>
    <UiAlertDescription>
      Cannot load code: <ProseCodeInline>{{ file || url }}</ProseCodeInline>
    </UiAlertDescription>
  </UiAlert>
</template>

<script setup lang="ts">
const { file, url, language, title, highlights, meta, start, offset } = defineProps<{
  file?: string;
  url?: string;
  language: string;
  title?: string;
  highlights?: string;
  meta?: string;
  start?: number;
  offset?: number;
}>();

const loadedCode = ref('');

const rawFiles = import.meta.glob([
  // Path you want to import
], {
  query: '?raw',
  import: 'default',
});

if (file) {
  const importer = rawFiles[file];
  if (importer) {
    loadedCode.value = (await importer()) as string;
  }
} else if (url) {
  try {
    const data = await $fetch(url, { parseResponse: txt => txt });
    if (data) {
      loadedCode.value = data as string;
    }
  } catch {}
}

if (loadedCode.value && start && offset) {
  const lines = loadedCode.value.split('\n');
  loadedCode.value = lines.slice(Number(start || 1) - 1, Number(start || 1) - 1 + Number(offset)).join('\n');
}

const md = `
::div
\`\`\`\`${language} ${title && `[${title}]`} ${highlights && `{${highlights}}`} ${meta || ''}
${loadedCode.value}
\`\`\`\`
::
`;
</script>

添加要导入的路径

使用 Glob 导入模式 来添加路径。

Line 25 to 30 in CodeSnippet.vue
const rawFiles = import.meta.glob([
  // Path you want to import
  // e.g.
  '@/examples/**/*.{vue}',
], {
  query: '?raw',
  import: 'default',
});

在 markdown 文件中使用

::code-snippet
---
file: /examples/file.vue
language: vue
---
::

高亮行

::code-snippet
---
file: /examples/file.vue
language: vue
title: File
highlights: 9-11
meta: line-numbers height=300
---
::

Translates to:

````ts [File] {9-11} line-numbers height=300
// code imported from /examples/file.vue
````

使用偏移属性

::code-snippet
---
file: /examples/file.vue
language: vue
start: 6
offset: 4
---
::

从远程 URL 获取

::code-snippet
---
url: https://raw.githubusercontent.com/ZTL-UwU/shadcn-docs-nuxt/refs/heads/main/pages/index.vue
language: vue
---
::

属性

filestring
导入文件的路径
urlstring
获取代码的远程 URL
titlestring
代码块标题
languagestring
代码块高亮语言
highlightsstring
代码块高亮行
metastring
代码块元数据
startnumber
起始行索引
offsetnumber
从起始位置显示的行数