remark-break-line 0.0.8 → 0.0.10

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/lib/index.d.ts CHANGED
@@ -1,10 +1,17 @@
1
1
  /**
2
2
  * Turn gemoji shortcodes (`:+1:`) into emoji (`👍`).
3
- *
3
+ * @param {Object} [param0={}]
4
+ * @param {number} [param0.maxLineLength=80]
5
+ * @param {boolean} [param0.removeLinebreaks=false]
6
+ * @param {string[]} [param0.mergableElements=[]]
7
+ * @param {boolean}[param0.removeMultpleSpaces=false]
4
8
  * @returns
5
9
  * Transform.
6
10
  */
7
- export default function remarkBreakLongLines({ maxLineLength }?: {
11
+ export default function remarkBreakLongLines({ maxLineLength, removeLinebreaks: removeLinebreaksAndMultipleSpaces, mergableElements }?: {
8
12
  maxLineLength?: number | undefined;
9
- }): (tree: Root) => undefined;
13
+ removeLinebreaks?: boolean | undefined;
14
+ mergableElements?: string[] | undefined;
15
+ removeMultpleSpaces?: boolean | undefined;
16
+ } | undefined): (tree: Root) => undefined;
10
17
  export type Root = import("mdast").Root;
package/lib/index.js CHANGED
@@ -3,6 +3,7 @@
3
3
  */
4
4
 
5
5
  import { assert } from 'console'
6
+ import { text } from 'stream/consumers'
6
7
  import { visit } from 'unist-util-visit'
7
8
 
8
9
  /**
@@ -29,11 +30,15 @@ const elementSize = {
29
30
 
30
31
  /**
31
32
  * Turn gemoji shortcodes (`:+1:`) into emoji (`👍`).
32
- *
33
+ * @param {Object} [param0={}]
34
+ * @param {number} [param0.maxLineLength=80]
35
+ * @param {boolean} [param0.removeLinebreaksAndMultipleSpaces=false]
36
+ * @param {string[]} [param0.mergableElements=[]]
37
+ * @param {boolean}[param0.removeMultpleSpaces=false]
33
38
  * @returns
34
39
  * Transform.
35
40
  */
36
- export default function remarkBreakLongLines({ maxLineLength = 80, removeLinebreaks = false } = {}) {
41
+ export default function remarkBreakLongLines({ maxLineLength = 80, removeLinebreaksAndMultipleSpaces = false, mergableElements = [] } = {}) {
37
42
  /**
38
43
  * Transform.
39
44
  *
@@ -50,21 +55,62 @@ export default function remarkBreakLongLines({ maxLineLength = 80, removeLinebre
50
55
 
51
56
  /**
52
57
  *
53
- * @param {typeof node.children[number]} n
58
+ * @param {typeof node.children[number]|typeof node} n
54
59
  */
55
- const prepare = (n) => {
60
+ const removeLineBrakesWalker = (n) => {
56
61
  if (n.type === 'text' && n.value.length > 0) {
57
- n.value = n.value.replaceAll(/[\r\n]+/g, ' ').replaceAll(/ {2..}/g, ' ');
62
+ n.value = n.value.replaceAll(/[\r\n]+/g, ' ').replaceAll(/ {2,}/g, ' ');
58
63
  } else if ('children' in n) {
59
64
  for (let i = 0; i < n.children.length; i++) {
60
65
  const element = n.children[i]
61
66
  if (element.type in elementSize) {
62
- prepare(element);
67
+ removeLineBrakesWalker(element);
63
68
  }
64
69
  }
65
70
  }
66
71
  };
67
72
 
73
+ /**
74
+ *
75
+ * @param {typeof node.children[number]|typeof node} n
76
+ */
77
+ const mergeElements = (n) => {
78
+ if ('children' in n) {
79
+ for (let i = 0; i < n.children.length; i++) {
80
+ const element = n.children[i]
81
+ if ((element.type == 'text' || mergableElements.includes(element.type)) && i + 1 < n.children.length && n.children[i + 1].type == element.type) {
82
+ const first = element;
83
+ const last = n.children[i + 1];
84
+ if ('children' in first && 'children' in last) {
85
+ first.children.push(...last.children);
86
+ n.children.splice(i + 1, 1);
87
+ } else if (first.type == 'text' && last.type == 'text') {
88
+ if (!last.value.startsWith(' ') && !first.value.endsWith(' '))
89
+ first.value += ' ';
90
+ first.value += last.value;
91
+ n.children.splice(i + 1, 1);
92
+ i--;// we need to repeat this, so we will consoume multiple following text elements
93
+ }
94
+ }
95
+ if (mergableElements.includes(element.type) && i + 2 < n.children.length && n.children[i + 2].type == element.type) {
96
+ const first = element;
97
+ const middel = n.children[i + 1];
98
+ const last = n.children[i + 2];
99
+ if ('children' in first && 'children' in last && middel.type == 'text' && /^[\s\n\r]*$/.test(middel.value)) {
100
+ middel.value = middel.value.replaceAll(/\r\n|\r|\n/g, ' ')
101
+ first.children.push(middel);
102
+ first.children.push(...last.children);
103
+ n.children.splice(i + 1, 2);
104
+
105
+ }
106
+ }
107
+
108
+ mergeElements(element);
109
+ }
110
+ }
111
+ };
112
+
113
+
68
114
  /**
69
115
  *
70
116
  * @param {typeof node.children[number]} n
@@ -254,11 +300,14 @@ export default function remarkBreakLongLines({ maxLineLength = 80, removeLinebre
254
300
 
255
301
  return { type: 'nothing' };
256
302
  }
257
-
303
+ if (removeLinebreaksAndMultipleSpaces)
304
+ removeLineBrakesWalker(node);
305
+ if (mergableElements.length > 0)
306
+ mergeElements(node);
258
307
  for (let i = 0; i < node.children.length; i++) {
259
308
  const element = node.children[i];
260
- if (removeLinebreaks)
261
- prepare(element);
309
+
310
+
262
311
  const result = walk(element, [element.type])
263
312
  if (result.type == 'split') {
264
313
  currentLine = 0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "remark-break-line",
3
- "version": "0.0.8",
3
+ "version": "0.0.10",
4
4
  "type": "module",
5
5
  "description": "",
6
6
  "keywords": [