/** * Copyright 2023-present DreamNum Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import type { Nullable } from '@univerjs/core'; import type { IFindComplete, IFindReplaceState } from '@univerjs/find-replace'; import { Disposable, Injector, IUniverInstanceService } from '@univerjs/core'; import { IFindReplaceService } from '@univerjs/find-replace'; import { FRange } from '@univerjs/sheets/facade'; /** * @ignore */ export interface IFTextFinder { /** * Get all the matched cells of the current sheet, the current matched cell is the last matched cell. * If current sheet changed, use `await textFinder.ensureCompleteAsync()` to ensure the find operation is completed. * @returns {FRange[]} All the matched cells. * @throws If the find operation is not completed. * @example * ```typescript * // Assume the current sheet is empty sheet. * const fWorkbook = univerAPI.getActiveWorkbook(); * const fWorksheet = fWorkbook.getSheetByName('Sheet1'); * if (!fWorksheet) return; * const fRange = fWorksheet.getRange('A1:D10'); * fRange.setValues([ * [1, 2, 3, 4], * [2, 3, 4, 5], * [3, 4, 5, 6], * [4, 5, 6, 7], * [5, 6, 7, 8], * [6, 7, 8, 9], * [7, 8, 9, 10], * [8, 9, 10, 11], * [9, 10, 11, 12], * [10, 11, 12, 13] * ]); * * // Create a text-finder to find the text '5'. * const textFinder = await univerAPI.createTextFinderAsync('5'); * * // Find all cells that contain the text '5'. * const matchCells = textFinder.findAll(); * matchCells.forEach((cell) => { * console.log(cell.getA1Notation()); // D2, C3, B4, A5 * }); * ``` */ findAll(): FRange[]; /** * Get the next matched cell of the current sheet, if exists return the next matched cell and move the current matched cell to the next matched cell. * If current sheet changed, use `await textFinder.ensureCompleteAsync()` to ensure the find operation is completed. * @returns {Nullable} The next matched cell. * @throws If the find operation is not completed. * @example * ```typescript * // Assume the current sheet is empty sheet. * const fWorkbook = univerAPI.getActiveWorkbook(); * const fWorksheet = fWorkbook.getSheetByName('Sheet1'); * if (!fWorksheet) return; * const fRange = fWorksheet.getRange('A1:D10'); * fRange.setValues([ * [1, 2, 3, 4], * [2, 3, 4, 5], * [3, 4, 5, 6], * [4, 5, 6, 7], * [5, 6, 7, 8], * [6, 7, 8, 9], * [7, 8, 9, 10], * [8, 9, 10, 11], * [9, 10, 11, 12], * [10, 11, 12, 13] * ]); * * // Create a text-finder to find the text '5'. * const textFinder = await univerAPI.createTextFinderAsync('5'); * console.log(textFinder.getCurrentMatch().getA1Notation()); // current match cell is A5 * * // Find the next matched range * const nextMatch = textFinder.findNext(); * console.log(nextMatch.getA1Notation()); // D2 * console.log(textFinder.getCurrentMatch().getA1Notation()); // current match cell is D2 * ``` */ findNext(): Nullable; /** * Get the previous matched cell of the current sheet, if exists return the previous matched cell and move the current matched cell to the previous matched cell. * If current sheet changed, use `await textFinder.ensureCompleteAsync()` to ensure the find operation is completed. * @returns {Nullable} The previous matched cell. * @throws If the find operation is not completed. * @example * ```typescript * // Assume the current sheet is empty sheet. * const fWorkbook = univerAPI.getActiveWorkbook(); * const fWorksheet = fWorkbook.getSheetByName('Sheet1'); * if (!fWorksheet) return; * const fRange = fWorksheet.getRange('A1:D10'); * fRange.setValues([ * [1, 2, 3, 4], * [2, 3, 4, 5], * [3, 4, 5, 6], * [4, 5, 6, 7], * [5, 6, 7, 8], * [6, 7, 8, 9], * [7, 8, 9, 10], * [8, 9, 10, 11], * [9, 10, 11, 12], * [10, 11, 12, 13] * ]); * * // Create a text-finder to find the text '5'. * const textFinder = await univerAPI.createTextFinderAsync('5'); * console.log(textFinder.getCurrentMatch().getA1Notation()); // current match cell is A5 * * // Find the previous matched range. * const previousMatch = textFinder.findPrevious(); * console.log(previousMatch.getA1Notation()); // B4 * console.log(textFinder.getCurrentMatch().getA1Notation()); // current match cell is B4 * ``` */ findPrevious(): Nullable; /** * Get the current matched cell of the current sheet. * If current sheet changed, use `await textFinder.ensureCompleteAsync()` to ensure the find operation is completed. * @returns {Nullable} The current matched cell. * @throws If the find operation is not completed. * @example * ```typescript * // Assume the current sheet is empty sheet. * const fWorkbook = univerAPI.getActiveWorkbook(); * const fWorksheet = fWorkbook.getSheetByName('Sheet1'); * if (!fWorksheet) return; * const fRange = fWorksheet.getRange('A1:D10'); * fRange.setValues([ * [1, 2, 3, 4], * [2, 3, 4, 5], * [3, 4, 5, 6], * [4, 5, 6, 7], * [5, 6, 7, 8], * [6, 7, 8, 9], * [7, 8, 9, 10], * [8, 9, 10, 11], * [9, 10, 11, 12], * [10, 11, 12, 13] * ]); * * // Create a text-finder to find the text '5'. * const textFinder = await univerAPI.createTextFinderAsync('5'); * * // Get the current matched range. * const currentMatch = textFinder.getCurrentMatch(); * console.log(currentMatch.getA1Notation()); // A5 * ``` */ getCurrentMatch(): Nullable; /** * Set the match case option, if true, the find operation will match case, otherwise, the find operation will ignore case. * If current sheet changed, use `await textFinder.ensureCompleteAsync()` to ensure the find operation is completed. * @param {boolean} matchCase - Whether to match case. * @returns {Promise} The text-finder instance. * @example * ```typescript * // Assume the current sheet is empty sheet. * const fWorkbook = univerAPI.getActiveWorkbook(); * const fWorksheet = fWorkbook.getSheetByName('Sheet1'); * if (!fWorksheet) return; * const fRange = fWorksheet.getRange('A1:D1'); * fRange.setValues([ * ['hello univer', 'hello UNIVER', 'HELLO UNIVER', 'HELLO univer'], * ]); * * // Create a text-finder to find the text 'univer'. * const textFinder = await univerAPI.createTextFinderAsync('univer'); * let matchCells = textFinder.findAll(); * matchCells.forEach((cell) => { * console.log(cell.getA1Notation()); // A1, B1, C1, D1 * }); * * // Set the match case. * await textFinder.matchCaseAsync(true); * matchCells = textFinder.findAll(); * matchCells.forEach((cell) => { * console.log(cell.getA1Notation()); // A1, D1 * }); * ``` */ matchCaseAsync(matchCase: boolean): Promise; /** * Set the match entire cell option, if true, the find operation will match entire cell value, otherwise, the find operation will match part of the cell value. * If current sheet changed, use `await textFinder.ensureCompleteAsync()` to ensure the find operation is completed. * @param {boolean} matchEntireCell - Whether to match entire cell value. * @returns {Promise} The text-finder instance. * @example * ```typescript * // Assume the current sheet is empty sheet. * const fWorkbook = univerAPI.getActiveWorkbook(); * const fWorksheet = fWorkbook.getSheetByName('Sheet1'); * if (!fWorksheet) return; * const fRange = fWorksheet.getRange('A1:D1'); * fRange.setValues([ * ['hello univer', 'hello univer 1', 'hello univer 2', 'hello univer 3'], * ]); * * // Create a text-finder to find the text 'hello univer'. * const textFinder = await univerAPI.createTextFinderAsync('hello univer'); * let matchCells = textFinder.findAll(); * matchCells.forEach((cell) => { * console.log(cell.getA1Notation()); // A1, B1, C1, D1 * }); * * // Set the match entire cell. * await textFinder.matchEntireCellAsync(true); * matchCells = textFinder.findAll(); * matchCells.forEach((cell) => { * console.log(cell.getA1Notation()); // A1 * }); * ``` */ matchEntireCellAsync(matchEntireCell: boolean): Promise; /** * Set the match formula text option, if true, the find operation will match formula text, otherwise, the find operation will match value. * If current sheet changed, use `await textFinder.ensureCompleteAsync()` to ensure the find operation is completed. * @param {boolean} matchFormulaText - Whether to match formula text. * @returns {Promise} The text-finder instance. * @example * ```typescript * // Assume the current sheet is empty sheet. * const fWorkbook = univerAPI.getActiveWorkbook(); * const fWorksheet = fWorkbook.getSheetByName('Sheet1'); * if (!fWorksheet) return; * const fRange = fWorksheet.getRange('A1:D1'); * fRange.setValues([ * ['sum', '1', '=SUM(2)', '3'], * ]); * * // Create a text-finder to find the text 'sum'. * const textFinder = await univerAPI.createTextFinderAsync('sum'); * let matchCells = textFinder.findAll(); * matchCells.forEach((cell) => { * console.log(cell.getA1Notation()); // A1 * }); * * // Set the match entire cell. * await textFinder.matchFormulaTextAsync(true); * matchCells = textFinder.findAll(); * matchCells.forEach((cell) => { * console.log(cell.getA1Notation()); // A1, C1 * }); * ``` */ matchFormulaTextAsync(matchFormulaText: boolean): Promise; /** * Replace all the matched text with the given text. * If current sheet changed, use `await textFinder.ensureCompleteAsync()` to ensure the find operation is completed. * @param {string} replaceText - The text to replace. * @returns {Promise} The count of replaced text. * @throws If the find operation is not completed. * @example * ```typescript * // Assume the current sheet is empty sheet. * const fWorkbook = univerAPI.getActiveWorkbook(); * const fWorksheet = fWorkbook.getSheetByName('Sheet1'); * if (!fWorksheet) return; * const fRange = fWorksheet.getRange('A1:D1'); * fRange.setValues([ * ['hello', 'hello', 'hello', 'hello'], * ]); * * // Create a text-finder to find the text 'hello'. * const textFinder = await univerAPI.createTextFinderAsync('hello'); * * // Replace all the matched text with 'hello univer'. * const count = await textFinder.replaceAllWithAsync('hello univer'); * console.log(count); // 4 * console.log(fRange.getValues()); // [['hello univer', 'hello univer', 'hello univer', 'hello univer']] * ``` */ replaceAllWithAsync(replaceText: string): Promise; /** * Replace the current matched text with the given text. * If current sheet changed, use `await textFinder.ensureCompleteAsync()` to ensure the find operation is completed. * @param {string} replaceText - The text to replace. * @returns {Promise} Whether the replace is successful. * @throws If the find operation is not completed. * @example * ```typescript * // Assume the current sheet is empty sheet. * const fWorkbook = univerAPI.getActiveWorkbook(); * const fWorksheet = fWorkbook.getSheetByName('Sheet1'); * if (!fWorksheet) return; * const fRange = fWorksheet.getRange('B1:E1'); * fRange.setValues([ * ['hello', 'hello', 'hello', 'hello'], * ]); * * // Create a text-finder to find the text 'hello'. * const textFinder = await univerAPI.createTextFinderAsync('hello'); * * // Replace the current matched text with 'hello univer'. * const replaced = await textFinder.replaceWithAsync('hello univer'); * console.log(replaced); // true * console.log(fRange.getValues()); // [['hello', 'hello', 'hello', 'hello univer']] * ``` */ replaceWithAsync(replaceText: string): Promise; /** * Ensure the find operation is completed. Especially when the current sheet changed use this method to ensure the find operation is completed. * @returns {Promise>} The find complete result. * @example * ```typescript * // Create a text-finder to find the text '1'. * const textFinder = await univerAPI.createTextFinderAsync('1'); * * // Find all cells that contain the text '1'. * const matchCells = textFinder.findAll(); * matchCells.forEach((cell) => { * console.log(cell.getA1Notation()); * }); * * const fWorkbook = univerAPI.getActiveWorkbook(); * const sheets = fWorkbook.getSheets(); * * // Change the current sheet to the second sheet. * sheets[1]?.activate(); * * // Ensure the find operation is completed of the current sheet. * await textFinder.ensureCompleteAsync(); * const matchCells2 = textFinder.findAll(); * matchCells2.forEach((cell) => { * console.log(cell.getA1Notation()); * }); * ``` */ ensureCompleteAsync(): Promise>; } /** * This interface class provides methods to find and replace text in the univer. * @hideconstructor */ export declare class FTextFinder extends Disposable implements IFTextFinder { private readonly _injector; private readonly _univerInstanceService; private readonly _findReplaceService; private readonly _state; private _model; private _complete; constructor(_initialState: Partial, _injector: Injector, _univerInstanceService: IUniverInstanceService, _findReplaceService: IFindReplaceService); findAll(): FRange[]; findNext(): Nullable; findPrevious(): Nullable; getCurrentMatch(): Nullable; matchCaseAsync(matchCase: boolean): Promise; matchEntireCellAsync(matchEntireCell: boolean): Promise; matchFormulaTextAsync(matchFormulaText: boolean): Promise; replaceAllWithAsync(replaceText: string): Promise; replaceWithAsync(replaceText: string): Promise; ensureCompleteAsync(): Promise>; private _findMatchToFRange; }