Найти маркированные списки в в файле .doc

Автор karpo518, 28 октября 2016, 17:11

0 Пользователи и 1 гость просматривают эту тему.

karpo518

Добрый день. Подскажите, в каком свойстве хранится информация о том, что параграф является маркированным списком. Как при обычном обходе параграфов распознать элементы маркированного списка?

Do While oCursor.gotoEndOfParagraph(True)
   If oDoc.Text.compareRegionEnds(oCursor, oRCurs) < 0 Then Exit Do
       If Not oCursor.IsCollapsed() Then
           paraText = oCursor.getString()
       End If
   End If
   oCursor.gotoNextParagraph(False)
Loop


Или хотя бы через createSearchDescriptor можно как-нибудь найти списки?
Linux Mint 18 (64 bit),  LibreOffice 5.1.6.2

rami

Цитата: karpo518 от 28 октября 2016, 15:11Или хотя бы через createSearchDescriptor можно как-нибудь найти списки?
Нет.
Цитата: karpo518 от 28 октября 2016, 15:11Подскажите, в каком свойстве хранится информация о том, что параграф является маркированным списком.
У каждого маркированного или нумерованного абзаца есть не пустое свойство NumberingStyleName, но отличить маркированный абзац от нумерованного можно по свойству ListLabelString — у маркированного абзаца оно пустое, а у нумерованного содержит символ нумерации.
Цитата: karpo518 от 28 октября 2016, 15:11Как при обычном обходе параграфов распознать элементы маркированного списка?
Элементы маркированного списка можно увидеть в самом стиле, а не в параграфе.

Напишите подробней что хотите сделать и что найти.

karpo518

Спасибо за ответ. Я пишу расширение, которое оборачивает документ в теги html. Обхожу параграфы/абзацы при помощи текстового курсора. При таком обходе у меня в текстовый курсор элемент маркированный список попадает как отдельный параграф. Но как узнать, что это элемент списка и если это он, то как узнать, какого типа список. Можете привести пример кода для моего фрагмента макроса?
Linux Mint 18 (64 bit),  LibreOffice 5.1.6.2

rami

Вот пример:Sub main
Dim p   'параграф
Dim oEnum
oEnum=ThisComponent.Text.createEnumeration()
Do While oEnum.hasMoreElements
p=oEnum.nextElement           'перебор параграфов
If p.NumberingIsNumber Then   'если это какой-то список
If p.ListLabelString="" Then
msgbox p.String,1,"маркированный список"  'здесь обрабатывать найденный параграф, если маркированный список
Else
msgbox p.String,1,"нумерованный список"   'здесь обрабатывать найденный параграф, если нумерованный список
End If
End If
Loop
End Sub

karpo518

#4
К сожалению, условия
If p.NumberingIsNumber Then

недостаточно в моём случае. Абзацы оформленные как "Heading 1", "Heading 2" тоже имеют это свойство. Требуется более точное условие.

Пока буду использовать костыль

If oCursor.NumberingIsNumber And oCursor.ParaStyleName ="Text body"

Есть более корректный вариант?

Проблема №2:

Свойство нельзя использовать для отключения формата списка. Если задать для всех элементов списка NumberingIsNumber = False, то такое действие нельзя отменить по ctrl + z, значит структура документа ломается. Как можно отключить стили маркерованного и нумерованного списка?
Linux Mint 18 (64 bit),  LibreOffice 5.1.6.2

rami

Цитата: karpo518 от 31 октября 2016, 13:32недостаточно в моём случае. Абзацы оформленные как "Heading 1", "Heading 2" тоже имеют это свойство. Требуется более точное условие.
Естественно, заголовки с нумерацией распознаются как нумерованные списки и их нужно исключать из поиска по имени стиля. Никто кроме вас не знает какие должны быть случаи, я лишь показал как отличить нумерованных от маркированных. Рассматривать надо все случаи, также учтите, что таблица тоже считается как параграф и её нужно "отсеивать".

rami

Цитата: karpo518 от 31 октября 2016, 13:32Как можно отключить стили маркерованного и нумерованного списка?
Присвоение пустого стиля нумерации удаляет стиль нумерации:p.NumberingStyleName=""

karpo518

Цитироватьp.NumberingStyleName=""
Спасибо. Это то, что нужно!

Подскажите, а как можно определить уровень вложенности элемента списка?

И ещё, как можно показать все стили текста, чтобы увидеть все отличия стилей двух текстовых интервалов? Например, я не знал о существовании свойств NumberingStyleName,NumberingIsNumber,ListLabelString. Я гуглил на русском, на английском, листал книгу Эндрю Питоньяка. И теперь когда услышал это от вас, просто не представляю, как мог бы прийти к этому сам.
Linux Mint 18 (64 bit),  LibreOffice 5.1.6.2

rami

Цитата: karpo518 от 31 октября 2016, 16:24Например, я не знал о существовании свойств NumberingStyleName,NumberingIsNumber,ListLabelString. Я гуглил на русском, на английском, листал книгу Эндрю Питоньяка. И теперь когда услышал это от вас, просто не представляю, как мог бы прийти к этому сам.
Надо было не листать, а читать ;D книгу Эндрю Питоньяка. См. скриншот 306 страницы из Эндрю Питоньяк. OpenOffice.org Объяснение Макросов.
Цитата: karpo518 от 31 октября 2016, 16:24Подскажите, а как можно определить уровень вложенности элемента списка?
Это то, что подчёркнуто на скриншоте?

kompilainenn

Цитата: rami от 31 октября 2016, 16:44Надо было не листать, а читать
ты много хочешь, это ж КНИГА
Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут

karpo518

ЦитироватьНадо было не листать, а читать Смеющийся книгу Эндрю Питоньяка
Я искал поиском по pdf) Спасибо за помощь.

Надеюсь, последний вопрос. После форматирования выделенной области её границы изменяются. Как вернуть начало выделенной области(левую границу) с середины строки на начало этой же строки? Пробую вот так:

oVC = thisComponent.getCurrentController.getViewCursor
oVC.gotoStartOfLine(True)


Не получается.
Linux Mint 18 (64 bit),  LibreOffice 5.1.6.2

rami

Цитата: karpo518 от  1 ноября 2016, 14:15Надеюсь, последний вопрос. После форматирования выделенной области её границы изменяются. Как вернуть начало выделенной области(левую границу) с середины строки на начало этой же строки?
В перемещениях курсора True означает "перемещение с выделением от текущего положения до указанного", а False означает "перемещение курсора в указанную позицию" (без выделения). Вам нужно заменить True на False. В результате курсор сместится в начало видимой строки (но это может быть середина предложения или даже середина перенесённого слова). Вам нужен видимый курсор или всё же текстовый ??? ??? ???

karpo518

ЦитироватьВ перемещениях курсора True означает "перемещение с выделением от текущего положения до указанного", а False означает "перемещение курсора в указанную позицию" (без выделения). Вам нужно заменить True на False.

Мой код не оказывает никакого влияния на видимый курсор независимо от передаваемого значения (True/False).

Я работаю с текстовым курсором, но после всех манипуляций оказывается, что контент первой выделенной строки оказывается за пределом выделенной области. Видимый курсор находится на конце видимой области. Мне нужно вернуть первую строку в пределы выделенной области. Проще всего было бы запомнить позицию начала выделенной области и подвинуть на неё левую границу выделенной области. Я хотел это сделать с помощью видимого курсора. Прикладываю скрины
Linux Mint 18 (64 bit),  LibreOffice 5.1.6.2