markdown-bridge.ts1.0 KBView on GitHub
/**
 * Markdown notation for file-link chips: `[[doc:<documentId>]]`.
 *
 * The chip's display label is fetched live from `documents.getDoc`, so the
 * markdown carries only the UUID. Older content using `[[doc:UUID|label]]`
 * still parses — the label is read and discarded.
 */

const FILE_LINK_TOKEN_REGEX = /\[\[doc:([0-9a-fA-F-]{36})(?:\|[^\]]+)?\]\]/g;
const FILE_LINK_TOKEN_ANCHORED = /^\[\[doc:([0-9a-fA-F-]{36})(?:\|[^\]]+)?\]\]/;

export interface FileLinkAttrs {
  documentId: string;
}

export function serializeFileLinkToken(attrs: FileLinkAttrs): string {
  return `[[doc:${attrs.documentId}]]`;
}

export function parseFileLinkToken(raw: string): FileLinkAttrs | null {
  const match = raw.match(/^\[\[doc:([0-9a-fA-F-]{36})(?:\|[^\]]+)?\]\]$/);
  if (!match) return null;
  return { documentId: match[1] };
}

export function findFileLinkTokenStart(src: string): number {
  const match = FILE_LINK_TOKEN_REGEX.exec(src);
  FILE_LINK_TOKEN_REGEX.lastIndex = 0;
  return match?.index ?? -1;
}

export { FILE_LINK_TOKEN_ANCHORED };