Browse Source

feat: 添加单词导出为文档的代码

SongZihuan 2 years ago
parent
commit
3e0176046d
3 changed files with 139 additions and 0 deletions
  1. 8 0
      core/db.py
  2. 131 0
      job/create_docx.py
  3. BIN
      resource/docx/High_English_Word.zip

+ 8 - 0
core/db.py

@@ -197,6 +197,14 @@ class WordDatabase(DataBase):
         self.__logger.debug(f"Find word (not add) {q}")
         return self.__make_word(q, res)
 
+    def find_word_by_index(self, index) -> Optional[word.Word]:
+        res = self.search(columns=["DISTINCT word"],
+                          table="Word", order_by=[("Word", "ASC")],
+                          offset=index, limit=1)
+        if res is None or len(res) <= 0:
+            return None
+        return self.find_word(res[0][0], False, False)
+
     class UpdateResponse:
         def __init__(self):
             self._success = 0

+ 131 - 0
job/create_docx.py

@@ -0,0 +1,131 @@
+import configure
+import os
+
+env_dict = os.environ
+henglish_conf = env_dict.get("HENGLISH_CONF")
+if henglish_conf is not None:
+    configure.configure(henglish_conf, encoding="utf-8")
+
+
+try:
+    from core.db import WordDatabase, word
+    from docx import Document, shared, enum
+    from docx.enum import section, text
+    from docx.oxml.ns import qn
+except ImportError:
+    print("Run `pip install python-docx` first.")
+else:
+    def make_word(title: str, little_title: str, db: WordDatabase, font0=15, font1=8, font2=7, start=0, end=300,
+                  file_name="English"):
+        doc = Document()
+        sec = doc.sections[0]  # sections对应文档中的“节”
+
+        normal_style = doc.styles['Normal']
+        normal_style.font.name = u'微软雅黑'  # 必须先设置font.name
+        normal_style.element.rPr.rFonts.set(qn('w:eastAsia'), u'微软雅黑')
+        normal_style.font.color.rgb = shared.RGBColor(0, 0, 0)
+
+        h1_style = doc.styles['Heading 1']
+        h1_style.font.name = u'微软雅黑'  # 必须先设置font.name
+        h1_style.element.rPr.rFonts.set(qn('w:eastAsia'), u'微软雅黑')
+        h1_style.font.size = shared.Pt(30)
+        h1_style.font.color.rgb = shared.RGBColor(0, 0, 0)
+
+        h2_style = doc.styles['Heading 2']
+        h2_style.font.name = u'微软雅黑'  # 必须先设置font.name
+        h2_style.element.rPr.rFonts.set(qn('w:eastAsia'), u'微软雅黑')
+        h2_style.font.size = shared.Pt(font0)
+        h2_style.font.color.rgb = shared.RGBColor(0, 0, 0)
+
+        sec.left_margin = shared.Cm(3.18)  # 以下依次设置左、右、上、下页面边距
+        sec.right_margin = shared.Cm(3.18)
+        sec.top_margin = shared.Cm(1.27)
+        sec.bottom_margin = shared.Cm(1.27)
+
+        sec.orientation = section.WD_ORIENTATION.LANDSCAPE  # 设置纵向
+        sec.page_width = shared.Cm(21)  # 设置页面宽度
+        sec.page_height = shared.Cm(29.7)  # 设置页面高度
+        sec.different_first_page_header_footer = True
+
+        title_par = doc.add_heading(level=1)
+        title_par.paragraph_format.alignment = text.WD_PARAGRAPH_ALIGNMENT.CENTER
+        title_run = title_par.add_run(title)
+        title_run.add_break(text.WD_BREAK.PAGE)
+
+        header = sec.header.paragraphs[0]  # 获取第一个节的页眉
+        header.paragraph_format.alignment = text.WD_PARAGRAPH_ALIGNMENT.CENTER
+        l_title = header.add_run(little_title)  # 添加页面内容
+        l_title.font.size = shared.Pt(6)
+
+        footer = sec.footer.paragraphs[0]  # 获取第一个节的页眉
+        footer.paragraph_format.alignment = text.WD_PARAGRAPH_ALIGNMENT.CENTER
+        power_bt = footer.add_run(f"Power HEnglish! https://github.com/SuperH-0630/HEnglish")  # 添加页面内容
+        power_bt.font.size = shared.Pt(6)
+
+        def add_word(w: word.Word):
+            doc.add_heading(w.name, level=2)  # 添加标题
+
+            for i in w.comment:
+                c: word.Word.Comment = w.comment[i]
+
+                paragraph = doc.add_paragraph()
+                part = paragraph.add_run(c.part + "  ")
+                part.italic = True
+                part.bold = True
+                part.font.size = shared.Pt(font1)
+
+                english = paragraph.add_run(c.english)
+                english.bold = True
+                english.font.size = shared.Pt(font1)
+
+                chinese = paragraph.add_run(c.chinese)
+                chinese.bold = True
+                chinese.font.size = shared.Pt(font1)
+
+                for eg_index, e in enumerate(c.eg):
+                    e = e.split("##")
+                    english_sentence = paragraph.add_run(f"Eg {eg_index + 1}: " + e[0])
+                    english_sentence.font.size = shared.Pt(font2)
+
+                    chinese_sentence = paragraph.add_run("  " + e[1] + "")
+                    chinese_sentence.font.size = shared.Pt(font2)
+
+                ph_format = paragraph.paragraph_format
+                ph_format.line_spacing_rule = text.WD_LINE_SPACING.SINGLE  # 设置行间距
+
+        last_ten = -1
+        index = start
+        while True:
+            w = db.find_word_by_index(index)
+            if w is None:
+                break
+            add_word(w)
+            index += 1
+
+            if index // 10 > last_ten:
+                last_ten = index // 10
+                print(index)
+
+            if index == end:
+                break
+
+        doc.save(f'{file_name}.docx')
+        return index
+
+    word_db = WordDatabase("high_school", configure.conf["DB_TEMPLATE"])
+
+    page = 0
+    step = 500
+    book = 1
+    while True:
+        print(f"Book: {book}")
+        ret = make_word(f"\n\n\nHigh School English\nWord - {book}",
+                        f"High School English Word - {book}",
+                        word_db,
+                        start=page,
+                        end=page + step,
+                        file_name=f"English{book}")
+        if ret != page + step:
+            break
+        page += step
+        book += 1

BIN
resource/docx/High_English_Word.zip