{"version":3,"file":"single-state.cjs","sources":["../../../../packages/components/src/subject/single-state.ts"],"sourcesContent":["import type { AnswerType } from './types'\nimport type { SingleAnswer } from './single-model'\n\nfunction normalizeSingleAiTitle(text: string) {\n  return text\n    .replace(/^\\d+\\.\\s*/, '')\n    .replace(/[\\s，,。.!！?？;；:：、'\"“”‘’()（）[\\]【】\\-_/\\\\]+/g, '')\n    .toLowerCase()\n}\n\nexport function applySingleAiAnswer({\n  answers,\n  aiAnswer,\n  answerType,\n}: {\n  answers: SingleAnswer[]\n  aiAnswer: string\n  answerType: AnswerType\n}) {\n  const aiTitles = aiAnswer\n    .split(/\\r?\\n/)\n    .map(line => normalizeSingleAiTitle(line))\n    .filter(Boolean)\n\n  let matchedCount = 0\n  let hasSelected = false\n\n  const nextAnswers = answers.map((answer) => {\n    const matched = aiTitles.includes(normalizeSingleAiTitle(answer.title || ''))\n\n    if (answerType === 'single') {\n      const isCorrect = matched && !hasSelected\n      if (isCorrect) {\n        hasSelected = true\n        matchedCount += 1\n      }\n      return { ...answer, isCorrect }\n    }\n\n    if (matched) {\n      matchedCount += 1\n    }\n    return { ...answer, isCorrect: matched }\n  })\n\n  return {\n    answers: nextAnswers,\n    matchedCount,\n  }\n}\n\nexport function updateSingleAnswerTitle(\n  answers: SingleAnswer[],\n  answerIndex: number,\n  value: string,\n  maxLength: number,\n) {\n  const nextTitle = value.slice(0, maxLength)\n  return answers.map((answer, index) => index === answerIndex\n    ? { ...answer, title: nextTitle }\n    : answer)\n}\n\nexport function insertSingleAnswerAfter(\n  answers: SingleAnswer[],\n  answerIndex: number,\n  createId: () => string | number,\n) {\n  const nextAnswers = [...answers]\n  nextAnswers.splice(answerIndex + 1, 0, {\n    title: '',\n    isCorrect: false,\n    customAnswerId: createId(),\n  })\n  return nextAnswers\n}\n\nexport function deleteSingleAnswerAt(\n  answers: SingleAnswer[],\n  answerIndex: number,\n  minimumLength = 2,\n) {\n  if (answers.length <= minimumLength) {\n    return answers\n  }\n  return answers.filter((_, index) => index !== answerIndex)\n}\n\nexport function setSingleCorrectState(\n  answers: SingleAnswer[],\n  answerType: AnswerType,\n  answerIndex: number,\n  value: boolean,\n) {\n  if (answerType === 'single') {\n    return answers.map((answer, index) => ({\n      ...answer,\n      isCorrect: index === answerIndex ? value : (value ? false : !!answer.isCorrect),\n    }))\n  }\n\n  return answers.map((answer, index) => index === answerIndex\n    ? { ...answer, isCorrect: value }\n    : answer)\n}\n\nexport function toggleSingleSortLetter(orderList: string[], letter: string) {\n  return orderList.includes(letter)\n    ? orderList.filter(item => item !== letter)\n    : [...orderList, letter]\n}\n\nexport function removeSingleSortLetter(orderList: string[], letter: string) {\n  return orderList.filter(item => item !== letter)\n}\n\nexport function getSingleSortOrder(orderList: string[], letter: string) {\n  const index = orderList.indexOf(letter)\n  return index >= 0 ? index + 1 : null\n}\n\nexport function resolveSingleSortAnswerValue(letter: string, answers: SingleAnswer[]) {\n  const index = letter.charCodeAt(0) - 65\n  const answer = answers[index] as any\n  return answer?.answerId ?? index + 1\n}\n\nexport function countSingleRelationAnswers(relations: any[] = []) {\n  return relations.reduce((count, item) => {\n    return count + (Array.isArray(item?.relationAnswers) ? item.relationAnswers.length : 0)\n  }, 0)\n}\n\nexport function shouldShowSingleCorrectHint({\n  answerType,\n  answers,\n  orderList,\n}: {\n  answerType: AnswerType\n  answers: SingleAnswer[]\n  orderList: string[]\n}) {\n  if (answerType === 'sort') {\n    return !orderList.length\n  }\n  return !answers.some(answer => !!answer.isCorrect)\n}\n"],"names":["normalizeSingleAiTitle","text","applySingleAiAnswer","answers","aiAnswer","answerType","aiTitles","line","matchedCount","hasSelected","answer","matched","isCorrect","updateSingleAnswerTitle","answerIndex","value","maxLength","nextTitle","index","insertSingleAnswerAfter","createId","nextAnswers","deleteSingleAnswerAt","minimumLength","_","setSingleCorrectState","toggleSingleSortLetter","orderList","letter","item","removeSingleSortLetter","getSingleSortOrder","resolveSingleSortAnswerValue","countSingleRelationAnswers","relations","count","shouldShowSingleCorrectHint"],"mappings":"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"}