Codemaru 1.0.0.0
QR 코드, 모바일 랜딩 페이지, vCard 연락처 저장과 명함 디자인을 한 화면에서 제공하는 디지털 명함 서비스입니다.
로딩중...
검색중...
일치하는것 없음
FreeQrSvgGenerator.cs
이 파일의 문서화 페이지로 가기
1using QRCoder;
2using System.Text.RegularExpressions;
3
4namespace Codemaru.Services;
5
14public sealed partial class FreeQrSvgGenerator : IQrSvgGenerator
15{
56 public string CreateSvg(string payload, string foreground = "#111111", string background = "#ffffff")
57 {
58 var text = string.IsNullOrWhiteSpace(payload) ? "https://dreamine.local/card" : payload.Trim();
59 var fg = NormalizeColor(foreground, "#111111");
60 var bg = NormalizeColor(background, "#ffffff");
61
62 using var generator = new QRCodeGenerator();
63 using var data = generator.CreateQrCode(text, QRCodeGenerator.ECCLevel.Q);
64
65 var qr = new SvgQRCode(data);
66 var svg = qr.GetGraphic(
67 pixelsPerModule: 6,
68 darkColorHex: fg,
69 lightColorHex: bg,
70 drawQuietZones: false,
71 sizingMode: SvgQRCode.SizingMode.ViewBoxAttribute);
72
73 return AddCssClass(svg);
74 }
75
100 private static string AddCssClass(string svg)
101 {
102 return SvgTagRegex().Replace(svg, match =>
103 {
104 var tag = match.Value;
105 return tag.Contains("class=", StringComparison.OrdinalIgnoreCase)
106 ? tag
107 : tag.Replace("<svg", "<svg class=\"qr-svg\"", StringComparison.Ordinal);
108 }, count: 1);
109 }
110
143 private static string NormalizeColor(string color, string fallback)
144 {
145 if (string.IsNullOrWhiteSpace(color))
146 {
147 return fallback;
148 }
149
150 var value = color.Trim();
151 return value.Length is 4 or 7 && value[0] == '#' && value.Skip(1).All(Uri.IsHexDigit)
152 ? value
153 : fallback;
154 }
155
172 [GeneratedRegex("<svg\\b[^>]*>", RegexOptions.IgnoreCase | RegexOptions.CultureInvariant)]
173 private static partial Regex SvgTagRegex();
174}
string CreateSvg(string payload, string foreground="#111111", string background="#ffffff")
static string NormalizeColor(string color, string fallback)
static partial Regex SvgTagRegex()