mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-11-02 20:44:13 +01:00 
			
		
		
		
	Amended the logic for newPrefix in the MarkdownEditor to resolve incorrect number ordering. Fixes #33184 Attached screenshot of fixed input similar to issue <img width="175" alt="Screenshot 2025-01-09 at 23 59 24" src="https://github.com/user-attachments/assets/dfa23cf1-f3db-4b5e-99d2-a71bbcb289a8" /> --------- Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
		
			
				
	
	
		
			204 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			204 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
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. [ ] ');
 | 
						|
});
 |