capitalisePython - объяснение работы

Автор Ципихович Эндрю, 14 января 2024, 20:06

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

Ципихович Эндрю

здравствуйте в либре есть пример скрипта
capitalisePython:
def getNewString(theString):
    """helper function
    """
    if (not theString):
        return ""

    # should we tokenize on "."?
    if len(theString) >= 2 and theString[:2].isupper():
        # first two chars are UC => first UC, rest LC
        newString = theString[0].upper() + theString[1:].lower()

    elif theString[0].isupper():
        # first char UC => all to LC
        newString = theString.lower()

    else:
        # all to UC.
        newString = theString.upper()

    return newString


def capitalisePython():
    """Change the case of the selected or current word(s).
    If at least the first two characters are "UPpercase, then it is changed
    to first char "Uppercase".
    If the first character is "Uppercase", then it is changed to
    all "lowercase".
    Otherwise, all are changed to "UPPERCASE".
    """
    # The context variable is of type XScriptContext and is available to
    # all BeanShell scripts executed by the Script Framework
    xModel = XSCRIPTCONTEXT.getDocument()

    # the writer controller impl supports the css.view.XSelectionSupplier
    # interface
    xSelectionSupplier = xModel.getCurrentController()

    # see section 7.5.1 of developers' guide
    xIndexAccess = xSelectionSupplier.getSelection()
    count = xIndexAccess.getCount()

    if(count >= 1):  # ie we have a selection
        i = 0

    while i < count:
        xTextRange = xIndexAccess.getByIndex(i)
        theString = xTextRange.getString()
        # print("theString")
        if len(theString) == 0:
            # sadly we can have a selection where nothing is selected
            # in this case we get the XWordCursor and make a selection!
            xText = xTextRange.getText()
            xWordCursor = xText.createTextCursorByRange(xTextRange)

            if not xWordCursor.isStartOfWord():
                xWordCursor.gotoStartOfWord(False)

            xWordCursor.gotoNextWord(True)
            theString = xWordCursor.getString()
            newString = getNewString(theString)

            if newString:
                xWordCursor.setString(newString)
                xSelectionSupplier.select(xWordCursor)
        else:
            newString = getNewString(theString)
            if newString:
                xTextRange.setString(newString)
                xSelectionSupplier.select(xTextRange)
        i += 1


# lists the scripts, that shall be visible inside OOo. Can be omitted, if
# all functions shall be visible, however here getNewString shall be suppressed
g_exportedScripts = capitalisePython,
вопросов собственно два:
почему последняя строка оканчивается на зпт и это не порождает ошибку?
2
так как в этом скрипте две функции
def getNewString(theString)
def capitalisePython()
как это сделано, что если смотреть в либре Сервис-Макросы-Организатор Python scripts то в консоли Python scripts APSO в папке Сapitalise только один скрипт capitalisePython а не два согласно количеству функций?

если предположить, что там в консоли доступны только функции без параметров
то я пробовал по примеру делать скрипт с 2 функциями - одна с параметрами, другая без параметров и получил, то что всё равно были предложены два скрипта к выполнению из консоли, а не один как я предполагал
спасибо

mikekaganski

#1
Цитата: Ципихович Эндрю от 14 января 2024, 20:06почему последняя строка оканчивается на зпт и это не порождает ошибку?

https://docs.python.org/3/reference/expressions.html#expression-lists

Цитата: Ципихович Эндрю от 14 января 2024, 20:06как это сделано, что если смотреть в либре Сервис-Макросы-Организатор Python scripts то в консоли Python scripts APSO в папке Сapitalise только один скрипт capitalisePython а не два согласно количеству функций?

https://wiki.documentfoundation.org/Macros/Python_Basics#Recommended_Use
С уважением,
Михаил Каганский

Ципихович Эндрю

спасибо, понял, каким-то чудным образом это были звенья одной цепи........

economist

#3
C какой-то версии LibreOffice строка внизу py-скрипта вида

g_exportedScripts = def_name1,
стала необязательна, т.е. функции из py-скрипта видны и "запускаемы" как в обычном диалоге макросов LibreOffice, так и в APSO. Но ее стоит ставить для совместимости со старыми версиями.

Как быть с интерактивным вызовом (мышью-кнопкой) в LO def-функций, требующих параметры? С чужими - никак (правда есть декораторы, но они сложны новичкам). То есть чужие незнакомые UDF не вызывайте, или вызывайте с параметрами (из кода).

Для своих UDF можно сразу задавать "безопасные" аргументы по умолчанию:

def capitalize(s='фамилия имя отчество'):
    return s.capitalize()

Такая функция никогда не даст ошибки, но безопасный аргумент по умолчанию придумать непросто.

Все-таки лучше привыкнуть к тому что не всё можно запускать "на посмотреть" - это неправильно и опасно.

Чтобы длинной список функций не утомлял - надо размещать "служебные" функции с аргументами в отдельных py-файлах (модулях) и просто импортировать нужные функции одно строкой вида
from вашpyфайлбезрасширения import вашафункция1, вашафункция2 Это никак не замедляет работу и дает огромные плюсы, если кодят несколько человек.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

Ципихович Эндрю

economist, понял, ясно, благодарю, спасибо за информацию