|
1 | 1 | import React from "react";
|
2 | 2 |
|
| 3 | +const parseLists = (content: string) => { |
| 4 | + const lines = content.split('\n'); |
| 5 | + let result = ''; |
| 6 | + let isFirstLevelOpen = false; |
| 7 | + let isSecondLevelOpen = false; |
| 8 | + lines.forEach((line) => { |
| 9 | + if (line.match(/^ {2}-\s+/)) { |
| 10 | + if (!isSecondLevelOpen) { |
| 11 | + result += '<ul>'; |
| 12 | + isSecondLevelOpen = true; |
| 13 | + } |
| 14 | + result += `<li>${line.trim().substring(4)}</li>`; |
| 15 | + } else if (line.match(/^ -\s+/)) { |
| 16 | + if (isSecondLevelOpen) { |
| 17 | + result += '</ul>'; |
| 18 | + isSecondLevelOpen = false; |
| 19 | + } |
| 20 | + if (!isFirstLevelOpen) { |
| 21 | + result += '<ul>'; |
| 22 | + isFirstLevelOpen = true; |
| 23 | + } |
| 24 | + result += `<li>${line.trim().substring(2)}</li>`; |
| 25 | + } else { |
| 26 | + if (isSecondLevelOpen) { |
| 27 | + result += '</ul>'; |
| 28 | + isSecondLevelOpen = false; |
| 29 | + } |
| 30 | + if (isFirstLevelOpen) { |
| 31 | + result += '</ul>'; |
| 32 | + isFirstLevelOpen = false; |
| 33 | + } |
| 34 | + result += line; |
| 35 | + } |
| 36 | + }); |
| 37 | + if (isSecondLevelOpen) result += '</ul>'; |
| 38 | + if (isFirstLevelOpen) result += '</ul>'; |
| 39 | + return result; |
| 40 | +}; |
| 41 | + |
3 | 42 | const parseMarkdown = (content: string) => {
|
4 |
| - return content |
5 |
| - .replace(/\[(.*?)\]\((.*?)\)/g, '<a href="$2">$1</a>') |
6 |
| - .replace(/`(.*?)`/g, "<code>$1</code>"); |
| 43 | + return parseLists( |
| 44 | + content |
| 45 | + .replace(/\[(.*?)\]\((.*?)\)/g, '<a href="$2">$1</a>') |
| 46 | + .replace(/`(.*?)`/g, '<code>$1</code>') |
| 47 | + .replace(/\*\*(.*?)\*\*/g, '<strong>$1</strong>') |
| 48 | + ); |
7 | 49 | };
|
8 | 50 |
|
9 | 51 | interface MDContentProps {
|
|
0 commit comments