Создайте диапазон, охватывающий символ перед курсором в Word Javascript API / Office.js - PullRequest
0 голосов
/ 14 декабря 2018

Я пытаюсь создать надстройку Office Javascript, которая будет проверять символ перед курсором и заменять его в зависимости от того, что это такое.Поэтому мне нужно создать Range символа перед курсором.Я легко могу сделать это с помощью макроса VBA, но, к сожалению, я не могу найти способ сделать это с помощью нового javascript API.Это возможно?

Если это возможно, было бы также полезно, если бы я мог взглянуть на 5 символов до и после курсора для дополнительного контекста.

Спасибо.

1 Ответ

0 голосов
/ 18 декабря 2018

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

Ограничения в API, препятствующие простому решению:

  • Нет курсора, только выборки.Это означает, что вам нужно сделать предположение, что курсор всегда находится в начале выделения.
  • Выборы не могут быть изменены напрямую через API Office.js.Таким образом, невозможно расширить выделение, чтобы включить предыдущий символ.
  • Объект Range может расширяться в в обоих направлениях , но для него требуется другой диапазон в качестве входных данных.Это означает, что более ранний диапазон должен быть создан / найден (т. Е. Объект диапазона перед текущим выделением).
  • Вы можете перемещаться за пределы выделения только через свойство parentBody, которое даст вам все тело элемента.документ.Это необходимо обработать, чтобы выделить диапазон перед курсором, который мог бы помочь нам заменить символ.
  • Из того, что я могу сказать, невозможно создать диапазон для одного символа.Таким образом, больший диапазон должен быть взят перед курсором и полностью заменен.

Пример

// WARNING: Incredibly inefficient and poor code. Do not use directly!
// WARNING: Edge cases are not tackled in this example. 

function replaceCharacterBeforeCursor() {
    Word.run(function (context) {
        var selection = context.document.getSelection();
        // Assumption: Cursor always starts at the beginning of a selection.
        var cursor = selection.getRange('Start');

        // Create a new range that covers everything before the cursor (or the beginning of the selection).
        var startDocument = selection.parentBody.getRange("Start");
        var rangeBeforeSelection = startDocument.expandTo(startDocument);

        // Capture parent paragraph.
        var parentParagraph = rangeBeforeSelection.paragraphs.getLast();
        context.load(parentParagraph);

        context
            .sync()
            .then(function () {

                // Create range that captures everything from the beginning of the parent
                // paragraph until the cursor.
                var paragraphStart = parentParagraph.getRange('Start');
                var wordRangeBeforeCursor = paragraphStart.expandTo(cursor);

                context.load(wordRangeBeforeCursor);

                context
                    .sync()
                    .then(function () {

                        // Replace last character.
                        var oldText = wordRangeBeforeCursor.text;
                        var wordLength = oldText.length;
                        var lastCharacter = oldText.substring(wordLength - 1);

                        if (lastCharacter !== " ") {
                            var newText = oldText.substring(0, wordLength - 1) + "test";
                            wordRangeBeforeCursor.insertText(newText, 'Replace');

                            context.sync();
                        }
                    });
            });
    });
}

Другой способ сделать это - через текстдиапазоны.Это было бы существенно более неэффективно.В любом случае, я надеюсь, что это поможет вам найти решение, которое соответствует вашим потребностям.

...