feat: Allow custom sorting of FolderPage and TagPage (#1250)

This commit is contained in:
Cao Mingjun 2024-07-10 08:42:33 +08:00 committed by GitHub
parent 596e06ab0e
commit ea92ed4f45
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 116 additions and 105 deletions

View File

@ -27,10 +27,12 @@ export function byDateAndAlphabetical(
type Props = {
limit?: number
sort?: (f1: QuartzPluginData, f2: QuartzPluginData) => number
} & QuartzComponentProps
export const PageList: QuartzComponent = ({ cfg, fileData, allFiles, limit }: Props) => {
let list = allFiles.sort(byDateAndAlphabetical(cfg))
export const PageList: QuartzComponent = ({ cfg, fileData, allFiles, limit, sort }: Props) => {
const sorter = sort ?? byDateAndAlphabetical(cfg)
let list = allFiles.sort(sorter)
if (limit) {
list = list.slice(0, limit)
}

View File

@ -7,12 +7,14 @@ import { stripSlashes, simplifySlug } from "../../util/path"
import { Root } from "hast"
import { htmlToJsx } from "../../util/jsx"
import { i18n } from "../../i18n"
import { QuartzPluginData } from "../../plugins/vfile"
interface FolderContentOptions {
/**
* Whether to display number of folders
*/
showFolderCount: boolean
sort?: (f1: QuartzPluginData, f2: QuartzPluginData) => number
}
const defaultOptions: FolderContentOptions = {
@ -37,6 +39,7 @@ export default ((opts?: Partial<FolderContentOptions>) => {
const classes = ["popover-hint", ...cssClasses].join(" ")
const listProps = {
...props,
sort: options.sort,
allFiles: allPagesInFolder,
}

View File

@ -7,6 +7,7 @@ import { Root } from "hast"
import { htmlToJsx } from "../../util/jsx"
import { i18n } from "../../i18n"
export default ((opts?: { sort?: (f1: QuartzPluginData, f2: QuartzPluginData) => number }) => {
const numPages = 10
const TagContent: QuartzComponent = (props: QuartzComponentProps) => {
const { tree, fileData, allFiles, cfg } = props
@ -80,7 +81,7 @@ const TagContent: QuartzComponent = (props: QuartzComponentProps) => {
</>
)}
</p>
<PageList limit={numPages} {...listProps} />
<PageList limit={numPages} {...listProps} sort={opts?.sort} />
</div>
</div>
)
@ -110,4 +111,5 @@ const TagContent: QuartzComponent = (props: QuartzComponentProps) => {
}
TagContent.css = style + PageList.css
export default (() => TagContent) satisfies QuartzComponentConstructor
return TagContent
}) satisfies QuartzComponentConstructor

View File

@ -3,7 +3,7 @@ import { QuartzComponentProps } from "../../components/types"
import HeaderConstructor from "../../components/Header"
import BodyConstructor from "../../components/Body"
import { pageResources, renderPage } from "../../components/renderPage"
import { ProcessedContent, defaultProcessedContent } from "../vfile"
import { ProcessedContent, QuartzPluginData, defaultProcessedContent } from "../vfile"
import { FullPageLayout } from "../../cfg"
import path from "path"
import {
@ -21,11 +21,13 @@ import { write } from "./helpers"
import { i18n } from "../../i18n"
import DepGraph from "../../depgraph"
export const FolderPage: QuartzEmitterPlugin<Partial<FullPageLayout>> = (userOpts) => {
export const FolderPage: QuartzEmitterPlugin<
Partial<FullPageLayout> & { sort?: (f1: QuartzPluginData, f2: QuartzPluginData) => number }
> = (userOpts) => {
const opts: FullPageLayout = {
...sharedPageComponents,
...defaultListPageLayout,
pageBody: FolderContent(),
pageBody: FolderContent({ sort: userOpts?.sort }),
...userOpts,
}

View File

@ -3,7 +3,7 @@ import { QuartzComponentProps } from "../../components/types"
import HeaderConstructor from "../../components/Header"
import BodyConstructor from "../../components/Body"
import { pageResources, renderPage } from "../../components/renderPage"
import { ProcessedContent, defaultProcessedContent } from "../vfile"
import { ProcessedContent, QuartzPluginData, defaultProcessedContent } from "../vfile"
import { FullPageLayout } from "../../cfg"
import {
FilePath,
@ -18,11 +18,13 @@ import { write } from "./helpers"
import { i18n } from "../../i18n"
import DepGraph from "../../depgraph"
export const TagPage: QuartzEmitterPlugin<Partial<FullPageLayout>> = (userOpts) => {
export const TagPage: QuartzEmitterPlugin<
Partial<FullPageLayout> & { sort?: (f1: QuartzPluginData, f2: QuartzPluginData) => number }
> = (userOpts) => {
const opts: FullPageLayout = {
...sharedPageComponents,
...defaultListPageLayout,
pageBody: TagContent(),
pageBody: TagContent({ sort: userOpts?.sort }),
...userOpts,
}