feat(v2): editUrl functions should receive md doc permalink (#4232)

This commit is contained in:
Sébastien Lorber 2021-02-17 11:48:33 +01:00 committed by GitHub
parent 2ff5d347ba
commit ae988d0eb9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 79 additions and 63 deletions

View file

@ -184,26 +184,31 @@ describe('loadBlog', () => {
expect(editUrlFunction).toHaveBeenCalledWith({ expect(editUrlFunction).toHaveBeenCalledWith({
blogDirPath: 'blog', blogDirPath: 'blog',
blogPath: 'date-matter.md', blogPath: 'date-matter.md',
permalink: '/blog/date-matter',
locale: 'en', locale: 'en',
}); });
expect(editUrlFunction).toHaveBeenCalledWith({ expect(editUrlFunction).toHaveBeenCalledWith({
blogDirPath: 'blog', blogDirPath: 'blog',
blogPath: 'draft.md', blogPath: 'draft.md',
permalink: '/blog/draft',
locale: 'en', locale: 'en',
}); });
expect(editUrlFunction).toHaveBeenCalledWith({ expect(editUrlFunction).toHaveBeenCalledWith({
blogDirPath: 'blog', blogDirPath: 'blog',
blogPath: 'complex-slug.md', blogPath: 'complex-slug.md',
permalink: '/blog/hey/my super path/héllô',
locale: 'en', locale: 'en',
}); });
expect(editUrlFunction).toHaveBeenCalledWith({ expect(editUrlFunction).toHaveBeenCalledWith({
blogDirPath: 'blog', blogDirPath: 'blog',
blogPath: 'simple-slug.md', blogPath: 'simple-slug.md',
permalink: '/blog/simple/slug',
locale: 'en', locale: 'en',
}); });
expect(editUrlFunction).toHaveBeenCalledWith({ expect(editUrlFunction).toHaveBeenCalledWith({
blogDirPath: 'i18n/en/docusaurus-plugin-content-blog', blogDirPath: 'i18n/en/docusaurus-plugin-content-blog',
blogPath: '2018-12-14-Happy-First-Birthday-Slash.md', blogPath: '2018-12-14-Happy-First-Birthday-Slash.md',
permalink: '/blog/2018/12/14/Happy-First-Birthday-Slash',
locale: 'en', locale: 'en',
}); });
}); });

View file

@ -108,7 +108,7 @@ export async function generateBlogPosts(
routeBasePath, routeBasePath,
truncateMarker, truncateMarker,
showReadingTime, showReadingTime,
editUrl: siteEditUrl, editUrl,
} = options; } = options;
if (!fs.existsSync(contentPaths.contentPath)) { if (!fs.existsSync(contentPaths.contentPath)) {
@ -136,37 +136,6 @@ export async function generateBlogPosts(
const blogFileName = path.basename(blogSourceFile); const blogFileName = path.basename(blogSourceFile);
function getBlogEditUrl() {
const blogPathRelative = path.relative(
blogDirPath,
path.resolve(source),
);
if (typeof siteEditUrl === 'function') {
return siteEditUrl({
blogDirPath: posixPath(path.relative(siteDir, blogDirPath)),
blogPath: posixPath(blogPathRelative),
locale: i18n.currentLocale,
});
} else if (typeof siteEditUrl === 'string') {
const isLocalized = blogDirPath === contentPaths.contentPathLocalized;
const fileContentPath =
isLocalized && options.editLocalizedFiles
? contentPaths.contentPathLocalized
: contentPaths.contentPath;
const contentPathEditUrl = normalizeUrl([
siteEditUrl,
posixPath(path.relative(siteDir, fileContentPath)),
]);
return getEditUrl(blogPathRelative, contentPathEditUrl);
} else {
return undefined;
}
}
const editBlogUrl = getBlogEditUrl();
const {frontMatter, content, excerpt} = await parseMarkdownFile(source); const {frontMatter, content, excerpt} = await parseMarkdownFile(source);
if (frontMatter.draft && process.env.NODE_ENV === 'production') { if (frontMatter.draft && process.env.NODE_ENV === 'production') {
@ -204,11 +173,44 @@ export async function generateBlogPosts(
frontMatter.slug || (match ? toUrl({date, link: linkName}) : linkName); frontMatter.slug || (match ? toUrl({date, link: linkName}) : linkName);
frontMatter.title = frontMatter.title || linkName; frontMatter.title = frontMatter.title || linkName;
const permalink = normalizeUrl([baseUrl, routeBasePath, slug]);
function getBlogEditUrl() {
const blogPathRelative = path.relative(
blogDirPath,
path.resolve(source),
);
if (typeof editUrl === 'function') {
return editUrl({
blogDirPath: posixPath(path.relative(siteDir, blogDirPath)),
blogPath: posixPath(blogPathRelative),
permalink,
locale: i18n.currentLocale,
});
} else if (typeof editUrl === 'string') {
const isLocalized = blogDirPath === contentPaths.contentPathLocalized;
const fileContentPath =
isLocalized && options.editLocalizedFiles
? contentPaths.contentPathLocalized
: contentPaths.contentPath;
const contentPathEditUrl = normalizeUrl([
editUrl,
posixPath(path.relative(siteDir, fileContentPath)),
]);
return getEditUrl(blogPathRelative, contentPathEditUrl);
} else {
return undefined;
}
}
blogPosts.push({ blogPosts.push({
id: frontMatter.slug || frontMatter.title, id: frontMatter.slug || frontMatter.title,
metadata: { metadata: {
permalink: normalizeUrl([baseUrl, routeBasePath, slug]), permalink,
editUrl: editBlogUrl, editUrl: getBlogEditUrl(),
source: aliasedSource, source: aliasedSource,
description: frontMatter.description || excerpt, description: frontMatter.description || excerpt,
date, date,

View file

@ -27,6 +27,7 @@ export type FeedType = 'rss' | 'atom';
export type EditUrlFunction = (editUrlParams: { export type EditUrlFunction = (editUrlParams: {
blogDirPath: string; blogDirPath: string;
blogPath: string; blogPath: string;
permalink: string;
locale: string; locale: string;
}) => string | undefined; }) => string | undefined;

View file

@ -321,6 +321,7 @@ describe('simple site', () => {
version: 'current', version: 'current',
versionDocsDirPath: 'docs', versionDocsDirPath: 'docs',
docPath: path.posix.join('foo', 'baz.md'), docPath: path.posix.join('foo', 'baz.md'),
permalink: '/docs/foo/bazSlug.html',
locale: 'en', locale: 'en',
}); });
}); });
@ -672,6 +673,7 @@ describe('versioned site', () => {
version: '1.0.0', version: '1.0.0',
versionDocsDirPath: 'versioned_docs/version-1.0.0', versionDocsDirPath: 'versioned_docs/version-1.0.0',
docPath: path.join('hello.md'), docPath: path.join('hello.md'),
permalink: '/docs/1.0.0/hello',
locale: 'en', locale: 'en',
}); });
}); });

View file

@ -119,32 +119,6 @@ export function processDocMetadata({
// ex: myDoc -> . // ex: myDoc -> .
const docsFileDirName = path.dirname(source); const docsFileDirName = path.dirname(source);
const relativeFilePath = path.relative(docsDirPath, filePath);
function getDocEditUrl() {
if (typeof options.editUrl === 'function') {
return options.editUrl({
version: versionMetadata.versionName,
versionDocsDirPath: posixPath(
path.relative(siteDir, versionMetadata.docsDirPath),
),
docPath: posixPath(relativeFilePath),
locale: context.i18n.currentLocale,
});
} else if (typeof options.editUrl === 'string') {
const isLocalized = docsDirPath === versionMetadata.docsDirPathLocalized;
const baseVersionEditUrl =
isLocalized && options.editLocalizedFiles
? versionMetadata.versionEditUrlLocalized
: versionMetadata.versionEditUrl;
return getEditUrl(relativeFilePath, baseVersionEditUrl);
} else {
return undefined;
}
}
const docsEditUrl = getDocEditUrl();
const {frontMatter = {}, excerpt} = parseMarkdownString(content); const {frontMatter = {}, excerpt} = parseMarkdownString(content);
const {sidebar_label, custom_edit_url} = frontMatter; const {sidebar_label, custom_edit_url} = frontMatter;
@ -194,6 +168,31 @@ export function processDocMetadata({
const permalink = normalizeUrl([versionMetadata.versionPath, docSlug]); const permalink = normalizeUrl([versionMetadata.versionPath, docSlug]);
function getDocEditUrl() {
const relativeFilePath = path.relative(docsDirPath, filePath);
if (typeof options.editUrl === 'function') {
return options.editUrl({
version: versionMetadata.versionName,
versionDocsDirPath: posixPath(
path.relative(siteDir, versionMetadata.docsDirPath),
),
docPath: posixPath(relativeFilePath),
permalink,
locale: context.i18n.currentLocale,
});
} else if (typeof options.editUrl === 'string') {
const isLocalized = docsDirPath === versionMetadata.docsDirPathLocalized;
const baseVersionEditUrl =
isLocalized && options.editLocalizedFiles
? versionMetadata.versionEditUrlLocalized
: versionMetadata.versionEditUrl;
return getEditUrl(relativeFilePath, baseVersionEditUrl);
} else {
return undefined;
}
}
// Assign all of object properties during instantiation (if possible) for // Assign all of object properties during instantiation (if possible) for
// NodeJS optimization. // NodeJS optimization.
// Adding properties to object after instantiation will cause hidden // Adding properties to object after instantiation will cause hidden
@ -207,7 +206,7 @@ export function processDocMetadata({
source: aliasedSitePath(filePath, siteDir), source: aliasedSitePath(filePath, siteDir),
slug: docSlug, slug: docSlug,
permalink, permalink,
editUrl: custom_edit_url !== undefined ? custom_edit_url : docsEditUrl, editUrl: custom_edit_url !== undefined ? custom_edit_url : getDocEditUrl(),
version: versionMetadata.versionName, version: versionMetadata.versionName,
lastUpdatedBy: lastUpdate.lastUpdatedBy, lastUpdatedBy: lastUpdate.lastUpdatedBy,
lastUpdatedAt: lastUpdate.lastUpdatedAt, lastUpdatedAt: lastUpdate.lastUpdatedAt,

View file

@ -35,6 +35,7 @@ export type EditUrlFunction = (editUrlParams: {
version: string; version: string;
versionDocsDirPath: string; versionDocsDirPath: string;
docPath: string; docPath: string;
permalink: string;
locale: string; locale: string;
}) => string | undefined; }) => string | undefined;

View file

@ -38,7 +38,7 @@ module.exports = {
/** /**
* For advanced cases, compute the edit url for each markdown file yourself. * For advanced cases, compute the edit url for each markdown file yourself.
*/ */
editUrl: ({locale, blogDirPath, blogPath}) => { editUrl: ({locale, blogDirPath, blogPath, permalink}) => {
return `https://github.com/facebook/docusaurus/edit/master/website/${blogDirPath}/${blogPath}`; return `https://github.com/facebook/docusaurus/edit/master/website/${blogDirPath}/${blogPath}`;
}, },
/** /**

View file

@ -38,7 +38,13 @@ module.exports = {
/** /**
* For advanced cases, compute the edit url for each markdown file yourself. * For advanced cases, compute the edit url for each markdown file yourself.
*/ */
editUrl: function ({locale, version, versionDocsDirPath, docPath}) { editUrl: function ({
locale,
version,
versionDocsDirPath,
docPath,
permalink,
}) {
return `https://github.com/facebook/docusaurus/edit/master/website/${versionDocsDirPath}/${docPath}`; return `https://github.com/facebook/docusaurus/edit/master/website/${versionDocsDirPath}/${docPath}`;
}, },
/** /**