SPB Git forge

spb/cancerindex

Public
37commits 1branches 0releases
2.9 MBsize
maindefault branch
10 days agolast push
TypeScript 97.2% SQL 1.5% CSS 0.6% JavaScript 0.5%
2.3 KB · 48 lines typescript
Raw Blame History
1import { SITE_URL, SITE_NAME } from './site';2import { toDate } from './format';34/** Serialize JSON-LD safely for a <script type="application/ld+json"> block. */5export function jsonLd(obj: Record<string, unknown>): string {6  return JSON.stringify(obj).replace(/</g, '\\u003c');7}89/** Schema.org MedicalCondition — only fields we actually hold (§148). */10export function medicalConditionLd(c: { slug: string; canonicalName: string; description: string | null; aliases: string[]; codes: Array<{ system: string; code: string }> }) {11  const codeSystemName: Record<string, string> = { ncit: 'NCIt', icd10: 'ICD-10', icd10cm: 'ICD-10-CM', oncotree: 'OncoTree', doid: 'DOID', umls: 'UMLS', mesh: 'MeSH', mondo: 'MONDO' };12  const ld: Record<string, unknown> = {13    '@context': 'https://schema.org',14    '@type': 'MedicalCondition',15    name: c.canonicalName,16    url: `${SITE_URL}/cancer/${c.slug}`,17  };18  if (c.description) ld.description = c.description;19  if (c.aliases.length) ld.alternateName = c.aliases.slice(0, 20);20  const codes = c.codes.filter((k) => codeSystemName[k.system]).map((k) => ({ '@type': 'MedicalCode', codeValue: k.code, codingSystem: codeSystemName[k.system] }));21  if (codes.length) ld.code = codes;22  return ld;23}2425export function drugLd(d: { slug: string; name: string; description: string | null; mechanism: string | null; aliases: string[] }) {26  const ld: Record<string, unknown> = { '@context': 'https://schema.org', '@type': 'Drug', name: d.name, url: `${SITE_URL}/drug/${d.slug}` };27  if (d.description) ld.description = d.description;28  if (d.mechanism) ld.mechanismOfAction = d.mechanism;29  if (d.aliases.length) ld.alternateName = d.aliases.slice(0, 20);30  return ld;31}3233export function datasetLd(d: { name: string; description: string; url: string; distributionUrl: string; license: string; dateModified?: Date | string | null }) {34  const ld: Record<string, unknown> = {35    '@context': 'https://schema.org',36    '@type': 'Dataset',37    name: d.name,38    description: d.description,39    url: d.url,40    license: d.license,41    creator: { '@type': 'Organization', name: SITE_NAME, url: SITE_URL },42    distribution: [{ '@type': 'DataDownload', encodingFormat: 'text/csv', contentUrl: d.distributionUrl }],43  };44  const dm = toDate(d.dateModified);45  if (dm) ld.dateModified = dm.toISOString();46  return ld;47}48