Skip to content

代码

Props ​

Code ​

名称类型默认值说明
colorCodeColor'primary'行内代码的文字颜色:primary、secondary,或者 inherit(跟随周围文字)。
size'inherit'-字号。不传时使用代码字阶,传 inherit 则跟随周围的字号和行高。

CodeBlock ​

名称类型默认值说明
codestring-要展示的只读代码。无论代码块怎样着色,复制按钮写入的都是这个原字符串。
languagestring'plaintext'着色使用的语言。不认识的语言不做着色,plaintext 还会隐藏语言标签。
titlestring-显示在头部栏的文件名或标签。只给标题也会生成头部。
hasLanguageLabelbooleantrue是否在头部显示语言名。语言为 plaintext 时始终不显示。
hasLineNumbersbooleanfalse是否显示行号栏。行号栏宽度按最大行号计算。
highlightLinesnumber[]-要从 1 开始高亮的行号,这些行会加上底色。超出范围的行号没有效果。
hasCopyButtonbooleantrue是否显示复制按钮。有头部时放在头部,没有头部时浮在右上角。
isWrappedbooleanfalse长行是否折行,而不是横向滚动。
maxHeightnumber | string-超过这个高度后代码正文纵向滚动。数字按像素处理,所以 0 是合法的零像素高度。
isCollapsiblebooleanfalse是否可以从头部折叠正文。只有头部可见并且行数达到 collapsibleThreshold 时才会出现折叠控件。
collapsibleThresholdnumber10出现折叠控件所需的行数。
size'sm' | 'md''md'文字大小。md 使用代码字阶,sm 使用辅助文字字号。
widthstring'fit-content'任意 CSS 宽度取值。fit-content 贴着最长一行(带一个最小宽度下限,短代码也仍然像一块代码),100% 撑满父容器。
container'card' | 'section''card'容器样式。card 带边框、圆角和背景;section 三者都去掉,让代码块融入所在的表面。
tokenizer(code: string, language: string) => SyntaxToken[]-内置分词器不覆盖的语言可以用它自定义。token 使用绝对偏移。它只影响着色,不会改变显示或复制的文本。
highlightMode'auto' | 'ranges' | 'spans''auto'语法着色的实现方式。auto 优先使用 CSS Custom Highlight API,不支持时回退到 span 元素。
copyLabelstring'Copy code'复制前复制按钮的无障碍名称和悬停提示。
copiedLabelstring'Copied'复制成功后复制按钮的名称,以及礼貌播报的文本。
codeLabelstring'Code'代码视口的无障碍名称;当可折叠的头部没有可见标题和语言标签时,也用它作为头部的名称。

事件 ​

名称载荷说明
copy-代码字符串写入剪贴板之后触发。写入失败时不触发。

插槽 ​

名称说明
defaultCode 的行内代码内容。CodeBlock 的内容来自 code 属性,不渲染插槽。

导出 ​

除两个组件外,这些也从 @astryx-vue/core/Code 导出:

名称签名说明
tokenize(code, language) => TokenLine[]把字符串分词成每行一组 token,偏移相对行首。语言不认识时返回空数组。
tokenizeAsync(code, language, signal?) => Promise<TokenLine[]>结果相同,但会在分块之间让出主线程。signal 被中止时返回已经处理完的行。
flatTokensToLines(tokens, code) => TokenLine[]把自定义分词器返回的绝对偏移 token 转换成相对行首的 token。
applyHighlightRanges(element, tokenLines) => () => void用 CSS Custom Highlight API 着色,返回清理函数。
useCopyToClipboard(options?) => { copy, isCopied }复制到剪贴板的行为,附带一个短暂的“已复制”状态。重复复制会重新开始计时,默认两秒。
SYNC_TOKENIZE_THRESHOLDnumber低于这个长度的代码同步分词,更长的代码分块处理。
HIGHLIGHTED_TOKEN_TYPESreadonly string[]样式表已经着色的 token 类型,自定义分词器可以直接复用。

主题变量 ​

代码块读取以下 token,neutral 主题已经给出默认值:

名称说明
--astryx-font-family-code行内代码、代码块和头部的等宽字体栈。
--astryx-text-code-size行内代码和 md 代码块的字号。
--astryx-code-background行内代码的背景色。
--astryx-code-block-background代码块和吸顶头部的背景色。section 容器会把它设成透明。
--astryx-code-block-bordercard 容器的边框、头部下边框和行号分界线的颜色。
--astryx-code-block-focus可折叠头部控件的焦点环颜色。
--astryx-code-block-highlight-backgroundhighlightLines 中列出的行的背景色。
--astryx-code-syntax-*语法着色:keyword、string、comment、number、function、type、variable、operator、constant、tag、attribute、property、punctuation。

原生属性 ​

Code 的根元素是 <code>,CodeBlock 的根元素是 <pre>。

以下内容传入根元素:

  • HTML 属性。
  • aria-* 属性。
  • data-* 属性。
  • class。
  • style。

class 和 style 会与组件自身的合并,style 里的 width 优先于 width 属性。复制按钮、代码视口和折叠区域是内部元素,各自有自己的无障碍名称,不通过根元素设置。