mirror of
				https://github.com/alrayyes/wiki.git
				synced 2025-08-07 15:21:03 +00:00 
			
		
		
		
	css fixes, add recent notes, more robust quartz update
This commit is contained in:
		
					parent
					
						
							
								5adf3c67a8
							
						
					
				
			
			
				commit
				
					
						236130ac22
					
				
			
		
					 8 changed files with 128 additions and 14 deletions
				
			
		quartz
| 
						 | 
				
			
			@ -136,7 +136,10 @@ async function popContentFolder(contentFolder) {
 | 
			
		|||
 | 
			
		||||
function gitPull(origin, branch) {
 | 
			
		||||
  const flags = ["--no-rebase", "--autostash", "-s", "recursive", "-X", "ours", "--no-edit"]
 | 
			
		||||
  spawnSync("git", ["pull", ...flags, origin, branch], { stdio: "inherit" })
 | 
			
		||||
  const out = spawnSync("git", ["pull", ...flags, origin, branch], { stdio: "inherit" })
 | 
			
		||||
  if (out.stderr) {
 | 
			
		||||
    throw new Error(`Error while pulling updates: ${out.stderr}`)
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
yargs(hideBin(process.argv))
 | 
			
		||||
| 
						 | 
				
			
			@ -258,13 +261,13 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started.
 | 
			
		|||
    const contentFolder = path.join(cwd, argv.directory)
 | 
			
		||||
    console.log(chalk.bgGreen.black(`\n Quartz v${version} \n`))
 | 
			
		||||
    console.log("Backing up your content")
 | 
			
		||||
    execSync(
 | 
			
		||||
      `git remote show upstream || git remote add upstream https://github.com/jackyzha0/quartz.git`,
 | 
			
		||||
    )
 | 
			
		||||
    await stashContentFolder(contentFolder)
 | 
			
		||||
    console.log(
 | 
			
		||||
      "Pulling updates... you may need to resolve some `git` conflicts if you've made changes to components or plugins.",
 | 
			
		||||
    )
 | 
			
		||||
    execSync(
 | 
			
		||||
      `git remote show upstream || git remote add upstream https://github.com/jackyzha0/quartz.git`,
 | 
			
		||||
    )
 | 
			
		||||
    gitPull(UPSTREAM_NAME, QUARTZ_SOURCE_BRANCH)
 | 
			
		||||
    await popContentFolder(contentFolder)
 | 
			
		||||
    console.log("Ensuring dependencies are up to date")
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,7 +3,7 @@ import { QuartzPluginData } from "../plugins/vfile"
 | 
			
		|||
import { Date } from "./Date"
 | 
			
		||||
import { QuartzComponentProps } from "./types"
 | 
			
		||||
 | 
			
		||||
function byDateAndAlphabetical(f1: QuartzPluginData, f2: QuartzPluginData): number {
 | 
			
		||||
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()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										81
									
								
								quartz/components/RecentNotes.tsx
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								quartz/components/RecentNotes.tsx
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,81 @@
 | 
			
		|||
import { QuartzComponentConstructor, QuartzComponentProps } from "./types"
 | 
			
		||||
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"
 | 
			
		||||
 | 
			
		||||
interface Options {
 | 
			
		||||
  title: string
 | 
			
		||||
  limit: number
 | 
			
		||||
  linkToMore: SimpleSlug | false
 | 
			
		||||
  filter: (f: QuartzPluginData) => boolean
 | 
			
		||||
  sort: (f1: QuartzPluginData, f2: QuartzPluginData) => number
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const defaultOptions: Options = {
 | 
			
		||||
  title: "Recent Notes",
 | 
			
		||||
  limit: 3,
 | 
			
		||||
  linkToMore: false,
 | 
			
		||||
  filter: () => true,
 | 
			
		||||
  sort: byDateAndAlphabetical,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export default ((userOpts?: Partial<Options>) => {
 | 
			
		||||
  const opts = { ...defaultOptions, ...userOpts }
 | 
			
		||||
  function RecentNotes(props: QuartzComponentProps) {
 | 
			
		||||
    const { allFiles, fileData } = props
 | 
			
		||||
    const pages = allFiles.filter(opts.filter).sort(opts.sort).slice(0, opts.limit)
 | 
			
		||||
    const remaining = Math.max(0, pages.length - opts.limit)
 | 
			
		||||
    return (
 | 
			
		||||
      <div class="recent-notes">
 | 
			
		||||
        <h3>{opts.title}</h3>
 | 
			
		||||
        <ul class="recent-ul">
 | 
			
		||||
          {pages.map((page) => {
 | 
			
		||||
            const title = page.frontmatter?.title
 | 
			
		||||
            const tags = page.frontmatter?.tags ?? []
 | 
			
		||||
 | 
			
		||||
            return (
 | 
			
		||||
              <li class="recent-li">
 | 
			
		||||
                <div class="section">
 | 
			
		||||
                  <div class="desc">
 | 
			
		||||
                    <h3>
 | 
			
		||||
                      <a href={resolveRelative(fileData.slug!, page.slug!)} class="internal">
 | 
			
		||||
                        {title}
 | 
			
		||||
                      </a>
 | 
			
		||||
                    </h3>
 | 
			
		||||
                  </div>
 | 
			
		||||
                  {page.dates && (
 | 
			
		||||
                    <p class="meta">
 | 
			
		||||
                      <Date date={page.dates.modified} />
 | 
			
		||||
                    </p>
 | 
			
		||||
                  )}
 | 
			
		||||
                  <ul class="tags">
 | 
			
		||||
                    {tags.map((tag) => (
 | 
			
		||||
                      <li>
 | 
			
		||||
                        <a
 | 
			
		||||
                          class="internal tag-link"
 | 
			
		||||
                          href={resolveRelative(fileData.slug!, `tags/${tag}` as FullSlug)}
 | 
			
		||||
                        >
 | 
			
		||||
                          #{tag}
 | 
			
		||||
                        </a>
 | 
			
		||||
                      </li>
 | 
			
		||||
                    ))}
 | 
			
		||||
                  </ul>
 | 
			
		||||
                </div>
 | 
			
		||||
              </li>
 | 
			
		||||
            )
 | 
			
		||||
          })}
 | 
			
		||||
        </ul>
 | 
			
		||||
        {opts.linkToMore && remaining > 0 && (
 | 
			
		||||
          <p>
 | 
			
		||||
            <a href={resolveRelative(fileData.slug!, opts.linkToMore)}>See {remaining} more →</a>
 | 
			
		||||
          </p>
 | 
			
		||||
        )}
 | 
			
		||||
      </div>
 | 
			
		||||
    )
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  RecentNotes.css = style
 | 
			
		||||
  return RecentNotes
 | 
			
		||||
}) satisfies QuartzComponentConstructor
 | 
			
		||||
| 
						 | 
				
			
			@ -15,6 +15,7 @@ import Search from "./Search"
 | 
			
		|||
import Footer from "./Footer"
 | 
			
		||||
import DesktopOnly from "./DesktopOnly"
 | 
			
		||||
import MobileOnly from "./MobileOnly"
 | 
			
		||||
import RecentNotes from "./RecentNotes"
 | 
			
		||||
 | 
			
		||||
export {
 | 
			
		||||
  ArticleTitle,
 | 
			
		||||
| 
						 | 
				
			
			@ -34,4 +35,5 @@ export {
 | 
			
		|||
  Footer,
 | 
			
		||||
  DesktopOnly,
 | 
			
		||||
  MobileOnly,
 | 
			
		||||
  RecentNotes,
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -25,10 +25,11 @@ function FolderContent(props: QuartzComponentProps) {
 | 
			
		|||
    allFiles: allPagesInFolder,
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  const content = (tree as Root).children.length === 0 ?
 | 
			
		||||
    fileData.description :
 | 
			
		||||
    // @ts-ignore
 | 
			
		||||
    toJsxRuntime(tree, { Fragment, jsx, jsxs, elementAttributeNameCase: "html" })
 | 
			
		||||
  const content =
 | 
			
		||||
    (tree as Root).children.length === 0
 | 
			
		||||
      ? fileData.description
 | 
			
		||||
      : // @ts-ignore
 | 
			
		||||
        toJsxRuntime(tree, { Fragment, jsx, jsxs, elementAttributeNameCase: "html" })
 | 
			
		||||
 | 
			
		||||
  return (
 | 
			
		||||
    <div class="popover-hint">
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -22,10 +22,11 @@ function TagContent(props: QuartzComponentProps) {
 | 
			
		|||
      (file.frontmatter?.tags ?? []).flatMap(getAllSegmentPrefixes).includes(tag),
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
  const content = (tree as Root).children.length === 0 ?
 | 
			
		||||
    fileData.description :
 | 
			
		||||
    // @ts-ignore
 | 
			
		||||
    toJsxRuntime(tree, { Fragment, jsx, jsxs, elementAttributeNameCase: "html" })
 | 
			
		||||
  const content =
 | 
			
		||||
    (tree as Root).children.length === 0
 | 
			
		||||
      ? fileData.description
 | 
			
		||||
      : // @ts-ignore
 | 
			
		||||
        toJsxRuntime(tree, { Fragment, jsx, jsxs, elementAttributeNameCase: "html" })
 | 
			
		||||
 | 
			
		||||
  if (tag === "") {
 | 
			
		||||
    const tags = [...new Set(allFiles.flatMap((data) => data.frontmatter?.tags ?? []))]
 | 
			
		||||
| 
						 | 
				
			
			@ -45,6 +46,9 @@ function TagContent(props: QuartzComponentProps) {
 | 
			
		|||
              ...props,
 | 
			
		||||
              allFiles: pages,
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            const contentPage = allFiles.filter((file) => file.slug === `tags/${tag}`)[0]
 | 
			
		||||
            const content = contentPage?.description
 | 
			
		||||
            return (
 | 
			
		||||
              <div>
 | 
			
		||||
                <h2>
 | 
			
		||||
| 
						 | 
				
			
			@ -52,6 +56,7 @@ function TagContent(props: QuartzComponentProps) {
 | 
			
		|||
                    #{tag}
 | 
			
		||||
                  </a>
 | 
			
		||||
                </h2>
 | 
			
		||||
                {content && <p>{content}</p>}
 | 
			
		||||
                <p>
 | 
			
		||||
                  {pages.length} items with this tag.{" "}
 | 
			
		||||
                  {pages.length > numPages && `Showing first ${numPages}.`}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										23
									
								
								quartz/components/styles/recentNotes.scss
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								quartz/components/styles/recentNotes.scss
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,23 @@
 | 
			
		|||
.recent-notes {
 | 
			
		||||
  & > h3 {
 | 
			
		||||
    font-size: 1rem;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  & > ul.recent-ul {
 | 
			
		||||
    list-style: none;
 | 
			
		||||
    margin-top: 1.5rem;
 | 
			
		||||
    padding-left: 0;
 | 
			
		||||
 | 
			
		||||
    & > li {
 | 
			
		||||
      margin: 1rem 0;
 | 
			
		||||
      .section > .desc > h3 > a {
 | 
			
		||||
        background-color: transparent;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      .section > .meta {
 | 
			
		||||
        margin: 0 0 0.5rem 0;
 | 
			
		||||
        opacity: 0.6;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -320,7 +320,6 @@ pre {
 | 
			
		|||
  border-radius: 5px;
 | 
			
		||||
  overflow-x: auto;
 | 
			
		||||
  border: 1px solid var(--lightgray);
 | 
			
		||||
  position: relative;
 | 
			
		||||
 | 
			
		||||
  &:has(> code.mermaid) {
 | 
			
		||||
    border: none;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue