vault backup: 2025-08-19 18:39:03

This commit is contained in:
CrazyJasonwell committed 2025-08-19 18:39:03 +08:00
1 parent 96996c4beb
commit 976312d988
26 files changed
+1257 -36

No files matched your search

+2 -1
View File
@@ -53,5 +53,6 @@
"note-to-red",
"note-to-mp",
"rss-reader",
"editing-toolbar"
"editing-toolbar",
"obsidian-banners"
]
+3 -1
View File
@@ -27,5 +27,7 @@
"file-recovery": true,
"publish": true,
"sync": false,
"webviewer": true
"webviewer": true,
"footnotes": false,
"bases": true
}
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+1 -1
View File
@@ -34,7 +34,7 @@
"contentTemplate": "# {{{title}}}\n\n{{{description}}}\n\n{{{article_title}}} //文章内容标题\n{{{content}}} //文章正文\n\n\n[Read in Cubox]({{{cubox_url}}}) \n[Read Original]({{{url}}}) \n\n---\n\n{{#highlights.length}}\n## Annotations \n\n{{#highlights}}\n> {{{text}}} \n\n{{#note}}\n{{{note}}}\n{{/note}}\n[Link️]({{{cubox_url}}}) \n\n{{/highlights}}\n{{/highlights.length}}",
"highlightInContent": true,
"dateFormat": "yyyy-MM-dd",
"lastSyncTime": 1755596527612,
"lastSyncTime": 1755598327618,
"lastSyncCardId": "7356878557827565577",
"lastCardUpdateTime": "2025-08-18T06:01:59.474+0800",
"syncing": false
+31
View File
@@ -0,0 +1,31 @@
/*
- THIS IS A GENERATED/BUNDLED FILE BY ESBUILD -
Please visit the repository linked to view the source code:
https://github.com/noatpad/obsidian-banners
*/
var Zn=Object.create;var Ie=Object.defineProperty;var ei=Object.getOwnPropertyDescriptor;var ui=Object.getOwnPropertyNames;var ti=Object.getPrototypeOf,ri=Object.prototype.hasOwnProperty;var Pu=t=>Ie(t,"__esModule",{value:!0});var o=(t,u)=>()=>(u||t((u={exports:{}}).exports,u),u.exports),ai=(t,u)=>{Pu(t);for(var r in u)Ie(t,r,{get:u[r],enumerable:!0})},ni=(t,u,r)=>{if(u&&typeof u=="object"||typeof u=="function")for(let a of ui(u))!ri.call(t,a)&&a!=="default"&&Ie(t,a,{get:()=>u[a],enumerable:!(r=ei(u,a))||r.enumerable});return t},S=t=>ni(Pu(Ie(t!=null?Zn(ti(t)):{},"default",t&&t.__esModule&&"default"in t?{get:()=>t.default,enumerable:!0}:{value:t,enumerable:!0})),t);var Pe=o((ge,ru)=>{"use strict";Object.defineProperty(ge,"__esModule",{value:!0});ge.default=ii;function Me(t){return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?Me=function(r){return typeof r}:Me=function(r){return r&&typeof Symbol=="function"&&r.constructor===Symbol&&r!==Symbol.prototype?"symbol":typeof r},Me(t)}function ii(t){var u=typeof t=="string"||t instanceof String;if(!u){var r=Me(t);throw t===null?r="null":r==="object"&&(r=t.constructor.name),new TypeError("Expected a string but received a ".concat(r))}}ru.exports=ge.default;ru.exports.default=ge.default});var nu=o((pe,au)=>{"use strict";Object.defineProperty(pe,"__esModule",{value:!0});pe.default=di;function di(){var t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},u=arguments.length>1?arguments[1]:void 0;for(var r in u)typeof t[r]=="undefined"&&(t[r]=u[r]);return t}au.exports=pe.default;au.exports.default=pe.default});var Lu=o((_e,iu)=>{"use strict";Object.defineProperty(_e,"__esModule",{value:!0});_e.default=li;var oi=qu(Pe()),si=qu(nu());function qu(t){return t&&t.__esModule?t:{default:t}}var Di={require_tld:!0,allow_underscores:!1,allow_trailing_dot:!1,allow_numeric_tld:!1};function li(t,u){(0,oi.default)(t),u=(0,si.default)(u,Di),u.allow_trailing_dot&&t[t.length-1]==="."&&(t=t.substring(0,t.length-1));var r=t.split("."),a=r[r.length-1];return u.require_tld&&(r.length<2||!/^([a-z\u00a1-\uffff]{2,}|xn[a-z0-9-]{2,})$/i.test(a)||/[\s\u2002-\u200B\u202F\u205F\u3000\uFEFF\uDB40\uDC20\u00A9\uFFFD]/.test(a))||!u.allow_numeric_tld&&/^\d+$/.test(a)?!1:r.every(function(n){return!(n.length>63||!/^[a-z_\u00a1-\uffff0-9-]+$/i.test(n)||/[\uff01-\uff5e]/.test(n)||/^-|-$/.test(n)||!u.allow_underscores&&/_/.test(n))})}iu.exports=_e.default;iu.exports.default=_e.default});var ju=o((he,ou)=>{"use strict";Object.defineProperty(he,"__esModule",{value:!0});he.default=du;var ci=fi(Pe());function fi(t){return t&&t.__esModule?t:{default:t}}var Ou="(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])",Y="(".concat(Ou,"[.]){3}").concat(Ou),mi=new RegExp("^".concat(Y,"$")),I="(?:[0-9a-fA-F]{1,4})",gi=new RegExp("^("+"(?:".concat(I,":){7}(?:").concat(I,"|:)|")+"(?:".concat(I,":){6}(?:").concat(Y,"|:").concat(I,"|:)|")+"(?:".concat(I,":){5}(?::").concat(Y,"|(:").concat(I,"){1,2}|:)|")+"(?:".concat(I,":){4}(?:(:").concat(I,"){0,1}:").concat(Y,"|(:").concat(I,"){1,3}|:)|")+"(?:".concat(I,":){3}(?:(:").concat(I,"){0,2}:").concat(Y,"|(:").concat(I,"){1,4}|:)|")+"(?:".concat(I,":){2}(?:(:").concat(I,"){0,3}:").concat(Y,"|(:").concat(I,"){1,5}|:)|")+"(?:".concat(I,":){1}(?:(:").concat(I,"){0,4}:").concat(Y,"|(:").concat(I,"){1,6}|:)|")+"(?::((?::".concat(I,"){0,5}:").concat(Y,"|(?::").concat(I,"){1,7}|:))")+")(%[0-9a-zA-Z-.:]{1,})?$");function du(t){var u=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"";if((0,ci.default)(t),u=String(u),!u)return du(t,4)||du(t,6);if(u==="4"){if(!mi.test(t))return!1;var r=t.split(".").sort(function(a,n){return a-n});return r[3]<=255}return u==="6"?!!gi.test(t):!1}ou.exports=he.default;ou.exports.default=he.default});var Nu=o((be,su)=>{"use strict";Object.defineProperty(be,"__esModule",{value:!0});be.default=Ei;var pi=qe(Pe()),_i=qe(Lu()),Ru=qe(ju()),hi=qe(nu());function qe(t){return t&&t.__esModule?t:{default:t}}var bi={protocols:["http","https","ftp"],require_tld:!0,require_protocol:!1,require_host:!0,require_port:!1,require_valid_protocol:!0,allow_underscores:!1,allow_trailing_dot:!1,allow_protocol_relative_urls:!1,validate_length:!0},Fi=/^\[([^\]]+)\](?::([0-9]+))?$/;function Ci(t){return Object.prototype.toString.call(t)==="[object RegExp]"}function Hu(t,u){for(var r=0;r<u.length;r++){var a=u[r];if(t===a||Ci(a)&&a.test(t))return!0}return!1}function Ei(t,u){if((0,pi.default)(t),!t||/[\s<>]/.test(t)||t.indexOf("mailto:")===0||(u=(0,hi.default)(u,bi),u.validate_length&&t.length>=2083))return!1;var r,a,n,i,s,l,D,c;if(D=t.split("#"),t=D.shift(),D=t.split("?"),t=D.shift(),D=t.split("://"),D.length>1){if(r=D.shift().toLowerCase(),u.require_valid_protocol&&u.protocols.indexOf(r)===-1)return!1}else{if(u.require_protocol)return!1;if(t.substr(0,2)==="//"){if(!u.allow_protocol_relative_urls)return!1;D[0]=t.substr(2)}}if(t=D.join("://"),t==="")return!1;if(D=t.split("/"),t=D.shift(),t===""&&!u.require_host)return!0;if(D=t.split("@"),D.length>1&&(u.disallow_auLine truncated
`),Oe,B,P,w),z=MI;var ER=new E(ae(`
`),B,P,w,K(/&/g,"&amp;"),K(/</g,"&lt;"),K(/>/g,"&gt;"),K(/"/g,"&quot;"),K(/'/g,"&#x27;"),K(/`/g,"&#x60;"));var AR=new E(H(/(?:\n(?:\s*))+/g," "),w);var LR=new E(H(/(?:\n\s*)/g,""),w);var $R=new E(B({separator:","}),H(/(?:\s+)/g," "),w);var QR=new E(B({separator:",",conjunction:"or"}),H(/(?:\s+)/g," "),w);var iH=new E(B({separator:",",conjunction:"and"}),H(/(?:\s+)/g," "),w);var mH=new E(B,P,w);var EH=new E(B,H(/(?:\s+)/g," "),w);var AH=new E(P,w);var zI=new E(P("all"),w),je=zI;var X=S(require("obsidian"));var q=S(require("obsidian")),Uu={height:null,style:"solid",showInInternalEmbed:!0,internalEmbedHeight:null,showInPreviewEmbed:!0,previewEmbedHeight:null,frontmatterField:null,bannerDragModifier:"none",iconHorizontalAlignment:"left",iconHorizontalTransform:null,iconVerticalAlignment:"center",iconVerticalTransform:null,useTwemoji:!0,showPreviewInLocalModal:!0,localSuggestionsLimit:null,bannersFolder:null,allowMobileDrag:!1},L={height:250,internalEmbedHeight:200,previewEmbedHeight:120,frontmatterField:"banner",iconHorizontalTransform:"0px",iconVerticalTransform:"0px",localSuggestionsLimit:10,bannersFolder:"/"},$I={solid:"Solid",gradient:"Gradient"},GI={none:"None",shift:"\u21E7 Shift",ctrl:"\u2303 Ctrl",alt:"\u2387 Alt",meta:"\u2318 Meta"},KI={left:"Left",center:"Center",right:"Right",custom:"Custom"},UI={above:"Above",center:"Center",below:"Below",custom:"Custom"},Re=class extends q.PluginSettingTab{constructor(u){super(u.app,u);this.plugin=u,this.containerEl.addClass("banner-settings")}async saveSettings(u,r={}){this.plugin.settings={...this.plugin.settings,...u},await this.plugin.saveData(this.plugin.settings),this.plugin.loadStyles();let{refreshViews:a,reloadSettings:n}=r;n&&this.display(),a&&this.plugin.refreshViews()}display(){let{containerEl:u}=this,{height:r,style:a,showInInternalEmbed:n,internalEmbedHeight:i,showInPreviewEmbed:s,previewEmbedHeight:l,frontmatterField:D,bannerDragModifier:c,iconHorizontalAlignment:b,iconHorizontalTransform:h,iconVerticalAlignment:m,iconVerticalTransform:g,useTwemoji:y,showPreviewInLocalModal:F,localSuggestionsLimit:v,bannersFolder:M,allowMobileDrag:C}=this.plugin.settings;u.empty(),this.createHeader("Banners","A nice, lil' thing to add some flair to your notes"),new q.Setting(u).setName("Banner height").setDesc("Set how big the banner should be in pixels").addText(d=>{d.inputEl.type="number",d.setValue(`${r}`),d.setPlaceholder(`${L.height}`),d.onChange(async p=>this.saveSettings({height:p?parseInt(p):null}))}),new q.Setting(u).setName("Banner style").setDesc("Set a style for all of your banners").addDropdown(d=>d.addOptions($I).setValue(a).onChange(async p=>this.saveSettings({style:p},{refreshViews:!0}))),new q.Setting(u).setName("Show banner in internal embed").setDesc(createFragment(d=>{d.appendText("Choose whether to display the banner in the internal embed. This is the embed that appears when you write "),d.createEl("code",{text:"![[file]]"}),d.appendText(" in a file")})).addToggle(d=>d.setValue(n).onChange(async p=>this.saveSettings({showInInternalEmbed:p},{reloadSettings:!0,refreshViews:!0}))),this.plugin.settings.showInInternalEmbed&&new q.Setting(u).setName("Internal embed banner height").setDesc("Set the banner size inside the internal embed").addText(d=>{d.inputEl.type="number",d.setValue(`${i}`),d.setPlaceholder(`${L.internalEmbedHeight}`),d.onChange(async p=>this.saveSettings({internalEmbedHeight:p?parseInt(p):null}))}),new q.Setting(u).setName("Show banner in preview embed").setDesc(createFragment(d=>{d.appendText("Choose whether to display the banner in the page preview embed. This is the embed that appears from the "),d.createEl("span",{text:"Page Preview ",attr:{style:"color: --var(text-normal)"}}),d.appendText("core plugin")})).addToggle(d=>d.setValue(s).onChange(async p=>this.saveSettings({showInPreviewEmbed:p},{reloadSettings:!0}))),this.plugin.settings.showInPreviewEmbed&&new q.Setting(u).setName("Preview embed banner height").setDesc("Set the banner size inside the page preview embed").addText(d=>{d.inputEl.type="number",d.setValue(`${l}`),d.setPlaceholder(`${L.previewEmbedHeight}`),d.onChange(async p=>this.saveSettings({previewEmbedHeight:p?parseInt(p):null}))}),new q.Setting(u).setName("Frontmatter field name").setDesc(createFragment(d=>{d.appendText("Set a customizable frontmatter field to use for banner data."),d.createEl("br"),d.appendText("For example, the default value "),d.createEl("code",{text:L.frontmatterField}),d.appendText(" will use the fields "),d.createEl("code",{text:L.frontmatterField}),d.appendText(", "),d.createEl("code",{text:`${L.frontmatterField}_x`}),d.appendText(", "),d.createEl("code",{text:`${L.frontmatterField}_y`}),d.appendText(", and so on...")})).addText(d=>d.setValue(D).setPlaceholder(L.frontmatterField).onChange(async p=>this.saveSettings({frontmatterField:p||null},{refreshViews:!0}))),new q.Setting(u).setName("Banner drag modifier key").setDesc(createFragment(d=>{d.appendText("Set a modifier key that must be used Line truncated
<p class="suggestion-text">${n}</p>
<div class="suggestion-image-wrapper">
<img src="${this.vault.getResourcePath(u.item)}" />
</div>
`}}async onChooseItem(u){let r=this.metadataCache.fileToLinktext(u,this.targetFile.path);await this.metaManager.upsertBannerData(this.targetFile,{src:`"![[${r}]]"`})}getImagesInFolder(u){let r=[];return u.children.forEach(a=>{a instanceof X.TFolder&&r.push(...this.getImagesInFolder(u));let n=a;Wu.includes(n.extension)&&r.push(n)}),r}};var lu=S(require("obsidian"));var WI=["src","x","y","icon","lock"],Ne=class{constructor(u){this.plugin=u,this.metadata=u.app.metadataCache,this.vault=u.app.vault}getBannerData(u){if(!u)return null;let r=this.plugin.getSettingValue("frontmatterField"),{[r]:a,[`${r}_x`]:n,[`${r}_y`]:i,[`${r}_icon`]:s,[`${r}_lock`]:l}=u;return{src:a,x:this.parseBannerPos(n),y:this.parseBannerPos(i),icon:s,lock:typeof l=="boolean"?l:l==="true"}}getBannerDataFromFile(u){if(!u)return null;let{frontmatter:r}=this.metadata.getFileCache(u);return this.getBannerData(r)}async upsertBannerData(u,r){let a=u instanceof lu.TFile?u:this.getFileByPath(u);if(!a)return;let{src:n,x:i,y:s,icon:l,lock:D}=r,c=this.plugin.getSettingValue("frontmatterField"),b={...n!==void 0&&{[c]:n},...i!==void 0&&{[`${c}_x`]:i},...s!==void 0&&{[`${c}_y`]:s},...l!==void 0&&{[`${c}_icon`]:l},...D!==void 0&&{[`${c}_lock`]:D}},h=Object.keys(b),g=(await this.vault.read(a)).split(`
`),y=g.indexOf("---"),F=y!==-1&&g.slice(0,y).every(C=>!C),v=!1;if(F){let C;for(C=y+1;C<g.length&&h.length&&!g[C].startsWith("---");C++){let[x,d]=g[C].split(": "),p=h.indexOf(x);if(p===-1)continue;let _=b[x];d!==_&&(g[C]=`${x}: ${_}`,v=!0),h.splice(p,1)}h.length&&(g.splice(C,0,...this.formatYamlFields(h,b)),C+=h.length,v=!0),g.indexOf("---",C)===-1&&(g.splice(C,0,"---"),v=!0)}else g.unshift(je`
---
${this.formatYamlFields(h,b).join(`
`)}
---
`),v=!0;if(!v)return;let M=g.join(`
`);await this.vault.modify(a,M)}async removeBannerData(u,r=WI){let a=Array.isArray(r)?r:[r],n=a.indexOf("src");n>-1&&a.splice(n,1,"");let i=this.plugin.getSettingValue("frontmatterField"),s=a.map(F=>`${i}${F?`_${F}`:""}`),{frontmatter:{position:l,...D}}=this.metadata.getFileCache(u),c=Object.keys(D??{});if(!D||!s.some(F=>c.includes(F)))return;let h=(await this.vault.read(u)).split(`
`),{line:m}=l.start,{line:g}=l.end;if(c.every(F=>s.includes(F)))h.splice(m,g-m+1);else for(let F=m+1;F<g&&s.length;F++){let[v]=h[F].split(": "),M=s.indexOf(v);M!==-1&&(h.splice(F,1),s.splice(M,1),F--,g--)}let y=h.join(`
`);await this.vault.modify(u,y)}getFileByPath(u){let r=this.vault.getAbstractFileByPath(u);return r instanceof lu.TFile?r:null}parseBannerPos(u){if(u!==void 0)return typeof u=="number"?u:parseFloat(u)}formatYamlFields(u,r){return u.map(a=>[a,`${r[a]}`]).sort((a,n)=>a[0].localeCompare(n[0])).map(([a,n])=>`${a}: ${n}`)}};var vt=S(require("obsidian"));var wt=S(require("obsidian")),Ce=S(Et());var yt=t=>{let{clientX:u,clientY:r}=t instanceof MouseEvent?t:t.targetTouches[0];return{x:u,y:r}},MM=(t,u,r)=>{if(!r&&t instanceof MouseEvent)return;let{x:a,y:n}=yt(t),{clientHeight:i,clientWidth:s,naturalHeight:l,naturalWidth:D}=t.target;u.x=a,u.y=n,u.isDragging=!0,u.vertical=l/D>=i/s},PM=(t,u)=>{if(!u.isDragging)return;let r=t.target,{x:a,y:n}=yt(t),i={x:(u.x-a)/r.clientWidth*100,y:(u.y-n)/r.clientHeight*100};u.x=a,u.y=n;let[s,l]=r.style.objectPosition.split(" ").map(D=>parseFloat(D));if(u.vertical){let D=(0,Ce.default)(l+i.y,0,100);r.style.objectPosition=`${s}% ${D}%`}else{let D=(0,Ce.default)(s+i.x,0,100);r.style.objectPosition=`${D}% ${l}%`}},qM=async(t,u,r,a)=>{if(!r.isDragging)return;r.isDragging=!1;let[n,i]=t.style.objectPosition.split(" ").map(s=>Math.round(parseFloat(s)*1e3)/1e5);await a.metaManager.upsertBannerData(u,r.vertical?{y:i}:{x:n})},LM=(t,u,r)=>{if(/^\!\[\[.+\]\]$/.test(u)){let i=u.slice(3,-2),s=t.metadataCache.getFirstLinkpathDest(i,r);return s?t.vault.getResourcePath(s):i}let a=u.startsWith("/")?u.slice(1):u,n=t.vault.getAbstractFileByPath(a);return n instanceof wt.TFile?t.vault.getResourcePath(n):u},OM=(t,u,r,a,n,i=!1)=>{let{src:s,x:l=.5,y:D=.5,lock:c}=u,b={x:null,y:null,isDragging:!1,vertical:!0},h=!i&&!c,m=document.createElement("div");m.className="banner-message",m.innerHTML=z`
<div class="spinner">
<div class="bounce1"></div>
<div class="bounce2"></div>
<div class="bounce3"></div>
</div>
`;let g=document.createElement("img"),y=(0,Ce.default)(l,0,1),F=(0,Ce.default)(D,0,1);g.className="banner-image full-width",g.style.objectPosition=`${y*100}% ${F*100}%`,g.draggable=!1,g.onload=()=>a.addClass("loaded"),g.onerror=()=>{m.innerHTML=`<p>Error loading banner image! Is the <code>${t.getSettingValue("frontmatterField")}</code> field valid?</p>`,a.addClass("error")};let v=[];if(h){g.classList.toggle("draggable",t.settings.bannerDragModifier==="none"||t.holdingDragModKey);let C=d=>MM(d,b,t.holdingDragModKey),j=d=>PM(d,b),x=()=>qM(g,r,b,t);v.push({target:g,ev:"mousedown",func:C},{target:g,ev:"mousemove",func:j},{target:n.parentElement,ev:"mouseup",func:x}),t.settings.allowMobileDrag&&v.push({target:g,ev:"touchstart",func:C},{target:g,ev:"touchmove",func:j},{target:n.parentElement,ev:"touchend",func:x})}v.forEach(({target:C,ev:j,func:x})=>C.addEventListener(j,x));let M=()=>v.forEach(({target:C,ev:j,func:x})=>C.removeEventListener(j,x));return g.src=LM(t,s,r),[[m,g],M]},$e=OM;var Ge=class extends vt.MarkdownRenderChild{constructor(u,r,a,n,i){super(document.createElement("div"));this.plugin=u,this.wrapper=r,this.ctx=a,this.bannerData=n,this.isEmbed=i,this.removeListeners=()=>{}}onload(){let{style:u}=this.plugin.settings,{containerEl:r,sourcePath:a}=this.ctx;this.wrapper.addClass("obsidian-banner-wrapper"),this.containerEl.addClass("obsidian-banner","cm5-banner",u);let[n,i]=$e(this.plugin,this.bannerData,a,this.containerEl,r,this.isEmbed);this.containerEl.append(...n),this.removeListeners=i,this.wrapper.prepend(this.containerEl)}onunload(){this.removeListeners()}};var Bt=S(require("obsidian"));var Tt=S(Du());var jM=(0,Tt.default)(),RM=t=>{let{iconHorizontalAlignment:u,iconVerticalAlignment:r}=t.settings,{iconHorizontalTransform:a,iconVerticalTransform:n}=L,i=u==="custom"?t.getSettingValue("iconHorizontalTransform"):a,s=r==="custom"?t.getSettingValue("iconVerticalTransform"):n;return i!==a||s!==n?`translate(${i}, ${s})`:null},HM=(t,u,r)=>{let a=document.createElement("span");a.addClass("icon-box"),a.style.transform=RM(t);let n=u.match(jM)?.join("")??u[0];return t.settings.useTwemoji?a.innerHTML=Le.parse(n):a.textContent=n,a.onclick=async()=>new re(t,r).open(),a},Ke=HM;var Ue=class extends Bt.MarkdownRenderChild{constructor(u,r,a,n){super(document.createElement("div"));this.plugin=u,this.wrapper=r,this.icon=a,this.file=n}onload(){let{iconHorizontalAlignment:u,iconVerticalAlignment:r}=this.plugin.settings;this.wrapper.addClass("has-banner-icon"),this.containerEl.addClass("obsidian-banner-icon","cm5-banner-icon",`h-${u}`,`v-${r}`);let a=Ke(this.plugin,this.icon,this.file);this.containerEl.append(a),this.wrapper.prepend(this.containerEl)}};var NM=t=>(u,r)=>{if(!u.querySelector("pre.frontmatter"))return;let{showInInternalEmbed:a,showInPreviewEmbed:n}=t.settings,{containerEl:i,frontmatter:s,sourcePath:l}=r,D=t.metaManager.getBannerData(s),c=t.metadataCache.getFirstLinkpathDest(l,"/"),b=i?.parentElement?.parentElement?.parentElement?.parentElement,h=b?.hasClass("internal-embed")??!1,m=b?.hasClass("popover")??!1;D?.icon&&r.addChild(new Ue(t,u,D.icon,c)),D?.src&&(!h||a)&&(!m||n)&&r.addChild(new Ge(t,u,r,D,h||m))},xt=NM;var Un=S(require("obsidian")),G=S(require("@codemirror/view")),Wn=S(require("@codemirror/language"));var At=S(require("@codemirror/view"));var We=class extends At.WidgetType{constructor(u,r,a,n,i){super();this.plugin=u,this.bannerData=r,this.filepath=a,this.contentEl=n,this.settingsFacet=i,this.removeListeners=()=>{}}eq(u){let{bannerData:{src:r,x:a,y:n,lock:i},filepath:s,settingsFacet:l}=u;return this.bannerData.src===r&&this.bannerData.x===a&&this.bannerData.y===n&&this.bannerData.lock===i&&this.filepath===s&&this.settingsFacet===l}toDOM(){let{plugin:u,bannerData:r,filepath:a,contentEl:n}=this,i=document.createElement("div");i.addClass("obsidian-banner","cm6-banner",u.settings.style);let[s,l]=$e(u,r,a,i,n);return i.append(...s),this.removeListeners=l,i}destroy(){this.removeListeners()}};var kt=S(require("@codemirror/view")),Ye=class extends kt.WidgetType{toDOM(){let u=document.createElement("div");return u.addClass("obsidian-banner-spacer"),u}};var St=S(require("@codemirror/view"));var Xe=class extends St.WidgetType{constructor(u,r,a,n){super();this.plugin=u,this.icon=r,this.file=a,this.settingsFacet=n}eq(u){let{icon:r,file:a,settingsFacet:n}=u;return this.icon===r&&this.file===a&&this.settingsFacet===n}toDOM(){let{iconHorizontalAlignment:u,iconVerticalAlignment:r}=this.plugin.settings,a=document.createElement("div");a.addClass("obsidian-banner-icon","cm6-banner-icon",`h-${u}`,`v-${r}`);let n=Ke(this.plugin,this.icon,this.file);return a.append(n),a}};var Su=S(require("@codemirror/state")),Iu=S(Gn()),Kn=(t,u)=>t.length?u.reduce((r,a)=>{let n=t[0][a];return r[a]=n,r},{}):null,$O=["style","frontmatterField","bannerDragModifier"],Z=Su.Facet.define({combine:t=>Kn(t,$O),compare:(t,u)=>(0,Iu.default)(t,u)}),GO=["iconHorizontalAlignment","iconHorizontalTransform","iconVerticalAlignment","iconVerticalTranLine truncated
/*! Copyright Twitter Inc. and other contributors. Licensed under MIT */
/* nosourcemap */
+10
View File
@@ -0,0 +1,10 @@
{
"id": "obsidian-banners",
"name": "Banners",
"description": "Add banner images to your notes!",
"version": "1.3.3",
"minAppVersion": "0.13.21",
"author": "Danny Hernandez",
"authorUrl": "https://github.com/noatpad",
"isDesktopOnly": false
}
+1
View File
@@ -0,0 +1 @@
@-webkit-keyframes sk-bouncedelay{0%,80%,to{-webkit-transform:scale(0)}40%{-webkit-transform:scale(1)}}@keyframes sk-bouncedelay{0%,80%,to{-webkit-transform:scale(0);transform:scale(0)}40%{-webkit-transform:scale(1);transform:scale(1)}}.spinner{display:flex;gap:8px;width:70px;text-align:center}.spinner>div{width:18px;height:18px;background-color:var(--text-muted);border-radius:100%;display:inline-block;-webkit-animation:sk-bouncedelay 1.4s infinite ease-in-out both;animation:sk-bouncedelay 1.4s infinite ease-in-out both}.spinner .bounce1{-webkit-animation-delay:-.32s;animation-delay:-.32s}.spinner .bounce2{-webkit-animation-delay:-.16s;animation-delay:-.16s}.obsidian-banner{position:absolute;top:0;left:0;right:0;height:var(--banner-height);width:100%;overflow:hidden;user-select:none}.obsidian-banner.gradient:not(.error){mask-image:linear-gradient(to bottom,black 50%,transparent);-webkit-mask-image:linear-gradient(to bottom,black 50%,transparent)}.obsidian-banner .banner-message{position:absolute;inset:16px;display:flex;justify-content:center;align-items:center;padding:16px;border:2px solid var(--background-modifier-border)}.obsidian-banner .banner-message p{margin:6px 8px;text-align:center;color:var(--text-muted)}.obsidian-banner .banner-image{position:relative;object-fit:cover;max-width:none;height:100%;width:100%}.obsidian-banner .banner-image.draggable{cursor:grab}.obsidian-banner .banner-image.draggable:active{cursor:grabbing}.obsidian-banner.loaded .banner-message,.obsidian-banner.error .banner-image{display:none}.obsidian-banner-wrapper{margin-top:calc(var(--banner-height) - 15px);padding-top:.5em}.obsidian-banner-spacer{height:calc(var(--banner-height) - 24px)}.obsidian-banner-icon{display:flex;position:relative;font-size:4em;pointer-events:none;user-select:none}.obsidian-banner-icon.h-left{justify-content:flex-start}.obsidian-banner-icon.h-center{justify-content:center}.obsidian-banner-icon.h-right{justify-content:flex-end}.obsidian-banner-icon .icon-box{display:inline-flex;align-items:center;height:calc(1em + 12px);padding:6px;border-radius:4px;pointer-events:initial;transition:ease .2s background}.obsidian-banner-icon .icon-box:hover{background:#aaa3;cursor:pointer}.obsidian-banner-icon img.emoji{height:1em;width:1em;vertical-align:-.1em}.internal-embed .markdown-embed-content .obsidian-banner-wrapper{margin-top:var(--banner-internal-embed-height)}.internal-embed .markdown-embed-content .obsidian-banner-wrapper>.obsidian-banner{height:var(--banner-internal-embed-height)}.internal-embed .markdown-embed-content .obsidian-banner-wrapper>.obsidian-banner img{cursor:initial}.popover .markdown-embed-content .obsidian-banner-wrapper{margin-top:var(--banner-preview-embed-height)}.popover .markdown-embed-content .obsidian-banner-wrapper>.obsidian-banner{height:var(--banner-preview-embed-height)}.popover .markdown-embed-content .obsidian-banner-wrapper>.obsidian-banner img{cursor:initial}.obsidian-banner-wrapper.has-banner-icon{padding-top:0}.obsidian-banner-wrapper.has-banner-icon .obsidian-banner-icon.v-above{margin-top:calc(-1em - 12px)}.obsidian-banner-wrapper.has-banner-icon .obsidian-banner-icon.v-center,.obsidian-banner-wrapper.has-banner-icon .obsidian-banner-icon.v-custom{margin-top:calc(-0.5em - 6px)}.obsidian-banner-wrapper.has-banner-icon .obsidian-banner-icon.v-below{padding-top:.5rem}.has-banner .cm6-banner-icon.v-above{margin-top:calc(-1em - 12px)}.has-banner .cm6-banner-icon.v-center,.has-banner .cm6-banner-icon.v-custom{margin-top:calc(-0.5em - 6px)}.has-banner .cm6-banner-icon.v-below{margin:.5rem 0}.markdown-source-view.mod-cm6 .cm-line.has-banner,.markdown-source-view.mod-cm6 .cm-line.has-banner-icon{position:inherit}.markdown-source-view.mod-cm6 .cm-line.has-banner .cm-fold-indicator,.markdown-source-view.mod-cm6 .cm-line.has-banner-icon .cm-fold-indicator{position:absolute}.markdown-source-view.mod-cm6 .cm-line.has-banner-icon .cm6-banner-icon,.markdown-source-view.mod-cm6 .cm-line.has-banner:not(.has-banner-icon) .obsidian-banner-spacer{margin-bottom:1.5rem}.markdown-source-view.mod-cm6 .cm-line.has-banner-icon:not(.has-banner) .cm-fold-indicator{top:calc(4em + 60px)}.markdown-source-view.mod-cm6 .cm-line.has-banner:not(.has-banner-icon) .cm-fold-indicator{top:calc(var(--banner-height) + 25px)}.markdown-source-view.mod-cm6 .cm-line.has-banner.has-banner-icon[data-icon-v=above] .cm-fold-indicator{top:calc(var(--banner-height) + 25px)}.markdown-source-view.mod-cm6 .cm-line.has-banner.has-banner-icon[data-icon-v=center] .cm-fold-indicator,.markdown-source-view.mod-cm6 .cm-line.has-banner.has-banner-icon[data-icon-v=custom] .cm-fold-indicator{top:calc(var(--banner-height) + 2em + 31px)}.markdown-source-view.mod-cm6 .cm-line.has-banner.has-banner-icon[data-icon-v=below] .cm-fold-indicator{top:calc(var(--banner-height) + 4em + 45px)}.banner-local-image-modal .banner-suggestion-item{padding:6px 10px}.banner-local-image-modal .suggestion-text{height:0;margin:0;padding-left:10px}.banner-localLine truncated
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+20
View File
@@ -0,0 +1,20 @@
{
"pluginList": [
"Kenshin/simpread-obsidian-plugin"
],
"pluginSubListFrozenVersion": [
{
"repo": "Kenshin/simpread-obsidian-plugin",
"version": "2.1.0"
}
],
"themesList": [],
"updateAtStartup": false,
"updateThemesAtStartup": false,
"ribbonIconEnabled": true,
"loggingEnabled": false,
"loggingPath": "BRAT-log",
"loggingVerboseEnabled": false,
"debuggingMode": true,
"notificationsEnabled": true
}
+20
View File
@@ -0,0 +1,20 @@
var Ve=Object.create;var _=Object.defineProperty;var je=Object.getOwnPropertyDescriptor;var qe=Object.getOwnPropertyNames;var Je=Object.getPrototypeOf,We=Object.prototype.hasOwnProperty;var Qe=(s,t)=>()=>(t||s((t={exports:{}}).exports,t),t.exports),Ge=(s,t)=>{for(var e in t)_(s,e,{get:t[e],enumerable:!0})},ge=(s,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of qe(t))!We.call(s,i)&&i!==e&&_(s,i,{get:()=>t[i],enumerable:!(n=je(t,i))||n.enumerable});return s};var Ke=(s,t,e)=>(e=s!=null?Ve(Je(s)):{},ge(t||!s||!s.__esModule?_(e,"default",{value:s,enumerable:!0}):e,s)),Ze=s=>ge(_({},"__esModule",{value:!0}),s);var a=(s,t,e)=>new Promise((n,i)=>{var o=c=>{try{l(e.next(c))}catch(g){i(g)}},r=c=>{try{l(e.throw(c))}catch(g){i(g)}},l=c=>c.done?n(c.value):Promise.resolve(c.value).then(o,r);l((e=e.apply(s,t)).next())});var ze=Qe(u=>{"use strict";Object.defineProperty(u,"__esModule",{value:!0});var p=require("obsidian"),ie="YYYY-MM-DD",se="gggg-[W]ww",Ae="YYYY-MM",Ee="YYYY-[Q]Q",Ie="YYYY";function D(s){var e,n;let t=window.app.plugins.getPlugin("periodic-notes");return t&&((n=(e=t.settings)==null?void 0:e[s])==null?void 0:n.enabled)}function R(){var s,t,e,n;try{let{internalPlugins:i,plugins:o}=window.app;if(D("daily")){let{format:g,folder:h,template:d}=((t=(s=o.getPlugin("periodic-notes"))==null?void 0:s.settings)==null?void 0:t.daily)||{};return{format:g||ie,folder:(h==null?void 0:h.trim())||"",template:(d==null?void 0:d.trim())||""}}let{folder:r,format:l,template:c}=((n=(e=i.getPluginById("daily-notes"))==null?void 0:e.instance)==null?void 0:n.options)||{};return{format:l||ie,folder:(r==null?void 0:r.trim())||"",template:(c==null?void 0:c.trim())||""}}catch(i){console.info("No custom daily note settings found!",i)}}function k(){var s,t,e,n,i,o,r;try{let l=window.app.plugins,c=(s=l.getPlugin("calendar"))==null?void 0:s.options,g=(e=(t=l.getPlugin("periodic-notes"))==null?void 0:t.settings)==null?void 0:e.weekly;if(D("weekly"))return{format:g.format||se,folder:((n=g.folder)==null?void 0:n.trim())||"",template:((i=g.template)==null?void 0:i.trim())||""};let h=c||{};return{format:h.weeklyNoteFormat||se,folder:((o=h.weeklyNoteFolder)==null?void 0:o.trim())||"",template:((r=h.weeklyNoteTemplate)==null?void 0:r.trim())||""}}catch(l){console.info("No custom weekly note settings found!",l)}}function M(){var t,e,n,i;let s=window.app.plugins;try{let o=D("monthly")&&((e=(t=s.getPlugin("periodic-notes"))==null?void 0:t.settings)==null?void 0:e.monthly)||{};return{format:o.format||Ae,folder:((n=o.folder)==null?void 0:n.trim())||"",template:((i=o.template)==null?void 0:i.trim())||""}}catch(o){console.info("No custom monthly note settings found!",o)}}function x(){var t,e,n,i;let s=window.app.plugins;try{let o=D("quarterly")&&((e=(t=s.getPlugin("periodic-notes"))==null?void 0:t.settings)==null?void 0:e.quarterly)||{};return{format:o.format||Ee,folder:((n=o.folder)==null?void 0:n.trim())||"",template:((i=o.template)==null?void 0:i.trim())||""}}catch(o){console.info("No custom quarterly note settings found!",o)}}function O(){var t,e,n,i;let s=window.app.plugins;try{let o=D("yearly")&&((e=(t=s.getPlugin("periodic-notes"))==null?void 0:t.settings)==null?void 0:e.yearly)||{};return{format:o.format||Ie,folder:((n=o.folder)==null?void 0:n.trim())||"",template:((i=o.template)==null?void 0:i.trim())||""}}catch(o){console.info("No custom yearly note settings found!",o)}}function Le(...s){let t=[];for(let n=0,i=s.length;n<i;n++)t=t.concat(s[n].split("/"));let e=[];for(let n=0,i=t.length;n<i;n++){let o=t[n];!o||o==="."||e.push(o)}return t[0]===""&&e.unshift(""),e.join("/")}function nt(s){let t=s.substring(s.lastIndexOf("/")+1);return t.lastIndexOf(".")!=-1&&(t=t.substring(0,t.lastIndexOf("."))),t}function it(s){return a(this,null,function*(){let t=s.replace(/\\/g,"/").split("/");if(t.pop(),t.length){let e=Le(...t);window.app.vault.getAbstractFileByPath(e)||(yield window.app.vault.createFolder(e))}})}function $(s,t){return a(this,null,function*(){t.endsWith(".md")||(t+=".md");let e=p.normalizePath(Le(s,t));return yield it(e),e})}function A(s){return a(this,null,function*(){let{metadataCache:t,vault:e}=window.app,n=p.normalizePath(s);if(n==="/")return Promise.resolve(["",null]);try{let i=t.getFirstLinkpathDest(n,""),o=yield e.cachedRead(i),r=window.app.foldManager.load(i);return[o,r]}catch(i){return console.error(`Failed to read the daily note template '${n}'`,i),new p.Notice("Failed to read the daily note template"),["",null]}})}function N(s,t="day"){let e=s.clone().startOf(t).format();return`${t}-${e}`}function Be(s){return s.replace(/\[[^\]]*\]/g,"")}function st(s,t){if(t==="week"){let e=Be(s);return/w{1,2}/i.test(e)&&(/M{1,4}/.test(e)||/D{1,4}/.test(e))}return!1}function E(s,t){return De(s.basename,t)}function ot(s,t){return De(nt(s),t)}function De(s,t){let n={day:R,week:k,month:M,quarter:x,year:O}[t]().format.split("/").pop(),i=window.moment(s,n,!0);if(!i.isValid())return null;if(st(n,t)&&t==="week"){let o=Be(n);if(/w{1,2}/iLine truncated
${t}
${i}`,e*1e3);n&&(o.noticeEl.oncontextmenu=()=>a(this,null,function*(){n()}))}function j(){return a(this,null,function*(){try{let s=yield fetch("https://obsidian.md/?"+Math.random());return s.status>=200&&s.status<300}catch(s){return!1}})}var Pe=s=>(0,q.normalizePath)(s.app.vault.configDir+"/themes")+"/",ne=(s,t,e="")=>a(void 0,null,function*(){let n=yield te(t);if(!n)return m(s,"There is no obsidian.css file in the root path of this repository, so there is no theme to install."),!1;yield ve(s,e,n);let i=`${e} theme installed from ${t}. `;return s.log(i+`[Theme Info](https://github.com/${t})`,!1),m(s,`${i}`,10,()=>a(void 0,null,function*(){window.open(`https://github.com/${t}`)})),setTimeout(()=>{s.app.customCss.setTheme(e)},500),!0}),ve=(s,t,e)=>a(void 0,null,function*(){let n=Pe(s),i=s.app.vault.adapter;(yield i.exists(n))===!1&&(yield i.mkdir(n)),yield i.write(n+t+".css",e)}),Se=s=>a(void 0,null,function*(){let t=yield Y(),e=Object.values(t).map(i=>({display:`Theme: ${i.name} (${i.repo})`,info:i})),n=new S(s);n.setSuggesterData(e),yield n.display(i=>a(void 0,null,function*(){yield ne(s,i.info.repo,i.info.name)}))}),J=s=>("BRAT-"+s.replace("/","----")).substr(0,100),Ne=(s,t)=>a(void 0,null,function*(){s.settings.themesList=s.settings.themesList.filter(n=>n.repo!=t),s.saveSettings(),yield s.app.vault.adapter.remove(Pe(s)+J(t)+".css");let e=`Removed ${t} from BRAT themes list and deleted from vault`;s.log(e,!0),m(s,`${e}`)}),W=(s,t)=>a(void 0,null,function*(){if((yield j())===!1){console.log("BRAT: No internet detected.");return}let e,n="Checking for beta theme updates STARTED";s.log(n,!0),t&&s.settings.notificationsEnabled&&(e=new q.Notice(`BRAT
${n}`,3e4));for(let o of s.settings.themesList){let r=yield V(o.repo,"obsidian.css");r!==o.lastUpdate&&(yield tt(s,o.repo,o.lastUpdate,r))}let i="Checking for beta theme updates COMPLETED";s.log(i,!0),t&&(s.settings.notificationsEnabled&&e.hide(),m(s,i))}),tt=(s,t,e="",n="")=>a(void 0,null,function*(){let i=yield te(t);if(!i)return m(s,"There is no obsidian.css file in the root path of the ${cssGithubRepository} repository, so this theme cannot be updated."),!1;let o=J(t);yield ve(s,o,i),ye(s,t,n);let r=`${o} theme updated from ${t}. From date: ${e} to ${n} `;return s.log(r+`[Theme Info](https://github.com/${t})`,!1),m(s,`${r}`,20,()=>a(void 0,null,function*(){window.open(`https://github.com/${t}`)})),!0});var Q=require("obsidian");var C=class extends Q.Modal{constructor(e,n=!1){super(e.app);this.plugin=e,this.address="",this.openSettingsTabAfterwards=n}submitForm(){return a(this,null,function*(){if(this.address==="")return;let e=this.address.replace("https://github.com/","");if(yield we(this.plugin,e)){m(this.plugin,"This plugin is already in the list for beta testing",10);return}(yield ne(this.plugin,e,J(e)))&&(yield be(this.plugin,e),this.close())})}onOpen(){this.contentEl.createEl("h4",{text:"Github repository for beta theme:"}),this.contentEl.createEl("form",{},e=>{new Q.Setting(e).addText(n=>{n.setPlaceholder("Repository (example: GitubUserName/repository-name"),n.onChange(i=>{this.address=i.trim()}),n.inputEl.addEventListener("keydown",i=>a(this,null,function*(){i.key==="Enter"&&this.address!==" "&&(i.preventDefault(),yield this.submitForm())})),n.inputEl.style.width="100%",window.setTimeout(()=>{let i=document.querySelector(".setting-item-info");i&&i.remove(),n.inputEl.focus()},10)}),e.createDiv("modal-button-container",n=>{n.createEl("button",{attr:{type:"button"},text:"Never mind"}).addEventListener("click",()=>this.close()),n.createEl("button",{attr:{type:"submit"},cls:"mod-cta",text:"Add Theme"})}),e.addEventListener("submit",n=>a(this,null,function*(){n.preventDefault(),this.address!==""&&(yield this.submitForm())}))})}onClose(){return a(this,null,function*(){this.openSettingsTabAfterwards&&(yield this.plugin.app.setting.open(),yield this.plugin.app.setting.openTabById("obsidian42-brat"))})}};var G=class extends v.PluginSettingTab{constructor(e,n){super(e,n);this.plugin=n}display(){let{containerEl:e}=this;e.empty(),e.createEl("h2",{text:this.plugin.appName}),new v.Setting(e).setName("Auto-update plugins at startup").setDesc("If enabled all beta plugins will be checked for updates each time Obsidian starts. Note: this does not update frozen version plugins.").addToggle(i=>{i.setValue(this.plugin.settings.updateAtStartup),i.onChange(o=>a(this,null,function*(){this.plugin.settings.updateAtStartup=o,yield this.plugin.saveSettings()}))}),new v.Setting(e).setName("Auto-update themes at startup").setDesc("If enabled all beta themes will be checked for updates each time Obsidian starts.").addToggle(i=>{i.setValue(this.plugin.settings.updateThemesAtStartup),i.onChange(o=>a(this,null,function*(){this.plugin.settings.updateThemesAtStartup=o,yield this.plugin.saveSettings()}))}),new v.Setting(e).setName("Ribbon Button").setDesc("Toggle ribbon button off and on.").addToggle(i=>{i.setValue(this.plugin.settings.ribbonIconEnabled),i.onChange(o=>a(this,null,function*(){this.plugin.settings.ribbonIconEnabled=o,this.plugin.settings.ribbonIconEnabled===!1?this.plugin.ribbonIcon.remove():this.plugin.showRibbonButton(),yield this.plugin.saveSettings()}))}),e.createEl("hr"),e.createEl("h2",{text:"Beta Plugin List"}),e.createEl("div",{text:'The following is a list of beta plugins added via the command palette "Add a beta plugin for testing" or "Add a beta plugin with frozen version for testing". A frozen version is a specific release of a plugin based on its releease tag. '}),e.createEl("p"),e.createEl("div",{text:"Click the x button next to a plugin to remove it from the list."}),e.createEl("p"),e.createEl("span").createEl("b",{text:"Note: "}),e.createSpan({text:"This does not delete the plugin, this should be done from the Community Plugins tab in Settings."}),new v.Setting(e).addButton(i=>{i.setButtonText("Add Beta plugin"),i.onClick(()=>a(this,null,function*(){this.plugin.app.setting.close(),yield this.plugin.betaPlugins.displayAddNewPluginModal(!0,!1)}))});let n=new Set(this.plugin.settings.pluginSubListFrozenVersion.map(i=>i.repo));for(let i of this.plugin.settings.pluginList)n.has(i)||new v.Setting(e).setName(i).addButton(o=>{o.setIcon("cross"),o.setTooltip("Delete this beta plugin"),o.onClick(()=>a(this,null,function*(){o.buttonEl.textContent===""?o.setButtonText("Click once more to confirm removal"):(o.buttonEl.parentElement.parentElement.remove(),yield this.plugin.betaPlugins.deletePlugin(i))}))});new v.Setting(e).addButton(i=>{i.setButtonText("Add Beta plugin with frozen version"),i.onClick(()=>a(this,null,function*(){this.plugin.app.setting.close(),yield this.plugin.betaPlugins.displayAddNewPluginModal(! Line truncated
The version attribute for the release is missing from the manifest file`,15),null):(n&&m(this.plugin,`${t}
The plugin id attribute for the release is missing from the manifest file`,15),null):(n&&m(this.plugin,`${t}
This does not seem to be an obsidian plugin, as there is no manifest.json file.`,15),null)})}getAllReleaseFiles(t,e,n,i=""){return a(this,null,function*(){let o=i===""?e.version:i,r=n||i!=="";return{mainJs:yield H(t,o,"main.js"),manifest:r?yield H(t,o,"manifest.json"):null,styles:yield H(t,o,"styles.css")}})}writeReleaseFilesToPluginFolder(t,e){return a(this,null,function*(){let n=(0,K.normalizePath)(this.plugin.app.vault.configDir+"/plugins/"+t)+"/",i=this.plugin.app.vault.adapter;((yield i.exists(n))===!1||!(yield i.exists(n+"manifest.json")))&&(yield i.mkdir(n)),yield i.write(n+"main.js",e.mainJs),yield i.write(n+"manifest.json",e.manifest),e.styles&&(yield i.write(n+"styles.css",e.styles))})}addPlugin(t,e=!1,n=!1,i=!1,o=""){return a(this,null,function*(){var h;let l=yield this.validateRepository(t,!0,!1),c=!!l;if(c===!1&&(l=yield this.validateRepository(t,!1,!0)),l===null){let d=`${t}
A manifest.json or manifest-beta.json file does not exist in the root directory of the repository. This plugin cannot be installed.`;return this.plugin.log(d,!0),m(this.plugin,`${d}`,10),!1}if(!l.hasOwnProperty("version")){let d=`${t}
The manifest${c?"-beta":""}.json file in the root directory of the repository does not have a version number in the file. This plugin cannot be installed.`;return this.plugin.log(d,!0),m(this.plugin,`${d}`,10),!1}let g=()=>a(this,null,function*(){let d=yield this.getAllReleaseFiles(t,l,c,o);if((c||d.manifest===null)&&(d.manifest=JSON.stringify(l)),d.mainJs===null){let b=`${t}
The release is not complete and cannot be download. main.js is missing from the Release`;return this.plugin.log(b,!0),m(this.plugin,`${b}`,10),null}return d});if(e===!1){let d=yield g();if(d===null)return;yield this.writeReleaseFilesToPluginFolder(l.id,d),yield fe(this.plugin,t,o),yield this.plugin.app.plugins.loadManifests();let b=o===""?"":` (version: ${o})`,y=`${t}${b}
The plugin has been registered with BRAT. You may still need to enable it the Community Plugin List.`;this.plugin.log(y,!0),m(this.plugin,y,10)}else{let d=this.plugin.app.vault.configDir+"/plugins/"+l.id+"/",b=null;try{b=yield this.plugin.app.vault.adapter.read(d+"manifest.json")}catch(T){if(T.errno===-4058)return yield this.addPlugin(t,!1,c,!1,o),!0;console.log("BRAT - Local Manifest Load",l.id,JSON.stringify(T,null,2))}if(o!==""||this.plugin.settings.pluginSubListFrozenVersion.map(T=>T.repo).includes(t))return m(this.plugin,`The version of ${t} is frozen, not updating.`,3),!1;let y=yield JSON.parse(b);if(y.version!==l.version){let T=yield g();if(T===null)return;if(n){let f=`There is an update available for ${l.id} from version ${y.version} to ${l.version}. `;this.plugin.log(f+`[Release Info](https://github.com/${t}/releases/tag/${l.version})`,!1),m(this.plugin,f,30,()=>a(this,null,function*(){window.open(`https://github.com/${t}/releases/tag/${l.version}`)}))}else{yield this.writeReleaseFilesToPluginFolder(l.id,T),yield this.plugin.app.plugins.loadManifests(),(h=this.plugin.app.plugins.plugins[l.id])!=null&&h.manifest&&(yield this.reloadPlugin(l.id));let f=`${l.id}
Plugin has been updated from version ${y.version} to ${l.version}. `;this.plugin.log(f+`[Release Info](https://github.com/${t}/releases/tag/${l.version})`,!1),m(this.plugin,f,30,()=>a(this,null,function*(){window.open(`https://github.com/${t}/releases/tag/${l.version}`)}))}}else i&&m(this.plugin,`No update available for ${t}`,3)}return!0})}reloadPlugin(t){return a(this,null,function*(){let e=this.plugin.app.plugins;try{yield e.disablePlugin(t),yield e.enablePlugin(t)}catch(n){console.log("reload plugin",n)}})}updatePlugin(t,e=!1,n=!1){return a(this,null,function*(){let i=yield this.addPlugin(t,!0,e,n);return i===!1&&e===!1&&m(this.plugin,`${t}
Update of plugin failed.`),i})}checkForUpdatesAndInstallUpdates(t=!1,e=!1){return a(this,null,function*(){if((yield j())===!1){console.log("BRAT: No internet detected.");return}let n,i="Checking for plugin updates STARTED";this.plugin.log(i,!0),t&&this.plugin.settings.notificationsEnabled&&(n=new K.Notice(`BRAT
${i}`,3e4));let o=new Set(this.plugin.settings.pluginSubListFrozenVersion.map(l=>l.repo));for(let l of this.plugin.settings.pluginList)o.has(l)||(yield this.updatePlugin(l,e));let r="Checking for plugin updates COMPLETED";this.plugin.log(r,!0),t&&(n.hide(),m(this.plugin,r,10))})}deletePlugin(t){return a(this,null,function*(){let e=`Removed ${t} from BRAT plugin list`;this.plugin.log(e,!0),this.plugin.settings.pluginList=this.plugin.settings.pluginList.filter(n=>n!=t),this.plugin.settings.pluginSubListFrozenVersion=this.plugin.settings.pluginSubListFrozenVersion.filter(n=>n.repo!=t),this.plugin.saveSettings()})}getEnabledDisabledPlugins(t){let e=this.plugin.app.plugins,n=Object.values(e.manifests),i=Object.values(e.plugins).map(o=>o.manifest);return t?n.filter(o=>i.find(r=>o.id===r.id)):n.filter(o=>!i.find(r=>o.id===r.id))}};var Fe=require("obsidian");function Ce(){(0,Fe.addIcon)("BratIcon",'<path fill="currentColor" stroke="currentColor" d="M 41.667969 41.667969 C 41.667969 39.367188 39.800781 37.5 37.5 37.5 C 35.199219 37.5 33.332031 39.367188 33.332031 41.667969 C 33.332031 43.96875 35.199219 45.832031 37.5 45.832031 C 39.800781 45.832031 41.667969 43.96875 41.667969 41.667969 Z M 60.417969 58.582031 C 59.460938 58.023438 58.320312 57.867188 57.25 58.148438 C 56.179688 58.429688 55.265625 59.125 54.707031 60.082031 C 53.746094 61.777344 51.949219 62.820312 50 62.820312 C 48.050781 62.820312 46.253906 61.777344 45.292969 60.082031 C 44.734375 59.125 43.820312 58.429688 42.75 58.148438 C 41.679688 57.867188 40.539062 58.023438 39.582031 58.582031 C 37.597656 59.726562 36.910156 62.257812 38.042969 64.25 C 40.5 68.53125 45.0625 71.171875 50 71.171875 C 54.9375 71.171875 59.5 68.53125 61.957031 64.25 C 63.089844 62.257812 62.402344 59.726562 60.417969 58.582031 Z M 62.5 37.5 C 60.199219 37.5 58.332031 39.367188 58.332031 41.667969 C 58.332031 43.96875 60.199219 45.832031 62.5 45.832031 C 64.800781 45.832031 66.667969 43.96875 66.667969 41.667969 C 66.667969 39.367188 64.800781 37.5 62.5 37.5 Z M 50 8.332031 C 26.988281 8.332031 8.332031 26.988281 8.332031 50 C 8.332031 73.011719 26.988281 91.667969 50 91.667969 C 73.011719 91.667969 91.667969 73.011719 91.667969 50 C 91.667969 26.988281 73.011719 8.332031 50 8.332031 Z M 50 83.332031 C 33.988281 83.402344 20.191406 72.078125 17.136719 56.363281 C 14.078125 40.644531 22.628906 24.976562 37.5 19.042969 C 37.457031 19.636719 37.457031 20.238281 37.5 20.832031 C 37.5 27.738281 43.097656 33.332031 50 33.332031 C 52.300781 33.332031 54.167969 31.46875 54.167969 29.167969 C 54.167969 26.867188 52.300781 25 50 25 C 47.699219 25 45.832031 23.132812 45.832031 20.832031 C 45.832031 18.53125 47.699219 16.667969 50 16.667969 C 68.410156 16.667969 83.332031 31.589844 83.332031 50 C 83.332031 68.410156 68.410156 83.332031 50 83.332031 Z M 50 83.332031 " />')}var U=require("obsidian"),_e=Ke(ze());function He(s,t,e=!1){if(s.settings.debuggingMode&&console.log("BRAT: "+t),s.settings.loggingEnabled){if(s.settings.loggingVerboseEnabled===!1&&e===!0)return;{let n=s.settings.loggingPath+".md",i="[["+(0,U.moment)().format((0,_e.getDailyNoteSettings)().format).toString()+"]] "+(0,U.moment)().format("HH:mm"),o=U.Platform.isDesktop?window.require("os").hostname():"MOBILE",r=i+" "+o+" "+t.replace(`
`," ")+`
`;setTimeout(()=>a(this,null,function*(){if((yield s.app.vault.adapter.exists(n))===!0){let l=yield s.app.vault.adapter.read(n);r=r+l;let c=s.app.vault.getAbstractFileByPath(n);yield s.app.vault.modify(c,r)}else yield s.app.vault.create(n,r)}),10)}}}var z=class{constructor(t){this.bratCommands=[{id:"BRAT-AddBetaPlugin",icon:"BratIcon",name:"Plugins: Add a beta plugin for testing",showInRibbon:!0,callback:()=>a(this,null,function*(){yield this.plugin.betaPlugins.displayAddNewPluginModal(!1,!1)})},{id:"BRAT-AddBetaPluginWithFrozenVersion",icon:"BratIcon",name:"Plugins: Add a beta plugin with frozen version based on a release tag",showInRibbon:!0,callback:()=>a(this,null,function*(){yield this.plugin.betaPlugins.displayAddNewPluginModal(!1,!0)})},{id:"BRAT-checkForUpdatesAndUpdate",icon:"BratIcon",name:"Plugins: Check for updates to all beta plugins and UPDATE",showInRibbon:!0,callback:()=>a(this,null,function*(){yield this.plugin.betaPlugins.checkForUpdatesAndInstallUpdates(!0,!1)})},{id:"BRAT-checkForUpdatesAndDontUpdate",icon:"BratIcon",name:"Plugins: Only check for updates to beta plugins, but don't Update",showInRibbon:!0,callback:()=>a(this,null,function*(){yield this.plugin.betaPlugins.checkForUpdatesAndInstallUpdates(!0,!0)})},{id:"BRAT-updateOnePlugin",icon:"BratIcon",name:"Plugins: Choose a single plugin version to update",showInRibbon:!0,callback:()=>a(this,null,function*(){let t=new Set(this.plugin.settings.pluginSubListFrozenVersion.map(i=>i.repo)),e=Object.values(this.plugin.settings.pluginList).filter(i=>!t.has(i)).map(i=>({display:i,info:i})),n=new S(this.plugin);n.setSuggesterData(e),yield n.display(i=>a(this,null,function*(){let o=`Checking for updates for ${i.info}`;this.plugin.log(o,!0),m(this.plugin,`
${o}`,3),yield this.plugin.betaPlugins.updatePlugin(i.info,!1,!0)}))})},{id:"BRAT-restartPlugin",icon:"BratIcon",name:"Plugins: Restart a plugin that is already installed",showInRibbon:!0,callback:()=>a(this,null,function*(){let t=Object.values(this.plugin.app.plugins.manifests).map(n=>({display:n.id,info:n.id})),e=new S(this.plugin);e.setSuggesterData(t),yield e.display(n=>a(this,null,function*(){m(this.plugin,`${n.info}
Plugin reloading .....`,5),yield this.plugin.betaPlugins.reloadPlugin(n.info)}))})},{id:"BRAT-disablePlugin",icon:"BratIcon",name:"Plugins: Disable a plugin - toggle it off",showInRibbon:!0,callback:()=>a(this,null,function*(){let t=this.plugin.betaPlugins.getEnabledDisabledPlugins(!0).map(n=>({display:`${n.name} (${n.id})`,info:n.id})),e=new S(this.plugin);e.setSuggesterData(t),yield e.display(n=>a(this,null,function*(){this.plugin.log(`${n.display} plugin disabled`,!1),yield this.plugin.app.plugins.disablePlugin(n.info)}))})},{id:"BRAT-enablePlugin",icon:"BratIcon",name:"Plugins: Enable a plugin - toggle it on",showInRibbon:!0,callback:()=>a(this,null,function*(){let t=this.plugin.betaPlugins.getEnabledDisabledPlugins(!1).map(n=>({display:`${n.name} (${n.id})`,info:n.id})),e=new S(this.plugin);e.setSuggesterData(t),yield e.display(n=>a(this,null,function*(){this.plugin.log(`${n.display} plugin enabled`,!1),yield this.plugin.app.plugins.enablePlugin(n.info)}))})},{id:"BRAT-openGitHubZRepository",icon:"BratIcon",name:"Plugins: Open the GitHub repository for a plugin",showInRibbon:!0,callback:()=>a(this,null,function*(){let t=yield me(),e=Object.values(t).map(o=>({display:`Plugin: ${o.name} (${o.repo})`,info:o.repo})),n=Object.values(this.plugin.settings.pluginList).map(o=>({display:"BRAT: "+o,info:o}));e.forEach(o=>n.push(o));let i=new S(this.plugin);i.setSuggesterData(n),yield i.display(o=>a(this,null,function*(){o.info&&window.open(`https://github.com/${o.info}`)}))})},{id:"BRAT-openGitHubRepoTheme",icon:"BratIcon",name:"Themes: Open the GitHub repository for a theme (appearance)",showInRibbon:!0,callback:()=>a(this,null,function*(){let t=yield Y(),e=Object.values(t).map(i=>({display:`Theme: ${i.name} (${i.repo})`,info:i.repo})),n=new S(this.plugin);n.setSuggesterData(e),yield n.display(i=>a(this,null,function*(){i.info&&window.open(`https://github.com/${i.info}`)}))})},{id:"BRAT-opentPluginSettings",icon:"BratIcon",name:"Plugins: Open Plugin Settings Tab",showInRibbon:!0,callback:()=>a(this,null,function*(){let t=this.plugin.app.setting,e=Object.values(t.pluginTabs).map(o=>({display:"Plugin: "+o.name,info:o.id})),n=new S(this.plugin),i=Object.values(t.settingTabs).map(o=>({display:"Core: "+o.name,info:o.id}));e.forEach(o=>i.push(o)),n.setSuggesterData(i),yield n.display(o=>a(this,null,function*(){t.open(),t.openTabById(o.info)}))})},{id:"BRAT-GrabCommunityTheme",icon:"BratIcon",name:"Themes: Grab a community theme",showInRibbon:!0,callback:()=>a(this,null,function*(){return yield Se(this.plugin)})},{id:"BRAT-GrabBetaTheme",icon:"BratIcon",name:"Themes: Grab a beta theme for testing from a Github repository",showInRibbon:!0,callback:()=>a(this,null,function*(){new C(this.plugin).open()})},{id:"BRAT-updateBetaThemes",icon:"BratIcon",name:"Themes: Update beta themes",showInRibbon:!0,callback:()=>a(this,null,function*(){return yield W(this.plugin,!0)})},{id:"BRAT-switchTheme",icon:"BratIcon",name:"Themes: Switch Active Theme ",showInRibbon:!0,callback:()=>a(this,null,function*(){let t=Object.values(this.plugin.app.customCss.themes).map(n=>({display:n,info:n}));t.unshift({display:"Obsidian Default Theme",info:""});let e=new S(this.plugin);e.setSuggesterData(t),yield e.display(n=>a(this,null,function*(){this.plugin.log(`Switched to theme ${n.display}`,!1),this.plugin.app.customCss.setTheme(n.info)}))})},{id:"BRAT-allCommands",icon:"BratIcon",name:"All Commands list",showInRibbon:!1,callback:()=>a(this,null,function*(){return this.ribbonDisplayCommands()})}];this.plugin=t,this.bratCommands.forEach(e=>a(this,null,function*(){this.plugin.addCommand({id:e.id,name:e.name,icon:e.icon,callback:()=>a(this,null,function*(){yield e.callback()})})}))}ribbonDisplayCommands(){return a(this,null,function*(){let t=[];this.bratCommands.forEach(r=>{r.showInRibbon&&t.push({display:r.name,info:r.callback})});let e=new S(this.plugin),n=this.plugin.app.setting,i=Object.values(n.settingTabs).map(r=>({display:"Core: "+r.name,info:()=>a(this,null,function*(){n.open(),n.openTabById(r.id)})})),o=Object.values(n.pluginTabs).map(r=>({display:"Plugin: "+r.name,info:()=>a(this,null,function*(){n.open(),n.openTabById(r.id)})}));t.push({display:"---- Core Plugin Settings ----",info:()=>a(this,null,function*(){yield this.ribbonDisplayCommands()})}),i.forEach(r=>t.push(r)),t.push({display:"---- Plugin Settings ----",info:()=>a(this,null,function*(){yield this.ribbonDisplayCommands()})}),o.forEach(r=>t.push(r)),e.setSuggesterData(t),yield e.display(r=>a(this,null,function*(){return yield r.info()}))})}};var Z=class extends Ye.Plugin{constructor(){super(...arguments);this.appName="Obsidian42 - Beta Reviewer's Auto-update Tool (BRAT)";this.appID="obsidian42-brat"}onload(){return a(this,null,function*(){console.log("loading Obsidian42 - BRAT"),yield this.loadSettings(),this.addSettingTab(new G(this.app,this)),this.betaPlugins=new B(this),this.commands=new z(this),Ce(),this.settings.ribbonIconEnabled&&this.showRibbonButton(),this.app.workspace.o Line truncated
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbm9kZV9tb2R1bGVzL29ic2lkaWFuLWRhaWx5LW5vdGVzLWludGVyZmFjZS9kaXN0L21haW4uanMiLCAiLi4vc3JjL21haW4udHMiLCAiLi4vc3JjL3VpL1NldHRpbmdzVGFiLnRzIiwgIi4uL3NyYy9mZWF0dXJlcy90aGVtZXMudHMiLCAiLi4vc3JjL3VpL0dlbmVyaWNGdXp6eVN1Z2dlc3Rlci50cyIsICIuLi9zcmMvZmVhdHVyZXMvZ2l0aHViVXRpbHMudHMiLCAiLi4vc3JjL3VpL3NldHRpbmdzLnRzIiwgIi4uL3NyYy91dGlscy9ub3RpZmljYXRpb25zLnRzIiwgIi4uL3NyYy91dGlscy9pbnRlcm5ldGNvbm5lY3Rpb24udHMiLCAiLi4vc3JjL3VpL0FkZE5ld1RoZW1lLnRzIiwgIi4uL3NyYy91aS9BZGROZXdQbHVnaW5Nb2RhbC50cyIsICIuLi9zcmMvZmVhdHVyZXMvQmV0YVBsdWdpbnMudHMiLCAiLi4vc3JjL3VpL2ljb25zLnRzIiwgIi4uL3NyYy91dGlscy9sb2dnaW5nLnRzIiwgIi4uL3NyYy91aS9QbHVnaW5Db21tYW5kcy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG52YXIgb2JzaWRpYW4gPSByZXF1aXJlKCdvYnNpZGlhbicpO1xuXG5jb25zdCBERUZBVUxUX0RBSUxZX05PVEVfRk9STUFUID0gXCJZWVlZLU1NLUREXCI7XG5jb25zdCBERUZBVUxUX1dFRUtMWV9OT1RFX0ZPUk1BVCA9IFwiZ2dnZy1bV113d1wiO1xuY29uc3QgREVGQVVMVF9NT05USExZX05PVEVfRk9STUFUID0gXCJZWVlZLU1NXCI7XG5jb25zdCBERUZBVUxUX1FVQVJURVJMWV9OT1RFX0ZPUk1BVCA9IFwiWVlZWS1bUV1RXCI7XG5jb25zdCBERUZBVUxUX1lFQVJMWV9OT1RFX0ZPUk1BVCA9IFwiWVlZWVwiO1xuXG5mdW5jdGlvbiBzaG91bGRVc2VQZXJpb2RpY05vdGVzU2V0dGluZ3MocGVyaW9kaWNpdHkpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IHBlcmlvZGljTm90ZXMgPSB3aW5kb3cuYXBwLnBsdWdpbnMuZ2V0UGx1Z2luKFwicGVyaW9kaWMtbm90ZXNcIik7XG4gICAgcmV0dXJuIHBlcmlvZGljTm90ZXMgJiYgcGVyaW9kaWNOb3Rlcy5zZXR0aW5ncz8uW3BlcmlvZGljaXR5XT8uZW5hYmxlZDtcbn1cbi8qKlxuICogUmVhZCB0aGUgdXNlciBzZXR0aW5ncyBmb3IgdGhlIGBkYWlseS1ub3Rlc2AgcGx1Z2luXG4gKiB0byBrZWVwIGJlaGF2aW9yIG9mIGNyZWF0aW5nIGEgbmV3IG5vdGUgaW4tc3luYy5cbiAqL1xuZnVuY3Rpb24gZ2V0RGFpbHlOb3RlU2V0dGluZ3MoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgY29uc3QgeyBpbnRlcm5hbFBsdWdpbnMsIHBsdWdpbnMgfSA9IHdpbmRvdy5hcHA7XG4gICAgICAgIGlmIChzaG91bGRVc2VQZXJpb2RpY05vdGVzU2V0dGluZ3MoXCJkYWlseVwiKSkge1xuICAgICAgICAgICAgY29uc3QgeyBmb3JtYXQsIGZvbGRlciwgdGVtcGxhdGUgfSA9IHBsdWdpbnMuZ2V0UGx1Z2luKFwicGVyaW9kaWMtbm90ZXNcIik/LnNldHRpbmdzPy5kYWlseSB8fCB7fTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZm9ybWF0OiBmb3JtYXQgfHwgREVGQVVMVF9EQUlMWV9OT1RFX0ZPUk1BVCxcbiAgICAgICAgICAgICAgICBmb2xkZXI6IGZvbGRlcj8udHJpbSgpIHx8IFwiXCIsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IHRlbXBsYXRlPy50cmltKCkgfHwgXCJcIixcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBmb2xkZXIsIGZvcm1hdCwgdGVtcGxhdGUgfSA9IGludGVybmFsUGx1Z2lucy5nZXRQbHVnaW5CeUlkKFwiZGFpbHktbm90ZXNcIik/Lmluc3RhbmNlPy5vcHRpb25zIHx8IHt9O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZm9ybWF0OiBmb3JtYXQgfHwgREVGQVVMVF9EQUlMWV9OT1RFX0ZPUk1BVCxcbiAgICAgICAgICAgIGZvbGRlcjogZm9sZGVyPy50cmltKCkgfHwgXCJcIixcbiAgICAgICAgICAgIHRlbXBsYXRlOiB0ZW1wbGF0ZT8udHJpbSgpIHx8IFwiXCIsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKFwiTm8gY3VzdG9tIGRhaWx5IG5vdGUgc2V0dGluZ3MgZm91bmQhXCIsIGVycik7XG4gICAgfVxufVxuLyoqXG4gKiBSZWFkIHRoZSB1c2VyIHNldHRpbmdzIGZvciB0aGUgYHdlZWtseS1ub3Rlc2AgcGx1Z2luXG4gKiB0byBrZWVwIGJlaGF2aW9yIG9mIGNyZWF0aW5nIGEgbmV3IG5vdGUgaW4tc3luYy5cbiAqL1xuZnVuY3Rpb24gZ2V0V2Vla2x5Tm90ZVNldHRpbmdzKCkge1xuICAgIHRyeSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIGNvbnN0IHBsdWdpbk1hbmFnZXIgPSB3aW5kb3cuYXBwLnBsdWdpbnM7XG4gICAgICAgIGNvbnN0IGNhbGVuZGFyU2V0dGluZ3MgPSBwbHVnaW5NYW5hZ2VyLmdldFBsdWdpbihcImNhbGVuZGFyXCIpPy5vcHRpb25zO1xuICAgICAgICBjb25zdCBwZXJpb2RpY05vdGVzU2V0dGluZ3MgPSBwbHVnaW5NYW5hZ2VyLmdldFBsdWdpbihcInBlcmlvZGljLW5vdGVzXCIpPy5zZXR0aW5ncz8ud2Vla2x5O1xuICAgICAgICBpZiAoc2hvdWxkVXNlUGVyaW9kaWNOb3Rlc1NldHRpbmdzKFwid2Vla2x5XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGZvcm1hdDogcGVyaW9kaWNOb3Rlc1NldHRpbmdzLmZvcm1hdCB8fCBERUZBVUxUX1dFRUtMWV9OT1RFX0ZPUk1BVCxcbiAgICAgICAgICAgICAgICBmb2xkZXI6IHBlcmlvZGljTm90ZXNTZXR0aW5ncy5mb2xkZXI/LnRyaW0oKSB8fCBcIlwiLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBwZXJpb2RpY05vdGVzU2V0dGluZ3MudGVtcGxhdGU/LnRyaW0oKSB8fCBcIlwiLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IGNhbGVuZGFyU2V0dGluZ3MgfHwge307XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmb3JtYXQ6IHNldHRpbmdzLndlZWtseU5vdGVGb3JtYXQgfHwgREVGQVVMVF9XRUVLTFlfTk9URV9GT1JNQVQsXG4gICAgICAgICAgICBmb2xkZXI6IHNldHRpbmdzLndlZWtseU5vdGVGb2xkZXI/LnRyaW0oKSB8fCBcIlwiLFxuICAgICAgICAgICAgdGVtcGxhdGU6IHNldHRpbmdzLndlZWtseU5vdGVUZW1wbGF0ZT8udHJpbSgpIHx8IFwiXCIsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKFwiTm8gY3VzdG9tIHdlZWtseSBub3RlIHNldHRpbmdzIGZvdW5kIVwiLCBlcnIpO1xuICAgIH1cbn1cbi8qKlxuICogUmVhZCB0aGUgdXNlciBzZXR0aW5ncyBmb3IgdGhlIGBwZXJpb2RpYy1ub3Rlc2AgcGx1Z2luXG4gKiB0byBrZWVwIGJlaGF2aW9yIG9mIGNyZWF0aW5nIGEgbmV3IG5vdGUgaW4tc3luYy5cbiAqL1xuZnVuY3Rpb24gZ2V0TW9udGhseU5vdGVTZXR0aW5ncygpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0L Line truncated
+10
View File
@@ -0,0 +1,10 @@
{
"id": "obsidian42-brat",
"name": "Obsidian42 - BRAT",
"version": "0.6.34",
"minAppVersion": "0.13.21",
"description": "Easily install a beta version of a plugin for testing.",
"author": "TfTHacker",
"authorUrl": "https://github.com/TfTHacker/obsidian42-brat",
"isDesktopOnly": false
}
+1
View File
@@ -0,0 +1 @@
+30 -30
View File
@@ -776,6 +776,28 @@
"image": null,
"description": "人民日报社主管主办,原名《文史参考》,“真相、趣味、良知”,为学术界搭建话语平台,为新锐者提供思想阵地,为文史爱好者营造精神家园。",
"items": [
{
"title": "社区速递 106 | 派友的会员订阅选择与 Setapp 平替、新玩意",
"description": "除了首页时间流和侧栏的精选展位,少数派Matrix社区还有很多优秀内容因条件所限无法得到有效曝光,因此我们决定重启Matrix周报,并在此基础上添加更多社区内容、作者投稿新玩意呈现给大家。💬一派热议在 ...<a href=\"https://sspai.com/post/101948\" target=\"_blank\">查看全文</a>",
"content": "除了首页时间流和侧栏的精选展位,少数派Matrix社区还有很多优秀内容因条件所限无法得到有效曝光,因此我们决定重启Matrix周报,并在此基础上添加更多社区内容、作者投稿新玩意呈现给大家。💬一派热议在 ...<a href=\"https://sspai.com/post/101948\" target=\"_blank\">查看全文</a>",
"category": "",
"link": "https://sspai.com/post/101948",
"creator": "Matrix机器人",
"pubDate": "Tue, 19 Aug 2025 17:28:57 +0800",
"enclosure": "",
"enclosureType": "",
"image": "",
"id": "",
"language": "zh",
"folder": "资讯",
"feed": "少数派",
"read": false,
"favorite": false,
"created": false,
"tags": [],
"hash": "30ad3791c118fffc64dd79302cb9ddce",
"highlights": []
},
{
"title": "浏览器扩展合集:实用而有趣的浏览器扩展,我们又为你找到了这 9 款",
"description": "本期介绍 9 款浏览器扩展插件——如果你也有好的扩展插件,欢迎在评论留言或向 Matrix 社区投稿,我们将不定期收录并在首页推送。<a href=\"https://sspai.com/post/101936\" target=\"_blank\">查看全文</a>",
@@ -2344,8 +2366,8 @@
},
{
"title": "居然还有这种需求:将你的 Apple 备忘录变成一个网站",
"description": "今天 @yfzhe 同学发来一个链接,是一个简单的 macOS 应用,可以将你的 Apple 备忘录变成一个网站。@Appinn 青小蛙先是愣了一下,居然还有这种需求。然后就去看了一眼,又翻了一翻,一 ",
"content": "\n<p>今天 @yfzhe 同学发来一个链接,是一个简单的 macOS 应用,可以将你的 Apple 备忘录变成一个网站。@<a href=\"https://www.appinn.com/apple-notes-to-website/\">Appinn</a></p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"1608\" height=\"700\" src=\"https://do-cdn.appinn.com/static3/images/2025/08/Copy-of-appinn-homework-2025-08-17T222757.518.jpg\" alt=\"居然还有这种需求:将你的 Apple 备忘录变成一个网站 19\" class=\"wp-image-53355\" title=\"居然还有这种需求:将你的 Apple 备忘录变成一个网站 19\" srcset=\"https://do-cdn.appinn.com/static3/images/2025/08/Copy-of-appinn-homework-2025-08-17T222757.518.jpg 1608w, https://do-cdn.appinn.com/static3/images/2025/08/Copy-of-appinn-homework-2025-08-17T222757.518-768x334.jpg 768w, https://do-cdn.appinn.com/static3/images/2025/08/Copy-of-appinn-homework-2025-08-17T222757.518-1536x669.jpg 1536w, https://do-cdn.appinn.com/static3/images/2025/08/Copy-of-appinn-homework-2025-08-17T222757.518-804x350.jpg 804w\" sizes=\"(max-width: 1608px) 100vw, 1608px\" /></figure>\n\n\n\n<p>青小蛙先是愣了一下,居然还有这种需求。然后就去看了一眼,又翻了一翻,一下子发现了三款类似的服务,似乎灵感都来自 Montaigne。</p>\n\n\n\n<p>就像聊天里说的这样:</p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"1824\" height=\"1414\" src=\"https://do-cdn.appinn.com/static3/images/2025/08/Screen-20250817215858@2x.avif\" alt=\"居然还有这种需求:将你的 Apple 备忘录变成一个网站 20\" class=\"wp-image-53356\" title=\"居然还有这种需求:将你的 Apple 备忘录变成一个网站 20\" srcset=\"https://do-cdn.appinn.com/static3/images/2025/08/Screen-20250817215858@2x.avif 1824w, https://do-cdn.appinn.com/static3/images/2025/08/Screen-20250817215858@2x-768x595.jpg 768w, https://do-cdn.appinn.com/static3/images/2025/08/Screen-20250817215858@2x-1536x1191.jpg 1536w\" sizes=\"(max-width: 1824px) 100vw, 1824px\" /></figure>\n\n\n\n<p>三款软件分别是:<a href=\"https://montaigne.io/\" target=\"_blank\" rel=\"noopener\">Montaigne</a>、<a href=\"https://quotion.co/\" target=\"_blank\" rel=\"noopener\">Quotion</a> 和 <a href=\"https://alto.so/\" target=\"_blank\" rel=\"noopener\">Alto</a>:</p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th></th><th>Montaigne</th><th>Quotion</th><th>Alto</th></tr></thead><tbody><tr><td>基本功能</td><td>将 Apple Notes 自动发布为网站、博客或作品集</td><td>将 Apple Notes 笔记发布为博客、作品集,支持内置 newsletter</td><td>一键将 Apple Notes 内容发布到网站</td></tr><tr><td>内容格式支持</td><td>支持 Apple Notes 原生内容</td><td>完整支持富文本、标签、图片、视频、PDF 等</td><td>支持文本、图片、音频、视频</td></tr><tr><td>操作流程</td><td>创建专属文件夹,连接 Montaigne,自动同步发布</td><td>选文件夹分享给 link@quotion.co,粘贴链接,自动同步</td><td>macOS 应用一键发布,无需多余步骤</td></tr><tr><td>主题与设计定制</td><td>提供部分模板选择</td><td>支持设计编辑器,字体、配色可自定义,支持 CSS/JS 代码</td><td>自动生成,无设计定制</td></tr><tr><td>SEO 优化</td><td>基本 SEO 支持</td><td>高级 SEO 优化,自动生成 sitemap.xml、rss.xml、robots.txt</td><td>未明确说明</td></tr><tr><td>分析统计</td><td>无</td><td>内置访问统计和用户行为分析</td><td>无</td></tr><tr><td>评论系统</td><td>无</td><td>支持原生评论系统</td><td>无</td></tr><tr><td>新闻通讯</td><td>推荐使用 Recuremail</td><td>内置无限制 newsletter</td><td>推荐使用 Recuremail</td></tr><tr><td>自定义域名</td><td>支持,自定义域名需额外付费</td><td>支持自定义域名,也支持 quotion.co 子域名</td><td>支持自定义域名</td></tr><tr><td>价格(免费与付费)</td><td>免费版功能强大,无站点数限制<br />付费方案:<br />&#8211; 支持者计划 $5/月<br />&#8211; Start $5/月<br />&#8211; Pro $12/月<br />&#8211; 自定义域名 $2/月</td><td>免费基础版<br />专业版约 $9/月起,含高级功能与无限 newsletter</td><td>无免费版,付费$5一次购买或$4/月订阅</td></tr><tr><td>适用场景</td><td>个人博客、小团队协作、简单快速发布</td><td>内容创作者、品牌营销、专业博客和成长型站点</td><td>追求极简快速发布的个人用户</td></tr><tr><td>适用平台</td><td>Web(在线服务),适用所有支持 Apple Notes 的设备</td><td>Web(在线服务),适用所有支持 Apple Notes 的设备</td><td>macOS 应用,专为 Mac 用户设计</td></tr></tbody></table></figure>\n\n\n\n<p>有类似需求的同学可以试试。</p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channelLine truncated
"description": "今天 @yfzhe 同学发来一个链接,是一个简单的 macOS 应用,可以将你的 Apple 备忘录变成一个网站。@Appinn 青小蛙先是愣了一下,居然还有这种需求。然后就去看了一眼,又翻了一翻,一下子发现了三款类似的服务,似乎灵感都来自 Montaigne。 就像聊天里说的这样: 三款软件分别是 ",
"content": "\n<p>今天 @yfzhe 同学发来一个链接,是一个简单的 macOS 应用,可以将你的 Apple 备忘录变成一个网站。@<a href=\"https://www.appinn.com/apple-notes-to-website/\">Appinn</a></p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"1608\" height=\"700\" src=\"https://do-cdn.appinn.com/static3/images/2025/08/Copy-of-appinn-homework-2025-08-17T222757.518.jpg\" alt=\"居然还有这种需求:将你的 Apple 备忘录变成一个网站 23\" class=\"wp-image-53355\" title=\"居然还有这种需求:将你的 Apple 备忘录变成一个网站 23\" srcset=\"https://do-cdn.appinn.com/static3/images/2025/08/Copy-of-appinn-homework-2025-08-17T222757.518.jpg 1608w, https://do-cdn.appinn.com/static3/images/2025/08/Copy-of-appinn-homework-2025-08-17T222757.518-768x334.jpg 768w, https://do-cdn.appinn.com/static3/images/2025/08/Copy-of-appinn-homework-2025-08-17T222757.518-1536x669.jpg 1536w, https://do-cdn.appinn.com/static3/images/2025/08/Copy-of-appinn-homework-2025-08-17T222757.518-804x350.jpg 804w\" sizes=\"(max-width: 1608px) 100vw, 1608px\" /></figure>\n\n\n\n<p>青小蛙先是愣了一下,居然还有这种需求。然后就去看了一眼,又翻了一翻,一下子发现了三款类似的服务,似乎灵感都来自 Montaigne。</p>\n\n\n\n<p>就像聊天里说的这样:</p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"1824\" height=\"1414\" src=\"https://do-cdn.appinn.com/static3/images/2025/08/Screen-20250817215858@2x.avif\" alt=\"居然还有这种需求:将你的 Apple 备忘录变成一个网站 24\" class=\"wp-image-53356\" title=\"居然还有这种需求:将你的 Apple 备忘录变成一个网站 24\" srcset=\"https://do-cdn.appinn.com/static3/images/2025/08/Screen-20250817215858@2x.avif 1824w, https://do-cdn.appinn.com/static3/images/2025/08/Screen-20250817215858@2x-768x595.jpg 768w, https://do-cdn.appinn.com/static3/images/2025/08/Screen-20250817215858@2x-1536x1191.jpg 1536w\" sizes=\"(max-width: 1824px) 100vw, 1824px\" /></figure>\n\n\n\n<p>三款软件分别是:<a href=\"https://montaigne.io/\" target=\"_blank\" rel=\"noopener\">Montaigne</a>、<a href=\"https://quotion.co/\" target=\"_blank\" rel=\"noopener\">Quotion</a> 和 <a href=\"https://alto.so/\" target=\"_blank\" rel=\"noopener\">Alto</a>:</p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th></th><th>Montaigne</th><th>Quotion</th><th>Alto</th></tr></thead><tbody><tr><td>基本功能</td><td>将 Apple Notes 自动发布为网站、博客或作品集</td><td>将 Apple Notes 笔记发布为博客、作品集,支持内置 newsletter</td><td>一键将 Apple Notes 内容发布到网站</td></tr><tr><td>内容格式支持</td><td>支持 Apple Notes 原生内容</td><td>完整支持富文本、标签、图片、视频、PDF 等</td><td>支持文本、图片、音频、视频</td></tr><tr><td>操作流程</td><td>创建专属文件夹,连接 Montaigne,自动同步发布</td><td>选文件夹分享给 link@quotion.co,粘贴链接,自动同步</td><td>macOS 应用一键发布,无需多余步骤</td></tr><tr><td>主题与设计定制</td><td>提供部分模板选择</td><td>支持设计编辑器,字体、配色可自定义,支持 CSS/JS 代码</td><td>自动生成,无设计定制</td></tr><tr><td>SEO 优化</td><td>基本 SEO 支持</td><td>高级 SEO 优化,自动生成 sitemap.xml、rss.xml、robots.txt</td><td>未明确说明</td></tr><tr><td>分析统计</td><td>无</td><td>内置访问统计和用户行为分析</td><td>无</td></tr><tr><td>评论系统</td><td>无</td><td>支持原生评论系统</td><td>无</td></tr><tr><td>新闻通讯</td><td>推荐使用 Recuremail</td><td>内置无限制 newsletter</td><td>推荐使用 Recuremail</td></tr><tr><td>自定义域名</td><td>支持,自定义域名需额外付费</td><td>支持自定义域名,也支持 quotion.co 子域名</td><td>支持自定义域名</td></tr><tr><td>价格(免费与付费)</td><td>免费版功能强大,无站点数限制<br />付费方案:<br />&#8211; 支持者计划 $5/月<br />&#8211; Start $5/月<br />&#8211; Pro $12/月<br />&#8211; 自定义域名 $2/月</td><td>免费基础版<br />专业版约 $9/月起,含高级功能与无限 newsletter</td><td>无免费版,付费$5一次购买或$4/月订阅</td></tr><tr><td>适用场景</td><td>个人博客、小团队协作、简单快速发布</td><td>内容创作者、品牌营销、专业博客和成长型站点</td><td>追求极简快速发布的个人用户</td></tr><tr><td>适用平台</td><td>Web(在线服务),适用所有支持 Apple Notes 的设备</td><td>Web(在线服务),适用所有支持 Apple Notes 的设备</td><td>macOS 应用,专为 Mac 用户设计</td></tr></tbody></table></figure>\n\n\n\n<p>有类似需求的同学可以试试。</p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channelLine truncated
"category": "macOS",
"link": "https://www.appinn.com/apple-notes-to-website/",
"creator": "青小蛙",
@@ -2388,8 +2410,8 @@
},
{
"title": "CanaryToken – 29 种蜜罐陷阱!同事偷看我文件后,他的IP就自动’投案’到我邮箱了",
"description": "CanaryToken 是一个非常有趣的服务,它提供了 29 种常见的蜜罐陷阱,包括 Windows 文件夹、运行指定程序、打开 PDF 文档、Word/Excel 文件、图片、二维码,以及网络蜜罐: ",
"content": "\n<p><strong>CanaryToken</strong> 是一个非常有趣的服务,它提供了 29 种常见的蜜罐陷阱,包括 Windows 文件夹、运行指定程序、打开 PDF 文档、Word/Excel 文件、图片、二维码,以及网络蜜罐:MySQL、邮箱、AWS 证书、Log4shell 等,只要有人使用了这些陷阱,你就会收到通知,支持邮件与 WebHook。@<a href=\"https://www.appinn.com/canarytoken/\">Appinn</a></p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"1608\" height=\"700\" src=\"https://do-cdn.appinn.com/static3/images/2025/08/Copy-of-appinn-homework-2025-08-15T170900.787.jpg\" alt=\"CanaryToken - 29 种蜜罐陷阱!同事偷看我文件后,他的IP就自动&#039;投案&#039;到我邮箱了 25\" class=\"wp-image-53340\" title=\"CanaryToken - 29 种蜜罐陷阱!同事偷看我文件后,他的IP就自动&#039;投案&#039;到我邮箱了 25\" srcset=\"https://do-cdn.appinn.com/static3/images/2025/08/Copy-of-appinn-homework-2025-08-15T170900.787.jpg 1608w, https://do-cdn.appinn.com/static3/images/2025/08/Copy-of-appinn-homework-2025-08-15T170900.787-768x334.jpg 768w, https://do-cdn.appinn.com/static3/images/2025/08/Copy-of-appinn-homework-2025-08-15T170900.787-1536x669.jpg 1536w, https://do-cdn.appinn.com/static3/images/2025/08/Copy-of-appinn-homework-2025-08-15T170900.787-804x350.jpg 804w\" sizes=\"(max-width: 1608px) 100vw, 1608px\" /></figure>\n\n\n\n<p>来自<a href=\"https://meta.appinn.net/c/faxian/10\" target=\"_blank\" rel=\"noopener\"><strong>发现频道</strong></a>,@艾尔赛高 同学的推荐:<a href=\"https://meta.appinn.net/t/topic/73994\" target=\"_blank\" rel=\"noopener\">https://meta.appinn.net/t/topic/73994</a></p>\n\n\n\n<p>偶然发现的一个有趣服务。提前生成无害的蜜罐密钥,放在容易被攻击者接触的位置(例如 ~/.aws/credentials ),如果被攻击/泄露了,当攻击者尝试使用密钥的时候,会受到通知(可选邮件/webhook)</p>\n\n\n\n<h3 class=\"wp-block-heading\">示例场景:</h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>监控开发环境是否被入侵</li>\n\n\n\n<li>监控私有代码仓库是否被意外拉取</li>\n\n\n\n<li>监控密钥是否意外泄漏</li>\n</ul>\n\n\n\n<h2 class=\"wp-block-heading\">一个例子:监控 Windows 文件夹</h2>\n\n\n\n<p>在 <a href=\"https://canarytokens.org/nest/?utm_source=appinn.com\" target=\"_blank\" rel=\"noopener\">CanaryToken</a> 官网找到 <strong>Windows Folder</strong>,打开后输入邮箱、说明(用来让你区分哪个文件夹的,比如输入:我的小姐姐的家),以及可选设置 Webhook 通知:</p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"2526\" height=\"1688\" src=\"https://do-cdn.appinn.com/static3/images/2025/08/Screen-20250815172337@2x.avif\" alt=\"CanaryToken - 29 种蜜罐陷阱!同事偷看我文件后,他的IP就自动&#039;投案&#039;到我邮箱了 26\" class=\"wp-image-53341\" title=\"CanaryToken - 29 种蜜罐陷阱!同事偷看我文件后,他的IP就自动&#039;投案&#039;到我邮箱了 26\" srcset=\"https://do-cdn.appinn.com/static3/images/2025/08/Screen-20250815172337@2x.avif 2526w, https://do-cdn.appinn.com/static3/images/2025/08/Screen-20250815172337@2x-768x513.jpg 768w, https://do-cdn.appinn.com/static3/images/2025/08/Screen-20250815172337@2x-1536x1026.jpg 1536w, https://do-cdn.appinn.com/static3/images/2025/08/Screen-20250815172337@2x-2048x1369.jpg 2048w\" sizes=\"(max-width: 2526px) 100vw, 2526px\" /></figure>\n\n\n\n<p>然后点击下方的 <kbd>Create Canarytoken</kbd> 按钮,从新的页面下载 zip 文件:</p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"1080\" height=\"1193\" src=\"https://do-cdn.appinn.com/static3/images/2025/08/Screen-20250815172734@2x.avif\" alt=\"CanaryToken - 29 种蜜罐陷阱!同事偷看我文件后,他的IP就自动&#039;投案&#039;到我邮箱了 27\" class=\"wp-image-53342\" title=\"CanaryToken - 29 种蜜罐陷阱!同事偷看我文件后,他的IP就自动&#039;投案&#039;到我邮箱了 27\" srcset=\"https://do-cdn.appinn.com/static3/images/2025/08/Screen-20250815172734@2x.avif 1080w, https://do-cdn.appinn.com/static3/images/2025/08/Screen-20250815172734@2x-768x848.jpg 768w\" sizes=\"(max-width: 1080px) 100vw, 1080px\" /></figure>\n\n\n\n<p>注意由于系统限制,这个蜜罐仅支持 Windows 10 以下版本。</p>\n\n\n\n<p>在这个 zip 文件夹中,有一个 <kbd>desktop.ini</kbd> 文件,复制到你要监控的文件夹里就行了。</p>\n\n\n\n<p><kbd>desktop.ini</kbd> 内容很简,打开就能触发里面的 URL 的意思:</p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\">\n&#x5B;.ShellClassInfo]\nIconResource=\\\\%USERNAME%.%COMPUTERNAME%.%USERDOMAIN%.INI.xxxxxxxx.canarytokens.com\\resource.dll\n</pre></div>\n\n\n<p>就好Line truncated
"description": "CanaryToken 是一个非常有趣的服务,它提供了 29 种常见的蜜罐陷阱,包括 Windows 文件夹、运行指定程序、打开 PDF 文档、Word/Excel 文件、图片、二维码,以及网络蜜罐:MySQL、邮箱、AWS 证书、Log4shell 等,只要有人使用了这些陷阱,你就会收到通知,支持 ",
"content": "\n<p><strong>CanaryToken</strong> 是一个非常有趣的服务,它提供了 29 种常见的蜜罐陷阱,包括 Windows 文件夹、运行指定程序、打开 PDF 文档、Word/Excel 文件、图片、二维码,以及网络蜜罐:MySQL、邮箱、AWS 证书、Log4shell 等,只要有人使用了这些陷阱,你就会收到通知,支持邮件与 WebHook。@<a href=\"https://www.appinn.com/canarytoken/\">Appinn</a></p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"1608\" height=\"700\" src=\"https://do-cdn.appinn.com/static3/images/2025/08/Copy-of-appinn-homework-2025-08-15T170900.787.jpg\" alt=\"CanaryToken - 29 种蜜罐陷阱!同事偷看我文件后,他的IP就自动&#039;投案&#039;到我邮箱了 29\" class=\"wp-image-53340\" title=\"CanaryToken - 29 种蜜罐陷阱!同事偷看我文件后,他的IP就自动&#039;投案&#039;到我邮箱了 29\" srcset=\"https://do-cdn.appinn.com/static3/images/2025/08/Copy-of-appinn-homework-2025-08-15T170900.787.jpg 1608w, https://do-cdn.appinn.com/static3/images/2025/08/Copy-of-appinn-homework-2025-08-15T170900.787-768x334.jpg 768w, https://do-cdn.appinn.com/static3/images/2025/08/Copy-of-appinn-homework-2025-08-15T170900.787-1536x669.jpg 1536w, https://do-cdn.appinn.com/static3/images/2025/08/Copy-of-appinn-homework-2025-08-15T170900.787-804x350.jpg 804w\" sizes=\"(max-width: 1608px) 100vw, 1608px\" /></figure>\n\n\n\n<p>来自<a href=\"https://meta.appinn.net/c/faxian/10\" target=\"_blank\" rel=\"noopener\"><strong>发现频道</strong></a>,@艾尔赛高 同学的推荐:<a href=\"https://meta.appinn.net/t/topic/73994\" target=\"_blank\" rel=\"noopener\">https://meta.appinn.net/t/topic/73994</a></p>\n\n\n\n<p>偶然发现的一个有趣服务。提前生成无害的蜜罐密钥,放在容易被攻击者接触的位置(例如 ~/.aws/credentials ),如果被攻击/泄露了,当攻击者尝试使用密钥的时候,会受到通知(可选邮件/webhook)</p>\n\n\n\n<h3 class=\"wp-block-heading\">示例场景:</h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>监控开发环境是否被入侵</li>\n\n\n\n<li>监控私有代码仓库是否被意外拉取</li>\n\n\n\n<li>监控密钥是否意外泄漏</li>\n</ul>\n\n\n\n<h2 class=\"wp-block-heading\">一个例子:监控 Windows 文件夹</h2>\n\n\n\n<p>在 <a href=\"https://canarytokens.org/nest/?utm_source=appinn.com\" target=\"_blank\" rel=\"noopener\">CanaryToken</a> 官网找到 <strong>Windows Folder</strong>,打开后输入邮箱、说明(用来让你区分哪个文件夹的,比如输入:我的小姐姐的家),以及可选设置 Webhook 通知:</p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"2526\" height=\"1688\" src=\"https://do-cdn.appinn.com/static3/images/2025/08/Screen-20250815172337@2x.avif\" alt=\"CanaryToken - 29 种蜜罐陷阱!同事偷看我文件后,他的IP就自动&#039;投案&#039;到我邮箱了 30\" class=\"wp-image-53341\" title=\"CanaryToken - 29 种蜜罐陷阱!同事偷看我文件后,他的IP就自动&#039;投案&#039;到我邮箱了 30\" srcset=\"https://do-cdn.appinn.com/static3/images/2025/08/Screen-20250815172337@2x.avif 2526w, https://do-cdn.appinn.com/static3/images/2025/08/Screen-20250815172337@2x-768x513.jpg 768w, https://do-cdn.appinn.com/static3/images/2025/08/Screen-20250815172337@2x-1536x1026.jpg 1536w, https://do-cdn.appinn.com/static3/images/2025/08/Screen-20250815172337@2x-2048x1369.jpg 2048w\" sizes=\"(max-width: 2526px) 100vw, 2526px\" /></figure>\n\n\n\n<p>然后点击下方的 <kbd>Create Canarytoken</kbd> 按钮,从新的页面下载 zip 文件:</p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"1080\" height=\"1193\" src=\"https://do-cdn.appinn.com/static3/images/2025/08/Screen-20250815172734@2x.avif\" alt=\"CanaryToken - 29 种蜜罐陷阱!同事偷看我文件后,他的IP就自动&#039;投案&#039;到我邮箱了 31\" class=\"wp-image-53342\" title=\"CanaryToken - 29 种蜜罐陷阱!同事偷看我文件后,他的IP就自动&#039;投案&#039;到我邮箱了 31\" srcset=\"https://do-cdn.appinn.com/static3/images/2025/08/Screen-20250815172734@2x.avif 1080w, https://do-cdn.appinn.com/static3/images/2025/08/Screen-20250815172734@2x-768x848.jpg 768w\" sizes=\"(max-width: 1080px) 100vw, 1080px\" /></figure>\n\n\n\n<p>注意由于系统限制,这个蜜罐仅支持 Windows 10 以下版本。</p>\n\n\n\n<p>在这个 zip 文件夹中,有一个 <kbd>desktop.ini</kbd> 文件,复制到你要监控的文件夹里就行了。</p>\n\n\n\n<p><kbd>desktop.ini</kbd> 内容很简,打开就能触发里面的 URL 的意思:</p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\">\n&#x5B;.ShellClassInfo]\nIconResource=\\\\%USERNAME%.%COMPUTERNAME%.%USERDOMAIN%.INI.xxxxxxxx.canarytokens.com\\resource.dll\n</pre></div>\n\n\n<p>就好Line truncated
"category": "在线应用",
"link": "https://www.appinn.com/canarytoken/",
"creator": "青小蛙",
@@ -2432,8 +2454,8 @@
},
{
"title": "Perplexity 正式提出 345 亿美元要约,收购 Google Chrome",
"description": "来自 theverge 的消息,据 《华尔街日报》 和彭博社报道,人工智能搜索公司 Perplexity 已于周二上午向 Alphabet Inc. 旗下谷歌发出了收购要约,用 345 亿美元收购 G ",
"content": "\n<p>来自 <a href=\"https://www.theverge.com/news/758218/perplexity-google-chrome-bid-unsolicited-offer\" target=\"_blank\" rel=\"noopener\">theverge</a> 的消息,据 《华尔街日报》 和彭博社报道,人工智能搜索公司 Perplexity 已于周二上午向 Alphabet Inc. 旗下谷歌发出了收购要约,用 345 亿美元收购 Google Chrome。值得注意的是,这一出价远高于 Perplexity 自身 180 亿美元的估值。@<a href=\"https://www.appinn.com/perplexity-345b-acquire-google-chrome/\">Appinn</a></p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"1608\" height=\"700\" src=\"https://do-cdn.appinn.com/static3/images/2025/08/Copy-of-appinn-homework-2025-08-13T142342.905.jpg\" alt=\"Perplexity 正式提出 345 亿美元要约,收购 Google Chrome 31\" class=\"wp-image-53280\" title=\"Perplexity 正式提出 345 亿美元要约,收购 Google Chrome 31\" srcset=\"https://do-cdn.appinn.com/static3/images/2025/08/Copy-of-appinn-homework-2025-08-13T142342.905.jpg 1608w, https://do-cdn.appinn.com/static3/images/2025/08/Copy-of-appinn-homework-2025-08-13T142342.905-768x334.jpg 768w, https://do-cdn.appinn.com/static3/images/2025/08/Copy-of-appinn-homework-2025-08-13T142342.905-1536x669.jpg 1536w, https://do-cdn.appinn.com/static3/images/2025/08/Copy-of-appinn-homework-2025-08-13T142342.905-804x350.jpg 804w\" sizes=\"(max-width: 1608px) 100vw, 1608px\" /></figure>\n\n\n\n<h2 class=\"wp-block-heading\">Perplexity 是谁</h2>\n\n\n\n<p><a href=\"https://www.appinn.com/tag/perplexity/\" data-type=\"post_tag\" data-id=\"7487\">Perplexity</a> 是一家“套壳” AI 服务提供商,提供了包括 Claude Sonnet 4.0、GPT-5、Gemini 2.5 Pro 大模型,以及 Claude Opus 4.1、Grok 4、GPT-o3/pro 等推理模型,曾经还托管过 DeepSeek-R1 模型。经常赠送年度账号。</p>\n\n\n\n<p>Google Chrome 大家都很熟悉了。有趣的是,在去年的时候,Perplexity 就说过:如果政府强迫谷歌出售其浏览器, 它将收购 Chrome。</p>\n\n\n\n<p>另外,Perplexity 还说过要收购 TikTok&#8230;</p>\n\n\n\n<p>Perplexity 发言人 Jesse Dwyer 向 <strong>The Verge</strong> 证实,《 华尔街日报 》的报道属实。</p>\n\n\n\n<p>另外,Perplexity 首席商务官 Dmitry Shevelenko 向彭博社表示,“多家大型投资基金已同意全额资助此次交易。” 该初创公司的一位发言人还向彭博社表示,如果谷歌接受这笔交易,Perplexity 将在未来两年内向 Chrome 和 Chromium 投资超过 30 亿美元。</p>\n\n\n\n<h2 class=\"wp-block-heading\">最后</h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Perplexity 目前估值 180亿美元。</li>\n\n\n\n<li>Perplexity 最近发布了自己的浏览器 <strong>Comet</strong></li>\n\n\n\n<li>Perplexity 今年早些时候也曾提出收购 TikTok </li>\n\n\n\n<li>市场对 Chrome 的估值差异很大,在 200~500亿美元之间</li>\n\n\n\n<li>也有分析师认为 Perplexity 的报价“大大低估了该资产”,估计 Chrome 的价值接近 1000 亿美元。</li>\n\n\n\n<li>谷歌面临美国反垄断诉讼,「美国地区法官正在权衡是否强制出售」</li>\n\n\n\n<li>谷歌发言人拒绝对该提议发表评论。</li>\n\n\n\n<li>Chrome 在全球拥有约 35 亿用户,占据全球浏览器市场 60%以上的份额。</li>\n\n\n\n<li>Perplexity 说收购成功后将继续维护和支持 Chrome 和开源项目 Chromium。</li>\n</ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"/>\n\n\n\n<p>原文:https://www.appinn.com/perplexity-345b-acquire-google-chrome/</p>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<h2 class=\"wp-block-heading\">关注我们</h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>微博:<a href=\"https://weibo.com/appinncom\" target=\"_blank\" rel=\"noopener\">https://weibo.com/appinncom</a></li>\n\n\n\n<li>B站:<a href=\"https://space.bilibili.com/10979326\" target=\"_blank\" rel=\"noopener\">https://space.bilibili.com/10979326</a></li>\n\n\n\n<li>小红书:<a href=\"https://www.xiaohongshu.com/user/profile/61459ee9000000000201fae3\" target=\"_blank\" rel=\"noopener\">https://kutt.appinn.com/6QwshF</a></li>\n\n\n\n<li>Facebook:<a href=\"https://www.facebook.com/appinncom/\" target=\"_blank\" rel=\"noopener\">https://www.facebook.com/appinncom/</a></li>\n\n\n\n<li>BlueSky:<a href=\"https://bsky.app/profile/appinn.bsky.social\" target=\"_blank\" rel=\"noopener\">https://bsky.app/profile/appinn.bsky.social</a></li>\n\n\n\n<li>X:<a href=\"https://x.com/appinn\">https://x.com/appinn</a></li>\n\n\n\n<li>微信公众号:搜索「小众软件」</li>\n\n\n\n<li>TG频道:@appinnfeed</li>\n</ul>\n\n\n\n<p>爱发电:<a href=\"https://afdian.com/a/qingxwa\" target=\"_blank\" rel=\"noopener\">https://afdian.com/a/qingxwa</a> (打赏我们,让我们更Line truncated
"description": "来自 theverge 的消息,据 《华尔街日报》 和彭博社报道,人工智能搜索公司 Perplexity 已于周二上午向 Alphabet Inc. 旗下谷歌发出了收购要约,用 345 亿美元收购 Google Chrome。值得注意的是,这一出价远高于 Perplexity 自身 180 亿美元的 ",
"content": "\n<p>来自 <a href=\"https://www.theverge.com/news/758218/perplexity-google-chrome-bid-unsolicited-offer\" target=\"_blank\" rel=\"noopener\">theverge</a> 的消息,据 《华尔街日报》 和彭博社报道,人工智能搜索公司 Perplexity 已于周二上午向 Alphabet Inc. 旗下谷歌发出了收购要约,用 345 亿美元收购 Google Chrome。值得注意的是,这一出价远高于 Perplexity 自身 180 亿美元的估值。@<a href=\"https://www.appinn.com/perplexity-345b-acquire-google-chrome/\">Appinn</a></p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"1608\" height=\"700\" src=\"https://do-cdn.appinn.com/static3/images/2025/08/Copy-of-appinn-homework-2025-08-13T142342.905.jpg\" alt=\"Perplexity 正式提出 345 亿美元要约,收购 Google Chrome 35\" class=\"wp-image-53280\" title=\"Perplexity 正式提出 345 亿美元要约,收购 Google Chrome 35\" srcset=\"https://do-cdn.appinn.com/static3/images/2025/08/Copy-of-appinn-homework-2025-08-13T142342.905.jpg 1608w, https://do-cdn.appinn.com/static3/images/2025/08/Copy-of-appinn-homework-2025-08-13T142342.905-768x334.jpg 768w, https://do-cdn.appinn.com/static3/images/2025/08/Copy-of-appinn-homework-2025-08-13T142342.905-1536x669.jpg 1536w, https://do-cdn.appinn.com/static3/images/2025/08/Copy-of-appinn-homework-2025-08-13T142342.905-804x350.jpg 804w\" sizes=\"(max-width: 1608px) 100vw, 1608px\" /></figure>\n\n\n\n<h2 class=\"wp-block-heading\">Perplexity 是谁</h2>\n\n\n\n<p><a href=\"https://www.appinn.com/tag/perplexity/\" data-type=\"post_tag\" data-id=\"7487\">Perplexity</a> 是一家“套壳” AI 服务提供商,提供了包括 Claude Sonnet 4.0、GPT-5、Gemini 2.5 Pro 大模型,以及 Claude Opus 4.1、Grok 4、GPT-o3/pro 等推理模型,曾经还托管过 DeepSeek-R1 模型。经常赠送年度账号。</p>\n\n\n\n<p>Google Chrome 大家都很熟悉了。有趣的是,在去年的时候,Perplexity 就说过:如果政府强迫谷歌出售其浏览器, 它将收购 Chrome。</p>\n\n\n\n<p>另外,Perplexity 还说过要收购 TikTok&#8230;</p>\n\n\n\n<p>Perplexity 发言人 Jesse Dwyer 向 <strong>The Verge</strong> 证实,《 华尔街日报 》的报道属实。</p>\n\n\n\n<p>另外,Perplexity 首席商务官 Dmitry Shevelenko 向彭博社表示,“多家大型投资基金已同意全额资助此次交易。” 该初创公司的一位发言人还向彭博社表示,如果谷歌接受这笔交易,Perplexity 将在未来两年内向 Chrome 和 Chromium 投资超过 30 亿美元。</p>\n\n\n\n<h2 class=\"wp-block-heading\">最后</h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Perplexity 目前估值 180亿美元。</li>\n\n\n\n<li>Perplexity 最近发布了自己的浏览器 <strong>Comet</strong></li>\n\n\n\n<li>Perplexity 今年早些时候也曾提出收购 TikTok </li>\n\n\n\n<li>市场对 Chrome 的估值差异很大,在 200~500亿美元之间</li>\n\n\n\n<li>也有分析师认为 Perplexity 的报价“大大低估了该资产”,估计 Chrome 的价值接近 1000 亿美元。</li>\n\n\n\n<li>谷歌面临美国反垄断诉讼,「美国地区法官正在权衡是否强制出售」</li>\n\n\n\n<li>谷歌发言人拒绝对该提议发表评论。</li>\n\n\n\n<li>Chrome 在全球拥有约 35 亿用户,占据全球浏览器市场 60%以上的份额。</li>\n\n\n\n<li>Perplexity 说收购成功后将继续维护和支持 Chrome 和开源项目 Chromium。</li>\n</ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"/>\n\n\n\n<p>原文:https://www.appinn.com/perplexity-345b-acquire-google-chrome/</p>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<h2 class=\"wp-block-heading\">关注我们</h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>微博:<a href=\"https://weibo.com/appinncom\" target=\"_blank\" rel=\"noopener\">https://weibo.com/appinncom</a></li>\n\n\n\n<li>B站:<a href=\"https://space.bilibili.com/10979326\" target=\"_blank\" rel=\"noopener\">https://space.bilibili.com/10979326</a></li>\n\n\n\n<li>小红书:<a href=\"https://www.xiaohongshu.com/user/profile/61459ee9000000000201fae3\" target=\"_blank\" rel=\"noopener\">https://kutt.appinn.com/6QwshF</a></li>\n\n\n\n<li>Facebook:<a href=\"https://www.facebook.com/appinncom/\" target=\"_blank\" rel=\"noopener\">https://www.facebook.com/appinncom/</a></li>\n\n\n\n<li>BlueSky:<a href=\"https://bsky.app/profile/appinn.bsky.social\" target=\"_blank\" rel=\"noopener\">https://bsky.app/profile/appinn.bsky.social</a></li>\n\n\n\n<li>X:<a href=\"https://x.com/appinn\">https://x.com/appinn</a></li>\n\n\n\n<li>微信公众号:搜索「小众软件」</li>\n\n\n\n<li>TG频道:@appinnfeed</li>\n</ul>\n\n\n\n<p>爱发电:<a href=\"https://afdian.com/a/qingxwa\" target=\"_blank\" rel=\"noopener\">https://afdian.com/a/qingxwa</a> (打赏我们,让我们更Line truncated
"category": "业界消息",
"link": "https://www.appinn.com/perplexity-345b-acquire-google-chrome/",
"creator": "青小蛙",
@@ -2476,8 +2498,8 @@
},
{
"title": "阿里小号又不停止服务了:当前阶段可继续使用,不能续费",
"description": "半个月前,阿里通信官网确认:阿里小号将于2025年8月31日起陆续停止服务,当时所有的阿里小号用户被闹的人心惶惶,又是无力又是解绑各种服务更换手机号码。今天在阿里小号 App 中出现了新的公告:暂停执 ",
"content": "\n<p>半个月前,<a href=\"https://www.appinn.com/ali-xiaohao-stop-2025/\" data-type=\"post\" data-id=\"53009\">阿里通信官网确认:阿里小号将于2025年8月31日起陆续停止服务</a>,当时所有的阿里小号用户被闹的人心惶惶,又是无力又是解绑各种服务更换手机号码。今天在阿里小号 App 中出现了新的公告:<strong>暂停执行原业务调整计划,确保用户在当前阶段除续费外,能够继续正常使用阿里小号服务。</strong>@<a href=\"https://www.appinn.com/ali-xiaohao-continue-2025/\">Appinn</a></p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"1608\" height=\"700\" src=\"https://do-cdn.appinn.com/static3/images/2025/08/Copy-of-appinn-homework-2025-08-13T105210.852.jpg\" alt=\"阿里小号又不停止服务了:当前阶段可继续使用,不能续费 33\" class=\"wp-image-53254\" title=\"阿里小号又不停止服务了:当前阶段可继续使用,不能续费 33\" srcset=\"https://do-cdn.appinn.com/static3/images/2025/08/Copy-of-appinn-homework-2025-08-13T105210.852.jpg 1608w, https://do-cdn.appinn.com/static3/images/2025/08/Copy-of-appinn-homework-2025-08-13T105210.852-768x334.jpg 768w, https://do-cdn.appinn.com/static3/images/2025/08/Copy-of-appinn-homework-2025-08-13T105210.852-1536x669.jpg 1536w, https://do-cdn.appinn.com/static3/images/2025/08/Copy-of-appinn-homework-2025-08-13T105210.852-804x350.jpg 804w\" sizes=\"(max-width: 1608px) 100vw, 1608px\" /></figure>\n\n\n\n<p>感谢今天早上有同学过来说:</p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img decoding=\"async\" width=\"912\" height=\"388\" src=\"https://do-cdn.appinn.com/static3/images/2025/08/Screen-20250813103302@2x.avif\" alt=\"阿里小号又不停止服务了:当前阶段可继续使用,不能续费 34\" class=\"wp-image-53256\" style=\"width:504px;height:auto\" title=\"阿里小号又不停止服务了:当前阶段可继续使用,不能续费 34\" srcset=\"https://do-cdn.appinn.com/static3/images/2025/08/Screen-20250813103302@2x.avif 912w, https://do-cdn.appinn.com/static3/images/2025/08/Screen-20250813103302@2x-768x327.jpg 768w\" sizes=\"(max-width: 912px) 100vw, 912px\" /></figure>\n\n\n\n<h2 class=\"wp-block-heading\">核心内容</h2>\n\n\n\n<h3 class=\"wp-block-heading\">「确保用户在当前阶段除续费外,能够继续正常使用“阿里小号”服务。」</h3>\n\n\n\n<p>从这几句关键描述的字面意思来看,就是你在当前阶段能继续使用,然后不给续费了。但是这个当前阶段并没有明确的时间,是不是可以猜一下&#8230;能用到有效期截止?</p>\n\n\n\n<p>之前续费到2049年的同学,你们别哭了,青小蛙才能用到2028年&#8230;</p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"846\" height=\"338\" src=\"https://do-cdn.appinn.com/static3/images/2025/08/Screen-20250813111459@2x.avif\" alt=\"阿里小号又不停止服务了:当前阶段可继续使用,不能续费 35\" class=\"wp-image-53260\" title=\"阿里小号又不停止服务了:当前阶段可继续使用,不能续费 35\" srcset=\"https://do-cdn.appinn.com/static3/images/2025/08/Screen-20250813111459@2x.avif 846w, https://do-cdn.appinn.com/static3/images/2025/08/Screen-20250813111459@2x-768x307.jpg 768w\" sizes=\"(max-width: 846px) 100vw, 846px\" /></figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"1060\" height=\"320\" src=\"https://do-cdn.appinn.com/static3/images/2025/08/Screen-20250813111449@2x.avif\" alt=\"阿里小号又不停止服务了:当前阶段可继续使用,不能续费 36\" class=\"wp-image-53261\" title=\"阿里小号又不停止服务了:当前阶段可继续使用,不能续费 36\" srcset=\"https://do-cdn.appinn.com/static3/images/2025/08/Screen-20250813111449@2x.avif 1060w, https://do-cdn.appinn.com/static3/images/2025/08/Screen-20250813111449@2x-768x232.jpg 768w\" sizes=\"(max-width: 1060px) 100vw, 1060px\" /></figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"698\" height=\"340\" src=\"https://do-cdn.appinn.com/static3/images/2025/08/Screen-20250813111440@2x.avif\" alt=\"阿里小号又不停止服务了:当前阶段可继续使用,不能续费 37\" class=\"wp-image-53262\" title=\"阿里小号又不停止服务了:当前阶段可继续使用,不能续费 37\"></figure>\n\n\n\n<p><strong>这位 2049 年的同学,你快进来大笑三声!</strong></p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"/>\n\n\n\n<p>原文:https://www.appinn.com/ali-xiaohao-continue-2025/</p>\n\n\n\n<p>这个公告是这样的:</p>\n\n\n\n<h2 class=\"wp-block-heading\">关于“阿里小号”业务调整的最新公告</h2>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"1616\" height=\"1662\" src=\"https://do-cdn.appiLine truncated
"description": "半个月前,阿里通信官网确认:阿里小号将于2025年8月31日起陆续停止服务,当时所有的阿里小号用户被闹的人心惶惶,又是无力又是解绑各种服务更换手机号码。今天在阿里小号 App 中出现了新的公告:暂停执行原业务调整计划,确保用户在当前阶段除续费外,能够继续正常使用阿里小号服务。@Appinn 感谢今天 ",
"content": "\n<p>半个月前,<a href=\"https://www.appinn.com/ali-xiaohao-stop-2025/\" data-type=\"post\" data-id=\"53009\">阿里通信官网确认:阿里小号将于2025年8月31日起陆续停止服务</a>,当时所有的阿里小号用户被闹的人心惶惶,又是无力又是解绑各种服务更换手机号码。今天在阿里小号 App 中出现了新的公告:<strong>暂停执行原业务调整计划,确保用户在当前阶段除续费外,能够继续正常使用阿里小号服务。</strong>@<a href=\"https://www.appinn.com/ali-xiaohao-continue-2025/\">Appinn</a></p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"1608\" height=\"700\" src=\"https://do-cdn.appinn.com/static3/images/2025/08/Copy-of-appinn-homework-2025-08-13T105210.852.jpg\" alt=\"阿里小号又不停止服务了:当前阶段可继续使用,不能续费 37\" class=\"wp-image-53254\" title=\"阿里小号又不停止服务了:当前阶段可继续使用,不能续费 37\" srcset=\"https://do-cdn.appinn.com/static3/images/2025/08/Copy-of-appinn-homework-2025-08-13T105210.852.jpg 1608w, https://do-cdn.appinn.com/static3/images/2025/08/Copy-of-appinn-homework-2025-08-13T105210.852-768x334.jpg 768w, https://do-cdn.appinn.com/static3/images/2025/08/Copy-of-appinn-homework-2025-08-13T105210.852-1536x669.jpg 1536w, https://do-cdn.appinn.com/static3/images/2025/08/Copy-of-appinn-homework-2025-08-13T105210.852-804x350.jpg 804w\" sizes=\"(max-width: 1608px) 100vw, 1608px\" /></figure>\n\n\n\n<p>感谢今天早上有同学过来说:</p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img decoding=\"async\" width=\"912\" height=\"388\" src=\"https://do-cdn.appinn.com/static3/images/2025/08/Screen-20250813103302@2x.avif\" alt=\"阿里小号又不停止服务了:当前阶段可继续使用,不能续费 38\" class=\"wp-image-53256\" style=\"width:504px;height:auto\" title=\"阿里小号又不停止服务了:当前阶段可继续使用,不能续费 38\" srcset=\"https://do-cdn.appinn.com/static3/images/2025/08/Screen-20250813103302@2x.avif 912w, https://do-cdn.appinn.com/static3/images/2025/08/Screen-20250813103302@2x-768x327.jpg 768w\" sizes=\"(max-width: 912px) 100vw, 912px\" /></figure>\n\n\n\n<h2 class=\"wp-block-heading\">核心内容</h2>\n\n\n\n<h3 class=\"wp-block-heading\">「确保用户在当前阶段除续费外,能够继续正常使用“阿里小号”服务。」</h3>\n\n\n\n<p>从这几句关键描述的字面意思来看,就是你在当前阶段能继续使用,然后不给续费了。但是这个当前阶段并没有明确的时间,是不是可以猜一下&#8230;能用到有效期截止?</p>\n\n\n\n<p>之前续费到2049年的同学,你们别哭了,青小蛙才能用到2028年&#8230;</p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"846\" height=\"338\" src=\"https://do-cdn.appinn.com/static3/images/2025/08/Screen-20250813111459@2x.avif\" alt=\"阿里小号又不停止服务了:当前阶段可继续使用,不能续费 39\" class=\"wp-image-53260\" title=\"阿里小号又不停止服务了:当前阶段可继续使用,不能续费 39\" srcset=\"https://do-cdn.appinn.com/static3/images/2025/08/Screen-20250813111459@2x.avif 846w, https://do-cdn.appinn.com/static3/images/2025/08/Screen-20250813111459@2x-768x307.jpg 768w\" sizes=\"(max-width: 846px) 100vw, 846px\" /></figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"1060\" height=\"320\" src=\"https://do-cdn.appinn.com/static3/images/2025/08/Screen-20250813111449@2x.avif\" alt=\"阿里小号又不停止服务了:当前阶段可继续使用,不能续费 40\" class=\"wp-image-53261\" title=\"阿里小号又不停止服务了:当前阶段可继续使用,不能续费 40\" srcset=\"https://do-cdn.appinn.com/static3/images/2025/08/Screen-20250813111449@2x.avif 1060w, https://do-cdn.appinn.com/static3/images/2025/08/Screen-20250813111449@2x-768x232.jpg 768w\" sizes=\"(max-width: 1060px) 100vw, 1060px\" /></figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"698\" height=\"340\" src=\"https://do-cdn.appinn.com/static3/images/2025/08/Screen-20250813111440@2x.avif\" alt=\"阿里小号又不停止服务了:当前阶段可继续使用,不能续费 41\" class=\"wp-image-53262\" title=\"阿里小号又不停止服务了:当前阶段可继续使用,不能续费 41\"></figure>\n\n\n\n<p><strong>这位 2049 年的同学,你快进来大笑三声!</strong></p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"/>\n\n\n\n<p>原文:https://www.appinn.com/ali-xiaohao-continue-2025/</p>\n\n\n\n<p>这个公告是这样的:</p>\n\n\n\n<h2 class=\"wp-block-heading\">关于“阿里小号”业务调整的最新公告</h2>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"1616\" height=\"1662\" src=\"https://do-cdn.appiLine truncated
"category": "业界消息",
"link": "https://www.appinn.com/ali-xiaohao-continue-2025/",
"creator": "青小蛙",
@@ -2518,28 +2540,6 @@
"hash": "5604699566ecaf2ff527c864f6f416ba",
"highlights": []
},
{
"title": "One Million Screenshots – 这是真的!居然有人为 100 多万个网站截图,还放到了网上",
"description": "One Million Screenshots 说:我们渲染(截图)了超过 100 万个互联网热门主页。 这是一个挺离谱的网站。 打开这个链接会随机看到一个网页的截图 https://onemilli ",
"content": "\n<p><strong>One Million Screenshots</strong> 说:我们渲染(截图)了超过 100 万个互联网热门主页。</p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"804\" height=\"350\" src=\"https://do-cdn.appinn.com/static3/images/2025/08/Copy-of-appinn-homework-2025-08-11T175711.295.jpg\" alt=\"One Million Screenshots - 这是真的!居然有人为 100 多万个网站截图,还放到了网上 44\" class=\"wp-image-53236\" title=\"One Million Screenshots - 这是真的!居然有人为 100 多万个网站截图,还放到了网上 44\" srcset=\"https://do-cdn.appinn.com/static3/images/2025/08/Copy-of-appinn-homework-2025-08-11T175711.295.jpg 804w, https://do-cdn.appinn.com/static3/images/2025/08/Copy-of-appinn-homework-2025-08-11T175711.295-768x334.jpg 768w\" sizes=\"(max-width: 804px) 100vw, 804px\" /></figure>\n\n\n\n<p>这是一个挺离谱的网站。</p>\n\n\n\n<p>打开<a href=\"https://onemillionscreenshots.com/?q=random\" target=\"_blank\" rel=\"noopener\">这个链接</a>会随机看到一个网页的截图</p>\n\n\n\n<p><code>https://onemillionscreenshots.com/?q=random</code></p>\n\n\n\n<p>打开<a href=\"https://onemillionscreenshots.com/?q=appinn.com\" target=\"_blank\" rel=\"noopener\">这个链接</a>,会直接打开 appinn.com 网站的截图。</p>\n\n\n\n<p><code>https://onemillionscreenshots.com/?q=appinn.com</code></p>\n\n\n\n<p>甚至,他们还有 API 可以直接显示图片:</p>\n\n\n\n<p><code>&lt;img src=\"https://screenshotof.com/appinn.com\" /&gt;</code></p>\n\n\n\n<p>效果是这样的:</p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https://screenshotof.com/appinn.com\" alt=\"One Million Screenshots - 这是真的!居然有人为 100 多万个网站截图,还放到了网上 45\" title=\"One Million Screenshots - 这是真的!居然有人为 100 多万个网站截图,还放到了网上 45\"></figure>\n\n\n\n<p>你可以<a href=\"https://onemillionscreenshots.com/add\" target=\"_blank\" rel=\"noopener\">添加自己</a>的网站,不过是等待列表,不会立即加入</p>\n\n\n\n<p>另外,每一个网站都有一些相关信息,比如<a href=\"https://onemillionscreenshots.com/appinn.com\" target=\"_blank\" rel=\"noopener\">从这里</a>,可以看到:</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>相似的颜色</li>\n\n\n\n<li>相似的标题</li>\n\n\n\n<li>相似的描述</li>\n\n\n\n<li>相似的样式等等</li>\n</ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"1086\" height=\"559\" src=\"https://do-cdn.appinn.com/static3/images/2025/08/Screen-20250811195922@2x.avif\" alt=\"One Million Screenshots - 这是真的!居然有人为 100 多万个网站截图,还放到了网上 46\" class=\"wp-image-53239\" title=\"One Million Screenshots - 这是真的!居然有人为 100 多万个网站截图,还放到了网上 46\" srcset=\"https://do-cdn.appinn.com/static3/images/2025/08/Screen-20250811195922@2x.avif 1086w, https://do-cdn.appinn.com/static3/images/2025/08/Screen-20250811195922@2x-768x395.jpg 768w\" sizes=\"(max-width: 1086px) 100vw, 1086px\" /></figure>\n\n\n\n<p>以及历史截图、站点数据。</p>\n\n\n\n<p>青小蛙看到 appinn.com 最早的截图来自2024年1月,一个月一张。</p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"/>\n\n\n\n<p>以下为 One Million Screenshots 的 Q&amp;A:</p>\n\n\n\n<h2 class=\"wp-block-heading\">这是什么?</h2>\n\n\n\n<p>它是 1,048,576 个主页屏幕截图的集合,你可以一直放大。这是一种探索网络的奇怪而美妙的方式。它也是一个免费的 <a href=\"https://onemillionscreenshots.com/docs\" target=\"_blank\" rel=\"noopener\">API</a>,用于将网站屏幕截图嵌入到您自己的项目中。</p>\n\n\n\n<h2 class=\"wp-block-heading\">为什么存在?</h2>\n\n\n\n<p>我们想庆祝 Urlbox 在 2023 年为客户截取超过 1 亿张屏幕截图……所以我们认为每个月多拍 1,048,576 张屏幕截图会很有趣……我们有没有提到我们真的很喜欢屏幕截图。</p>\n\n\n\n<h2 class=\"wp-block-heading\">它是如何制作的?</h2>\n\n\n\n<p>该站点是使用 Next.js 和 Leaflet.js 制作的,并部署到 Cloudflare。屏幕截图是用 Urlbox 拍摄的。后期处理是在 Hatchbox 上运行的 Ruby 和 Vips 完成的。</p>\n\n\n\n<h2 class=\"wp-block-heading\">它是什么时候制作的?</h2>\n\n\n\n<p>我们于 2024 年 1 月 1 日开始为此截取屏幕截图。此后,我们在每个月的第一天都会截取更多屏幕截图。界面和后期处理作为一个副项目随着时间的推移而发展。</p>\n\n\n\n<h2 class=\"wp-block-heading\">如何选择截图的网站?</h2>\n\n\n\n<p>我们目前使用<a href=\"https://commoncrawl.org/web-graphs\" target=\"_blank\" rel=\"noopener\">通用爬虫网络图</a>中按页面排名靠前的网站。排名最高的网站Line truncated
"category": "在线应用",
"link": "https://www.appinn.com/one-million-screenshots/",
"creator": "青小蛙",
"pubDate": "Mon, 11 Aug 2025 13:01:31 +0000",
"enclosure": "",
"enclosureType": "",
"image": "",
"id": "",
"language": "zh",
"folder": "资讯",
"feed": "小众软件",
"read": false,
"favorite": false,
"created": false,
"tags": [],
"hash": "ee0eeaae18bea8fd22c66976a92011cc",
"highlights": []
},
{
"title": "China urges U.S. to abandon excessive use of national security concept",
"description": "<div><div><p>BEIJING, June 5 (Xinhua) -- China has urged the United States to abandon its generalized and excessive use of the national security concept, and to collaborate with all parties in maintaining a rules-based multilateral trading system, the Ministry of Commerce said on Thursday.</p> <p>At a regular press conference, He Yongqian, spokesperson for the ministry, made the remarks when asked to comment on the U.S. decision to raise tariffs on imported steel, aluminium and their derivative products from 25 percent to 50 percent.</p> <p>He said that such U.S. moves not only harm others and itself, but also will severely disrupt the stability of global industrial and supply chains.</p> <p>The United States should abandon the zero-sum mentality, address respective concerns through equal dialogue, and jointly maintain the stability of global industrial and supply chains, He said. </p><p id='org_name'>Source: Xinhua</p></div></div>",
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1
View File
@@ -0,0 +1 @@
{"config":"simpread_config.json","host":"localhost","port":"7027","count":"0","override":true,"folder":"SimpRead","path":"<与同步助手的同步文件夹路径保持一致> ","annote":false,"frequency":-1,"tag_prefix":"[[","tag_suffix":"]] ","format":"{\"headingStyle\":\"atx\",\"hr\":\"---\",\"bulletListMarker\":\"-\"}","ext_uri":"","title":"{{id}}-{{title}}{{mode}}","template":"---\ntitle: \"{{title}}\"\nalias: \n<% if ( unread.note && unread.title != unread.note ) { %> - \"{{note}}\"\n<% } %> - \"{{title}}\"\ncreated-date: {{create|yyyy-mm-dd'T'HH:MM:sso}}\ntype: Simpread\n<% if (unread.img) { %>banner: \"<%- unread.img %> \"\nbanner_icon: 🔖\n<% } -%>\ntag: {{ |tag| | }}\nidx: {{idx}}\n---\n\n# {{title}}\n<%\nlet ifURI = \"http://localhost:7026/unread/\"+unread.idx\n%>\n> [!example]- [🧷内部链接](<<%= ifURI %>>) [🌐外部链接](<<%= unread.url %>>) \n> URI:: [🧷](<<%= ifURI %>>) [🌐](<<%= unread.url %>>) \n> intURI:: [🧷内部链接](<{{int_uri}}>)\n\n%%\n> [!example]+ **Comments** \n> ```dataview\n> TABLE \n> WITHOUT ID\n> link(Source, dateformat(date(Source), \"yyyy-MM-dd\")) as Date___, \n> regexreplace(rows.Comments,\"^@@\\[\\[.+?\\]\\]\\s\",\"\") as \"Comments\"\n> FROM \"journals\"\n> WHERE contains(cmnt, this.file.name)\n> FLATTEN cmnt as Comments\n> WHERE contains(Comments, this.file.name)\n> GROUP BY file.link as Source\n> SORT rows.file.day desc\n> ```\n> **Description**:: {{desc}}\n%%\n\n> [!md] Metadata \n> **标题**:: [{{title}}]({{url}}) \n> **日期**:: [[{{create|yyyy-mm-dd}}]] \n<% if ( unread.annotations && unread.annotations.length > 0 ) { %>\n## Annotations\n\n{{annotations}}\n<% } -%>\n<% if ( unread.tags && unread.tags.includes('Highlights') ) { %>\n![[<%% tp.file.title %>_mentions#Highlight Mentions]]\n<% } -%>\n<% if ( unread.refs ) { %>\n## Reference \n{{-|refs}} \n<% } %> ","annotation":"<%\nlet colors = [ '#B4D9FB', '#ffeb3b', '#a2e9f2', '#a1e0ff', '#a8ea68', '#ffb7da' ],\n color = colors[ annote.color ];\nlet chls = [ 'srhl1', 'srhl2', 'srhl3', 'srhl4', 'srhl5', 'srhl6' ],\n chl = chls[ annote.color ];\nlet iframeURI = \"http://localhost:7026/unread/\"+unread.idx+\"#id=\"+annote.id\nlet intURL = \"http://localhost:7026/reading/\"+unread.idx+\"#id=\"+annote.id\nif (unread.note && unread.title != unread.note) {\nvar filetitle = unread.note;\n}\nelse {\nvar filetitle = unread.title;\n}\nlet wikilinks = \"[[SR\" + unread.idx + \"@\" + filetitle + \"|📄]]\";\n-%>\n<% if (annote.note.startsWith(\"######\")) { %>\n<% \nlet note = annote.note.slice(7);\n-%>\n###### <% if (note) { %><%- note %><% } else { %>{{an_text}}<% } %>\n<% } else if (annote.note.startsWith(\"######\")) { %>\n<% \nlet note = annote.note.slice(6);\n-%>\n###### <% if (note) { %><%- note %><% } else { %>{{an_text}}<% } %>\n<% } else if (annote.note.startsWith(\"####\")) { %>\n<% \nlet note = annote.note.slice(5);\n-%>\n#### <% if (note) { %><%- note %><% } else { %>{{an_text}}<% } %>\n<% } else if (annote.note.startsWith(\"###\")) { %>\n<% \nlet note = annote.note.slice(4);\n-%>\n### <% if (note) { %><%- note %><% } else { %>{{an_text}}<% } %>\n<% } else { %>\n> [!<%= chl %>] <%- wikilinks %> <mark style=\"background-color: <%= color %>\">Highlights</mark> [🧷](<<%= iframeURI %>>) [🌐](<<%= intURL %>>) {{#|an_tag| }} \n{{{html_format|>|{{an_html}}}}}\n<% if (annote.refs) { -%>\n{{> - 🔗|an_refs}}\n<% } -%>\n<% if (annote.note) { -%>\n<% if (annote.note.startsWith(\"todo:\") == false && annote.note.startsWith(\"done:\") == false) { -%>\n> \n> - 📝{{an_note}}\n> ^sran-{{an_id}}\n<% } else { -%>\n<% \nlet note = annote.note.slice(6);\nif (annote.note.startsWith(\"todo:\")) {\n var taskStatus = \" \"; }\n else {\n var taskStatus = \"x\";\n}\n-%>\n> ^sran-{{an_id}}\n\n- [<%= taskStatus %>] <%- note %> #web ^srtask-{{an_id}}\n<% } -%>\n<% } else { -%>\n> ^sran-{{an_id}}\n<% } -%>\n<% } -%> "}
+1104
View File
File diff suppressed because it is too large. Load diff
+10
View File
@@ -0,0 +1,10 @@
{
"id": "simpread",
"name": "SimpRead Sync",
"version": "2.1.1",
"minAppVersion": "0.12.10",
"description": "Auto sync SimpRead unreader",
"author": "Kenshin",
"authorUrl": "http://simpread.pro/",
"isDesktopOnly": true
}
+10
View File
@@ -0,0 +1,10 @@
{
"id": "simpread",
"name": "SimpRead Sync",
"version": "2.0.0.509-beta1",
"minAppVersion": "0.12.10",
"description": "Auto sync SimpRead unreader",
"author": "Kenshin",
"authorUrl": "http://simpread.pro/",
"isDesktopOnly": true
}
+3 -3
View File
@@ -275,6 +275,7 @@
},
"left-ribbon": {
"hiddenItems": {
"bases:创建新数据库": false,
"switcher:打开快速切换": false,
"graph:查看关系图谱": true,
"canvas:新建白板": false,
@@ -297,7 +298,6 @@
"obsidian-importer:Open Importer": false,
"copilot:Open Copilot Chat": false,
"DEVONlink-obsidian:DEVONlink": false,
"periodic-notes:Open today": false,
"memos-ai-sync:Sync Memos": false,
"translate:Open translation view": false,
"obsidian-calibre-plugin:Calibre": false,
@@ -306,12 +306,12 @@
"diary-ics:日记日历订阅": false,
"cubox-sync:Cubox": false,
"file-tree-alternative:File Tree Alternative Plugin": false,
"hidden-folder-obsidian:隐藏文件夹": false,
"password-protection:开启密码保护": false,
"soundscapes:Soundscapes: My Music": false,
"sheet-plus:创建 Excel 文件": false,
"wucai-highlights-official:Start WuCai syncing": false,
"note-to-mp:复制到公众号": false
"note-to-mp:复制到公众号": false,
"periodic-notes:Open today": false
}
},
"active": "b7e2a0f4d5eba7df",