[[Obsidian Web Clipper/模板|Web Clipper 模板]]可以使用变量来自动在模板中预填充页面数据。变量可以用在**笔记名称**、**笔记位置**、**属性**和**笔记内容**中。变量还可以通过[[过滤器|筛选器]]进行修改。
使用 [[Obsidian Web Clipper 简介|Web Clipper]] 扩展中的 `…` 图标可以访问当前页面的变量,以便在模板中使用。你可以使用五种类型的变量:
- [[变量#预设变量|预设变量]]
- [[变量#提示变量|提示变量]]
- [[变量#Meta 变量|Meta 变量]]
- [[变量#选择器变量|选择器变量]]
- [[变量#Schema.org 变量|Schema.org 变量]]
## 预设变量
预设变量根据页面内容自动生成。它们通常适用于大多数网站。
主要的内容变量是 `{{content}}`,它包含文章内容、[[高亮网页|高亮内容]],或者页面上选中的文本。请注意,`{{content}}` 会尝试提取页面的主要内容,这可能并不总是你想要的。在这种情况下,你可以使用其他预设变量或选择器变量来提取所需内容。
| 变量 | 描述 |
| ------------------- | -------------------------------------------------------------------------------------- |
| `{{author}}` | 页面作者 |
| `{{content}}` | 文章内容、[[Highlight web pages\|高亮内容]]或选中文本,Markdown 格式 |
| `{{contentHtml}}` | 文章内容、[[Highlight web pages\|高亮内容]]或选中文本,HTML 格式 |
| `{{date}}` | 当前日期,可使用 `date` 筛选器进行格式化 |
| `{{description}}` | 描述或摘录 |
| `{{domain}}` | 域名 |
| `{{favicon}}` | 网站图标 URL |
| `{{fullHtml}}` | 完整页面内容的未处理 HTML |
| `{{highlights}}` | 包含文本和时间戳的[[Highlight web pages\|高亮内容]] |
| `{{image}}` | 社交分享图片 URL |
| `{{published}}` | 发布日期,可使用 `date` 筛选器进行格式化 |
| `{{selection}}` | 选中文本,Markdown 格式 |
| `{{selectionHtml}}` | 选中文本,HTML 格式 |
| `{{site}}` | 网站名称或发布者 |
| `{{title}}` | 页面标题 |
| `{{time}}` | 当前日期和时间 |
| `{{url}}` | 当前 URL |
| `{{words}}` | 字数统计 |
## 提示变量
提示变量利用语言模型,通过自然语言提取和修改数据。提示变量需要启用并配置 [[解析网页|解释器]]。
提示变量使用 `{{"页面的摘要"}}` 语法。提示周围的双引号很重要,它将提示与预设变量区分开来。提示响应可以通过[[过滤器|筛选器]]进行后处理,例如 `{{"页面的摘要"|blockquote}}`。
### 何时使用提示变量
提示变量的优点是极其灵活且易于编写,但也有一些权衡:它们运行较慢,并且根据你选择的[[解析网页#模型|提供商]],可能涉及费用和隐私方面的考虑。
与其他变量类型不同,提示变量需要由外部语言模型处理,因此只有在 [[解析网页|解释器]] 运行后才会被替换。
如果你想提取的数据具有一致的格式,可以通过其他变量类型提取,那么最好*不要*使用提示变量。
另一方面,如果你想提取的数据在不同网站上格式*不一致*,提示变量会很有用。例如,你可以创建一个用于保存图书的[[Obsidian Web Clipper/模板|模板]],该模板不依赖于特定的图书网站。像 `{{"本书的作者"}}` 这样的提示变量可以在任何图书网站上使用,而选择器变量通常只适用于一个网站。
### 示例
提示可以使用几乎任何自然语言查询。根据你使用的模型,提示可以跨语言查询或翻译数据。
- `{{"三个要点的摘要,翻译成法语"}}` 提取关于页面的要点,并将其翻译成法语。
- `{{"un resumé de la page en trois points"}}` 使用法语提示提取三个要点。
提示可以将页面内容转换为 JSON,然后通过[[过滤器|筛选器]]进行处理。例如:
```
{{"return a JSON object for each tweet, that includes the author, tweet_text, date in YYYY-MM-DD format, and images array (if there are any)"|map:tweet => ({text: tweet.tweet_text, author: tweet.author, date: tweet.date})|template:"${text}\n— [[@${author}]], [[${date}]]\n"}}
```
## Meta 变量
Meta 变量允许你从页面的 [meta 元素](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta)中提取数据,包括用于填充社交分享预览的 [Open Graph](https://ogp.me/) 数据。
- `{{meta:name}}` 返回具有给定名称的 meta name 标签的内容,例如 `{{meta:name:description}}` 用于 `description` meta 标签。
- `{{meta:property}}` 返回具有给定属性的 meta property 标签的内容,例如 `{{meta:property:og:title}}` 用于 `og:title` meta 标签。
## 选择器变量
选择器变量允许你使用 [CSS 选择器](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_selectors/Selectors_and_combinators)从页面元素中提取文本内容。
语法为 `{{selector:cssSelector?attribute}}`,其中 `?attribute` 是可选的。如果未指定属性,则返回元素的文本内容。你也可以使用 `{{selectorHtml:cssSelector}}` 来获取元素的 HTML 内容。选择器变量在具有一致 HTML 结构的特定网站或一组网站上效果最好。
- `{{selector:h1}}` 返回页面上任何 `h1` 元素的文本内容。
- `{{selector:.author}}` 返回页面上任何 `.author` 元素的文本内容。
- `{{selector:img.hero?src}}` 返回类名为 `hero` 的图片的 `src` 属性。
- `{{selector:a.main-link?href}}` 返回类名为 `main-link` 的锚标签的 `href` 属性。
- `{{selectorHtml:body|markdown}}` 返回 `body` 元素的完整 HTML,通过 `markdown` [[过滤器#HTML 处理|筛选器]]转换为 Markdown。
- 如果需要更高的精确度,支持嵌套 CSS 选择器和组合器。
- 如果多个元素匹配选择器,将返回一个数组,你可以使用 `join` 或 `map` 等[[过滤器#数组与对象|数组和对象筛选器]]进行处理。
选择器变量也可以直接在[[模板#模板逻辑|模板逻辑]]中使用:
- 在循环中:`{% for comment in selector:.comment %}...{% endfor %}`
- 在条件判断中:`{% if selector:.premium-badge %}...{% endif %}`
- 在变量赋值中:`{% set items = selector:.list-item %}`
## Schema.org 变量
Schema 变量允许你从页面的 [schema.org](https://schema.org/) JSON-LD 中提取数据。Schema.org 数据还可用于自动[[Obsidian Web Clipper/模板#Schema.org 匹配|触发模板]]。
- `{{schema:@Type:key}}` 返回 schema 中键的值。
- `{{schema:@Type:parent.child}}` 返回嵌套属性的值。
- `{{schema:@Type:arrayKey}}` 返回数组中的第一个项目。
- `{{schema:@Type:arrayKey[index].property}}` 返回数组中指定索引位置的项目。
- `{{schema:@Type:arrayKey[*].property}}` 返回数组中所有项目的特定属性。
你也可以使用不指定 schema 类型的简写表示法:
- `{{schema:author}}` 将匹配在任何 schema 类型中找到的第一个 `author` 属性。
- `{{schema:name}}` 将匹配在任何 schema 类型中找到的第一个 `name` 属性。
当你不知道或不关心具体的 schema 类型,但知道要查找的属性名称时,这种简写特别有用。
嵌套属性和数组访问同样适用,无论是否指定了 schema `@Type`:
- `{{schema:author.name}}` 将找到第一个 `author` 属性,然后访问其 `name` 子属性。
- `{{schema:author[0].name}}` 将访问作者数组中第一个作者的 `name`。
- `{{schema:author[*].name}}` 将返回所有作者名称的数组。