@@ -252,24 +252,40 @@ export function initRenderer(opts: IOpts): RendererAPI {
252
252
const langText = lang . split ( ` ` ) [ 0 ]
253
253
const language = hljs . getLanguage ( langText ) ? langText : `plaintext`
254
254
255
- let highlighted = hljs . highlight ( text , { language } ) . value
256
-
257
- // 处理两个完整 span 标签之间的空格
258
- highlighted = highlighted . replace ( / ( < s p a n [ ^ > ] * > [ ^ < ] * < \/ s p a n > ) ( \s + ) ( < s p a n [ ^ > ] * > [ ^ < ] * < \/ s p a n > ) / g, ( _ , span1 , spaces , span2 ) => {
259
- return span1 + span2 . replace ( / ^ ( < s p a n [ ^ > ] * > ) / , `$1${ spaces } ` )
260
- } )
261
-
262
- // 处理 span 标签开始前的空格
263
- highlighted = highlighted . replace ( / ( \s + ) ( < s p a n [ ^ > ] * > ) / g, ( _ , spaces , span ) => {
264
- return span . replace ( / ^ ( < s p a n [ ^ > ] * > ) / , `$1${ spaces } ` )
265
- } )
266
-
267
- // tab to 4 spaces
268
- highlighted = highlighted . replace ( / \t / g, ` ` )
269
- highlighted = highlighted
270
- . replace ( / \r \n / g, `<br/>` )
271
- . replace ( / \n / g, `<br/>` )
272
- . replace ( / ( > [ ^ < ] + ) | ( ^ [ ^ < ] + ) / g, str => str . replace ( / \s / g, ` ` ) )
255
+ let highlighted = ``
256
+
257
+ if ( opts . isShowLineNumber ) {
258
+ const rawLines = text . replace ( / \r \n / g, `\n` ) . split ( `\n` )
259
+
260
+ const highlightedLines = rawLines . map ( ( lineRaw ) => {
261
+ let lineHtml = hljs . highlight ( lineRaw , { language } ) . value
262
+ lineHtml = lineHtml . replace ( / ( < s p a n [ ^ > ] * > [ ^ < ] * < \/ s p a n > ) ( \s + ) ( < s p a n [ ^ > ] * > [ ^ < ] * < \/ s p a n > ) / g, ( _ , span1 , spaces , span2 ) => span1 + span2 . replace ( / ^ ( < s p a n [ ^ > ] * > ) / , `$1${ spaces } ` ) )
263
+ lineHtml = lineHtml . replace ( / ( \s + ) ( < s p a n [ ^ > ] * > ) / g, ( _ , spaces , span ) => span . replace ( / ^ ( < s p a n [ ^ > ] * > ) / , `$1${ spaces } ` ) )
264
+ lineHtml = lineHtml . replace ( / \t / g, ` ` )
265
+ lineHtml = lineHtml . replace ( / ( > [ ^ < ] + ) | ( ^ [ ^ < ] + ) / g, str => str . replace ( / \s / g, ` ` ) )
266
+ return lineHtml === `` ? ` ` : lineHtml
267
+ } )
268
+
269
+ const lineNumbersHtml = highlightedLines . map ( ( _ , idx ) => `<section style="padding:0 10px 0 0;line-height:1.75">${ idx + 1 } </section>` ) . join ( `` )
270
+ const codeInnerHtml = highlightedLines . join ( `<br/>` )
271
+ const codeLinesHtml = `<div style="white-space:pre;min-width:max-content;line-height:1.75">${ codeInnerHtml } </div>`
272
+ const lineNumberColumnStyles = `text-align:right;padding:8px 0;border-right:1px solid rgba(0,0,0,0.04);user-select:none;background:var(--code-bg,transparent);`
273
+
274
+ highlighted = `
275
+ <section style="display:flex;align-items:flex-start;overflow-x:hidden;overflow-y:auto;width:100%;max-width:100%;padding:0;box-sizing:border-box">
276
+ <section class="line-numbers" style="${ lineNumberColumnStyles } ">${ lineNumbersHtml } </section>
277
+ <section class="code-scroll" style="flex:1 1 auto;overflow-x:auto;overflow-y:visible;padding:8px;min-width:0;box-sizing:border-box">${ codeLinesHtml } </section>
278
+ </section>
279
+ `
280
+ }
281
+ else {
282
+ highlighted = hljs . highlight ( text , { language } ) . value
283
+ highlighted = highlighted . replace ( / ( < s p a n [ ^ > ] * > [ ^ < ] * < \/ s p a n > ) ( \s + ) ( < s p a n [ ^ > ] * > [ ^ < ] * < \/ s p a n > ) / g, ( _ , span1 , spaces , span2 ) => span1 + span2 . replace ( / ^ ( < s p a n [ ^ > ] * > ) / , `$1${ spaces } ` ) )
284
+ highlighted = highlighted . replace ( / ( \s + ) ( < s p a n [ ^ > ] * > ) / g, ( _ , spaces , span ) => span . replace ( / ^ ( < s p a n [ ^ > ] * > ) / , `$1${ spaces } ` ) )
285
+ highlighted = highlighted . replace ( / \t / g, ` ` )
286
+ highlighted = highlighted . replace ( / \r \n / g, `<br/>` ) . replace ( / \n / g, `<br/>` ) . replace ( / ( > [ ^ < ] + ) | ( ^ [ ^ < ] + ) / g, str => str . replace ( / \s / g, ` ` ) )
287
+ }
288
+
273
289
const span = `<span class="mac-sign" style="padding: 10px 14px 0;">${ macCodeSvg } </span>`
274
290
const code = `<code class="language-${ lang } " ${ styles ( `code` ) } >${ highlighted } </code>`
275
291
return `<pre class="hljs code__pre" ${ styles ( `code_pre` ) } >${ span } ${ code } </pre>`
0 commit comments