/

扩展函数

函数扩展是一项强大的功能,让你可以变换、装饰或替换函数的行为。

This is the backbone of the element styling engine, when the extended function is a Markdown primitive, such as .heading. See its page for more details about extending Markdown elements.

你可以使用 .extend 文档 ↗ 函数,在某个作用域内扩展任何先前已声明的函数。该扩展会包裹原始函数,同时不会丢失其原有定义。

示例 1

.function {greet}
    name:
    Hello, .name!

.extend {greet}
    .super::uppercase

.greet {world}

HELLO, WORLD!

访问原始函数

在包裹函数体内部,原始函数以 .super 的形式暴露。调用它会以相同的参数来调用原始函数。

参数

包裹函数体是一个 lambda 。它的显式参数(若有)必须与原始函数的参数名称相匹配,并让你可以拦截调用方传入的参数。

由于 .super 就是原始函数本身,它接受相同的参数。你传入的任何参数都会覆盖包裹函数被调用时所用的参数,而所有未提供的参数都会原样透传。

示例 2

.function {greet}
    greeting name:
    .greeting, .name!

.extend {greet}
    name:
    .super greeting:{Howdy}

.greet {Hello} {world}

Howdy, world!

示例 3

新的参数值也可以依赖原始参数,让你在将其传递下去之前先对它们进行变换:

.function {greet}
    greeting name:
    .greeting, .name!

.extend {greet}
    greeting name:
    .super greeting:{.greeting::uppercase}

.greet {Hello} {world}

HELLO, world!

所有包裹函数的参数始终都是可选的。你只需声明在函数中实际用到的参数。

示例 4

.function {greet}
    greeting name surname:
    .greeting, .name .surname!

.extend {greet}
    name:
    .super name:{.name::uppercase}

.greet {Hello} name:{John} surname:{Doe}

Hello, JOHN Doe!

条件扩展

一个可选的 where 行内 lambda 参数让你可以定义一个条件,如果调用时该条件未被满足,整个调用就会回退到原始定义。其参数遵循与函数体 lambda 相同的规则。

示例 5

.function {greet}
    greeting name:
    .greeting, .name!

.extend {greet} where:{name: .name::equals {world}}
    greeting:
    .super greeting:{.greeting::uppercase}

.greet {Hello} {world}

.greet {Hello} {John}

HELLO, world!

Hello, John!

示例 6

内置函数,例如 .heading 也可以被扩展。更多详情请参阅元素样式

.extend {heading} where:{depth: .depth::islower than:{4}}
    content:
    .super background:{teal}

## H2

## H3

## H4

H2

H3

H4