Python (2.6 jak w Apache lub 3.x jak w Libre, wszystko jedno)
Kod: Zaznacz cały
# coding: utf8
import sys
import uno
def createUnoService(serviceName):
ctx = uno.getComponentContext()
return ctx.ServiceManager.createInstanceWithContext(serviceName, ctx)
# Danny Brewer 2004
def hasUnoInterface( oObject, cInterfaceName ):
"""Similar to Basic's HasUnoInterfaces() function, but singular not plural."""
# Get the Introspection service.
oIntrospection = createUnoService("com.sun.star.beans.Introspection")
# Now inspect the object to learn about it.
oObjInfo = oIntrospection.inspect(oObject)
# Obtain an array describing all methods of the object.
oMethods = oObjInfo.getMethods(uno.getConstantByName("com.sun.star.beans.MethodConcept.ALL"))
# Now look at every method.
for oMethod in oMethods:
# Check the method's interface to see if
# these aren't the droids you're looking for.
cMethodInterfaceName = oMethod.getDeclaringClass().getName()
if cMethodInterfaceName == cInterfaceName:
return True
return False
def setOptionalHyphens(oDoc, aLocale):
''' wykonaj na wskazanym dokumencie, we wskazanym języku '''
if not hasUnoInterface(oDoc, "com.sun.star.text.XTextDocument"):
return
equalitySign = "="
if sys.version_info.major < 3:
softHyphenSign = unichr(173)
else:
softHyphenSign = chr(173)
oHyphen = createUnoService("com.sun.star.linguistic2.Hyphenator")
if oHyphen is None:
return
oTextCursor = oDoc.Text.createTextCursor()
oTextCursor.gotoStart(False)
result = True
while result:
if oTextCursor.isStartOfWord():
oTextCursor.gotoEndOfWord(True)
# oCharLoc = oTextCursor.getPropertyValue("CharLocale")
res = oHyphen.createPossibleHyphens(oTextCursor.getString(), aLocale, ())
if res is not None:
aWord = res.getPossibleHyphens()
if equalitySign in aWord and not softHyphenSign in aWord:
aWord = aWord.replace(equalitySign, softHyphenSign)
oTextCursor.setString(aWord)
oTextCursor.collapseToEnd()
result = oTextCursor.gotoNextWord(False)
def mainTest():
''' wykonaj na bieżącym dokumencie, po polsku '''
desktop = createUnoService("com.sun.star.frame.Desktop")
doc = desktop.getCurrentComponent()
loc = uno.createUnoStruct('com.sun.star.lang.Locale')
loc.Language = "pl"
loc.Country = "PL"
setOptionalHyphens(doc, loc)
g_exported_script = (mainTest, setOptionalHyphens, )
Co do oxt: o ile chętnie eksperymentuję z kodem (bo to mnie interesuje), to do budowania paczek mam mniejszego znacznie kopa motywacyjnego. Można to nazwać różnie: lenistwo, minimalizm, ukierunkowanie zainteresowań, amatorszczyzna. Dla mnie system o otwartej architekturze, nie wymagający instalatorów rozszerzeń, jest naturalnym środowiskiem pracy. Także upublicznianie tego typu rozwiązań, póki pozostaje w obszarze działań wolontariatu, jest jak najbardziej dopuszczalne.
Prawdę mówiąc, budowanie dodatków dla każdego maleńkiego makropolecenia mija się trochę z celem. Zwłaszcza biorąc pod uwagę zasoby czasowe: jakieś dwie godziny na kod, ale już około dniówki lub więcej na paczkowanie -- przynajmniej dla mnie. Ale może ktoś inny spróbuje. Kod udostępniam jako public domain.
Poza tym ten kod tylko pokazuje, jak dostać się do słownika. Do pełnego rozwiązania (wykrywanie stylów typu verbatim, uwzględnianie punktów podziału i ew. zakazów sugerowanych przez użytkownika, obsługa lokalnie zdefiniowanych języków, podstawowe opcje konfiguracyjne) jeszcze trochę wysiłku koncepcyjnego trzeba by włożyć. Paczkowanie takich szkiców moim zdaniem nie ma sensu, wprowadza tylko w błąd użytkownika, który sądzi, że dostał kompletny produkt.
Opracowanie dodatku w tym przypadku byłoby pożądane. Ale najpierw warto przemyśleć kilka założeń -- najlepiej zbiorowo, z praktykami, a potem przetestować ich zasadność.