data_process_ui/app/doc/开发指南.html

540 lines
70 KiB
HTML
Raw Normal View History

2026-01-12 09:21:42 +08:00
<link rel="stylesheet" href="a.css">
<link rel="stylesheet" href="b.css">
<head><style>.ͼ1.cm-focused {outline: 1px dotted #212121;}
.ͼ1 {position: relative !important; box-sizing: border-box; display: flex !important; flex-direction: column;}
.ͼ1 .cm-scroller {display: flex !important; align-items: flex-start !important; font-family: monospace; line-height: 1.4; height: 100%; overflow-x: auto; position: relative; z-index: 0; overflow-anchor: none;}
.ͼ1 .cm-content[contenteditable=true] {-webkit-user-modify: read-write-plaintext-only;}
.ͼ1 .cm-content {margin: 0; flex-grow: 2; flex-shrink: 0; display: block; white-space: pre; word-wrap: normal; box-sizing: border-box; min-height: 100%; padding: 4px 0; outline: none;}
.ͼ1 .cm-lineWrapping {white-space: pre-wrap; white-space: break-spaces; word-break: break-word; overflow-wrap: anywhere; flex-shrink: 1;}
.ͼ2 .cm-content {caret-color: black;}
.ͼ3 .cm-content {caret-color: white;}
.ͼ1 .cm-line {display: block; padding: 0 2px 0 6px;}
.ͼ1 .cm-layer > * {position: absolute;}
.ͼ1 .cm-layer {position: absolute; left: 0; top: 0; contain: size style;}
.ͼ2 .cm-selectionBackground {background: #d9d9d9;}
.ͼ3 .cm-selectionBackground {background: #222;}
.ͼ2.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground {background: #d7d4f0;}
.ͼ3.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground {background: #233;}
.ͼ1 .cm-cursorLayer {pointer-events: none;}
.ͼ1.cm-focused > .cm-scroller > .cm-cursorLayer {animation: steps(1) cm-blink 1.2s infinite;}
@keyframes cm-blink {50% {opacity: 0;}}
@keyframes cm-blink2 {50% {opacity: 0;}}
.ͼ1 .cm-cursor, .ͼ1 .cm-dropCursor {border-left: 1.2px solid black; margin-left: -0.6px; pointer-events: none;}
.ͼ1 .cm-cursor {display: none;}
.ͼ3 .cm-cursor {border-left-color: #ddd;}
.ͼ1 .cm-dropCursor {position: absolute;}
.ͼ1.cm-focused > .cm-scroller > .cm-cursorLayer .cm-cursor {display: block;}
.ͼ1 .cm-iso {unicode-bidi: isolate;}
.ͼ1 .cm-announced {position: fixed; top: -10000px;}
@media print {.ͼ1 .cm-announced {display: none;}}
.ͼ2 .cm-activeLine {background-color: #cceeff44;}
.ͼ3 .cm-activeLine {background-color: #99eeff33;}
.ͼ2 .cm-specialChar {color: red;}
.ͼ3 .cm-specialChar {color: #f78;}
.ͼ1 .cm-gutters {flex-shrink: 0; display: flex; height: 100%; box-sizing: border-box; inset-inline-start: 0; z-index: 200;}
.ͼ2 .cm-gutters {background-color: #f5f5f5; color: #6c6c6c; border-right: 1px solid #ddd;}
.ͼ3 .cm-gutters {background-color: #333338; color: #ccc;}
.ͼ1 .cm-gutter {display: flex !important; flex-direction: column; flex-shrink: 0; box-sizing: border-box; min-height: 100%; overflow: hidden;}
.ͼ1 .cm-gutterElement {box-sizing: border-box;}
.ͼ1 .cm-lineNumbers .cm-gutterElement {padding: 0 3px 0 5px; min-width: 20px; text-align: right; white-space: nowrap;}
.ͼ2 .cm-activeLineGutter {background-color: #e2f2ff;}
.ͼ3 .cm-activeLineGutter {background-color: #222227;}
.ͼ1 .cm-panels {box-sizing: border-box; position: sticky; left: 0; right: 0; z-index: 300;}
.ͼ2 .cm-panels {background-color: #f5f5f5; color: black;}
.ͼ2 .cm-panels-top {border-bottom: 1px solid #ddd;}
.ͼ2 .cm-panels-bottom {border-top: 1px solid #ddd;}
.ͼ3 .cm-panels {background-color: #333338; color: white;}
.ͼ1 .cm-tab {display: inline-block; overflow: hidden; vertical-align: bottom;}
.ͼ1 .cm-widgetBuffer {vertical-align: text-top; height: 1em; width: 0; display: inline;}
.ͼ1 .cm-placeholder {color: #888; display: inline-block; vertical-align: top;}
.ͼ1 .cm-highlightSpace {background-image: radial-gradient(circle at 50% 55%, #aaa 20%, transparent 5%); background-position: center;}
.ͼ1 .cm-highlightTab {background-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="200" height="20"><path stroke="%23888" stroke-width="1" fill="none" d="M1 10H196L190 5M190 15L196 10M197 4L197 16"/></svg>'); background-size: auto 100%; background-position: right 90%; background-repeat: no-repeat;}
.ͼ1 .cm-trailingSpace {background-color: #ff332255;}
.ͼ1 .cm-button {vertical-align: middle; color: inherit; font-size: 70%; padding: .2em 1em; border-radius: 1px;}
.ͼ2 .cm-button:active {background-image: linear-gradient(#b4b4b4, #d0d3d6);}
.ͼ2 .cm-button {background-image: linear-gradient(#eff1f5, #d9d9df); border: 1px solid #888;}
.ͼ3 .cm-button:active {background-image: linear-gradient(#111, #333);}
.ͼ3 .cm-button {background-image: linear-gradient(#393939, #111); border: 1px solid #888;}
.ͼ1 .cm-textfield {vertical-align: middle; color: inherit; font-size: 70%; border: 1px solid silver; padding: .2em .5em;}
.ͼ2 .cm-textfield {background-color: white;}
.ͼ3 .cm-textfield {border: 1px solid #555; background-color: inherit;}
.ͼ1 .cm-tooltip.cm-tooltip-autocomplete > ul > li, .ͼ1 .cm-tooltip.cm-tooltip-autocomplete > ul > completion-section {padding: 1px 3px; line-height: 1.2;}
.ͼ1 .cm-tooltip.cm-tooltip-autocomplete > ul > li {overflow-x: hidden; text-overflow: ellipsis; cursor: pointer;}
.ͼ1 .cm-tooltip.cm-tooltip-autocomplete > ul > completion-section {display: list-item; border-bottom: 1px solid silver; padding-left: 0.5em; opacity: 0.7;}
.ͼ1 .cm-tooltip.cm-tooltip-autocomplete > ul {font-family: monospace; white-space: nowrap; overflow: hidden auto; max-width: 700px; max-width: min(700px, 95vw); min-width: 250px; max-height: 10em; height: 100%; list-style: none; margin: 0; padding: 0;}
.ͼ2 .cm-tooltip-autocomplete ul li[aria-selected] {background: #17c; color: white;}
.ͼ2 .cm-tooltip-autocomplete-disabled ul li[aria-selected] {background: #777;}
.ͼ3 .cm-tooltip-autocomplete ul li[aria-selected] {background: #347; color: white;}
.ͼ3 .cm-tooltip-autocomplete-disabled ul li[aria-selected] {background: #444;}
.ͼ1 .cm-completionListIncompleteTop:before, .ͼ1 .cm-completionListIncompleteBottom:after {content: "···"; opacity: 0.5; display: block; text-align: center;}
.ͼ1 .cm-tooltip.cm-completionInfo {position: absolute; padding: 3px 9px; width: max-content; max-width: 400px; box-sizing: border-box; white-space: pre-line;}
.ͼ1 .cm-completionInfo.cm-completionInfo-left {right: 100%;}
.ͼ1 .cm-completionInfo.cm-completionInfo-right {left: 100%;}
.ͼ1 .cm-completionInfo.cm-completionInfo-left-narrow {right: 30px;}
.ͼ1 .cm-completionInfo.cm-completionInfo-right-narrow {left: 30px;}
.ͼ2 .cm-snippetField {background-color: #00000022;}
.ͼ3 .cm-snippetField {background-color: #ffffff22;}
.ͼ1 .cm-snippetFieldPosition {vertical-align: text-top; width: 0; height: 1.15em; display: inline-block; margin: 0 -0.7px -.7em; border-left: 1.4px dotted #888;}
.ͼ1 .cm-completionMatchedText {text-decoration: underline;}
.ͼ1 .cm-completionDetail {margin-left: 0.5em; font-style: italic;}
.ͼ1 .cm-completionIcon {font-size: 90%; width: .8em; display: inline-block; text-align: center; padding-right: .6em; opacity: 0.6; box-sizing: content-box;}
.ͼ1 .cm-completionIcon-function:after, .ͼ1 .cm-completionIcon-method:after {content: 'ƒ';}
.ͼ1 .cm-completionIcon-class:after {content: '○';}
.ͼ1 .cm-completionIcon-interface:after {content: '◌';}
.ͼ1 .cm-completionIcon-variable:after {content: '𝑥';}
.ͼ1 .cm-completionIcon-constant:after {content: '𝐶';}
.ͼ1 .cm-completionIcon-type:after {content: '𝑡';}
.ͼ1 .cm-completionIcon-enum:after {content: '';}
.ͼ1 .cm-completionIcon-property:after {content: '□';}
.ͼ1 .cm-completionIcon-keyword:after {content: '🔑︎';}
.ͼ1 .cm-completionIcon-namespace:after {content: '▢';}
.ͼ1 .cm-completionIcon-text:after {content: 'abc'; font-size: 50%; vertical-align: middle;}
.ͼ1 .cm-tooltip {z-index: 500; box-sizing: border-box;}
.ͼ2 .cm-tooltip {border: 1px solid #bbb; background-color: #f5f5f5;}
.ͼ2 .cm-tooltip-section:not(:first-child) {border-top: 1px solid #bbb;}
.ͼ3 .cm-tooltip {background-color: #333338; color: white;}
.ͼ1 .cm-tooltip-arrow:before, .ͼ1 .cm-tooltip-arrow:after {content: ''; position: absolute; width: 0; height: 0; border-left: 7px solid transparent; border-right: 7px solid transparent;}
.ͼ1 .cm-tooltip-above .cm-tooltip-arrow:before {border-top: 7px solid #bbb;}
.ͼ1 .cm-tooltip-above .cm-tooltip-arrow:after {border-top: 7px solid #f5f5f5; bottom: 1px;}
.ͼ1 .cm-tooltip-above .cm-tooltip-arrow {bottom: -7px;}
.ͼ1 .cm-tooltip-below .cm-tooltip-arrow:before {border-bottom: 7px solid #bbb;}
.ͼ1 .cm-tooltip-below .cm-tooltip-arrow:after {border-bottom: 7px solid #f5f5f5; top: 1px;}
.ͼ1 .cm-tooltip-below .cm-tooltip-arrow {top: -7px;}
.ͼ1 .cm-tooltip-arrow {height: 7px; width: 14px; position: absolute; z-index: -1; overflow: hidden;}
.ͼ3 .cm-tooltip .cm-tooltip-arrow:before {border-top-color: #333338; border-bottom-color: #333338;}
.ͼ3 .cm-tooltip .cm-tooltip-arrow:after {border-top-color: transparent; border-bottom-color: transparent;}
.ͼn {color: #c678dd;}
.ͼo {color: var(--md-color);}
.ͼp {color: #2d8cf0;}
.ͼq {color: #d19a66;}
.ͼr {color: #3f4a54;}
.ͼs {color: #e5c07b;}
.ͼt {color: #56b6c2;}
.ͼu {color: #2d8cf0;}
.ͼv {font-weight: bold;}
.ͼw {font-style: italic;}
.ͼx {text-decoration: line-through;}
.ͼy {color: #2d8cf0; text-decoration: underline;}
.ͼz {font-weight: bold; color: var(--md-color);}
.ͼ10 {color: #d19a66;}
.ͼ11 {color: #3f4a54;}
.ͼ12 {color: #fff;}
.ͼm {color: #3f4a54; background-color: var(--md-bk-color);}
.ͼm .cm-content {caret-color: #3f4a54;}
.ͼm .cm-cursor, .ͼm .cm-dropCursor {border-left-color: #3f4a54;}
.ͼm.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground, .ͼm .cm-selectionBackground, .ͼm .cm-content ::selection {background-color: #bad5fa;}
.ͼm .cm-panels {background-color: #f6f6f6; color: #3f4a54;}
.ͼm .cm-panels.cm-panels-top {border-bottom: 1px solid var(--md-border-color);}
.ͼm .cm-panels.cm-panels-bottom {border-top: 1px solid var(--md-border-color);}
.ͼm .cm-searchMatch {background-color: #72a1ff59; outline: 1px solid #457dff;}
.ͼm .cm-searchMatch.cm-searchMatch-selected {background-color: #6199ff2f;}
.ͼm .cm-activeLine {background-color: #ceedfa33;}
.ͼm .cm-selectionMatch {background-color: #aafe661a;}
.ͼm.cm-focused .cm-matchingBracket, .ͼm.cm-focused .cm-nonmatchingBracket {background-color: #bad0f847;}
.ͼm .cm-gutters {background-color: var(--md-bk-color); color: #3f4a54; border-right: 1px solid; border-color: var(--md-border-color);}
.ͼm .cm-activeLineGutter {background-color: #ceedfa33;}
.ͼm .cm-foldPlaceholder {background-color: transparent; border: none; color: #ddd;}
.ͼm .cm-tooltip {border: 1px solid var(--md-border-color); background-color: var(--md-bk-color);}
.ͼm .cm-tooltip .cm-tooltip-arrow:before {border-top-color: transparent; border-bottom-color: transparent;}
.ͼm .cm-tooltip .cm-tooltip-arrow:after {border-top-color: var(--md-bk-color); border-bottom-color: var(--md-bk-color);}
.ͼm .cm-tooltip-autocomplete > ul > li[aria-selected] {color: #3f4a54;}
.ͼ4 .cm-line ::selection, .ͼ4 .cm-line::selection {background-color: transparent !important;}
.ͼ4 .cm-line {caret-color: transparent !important;}
.ͼ4 .cm-content :focus::selection, .ͼ4 .cm-content :focus ::selection {background-color: Highlight !important;}
.ͼ4 .cm-content :focus {caret-color: initial !important;}
.ͼ4 .cm-content {caret-color: transparent !important;}
</style><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="/memocard/favicon.ico"><title>开发指南</title><script defer="defer" src="/memocard/js/chunk-vendors.6381e04c.js"></script><script defer="defer" src="/memocard/js/app.dd06943e.js"></script><link href="/memocard/css/chunk-vendors.ee346564.css" rel="stylesheet"><link href="/memocard/css/app.3ab19182.css" rel="stylesheet"><style type="text/css">.medium-zoom-overlay{position:fixed;top:0;right:0;bottom:0;left:0;opacity:0;transition:opacity .3s;will-change:opacity}.medium-zoom--opened .medium-zoom-overlay{cursor:pointer;cursor:zoom-out;opacity:1}.medium-zoom-image{cursor:pointer;cursor:zoom-in;transition:transform .3s cubic-bezier(.2,0,.2,1)!important}.medium-zoom-image--hidden{visibility:hidden}.medium-zoom-image--opened{position:relative;cursor:pointer;cursor:zoom-out;will-change:transform}</style><style type="text/css" data-primevue-style-id="base">
.p-hidden-accessible {
border: 0;
clip: rect(0 0 0 0);
height: 1px;
margin: -1px;
overflow: hidden;
padding: 0;
position: absolute;
width: 1px;
}
.p-hidden-accessible input,
.p-hidden-accessible select {
transform: scale(0);
}
.p-overflow-hidden {
overflow: hidden;
padding-right: var(--scrollbar-width);
}
</style><style type="text/css" data-primevue-style-id="baseicon">
.p-icon {
display: inline-block;
}
.p-icon-spin {
-webkit-animation: p-icon-spin 2s infinite linear;
animation: p-icon-spin 2s infinite linear;
}
@-webkit-keyframes p-icon-spin {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(359deg);
transform: rotate(359deg);
}
}
@keyframes p-icon-spin {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(359deg);
transform: rotate(359deg);
}
}
</style></head><body><noscript><strong>We're sorry but memocard doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app" data-v-app=""><body><div class="flex justify-content-center"><div class="grid w-12 md:w-10 mt-4"><div class="col-12"><!----><!----><!----><div class="p-card p-component" data-pc-name="card" data-pc-section="root"><div class="p-card-header" data-pc-section="header"><div class="relative flex justify-content-center"><div id="id-question" class="flex align-items-center justify-content-center text-3xl font-bold" contenteditable="true">开发指南</div></div></div><div class="p-card-body" data-pc-section="body"><!----><div class="p-card-content" data-pc-section="content"></div><div class="p-card-footer" data-pc-section="footer"><div id="id-answer"><div id="md-editor-v-0" class="md-editor mt-3"><div class="md-editor-toolbar-wrapper" id="md-editor-v-0-toolbar-wrapper"><div class="md-editor-toolbar"><div class="md-editor-toolbar-left"><div class="md-editor-toolbar-item" title="加粗"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-bold-icon md-editor-icon"><path d="M6 12h9a4 4 0 0 1 0 8H7a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h7a4 4 0 0 1 0 8"></path></svg><!----></div><div class="md-editor-toolbar-item" title="下划线"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-underline-icon md-editor-icon"><path d="M6 4v6a6 6 0 0 0 12 0V4"></path><line x1="4" x2="20" y1="20" y2="20"></line></svg><!----></div><div class="md-editor-toolbar-item" title="斜体"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-italic-icon md-editor-icon"><line x1="19" x2="10" y1="4" y2="4"></line><line x1="14" x2="5" y1="20" y2="20"></line><line x1="15" x2="9" y1="4" y2="20"></line></svg><!----></div><div class="md-editor-divider"></div><div class="md-editor-toolbar-item" title="标题"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-heading-icon md-editor-icon"><path d="M6 12h12"></path><path d="M6 20V4"></path><path d="M18 20V4"></path></svg><!----></div><div class="md-editor-dropdown md-editor-dropdown-hidden"><div class="md-editor-dropdown-overlay"><ul class="md-editor-menu" role="menu"><li class="md-editor-menu-item md-editor-menu-item-title" role="menuitem" tabindex="0">一级标题</li><li class="md-editor-menu-item md-editor-menu-item-title" role="menuitem" tabindex="0">二级标题</li><li class="md-editor-menu-item md-editor-menu-item-title" role="menuitem" tabindex="0">三级标题</li><li class="md-editor-menu-item md-editor-menu-item-title" role="menuitem" tabindex="0">四级标题</li><li class="md-editor-menu-item md-editor-menu-item-title" role="menuitem" tabindex="0">五级标题</li><li class="md-editor-menu-item md-editor-menu-item-title" role="menuitem" tabindex="0">六级标题</li></ul></div></div><div class="md-editor-toolbar-item" title="删除线"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-strikethrough-icon md-editor-icon"><path d="M16 4H9a3 3 0 0 0-2.83 4"></path><path d="M14 12a4 4 0 0 1 0 8H6"></path><line x1="4" x2="20" y1="12" y2="12"></line></svg><!----></div><div class="md-editor-toolbar-item" title="下标"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucid
<p data-line="1">本数据处理程序为用<a href="https://www.runoob.com/python3/python3-tutorial.html">Python</a>编写的通用性框架,可以根据实际项目需求动态配置。可配置的内容在界面上展示为三部分:左侧项目树,中间数据表或图表,右侧交互按钮和输入框。项目树中的每个项目可以包含多个数据表或图表,每个数据表或图表可以对应多个按钮和输入框。配置数据存储于程序所在目录下的./config和./script和./data三个文件夹中。./config文件夹中存放<a href="https://www.runoob.com/w3cnote/yaml-intro.html">YAML</a>格式配置文件,./script文件夹中存放Python脚本./data文件夹中存放CSV格式表格数据。所有配置文件均可直接用记事本等文本编辑器直接打开查看。</p>
<h3 id="项目树" data-line="2">项目树</h3>
<p data-line="3">项目树由./config/default.yml文件中tree键值配置。tree键值下可以有多个节点每个节点有如下属性</p>
<ul data-line="4">
<li data-line="4">id 必需标识符必须唯一不能重复用于写Python脚本时获取该项目</li>
<li data-line="5">label (必需)展示在界面上的项目名称</li>
<li data-line="6">child 可选可包括多个子节点每个节点同样有id、label和child属性子节点要在YAML文件里多一级缩进</li>
</ul>
<h3 id="数据表和图表" data-line="7">数据表和图表</h3>
<p data-line="8">数据表和图表由./config/default.yml文件中display键值配置。display键值下面第一级为项目id必须和上面项目树里的id相同。项目id下可有多个数据表或图表每个数据表或图表有如下属性</p>
<ul data-line="9">
<li data-line="9">id 必需标识符必须唯一。用于在Python脚本里访问该表</li>
<li data-line="10">label (必需)展示在界面上的名称</li>
<li data-line="11">type 必需类型如果为table则是数据表如果为graph则为图表<br>
数据表有如下属性:</li>
<li data-line="13">row (可选)表格行数</li>
<li data-line="14">col (可选)表格列数</li>
<li data-line="15">column_header (可选)表头</li>
<li data-line="16">data (可选)表格数据,比如</li>
</ul>
<details open="" class="md-editor-code" data-line="17">
<summary class="md-editor-code-head">
<div class="md-editor-code-flag"><span></span><span></span><span></span></div>
<div class="md-editor-code-action">
<span class="md-editor-code-lang">yaml</span>
<span data-tips="复制代码" class="md-editor-copy-button">复制代码</span>
<span class="md-editor-collapse-tips"><svg class="lucide lucide-circle-chevron-left md-editor-icon" stroke-linejoin="round" stroke-linecap="round" stroke-width="2" stroke="currentColor" fill="none" viewBox="0 0 24 24" height="24" width="24" xmlns="http://www.w3.org/2000/svg"><circle r="10" cy="12" cx="12"></circle><path d="m14 16-4-4 4-4"></path></svg></span>
</div>
</summary>
<pre><code class="language-yaml"><span class="md-editor-code-block"><span class="hljs-bullet">-</span> <span class="hljs-bullet">-</span> <span class="hljs-string">a</span>
<span class="hljs-bullet">-</span> <span class="hljs-string">b</span>
<span class="hljs-bullet">-</span> <span class="hljs-bullet">-</span> <span class="hljs-string">d</span>
<span class="hljs-bullet">-</span> <span class="hljs-string">e</span></span><span aria-hidden="true"><span></span><span></span><span></span><span></span></span></code></pre>
</details>
<p data-line="23">会展示为</p>
<table data-line="25" style="color:black">
<tbody data-line="27">
<tr data-line="27">
<td>a</td>
<td>b</td>
</tr>
<tr data-line="28">
<td>c</td>
<td>d</td>
</tr>
</tbody>
</table>
<ul data-line="30">
<li data-line="30">datafile 可选表格数据文件。与data属性数据直接存放在default.yml文件里不同该属性为csv文件名数据存放在./data文件夹下面的对应文件中</li>
<li data-line="31">format_script (可选)格式脚本,存放于./script文件夹中。用于指定每个单元格中的数据格式。格式脚本中必须定义table_format函数输入为row行号和col列号返回为格式类型。</li>
<li data-line="32">span 可选用于合并单元格。span可以包含多项每项4个数字分别是行号、列号、行跨度、列跨度。<br>
图表有如下属性:</li>
<li data-line="34">axis_x_title: 横轴标签</li>
<li data-line="35">axis_y_title: 纵轴标签</li>
</ul>
<h3 id="交互按钮和输入框" data-line="36">交互按钮和输入框</h3>
<p data-line="37">交互按钮和输入框由./config/default.yml文件中interact键值配置。interact键值下面第一级为数据表或图表id必须和上面display中的id相同。数据表或图表id下可有多个交互按钮和输入框每个交互按钮和输入框有如下属性</p>
<ul data-line="38">
<li data-line="38">type 必需类型如果为button则是按钮如果为input则是输入框</li>
<li data-line="39">label (必需)展示在界面上的名称<br>
按钮有如下属性</li>
<li data-line="41">script 可选点击该按钮后会运行的Python脚本Python脚本存放在./script文件夹里<br>
输入框有如下属性</li>
<li data-line="43">id 必需标识符必须唯一。用于在Python脚本里获取对应输入</li>
</ul>
<h3 id="Python脚本API" data-line="44">Python脚本API</h3>
<p data-line="45">目前支持对表格的读写和绘图,并不支持动态地创建或删除表格或图表。样例参见./script文件夹里已有脚本。</p>
<details class="md-editor-code" data-line="46">
<summary class="md-editor-code-head">
<div class="md-editor-code-flag"><span></span><span></span><span></span></div>
<div class="md-editor-code-action">
<span class="md-editor-code-lang">python</span>
<span data-tips="复制代码" class="md-editor-copy-button">复制代码</span>
<span class="md-editor-collapse-tips"><svg class="lucide lucide-circle-chevron-left md-editor-icon" stroke-linejoin="round" stroke-linecap="round" stroke-width="2" stroke="currentColor" fill="none" viewBox="0 0 24 24" height="24" width="24" xmlns="http://www.w3.org/2000/svg"><circle r="10" cy="12" cx="12"></circle><path d="m14 16-4-4 4-4"></path></svg></span>
</div>
</summary>
<pre><code class="language-python"><span class="md-editor-code-block"><span class="hljs-keyword">class</span> <span class="hljs-title class_">project</span>:
list_id = []
<span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self, <span class="hljs-built_in">id</span></span>):
<span class="hljs-variable language_">self</span>.<span class="hljs-built_in">id</span> = <span class="hljs-built_in">id</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">__enter__</span>(<span class="hljs-params">self</span>):
project.list_id.append(<span class="hljs-variable language_">self</span>.<span class="hljs-built_in">id</span>)
<span class="hljs-keyword">return</span> <span class="hljs-variable language_">self</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">__exit__</span>(<span class="hljs-params">self, *args</span>):
project.list_id.pop()
<span class="hljs-keyword">class</span> <span class="hljs-title class_">sheet</span>:
list_widget = []
<span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self, sheet_id</span>):
widget = window.widget_display.map_table[sheet_id]
<span class="hljs-variable language_">self</span>.<span class="hljs-built_in">id</span> = sheet_id
<span class="hljs-variable language_">self</span>.widget = widget
<span class="hljs-keyword">def</span> <span class="hljs-title function_">__enter__</span>(<span class="hljs-params">self</span>):
sheet.list_widget.append(<span class="hljs-variable language_">self</span>.widget)
<span class="hljs-keyword">return</span> <span class="hljs-variable language_">self</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">__exit__</span>(<span class="hljs-params">self, *args</span>):
sheet.list_widget.pop()
<span class="hljs-keyword">def</span> <span class="hljs-title function_">at</span>(<span class="hljs-params">self, *args</span>):
c = cell(*args, widget = <span class="hljs-variable language_">self</span>.widget)
<span class="hljs-keyword">return</span> c
<span class="hljs-keyword">def</span> <span class="hljs-title function_">__getitem__</span>(<span class="hljs-params">self, index</span>):
<span class="hljs-keyword">if</span> <span class="hljs-built_in">type</span>(index) <span class="hljs-keyword">is</span> <span class="hljs-built_in">tuple</span>:
<span class="hljs-keyword">return</span> <span class="hljs-variable language_">self</span>.at(*index)
<span class="hljs-keyword">else</span>:
<span class="hljs-keyword">return</span> <span class="hljs-variable language_">self</span>.at(index)
<span class="hljs-meta"> @property</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">row</span>(<span class="hljs-params">self</span>):
<span class="hljs-keyword">return</span> <span class="hljs-variable language_">self</span>.widget.row
<span class="hljs-meta"> @row.setter</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">row</span>(<span class="hljs-params">self, row</span>):
<span class="hljs-variable language_">self</span>.widget.row = row
<span class="hljs-meta"> @property</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">col</span>(<span class="hljs-params">self</span>):
<span class="hljs-keyword">return</span> <span class="hljs-variable language_">self</span>.widget.col
<span class="hljs-meta"> @col.setter</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">col</span>(<span class="hljs-params">self, col</span>):
<span class="hljs-variable language_">self</span>.widget.col = col
<span class="hljs-keyword">def</span> <span class="hljs-title function_">clear</span>(<span class="hljs-params">self</span>):
<span class="hljs-variable language_">self</span>.widget.clear()
<span class="hljs-keyword">def</span> <span class="hljs-title function_">clear_content</span>(<span class="hljs-params">self</span>):
<span class="hljs-variable language_">self</span>.widget.clearContents()
<span class="hljs-keyword">def</span> <span class="hljs-title function_">initial</span>(<span class="hljs-params">self</span>):
<span class="hljs-variable language_">self</span>.widget.initial()
<span class="hljs-keyword">def</span> <span class="hljs-title function_">reset_content</span>(<span class="hljs-params">self</span>):
<span class="hljs-variable language_">self</span>.widget.reset_content()
<span class="hljs-keyword">def</span> <span class="hljs-title function_">fit_content</span>(<span class="hljs-params">self</span>):
<span class="hljs-variable language_">self</span>.widget.fit_content()
<span class="hljs-keyword">def</span> <span class="hljs-title function_">load_data</span>(<span class="hljs-params">self, *arg, **kwarg</span>):
<span class="hljs-variable language_">self</span>.widget.load_data(*arg, **kwarg)
<span class="hljs-keyword">def</span> <span class="hljs-title function_">dump_data</span>(<span class="hljs-params">self, *arg, **kwarg</span>):
<span class="hljs-keyword">return</span> <span class="hljs-variable language_">self</span>.widget.dump_data(*arg, **kwarg)
<span class="hljs-keyword">def</span> <span class="hljs-title function_">load_str</span>(<span class="hljs-params">self, *arg, **kwarg</span>):
<span class="hljs-variable language_">self</span>.widget.load_str(*arg, **kwarg)
<span class="hljs-keyword">def</span> <span class="hljs-title function_">dump_str</span>(<span class="hljs-params">self, *arg, **kwarg</span>):
<span class="hljs-keyword">return</span> <span class="hljs-variable language_">self</span>.widget.dump_str(*arg, **kwarg)
<span class="hljs-keyword">def</span> <span class="hljs-title function_">load_file</span>(<span class="hljs-params">self, *arg, **kwarg</span>):
<span class="hljs-variable language_">self</span>.widget.load_file(*arg, **kwarg)
<span class="hljs-keyword">def</span> <span class="hljs-title function_">dump_file</span>(<span class="hljs-params">self, *arg, **kwarg</span>):
<span class="hljs-variable language_">self</span>.widget.dump_file(*arg, **kwarg)
<span class="hljs-keyword">class</span> <span class="hljs-title class_">cell</span>:
<span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self, *arg, widget = <span class="hljs-literal">None</span></span>):
<span class="hljs-keyword">if</span> <span class="hljs-built_in">len</span>(arg) == <span class="hljs-number">1</span>:
pos = arg[<span class="hljs-number">0</span>]
pos = pos.lower()
row = <span class="hljs-literal">None</span>
col = <span class="hljs-literal">None</span>
<span class="hljs-keyword">match</span> = re.<span class="hljs-keyword">match</span>(<span class="hljs-string">r"([a-z]+)(\d+)"</span>, pos)
<span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> <span class="hljs-keyword">match</span>:
<span class="hljs-keyword">raise</span> RuntimeError(<span class="hljs-string">f"unrecognized pos: \"<span class="hljs-subst">{pos}</span>\""</span>)
row = <span class="hljs-keyword">match</span>.group(<span class="hljs-number">2</span>)
cl = <span class="hljs-keyword">match</span>.group(<span class="hljs-number">1</span>)
row = <span class="hljs-built_in">int</span>(row) - <span class="hljs-number">1</span>
col = <span class="hljs-number">0</span>
<span class="hljs-keyword">for</span> <span class="hljs-built_in">chr</span> <span class="hljs-keyword">in</span> cl:
col *= <span class="hljs-number">26</span>
col += <span class="hljs-built_in">ord</span>(<span class="hljs-built_in">chr</span>) - <span class="hljs-built_in">ord</span>(<span class="hljs-string">"a"</span>)
<span class="hljs-keyword">elif</span> <span class="hljs-built_in">len</span>(arg) == <span class="hljs-number">2</span>:
row = arg[<span class="hljs-number">0</span>]
col = arg[<span class="hljs-number">1</span>]
<span class="hljs-keyword">else</span>:
<span class="hljs-keyword">raise</span> RuntimeError(<span class="hljs-string">"The number of params should not be more than 2"</span>)
<span class="hljs-variable language_">self</span>.item = <span class="hljs-literal">None</span>
<span class="hljs-keyword">if</span> widget <span class="hljs-keyword">is</span> <span class="hljs-literal">None</span> <span class="hljs-keyword">and</span> sheet.list_widget:
widget = sheet.list_widget[-<span class="hljs-number">1</span>]
<span class="hljs-keyword">if</span> widget:
<span class="hljs-variable language_">self</span>.item = widget.at(row, col)
<span class="hljs-meta"> @property</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">text</span>(<span class="hljs-params">self</span>):
<span class="hljs-keyword">return</span> <span class="hljs-variable language_">self</span>.item.text
<span class="hljs-meta"> @text.setter</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">text</span>(<span class="hljs-params">self, s</span>):
<span class="hljs-variable language_">self</span>.item.text = s
<span class="hljs-meta"> @property</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">value</span>(<span class="hljs-params">self</span>):
<span class="hljs-keyword">return</span> <span class="hljs-variable language_">self</span>.item.value
<span class="hljs-meta"> @value.setter</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">value</span>(<span class="hljs-params">self, v</span>):
<span class="hljs-variable language_">self</span>.item.value = v
<span class="hljs-keyword">def</span> <span class="hljs-title function_">empty</span>(<span class="hljs-params">self</span>):
<span class="hljs-keyword">return</span> <span class="hljs-variable language_">self</span>.item.empty()
<span class="hljs-keyword">def</span> <span class="hljs-title function_">clear</span>(<span class="hljs-params">self</span>):
<span class="hljs-variable language_">self</span>.item.value = <span class="hljs-literal">None</span>
<span class="hljs-keyword">class</span> <span class="hljs-title class_">graph</span>:
list_widget = []
<span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self, graph_id</span>):
widget = window.widget_display.map_graph[graph_id]
<span class="hljs-variable language_">self</span>.<span class="hljs-built_in">id</span> = graph_id
<span class="hljs-variable language_">self</span>.widget = widget
<span class="hljs-keyword">def</span> <span class="hljs-title function_">__enter__</span>(<span class="hljs-params">self</span>):
graph.list_widget.append(<span class="hljs-variable language_">self</span>.widget)
<span class="hljs-keyword">return</span> <span class="hljs-variable language_">self</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">__exit__</span>(<span class="hljs-params">self, *args</span>):
graph.list_widget.pop()
<span class="hljs-keyword">def</span> <span class="hljs-title function_">plot</span>(<span class="hljs-params">self, *arg, **kwarg</span>):
<span class="hljs-variable language_">self</span>.widget.plot(*arg, **kwarg)
<span class="hljs-keyword">def</span> <span class="hljs-title function_">plot</span>(<span class="hljs-params">*arg, **kwarg</span>):
widget = graph.list_widget[-<span class="hljs-number">1</span>]
widget.plot(*arg, **kwarg)
<span class="hljs-keyword">def</span> <span class="hljs-title function_">param</span>(<span class="hljs-params"><span class="hljs-built_in">id</span></span>):
map_input = window.widget_interact.widget_grid.map_input
result = map_input.get(<span class="hljs-built_in">id</span>)
<span class="hljs-keyword">return</span> result</span><span aria-hidden="true"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>
</details>
<details class="md-editor-code" data-line="212">
<summary class="md-editor-code-head">
<div class="md-editor-code-flag"><span></span><span></span><span></span></div>
<div class="md-editor-code-action">
<span class="md-editor-code-lang">Python</span>
<span data-tips="复制代码" class="md-editor-copy-button">复制代码</span>
<span class="md-editor-collapse-tips"><svg class="lucide lucide-circle-chevron-left md-editor-icon" stroke-linejoin="round" stroke-linecap="round" stroke-width="2" stroke="currentColor" fill="none" viewBox="0 0 24 24" height="24" width="24" xmlns="http://www.w3.org/2000/svg"><circle r="10" cy="12" cx="12"></circle><path d="m14 16-4-4 4-4"></path></svg></span>
</div>
</summary>
<pre><code class="language-Python"><span class="md-editor-code-block"><span class="hljs-keyword">class</span> <span class="hljs-title class_">string</span>:
dtype = <span class="hljs-built_in">str</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self</span>):
<span class="hljs-keyword">pass</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">str2val</span>(<span class="hljs-params">self, s</span>):
<span class="hljs-keyword">return</span> s
<span class="hljs-keyword">def</span> <span class="hljs-title function_">val2str</span>(<span class="hljs-params">self, v</span>):
<span class="hljs-keyword">return</span> v
<span class="hljs-keyword">class</span> <span class="hljs-title class_">integer</span>:
dtype = <span class="hljs-built_in">int</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self, fmt = <span class="hljs-string">"%d"</span></span>):
<span class="hljs-variable language_">self</span>.fmt = fmt
<span class="hljs-keyword">def</span> <span class="hljs-title function_">str2val</span>(<span class="hljs-params">self, s</span>):
s = s.strip()
<span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> s:
<span class="hljs-keyword">return</span> <span class="hljs-literal">None</span>
<span class="hljs-keyword">try</span>:
v = <span class="hljs-built_in">int</span>(s)
<span class="hljs-keyword">except</span>:
v = <span class="hljs-built_in">int</span>(<span class="hljs-built_in">float</span>(s))
<span class="hljs-keyword">return</span> v
<span class="hljs-keyword">def</span> <span class="hljs-title function_">val2str</span>(<span class="hljs-params">self, v</span>):
<span class="hljs-keyword">return</span> <span class="hljs-variable language_">self</span>.fmt % v
<span class="hljs-keyword">class</span> <span class="hljs-title class_">decimal</span>:
dtype = <span class="hljs-built_in">float</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self, fmt = <span class="hljs-string">"%.3f"</span>, epsilon = <span class="hljs-number">1e-4</span></span>):
<span class="hljs-variable language_">self</span>.fmt = fmt
<span class="hljs-variable language_">self</span>.epsilon = epsilon
<span class="hljs-keyword">def</span> <span class="hljs-title function_">str2val</span>(<span class="hljs-params">self, s</span>):
s = s.strip()
<span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> s:
<span class="hljs-keyword">return</span> <span class="hljs-literal">None</span>
<span class="hljs-keyword">return</span> <span class="hljs-built_in">float</span>(s)
<span class="hljs-keyword">def</span> <span class="hljs-title function_">val2str</span>(<span class="hljs-params">self, v</span>):
<span class="hljs-keyword">if</span> <span class="hljs-built_in">abs</span>(v) &lt; <span class="hljs-variable language_">self</span>.epsilon:
v = <span class="hljs-number">0.0</span>
<span class="hljs-keyword">return</span> <span class="hljs-variable language_">self</span>.fmt % v
<span class="hljs-keyword">class</span> <span class="hljs-title class_">kdecimal</span>:
dtype = <span class="hljs-built_in">float</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self, fmt = <span class="hljs-string">"%07.3f"</span>, epsilon = <span class="hljs-number">1e-4</span></span>):
<span class="hljs-variable language_">self</span>.fmt = fmt
<span class="hljs-variable language_">self</span>.epsilon = epsilon
<span class="hljs-keyword">def</span> <span class="hljs-title function_">str2val</span>(<span class="hljs-params">self, s</span>):
s = s.strip()
<span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> s:
<span class="hljs-keyword">return</span> <span class="hljs-literal">None</span>
<span class="hljs-keyword">match</span> = re.<span class="hljs-keyword">match</span>(<span class="hljs-string">r"[kK](\d+)\+(\d+(?:\.\d+)?)"</span>, s)
<span class="hljs-keyword">if</span> <span class="hljs-keyword">match</span> <span class="hljs-keyword">is</span> <span class="hljs-literal">None</span>:
<span class="hljs-keyword">raise</span> RuntimeError(<span class="hljs-string">f"pattern not matched: <span class="hljs-subst">{s}</span>"</span>)
a = <span class="hljs-keyword">match</span>.group(<span class="hljs-number">1</span>)
b = <span class="hljs-keyword">match</span>.group(<span class="hljs-number">2</span>)
<span class="hljs-keyword">return</span> <span class="hljs-built_in">float</span>(a + b)
<span class="hljs-keyword">def</span> <span class="hljs-title function_">val2str</span>(<span class="hljs-params">self, v</span>):
a = v // <span class="hljs-number">1000</span>
b = v % <span class="hljs-number">1000</span>
<span class="hljs-keyword">if</span> <span class="hljs-built_in">abs</span>(b - <span class="hljs-number">1000</span>) &lt; <span class="hljs-variable language_">self</span>.epsilon:
a += <span class="hljs-number">1</span>
b = <span class="hljs-number">0.0</span>
<span class="hljs-keyword">elif</span> <span class="hljs-built_in">abs</span>(b) &lt; <span class="hljs-variable language_">self</span>.epsilon:
b = <span class="hljs-number">0.0</span>
<span class="hljs-keyword">return</span> <span class="hljs-string">f"K%d+<span class="hljs-subst">{self.fmt}</span>"</span> % (a, b)
<span class="hljs-keyword">class</span> <span class="hljs-title class_">angle</span>:
dtype = <span class="hljs-built_in">float</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self</span>):
<span class="hljs-keyword">pass</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">str2val</span>(<span class="hljs-params">self, s</span>):
s = s.strip()
<span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> s:
<span class="hljs-keyword">return</span> <span class="hljs-literal">None</span>
<span class="hljs-keyword">match</span> = re.<span class="hljs-keyword">match</span>(<span class="hljs-string">r"(\d+)°(\d+)(\d+(?:\.\d+)?)″"</span>, s)
<span class="hljs-keyword">if</span> <span class="hljs-keyword">match</span> <span class="hljs-keyword">is</span> <span class="hljs-literal">None</span>:
<span class="hljs-keyword">raise</span> RuntimeError(<span class="hljs-string">f"pattern not matched: <span class="hljs-subst">{s}</span>"</span>)
d = <span class="hljs-built_in">int</span>(<span class="hljs-keyword">match</span>.group(<span class="hljs-number">1</span>))
m = <span class="hljs-built_in">int</span>(<span class="hljs-keyword">match</span>.group(<span class="hljs-number">2</span>))
s = <span class="hljs-built_in">float</span>(<span class="hljs-keyword">match</span>.group(<span class="hljs-number">3</span>))
<span class="hljs-keyword">return</span> dms2rad(d, m, s)
<span class="hljs-keyword">def</span> <span class="hljs-title function_">val2str</span>(<span class="hljs-params">self, v</span>):
<span class="hljs-keyword">return</span> <span class="hljs-string">"%2d°%02d%05.2f″"</span> % rad2dms(v)</span><span aria-hidden="true"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>
</details>
</div></div><!----></div><!----></div><div class="md-editor-footer"><div class="md-editor-footer-left"><div class="md-editor-footer-item"><label class="md-editor-footer-label">字数:</label><span>6503</span></div></div><div class="md-editor-footer-right"><!----><!----></div></div></div></div></div></div></div></div></div></div></body></div><div class="p-toast p-component p-toast-bottom-right p-ripple-disabled" style="position: fixed; right: 20px; bottom: 20px;" data-pc-name="toast" data-pc-section="root"><div data-pc-section="message"></div></div><div class="md-editor-modal-container" data-theme="light"><div style="display: none;"><div class="md-editor-modal-mask" style="z-index: -1;"></div><div class="md-editor-modal" style="z-index: -1; left: 0px; top: 0px; width: auto; height: auto;"><div class="md-editor-modal-header">添加链接</div><div class="md-editor-modal-body"><div class="md-editor-form-item"><label class="md-editor-label" for="link-desc-md-editor-v-0">链接描述:</label><input placeholder="请输入描述..." class="md-editor-input" id="link-desc-md-editor-v-0" type="text" autocomplete="off" value=""></div><div class="md-editor-form-item"><label class="md-editor-label" for="link-url-md-editor-v-0">链接地址:</label><input placeholder="请输入链接..." class="md-editor-input" id="link-url-md-editor-v-0" type="text" autocomplete="off" value=""></div><div class="md-editor-form-item"><button class="md-editor-btn md-editor-btn-row" type="button">确定</button></div></div><div class="md-editor-modal-func"><!----><div class="md-editor-modal-close"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-xicon md-editor-icon"><path d="M18 6 6 18"></path><path d="m6 6 12 12"></path></svg></div></div></div></div></div><div class="md-editor-modal-container" data-theme="light"><div class="md-editor-modal-clip" style="display: none;"><div class="md-editor-modal-mask" style="z-index: -1;"></div><div class="md-editor-modal" style="z-index: -1; left: 0px; top: 0px; width: 668px; height: 421px;"><div class="md-editor-modal-header">裁剪图片上传</div><div class="md-editor-modal-body"><div class="md-editor-form-item md-editor-clip"><div class="md-editor-clip-main"><div class="md-editor-clip-upload" role="button" tabindex="0" aria-label="上传图片"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-upload-icon md-editor-icon"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path><polyline points="17 8 12 3 7 8"></polyline><line x1="12" x2="12" y1="3" y2="15"></line></svg></div></div><div class="md-editor-clip-preview"><div class="md-editor-clip-preview-target"></div></div></div><div class="md-editor-form-item"><button class="md-editor-btn" type="button">上传</button></div><input accept="image/*" type="file" style="display: none;" aria-hidden="true"></div><div class="md-editor-modal-func"><div class="md-editor-modal-adjust"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2-icon md-editor-icon"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></div><div class="md-editor-modal-close"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-xicon md-editor-icon"><path d="M18 6 6 18"></path><path d="m6 6 12 12"></path></svg></div></div></div></div></div></body>