From 3a8b82e18a1e6c1a356d44d0dbd0debac4739cdf Mon Sep 17 00:00:00 2001 From: obgnail Date: Mon, 25 Nov 2024 13:43:29 +0800 Subject: [PATCH 1/3] update search_multi: update error Message --- plugin/search_multi.js | 63 +++++++++++++++++++++++++----------------- 1 file changed, 38 insertions(+), 25 deletions(-) diff --git a/plugin/search_multi.js b/plugin/search_multi.js index 475c3807..865e1be9 100644 --- a/plugin/search_multi.js +++ b/plugin/search_multi.js @@ -249,69 +249,80 @@ class QualifierMixin { "<": (a, b) => a < b, } - static OPERATOR_NAME = { ":": "包含", "=": "等于", "!=": "不等于", ">=": "大于等于", "<=": "小于等于", ">": "大于", "<": "小于" } + static OPERATOR_NAME = { ":": "包含", "=": "为", "!=": "不为", ">=": "大于等于", "<=": "小于等于", ">": "大于", "<": "小于" } static UNITS = { b: 1, k: 1 << 10, m: 1 << 20, g: 1 << 30, kb: 1 << 10, mb: 1 << 20, gb: 1 << 30 } static VALIDATE = { isStringOrRegexp: (scope, operator, operand, operandType) => { - if (operandType === "REGEXP" && operator !== ":") { - throw new Error(`Invalid ${operandType}'s operator:「${operator}」`) + if (operandType === "REGEXP") { + if (operator !== ":") { + throw new Error(`In ${scope.toUpperCase()}: RegExp operands only support the ":" operator`) + } + try { + new RegExp(operand) + } catch (e) { + throw new Error(`In ${scope.toUpperCase()}: Invalid regular expression: "${operand}"`) + } } if (operator !== ":" && operator !== "=" && operator !== "!=") { - throw new Error(`Invalid ${scope.toUpperCase()}'s operator:「${operator}」`) + throw new Error(`In ${scope.toUpperCase()}: Only supports "=", "!=", and ":" operators`) } }, isComparable: (scope, operator, operand, operandType) => { if (operandType === "REGEXP") { - throw new Error(`Invalid ${scope.toUpperCase()}'s operand type:「${operandType}」`) + throw new Error(`In ${scope.toUpperCase()}: RegExp operands are not valid for comparisons`) } if (operator === ":") { - throw new Error(`Invalid ${scope.toUpperCase()}'s operator:「:」`) + throw new Error(`In ${scope.toUpperCase()}: The ":" operator is not valid for comparisons`) } }, isBoolean: (scope, operator, operand, operandType) => { if (operator !== "=" && operator !== "!=") { - throw new Error(`Invalid ${scope.toUpperCase()}'s operator:「${operator}」`) + throw new Error(`In ${scope.toUpperCase()}: Only supports "=" and "!=" operators`) } if (operandType === "REGEXP") { - throw new Error(`Invalid ${scope.toUpperCase()}'s operand type:「${operandType}」`) + throw new Error(`In ${scope.toUpperCase()}: RegExp operands are not valid for logical comparisons`) } if (operand !== "true" && operand !== "false") { - throw new Error(`Invalid ${scope.toUpperCase()}'s operand:「${operand}」`) + throw new Error(`In ${scope.toUpperCase()}: Operand must be "true" or "false"`) } }, isSize: (scope, operator, operand, operandType) => { this.VALIDATE.isComparable(scope, operator, operand, operandType) const units = [...Object.keys(this.UNITS)].sort((a, b) => b.length - a.length).join("|") - const ok = new RegExp(`^\\d+(\\.\\d+)?${units}$`, "i").test(operand) + const ok = new RegExp(`^\\d+(\\.\\d+)?(${units})$`, "i").test(operand) if (!ok) { - throw new Error(`Invalid ${scope.toUpperCase()}'s operand:「${operand}」`) + throw new Error(`In ${scope.toUpperCase()}: Operand must be a number followed by a unit: ${units}`) } }, isNumber: (scope, operator, operand, operandType) => { this.VALIDATE.isComparable(scope, operator, operand, operandType) if (isNaN(operand)) { - throw new Error(`Invalid ${scope.toUpperCase()}'s operand:「${operand}」`) + throw new Error(`In ${scope.toUpperCase()}: Operand must be a valid number`) } }, isDate: (scope, operator, operand, operandType) => { - this.VALIDATE.isNumber(scope, operator, new Date(operand), operandType) + this.VALIDATE.isComparable(scope, operator, operand, operandType) + if (isNaN(new Date(operand).getTime())) { + throw new Error(`In ${scope.toUpperCase()}: Operand must be a valid date string`) + } }, } static CAST = { toStringOrRegexp: (operand, operandType) => operandType === "REGEXP" ? new RegExp(operand) : operand.toString(), toNumber: operand => Number(operand), - toBoolean: operand => operand === "true", + toBoolean: operand => operand.toLowerCase() === "true", toBytes: operand => { + const units = [...Object.keys(this.UNITS)].sort((a, b) => b.length - a.length).join("|") const match = operand.match(/^(\d+(\.\d+)?)([a-z]+)$/i) if (!match) { - throw new Error(`Invalid SIZE's operand:「${operand}」`) + throw new Error(`Operand must be a number followed by a unit: ${units}`) } const unit = match[3].toLowerCase() if (!this.UNITS.hasOwnProperty(unit)) { - throw new Error(`Unsupported SIZE's unit:「${unit}」`) + throw new Error(`Only supports unit: ${units}`) } return parseFloat(match[1]) * this.UNITS[unit] }, @@ -325,7 +336,7 @@ class QualifierMixin { static MATCH = { primitiveCompare: (scope, operator, operand, queryResult) => this.OPERATOR[operator](queryResult, operand), stringRegexp: (scope, operator, operand, queryResult) => operand.test(queryResult.toString()), - arrayCompare: (scope, operator, operand, queryResult) => queryResult.reduce((ret, data) => ret || this.OPERATOR[operator](data, operand), false), + arrayCompare: (scope, operator, operand, queryResult) => queryResult.some(data => this.OPERATOR[operator](data, operand)), arrayRegexp: (scope, operator, operand, queryResult) => operand.test(queryResult.join(" ")), } } @@ -514,7 +525,8 @@ class SearchHelper { } const getQuery = (parser, nodePicker, contentGetter) => { return source => { - const ast = parser(source.buffer.toString()) + const content = source.buffer.toString() + const ast = parser(content) const nodes = rangeAST(ast, nodePicker) return nodes.map(contentGetter) } @@ -535,9 +547,9 @@ class SearchHelper { { scope: "image", name: "图片", query: getQuery(PARSER.INLINE, NODE_PICKER.IS("image"), CNT_GETTER.LINK_AND_IMAGE) }, { scope: "code", name: "代码", query: getQuery(PARSER.INLINE, NODE_PICKER.IS("code_inline"), CNT_GETTER.DEFAULT) }, { scope: "link", name: "链接", query: getQuery(PARSER.INLINE, NODE_PICKER.SURROUND("link"), CNT_GETTER.LINK_AND_IMAGE) }, - { scope: "strong", name: "强调", query: getQuery(PARSER.INLINE, NODE_PICKER.SURROUND("strong"), CNT_GETTER.DEFAULT) }, - { scope: "em", name: "斜体", query: getQuery(PARSER.INLINE, NODE_PICKER.SURROUND("em"), CNT_GETTER.DEFAULT) }, - { scope: "del", name: "删除线", query: getQuery(PARSER.INLINE, NODE_PICKER.SURROUND("s"), CNT_GETTER.DEFAULT) }, + { scope: "strong", name: "加粗文字", query: getQuery(PARSER.INLINE, NODE_PICKER.SURROUND("strong"), CNT_GETTER.DEFAULT) }, + { scope: "em", name: "斜体文字", query: getQuery(PARSER.INLINE, NODE_PICKER.SURROUND("em"), CNT_GETTER.DEFAULT) }, + { scope: "del", name: "删除线文字", query: getQuery(PARSER.INLINE, NODE_PICKER.SURROUND("s"), CNT_GETTER.DEFAULT) }, ] qualifiers.forEach(q => { q.is_meta = false @@ -734,8 +746,9 @@ class SearchHelper { const operator = Array.from(Object.keys(this.MIXIN.OPERATOR)) const genInfo = title => `` + const wordsInfo = genInfo(`小知识:\n将关键字改成正则并且前后加\\b即可改成全字匹配。\n例如:/\\bsour\\b/将不会匹配resource`) const scopeInfo = genInfo('具体来说,应该是:文件路径或文件内容包含 pear') - const diffInfo = genInfo('注意区分:\n「head=简介」:表示标题为简介二字,当标题为”简介1“时不可匹配\n「head:简介」:表示标题包含简介二字,当标题为”简介1“时可以匹配') + const diffInfo = genInfo('注意区分:\n「head=plugin」:表示标题为plugin,当标题为”typora plugin“时不可匹配\n「head:plugin」:表示标题包含plugin,当标题为”typora plugin“时可以匹配') const table1 = ` @@ -743,7 +756,7 @@ class SearchHelper { - + @@ -757,8 +770,8 @@ class SearchHelper { - - + + From b87fe6a505f0e5fe5e1733dc4e08f69e49a059dd Mon Sep 17 00:00:00 2001 From: obgnail Date: Wed, 27 Nov 2024 17:28:53 +0800 Subject: [PATCH 2/3] fix #877 --- plugin/md_padding/md-padding.min.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin/md_padding/md-padding.min.js b/plugin/md_padding/md-padding.min.js index 9d29075e..67b58215 100644 --- a/plugin/md_padding/md-padding.min.js +++ b/plugin/md_padding/md-padding.min.js @@ -1,7 +1,7 @@ var c=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var T=c(p=>{"use strict";Object.defineProperty(p,"__esModule",{value:!0});p.isStartCharacter=p.isEndCharacter=p.isWordBoundary=p.isAlphabet=p.isInlineBlank=p.isBlank=p.isFullwidthPunctuation=p.isCJK=p.isNumeric=p.isPunctuationCharacter=p.markdownSpecial=void 0;var Ai=/^[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,\-./:;<=>?@[\]^_`{|}~]$/,Ni=/^[、,:。?!;:【】()「」﹁﹂『』《》〈〉“”‘’﹏…—~‧·]$/;p.markdownSpecial=new Set(["*","-","[","]","(",")","<",">",'"',"'","!","=","$"]);function Ot(e){return typeof e!="string"?!1:!!(Ai.exec(e)||Rt(e))}p.isPunctuationCharacter=Ot;function $i(e){return e>="0"&&e<="9"}p.isNumeric=$i;function Ei(e){return e>="\u4E00"&&e<="\u9FFF"||e>="\u3400"&&e<="\u4DBF"||e>="\uF900"&&e<="\uFAFF"}p.isCJK=Ei;function Rt(e){return!!Ni.exec(e)}p.isFullwidthPunctuation=Rt;function Lt(e){return!!/^\s$/.exec(e)}p.isBlank=Lt;function Fi(e){return e===" "||e===" "}p.isInlineBlank=Fi;function Qi(e){return e>="a"&&e<="z"||e>="A"&&e<="Z"}p.isAlphabet=Qi;function Hi(e){return e===void 0||Lt(e)||Ot(e)}p.isWordBoundary=Hi;function Ji(e){return',;:"!'.includes(e)}p.isEndCharacter=Ji;function Ki(e){return'"'.includes(e)}p.isStartCharacter=Ki});var K=c(g=>{"use strict";Object.defineProperty(g,"__esModule",{value:!0});g.isBlockCode=g.isReferenceLink=g.isInlineCode=g.isMath=g.isLatin=g.isUnicodeString=g.isRaw=g.isBlank=g.isQuoted=g.isPunctuation=g.isCJK=g.isAlphabetNumeric=g.isDocument=void 0;function zi(e){return e.kind===32}g.isDocument=zi;function Dt(e){return e.kind===4}g.isAlphabetNumeric=Dt;function Wi(e){return e.kind===33554432}g.isCJK=Wi;function Vi(e){return e.kind===2}g.isPunctuation=Vi;function Gi(e){return e.kind===2048}g.isQuoted=Gi;function Zi(e){return e.kind===1}g.isBlank=Zi;function Xi(e){return e.kind===1048576}g.isRaw=Xi;function Tt(e){return e.kind===8}g.isUnicodeString=Tt;function Yi(e){return Tt(e)||Dt(e)}g.isLatin=Yi;function er(e){return e.kind===2097152}g.isMath=er;function tr(e){return e.kind===65536}g.isInlineCode=tr;function ir(e){return e.kind===128}g.isReferenceLink=ir;function rr(e){return e.kind===16}g.isBlockCode=rr});var Ut=c(Z=>{"use strict";Object.defineProperty(Z,"__esModule",{value:!0});Z.InlineImage=void 0;var Fe=class{constructor(t,r,a){this.children=t,this.target=r,this.attributes=a,this.kind=262144}text(){return this.children.map(t=>t.toMarkdown()).join("")}toMarkdown(){let t=this.attributes===void 0?"":`{${this.attributes}}`;return`![${this.text()}](${this.target})${t}`}};Z.InlineImage=Fe});var At=c(X=>{"use strict";Object.defineProperty(X,"__esModule",{value:!0});X.ReferenceImage=void 0;var Qe=class{constructor(t,r,a){this.children=t,this.target=r,this.attributes=a,this.kind=524288}text(){return this.children.map(t=>t.toMarkdown()).join("")}toMarkdown(){let t=this.attributes===void 0?"":`{${this.attributes}}`;return`![${this.text()}][${this.target}]${t}`}};X.ReferenceImage=Qe});var He=c(ee=>{"use strict";Object.defineProperty(ee,"__esModule",{value:!0});ee.AlphabetNumeric=void 0;var Nt=T(),Y=class e{constructor(t){this.children=[],this.kind=4,this.text=t}toMarkdown(){return this.text}static is(t){return typeof t!="string"?!1:(0,Nt.isAlphabet)(t)||(0,Nt.isNumeric)(t)}static create(t){return t.length>1?new e(t):(e.cache.has(t)||e.cache.set(t,new e(t)),e.cache.get(t))}};ee.AlphabetNumeric=Y;Y.cache=new Map});var Ke=c(te=>{"use strict";Object.defineProperty(te,"__esModule",{value:!0});te.UnicodeString=void 0;var Je=class{constructor(t){this.children=[],this.kind=8,this.text=t}toMarkdown(){return this.text}static is(t){if(typeof t!="string")return!1;for(let r=0;r{"use strict";Object.defineProperty(ie,"__esModule",{value:!0});ie.Delimited=void 0;var ze=class{constructor(t,r){this.children=[],this.prefix=t,this.postfix=r}text(){return this.children.map(t=>t.toMarkdown()).join("")}toMarkdown(){return this.prefix+this.text()+this.postfix}};ie.Delimited=ze});var $t=c(re=>{"use strict";Object.defineProperty(re,"__esModule",{value:!0});re.SquareQuoted=void 0;var nr=A(),We=class extends nr.Delimited{constructor(t){super("[","]"),this.kind=4096,this.children=t}};re.SquareQuoted=We});var Et=c(ne=>{"use strict";Object.defineProperty(ne,"__esModule",{value:!0});ne.Emphasis=void 0;var sr=A(),Ve=class extends sr.Delimited{constructor(t,r="*"){super(r,r),this.children=[],this.kind=32768,this.children=t,this.separator=r}};ne.Emphasis=Ve});var Ft=c(se=>{"use strict";Object.defineProperty(se,"__esModule",{value:!0});se.Quoted=void 0;var or=A(),Ge=class extends or.Delimited{constructor(t){super('"','"'),this.kind=2048,this.children=t}};se.Quoted=Ge});var Qt=c(oe=>{"use strict";Object.defineProperty(oe,"__esModule",{value:!0});oe.Strong=void 0;var ur=A(),Ze=class extends ur.Delimited{constructor(t,r){super(r,r),this.children=[],this.kind=16384,this.children=t,this.separator=r}};oe.Strong=Ze});var Ht=c(ue=>{"use strict";Object.defineProperty(ue,"__esModule",{value:!0});ue.Highlight=void 0;var cr=A(),Xe=class extends cr.Delimited{constructor(t){super("==","=="),this.children=[],this.kind=16777216,this.children=t}};ue.Highlight=Xe});var Jt=c(ce=>{"use strict";Object.defineProperty(ce,"__esModule",{value:!0});ce.Strikethrough=void 0;var ar=A(),Ye=class extends ar.Delimited{constructor(t){super("~~","~~"),this.children=[],this.kind=8192,this.children=t}};ce.Strikethrough=Ye});var Kt=c(ae=>{"use strict";Object.defineProperty(ae,"__esModule",{value:!0});ae.Document=void 0;var et=class{constructor(t){this.kind=32,this.isDoc=!0,this.children=t}toMarkdown(){return this.children.map(t=>t.toMarkdown()).join("")}};ae.Document=et});var Wt=c(le=>{"use strict";Object.defineProperty(le,"__esModule",{value:!0});le.preOrder=void 0;function zt(e,t){t(e);for(let r of e.children)zt(r,t)}le.preOrder=zt});var tt=c(he=>{"use strict";Object.defineProperty(he,"__esModule",{value:!0});he.CJK=void 0;var lr=T(),de=class e{constructor(t){this.children=[],this.kind=33554432,this.text=t}toMarkdown(){return this.text}static is(t){return typeof t!="string"?!1:(0,lr.isCJK)(t)}static create(t){return t.length>1?new e(t):(e.cache.has(t)||e.cache.set(t,new e(t)),e.cache.get(t))}};he.CJK=de;de.cache=new Map});var Gt=c($=>{"use strict";Object.defineProperty($,"__esModule",{value:!0});$.compactArray=$.compactTree=void 0;var dr=Ke(),hr=He(),N=K(),fr=Wt(),gr=tt();function pr(e){return(0,fr.preOrder)(e,t=>Vt(t.children)),e}$.compactTree=pr;function Vt(e){let t=0;for(let r=0;r=0){let i=e[t-1];if((0,N.isUnicodeString)(a)&&(0,N.isUnicodeString)(i)){e[t-1]=new dr.UnicodeString(i.text+a.text);continue}if((0,N.isAlphabetNumeric)(a)&&(0,N.isAlphabetNumeric)(i)){e[t-1]=hr.AlphabetNumeric.create(i.text+a.text);continue}if((0,N.isCJK)(a)&&(0,N.isCJK)(i)){e[t-1]=gr.CJK.create(i.text+a.text);continue}}e[t++]=a}for(;e.length>t;)e.pop()}$.compactArray=Vt});var Zt=c(fe=>{"use strict";Object.defineProperty(fe,"__esModule",{value:!0});fe.HTMLTag=void 0;var it=class{constructor(t){this.children=[],this.kind=64,this.text=t}toMarkdown(){return`<${this.text}>`}};fe.HTMLTag=it});var Xt=c(pe=>{"use strict";Object.defineProperty(pe,"__esModule",{value:!0});pe.Punctuation=void 0;var x=T(),E=K(),ge=class e{constructor(t,r){this.children=[],this.kind=2,this.char=t,this.raw=r!=null?r:t}needPaddingAfter(t,r){return this.isFullSize()||(0,E.isPunctuation)(t)||(0,E.isAlphabetNumeric)(t)&&(0,x.isNumeric)(t.text[0])&&",.".includes(this.char)||this.char===":"&&(0,E.isAlphabetNumeric)(t)&&(0,x.isNumeric)(t.text[0])&&r&&(0,E.isAlphabetNumeric)(r)&&(0,x.isNumeric)(r.text[r.text.length-1])?!1:(0,x.isEndCharacter)(this.char)?!0:(0,x.isStartCharacter)(this.char)?!1:!!"<>=".includes(this.char)}needPaddingBefore(t,r){return this.isFullSize()||(0,E.isPunctuation)(t)||(0,E.isAlphabetNumeric)(t)&&(0,x.isNumeric)(t.text.slice(-1))&&",.".includes(this.char)?!1:(0,x.isStartCharacter)(this.char)?!0:(0,x.isEndCharacter)(this.char)?!1:!!"<>=".includes(this.char)}isFullSize(){return(0,x.isFullwidthPunctuation)(this.char)}toMarkdown(){return this.raw}static create(t,r=t){return e.cache.has(r)||e.cache.set(r,new e(t,r)),e.cache.get(r)}static is(t){return(0,x.isPunctuationCharacter)(t)}};pe.Punctuation=ge;ge.cache=new Map});var Yt=c(me=>{"use strict";Object.defineProperty(me,"__esModule",{value:!0});me.ReferenceLink=void 0;var rt=class{constructor(t,r){this.children=[],this.kind=128,this.children=t,this.target=r}text(){return this.children.map(t=>t.toMarkdown()).join("")}toMarkdown(){return`[${this.text()}][${this.target}]`}};me.ReferenceLink=rt});var ei=c(ke=>{"use strict";Object.defineProperty(ke,"__esModule",{value:!0});ke.ReferenceDefinition=void 0;var nt=class{constructor(t,r){this.children=[],this.kind=256,this.children=t,this.target=r}text(){return this.children.map(t=>t.toMarkdown()).join("")}toMarkdown(){return`[${this.text()}]:${this.target}`}};ke.ReferenceDefinition=nt});var ti=c(_e=>{"use strict";Object.defineProperty(_e,"__esModule",{value:!0});_e.InlineLink=void 0;var st=class{constructor(t,r){this.children=[],this.kind=512,this.children=t,this.target=r}text(){return this.children.map(t=>t.toMarkdown()).join("")}toMarkdown(){return`[${this.text()}](${this.target})`}};_e.InlineLink=st});var ii=c(we=>{"use strict";Object.defineProperty(we,"__esModule",{value:!0});we.InlineCode=void 0;var ot=class{constructor(t,r){this.children=[],this.kind=65536,this.delimiter=r,this.code=t}toMarkdown(){return this.delimiter+this.code+this.delimiter}};we.InlineCode=ot});var ri=c(be=>{"use strict";Object.defineProperty(be,"__esModule",{value:!0});be.Math=void 0;var ut=class{constructor(t,r){this.children=[],this.kind=2097152,this.delimiter=r,this.code=t}toMarkdown(){return this.delimiter+this.code+this.delimiter}};be.Math=ut});var ni=c(Me=>{"use strict";Object.defineProperty(Me,"__esModule",{value:!0});Me.BlockCode=void 0;var ct=class{constructor(t,r,a,i=!0,k=!0){this.children=[],this.kind=16,this.delimiter=r,this.lang=t,this.children=a,this.closed=i,this.langClosed=k}getCode(){return this.children.map(t=>t.toMarkdown()).join("")}toMarkdown(){return this.delimiter+this.lang+(this.langClosed?` `:"")+this.getCode()+(this.closed?this.delimiter:"")}};Me.BlockCode=ct});var lt=c(Se=>{"use strict";Object.defineProperty(Se,"__esModule",{value:!0});Se.Blank=void 0;var mr=T(),at=class{constructor(t){this.children=[],this.kind=1,this.char=t}toMarkdown(){return this.char}static is(t){return typeof t!="string"?!1:(0,mr.isBlank)(t)}};Se.Blank=at});var ht=c(Ie=>{"use strict";Object.defineProperty(Ie,"__esModule",{value:!0});Ie.Raw=void 0;var dt=class{constructor(t){this.children=[],this.kind=1048576,this.content=t}toMarkdown(){return this.content}};Ie.Raw=dt});var oi=c(Pe=>{"use strict";Object.defineProperty(Pe,"__esModule",{value:!0});Pe.OrderedListItem=void 0;var si=T(),ft=class{constructor(t,r){this.children=[],this.kind=1024,this.prefix=t,this.children=r}toMarkdown(){return this.prefix+this.children.map(t=>t.toMarkdown()).join("")}static isValidPrefix(t){return(0,si.isNumeric)(t[0])&&t[1]==="."&&(0,si.isInlineBlank)(t[2])}};Pe.OrderedListItem=ft});var ui=c(ve=>{"use strict";Object.defineProperty(ve,"__esModule",{value:!0});ve.UnorderedListItem=void 0;var kr=T(),gt=class{constructor(t,r){this.children=[],this.kind=131072,this.prefix=t,this.children=r}toMarkdown(){return this.prefix+this.children.map(t=>t.toMarkdown()).join("")}static isValidPrefix(t){return"-+*".includes(t[0])&&(0,kr.isInlineBlank)(t[1])}};ve.UnorderedListItem=gt});var ci=c(ye=>{"use strict";Object.defineProperty(ye,"__esModule",{value:!0});ye.Callout=void 0;var pt=class{constructor(t){this.children=[],this.kind=8388608,this.text=t}toMarkdown(){return`[!${this.text}]`}};ye.Callout=pt});var ai=c(qe=>{"use strict";Object.defineProperty(qe,"__esModule",{value:!0});qe.BlockquoteItem=void 0;var mt=class{constructor(t,r){this.children=[],this.kind=4194304,this.prefix=t,this.children=r}toMarkdown(){return this.prefix+this.children.map(t=>t.toMarkdown()).join("")}static isValidPrefix(t){return t[0]===">"}};qe.BlockquoteItem=mt});var kt=c(z=>{"use strict";Object.defineProperty(z,"__esModule",{value:!0});z.State=void 0;var _r;(function(e){e[e.LinkText=0]="LinkText",e[e.ReferingUrl=1]="ReferingUrl",e[e.ReferingID=2]="ReferingID",e[e.ReferenceLinkUrl=3]="ReferenceLinkUrl",e[e.ImageText=4]="ImageText",e[e.ImageReferingUrl=5]="ImageReferingUrl",e[e.ImageReferingID=6]="ImageReferingID",e[e.ImageAttributes=7]="ImageAttributes",e[e.HTMLTag=8]="HTMLTag",e[e.Emphasis=9]="Emphasis",e[e.Strong=10]="Strong",e[e.Strikethrough=11]="Strikethrough",e[e.InlineCode=12]="InlineCode",e[e.BlockCodeLang=13]="BlockCodeLang",e[e.Math=14]="Math",e[e.BlockCodeBody=15]="BlockCodeBody",e[e.OrderedListItem=16]="OrderedListItem",e[e.UnorderedListItem=17]="UnorderedListItem",e[e.BlockquoteItem=18]="BlockquoteItem",e[e.CalloutItem=19]="CalloutItem",e[e.Highlight=20]="Highlight",e[e.Quoted=21]="Quoted",e[e.Init=22]="Init"})(_r=z.State||(z.State={}))});var li=c(xe=>{"use strict";Object.defineProperty(xe,"__esModule",{value:!0});xe.Stack=void 0;var _t=class{constructor(){this.data=[]}pop(){return this.data.pop()}top(){return this.data[this.size()-1]}[Symbol.iterator](){return this.data[Symbol.iterator]()}size(){return this.data.length}push(t){this.data.push(t)}};xe.Stack=_t});var di=c(Ce=>{"use strict";Object.defineProperty(Ce,"__esModule",{value:!0});Ce.Mask=void 0;var wt=class{constructor(){this.mask=0,this.counts=Array(32).fill(0)}add(t){for(let r=0,a=1;r<32;r++,a<<=1)t&a&&(this.counts[r]++,this.mask|=a)}remove(t){for(let r=0,a=1;r<32;r++,a<<=1)t&a&&(this.counts[r]--,this.counts[r]===0&&(this.mask&=~a))}};Ce.Mask=wt});var hi=c(Be=>{"use strict";Object.defineProperty(Be,"__esModule",{value:!0});Be.stateMasks=void 0;var b=kt();Be.stateMasks={[b.State.InlineCode]:-33554448,[b.State.Math]:-33554448,[b.State.BlockCodeBody]:-33554448,[b.State.Emphasis]:-53312208,[b.State.Strong]:-53328592,[b.State.Strikethrough]:-53336784,[b.State.LinkText]:-53344336,[b.State.ReferingUrl]:-33554448,[b.State.ImageText]:-52558544,[b.State.ImageReferingUrl]:-33554448,[b.State.ReferenceLinkUrl]:-33554448,[b.State.HTMLTag]:-33554448,[b.State.ReferingID]:-33554448,[b.State.BlockCodeLang]:-33554448,[b.State.OrderedListItem]:-53344976,[b.State.UnorderedListItem]:-53344976,[b.State.Init]:0}});var bt=c(je=>{"use strict";Object.defineProperty(je,"__esModule",{value:!0});je.matchSubstring=void 0;function wr(e,t,r){return e.substr(t,r.length)===r}je.matchSubstring=wr});var fi=c(Oe=>{"use strict";Object.defineProperty(Oe,"__esModule",{value:!0});Oe.parseCode=void 0;var Q=ht(),Mt=bt(),U=It("//",["/*","*/"],[['"','"']]),St=It("//",["/*","*/"],[['"','"'],["'","'"],["`","`"]]),br=It("--",["/*","*/"],[['"','"']]),Mr={cpp:U,"c++":U,c:U,java:U,javascript:St,js:St,csharp:U,"c#":U,typescript:St,ts:U,go:U,sql:br,bash:F,shell:F,sh:F,python:F,py:F,ruby:F};function Sr(e,t,r,a){let i=Mr[t];return i?[...i(e,r,a)]:[new Q.Raw(e)]}Oe.parseCode=Sr;function It(e,t,r){return function*(i,k,y){let h=0,M=0,C=i.length;for(;hM&&(yield new Q.Raw(i.slice(M,h+e.length))),yield k(i.slice(h+e.length,I),y),M=h=I;continue}let[q,B]=t;if((0,Mt.matchSubstring)(i,h,q)){let S=i.indexOf(B,h+q.length),I=S===-1?C:S;h+q.length>M&&(yield new Q.Raw(i.slice(M,h+q.length))),yield k(i.slice(h+q.length,I),y),M=h=I;continue}for(let[S,I]of r){if(!(0,Mt.matchSubstring)(i,h,S))continue;let j=i.indexOf(I,h+S.length);h=j===-1?C:j}h++}Mi&&(yield new Q.Raw(e.slice(i,a+2))),yield t(e.slice(a+2,M),r),i=a=M}else a++;i{"use strict";Object.defineProperty(De,"__esModule",{value:!0});De.parse=void 0;var Re=T(),Ir=K(),gi=Ut(),pi=At(),mi=He(),Pr=Ke(),H=$t(),ki=Et(),vr=Ft(),yr=Qt(),qr=Ht(),xr=Jt(),_i=Kt(),wi=Gt(),Cr=Zt(),m=Xt(),Br=Yt(),bi=ei(),jr=ti(),Or=ii(),Rr=ri(),Pt=ni(),J=lt(),Le=ht(),vt=oi(),yt=ui(),Mi=ci(),qt=ai(),n=kt(),Lr=li(),Dr=di(),Si=hi(),Ii=fi(),W=bt(),Pi=tt(),xt="",Ct="";function V(e,t){if(t.ignorePatterns.length){let s=t.ignorePatterns[0],u=Object.assign(Object.assign({},t),{ignorePatterns:t.ignorePatterns.slice(1)}),d=[],R=e.matchAll(s),P=0;for(let L of R){for(let Ui of V(e.slice(P,L.index),u).children)d.push(Ui);d.push(new Le.Raw(L[0])),P=L.index+L[0].length}for(let L of V(e.slice(P,e.length),u).children)d.push(L);return(0,wi.compactTree)(new _i.Document(d))}let r=new Lr.Stack,a=new Dr.Mask,i=0,k=!0,y="",h="",M="",C=">",q="**",B="*",S="`",I="```",j="$",O=[],D=[],Ee,G;for(f(n.State.Init);i=i&&(yield new Q.Raw(e.slice(i,a+2))),yield t(e.slice(a+2,M),r),i=a=M}else a++;i{"use strict";Object.defineProperty(De,"__esModule",{value:!0});De.parse=void 0;var Re=T(),Ir=K(),gi=Ut(),pi=At(),mi=He(),Pr=Ke(),H=$t(),ki=Et(),vr=Ft(),yr=Qt(),qr=Ht(),xr=Jt(),_i=Kt(),wi=Gt(),Cr=Zt(),m=Xt(),Br=Yt(),bi=ei(),jr=ti(),Or=ii(),Rr=ri(),Pt=ni(),J=lt(),Le=ht(),vt=oi(),yt=ui(),Mi=ci(),qt=ai(),n=kt(),Lr=li(),Dr=di(),Si=hi(),Ii=fi(),W=bt(),Pi=tt(),xt="",Ct="";function V(e,t){if(t.ignorePatterns.length){let s=t.ignorePatterns[0],u=Object.assign(Object.assign({},t),{ignorePatterns:t.ignorePatterns.slice(1)}),d=[],R=e.matchAll(s),P=0;for(let L of R){for(let Ui of V(e.slice(P,L.index),u).children)d.push(Ui);d.push(new Le.Raw(L[0])),P=L.index+L[0].length}for(let L of V(e.slice(P,e.length),u).children)d.push(L);return(0,wi.compactTree)(new _i.Document(d))}let r=new Lr.Stack,a=new Dr.Mask,i=0,k=!0,y="",h="",M="",C=">",q="**",B="*",S="`",I="```",j="$",O=[],D=[],Ee,G;for(f(n.State.Init);i")o(new Cr.HTMLTag(_())),i++;else if(s===n.State.Emphasis&&u===B&&u==="_"&&(0,Re.isWordBoundary)(e[i+1]))o(new ki.Emphasis(l(),B)),i++;else if(s===n.State.Emphasis&&u===B&&u==="*")o(new ki.Emphasis(l(),B)),i++;else if(s===n.State.Strong&&d===q)o(new yr.Strong(l(),q)),i+=2;else if(s===n.State.Strikethrough&&d==="~~")o(new xr.Strikethrough(l())),i+=2;else if(s===n.State.Highlight&&d==="==")o(new qr.Highlight(l())),i+=2;else if(s===n.State.UnorderedListItem&&u===` From 99205a93bddd25323f0a25ba7d743bf6e2d71ca8 Mon Sep 17 00:00:00 2001 From: obgnail Date: Thu, 28 Nov 2024 17:39:14 +0800 Subject: [PATCH 3/3] add plugin drawIO --- README.md | 87 +++++++------- assets/drawIO.png | Bin 0 -> 43180 bytes plugin/custom/plugins/drawIO/index.js | 113 ++++++++++++++++++ .../global/core/utils/mixin/diagramParser.js | 2 +- .../utils/mixin/thirdPartyDiagramParser.js | 7 +- .../settings/custom_plugin.default.toml | 39 ++++++ 6 files changed, 206 insertions(+), 42 deletions(-) create mode 100644 assets/drawIO.png create mode 100644 plugin/custom/plugins/drawIO/index.js diff --git a/README.md b/README.md index ace9e292..fabbc312 100644 --- a/README.md +++ b/README.md @@ -34,46 +34,47 @@ | 18 | markmap | 提供 markmap 组件支持 | | | 19 | echarts | 提供 echarts 组件支持 | | | 20 | chart | 提供 chartjs 组件支持 | | -| 21 | abc | 提供 abcjs 组件支持 | | -| 22 | calendar | 提供 tui.calendar 组件支持 | | -| 23 | wavedrom | 提供 wavedrom 组件支持 | | -| 24 | marp | 提供 marp 组件支持 | | -| 25 | callouts | 提供 callouts 支持 | | -| 26 | text_stylize | 文字风格化 | | -| 27 | read_only | 只读模式 | | -| 28 | blur | 模糊模式 | | -| 29 | kanban | 看板 | | -| 30 | timeline | 时间线 | | -| 31 | chat | 聊天 | | -| 32 | file_counter | 显示目录下的文件数 | | -| 33 | auto_number | 章节、表格、图片、代码块等自动编号 | | -| 34 | imageReviewer | 图片查看器 | | -| 35 | chineseSymbolAutoPairer | 中文符号自动补全 | | -| 36 | datatables | 表格增强(搜索、过滤、分页、排序等) | × | -| 37 | resize_table | 调整表格行高列宽 | | -| 38 | resize_image | 调整图片显示大小 | | -| 39 | export_enhance | 导出 html 时避免图片丢失 | | -| 40 | markdownLint | markdown 格式规范检测 | | -| 41 | go_top | 一键到文章顶部、底部 | | -| 42 | reopenClosedFiles | 打开上次退出 Typora 时尚未关闭的标签页 | × | -| 43 | truncate_text | 暂时隐藏内容,提高大文件渲染性能 | × | -| 44 | dark | 夜间模式 | | -| 45 | no_image | 无图模式 | | -| 46 | updater | 一键升级插件 | | -| 47 | easy_modify | 编辑工具 | | -| 48 | editor_width_slider | 写作区宽度调整 | | -| 49 | redirectLocalRootUrl | 重定向本地资源根目录 | × | -| 50 | blockSideBySide | 并列显示活动块 | × | -| 51 | scrollBookmarker | 书签管理器 | × | -| 52 | openInTotalCommander | 在 total commander 打开 | × | -| 53 | cipher | 加密文件 | × | -| 54 | ripgrep | 使用 ripgrep 搜索文件 | × | -| 55 | article_uploader | 一键上传博客到支持的所有平台 | × | -| 56 | help | 用户帮助 | | -| 57 | custom | 开放平台,用户自定义插件(高级) | | -| 58 | hotkeys | 快捷键注册中心(高级) | | -| 59 | quickButton | 于右下角添加功能按钮(高级) | | -| 60 | json_rpc | 外部操纵 Typora(高级) | × | +| 21 | drawIO | 提供 drawIO 组件支持 | | +| 22 | abc | 提供 abcjs 组件支持 | | +| 23 | calendar | 提供 tui.calendar 组件支持 | | +| 24 | wavedrom | 提供 wavedrom 组件支持 | | +| 25 | marp | 提供 marp 组件支持 | | +| 26 | callouts | 提供 callouts 支持 | | +| 27 | text_stylize | 文字风格化 | | +| 28 | read_only | 只读模式 | | +| 29 | blur | 模糊模式 | | +| 30 | kanban | 看板 | | +| 31 | timeline | 时间线 | | +| 32 | chat | 聊天 | | +| 33 | file_counter | 显示目录下的文件数 | | +| 34 | auto_number | 章节、表格、图片、代码块等自动编号 | | +| 35 | imageReviewer | 图片查看器 | | +| 36 | chineseSymbolAutoPairer | 中文符号自动补全 | | +| 37 | datatables | 表格增强(搜索、过滤、分页、排序等) | × | +| 38 | resize_table | 调整表格行高列宽 | | +| 39 | resize_image | 调整图片显示大小 | | +| 40 | export_enhance | 导出 html 时避免图片丢失 | | +| 41 | markdownLint | markdown 格式规范检测 | | +| 42 | go_top | 一键到文章顶部、底部 | | +| 43 | reopenClosedFiles | 打开上次退出 Typora 时尚未关闭的标签页 | × | +| 44 | truncate_text | 暂时隐藏内容,提高大文件渲染性能 | × | +| 45 | dark | 夜间模式 | | +| 46 | no_image | 无图模式 | | +| 47 | updater | 一键升级插件 | | +| 48 | easy_modify | 编辑工具 | | +| 49 | editor_width_slider | 写作区宽度调整 | | +| 50 | redirectLocalRootUrl | 重定向本地资源根目录 | × | +| 51 | blockSideBySide | 并列显示活动块 | × | +| 52 | scrollBookmarker | 书签管理器 | × | +| 53 | openInTotalCommander | 在 total commander 打开 | × | +| 54 | cipher | 加密文件 | × | +| 55 | ripgrep | 使用 ripgrep 搜索文件 | × | +| 56 | article_uploader | 一键上传博客到支持的所有平台 | × | +| 57 | help | 用户帮助 | | +| 58 | custom | 开放平台,用户自定义插件(高级) | | +| 59 | hotkeys | 快捷键注册中心(高级) | | +| 60 | quickButton | 于右下角添加功能按钮(高级) | | +| 61 | json_rpc | 外部操纵 Typora(高级) | × | **尊重用户的一切选择**。本项目的任何插件、任何功能皆可永久启用 / 禁用。 @@ -542,6 +543,12 @@ LIST = [ +### drawIO:提供 drawIO 组件支持 + +![drawIO](./assets/drawIO.png) + + + ### abc:提供 abc 组件支持 使用方式:右键菜单 -> 常用插件 -> 二级插件 -> ABC diff --git a/assets/drawIO.png b/assets/drawIO.png new file mode 100644 index 0000000000000000000000000000000000000000..3c68ac7f6708f9c85fbd2835076ff2b0156712b3 GIT binary patch literal 43180 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 literal 0 HcmV?d00001 diff --git a/plugin/custom/plugins/drawIO/index.js b/plugin/custom/plugins/drawIO/index.js new file mode 100644 index 00000000..8218bcbe --- /dev/null +++ b/plugin/custom/plugins/drawIO/index.js @@ -0,0 +1,113 @@ +class drawIOPlugin extends BaseCustomPlugin { + init = () => { + this.hasLoaded = null + this.defaultConfig = this._getDefaultConfig() + } + + callback = anchorNode => this.utils.insertText(anchorNode, this.config.TEMPLATE) + + process = () => { + this.utils.thirdPartyDiagramParser.register({ + lang: this.config.LANGUAGE, + mappingLang: "javascript", + destroyWhenUpdate: false, + interactiveMode: this.config.INTERACTIVE_MODE, + checkSelector: ".plugin-drawio-content", + wrapElement: '
', + css: { + height: this.config.DEFAULT_FENCE_HEIGHT, + "background-color": this.config.DEFAULT_FENCE_BACKGROUND_COLOR, + }, + lazyLoadFunc: this.lazyLoad, + createFunc: this.create, + updateFunc: null, + destroyFunc: null, + beforeExport: null, + extraStyleGetter: null, + versionGetter: this.versionGetter, + }) + } + + create = async ($wrap, content) => { + const graphConfig = this._getConfig(content) + if (!graphConfig.source && !graphConfig.xml) { + throw new Error("缺失必须的配置项: source") + } + await this._getXML(graphConfig) + $wrap[0].innerHTML = await this._toElement(graphConfig) + this._refresh() + } + + _getConfig = content => new Function(`return (${content})`)() + + _getXML = async graphConfig => { + if (graphConfig.xml) return + + let { source } = graphConfig + const isNetwork = this.utils.isNetworkImage(source) + try { + if (isNetwork) { + graphConfig.xml = await this._memorizedFetch(source) + } else { + const dir = this.utils.getCurrentDirPath() + source = this.utils.Package.Path.resolve(dir, source) + graphConfig.xml = await this.utils.Package.Fs.promises.readFile(source, "utf-8") + } + } catch (e) { + const from = isNetwork ? "网络" : "本地" + throw new Error(`读取${from}文件失败: ${source}\n\n${e}`) + } + } + + _toElement = graphConfig => { + const mxGraphData = { ...this.defaultConfig, ...graphConfig } + const jsonString = JSON.stringify(mxGraphData) + const escaped = this.utils.escape(jsonString) + return `
` + } + + _refresh = this.utils.debounce(() => window.GraphViewer.processElements(), 100) + + _memorizedFetch = this.utils.memorize(async url => { + console.log(`memorized fetch url: ${url}`) + const resp = await this.utils.fetch(url, { timeout: 60 * 1000 }) + return resp.text() + }) + + _getDefaultConfig = (type = "showOnly") => { + const config = { + showOnly: { highlight: "#0000ff", nav: false, resize: false, edit: null, editable: true, lightbox: false, zoom: "1", toolbar: null, "toolbar-nohide": true, }, + editable: { highlight: "#0000ff", nav: false, resize: true, edit: null, editable: false, toolbar: null, "toolbar-nohide": true, }, + showToolbar: { + highlight: "#0000ff", + nav: true, + resize: true, + edit: null, + editable: true, + lightbox: false, + zoom: "1", + toolbar: "zoom lightbox layers", + "toolbar-position": "inline", + "toolbar-nohide": true, + }, + } + return config[type] + } + + lazyLoad = async () => { + if (!this.hasLoaded) { + const from = this.config.RESOURCE_URI + const path = this.utils.isNetworkImage(from) ? from : `file:///${this.utils.Package.Path.resolve(from)}` + await $.getScript(path) + this.hasLoaded = true + + window.GraphViewer.prototype.toolbarZIndex = 7 + } + } + + versionGetter = () => "24.8.9" +} + +module.exports = { + plugin: drawIOPlugin, +} \ No newline at end of file diff --git a/plugin/global/core/utils/mixin/diagramParser.js b/plugin/global/core/utils/mixin/diagramParser.js index abd4aa1b..92c33756 100644 --- a/plugin/global/core/utils/mixin/diagramParser.js +++ b/plugin/global/core/utils/mixin/diagramParser.js @@ -119,7 +119,7 @@ class diagramParser { $pre.children(".md-diagram-panel").remove(); } else { $pre.find(".md-diagram-panel-header").text(lang); - $pre.find(".md-diagram-panel-preview").text("语法错误,绘图失败"); + $pre.find(".md-diagram-panel-preview").text("发生异常,绘图失败"); $pre.find(".md-diagram-panel-error").html(`
${this.getErrorMessage(error)}
`); } await this.noticeRollback(cid); diff --git a/plugin/global/core/utils/mixin/thirdPartyDiagramParser.js b/plugin/global/core/utils/mixin/thirdPartyDiagramParser.js index 8da3e77d..949bf558 100644 --- a/plugin/global/core/utils/mixin/thirdPartyDiagramParser.js +++ b/plugin/global/core/utils/mixin/thirdPartyDiagramParser.js @@ -59,7 +59,12 @@ class thirdPartyDiagramParser { const $wrap = this.getWrap(parser, $pre); try { this.setStyle(parser, $pre, $wrap, content); - const instance = this.createOrUpdate(parser, cid, content, $wrap, lang); + let instance = this.createOrUpdate(parser, cid, content, $wrap, lang); + // 为什么不使用await this.createOrUpdate,而是判断isPromise? + // 答:有些parser的createFunc可能会抢占element,如果使用await会出现race问题 + if (this.utils.isPromise(instance)) { + instance = await instance + } instance && parser.instanceMap.set(cid, instance); } catch (e) { e.stack += this.getSettingMsg(parser); diff --git a/plugin/global/settings/custom_plugin.default.toml b/plugin/global/settings/custom_plugin.default.toml index 549ccfe6..3a03ffa4 100644 --- a/plugin/global/settings/custom_plugin.default.toml +++ b/plugin/global/settings/custom_plugin.default.toml @@ -414,6 +414,45 @@ G2 G2|A2 A2|B2 B2|c3 z|G2 G2|A2 A2|B2 G2|c3 z|| ``` """ +############### drawIO ############### +[drawIO] +# 是否启用此二级插件 +enable = true +# 插件名称 +name = "drawIO" +# 是否在右键菜单中隐藏 +hide = false +# 在右键菜单中的出现顺序(越大越排到后面,允许负数) +order = 1 +# 依赖资源从何处加载 +# 由于drawio的格式经常发生变动,官网强烈建议使用cdn获取依赖资源,而不是将依赖资源保存在本地。所以此插件默认需要从网络拉取依赖。如果你希望将依赖资源保存在本地,请按如下操作 +# 1. 下载文件:https://viewer.diagrams.net/js/viewer-static.min.js +# 2. RESOURCE_URI修改为你自己的文件地址(比如:D:\\tmp\\viewer-static.min.js) +RESOURCE_URI = "https://viewer.diagrams.net/js/viewer-static.min.js" +# 代码块语言 +# 强烈建议不要修改。如果要修改,请跟着修改TEMPLATE选项里的语言 +LANGUAGE = "drawio" +# 开启交互模式(处于交互模式下,鼠标点击图表并不会展开代码块) +INTERACTIVE_MODE = true +# 图表默认高度 +DEFAULT_FENCE_HEIGHT = "auto" +# 图表背景颜色 +DEFAULT_FENCE_BACKGROUND_COLOR = "transparent" +# 自动插入的模板 +TEMPLATE = """```drawio +// 支持配置项:allow-zoom-in、allow-zoom-out、auto-crop、auto-fit、auto-origin、border、center、check-visible-state、dark-mode、edit、editable、forceCenter、highlight、layerIds、layers、lightbox、max-height、move、nav、page、pageId、resize、responsive、source、target、title、titleTooltip、toolbar、toolbar-buttons、toolbar-nohide、toolbar-position、tooltips、xml、zoom +// 配置项使用方法请参考:https://github.com/jgraph/drawio/blob/f7158bfb0029a6456c215791b7fd005ccb5c3e76/src/main/webapp/js/diagramly/GraphViewer.js#L118C1-L118C71 + +graphConfig = { + // 必须配置项:.drawio文件的路径。 + // 支持本地路径:例如:"./assets/example.drawio"或者"D:\\tmp\\example.drawio" + // 支持网络路径:例如:"https://cdn.jsdelivr.net/gh/obgnail/typora_images@master/image/example.drawio" + "source": "./assets/example.drawio", + // 如果存在多页,可以使用page切换 + "page": 0, +} +``` +""" ############### callouts ############### [callouts]
关键字说明
|表示或。文档应该包含关键词之一,等价于 OR
-表示非。文档不能包含关键词
""表示词组。双引号里的空格不再视为与,而是词组的一部分
/RegExp/JavaScript 风格的正则表达式
/RegExp/JavaScript 风格的正则表达式 ${wordsInfo}
qualifier查询属性。
1. 文件属性(${metaScope.length}):${metaScope.join(" | ")}
2. 内容属性(${contentScope.length}):${contentScope.join(" | ")}
3. 默认值 default = path + content(路径+文件内容)
operator操作符。
1. 「:」表示文本包含或正则匹配(默认)
2. 「=」「!=」表示文本、数值、布尔的严格相等/不相等
3. 「>」「<」「>=」「<=」表示数值比较
()小括号。用于调整运算顺序
sour OR pear包含 sour 或 pear
"sour pear"包含 sour pear 这一词组
sour pear -apple包含 sour 和 pear,且不含 apple
apple time=2024-03-12包含 apple,且文件更新时间为 2024-03-12
frontmatter:日记 | head=简介 | strong:abcYAML Front Matter 包含日记 或者 标题内容为简介二字 或者 加粗文字包含 abc ${diffInfo}
/\\bsour\\b/ pear time=2024-03-12匹配正则\\bsour\\b(全字匹配sour),且包含 pear,且文件更新时间为 2024-03-12
frontmatter:开发 | head=plugin | strong:MITYAML Front Matter 包含开发 或者 标题内容为 plugin 或者 加粗文字包含 MIT ${diffInfo}
size>10k (file=k8s.md | hasimage=true)文件大小大于 10k,且 文件名为 k8s.md 或者文件内容包含图片
path:(info | warn | err) -ext:md文件路径包含 info 或 warn 或 err,且扩展名不含 md
file:/[a-z]{3}/ content:prometheus blockcode:"kubectl apply"文件名匹配正则 [a-z]{3},且内容包含 prometheus,且代码块内容含有 kubectl apply