{token.slice(1, -1)});
+ } else {
+ const link = /^\[([^\]]+)\]\((https?:\/\/[^)\s]+)\)$/.exec(token);
+ if (link) {
+ result.push(
+
+ {link[1]}
+ ,
+ );
+ } else {
+ result.push(token);
+ }
+ }
+ last = match.index + token.length;
+ }
+ if (last < value.length) result.push(value.slice(last));
+ return result;
+}
+
+function MarkdownNotes({ value, compact = false }: { value: string; compact?: boolean }) {
+ const lines = value.replace(/\r\n?/g, "\n").split("\n");
+ const blocks: ReactNode[] = [];
+ let paragraph: string[] = [];
+ let list: string[] = [];
+ let code: string[] | null = null;
+
+ const flushParagraph = () => {
+ if (!paragraph.length) return;
+ blocks.push({inlineMarkdown(paragraph.join(" ").trim())}
); + paragraph = []; + }; + const flushList = () => { + if (!list.length) return; + blocks.push( +{code.join("\n")});
+ code = null;
+ } else code.push(line);
+ return;
+ }
+ if (line.trim().startsWith("```")) {
+ flushParagraph();
+ flushList();
+ code = [];
+ return;
+ }
+ const heading = /^(#{1,3})\s+(.+)$/.exec(line.trim());
+ if (heading) {
+ flushParagraph();
+ flushList();
+ const level = heading[1]!.length;
+ const Heading = `h${level + 2}` as "h3" | "h4" | "h5";
+ blocks.push({unfinishedCode.join("\n")});
+ flushParagraph();
+ flushList();
+
+ return 源码安装默认不启用后台更新。需要更新时,在服务器拉取对应 Release 后重新构建并重启服务;安装器部署并配置 systemd 后,才会显示后台一键更新。
暂无待显示的 Release 信息,可点击右上角“检查新版本”主动拉取。
++ 检测到当前以开发或无守护模式运行。生产服务器使用 curl / systemd 安装并部署后,将自动启用此处的一键全自动在线更新。 +
+