feat: add defaultDateType config
This commit is contained in:
		
							parent
							
								
									98d82415dc
								
							
						
					
					
						commit
						c36a9f3fb7
					
				| @ -31,6 +31,7 @@ This part of the configuration concerns anything that can affect the whole site. | ||||
|   - This should also include the subpath if you are [[hosting]] on GitHub pages without a custom domain. For example, if my repository is `jackyzha0/quartz`, GitHub pages would deploy to `https://jackyzha0.github.io/quartz` and the `baseUrl` would be `jackyzha0.github.io/quartz` | ||||
|   - Note that Quartz 4 will avoid using this as much as possible and use relative URLs whenever it can to make sure your site works no matter _where_ you end up actually deploying it. | ||||
| - `ignorePatterns`: a list of [glob](<https://en.wikipedia.org/wiki/Glob_(programming)>) patterns that Quartz should ignore and not search through when looking for files inside the `content` folder. See [[private pages]] for more details. | ||||
| - `defaultDateType`: whether to use created, modified, or published as the default date to display on pages and page listings. | ||||
| - `theme`: configure how the site looks. | ||||
|   - `typography`: what fonts to use. Any font available on [Google Fonts](https://fonts.google.com/) works here. | ||||
|     - `header`: Font to use for headers | ||||
|  | ||||
| @ -11,6 +11,7 @@ const config: QuartzConfig = { | ||||
|     }, | ||||
|     baseUrl: "quartz.jzhao.xyz", | ||||
|     ignorePatterns: ["private", "templates"], | ||||
|     defaultDateType: "created", | ||||
|     theme: { | ||||
|       typography: { | ||||
|         header: "Schibsted Grotesk", | ||||
|  | ||||
| @ -1,3 +1,4 @@ | ||||
| import { ValidDateType } from "./components/Date" | ||||
| import { QuartzComponent } from "./components/types" | ||||
| import { PluginTypes } from "./plugins/types" | ||||
| import { Theme } from "./util/theme" | ||||
| @ -22,6 +23,8 @@ export interface GlobalConfiguration { | ||||
|   analytics: Analytics | ||||
|   /** Glob patterns to not search */ | ||||
|   ignorePatterns: string[] | ||||
|   /** Whether to use created, modified, or published as the default type of date */ | ||||
|   defaultDateType: ValidDateType | ||||
|   /** Base URL to use for CNAME files, sitemaps, and RSS feeds that require an absolute URL. | ||||
|    *   Quartz will avoid using this as much as possible and use relative URLs most of the time | ||||
|    */ | ||||
|  | ||||
| @ -1,15 +1,16 @@ | ||||
| import { formatDate } from "./Date" | ||||
| import { formatDate, getDate } from "./Date" | ||||
| import { QuartzComponentConstructor, QuartzComponentProps } from "./types" | ||||
| import readingTime from "reading-time" | ||||
| 
 | ||||
| export default (() => { | ||||
|   function ContentMetadata({ fileData }: QuartzComponentProps) { | ||||
|   function ContentMetadata({ cfg, fileData }: QuartzComponentProps) { | ||||
|     const text = fileData.text | ||||
|     if (text) { | ||||
|       const segments: string[] = [] | ||||
|       const { text: timeTaken, words: _words } = readingTime(text) | ||||
|       if (fileData.dates?.modified) { | ||||
|         segments.push(formatDate(fileData.dates.modified)) | ||||
| 
 | ||||
|       if (fileData.dates) { | ||||
|         segments.push(formatDate(getDate(cfg, fileData)!)) | ||||
|       } | ||||
| 
 | ||||
|       segments.push(timeTaken) | ||||
|  | ||||
| @ -1,7 +1,16 @@ | ||||
| import { GlobalConfiguration } from "../cfg" | ||||
| import { QuartzPluginData } from "../plugins/vfile" | ||||
| 
 | ||||
| interface Props { | ||||
|   date: Date | ||||
| } | ||||
| 
 | ||||
| export type ValidDateType = keyof Required<QuartzPluginData>["dates"] | ||||
| 
 | ||||
| export function getDate(cfg: GlobalConfiguration, data: QuartzPluginData): Date | undefined { | ||||
|   return data.dates?.[cfg.defaultDateType] | ||||
| } | ||||
| 
 | ||||
| export function formatDate(d: Date): string { | ||||
|   return d.toLocaleDateString("en-US", { | ||||
|     year: "numeric", | ||||
|  | ||||
| @ -1,31 +1,36 @@ | ||||
| import { FullSlug, resolveRelative } from "../util/path" | ||||
| import { QuartzPluginData } from "../plugins/vfile" | ||||
| import { Date } from "./Date" | ||||
| import { Date, getDate } from "./Date" | ||||
| import { QuartzComponentProps } from "./types" | ||||
| import { GlobalConfiguration } from "../cfg" | ||||
| 
 | ||||
| export 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 | ||||
| export function byDateAndAlphabetical( | ||||
|   cfg: GlobalConfiguration, | ||||
| ): (f1: QuartzPluginData, f2: QuartzPluginData) => number { | ||||
|   return (f1, f2) => { | ||||
|     if (f1.dates && f2.dates) { | ||||
|       // sort descending
 | ||||
|       return getDate(cfg, f2)!.getTime() - getDate(cfg, f1)!.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() ?? "" | ||||
|     return f1Title.localeCompare(f2Title) | ||||
|   } | ||||
| 
 | ||||
|   // otherwise, sort lexographically by title
 | ||||
|   const f1Title = f1.frontmatter?.title.toLowerCase() ?? "" | ||||
|   const f2Title = f2.frontmatter?.title.toLowerCase() ?? "" | ||||
|   return f1Title.localeCompare(f2Title) | ||||
| } | ||||
| 
 | ||||
| type Props = { | ||||
|   limit?: number | ||||
| } & QuartzComponentProps | ||||
| 
 | ||||
| export function PageList({ fileData, allFiles, limit }: Props) { | ||||
|   let list = allFiles.sort(byDateAndAlphabetical) | ||||
| export function PageList({ cfg, fileData, allFiles, limit }: Props) { | ||||
|   let list = allFiles.sort(byDateAndAlphabetical(cfg)) | ||||
|   if (limit) { | ||||
|     list = list.slice(0, limit) | ||||
|   } | ||||
| @ -41,7 +46,7 @@ export function PageList({ fileData, allFiles, limit }: Props) { | ||||
|             <div class="section"> | ||||
|               {page.dates && ( | ||||
|                 <p class="meta"> | ||||
|                   <Date date={page.dates.modified} /> | ||||
|                   <Date date={getDate(cfg, page)!} /> | ||||
|                 </p> | ||||
|               )} | ||||
|               <div class="desc"> | ||||
|  | ||||
| @ -3,7 +3,8 @@ import { FullSlug, SimpleSlug, resolveRelative } from "../util/path" | ||||
| import { QuartzPluginData } from "../plugins/vfile" | ||||
| import { byDateAndAlphabetical } from "./PageList" | ||||
| import style from "./styles/recentNotes.scss" | ||||
| import { Date } from "./Date" | ||||
| import { Date, getDate } from "./Date" | ||||
| import { GlobalConfiguration } from "../cfg" | ||||
| 
 | ||||
| interface Options { | ||||
|   title: string | ||||
| @ -13,18 +14,18 @@ interface Options { | ||||
|   sort: (f1: QuartzPluginData, f2: QuartzPluginData) => number | ||||
| } | ||||
| 
 | ||||
| const defaultOptions: Options = { | ||||
| const defaultOptions = (cfg: GlobalConfiguration): Options => ({ | ||||
|   title: "Recent Notes", | ||||
|   limit: 3, | ||||
|   linkToMore: false, | ||||
|   filter: () => true, | ||||
|   sort: byDateAndAlphabetical, | ||||
| } | ||||
|   sort: byDateAndAlphabetical(cfg), | ||||
| }) | ||||
| 
 | ||||
| export default ((userOpts?: Partial<Options>) => { | ||||
|   const opts = { ...defaultOptions, ...userOpts } | ||||
|   function RecentNotes(props: QuartzComponentProps) { | ||||
|     const { allFiles, fileData, displayClass } = props | ||||
|     const { allFiles, fileData, displayClass, cfg } = props | ||||
|     const opts = { ...defaultOptions(cfg), ...userOpts } | ||||
|     const pages = allFiles.filter(opts.filter).sort(opts.sort) | ||||
|     const remaining = Math.max(0, pages.length - opts.limit) | ||||
|     return ( | ||||
| @ -47,7 +48,7 @@ export default ((userOpts?: Partial<Options>) => { | ||||
|                   </div> | ||||
|                   {page.dates && ( | ||||
|                     <p class="meta"> | ||||
|                       <Date date={page.dates.modified} /> | ||||
|                       <Date date={getDate(cfg, fileData)!} /> | ||||
|                     </p> | ||||
|                   )} | ||||
|                   <ul class="tags"> | ||||
|  | ||||
| @ -1,4 +1,5 @@ | ||||
| import { GlobalConfiguration } from "../../cfg" | ||||
| import { getDate } from "../../components/Date" | ||||
| import { FilePath, FullSlug, SimpleSlug, simplifySlug } from "../../util/path" | ||||
| import { QuartzEmitterPlugin } from "../types" | ||||
| import path from "path" | ||||
| @ -74,7 +75,7 @@ export const ContentIndex: QuartzEmitterPlugin<Partial<Options>> = (opts) => { | ||||
|       const linkIndex: ContentIndex = new Map() | ||||
|       for (const [_tree, file] of content) { | ||||
|         const slug = file.data.slug! | ||||
|         const date = file.data.dates?.modified ?? new Date() | ||||
|         const date = getDate(ctx.cfg.configuration, file.data) ?? new Date() | ||||
|         if (opts?.includeEmptyFiles || (file.data.text && file.data.text !== "")) { | ||||
|           linkIndex.set(slug, { | ||||
|             title: file.data.frontmatter?.title!, | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user