From cb308b9295e1e661c2c72fa4229b5c7d83278d49 Mon Sep 17 00:00:00 2001 From: Azat S Date: Sat, 18 May 2024 16:36:41 +0300 Subject: [PATCH 1/7] fix(a11y): make code blocks accessible with keyboard (#3902) --- src/node/markdown/plugins/highlight.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/node/markdown/plugins/highlight.ts b/src/node/markdown/plugins/highlight.ts index 4bfac6333d43..fbd03e56050b 100644 --- a/src/node/markdown/plugins/highlight.ts +++ b/src/node/markdown/plugins/highlight.ts @@ -85,7 +85,6 @@ export async function highlight( { name: 'vitepress:clean-up', pre(node) { - delete node.properties.tabindex delete node.properties.style } } From a335bc705cd9f6a7a13a291ba93c28bce90fd932 Mon Sep 17 00:00:00 2001 From: Bugo Date: Sat, 18 May 2024 22:50:52 +0500 Subject: [PATCH 2/7] docs(ru): update translations (#3903) --- docs/ru/guide/sitemap-generation.md | 29 +++++++++++++---------- docs/ru/reference/default-theme-search.md | 4 ++-- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/docs/ru/guide/sitemap-generation.md b/docs/ru/guide/sitemap-generation.md index da79a5be12cc..6e933c9072e3 100644 --- a/docs/ru/guide/sitemap-generation.md +++ b/docs/ru/guide/sitemap-generation.md @@ -3,13 +3,11 @@ VitePress поставляется с готовой поддержкой генерации файла `sitemap.xml` для вашего сайта. Чтобы включить её, добавьте следующее в файл `.vitepress/config.js`: ```ts -import { defineConfig } from 'vitepress' - -export default defineConfig({ +export default { sitemap: { hostname: 'https://example.com' } -}) +} ``` Чтобы теги `` присутствовали в вашем файле `sitemap.xml`, вы можете включить опцию [`lastUpdated`](../reference/default-theme-last-updated). @@ -19,14 +17,23 @@ export default defineConfig({ Поддержка карты сайта осуществляется с помощью модуля [`sitemap`](https://www.npmjs.com/package/sitemap). Вы можете передать любые поддерживаемые им параметры в опцию `sitemap` в вашем конфигурационном файле. Они будут переданы непосредственно в конструктор `SitemapStream`. Более подробную информацию см. в документации [`sitemap`](https://www.npmjs.com/package/sitemap#options-you-can-pass). Пример: ```ts -import { defineConfig } from 'vitepress' - -export default defineConfig({ +export default { sitemap: { hostname: 'https://example.com', lastmodDateOnly: false } -}) +} +``` + +При использовании параметра `base` в своей конфигурации обязательно добавьте его в адрес `hostname`: + +```ts +export default { + base: '/my-site/', + sitemap: { + hostname: 'https://example.com/my-site/' + } +} ``` ## Хук `transformItems` {#transformitems-hook} @@ -34,9 +41,7 @@ export default defineConfig({ Вы можете использовать хук `sitemap.transformItems` для изменения элементов карты сайта перед их записью в файл `sitemap.xml`. Этот хук вызывается с массивом элементов sitemap и ожидает возвращения массива элементов sitemap. Пример: ```ts -import { defineConfig } from 'vitepress' - -export default defineConfig({ +export default { sitemap: { hostname: 'https://example.com', transformItems: (items) => { @@ -49,5 +54,5 @@ export default defineConfig({ return items } } -}) +} ``` diff --git a/docs/ru/reference/default-theme-search.md b/docs/ru/reference/default-theme-search.md index dae85f475a93..a88e9c1de498 100644 --- a/docs/ru/reference/default-theme-search.md +++ b/docs/ru/reference/default-theme-search.md @@ -28,7 +28,7 @@ export default defineConfig({ ### i18n {#local-search-i18n} -Вы можете использовать подобную конфигурацию для использования многоязычного поиска: +Пример конфигурации для использования многоязычного поиска: ```ts import { defineConfig } from 'vitepress' @@ -199,7 +199,7 @@ export default defineConfig({ ### i18n {#algolia-search-i18n} -Вы можете использовать подобную конфигурацию для использования многоязычного поиска: +Пример конфигурации для использования многоязычного поиска: ```ts import { defineConfig } from 'vitepress' From af4717d6820233a011200d44abba53d0f66bfad3 Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Sun, 19 May 2024 14:14:15 +0530 Subject: [PATCH 3/7] fix(theme): remove unnecessary navigation role on nav element --- src/client/theme-default/components/VPDocAsideOutline.vue | 1 - 1 file changed, 1 deletion(-) diff --git a/src/client/theme-default/components/VPDocAsideOutline.vue b/src/client/theme-default/components/VPDocAsideOutline.vue index 4eb59ebc5b16..00ea9bbe9901 100644 --- a/src/client/theme-default/components/VPDocAsideOutline.vue +++ b/src/client/theme-default/components/VPDocAsideOutline.vue @@ -30,7 +30,6 @@ useActiveAnchor(container, marker) class="VPDocAsideOutline" :class="{ 'has-outline': headers.length > 0 }" ref="container" - role="navigation" >
From 49b1233378436054c07a6ef646d0029096124021 Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Tue, 21 May 2024 07:55:01 +0530 Subject: [PATCH 4/7] fix: escape title properly in build --- src/node/build/render.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/node/build/render.ts b/src/node/build/render.ts index 9ea049cc1875..1341ae6d0648 100644 --- a/src/node/build/render.ts +++ b/src/node/build/render.ts @@ -163,7 +163,7 @@ export async function renderPage( ? '' : '' } - ${title} + ${escape(title)} ${ isDescriptionOverridden(head) ? '' From d8c0c0a5d53da9aea1cf7f828846e630cd5e7791 Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Tue, 21 May 2024 07:57:54 +0530 Subject: [PATCH 5/7] release: v1.2.1 --- CHANGELOG.md | 8 ++++++++ package.json | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1617d9716abe..1ba6d163cf7d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +## [1.2.1](https://github.com/vuejs/vitepress/compare/v1.2.0...v1.2.1) (2024-05-21) + +### Bug Fixes + +- **a11y:** make code blocks accessible with keyboard ([#3902](https://github.com/vuejs/vitepress/issues/3902)) ([cb308b9](https://github.com/vuejs/vitepress/commit/cb308b9295e1e661c2c72fa4229b5c7d83278d49)) +- escape title properly in build ([49b1233](https://github.com/vuejs/vitepress/commit/49b1233378436054c07a6ef646d0029096124021)) +- **theme:** remove unnecessary navigation role on nav element ([af4717d](https://github.com/vuejs/vitepress/commit/af4717d6820233a011200d44abba53d0f66bfad3)) + # [1.2.0](https://github.com/vuejs/vitepress/compare/v1.1.4...v1.2.0) (2024-05-18) ### Bug Fixes diff --git a/package.json b/package.json index e5d6a4eaeb05..bf785dc2f261 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vitepress", - "version": "1.2.0", + "version": "1.2.1", "description": "Vite & Vue powered static site generator", "keywords": [ "vite", From 7ea357256c855ae0a9a142c14bbd5e7d344ef865 Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Tue, 21 May 2024 08:43:10 +0530 Subject: [PATCH 6/7] fix: dont escape ampersand twice in title --- package.json | 2 -- pnpm-lock.yaml | 16 ---------------- src/client/app/utils.ts | 2 +- src/client/index.ts | 3 ++- src/node/build/render.ts | 8 ++++---- src/node/markdown/plugins/restoreEntities.ts | 5 +---- src/shared/shared.ts | 11 +++++++++++ 7 files changed, 19 insertions(+), 28 deletions(-) diff --git a/package.json b/package.json index bf785dc2f261..4e378d164143 100644 --- a/package.json +++ b/package.json @@ -133,7 +133,6 @@ "@rollup/plugin-replace": "^5.0.5", "@types/cross-spawn": "^6.0.6", "@types/debug": "^4.1.12", - "@types/escape-html": "^1.0.4", "@types/fs-extra": "^11.0.4", "@types/lodash.template": "^4.5.3", "@types/mark.js": "^8.11.12", @@ -150,7 +149,6 @@ "cross-spawn": "^7.0.3", "debug": "^4.3.4", "esbuild": "^0.21.3", - "escape-html": "^1.0.3", "execa": "^9.1.0", "fast-glob": "^3.3.2", "fs-extra": "^11.2.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 949d792807c8..7a14e9b054a4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -113,9 +113,6 @@ importers: '@types/debug': specifier: ^4.1.12 version: 4.1.12 - '@types/escape-html': - specifier: ^1.0.4 - version: 1.0.4 '@types/fs-extra': specifier: ^11.0.4 version: 11.0.4 @@ -164,9 +161,6 @@ importers: esbuild: specifier: ^0.21.3 version: 0.21.3 - escape-html: - specifier: ^1.0.3 - version: 1.0.3 execa: specifier: ^9.1.0 version: 9.1.0 @@ -985,9 +979,6 @@ packages: '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - '@types/escape-html@1.0.4': - resolution: {integrity: sha512-qZ72SFTgUAZ5a7Tj6kf2SHLetiH5S6f8G5frB2SPQ3EyF02kxdyBFf4Tz4banE3xCgGnKgWLt//a6VuYHKYJTg==} - '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} @@ -1645,9 +1636,6 @@ packages: resolution: {integrity: sha512-w3PwNZJwRxlp47QGzhuEBldEqVHHhh8/tIPcl6ecf2Bou99cdAt0knihBV0Ecc7CGxYduXVBDheH1K2oADRlvw==} engines: {node: '>=10'} - escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} @@ -3681,8 +3669,6 @@ snapshots: dependencies: '@types/ms': 0.7.34 - '@types/escape-html@1.0.4': {} - '@types/estree@1.0.5': {} '@types/fs-extra@11.0.4': @@ -4498,8 +4484,6 @@ snapshots: escape-goat@3.0.0: {} - escape-html@1.0.3: {} - escape-string-regexp@1.0.5: {} esm@3.2.25: {} diff --git a/src/client/app/utils.ts b/src/client/app/utils.ts index dfa5cffcfac5..45496b403f12 100644 --- a/src/client/app/utils.ts +++ b/src/client/app/utils.ts @@ -13,7 +13,7 @@ import { type AsyncComponentLoader } from 'vue' -export { inBrowser } from '../shared' +export { inBrowser, escapeHtml as _escapeHtml } from '../shared' /** * Join two paths by resolving the slash collision. diff --git a/src/client/index.ts b/src/client/index.ts index 5fde6c5dbfa9..75bbfe54fb9e 100644 --- a/src/client/index.ts +++ b/src/client/index.ts @@ -21,7 +21,8 @@ export { onContentUpdated, defineClientComponent, withBase, - getScrollOffset + getScrollOffset, + _escapeHtml } from './app/utils' // components diff --git a/src/node/build/render.ts b/src/node/build/render.ts index 1341ae6d0648..c9b71c819484 100644 --- a/src/node/build/render.ts +++ b/src/node/build/render.ts @@ -1,13 +1,14 @@ import { isBooleanAttr } from '@vue/shared' -import escape from 'escape-html' import fs from 'fs-extra' import path from 'path' import { pathToFileURL } from 'url' import { normalizePath, transformWithEsbuild, type Rollup } from 'vite' +import { version } from '../../../package.json' import type { SiteConfig } from '../config' import { EXTERNAL_URL_RE, createTitle, + escapeHtml, mergeHead, notFoundPageData, resolveSiteDataByRoute, @@ -17,7 +18,6 @@ import { type PageData, type SSGContext } from '../shared' -import { version } from '../../../package.json' export async function renderPage( render: (path: string) => Promise, @@ -163,7 +163,7 @@ export async function renderPage( ? '' : '' } - ${escape(title)} + ${escapeHtml(title)} ${ isDescriptionOverridden(head) ? '' @@ -260,7 +260,7 @@ function renderAttrs(attrs: Record): string { return Object.keys(attrs) .map((key) => { if (isBooleanAttr(key)) return ` ${key}` - return ` ${key}="${escape(attrs[key] as string)}"` + return ` ${key}="${escapeHtml(attrs[key] as string)}"` }) .join('') } diff --git a/src/node/markdown/plugins/restoreEntities.ts b/src/node/markdown/plugins/restoreEntities.ts index d5bb80ed0af0..07c71e70d01d 100644 --- a/src/node/markdown/plugins/restoreEntities.ts +++ b/src/node/markdown/plugins/restoreEntities.ts @@ -1,6 +1,7 @@ import type MarkdownIt from 'markdown-it' import type StateCore from 'markdown-it/lib/rules_core/state_core.mjs' import type Token from 'markdown-it/lib/token.mjs' +import { escapeHtml } from '../../shared' export function restoreEntities(md: MarkdownIt): void { md.core.ruler.at('text_join', text_join) @@ -47,7 +48,3 @@ function getContent(token: Token): string { ? '&' : token.content } - -function escapeHtml(str: string): string { - return str.replace(//g, '>').replace(/"/g, '"') -} diff --git a/src/shared/shared.ts b/src/shared/shared.ts index 3cf5ecbeadab..051c5d094d5c 100644 --- a/src/shared/shared.ts +++ b/src/shared/shared.ts @@ -219,3 +219,14 @@ export function treatAsHtml(filename: string): boolean { export function escapeRegExp(str: string) { return str.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&').replace(/-/g, '\\x2d') } + +/** + * @internal + */ +export function escapeHtml(str: string): string { + return str + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/&(?![\w#]+;)/g, '&') +} From 49dbfb4ea37e22f38946218e9beda5b511713ce1 Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Tue, 21 May 2024 08:44:03 +0530 Subject: [PATCH 7/7] release: v1.2.2 --- CHANGELOG.md | 6 ++++++ package.json | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1ba6d163cf7d..dfe40c18f529 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +## [1.2.2](https://github.com/vuejs/vitepress/compare/v1.2.1...v1.2.2) (2024-05-21) + +### Bug Fixes + +- dont escape ampersand twice in title ([7ea3572](https://github.com/vuejs/vitepress/commit/7ea357256c855ae0a9a142c14bbd5e7d344ef865)) + ## [1.2.1](https://github.com/vuejs/vitepress/compare/v1.2.0...v1.2.1) (2024-05-21) ### Bug Fixes diff --git a/package.json b/package.json index 4e378d164143..2920810ddead 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vitepress", - "version": "1.2.1", + "version": "1.2.2", "description": "Vite & Vue powered static site generator", "keywords": [ "vite",