Получение окружающего текста диапазона в Office-js - PullRequest
1 голос
/ 12 октября 2019

У меня есть код, который находит текст в Word и сохраняет полученные диапазоны в массиве. Я могу перемещаться по результату сопоставления, используя массив диапазонов. Я также хочу иметь возможность отображать окружающий текст диапазона. Это очень похоже на то, как Find работает в Word.

enter image description here

Например, я хочу показать окружающий текст (возможно, двадцать символов перед и после) диапазона второго экземпляра Readingв следующем тексте:

"Чтобы изменить способ размещения изображения в вашем документе, щелкните его, и рядом с ним появится кнопка для параметров макета. Когда вы работаете с таблицей, щелкните там, где вы хотите добавитьстроки или столбца, а затем щелкните знак плюса. Чтение также проще в новом представлении «Чтение». Вы можете свернуть части документа и сфокусироваться на нужном тексте. Если вам нужно остановить чтение, прежде чем вы достигнете концаWord запоминает, где вы остановились - даже на другом устройстве. "

Здесь будет вывод.

"Чтение также стало проще в новом представлении" Чтение ". Вы можете свернуть части"

. Я использую Visual Studio 2017 и Office-js 1.1.

    function first() {
        ranges[0].select();
        ranges[0].font.highlightColor = "aqua";
        ranges[0].context.sync();
        showSurroundText(ranges[0]);
    }

    function previous() {
        if (index > 0) {
            ranges[--index].select();
            ranges[index].font.highlightColor = "aqua";
            ranges[index+1].font.highlightColor = "yellow";
            ranges[index].context.sync();
            showSurroundText(ranges[index]);
        }
    }

    function next() {
        console.log("Next");
        if (index < ranges.length - 1) {
            ranges[++index].select();
            ranges[index].font.highlightColor = "aqua";
            ranges[index-1].font.highlightColor = "yellow";
            ranges[index].context.sync();
            showSurroundText(ranges[index]);
        }
    }

    function showSurroundText(range:Word.Range){
        surroundTextRange = /*need help computing this range */
        surroundTextRange.load("text");
        $("#output").htmml(surroundTextRange.text);
    }

1 Ответ

0 голосов
/ 14 октября 2019

К сожалению, в API Office JS нет способа расширить (или заключить контракт) диапазон или выделение на определенное количество символов. ( Ссылка )

По сравнению с COM API расширение диапазона является сложным делом. Доступные методы:

 - expandToOrNullObject(range)
 - getNextTextRangeOrNullObject(endingMarks, trimSpacing)
 - getRange(rangeLocationString)
 - getTextRanges

Используя getNextTextRangeOrNullObject, можно получить, например, следующее предложение после диапазона (результат поиска), указав . в качестве endingMarks. Это можно «свернуть» до начальной точки, используя getRange, так что диапазон поиска может быть расширен до начала следующего предложения.

Переход назад еще сложнее. Одна возможность состоит в том, чтобы получить все абзацы вплоть до того, который содержит искомое условие, затем получить последнее предложение этого абзаца и продлить его до этой точки.

Следующий фрагмент кода демонстрирует и предоставляет место для начала "настройка "для того, что вам нужно:

let results = context.document.body.search("Reading");
results.load("length");
await context.sync();

//Work with the first found search term
let rngFound = results.items[0];

//Expand to end of sentence
let rngNextSent = rngFound.getNextTextRangeOrNullObject(["."]);
let rngExpAfter = rngNextSent.getRange("Start"); let rngFoundExp = rngFound.expandToOrNullObject(rngExpAfter);

await context.sync();

//Get paragraphs to this point
let rngDocStart = rngFound.parentBody.getRange("Start");
let rngToStart = rngFoundExp.expandToOrNullObject(rngDocStart);
let paras = rngToStart.paragraphs;
paras.load("items");
await context.sync();

//Get the paragraph previous
let nrParas = rngToStart.paragraphs.items.length-2;
let rngPrev = rngToStart.paragraphs.items[nrParas];

//Get the last sentence in that paragraph
let rngParaSent = rngPrev.getTextRanges(["."]); rngParaSent.load("items"); await context.sync(); let rngPrevSent = rngParaSent.items[rngParaSent.items.length - 1];

//Extend the extended range to the last sentence in the previous paragraph
let rngComplete = rngFoundExp.expandToOrNullObject(rngPrevSent);
rngComplete.select();
await context.sync();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...