Как написать макрос Python, чтобы добавить гиперссылку в документ LibreOffice Writer?
Я пытаюсь написать макрос LibreOffice на Python, который добавляет гиперссылку к текущему выделению в документе Writer, и я не могу понять, как это сделать. Я использовал LO Object Inspector, чтобы определить, куда ведет гиперссылка, и у меня есть работающий код Python, который получает текущий выбор. Но я не могу понять, как модель данных Object Inspector сопоставляется с моделью Python UNO, и не нашел никакой документации, объясняющей это.
В документе Writer с выделенной одной непрерывной областью текста инспектор объектов показывает следующее. (Я исключил десятки свойств, которые не кажутся релевантными, для ясности переупорядочил родственные свойства и отформатировал каждое свойство как «PropertyName : type = value».)
Current selection = class SwXTextRanges
ElementType : type = com.sun.star.text.XTextRange
ImplementationName : string = "SwXTextRanges"
SupportedServiceNames : string[1] = { "com.sun.star.text.TextRanges" }
@0 : css.text.XTextRange= <Object@SwXTextRange>
AvailableServiceNames : string[1] = { "com.sun.star.text.TextContent" }
SupportedServiceNames : string[7] = { "com.sun.star.text.TextRange", ... }
ElementType : type = com.sun.star.text.XTextRange
HyperlinkURL : string = ""
ImplementationName : string = "SwXTextRange"
String : string = "my selected text"
Основываясь на том, что показал мне Object Inspector, я ожидал использовать код Python, который выглядел примерно так:
doc = XSCRIPTCONTEXT.getDocument()
sel = doc.getCurrentSelection()
sel0 = sel[0]
selText = sel0.String # just a test to see if the property exists
sel0.HyperlinkURL = "www.foobar.com"
Когда я пытаюсь прочитать или назначить свойство HyperlinkURL, я получаю «AttributeError». Я пробовал это как в сценарии Python, так и в интерактивном режиме в консоли APSO. Находясь в консоли APSO, я обнаружил, что и sel, и sel0 относятся к классу «pyuno», а не к какому-то варианту [X]TextRange[s], как я ожидал. Я изучил справочник LibreOffice UNO API в поисках просветления, но пришел в еще большее замешательство, чем когда-либо. Я искал в справочнике по API слово «гиперссылка» и нашел его в трех местах: com.sun.star.report.XReportControlFormat, com.sun.star.style.CharacterProperties и com.sun.star.text.BaseFrameProperties. В справочнике по API утверждается, что CharacterProperties доступны из TextRange, но это не работает в Python.
Что я могу попробовать дальше?
Почему я хочу это сделать? Потому что у меня есть длинный список макросов LO, которые я хочу написать, некоторые из которых управляют гиперссылками, и мне нужно узнать, как различные инструменты и API сочетаются друг с другом. Я разрабатываю программное обеспечение на протяжении десятилетий, но это моя первая попытка написать макрос LO Python, который делает что-то полезное.
Почему Python, а не Бейсик? У меня был достаточно базового в течение многих лет, когда я использовал MS Office, и теперь, когда я, наконец, отказался от него в пользу LibreOffice, я собираюсь использовать «настоящий» язык для макросов.
Версия: LibreOffice 7.2.5.2 (x64) для Windows 10.0.18362.959