• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

yunnysunny / bookforge / 20906579525

12 Jan 2026 02:51AM UTC coverage: 56.206% (+1.2%) from 54.965%
20906579525

push

github

yunnysunny
chore: fix biome format error

33 of 57 branches covered (57.89%)

Branch coverage included in aggregate %.

0 of 1 new or added line in 1 file covered. (0.0%)

14 existing lines in 2 files now uncovered.

207 of 370 relevant lines covered (55.95%)

24.95 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

25.0
/src/core/marked-plugins/gitbook.plugin.ts
1
import { marked, type MarkedExtension, type Tokens } from 'marked';
2

3
// ========================
4
// 1. GitBook 标签渲染器
5
// ========================
6
const gitbookTagRenderers: Record<
7
  string,
8
  (text: string, params: Record<string, string>) => string
9
> = {
12✔
10
  // Callout
11
  hint: (text, params) =>
NEW
12
    `<div class="gb-hint gb-${params.style || 'info'}">${marked.parse(text)}</div>`,
×
13
  // tabs / tab
14
  tab: (text, params) =>
15
    `<div class="gb-tab" data-title="${params.title || ''}">${marked.parse(
×
16
      text,
17
    )}</div>`,
UNCOV
18
  tabs: (text) => `<div class="gb-tabs">${marked.parse(text)}</div>`,
×
19
};
20

21
// ========================
22
// 2. 解析参数 key="value"
23
// ========================
24
/** 解析 GitBook 参数,如 style="info" lang="ts" */
25
function parseParams(str: string) {
UNCOV
26
  const params: Record<string, string> = {};
×
UNCOV
27
  const re = /(\w+)="(.*?)"/g;
×
UNCOV
28
  let m: RegExpExecArray | null = null;
×
29
  while (true) {
×
UNCOV
30
    m = re.exec(str);
×
UNCOV
31
    if (!m) break;
×
32
    params[m[1]] = m[2];
×
33
  }
UNCOV
34
  return params;
×
35
}
36
interface GitbookTagToken extends Tokens.Generic {
37
  tag: string;
38
  params: Record<string, string>;
39
  text: string;
40
  raw: string;
41
  type: 'gb-tag';
42
}
43
export const gitbookExtension: MarkedExtension = {
12✔
44
  extensions: [
45
    {
46
      name: 'gb-tag',
47
      level: 'block',
48
      start(src: string) {
49
        return src.indexOf('{%');
42✔
50
      },
51
      tokenizer(src: string): GitbookTagToken | undefined {
52
        const rule = /^\{%\s*(\w+)([\s\S]*?)%\}([\s\S]*?)\{%\s*end\1\s*%\}/;
99✔
53
        const match = rule.exec(src);
99✔
54
        if (!match) return;
99✔
55

UNCOV
56
        const [, tag, paramStr, content] = match;
×
UNCOV
57
        return {
×
58
          type: 'gb-tag',
59
          raw: match[0],
60
          tag,
61
          params: parseParams(paramStr),
62
          text: content.trim(),
63
        };
64
      },
65
      renderer(token: Tokens.Generic) {
UNCOV
66
        const _token = token as GitbookTagToken;
×
UNCOV
67
        const fn = gitbookTagRenderers[_token.tag];
×
UNCOV
68
        if (fn) return fn(_token.text, _token.params);
×
UNCOV
69
        return _token.raw; // 未知标签原样输出
×
70
      },
71
    },
72
  ],
73
};
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc