diff --git a/.obsidian/plugins/cron/data.json b/.obsidian/plugins/cron/data.json index 22f80d11..9ab4cba5 100644 --- a/.obsidian/plugins/cron/data.json +++ b/.obsidian/plugins/cron/data.json @@ -19,7 +19,7 @@ "601d1cc7-a4f3-4f19-aa9f-3bddd7ab6b1d": { "locked": false, "lockedDeviceName": "iPhone", - "lastRun": "2023-12-04T07:46:01+01:00" + "lastRun": "2023-12-09T08:29:13+01:00" } } } \ No newline at end of file diff --git a/.obsidian/plugins/emoji-shortcodes/data.json b/.obsidian/plugins/emoji-shortcodes/data.json index 2df6ddc5..a7c3d624 100644 --- a/.obsidian/plugins/emoji-shortcodes/data.json +++ b/.obsidian/plugins/emoji-shortcodes/data.json @@ -5,13 +5,13 @@ "historyLimit": 100, "history": [ ":fork_and_knife:", + ":tv:", ":plate_with_cutlery:", ":book:", ":ski:", ":salt:", ":blue_car:", ":train2:", - ":tv:", ":medical_symbol:", ":minidisc:", ":bread:", diff --git a/.obsidian/plugins/obsidian-activity-history/data.json b/.obsidian/plugins/obsidian-activity-history/data.json index 01a185a5..40dd5df9 100644 --- a/.obsidian/plugins/obsidian-activity-history/data.json +++ b/.obsidian/plugins/obsidian-activity-history/data.json @@ -12,8 +12,8 @@ "checkpointList": [ { "path": "/", - "date": "2023-12-04", - "size": 19727666 + "date": "2023-12-09", + "size": 19746495 } ], "activityHistory": [ @@ -2787,6 +2787,26 @@ { "date": "2023-12-04", "value": 131968 + }, + { + "date": "2023-12-05", + "value": 1851 + }, + { + "date": "2023-12-06", + "value": 8189 + }, + { + "date": "2023-12-07", + "value": 2515 + }, + { + "date": "2023-12-08", + "value": 4525 + }, + { + "date": "2023-12-09", + "value": 8335 } ] } diff --git a/.obsidian/plugins/obsidian-commits/data.json b/.obsidian/plugins/obsidian-commits/data.json index 6a31cf4e..4f527f76 100644 --- a/.obsidian/plugins/obsidian-commits/data.json +++ b/.obsidian/plugins/obsidian-commits/data.json @@ -1250,7 +1250,7 @@ "links": 9 }, "01.03 Family/Pierre Bédier.md": { - "size": 1938, + "size": 2154, "tags": 4, "links": 7 }, @@ -1295,7 +1295,7 @@ "links": 11 }, "01.03 Family/Eustache Bédier.md": { - "size": 1834, + "size": 2056, "tags": 3, "links": 6 }, @@ -1520,7 +1520,7 @@ "links": 18 }, "05.02 Networks/Configuring UFW.md": { - "size": 16141, + "size": 18073, "tags": 2, "links": 7 }, @@ -1570,7 +1570,7 @@ "links": 1 }, "01.02 Home/Household.md": { - "size": 2036, + "size": 2284, "tags": 2, "links": 2 }, @@ -4090,7 +4090,7 @@ "links": 4 }, "00.08 Bookmarks/Bookmarks - Mac applications.md": { - "size": 2458, + "size": 2806, "tags": 1, "links": 4 }, @@ -10834,11 +10834,6 @@ "tags": 0, "links": 7 }, - "00.01 Admin/Calendars/Events/2024-06-08 💍 Mariage Rémi & Séverine.md": { - "size": 280, - "tags": 0, - "links": 1 - }, "00.03 News/America’s Surprising Partisan Divide on Life Expectancy.md": { "size": 24555, "tags": 3, @@ -11332,7 +11327,7 @@ "00.03 News/Bill Watterson’s Life After “Calvin and Hobbes”.md": { "size": 17592, "tags": 4, - "links": 1 + "links": 2 }, "00.03 News/They Cracked the Code to a Locked USB Drive Worth $235 Million in Bitcoin. Then It Got Weird.md": { "size": 16293, @@ -11497,7 +11492,7 @@ "00.03 News/How Does the World’s Largest Hedge Fund Really Make Its Money.md": { "size": 30586, "tags": 3, - "links": 1 + "links": 2 }, "00.03 News/The Tunnels of Gaza.md": { "size": 6575, @@ -11507,7 +11502,7 @@ "00.03 News/What Really Happened to JFK.md": { "size": 55244, "tags": 4, - "links": 1 + "links": 2 }, "00.03 News/‘The good guys don’t always win’ Salman Rushdie on peace, Barbie and what freedom cost him.md": { "size": 14885, @@ -11577,7 +11572,7 @@ "00.03 News/A Coder Considers the Waning Days of the Craft.md": { "size": 27803, "tags": 3, - "links": 1 + "links": 2 }, "00.03 News/Inside an OnlyFans empire Sex, influence and the new American Dream.md": { "size": 38713, @@ -11592,7 +11587,7 @@ "00.03 News/Chasing Chop Suey Tracing Chinese Immigration Through Food.md": { "size": 38105, "tags": 4, - "links": 1 + "links": 2 }, "03.01 Reading list/Consent.md": { "size": 995, @@ -11733,58 +11728,127 @@ "size": 9577, "tags": 4, "links": 1 + }, + "00.01 Admin/Calendars/2023-12-05.md": { + "size": 1260, + "tags": 0, + "links": 4 + }, + "00.01 Admin/Calendars/2023-12-06.md": { + "size": 1412, + "tags": 0, + "links": 4 + }, + "03.02 Travels/Wo Hop.md": { + "size": 1516, + "tags": 2, + "links": 3 + }, + "03.02 Travels/Bonnie's.md": { + "size": 1554, + "tags": 2, + "links": 3 + }, + "03.02 Travels/Potluck Club.md": { + "size": 1537, + "tags": 2, + "links": 3 + }, + "00.01 Admin/Calendars/2023-12-07.md": { + "size": 1412, + "tags": 0, + "links": 6 + }, + "03.04 Cinematheque/Serpico (1973).md": { + "size": 2048, + "tags": 0, + "links": 1 + }, + "00.01 Admin/Calendars/2023-12-08.md": { + "size": 1412, + "tags": 0, + "links": 7 + }, + "03.04 Cinematheque/Barbie (2023).md": { + "size": 2048, + "tags": 0, + "links": 1 + }, + "00.01 Admin/Calendars/2023-12-09.md": { + "size": 1619, + "tags": 0, + "links": 9 + }, + "03.04 Cinematheque/The Magnificent Seven (1960).md": { + "size": 2052, + "tags": 0, + "links": 1 + }, + "03.04 Cinematheque/Tschugger (2021–).md": { + "size": 2691, + "tags": 0, + "links": 1 } }, "commitTypes": { "/": { - "Refactor": 6256, - "Create": 2180, - "Link": 8378, - "Expand": 1904 + "Refactor": 6265, + "Create": 2192, + "Link": 8408, + "Expand": 1913 } }, "dailyCommits": { "/": { - "0": 182, + "0": 185, "1": 39, - "2": 29, + "2": 30, "3": 12, "4": 17, - "5": 14, + "5": 15, "6": 69, "7": 815, - "8": 1066, - "9": 983, - "10": 669, - "11": 509, + "8": 1072, + "9": 990, + "10": 694, + "11": 513, "12": 6660, - "13": 566, - "14": 519, - "15": 548, + "13": 567, + "14": 520, + "15": 553, "16": 641, "17": 736, - "18": 882, + "18": 883, "19": 631, "20": 636, "21": 632, - "22": 591, - "23": 1272 + "22": 593, + "23": 1275 } }, "weeklyCommits": { "/": { "Mon": 2695, - "Tue": 1593, - "Wed": 7700, - "Thu": 1113, - "Fri": 1195, + "Tue": 1597, + "Wed": 7724, + "Thu": 1120, + "Fri": 1206, "Sat": 0, - "Sun": 4422 + "Sun": 4436 } }, "recentCommits": { "/": { "Expanded": [ + " 2023-12-09 ", + " Configuring UFW ", + " Bookmarks - Mac applications ", + " Eustache Bédier ", + " Pierre Bédier ", + " Bonnie's ", + " Potluck Club ", + " Wo Hop ", + " Household ", " Marc de Villeneuve ", " Martin Eden ", " Grindelwald ", @@ -11826,18 +11890,21 @@ " 2023-11-03 ⚽️ PSG - Montpellier ", " Mémoires de Léonard ", " Mémoires de Léonard ", - " 2023-11-02 ", - " Vinyls ", - " Vinyls ", - " Blanc de Noir - Nadine Saxer ", - " Baillotte ", - " Life mementos ", - " Life - Practical infos ", - " Ski Rental Zürich ", - " Les Disques du Yeti ", - " 2023-10-29 ⚽️ Brest 29 - PSG " + " 2023-11-02 " ], "Created": [ + " Tschugger (2021–) ", + " The Magnificent Seven (1960) ", + " 2023-12-09 ", + " Barbie (2023) ", + " 2023-12-08 ", + " Serpico (1973) ", + " 2023-12-07 ", + " Untitled ", + " Untitled ", + " Untitled ", + " 2023-12-06 ", + " 2023-12-05 ", " C.T.E. Study Finds That Young Football Players Are Getting the Disease ", " Inside Foxconn’s struggle to make iPhones in India ", " The Plight of the Oldest Sister ", @@ -11876,21 +11943,16 @@ " 2023-11-17 ", " The Quick and the Dead (1995) ", " 2023-11-16 ", - " 2023-11-15 ", - " 2023-11-14 ", - " 2023-11-13 ", - " They Tried to Expose Louisiana Judges Who Had Systematically Ignored Prisoners’ Petitions. No One Listened. ", - " ‘The good guys don’t always win’ Salman Rushdie on peace, Barbie and what freedom cost him ", - " What Really Happened to JFK ", - " The Tunnels of Gaza ", - " How Does the World’s Largest Hedge Fund Really Make Its Money ", - " A School of Their Own ", - " 2023-11-12 ", - " 2023-11-11 Stade Reims - PSG ", - " Untitled ", - " 2023-11-11 " + " 2023-11-15 " ], "Renamed": [ + " Tschugger (2021–) ", + " The Magnificent Seven (1960) ", + " Barbie (2023) ", + " Serpico (1973) ", + " Potluck Club ", + " Bonnie's ", + " Wo Hop ", " C.T.E. Study Finds That Young Football Players Are Getting the Disease ", " Inside Foxconn’s struggle to make iPhones in India ", " The Plight of the Oldest Sister ", @@ -11934,16 +11996,12 @@ " Babysitter ", " Blanc de Noir - Nadine Saxer ", " Baillotte ", - " Ski Rental Zürich ", - " Les Disques du Yeti ", - " 2023-10-29 ⚽️ Brest 29 - PSG (2-3) ", - " They Cracked the Code to a Locked USB Drive Worth $235 Million in Bitcoin. Then It Got Weird ", - " Bill Watterson’s Life After “Calvin and Hobbes” ", - " The Evolutionary Reasons We Are Drawn to Horror Movies and Haunted Houses ", - " How workers remove toxic debris and ash after Hawaii wildfires ", - " Vinyls " + " Ski Rental Zürich " ], "Tagged": [ + " Bonnie's ", + " Potluck Club ", + " Wo Hop ", " C.T.E. Study Finds That Young Football Players Are Getting the Disease ", " Midlife isn't a crisis, but sleep, stress and happiness feel a little different after 35 – or whenever middle age actually begins ", " The Plight of the Oldest Sister ", @@ -11991,12 +12049,10 @@ " The Crimes Behind the Seafood You Eat ", " Baur au Lac ", " Orcas are learning terrifying new behaviors. Are they getting smarter ", - " La Prochaine Fois que tu Mordras la Poussière ", - " The Crimes Behind the Seafood You Eat ", - " How a Sexual Assault Case in St. John’s Exposed a Police Force’s Predatory Culture ", - " How a Sexual Assault Case in St. John’s Exposed a Police Force’s Predatory Culture " + " La Prochaine Fois que tu Mordras la Poussière " ], "Refactored": [ + " 2023-12-05 ", " Skiing in Switzerland ", " 2023-12-03 ", " Household ", @@ -12046,10 +12102,10 @@ " Mallorca ", " Household ", " 2023-04-15 ", - " Storage and Syncing ", - " Korean Barbecue-Style Meatballs Recipe " + " Storage and Syncing " ], "Deleted": [ + " 2024-06-08 💍 Mariage Rémi & Séverine ", " Novembre (2020) ", " Blanc de Noir - Nadine Saxer ", " Actual Life 2 Piano (February 2 - October 15 2021) (by Fred again - 2022) ", @@ -12099,10 +12155,36 @@ " The Lord of the Rings - The Fellowship of the Ring (2001) 1 ", " Pork and Kimchi Dumplings ", " Providores ", - " Casita Andina ", - " Le Ballroom du Beef Club " + " Casita Andina " ], "Linked": [ + " 2023-12-09 ", + " Tschugger (2021–) ", + " 2023-12-09 ", + " 2023-12-09 ", + " 2023-12-09 ", + " The Magnificent Seven (1960) ", + " 2023-12-08 ", + " Barbie (2023) ", + " 2023-12-08 ", + " 2023-12-08 ", + " 2023-12-08 ", + " 2023-12-07 ", + " Serpico (1973) ", + " 2023-12-07 ", + " Bill Watterson’s Life After “Calvin and Hobbes” ", + " What Really Happened to JFK ", + " How Does the World’s Largest Hedge Fund Really Make Its Money ", + " A Coder Considers the Waning Days of the Craft ", + " Bonnie's ", + " Potluck Club ", + " Bonnie's ", + " Potluck Club ", + " Wo Hop ", + " Wo Hop ", + " Chasing Chop Suey Tracing Chinese Immigration Through Food ", + " 2023-12-06 ", + " 2023-12-05 ", " 2023-12-04 ", " C.T.E. Study Finds That Young Football Players Are Getting the Disease ", " Inside Foxconn’s struggle to make iPhones in India ", @@ -12126,34 +12208,7 @@ " 2023-11-30 ", " 2023-11-29 ", " 2023-11-29 ", - " 2023-11-28 ", - " 2023-11-28 ", - " 2023-11-27 ", - " 2023-11-26 ", - " 2023-11-25 ", - " 2023-11-26 ", - " 2023-11-23 ", - " 2023-11-25 ", - " 2023-11-24 ", - " 2023-11-24 ⚽️ PSG - AS Monaco ", - " 2023-11-24 ", - " The librarian who couldn’t take it anymore ", - " Inside an OnlyFans empire Sex, influence and the new American Dream ", - " 2023-11-24 ", - " 2023-11-23 ", - " 2023-11-23 ", - " In the Realm of the Senses (1976) ", - " 2023-11-23 ", - " 2023-11-22 ", - " 2023-11-22 ", - " 2022-07-06 ", - " 2023-11-21 ", - " La Familia Grande ", - " 2023-11-21 ", - " 2023-11-21 ", - " 2023-11-20 ", - " Martin Scorsese on Making “Killers of the Flower Moon” ", - " 2023-11-19 " + " 2023-11-28 " ], "Removed Tags from": [ " The Miseducation of Maria Montessori ", diff --git a/.obsidian/plugins/obsidian-reminder-plugin/data.json b/.obsidian/plugins/obsidian-reminder-plugin/data.json index d0ca8367..a2bef7fd 100644 --- a/.obsidian/plugins/obsidian-reminder-plugin/data.json +++ b/.obsidian/plugins/obsidian-reminder-plugin/data.json @@ -243,7 +243,7 @@ "01.03 Family/Pierre Bédier.md": [ { "title": ":birthday: **[[Pierre Bédier|Bon Papa]]** %%done_del%%", - "time": "2023-12-07", + "time": "2024-12-07", "rowNumber": 106 } ], @@ -334,45 +334,45 @@ "01.03 Family/Eustache Bédier.md": [ { "title": ":birthday: **[[Eustache Bédier|Eustache]]** %%done_del%%", - "time": "2023-12-08", + "time": "2024-12-08", "rowNumber": 105 } ], "01.02 Home/Household.md": [ { - "title": "♻ [[Household]]: *Paper* recycling collection %%done_del%%", - "time": "2023-12-05", - "rowNumber": 75 + "title": "♻ [[Household]]: *Cardboard* recycling collection %%done_del%%", + "time": "2023-12-12", + "rowNumber": 77 }, { - "title": ":bed: [[Household]] Change bedsheets %%done_del%%", - "time": "2023-12-09", - "rowNumber": 86 + "title": "🛎 🧻 REMINDER [[Household]]: check need for toilet paper %%done_del%%", + "time": "2023-12-18", + "rowNumber": 85 }, { - "title": "🛎 🧻 REMINDER [[Household]]: check need for toilet paper %%done_del%%", - "time": "2023-12-11", - "rowNumber": 84 + "title": "♻ [[Household]]: *Paper* recycling collection %%done_del%%", + "time": "2023-12-19", + "rowNumber": 75 }, { - "title": "♻ [[Household]]: *Cardboard* recycling collection %%done_del%%", - "time": "2023-12-12", - "rowNumber": 76 + "title": ":bed: [[Household]] Change bedsheets %%done_del%%", + "time": "2023-12-23", + "rowNumber": 88 }, { "title": "🛎️ :house: [[Household]]: Pay rent %%done_del%%", "time": "2023-12-31", - "rowNumber": 83 + "rowNumber": 84 }, { "title": ":blue_car: [[Household]]: Change to Summer tyres %%done_del%%", "time": "2024-04-15", - "rowNumber": 92 + "rowNumber": 95 }, { "title": ":blue_car: [[Household]]: Change to Winter tyres %%done_del%%", "time": "2024-10-15", - "rowNumber": 93 + "rowNumber": 96 } ], "01.03 Family/Pia Bousquié.md": [ @@ -441,27 +441,27 @@ } ], "06.02 Investments/Crypto Tasks.md": [ - { - "title": ":ballot_box: [[Crypto Tasks]]: Vote for [[EOS]] block producers %%done_del%%", - "time": "2023-12-05", - "rowNumber": 72 - }, { "title": ":chart: Check [[Nimbus]] earnings %%done_del%%", "time": "2023-12-11", - "rowNumber": 84 + "rowNumber": 85 + }, + { + "title": ":ballot_box: [[Crypto Tasks]]: Vote for [[EOS]] block producers %%done_del%%", + "time": "2024-01-02", + "rowNumber": 72 } ], "05.02 Networks/Configuring UFW.md": [ { "title": "🖥 [[Selfhosting]], [[Configuring UFW|Firewall]] Get IP addresses caught by Postfix %%done_del%%", - "time": "2023-12-09", + "time": "2023-12-16", "rowNumber": 239 }, { "title": "🖥 [[Selfhosting]], [[Configuring UFW|Firewall]]: Update the Blocked IP list %%done_del%%", - "time": "2023-12-09", - "rowNumber": 286 + "time": "2023-12-16", + "rowNumber": 287 } ], "01.03 Family/Amélie Solanet.md": [ @@ -516,7 +516,7 @@ "00.08 Bookmarks/Bookmarks - Mac applications.md": [ { "title": ":label: [[Bookmarks - Mac applications]]: review bookmarks", - "time": "2023-12-09", + "time": "2024-03-09", "rowNumber": 94 } ], @@ -639,7 +639,7 @@ "01.07 Animals/@Sally.md": [ { "title": ":racehorse: [[@Sally|Sally]]: Pay for horseshoes (150 CHF) %%done_del%%", - "time": "2023-12-10", + "time": "2024-01-10", "rowNumber": 140 }, { @@ -811,6 +811,23 @@ "time": "2023-12-30", "rowNumber": 104 } + ], + "00.01 Admin/Calendars/2023-12-09.md": [ + { + "title": "15:18 :train2: [[@Life Admin|Admin]]: Buy train tickets for Paris", + "time": "2023-12-15", + "rowNumber": 105 + }, + { + "title": "13:58 :family: [[Amaury de Villeneuve]]: Buy a set of knives for Xmas", + "time": "2023-12-21", + "rowNumber": 103 + }, + { + "title": "15:16 :handshake: [[@Lifestyle|Social]]: Buy a Xmas gift for Pam", + "time": "2023-12-27", + "rowNumber": 104 + } ] }, "debug": false, diff --git a/.obsidian/plugins/obsidian42-brat/main.js b/.obsidian/plugins/obsidian42-brat/main.js index 70424eb3..f73c3a9f 100644 --- a/.obsidian/plugins/obsidian42-brat/main.js +++ b/.obsidian/plugins/obsidian42-brat/main.js @@ -1,3 +1,4 @@ +"use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; @@ -669,21 +670,24 @@ var grabReleaseFileFromRepository = async (repository, version, fileName, debugL } }; var grabManifestJsonFromRepository = async (repositoryPath, rootManifest = true, debugLogging = true) => { - const manifestJsonPath = GITHUB_RAW_USERCONTENT_PATH + repositoryPath + (rootManifest === true ? "/HEAD/manifest.json" : "/HEAD/manifest-beta.json"); + const manifestJsonPath = GITHUB_RAW_USERCONTENT_PATH + repositoryPath + (rootManifest ? "/HEAD/manifest.json" : "/HEAD/manifest-beta.json"); try { const response = await (0, import_obsidian.request)({ url: manifestJsonPath }); return response === "404: Not Found" ? null : await JSON.parse(response); } catch (error) { - if (error != "Error: Request failed, status 404" && debugLogging) { - console.log(`error in grabManifestJsonFromRepository for ${manifestJsonPath}`, error); + if (error !== "Error: Request failed, status 404" && debugLogging) { + console.log( + `error in grabManifestJsonFromRepository for ${manifestJsonPath}`, + error + ); } return null; } }; var grabCommmunityPluginList = async (debugLogging = true) => { - const pluginListURL = `https://raw.githubusercontent.com/obsidianmd/obsidian-releases/HEAD/community-plugins.json`; + const pluginListUrl = `https://raw.githubusercontent.com/obsidianmd/obsidian-releases/HEAD/community-plugins.json`; try { - const response = await (0, import_obsidian.request)({ url: pluginListURL }); + const response = await (0, import_obsidian.request)({ url: pluginListUrl }); return response === "404: Not Found" ? null : await JSON.parse(response); } catch (error) { if (debugLogging) @@ -692,9 +696,9 @@ var grabCommmunityPluginList = async (debugLogging = true) => { } }; var grabCommmunityThemesList = async (debugLogging = true) => { - const themesURL = `https://raw.githubusercontent.com/obsidianmd/obsidian-releases/HEAD/community-css-themes.json`; + const themesUrl = `https://raw.githubusercontent.com/obsidianmd/obsidian-releases/HEAD/community-css-themes.json`; try { - const response = await (0, import_obsidian.request)({ url: themesURL }); + const response = await (0, import_obsidian.request)({ url: themesUrl }); return response === "404: Not Found" ? null : await JSON.parse(response); } catch (error) { if (debugLogging) @@ -703,9 +707,9 @@ var grabCommmunityThemesList = async (debugLogging = true) => { } }; var grabCommmunityThemeCssFile = async (repositoryPath, betaVersion = false, debugLogging) => { - const themesURL = `https://raw.githubusercontent.com/${repositoryPath}/HEAD/theme${betaVersion ? "-beta" : ""}.css`; + const themesUrl = `https://raw.githubusercontent.com/${repositoryPath}/HEAD/theme${betaVersion ? "-beta" : ""}.css`; try { - const response = await (0, import_obsidian.request)({ url: themesURL }); + const response = await (0, import_obsidian.request)({ url: themesUrl }); return response === "404: Not Found" ? null : response; } catch (error) { if (debugLogging) @@ -714,9 +718,9 @@ var grabCommmunityThemeCssFile = async (repositoryPath, betaVersion = false, deb } }; var grabCommmunityThemeManifestFile = async (repositoryPath, debugLogging = true) => { - const themesURL = `https://raw.githubusercontent.com/${repositoryPath}/HEAD/manifest.json`; + const themesUrl = `https://raw.githubusercontent.com/${repositoryPath}/HEAD/manifest.json`; try { - const response = await (0, import_obsidian.request)({ url: themesURL }); + const response = await (0, import_obsidian.request)({ url: themesUrl }); return response === "404: Not Found" ? null : response; } catch (error) { if (debugLogging) @@ -735,10 +739,14 @@ var checksumForString = (str) => { return checksum(str).toString(); }; var grabChecksumOfThemeCssFile = async (repositoryPath, betaVersion, debugLogging) => { - const themeCSS = await grabCommmunityThemeCssFile(repositoryPath, betaVersion, debugLogging); - return themeCSS ? checksumForString(themeCSS) : "0"; + const themeCss = await grabCommmunityThemeCssFile( + repositoryPath, + betaVersion, + debugLogging + ); + return themeCss ? checksumForString(themeCss) : "0"; }; -var grabLastCommitInfoForAFile = async (repositoryPath, path, debugLogging = true) => { +var grabLastCommitInfoForFile = async (repositoryPath, path, debugLogging = true) => { const url = `https://api.github.com/repos/${repositoryPath}/commits?path=${path}&page=1&per_page=1`; try { const response = await (0, import_obsidian.request)({ url }); @@ -749,29 +757,30 @@ var grabLastCommitInfoForAFile = async (repositoryPath, path, debugLogging = tru return null; } }; -var grabLastCommitDateForAFile = async (repositoryPath, path) => { - const test = await grabLastCommitInfoForAFile(repositoryPath, path); - if (test[0].commit.committer.date) { +var grabLastCommitDateForFile = async (repositoryPath, path) => { + var _a; + const test = await grabLastCommitInfoForFile(repositoryPath, path); + if (test && test.length > 0 && ((_a = test[0].commit.committer) == null ? void 0 : _a.date)) { return test[0].commit.committer.date; - } else + } else { return ""; + } }; -// src/ui/settings.ts +// src/settings.ts var DEFAULT_SETTINGS = { pluginList: [], pluginSubListFrozenVersion: [], themesList: [], - updateAtStartup: false, - updateThemesAtStartup: false, - ribbonIconEnabled: true, + updateAtStartup: true, + updateThemesAtStartup: true, loggingEnabled: false, loggingPath: "BRAT-log", loggingVerboseEnabled: false, - debuggingMode: true, + debuggingMode: false, notificationsEnabled: true }; -async function addBetaPluginToList(plugin, repositoryPath, specifyVersion = "") { +function addBetaPluginToList(plugin, repositoryPath, specifyVersion = "") { let save = false; if (!plugin.settings.pluginList.contains(repositoryPath)) { plugin.settings.pluginList.unshift(repositoryPath); @@ -785,44 +794,49 @@ async function addBetaPluginToList(plugin, repositoryPath, specifyVersion = "") save = true; } if (save) { - plugin.saveSettings(); + void plugin.saveSettings(); } } -async function existBetaPluginInList(plugin, repositoryPath) { +function existBetaPluginInList(plugin, repositoryPath) { return plugin.settings.pluginList.contains(repositoryPath); } -async function addBetaThemeToList(plugin, repositoryPath, themeCSS) { +function addBetaThemeToList(plugin, repositoryPath, themeCss) { const newTheme = { repo: repositoryPath, - lastUpdate: checksumForString(themeCSS) + lastUpdate: checksumForString(themeCss) }; plugin.settings.themesList.unshift(newTheme); - plugin.saveSettings(); + void plugin.saveSettings(); } -async function existBetaThemeinInList(plugin, repositoryPath) { - const testIfThemExists = plugin.settings.themesList.find((t) => t.repo === repositoryPath); +function existBetaThemeinInList(plugin, repositoryPath) { + const testIfThemExists = plugin.settings.themesList.find( + (t) => t.repo === repositoryPath + ); return testIfThemExists ? true : false; } function updateBetaThemeLastUpdateChecksum(plugin, repositoryPath, checksum2) { plugin.settings.themesList.forEach((t) => { if (t.repo === repositoryPath) { t.lastUpdate = checksum2; - plugin.saveSettings(); + void plugin.saveSettings(); } }); } // src/utils/notifications.ts var import_obsidian2 = require("obsidian"); -function ToastMessage(plugin, msg, timeoutInSeconds = 10, contextMenuCallback) { - if (plugin.settings.notificationsEnabled === false) +function toastMessage(plugin, msg, timeoutInSeconds = 10, contextMenuCallback) { + if (!plugin.settings.notificationsEnabled) return; const additionalInfo = contextMenuCallback ? import_obsidian2.Platform.isDesktop ? "(click=dismiss, right-click=Info)" : "(click=dismiss)" : ""; - const newNotice = new import_obsidian2.Notice(`BRAT + const newNotice = new import_obsidian2.Notice( + `BRAT ${msg} -${additionalInfo}`, timeoutInSeconds * 1e3); +${additionalInfo}`, + timeoutInSeconds * 1e3 + ); if (contextMenuCallback) - newNotice.noticeEl.oncontextmenu = async () => { + newNotice.noticeEl.oncontextmenu = () => { contextMenuCallback(); }; } @@ -839,29 +853,53 @@ async function isConnectedToInternet() { // src/features/themes.ts var themeSave = async (plugin, cssGithubRepository, newInstall) => { - let themeCSS = await grabCommmunityThemeCssFile(cssGithubRepository, true, plugin.settings.debuggingMode); - if (!themeCSS) - themeCSS = await grabCommmunityThemeCssFile(cssGithubRepository, false, plugin.settings.debuggingMode); - if (!themeCSS) { - ToastMessage(plugin, "There is no theme.css or theme-beta.css file in the root path of this repository, so there is no theme to install."); + let themeCss = await grabCommmunityThemeCssFile( + cssGithubRepository, + true, + plugin.settings.debuggingMode + ); + if (!themeCss) + themeCss = await grabCommmunityThemeCssFile( + cssGithubRepository, + false, + plugin.settings.debuggingMode + ); + if (!themeCss) { + toastMessage( + plugin, + "There is no theme.css or theme-beta.css file in the root path of this repository, so there is no theme to install." + ); return false; } - const themeManifest = await grabCommmunityThemeManifestFile(cssGithubRepository, plugin.settings.debuggingMode); + const themeManifest = await grabCommmunityThemeManifestFile( + cssGithubRepository, + plugin.settings.debuggingMode + ); if (!themeManifest) { - ToastMessage(plugin, "There is no manifest.json file in the root path of this repository, so theme cannot be installed."); + toastMessage( + plugin, + "There is no manifest.json file in the root path of this repository, so theme cannot be installed." + ); return false; } const manifestInfo = await JSON.parse(themeManifest); const themeTargetFolderPath = (0, import_obsidian3.normalizePath)(themesRootPath(plugin) + manifestInfo.name); - const adapter = plugin.app.vault.adapter; - if (await adapter.exists(themeTargetFolderPath) === false) + const { adapter } = plugin.app.vault; + if (!await adapter.exists(themeTargetFolderPath)) await adapter.mkdir(themeTargetFolderPath); - await adapter.write((0, import_obsidian3.normalizePath)(themeTargetFolderPath + "/theme.css"), themeCSS); - await adapter.write((0, import_obsidian3.normalizePath)(themeTargetFolderPath + "/manifest.json"), themeManifest); - updateBetaThemeLastUpdateChecksum(plugin, cssGithubRepository, checksumForString(themeCSS)); + await adapter.write((0, import_obsidian3.normalizePath)(themeTargetFolderPath + "/theme.css"), themeCss); + await adapter.write( + (0, import_obsidian3.normalizePath)(themeTargetFolderPath + "/manifest.json"), + themeManifest + ); + updateBetaThemeLastUpdateChecksum( + plugin, + cssGithubRepository, + checksumForString(themeCss) + ); let msg = ``; if (newInstall) { - await addBetaThemeToList(plugin, cssGithubRepository, themeCSS); + addBetaThemeToList(plugin, cssGithubRepository, themeCss); msg = `${manifestInfo.name} theme installed from ${cssGithubRepository}. `; setTimeout(() => { plugin.app.customCss.setTheme(manifestInfo.name); @@ -869,44 +907,57 @@ var themeSave = async (plugin, cssGithubRepository, newInstall) => { } else { msg = `${manifestInfo.name} theme updated from ${cssGithubRepository}.`; } - plugin.log(msg + `[Theme Info](https://github.com/${cssGithubRepository})`, false); - ToastMessage(plugin, `${msg}`, 20, async () => { + void plugin.log(msg + `[Theme Info](https://github.com/${cssGithubRepository})`, false); + toastMessage(plugin, `${msg}`, 20, () => { window.open(`https://github.com/${cssGithubRepository}`); }); return true; }; var themesCheckAndUpdates = async (plugin, showInfo) => { - if (await isConnectedToInternet() === false) { + if (!await isConnectedToInternet()) { console.log("BRAT: No internet detected."); return; } let newNotice; const msg1 = `Checking for beta theme updates STARTED`; - plugin.log(msg1, true); + await plugin.log(msg1, true); if (showInfo && plugin.settings.notificationsEnabled) newNotice = new import_obsidian3.Notice(`BRAT ${msg1}`, 3e4); for (const t of plugin.settings.themesList) { - let lastUpdateOnline = await grabChecksumOfThemeCssFile(t.repo, true, plugin.settings.debuggingMode); + let lastUpdateOnline = await grabChecksumOfThemeCssFile( + t.repo, + true, + plugin.settings.debuggingMode + ); if (lastUpdateOnline === "0") - lastUpdateOnline = await grabChecksumOfThemeCssFile(t.repo, false, plugin.settings.debuggingMode); + lastUpdateOnline = await grabChecksumOfThemeCssFile( + t.repo, + false, + plugin.settings.debuggingMode + ); + console.log("BRAT: lastUpdateOnline", lastUpdateOnline); if (lastUpdateOnline !== t.lastUpdate) await themeSave(plugin, t.repo, false); } const msg2 = `Checking for beta theme updates COMPLETED`; - plugin.log(msg2, true); + (async () => { + await plugin.log(msg2, true); + })(); if (showInfo) { - if (plugin.settings.notificationsEnabled) + if (plugin.settings.notificationsEnabled && newNotice) newNotice.hide(); - ToastMessage(plugin, msg2); + toastMessage(plugin, msg2); } }; -var themeDelete = async (plugin, cssGithubRepository) => { - plugin.settings.themesList = plugin.settings.themesList.filter((t) => t.repo != cssGithubRepository); - plugin.saveSettings(); +var themeDelete = (plugin, cssGithubRepository) => { + plugin.settings.themesList = plugin.settings.themesList.filter( + (t) => t.repo !== cssGithubRepository + ); + void plugin.saveSettings(); const msg = `Removed ${cssGithubRepository} from BRAT themes list and will no longer be updated. However, the theme files still exist in the vault. To remove them, go into Settings > Appearance and remove the theme.`; - plugin.log(msg, true); - ToastMessage(plugin, `${msg}`); + void plugin.log(msg, true); + toastMessage(plugin, `${msg}`); }; var themesRootPath = (plugin) => { return (0, import_obsidian3.normalizePath)(plugin.app.vault.configDir + "/themes") + "/"; @@ -919,7 +970,7 @@ var import_obsidian4 = require("obsidian"); var promotionalLinks = (containerEl, settingsTab = true) => { const linksDiv = containerEl.createEl("div"); linksDiv.style.float = "right"; - if (settingsTab === false) { + if (!settingsTab) { linksDiv.style.padding = "10px"; linksDiv.style.paddingLeft = "15px"; linksDiv.style.paddingRight = "15px"; @@ -952,8 +1003,12 @@ var AddNewTheme = class extends import_obsidian4.Modal { if (this.address === "") return; const scrubbedAddress = this.address.replace("https://github.com/", ""); - if (await existBetaThemeinInList(this.plugin, scrubbedAddress)) { - ToastMessage(this.plugin, `This plugin is already in the list for beta testing`, 10); + if (existBetaThemeinInList(this.plugin, scrubbedAddress)) { + toastMessage( + this.plugin, + `This plugin is already in the list for beta testing`, + 10 + ); return; } if (await themeSave(this.plugin, scrubbedAddress, true)) { @@ -965,14 +1020,16 @@ var AddNewTheme = class extends import_obsidian4.Modal { this.contentEl.createEl("form", {}, (formEl) => { formEl.addClass("brat-modal"); new import_obsidian4.Setting(formEl).addText((textEl) => { - textEl.setPlaceholder("Repository (example: https://github.com/GitubUserName/repository-name"); + textEl.setPlaceholder( + "Repository (example: https://github.com/GitubUserName/repository-name" + ); textEl.onChange((value) => { this.address = value.trim(); }); - textEl.inputEl.addEventListener("keydown", async (e) => { + textEl.inputEl.addEventListener("keydown", (e) => { if (e.key === "Enter" && this.address !== " ") { e.preventDefault(); - await this.submitForm(); + void this.submitForm(); } }); textEl.inputEl.style.width = "100%"; @@ -984,7 +1041,9 @@ var AddNewTheme = class extends import_obsidian4.Modal { }, 10); }); formEl.createDiv("modal-button-container", (buttonContainerEl) => { - buttonContainerEl.createEl("button", { attr: { type: "button" }, text: "Never mind" }).addEventListener("click", () => this.close()); + buttonContainerEl.createEl("button", { attr: { type: "button" }, text: "Never mind" }).addEventListener("click", () => { + this.close(); + }); buttonContainerEl.createEl("button", { attr: { type: "submit" }, cls: "mod-cta", @@ -1005,22 +1064,34 @@ var AddNewTheme = class extends import_obsidian4.Modal { titleEl.remove(); }); }, 50); - formEl.addEventListener("submit", async (e) => { + formEl.addEventListener("submit", (e) => { e.preventDefault(); if (this.address !== "") - await this.submitForm(); + void this.submitForm(); }); }); } - async onClose() { + onClose() { if (this.openSettingsTabAfterwards) { - await this.plugin.app.setting.open(); - await this.plugin.app.setting.openTabById("obsidian42-brat"); + this.plugin.app.setting.open(); + this.plugin.app.setting.openTabById(this.plugin.APP_ID); } } }; // src/ui/SettingsTab.ts +var createLink = (githubResource, optionalText) => { + const newLink = new DocumentFragment(); + const linkElement = document.createElement("a"); + linkElement.textContent = githubResource; + linkElement.href = `https://github.com/${githubResource}`; + newLink.appendChild(linkElement); + if (optionalText) { + const textNode = document.createTextNode(optionalText); + newLink.appendChild(textNode); + } + return newLink; +}; var BratSettingsTab = class extends import_obsidian5.PluginSettingTab { constructor(app, plugin) { super(app, plugin); @@ -1029,113 +1100,125 @@ var BratSettingsTab = class extends import_obsidian5.PluginSettingTab { display() { const { containerEl } = this; containerEl.empty(); - promotionalLinks(containerEl, true); - containerEl.createEl("h1", { text: this.plugin.appName }); - containerEl.createEl("h2", { text: "by TfTHacker" }); - new import_obsidian5.Setting(containerEl).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((cb) => { + new import_obsidian5.Setting(containerEl).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((cb) => { cb.setValue(this.plugin.settings.updateAtStartup); cb.onChange(async (value) => { this.plugin.settings.updateAtStartup = value; await this.plugin.saveSettings(); }); }); - new import_obsidian5.Setting(containerEl).setName("Auto-update themes at startup").setDesc("If enabled all beta themes will be checked for updates each time Obsidian starts.").addToggle((cb) => { + new import_obsidian5.Setting(containerEl).setName("Auto-update themes at startup").setDesc( + "If enabled all beta themes will be checked for updates each time Obsidian starts." + ).addToggle((cb) => { cb.setValue(this.plugin.settings.updateThemesAtStartup); cb.onChange(async (value) => { this.plugin.settings.updateThemesAtStartup = value; await this.plugin.saveSettings(); }); }); - new import_obsidian5.Setting(containerEl).setName("Ribbon Button").setDesc("Toggle ribbon button off and on.").addToggle((cb) => { - cb.setValue(this.plugin.settings.ribbonIconEnabled); - cb.onChange(async (value) => { - this.plugin.settings.ribbonIconEnabled = value; - if (this.plugin.settings.ribbonIconEnabled === false) - this.plugin.ribbonIcon.remove(); - else - this.plugin.showRibbonButton(); - }); - }); + promotionalLinks(containerEl, true); containerEl.createEl("hr"); containerEl.createEl("h2", { text: "Beta Plugin List" }); - containerEl.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. ` }); + containerEl.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. ` + }); containerEl.createEl("p"); - containerEl.createEl("div", { text: `Click the x button next to a plugin to remove it from the list.` }); + containerEl.createEl("div", { + text: `Click the x button next to a plugin to remove it from the list.` + }); containerEl.createEl("p"); containerEl.createEl("span").createEl("b", { text: "Note: " }); - containerEl.createSpan({ text: "This does not delete the plugin, this should be done from the Community Plugins tab in Settings." }); + containerEl.createSpan({ + text: "This does not delete the plugin, this should be done from the Community Plugins tab in Settings." + }); new import_obsidian5.Setting(containerEl).addButton((cb) => { cb.setButtonText("Add Beta plugin"); - cb.onClick(async () => { + cb.onClick(() => { this.plugin.app.setting.close(); - await this.plugin.betaPlugins.displayAddNewPluginModal(true, false); + this.plugin.betaPlugins.displayAddNewPluginModal(true, false); }); }); - const pluginSubListFrozenVersionNames = new Set(this.plugin.settings.pluginSubListFrozenVersion.map((x) => x.repo)); + const pluginSubListFrozenVersionNames = new Set( + this.plugin.settings.pluginSubListFrozenVersion.map((x) => x.repo) + ); for (const bp of this.plugin.settings.pluginList) { if (pluginSubListFrozenVersionNames.has(bp)) { continue; } - new import_obsidian5.Setting(containerEl).setName(bp).addButton((btn) => { + new import_obsidian5.Setting(containerEl).setName(createLink(bp)).addButton((btn) => { btn.setIcon("cross"); btn.setTooltip("Delete this beta plugin"); - btn.onClick(async () => { + btn.onClick(() => { if (btn.buttonEl.textContent === "") btn.setButtonText("Click once more to confirm removal"); else { - btn.buttonEl.parentElement.parentElement.remove(); - await this.plugin.betaPlugins.deletePlugin(bp); + const { buttonEl } = btn; + const { parentElement } = buttonEl; + if (parentElement == null ? void 0 : parentElement.parentElement) { + parentElement.parentElement.remove(); + this.plugin.betaPlugins.deletePlugin(bp); + } } }); }); } new import_obsidian5.Setting(containerEl).addButton((cb) => { cb.setButtonText("Add Beta plugin with frozen version"); - cb.onClick(async () => { + cb.onClick(() => { this.plugin.app.setting.close(); - await this.plugin.betaPlugins.displayAddNewPluginModal(true, true); + this.plugin.betaPlugins.displayAddNewPluginModal(true, true); }); }); for (const bp of this.plugin.settings.pluginSubListFrozenVersion) { - new import_obsidian5.Setting(containerEl).setName(`${bp.repo} (version ${bp.version})`).addButton((btn) => { + new import_obsidian5.Setting(containerEl).setName(createLink(bp.repo, ` (version ${bp.version})`)).addButton((btn) => { btn.setIcon("cross"); btn.setTooltip("Delete this beta plugin"); - btn.onClick(async () => { + btn.onClick(() => { if (btn.buttonEl.textContent === "") btn.setButtonText("Click once more to confirm removal"); else { - btn.buttonEl.parentElement.parentElement.remove(); - await this.plugin.betaPlugins.deletePlugin(bp.repo); + const { buttonEl } = btn; + const { parentElement } = buttonEl; + if (parentElement == null ? void 0 : parentElement.parentElement) { + parentElement.parentElement.remove(); + this.plugin.betaPlugins.deletePlugin(bp.repo); + } } }); }); } - containerEl.createEl("hr"); containerEl.createEl("h2", { text: "Beta Themes List" }); new import_obsidian5.Setting(containerEl).addButton((cb) => { cb.setButtonText("Add Beta Theme"); - cb.onClick(async () => { + cb.onClick(() => { this.plugin.app.setting.close(); new AddNewTheme(this.plugin).open(); }); }); for (const bp of this.plugin.settings.themesList) { - new import_obsidian5.Setting(containerEl).setName(bp.repo).addButton((btn) => { + new import_obsidian5.Setting(containerEl).setName(createLink(bp.repo)).addButton((btn) => { btn.setIcon("cross"); btn.setTooltip("Delete this beta theme"); - btn.onClick(async () => { + btn.onClick(() => { if (btn.buttonEl.textContent === "") btn.setButtonText("Click once more to confirm removal"); else { - btn.buttonEl.parentElement.parentElement.remove(); - await themeDelete(this.plugin, bp.repo); + const { buttonEl } = btn; + const { parentElement } = buttonEl; + if (parentElement == null ? void 0 : parentElement.parentElement) { + parentElement.parentElement.remove(); + themeDelete(this.plugin, bp.repo); + } } }); }); } - containerEl.createEl("hr"); containerEl.createEl("h2", { text: "Monitoring" }); - new import_obsidian5.Setting(containerEl).setName("Enable Notifications").setDesc("BRAT will provide popup notifications for its various activities. Turn this off means no notifications from BRAT.").addToggle((cb) => { + new import_obsidian5.Setting(containerEl).setName("Enable Notifications").setDesc( + "BRAT will provide popup notifications for its various activities. Turn this off means no notifications from BRAT." + ).addToggle((cb) => { cb.setValue(this.plugin.settings.notificationsEnabled); cb.onChange(async (value) => { this.plugin.settings.notificationsEnabled = value; @@ -1150,8 +1233,8 @@ var BratSettingsTab = class extends import_obsidian5.PluginSettingTab { }); }); new import_obsidian5.Setting(this.containerEl).setName("BRAT Log File Location").setDesc("Logs will be saved to this file. Don't add .md to the file name.").addSearch((cb) => { - cb.setPlaceholder("Example: BRAT-log").setValue(this.plugin.settings.loggingPath).onChange(async (new_folder) => { - this.plugin.settings.loggingPath = new_folder; + cb.setPlaceholder("Example: BRAT-log").setValue(this.plugin.settings.loggingPath).onChange(async (newFolder) => { + this.plugin.settings.loggingPath = newFolder; await this.plugin.saveSettings(); }); }); @@ -1162,7 +1245,9 @@ var BratSettingsTab = class extends import_obsidian5.PluginSettingTab { await this.plugin.saveSettings(); }); }); - new import_obsidian5.Setting(containerEl).setName("Debugging Mode").setDesc("Atomic Bomb level console logging. Can be used for troubleshoting and development.").addToggle((cb) => { + new import_obsidian5.Setting(containerEl).setName("Debugging Mode").setDesc( + "Atomic Bomb level console logging. Can be used for troubleshoting and development." + ).addToggle((cb) => { cb.setValue(this.plugin.settings.debuggingMode); cb.onChange(async (value) => { this.plugin.settings.debuggingMode = value; @@ -1190,11 +1275,21 @@ var AddNewPluginModal = class extends import_obsidian6.Modal { let scrubbedAddress = this.address.replace("https://github.com/", ""); if (scrubbedAddress.endsWith(".git")) scrubbedAddress = scrubbedAddress.slice(0, -4); - if (await existBetaPluginInList(this.plugin, scrubbedAddress)) { - ToastMessage(this.plugin, `This plugin is already in the list for beta testing`, 10); + if (existBetaPluginInList(this.plugin, scrubbedAddress)) { + toastMessage( + this.plugin, + `This plugin is already in the list for beta testing`, + 10 + ); return; } - const result = await this.betaPlugins.addPlugin(scrubbedAddress, false, false, false, this.version); + const result = await this.betaPlugins.addPlugin( + scrubbedAddress, + false, + false, + false, + this.version + ); if (result) { this.close(); } @@ -1204,15 +1299,17 @@ var AddNewPluginModal = class extends import_obsidian6.Modal { this.contentEl.createEl("form", {}, (formEl) => { formEl.addClass("brat-modal"); new import_obsidian6.Setting(formEl).addText((textEl) => { - textEl.setPlaceholder("Repository (example: https://github.com/GitubUserName/repository-name)"); + textEl.setPlaceholder( + "Repository (example: https://github.com/GitubUserName/repository-name)" + ); textEl.onChange((value) => { this.address = value.trim(); }); - textEl.inputEl.addEventListener("keydown", async (e) => { + textEl.inputEl.addEventListener("keydown", (e) => { if (e.key === "Enter" && this.address !== " ") { if (this.useFrozenVersion && this.version !== "" || !this.useFrozenVersion) { e.preventDefault(); - await this.submitForm(); + void this.submitForm(); } } }); @@ -1228,7 +1325,9 @@ var AddNewPluginModal = class extends import_obsidian6.Modal { }); } formEl.createDiv("modal-button-container", (buttonContainerEl) => { - buttonContainerEl.createEl("button", { attr: { type: "button" }, text: "Never mind" }).addEventListener("click", () => this.close()); + buttonContainerEl.createEl("button", { attr: { type: "button" }, text: "Never mind" }).addEventListener("click", () => { + this.close(); + }); buttonContainerEl.createEl("button", { attr: { type: "submit" }, cls: "mod-cta", @@ -1249,20 +1348,20 @@ var AddNewPluginModal = class extends import_obsidian6.Modal { titleEl.remove(); }); }, 50); - formEl.addEventListener("submit", async (e) => { + formEl.addEventListener("submit", (e) => { e.preventDefault(); if (this.address !== "") { if (this.useFrozenVersion && this.version !== "" || !this.useFrozenVersion) { - await this.submitForm(); + void this.submitForm(); } } }); }); } - async onClose() { + onClose() { if (this.openSettingsTabAfterwards) { - await this.plugin.app.setting.open(); - await this.plugin.app.setting.openTabById("obsidian42-brat"); + this.plugin.app.setting.open(); + this.plugin.app.setting.openTabById(this.plugin.APP_ID); } } }; @@ -1275,43 +1374,63 @@ var BetaPlugins = class { } /** * opens the AddNewPluginModal to get info for a new beta plugin - * @param {boolean} openSettingsTabAfterwards will open settings screen afterwards. Used when this command is called from settings tab - * @param {boolean} useFrozenVersion install the plugin using frozen version. - * @return {} + * @param openSettingsTabAfterwards - will open settings screen afterwards. Used when this command is called from settings tab + * @param useFrozenVersion - install the plugin using frozen version. */ - async displayAddNewPluginModal(openSettingsTabAfterwards = false, useFrozenVersion = false) { - const newPlugin = new AddNewPluginModal(this.plugin, this, openSettingsTabAfterwards, useFrozenVersion); + displayAddNewPluginModal(openSettingsTabAfterwards = false, useFrozenVersion = false) { + const newPlugin = new AddNewPluginModal( + this.plugin, + this, + openSettingsTabAfterwards, + useFrozenVersion + ); newPlugin.open(); } /** * Validates that a GitHub repository is plugin * - * @param {string} repositoryPath GithubUser/RepositoryName (example: TfThacker/obsidian42-brat) - * @param {[type]} getBetaManifest test the beta version of the manifest, not at the root - * @param {[type]} false [false description] - * @param {[type]} reportIssues will display notices as it finds issues + * @param repositoryPath - GithubUser/RepositoryName (example: TfThacker/obsidian42-brat) + * @param getBetaManifest - test the beta version of the manifest, not at the root + * @param false - [false description] + * @param reportIssues - will display notices as it finds issues * - * @return {Promise} the manifest file if found, or null if its incomplete + * @returns the manifest file if found, or null if its incomplete */ async validateRepository(repositoryPath, getBetaManifest = false, reportIssues = false) { const noticeTimeout = 15; - const manifestJson = await grabManifestJsonFromRepository(repositoryPath, !getBetaManifest, this.plugin.settings.debuggingMode); + const manifestJson = await grabManifestJsonFromRepository( + repositoryPath, + !getBetaManifest, + this.plugin.settings.debuggingMode + ); if (!manifestJson) { if (reportIssues) - ToastMessage(this.plugin, `${repositoryPath} -This does not seem to be an obsidian plugin, as there is no manifest.json file.`, noticeTimeout); + toastMessage( + this.plugin, + `${repositoryPath} +This does not seem to be an obsidian plugin, as there is no manifest.json file.`, + noticeTimeout + ); return null; } if (!("id" in manifestJson)) { if (reportIssues) - ToastMessage(this.plugin, `${repositoryPath} -The plugin id attribute for the release is missing from the manifest file`, noticeTimeout); + toastMessage( + this.plugin, + `${repositoryPath} +The plugin id attribute for the release is missing from the manifest file`, + noticeTimeout + ); return null; } if (!("version" in manifestJson)) { if (reportIssues) - ToastMessage(this.plugin, `${repositoryPath} -The version attribute for the release is missing from the manifest file`, noticeTimeout); + toastMessage( + this.plugin, + `${repositoryPath} +The version attribute for the release is missing from the manifest file`, + noticeTimeout + ); return null; } return manifestJson; @@ -1319,174 +1438,240 @@ The version attribute for the release is missing from the manifest file`, notice /** * Gets all the release files based on the version number in the manifest * - * @param {string} repositoryPath path to the GitHub repository - * @param {PluginManifest} manifest manifest file - * @param {boolean} getManifest grab the remote manifest file - * @param {string} specifyVersion grab the specified version if set + * @param repositoryPath - path to the GitHub repository + * @param manifest - manifest file + * @param getManifest - grab the remote manifest file + * @param specifyVersion - grab the specified version if set * - * @return {Promise} all relase files as strings based on the ReleaseFiles interaface + * @returns all relase files as strings based on the ReleaseFiles interaface */ async getAllReleaseFiles(repositoryPath, manifest, getManifest, specifyVersion = "") { const version = specifyVersion === "" ? manifest.version : specifyVersion; const reallyGetManifestOrNot = getManifest || specifyVersion !== ""; return { - mainJs: await grabReleaseFileFromRepository(repositoryPath, version, "main.js", this.plugin.settings.debuggingMode), - manifest: reallyGetManifestOrNot ? await grabReleaseFileFromRepository(repositoryPath, version, "manifest.json", this.plugin.settings.debuggingMode) : "", - styles: await grabReleaseFileFromRepository(repositoryPath, version, "styles.css", this.plugin.settings.debuggingMode) + mainJs: await grabReleaseFileFromRepository( + repositoryPath, + version, + "main.js", + this.plugin.settings.debuggingMode + ), + manifest: reallyGetManifestOrNot ? await grabReleaseFileFromRepository( + repositoryPath, + version, + "manifest.json", + this.plugin.settings.debuggingMode + ) : "", + styles: await grabReleaseFileFromRepository( + repositoryPath, + version, + "styles.css", + this.plugin.settings.debuggingMode + ) }; } /** * Writes the plugin release files to the local obsidian .plugins folder * - * @param {string} betaPluginID the id of the plugin (not the repository path) - * @param {ReleaseFiles} relFiles release file as strings, based on the ReleaseFiles interface + * @param betaPluginId - the id of the plugin (not the repository path) + * @param relFiles - release file as strings, based on the ReleaseFiles interface * - * @return {Promise} */ - async writeReleaseFilesToPluginFolder(betaPluginID, relFiles) { - const pluginTargetFolderPath = (0, import_obsidian7.normalizePath)(this.plugin.app.vault.configDir + "/plugins/" + betaPluginID) + "/"; - const adapter = this.plugin.app.vault.adapter; - if (await adapter.exists(pluginTargetFolderPath) === false || !await adapter.exists(pluginTargetFolderPath + "manifest.json")) { + async writeReleaseFilesToPluginFolder(betaPluginId, relFiles) { + var _a, _b; + const pluginTargetFolderPath = (0, import_obsidian7.normalizePath)(this.plugin.app.vault.configDir + "/plugins/" + betaPluginId) + "/"; + const { adapter } = this.plugin.app.vault; + if (!await adapter.exists(pluginTargetFolderPath) || !await adapter.exists(pluginTargetFolderPath + "manifest.json")) { await adapter.mkdir(pluginTargetFolderPath); } - await adapter.write(pluginTargetFolderPath + "main.js", relFiles.mainJs); - await adapter.write(pluginTargetFolderPath + "manifest.json", relFiles.manifest); + await adapter.write(pluginTargetFolderPath + "main.js", (_a = relFiles.mainJs) != null ? _a : ""); + await adapter.write( + pluginTargetFolderPath + "manifest.json", + (_b = relFiles.manifest) != null ? _b : "" + ); if (relFiles.styles) await adapter.write(pluginTargetFolderPath + "styles.css", relFiles.styles); } /** - * Primary function for adding a new beta plugin to Obsidian. + * Primary function for adding a new beta plugin to Obsidian. * Also this function is used for updating existing plugins. * - * @param {string} repositoryPath path to GitHub repository formated as USERNAME/repository - * @param {boolean} updatePluginFiles true if this is just an update not an install - * @param {boolean} seeIfUpdatedOnly if true, and updatePluginFiles true, will just check for updates, but not do the update. will report to user that there is a new plugin - * @param {boolean} reportIfNotUpdted if true, report if an update has not succed - * @param {string} specifyVersion if not empty, need to install a specified version instead of the value in manifest{-beta}.json - * @param {boolean} forceReinstall if true, will force a reinstall of the plugin, even if it is already installed + * @param repositoryPath - path to GitHub repository formated as USERNAME/repository + * @param updatePluginFiles - true if this is just an update not an install + * @param seeIfUpdatedOnly - if true, and updatePluginFiles true, will just check for updates, but not do the update. will report to user that there is a new plugin + * @param reportIfNotUpdted - if true, report if an update has not succed + * @param specifyVersion - if not empty, need to install a specified version instead of the value in manifest-beta.json + * @param forceReinstall - if true, will force a reinstall of the plugin, even if it is already installed * - * @return {Promise} true if succeeds + * @returns true if succeeds */ async addPlugin(repositoryPath, updatePluginFiles = false, seeIfUpdatedOnly = false, reportIfNotUpdted = false, specifyVersion = "", forceReinstall = false) { - var _a; + console.log( + "BRAT: addPlugin", + repositoryPath, + updatePluginFiles, + seeIfUpdatedOnly, + reportIfNotUpdted, + specifyVersion, + forceReinstall + ); const noticeTimeout = 10; let primaryManifest = await this.validateRepository(repositoryPath, true, false); const usingBetaManifest = primaryManifest ? true : false; - if (usingBetaManifest === false) + if (!usingBetaManifest) primaryManifest = await this.validateRepository(repositoryPath, false, true); if (primaryManifest === null) { const msg = `${repositoryPath} A manifest.json or manifest-beta.json file does not exist in the root directory of the repository. This plugin cannot be installed.`; - this.plugin.log(msg, true); - ToastMessage(this.plugin, `${msg}`, noticeTimeout); + await this.plugin.log(msg, true); + toastMessage(this.plugin, `${msg}`, noticeTimeout); return false; } - if (!primaryManifest.hasOwnProperty("version")) { + if (!Object.hasOwn(primaryManifest, "version")) { const msg = `${repositoryPath} The manifest${usingBetaManifest ? "-beta" : ""}.json file in the root directory of the repository does not have a version number in the file. This plugin cannot be installed.`; - this.plugin.log(msg, true); - ToastMessage(this.plugin, `${msg}`, noticeTimeout); + await this.plugin.log(msg, true); + toastMessage(this.plugin, `${msg}`, noticeTimeout); return false; } - if (primaryManifest.hasOwnProperty("minAppVersion")) { + if (!Object.hasOwn(primaryManifest, "minAppVersion")) { if (!(0, import_obsidian7.requireApiVersion)(primaryManifest.minAppVersion)) { const msg = `Plugin: ${repositoryPath} The manifest${usingBetaManifest ? "-beta" : ""}.json for this plugin indicates that the Obsidian version of the app needs to be ${primaryManifest.minAppVersion}, but this installation of Obsidian is ${import_obsidian7.apiVersion}. You will need to update your Obsidian to use this plugin or contact the plugin developer for more information.`; - this.plugin.log(msg, true); - ToastMessage(this.plugin, `${msg}`, 30); + await this.plugin.log(msg, true); + toastMessage(this.plugin, `${msg}`, 30); return false; } } const getRelease = async () => { - const rFiles = await this.getAllReleaseFiles(repositoryPath, primaryManifest, usingBetaManifest, specifyVersion); + const rFiles = await this.getAllReleaseFiles( + repositoryPath, + // @ts-expect-error typescript will complain that this can be null, but in this case it won't be + primaryManifest, + usingBetaManifest, + specifyVersion + ); if (usingBetaManifest || rFiles.manifest === "") rFiles.manifest = JSON.stringify(primaryManifest); - if (rFiles.mainJs === null) { + if (usingBetaManifest || rFiles.mainJs === null) { const msg = `${repositoryPath} The release is not complete and cannot be download. main.js is missing from the Release`; - this.plugin.log(msg, true); - ToastMessage(this.plugin, `${msg}`, noticeTimeout); + await this.plugin.log(msg, true); + toastMessage(this.plugin, `${msg}`, noticeTimeout); return null; } return rFiles; }; - if (updatePluginFiles === false || forceReinstall === true) { + if (!updatePluginFiles || forceReinstall) { const releaseFiles = await getRelease(); if (releaseFiles === null) return false; await this.writeReleaseFilesToPluginFolder(primaryManifest.id, releaseFiles); - if (forceReinstall === false) - await addBetaPluginToList(this.plugin, repositoryPath, specifyVersion); + if (!forceReinstall) + addBetaPluginToList(this.plugin, repositoryPath, specifyVersion); await this.plugin.app.plugins.loadManifests(); - if (forceReinstall === true) { + if (forceReinstall) { await this.reloadPlugin(primaryManifest.id); - this.plugin.log(`${repositoryPath} reinstalled`, true); - ToastMessage(this.plugin, `${repositoryPath} -Plugin has been reinstalled and reloaded.`, noticeTimeout); + await this.plugin.log(`${repositoryPath} reinstalled`, true); + toastMessage( + this.plugin, + `${repositoryPath} +Plugin has been reinstalled and reloaded.`, + noticeTimeout + ); } else { const versionText = specifyVersion === "" ? "" : ` (version: ${specifyVersion})`; const msg = `${repositoryPath}${versionText} The plugin has been registered with BRAT. You may still need to enable it the Community Plugin List.`; - this.plugin.log(msg, true); - ToastMessage(this.plugin, msg, noticeTimeout); + await this.plugin.log(msg, true); + toastMessage(this.plugin, msg, noticeTimeout); } } else { const pluginTargetFolderPath = this.plugin.app.vault.configDir + "/plugins/" + primaryManifest.id + "/"; let localManifestContents = ""; try { - localManifestContents = await this.plugin.app.vault.adapter.read(pluginTargetFolderPath + "manifest.json"); + localManifestContents = await this.plugin.app.vault.adapter.read( + pluginTargetFolderPath + "manifest.json" + ); } catch (e) { if (e.errno === -4058 || e.errno === -2) { - await this.addPlugin(repositoryPath, false, usingBetaManifest, false, specifyVersion); + await this.addPlugin( + repositoryPath, + false, + usingBetaManifest, + false, + specifyVersion + ); return true; } else - console.log("BRAT - Local Manifest Load", primaryManifest.id, JSON.stringify(e, null, 2)); + console.log( + "BRAT - Local Manifest Load", + primaryManifest.id, + JSON.stringify(e, null, 2) + ); } if (specifyVersion !== "" || this.plugin.settings.pluginSubListFrozenVersion.map((x) => x.repo).includes(repositoryPath)) { - ToastMessage(this.plugin, `The version of ${repositoryPath} is frozen, not updating.`, 3); + toastMessage( + this.plugin, + `The version of ${repositoryPath} is frozen, not updating.`, + 3 + ); return false; } - const localManifestJSON = await JSON.parse(localManifestContents); - if (localManifestJSON.version !== primaryManifest.version) { + const localManifestJson = await JSON.parse( + localManifestContents + ); + if (localManifestJson.version !== primaryManifest.version) { const releaseFiles = await getRelease(); if (releaseFiles === null) return false; if (seeIfUpdatedOnly) { - const msg = `There is an update available for ${primaryManifest.id} from version ${localManifestJSON.version} to ${primaryManifest.version}. `; - this.plugin.log(msg + `[Release Info](https://github.com/${repositoryPath}/releases/tag/${primaryManifest.version})`, false); - ToastMessage(this.plugin, msg, 30, async () => { - window.open(`https://github.com/${repositoryPath}/releases/tag/${primaryManifest.version}`); + const msg = `There is an update available for ${primaryManifest.id} from version ${localManifestJson.version} to ${primaryManifest.version}. `; + await this.plugin.log( + msg + `[Release Info](https://github.com/${repositoryPath}/releases/tag/${primaryManifest.version})`, + true + ); + toastMessage(this.plugin, msg, 30, () => { + if (primaryManifest) { + window.open( + `https://github.com/${repositoryPath}/releases/tag/${primaryManifest.version}` + ); + } }); } else { await this.writeReleaseFilesToPluginFolder(primaryManifest.id, releaseFiles); await this.plugin.app.plugins.loadManifests(); - if ((_a = this.plugin.app.plugins.plugins[primaryManifest.id]) == null ? void 0 : _a.manifest) - await this.reloadPlugin(primaryManifest.id); + await this.reloadPlugin(primaryManifest.id); const msg = `${primaryManifest.id} -Plugin has been updated from version ${localManifestJSON.version} to ${primaryManifest.version}. `; - this.plugin.log(msg + `[Release Info](https://github.com/${repositoryPath}/releases/tag/${primaryManifest.version})`, false); - ToastMessage(this.plugin, msg, 30, async () => { - window.open(`https://github.com/${repositoryPath}/releases/tag/${primaryManifest.version}`); +Plugin has been updated from version ${localManifestJson.version} to ${primaryManifest.version}. `; + await this.plugin.log( + msg + `[Release Info](https://github.com/${repositoryPath}/releases/tag/${primaryManifest.version})`, + true + ); + toastMessage(this.plugin, msg, 30, () => { + if (primaryManifest) { + window.open( + `https://github.com/${repositoryPath}/releases/tag/${primaryManifest.version}` + ); + } }); } } else if (reportIfNotUpdted) - ToastMessage(this.plugin, `No update available for ${repositoryPath}`, 3); + toastMessage(this.plugin, `No update available for ${repositoryPath}`, 3); } return true; } /** * reloads a plugin (assuming it has been enabled by user) * pjeby, Thanks Bro https://github.com/pjeby/hot-reload/blob/master/main.js - * - * @param {string} pluginName name of plugin * - * @return {Promise} + * @param pluginName - name of plugin + * */ async reloadPlugin(pluginName) { - const plugins = this.plugin.app.plugins; + const { plugins } = this.plugin.app; try { await plugins.disablePlugin(pluginName); await plugins.enablePlugin(pluginName); @@ -1498,36 +1683,44 @@ Plugin has been updated from version ${localManifestJSON.version} to ${primaryMa /** * updates a beta plugin * - * @param {string} repositoryPath repository path on GitHub - * @param {boolean} onlyCheckDontUpdate only looks for update + * @param repositoryPath - repository path on GitHub + * @param onlyCheckDontUpdate - only looks for update * - * @return {Promise} */ async updatePlugin(repositoryPath, onlyCheckDontUpdate = false, reportIfNotUpdted = false, forceReinstall = false) { - const result = await this.addPlugin(repositoryPath, true, onlyCheckDontUpdate, reportIfNotUpdted, "", forceReinstall); - if (result === false && onlyCheckDontUpdate === false) - ToastMessage(this.plugin, `${repositoryPath} + const result = await this.addPlugin( + repositoryPath, + true, + onlyCheckDontUpdate, + reportIfNotUpdted, + "", + forceReinstall + ); + if (!result && !onlyCheckDontUpdate) + toastMessage(this.plugin, `${repositoryPath} Update of plugin failed.`); return result; } /** * walks through the list of plugins without frozen version and performs an update * - * @param {boolean} showInfo should this with a started/completed message - useful when ran from CP - * @return {Promise} + * @param showInfo - should this with a started/completed message - useful when ran from CP + * */ - async checkForUpdatesAndInstallUpdates(showInfo = false, onlyCheckDontUpdate = false) { - if (await isConnectedToInternet() === false) { + async checkForPluginUpdatesAndInstallUpdates(showInfo = false, onlyCheckDontUpdate = false) { + if (!await isConnectedToInternet()) { console.log("BRAT: No internet detected."); return; } let newNotice; const msg1 = `Checking for plugin updates STARTED`; - this.plugin.log(msg1, true); + await this.plugin.log(msg1, true); if (showInfo && this.plugin.settings.notificationsEnabled) newNotice = new import_obsidian7.Notice(`BRAT ${msg1}`, 3e4); - const pluginSubListFrozenVersionNames = new Set(this.plugin.settings.pluginSubListFrozenVersion.map((f) => f.repo)); + const pluginSubListFrozenVersionNames = new Set( + this.plugin.settings.pluginSubListFrozenVersion.map((f) => f.repo) + ); for (const bp of this.plugin.settings.pluginList) { if (pluginSubListFrozenVersionNames.has(bp)) { continue; @@ -1535,40 +1728,49 @@ ${msg1}`, 3e4); await this.updatePlugin(bp, onlyCheckDontUpdate); } const msg2 = `Checking for plugin updates COMPLETED`; - this.plugin.log(msg2, true); + await this.plugin.log(msg2, true); if (showInfo) { - newNotice.hide(); - ToastMessage(this.plugin, msg2, 10); + if (newNotice) { + newNotice.hide(); + } + toastMessage(this.plugin, msg2, 10); } } /** * Removes the beta plugin from the list of beta plugins (does not delete them from disk) * - * @param {string} betaPluginID repository path + * @param betaPluginID - repository path * - * @return {Promise} [return description] */ - async deletePlugin(repositoryPath) { + deletePlugin(repositoryPath) { const msg = `Removed ${repositoryPath} from BRAT plugin list`; - this.plugin.log(msg, true); - this.plugin.settings.pluginList = this.plugin.settings.pluginList.filter((b) => b != repositoryPath); + void this.plugin.log(msg, true); + this.plugin.settings.pluginList = this.plugin.settings.pluginList.filter( + (b) => b !== repositoryPath + ); this.plugin.settings.pluginSubListFrozenVersion = this.plugin.settings.pluginSubListFrozenVersion.filter( - (b) => b.repo != repositoryPath + (b) => b.repo !== repositoryPath ); - this.plugin.saveSettings(); + void this.plugin.saveSettings(); } /** * Returns a list of plugins that are currently enabled or currently disabled * - * @param {boolean[]} enabled true for enabled plugins, false for disabled plutings + * @param enabled - true for enabled plugins, false for disabled plutings * - * @return {PluginManifest[]} manifests of plugins + * @returns manifests of plugins */ getEnabledDisabledPlugins(enabled) { const pl = this.plugin.app.plugins; const manifests = Object.values(pl.manifests); - const enabledPlugins = Object.values(pl.plugins).map((p) => p.manifest); - return enabled ? manifests.filter((manifest) => enabledPlugins.find((pluginName) => manifest.id === pluginName.id)) : manifests.filter((manifest) => !enabledPlugins.find((pluginName) => manifest.id === pluginName.id)); + const enabledPlugins = Object.values(pl.plugins).map( + (p) => p.manifest + ); + return enabled ? manifests.filter( + (manifest) => enabledPlugins.find((pluginName) => manifest.id === pluginName.id) + ) : manifests.filter( + (manifest) => !enabledPlugins.find((pluginName) => manifest.id === pluginName.id) + ); } }; @@ -1584,26 +1786,25 @@ function addIcons() { // src/utils/logging.ts var import_obsidian9 = require("obsidian"); var import_obsidian_daily_notes_interface = __toESM(require_main()); -function logger(plugin, textToLog, verboseLoggingOn = false) { +async function logger(plugin, textToLog, verboseLoggingOn = false) { if (plugin.settings.debuggingMode) console.log("BRAT: " + textToLog); if (plugin.settings.loggingEnabled) { - if (plugin.settings.loggingVerboseEnabled === false && verboseLoggingOn === true) { + if (!plugin.settings.loggingVerboseEnabled && verboseLoggingOn) { return; } else { const fileName = plugin.settings.loggingPath + ".md"; const dateOutput = "[[" + (0, import_obsidian9.moment)().format((0, import_obsidian_daily_notes_interface.getDailyNoteSettings)().format).toString() + "]] " + (0, import_obsidian9.moment)().format("HH:mm"); - const machineName = import_obsidian9.Platform.isDesktop ? window.require("os").hostname() : "MOBILE"; + const os = window.require("os"); + const machineName = import_obsidian9.Platform.isDesktop ? os.hostname() : "MOBILE"; let output = dateOutput + " " + machineName + " " + textToLog.replace("\n", " ") + "\n\n"; - setTimeout(async () => { - if (await plugin.app.vault.adapter.exists(fileName) === true) { - const fileContents = await plugin.app.vault.adapter.read(fileName); - output = output + fileContents; - const file = plugin.app.vault.getAbstractFileByPath(fileName); - await plugin.app.vault.modify(file, output); - } else - await plugin.app.vault.create(fileName, output); - }, 10); + if (await plugin.app.vault.adapter.exists(fileName)) { + const fileContents = await plugin.app.vault.adapter.read(fileName); + output = output + fileContents; + const file = plugin.app.vault.getAbstractFileByPath(fileName); + await plugin.app.vault.modify(file, output); + } else + await plugin.app.vault.create(fileName, output); } } } @@ -1613,13 +1814,18 @@ var import_obsidian10 = require("obsidian"); var GenericFuzzySuggester = class extends import_obsidian10.FuzzySuggestModal { constructor(plugin) { super(plugin.app); - this.scope.register(["Shift"], "Enter", (evt) => this.enterTrigger(evt)); - this.scope.register(["Ctrl"], "Enter", (evt) => this.enterTrigger(evt)); + this.data = []; + this.scope.register(["Shift"], "Enter", (evt) => { + this.enterTrigger(evt); + }); + this.scope.register(["Ctrl"], "Enter", (evt) => { + this.enterTrigger(evt); + }); } setSuggesterData(suggesterData) { this.data = suggesterData; } - async display(callBack) { + display(callBack) { this.callbackFunction = callBack; this.open(); } @@ -1632,12 +1838,12 @@ var GenericFuzzySuggester = class extends import_obsidian10.FuzzySuggestModal { onChooseItem() { return; } - // required by TS, but not using renderSuggestion(item, el) { el.createEl("div", { text: item.item.display }); } enterTrigger(evt) { - const selectedText = document.querySelector(".suggestion-item.is-selected div").textContent; + var _a; + const selectedText = (_a = document.querySelector(".suggestion-item.is-selected div")) == null ? void 0 : _a.textContent; const item = this.data.find((i) => i.display === selectedText); if (item) { this.invokeCallback(item, evt); @@ -1648,7 +1854,9 @@ var GenericFuzzySuggester = class extends import_obsidian10.FuzzySuggestModal { this.invokeCallback(item.item, evt); } invokeCallback(item, evt) { - this.callbackFunction(item, evt); + if (typeof this.callbackFunction === "function") { + this.callbackFunction(item, evt); + } } }; @@ -1661,8 +1869,8 @@ var PluginCommands = class { icon: "BratIcon", name: "Plugins: Add a beta plugin for testing", showInRibbon: true, - callback: async () => { - await this.plugin.betaPlugins.displayAddNewPluginModal(false, false); + callback: () => { + this.plugin.betaPlugins.displayAddNewPluginModal(false, false); } }, { @@ -1670,8 +1878,8 @@ var PluginCommands = class { icon: "BratIcon", name: "Plugins: Add a beta plugin with frozen version based on a release tag", showInRibbon: true, - callback: async () => { - await this.plugin.betaPlugins.displayAddNewPluginModal(false, true); + callback: () => { + this.plugin.betaPlugins.displayAddNewPluginModal(false, true); } }, { @@ -1680,7 +1888,7 @@ var PluginCommands = class { name: "Plugins: Check for updates to all beta plugins and UPDATE", showInRibbon: true, callback: async () => { - await this.plugin.betaPlugins.checkForUpdatesAndInstallUpdates(true, false); + await this.plugin.betaPlugins.checkForPluginUpdatesAndInstallUpdates(true, false); } }, { @@ -1689,7 +1897,7 @@ var PluginCommands = class { name: "Plugins: Only check for updates to beta plugins, but don't Update", showInRibbon: true, callback: async () => { - await this.plugin.betaPlugins.checkForUpdatesAndInstallUpdates(true, true); + await this.plugin.betaPlugins.checkForPluginUpdatesAndInstallUpdates(true, true); } }, { @@ -1697,19 +1905,21 @@ var PluginCommands = class { icon: "BratIcon", name: "Plugins: Choose a single plugin version to update", showInRibbon: true, - callback: async () => { - const pluginSubListFrozenVersionNames = new Set(this.plugin.settings.pluginSubListFrozenVersion.map((f) => f.repo)); + callback: () => { + const pluginSubListFrozenVersionNames = new Set( + this.plugin.settings.pluginSubListFrozenVersion.map((f) => f.repo) + ); const pluginList = Object.values(this.plugin.settings.pluginList).filter((f) => !pluginSubListFrozenVersionNames.has(f)).map((m) => { return { display: m, info: m }; }); const gfs = new GenericFuzzySuggester(this.plugin); gfs.setSuggesterData(pluginList); - await gfs.display(async (results) => { + gfs.display((results) => { const msg = `Checking for updates for ${results.info}`; - this.plugin.log(msg, true); - ToastMessage(this.plugin, ` + void this.plugin.log(msg, true); + toastMessage(this.plugin, ` ${msg}`, 3); - await this.plugin.betaPlugins.updatePlugin(results.info, false, true); + void this.plugin.betaPlugins.updatePlugin(results.info, false, true); }); } }, @@ -1718,19 +1928,26 @@ ${msg}`, 3); icon: "BratIcon", name: "Plugins: Choose a single plugin to reinstall", showInRibbon: true, - callback: async () => { - const pluginSubListFrozenVersionNames = new Set(this.plugin.settings.pluginSubListFrozenVersion.map((f) => f.repo)); + callback: () => { + const pluginSubListFrozenVersionNames = new Set( + this.plugin.settings.pluginSubListFrozenVersion.map((f) => f.repo) + ); const pluginList = Object.values(this.plugin.settings.pluginList).filter((f) => !pluginSubListFrozenVersionNames.has(f)).map((m) => { return { display: m, info: m }; }); const gfs = new GenericFuzzySuggester(this.plugin); gfs.setSuggesterData(pluginList); - await gfs.display(async (results) => { + gfs.display((results) => { const msg = `Reinstalling ${results.info}`; - ToastMessage(this.plugin, ` + toastMessage(this.plugin, ` ${msg}`, 3); - this.plugin.log(msg, true); - await this.plugin.betaPlugins.updatePlugin(results.info, false, false, true); + void this.plugin.log(msg, true); + void this.plugin.betaPlugins.updatePlugin( + results.info, + false, + false, + true + ); }); } }, @@ -1739,16 +1956,22 @@ ${msg}`, 3); icon: "BratIcon", name: "Plugins: Restart a plugin that is already installed", showInRibbon: true, - callback: async () => { - const pluginList = Object.values(this.plugin.app.plugins.manifests).map((m) => { + callback: () => { + const pluginList = Object.values( + this.plugin.app.plugins.manifests + ).map((m) => { return { display: m.id, info: m.id }; }); const gfs = new GenericFuzzySuggester(this.plugin); gfs.setSuggesterData(pluginList); - await gfs.display(async (results) => { - ToastMessage(this.plugin, `${results.info} -Plugin reloading .....`, 5); - await this.plugin.betaPlugins.reloadPlugin(results.info); + gfs.display((results) => { + toastMessage( + this.plugin, + `${results.info} +Plugin reloading .....`, + 5 + ); + void this.plugin.betaPlugins.reloadPlugin(results.info); }); } }, @@ -1757,17 +1980,17 @@ Plugin reloading .....`, 5); icon: "BratIcon", name: "Plugins: Disable a plugin - toggle it off", showInRibbon: true, - callback: async () => { + callback: () => { const pluginList = this.plugin.betaPlugins.getEnabledDisabledPlugins(true).map((manifest) => { return { display: `${manifest.name} (${manifest.id})`, info: manifest.id }; }); const gfs = new GenericFuzzySuggester(this.plugin); gfs.setSuggesterData(pluginList); - await gfs.display(async (results) => { - this.plugin.log(`${results.display} plugin disabled`, false); + gfs.display((results) => { + void this.plugin.log(`${results.display} plugin disabled`, false); if (this.plugin.settings.debuggingMode) console.log(results.info); - await this.plugin.app.plugins.disablePluginAndSave(results.info); + void this.plugin.app.plugins.disablePluginAndSave(results.info); }); } }, @@ -1776,15 +1999,15 @@ Plugin reloading .....`, 5); icon: "BratIcon", name: "Plugins: Enable a plugin - toggle it on", showInRibbon: true, - callback: async () => { + callback: () => { const pluginList = this.plugin.betaPlugins.getEnabledDisabledPlugins(false).map((manifest) => { return { display: `${manifest.name} (${manifest.id})`, info: manifest.id }; }); const gfs = new GenericFuzzySuggester(this.plugin); gfs.setSuggesterData(pluginList); - await gfs.display(async (results) => { - this.plugin.log(`${results.display} plugin enabled`, false); - await this.plugin.app.plugins.enablePluginAndSave(results.info); + gfs.display((results) => { + void this.plugin.log(`${results.display} plugin enabled`, false); + void this.plugin.app.plugins.enablePluginAndSave(results.info); }); } }, @@ -1794,20 +2017,28 @@ Plugin reloading .....`, 5); name: "Plugins: Open the GitHub repository for a plugin", showInRibbon: true, callback: async () => { - const communityPlugins = await grabCommmunityPluginList(this.plugin.settings.debuggingMode); - const communityPluginList = Object.values(communityPlugins).map((p) => { - return { display: `Plugin: ${p.name} (${p.repo})`, info: p.repo }; - }); - const bratList = Object.values(this.plugin.settings.pluginList).map((p) => { - return { display: "BRAT: " + p, info: p }; - }); - communityPluginList.forEach((si) => bratList.push(si)); - const gfs = new GenericFuzzySuggester(this.plugin); - gfs.setSuggesterData(bratList); - await gfs.display(async (results) => { - if (results.info) - window.open(`https://github.com/${results.info}`); - }); + const communityPlugins = await grabCommmunityPluginList( + this.plugin.settings.debuggingMode + ); + if (communityPlugins) { + const communityPluginList = Object.values( + communityPlugins + ).map((p) => { + return { display: `Plugin: ${p.name} (${p.repo})`, info: p.repo }; + }); + const bratList = Object.values( + this.plugin.settings.pluginList + ).map((p) => { + return { display: "BRAT: " + p, info: p }; + }); + communityPluginList.forEach((si) => bratList.push(si)); + const gfs = new GenericFuzzySuggester(this.plugin); + gfs.setSuggesterData(bratList); + gfs.display((results) => { + if (results.info) + window.open(`https://github.com/${results.info}`); + }); + } } }, { @@ -1816,16 +2047,22 @@ Plugin reloading .....`, 5); name: "Themes: Open the GitHub repository for a theme (appearance)", showInRibbon: true, callback: async () => { - const communityTheme = await grabCommmunityThemesList(this.plugin.settings.debuggingMode); - const communityThemeList = Object.values(communityTheme).map((p) => { - return { display: `Theme: ${p.name} (${p.repo})`, info: p.repo }; - }); - const gfs = new GenericFuzzySuggester(this.plugin); - gfs.setSuggesterData(communityThemeList); - await gfs.display(async (results) => { - if (results.info) - window.open(`https://github.com/${results.info}`); - }); + const communityTheme = await grabCommmunityThemesList( + this.plugin.settings.debuggingMode + ); + if (communityTheme) { + const communityThemeList = Object.values(communityTheme).map( + (p) => { + return { display: `Theme: ${p.name} (${p.repo})`, info: p.repo }; + } + ); + const gfs = new GenericFuzzySuggester(this.plugin); + gfs.setSuggesterData(communityThemeList); + gfs.display((results) => { + if (results.info) + window.open(`https://github.com/${results.info}`); + }); + } } }, { @@ -1833,18 +2070,22 @@ Plugin reloading .....`, 5); icon: "BratIcon", name: "Plugins: Open Plugin Settings Tab", showInRibbon: true, - callback: async () => { + callback: () => { const settings = this.plugin.app.setting; - const listOfPluginSettingsTabs = Object.values(settings.pluginTabs).map((t) => { + const listOfPluginSettingsTabs = Object.values( + settings.pluginTabs + ).map((t) => { return { display: "Plugin: " + t.name, info: t.id }; }); const gfs = new GenericFuzzySuggester(this.plugin); - const listOfCoreSettingsTabs = Object.values(settings.settingTabs).map((t) => { + const listOfCoreSettingsTabs = Object.values( + settings.settingTabs + ).map((t) => { return { display: "Core: " + t.name, info: t.id }; }); listOfPluginSettingsTabs.forEach((si) => listOfCoreSettingsTabs.push(si)); gfs.setSuggesterData(listOfCoreSettingsTabs); - await gfs.display(async (results) => { + gfs.display((results) => { settings.open(); settings.openTabById(results.info); }); @@ -1855,7 +2096,7 @@ Plugin reloading .....`, 5); icon: "BratIcon", name: "Themes: Grab a beta theme for testing from a Github repository", showInRibbon: true, - callback: async () => { + callback: () => { new AddNewTheme(this.plugin).open(); } }, @@ -1864,29 +2105,33 @@ Plugin reloading .....`, 5); icon: "BratIcon", name: "Themes: Update beta themes", showInRibbon: true, - callback: async () => await themesCheckAndUpdates(this.plugin, true) + callback: async () => { + await themesCheckAndUpdates(this.plugin, true); + } }, { id: "BRAT-allCommands", icon: "BratIcon", name: "All Commands list", showInRibbon: false, - callback: async () => this.ribbonDisplayCommands() + callback: () => { + this.ribbonDisplayCommands(); + } } ]; this.plugin = plugin; - this.bratCommands.forEach(async (item) => { + this.bratCommands.forEach((item) => { this.plugin.addCommand({ id: item.id, name: item.name, icon: item.icon, - callback: async () => { - await item.callback(); + callback: () => { + item.callback(); } }); }); } - async ribbonDisplayCommands() { + ribbonDisplayCommands() { const bratCommandList = []; this.bratCommands.forEach((cmd) => { if (cmd.showInRibbon) @@ -1894,43 +2139,56 @@ Plugin reloading .....`, 5); }); const gfs = new GenericFuzzySuggester(this.plugin); const settings = this.plugin.app.setting; - const listOfCoreSettingsTabs = Object.values(settings.settingTabs).map((t) => { + const listOfCoreSettingsTabs = Object.values( + settings.settingTabs + ).map((t) => { return { display: "Core: " + t.name, - info: async () => { + info: () => { settings.open(); settings.openTabById(t.id); } }; }); - const listOfPluginSettingsTabs = Object.values(settings.pluginTabs).map((t) => { + const listOfPluginSettingsTabs = Object.values( + settings.pluginTabs + ).map((t) => { return { display: "Plugin: " + t.name, - info: async () => { + info: () => { settings.open(); settings.openTabById(t.id); } }; }); - bratCommandList.push({ display: "---- Core Plugin Settings ----", info: async () => { - await this.ribbonDisplayCommands(); - } }); + bratCommandList.push({ + display: "---- Core Plugin Settings ----", + info: () => { + this.ribbonDisplayCommands(); + } + }); listOfCoreSettingsTabs.forEach((si) => bratCommandList.push(si)); - bratCommandList.push({ display: "---- Plugin Settings ----", info: async () => { - await this.ribbonDisplayCommands(); - } }); + bratCommandList.push({ + display: "---- Plugin Settings ----", + info: () => { + this.ribbonDisplayCommands(); + } + }); listOfPluginSettingsTabs.forEach((si) => bratCommandList.push(si)); gfs.setSuggesterData(bratCommandList); - await gfs.display(async (results) => await results.info()); + gfs.display((results) => { + if (typeof results.info === "function") { + results.info(); + } + }); } }; // src/utils/BratAPI.ts var BratAPI = class { constructor(plugin) { - // eslint-disable-next-line @typescript-eslint/no-explicit-any this.console = (logDescription, ...outputs) => { - console.log("BRAT: " + logDescription, outputs); + console.log("BRAT: " + logDescription, ...outputs); }; this.themes = { themeseCheckAndUpates: async (showInfo) => { @@ -1940,18 +2198,26 @@ var BratAPI = class { const scrubbedAddress = cssGithubRepository.replace("https://github.com/", ""); await themeSave(this.plugin, scrubbedAddress, true); }, - themesDelete: async (cssGithubRepository) => { + themesDelete: (cssGithubRepository) => { const scrubbedAddress = cssGithubRepository.replace("https://github.com/", ""); - await themeDelete(this.plugin, scrubbedAddress); + themeDelete(this.plugin, scrubbedAddress); }, grabCommmunityThemeCssFile: async (repositoryPath, betaVersion = false) => { - return await grabCommmunityThemeCssFile(repositoryPath, betaVersion, this.plugin.settings.debuggingMode); + return await grabCommmunityThemeCssFile( + repositoryPath, + betaVersion, + this.plugin.settings.debuggingMode + ); }, grabChecksumOfThemeCssFile: async (repositoryPath, betaVersion = false) => { - return await grabChecksumOfThemeCssFile(repositoryPath, betaVersion, this.plugin.settings.debuggingMode); + return await grabChecksumOfThemeCssFile( + repositoryPath, + betaVersion, + this.plugin.settings.debuggingMode + ); }, - grabLastCommitDateForAFile: async (repositoryPath, path) => { - return await grabLastCommitDateForAFile(repositoryPath, path); + grabLastCommitDateForFile: async (repositoryPath, path) => { + return await grabLastCommitDateForFile(repositoryPath, path); } }; this.plugin = plugin; @@ -1962,43 +2228,45 @@ var BratAPI = class { var ThePlugin = class extends import_obsidian11.Plugin { constructor() { super(...arguments); - this.appName = "Obsidian42 - Beta Reviewer's Auto-update Tool (BRAT)"; - this.appID = "obsidian42-brat"; + this.APP_NAME = "Obsidian42 - Beta Reviewer's Auto-update Tool (BRAT)"; + this.APP_ID = "obsidian42-brat"; + this.settings = DEFAULT_SETTINGS; + this.betaPlugins = new BetaPlugins(this); + this.commands = new PluginCommands(this); + this.bratApi = new BratAPI(this); } async onload() { console.log("loading Obsidian42 - BRAT"); await this.loadSettings(); this.addSettingTab(new BratSettingsTab(this.app, this)); - this.betaPlugins = new BetaPlugins(this); - this.commands = new PluginCommands(this); addIcons(); - if (this.settings.ribbonIconEnabled) - this.showRibbonButton(); + this.showRibbonButton(); this.app.workspace.onLayoutReady(() => { if (this.settings.updateAtStartup) { - setTimeout(async () => { - await this.betaPlugins.checkForUpdatesAndInstallUpdates(false); + setTimeout(() => { + void this.betaPlugins.checkForPluginUpdatesAndInstallUpdates(false); }, 6e4); } if (this.settings.updateThemesAtStartup) { - setTimeout(async () => { - await themesCheckAndUpdates(this, false); + setTimeout(() => { + void themesCheckAndUpdates(this, false); }, 12e4); } - setTimeout(async () => { - this.bratAPI = new BratAPI(this); - globalThis.bratAPI = this.bratAPI; + setTimeout(() => { + window.bratAPI = this.bratApi; }, 500); }); } showRibbonButton() { - this.ribbonIcon = this.addRibbonIcon("BratIcon", "BRAT", async () => this.commands.ribbonDisplayCommands()); + this.addRibbonIcon("BratIcon", "BRAT", () => { + this.commands.ribbonDisplayCommands(); + }); } - log(textToLog, verbose = false) { - logger(this, textToLog, verbose); + async log(textToLog, verbose = false) { + await logger(this, textToLog, verbose); } onunload() { - console.log("unloading " + this.appName); + console.log("unloading " + this.APP_NAME); } async loadSettings() { this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData()); diff --git a/.obsidian/plugins/obsidian42-brat/manifest.json b/.obsidian/plugins/obsidian42-brat/manifest.json index 4ca6a674..f5d8704b 100644 --- a/.obsidian/plugins/obsidian42-brat/manifest.json +++ b/.obsidian/plugins/obsidian42-brat/manifest.json @@ -1,15 +1,15 @@ { - "id": "obsidian42-brat", - "name": "Obsidian42 - BRAT", - "version": "0.7.3", - "minAppVersion": "1.4.16", - "description": "Easily install a beta version of a plugin for testing.", - "author": "TfTHacker", - "authorUrl": "https://github.com/TfTHacker/obsidian42-brat", - "helpUrl": "https://tfthacker.com/BRAT", - "isDesktopOnly": false, - "fundingUrl": { - "Buy Me a Coffee": "https://bit.ly/o42-kofi", - "Visit my site": "https://tfthacker.com" - } -} \ No newline at end of file + "id": "obsidian42-brat", + "name": "BRAT", + "version": "0.8.0", + "minAppVersion": "1.4.16", + "description": "Easily install a beta version of a plugin for testing.", + "author": "TfTHacker", + "authorUrl": "https://github.com/TfTHacker/obsidian42-brat", + "helpUrl": "https://tfthacker.com/BRAT", + "isDesktopOnly": false, + "fundingUrl": { + "Buy Me a Coffee": "https://bit.ly/o42-kofi", + "Visit my site": "https://tfthacker.com" + } +} diff --git a/.obsidian/plugins/obsidian42-brat/styles.css b/.obsidian/plugins/obsidian42-brat/styles.css index 92e64664..596067ad 100644 --- a/.obsidian/plugins/obsidian42-brat/styles.css +++ b/.obsidian/plugins/obsidian42-brat/styles.css @@ -1,3 +1,3 @@ .brat-modal .modal-button-container { - margin-top: 5px !important; -} \ No newline at end of file + margin-top: 5px !important; +} diff --git a/.obsidian/plugins/quickadd/data.json b/.obsidian/plugins/quickadd/data.json index 2f922cf1..dfc9f4e6 100644 --- a/.obsidian/plugins/quickadd/data.json +++ b/.obsidian/plugins/quickadd/data.json @@ -48,7 +48,7 @@ "devMode": false, "templateFolderPath": "00.01 Admin/Templates", "announceUpdates": true, - "version": "1.6.0", + "version": "1.6.1", "disableOnlineFeatures": true, "ai": { "OpenAIApiKey": "", diff --git a/.obsidian/plugins/quickadd/main.js b/.obsidian/plugins/quickadd/main.js index e16297ff..c2754121 100644 --- a/.obsidian/plugins/quickadd/main.js +++ b/.obsidian/plugins/quickadd/main.js @@ -11156,6 +11156,18 @@ function getModelMaxTokens(model) { } } +// src/ai/preventCursorChange.ts +function preventCursorChange() { + const cursor = app.workspace.activeEditor?.editor?.getCursor(); + const selection = app.workspace.activeEditor?.editor?.listSelections(); + return () => { + if (cursor) + app.workspace.activeEditor?.editor?.setCursor(cursor); + if (selection) + app.workspace.activeEditor?.editor?.setSelections(selection); + }; +} + // src/ai/OpenAIRequest.ts function OpenAIRequest(apiKey, model, systemPrompt, modelParams = {}) { return async function makeRequest(prompt) { @@ -11172,7 +11184,8 @@ function OpenAIRequest(apiKey, model, systemPrompt, modelParams = {}) { ); } try { - const response = await (0, import_obsidian15.requestUrl)({ + const restoreCursor = preventCursorChange(); + const _response = (0, import_obsidian15.requestUrl)({ url: `https://api.openai.com/v1/chat/completions`, method: "POST", headers: { @@ -11188,6 +11201,8 @@ function OpenAIRequest(apiKey, model, systemPrompt, modelParams = {}) { ] }) }); + restoreCursor(); + const response = await _response; return response.json; } catch (error) { console.log(error); diff --git a/.obsidian/plugins/quickadd/manifest.json b/.obsidian/plugins/quickadd/manifest.json index 7307bdb3..f080c5aa 100644 --- a/.obsidian/plugins/quickadd/manifest.json +++ b/.obsidian/plugins/quickadd/manifest.json @@ -1,7 +1,7 @@ { "id": "quickadd", "name": "QuickAdd", - "version": "1.6.0", + "version": "1.6.1", "minAppVersion": "0.13.19", "description": "Quickly add new pages or content to your vault.", "author": "Christian B. B. Houmann", diff --git a/.obsidian/plugins/templater-obsidian/main.js b/.obsidian/plugins/templater-obsidian/main.js index 4bf42804..443cc44a 100644 --- a/.obsidian/plugins/templater-obsidian/main.js +++ b/.obsidian/plugins/templater-obsidian/main.js @@ -70,7 +70,9 @@ var TemplaterError = class extends Error { super(msg); this.console_msg = console_msg; this.name = this.constructor.name; - Error.captureStackTrace(this, this.constructor); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } } }; async function errorWrapper(fn2, msg) { diff --git a/.obsidian/plugins/templater-obsidian/manifest.json b/.obsidian/plugins/templater-obsidian/manifest.json index 335c8d73..c9404c9a 100644 --- a/.obsidian/plugins/templater-obsidian/manifest.json +++ b/.obsidian/plugins/templater-obsidian/manifest.json @@ -1,7 +1,7 @@ { "id": "templater-obsidian", "name": "Templater", - "version": "1.18.2", + "version": "1.18.3", "description": "Create and use templates", "minAppVersion": "0.11.13", "author": "SilentVoid", diff --git a/.obsidian/workspace-mobile.json b/.obsidian/workspace-mobile.json index 260e9d24..6b08658d 100644 --- a/.obsidian/workspace-mobile.json +++ b/.obsidian/workspace-mobile.json @@ -69,7 +69,7 @@ "state": { "type": "markdown", "state": { - "file": "00.01 Admin/Calendars/2023-12-04.md", + "file": "00.01 Admin/Calendars/2023-12-09.md", "mode": "preview", "source": true } @@ -158,7 +158,7 @@ "state": { "type": "backlink", "state": { - "file": "00.01 Admin/Calendars/2023-12-04.md", + "file": "00.01 Admin/Calendars/2023-12-09.md", "collapseAll": false, "extraContext": false, "sortOrder": "alphabetical", @@ -175,7 +175,7 @@ "state": { "type": "outgoing-link", "state": { - "file": "00.01 Admin/Calendars/2023-12-04.md", + "file": "00.01 Admin/Calendars/2023-12-09.md", "linksCollapsed": false, "unlinkedCollapsed": false } @@ -237,42 +237,42 @@ "obsidian-metatable:Metatable": false, "obsidian-full-calendar:Open Full Calendar": false, "obsidian-book-search-plugin:Create new book note": false, - "templater-obsidian:Templater": false, "meld-encrypt:New encrypted note": false, "meld-encrypt:Convert to or from an Encrypted note": false, "obsidian-read-it-later:ReadItLater: Save clipboard": false, - "obsidian42-brat:BRAT": false, - "obsidian-memos:Memos": false + "obsidian-memos:Memos": false, + "templater-obsidian:Templater": false, + "obsidian42-brat:BRAT": false } }, "active": "2d9db1814950ef3b", "lastOpenFiles": [ - "03.03 Food & Wine/Udon in Buttery Tomato n Soy broth.md", - "00.01 Admin/Calendars/2023-12-04.md", + "03.04 Cinematheque/The Magnificent Seven (1960).md", + "00.01 Admin/Calendars/2023-12-09.md", + "03.04 Cinematheque/@Cinematheque.md", + "03.04 Cinematheque/Tschugger (2021–).md", + "00.01 Admin/Calendars/2023-12-08.md", + "03.03 Food & Wine/Chilli con Carne.md", "01.02 Home/@Main Dashboard.md", - "00.03 News/C.T.E. Study Finds That Young Football Players Are Getting the Disease.md", - "00.03 News/Inside Foxconn’s struggle to make iPhones in India.md", - "00.03 News/The Plight of the Oldest Sister.md", - "00.03 News/@News.md", - "00.03 News/Understanding Argument Styles Is The Secret To A Happy Relationship.md", - "00.03 News/The Miseducation of Maria Montessori.md", - "00.03 News/Midlife isn't a crisis, but sleep, stress and happiness feel a little different after 35 – or whenever middle age actually begins.md", - "00.03 News/On the pleasures of hand-writing letters you’ll never send.md", - "00.03 News/Babies and chicks help solve one of psychology’s oldest puzzles.md", - "00.03 News/Are Greeting Card Messages Getting Longer A Very Serious Investigation.md", - "00.03 News/The Power of Emotional Honesty.md", - "00.03 News/Piecing Together My Father’s Murder.md", - "00.03 News/My Father, My Faith, and Donald Trump.md", - "03.03 Food & Wine/Chicken Schnitzel.md", - "01.02 Home/Vinyls.md", - "00.01 Admin/Calendars/2023-12-03.md", - "00.02 Inbox/Seven Pillars of Wisdom.md", - "03.01 Reading list/Martin Eden.md", - "03.02 Travels/Grindelwald.md", - "03.02 Travels/Skiing in Switzerland.md", - "03.02 Travels/Arosa.md", - "00.03 News/The Great Grift How billions in COVID-19 relief aid was stolen or wasted.md", - "00.01 Admin/Calendars/2023-12-02.md", + "03.04 Cinematheque/Barbie (2023).md", + "01.02 Home/@Shopping list.md", + "00.01 Admin/Calendars/2023-12-07.md", + "03.04 Cinematheque/Serpico (1973).md", + "00.08 Bookmarks/Bookmarks - Mac applications.md", + "00.01 Admin/Calendars/2023-12-06.md", + "00.03 News/Bill Watterson’s Life After “Calvin and Hobbes”.md", + "00.03 News/What Really Happened to JFK.md", + "02.02 Paris/Recommendation list (Paris).md", + "02.02 Paris/@Commerces Paris.md", + "02.02 Paris/@Bars Paris.md", + "02.02 Paris/Sürpriz.md", + "05.02 Networks/Server Tools.md", + "00.03 News/How Does the World’s Largest Hedge Fund Really Make Its Money.md", + "00.03 News/A Coder Considers the Waning Days of the Craft.md", + "00.03 News/Chasing Chop Suey Tracing Chinese Immigration Through Food.md", + "03.02 Travels/Wo Hop.md", + "03.02 Travels/Potluck Club.md", + "03.02 Travels/Bonnie's.md", "00.01 Admin/Pictures/Kolkowitzia/IMG_3910.jpg", "00.01 Admin/Pictures/Kolkowitzia/IMG_3911.jpg", "00.01 Admin/Pictures/Kolkowitzia", diff --git a/00.01 Admin/Calendars/2023-12-04.md b/00.01 Admin/Calendars/2023-12-04.md index 38ec80ed..8b0524a5 100644 --- a/00.01 Admin/Calendars/2023-12-04.md +++ b/00.01 Admin/Calendars/2023-12-04.md @@ -16,9 +16,9 @@ Stress: 25 FrontHeadBar: 5 EarHeadBar: 30 BackHeadBar: 20 -Water: 2.5 +Water: 3.5 Coffee: 3 -Steps: +Steps: 14942 Weight: Ski: IceSkating: diff --git a/00.01 Admin/Calendars/2023-12-05.md b/00.01 Admin/Calendars/2023-12-05.md new file mode 100644 index 00000000..498fc444 --- /dev/null +++ b/00.01 Admin/Calendars/2023-12-05.md @@ -0,0 +1,134 @@ +--- + +title: "🗒 Daily Note" +allDay: true +date: 2023-12-05 +Date: 2023-12-05 +DocType: Note +Hierarchy: +TimeStamp: +location: +CollapseMetaTable: true +Sleep: 8 +Happiness: 85 +Gratefulness: 90 +Stress: 25 +FrontHeadBar: 5 +EarHeadBar: 30 +BackHeadBar: 20 +Water: 3.33 +Coffee: 5 +Steps: 9338 +Weight: 91.4 +Ski: +IceSkating: +Riding: +Racket: +Football: +Swim: + +--- + +%% Parent:: [[@Life Admin]] %% + +--- + +[[2023-12-04|<< 🗓 Previous ]]       [[@Main Dashboard|Back]]       [[2023-12-06|🗓 Next >>]] + +--- + +  + +```button +name Record today's health +type command +action MetaEdit: Run MetaEdit +id EditMetaData +``` +^button-2023-12-05Edit + +```button +name Save +type command +action Save current file +id Save +``` +^button-2023-12-05NSave + +  + +# 2023-12-05 + +  + +> [!summary]+ +> Daily note for 2023-12-05 + +  + +```toc +style: number +``` + +  + +--- + +  + +### ✅ Tasks of the day + +  + +```tasks +not done +due on 2023-12-05 +path does not include Templates +hide backlinks +hide task count +``` + +  + +--- + +  + +### 📝 Memos + +  + +This section does serve for quick memos. + +  + + +%% --- %% +  + +--- + +  + +### 🗒 Notes + +  + +Loret ipsum + +  + +--- + +  + +### :link: Linked activity + +  + +```dataview +Table from [[2023-12-05]] +``` + +  +  \ No newline at end of file diff --git a/00.01 Admin/Calendars/2023-12-06.md b/00.01 Admin/Calendars/2023-12-06.md new file mode 100644 index 00000000..fc023092 --- /dev/null +++ b/00.01 Admin/Calendars/2023-12-06.md @@ -0,0 +1,134 @@ +--- + +title: "🗒 Daily Note" +allDay: true +date: 2023-12-06 +Date: 2023-12-06 +DocType: Note +Hierarchy: +TimeStamp: +location: +CollapseMetaTable: true +Sleep: 7.5 +Happiness: 85 +Gratefulness: 90 +Stress: 25 +FrontHeadBar: 5 +EarHeadBar: 30 +BackHeadBar: 20 +Water: 2.6 +Coffee: 5 +Steps: 4868 +Weight: +Ski: +IceSkating: +Riding: +Racket: +Football: +Swim: + +--- + +%% Parent:: [[@Life Admin]] %% + +--- + +[[2023-12-05|<< 🗓 Previous ]]       [[@Main Dashboard|Back]]       [[2023-12-07|🗓 Next >>]] + +--- + +  + +```button +name Record today's health +type command +action MetaEdit: Run MetaEdit +id EditMetaData +``` +^button-2023-12-06Edit + +```button +name Save +type command +action Save current file +id Save +``` +^button-2023-12-06NSave + +  + +# 2023-12-06 + +  + +> [!summary]+ +> Daily note for 2023-12-06 + +  + +```toc +style: number +``` + +  + +--- + +  + +### ✅ Tasks of the day + +  + +```tasks +not done +due on 2023-12-06 +path does not include Templates +hide backlinks +hide task count +``` + +  + +--- + +  + +### 📝 Memos + +  + +This section does serve for quick memos. + +  + + +%% --- %% +  + +--- + +  + +### 🗒 Notes + +  + +Loret ipsum + +  + +--- + +  + +### :link: Linked activity + +  + +```dataview +Table from [[2023-12-06]] +``` + +  +  \ No newline at end of file diff --git a/00.01 Admin/Calendars/2023-12-07.md b/00.01 Admin/Calendars/2023-12-07.md new file mode 100644 index 00000000..41385dd0 --- /dev/null +++ b/00.01 Admin/Calendars/2023-12-07.md @@ -0,0 +1,136 @@ +--- + +title: "🗒 Daily Note" +allDay: true +date: 2023-12-07 +Date: 2023-12-07 +DocType: Note +Hierarchy: +TimeStamp: +location: +CollapseMetaTable: true +Sleep: 5 +Happiness: 85 +Gratefulness: 90 +Stress: 25 +FrontHeadBar: 5 +EarHeadBar: 30 +BackHeadBar: 20 +Water: 2.5 +Coffee: 4 +Steps: 18897 +Weight: +Ski: +IceSkating: +Riding: +Racket: +Football: +Swim: + +--- + +%% Parent:: [[@Life Admin]] %% + +--- + +[[2023-12-06|<< 🗓 Previous ]]       [[@Main Dashboard|Back]]       [[2023-12-08|🗓 Next >>]] + +--- + +  + +```button +name Record today's health +type command +action MetaEdit: Run MetaEdit +id EditMetaData +``` +^button-2023-12-07Edit + +```button +name Save +type command +action Save current file +id Save +``` +^button-2023-12-07NSave + +  + +# 2023-12-07 + +  + +> [!summary]+ +> Daily note for 2023-12-07 + +  + +```toc +style: number +``` + +  + +--- + +  + +### ✅ Tasks of the day + +  + +```tasks +not done +due on 2023-12-07 +path does not include Templates +hide backlinks +hide task count +``` + +  + +--- + +  + +### 📝 Memos + +  + +This section does serve for quick memos. + +  + + +%% --- %% +  + +--- + +  + +### 🗒 Notes + +  + +🍴: [[Korean Barbecue-Style Meatballs]] + +📺: [[Serpico (1973)]] + +  + +--- + +  + +### :link: Linked activity + +  + +```dataview +Table from [[2023-12-07]] +``` + +  +  \ No newline at end of file diff --git a/00.01 Admin/Calendars/2023-12-08.md b/00.01 Admin/Calendars/2023-12-08.md new file mode 100644 index 00000000..395bbf18 --- /dev/null +++ b/00.01 Admin/Calendars/2023-12-08.md @@ -0,0 +1,137 @@ +--- + +title: "🗒 Daily Note" +allDay: true +date: 2023-12-08 +Date: 2023-12-08 +DocType: Note +Hierarchy: +TimeStamp: +location: +CollapseMetaTable: true +Sleep: 8 +Happiness: 85 +Gratefulness: 90 +Stress: 25 +FrontHeadBar: 5 +EarHeadBar: 30 +BackHeadBar: 20 +Water: 2.5 +Coffee: 4 +Steps: 11538 +Weight: +Ski: +IceSkating: +Riding: +Racket: +Football: +Swim: + +--- + +%% Parent:: [[@Life Admin]] %% + +--- + +[[2023-12-07|<< 🗓 Previous ]]       [[@Main Dashboard|Back]]       [[2023-12-09|🗓 Next >>]] + +--- + +  + +```button +name Record today's health +type command +action MetaEdit: Run MetaEdit +id EditMetaData +``` +^button-2023-12-08Edit + +```button +name Save +type command +action Save current file +id Save +``` +^button-2023-12-08NSave + +  + +# 2023-12-08 + +  + +> [!summary]+ +> Daily note for 2023-12-08 + +  + +```toc +style: number +``` + +  + +--- + +  + +### ✅ Tasks of the day + +  + +```tasks +not done +due on 2023-12-08 +path does not include Templates +hide backlinks +hide task count +``` + +  + +--- + +  + +### 📝 Memos + +  + +This section does serve for quick memos. + +  +- [x] 18:51 :plate_with_cutlery: [[Household]]: acheter un casse-noix 📅 2023-12-27 ✅ 2023-12-09 + + +%% --- %% +  + +--- + +  + +### 🗒 Notes + +  + +🍴: [[Spicy Szechuan Noodles with Garlic Chilli Oil]] + +📺: [[Barbie (2023)]] + +  + +--- + +  + +### :link: Linked activity + +  + +```dataview +Table from [[2023-12-08]] +``` + +  +  \ No newline at end of file diff --git a/00.01 Admin/Calendars/2023-12-09.md b/00.01 Admin/Calendars/2023-12-09.md new file mode 100644 index 00000000..832ee820 --- /dev/null +++ b/00.01 Admin/Calendars/2023-12-09.md @@ -0,0 +1,139 @@ +--- + +title: "🗒 Daily Note" +allDay: true +date: 2023-12-09 +Date: 2023-12-09 +DocType: Note +Hierarchy: +TimeStamp: +location: +CollapseMetaTable: true +Sleep: 8 +Happiness: 85 +Gratefulness: 90 +Stress: 25 +FrontHeadBar: 5 +EarHeadBar: 30 +BackHeadBar: 20 +Water: 1 +Coffee: 4 +Steps: +Weight: +Ski: +IceSkating: +Riding: +Racket: +Football: +Swim: + +--- + +%% Parent:: [[@Life Admin]] %% + +--- + +[[2023-12-08|<< 🗓 Previous ]]       [[@Main Dashboard|Back]]       [[2023-12-10|🗓 Next >>]] + +--- + +  + +```button +name Record today's health +type command +action MetaEdit: Run MetaEdit +id EditMetaData +``` +^button-2023-12-09Edit + +```button +name Save +type command +action Save current file +id Save +``` +^button-2023-12-09NSave + +  + +# 2023-12-09 + +  + +> [!summary]+ +> Daily note for 2023-12-09 + +  + +```toc +style: number +``` + +  + +--- + +  + +### ✅ Tasks of the day + +  + +```tasks +not done +due on 2023-12-09 +path does not include Templates +hide backlinks +hide task count +``` + +  + +--- + +  + +### 📝 Memos + +  + +This section does serve for quick memos. + +  +- [ ] 13:58 :family: [[Amaury de Villeneuve]]: Buy a set of knives for Xmas 📅2023-12-21 +- [ ] 15:16 :handshake: [[@Lifestyle|Social]]: Buy a Xmas gift for Pam 📅2023-12-27 +- [ ] 15:18 :train2: [[@Life Admin|Admin]]: Buy train tickets for Paris 📅2023-12-15 + + +%% --- %% +  + +--- + +  + +### 🗒 Notes + +  + +📺: [[The Magnificent Seven (1960)]], [[Tschugger (2021–)]] + +🍴: [[Chilli con Carne]] + +  + +--- + +  + +### :link: Linked activity + +  + +```dataview +Table from [[2023-12-09]] +``` + +  +  \ No newline at end of file diff --git a/00.03 News/A Coder Considers the Waning Days of the Craft.md b/00.03 News/A Coder Considers the Waning Days of the Craft.md index fc516f54..8e103d06 100644 --- a/00.03 News/A Coder Considers the Waning Days of the Craft.md +++ b/00.03 News/A Coder Considers the Waning Days of the Craft.md @@ -12,7 +12,7 @@ CollapseMetaTable: true --- Parent:: [[@News|News]] -Read:: 🟥 +Read:: [[2023-12-06]] --- diff --git a/00.03 News/Bill Watterson’s Life After “Calvin and Hobbes”.md b/00.03 News/Bill Watterson’s Life After “Calvin and Hobbes”.md index 874de590..2cb1679f 100644 --- a/00.03 News/Bill Watterson’s Life After “Calvin and Hobbes”.md +++ b/00.03 News/Bill Watterson’s Life After “Calvin and Hobbes”.md @@ -12,7 +12,7 @@ CollapseMetaTable: true --- Parent:: [[@News|News]] -Read:: 🟥 +Read:: [[2023-12-06]] --- diff --git a/00.03 News/Chasing Chop Suey Tracing Chinese Immigration Through Food.md b/00.03 News/Chasing Chop Suey Tracing Chinese Immigration Through Food.md index 811a7f2a..68faeced 100644 --- a/00.03 News/Chasing Chop Suey Tracing Chinese Immigration Through Food.md +++ b/00.03 News/Chasing Chop Suey Tracing Chinese Immigration Through Food.md @@ -12,7 +12,7 @@ CollapseMetaTable: true --- Parent:: [[@News|News]] -Read:: 🟥 +Read:: [[2023-12-06]] --- diff --git a/00.03 News/How Does the World’s Largest Hedge Fund Really Make Its Money.md b/00.03 News/How Does the World’s Largest Hedge Fund Really Make Its Money.md index 0a945f5f..86daea77 100644 --- a/00.03 News/How Does the World’s Largest Hedge Fund Really Make Its Money.md +++ b/00.03 News/How Does the World’s Largest Hedge Fund Really Make Its Money.md @@ -12,7 +12,7 @@ CollapseMetaTable: true --- Parent:: [[@News|News]] -Read:: 🟥 +Read:: [[2023-12-06]] --- @@ -30,23 +30,14 @@ id Save # How Does the World’s Largest Hedge Fund Really Make Its Money? -Advertisement - -[SKIP ADVERTISEMENT](https://www.nytimes.com/2023/11/01/business/how-does-the-worlds-largest-hedge-fund-really-make-its-money.html?unlocked_article_code=1.9Uw.CwL0.CsuqB1fopl2K&smid=url-share#after-top) - -The Great Read - Ray Dalio’s investing tactics have always been a closely kept secret, even inside Bridgewater Associates. Several years ago, some of Wall Street’s biggest names set out to discover his edge. ![Ray Dalio, wearing a suit and purple tie, sitting in front of a microphone. Behind him, the words “World Economic Forum” appear repeatedly on the wall.](https://static01.nyt.com/images/2023/11/05/multimedia/29The-Fund-Excerpt-qwvg/29The-Fund-Excerpt-qwvg-articleLarge.jpg?quality=75&auto=webp&disable=upscale) Since founding Bridgewater in his Manhattan apartment in 1975, Ray Dalio has been said to have developed prodigious skill at spotting, and making money from, big-picture global economic or political changes.Credit...Xinhua News Agency, via Getty Images -[Rob Copeland](https://www.nytimes.com/by/rob-copeland) - -Rob Copeland is a finance reporter for The Times. He is the author of “The Fund: Ray Dalio, Bridgewater Associates and the Unraveling of a Wall Street Legend,” from which this article is adapted. - -Published Nov. 1, 2023Updated Nov. 2, 2023 +Published Nov. 1, 2023 +Updated Nov. 2, 2023 For years, the whispered questions have passed from one Wall Street trading floor to the next. @@ -70,10 +61,6 @@ The book from which this excerpt is drawn is based on hundreds of interviews wit ## The Freelance Investigators -Image - -Bill Ackman was among the Wall Streeters who had questions about how Bridgewater made its money.Credit...NBCUniversal, via Getty Images - Three men, each with a vastly different background, took three different passes at the mystery of how Bridgewater picked its positions. In early 2015, Bill Ackman, the endlessly opinionated hedge fund manager, took the first whack. The billionaire founder of Pershing Square Capital had long found Mr. Dalio’s public pronouncements about his quantitative investment style to be generic and even nonsensical. At a charity event in February that year, Mr. Ackman grilled Mr. Dalio during an onstage interview about how Bridgewater handled the assets it managed. @@ -100,10 +87,6 @@ At 8:30 p.m. the day the report was published, Mr. Grant settled in on the couch “I’m not sure if you’ve seen the current issue of Grant’s,” Mr. Dalio said, according to Mr. Grant. Mr. Dalio’s message went on for nearly a half-hour detailing his complaints about the piece. -Image - -Jim Grant devoted an entire newsletter to investigating Bridgewater.Credit...Bebeto Matthews/Associated Press - Mr. Grant spent the next week on and off calls with various Bridgewater executives. He realized that he had gotten some crucial bits wrong regarding the fund’s regulatory filings and auditing relationship. Mr. Grant called into the television network CNBC to apologize, though overall, Mr. Grant said, he remained befuddled “about how it actually does business.” This all piqued the interest of a Boston financial investigator, Harry Markopolos, who had been a no-name analyst in the late 1990s when his boss asked him to reproduce a rival’s trading strategy that seemed to pay off handsomely. Mr. Markopolos couldn’t, but he figured out enough that he began chatting with the Securities and Exchange Commission. Six years later, when his warnings about Bernie Madoff proved right, Mr. Markopolos earned national fame. @@ -136,10 +119,6 @@ Satisfied, the S.E.C. stopped responding to requests from Mr. Markopolos and his As it turned out, by the time the S.E.C. received Mr. Markopolos’s submission, the regulators had already looked into Bridgewater. In the wake of the Madoff fraud, and never having really dug into the world’s biggest hedge fund, S.E.C. staff spent a stretch in Westport, deeply studying the firm’s operations. The S.E.C. did not much bother with how Bridgewater made money, just that it did indeed invest its clients’ accounts. -Image - -Harry Markopolos, who filed an S.E.C. whistle-blower report about Bridgewater, had earlier earned national fame when his warnings about Bernie Madoff proved correct.Credit...Desiree Navarro/Wireimage, via Getty Images - In fact, remarkably few people at Bridgewater were involved day to day with how the hedge fund made money. Of Bridgewater’s roughly 2,000 employees at its peak — and hundreds more temporary contractors — fewer than 20 percent were assigned to investments or related research. (The rest worked on operations tasks, including the expansion of Mr. Dalio’s “Principles.”) And of those investment staff members, many held responsibilities no more complicated than those of the average college student. They worked on economic history research projects and produced papers that Mr. Dalio would review and edit. @@ -158,10 +137,6 @@ In the first version, Bridgewater’s hedge funds were a meritocracy of ideas. E Every Friday Mr. Dalio’s assistants would deliver thick briefcases full of economic research, which a driver would whisk to Mr. Dalio’s mansion in Greenwich, Conn. The collection formed the basis for what Bridgewater called its “What’s Going On in the World” meeting, held every Monday morning. Mr. Dalio, along with Mr. Jensen and Bridgewater’s longtime co-chief investment officer Bob Prince, would sit at the front of the largest room on campus, where a river wound around a set of medieval-style buildings. Rows upon rows of staff members sat in front of them, as well as the odd visiting client invited to take in the show. -Image - -Greg Jensen, one of Mr. Dalio’s longtime deputies, was a member of Bridgewater’s closely held Circle of Trust.Credit...Simon Dawson/Bloomberg - With cameras recording so those in the rest of the firm could watch later, the room would debate for hours the grand topics of the day. It was a true spectacle. It was also almost entirely irrelevant to what Bridgewater did with its money. @@ -202,10 +177,6 @@ Bridgewater’s target was information about entire nations. According to employ Anywhere seemed fair game, even Kazakhstan. -Image - -Kazakhstan, where Bridgewater has developed relationships with government officials, is the former Soviet Union’s second-largest oil producer.Credit...Andrey Rudakov/Bloomberg - The Central Asian nation was not on the first page in any Wall Street manual. Ruled by an authoritarian government, it is the globe’s largest landlocked country yet sparsely populated. In 2013, Kazakhstan began developing what was then the most expensive oil project — a giant field in the Caspian Sea — helping it grow a $77 billion sovereign wealth fund. That money would have to be invested somewhere, and Bridgewater’s client services squad put a meeting on Mr. Dalio’s calendar with Berik Otemurat, the fund’s chief, a bureaucrat who had begun his career barely 10 years earlier. Mr. Dalio showed interest in the delegation. “What are they doing beforehand?” he asked Bridgewater’s marketing team. @@ -234,9 +205,6 @@ A spokesman for Mr. Dalio said all of his interactions with government officials ## No One Would Know -Image - -Janet Yellen kept more of a distance from Mr. Dalio than her predecessor had.Credit...Kenny Holston/The New York Times Back in America, Mr. Dalio’s influence slowly petered out. During and after his financial-crisis era fame, he’d had little trouble reaching the Federal Reserve chair, Ben Bernanke. Mr. Bernanke’s successor, Janet Yellen, however, apparently wasn’t as interested in the Bridgewater founder. Mr. Dalio would regularly rail to others at the company that Ms. Yellen wouldn’t return his calls or meet. @@ -246,10 +214,6 @@ The longest-term project for Mr. Dalio was in China, where he made frequent trip Mr. Dalio hired China Investment Corporation’s former chairman to a cushy job as head of a Dalio charity in China, and he became close with Wang Qishan, who would later become China’s vice premier and widely considered the second most powerful person in the country. Mr. Dalio would occasionally tell Chinese government representatives that when they invested with Bridgewater, their fees were not merely being sent back to America. “Whatever fees you pay, I will donate back to China personally,” he said in one meeting, according to a person present. -Image - -Mr. Dalio consistently found more success abroad, including in China.Credit...Lintao Zhang/Getty Images - In media interviews, Mr. Dalio stuck to a fixed, laudatory line about the country’s leadership. It was “very capable,” he said, over and again, sometimes repeating the phrase more than once in an interview. Those same leaders, he would also say inside Bridgewater, were quick to ask him for advice. To any reasonable observer — and even to the Chinese themselves — Mr. Dalio was the paradigm of a China booster. But there was also an advantage that could be played. He asked the Circle of Trust to help create a way for Bridgewater’s funds to place bets against Chinese assets, in an offshore way that China’s government couldn’t track. That way, when Bridgewater took the wrong side of China, no one would know. @@ -270,16 +234,11 @@ The group sat quietly, nervously waiting for the Bridgewater founder’s respons Mr. Dalio picked up the piece of paper, crumpled it into a ball and tossed it. -Audio produced by Adrienne Hurst. [Rob Copeland](https://www.nytimes.com/by/rob-copeland) is a finance reporter, writing about Wall Street and the banking industry. He is the author of "The Fund: Ray Dalio, Bridgewater Associates and the Unraveling of a Wall Street Legend," to be published in November 2023. [More about Rob Copeland](https://www.nytimes.com/by/rob-copeland) A version of this article appears in print on  , Section BU, Page 6 of the New York edition with the headline: How the Giant Of Hedge Funds Really Makes Its Money. [Order Reprints](https://www.parsintl.com/publication/the-new-york-times/) | [Today’s Paper](https://www.nytimes.com/section/todayspaper) | [Subscribe](https://www.nytimes.com/subscriptions/Multiproduct/lp8HYKU.html?campaignId=48JQY) -Advertisement - -[SKIP ADVERTISEMENT](https://www.nytimes.com/2023/11/01/business/how-does-the-worlds-largest-hedge-fund-really-make-its-money.html?unlocked_article_code=1.9Uw.CwL0.CsuqB1fopl2K&smid=url-share#after-bottom) -     diff --git a/00.03 News/What Really Happened to JFK.md b/00.03 News/What Really Happened to JFK.md index d916ac7f..0f4f28b5 100644 --- a/00.03 News/What Really Happened to JFK.md +++ b/00.03 News/What Really Happened to JFK.md @@ -12,7 +12,7 @@ CollapseMetaTable: true --- Parent:: [[@News|News]] -Read:: 🟥 +Read:: [[2023-12-06]] --- @@ -56,10 +56,6 @@ The President John F. Kennedy Assassination Records Collection Act of 1992 manda Among the first visitors to the JFK Assassination Records Collection was Jefferson Morley, then a 34-year-old editor from the Washington *Post*. Morley had made a name for himself in magazines in the 1980s. He helped break the Iran-Contra scandal for *The New Republic* and wrote a much-discussed gonzo essay about the War on Drugs for which he’d spent an evening smoking crack cocaine. By that time, he’d become Washington editor of *The Nation*. He drank with Christopher Hitchens, with whom he was once deported, after a gathering with some Czech dissidents, by that country’s secret police. “He was a little out there,” a colleague at the *Post* recalled. “But you want some people like that in the newsroom.” Morley had read about the Kennedy assassination for years as a hobby, but it never occurred to him that he might report on it himself. “I never thought I had anything to add,” he told me. “Until 1992.” -Jefferson Morley has become known as one of the most sober-minded assassination researchers. He spent so much time looking at CIA documents that he adopted the same filing system. Photo: Jonno Rattman. - -Jefferson Morley has become known as one of the most sober-minded assassination researchers. He spent so much time looking at CIA documents that he ad... Jefferson Morley has become known as one of the most sober-minded assassination researchers. He spent so much time looking at CIA documents that he adopted the same filing system. Photo: Jonno Rattman. - I visited Morley in Washington in September. He is now 65 and somewhat more demure than his younger self, if still combative, with a sweep of gray hair, a high brow, and a sharp nose that together lend him a vaguely avian aspect, an impression heightened by his tendency to cock his head quizzically, like an owl, and speak into the middle distance. We met at the brick rowhouse that he still shares with his second wife, with whom he is in the midst of a divorce. She will keep the house, and Morley was not yet certain where he would go, but they agreed that he could stay through “the coming JFK season,” as he put it. His small office is there, as is his personal file collection, three decades of once-classified records culled from the National Archives and stored in worn banker’s boxes, tens of thousands of photocopy sheets arranged chronologically and, in duplicate form, by subject matter. “If you use what we’ve learned since the ’90s to evaluate the government’s case,” he told me, “the government’s case disintegrates.” Morley, the author of three books on the CIA and the editor of a Substack blog of modest but impassioned following called *JFK Facts,* has made a name for himself among assassination researchers by attempting to approach Kennedy’s murder as if it were any other subject. “Journalists never report the JFK story journalistically,” he said. Early on, when Morley was still at the *Post*, editors would frequently ask, “What does this tell us about who shot JFK?” “I have no idea!” he responded. “I have to have a fucking conspiracy theory?” @@ -170,10 +166,6 @@ In July 2003, Morley sent the CIA a request, under the Freedom of Information Ac The 500 pages of documents that ultimately emerged from *Morley* v. *CIA* went well beyond the scope of the five fitness reports released under the JFK Act. Morley was given the Agency’s personnel photograph of Joannides — a menacingly well-kempt man of middle age, dark eyes recessed in shadow, jaw set in an ambiguous glower — as well as documents suggesting that he had spent time in New Orleans and that he had been granted access to a particularly sensitive intelligence stream in June 1963. Many of the documents were heavily redacted; the Agency also acknowledged the existence of 44 documents on Joannides from the years 1963, 1978, and 1979 that it refused to release in any form. “The CIA is saying very clearly, ‘This is top secret, please go away,’” Morley told me. “So that’s where the story is, right? I mean, they’re telling me what’s important, and I believe them.” -**From left:** A confidential file regarding George Joannides, which Morley was able to compel the CIA to release. Photo: Courtesy of Jefferson MorleyJoannides’s fitness report. Photo: NARA - -**From top:** A confidential file regarding George Joannides, which Morley was able to compel the CIA to release. Photo: Courtesy of Jefferson MorleyJoann... **From top:** A confidential file regarding George Joannides, which Morley was able to compel the CIA to release. Photo: Courtesy of Jefferson MorleyJoannides’s fitness report. Photo: NARA - Until recently, if asked what happened in Dallas on November 22, 1963 — the “cosmic question,” as he once put it — Morley deflected. In his writing, he tended to address it only obliquely and declined to articulate an overarching theory, except to say the Warren Commission got it wrong. Over the years, he had made all manner of damning discoveries; what they added up to, beyond a cover-up, Morley professed not to know. Increasingly, though, he has been willing to theorize. Last year, he published an article on *JFK Facts* under the headline, “Yes, There Is a JFK Smoking Gun.” “Now, after 28 years of reporting and reflection, I am ready to advance the story,” he wrote. “Jane Roman was correct. A small group of CIA officers was keenly interested in Oswald in the fall of 1963. They were running a psychological warfare operation, authorized in June 1963, that followed Oswald from New Orleans to Mexico City later that year. One of the officers supporting this operation was George Joannides.” diff --git a/00.08 Bookmarks/Bookmarks - Mac applications.md b/00.08 Bookmarks/Bookmarks - Mac applications.md index d63dd154..d93b4a15 100644 --- a/00.08 Bookmarks/Bookmarks - Mac applications.md +++ b/00.08 Bookmarks/Bookmarks - Mac applications.md @@ -92,7 +92,8 @@ image: https://cdn.sanity.io/images/pvn35iyy/production/38d2b681648b73c67173e22c   -- [ ] :label: [[Bookmarks - Mac applications]]: review bookmarks 🔁 every 3 months 📅 2023-12-09 +- [ ] :label: [[Bookmarks - Mac applications]]: review bookmarks 🔁 every 3 months 📅 2024-03-09 +- [x] :label: [[Bookmarks - Mac applications]]: review bookmarks 🔁 every 3 months 📅 2023-12-09 ✅ 2023-12-08 - [x] :label: [[Bookmarks - Mac applications]]: review bookmarks 🔁 every 3 months 📅 2023-09-09 ✅ 2023-09-08 - [x] :label: [[Bookmarks - Mac applications]]: review bookmarks 🔁 every 3 months 📅 2023-06-09 ✅ 2023-06-09 - [x] :label: [[Bookmarks - Mac applications]]: review bookmarks 🔁 every 3 months 📅 2023-03-09 ✅ 2023-03-09 diff --git a/01.02 Home/@Main Dashboard.md b/01.02 Home/@Main Dashboard.md index 67b27a5e..48b3945c 100644 --- a/01.02 Home/@Main Dashboard.md +++ b/01.02 Home/@Main Dashboard.md @@ -201,7 +201,7 @@ where ReadingState = "🟧" ```dataview table without id file.link as "Title", Tag as "Themes" from "00.03 News" where contains(Read, "🟥") -limit 16 +limit 6 ```   diff --git a/01.02 Home/@Shopping list.md b/01.02 Home/@Shopping list.md index 7057453b..ef52de20 100644 --- a/01.02 Home/@Shopping list.md +++ b/01.02 Home/@Shopping list.md @@ -117,19 +117,19 @@ style: number #### Fresh -- [x] 🍎 Fruit ✅ 2023-12-02 +- [x] 🍎 Fruit ✅ 2023-12-08 - [x] 🍌 Bananas ✅ 2023-09-23 - [x] 🍅 Tomatoes ✅ 2023-12-02 -- [x] 🫑 Bell pepper ✅ 2023-11-22 +- [x] 🫑 Bell pepper ✅ 2023-12-08 - [x] 🥦 Fennel ✅ 2022-10-29 - [x] 🥦 Radish ✅ 2022-10-29 -- [x] 🥦 Broccoli ✅ 2023-10-28 +- [x] 🥦 Broccoli ✅ 2023-12-08 - [x] 🫛 Green beans ✅ 2023-10-25 -- [x] 🫘 Red beans ✅ 2023-11-22 +- [x] 🫘 Red beans ✅ 2023-12-08 - [x] 🧅 Onions ✅ 2023-11-22 - [x] 🧅 Spring onion ✅ 2023-09-06 - [x] 🧄 Garlic ✅ 2023-11-22 -- [x] 🍋 Lemon ✅ 2023-10-16 +- [x] 🍋 Lemon ✅ 2023-12-08 - [x] 🍋 Lime ✅ 2023-11-22 - [x] 🫐 Pomegranate seeds ✅ 2023-10-09 @@ -139,11 +139,11 @@ style: number - [x] 🥩 Cured meat ✅ 2022-12-31 - [x] 🍖 Fresh meat ✅ 2023-11-04 -- [x] 🍖 Minced meat ✅ 2023-12-02 +- [x] 🍖 Minced meat ✅ 2023-12-08 - [x] 🥓 Bacon ✅ 2023-04-07 - [x] 🐔 Chicken thighs ✅ 2023-10-07 - [x] 🐔 Chicken breasts ✅ 2023-12-02 -- [x] 🌭 Spicy sausage ✅ 2023-10-25 +- [x] 🌭 Spicy sausage ✅ 2023-12-08 - [x] 🐟 Salmon fillet ✅ 2022-10-29   @@ -151,7 +151,7 @@ style: number #### Bases - [x] 🍝 Pasta ✅ 2023-10-26 -- [x] 🍜 Noodles ✅ 2023-12-02 +- [x] 🍜 Noodles ✅ 2023-12-08 - [x] 🌾 Bulgur ✅ 2022-10-29 - [x] 🍚 Rice ✅ 2023-11-10 - [x] 🥔 Potatoes ✅ 2023-11-25 @@ -173,9 +173,8 @@ style: number - [x] 🧂 Garam masala ✅ 2023-11-10 - [x] 🌰 Nutmeg ✅ 2022-03-14 - [x] 🫚 Ginger ✅ 2023-12-02 -- [x] 🧂 Curcuma ✅ 2022-03-14 - [x] 🧂 Cinamon sticks ✅ 2022-11-15 -- [ ] 🧂 Turmeric +- [x] 🧂 Turmeric ✅ 2023-12-08 - [x] 🧂Ground cinamon ✅ 2023-03-11 - [x] 🧂Ground cloves ✅ 2022-08-05 - [x] 🧂 Chili flakes ✅ 2023-09-20 diff --git a/01.02 Home/Household.md b/01.02 Home/Household.md index 8b3d3db3..09632f09 100644 --- a/01.02 Home/Household.md +++ b/01.02 Home/Household.md @@ -73,7 +73,8 @@ style: number #### 🚮 Garbage collection -- [ ] ♻ [[Household]]: *Paper* recycling collection %%done_del%% 🔁 every 2 weeks on Tuesday 📅 2023-12-05 +- [ ] ♻ [[Household]]: *Paper* recycling collection %%done_del%% 🔁 every 2 weeks on Tuesday 📅 2023-12-19 +- [x] ♻ [[Household]]: *Paper* recycling collection %%done_del%% 🔁 every 2 weeks on Tuesday 📅 2023-12-05 ✅ 2023-12-05 - [ ] ♻ [[Household]]: *Cardboard* recycling collection %%done_del%% 🔁 every 2 weeks on Tuesday 📅 2023-12-12 - [x] ♻ [[Household]]: *Cardboard* recycling collection %%done_del%% 🔁 every 2 weeks on Tuesday 📅 2023-11-28 ✅ 2023-11-28 @@ -82,9 +83,11 @@ style: number #### 🏠 House chores - [ ] 🛎️ :house: [[Household]]: Pay rent %%done_del%% 🔁 every month on the last 📅 2023-12-31 -- [ ] 🛎 🧻 REMINDER [[Household]]: check need for toilet paper %%done_del%% 🔁 every week 📅 2023-12-11 +- [ ] 🛎 🧻 REMINDER [[Household]]: check need for toilet paper %%done_del%% 🔁 every week 📅 2023-12-18 +- [x] 🛎 🧻 REMINDER [[Household]]: check need for toilet paper %%done_del%% 🔁 every week 📅 2023-12-11 ✅ 2023-12-08 - [x] 🛎 🧻 REMINDER [[Household]]: check need for toilet paper %%done_del%% 🔁 every week 📅 2023-12-04 ✅ 2023-12-01 -- [ ] :bed: [[Household]] Change bedsheets %%done_del%% 🔁 every 2 weeks on Saturday 📅 2023-12-09 +- [ ] :bed: [[Household]] Change bedsheets %%done_del%% 🔁 every 2 weeks on Saturday 📅 2023-12-23 +- [x] :bed: [[Household]] Change bedsheets %%done_del%% 🔁 every 2 weeks on Saturday 📅 2023-12-09 ✅ 2023-12-06   diff --git a/01.03 Family/Eustache Bédier.md b/01.03 Family/Eustache Bédier.md index 409b8072..f535ba28 100644 --- a/01.03 Family/Eustache Bédier.md +++ b/01.03 Family/Eustache Bédier.md @@ -103,7 +103,8 @@ style: number   -- [w] :birthday: **[[Eustache Bédier|Eustache]]** %%done_del%% 🔁 every year 📅 2023-12-08 +- [ ] :birthday: **[[Eustache Bédier|Eustache]]** %%done_del%% 🔁 every year 📅 2024-12-08 +- [x] :birthday: **[[Eustache Bédier|Eustache]]** %%done_del%% 🔁 every year 📅 2023-12-08 ✅ 2023-12-08 - [x] :birthday: **[[Eustache Bédier|Eustache]]** 🔁 every year 📅 2022-12-08 ✅ 2022-12-08 - [x] :birthday: **Eustache** 🔁 every year 📅 2021-12-08 ✅ 2021-12-08 diff --git a/01.03 Family/Pierre Bédier.md b/01.03 Family/Pierre Bédier.md index bc09e61d..32f11616 100644 --- a/01.03 Family/Pierre Bédier.md +++ b/01.03 Family/Pierre Bédier.md @@ -104,7 +104,8 @@ style: number   -- [w] :birthday: **[[Pierre Bédier|Bon Papa]]** %%done_del%% 🔁 every year 📅 2023-12-07 +- [ ] :birthday: **[[Pierre Bédier|Bon Papa]]** %%done_del%% 🔁 every year 📅 2024-12-07 +- [x] :birthday: **[[Pierre Bédier|Bon Papa]]** %%done_del%% 🔁 every year 📅 2023-12-07 ✅ 2023-12-07 - [x] :birthday: **[[Pierre Bédier|Bon Papa]]** 🔁 every year 📅 2022-12-07 ✅ 2022-12-07 - [x] :birthday: **Bon Papa** 🔁 every year 📅 2021-12-07 ✅ 2021-12-08 diff --git a/01.07 Animals/@Sally.md b/01.07 Animals/@Sally.md index 9d105ea5..463e96f2 100644 --- a/01.07 Animals/@Sally.md +++ b/01.07 Animals/@Sally.md @@ -138,7 +138,8 @@ divWidth=100 - [x] :racehorse: [[@Sally|Sally]]: Vet check %%done_del%% 🔁 every 6 months 📅 2023-09-30 ✅ 2023-09-28 - [ ] :racehorse: [[@Sally|Sally]]: EHV-1 vaccination dose %%done_del%% 🔁 every year 📅 2024-01-31 - [ ] :racehorse: [[@Sally|Sally]]: Influenza vaccination dose %%done_del%% 🔁 every year 📅 2024-01-31 -- [ ] :racehorse: [[@Sally|Sally]]: Pay for horseshoes (150 CHF) %%done_del%% 🔁 every month 📅 2023-12-10 +- [ ] :racehorse: [[@Sally|Sally]]: Pay for horseshoes (150 CHF) %%done_del%% 🔁 every month 📅 2024-01-10 +- [x] :racehorse: [[@Sally|Sally]]: Pay for horseshoes (150 CHF) %%done_del%% 🔁 every month 📅 2023-12-10 ✅ 2023-12-08 - [x] :racehorse: [[@Sally|Sally]]: Pay for horseshoes (150 CHF) %%done_del%% 🔁 every month 📅 2023-11-10 ✅ 2023-11-08 - [x] :racehorse: [[@Sally|Sally]]: Pay for horseshoes (150 CHF) %%done_del%% 🔁 every month 📅 2023-10-10 ✅ 2023-10-09 - [x] :racehorse: [[@Sally|Sally]]: Pay for horseshoes (150 CHF) %%done_del%% 🔁 every month 📅 2023-09-10 ✅ 2023-09-10 diff --git a/03.02 Travels/Bonnie's.md b/03.02 Travels/Bonnie's.md new file mode 100644 index 00000000..b1835b7a --- /dev/null +++ b/03.02 Travels/Bonnie's.md @@ -0,0 +1,114 @@ +--- + +Alias: [""] +Tag: ["🍴", "🇨🇳"] +Date: 2023-12-06 +DocType: "Place" +Hierarchy: "NonRoot" +TimeStamp: +location: [40.7178242,-73.9465104] +Place: + Type: Restaurant + SubType: Traditional + Style: Chinese + Location: "New York" + Country: USA + Status: Recommended +CollapseMetaTable: true +Phone: "" +Email: "reservations@bonniesbrooklyn.com" +Website: "[Bonnie's - Cantonese American Restaurant](https://www.bonniesbrooklyn.com/)" + +--- + +Parent:: [[@United States|United States]], [[New York]] + +  + +```dataviewjs +let tempPhone = dv.current().Phone ? dv.current().Phone.replaceAll(" ", "") : '+000' +let tempMail = dv.current().Email ? dv.current().Email : "" +let tempCoorSet = dv.current().location ? dv.current().location : [0,0] +dv.el('center', '[📲](tel:' + tempPhone + ')     [📧](mailto:' + tempMail + ')     [🗺️](' + "https://waze.com/ul?ll=" + tempCoorSet[0] + "%2C" + tempCoorSet[1] + "&navigate=yes" + ')') +``` + +--- + +  + +```button +name Save +type command +action Save current file +id Save +``` +^button-BonniesSave + +  + +# Bonnie's + +  + +> [!summary]+ +> Note Description + +  + +```toc +style: number +``` + +  + +--- + +  + +### 📇 Contact + +  + +> [!address] 🗺 +> 398 manhattan ave +> brooklyn, new york +> United States of America + +  + +☎️ `= this.Phone` + +📧 `= this.Email` + +🌐 `= this.Website` + +  + +--- + +  + +### 🗒 Notes + +  + +Idea from [[Chasing Chop Suey Tracing Chinese Immigration Through Food]] + +  + +--- + +  + +### 🔗 Other activity + +  + +```dataview +Table DocType as "Doc type" from [[Bonnie's]] +where !contains(file.name, "@@Travel") +sort DocType asc +``` + +  +  \ No newline at end of file diff --git a/03.02 Travels/Potluck Club.md b/03.02 Travels/Potluck Club.md new file mode 100644 index 00000000..c24f5961 --- /dev/null +++ b/03.02 Travels/Potluck Club.md @@ -0,0 +1,114 @@ +--- + +Alias: [""] +Tag: ["🍴", "🇨🇳"] +Date: 2023-12-06 +DocType: "Place" +Hierarchy: "NonRoot" +TimeStamp: +location: [40.71957675,-73.99352355802594] +Place: + Type: Restaurant + SubType: Traditional + Style: Chinese + Location: "New York" + Country: USA + Status: Recommended +CollapseMetaTable: true +Phone: "" +Email: "events@potluckclubny.com" +Website: "[POTLUCK CLUB](https://thepotluckclubny.com/)" + +--- + +Parent:: [[@United States|United States]], [[New York]] + +  + +```dataviewjs +let tempPhone = dv.current().Phone ? dv.current().Phone.replaceAll(" ", "") : '+000' +let tempMail = dv.current().Email ? dv.current().Email : "" +let tempCoorSet = dv.current().location ? dv.current().location : [0,0] +dv.el('center', '[📲](tel:' + tempPhone + ')     [📧](mailto:' + tempMail + ')     [🗺️](' + "https://waze.com/ul?ll=" + tempCoorSet[0] + "%2C" + tempCoorSet[1] + "&navigate=yes" + ')') +``` + +--- + +  + +```button +name Save +type command +action Save current file +id Save +``` +^button-PotluckClubSave + +  + +# Potluck Club + +  + +> [!summary]+ +> Note Description + +  + +```toc +style: number +``` + +  + +--- + +  + +### 📇 Contact + +  + +> [!address] 🗺 +> 133 chrystie street +> new york, ny 10002 +> United States of America + +  + +☎️ `= this.Phone` + +📧 `= this.Email` + +🌐 `= this.Website` + +  + +--- + +  + +### 🗒 Notes + +  + +Idea from [[Chasing Chop Suey Tracing Chinese Immigration Through Food]] + +  + +--- + +  + +### 🔗 Other activity + +  + +```dataview +Table DocType as "Doc type" from [[Potluck Club]] +where !contains(file.name, "@@Travel") +sort DocType asc +``` + +  +  \ No newline at end of file diff --git a/03.02 Travels/Wo Hop.md b/03.02 Travels/Wo Hop.md new file mode 100644 index 00000000..48fbe198 --- /dev/null +++ b/03.02 Travels/Wo Hop.md @@ -0,0 +1,114 @@ +--- + +Alias: [""] +Tag: ["🍴", "🇨🇳"] +Date: 2023-12-06 +DocType: "Place" +Hierarchy: "NonRoot" +TimeStamp: +location: [40.714289,-73.9988678] +Place: + Type: Restaurant + SubType: Traditional + Style: Chinese + Location: "New York" + Country: USA + Status: Recommended +CollapseMetaTable: true +Phone: "+1 212 962 8617" +Email: "" +Website: "[Wo Hop Chinatown | Wo Hop Restaurant | New York](https://www.wohop17.com/)" + +--- + +Parent:: [[@United States|United States]], [[New York]] + +  + +```dataviewjs +let tempPhone = dv.current().Phone ? dv.current().Phone.replaceAll(" ", "") : '+000' +let tempMail = dv.current().Email ? dv.current().Email : "" +let tempCoorSet = dv.current().location ? dv.current().location : [0,0] +dv.el('center', '[📲](tel:' + tempPhone + ')     [📧](mailto:' + tempMail + ')     [🗺️](' + "https://waze.com/ul?ll=" + tempCoorSet[0] + "%2C" + tempCoorSet[1] + "&navigate=yes" + ')') +``` + +--- + +  + +```button +name Save +type command +action Save current file +id Save +``` +^button-WoHopSave + +  + +# Wo Hop + +  + +> [!summary]+ +> Note Description + +  + +```toc +style: number +``` + +  + +--- + +  + +### 📇 Contact + +  + +> [!address] 🗺 +> 17 Mott St. Basement +> New York City, NY 10013 +> United States of America + +  + +☎️ `= this.Phone` + +📧 `= this.Email` + +🌐 `= this.Website` + +  + +--- + +  + +### 🗒 Notes + +  + +Idea from [[Chasing Chop Suey Tracing Chinese Immigration Through Food]] + +  + +--- + +  + +### 🔗 Other activity + +  + +```dataview +Table DocType as "Doc type" from [[Wo Hop]] +where !contains(file.name, "@@Travel") +sort DocType asc +``` + +  +  \ No newline at end of file diff --git a/03.04 Cinematheque/Barbie (2023).md b/03.04 Cinematheque/Barbie (2023).md new file mode 100644 index 00000000..9c25d009 --- /dev/null +++ b/03.04 Cinematheque/Barbie (2023).md @@ -0,0 +1,95 @@ +--- +type: "movie" +subType: null +title: "Barbie" +englishTitle: "Barbie" +year: "2023" +dataSource: "OMDbAPI" +url: "https://www.imdb.com/title/tt1517268/" +id: "tt1517268" +genres: + - "Adventure" + - "Comedy" + - "Fantasy" +producer: "Greta Gerwig" +duration: "114 min" +onlineRating: 7 +actors: + - "Margot Robbie" + - "Ryan Gosling" + - "Issa Rae" +image: "https://m.media-amazon.com/images/M/MV5BNjU3N2QxNzYtMjk1NC00MTc4LTk1NTQtMmUxNTljM2I0NDA5XkEyXkFqcGdeQXVyODE5NzE3OTE@._V1_SX300.jpg" +released: true +streamingServices: +premiere: "21/07/2023" +watched: true +lastWatched: "[[2023-12-08]]" +personalRating: 5.5 +--- +Parent:: [[@Cinematheque]] + +--- + +```dataviewjs +dv.paragraph(`> [!${dv.current().watched ? 'SUCCESS' : 'WARNING'}] ${dv.current().watched ? 'last watched on ' + dv.current().lastWatched : 'not yet watched'}`) +``` + +  + +# `$= dv.current().title` + +  + +`$= dv.current().watched ? '**Rating**: ' + dv.current().personalRating + ' out of 10' : ''` + +```toc +``` + +  + +### Details + +  + +**Genres**: +`$= dv.current().genres.length === 0 ? ' - none' : dv.list(dv.current().genres)` + +`$= !dv.current().released ? '**Not released** The movie is not yet released.' : ''` + +  + +```dataview +list without id + "" + + + "" ++ + "" + + + "" + + + "" + + + "" + + + "" + + + "" + + + "" + + + "
Type" + this.type + "
Online Rating" + this.onlineRating + "
Duration" + this.duration + "
Premiered" + this.premiere + "
Producer" + this.producer + "
" +FROM "03.04 Cinematheque/Barbie (2023)" +``` + +  + +--- + +  + +### Poster + +  + +`$= '![Image|360](' + dv.current().image + ')'` \ No newline at end of file diff --git a/03.04 Cinematheque/Serpico (1973).md b/03.04 Cinematheque/Serpico (1973).md new file mode 100644 index 00000000..f773e222 --- /dev/null +++ b/03.04 Cinematheque/Serpico (1973).md @@ -0,0 +1,97 @@ +--- +type: "movie" +subType: null +title: "Serpico" +englishTitle: "Serpico" +year: "1973" +dataSource: "OMDbAPI" +url: "https://www.imdb.com/title/tt0070666/" +id: "tt0070666" +genres: + - "Biography" + - "Crime" + - "Drama" +producer: "Sidney Lumet" +duration: "130 min" +onlineRating: 7.7 +actors: + - "Al Pacino" + - "John Randolph" + - "Jack Kehoe" +image: "https://m.media-amazon.com/images/M/MV5BOTRkNjg3YzQtNGE3NC00M2U1LTg1ODItNmM3ZjMyOTYzYjEwXkEyXkFqcGdeQXVyMjUzOTY1NTc@._V1_SX300.jpg" +released: true +streamingServices: +premiere: "05/12/1973" +watched: true +lastWatched: "[[2023-12-07]]" +personalRating: 8 + +--- + +Parent:: [[@Cinematheque]] + +--- + +```dataviewjs +dv.paragraph(`> [!${dv.current().watched ? 'SUCCESS' : 'WARNING'}] ${dv.current().watched ? 'last watched on ' + dv.current().lastWatched : 'not yet watched'}`) +``` + +  + +# `$= dv.current().title` + +  + +`$= dv.current().watched ? '**Rating**: ' + dv.current().personalRating + ' out of 10' : ''` + +```toc +``` + +  + +### Details + +  + +**Genres**: +`$= dv.current().genres.length === 0 ? ' - none' : dv.list(dv.current().genres)` + +`$= !dv.current().released ? '**Not released** The movie is not yet released.' : ''` + +  + +```dataview +list without id + "" + + + "" ++ + "" + + + "" + + + "" + + + "" + + + "" + + + "" + + + "" + + + "
Type" + this.type + "
Online Rating" + this.onlineRating + "
Duration" + this.duration + "
Premiered" + this.premiere + "
Producer" + this.producer + "
" +FROM "03.04 Cinematheque/Serpico (1973)" +``` + +  + +--- + +  + +### Poster + +  + +`$= '![Image|360](' + dv.current().image + ')'` \ No newline at end of file diff --git a/03.04 Cinematheque/The Magnificent Seven (1960).md b/03.04 Cinematheque/The Magnificent Seven (1960).md new file mode 100644 index 00000000..9d20abfe --- /dev/null +++ b/03.04 Cinematheque/The Magnificent Seven (1960).md @@ -0,0 +1,97 @@ +--- +type: "movie" +subType: null +title: "The Magnificent Seven" +englishTitle: "The Magnificent Seven" +year: "1960" +dataSource: "OMDbAPI" +url: "https://www.imdb.com/title/tt0054047/" +id: "tt0054047" +genres: + - "Action" + - "Adventure" + - "Drama" +producer: "John Sturges" +duration: "128 min" +onlineRating: 7.7 +actors: + - "Yul Brynner" + - "Steve McQueen" + - "Charles Bronson" +image: "https://m.media-amazon.com/images/M/MV5BMzYyNzU0MTM1OF5BMl5BanBnXkFtZTcwMzE1ODE1NA@@._V1_SX300.jpg" +released: true +streamingServices: +premiere: "12/10/1960" +watched: true +lastWatched: "[[2023-12-09]]" +personalRating: 7 + +--- + +Parent:: [[@Cinematheque]] + +--- + +```dataviewjs +dv.paragraph(`> [!${dv.current().watched ? 'SUCCESS' : 'WARNING'}] ${dv.current().watched ? 'last watched on ' + dv.current().lastWatched : 'not yet watched'}`) +``` + +  + +# `$= dv.current().title` + +  + +`$= dv.current().watched ? '**Rating**: ' + dv.current().personalRating + ' out of 10' : ''` + +```toc +``` + +  + +### Details + +  + +**Genres**: +`$= dv.current().genres.length === 0 ? ' - none' : dv.list(dv.current().genres)` + +`$= !dv.current().released ? '**Not released** The movie is not yet released.' : ''` + +  + +```dataview +list without id + "" + + + "" ++ + "" + + + "" + + + "" + + + "" + + + "" + + + "" + + + "" + + + "
Type" + this.type + "
Online Rating" + this.onlineRating + "
Duration" + this.duration + "
Premiered" + this.premiere + "
Producer" + this.producer + "
" +FROM "03.04 Cinematheque/The Magnificent Seven (1960)" +``` + +  + +--- + +  + +### Poster + +  + +`$= '![Image|360](' + dv.current().image + ')'` \ No newline at end of file diff --git a/03.04 Cinematheque/Tschugger (2021–).md b/03.04 Cinematheque/Tschugger (2021–).md new file mode 100644 index 00000000..12f62a38 --- /dev/null +++ b/03.04 Cinematheque/Tschugger (2021–).md @@ -0,0 +1,127 @@ +--- +type: "series" +subType: null +title: "Tschugger" +englishTitle: "Tschugger" +year: "2021–" +dataSource: "OMDbAPI" +url: "https://www.imdb.com/title/tt15425948/" +id: "tt15425948" +genres: + - "Comedy" + - "Crime" +studios: + - "N/A" +episodes: 0 +duration: "N/A" +onlineRating: 8.3 +actors: + - "David Constantin" + - "Dragan Vujic" + - "Anna-Lena Miano" +image: "https://m.media-amazon.com/images/M/MV5BYTdiMzA0MTItYzEzMC00Y2E5LTllNzgtYWRjOTgyZmI4MmQyXkEyXkFqcGdeQXVyMTM5MzIzODYy._V1_SX300.jpg" +released: true +streamingServices: +airing: false +airedFrom: "28/11/2021" +airedTo: "unknown" +watched: true +lastWatched: "[[2023-12-09]]" +personalRating: 0 + +--- + +Parent:: [[@Cinematheque]] + +--- + +```dataviewjs +dv.paragraph(`> [!${dv.current().watched ? 'SUCCESS' : 'WARNING'}] ${dv.current().watched ? 'last watched on ' + dv.current().lastWatched : 'not yet watched'}`) +``` + +  + +# `$= dv.current().title` + +  + +`$= dv.current().watched ? '**Rating**: ' + dv.current().personalRating + ' out of 10' : ''` + +  + +```toc +``` + +  + +### Detail + +  + +**Genres**: +`$= dv.current().genres.length === 0 ? ' - none' : dv.list(dv.current().genres)` + +```dataviewjs +let text = ''; + +if (!dv.current().released) { + text += '**Not released**\n'; + if (dv.current().airedFrom) { + text += 'The series will release on ' + dv.current().release_date + '.'; + } else { + text += 'The series is not released yet.'; + } + +} else if (dv.current().airing) { + text += '**Not finished**\n'; + text += 'The series is not fully released yet.'; +} + +if (text) { + dv.paragraph(text); +} +``` + +```dataview +list without id + "" + + + "" ++ + "" + + + "" + + + "" + + + "" + + + "" + + + "" + + + "" + + + "" + + + "" + + + "" + + + "" + + + "
Type" + this.type + "
Online Rating" + this.onlineRating + "
Episodes" + this.episodes + "
Duration" + this.duration + "
Aired from" + this.airedFrom + "
Aired to" + this.airedTo + "
Studios" + this.studios + "
" +FROM "03.04 Cinematheque/Tschugger (2021–)" +``` + +  + +--- + +  + +### Poster + +  + +`$= '![Image|360](' + dv.current().image + ')'` \ No newline at end of file diff --git a/05.02 Networks/Configuring UFW.md b/05.02 Networks/Configuring UFW.md index 4c506aea..d0ca1ddd 100644 --- a/05.02 Networks/Configuring UFW.md +++ b/05.02 Networks/Configuring UFW.md @@ -237,7 +237,8 @@ sudo bash /etc/addip4ban/addip4ban.sh #### Ban List Tasks -- [ ] 🖥 [[Selfhosting]], [[Configuring UFW|Firewall]] Get IP addresses caught by Postfix %%done_del%% 🔁 every week on Saturday 📅 2023-12-09 +- [ ] 🖥 [[Selfhosting]], [[Configuring UFW|Firewall]] Get IP addresses caught by Postfix %%done_del%% 🔁 every week on Saturday 📅 2023-12-16 +- [x] 🖥 [[Selfhosting]], [[Configuring UFW|Firewall]] Get IP addresses caught by Postfix %%done_del%% 🔁 every week on Saturday 📅 2023-12-09 ✅ 2023-12-08 - [x] 🖥 [[Selfhosting]], [[Configuring UFW|Firewall]] Get IP addresses caught by Postfix %%done_del%% 🔁 every week on Saturday 📅 2023-12-02 ✅ 2023-12-01 - [x] 🖥 [[Selfhosting]], [[Configuring UFW|Firewall]] Get IP addresses caught by Postfix %%done_del%% 🔁 every week on Saturday 📅 2023-11-25 ✅ 2023-11-24 - [x] 🖥 [[Selfhosting]], [[Configuring UFW|Firewall]] Get IP addresses caught by Postfix %%done_del%% 🔁 every week on Saturday 📅 2023-11-18 ✅ 2023-11-17 @@ -284,7 +285,8 @@ sudo bash /etc/addip4ban/addip4ban.sh - [x] 🖥 [[Selfhosting]], [[Configuring UFW|Firewall]] Get IP addresses caught by Postfix %%done_del%% 🔁 every week on Saturday 📅 2023-08-12 ✅ 2023-08-07 - [x] 🖥 [[Selfhosting]], [[Configuring UFW|Firewall]] Get IP addresses caught by Postfix %%done_del%% 🔁 every week on Saturday 📅 2023-08-05 ✅ 2023-08-05 - [x] 🖥 [[Selfhosting]], [[Configuring UFW|Firewall]] Get IP addresses caught by Postfix %%done_del%% 🔁 every week on Saturday 📅 2023-07-29 ✅ 2023-08-04 -- [ ] 🖥 [[Selfhosting]], [[Configuring UFW|Firewall]]: Update the Blocked IP list %%done_del%% 🔁 every month on Saturday 📅 2023-12-09 +- [ ] 🖥 [[Selfhosting]], [[Configuring UFW|Firewall]]: Update the Blocked IP list %%done_del%% 🔁 every month on Saturday 📅 2023-12-16 +- [x] 🖥 [[Selfhosting]], [[Configuring UFW|Firewall]]: Update the Blocked IP list %%done_del%% 🔁 every month on Saturday 📅 2023-12-09 ✅ 2023-12-08 - [x] 🖥 [[Selfhosting]], [[Configuring UFW|Firewall]]: Update the Blocked IP list %%done_del%% 🔁 every month on Saturday 📅 2023-12-02 ✅ 2023-12-01 - [x] 🖥 [[Selfhosting]], [[Configuring UFW|Firewall]]: Update the Blocked IP list %%done_del%% 🔁 every month on Saturday 📅 2023-11-25 ✅ 2023-11-24 - [x] 🖥 [[Selfhosting]], [[Configuring UFW|Firewall]]: Update the Blocked IP list %%done_del%% 🔁 every month on Saturday 📅 2023-11-18 ✅ 2023-11-17 diff --git a/06.02 Investments/Crypto Tasks.md b/06.02 Investments/Crypto Tasks.md index bee710a2..0e50fb4d 100644 --- a/06.02 Investments/Crypto Tasks.md +++ b/06.02 Investments/Crypto Tasks.md @@ -70,7 +70,8 @@ All tasks and to-dos Crypto-related.   %%- [ ] 💰[[Crypto Tasks#internet alerts|monitor Crypto news and publications]] %%done_del%% 🔁 every week on Friday 📅 2022-12-16%% -- [ ] :ballot_box: [[Crypto Tasks]]: Vote for [[EOS]] block producers %%done_del%% 🔁 every month on the 1st Tuesday 📅 2023-12-05 +- [ ] :ballot_box: [[Crypto Tasks]]: Vote for [[EOS]] block producers %%done_del%% 🔁 every month on the 1st Tuesday 📅 2024-01-02 +- [x] :ballot_box: [[Crypto Tasks]]: Vote for [[EOS]] block producers %%done_del%% 🔁 every month on the 1st Tuesday 📅 2023-12-05 ✅ 2023-12-05 - [x] :ballot_box: [[Crypto Tasks]]: Vote for [[EOS]] block producers %%done_del%% 🔁 every month on the 1st Tuesday 📅 2023-11-07 ✅ 2023-11-07 - [x] :ballot_box: [[Crypto Tasks]]: Vote for [[EOS]] block producers %%done_del%% 🔁 every month on the 1st Tuesday 📅 2023-10-03 ✅ 2023-10-03 - [x] :ballot_box: [[Crypto Tasks]]: Vote for [[EOS]] block producers %%done_del%% 🔁 every month on the 1st Tuesday 📅 2023-09-05 ✅ 2023-09-08