64 lines
2.1 KiB
TypeScript
64 lines
2.1 KiB
TypeScript
import type { VaultEntry } from '../types'
|
|
import { resolveNoteIcon } from './noteIcon'
|
|
import { lookupColorForEntry } from './wikilinkColors'
|
|
import { resolveEntry, wikilinkDisplay, wikilinkTarget } from './wikilink'
|
|
|
|
const SHEET_WIKILINK_PATTERN = /\[\[([^\]\n]+?)\]\]/g
|
|
|
|
function wikilinkRef(rawTarget: string): string {
|
|
return `[[${rawTarget}]]`
|
|
}
|
|
|
|
function displayTitleForTarget(rawTarget: string, entry: VaultEntry | undefined): string {
|
|
const pipeIndex = rawTarget.indexOf('|')
|
|
if (pipeIndex >= 0) return rawTarget.slice(pipeIndex + 1)
|
|
return entry?.title ?? wikilinkDisplay(wikilinkRef(rawTarget))
|
|
}
|
|
|
|
function displayIconForEntry(entry: VaultEntry | undefined): string {
|
|
const icon = resolveNoteIcon(entry?.icon)
|
|
return icon.kind === 'emoji' ? `${icon.value} ` : ''
|
|
}
|
|
|
|
function resolveTargetEntry(
|
|
entries: VaultEntry[],
|
|
rawTarget: string,
|
|
sourceEntry?: VaultEntry | null,
|
|
): VaultEntry | undefined {
|
|
return resolveEntry(entries, wikilinkTarget(wikilinkRef(rawTarget)), sourceEntry ?? undefined)
|
|
}
|
|
|
|
export function sheetCellContainsPlainWikilink(value: string): boolean {
|
|
SHEET_WIKILINK_PATTERN.lastIndex = 0
|
|
return !value.trimStart().startsWith('=') && SHEET_WIKILINK_PATTERN.test(value)
|
|
}
|
|
|
|
export function sheetWikilinkDisplayValue(
|
|
value: string,
|
|
entries: VaultEntry[],
|
|
sourceEntry?: VaultEntry | null,
|
|
): string {
|
|
SHEET_WIKILINK_PATTERN.lastIndex = 0
|
|
return value.replace(SHEET_WIKILINK_PATTERN, (_match, rawTarget: string) => {
|
|
const entry = resolveTargetEntry(entries, rawTarget, sourceEntry)
|
|
return `${displayIconForEntry(entry)}${displayTitleForTarget(rawTarget, entry)}`
|
|
})
|
|
}
|
|
|
|
export function firstSheetWikilinkTarget(value: string): string | null {
|
|
SHEET_WIKILINK_PATTERN.lastIndex = 0
|
|
return SHEET_WIKILINK_PATTERN.exec(value)?.[1] ?? null
|
|
}
|
|
|
|
export function sheetWikilinkColor(
|
|
value: string,
|
|
entries: VaultEntry[],
|
|
sourceEntry: VaultEntry | null | undefined,
|
|
fallback: string,
|
|
): string {
|
|
const rawTarget = firstSheetWikilinkTarget(value)
|
|
if (!rawTarget) return fallback
|
|
|
|
const entry = resolveTargetEntry(entries, rawTarget, sourceEntry)
|
|
return entry ? lookupColorForEntry(entries, entry) : 'var(--text-muted)'
|
|
}
|