Skip to content

Jiuzhixinzhi/editory

Repository files navigation

Editory

以复杂数据结构自动化试卷与答案生成的英语测验制作工具。

  • 框架:Next.js
  • 组件库:NextUI
  • 数据库:Xata
  • 用户管理:Clerk

按照 @/schema.json 初始化 Xata 数据库并填充环境变量后运行:

npm install
npm run dev

核心架构

  • /components
    • /editory — 编辑界面
    • /editor — 编辑器
      • /fishing — 小猫钓鱼题
      • /cloze — 完形填空
      • /grammar — 语法填空
      • /sentence — 六选四
      • /reading — 阅读理解
      • /listening — 听力
      • /custom — 自定义文本块
    • /paper — 试卷展示
    • /key — 答案展示
  • /utils
    • /generators — 生成试卷、答案、可导出 Word 格式
    • /types — 类型声明

各题型数据结构

听力

export type Question = {
    q: string
    a: string[]
    correct: number // index of the correct answer
}

export type ListeningQuestion = Question & {
    transcript: string
}

export type ListeningData = {
    id: string
    type: 'listening'
    questions: ListeningQuestion[]
}

语法填空

export type GrammarData = {
    id: string
    text: string
    type: 'grammar'
    hints: Record<string, string | undefined>
}

小猫钓鱼

export type FishingData = {
    id: string
    text: string
    type: 'fishing'
    distractors: string[]
    markerSet: string[] // 字母记号集,可应对仅ABCD的答题卡
}

注:挖空部分在 text 中以 <code></code> 包裹,下同。

完形填空

export type ClozeData = {
    id: string
    text: string
    type: 'cloze'
    distractors: Record<string, string[]> // { '被挖空词': ['干扰项1'. '干扰项2', '干扰项3'] }
}

阅读理解

export type ReadingQuestion = Question

export type ReadingData = {
    id: string
    text: string
    type: 'reading'
    questions: ReadingQuestion[]
}

六选四

export type SentenceChoiceData = {
    id: string
    text: string
    type: '4/6'
    distractors: string[]
}

自定义文本块

export type CustomData = {
    id: string
    type: 'custom'
    paper: string
    key: string
}

TODO

  • 导出 Word UI 优化
  • 去除挖空词内部格式
  • 添加听力的4x12x21x4排版模式
  • 全局directions显示开关
  • 全局I. Listening ComprehensionSection A等格式开关
  • 多题块分离渲染