--- import BaseLayout from "../layouts/BaseLayout.astro"; import { examIntro, examMath, examScoring, examText } from "../data/exam"; import { site } from "../data/site"; const lines = examText .trim() .split("\n") .map((line) => line.trim()) .filter(Boolean); const isSectionLine = (line: string) => /^(一、|二、|三、|四、|五、|六、|Ⅶ\.)/.test(line); const imagePattern = /^\[image:(.+?):(.+?)\]$/; const galleryPattern = /^\[gallery:(.+)\]$/; const questionPattern = /^\[q\](.+)$/; const mathPattern = /\[math:([\w-]+)\]/g; const optionPattern = /^[A-D]\./; const renderLine = (line: string) => line.replace(mathPattern, (_, id: string) => examMath[id] ?? ""); const getOptions = (line: string) => { if (!optionPattern.test(line)) { return []; } return line.match(/[A-D]\.\s*.*?(?=\s*[A-D]\.|$)/g) ?? []; }; const getOptionValue = (option: string) => option.match(/^([A-D])\./)?.[1] ?? ""; const fillQuestionMap = new Map(examScoring.fillQuestions.map((question) => [question.number, question])); const circledNumbers = ["①", "②", "③", "④", "⑤"]; const renderQuestion13Line = (line: string) => line.replace(/([①②③④⑤])▲/g, (_, marker: string) => { const blankIndex = circledNumbers.indexOf(marker); return `${marker}`; }); const objectiveMax = examScoring.choiceQuestions.reduce((sum, question) => sum + question.points, 0) + examScoring.fillQuestions .filter((question) => question.mode !== "unordered-names") .reduce((sum, question) => sum + question.points, 0) + examScoring.choiceBonus.points; const nameQuestionMax = examScoring.fillQuestions.find((question) => question.mode === "unordered-names")?.points ?? 0; const manualMax = examScoring.manualQuestions.reduce((sum, question) => sum + question.points, 0); const totalMax = objectiveMax + nameQuestionMax + manualMax; const admissionNumberLength = 9; const answerCardQuestions = [ ...examScoring.choiceQuestions.map((question) => ({ ...question, kind: "choice" })), ...examScoring.fillQuestions.map((question) => ({ ...question, kind: "fill" })), ...examScoring.manualQuestions.map((question) => ({ ...question, kind: "manual" })) ].sort((left, right) => left.number - right.number); let questionNumber = 0; ---
返回首页

{examIntro.eyebrow}

{examIntro.title}

{examIntro.description}

{ lines.map((line, index) => { const image = line.match(imagePattern); const gallery = line.match(galleryPattern); const question = line.match(questionPattern); const options = getOptions(line); if (image) { return (
{image[2]}
{image[2]}
); } if (gallery) { const images = gallery[1].split(","); return (
{images.map((src, imageIndex) => (
{`图片标题题配图
图 {imageIndex + 1}
{ questionNumber === 15 && ( ) }
))}
); } if (question) { questionNumber += 1; const currentQuestionNumber = questionNumber; const fillQuestion = fillQuestionMap.get(currentQuestionNumber); return (

{currentQuestionNumber}

{ fillQuestion?.mode === "unordered-names" ? (
{Array.from({ length: fillQuestion.blankCount }, (_, blankIndex) => ( ))}
) : null }
); } if (options.length > 0) { return (
{options.map((option) => (
); } if (index === 0) { return (
); } if (index < 3) { return (

); } if (isSectionLine(line)) { return

{line}

; } if (line === "注意事项:" || line === "注释:") { return

{line}

; } if (questionNumber === 13 && line.includes("▲")) { return

; } return

; }) }