mirror of
https://github.com/facebook/docusaurus.git
synced 2025-05-01 19:27:48 +02:00
feat(v2): editUrl functions should receive md doc permalink (#4232)
This commit is contained in:
parent
2ff5d347ba
commit
ae988d0eb9
8 changed files with 79 additions and 63 deletions
|
@ -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',
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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',
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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}`;
|
||||||
},
|
},
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -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}`;
|
||||||
},
|
},
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Add table
Reference in a new issue