| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204 |
- import {initTextareaMarkdown, markdownHandleIndention, textareaSplitLines} from './EditorMarkdown.ts';
-
- test('textareaSplitLines', () => {
- let ret = textareaSplitLines('a\nbc\nd', 0);
- expect(ret).toEqual({lines: ['a', 'bc', 'd'], lengthBeforePosLine: 0, posLineIndex: 0, inlinePos: 0});
-
- ret = textareaSplitLines('a\nbc\nd', 1);
- expect(ret).toEqual({lines: ['a', 'bc', 'd'], lengthBeforePosLine: 0, posLineIndex: 0, inlinePos: 1});
-
- ret = textareaSplitLines('a\nbc\nd', 2);
- expect(ret).toEqual({lines: ['a', 'bc', 'd'], lengthBeforePosLine: 2, posLineIndex: 1, inlinePos: 0});
-
- ret = textareaSplitLines('a\nbc\nd', 3);
- expect(ret).toEqual({lines: ['a', 'bc', 'd'], lengthBeforePosLine: 2, posLineIndex: 1, inlinePos: 1});
-
- ret = textareaSplitLines('a\nbc\nd', 4);
- expect(ret).toEqual({lines: ['a', 'bc', 'd'], lengthBeforePosLine: 2, posLineIndex: 1, inlinePos: 2});
-
- ret = textareaSplitLines('a\nbc\nd', 5);
- expect(ret).toEqual({lines: ['a', 'bc', 'd'], lengthBeforePosLine: 5, posLineIndex: 2, inlinePos: 0});
-
- ret = textareaSplitLines('a\nbc\nd', 6);
- expect(ret).toEqual({lines: ['a', 'bc', 'd'], lengthBeforePosLine: 5, posLineIndex: 2, inlinePos: 1});
- });
-
- test('markdownHandleIndention', () => {
- const testInput = (input: string, expected?: string) => {
- const inputPos = input.indexOf('|');
- input = input.replace('|', '');
- const ret = markdownHandleIndention({value: input, selStart: inputPos, selEnd: inputPos});
- if (expected === null) {
- expect(ret).toEqual({handled: false});
- } else {
- const expectedPos = expected.indexOf('|');
- expected = expected.replace('|', '');
- expect(ret).toEqual({
- handled: true,
- valueSelection: {value: expected, selStart: expectedPos, selEnd: expectedPos},
- });
- }
- };
-
- testInput(`
- a|b
- `, `
- a
- |b
- `);
-
- testInput(`
- 1. a
- 2. |
- `, `
- 1. a
- |
- `);
-
- testInput(`
- |1. a
- `, null); // let browser handle it
-
- testInput(`
- 1. a
- 1. b|c
- `, `
- 1. a
- 2. b
- 3. |c
- `);
-
- testInput(`
- 2. a
- 2. b|
-
- 1. x
- 1. y
- `, `
- 1. a
- 2. b
- 3. |
-
- 1. x
- 1. y
- `);
-
- testInput(`
- 2. a
- 2. b
-
- 1. x|
- 1. y
- `, `
- 2. a
- 2. b
-
- 1. x
- 2. |
- 3. y
- `);
-
- testInput(`
- 1. a
- 2. b|
- 3. c
- `, `
- 1. a
- 2. b
- 3. |
- 4. c
- `);
-
- testInput(`
- 1. a
- 1. b
- 2. b
- 3. b
- 4. b
- 1. c|
- `, `
- 1. a
- 1. b
- 2. b
- 3. b
- 4. b
- 2. c
- 3. |
- `);
-
- testInput(`
- 1. a
- 2. a
- 3. a
- 4. a
- 5. a
- 6. a
- 7. a
- 8. a
- 9. b|c
- `, `
- 1. a
- 2. a
- 3. a
- 4. a
- 5. a
- 6. a
- 7. a
- 8. a
- 9. b
- 10. |c
- `);
-
- // this is a special case, it's difficult to re-format the parent level at the moment, so leave it to the future
- testInput(`
- 1. a
- 2. b|
- 3. c
- `, `
- 1. a
- 1. b
- 2. |
- 3. c
- `);
- });
-
- test('EditorMarkdown', () => {
- const textarea = document.createElement('textarea');
- initTextareaMarkdown(textarea);
-
- type ValueWithCursor = string | {
- value: string;
- pos: number;
- };
- const testInput = (input: ValueWithCursor, result: ValueWithCursor) => {
- const intputValue = typeof input === 'string' ? input : input.value;
- const inputPos = typeof input === 'string' ? intputValue.length : input.pos;
- textarea.value = intputValue;
- textarea.setSelectionRange(inputPos, inputPos);
-
- const e = new KeyboardEvent('keydown', {key: 'Enter', cancelable: true});
- textarea.dispatchEvent(e);
- if (!e.defaultPrevented) textarea.value += '\n'; // simulate default behavior
-
- const expectedValue = typeof result === 'string' ? result : result.value;
- const expectedPos = typeof result === 'string' ? expectedValue.length : result.pos;
- expect(textarea.value).toEqual(expectedValue);
- expect(textarea.selectionStart).toEqual(expectedPos);
- };
-
- testInput('-', '-\n');
- testInput('1.', '1.\n');
-
- testInput('- ', '');
- testInput('1. ', '');
- testInput({value: '1. \n2. ', pos: 3}, {value: '\n2. ', pos: 0});
-
- testInput('- x', '- x\n- ');
- testInput('1. foo', '1. foo\n2. ');
- testInput({value: '1. a\n2. b\n3. c', pos: 4}, {value: '1. a\n2. \n3. b\n4. c', pos: 8});
- testInput('- [ ]', '- [ ]\n- ');
- testInput('- [ ] foo', '- [ ] foo\n- [ ] ');
- testInput('* [x] foo', '* [x] foo\n* [ ] ');
- testInput('1. [x] foo', '1. [x] foo\n2. [ ] ');
- });
|