1
0
mirror of https://github.com/laurent22/joplin.git synced 2024-12-24 10:27:10 +02:00
joplin/packages/editor/CodeMirror/utils/biDirectionalTextExtension.ts

41 lines
1.2 KiB
TypeScript

import { Extension, RangeSetBuilder } from '@codemirror/state';
import { Decoration, DecorationSet, EditorView, ViewPlugin, ViewUpdate } from '@codemirror/view';
const autoTextDirectionDecoration = Decoration.line({
attributes: { dir: 'auto' },
});
const biDirectionalTextExtension: Extension = [
EditorView.perLineTextDirection.of(true),
ViewPlugin.fromClass(class {
public decorations: DecorationSet;
public constructor(view: EditorView) {
this.decorations = this.buildDecorations(view);
}
public update(update: ViewUpdate) {
if (update.docChanged || update.viewportChanged) {
this.decorations = this.buildDecorations(update.view);
}
}
private buildDecorations(view: EditorView) {
const builder = new RangeSetBuilder<Decoration>();
for (const { from, to } of view.visibleRanges) {
const fromLine = view.state.doc.lineAt(from);
const toLine = view.state.doc.lineAt(to);
for (let i = fromLine.number; i <= toLine.number; i++) {
const line = view.state.doc.line(i);
if (line.text) {
builder.add(line.from, line.from, autoTextDirectionDecoration);
}
}
}
return builder.finish();
}
}, { decorations: v => v.decorations }),
];
export default biDirectionalTextExtension;