@skbkontur/markdown 2.7.0-alpha.0 → 2.7.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@skbkontur/markdown",
3
- "version": "2.7.0-alpha.0",
3
+ "version": "2.7.0-alpha.1",
4
4
  "packageManager": "yarn@4.13.0",
5
5
  "publishConfig": {
6
6
  "registry": "https://registry.npmjs.org/",
@@ -82,5 +82,41 @@ kind('Markdown', () => {
82
82
  openedEmojiPicker,
83
83
  });
84
84
  });
85
+ test('autoContinueNumberedList', async (context) => {
86
+ const textarea = context.webdriver.locator('textarea').nth(0);
87
+ await textarea.click();
88
+ await textarea.type('1. Первый');
89
+ await textarea.press('Enter');
90
+ const autoContinueNumberedList = await context.takeScreenshot();
91
+ await context.matchImages({ autoContinueNumberedList });
92
+ });
93
+ test('autoContinueNumberedListWithTail', async (context) => {
94
+ const textarea = context.webdriver.locator('textarea').nth(0);
95
+ await textarea.click();
96
+ await textarea.type('1. Первый');
97
+ await textarea.press('Enter');
98
+ await textarea.type('Второй');
99
+ await textarea.press('Control+Home');
100
+ await textarea.press('End');
101
+ await textarea.press('Enter');
102
+ const autoContinueNumberedListWithTail = await context.takeScreenshot();
103
+ await context.matchImages({ autoContinueNumberedListWithTail });
104
+ });
105
+ test('autoContinueUnorderedList', async (context) => {
106
+ const textarea = context.webdriver.locator('textarea').nth(0);
107
+ await textarea.click();
108
+ await textarea.type('- Первый');
109
+ await textarea.press('Enter');
110
+ const autoContinueUnorderedList = await context.takeScreenshot();
111
+ await context.matchImages({ autoContinueUnorderedList });
112
+ });
113
+ test('autoContinueCheckboxList', async (context) => {
114
+ const textarea = context.webdriver.locator('textarea').nth(0);
115
+ await textarea.click();
116
+ await textarea.type('- [ ] Первый');
117
+ await textarea.press('Enter');
118
+ const autoContinueCheckboxList = await context.takeScreenshot();
119
+ await context.matchImages({ autoContinueCheckboxList });
120
+ });
85
121
  });
86
122
  });
@@ -84,27 +84,24 @@ export const usePasteFromClipboard = (textarea, uploadFileApi, downloadFileApi,
84
84
  const { uploadFile } = useFileLogic(uploadFileApi, downloadFileApi, fileApiUrl, textarea);
85
85
  const textareaNode = textarea?.node;
86
86
  useEffect(() => {
87
- if (downloadFileApi && uploadFileApi) {
88
- const handlePaste = (event) => {
89
- const files = event?.clipboardData?.files;
90
- const html = event?.clipboardData
91
- ?.getData('text/html')
92
- ?.replace(`<meta charset='utf-8'>`, '')
93
- ?.replace(`<meta charset="utf-8">`, '');
94
- if (files?.length) {
95
- event.preventDefault();
96
- void uploadFile(files[0]);
97
- return;
98
- }
99
- if (html) {
100
- getPastedHtml(html, event, textareaNode);
101
- return;
102
- }
103
- };
104
- if (textareaNode) {
105
- textareaNode.addEventListener('paste', handlePaste);
87
+ const handlePaste = (event) => {
88
+ const files = event?.clipboardData?.files;
89
+ const html = event?.clipboardData
90
+ ?.getData('text/html')
91
+ ?.replace(`<meta charset='utf-8'>`, '')
92
+ ?.replace(`<meta charset="utf-8">`, '');
93
+ if (downloadFileApi && uploadFileApi && files?.length) {
94
+ event.preventDefault();
95
+ void uploadFile(files[0]);
96
+ return;
106
97
  }
107
- return () => textareaNode?.removeEventListener('paste', handlePaste);
108
- }
98
+ if (html) {
99
+ getPastedHtml(html, event, textareaNode);
100
+ return;
101
+ }
102
+ };
103
+ if (textareaNode)
104
+ textareaNode.addEventListener('paste', handlePaste);
105
+ return () => textareaNode?.removeEventListener('paste', handlePaste);
109
106
  }, [downloadFileApi, textareaNode, uploadFile, uploadFileApi]);
110
107
  };
@@ -24,8 +24,19 @@ export function handleMarkdownListEnter(event, textareaNode) {
24
24
  textareaNode.setSelectionRange(currentLineStartIndex, currentLineEndIndex);
25
25
  return document.execCommand('delete');
26
26
  }
27
- if (orderedListNumber && orderedListDelimiter)
28
- return onInsertText(`\n${spacesBeforeMarker}${Number(orderedListNumber) + 1}${orderedListDelimiter} `);
27
+ if (orderedListNumber && orderedListDelimiter) {
28
+ const nextOrderedListNumber = Number(orderedListNumber) + 1;
29
+ const newLine = `\n${spacesBeforeMarker}${nextOrderedListNumber}${orderedListDelimiter} `;
30
+ const renumberedRestLines = getRestLinesWithRenumberedList(value, currentLineEndIndex, spacesBeforeMarker, orderedListDelimiter, nextOrderedListNumber + 1);
31
+ if (renumberedRestLines) {
32
+ const currentLineTextAfterCursor = value.slice(selectionStart, currentLineEndIndex);
33
+ textareaNode.setSelectionRange(selectionStart, value.length);
34
+ onInsertText(`${newLine}${currentLineTextAfterCursor}${renumberedRestLines}`);
35
+ const cursorPosition = selectionStart + newLine.length;
36
+ return textareaNode.setSelectionRange(cursorPosition, cursorPosition);
37
+ }
38
+ return onInsertText(newLine);
39
+ }
29
40
  if (checkboxListMarker)
30
41
  return onInsertText(`\n${spacesBeforeMarker}${unorderedListMarker} ${checkboxListMarker} `);
31
42
  if (unorderedListMarker)
@@ -43,3 +54,18 @@ function getCurrentLineEndIndex(text, cursorPosition) {
43
54
  return text.length;
44
55
  return currentLineEndIndex;
45
56
  }
57
+ function getRestLinesWithRenumberedList(value, currentLineEndIndex, spacesBeforeMarker, orderedListDelimiter, nextOrderedListNumber) {
58
+ const lines = value.slice(currentLineEndIndex).split('\n');
59
+ let currentOrderedListNumber = nextOrderedListNumber;
60
+ for (let i = 1; i < lines.length; i += 1) {
61
+ const listLineMatch = lines[i].match(listItemRegExp);
62
+ const groups = listLineMatch?.groups;
63
+ if (!groups?.orderedListNumber ||
64
+ groups.spacesBeforeMarker !== spacesBeforeMarker ||
65
+ groups.orderedListDelimiter !== orderedListDelimiter)
66
+ break;
67
+ lines[i] = lines[i].replace(`${spacesBeforeMarker}${groups.orderedListNumber}${orderedListDelimiter}`, `${spacesBeforeMarker}${currentOrderedListNumber}${orderedListDelimiter}`);
68
+ currentOrderedListNumber += 1;
69
+ }
70
+ return lines.join('\n');
71
+ }