Skip to content

Commit 30a6878

Browse files
authored
feat: add optional indentWidth (#175)
1 parent 624e0f1 commit 30a6878

File tree

3 files changed

+18
-7
lines changed

3 files changed

+18
-7
lines changed

core/README.md

+4
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,10 @@ interface TextareaCodeEditorProps extends React.TextareaHTMLAttributes<HTMLTextA
294294
*/
295295
minHeight?: number;
296296
onKeyDown?: (event: React.KeyboardEvent<HTMLTextAreaElement>) => void | boolean;
297+
/**
298+
* The number of spaces for indentation when pressing tab key. Default: `2`.
299+
*/
300+
indentWidth?: number
297301
}
298302
```
299303

core/src/Editor.tsx

+6-1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@ export interface TextareaCodeEditorProps extends React.TextareaHTMLAttributes<HT
3131
*/
3232
minHeight?: number;
3333
onKeyDown?: (event: React.KeyboardEvent<HTMLTextAreaElement>) => void | boolean;
34+
/**
35+
* The number of spaces for indentation when pressing tab key. Default: `2`.
36+
*/
37+
indentWidth?: number;
3438
}
3539

3640
export default React.forwardRef<HTMLTextAreaElement, TextareaCodeEditorProps>((props, ref) => {
@@ -46,6 +50,7 @@ export default React.forwardRef<HTMLTextAreaElement, TextareaCodeEditorProps>((p
4650
style,
4751
rehypePlugins,
4852
onChange,
53+
indentWidth = 2,
4954
...other
5055
} = props;
5156

@@ -93,7 +98,7 @@ export default React.forwardRef<HTMLTextAreaElement, TextareaCodeEditorProps>((p
9398
const keyDown = (evn: React.KeyboardEvent<HTMLTextAreaElement>) => {
9499
if (other.readOnly) return;
95100
if (!other.onKeyDown || other.onKeyDown(evn) !== false) {
96-
shortcuts(evn);
101+
shortcuts(evn, indentWidth);
97102
}
98103
};
99104

core/src/shortcuts.ts

+8-6
Original file line numberDiff line numberDiff line change
@@ -2,28 +2,30 @@ import React from 'react';
22
import { stopPropagation } from './utils';
33
import { SelectionText } from './SelectionText';
44

5-
export default function shortcuts(e: React.KeyboardEvent<HTMLTextAreaElement>) {
5+
export default function shortcuts(e: React.KeyboardEvent<HTMLTextAreaElement>, indentWidth: number = 2) {
66
const api = new SelectionText(e.target as HTMLTextAreaElement);
77
/**
88
* Support of shortcuts for React v16
99
* https://github.com/uiwjs/react-textarea-code-editor/issues/128
1010
* https://blog.saeloun.com/2021/04/23/react-keyboard-event-code.html
1111
*/
1212
const code = (e.code || e.nativeEvent.code).toLocaleLowerCase();
13+
const indent = ' '.repeat(indentWidth);
14+
1315
if (code === 'tab') {
1416
stopPropagation(e);
1517
if (api.start === api.end) {
1618
if (e.shiftKey) {
17-
api.lineStarRemove(' ');
19+
api.lineStarRemove(indent);
1820
} else {
19-
api.insertText(' ').position(api.start + 2, api.end + 2);
21+
api.insertText(indent).position(api.start + indentWidth, api.end + indentWidth);
2022
}
2123
} else if (api.getSelectedValue().indexOf('\n') > -1 && e.shiftKey) {
22-
api.lineStarRemove(' ');
24+
api.lineStarRemove(indent);
2325
} else if (api.getSelectedValue().indexOf('\n') > -1) {
24-
api.lineStarInstert(' ');
26+
api.lineStarInstert(indent);
2527
} else {
26-
api.insertText(' ').position(api.start + 2, api.end);
28+
api.insertText(indent).position(api.start + indentWidth, api.end);
2729
}
2830
api.notifyChange();
2931
} else if (code === 'enter') {

0 commit comments

Comments
 (0)