2023-07-16 13:02:12 +07:00
|
|
|
import { CanonicalSlug, canonicalizeServer, resolveRelative } from "../path"
|
2023-07-01 14:03:01 +07:00
|
|
|
import { QuartzPluginData } from "../plugins/vfile"
|
|
|
|
import { Date } from "./Date"
|
|
|
|
import { QuartzComponentProps } from "./types"
|
|
|
|
|
|
|
|
function byDateAndAlphabetical(f1: QuartzPluginData, f2: QuartzPluginData): number {
|
|
|
|
if (f1.dates && f2.dates) {
|
|
|
|
// sort descending by last modified
|
|
|
|
return f2.dates.modified.getTime() - f1.dates.modified.getTime()
|
|
|
|
} else if (f1.dates && !f2.dates) {
|
|
|
|
// prioritize files with dates
|
|
|
|
return -1
|
|
|
|
} else if (!f1.dates && f2.dates) {
|
|
|
|
return 1
|
|
|
|
}
|
|
|
|
|
|
|
|
// otherwise, sort lexographically by title
|
|
|
|
const f1Title = f1.frontmatter?.title.toLowerCase() ?? ""
|
|
|
|
const f2Title = f2.frontmatter?.title.toLowerCase() ?? ""
|
2023-07-23 07:27:41 +07:00
|
|
|
return f1Title.localeCompare(f2Title)
|
2023-07-01 14:03:01 +07:00
|
|
|
}
|
|
|
|
|
2023-07-26 11:10:37 +07:00
|
|
|
type Props = {
|
|
|
|
limit?: number
|
|
|
|
} & QuartzComponentProps
|
|
|
|
|
|
|
|
export function PageList({ fileData, allFiles, limit }: Props) {
|
2023-07-16 13:02:12 +07:00
|
|
|
const slug = canonicalizeServer(fileData.slug!)
|
2023-07-26 11:10:37 +07:00
|
|
|
let list = allFiles.sort(byDateAndAlphabetical)
|
|
|
|
if (limit) {
|
|
|
|
list = list.slice(0, limit)
|
|
|
|
}
|
|
|
|
|
2023-07-23 07:27:41 +07:00
|
|
|
return (
|
|
|
|
<ul class="section-ul">
|
2023-07-26 11:10:37 +07:00
|
|
|
{list.map((page) => {
|
2023-07-23 07:27:41 +07:00
|
|
|
const title = page.frontmatter?.title
|
|
|
|
const pageSlug = canonicalizeServer(page.slug!)
|
|
|
|
const tags = page.frontmatter?.tags ?? []
|
2023-07-16 13:02:12 +07:00
|
|
|
|
2023-07-23 07:27:41 +07:00
|
|
|
return (
|
|
|
|
<li class="section-li">
|
|
|
|
<div class="section">
|
|
|
|
{page.dates && (
|
|
|
|
<p class="meta">
|
|
|
|
<Date date={page.dates.modified} />
|
|
|
|
</p>
|
|
|
|
)}
|
|
|
|
<div class="desc">
|
|
|
|
<h3>
|
|
|
|
<a href={resolveRelative(slug, pageSlug)} class="internal">
|
|
|
|
{title}
|
|
|
|
</a>
|
|
|
|
</h3>
|
|
|
|
</div>
|
|
|
|
<ul class="tags">
|
|
|
|
{tags.map((tag) => (
|
|
|
|
<li>
|
|
|
|
<a
|
2023-07-24 11:41:09 +07:00
|
|
|
class="internal tag-link"
|
2023-07-23 07:27:41 +07:00
|
|
|
href={resolveRelative(slug, `tags/${tag}` as CanonicalSlug)}
|
|
|
|
>
|
|
|
|
#{tag}
|
|
|
|
</a>
|
|
|
|
</li>
|
|
|
|
))}
|
|
|
|
</ul>
|
|
|
|
</div>
|
|
|
|
</li>
|
|
|
|
)
|
|
|
|
})}
|
|
|
|
</ul>
|
|
|
|
)
|
2023-07-01 14:03:01 +07:00
|
|
|
}
|
|
|
|
|
|
|
|
PageList.css = `
|
|
|
|
.section h3 {
|
|
|
|
margin: 0;
|
|
|
|
}
|
2023-07-24 11:41:09 +07:00
|
|
|
|
|
|
|
.section > .tags {
|
|
|
|
margin: 0;
|
|
|
|
}
|
2023-07-01 14:03:01 +07:00
|
|
|
`
|