//simpleMarkdown 显示 Markdown import web.form; import string.markdown; namespace web.form; class simpleMarkdown{ ctor(...){{ this = ..web.form(...); this.noScriptErr = true; this.loadcode(` `) this.wait(); var lastElement; var markdownText = ""; this.getMarkdown = function(){ return markdownText; }; this.setMarkdown = function(md){ markdownText = md; this.write(md); } var markdown = ..string.markdown(,,0x400/*_MD_HTML_TASK_ENABLED*/); var katexParse; this.enableKatex = function(enabled){ if(enabled ){ katexParse = function(md){ return ..string.replaceUnmatched(md ,"<$[""'`$]?![^$]+$>|<$$[^$]+$$>|<%<\\\(><\\\)>>|<%<\\\[><\\]>>" ,function(text){ var t,e = ..string.match(text,"^(<<\\\[>|<\\\(>|<$$>|$>)(.+)<<\\\]>|<\\\)>|<$$>|$>$"); if(#e) return ..string.crlf(this.xcall("katex.renderToString",e,{ throwOnError: false, displayMode: t=='[' || t =='$' }),""); } ,"!\N([ \t]*)(```+)<\a\w+>?(.+?)!\N\s*\2![^`\S]" ,"%``" ,"\]*\>.*?\<\/script\>" ,`(["'])\s*javascript\:.+?\1` ); } } else { katexParse = null; } } var renderFinalMarkdown = function(md){ if(katexParse) md = katexParse(md); var html = markdown.render(md); html = ..string.replace(html ,"\(<@@Ctrl@>|<@@Shift@>|<@@Alt@>||<[Ff]\d>!\W.*?)\" ,function(kbd){ var items = ..string.splitEx(kbd,"\s*\+\s*"); for(i,v in items){ items[i] = ""+v+"" } return ..string.join(items,"+"); } ) html = ..string.replace(html,"\<(|)\>(.+?)\","
推理过程
\2
"); if(this.renderPollinationsAsImg){ // for winex.ctrl.flashDict html = ..string.replace(html,`\\s*\.+?\\s*\
\s*(.+?)\s*\
\s*\` ,``); } html = ..string.replace(html ,`(\
\(.+?)\)\
` ,function(htm,code){ import crypt; import string.html; code = ..string.html.ncr(code) var url = "https://aardio.com/util/mermaid/?code=" + ..crypt.encodeUrlBase64(code); return htm + `查看图像` }) return html; } this.write = function(md){ this.body.innerHTML = renderFinalMarkdown(md); this.script.onWriteEnd(null); return this; } var eleThinking; var deltaCatch = {} this.showLoading = function(title){ eleThinking = null; lastElement = null; this.body.insertAdjacentHTML("beforeEnd",`
`) this.script.showLoading(title); deltaCatch = {}; } this.showThinking = function(delta){ lastElement = null; deltaCatch = {}; if(!#delta) return; if(!eleThinking){ eleThinking = this.getEle("loading"); if(eleThinking){ eleThinking.outerHTML = `
`; ..com.Release(eleThinking); } else { this.body.insertAdjacentHTML("beforeEnd",`
`); } eleThinking = this.getEle("thinking"); delta = ..string.replace(delta,"<\>|<\s*>",""); } eleThinking.insertAdjacentText("beforeEnd",delta); } this.showError = function(msg){ if(msg===null) return; deltaCatch = {}; this.writeDelta("");//清除 loading this.body.insertAdjacentHTML("beforeEnd",`
`+(tostring(msg):"未知错误")+`
`); lastElement = null; this.script.onWriteEnd(null); if(this.onWriteEnd){ this.onWriteEnd(); } } this.writeDelta = function(delta){ if(eleThinking){ if(!#delta) return; markdownText = ..string.concat(markdownText, `
推理过程
`+eleThinking.innerHTML +'
\n\n'); ..com.Release(eleThinking) eleThinking = null; } if(!delta){ if(this.$writeDeltaDone){ return; } this.$writeDeltaDone = true; deltaCatch = {}; if(#markdownText) { var space,codeOpenTag = ..string.match(markdownText,"!\N([ \t]*)(```+)(<\a\w*><.\2?!>+)$") if(codeOpenTag){ markdownText = markdownText + '\r\n' + (space||"") ++ codeOpenTag; } var html; if(this.beforerWriteEnd){ var md = this.beforerWriteEnd(markdownText); html = renderFinalMarkdown(md || markdownText); } else { html = renderFinalMarkdown(markdownText); } this.body.innerHTML = html; } this.script.onWriteEnd(null); lastElement = null; if(this.onWriteEnd){ this.onWriteEnd(); } return; } if(!#delta) return; this.$writeDeltaDone = null; markdownText = markdownText ++ delta; var lastTagName = lastElement && lastElement.tagName; if(lastElement && ( (lastTagName=="PRE"&&!..string.indexOf(delta,"`")) || !..string.find(delta,"\p") ) ){ ..table.push(deltaCatch,delta); if(#deltaCatch>5){ lastElement.insertAdjacentText("beforeEnd",..string.join(deltaCatch)); deltaCatch = {}; } } else { deltaCatch = {}; var html = markdown.render(markdownText); this.body.innerHTML = html; if(#delta){ lastElement = this.script.lastInsertElement(null) } } return this; } this.BeforeNavigate2 = function( pDisp, url,flags,target,postData,headers,cancel ) { ..raw.execute(url); return url, flags, target, postData, headers,true; } this.NewWindow3 = function(ppDisp,cancel,dwFlags,bstrUrlContext,bstrUrl ) { ..thread.invoke( function(url){ ..raw.execute(url); },bstrUrl ) return ppDisp,true; }; this.setTaskCheckboxEnabled = function(v){ markdown.setTaskCheckboxEnabled(v); } } }; } namespace simpleMarkdown{ _css = $"~\doc\style.css"; _js = $"~\doc\index.js"; _js2 = /********************** Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:prototype|constructor))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],"function":/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/, number:/\b(?:(?:0[xX](?:[\dA-Fa-f](?:_[\dA-Fa-f])?)+|0[bB](?:[01](?:_[01])?)+|0[oO](?:[0-7](?:_[0-7])?)+)n?|(?:\d(?:_\d)?)+n|NaN|Infinity)\b|(?:\b(?:\d(?:_\d)?)+\.?(?:\d(?:_\d)?)*|\B\.(?:\d(?:_\d)?)+)(?:[Ee][+-]?(?:\d(?:_\d)?)+)?/,operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|interface|extends|implements|instanceof|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{ pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{ pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{ "interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}}}),Prism.languages.markup&&(Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),Prism.languages.js=Prism.languages.javascript,Prism.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0},"string-interpolation":{pattern:/(?:f|rf|fr)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}}, string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|rb|br)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|rb|br)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},"function":{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/im,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:and|as|assert|async|await|break|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/, builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,"boolean":/\b(?:True|False|None)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?\b/i,operator:/[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python,Prism.languages.py=Prism.languages.python; Prism.languages.go = Prism.languages.extend('clike', { 'string': { pattern: /(["'`])(?:\\[\s\S]|(?!\1)[^\\])*\1/, greedy: true }, 'keyword': /\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/, 'boolean': /\b(?:_|iota|nil|true|false)\b/, 'number': /(?:\b0x[a-f\d]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[-+]?\d+)?)i?/i, 'operator': /[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./, 'builtin': /\b(?:bool|byte|complex(?:64|128)|error|float(?:32|64)|rune|string|u?int(?:8|16|32|64)?|uintptr|append|cap|close|complex|copy|delete|imag|len|make|new|panic|print(?:ln)?|real|recover)\b/ }); delete Prism.languages.go['class-name']; **********************/ } /*****intellisense() web.form.simpleMarkdown = 用于显示 Markdown 生成的 HTML 的专用 web 窗体。 web.form.simpleMarkdown( = 创建用于显示 Markdown 生成的 HTML 的专用 web 窗体。 web.form.simpleMarkdown(.(winform,hostFlags,dlControl,userAgent,securityTrusted) = 创建支持 Markdown 解析器的 Web 窗体,基于 web.form 。\n\n参数 @winform 可指定窗体或 custom 控件作为网页宿主窗口。\n@winform 也可以指定 null 值或 win.form 构造参数表以创建新窗体。\n\n其他参数不必指定,这些参数的用法请参考 web.form 。 web.form.simpleMarkdown() = !wb. end intellisense*****/