devexpress-richedit
Version:
DevExpress Rich Text Editor is an advanced word-processing tool designed for working with rich text documents.
76 lines (75 loc) • 3.61 kB
JavaScript
import { BackwardCharacterIterator, ForwardCharacterIterator } from '../../model/find-replace-helper';
import { SimpleCommandState } from '../command-states';
import { DialogParametersBase, ShowDialogCommandBase } from './show-dialog-command-base';
export class DialogFindReplaceCommand extends ShowDialogCommandBase {
getState() {
return new SimpleCommandState(this.isEnabled());
}
createParameters(_options) {
var parameters = new FindReplaceDialogParameters();
parameters.controller = this.control.searchManager;
return parameters;
}
applyParameters(_state, _params) {
return true;
}
getDialogName() {
return "FindReplace";
}
isEnabledInReadOnlyMode() {
return true;
}
isModal() {
return false;
}
static getTextForResult(control, subDocument, interval) {
let entryContextRadius = 20;
let paragraphInterval = subDocument.getParagraphByPosition(interval.start).interval;
let searchPartText = DialogFindReplaceCommand.getTextForward(control, subDocument, interval.start, interval.end, interval.length);
let leftPartText = DialogFindReplaceCommand.getTextBackward(control, subDocument, interval.start, paragraphInterval.start, entryContextRadius);
let rightPartText = DialogFindReplaceCommand.getTextForward(control, subDocument, interval.end, paragraphInterval.end, entryContextRadius);
let resultText = `${encodeHtml(leftPartText)}${`<b>${encodeHtml(searchPartText)}</b>`}${encodeHtml(rightPartText)}`;
return resultText;
}
static getTextForward(control, subDocument, startPosition, endPosition, length) {
let text = "";
const charIterator = new ForwardCharacterIterator(control.modelManager, control.layoutFormatterManager, control.selection.pageIndex, subDocument, startPosition, endPosition);
while (charIterator.nextChar() && text.length < length)
text += charIterator.char;
return charIterator.iterator.intervalEnd > charIterator.getCurrLogPosition() && text.length === length && charIterator.nextChar() ? text + "..." : text;
}
static getTextBackward(control, subDocument, startPosition, endPosition, length) {
let text = "";
const charIterator = new BackwardCharacterIterator(control.modelManager, control.layoutFormatterManager, control.selection.pageIndex, subDocument, endPosition, startPosition);
while (charIterator.prevChar() && text.length < length)
text = charIterator.char + text;
return charIterator.iterator.intervalStart < charIterator.getCurrLogPosition() && text.length === length && charIterator.prevChar() ? "..." + text : text;
}
}
export class FindReplaceDialogParameters extends DialogParametersBase {
copyFrom(obj) {
super.copyFrom(obj);
this.controller = obj.controller;
}
clone() {
const newInstance = new FindReplaceDialogParameters();
newInstance.copyFrom(this);
return newInstance;
}
applyConverter(_converter) {
return this;
}
}
function encodeHtml(html) {
const replTable = [
[/&/g, '&x;'], [/&/g, '&'],
[/"/g, '"x;'], [/"/g, '"'],
[/</g, '<x;'], [/</g, '<'],
[/>/g, '>x;'], [/>/g, '>']
];
for (var i = 0; i < replTable.length; i++) {
var replacement = replTable[i];
html = html.replace(replacement[0], replacement[1]);
}
return html;
}