rehype-highlight-code-lines 1.0.7 → 1.0.8

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/README.md CHANGED
@@ -140,6 +140,8 @@ All options are **optional** and have **default values**.
140
140
  ```typescript
141
141
  type HighlightLinesOptions = {
142
142
  showLineNumbers?: boolean; // default is "false"
143
+ lineContainerTagName?: "span" | "div"; // deprecated, always span
144
+ trimBlankLines?: boolean; // default is "false"
143
145
  };
144
146
 
145
147
  use(rehypeHighlightLines, HighlightLinesOptions);
@@ -173,20 +175,53 @@ Sometimes you may want to start the line numbering from a specific number. In th
173
175
 
174
176
  **\`\`\`showLineNumbers=8**
175
177
 
176
- #### `lineContainerTagName`
178
+ #### `lineContainerTagName` (Deprecated)
177
179
 
178
- **It is a deprecated option.** Marked as `@deprecated`, will be removed in the next versions.
180
+ **It is marked as `@deprecated` and will be removed in the next versions.
179
181
 
180
- It was a **union** type option which was **"div" | "span"** for providing custom HTML tag name for code lines.
182
+ It was a **union** option which was **"div" | "span"** for providing custom HTML tag name for code lines.
181
183
 
182
184
  By default, it is `span` which is **inline** level container. If you set it as `div`, the container will still be `span` after deprecation.
183
185
 
184
186
  ```javascript
185
187
  use(rehypeHighlightLines, {
186
- lineContainerTagName: "div", // @deprecated, always "span"
188
+ lineContainerTagName: "div", // @deprecated, effectless, always "span"
187
189
  });
188
190
  ```
189
191
 
192
+ #### `trimBlankLines`
193
+
194
+ It is a **boolean** option. It is designed to delete one blank/empty line at the beginning and one at the end of the code block, if happened due to html parsing `<pre><code /></pre>`.
195
+
196
+ By default, it is `false`.
197
+
198
+ Let's assume you want to highlight `pre`, and `code` element in markdown (not code fence).
199
+
200
+ ```markdown
201
+ Here is markdown content
202
+
203
+ <pre><code class="language-javascript">
204
+ console.log("rehype-highlight-code-lines");
205
+ </code></pre>
206
+ ```
207
+
208
+ For above markdown, the parsed result (for example via `rehype-parse` and `rehype-stringfy`) is going to contain empty/blank code lines due to nature of `pre` preserving whitespaces. In order to prevent having unintentionally blank lines, use the option `trimBlankLines`.
209
+
210
+ ```javascript
211
+ use(rehypeHighlightLines, {
212
+ trimBlankLines: true,
213
+ });
214
+ ```
215
+
216
+ Actually, the trimming could have been the default behaviour. However, some developers may intentionally include empty lines at the beginning and at the end in code fences for specific reasons and may want to preserve them.
217
+ ````markdown
218
+ ```javascript
219
+
220
+ console.log("rehype-highlight-code-lines");
221
+
222
+ ```
223
+ ````
224
+
190
225
  ### Examples:
191
226
 
192
227
  ```typescript
@@ -12,6 +12,7 @@ export type HighlightLinesOptions = {
12
12
  * will be removed in the next versions
13
13
  */
14
14
  lineContainerTagName?: "div" | "span";
15
+ trimBlankLines?: boolean;
15
16
  };
16
17
  export declare function clsx(arr: (string | false | null | undefined | 0)[]): string[];
17
18
  /**
package/dist/esm/index.js CHANGED
@@ -3,6 +3,7 @@ import rangeParser from "parse-numeric-range";
3
3
  const DEFAULT_SETTINGS = {
4
4
  showLineNumbers: false,
5
5
  lineContainerTagName: "span",
6
+ trimBlankLines: false,
6
7
  };
7
8
  // a simple util for our use case, like clsx package
8
9
  export function clsx(arr) {
@@ -25,7 +26,7 @@ function hasClassName(node, className) {
25
26
  }
26
27
  // match all common types of line breaks
27
28
  const REGEX_LINE_BREAKS = /\r?\n|\r/g;
28
- const REGEX_LINE_BREAKS_IN_THE_BEGINNING = /^(\r?\n|\r)/;
29
+ const REGEX_LINE_BREAKS_IN_THE_BEGINNING = /^(\r?\n|\r)+/;
29
30
  /**
30
31
  *
31
32
  * add line numbers to code blocks and allow highlighting of desired code lines
@@ -149,31 +150,32 @@ const plugin = (options) => {
149
150
  *
150
151
  */
151
152
  function handleFirstElementContent(code) {
152
- const replacement = [];
153
153
  const elementNode = code.children[0];
154
154
  if (!isElementWithTextNode(elementNode))
155
155
  return;
156
156
  const textNode = elementNode.children[0];
157
157
  if (!REGEX_LINE_BREAKS_IN_THE_BEGINNING.test(textNode.value))
158
158
  return;
159
- let match = REGEX_LINE_BREAKS_IN_THE_BEGINNING.exec(textNode.value);
160
- while (match !== null) {
161
- replacement.push({ type: "text", value: match[0] });
162
- // Update the child value
163
- textNode.value = textNode.value.slice(1);
164
- // iterate the match
165
- match = REGEX_LINE_BREAKS_IN_THE_BEGINNING.exec(textNode.value);
159
+ const match = REGEX_LINE_BREAKS_IN_THE_BEGINNING.exec(textNode.value);
160
+ if (match) {
161
+ code.children.unshift({ type: "text", value: match[0] });
162
+ textNode.value = textNode.value.replace(REGEX_LINE_BREAKS_IN_THE_BEGINNING, "");
166
163
  }
167
- code.children.unshift(...replacement);
168
164
  }
169
165
  /**
170
166
  *
171
- * check the code line is empty or with value only spaces
167
+ * handle trimming blank line for the last text node
172
168
  *
173
169
  */
174
- function isEmptyLine(line) {
175
- return (line.length === 0 ||
176
- (line.length === 1 && line[0].type === "text" && line[0].value.trim() === ""));
170
+ function handleTrimmingBlankLines(code, directiveTrimBlankLines) {
171
+ if (!directiveTrimBlankLines)
172
+ return;
173
+ const lastChild = code.children[code.children.length - 1];
174
+ if (lastChild.type === "text") {
175
+ if (/(\r?\n|\r)(\1)$/.test(lastChild.value)) {
176
+ lastChild.value = lastChild.value.replace(/(\r?\n|\r)(\1)$/, "$1");
177
+ }
178
+ }
177
179
  }
178
180
  /**
179
181
  *
@@ -181,26 +183,23 @@ const plugin = (options) => {
181
183
  * mutates the code
182
184
  *
183
185
  */
184
- function gutter(code, { directiveShowLineNumbers, directiveHighlightLines, }) {
186
+ function gutter(code, { directiveShowLineNumbers, directiveHighlightLines, directiveTrimBlankLines, }) {
185
187
  hasFlatteningNeed(code) && flattenCodeTree(code); // mutates the code
186
188
  handleMultiLineComments(code); // mutates the code
187
189
  handleFirstElementContent(code); // mutates the code
190
+ handleTrimmingBlankLines(code, directiveTrimBlankLines);
188
191
  const replacement = [];
189
192
  let start = 0;
190
193
  let startTextRemainder = "";
191
194
  let lineNumber = 0;
192
195
  for (let index = 0; index < code.children.length; index++) {
193
196
  const child = code.children[index];
194
- // if (index === 0 && /^[\n][\s]*$/.test(child.value)) {
195
- // console.log(child.value, index);
196
- // }
197
197
  if (child.type !== "text")
198
198
  continue;
199
199
  let textStart = 0;
200
- let match = REGEX_LINE_BREAKS.exec(child.value);
201
- while (match !== null) {
202
- // Nodes in this line. (current child is exclusive)
203
- // Array.prototype.slice() start to end (end not included)
200
+ const matches = Array.from(child.value.matchAll(REGEX_LINE_BREAKS));
201
+ matches.forEach((match, iteration) => {
202
+ // Nodes in this line. (current child (index) is exclusive)
204
203
  const line = code.children.slice(start, index);
205
204
  // Prepend text from a partial matched earlier text.
206
205
  if (startTextRemainder) {
@@ -212,13 +211,17 @@ const plugin = (options) => {
212
211
  const value = child.value.slice(textStart, match.index);
213
212
  line.push({ type: "text", value });
214
213
  }
215
- lineNumber += 1;
216
- replacement.push(createLine(line, lineNumber, directiveShowLineNumbers, directiveHighlightLines), { type: "text", value: match[0] });
214
+ const isFirstIteration = index === 0 && iteration === 0;
215
+ if (isFirstIteration && directiveTrimBlankLines && line.length === 0) {
216
+ replacement.push({ type: "text", value: match[0] }); // eol
217
+ }
218
+ else {
219
+ lineNumber += 1;
220
+ replacement.push(createLine(line, lineNumber, directiveShowLineNumbers, directiveHighlightLines), { type: "text", value: match[0] });
221
+ }
217
222
  start = index + 1;
218
223
  textStart = match.index + match[0].length;
219
- // iterate the match
220
- match = REGEX_LINE_BREAKS.exec(child.value);
221
- }
224
+ });
222
225
  // If we matched, make sure to not drop the text after the last line ending.
223
226
  if (start === index + 1) {
224
227
  startTextRemainder = child.value.slice(textStart);
@@ -231,13 +234,9 @@ const plugin = (options) => {
231
234
  startTextRemainder = "";
232
235
  }
233
236
  if (line.length > 0) {
234
- if (isEmptyLine(line)) {
235
- replacement.push(...line);
236
- }
237
- else {
238
- lineNumber += 1;
239
- replacement.push(createLine(line, lineNumber, directiveShowLineNumbers, directiveHighlightLines));
240
- }
237
+ directiveTrimBlankLines
238
+ ? replacement.push(...line)
239
+ : replacement.push(createLine(line, ++lineNumber, directiveShowLineNumbers, directiveHighlightLines));
241
240
  }
242
241
  // Replace children with new array.
243
242
  code.children = replacement;
@@ -285,7 +284,8 @@ const plugin = (options) => {
285
284
  const language = getLanguage(classNames);
286
285
  if (language?.startsWith("{") ||
287
286
  language?.startsWith("showlinenumbers") ||
288
- language?.startsWith("nolinenumbers")) {
287
+ language?.startsWith("nolinenumbers") ||
288
+ language?.startsWith("trimblanklines")) {
289
289
  // add specifiers to meta
290
290
  meta = (language + " " + meta).trim();
291
291
  // correct the code's meta
@@ -305,14 +305,20 @@ const plugin = (options) => {
305
305
  const REGEX2 = /{(?<lines>[\d\s,-]+)}/g;
306
306
  const strLineNumbers = REGEX2.exec(meta)?.groups?.lines?.replace(/\s/g, "");
307
307
  const directiveHighlightLines = strLineNumbers ? rangeParser(strLineNumbers) : [];
308
+ // find the directive for trimming blank lines
309
+ const REGEX3 = /trimblanklines/i;
310
+ const directiveTrimBlankLines = settings.trimBlankLines || REGEX3.test(meta);
308
311
  // if nothing to do for numbering, highlihting or trimming blank lines, just return;
309
- if (directiveShowLineNumbers === false && directiveHighlightLines.length === 0) {
312
+ if (directiveShowLineNumbers === false &&
313
+ directiveHighlightLines.length === 0 &&
314
+ directiveTrimBlankLines === false) {
310
315
  return;
311
316
  }
312
317
  // add container for each line mutating the code element
313
318
  gutter(code, {
314
319
  directiveShowLineNumbers,
315
320
  directiveHighlightLines,
321
+ directiveTrimBlankLines,
316
322
  });
317
323
  });
318
324
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rehype-highlight-code-lines",
3
- "version": "1.0.7",
3
+ "version": "1.0.8",
4
4
  "description": "Rehype plugin to add line numbers to code blocks and allow highlighting of desired code lines",
5
5
  "type": "module",
6
6
  "exports": "./dist/esm/index.js",
@@ -13,8 +13,10 @@
13
13
  "lint": "eslint .",
14
14
  "test": "vitest --watch=false",
15
15
  "test:watch": "vitest",
16
- "test:file1": "vitest test.markdown.spec.ts",
17
- "test:file2": "vitest test.cases.spec.ts",
16
+ "test:file1": "vitest test.md.spec.ts",
17
+ "test:file2": "vitest test.html.spec.ts",
18
+ "test:file3": "vitest test.cases.spec.ts",
19
+ "test:file4": "vitest from-rehype-highlight/test.rhcl2.spec.ts",
18
20
  "prepack": "npm run build",
19
21
  "prepublishOnly": "npm run test && npm run format && npm run test-coverage",
20
22
  "test-coverage": "vitest run --coverage"
@@ -75,14 +77,17 @@
75
77
  "typescript-eslint": "^8.23.0",
76
78
  "unist-util-remove-position": "^5.0.0",
77
79
  "vfile": "^6.0.3",
78
- "vitest": "^3.0.5"
80
+ "vitest": "^3.0.5",
81
+ "unified": "^11.0.5"
79
82
  },
80
83
  "dependencies": {
81
84
  "@types/hast": "^3.0.4",
82
85
  "parse-numeric-range": "^1.3.0",
83
- "unified": "^11.0.5",
84
86
  "unist-util-visit": "^5.0.0"
85
87
  },
88
+ "peerDependencies": {
89
+ "unified": "^11"
90
+ },
86
91
  "typeCoverage": {
87
92
  "atLeast": 100,
88
93
  "detail": true,
package/src/index.ts CHANGED
@@ -24,17 +24,25 @@ export type HighlightLinesOptions = {
24
24
  * will be removed in the next versions
25
25
  */
26
26
  lineContainerTagName?: "div" | "span";
27
+ trimBlankLines?: boolean;
27
28
  };
28
29
 
29
30
  const DEFAULT_SETTINGS: HighlightLinesOptions = {
30
31
  showLineNumbers: false,
31
32
  lineContainerTagName: "span",
33
+ trimBlankLines: false,
32
34
  };
33
35
 
34
36
  type PartiallyRequiredHighlightLinesOptions = Prettify<
35
37
  PartiallyRequired<HighlightLinesOptions, "showLineNumbers" | "lineContainerTagName">
36
38
  >;
37
39
 
40
+ type GutterOptions = {
41
+ directiveShowLineNumbers: boolean | number;
42
+ directiveHighlightLines: number[];
43
+ directiveTrimBlankLines: boolean;
44
+ };
45
+
38
46
  // a simple util for our use case, like clsx package
39
47
  export function clsx(arr: (string | false | null | undefined | 0)[]): string[] {
40
48
  return arr.filter((item): item is string => !!item);
@@ -65,7 +73,7 @@ function hasClassName(node: ElementContent | undefined, className: string): bool
65
73
 
66
74
  // match all common types of line breaks
67
75
  const REGEX_LINE_BREAKS = /\r?\n|\r/g;
68
- const REGEX_LINE_BREAKS_IN_THE_BEGINNING = /^(\r?\n|\r)/;
76
+ const REGEX_LINE_BREAKS_IN_THE_BEGINNING = /^(\r?\n|\r)+/;
69
77
 
70
78
  /**
71
79
  *
@@ -213,39 +221,36 @@ const plugin: Plugin<[HighlightLinesOptions?], Root> = (options) => {
213
221
  *
214
222
  */
215
223
  function handleFirstElementContent(code: Element): undefined {
216
- const replacement: ElementContent[] = [];
217
-
218
224
  const elementNode = code.children[0];
219
225
  if (!isElementWithTextNode(elementNode)) return;
220
226
 
221
227
  const textNode = elementNode.children[0];
222
228
  if (!REGEX_LINE_BREAKS_IN_THE_BEGINNING.test(textNode.value)) return;
223
229
 
224
- let match = REGEX_LINE_BREAKS_IN_THE_BEGINNING.exec(textNode.value);
225
-
226
- while (match !== null) {
227
- replacement.push({ type: "text", value: match[0] });
230
+ const match = REGEX_LINE_BREAKS_IN_THE_BEGINNING.exec(textNode.value);
228
231
 
229
- // Update the child value
230
- textNode.value = textNode.value.slice(1);
232
+ if (match) {
233
+ code.children.unshift({ type: "text", value: match[0] });
231
234
 
232
- // iterate the match
233
- match = REGEX_LINE_BREAKS_IN_THE_BEGINNING.exec(textNode.value);
235
+ textNode.value = textNode.value.replace(REGEX_LINE_BREAKS_IN_THE_BEGINNING, "");
234
236
  }
235
-
236
- code.children.unshift(...replacement);
237
237
  }
238
238
 
239
239
  /**
240
240
  *
241
- * check the code line is empty or with value only spaces
241
+ * handle trimming blank line for the last text node
242
242
  *
243
243
  */
244
- function isEmptyLine(line: ElementContent[]): boolean {
245
- return (
246
- line.length === 0 ||
247
- (line.length === 1 && line[0].type === "text" && line[0].value.trim() === "")
248
- );
244
+ function handleTrimmingBlankLines(code: Element, directiveTrimBlankLines: boolean) {
245
+ if (!directiveTrimBlankLines) return;
246
+
247
+ const lastChild = code.children[code.children.length - 1];
248
+
249
+ if (lastChild.type === "text") {
250
+ if (/(\r?\n|\r)(\1)$/.test(lastChild.value)) {
251
+ lastChild.value = lastChild.value.replace(/(\r?\n|\r)(\1)$/, "$1");
252
+ }
253
+ }
249
254
  }
250
255
 
251
256
  /**
@@ -259,10 +264,8 @@ const plugin: Plugin<[HighlightLinesOptions?], Root> = (options) => {
259
264
  {
260
265
  directiveShowLineNumbers,
261
266
  directiveHighlightLines,
262
- }: {
263
- directiveShowLineNumbers: boolean | number;
264
- directiveHighlightLines: number[];
265
- },
267
+ directiveTrimBlankLines,
268
+ }: GutterOptions,
266
269
  ) {
267
270
  hasFlatteningNeed(code) && flattenCodeTree(code); // mutates the code
268
271
 
@@ -270,6 +273,8 @@ const plugin: Plugin<[HighlightLinesOptions?], Root> = (options) => {
270
273
 
271
274
  handleFirstElementContent(code); // mutates the code
272
275
 
276
+ handleTrimmingBlankLines(code, directiveTrimBlankLines);
277
+
273
278
  const replacement: ElementContent[] = [];
274
279
 
275
280
  let start = 0;
@@ -279,18 +284,13 @@ const plugin: Plugin<[HighlightLinesOptions?], Root> = (options) => {
279
284
  for (let index = 0; index < code.children.length; index++) {
280
285
  const child = code.children[index];
281
286
 
282
- // if (index === 0 && /^[\n][\s]*$/.test(child.value)) {
283
- // console.log(child.value, index);
284
- // }
285
-
286
287
  if (child.type !== "text") continue;
287
288
 
288
289
  let textStart = 0;
289
- let match = REGEX_LINE_BREAKS.exec(child.value);
290
290
 
291
- while (match !== null) {
292
- // Nodes in this line. (current child is exclusive)
293
- // Array.prototype.slice() start to end (end not included)
291
+ const matches = Array.from(child.value.matchAll(REGEX_LINE_BREAKS));
292
+ matches.forEach((match, iteration) => {
293
+ // Nodes in this line. (current child (index) is exclusive)
294
294
  const line = code.children.slice(start, index);
295
295
 
296
296
  // Prepend text from a partial matched earlier text.
@@ -305,18 +305,21 @@ const plugin: Plugin<[HighlightLinesOptions?], Root> = (options) => {
305
305
  line.push({ type: "text", value });
306
306
  }
307
307
 
308
- lineNumber += 1;
309
- replacement.push(
310
- createLine(line, lineNumber, directiveShowLineNumbers, directiveHighlightLines),
311
- { type: "text", value: match[0] }, // eol
312
- );
308
+ const isFirstIteration = index === 0 && iteration === 0;
309
+
310
+ if (isFirstIteration && directiveTrimBlankLines && line.length === 0) {
311
+ replacement.push({ type: "text", value: match[0] }); // eol
312
+ } else {
313
+ lineNumber += 1;
314
+ replacement.push(
315
+ createLine(line, lineNumber, directiveShowLineNumbers, directiveHighlightLines),
316
+ { type: "text", value: match[0] }, // eol
317
+ );
318
+ }
313
319
 
314
320
  start = index + 1;
315
321
  textStart = match.index + match[0].length;
316
-
317
- // iterate the match
318
- match = REGEX_LINE_BREAKS.exec(child.value);
319
- }
322
+ });
320
323
 
321
324
  // If we matched, make sure to not drop the text after the last line ending.
322
325
  if (start === index + 1) {
@@ -333,14 +336,11 @@ const plugin: Plugin<[HighlightLinesOptions?], Root> = (options) => {
333
336
  }
334
337
 
335
338
  if (line.length > 0) {
336
- if (isEmptyLine(line)) {
337
- replacement.push(...line);
338
- } else {
339
- lineNumber += 1;
340
- replacement.push(
341
- createLine(line, lineNumber, directiveShowLineNumbers, directiveHighlightLines),
342
- );
343
- }
339
+ directiveTrimBlankLines
340
+ ? replacement.push(...line)
341
+ : replacement.push(
342
+ createLine(line, ++lineNumber, directiveShowLineNumbers, directiveHighlightLines),
343
+ );
344
344
  }
345
345
 
346
346
  // Replace children with new array.
@@ -401,7 +401,8 @@ const plugin: Plugin<[HighlightLinesOptions?], Root> = (options) => {
401
401
  if (
402
402
  language?.startsWith("{") ||
403
403
  language?.startsWith("showlinenumbers") ||
404
- language?.startsWith("nolinenumbers")
404
+ language?.startsWith("nolinenumbers") ||
405
+ language?.startsWith("trimblanklines")
405
406
  ) {
406
407
  // add specifiers to meta
407
408
  meta = (language + " " + meta).trim();
@@ -427,8 +428,16 @@ const plugin: Plugin<[HighlightLinesOptions?], Root> = (options) => {
427
428
  const strLineNumbers = REGEX2.exec(meta)?.groups?.lines?.replace(/\s/g, "");
428
429
  const directiveHighlightLines = strLineNumbers ? rangeParser(strLineNumbers) : [];
429
430
 
431
+ // find the directive for trimming blank lines
432
+ const REGEX3 = /trimblanklines/i;
433
+ const directiveTrimBlankLines = settings.trimBlankLines || REGEX3.test(meta);
434
+
430
435
  // if nothing to do for numbering, highlihting or trimming blank lines, just return;
431
- if (directiveShowLineNumbers === false && directiveHighlightLines.length === 0) {
436
+ if (
437
+ directiveShowLineNumbers === false &&
438
+ directiveHighlightLines.length === 0 &&
439
+ directiveTrimBlankLines === false
440
+ ) {
432
441
  return;
433
442
  }
434
443
 
@@ -436,6 +445,7 @@ const plugin: Plugin<[HighlightLinesOptions?], Root> = (options) => {
436
445
  gutter(code, {
437
446
  directiveShowLineNumbers,
438
447
  directiveHighlightLines,
448
+ directiveTrimBlankLines,
439
449
  });
440
450
  });
441
451
  };