Word JS API: расширение диапазона - PullRequest
0 голосов
/ 03 июля 2018

Работая над ответом на этот вопрос Мне бы очень хотелось иметь возможность расширить диапазон на определенное количество символов. В COM API я бы использовал Range.MoveEnd(). Есть ли какой-нибудь эквивалент, который я не нашел в JS API?

Справочная информация: упоминается вопрос о поиске поисковых терминов, содержащих более 255 символов - это ограничение в Word для рабочего стола. Поиск не удался.

Простой способ сделать это - найти первые 254 символа, а затем расширить найденный диапазон на оставшееся количество символов и сравнить его Range.Text с полным поисковым термином.

Не найдя эквивалента для расширения диапазона таким образом, мне пришлось прибегнуть к:

  • разбиение поискового термина на <255 символов </li>
  • поиск каждого предмета один за другим
  • определить, был ли каждый найденный фрагмент смежным с предыдущим
  • затем расширить диапазон, включив в него смежную фигуру
  • и повторяйте, пока все кусочки не будут найдены

Итак, мой вопрос ...

async function basicSearch() {
    await Word.run(async (context) => {
        let maxNrChars = 254;
        let searchterm = "";
        let shortSearch = true; //search string < 255 chars
        let fullSearchterm = "Video provides a powerful way to help you prove your point. When you click Online Video, you can paste in the embed code for the video you want to add. You can also type a keyword to search online for the video that best fits your document. Aösdlkvaösd faoweifu aösdlkcj aösdofi "
        let searchTermNrChars = fullSearchterm.length;
        let nrSearchCycles = Number((searchTermNrChars / maxNrChars).toFixed(0));
        let nrRemainingChars = searchTermNrChars - (nrSearchCycles * maxNrChars);
        //console.log("Number of characters in search term: " + searchTermNrChars
        //    + "\nnumber of search cycles required: " + nrSearchCycles
        //    + "\nremaining number of characters: " + nrRemainingChars);

//numerous ranges are required to extend original found range
        let bodyRange = context.document.body.getRange();
        bodyRange.load('End');
        let completeRange = null;
        let resultRange = null;
        let extendedRange = null;
        let followupRange = null;

        let cycleCounter = 0;
        let resultText = "";
        if (searchTermNrChars > maxNrChars) {
            searchterm = fullSearchterm.substring(0, maxNrChars);
            cycleCounter++;
            shortSearch = false;
        }
        else { searchterm = fullSearchterm; }

        let results = context.document.body.search(searchterm);
        results.load({ select: 'font/highlightColor, text' });

        await context.sync();

        // short search term, highlight...
        if (shortSearch) {
            for (let i = 0; i < results.items.length; i++) {
                results.items[i].font.highlightColor = "yellow";
            }
        }
        else {
            //console.log("Long search");
            for (let i = 0; i < results.items.length; i++) {
                resultRange = results.items[i];
                resultRange.load('End');
                extendedRange = resultRange.getRange('End').expandTo(bodyRange.getRange('End'));

                await context.sync();

                //search for the remainder of the long search term
                for (let cycle = 1; cycle < nrSearchCycles; cycle++) {
                    searchterm = fullSearchterm.substring((cycle * maxNrChars), maxNrChars);
                    //console.log(searchterm + " in cycle " + cycle);
                    let CycleResults = extendedRange.search(searchterm);
                    CycleResults.load({ select: 'text, Start, End' });
                    await context.sync();
                    followupRange = CycleResults.items[0];

                    //directly adjacent?
                    let isAfter = followupRange.compareLocationWith(resultRange);
                    if (isAfter.value == Word.LocationRelation.adjacentAfter) {
                        resultRange.expandTo(followupRange);
                        extendedRange = resultRange.getRange('End').expandTo(bodyRange.getRange('End'));
                    }
                    await context.sync();
                }

                if (nrRemainingChars > 0) {
                    console.log("In remaining chars");
                    searchterm = fullSearchterm.substring(searchTermNrChars - nrRemainingChars);
                    console.log(searchterm);
                    let xresults = extendedRange.search(searchterm);
                    xresults.load('end, text');
                    await context.sync();

                    let xresult = xresults.items[0];

                    let isAfter = xresult.compareLocationWith(resultRange);

                    await context.sync();
                    console.log(isAfter.value);
                    if (isAfter.value == Word.LocationRelation.adjacentAfter) {
                        completeRange = resultRange.expandTo(xresult);
                        completeRange.load('text');
                        //completeRange.select();
                        await context.sync();
                        resultText = completeRange.text.substring(0, fullSearchterm.length);
                        console.log("Result" + cycleCounter + ": " + resultText);
                    }  
                }
                else {
                    //No remeaining chars
                    resultRange.load('text');
                    //resultRange.select();
                    await context.sync();
                    resultText = resultRange.text.substring(0, fullSearchterm.length);
                    completeRange = resultRange; 
                }

                //long search successful?
                if (resultText == fullSearchterm) {
                    completeRange.font.highlightColor = "yellow";
                }
                else {
                    console.log("Else! " + resultText + "  /  " + fullSearchterm);
                }
                completeRange = null;
            }
        }  
    });

1 Ответ

0 голосов
/ 03 июля 2018

Это было то, что у нас было в оригинальном дизайне, но на самом деле оно было удалено из API, поскольку оно может легко привести к неожиданным результатам (например, скрытые несоответствия символов, сноски и т. Д.), И мы не могли охватить эти случаи с помощью ресурсы под рукой. Мы решили удалить его.

Как уже было сказано, я думаю, что вы можете достичь чего-то похожего на range.MoveEnd () с Word.js, вам просто нужно определить до конца что;). Один из способов сделать это - использовать метод range.expandTo (endRange). Опять же, интересно то, как получить «endRange», поэтому в следующем примере показано, как это сделать, если «end» означает конец абзаца, вероятно, в вашем сценарии будет достаточно.

async function run() {
    await Word.run(async (context) => {
        //assume the range at the end of your 255 characters.
        var startRange = context.document.getSelection().getRange("end"); 
        //This one is the range at the end of the paragraph including the selection.
        var endRange = context.document.getSelection().paragraphs.getLast().getRange("end");

        var deltaRange = startRange.expandTo(endRange);
        context.load(deltaRange);

        await context.sync();
        // this will print the characters after the range all the way to the end of the paragraph.
        console.log(deltaRange.text);
    });
}

надеюсь, это поможет или, по крайней мере, настроит вас в правильном направлении.

...