2017-02-23 42 views
0

Мне нужно обновить двуязычный словарь, написанный в Writer, сначала разобрав все записи в свои части, например.Как tokenize/parse/искать и заменять документ шрифтом и стилем шрифта в LibreOffice Writer?

  • главное слово (шрифт 1, выделены жирным шрифтом)
  • внешней эквивалентной транслитерации (шрифт 1, курсив)
  • иностранный эквивалент (шрифт 2, выделены жирным шрифтом)
  • часть речи (шрифт 1, курсив)

Каждая строка документа является основным словом, за которым следуют перечисленные выше части, каждая из которых разделена пробелом или пунктуацией.

Мне нужно автоматизировать процесс прохода по всему файлу по строкам и поместить разделитель между каждой частью, игнорируя пробелы и пунктуацию, чтобы я мог импортировать его в файл Calc. Другими словами, «каждая часть» представляет собой последовательность символов (игнорируя пробелы и пунктуацию), которые имеют одинаковый шрифт и стиль шрифта.

Я пробовал стандарт Поиск & Функция замены и расширение AltSearch, но ни одна из них не может выполнить задачу. Основная проблема заключается я не в состоянии написать поисковый запрос, который говорит:

поиск: последовательных символов с тем же шрифтом и font_style, игнорировать пробелы и знаки препинания

Заменить термин найденное выше + " разделитель "

Любые предложения, как я могу написать сценарий для этого, или если существующий инструмент может решить проблему?

Спасибо!

Псевдо код желаемого эффекта:

var delimiter = "|" 

Go to beginning of document 

While not end of document do: 
    var $currLine = get line from doc 
    var $currChar = get next character which is not space or punctuation; 
    var $font = currChar.font 
    var $font_style - currChar.font_style (e.g. bold, italic, normal) 

    While not end of line do: 
     $currChar = next character which is not space or punctuation; 

      if (currChar.font != $font || currChar.font_style != $font_style) { // font or style has changed 
       print $delimiter 

       $font = currChar.font 
       $font_style - currChar.font_style (e.g. bold, italic, normal) 
      } 
    end While 

end While 

ответ

0

Ниже приведены советы для каждой из вещей, ваш псевдокод делает.

Во-первых, самый простой способ перемещения по строкам - с TextViewCursor, хотя он медленный. Обратите внимание на раздел XLineCursor. Для цикла while oVC.goDown() вернет false, когда достигнут конец документа. (oVC - наша переменная для TextViewCursor).

Получить каждый символ, позвонив по номеру oVC.goRight(0, False), чтобы снять выделение, а затем oVC.goRight(1, True). Затем выбранное значение получается oVC.getString(). Чтобы игнорировать пространство и пунктуацию, возможно, используйте модуль isalnum() python или модуль re.

Чтобы определить шрифт символа, позвоните по номеру oVC.getPropertyValue(attr). Значения для attr могут быть просто CharAutoStyleName и CharStyleName для проверки любых изменений форматирования.

Или возьмите список конкретных свойств, таких как 'CharFontFamily', 'CharFontFamilyAsian', 'CharFontFamilyComplex', 'CharFontPitch', 'CharFontPitchAsian' и т. Д. Характеристики символов описаны в https://wiki.openoffice.org/wiki/Documentation/DevGuide/Text/Formatting.

Вставить разделитель в текст: oVC.getText().insertString(oVC, "|", 0).

This python code from github показывает, как выполнять большинство из этих вещей, хотя вам нужно прочитать его, чтобы найти соответствующие части.

В качестве альтернативы вместо использования LibreOffice API распакуйте файл .odt и проанализируйте content.xml со сценарием.

+0

Распаковать .odt и вытащить файл .xml было полезным предложением! Я не понимал, что это был формат zip. – kaanch

Смежные вопросы