자니노트

[자니노트] 파이썬을 이용한 성경필사 노트 만들기, 소스 및 워드파일 포함, 개역개정 본문

파이썬

[자니노트] 파이썬을 이용한 성경필사 노트 만들기, 소스 및 워드파일 포함, 개역개정

zaninote 2023. 7. 7. 14:24

개역한글_성경책.zip
2.40MB

 

안녕하세요. 자니 입니다.

 

성경필사를 위해 간단히 만든 파이썬 프로그램 입니다.
개역한글 버전의 성경 필사 파일도 첨부 하였습니다.

 

1. 성경 사이트 및 API 정보

    # Site : http://m.ibibles.net/quote10.htm
    # API : http://ibibles.net/quote.php?성경버전-성경책/장시작:절시작-장종료:절종료

 

2. 필사 노트 생성 소스

파일명 : bibleToWord.py

from docx.oxml.ns import qn
from docx.shared import RGBColor
import docx
import requests
from munch import *
import re

'''
  성경 API
    # Site : http://m.ibibles.net/quote10.htm
    # API : http://ibibles.net/quote.php?성경버전-성경책/장시작:절시작-장종료:절종료

    [성경버전]
      kor : 한국어 성경
      asv (English American Standard Version)
      bbe (English Bible in Basic English)

    [성경책]
      ge (창세기)
      exo (출애굽기)
      lev (레위기)
      num (민수기)
      deu (신명기)
      josh (여호수아)
      jdgs (사사기)
      ruth (룻기)
      1sm (사무엘상)
      2sm (사무엘하)
      1ki (열왕기상)
      2ki (열왕기하)
      1chr (역대상)
      2chr (역대하)
      ezra (에스라)
      neh (느헤미야)
      est (에스더)
      job (욥기)
      psa (시편)
      prv (잠언)
      eccl (전도서)
      ssol (아가)
      isa (이사야)
      jer (예레미야)
      lam (예레미야 애가)
      eze (에스겔)
      dan (다니엘)
      hos (호세아)
      joel (요엘)
      amos (아모스)
      obad (오바댜)
      jonah (요나)
      mic (미가)
      nahum (나훔)
      hab (하박국)
      zep (스바냐)
      hag (학개)
      zep (스가랴)
      mal (말라기)
      mat (마태복음)
      mark 마가복음)
      luke (누가복음)
      john (요한복음)
      acts (사도행전)
      rom (로마서)
      1cor (고린도전서)
      2cor (고린도후서)
      gal (갈라디아서)
      eph (에베소서)
      phi (빌립보서)
      col (골로새서)
      1th (데살로니가전서)
      2th (데살로니가후서)
      1tim (디모데전서)
      2tim (디모데후서)
      titus (디도서)
      phmn (빌레몬서)
      heb (히브리서)
      jas (야고보서)
      1pet (베드로전서)
      2pet (베드로후서)
      1jn (요한1서)
      2jn (요한2서)
      3jn (요한3서)
      jude (유다서)
      rev (요한계시록)



---------------------------------------------------------------------------
'''

books = {
    'ge': {'name': '창세기', 'abbr': '창', 'zangNumber': 50, 'zangZerl': 26},
    'exo': {'name': '출애굽기', 'abbr': '출', 'zangNumber': 40, 'zangZerl': 38},
    'lev': {'name': '레위기', 'abbr': '레', 'zangNumber': 27, 'zangZerl': 34},
    'num': {'name': '민수기', 'abbr': '민', 'zangNumber': 36, 'zangZerl': 13},
    'deu': {'name': '신명기', 'abbr': '신', 'zangNumber': 34, 'zangZerl': 12},
    'josh': {'name': '여호수아', 'abbr': '수', 'zangNumber': 24, 'zangZerl': 33},
    'jdgs': {'name': '사사기', 'abbr': '삿', 'zangNumber': 21, 'zangZerl': 25},
    'ruth': {'name': '룻기', 'abbr': '룻', 'zangNumber': 4, 'zangZerl': 22},
    '1sm': {'name': '사무엘상', 'abbr': '삼상', 'zangNumber': 31, 'zangZerl': 13},
    '2sm': {'name': '사무엘하', 'abbr': '삼하', 'zangNumber': 24, 'zangZerl': 25},
    '1ki': {'name': '열왕기상', 'abbr': '왕상', 'zangNumber': 22, 'zangZerl': 53},
    '2ki': {'name': '열왕기하', 'abbr': '왕하', 'zangNumber': 25, 'zangZerl': 30},
    '1chr': {'name': '역대상', 'abbr': '대상', 'zangNumber': 29, 'zangZerl': 36},
    '2chr': {'name': '역대하', 'abbr': '대하', 'zangNumber': 36, 'zangZerl': 35},
    'ezra': {'name': '에스라', 'abbr': '스', 'zangNumber': 10, 'zangZerl': 44},
    'neh': {'name': '느헤미야', 'abbr': '느', 'zangNumber': 13, 'zangZerl': 31},
    'est': {'name': '에스더', 'abbr': '에', 'zangNumber': 10, 'zangZerl': 3},
    'job': {'name': '욥기', 'abbr': '용', 'zangNumber': 42, 'zangZerl': 17},
    'psa': {'name': '시편', 'abbr': '시', 'zangNumber': 150, 'zangZerl': 6},
    'prv': {'name': '잠언', 'abbr': '잠', 'zangNumber': 31, 'zangZerl': 9},
    'eccl': {'name': '전도서', 'abbr': '전', 'zangNumber': 12, 'zangZerl': 14},
    'ssol': {'name': '아가', 'abbr': '아', 'zangNumber': 8, 'zangZerl': 12},
    'isa': {'name': '이사야', 'abbr': '사', 'zangNumber': 66, 'zangZerl': 24},
    'jer': {'name': '예레미야', 'abbr': '렘', 'zangNumber': 52, 'zangZerl': 34},
    'lam': {'name': '예레미야 애가', 'abbr': '애', 'zangNumber': 5, 'zangZerl': 22},
    'eze': {'name': '에스겔', 'abbr': '겔', 'zangNumber': 48, 'zangZerl': 13},
    'dan': {'name': '다니엘', 'abbr': '단', 'zangNumber': 12, 'zangZerl': 14},
    'hos': {'name': '호세아', 'abbr': '호', 'zangNumber': 14, 'zangZerl': 10},
    'joel': {'name': '요엘', 'abbr': '욜', 'zangNumber': 3, 'zangZerl': 21},
    'amos': {'name': '아모스', 'abbr': '암', 'zangNumber': 9, 'zangZerl': 15},
    'obad': {'name': '오바댜', 'abbr': '옵', 'zangNumber': 1, 'zangZerl': 21},
    'jonah': {'name': '요나', 'abbr': '욘', 'zangNumber': 4, 'zangZerl': 11},
    'mic': {'name': '미가', 'abbr': '미', 'zangNumber': 7, 'zangZerl': 20},
    'nahum': {'name': '나훔', 'abbr': '나', 'zangNumber': 3, 'zangZerl': 19},
    'hab': {'name': '하박국', 'abbr': '합', 'zangNumber': 3, 'zangZerl': 19},
    'zep': {'name': '스바냐', 'abbr': '습', 'zangNumber': 3, 'zangZerl': 18},
    'hag': {'name': '학개', 'abbr': '학', 'zangNumber': 2, 'zangZerl': 23},
    'zep': {'name': '스가랴', 'abbr': '슥', 'zangNumber': 14, 'zangZerl': 21},
    'mal': {'name': '말라기', 'abbr': '말', 'zangNumber': 4, 'zangZerl': 6},
    'mat': {'name': '마태복음', 'abbr': '마', 'zangNumber': 28, 'zangZerl': 20},
    'mark': {'name': '마가복음', 'abbr': '막', 'zangNumber': 16, 'zangZerl': 20},
    'luke': {'name': '누가복음', 'abbr': '누', 'zangNumber': 24, 'zangZerl': 53},
    'john': {'name': '요한복음', 'abbr': '요', 'zangNumber': 21, 'zangZerl': 25},
    'acts': {'name': '사도행전', 'abbr': '사', 'zangNumber': 28, 'zangZerl': 31},
    'rom': {'name': '로마서', 'abbr': '로', 'zangNumber': 16, 'zangZerl': 27},
    '1cor': {'name': '고린도전서', 'abbr': '고전', 'zangNumber': 16, 'zangZerl': 24},
    '2cor': {'name': '고린도후서', 'abbr': '고후', 'zangNumber': 13, 'zangZerl': 14},
    'gal': {'name': '갈라디아서', 'abbr': '갈', 'zangNumber': 6, 'zangZerl': 18},
    'eph': {'name': '에베소서', 'abbr': '엡', 'zangNumber': 6, 'zangZerl': 24},
    'phi': {'name': '빌립보서', 'abbr': '빌', 'zangNumber': 4, 'zangZerl': 23},
    'col': {'name': '골로새서', 'abbr': '골', 'zangNumber': 4, 'zangZerl': 18},
    '1th': {'name': '데살로니가전서', 'abbr': '살전', 'zangNumber': 5, 'zangZerl': 28},
    '2th': {'name': '데살로니가후서', 'abbr': '살후', 'zangNumber': 3, 'zangZerl': 18},
    '1tim': {'name': '디모데전서', 'abbr': '딤전', 'zangNumber': 6, 'zangZerl': 21},
    '2tim': {'name': '디모데후서', 'abbr': '딤후', 'zangNumber': 4, 'zangZerl': 22},
    'titus': {'name': '디도서', 'abbr': '딛', 'zangNumber': 3, 'zangZerl': 15},
    'phmn': {'name': '빌레몬서', 'abbr': '몬', 'zangNumber': 1, 'zangZerl': 25},
    'heb': {'name': '히브리서', 'abbr': '히', 'zangNumber': 13, 'zangZerl': 25},
    'jas': {'name': '야고보서', 'abbr': '약', 'zangNumber': 5, 'zangZerl': 20},
    '1pet': {'name': '베드로전서', 'abbr': '벧전', 'zangNumber': 5, 'zangZerl': 14},
    '2pet': {'name': '베드로후서', 'abbr': '벧후', 'zangNumber': 3, 'zangZerl': 18},
    '1jn': {'name': '요한1서', 'abbr': '요일', 'zangNumber': 5, 'zangZerl': 21},
    '2jn': {'name': '요한2서', 'abbr': '요이', 'zangNumber': 1, 'zangZerl': 13},
    '3jn': {'name': '요한3서', 'abbr': '요삼', 'zangNumber': 1, 'zangZerl': 14},
    'jude': {'name': '유다서', 'abbr': '유', 'zangNumber': 1, 'zangZerl': 25},
    'rev': {'name': '요한계시록', 'abbr': '계', 'zangNumber': 22, 'zangZerl': 21},
}


cleanr = re.compile('<.*?>|&([a-z0-9]+|#[0-9]{1,6}|#x[0-9a-f]{1,6});')

# book 생성
def makeBook(bookVersion, bookNumber, bookCode, book):

  startZang = 1
  startZerl = 1
  endZang = book['zangNumber']
  endZerl = book['zangZerl']

  url = f'http://ibibles.net/quote.php?{bookVersion}-{bookCode}/{startZang}:{startZerl}-{endZang}:{endZerl}'
  session = requests.Session()
  listResponse = session.get(url)


  bibleDocument = docx.Document("./template.docx")

  beforeZangNumber = ""
  for line in listResponse.text.splitlines():
      temp = line.strip()
      if temp.startswith("<small>"):
          temp = re.sub(cleanr, '', temp)

          # 장이 바뀌명 다음 페이지로
          end = temp.find(":")
          zangNumber = temp[0: end]
          if beforeZangNumber != "" and beforeZangNumber != zangNumber:
              bibleDocument.add_page_break()

          temp = f'{Munch.fromDict(books[bookCode]).abbr}{temp}'

          index = temp.find(' ')
          zangZerl = temp[0:index]
          statement = temp[index:]
          statement = re.sub(r"[^\uAC00-\uD7A30-9a-zA-Z\s]", "", statement)

          para = bibleDocument.add_paragraph()
          run = para.add_run(zangZerl)
          run.font.color.rgb = RGBColor(255, 0, 0)
          run.font.name = '나눔손글씨 마고체'
          run._element.rPr.rFonts.set(qn('w:eastAsia'), '나눔손글씨 마고체')
          run.font.size = docx.shared.Pt(23)

          run = para.add_run(statement)
          run.font.color.rgb = RGBColor(191, 191, 191)
          run.font.name = '나눔손글씨 마고체'
          run._element.rPr.rFonts.set(qn('w:eastAsia'), '나눔손글씨 마고체')
          run.font.size = docx.shared.Pt(23)

          beforeZangNumber = zangNumber
  
  bibleDocument.save(
      f'{bookNumber}.{Munch.fromDict(books[bookCode]).name}-{startZang}장{startZerl}절_{endZang}장{endZerl}절.docx')



# 한글 책
bookVersion = 'kor'
# books 를 list 로 변환
bookCodeList = list(books.keys())
bookNumber = 1
for bookCode in bookCodeList:
  book = books.get(bookCode)
  makeBook(bookVersion, bookNumber, bookCode, book)  
  bookNumber = bookNumber + 1

3. 실행

python .\bibleToWord.py

4. 결과 파일(필사 노트, 워드파일)

첨부파일 참조

 

Comments