From 1277bfdbd490104446f09048869808c941f6e1fe Mon Sep 17 00:00:00 2001 From: "weiye.wang" Date: Thu, 22 Jun 2023 22:02:40 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=A7=E7=BB=AD=E4=B8=B0=E5=AF=8Cdatabase=20?= =?UTF-8?q?tools?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 工具/database_tools.py | 49 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 3 deletions(-) diff --git a/工具/database_tools.py b/工具/database_tools.py index b7f1ab5f..2220932f 100644 --- a/工具/database_tools.py +++ b/工具/database_tools.py @@ -113,9 +113,8 @@ def extractIDs(filePath): #提取.txt,.tex或.pdf文件中的题号, 返回含 return generate_exp(ids) -def spareIDs(filename): #返回空闲题号 - pro_dict = load_dict(filename) - idlist = list(pro_dict.keys()) +def spareIDs(dictname): #返回空闲题号 + idlist = list(dictname.keys()) used_str = generate_exp(idlist) used_list = used_str.split(",") output = "" @@ -140,6 +139,50 @@ def parse_usage(datastring): #对单个usages中的项的结果进行分词 return({"date":date,"classname":classname,"difficulty":diff}) #返回一个字典, "date"表示日期, "classname"表示班级, "difficultiy"表示难度列表 +def GenerateProblemListFromString(data): #从来自.tex文件的字符串生成题目列表, 每个item是一道题目, 新一行的%用作前缀 + try: + data = re.findall(r"\\begin\{document\}([\s\S]*?)\\end\{document\}",data)[0] + except: + pass + data = re.sub(r"\n{2,}","\n",data) + data = re.sub(r"\\item",r"\\enditem\\item",data) + data = re.sub(r"\\end\{enumerate\}",r"\\enditem",data) #切除无关信息, 保留关键信息 + problempositions = [] + for item in re.finditer(r"\\item([\s\S]*?)\\enditem",data): + problempositions.append(item.regs[1]) #确定题目内容所在位置 + problem_list = [] + for pos in problempositions: + content = data[pos[0]:pos[1]].strip() + content = re.sub(r"\n\%[\s\S]*$","",content) #题目内容 + subdata = data[:pos[0]] #开始寻找出处中缀 + suflist = re.findall(r"\n(\%\s{0,}[\S]+)\n",subdata) + if len(suflist) == 0: + suffix = "" + else: + suffix = suflist[-1].replace("%","").strip() + problem_list.append((content,suffix)) + return problem_list #返回一个列表, 每一项是一个由 题目内容 和 题目来源前缀 组成的元组 + + +def CreateEmptyProblem(problem): # 根据已有的题目创建新的空题目 + NewProblem = problem.copy() + for field in NewProblem: + if type(NewProblem[field]) == str: + NewProblem[field] = "" + elif type(NewProblem[field]) == list: + NewProblem[field] = [] + elif type(NewProblem[field]) == int or type(NewProblem[field]) == float: + NewProblem[field] = -1 + return NewProblem #返回一个空题目的字典, ID和内容待赋值 + +# 创建新题目 +def CreateNewProblem(id,content,origin,dict,editor): # 构建一道新题目的字典 + NewProblem = CreateEmptyProblem(dict["000001"]) + NewProblem["id"] = str(id).zfill(6) + NewProblem["content"] = content + NewProblem["origin"] = origin + NewProblem["edit"] = [editor] + return NewProblem # 返回一道新题目的字典, 已赋新的ID, 内容, 来源和编辑者 if __name__ == "__main__": print("数据库工具, import用.") \ No newline at end of file