-
-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathMermaid.razor.cs
More file actions
142 lines (121 loc) · 4.09 KB
/
Mermaid.razor.cs
File metadata and controls
142 lines (121 loc) · 4.09 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
// Copyright (c) BootstrapBlazor & Argo Zhang (argo@live.ca). All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
// Website: https://www.blazor.zone or https://argozhang.github.io/
using Microsoft.AspNetCore.Components;
using System.Text;
namespace BootstrapBlazor.Components;
/// <summary>
/// Mermaid 组件
/// </summary>
public partial class Mermaid
{
/// <summary>
/// 获取/设置 图方向
/// </summary>
[Parameter]
public MermaidDirection? Direction { get; set; } = MermaidDirection.TB;
/// <summary>
/// 获取/设置 图类型
/// </summary>
[Parameter]
public MermaidType Type { set; get; }
/// <summary>
/// 设置 Mermaid 字串
/// </summary>
[Parameter]
[EditorRequired]
public string? DiagramString { get; set; }
/// <summary>
/// 获取/设置 图标题 如果图类型是甘特图,饼图时和序列图时,可指定其 title 默认 null 未设置
/// </summary>
[Parameter]
public string? Title { set; get; }
[Inject, NotNull]
private IHtml2Pdf? Html2PdfService { get; set; }
[Inject, NotNull]
private DownloadService? DownloadService { get; set; }
private string? ClassString => CssBuilder.Default("bb-mermaid mermaid")
.AddClassFromAttributes(AdditionalAttributes)
.Build();
/// <summary>
/// <inheritdoc/>
/// </summary>
/// <returns></returns>
protected override async Task OnParametersSetAsync()
{
await base.OnParametersSetAsync();
await Render();
}
/// <summary>
/// <inheritdoc/>
/// </summary>
/// <returns></returns>
protected override Task InvokeInitAsync() => InvokeVoidAsync("init", Id, BuildDiagramText());
/// <summary>
/// 内容改变时重新渲染 mermaid
/// </summary>
[Obsolete("已弃用,请使用 Render 代替; Deprecated; please use Render instead.")]
[ExcludeFromCodeCoverage]
public Task MermaidChanged() => InvokeVoidAsync("init", Id, BuildDiagramText());
/// <summary>
/// 内容改变时重新渲染 mermaid
/// </summary>
public Task Render() => InvokeVoidAsync("render", Id, BuildDiagramText());
/// <summary>
/// 导出图为 base64 字符串
/// </summary>
/// <returns>base64 string of the diagram</returns>
public Task<string?> ExportBase64MermaidAsync() => InvokeAsync<string>("getContent", Id);
/// <summary>
/// 导出图为 Pdf 文档流
/// </summary>
public async Task<Stream?> ExportPdfAsync(CancellationToken token = default)
{
Stream? stream = null;
var html = await InvokeAsync<string?>("getSvgHtml", token, Id);
if (html != null)
{
stream = await Html2PdfService.PdfStreamFromHtmlAsync(html);
}
return stream;
}
/// <summary>
/// 下载 Pdf 文档
/// </summary>
/// <returns>base64 string of the diagram</returns>
public async Task DownloadPdfAsync(string fileName, CancellationToken token = default)
{
ArgumentNullException.ThrowIfNull(fileName);
var stream = await ExportPdfAsync(token);
if (stream != null)
{
await DownloadService.DownloadFromStreamAsync(fileName, stream);
}
}
private string BuildDiagramText()
{
StringBuilder sb = new();
if (Type != MermaidType.None)
{
sb.Append(Type.ToDescriptionString());
if (Type == MermaidType.Flowchart)
{
sb.Append($" {Direction}\n");
}
else if (Type == MermaidType.StateDiagram)
{
sb.Append($"\ndirection {Direction}\n");
}
else
{
sb.Append('\n');
}
if (!string.IsNullOrEmpty(Title) && (Type == MermaidType.Gantt || Type == MermaidType.Pie || Type == MermaidType.SequenceDiagram))
{
sb.Append($"\ntitle {Title}\n");
}
}
sb.Append(DiagramString);
return sb.ToString();
}
}