ElectronicBabylonianLiterature/ebl-frontend

View on GitHub
src/corpus/application/line-factory.ts

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
import {
  createLine,
  createVariant,
  createManuscriptLine,
  Line,
  EditStatus,
} from 'corpus/domain/line'

function nextNumber(number: string): string {
  const match = /^(?<number>\d+)(?<prime>')?$/.exec(number)
  if (match && match.groups) {
    const value = Number(match.groups.number)
    const prime = match.groups.prime || ''
    return `${value + 1}${prime}`
  } else {
    return ''
  }
}

const defaultReconstruction = '%n '

export function createDefaultLineFactory(
  lastLine: Line | null = null
): () => Line {
  return lastLine
    ? () =>
        createLine({
          number: nextNumber(lastLine.number),
          variants: lastLine.variants.map((variant) =>
            createVariant({
              reconstruction: defaultReconstruction,
              manuscripts: variant.manuscripts.map((manuscript) =>
                createManuscriptLine({
                  manuscriptId: manuscript.manuscriptId,
                  labels: manuscript.labels,
                  number: nextNumber(manuscript.number),
                })
              ),
            })
          ),
          status: EditStatus.NEW,
        })
    : () =>
        createLine({
          variants: [createVariant({ reconstruction: defaultReconstruction })],
          status: EditStatus.NEW,
        })
}