ai_member_xiaoyan/output/l1_pedagogy_rules.js

353 lines
45 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* L1 Pedagogy Rules v1.0
* 教研内容校验规则模块
*
* 用法: <script src="l1_pedagogy_rules.js"></script>
* API: PedagogyRules.validate(componentContent, chapterPrefix)
*/
(function(global) {
"use strict";
var WORD_LISTS = {
L1: {"red": {"pos": "adj", "meaning": "红色的", "unit": "S0-U0-L1", "difficulty": 1}, "hat": {"pos": "n", "meaning": "帽子", "unit": "S0-U0-L1", "difficulty": 1}, "blue": {"pos": "adj", "meaning": "蓝的", "unit": "S0-U0-L1", "difficulty": 1}, "bag": {"pos": "n", "meaning": "袋,包", "unit": "S0-U0-L1", "difficulty": 1}, "orange": {"pos": "n", "meaning": "橙子", "unit": "S1-U10-L3", "difficulty": 1}, "green": {"pos": "adj", "meaning": "绿色的", "unit": "S0-U0-L2", "difficulty": 1}, "dress": {"pos": "n", "meaning": "连衣裙", "unit": "S0-U0-L2", "difficulty": 1}, "there": {"pos": "adv", "meaning": "那里", "unit": "S0-U0-L3", "difficulty": 1}, "put": {"pos": "v", "meaning": "放", "unit": "S0-U0-L3", "difficulty": 1}, "purple": {"pos": "adj", "meaning": "紫色的", "unit": "S0-U0-L5", "difficulty": 1}, "give": {"pos": "v", "meaning": "给", "unit": "S0-U0-L3", "difficulty": 1}, "water": {"pos": "n", "meaning": "水", "unit": "S0-U0-L4", "difficulty": 1}, "here": {"pos": "adv", "meaning": "在这里", "unit": "S0-U0-L4", "difficulty": 1}, "dirty": {"pos": "adj", "meaning": "肮脏的", "unit": "S0-U0-L4", "difficulty": 1}, "clean": {"pos": "v", "meaning": "清洁", "unit": "S0-U0-L4", "difficulty": 1}, "pink": {"pos": "adj", "meaning": "粉红色的", "unit": "S0-U0-L2", "difficulty": 1}, "get": {"pos": "v", "meaning": "收到", "unit": "", "difficulty": 1}, "wall": {"pos": "n", "meaning": "墙", "unit": "S1-U1-L1", "difficulty": 1}, "table": {"pos": "n", "meaning": "桌子", "unit": "S1-U1-L1", "difficulty": 1}, "floor": {"pos": "n", "meaning": "地板", "unit": "S1-U1-L1", "difficulty": 1}, "hand": {"pos": "n", "meaning": "手", "unit": "S1-U1-L2", "difficulty": 1}, "foot": {"pos": "n", "meaning": "脚", "unit": "S1-U1-L2", "difficulty": 1}, "black": {"pos": "adj", "meaning": "黑的", "unit": "S1-U1-L2", "difficulty": 1}, "tomato": {"pos": "n", "meaning": "西红柿", "unit": "S1-U1-L3", "difficulty": 1}, "fish": {"pos": "n", "meaning": "鱼", "unit": "S1-U1-L3", "difficulty": 1}, "chicken": {"pos": "n", "meaning": "鸡肉", "unit": "S1-U1-L3", "difficulty": 1}, "nose": {"pos": "n", "meaning": "鼻子", "unit": "S1-U1-L4", "difficulty": 1}, "eye": {"pos": "n", "meaning": "眼睛", "unit": "S1-U1-L4", "difficulty": 1}, "brown": {"pos": "adj", "meaning": "棕色的", "unit": "S1-U1-L4", "difficulty": 1}, "yellow": {"pos": "adj", "meaning": "黄色的", "unit": "S1-U1-L5", "difficulty": 1}, "white": {"pos": "adj", "meaning": "白色的", "unit": "S1-U1-L5", "difficulty": 1}, "go": {"pos": "v", "meaning": "去,走", "unit": "S1-U2-L1", "difficulty": 1}, "dog": {"pos": "n", "meaning": "狗", "unit": "S1-U2-L1", "difficulty": 1}, "come": {"pos": "v", "meaning": "来", "unit": "S1-U2-L1", "difficulty": 1}, "cat": {"pos": "n", "meaning": "猫", "unit": "S1-U2-L1", "difficulty": 1}, "pie": {"pos": "n", "meaning": "馅饼", "unit": "S1-U2-L2", "difficulty": 1}, "can": {"pos": "v", "meaning": "能,会", "unit": "S1-U2-L4", "difficulty": 1}, "open": {"pos": "adj", "meaning": "开着的", "unit": "", "difficulty": 1}, "happy": {"pos": "adj", "meaning": "快乐的", "unit": "S1-U2-L5", "difficulty": 1}, "see": {"pos": "v", "meaning": "看见", "unit": "S1-U3-L1", "difficulty": 1}, "1": {"pos": "num", "meaning": "1", "unit": "S1-U3-L1", "difficulty": 1}, "paper": {"pos": "adj", "meaning": "纸质的", "unit": "", "difficulty": 1}, "book": {"pos": "n", "meaning": "书", "unit": "S1-U3-L2", "difficulty": 1}, "3": {"pos": "num", "meaning": "3", "unit": "S1-U3-L2", "difficulty": 1}, "2": {"pos": "num", "meaning": "2", "unit": "S1-U3-L2", "difficulty": 1}, "pen": {"pos": "n", "meaning": "钢笔", "unit": "S1-U3-L3", "difficulty": 1}, "box": {"pos": "n", "meaning": "盒子", "unit": "S1-U3-L3", "difficulty": 1}, "4": {"pos": "num", "meaning": "4", "unit": "S1-U3-L3", "difficulty": 1}, "6": {"pos": "num", "meaning": "6", "unit": "S1-U3-L4", "difficulty": 1}, "5": {"pos": "num", "meaning": "5", "unit": "S1-U3-L4", "difficulty": 1}, "sing": {"pos": "v", "meaning": "唱", "unit": "S1-U4-L1", "difficulty": 1}, "eat": {"pos": "v", "meaning": "吃", "unit": "S1-U4-L2", "difficulty": 1}, "7": {"pos": "num", "meaning": "7", "unit": "S1-U4-L2", "difficulty": 1}, "rug": {"pos": "n", "meaning": "小地毯", "unit": "S1-U4-L3", "difficulty": 1}, "door": {"pos": "n", "meaning": " 门", "unit": "", "difficulty": 1}, "bed": {"pos": "n", "meaning": "床", "unit": "S1-U4-L3", "difficulty": 1}, "9": {"pos": "num", "meaning": "9", "unit": "S1-U4-L4", "difficulty": 1}, "8": {"pos": "num", "meaning": "8", "unit": "S1-U4-L4", "difficulty": 1}, "10": {"pos": "num", "meaning": "10", "unit": "S1-U4-L5", "difficulty": 1}, "zoo": {"pos": "n", "meaning": "动物园", "unit": "", "difficulty": 1}, "zebra": {"pos": "n", "meaning": "斑马", "unit": "S1-U7-L2", "difficulty": 1}, "young": {"pos": "adj", "meaning": "年轻的", "unit": "", "difficulty": 1}, "year": {"pos": "n", "meaning": "年", "unit": "", "difficulty": 1}, "write": {"pos": "v", "meaning": "写", "unit": "", "difficulty": 1}, "woman": {"pos": "n", "meaning": "女人", "unit": "S1-U5-L1", "difficulty": 1}, "window": {"pos": "n", "meaning": "窗户", "unit": "S1-U12-L4", "difficulty": 1}, "warm": {"pos": "adj", "meaning": "温暖的", "unit": "", "difficulty": 1}, "want": {"pos": "v", "meaning": "想要", "unit": "", "difficulty": 1}, "walk": {"pos": "v", "meaning": "走", "unit": "S1-U7-L2", "difficulty": 1}, "very": {"pos": "adv", "meaning": "非常", "unit": "", "difficulty": 1}, "under": {"pos": "prep", "meaning": "在...下面", "unit": "S2-U14-L5", "difficulty": 1}, "try": {"pos": "v", "meaning": "尝试", "unit": "S1-U12-L5", "difficulty": 1}, "tree": {"pos": "n", "meaning": "树", "unit": "S1-U7-L1", "difficulty": 1}, "train": {"pos": "n", "meaning": "火车", "unit": "S1-U8-L1", "difficulty": 1}, "too": {"pos": "adv", "meaning": "也", "unit": "S1-U12-L2", "difficulty": 1}, "tomorrow": {"pos": "n", "meaning": "明天", "unit": "", "difficulty": 1}, "today": {"pos": "n", "meaning": "今天", "unit": "", "difficulty": 1}, "tiger": {"pos": "n", "meaning": "老虎", "unit": "S1-U5-L3", "difficulty": 1}, "those": {"pos": "pron", "meaning": "那些", "unit": "S1-U12-L1", "difficulty": 1}, "this": {"pos": "pron", "meaning": "这个", "unit": "S1-U12-L1", "difficulty": 1}, "these": {"pos": "pron", "meaning": "这些", "unit": "S1-U12-L1", "difficulty": 1}, "that": {"pos": "pron", "meaning": "那个", "unit": "S1-U12-L1", "difficulty": 1}, "tell": {"pos": "v", "meaning": "告诉", "unit": "", "difficulty": 1}, "teacher": {"pos": "n", "meaning": "老师", "unit": "S2-U14-L2", "difficulty": 1}, "talk": {"pos": "v", "meaning": "说话", "unit": "", "difficulty": 1}, "swim": {"pos": "v", "meaning": "游泳", "unit": "S1-U11-L5", "difficulty": 1}, "sun": {"pos": "n", "meaning": "太阳", "unit": "S1-U8-L2", "difficulty": 1}, "study": {"pos": "v", "meaning": "学习", "unit": "S2-U14-L1", "difficulty": 1}, "student": {"pos": "n", "meaning": "学生", "unit": "S2-U14-L1", "difficulty": 1}, "speak": {"pos": "v", "meaning": "说", "unit": "", "difficulty": 1}, "some": {"pos": "det", "meaning": "一些", "unit": "", "difficulty": 1}, "sofa": {"pos": "n", "meaning": "沙发", "unit": "", "difficulty": 1}, "sock": {"pos": "n", "meaning": "袜子", "unit": "", "difficulty": 1}, "small": {"pos": "adj", "meaning": "小的", "unit": "S1-U9-L1", "difficulty": 1}, "sleep": {"pos": "v", "meaning": "睡觉", "unit": "S1-U7-L4", "difficulty": 1}, "skirt": {"pos": "n", "meaning": "裙子", "unit": "S1-U9-L4", "difficulty": 1}, "sit": {"pos": "v", "meaning": "坐下", "unit": "S1-U8-L1", "difficulty": 1}, "sister": {"pos": "n", "meaning": "姐姐、妹妹", "unit": "S1-U8-L1", "difficulty": 1}, "short": {"pos": "adj", "meaning": "短的", "unit": "", "difficulty": 1}, "shoe": {"pos": "n", "meaning": "鞋", "unit": "", "difficulty": 1}, "shirt": {"pos": "n", "meaning": "衬衫", "unit": "S1-U9-L1", "difficulty": 1}, "ship": {"pos": "n", "meaning": "船", "unit": "", "difficulty": 1}, "sheep": {"pos": "n", "meaning": "绵羊", "unit": "S1-U5-L3", "difficulty": 1}, "school": {"pos": "n", "meaning": "学校", "unit": "S2-U14-L1", "difficulty": 1}, "say": {"pos": "v", "meaning": "说", "unit": "", "difficulty": 1}, "sad": {"pos": "adj", "meaning": "悲伤的", "unit": "", "difficulty": 1}, "run": {"pos": "v", "meaning": "跑", "unit": "", "difficulty": 1}, "ruler": {"pos": "n", "meaning": "尺子", "unit": "", "difficulty": 1}, "room": {"pos": "n", "meaning": "房间", "unit": "", "difficulty": 1}, "rice": {"pos": "n", "meaning": "米饭", "unit": "S1-U6-L4", "difficulty": 1}, "read": {"pos": "v", "meaning": "阅读", "unit": "", "difficulty": 1}, "radio": {"pos": "n", "meaning": "收音机", "unit": "S1-U9-L2", "difficulty": 1}, "potato": {"pos": "n", "meaning": "土豆", "unit": "S1-U7-L3", "difficulty": 1}, "play": {"pos": "v", "meaning": "玩", "unit": "S2-U14-L1", "difficulty": 1}, "plane": {"pos": "n", "meaning": "飞机", "unit": "S1-U8-L3", "difficulty": 1}, "pig": {"pos": "n", "meaning": "猪", "unit": "S1-U7-L4", "difficulty": 1}, "phone": {"pos": "v", "meaning": "给…...打电话", "unit": "", "difficulty": 1}, "people": {"pos": "n", "meaning": "人", "unit": "", "difficulty": 1}, "pencil": {"pos": "n", "meaning": "铅笔", "unit": "", "difficulty": 1}, "pea": {"pos": "n", "meaning": "豌豆", "unit": "", "difficulty": 1}, "pe": {"pos": "n", "meaning": "体育", "unit": "S1-U10-L4", "difficulty": 1}, "paint": {"pos": "v", "meaning": "(用颜料)绘画", "unit": "", "difficulty": 1}, "one": {"pos": "pron", "meaning": "一个人(或物)", "unit": "", "difficulty": 1}, "old": {"pos": "adj", "meaning": "年老的", "unit": "", "difficulty": 1}, "now": {"pos": "adv", "meaning": "现在", "unit": "", "difficulty": 1}, "night": {"pos": "n", "meaning": "夜晚", "unit": "S1-U12-L5", "difficulty": 1}, "nice": {"pos": "adj", "meaning": "好的", "unit": "S1-U6-L3", "difficulty": 1}, "new": {"pos": "adj", "meaning": "新的", "unit": "S1-U9-L2", "difficulty": 1}, "mum": {"pos": "n", "meaning": "妈妈", "unit": "S1-U8-L4", "difficulty": 1}, "mouth": {"pos": "n", "meaning": "嘴巴", "unit": "", "difficulty": 1}, "mother": {"pos": "n", "meaning": "母亲", "unit": "", "difficulty": 1}, "morning": {"pos": "n", "meaning": "早上", "unit": "S1-U12-L5", "difficulty": 1}, "month": {"pos": "n", "meaning": "月", "unit": "", "difficulty": 1}, "monkey": {"pos": "n", "meaning": "猴子", "unit": "S1-U7-L1", "difficulty": 1}, "minute": {"pos": "n", "meaning": "分钟", "unit": "", "difficulty": 1}, "mine": {"pos": "pron", "meaning": "我的", "unit": "", "difficulty": 1}, "milk": {"pos": "n", "meaning": "牛奶", "unit": "S1-U5-L2", "difficulty": 1}, "men": {"pos": "n", "meaning": "男人man 的复数)", "unit": "", "difficulty": 1}, "meat": {"pos": "n", "meaning": "肉类", "unit": "S1-U10-L3", "difficulty": 1}, "me": {"pos": "pron", "meaning": "我", "unit": "S1-U12-L2", "difficulty": 1}, "mat": {"pos": "n", "meaning": "地垫", "unit": "S2-U14-L4", "difficulty": 1}, "many": {"pos": "det", "meaning": "许多", "unit": "", "difficulty": 1}, "man": {"pos": "n", "meaning": "男人", "unit": "S1-U5-L1", "difficulty": 1}, "make": {"pos": "v", "meaning": "制造", "unit": "S1-U6-L3", "difficulty": 1}, "love": {"pos": "v", "meaning": "爱", "unit": "S1-U12-L2", "difficulty": 1}, "lots of": {"pos": "det", "meaning": "大量的", "unit": "", "difficulty": 1}, "long": {"pos": "adj", "meaning": "长的", "unit": "S1-U7-L5 ", "difficulty": 1}},
L2: {"dentist": {"pos": "n", "meaning": "牙医", "cefr": "A1", "cambridge": "Movers", "difficulty": 2}, "department": {"pos": "n", "meaning": "部门", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "department store": {"pos": "n", "meaning": "百货商店", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "describe": {"pos": "v", "meaning": "描述", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "desert": {"pos": "v", "meaning": "遗弃", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "design": {"pos": "v", "meaning": "设计", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "dessert": {"pos": "n", "meaning": "甜点", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "detailed": {"pos": "adj", "meaning": "详细的", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "diary": {"pos": "n", "meaning": "日记", "cefr": "A2", "cambridge": "KET/Flyers", "difficulty": 2}, "dictionary": {"pos": "n", "meaning": "词典", "cefr": "A2", "cambridge": "KET/Flyers", "difficulty": 2}, "die": {"pos": "v", "meaning": "消失;灭亡", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "difference": {"pos": "n", "meaning": "差别", "cefr": "A1", "cambridge": "Movers", "difficulty": 2}, "different": {"pos": "adj", "meaning": "不同的", "cefr": "A1", "cambridge": "Movers", "difficulty": 2}, "difficult": {"pos": "adj", "meaning": "困难的", "cefr": "A1", "cambridge": "Movers", "difficulty": 2}, "digital": {"pos": "adj", "meaning": "数字的", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "digital camera": {"pos": "n", "meaning": "数码相机", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "dinosaur": {"pos": "n", "meaning": "恐龙", "cefr": "A2", "cambridge": "KET/Flyers", "difficulty": 2}, "diploma": {"pos": "n", "meaning": "文凭", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "directions": {"pos": "n", "meaning": "方向", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "dirty": {"pos": "adj", "meaning": "脏的", "cefr": "Pre-A1", "cambridge": "Starters", "difficulty": 2}, "disco": {"pos": "n", "meaning": "迪斯科", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "discount": {"pos": "n", "meaning": "折扣", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "discover": {"pos": "v", "meaning": "发现", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "discuss": {"pos": "vt", "meaning": "讨论", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "dish": {"pos": "n", "meaning": "菜肴", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "display": {"pos": "v", "meaning": "显示", "cefr": "B1", "cambridge": "PET", "difficulty": 2}, "dive": {"pos": "v", "meaning": "潜水", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "diving": {"pos": "n", "meaning": "潜水", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "doctor": {"pos": "n", "meaning": "医生", "cefr": "A1", "cambridge": "Movers", "difficulty": 2}, "document": {"pos": "n", "meaning": "文件", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "dollar": {"pos": "n", "meaning": "美元", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "dot": {"pos": "n", "meaning": "点", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "double": {"pos": "v", "meaning": "使加倍", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "double room": {"pos": "phrase", "meaning": "双人间", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "doubt": {"pos": "v", "meaning": "怀疑", "cefr": "B1", "cambridge": "PET", "difficulty": 2}, "download": {"pos": "v", "meaning": "下载", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "downstairs": {"pos": "adj", "meaning": "楼下的", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "dozen": {"pos": "det", "meaning": "十二", "cefr": "B1", "cambridge": "PET", "difficulty": 2}, "draw": {"pos": "n", "meaning": "抽签", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "drawer": {"pos": "n", "meaning": "抽屉", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "dream": {"pos": "v", "meaning": "梦想", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "dress": {"pos": "v", "meaning": "穿衣服", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "dressed": {"pos": "adj", "meaning": "穿着衣服的", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "drive": {"pos": "v", "meaning": "驾车送(人)", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "driving licence": {"pos": "n", "meaning": "驾驶执照", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "drop": {"pos": "n", "meaning": "滴", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "drugstore": {"pos": "n", "meaning": "药店", "cefr": "A2", "cambridge": "KET", "difficulty": 2}, "drum": {"pos": "n", "meaning": "鼓", "cefr": "A2", "cambridge": "KET/Flyers", "difficulty": 2}, "dry": {"pos": "v", "meaning": "变干", "cefr": "A1", "cambridge": "Movers", "difficulty": 2}, "during": {"pos": "prep", "meaning": "在……期间", "cefr": "A2", "cambridge": "KET/Flyers", "difficulty": 2}, "duty-free": {"pos": "adj", "meaning": "免税的", "cefr": "B1", "cambridge": "PET", "difficulty": 2}, "dvd player": {"pos": "n", "meaning": "DVD播放机", "cefr": "A2", "cambridge": "KET", "difficulty": 2}}
};
var PATTERNS = {
L1: [{"structure": "be + adj", "module": "形容词结构", "module_id": "M1", "examples": ["I am happy today.", "I am sad today."], "meaning": ["今天我很开心。", "今天我很难过。"]}, {"structure": "feel + adj", "module": "系表结构", "module_id": "M1", "examples": ["I feel tired.", "I feel happy."], "meaning": ["我感到累。", "我感到开心。"]}, {"structure": "look + adj", "module": "系表结构", "module_id": "M1", "examples": ["You look happy.", "He looks tired."], "meaning": ["你看起来很高兴。", "他看起来累了。"]}, {"structure": "adj and adj", "module": "并列形容词", "module_id": "M1", "examples": ["The room is big and clean.", "The dog is small and cute."], "meaning": ["房间又大又干净。", "这只狗又小又可爱。"]}, {"structure": "S + V", "module": "动词与时态", "module_id": "M2", "examples": ["I read books.", "We go to school."], "meaning": ["我读书。", "我们去上学。"]}, {"structure": "S + be + V-ing", "module": "动词与时态", "module_id": "M2", "examples": ["I am reading now.", "She is cooking."], "meaning": ["我正在读书。", "她在做饭。"]}, {"structure": "do/does + V", "module": "动词与时态", "module_id": "M2", "examples": ["Do you like apples?", "Does he like milk?"], "meaning": ["你喜欢苹果吗?", "他喜欢牛奶吗?"]}, {"structure": "can + V", "module": "动词与时态", "module_id": "M2", "examples": ["I can swim.", "She can sing."], "meaning": ["我会游泳。", "她会唱歌。"]}],
L2: [{"structure": "be + adj", "module": "形容词结构", "module_id": "M1", "example": "I am happy today because the sun is shining.", "meaning": "今天我很开心,因为阳光灿烂。"}, {"structure": "feel/look + adj", "module": "系表结构", "module_id": "M1", "example": "I feel nervous before my first day of school.", "meaning": "开学第一天前,我感到有些紧张。"}, {"structure": "look + adj", "module": "系表结构", "module_id": "M1", "example": "He looks friendly, and he always says hello to everyone.", "meaning": "他看起来很友好,而且总是主动跟每个人打招呼。"}, {"structure": "adj and adj", "module": "并列形容词", "module_id": "M1", "example": "She has a nice and friendly dog.", "meaning": "她有一只温顺友好的狗。"}, {"structure": "Something doesnt feel right.", "module": "感觉异常", "module_id": "M1", "example": "Something doesnt feel right with my phone.", "meaning": "我的手机有点不太对劲。"}, {"structure": "This looks ..., but Ill try my best.", "module": "状态对比", "module_id": "M1", "example": "This looks difficult, but Ill try my best.", "meaning": "这看起来很难,但我会尽力而为。"}, {"structure": "You look ... now.", "module": "感觉状态", "module_id": "M1", "example": "You look happy now.", "meaning": "你现在看起来很开心。"}, {"structure": "The ice is too ... so we cant ...", "module": "困难描述", "module_id": "M1", "example": "The ice is too thin so we can't skate on it.", "meaning": "冰面太薄了,我们不能在上面滑冰。"}, {"structure": "How are you feeling today?", "module": "be + adj 描述", "module_id": "M1", "example": "How are you feeling today? \nYou look happy!", "meaning": "你今天感觉怎么样? \n你看起来挺开心的"}, {"structure": "Im feeling ... today.", "module": "be + adj 描述", "module_id": "M1", "example": "I'm feeling tired today.", "meaning": "今天我感觉有点累。"}, {"structure": "Its very ... outside today.", "module": "be + adj 描述", "module_id": "M1", "example": "It's very cold outside today.", "meaning": "今天外面非常冷。"}, {"structure": "You look ... in this picture.", "module": "be + adj 描述", "module_id": "M1", "example": "You look happy in this picture.", "meaning": "在这张照片里,你看起来很开心。"}, {"structure": "My room is always ... and ....", "module": "be + adj 描述", "module_id": "M1", "example": "My room is always warm and cozy.", "meaning": "我的房间总是温暖又舒适。"}, {"structure": "The movie was really ....", "module": "be + adj 描述", "module_id": "M1", "example": "The movie was really funny.", "meaning": "这部电影真是太好笑了。"}, {"structure": "Our teacher is very ....", "module": "be + adj 描述", "module_id": "M1", "example": "Our teacher is very patient.", "meaning": "我们的老师非常有耐心。"}, {"structure": "This bag is too ....", "module": "be + adj 描述", "module_id": "M1", "example": "This bag is too small for all my books.", "meaning": "这个包装不下我所有的书。"}, {"structure": "Are you sure this is ....?", "module": "be + adj 描述", "module_id": "M1", "example": "Are you sure this is warm enough?", "meaning": "你确定这够暖和吗?"}, {"structure": "Im not sure if its ....", "module": "be + adj 描述", "module_id": "M1", "example": "Im not sure if its warm enough to swim today.", "meaning": "今天不太确定水温是否适合游泳。"}, {"structure": "What colour is ...?", "module": "be + adj 描述", "module_id": "M1", "example": "What color is your new school uniform?", "meaning": "你的新校服是什么颜色的?"}, {"structure": "Its ...", "module": "be + adj 描述", "module_id": "M1", "example": "It's sunny today.", "meaning": "今天天气晴朗。"}, {"structure": "Are you tired?", "module": "be + adj 描述", "module_id": "M1", "example": "Are you hungry after playing?", "meaning": "玩完之后你饿了吗?"}, {"structure": "Yes, Im a bit ....", "module": "be + adj 描述", "module_id": "M1", "example": "Yes, Im a bit nervous about my first day at school.", "meaning": "是的,我对开学第一天有点紧张。"}, {"structure": "No, Im not ....", "module": "be + adj 描述", "module_id": "M1", "example": "No, I'm not tired.", "meaning": "不,我不累。"}, {"structure": "Its so ... today!", "module": "be + adj 描述", "module_id": "M1", "example": "It's so sunny today!", "meaning": "今天阳光真好啊!"}, {"structure": "This looks ....", "module": "be + adj 描述", "module_id": "M1", "example": "This looks delicious.", "meaning": "这看起来很好吃。"}, {"structure": "Youre very ....", "module": "be + adj 描述", "module_id": "M1", "example": "You're very kind.", "meaning": "你真是太好了。"}, {"structure": "Hows the weather today?", "module": "be + adj 描述", "module_id": "M1", "example": "Hows the weather today? \nIt's sunny and warm.", "meaning": "今天天气怎么样? \n阳光很好也很暖和。"}, {"structure": "Its ... today.", "module": "be + adj 描述", "module_id": "M1", "example": "It's sunny today.", "meaning": "今天天气晴朗。"}, {"structure": "Is it hot or cold?", "module": "be + adj 描述", "module_id": "M1", "example": "Is it hot or cold?", "meaning": "是热还是冷?"}, {"structure": "Its not very ....", "module": "be + adj 描述", "module_id": "M1", "example": "It's not very expensive.", "meaning": "{中文翻译}\n这个不是很贵。"}, {"structure": "The sky is so ....", "module": "be + adj 描述", "module_id": "M1", "example": "The sky is so blue today.", "meaning": "今天天空真蓝。"}, {"structure": "Everything looks....", "module": "be + adj 描述", "module_id": "M1", "example": "Everything looks tidy.", "meaning": "一切看起来都井井有条。"}, {"structure": "The view is really ....", "module": "be + adj 描述", "module_id": "M1", "example": "The view is really beautiful.", "meaning": "景色真是太美了。"}, {"structure": "That was very ....", "module": "be + adj 描述", "module_id": "M1", "example": "That was very interesting.", "meaning": "那可真有意思。"}, {"structure": "You seem ....", "module": "be + adj 描述", "module_id": "M1", "example": "You seem tired this morning.", "meaning": "今天早上你看起来有点累。"}, {"structure": "Thats really ...!", "module": "be + adj 描述", "module_id": "M1", "example": "Thats really amazing!", "meaning": "这真是太棒了!"}, {"structure": "The story is very ....", "module": "be + adj 描述", "module_id": "M1", "example": "The story is very exciting.", "meaning": "这个故事非常扣人心弦。"}, {"structure": "My parents are both ....", "module": "be + adj 描述", "module_id": "M1", "example": "My parents are both very busy on weekdays.", "meaning": "我父母在工作日都非常忙。"}, {"structure": "Im afraid its ....", "module": "be + adj 描述", "module_id": "M1", "example": "Im afraid its too cold.", "meaning": "恐怕天气太冷了。"}, {"structure": "Its difficult to ....", "module": "be + adj 描述", "module_id": "M1", "example": "It's difficult to find a good restaurant.", "meaning": "很难找到一家好餐馆。"}, {"structure": "Its strange that ....", "module": "be + adj 描述", "module_id": "M1", "example": "It's strange that the cat is sleeping so much today.", "meaning": "今天这只猫睡得这么多,真是奇怪。"}, {"structure": "The food smells....", "module": "be + adj 描述", "module_id": "M1", "example": "The food smells wonderful.", "meaning": "这食物闻起来真香。"}, {"structure": "-er than", "module": "比较级", "module_id": "M2", "example": "He is taller than me, but I run faster than him.", "meaning": "他比我高,但我跑得比他快。"}, {"structure": "What did you do yesterday?", "module": "动词与时态", "module_id": "M2", "example": "What did you do yesterday? I watched a movie with my family.", "meaning": "你昨天干什么了?我和家人一起看了场电影。"}, {"structure": "I ... yesterday.", "module": "动词与时态", "module_id": "M2", "example": "I called my grandmother yesterday.", "meaning": "昨天我给奶奶打了个电话。"}, {"structure": "What are you doing now?", "module": "动词与时态", "module_id": "M2", "example": "What are you doing now? \nI am helping my mom cook dinner.", "meaning": "你现在在做什么? \n我正在帮我妈妈做晚饭。"}, {"structure": "Im ... now.", "module": "动词与时态", "module_id": "M2", "example": "I'm eating lunch now.", "meaning": "我正在吃午饭。"}, {"structure": "What will you do tomorrow?", "module": "动词与时态", "module_id": "M2", "example": "What will you do tomorrow?", "meaning": "你明天打算做什么?"}]
};
var BRITISH_SPELLING_MAP = {"color": "colour", "colors": "colours", "colored": "coloured", "coloring": "colouring", "favorite": "favourite", "favorites": "favourites", "center": "centre", "centers": "centres", "centered": "centred", "meter": "metre", "meters": "metres", "theater": "theatre", "theaters": "theatres", "traveling": "travelling", "traveled": "travelled", "traveler": "traveller", "canceled": "cancelled", "canceling": "cancelling", "jewelry": "jewellery", "organize": "organise", "organizes": "organises", "organized": "organised", "organizing": "organising", "realize": "realise", "realizes": "realises", "realized": "realised", "realizing": "realising", "recognize": "recognise", "recognizes": "recognises", "recognized": "recognised", "recognizing": "recognising", "apologize": "apologise", "apologizes": "apologises", "apologized": "apologised", "license": "licence", "defense": "defence", "offense": "offence", "pretense": "pretence", "dialog": "dialogue", "catalog": "catalogue", "analog": "analogue", "neighbor": "neighbour", "neighbors": "neighbours", "neighborhood": "neighbourhood", "honor": "honour", "honors": "honours", "honored": "honoured", "humor": "humour", "labor": "labour", "flavor": "flavour", "flavors": "flavours", "behavior": "behaviour", "behaviors": "behaviours", "rumor": "rumour", "program": "programme", "check": "cheque", "gray": "grey", "tire": "tyre", "tires": "tyres", "mold": "mould", "plow": "plough", "aluminum": "aluminium", "sulfur": "sulphur", "mom": "mum", "mommy": "mummy", "soccer": "football", "vacation": "holiday", "vacations": "holidays", "elevator": "lift", "elevators": "lifts", "apartment": "flat", "apartments": "flats", "trash": "rubbish", "garbage": "rubbish", "cookie": "biscuit", "cookies": "biscuits", "candy": "sweet", "candies": "sweets", "faucet": "tap", "faucets": "taps", "sidewalk": "pavement", "sidewalks": "pavements", "sneakers": "trainers", "pants": "trousers", "eraser": "rubber", "erasers": "rubbers", "fall": "autumn", "pajamas": "pyjamas", "highway": "motorway", "highways": "motorways", "railroad": "railway", "airplane": "aeroplane", "airplanes": "aeroplanes", "movie": "film", "movies": "films", "schedule": "timetable", "schedules": "timetables", "yard": "garden", "yards": "gardens", "cell phone": "mobile phone", "cell phones": "mobile phones", "gas": "petrol", "gas station": "petrol station", "mail": "post", "mailbox": "postbox", "mailman": "postman", "intersection": "crossroads", "intersections": "crossroads", "popsicle": "ice lolly", "popsicles": "ice lollies", "french fries": "chips", "eggplant": "aubergine", "zucchini": "courgette", "cilantro": "coriander", "rutabaga": "swede"};
var NEGATIVE_SELF_REGEX = ["i\\s*(?:'m|am)\\s+not\\s+good\\s+at", "i\\s*(?:'m|am)\\s+(?:so\\s+)?(?:bad|terrible|awful|stupid|dumb|ugly|fat|useless|hopeless)", "i\\s+(?:can't|cannot)\\s+do\\s+(?:it|this|that|anything)", "i\\s+(?:hate|dislike)\\s+(?:myself|me)", "i\\s*(?:'m|am)\\s+(?:too|so)\\s+(?:slow|dumb|stupid|weak)", "nobody\\s+(?:likes|loves)\\s+me", "i\\s*(?:'m|am)\\s+(?:never|always)\\s+(?:wrong|bad)"];
var TYPE_STAGE_RULES = {
listening_drag: ['L1'],
listening_choicePic: ['L1'],
listening_tableCloze: ['L2'],
listening_choiceLong: ['L2'],
listening_choiceShort: ['L2'],
listening_matchInfo: ['L2'],
reading_pic_judge: ['L1','L2'],
reading_pic_qa: ['L1','L2'],
reading_matchInfo: ['L2'],
reading_matchPara: ['L2'],
reading_choiceLong: ['L2'],
reading_cloze: ['L2'],
reading_openCloze: ['L2'],
writing_pic_qa: ['L1','L2'],
writing_email: ['L2'],
writing_picWrite: ['L2'],
speaking_pic_qa: ['L1'],
speaking_pic_recognize: ['L1'],
speaking_qa: ['L1','L2'],
speaking_topic: ['L2']
};
var TYPE_ALIASES = {
'核心听力选择': 'listening_choicePic', '核心听力拖拽': 'listening_drag',
'听力拖拽': 'listening_drag', '听力选择': 'listening_choicePic', '听力选图': 'listening_choicePic',
'听音选图': 'listening_choicePic', '听力长对话': 'listening_choiceLong',
'听力短对话': 'listening_choiceShort', '听力信息匹配': 'listening_matchInfo',
'听力表格填空': 'listening_tableCloze', '听力填空': 'listening_tableCloze',
'阅读单选': 'reading_choiceLong', '阅读判断': 'reading_pic_judge',
'看图判断': 'reading_pic_judge', '看图回答': 'reading_pic_qa',
'阅读信息匹配': 'reading_matchInfo', '阅读段落匹配': 'reading_matchPara',
'阅读完形': 'reading_cloze', '阅读开放填空': 'reading_openCloze',
'写作看图': 'writing_pic_qa', '写作邮件': 'writing_email',
'口语日常': 'speaking_qa', '口语看图': 'speaking_pic_qa',
'口语话题': 'speaking_topic', '口语识物': 'speaking_pic_recognize',
'中对话跟读': 'speaking_qa', '中对话朗读': 'speaking_qa',
'中对话选读': 'listening_choiceShort', '中对话选义': 'listening_choiceShort',
'中对话挖空': 'reading_cloze', '中对话组句': 'reading_cloze',
'中对话选图': 'listening_choicePic', '中对话练习': 'listening_choiceShort',
'中对话口语': 'speaking_qa', '中对话听选': 'listening_choiceShort',
'选词补句': 'reading_cloze', '选词填空': 'reading_cloze',
'图片单选': 'reading_pic_judge', '图片多选': 'reading_pic_judge',
'选词排序': 'reading_cloze', '跟读判断': 'speaking_qa',
'朗读练习': 'speaking_qa', '选图填空': 'listening_choicePic',
'中图片单选': 'reading_pic_judge', '中选图单选': 'listening_choicePic',
'中跟读': 'speaking_qa', '中跟读练习': 'speaking_qa'
};
var RULES = {
dialog: { maxWordsPerSentence: 8, maxWordsCoreSentence: 7, warnWordsPerSentence: 10 },
textFormat: { allowMarkdown: false },
vocabulary: { allowL2WordsInL1: false },
spelling: { preferBritish: true }
};
// ── Utils ──
function extractWords(text) {
if (!text) return [];
return text.toLowerCase().replace(/[^a-z\s'-]/g, ' ').split(/\s+/).filter(function(w) { return w.length > 1; });
}
function normalizeType(name) {
if (!name) return '';
var clean = name.trim();
return TYPE_ALIASES[clean] || clean.toLowerCase().replace(/\s+/g, '_');
}
// ── 1. Vocabulary check ──
function checkVocabulary(content, prefix) {
var issues = [];
var words = (content && content.keyPreview) || [];
var level = (prefix || 'L1').toUpperCase();
var allowed = level === 'L1' ? WORD_LISTS.L1 : Object.assign({}, WORD_LISTS.L1, WORD_LISTS.L2);
words.forEach(function(raw) {
var w = (raw || '').toLowerCase().trim();
if (!w) return;
if (allowed[w]) {
var info = allowed[w];
issues.push({ level: 'good', word: w, message: '"' + w + '" 在' + level + '词库内 (' + info.pos + ' ' + info.meaning + ')', detail: info });
} else {
issues.push({ level: 'danger', word: w, message: '"' + w + '" 不在' + level + '词库中,疑似超纲词汇', detail: null });
}
});
var failCount = issues.filter(function(i) { return i.level === 'danger'; }).length;
return {
title: '词汇超纲检测',
issues: issues,
passCount: issues.length - failCount,
failCount: failCount,
summary: issues.length === 0 ? '未检测到目标词汇'
: failCount === 0 ? '全部 ' + issues.length + ' 个目标词汇均在词库范围内'
: failCount + ' 个词汇疑似超纲 / ' + issues.length + ' 个目标词汇'
};
}
// ── 2. British spelling ──
function checkBritishSpelling(texts) {
var issues = [];
var allText = (texts || []).filter(Boolean).join(' ');
var words = extractWords(allText);
var seen = {};
words.forEach(function(w) {
var lowered = w.toLowerCase();
if (seen[lowered]) return;
if (BRITISH_SPELLING_MAP[lowered]) {
seen[lowered] = true;
issues.push({ level: 'warn', word: w, suggested: BRITISH_SPELLING_MAP[lowered],
message: '"' + w + '" 为美式拼写,建议改为英式 "' + BRITISH_SPELLING_MAP[lowered] + '"' });
}
});
return {
title: '英式拼写检测',
issues: issues, passCount: 0, failCount: issues.length,
summary: issues.length === 0 ? '未检测到美式拼写' : '发现 ' + issues.length + ' 处美式拼写'
};
}
// ── 3. Markdown detection ──
function checkMarkdownUsage(texts) {
var issues = [];
var text = (texts || []).filter(Boolean).join('\n');
var mdPat = /\*\*|__|`[^`]+`|^#{1,6}\s|^\s*[-*+]\s|^\s*\d+\.\s|\*[^*]+\*|_[^_]+_/gm;
var match;
while ((match = mdPat.exec(text)) !== null) {
var start = Math.max(0, match.index - 20);
var end = Math.min(text.length, match.index + 40);
issues.push({ level: 'warn', mark: match[0],
context: '...' + text.substring(start, end).replace(/\n/g, ' ') + '...',
message: '检测到 Markdown 标记 "' + match[0] + '",应移除(文本输出禁止 Markdown',
position: match.index });
}
return { title: 'Markdown格式检测', issues: issues, passCount: 0, failCount: issues.length,
summary: issues.length === 0 ? '未检测到 Markdown 标记' : '发现 ' + issues.length + ' 处 Markdown 标记' };
}
// ── 4. Punctuation ──
function checkPunctuation(texts) {
var issues = [];
(texts || []).filter(Boolean).forEach(function(text) {
var cnMatch = text.match(/[\u3001\u3002\uff0c\uff1b\uff1a\u201c\u201d\u2018\u2019\uff01\uff08\uff09\u300a\u300b]/g);
if (cnMatch) {
issues.push({ level: 'warn', text: text.substring(0, 60), found: cnMatch,
message: '文本包含中文标点(英文内容应使用半角标点)' });
}
if (//.test(text)) issues.push({ level: 'warn', text: text, message: '检测到非标准标点 "",应使用标准英文标点' });
if (/!!!|\?\?\?|!!\?|\?!!/.test(text)) issues.push({ level: 'warn', text: text, message: '检测到连续感叹号/问号,应使用标准英文标点' });
});
return { title: '标点符号规范', issues: issues, passCount: 0, failCount: issues.length,
summary: issues.length === 0 ? '标点符号使用规范' : '发现 ' + issues.length + ' 处标点符号不规范' };
}
// ── 5. Type-stage match ──
function checkTypeMatch(name, prefix) {
var level = (prefix || 'L1').toUpperCase();
var normalized = normalizeType(name);
var allowed = TYPE_STAGE_RULES[normalized];
if (!allowed) {
return { title: '题型-阶段匹配', resolvedType: normalized, isUnknown: true,
message: '组件类型 "' + name + '" 未在已知题型表中匹配,无法校验阶段归属' };
}
if (allowed.indexOf(level) >= 0) {
return { title: '题型-阶段匹配', resolvedType: normalized, allowedStages: allowed, isMatch: true,
message: '题型 "' + name + '" -> ' + normalized + ' 在 ' + level + ' 阶段允许' };
}
return { title: '题型-阶段匹配', resolvedType: normalized, allowedStages: allowed, isMatch: false,
message: '题型 "' + name + '" -> ' + normalized + ' 仅允许 ' + allowed.join(', ') + '' + level + ' 不允许!' };
}
// ── 6. Dialog quality ──
function checkDialogQuality(lines, prefix) {
var issues = [];
var isL1 = (prefix || 'L1').toUpperCase() === 'L1';
var maxWords = isL1 ? 7 : RULES.dialog.maxWordsPerSentence;
var warnWords = RULES.dialog.warnWordsPerSentence;
(lines || []).filter(Boolean).forEach(function(line) {
var text = (line.text || line.content || line.sentence || line.dialog || '').trim();
if (!text) return;
var wc = text.split(/\s+/).length;
if (wc > warnWords) {
issues.push({ level: 'danger', text: text, wordCount: wc,
message: '台词 ' + wc + ' 词,超过 ' + warnWords + ' 词上限,建议拆分为 2-3 个短句' });
} else if (wc > maxWords) {
issues.push({ level: 'warn', text: text, wordCount: wc,
message: '台词 ' + wc + ' 词,超过 ' + maxWords + ' 词建议上限' });
}
for (var j = 0; j < NEGATIVE_SELF_REGEX.length; j++) {
if (new RegExp(NEGATIVE_SELF_REGEX[j], 'i').test(text)) {
issues.push({ level: 'danger', text: text,
message: '台词含负面自我评价,违反价值观导向规范,应替换为正向表达' });
break;
}
}
});
return { title: '对话台词质量', issues: issues, passCount: lines.length - issues.length, failCount: issues.length,
summary: issues.length === 0 ? lines.length + ' 句台词均符合质量标准' : issues.length + ' 项质量问题' };
}
// ── 7. Key exposure ──
function checkKeyExposure(targets, allDialogText) {
var issues = [];
var dialogLower = (allDialogText || '').toLowerCase();
(targets || []).filter(Boolean).forEach(function(w) {
var lowered = w.toLowerCase().replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
var count = (dialogLower.match(new RegExp('\\b' + lowered + '\\b', 'g')) || []).length;
if (count === 0) {
issues.push({ level: 'danger', word: w, message: '目标词 "' + w + '" 在台词中未出现,知识点零暴露' });
} else if (count === 1) {
issues.push({ level: 'warn', word: w, count: count, message: '目标词 "' + w + '" 仅在台词中出现 1 次,暴露不充分' });
} else {
issues.push({ level: 'good', word: w, count: count, message: '"' + w + '" 出现 ' + count + ' 次,曝光充分' });
}
});
var passCnt = issues.filter(function(i) { return i.level === 'good'; }).length;
return { title: '知识点曝光度', issues: issues, passCount: passCnt, failCount: issues.length - passCnt,
summary: passCnt === issues.length ? '全部 ' + issues.length + ' 个知识点曝光充分' : (issues.length - passCnt) + ' 个知识点曝光不足' };
}
// ── 8. Pattern compliance ──
function checkPatternCompliance(sentences, prefix) {
var issues = [];
var level = (prefix || 'L1').toUpperCase();
var allPatterns = level === 'L1' ? PATTERNS.L1 : PATTERNS.L1.concat(PATTERNS.L2);
var toCheck = (sentences || []).filter(Boolean).slice(0, 10);
toCheck.forEach(function(sentence) {
var lowered = sentence.toLowerCase();
var matched = false;
for (var p = 0; p < allPatterns.length; p++) {
var pat = allPatterns[p];
var struct = pat.structure.toLowerCase();
var keywords = struct.replace(/[^a-z\s]/g, ' ').split(/\s+/).filter(function(k) { return k.length > 2; });
var matchedKw = keywords.filter(function(kw) { return lowered.indexOf(kw) >= 0; });
if (matchedKw.length >= Math.ceil(keywords.length * 0.5) && keywords.length >= 2) {
matched = true;
issues.push({ level: 'good', sentence: sentence.substring(0, 80), pattern: pat.structure, module: pat.module,
message: '句型近似匹配到 "' + pat.structure + '" (' + pat.module + ')' });
break;
}
}
if (!matched) {
issues.push({ level: 'info', sentence: sentence.substring(0, 80),
message: '句子未在' + level + '句型库中匹配到已知结构' });
}
});
return { title: '句型合规检测', issues: issues, passCount: issues.filter(function(i) { return i.level === 'good'; }).length,
failCount: issues.filter(function(i) { return i.level !== 'good'; }).length,
summary: issues.length === 0 ? '未检测到待校验句型' : '完成句型合规检查' };
}
// ── Main API ──
function validate(content, prefix) {
var level = (prefix || 'L1').toUpperCase();
var allTexts = [];
var allDialogs = [];
if (content.realContent) {
var rc = content.realContent;
[rc.dialogs, rc.targets, rc.questions, rc.learning, rc.feedback].forEach(function(arr) {
if (Array.isArray(arr)) { allDialogs.push.apply(allDialogs, arr); allTexts.push.apply(allTexts, arr); }
else if (arr) { allDialogs.push(arr); allTexts.push(arr); }
});
}
var dialogLines = allDialogs.map(function(text) { return { text: text, isPoint: false }; });
var results = [];
var vr = checkVocabulary(content, level);
if (vr.issues.length > 0) results.push(vr);
var sr = checkBritishSpelling(allTexts);
if (sr.issues.length > 0) results.push(sr);
var mr = checkMarkdownUsage(allTexts);
if (mr.issues.length > 0) results.push(mr);
var pr = checkPunctuation(allTexts);
if (pr.issues.length > 0) results.push(pr);
if (dialogLines.length > 0) { results.push(checkDialogQuality(dialogLines, level)); }
var targets = content.keyPreview || [];
var dialogText = allDialogs.join(' ');
if (targets.length > 0 && dialogText) { results.push(checkKeyExposure(targets, dialogText)); }
if (allDialogs.length > 0) { results.push(checkPatternCompliance(allDialogs, level)); }
var totalIssues = results.reduce(function(sum, r) { return sum + r.issues.length; }, 0);
var dangerCount = results.reduce(function(sum, r) { return sum + r.issues.filter(function(i) { return i.level === 'danger'; }).length; }, 0);
var warnCount = results.reduce(function(sum, r) { return sum + r.issues.filter(function(i) { return i.level === 'warn'; }).length; }, 0);
return {
level: level, timestamp: new Date().toISOString(),
totalChecks: results.length, totalIssues: totalIssues, dangerCount: dangerCount, warnCount: warnCount,
results: results,
summary: totalIssues === 0 ? '内容校验通过' : (dangerCount > 0 ? dangerCount + ' 项严重问题,' + warnCount + ' 项警告' : warnCount + ' 项可优化项')
};
}
// ── Export ──
global.PedagogyRules = {
VERSION: '1.0.0',
validate: validate,
checkTypeMatch: checkTypeMatch,
checkVocabulary: checkVocabulary,
checkBritishSpelling: checkBritishSpelling,
checkMarkdownUsage: checkMarkdownUsage,
checkPunctuation: checkPunctuation,
checkDialogQuality: checkDialogQuality,
checkKeyExposure: checkKeyExposure,
checkPatternCompliance: checkPatternCompliance,
WORD_LISTS: WORD_LISTS, PATTERNS: PATTERNS, TYPE_STAGE_RULES: TYPE_STAGE_RULES,
BRITISH_SPELLING_MAP: BRITISH_SPELLING_MAP, RULES: RULES
};
console.log('[PedagogyRules] v1.0.0 | L1 words:' + Object.keys(WORD_LISTS.L1).length +
' L2 words:' + Object.keys(WORD_LISTS.L2).length + ' L1 patterns:' + PATTERNS.L1.length +
' L2 patterns:' + PATTERNS.L2.length + ' Type rules:' + Object.keys(TYPE_STAGE_RULES).length +
' British:' + Object.keys(BRITISH_SPELLING_MAP).length);
})(typeof window !== 'undefined' ? window : this);