| | |
| | | import { QuartzComponentConstructor, QuartzComponentProps } from "./types" |
| | | import { QuartzComponent, QuartzComponentConstructor, QuartzComponentProps } from "./types" |
| | | import style from "./styles/backlinks.scss" |
| | | import { relativeToRoot } from "../path" |
| | | import { stripIndex } from "./scripts/util" |
| | | import { resolveRelative, simplifySlug } from "../util/path" |
| | | import { i18n } from "../i18n" |
| | | import { classNames } from "../util/lang" |
| | | |
| | | function Backlinks({ fileData, allFiles }: QuartzComponentProps) { |
| | | const slug = fileData.slug! |
| | | const backlinkFiles = allFiles.filter(file => file.links?.includes(slug)) |
| | | return <div class="backlinks"> |
| | | <h3>Backlinks</h3> |
| | | <ul class="overflow"> |
| | | {backlinkFiles.length > 0 ? |
| | | backlinkFiles.map(f => <li><a href={stripIndex(relativeToRoot(slug, f.slug!))} class="internal">{f.frontmatter?.title}</a></li>) |
| | | : <li>No backlinks found</li>} |
| | | </ul> |
| | | </div> |
| | | interface BacklinksOptions { |
| | | hideWhenEmpty: boolean |
| | | } |
| | | |
| | | Backlinks.css = style |
| | | export default (() => Backlinks) satisfies QuartzComponentConstructor |
| | | const defaultOptions: BacklinksOptions = { |
| | | hideWhenEmpty: true, |
| | | } |
| | | |
| | | export default ((opts?: Partial<BacklinksOptions>) => { |
| | | const options: BacklinksOptions = { ...defaultOptions, ...opts } |
| | | |
| | | const Backlinks: QuartzComponent = ({ |
| | | fileData, |
| | | allFiles, |
| | | displayClass, |
| | | cfg, |
| | | }: QuartzComponentProps) => { |
| | | const slug = simplifySlug(fileData.slug!) |
| | | const backlinkFiles = allFiles.filter((file) => file.links?.includes(slug)) |
| | | if (options.hideWhenEmpty && backlinkFiles.length == 0) { |
| | | return null |
| | | } |
| | | return ( |
| | | <div class={classNames(displayClass, "backlinks")}> |
| | | <h3>{i18n(cfg.locale).components.backlinks.title}</h3> |
| | | <ul class="overflow"> |
| | | {backlinkFiles.length > 0 ? ( |
| | | backlinkFiles.map((f) => ( |
| | | <li> |
| | | <a href={resolveRelative(fileData.slug!, f.slug!)} class="internal"> |
| | | {f.frontmatter?.title} |
| | | </a> |
| | | </li> |
| | | )) |
| | | ) : ( |
| | | <li>{i18n(cfg.locale).components.backlinks.noBacklinksFound}</li> |
| | | )} |
| | | </ul> |
| | | </div> |
| | | ) |
| | | } |
| | | |
| | | Backlinks.css = style |
| | | |
| | | return Backlinks |
| | | }) satisfies QuartzComponentConstructor |