Как заставить python-docx работать со сложными скриптами? - PullRequest
1 голос
/ 20 марта 2019

У меня есть работающий генератор docx, который отлично работает для европейских языков, и я пытаюсь добавить поддержку сложных сценариев. Я нашел еще один вопрос с некоторыми рецептами, чтобы попробовать: python-docx add_style с языком CTL (сложное расположение текста)

Мне удалось заставить его работать так, чтобы текст сложного сценария выходил в правильном шрифте и размере, но я не могу заставить работать двунаправленный (справа налево) текст. Очевидное «x.font.rtl = True» не работает, равно как и заклинание, данное в другом посте («lang.set (qn ('w: bidi'), 'fa-IR')»). Мне пришлось убрать из его рецепта строку "" rpr.get_or_add_sz () ", в результате чего у меня остался нечитаемый файл, но все остальное работает без него, и я не думаю, что это связано с этой проблемой.

Вот стиль, который отображается в файле styles.xml сгенерированного документа:

<w:style w:styleId="Hebrew" w:type="paragraph" w:customStyle="1">
    <w:name w:val="Hebrew"/>
    <w:basedOn w:val="Normal"/>
    <w:pPr>
        <w:jc w:val="right"/>
    </w:pPr>
    <w:rPr>
        <w:rFonts w:cs="Arial"/>
        <w:rtl/>
        <w:szCs w:val="24"/>
        <w:lang w:bidi="he-IL"/>
    </w:rPr>
</w:style>

Может кто-нибудь посоветовать мне, что нужно сделать, чтобы параграфы работали на языках справа налево?

1 Ответ

1 голос
/ 23 марта 2019

Согласно комментариям выше, и с большой помощью ROAR (спасибо, ROAR!) Я все заработал.

рецепт ROAR здесь работал отлично, за исключением того, что вызов rpr.get_or_add_sz () дал мне нечитаемый файл .docx. Отказ от этого заставил все работать и не вызывал никаких проблем. Важнейшей отсутствующей ссылкой было добавить следующее в в стиле:

<w:bidi w:val="1">
<w:jc w:val="both"/>

Существует метод my_style.get_or_add_pPr () для получения ссылки на раздел стиля, и код аналогичен коду для обновления :

w_nsmap = '{'+ppr.nsmap['w']+'}'
bidi = None
jc = None
for element in ppr:
  if element.tag == w_nsmap + 'bidi':
    bidi = element
  if element.tag == w_nsmap + 'jc':
    jc = element
if bidi is None:
  bidi = OxmlElement('w:bidi')
if jc is None:
  jc = OxmlElement('w:jc')
bidi.set(qn('w:val'),'1')
jc.set(qn('w:val'),'both')
ppr.append(bidi)
ppr.append(jc)

Последнее, что мне было нужно, это иметь дело со смешанным языком, который я сделал, разбив текст на несколько прогонов. Пункты текста на иврите, с которыми я имел дело, получили измененный стиль с rtl = True, но я выделил все последовательности ASCII, которые начинались и заканчивались буквой:

[A-Za-z][\u0020-\u007e]*[A-Aa-z]

на отдельные прогоны с rtl = False.

...