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

yunnysunny / bookforge / 20894700973

11 Jan 2026 11:53AM UTC coverage: 55.3% (+0.2%) from 55.087%
20894700973

push

github

yunnysunny
chore: lint fix

32 of 57 branches covered (56.14%)

Branch coverage included in aggregate %.

3 of 4 new or added lines in 3 files covered. (75.0%)

25 existing lines in 3 files now uncovered.

208 of 377 relevant lines covered (55.17%)

24.54 hits per line

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

18.92
/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
  note: (text) => `<div class="gb-note">${marked.parse(text)}</div>`,
×
12
  warning: (text) => `<div class="gb-warning">${marked.parse(text)}</div>`,
×
13
  tip: (text) => `<div class="gb-tip">${marked.parse(text)}</div>`,
×
14
  info: (text) => `<div class="gb-info">${marked.parse(text)}</div>`,
×
15
  danger: (text) => `<div class="gb-danger">${marked.parse(text)}</div>`,
×
16
  success: (text) => `<div class="gb-success">${marked.parse(text)}</div>`,
×
17

18
  // code block
19
  codeblock: (text, params) => {
20
    if (params.lang === 'mermaid') {
×
UNCOV
21
      return `<pre class="mermaid">${text}</pre>`;
×
22
    }
NEW
23
    return `<pre><code class="language-${params.lang || ''}">${text}</code></pre>`;
×
24
  },
25

26
  // tabs / tab
27
  tab: (text, params) =>
UNCOV
28
    `<div class="gb-tab" data-title="${params.title || ''}">${marked.parse(
×
29
      text,
30
    )}</div>`,
UNCOV
31
  tabs: (text) => `<div class="gb-tabs">${marked.parse(text)}</div>`,
×
32
};
33

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

UNCOV
69
        const [, tag, paramStr, content] = match;
×
UNCOV
70
        return {
×
71
          type: 'gb-tag',
72
          raw: match[0],
73
          tag,
74
          params: parseParams(paramStr),
75
          text: content.trim(),
76
        };
77
      },
78
      renderer(token: Tokens.Generic) {
UNCOV
79
        const _token = token as GitbookTagToken;
×
UNCOV
80
        const fn = gitbookTagRenderers[_token.tag];
×
UNCOV
81
        if (fn) return fn(_token.text, _token.params);
×
UNCOV
82
        return _token.raw; // 未知标签原样输出
×
83
      },
84
    },
85
  ],
86
};
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