translate, done with 众生都是既然众生 and 佛教徒的人生态度
This commit is contained in:
@@ -0,0 +1,128 @@
|
||||
"""Generate bilingual.dj from DOCX manuscript only (no PDF).
|
||||
Source: Chinese from DOCX. Target: English from DOCX.
|
||||
"""
|
||||
import re, subprocess, os
|
||||
|
||||
DOCX = "/home/user/documents/mpi/translate-files/佛教徒的人生态度/定稿 佛教徒的人生态度 善鑫慧炬照禅道靖妙一观轩慈德20260527.docx"
|
||||
OUT_DIR = "/home/user/documents/mpi/translate-files/佛教徒的人生态度"
|
||||
|
||||
def has_cjk(s):
|
||||
return any('\u4e00' <= c <= '\u9fff' for c in s)
|
||||
|
||||
def pandoc(path):
|
||||
r = subprocess.run(['pandoc', path, '-f', 'docx', '-t', 'plain', '--wrap=none'],
|
||||
capture_output=True, text=True)
|
||||
return r.stdout
|
||||
|
||||
def extract_pairs(text):
|
||||
"""Return [(cn_para, en_para), ...] from body onwards."""
|
||||
lines = text.split('\n')
|
||||
body_start = None
|
||||
for i, l in enumerate(lines):
|
||||
if '生活在这个世间' in l:
|
||||
body_start = i
|
||||
break
|
||||
pairs = []
|
||||
i = body_start
|
||||
while i < len(lines):
|
||||
cn = lines[i].strip()
|
||||
if not cn or not has_cjk(cn):
|
||||
i += 1
|
||||
continue
|
||||
en = ''
|
||||
if i + 2 < len(lines) and lines[i+1].strip() == '':
|
||||
ec = lines[i+2].strip()
|
||||
if ec and not has_cjk(ec):
|
||||
en = ec
|
||||
i += 3
|
||||
else:
|
||||
i += 1
|
||||
else:
|
||||
i += 1
|
||||
continue
|
||||
pairs.append((cn, en))
|
||||
return pairs
|
||||
|
||||
SANSKRIT = [
|
||||
'bodhisattva', 'bodhicitta', 'samsara', 'Dharma', 'karma',
|
||||
'nirvana', 'Sangha', 'sutra', 'Mahayana', 'Sravaka',
|
||||
'Vinaya', 'Lamrim', 'Ksitigarbha', 'Samantabhadra',
|
||||
'Chan', 'Arhatship', 'Theravada',
|
||||
]
|
||||
|
||||
def apply_fixes(en_text, italicized):
|
||||
"""Apply typesetting fixes to English text."""
|
||||
# Fix: "2.How" → "2. How"
|
||||
en_text = re.sub(r'(\d)\.([A-Z][a-z])', r'\1. \2', en_text)
|
||||
# Fix: "said,"When → "said, "When
|
||||
en_text = re.sub(r'(said|says),"', r'\1, "', en_text)
|
||||
# Italicize Sanskrit on first occurrence
|
||||
for term in SANSKRIT:
|
||||
if term not in italicized:
|
||||
pattern = re.compile(r'\b' + re.escape(term) + r'\b')
|
||||
m = pattern.search(en_text)
|
||||
if m:
|
||||
s, e = m.start(), m.end()
|
||||
en_text = en_text[:s] + '*' + en_text[s:e] + '*' + en_text[e:]
|
||||
italicized.add(term)
|
||||
return en_text
|
||||
|
||||
def generate(pairs, out_path):
|
||||
italicized = set()
|
||||
lines = []
|
||||
|
||||
# Title
|
||||
lines.append('# 佛教徒的人生态度')
|
||||
lines.append('# The Life Attitudes of Buddhists')
|
||||
lines.append('')
|
||||
lines.append('------2014年秋讲于第九届菩提静修营')
|
||||
lines.append('---Lecture Given at the 9th Bodhi Meditation Retreat, 2014')
|
||||
lines.append('')
|
||||
lines.append(' 济群法师 ')
|
||||
lines.append('Master Jiqun')
|
||||
lines.append('')
|
||||
|
||||
# TOC
|
||||
lines.append('- 一、消极还是积极')
|
||||
lines.append('- 二、悲观还是乐观')
|
||||
lines.append('- 三、禁欲还是纵欲')
|
||||
lines.append('- 四、重生还是重死')
|
||||
lines.append('- 五、自利还是利他')
|
||||
lines.append('- 六、出世还是入世')
|
||||
lines.append('- 七、无情还是多情')
|
||||
lines.append('- 八、随缘还是进取')
|
||||
lines.append('- 九、结束语')
|
||||
lines.append('')
|
||||
lines.append('- I. Passive or Proactive')
|
||||
lines.append('- II. Pessimism or Optimism')
|
||||
lines.append('- III. Abstinence or Indulgence')
|
||||
lines.append('- IV. Focus on Life or on Death')
|
||||
lines.append('- V. Benefit Oneself or Benefit Others')
|
||||
lines.append('- VI. Transcending the World or Engaging with the World')
|
||||
lines.append('- VII. To Love or Not to Love')
|
||||
lines.append('- VIII. Adapting to Conditions or Striving for Progress')
|
||||
lines.append('- IX. Conclusion')
|
||||
lines.append('')
|
||||
|
||||
# Body
|
||||
for cn, en in pairs:
|
||||
en_fixed = apply_fixes(en, italicized)
|
||||
lines.append(cn)
|
||||
lines.append(en_fixed)
|
||||
lines.append('')
|
||||
|
||||
with open(out_path, 'w') as f:
|
||||
f.write('\n'.join(lines))
|
||||
|
||||
print(f"Written: {out_path}")
|
||||
print(f" Paragraphs: {len(pairs)}")
|
||||
print(f" Sanskrit italicized: {sorted(italicized)}")
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("Extracting DOCX...")
|
||||
text = pandoc(DOCX)
|
||||
pairs = extract_pairs(text)
|
||||
print(f" Pairs: {len(pairs)}")
|
||||
|
||||
out = os.path.join(OUT_DIR, 'bilingual.dj')
|
||||
generate(pairs, out)
|
||||
Reference in New Issue
Block a user