Browse Source

great punctuation handling

main
lhess2021 4 years ago
parent
commit
0a4efaee74
  1. 88
      py-scripts.d/word-tags.py

88
py-scripts.d/word-tags.py

@ -0,0 +1,88 @@
import re
import os
"""
Replace every space with a special character and then re-replace them? You lose the space between `:«` with current method.
"""
path = __file__
directory = os.path.abspath(os.getcwd())
def add_tags(filename):
# Only grab 0XX-canticle from `*.txt` file names
xmlfile = filename.split('.')[0] + '.xml'
tmpxmlfile = '.' + filename.split('.')[0] + '.tmp.xml'
with open(xmlfile,'w') as Cxml:
with open(tmpxmlfile,'w') as Cxmltmp:
with open(filename,'r') as Ctxt:
for spaced_line in Ctxt:
# Use `~` as a placeholder for spaces later
line = re.sub(' ','~',spaced_line)
words = line.split('~')
for i in range(len(words)):
word = words[i]
# Iterate from ending to beginning of word
L = len(word) - 1
# Catch single chars like `-`
if L == 0:
before_end_word_chars = word
ending_punct_chars = ''
# Catch single chars at end of line
elif L == 1 and '\n' in word:
before_end_word_chars = word.rstrip()
ending_punct_chars = '\n'
else:
print('Got to <- with: ' + word + ' and this L: ' + str(L) + ' in ' + filename)
# We need `word[L] != '-'` because there are some words like `-:`
while word[L] != '' and word[L] != '-' and not word[L].isalpha():
L-=1
else:
ending_punct_begin_index = L + 1
ending_punct_chars = word[ending_punct_begin_index:]
before_end_word_chars = word[:ending_punct_begin_index]
# Iterate from start to remainder of word
L = len(word) - 1
if L == 0:
middle_word_chars = word
starting_punct_chars = ''
elif L == 1 and '\n' in word:
middle_word_chars = word.rstrip()
starting_punct_chars = ''
else:
#print('Got -> with this word: ' + word + ' and this L: ' + str(L) + ' in ' + filename)
while word[-L - 1] != '' and word[-L - 1] != '' and word[L] != '-' and not word[-L - 1].isalpha():
L-=1
else:
starting_punct_end_index = -L - 1
starting_punct_chars = word[:starting_punct_end_index]
middle_word_chars = before_end_word_chars[-L-1:]
# Pad with spaces to ensure we get spaces between words
# and importantly _around_ punctuation. We want:
# `<w>Rispuosemi</w>: «<w>Non</w>` and not `<w>Rispuosemi</w>:«<w>Non</w>`.
new_word = ' ' + starting_punct_chars + '<w>' + middle_word_chars + '</w>' + ending_punct_chars + ' '
Cxmltmp.write(new_word)
Ctxt.close()
Cxmltmp.close()
with open(tmpxmlfile,'r') as Cxmltmp:
# Add space before opening word tag
def add_space(match):
match = match.group()
return re.sub('<w>', ' <w>', match)
for line in Cxmltmp:
# Swap double spaces from new_word with single spaces
line_spaced = re.sub(' ',' ',line)
# If there's a single space at the beginning of the line, delete it
line_spaced = line_spaced.lstrip(' ')
# Add three tabs at the beginning
line_spaced = re.sub('^','\t\t\t',line_spaced)
Cxml.write(line_spaced)
Cxmltmp.close()
os.remove(tmpxmlfile)
Cxml.close()
for f in os.listdir(directory):
if f != 'word-tags.py' and f != '.word-tags.py.swp':
add_tags(f)
if f.endswith('.txt'):
os.remove(os.path.join(directory, f))
Loading…
Cancel
Save