domain/converters/evidence.converter.ts
domain/converters/evidence.converter.ts is a file in Bane's Lab Site. 30 lines of code and 8 definitions.
import type { ChapterSubject, Evidence, EvidenceSubject } from "#types/evidence.types";
import { ANCHOR_PREFIX } from "#configuration/constants/document.constants";
import { CHAPTER_FACE } from "#configuration/constants/vocabulary.constants";
import { FACE_SEPARATOR } from "@govlab/constants";
import type { ReferenceTarget } from "#types/reference.types";
import { pageFromPath } from "#core/assets/link.assets";
const CHAPTER_PREFIX = CHAPTER_FACE + FACE_SEPARATOR;
const chapterHref = function chapterHref(target: ReferenceTarget): string | null {
return target.face === CHAPTER_FACE && target.ref.startsWith(CHAPTER_PREFIX)
? target.ref.slice(CHAPTER_PREFIX.length)
: null;
};
const isChapterOf = function isChapterOf(subject: ChapterSubject, href: string): boolean {
const cut = href.indexOf(ANCHOR_PREFIX);
const section = cut === -1 ? "" : href.slice(cut + ANCHOR_PREFIX.length);
return section === subject.section && pageFromPath(href, "") === subject.page;
};
export const subjectMatches = function subjectMatches(subject: EvidenceSubject, target: ReferenceTarget): boolean {
if (subject.kind === "record") {
return subject.ref === target.ref;
}
const href = chapterHref(target);
return href !== null && isChapterOf(subject, href);
};
export const evidenceFor = function evidenceFor(
target: ReferenceTarget,
registry: readonly Evidence[],
): readonly Evidence[] {
return registry.filter((entry) => subjectMatches(entry.subject, target));
};