master @ 52 LINES
[ HISTORY ] [ UP ]
┌─ TS ───────────────────────────────────────────────────────────────────────┐
│ // Linkified [FILED UNDER] taxonomy path. Collection roots link to │
│ // their index; deeper segments search the index (like tag badges). │
│ // Long paths wrap at segment boundaries. │
│ import { checkGrid, len } from "../../lib/ascii"; │
│ │
│ export const CRUMB_LABEL = "[FILED UNDER]: "; │
│ │
│ const ROOTS: Record<string, string> = { │
│ KB: "/kb/", │
│ GIT: "/git/", │
│ }; │
│ │
│ export interface Crumb { │
│ label: string; │
│ href: string; │
│ } │
│ │
│ export interface Props { │
│ filed: string; │
│ } │
│ │
│ export function crumbs(filed: string): Crumb[] { │
│ return filed │
│ .split("/") │
│ .filter(Boolean) │
│ .map((seg, i) => ({ │
│ label: seg, │
│ href: │
│ (i === 0 && ROOTS[seg.toUpperCase()]) || │
│ `/?q=${encodeURIComponent(seg.toLowerCase())}`, │
│ })); │
│ } │
│ │
│ /** Rows of crumbs fitting `width` after the label indent; every crumb │
│ * costs "/" + label. */ │
│ export function layoutCrumbs(items: Crumb[], width: number): Crumb[][] { │
│ const avail = Math.max(1, width - len(CRUMB_LABEL)); │
│ const rows: Crumb[][] = [[]]; │
│ let used = 0; │
│ for (const c of items) { │
│ checkGrid(`/${c.label}`, avail, "breadcrumb segment"); │
│ const w = 1 + len(c.label); │
│ if (used + w > avail && rows[rows.length - 1].length) { │
│ rows.push([]); │
│ used = 0; │
│ } │
│ rows[rows.length - 1].push(c); │
│ used += w; │
│ } │
│ return rows; │
│ } │
└────────────────────────────────────────────────────────────────────────────────────┘
┌─ TS ─────────────────────────────────┐
│ // Linkified [FILED UNDER] taxonomy path. Co │
│ llection roots link to │
│ // their index; deeper segments search the i │
│ ndex (like tag badges). │
│ // Long paths wrap at segment boundaries. │
│ import { checkGrid, len } from "../../lib/as │
│ cii"; │
│ │
│ export const CRUMB_LABEL = "[FILED UNDER]: " │
│ ; │
│ │
│ const ROOTS: Record<string, string> = { │
│ KB: "/kb/", │
│ GIT: "/git/", │
│ }; │
│ │
│ export interface Crumb { │
│ label: string; │
│ href: string; │
│ } │
│ │
│ export interface Props { │
│ filed: string; │
│ } │
│ │
│ export function crumbs(filed: string): Crumb │
│ [] { │
│ return filed │
│ .split("/") │
│ .filter(Boolean) │
│ .map((seg, i) => ({ │
│ label: seg, │
│ href: │
│ (i === 0 && ROOTS[seg.toUpperCase()] │
│ ) || │
│ `/?q=${encodeURIComponent(seg.toLowe │
│ rCase())}`, │
│ })); │
│ } │
│ │
│ /** Rows of crumbs fitting `width` after the │
│ label indent; every crumb │
│ * costs "/" + label. */ │
│ export function layoutCrumbs(items: Crumb[], │
│ width: number): Crumb[][] { │
│ const avail = Math.max(1, width - len(CRUM │
│ B_LABEL)); │
│ const rows: Crumb[][] = [[]]; │
│ let used = 0; │
│ for (const c of items) { │
│ checkGrid(`/${c.label}`, avail, "breadcr │
│ umb segment"); │
│ const w = 1 + len(c.label); │
│ if (used + w > avail && rows[rows.length │
│ - 1].length) { │
│ rows.push([]); │
│ used = 0; │
│ } │
│ rows[rows.length - 1].push(c); │
│ used += w; │
│ } │
│ return rows; │
│ } │
└──────────────────────────────────────────────┘
──────────────────────────────────────────────────────────────────────────────────────
OOKNET
────────────────────────────────────────────────
OOKNET