From 99e2e923d0c77b02f3fb4ff648ea916954868606 Mon Sep 17 00:00:00 2001 From: Yuqian Yang Date: Fri, 28 Feb 2025 23:13:39 +0800 Subject: chore(store): move everything to store. --- store/works/life/question-pptx/main.py | 122 +++++++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 store/works/life/question-pptx/main.py (limited to 'store/works/life/question-pptx/main.py') diff --git a/store/works/life/question-pptx/main.py b/store/works/life/question-pptx/main.py new file mode 100644 index 0000000..ee278d4 --- /dev/null +++ b/store/works/life/question-pptx/main.py @@ -0,0 +1,122 @@ +import random +import pptx +from pptx.util import Pt +import re +from typing import Iterable + +# Chinese colon and English colon is different but both should be supported with love! +choice_question_regex = re.compile( + r'(?P\d+)\s*[\.、.]?\s*(?P.*?)[\((]\s*(?P[a-eA-E])\s*[\))](?P.*?)\s*[aA]\s*[\.、.]?\s*(?P\S+?)\s*[bB]\s*[\.、.]?\s*(?P\S+?)\s*[cC]\s*[\.、.]?\s*(?P\S+?)\s+([dD]\s*[\.、.]?\s*(?P\S+?)\s+)?([eE]\s*[\.、.]?\s*(?P\S+?)\s+)?', re.MULTILINE) + +choice_text = open('./real-choose.txt', 'r', encoding='utf-8').read() + +questions = [] + +for match in choice_question_regex.finditer(choice_text): + q = { + 'id': int(match.group('problem_id')), + 'type': 'c', + 'problem': match.group('problem_1') + "( )" + match.group('problem_2'), + 'answer': match.group('answer').lower(), + 'choices': { + 'a': match.group('choice_a'), + 'b': match.group('choice_b'), + 'c': match.group('choice_c') + } + } + + if match.group('choice_d') != None: + q['choices']['d'] = match.group('choice_d') + + if match.group('choice_e') != None: + q['choices']['e'] = match.group('choice_e') + + questions.append(q) + +print(len(questions)) + +judge_question_regex = re.compile( + r'(?P\d+)\s*[\.、.]?\s*(?P.+)\s*[\((]\s*(?P[✓√×xX])\s*[\))]', re.MULTILINE) + +judge_text = open('./real-judge.txt', 'r', encoding='utf-8').read() + + +for match in judge_question_regex.finditer(judge_text): + questions.append({ + 'id': int(match.group('problem_id')), + 'type': 'j', + 'problem': match.group('problem'), + 'answer': '×' if match.group('answer') in '×xX' else '✓' + }) + +print(len(questions)) + +id_list = [q['id'] for q in questions] +id_list.sort() +for i in range(606): + if not i in id_list: + print(i) + +random.shuffle(questions) + +presentation: pptx.presentation.Presentation = pptx.Presentation() + +buttons: Iterable[pptx.shapes.autoshape.Shape] = [] + +for question in questions: + slide: pptx.slide.Slide = c.add_slide( + presentation.slide_layouts[6]) + + title = slide.shapes.add_textbox(Pt(20), Pt(40), Pt(680), Pt(50)) + problem = slide.shapes.add_textbox(Pt(20), Pt(120), Pt(680), Pt(350)) + answer = slide.shapes.add_textbox(Pt(560), Pt(450), Pt(40), Pt(40)) + id = slide.shapes.add_textbox(Pt(20), Pt(480), Pt(80), Pt(40)) + + if question['type'] == 'c': + title.text = '选择题' + problem.text = question['problem'] + '\n' + '\n'.join( + [choice.upper() + '. ' + question['choices'][choice]for choice in question['choices'].keys()]) + answer.text = question['answer'].upper() + else: + title.text = '判断题' + problem.text = question['problem'] + answer.text = question['answer'] + + id.text = str(question['id']) + + title_text_frame: pptx.text.text.TextFrame = title.text_frame + para: pptx.text.text._Paragraph + for para in title_text_frame.paragraphs: + para.font.size = Pt(42) + para.font.color.theme_color = pptx.enum.dml.MSO_THEME_COLOR.TEXT_2 + + problem_text_frame: pptx.text.text.TextFrame = problem.text_frame + problem_text_frame.margin_top = Pt(10) + para: pptx.text.text._Paragraph + for para in problem_text_frame.paragraphs: + para.space_after = Pt(6) + para.font.size = Pt(30) + problem_text_frame.word_wrap = True + + answer_text_frame: pptx.text.text.TextFrame = answer.text_frame + para: pptx.text.text._Paragraph + for para in answer_text_frame.paragraphs: + para.font.size = Pt(40) + para.font.color.rgb = pptx.dml.color.RGBColor(255, 0, 0) + + id_text_frame: pptx.text.text.TextFrame = id.text_frame + para: pptx.text.text._Paragraph + for para in id_text_frame.paragraphs: + para.font.size = Pt(20) + para.font.color.rgb = pptx.dml.color.RGBColor(128, 128, 128) + + buttons.append(slide.shapes.add_shape(pptx.enum.shapes.MSO_SHAPE.OVAL, Pt( + 660), Pt(460), Pt(40), Pt(40))) + +slide: pptx.slide.Slide = presentation.slides.add_slide( + presentation.slide_layouts[6]) + +for button in buttons: + button.click_action.target_slide = slide + +presentation.save('test.pptx') -- cgit v1.2.3